dvisvgm-2.8.1/0000775000175000017500000000000013563265650010217 500000000000000dvisvgm-2.8.1/compile0000755000175000017500000001632713512046314011510 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: dvisvgm-2.8.1/depcomp0000755000175000017500000005602013512046314011501 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: dvisvgm-2.8.1/ar-lib0000755000175000017500000001330313512046314011215 00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2018 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: dvisvgm-2.8.1/m4/0000775000175000017500000000000013563265647010545 500000000000000dvisvgm-2.8.1/m4/ax_check_compile_flag.m40000664000175000017500000000407113510660062015155 00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # # Check whether the given FLAG works with the current language's compiler # or gives an error. (Warnings, however, are ignored) # # ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on # success/failure. # # If EXTRA-FLAGS is defined, it is added to the current language's default # flags (e.g. CFLAGS) when the check is done. The check is thus made with # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # # INPUT gives an alternative input source to AC_COMPILE_IFELSE. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 6 AC_DEFUN([AX_CHECK_COMPILE_FLAG], [AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl ])dnl AX_CHECK_COMPILE_FLAGS dvisvgm-2.8.1/m4/ax_cxx_compile_stdcxx.m40000664000175000017500000004564713510660062015324 00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html # =========================================================================== # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and # CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) # or '14' (for the C++14 standard). # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for an extended mode. # # The third argument, if specified 'mandatory' or if left unspecified, # indicates that baseline support for the specified C++ standard is # required and that the macro should error out if no mode with that # support is found. If specified 'optional', then configuration proceeds # regardless, after defining HAVE_CXX${VERSION} if and only if a # supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016, 2018 Krzesimir Nowak # Copyright (c) 2019 Enji Cooper # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], [$2], [noext], [], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do switch="-std=gnu++${alternative}" cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi]) m4_if([$2], [ext], [], [dnl if test x$ac_success = xno; then dnl HP's aCC needs +std=c++11 according to: dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf dnl Cray's crayCC needs "-h std=c++11" for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx$1_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) fi fi if test x$ac_success = xno; then HAVE_CXX$1=0 AC_MSG_NOTICE([No compiler with C++$1 support was found]) else HAVE_CXX$1=1 AC_DEFINE(HAVE_CXX$1,1, [define if the compiler supports basic C++$1 syntax]) fi AC_SUBST(HAVE_CXX$1) ]) dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 ) m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 ) dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L ]]) dnl Tests for new features in C++14 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L ]]) dnl Tests for new features in C++17 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L ]]) dvisvgm-2.8.1/m4/ax_code_coverage.m40000664000175000017500000002707413510660062014174 00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_code_coverage.html # =========================================================================== # # SYNOPSIS # # AX_CODE_COVERAGE() # # DESCRIPTION # # Defines CODE_COVERAGE_CPPFLAGS, CODE_COVERAGE_CFLAGS, # CODE_COVERAGE_CXXFLAGS and CODE_COVERAGE_LIBS which should be included # in the CPPFLAGS, CFLAGS CXXFLAGS and LIBS/LIBADD variables of every # build target (program or library) which should be built with code # coverage support. Also defines CODE_COVERAGE_RULES which should be # substituted in your Makefile; and $enable_code_coverage which can be # used in subsequent configure output. CODE_COVERAGE_ENABLED is defined # and substituted, and corresponds to the value of the # --enable-code-coverage option, which defaults to being disabled. # # Test also for gcov program and create GCOV variable that could be # substituted. # # Note that all optimization flags in CFLAGS must be disabled when code # coverage is enabled. # # Usage example: # # configure.ac: # # AX_CODE_COVERAGE # # Makefile.am: # # @CODE_COVERAGE_RULES@ # my_program_LIBS = ... $(CODE_COVERAGE_LIBS) ... # my_program_CPPFLAGS = ... $(CODE_COVERAGE_CPPFLAGS) ... # my_program_CFLAGS = ... $(CODE_COVERAGE_CFLAGS) ... # my_program_CXXFLAGS = ... $(CODE_COVERAGE_CXXFLAGS) ... # # This results in a "check-code-coverage" rule being added to any # Makefile.am which includes "@CODE_COVERAGE_RULES@" (assuming the module # has been configured with --enable-code-coverage). Running `make # check-code-coverage` in that directory will run the module's test suite # (`make check`) and build a code coverage report detailing the code which # was touched, then print the URI for the report. # # In earlier versions of this macro, CODE_COVERAGE_LDFLAGS was defined # instead of CODE_COVERAGE_LIBS. They are both still defined, but use of # CODE_COVERAGE_LIBS is preferred for clarity; CODE_COVERAGE_LDFLAGS is # deprecated. They have the same value. # # This code was derived from Makefile.decl in GLib, originally licenced # under LGPLv2.1+. # # LICENSE # # Copyright (c) 2012, 2016 Philip Withnall # Copyright (c) 2012 Xan Lopez # Copyright (c) 2012 Christian Persch # Copyright (c) 2012 Paolo Borelli # Copyright (c) 2012 Dan Winship # Copyright (c) 2015 Bastien ROUCARIES # # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . #serial 25 AC_DEFUN([AX_CODE_COVERAGE],[ dnl Check for --enable-code-coverage AC_REQUIRE([AC_PROG_SED]) # allow to override gcov location AC_ARG_WITH([gcov], [AS_HELP_STRING([--with-gcov[=GCOV]], [use given GCOV for coverage (GCOV=gcov).])], [_AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov], [_AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov]) AC_MSG_CHECKING([whether to build with code coverage support]) AC_ARG_ENABLE([code-coverage], AS_HELP_STRING([--enable-code-coverage], [Whether to enable code coverage support]),, enable_code_coverage=no) AM_CONDITIONAL([CODE_COVERAGE_ENABLED], [test x$enable_code_coverage = xyes]) AC_SUBST([CODE_COVERAGE_ENABLED], [$enable_code_coverage]) AC_MSG_RESULT($enable_code_coverage) AS_IF([ test "$enable_code_coverage" = "yes" ], [ # check for gcov AC_CHECK_TOOL([GCOV], [$_AX_CODE_COVERAGE_GCOV_PROG_WITH], [:]) AS_IF([test "X$GCOV" = "X:"], [AC_MSG_ERROR([gcov is needed to do coverage])]) AC_SUBST([GCOV]) dnl Check if gcc is being used AS_IF([ test "$GCC" = "no" ], [ AC_MSG_ERROR([not compiling with gcc, which is required for gcov code coverage]) ]) AC_CHECK_PROG([LCOV], [lcov], [lcov]) AC_CHECK_PROG([GENHTML], [genhtml], [genhtml]) AS_IF([ test -z "$LCOV" ], [ AC_MSG_ERROR([To enable code coverage reporting you must have lcov installed]) ]) AS_IF([ test -z "$GENHTML" ], [ AC_MSG_ERROR([Could not find genhtml from the lcov package]) ]) dnl Build the code coverage flags dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_LIBS="-lgcov" CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS" AC_SUBST([CODE_COVERAGE_CPPFLAGS]) AC_SUBST([CODE_COVERAGE_CFLAGS]) AC_SUBST([CODE_COVERAGE_CXXFLAGS]) AC_SUBST([CODE_COVERAGE_LIBS]) AC_SUBST([CODE_COVERAGE_LDFLAGS]) [CODE_COVERAGE_RULES_CHECK=' -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture '] [CODE_COVERAGE_RULES_CAPTURE=' $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" '] [CODE_COVERAGE_RULES_CLEAN=' clean: code-coverage-clean distclean: code-coverage-clean code-coverage-clean: -$(LCOV) --directory $(top_builddir) -z -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY) -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete '] ], [ [CODE_COVERAGE_RULES_CHECK=' @echo "Need to reconfigure with --enable-code-coverage" '] CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK" CODE_COVERAGE_RULES_CLEAN='' ]) [CODE_COVERAGE_RULES=' # Code coverage # # Optional: # - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting. # Multiple directories may be specified, separated by whitespace. # (Default: $(top_builddir)) # - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated # by lcov for code coverage. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info) # - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage # reports to be created. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage) # - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage, # set to 0 to disable it and leave empty to stay with the default. # (Default: empty) # - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov # instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov # instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) # - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov # - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the # collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) # - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov # instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) # - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering # lcov instance. (Default: empty) # - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov # instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) # - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the # genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml # instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) # - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore # # The generated report will be titled using the $(PACKAGE_NAME) and # $(PACKAGE_VERSION). In order to add the current git hash to the title, # use the git-version-gen script, available online. # Optional variables CODE_COVERAGE_DIRECTORY ?= $(top_builddir) CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage CODE_COVERAGE_BRANCH_COVERAGE ?= CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)" CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?= CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\ $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) CODE_COVERAGE_IGNORE_PATTERN ?= GITIGNOREFILES ?= GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY) code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V)) code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_cap_0 = @echo " LCOV --capture"\ $(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*"\ $(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo " GEN " $(CODE_COVERAGE_OUTPUT_DIRECTORY); code_coverage_quiet = $(code_coverage_quiet_$(V)) code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY)) code_coverage_quiet_0 = --quiet # sanitizes the test-name: replaces with underscores: dashes and dots code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1))) # Use recursive makes in order to ignore errors during check check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"' # Capture code coverage data code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"' # Hook rule executed before code-coverage-capture, overridable by the user code-coverage-capture-hook: '"$CODE_COVERAGE_RULES_CLEAN"' A''M_DISTCHECK_CONFIGURE_FLAGS ?= A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage .PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean '] AC_SUBST([CODE_COVERAGE_RULES]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([CODE_COVERAGE_RULES])]) ]) dvisvgm-2.8.1/m4/libtool.m40000644000175000017500000112530613512046311012354 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 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. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl 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 set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. 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' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -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 Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # 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 set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else 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 fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; 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_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #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 /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; 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 ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) 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=-ldld], [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=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl 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_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 yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_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 _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && 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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) 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 # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so 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" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # 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$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $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' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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" # 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* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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 library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") 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" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # 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$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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 # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' 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 ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=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 ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[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]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl 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_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR 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="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs 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 <<_LT_EOF 1>&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 _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_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 _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) 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. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname 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 yes = "$with_gnu_ld"; 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 lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs 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 variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent 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 # that responds to the $file_magic_cmd with a given extended 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 aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) 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*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) 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|DragonFly)/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 ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) 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_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' 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 ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) 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 ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_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 # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) 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 ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # 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]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp 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'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # 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. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, 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 install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&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. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$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. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; 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 # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=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 _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # 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. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=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*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='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' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) 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_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=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 _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS dvisvgm-2.8.1/m4/Makefile.am0000664000175000017500000000013713510660062012500 00000000000000M4_EXTRA_DIST = \ ax_check_compile_flag.m4 \ ax_code_coverage.m4 \ ax_cxx_compile_stdcxx.m4 dvisvgm-2.8.1/m4/Makefile.in0000664000175000017500000003224213563265577012537 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ M4_EXTRA_DIST = \ ax_check_compile_flag.m4 \ ax_code_coverage.m4 \ ax_cxx_compile_stdcxx.m4 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign m4/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/m4/ltversion.m40000644000175000017500000000127313512046311012730 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) dvisvgm-2.8.1/m4/lt~obsolete.m40000644000175000017500000001377413512046311013266 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) dvisvgm-2.8.1/m4/ltsugar.m40000644000175000017500000001044013512046311012360 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) dvisvgm-2.8.1/m4/ltoptions.m40000644000175000017500000003426213512046311012742 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [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. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [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. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [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. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) dvisvgm-2.8.1/config.h.in0000664000175000017500000001042113563265645012164 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Set to 1 if PostScript support should be disabled */ #undef DISABLE_GS /* Define if WOFF support is disabled */ #undef DISABLE_WOFF /* Define to 1 if `TIOCGWINSZ' requires . */ #undef GWINSZ_IN_SYS_IOCTL /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `gs' library (-lgs). */ #undef HAVE_LIBGS /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `kpathsea' library (-lkpathsea). */ #undef HAVE_LIBKPATHSEA /* Define to 1 if you have the `ttfautohint' library (-lttfautohint). */ #undef HAVE_LIBTTFAUTOHINT /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_OPENSSL_MD5_H /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_TTFAUTOHINT_H /* Define to 1 if you have the `umask' function. */ #undef HAVE_UMASK /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `uselocale' function. */ #undef HAVE_USELOCALE /* Define to 1 if you have the header file. */ #undef HAVE_XLOCALE_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if the kpathsea headers are not C++ safe. */ #undef KPSE_CXX_UNSAFE /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* The machine triplet of the target system */ #undef TARGET_SYSTEM /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to `unsigned int' if does not define. */ #undef size_t dvisvgm-2.8.1/Makefile.am0000664000175000017500000000135013510660062012156 00000000000000## This file is part of dvisvgm ## Copyright (C) 2005-2019 Martin Gieseking ## ## Process this file with automake. AUTOMAKE_OPTIONS = foreign EXTRA_DIST = COPYING SUBDIRS = libs m4 src tests doc ACLOCAL_AMFLAGS = -I m4 if USE_BUNDLED_LIBS AM_DISTCHECK_CONFIGURE_FLAGS = --enable-bundled-libs endif if CODE_COVERAGE_ENABLED lcov_dir=$(top_builddir)/lcov lcov_file=$(lcov_dir)/lcov.info lcov-report: @mkdir -p $(lcov_dir) lcov --capture --directory . --no-external -o $(lcov_file) genhtml --title "dvisvgm" --num-spaces 2 --legend -o $(lcov_dir) $(lcov_file) lcov-clean: @rm -rf $(lcov_dir) @find . -name "*.gcda" -exec rm {} \; lcov --zerocounters --directory . coverage: lcov-clean check lcov-report endif dvisvgm-2.8.1/doc/0000775000175000017500000000000013563265652010766 500000000000000dvisvgm-2.8.1/doc/Makefile.am0000664000175000017500000000660113517541161012734 00000000000000## This file is part of dvisvgm ## Copyright (C) 2005-2019 Martin Gieseking ## ## Process this file with automake. # Don't try to install the manpage file if it can't be built due to missing utilities. # However, the distribution tarball should always contain a recent manpage. We ensure # this by adding a dist-hook rule below. if BUILD_MANPAGE man_MANS = dvisvgm.1 endif EXTRA_DIST = $(man_MANS) \ conf-dblatex-man.xsl \ conf-dblatex-pdf.xsl \ dvisvgm.txt.in \ generate-dvisvgm-sty.xsl \ tweak-dblatex-pdf.xsl \ tweak-db-refentry.xsl CONF_DBLATEX_MAN = $(dvisvgm_srcdir)/doc/conf-dblatex-man.xsl CONF_DBLATEX_PDF = $(dvisvgm_srcdir)/doc/conf-dblatex-pdf.xsl TWEAK_DBLATEX_PDF = $(dvisvgm_srcdir)/doc/tweak-dblatex-pdf.xsl TWEAK_DB_ARTICLE = $(dvisvgm_srcdir)/doc/tweak-db-article.xsl TWEAK_DB_REFENTRY = $(dvisvgm_srcdir)/doc/tweak-db-refentry.xsl GEN_DBLATEX_STY = $(dvisvgm_srcdir)/doc/generate-dvisvgm-sty.xsl DB_VARS = man.endnotes.list.enabled=0 man.endnotes.are.numbered=0 man.authors.section.enabled=0 dvisvgm.1: dvisvgm-man.xml $(CONF_DBLATEX_MAN) xmlto -m $(CONF_DBLATEX_MAN) $(addprefix --stringparam , $(DB_VARS)) man $< dvisvgm.pdf: dvisvgm-man.xml dvisvgm.sty $(CONF_DBLATEX_PDF) $(TWEAK_DBLATEX_PDF) mv $< $<.tmp xsltproc -o $< $(TWEAK_DBLATEX_PDF) $<.tmp dblatex -bxetex --texstyle=./dvisvgm.sty -p $(CONF_DBLATEX_PDF) $< mv $<.tmp $< mv $(basename $<).pdf $@ dvi-pdf: dvisvgm.dvi dvipdfm $< rm -f $< dvisvgm.dvi: dvisvgm.1 groff -Tdvi -mandoc ./$< >$@ dvisvgm.html: dvisvgm-man.xml db2html.xsl xsltproc -o $@ db2html.xsl $< dvisvgm.epub: dvisvgm-article.xml a2x -darticle -fepub -L --icons --icons-dir=. $< mv $(basename $<).epub $@ .SECONDARY: dvisvgm-article.xml dvisvgm-man.xml dvisvgm.sty dvisvgm-man.xml: dvisvgm.txt $(TWEAK_DB_REFENTRY) asciidoc -a icons -a 'iconsdir=.' -a badges -a 'revnumber=@VERSION@' --unsafe -bdocbook -dmanpage -o $@.tmp $< xsltproc -o $@ $(TWEAK_DB_REFENTRY) $@.tmp rm $@.tmp dvisvgm-article.xml: dvisvgm.txt $(TWEAK_DB_ARTICLE) asciidoc -a icons -a 'iconsdir=.' -a badges -a 'revnumber=@VERSION@' --unsafe -bdocbook -darticle -o $@.tmp $< xsltproc -o $@ $(TWEAK_DB_ARTICLE) $@.tmp rm $@.tmp sed -i "s/{VERSION}/@VERSION@/" $@ dvisvgm.sty: dvisvgm-man.xml $(GEN_DBLATEX_STY) xsltproc -o dvisvgm.sty $(GEN_DBLATEX_STY) $< dvisvgm.txt: dvisvgm.txt.in ../configure.ac sed -e 's/@VERSION[@]/@VERSION@/g' -e 's/@PACKAGE_BUGREPORT[@]/@PACKAGE_BUGREPORT@/g' $< >$@ if [ $< -nt ../configure.ac ]; \ then touch -r $< $@; \ else touch -r ../configure.ac $@; \ fi epub: dvisvgm.epub html: dvisvgm.html man: dvisvgm.1 pdf: dvisvgm.pdf clean: rm -f dvisvgm.pdf dvisvgm.html dvisvgm-man.xml dvisvgm-article.xml dvisvgm.txt dvisvgm.sty dvisvgm.dvi dvisvgm.epub distclean-local: rm -f dvisvgm.pdf dvisvgm.html dvisvgm-man.xml dvisvgm-article.xml dvisvgm.txt dvisvgm.sty dvisvgm.dvi dvisvgm.epub dvisvgm.1 # Ensure that distribution tarballs always contain a recent manpage, i.e. # let "make dist" and "make distcheck" fail if dvisvgm.1 can't be built. dist-hook: @if test ! -f $(dvisvgm_srcdir)/doc/dvisvgm.1; then \ echo "----------------------------------------------------------------"; \ echo "manpage file dvisvgm.1 could not be built because one or more of"; \ echo "the following utilities are missing: asciidoc, xmlto, xsltproc "; \ echo "----------------------------------------------------------------"; \ false; \ fi dvisvgm-2.8.1/doc/generate-dvisvgm-sty.xsl0000664000175000017500000000134313517541161015512 00000000000000 % This is a generated file -- don't modify it manually. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{dvisvgm}[2015/02/04 dvisvgm DocBook style] \RequirePackageWithOptions{docbook} \RequirePackage[english]{babel} \AtBeginDocument{% \thispagestyle{empty} \lhead[]{\refmiscinfomanual} \rhead[]{\thepage} \lfoot[]{\refmiscinfosource{} \refmiscinfoversion} \rfoot[]{} % revision date given in dvisvgm.txt.in \def\tableofcontents{\stdtoc} % keep TOC on current page } dvisvgm-2.8.1/doc/conf-dblatex-man.xsl0000664000175000017500000000131613510660062014540 00000000000000 \fB \fR (\m[blue] \m[]) dvisvgm-2.8.1/doc/Makefile.in0000664000175000017500000004666413563265577013001 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Don't try to install the manpage file if it can't be built due to missing utilities. # However, the distribution tarball should always contain a recent manpage. We ensure # this by adding a dist-hook rule below. @BUILD_MANPAGE_TRUE@man_MANS = dvisvgm.1 EXTRA_DIST = $(man_MANS) \ conf-dblatex-man.xsl \ conf-dblatex-pdf.xsl \ dvisvgm.txt.in \ generate-dvisvgm-sty.xsl \ tweak-dblatex-pdf.xsl \ tweak-db-refentry.xsl CONF_DBLATEX_MAN = $(dvisvgm_srcdir)/doc/conf-dblatex-man.xsl CONF_DBLATEX_PDF = $(dvisvgm_srcdir)/doc/conf-dblatex-pdf.xsl TWEAK_DBLATEX_PDF = $(dvisvgm_srcdir)/doc/tweak-dblatex-pdf.xsl TWEAK_DB_ARTICLE = $(dvisvgm_srcdir)/doc/tweak-db-article.xsl TWEAK_DB_REFENTRY = $(dvisvgm_srcdir)/doc/tweak-db-refentry.xsl GEN_DBLATEX_STY = $(dvisvgm_srcdir)/doc/generate-dvisvgm-sty.xsl DB_VARS = man.endnotes.list.enabled=0 man.endnotes.are.numbered=0 man.authors.section.enabled=0 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-local dvi: dvi-am dvi-am: html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am dist-hook distclean distclean-generic \ distclean-libtool distclean-local distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man1 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-man uninstall-man1 .PRECIOUS: Makefile dvisvgm.1: dvisvgm-man.xml $(CONF_DBLATEX_MAN) xmlto -m $(CONF_DBLATEX_MAN) $(addprefix --stringparam , $(DB_VARS)) man $< dvisvgm.pdf: dvisvgm-man.xml dvisvgm.sty $(CONF_DBLATEX_PDF) $(TWEAK_DBLATEX_PDF) mv $< $<.tmp xsltproc -o $< $(TWEAK_DBLATEX_PDF) $<.tmp dblatex -bxetex --texstyle=./dvisvgm.sty -p $(CONF_DBLATEX_PDF) $< mv $<.tmp $< mv $(basename $<).pdf $@ dvi-pdf: dvisvgm.dvi dvipdfm $< rm -f $< dvisvgm.dvi: dvisvgm.1 groff -Tdvi -mandoc ./$< >$@ dvisvgm.html: dvisvgm-man.xml db2html.xsl xsltproc -o $@ db2html.xsl $< dvisvgm.epub: dvisvgm-article.xml a2x -darticle -fepub -L --icons --icons-dir=. $< mv $(basename $<).epub $@ .SECONDARY: dvisvgm-article.xml dvisvgm-man.xml dvisvgm.sty dvisvgm-man.xml: dvisvgm.txt $(TWEAK_DB_REFENTRY) asciidoc -a icons -a 'iconsdir=.' -a badges -a 'revnumber=@VERSION@' --unsafe -bdocbook -dmanpage -o $@.tmp $< xsltproc -o $@ $(TWEAK_DB_REFENTRY) $@.tmp rm $@.tmp dvisvgm-article.xml: dvisvgm.txt $(TWEAK_DB_ARTICLE) asciidoc -a icons -a 'iconsdir=.' -a badges -a 'revnumber=@VERSION@' --unsafe -bdocbook -darticle -o $@.tmp $< xsltproc -o $@ $(TWEAK_DB_ARTICLE) $@.tmp rm $@.tmp sed -i "s/{VERSION}/@VERSION@/" $@ dvisvgm.sty: dvisvgm-man.xml $(GEN_DBLATEX_STY) xsltproc -o dvisvgm.sty $(GEN_DBLATEX_STY) $< dvisvgm.txt: dvisvgm.txt.in ../configure.ac sed -e 's/@VERSION[@]/@VERSION@/g' -e 's/@PACKAGE_BUGREPORT[@]/@PACKAGE_BUGREPORT@/g' $< >$@ if [ $< -nt ../configure.ac ]; \ then touch -r $< $@; \ else touch -r ../configure.ac $@; \ fi epub: dvisvgm.epub html: dvisvgm.html man: dvisvgm.1 pdf: dvisvgm.pdf clean: rm -f dvisvgm.pdf dvisvgm.html dvisvgm-man.xml dvisvgm-article.xml dvisvgm.txt dvisvgm.sty dvisvgm.dvi dvisvgm.epub distclean-local: rm -f dvisvgm.pdf dvisvgm.html dvisvgm-man.xml dvisvgm-article.xml dvisvgm.txt dvisvgm.sty dvisvgm.dvi dvisvgm.epub dvisvgm.1 # Ensure that distribution tarballs always contain a recent manpage, i.e. # let "make dist" and "make distcheck" fail if dvisvgm.1 can't be built. dist-hook: @if test ! -f $(dvisvgm_srcdir)/doc/dvisvgm.1; then \ echo "----------------------------------------------------------------"; \ echo "manpage file dvisvgm.1 could not be built because one or more of"; \ echo "the following utilities are missing: asciidoc, xmlto, xsltproc "; \ echo "----------------------------------------------------------------"; \ false; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/doc/conf-dblatex-pdf.xsl0000664000175000017500000000502213510660062014534 00000000000000 \setmainfont{Source Sans Pro} \setsansfont{Source Sans Pro} \setmonofont{Source Code Pro} 0 0 caution note tabular 0 1 basicstyle=\ttfamily\small,backgroundcolor=\color[gray]{0.9},columns=fullflexible,frame=single \tableofcontents 2 1 2 1 \phantomsection\pdfbookmark[3]{ dvisvgm-2.8.1/doc/tweak-dblatex-pdf.xsl0000664000175000017500000000202113510660062014716 00000000000000 Synopsis dvisvgm-2.8.1/doc/tweak-db-refentry.xsl0000664000175000017500000000324213517541161014760 00000000000000 dvisvgm-2.8.1/doc/dvisvgm.10000664000175000017500000017320513563265652012457 00000000000000'\" t .\" Title: dvisvgm .\" Author: Martin Gieseking .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 2019-11-12 .\" Manual: dvisvgm Manual .\" Source: dvisvgm 2.8.1 .\" Language: English .\" .TH "DVISVGM" "1" "2019\-11\-12" "dvisvgm 2\&.8\&.1" "dvisvgm Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dvisvgm \- converts DVI and EPS files to the XML\-based SVG format .SH "SYNOPSIS" .sp \fBdvisvgm\fR [ \fIoptions\fR ] \fIfile\fR [\&.dvi] .sp \fBdvisvgm\fR \-\-eps [ \fIoptions\fR ] \fIfile\fR [\&.eps] .sp \fBdvisvgm\fR \-\-pdf [ \fIoptions\fR ] \fIfile\fR [\&.pdf] .SH "DESCRIPTION" .sp The command\-line utility \fBdvisvgm\fR converts DVI files, as generated by TeX/LaTeX, to the XML\-based scalable vector graphics format SVG\&. It supports the classic DVI version 2 as well as version 3 (created by pTeX in vertical mode), and the XeTeX versions 5 to 7 which are also known as XDV\&. Besides the basic DVI commands, dvisvgm also evaluates many so\-called \fIspecials\fR which heavily extend the capabilities of the plain DVI format\&. For a more detailed overview, see section \fBSupported Specials\fR below\&. .sp Since the current SVG standard 1\&.1 doesn\(cqt specify multi\-page graphics, dvisvgm creates separate SVG files for each DVI page\&. Because of compatibility reasons, only the first page is converted by default\&. In order to select a different page or arbitrary page sequences, use option \fB\-p\fR which is described below\&. .sp SVG is a vector\-based graphics format and therefore dvisvgm tries to convert the glyph outlines of all fonts referenced in a DVI page section to scalable path descriptions\&. The fastest way to achieve this is to extract the path information from vector\-based font files available in PFB, TTF, or OTF format\&. If dvisvgm is able to find such a file, it extracts all necessary outline information about the glyphs from it\&. .sp However, TeX\(cqs main source for font descriptions is Metafont, which produces bitmap output (GF files)\&. That\(cqs why not all obtainable TeX fonts are available in a scalable format\&. In these cases, dvisvgm tries to vectorize Metafont\(cqs output by tracing the glyph bitmaps\&. The results are not as perfect as most (manually optimized) PFB or OTF counterparts, but are nonetheless really nice in most cases\&. .sp When running dvisvgm without option \fB\-\-no\-fonts\fR, it creates \fIfont\fR elements (\fB\fR\&...\fB\fR) to embed the font data into the SVG files\&. Unfortunately, only few SVG renderers support these elements yet\&. Most web browsers and vector graphics applications don\(cqt evaluate them properly so that the text components of the resulting graphics might look strange\&. In order to create more compatible SVG files, command\-line option \fB\-\-no\-fonts\fR can be given to replace the font elements by plain graphics paths\&. .SH "OPTIONS" .sp dvisvgm provides a POSIX\-compliant command\-line interface with short and long option names\&. They may be given before and/or after the name of the file to be converted\&. Also, the order of specifying the options is not significant, i\&.e\&. you can add them in any order without changing dvisvgm\(cqs behavior\&. Certain options accept or require additional parameters which are directly appended to or separated by whitespace from a short option (e\&.g\&. \fB\-v0\fR or \fB\-v 0\fR)\&. Long options require an additional equals sign (\fB=\fR) between option name and argument but without any surrounding whitespace (e\&.g\&. \fB\-\-verbosity=0\fR)\&. Multiple short options that don\(cqt expect a further parameter can be combined after a single dash (e\&.g\&. \fB\-ejs\fR rather than \fB\-e \-j \-s\fR)\&. .PP \fB\-b, \-\-bbox\fR=\fIfmt\fR .RS 4 Sets the bounding box of the generated graphic to the specified format\&. The parameter \fIfmt\fR takes either one of the format specifiers listed below, or a sequence of four comma\- or whitespace\-separated length values \fIx1\fR, \fIy1\fR, \fIx2\fR and \fIy2\fR\&. The latter define the absolute coordinates of two diagonal corners of the bounding box\&. Each length value consists of a floating point number and an optional length unit (pt, bp, cm, mm, in, pc, dd, cc, or sp)\&. If the unit is omitted, TeX points (pt) are assumed\&. .sp It\(cqs also possible to give only one length value \fIl\fR\&. In this case, the minimal bounding box is computed and enlarged by adding (\-\fIl\fR,\-\fIl\fR) to the upper left and (\fIl\fR,\fIl\fR) to the lower right corner\&. .sp Additionally, dvisvgm also supports the following format specifiers: .PP \fBInternational DIN/ISO paper sizes\fR .RS 4 A\fIn\fR, B\fIn\fR, C\fIn\fR, D\fIn\fR, where \fIn\fR is a non\-negative integer, e\&.g\&. A4 or a4 for DIN/ISO A4 format (210mm \(mu 297mm)\&. .RE .PP \fBNorth American paper sizes\fR .RS 4 invoice, executive, legal, letter, ledger .RE .PP \fBSpecial bounding box sizes\fR .RS 4 .TS tab(:); lt lt lt lt lt lt lt lt lt lt. T{ \fBdvi\fR T}:T{ page size stored in the DVI file T} T{ \fBmin\fR T}:T{ computes the minimal/tightest bounding box T} T{ \fBnone\fR T}:T{ no bounding box is assigned T} T{ \fBpapersize\fR T}:T{ box sizes specified by \fIpapersize\fR specials present in the DVI file T} T{ \fBpreview\fR T}:T{ bounding box data computed by the preview package (if present in the DVI file) T} .TE .sp 1 .RE .PP \fBPage orientation\fR .RS 4 The default page orientation for DIN/ISO and American paper sizes is \fIportrait\fR, i\&.e\&. \fIwidth\fR < \fIheight\fR\&. Appending \fB\-landscape\fR or simply \fB\-l\fR to the format string switches to \fIlandscape\fR mode (\fIwidth\fR > \fIheight\fR)\&. For symmetry reasons you can also explicitly add \fB\-portrait\fR or \fB\-p\fR to indicate the default portrait format\&. Note that these suffixes are part of the size string and not separate options\&. Thus, they must directly follow the size specifier without additional blanks\&. Furthermore, the orientation suffixes can\(cqt be used with \fBdvi\fR, \fBmin\fR, and \fBnone\fR\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br Option \fB\-b, \-\-bbox\fR only affects the bounding box and does not transform the page content\&. Hence, if you choose a landscape format, the page won\(cqt be rotated\&. .sp .5v .RE .RE .RE .PP \fB\-C, \-\-cache\fR[=\fIdir\fR] .RS 4 To speed up the conversion process of bitmap fonts, dvisvgm saves intermediate conversion information in cache files\&. By default, these files are stored in \fB$XDG_CACHE_HOME/dvisvgm/\fR or \fB$HOME/\&.cache/dvisvgm\fR if \fBXDG_CACHE_HOME\fR is not set\&. If you prefer a different location, use option \fB\-\-cache\fR to overwrite the default\&. Furthermore, it is also possible to disable the font caching mechanism completely with option \fB\-\-cache=none\fR\&. If argument \fIdir\fR is omitted, dvisvgm prints the path of the default cache directory together with further information about the stored fonts\&. Additionally, outdated and corrupted cache files are removed\&. .RE .PP \fB\-j, \-\-clipjoin\fR .RS 4 This option tells dvisvgm to compute all intersections of clipping paths itself rather than delegating this task to the SVG renderer\&. The resulting SVG files are more portable because some SVG viewers don\(cqt support intersecting clipping paths which are defined by \fIclipPath\fR elements containing a \fIclip\-path\fR attribute\&. .RE .PP \fB\-\-color\fR .RS 4 Enables colorization of messages printed during the conversion process\&. The colors can be customized via environment variable \fBDVISVGM_COLORS\fR\&. See the Environment section below for further information\&. .RE .PP \fB\-\-colornames\fR .RS 4 By default, dvisvgm exclusively uses RGB values of the form \fI#RRGGBB\fR or \fI#RGB\fR to represent colors in the SVG file\&. The latter is a short form for colors whose RGB components each consist of two identical hex digits, e\&.g\&. \fB#123\fR equals \fB#112233\fR\&. According to the SVG standard, it\(cqs also possible to use color names (like \fBblack\fR and \fBdarkblue\fR) for a limited number of predefined colors (\m[blue]https://www.w3.org/TR/SVG11/types.html#ColorKeywords\m[])\&. In order to apply these color names rather than their RGB values, call dvisvgm with option \fB\-\-colornames\fR\&. All colors without an SVG color name will still be represented by RGB values\&. .RE .PP \fB\-\-comments\fR .RS 4 Adds comments with further information about selected data to the SVG file\&. Currently, only font elements and font CSS rules related to native fonts are annotated\&. .RE .PP \fB\-E, \-\-eps\fR .RS 4 If this option is given, dvisvgm does not expect a DVI but an EPS input file, and tries to convert it to SVG\&. In order to do so, a single \fIpsfile\fR special command is created and forwarded to the PostScript special handler\&. This option is only available if dvisvgm was built with PostScript support enabled, and requires Ghostscript to be available\&. See option \fB\-\-libgs\fR for further information\&. .RE .PP \fB\-e, \-\-exact\-bbox\fR .RS 4 This option tells dvisvgm to compute the precise bounding box of each character\&. By default, the values stored in a font\(cqs TFM file are used to determine a glyph\(cqs extent\&. As these values are intended to implement optimal character placements and are not designed to represent the exact dimensions, they don\(cqt necessarily correspond with the bounds of the visual glyphs\&. Thus, width and/or height of some glyphs may be larger (or smaller) than the respective TFM values\&. As a result, this can lead to clipped characters at the bounds of the SVG graphics\&. With option \fB\-\-exact\-bbox\fR given, dvisvgm analyzes the actual shape of each character and derives a usually tight bounding box\&. .RE .PP \fB\-f, \-\-font\-format\fR=\fIformat\fR .RS 4 Selects the file format used to embed the font data into the SVG files\&. Following formats are supported: \fBSVG\fR (that\(cqs the default), \fBTTF\fR (TrueType), \fBWOFF\fR, and \fBWOFF2\fR (Web Open Font Format version 1 and 2)\&. By default, dvisvgm creates unhinted fonts that might look bad on low\-resolution devices\&. In order to improve the display quality, the generated TrueType, WOFF, or WOFF2 fonts can be autohinted\&. The autohinter is enabled by appending \fB,autohint\fR or \fB,ah\fR to the font format, e\&.g\&. \fB\-\-font\-format=woff,autohint\fR or \fB\-\-font\-format=woff,ah\fR\&. .sp Option \fB\-\-font\-format\fR is only available if dvisvgm was built with WOFF support enabled\&. .RE .PP \fB\-m, \-\-fontmap\fR=\fIfilenames\fR .RS 4 Loads and evaluates a single font map file or a sequence of font map files\&. These files are required to resolve font file names and encodings\&. dvisvgm does not provide its own map files but tries to read available ones coming with dvips or dvipdfm\&. If option \fB\-\-fontmap\fR is omitted, dvisvgm looks for the default map files \fIps2pk\&.map\fR, \fIpdftex\&.map\fR, \fIdvipdfm\&.map\fR, and \fIpsfonts\&.map\fR (in this order)\&. Otherwise, the files given as option arguments are evaluated in the given order\&. Multiple filenames must be separated by commas without leading and/or trailing whitespace\&. .sp By default, redefined mappings do not replace previous ones\&. However, each filename can be preceded by an optional mode specifier (\fB+\fR, \fB\-\fR, or \fB=\fR) to change this behavior: .PP +mapfile .RS 4 Only those entries in the given map file that don\(cqt redefine a font mapping are applied, i\&.e\&. fonts already mapped keep untouched\&. That\(cqs also the default mode if no mode specifier is given\&. .RE .PP \-mapfile .RS 4 Ensures that none of the font mappings defined in the given map file are used, i\&.e\&. previously defined mappings for the specified fonts are removed\&. .RE .PP =mapfile .RS 4 All mappings defined in the map file are applied\&. Previously defined settings for the same fonts are replaced\&. .sp If the first filename in the filename sequence is preceded by a mode specifier, dvisvgm loads the default font map (see above) and applies the other map files afterwards\&. Otherwise, none of default map files will be loaded automatically\&. .sp Examples: \fB\-\-fontmap=myfile1\&.map,+myfile2\&.map\fR loads \fImyfile1\&.map\fR followed by \fImyfile2\&.map\fR where all redefinitions of \fBmyfile2\&.map\fR are ignored\&. \fB\-\-fontmap==myfile1\&.map,\-myfile2\&.map\fR loads the default map file followed by \fImyfile1\&.map\fR and \fImyfile2\&.map\fR where all redefinitions of \fImyfile1\&.map\fR replace previous entries\&. Afterwards, all definitions for the fonts given in \fImyfile2\&.map\fR are removed from the font map tree\&. .sp For further information about the map file formats and the mode specifiers, see the manuals of dvips (\m[blue]https://tug.org/texinfohtml/dvips.html\m[]) and dvipdfm (\m[blue]https://ctan.org/tex-archive/dviware/dvipdfm\m[])\&. .RE .RE .PP \fB\-\-grad\-overlap\fR .RS 4 Tells dvisvgm to create overlapping grid segments when approximating color gradient fills (also see option \fB\-\-grad\-segments\fR below)\&. By default, adjacent segments don\(cqt overlap but only touch each other like separate tiles\&. However, this alignment can lead to visible gaps between the segments because the background color usually influences the color at the boundary of the segments if the SVG renderer uses anti\-aliasing to create smooth contours\&. One way to avoid this and to create seamlessly touching color regions is to enlarge the segments so that they extent into the area of their right and bottom neighbors\&. Since the latter are drawn on top of the overlapping parts, the visible size of all segments keeps unchanged\&. Just the former gaps disappear as the background is now completely covered by the correct colors\&. Currently, dvisvgm computes the overlapping segments separately for each patch of the mesh (a patch mesh may consist of multiple patches of the same type)\&. Therefore, there still might be visible gaps at the seam of two adjacent patches\&. .RE .PP \fB\-\-grad\-segments\fR=\fInumber\fR .RS 4 Determines the maximal number of segments per column and row used to approximate gradient color fills\&. Since SVG 1\&.1 only supports a small subset of the shading algorithms available in PostScript, dvisvgm approximates some of them by subdividing the area to be filled into smaller, monochromatic segments\&. Each of these segments gets the average color of the region it covers\&. Thus, increasing the number of segments leads to smaller monochromatic areas and therefore a better approximation of the actual color gradient\&. As a drawback, more segments imply bigger SVG files because every segment is represented by a separate path element\&. .sp Currently, dvisvgm supports free\- and lattice\-form triangular patch meshes as well as Coons and tensor\-product patch meshes\&. They are approximated by subdividing the area of each patch into a \fIn\fR\(mu\fIn\fR grid of smaller segments\&. The maximal number of segments per column and row can be changed with option \fB\-\-grad\-segments\fR\&. .RE .PP \fB\-\-grad\-simplify\fR=\fIdelta\fR .RS 4 If the size of the segments created to approximate gradient color fills falls below the given delta value, dvisvgm reduces their level of detail\&. For example, B\('ezier curves are replaced by straight lines, and triangular segments are combined to tetragons\&. For a small \fIdelta\fR, these simplifications are usually not noticeable but reduce the size of the generated SVG files significantly\&. .RE .PP \fB\-h, \-\-help\fR[=\fImode\fR] .RS 4 Prints a short summary of all available command\-line options\&. The optional \fImode\fR parameter is an integer value between 0 and 2\&. It selects the display variant of the help text\&. Mode 0 lists all options divided into categories with section headers\&. This is also the default if dvisvgm is called without parameters\&. Mode 1 lists all options ordered by the short option names, while mode 2 sorts the lines by the long option names\&. .RE .PP \fB\-\-keep\fR .RS 4 Disables the removal of temporary files as created by Metafont (usually \&.gf, \&.tfm, and \&.log files) or the TrueType/WOFF module\&. .RE .PP \fB\-\-libgs\fR=\fIpath\fR .RS 4 This option is only available if the Ghostscript library is not directly linked to dvisvgm and if PostScript support was not completely disabled during compilation\&. In this case, dvisvgm tries to load the shared GS library dynamically during runtime\&. By default, it expects the library\(cqs name to be \fBlibgs\&.so\&.X\fR (on Unix\-like systems, where \fBX\fR is the ABI version of the library) or \fBgsdll32\&.dll\fR/\fBgsdll64\&.dll\fR (Windows)\&. If dvisvgm doesn\(cqt find the library, option \fB\-\-libgs\fR can be used to specify the correct path and filename, e\&.g\&. \fB\-\-libgs=/usr/local/lib/libgs\&.so\&.9\fR or \fB\-\-libgs=\egs\egs9\&.25\ebin\egsdll64\&.dll\fR\&. .sp Alternatively, it\(cqs also possible to assign the path to environment variable \fBLIBGS\fR, e\&.g\&. \fBexport LIBGS=/usr/local/lib/libgs\&.so\&.9\fR or \fBset LIBGS=\egs\egs9\&.25\ebin\egsdll63\&.dll\fR\&. \fBLIBGS\fR has less precedence than the command\-line option, i\&.e\&. dvisvgm ignores variable \fBLIBGS\fR if \fB\-\-libgs\fR is given\&. .RE .PP \fB\-L, \-\-linkmark\fR=\fIstyle\fR .RS 4 Selects the method how to mark hyperlinked areas\&. The \fIstyle\fR argument can take one of the values \fInone\fR, \fIbox\fR, and \fIline\fR, where \fIbox\fR is the default, i\&.e\&. a rectangle is drawn around the linked region if option \fB\-\-linkmark\fR is omitted\&. Style argument \fIline\fR just draws the lower edge of the bounding rectangle, and \fInone\fR tells dvisvgm not to add any visible objects to hyperlinks\&. The lines and boxes get the current text color selected\&. In order to apply a different, constant color, a colon followed by a color specifier can be appended to the style string\&. A \fIcolor specifier\fR is either a hexadecimal RGB value of the form \fI#RRGGBB\fR, or a dvips color name (\m[blue]https://en.wikibooks.org/wiki/LaTeX/Colors#The_68_standard_colors_known_to_dvips\m[])\&. .sp Moreover, argument \fIstyle\fR can take a single color specifier to highlight the linked region by a frameless box filled with that color\&. An optional second color specifier separated by a colon selects the frame color\&. .sp Examples: \fBbox:red\fR or \fBbox:#ff0000\fR draws red boxes around the linked areas\&. \fByellow:blue\fR creates yellow filled rectangles with blue frames\&. .RE .PP \fB\-l, \-\-list\-specials\fR .RS 4 Prints a list of registered special handlers and exits\&. Each handler processes a set of special statements belonging to the same category\&. In most cases, the categories are identified by the prefix of the special statements\&. It\(cqs usually a leading string followed by a colon or a blank, e\&.g\&. \fIcolor\fR or \fIps\fR\&. The listed handler names, however, don\(cqt need to match these prefixes, e\&.g\&. if there is no common prefix or if functionality is split into separate handlers in order to allow to disable them separately with option \fB\-\-no\-specials\fR\&. All special statements not covered by one of the special handlers are silently ignored\&. .RE .PP \fB\-M, \-\-mag\fR=\fIfactor\fR .RS 4 Sets the magnification factor applied in conjunction with Metafont calls prior tracing the glyphs\&. The larger this value, the better the tracing results\&. Nevertheless, large magnification values can cause Metafont arithmetic errors due to number overflows\&. So, use this option with care\&. The default setting usually produces nice results\&. .RE .PP \fB\-\-no\-merge\fR .RS 4 Puts every single character in a separate \fItext\fR element with corresponding \fIx\fR and \fIy\fR attributes\&. By default, new \fItext\fR or \fItspan\fR elements are only created if a string starts at a location that differs from the regular position defined by the characters\*(Aq advance values\&. .RE .PP \fB\-\-no\-mktexmf\fR .RS 4 Suppresses the generation of missing font files\&. If dvisvgm can\(cqt find a font file through the kpathsea lookup mechanism, it calls the external tools \fImktextfm\fR or \fImktexmf\fR\&. This option disables these calls\&. .RE .PP \fB\-n, \-\-no\-fonts\fR[=\fIvariant\fR] .RS 4 If this option is given, dvisvgm doesn\(cqt create SVG \fIfont\fR elements but uses \fIpaths\fR instead\&. The resulting SVG files tend to be larger but are concurrently more compatible with most applications that don\(cqt support SVG fonts\&. The optional argument \fIvariant\fR selects the method how to substitute fonts by paths\&. Variant 0 creates \fIpath\fR and \fIuse\fR elements in order to avoid lengthy duplicates\&. Variant 1 creates \fIpath\fR elements only\&. Option \fB\-\-no\-fonts\fR implies \fB\-\-no\-styles\fR\&. .RE .PP \fB\-c, \-\-scale\fR=\fIsx\fR[,\fIsy\fR] .RS 4 Scales the page content horizontally by \fIsx\fR and vertically by \fIsy\fR\&. This option is equivalent to \fB\-TS\fR\fIsx\fR,\fIsy\fR\&. .RE .PP \fB\-S, \-\-no\-specials\fR[=\fInames\fR] .RS 4 Disable processing of special commands embedded in the DVI file\&. If no further parameter is given, all specials are ignored\&. To disable a selected set of specials, an optional comma\-separated list of names can be appended to this option\&. A \fIname\fR is the unique identifier referencing the intended special handler as listed by option \fB\-\-list\-specials\fR\&. .RE .PP \fB\-\-no\-styles\fR .RS 4 By default, dvisvgm creates CSS styles and class attributes to reference fonts\&. This variant is more compact than adding the complete font information to each text element over and over again\&. However, if you prefer direct font references, the default behavior can be disabled with option \fB\-\-no\-styles\fR\&. .RE .PP \fB\-O, \-\-optimize\fR[=\fImodules\fR] .RS 4 Applies several optimizations on the generated SVG tree to reduce the file size\&. The optimizations are performed by running separate optimizer modules specified by optional argument \fImodules\fR\&. It may consist of a single module name or a comma\-separated list of several module names\&. The corresponding modules are executed one by one in the given order and thus transform the XML tree gradually\&. .sp The following list describes the currently available optimizer modules\&. .PP \fBlist\fR .RS 4 Lists all available optimizer modules and exits\&. .RE .PP \fBnone\fR .RS 4 If this argument is given, dvisvgm doesn\(cqt apply any optimization\&. \fBnone\fR can\(cqt be combined with other module names\&. .RE .PP \fBall\fR .RS 4 Performs all optimizations listed below\&. This is also the default if option \fB\-\-optimize\fR is used without argument\&. The modules are executed in a predefined order that usually leads to the best results\&. \fBall\fR can\(cqt be combined with other module names\&. .RE .PP \fBcollapse\-groups\fR .RS 4 Combines nested group elements (\fB\fR\&...\fB\fR) that contain only a single group each\&. If possible, the group attributes are moved to the outermost element of the processed subtree\&. This module also unwraps group elements that have no attributes at all\&. .RE .PP \fBgroup\-attributes\fR .RS 4 Creates groups (\fB\fR\&...\fB\fR) for common attributes around adjacent elements\&. Each attribute is moved to a separate group so that multiple common attributes lead to nested groups\&. They can be combined by applying optimizer module \fIcollapse\-groups\fR afterwards\&. The algorithm only takes inheritable properties, such as \fBfill\fR or \fBstroke\-width\fR, into account and only removes them from an element if none of the other attributes, like \fBid\fR, prevents this\&. .RE .PP \fBremove\-clippath\fR .RS 4 Removes all redundant \fIclipPath\fR elements\&. This optimization was already present in former versions of dvisvgm and was always applied by default\&. This behavior is retained, i\&.e\&. dvisvgm executes this module even if option \fB\-\-optimize\fR is not given\&. You can use argument \fInone\fR to prevent that\&. .RE .PP \fBsimplify\-text\fR .RS 4 If a \fBtext\fR element only contains whitespace nodes and \fBtspan\fR elements, all common inheritable attributes of the latter are moved to the enclosing text element\&. All \fBtspan\fR elements without further attributes are unwrapped\&. .RE .PP \fBsimplify\-transform\fR .RS 4 Tries to shorten all \fItransform\fR attributes\&. This module combines the transformation commands of each attribute and decomposes the resulting transformation matrix into a sequence of basic transformations, i\&.e\&. translation, scaling, rotation, and skewing\&. If this sequence is shorter than the equivalent \fImatrix\fR expression, it\(cqs assigned to the attribute\&. Otherwise, the matrix expression is used\&. .RE .RE .PP \fB\-o, \-\-output\fR=\fIpattern\fR .RS 4 Sets the pattern specifying the names of the generated SVG files\&. Parameter \fIpattern\fR is a string that may contain static character sequences as well as the variables \fB%f\fR, \fB%p\fR, \fB%P\fR, \fB%hd\fR, \fB%ho\fR, and \fB%hc\fR\&. \fB%f\fR expands to the base name of the DVI file, i\&.e\&. the filename without suffix, \fB%p\fR is the current page number, and \fB%P\fR the total number of pages in the DVI file\&. An optional number (0\-9) given directly after the percent sign specifies the minimal number of digits to be written\&. If a particular value consists of less digits, the number is padded with leading zeros\&. Example: \fB%3p\fR enforces 3 digits for the current page number (001, 002, etc\&.)\&. Without an explicit width specifier, \fB%p\fR gets the same number of digits as \fB%P\fR\&. .sp If you need more control over the numbering, you can use arithmetic expressions as part of a pattern\&. The syntax is \fB%(\fR\fIexpr\fR\fB)\fR where \fIexpr\fR may contain additions, subtractions, multiplications, and integer divisions with common precedence\&. The variables \fBp\fR and \fBP\fR contain the current page number and the total number of pages, respectively\&. For example, \fB\-\-output="%f\-%(p\-1)"\fR creates filenames where the numbering starts with 0 rather than 1\&. .sp The variables \fB%hX\fR contain different hash values computed from the DVI page data and the options given on the command\-line\&. \fB%hd\fR and \fB%hc\fR are only set if option \fB\-\-page\-hashes\fR is present\&. Otherwise, it\(cqs empty\&. For further information, see the description of option \fB\-\-page\-hashes\fR below\&. .sp The default pattern is \fB%f\-%p\&.svg\fR if the DVI file consists of more than one page, and \fB%f\&.svg\fR otherwise\&. That means, a DVI file \fIfoo\&.dvi\fR is converted to \fIfoo\&.svg\fR if \fIfoo\&.dvi\fR is a single\-page document\&. Otherwise, multiple SVG files \fIfoo\-01\&.svg\fR, \fIfoo\-02\&.svg\fR, etc\&. are produced\&. In Windows environments, the percent sign indicates dereferenced environment variables, and must therefore be protected by a second percent sign, e\&.g\&. \fB\-\-output=%%f\-%%p\fR\&. .RE .PP \fB\-p, \-\-page\fR=\fIranges\fR .RS 4 This option selects the pages to be processed\&. Parameter \fIranges\fR consists of a comma\-separated list of single page numbers and/or page ranges\&. A page range is a pair of numbers separated by a hyphen, e\&.g\&. 5\-12\&. Thus, a page sequence might look like this: 2\-4,6,9\-12,15\&. It doesn\(cqt matter if a page is given more than once or if page ranges overlap\&. dvisvgm always extracts the page numbers in ascending order and converts them only once\&. In order to stay compatible with previous versions, the default page sequence is 1\&. dvisvgm therefore converts only the first page and not the whole document if option \fB\-\-page\fR is omitted\&. Usually, page ranges consist of two numbers denoting the first and last page to be converted\&. If the conversion should start at page 1, or if it should continue up to the last DVI page, the first or second range number can be omitted, respectively\&. Example: \fB\-\-page=\-10\fR converts all pages up to page 10, \fB\-\-page=10\-\fR converts all pages starting with page 10\&. Please consider that the page values don\(cqt refer to the page numbers printed on the corresponding page\&. Instead, the physical page count is expected, where the first page always gets number 1\&. .RE .PP \fB\-H, \-\-page\-hashes\fR[=\fIparams\fR] .RS 4 If this option is given, dvisvgm computes hash values of all pages to be processed\&. As long as the page contents don\(cqt change, the hash value of that page stays the same\&. This property can be used to determine whether a DVI page must be converted again or can be skipped in consecutive runs of dvisvgm\&. This is done by propagating the hash value to variable \fB%hd\fR which can be accessed in the output pattern (see option \fB\-\-output\fR)\&. By default, dvisvgm changes the output pattern to \fB%f\-%hd\fR if option \fB\-\-page\-hashes\fR is given\&. As a result, all SVG file names contain the hash value instead of the page number\&. When calling dvisvgm again with option \fB\-\-page\-hashes\fR with the same output pattern, it checks the existence of the SVG file to be created and skips the conversion if it\(cqs already present\&. This also applies for consecutive calls of dvisvgm with different command\-line parameters\&. If you want to force another conversion of a DVI file that hasn\(cqt changed, you must remove the corresponding SVG files beforehand or add the parameter \fBreplace\fR (see below)\&. If you manually set the output pattern to not contain a hash value, the conversion won\(cqt be skipped\&. .sp Alternatively, the output pattern may contain the variables \fB%ho\fR and \fB%hc\fR\&. \fB%ho\fR expands to a 32\-bit hash representing the given command\-line options that affect the generated SVG output, like \fB\-\-no\-fonts\fR and \fB\-\-precision\fR\&. Different combinations of options and parameters lead to different hashes\&. Thus pattern \fB%f\-%hd\-%ho\fR creates filenames that change depending on the DVI data and the given command\-line options\&. Variable \fB%hc\fR provides a combined hash computed from the DVI data and the command\-line options\&. It has the same length as \fB%hd\fR\&. .sp Since the page number isn\(cqt part of the file name by default, different DVI pages with identical contents get the same file name\&. Therefore, only the first one is converted while the others are skipped\&. To create separate files for each page, you can add the page number to the output pattern, e\&.g\&. \fB\-\-output="%f\-%p\-%hc"\fR\&. .sp By default, dvisvgm uses the fast XXH64 hash algorithm to compute the values provided through \fB%hd\fR and \fB%hc\fR\&. 64\-bit hashes should be sufficient for most documents with an average size of pages\&. Alternatively, XXH32 and MD5 can be used as well\&. The desired algorithm is specified by argument \fIparams\fR of option \fB\-\-page\-hashes\fR\&. It takes one of the strings \fBMD5\fR, \fBXXH32\fR, and \fBXXH64\fR, where the names can be given in lower case too, like \fB\-\-page\-hashes=md5\fR\&. Since version 0\&.7\&.1, xxHash provides an experimental 128\-bit hash function, whose algorithm may still change with the next versions of the library\&. If the corresponding API is available, dvisvgm supports the new hash function and option \fB\-\-page\-hashes\fR additionally accepts the algorithm specifier \fBXXH128\fR\&. .sp Finally, option \fB\-\-page\-hashes\fR can take a second argument that must be separated by a comma\&. Currently, only the two parameters \fIlist\fR and \fIreplace\fR are evaluated, e\&.g\&. \fB\-\-page\-hashes=md5,list\fR or \fB\-\-page\-hashes=replace\fR\&. When \fIlist\fR is present, dvisvgm doesn\(cqt perform any conversion but just lists the hash values \fB%hd\fR and \fB%hc\fR of the pages specified by option \fB\-\-page\fR\&. Parameter \fIreplace\fR forces dvisvgm to convert a DVI page even if a file with the target name already exists\&. .RE .PP \fB\-P, \-\-pdf\fR .RS 4 If this option is given, dvisvgm does not expect a DVI but a PDF input file, and tries to convert it to SVG\&. Similar to the conversion of DVI files, only the first page is processed by default\&. Option \fB\-\-page\fR can be used to select different pages, page ranges, and/or page sequences\&. The conversion is realized by creating a single \fIpdffile\fR special command which is forwarded to the PostScript special handler\&. Therefore, this option is only available if dvisvgm was built with PostScript support enabled, and requires Ghostscript to be accessible\&. See option \fB\-\-libgs\fR for further information\&. .RE .PP \fB\-d, \-\-precision\fR=\fIdigits\fR .RS 4 Specifies the maximal number of decimal places applied to floating\-point attribute values\&. All attribute values written to the generated SVG file(s) are rounded accordingly\&. The parameter \fIdigits\fR accepts integer values from 0 to 6, where 0 enables the automatic selection of significant decimal places\&. This is also the default value if dvisvgm is called without option \fB\-\-precision\fR\&. .RE .PP \fB\-\-progress\fR[=\fIdelay\fR] .RS 4 Enables a simple progress indicator shown when time\-consuming operations like PostScript specials are processed\&. The indicator doesn\(cqt appear before the given delay (in seconds) has elapsed\&. The default delay value is 0\&.5 seconds\&. .RE .PP \fB\-r, \-\-rotate\fR=\fIangle\fR .RS 4 Rotates the page content clockwise by \fIangle\fR degrees around the page center\&. This option is equivalent to \fB\-TR\fR\fIangle\fR\&. .RE .PP \fB\-R, \-\-relative\fR .RS 4 SVG allows to define graphics paths by a sequence of absolute and/or relative path commands, i\&.e\&. each command expects either absolute coordinates or coordinates relative to the current drawing position\&. By default, dvisvgm creates paths made up of absolute commands\&. If option \fB\-\-relative\fR is given, relative commands are created instead\&. This slightly reduces the size of the SVG files in most cases\&. .RE .PP \fB\-\-stdin\fR .RS 4 Tells dvisvgm to read the DVI or EPS input data from \fBstdin\fR instead from a file\&. Alternatively to option \fB\-\-stdin\fR, a single dash (\-) can be given\&. The default name of the generated SVG file is \fIstdin\&.svg\fR which can be changed with option \fB\-\-output\fR\&. .RE .PP \fB\-s, \-\-stdout\fR .RS 4 Don\(cqt write the SVG output to a file but redirect it to \fBstdout\fR\&. .RE .PP \fB\-\-tmpdir\fR[=\fIpath\fR] .RS 4 In some cases, dvisvgm needs to create temporary files to work properly\&. These files go to the system\(cqs temporary folder by default, e\&.g\&. \fB/tmp\fR on Linux systems\&. Option \fB\-\-tmpdir\fR allows to specify a different location if necessary for some reason\&. Please note that dvisvgm does not create this folder, so you must ensure that it actually exists before running dvisvgm\&. .sp If the optional parameter \fIpath\fR is omitted, dvisvgm prints the location of the system\(cqs temp folder and exits\&. .RE .PP \fB\-a, \-\-trace\-all\fR=[\fIretrace\fR] .RS 4 This option forces dvisvgm to vectorize not only the glyphs actually required to render the SVG file correctly \(en which is the default \(en, but processes all glyphs of all fonts referenced in the DVI file\&. Because dvisvgm stores the tracing results in a font cache, all following conversions of these fonts will speed up significantly\&. The boolean option \fIretrace\fR determines how to handle glyphs already stored in the cache\&. By default, these glyphs are skipped\&. Setting argument \fIretrace\fR to \fIyes\fR or \fItrue\fR forces dvisvgm to retrace the corresponding bitmaps again\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br This option only takes effect if font caching is active\&. Therefore, \fB\-\-trace\-all\fR cannot be combined with option \fB\-\-cache=none\fR\&. .sp .5v .RE .RE .PP \fB\-T, \-\-transform\fR=\fIcommands\fR .RS 4 Applies a sequence of transformations to the SVG content\&. Each transformation is described by a \fIcommand\fR beginning with a capital letter followed by a list of comma\-separated parameters\&. Following transformation commands are supported: .PP \fBT\fR \fItx\fR[,\fIty\fR] .RS 4 Translates (moves/shifts) the page in direction of vector (\fItx\fR,\fIty\fR)\&. If \fIty\fR is omitted, \fIty\fR=0 is assumed\&. The expected unit length of \fItx\fR and \fIty\fR are TeX points (1pt = 1/72\&.27in)\&. However, there are several constants defined to simplify the unit conversion (see below)\&. .RE .PP \fBS\fR \fIsx\fR[,\fIsy\fR] .RS 4 Scales the page horizontally by \fIsx\fR and vertically by \fIsy\fR\&. If \fIsy\fR is omitted, \fIsy\fR=\fIsx\fR is assumed\&. .RE .PP \fBR\fR \fIangle\fR[,\fIx\fR,\fIy\fR] .RS 4 Rotates the page clockwise by \fIangle\fR degrees around point (\fIx\fR,\fIy\fR)\&. If the optional arguments \fIx\fR and \fIy\fR are omitted, the page will be rotated around its center depending on the chosen page format\&. When option \fB\-bnone\fR is given, the rotation center is origin (0,0)\&. .RE .PP \fBKX\fR \fIangle\fR .RS 4 Skews the page along the \fIx\fR\-axis by \fIangle\fR degrees\&. Argument \fIangle\fR can take any value except 90+180\fIk\fR, where \fIk\fR is an integer\&. .RE .PP \fBKY\fR \fIangle\fR .RS 4 Skews the page along the \fIy\fR\-axis by \fIangle\fR degrees\&. Argument \fIangle\fR can take any value except 90+180\fIk\fR, where \fIk\fR is an integer\&. .RE .PP \fBFH\fR [\fIy\fR] .RS 4 Mirrors (flips) the page at the horizontal line through point (0,\fIy\fR)\&. Omitting the optional argument leads to \fIy\fR=\fIh\fR/2, where \fIh\fR denotes the page height (see \fIpre\-defined constants\fR below)\&. .RE .PP \fBFV\fR [\fIx\fR] .RS 4 Mirrors (flips) the page at the vertical line through point (\fIx\fR,0)\&. Omitting the optional argument leads to \fIx\fR=\fIw\fR/2, where \fIw\fR denotes the page width (see \fIpre\-defined constants\fR below)\&. .RE .PP \fBM\fR \fIm1\fR,\&...,\fIm6\fR .RS 4 Applies a transformation described by the 3\(mu3 matrix ((\fIm1\fR,\fIm2\fR,\fIm3\fR),(\fIm4\fR,\fIm5\fR,\fIm6\fR),(0,0,1)), where the inner triples denote the rows\&. .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br All transformation commands of option \fB\-T, \-\-transform\fR are applied in the order of their appearance\&. Multiple commands can optionally be separated by spaces\&. In this case the whole transformation string has to be enclosed in double quotes to keep them together\&. All parameters are expressions of floating point type\&. You can either give plain numbers or arithmetic terms combined by the operators \fB+\fR (addition), \fB\-\fR (subtraction), \fB*\fR (multiplication), \fB/\fR (division) or \fB%\fR (modulo) with common associativity and precedence rules\&. Parentheses may be used as well\&. .sp Additionally, some pre\-defined constants are provided: .TS tab(:); lt lt lt lt lt lt lt lt. T{ \fBux\fR T}:T{ horizontal position of upper left page corner in TeX point units T} T{ \fBuy\fR T}:T{ vertical position of upper left page corner in TeX point units T} T{ \fBh\fR T}:T{ page height in TeX point units (0 in case of \fB\-bnone\fR) T} T{ \fBw\fR T}:T{ page width in TeX point units (0 in case of \fB\-bnone\fR) T} .TE .sp 1 Furthermore, you can use the 9 length constants \fBpt\fR, \fBbp\fR, \fBcm\fR, \fBmm\fR, \fBin\fR, \fBpc\fR, \fBdd\fR, \fBcc\fR, and \fBsp\fR, e\&.g\&. \fB2cm\fR or \fB1\&.6in\fR\&. Thus, option \fB\-TT1in,0R45\fR moves the page content 1 inch to the right and rotates it by 45 degrees around the page center afterwards\&. .sp For single transformations, there are also the short\-hand options \fB\-c\fR, \fB\-t\fR and \fB\-r\fR available\&. In contrast to the \fB\-\-transform\fR commands, the order of these options is not significant, so that it\(cqs not possible to describe transformation sequences with them\&. .sp .5v .RE .RE .RE .PP \fB\-t, \-\-translate\fR=\fItx\fR[,\fIty\fR] .RS 4 Translates (moves) the page content in direction of vector (\fItx\fR,\fIty\fR)\&. This option is equivalent to \fB\-TT\fR\fItx\fR,\fIty\fR\&. .RE .PP \fB\-v, \-\-verbosity\fR=\fIlevel\fR .RS 4 Controls the type of messages printed during a dvisvgm run: .TS tab(:); lt lt lt lt lt lt lt lt. T{ \fB0\fR T}:T{ no message output at all T} T{ \fB1\fR T}:T{ error messages only T} T{ \fB2\fR T}:T{ warning messages only T} T{ \fB4\fR T}:T{ informational messages only T} .TE .sp 1 .if n \{\ .sp .\} .RS 4 .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .br .ps +1 \fBNote\fR .ps -1 .br By adding these values you can combine the categories\&. The default level is 7, i\&.e\&. all messages are printed\&. .sp .5v .RE .RE .PP \fB\-V, \-\-version\fR[=\fIextended\fR] .RS 4 Prints the version of dvisvgm and exits\&. If the optional argument is set to \fIyes\fR, the version numbers of the linked libraries are printed as well\&. .RE .PP \fB\-z, \-\-zip\fR[=\fIlevel\fR] .RS 4 Creates a compressed SVG file with suffix \&.svgz\&. The optional argument specifies the compression level\&. Valid values are in the range of 1 to 9 (default value is 9)\&. Larger values cause better compression results but may take slightly more computation time\&. .RE .PP \fB\-Z, \-\-zoom\fR=\fIfactor\fR .RS 4 Multiplies the values of the \fIwidth\fR and \fIheight\fR attributes of the SVG root element by argument \fIfactor\fR while the coordinate system of the graphic content is retained\&. As a result, most SVG viewers zoom the graphics accordingly\&. If a negative zoom factor is given, the \fIwidth\fR and \fIheight\fR attributes are omitted\&. .RE .SH "SUPPORTED SPECIALS" .sp dvisvgm supports several sets of \fIspecial commands\fR that can be used to enrich DVI files with additional features, like color, graphics, and hyperlinks\&. The evaluation of special commands is delegated to dedicated handlers provided by dvisvgm\&. Each handler is responsible for all special statements of the same command set, i\&.e\&. commands beginning with the same prefix\&. To get a list of the actually provided special handlers, use option \fB\-\-list\-specials\fR (see above)\&. This section gives an overview of the special commands currently supported\&. .PP \fBbgcolor\fR .RS 4 Special statement for changing the background/page color\&. Since SVG 1\&.1 doesn\(cqt support background colors, dvisvgm inserts a rectangle of the chosen color into the generated SVG document\&. This rectangle always gets the same size as the selected or computed bounding box\&. This background color command is part of the color special set but is handled separately in order to let the user turn it off\&. For an overview of the command syntax, see the documentation of dvips, for instance\&. .RE .PP \fBcolor\fR .RS 4 Statements of this command set provide instructions to change the text/paint color\&. For an overview of the exact syntax, see the documentation of dvips, for instance\&. .RE .PP \fBdvisvgm\fR .RS 4 dvisvgm offers its own small set of specials\&. The following list gives a brief overview\&. .PP \fBdvisvgm:raw\fR \fItext\fR .RS 4 Adds an arbitrary sequence of XML nodes to the page section of the SVG document\&. dvisvgm checks syntax and proper nesting of the inserted elements but does not perform any validation, thus the user has to ensure that the resulting SVG is still valid\&. Opening and closing tags may be distributed among different \fBraw\fR specials\&. The tags themselves can also be split but must be continued with the immediatly following \fBraw\fR special\&. Both syntactically incorrect and wrongly nested tags lead to error messages\&. Parameter \fItext\fR may also contain the expressions \fB{?x}\fR, \fB{?y}\fR, \fB{?color}\fR, and \fB{?matrix}\fR that expand to the current \fIx\fR or \fIy\fR coordinate, the current color, and current transformation matrix, respectively\&. Furthermore, \fB{?nl}\fR expands to a newline character\&. .RE .PP \fBdvisvgm:rawdef\fR \fItext\fR .RS 4 This command is similar to \fBdvisvgm:raw\fR, but puts the XML nodes into the section of the SVG document currently being generated\&. .RE .PP \fBdvisvgm:rawset\fR \fIname\fR \&... \fBdvisvgm:endrawset\fR .RS 4 This pair of specials marks the begin and end of a definition of a named raw SVG fragment\&. All \fBdvisvgm:raw\fR and \fBdvisvgm:rawdef\fR specials enclosed by \fBdvisvgm:rawset\fR and \fBdvisvgm:endrawset\fR are not evaluated immediately but stored together under the given \fIname\fR for later use\&. Once defined, the named fragment can be referenced throughout the DVI file by \fBdvisvgm:rawput\fR (see below)\&. The two commands \fBdvisvgm:rawset\fR and \fBdvisvgm:endrawset\fR must not be nested, i\&.e\&. each call of \fBdvisvgm:rawset\fR has to be followed by a corresponding call of \fBdvisvgm:endrawset\fR before another \fBdvisvgm:rawset\fR may occur\&. Also, the identifier \fIname\fR must be unique throughout the DVI file\&. Using \fBdvisvgm:rawset\fR multiple times together with the same \fIname\fR leads to warning messages\&. .RE .PP \fBdvisvgm:rawput\fR \fIname\fR .RS 4 Inserts raw SVG fragments previously stored under the given \fIname\fR\&. dvisvgm distinguishes between fragments that were specified with \fBdvisvgm:raw\fR or \fBdvisvgm:rawdef\fR, and handles them differently: It inserts all \fBdvisvgm:raw\fR parts every time \fBdvisvgm:rawput\fR is called, whereas the \fBdvisvgm:rawdef\fR portions go to the section of the current SVG document only once\&. .RE .PP \fBdvisvgm:img\fR \fIwidth\fR \fIheight\fR \fIfile\fR .RS 4 Creates an image element at the current graphic position referencing the given file\&. JPEG, PNG, and SVG images can be used here\&. However, dvisvgm does not check the file format or the file name suffix\&. The lengths \fIwidth\fR and \fIheight\fR can be given together with a unit specifier (see option \fB\-\-bbox\fR) or as plain floating point numbers\&. In the latter case, TeX point units are assumed (1in = 72\&.27pt)\&. .RE .PP \fBdvisvgm:bbox\fR lock .RS 4 Locks the bounding box of the current page and prevents it from further updating, i\&.e\&. graphics elements added after calling this special are not taken into account in determining the extent of the bounding box\&. .RE .PP \fBdvisvgm:bbox\fR unlock .RS 4 Unlocks the previously locked bounding box of the current page so that it gets updated again when adding graphics elements to the page\&. .RE .PP \fBdvisvgm:bbox\fR n[ew] \fIname\fR .RS 4 Defines or resets a local bounding box called \fIname\fR\&. The name may consist of letters and digits\&. While processing a DVI page, dvisvgm continuously updates the (global) bounding box of the current page in order to determine the minimal rectangle containing all visible page components (characters, images, drawing elements etc\&.) Additionally to the global bounding box, the user can request an arbitrary number of named local bounding boxes\&. Once defined, these boxes are updated together with the global bounding box starting with the first character that follows the definition\&. Thus, the local boxes can be used to compute the extent of parts of the page\&. This is useful for scenarios where the generated SVG file is post\-processed\&. In conjunction with special \fBdvisvgm:raw\fR, the macro \fB{?bbox \fR\fB\fIname\fR\fR\fB}\fR expands to the four values \fIx\fR, \fIy\fR, \fIw\fR, and \fIh\fR (separated by spaces) specifying the coordinates of the upper left corner, width, and height of the local box \fIname\fR\&. If box \fIname\fR wasn\(cqt previously defined, all four values equal to zero\&. .RE .PP \fBdvisvgm:bbox\fR \fIwidth\fR \fIheight\fR [\fIdepth\fR] [\fBtransform\fR] .RS 4 Updates the bounding box of the current page by embedding a virtual rectangle (\fIx\fR, \fIy\fR, \fIwidth\fR, \fIheight\fR) where the lower left corner is located at the current DVI drawing position (\fIx\fR,\fIy\fR)\&. If the optional parameter \fIdepth\fR is specified, dvisvgm embeds a second rectangle (\fIx\fR, \fIy\fR, \fIwidth\fR, \-\fIdepth\fR)\&. The lengths \fIwidth\fR, \fIheight\fR, and \fIdepth\fR can be given together with a unit specifier (see option \fB\-\-bbox\fR) or as plain floating point numbers\&. In the latter case, TeX point units are assumed (1in = 72\&.27pt)\&. Depending on size and position of the virtual rectangle, this command either enlarges the overall bounding box or leaves it as is\&. It\(cqs not possible to reduce its extent\&. This special should be used together with \fBdvisvgm:raw\fR in order to update the viewport of the page properly\&. By default, the box extents are assigned unchanged and, in particular, are not altered by transformation commands\&. In order to apply the current transformation matrix, the optional modifier \fBtransform\fR can be added at the end of the special statement\&. .RE .PP \fBdvisvgm:bbox\fR a[bs] \fIx1\fR \fIy1\fR \fIx2\fR \fIy2\fR [\fBtransform\fR] .RS 4 This variant of the bbox special updates the bounding box by embedding a virtual rectangle (\fIx1\fR,\fIy1\fR,\fIx2\fR,\fIy2\fR)\&. The points (\fIx1\fR,\fIy1\fR) and (\fIx2\fR,\fIy2\fR) denote the absolute coordinates of two diagonal corners of the rectangle\&. As with the relative special variant described above, the optional modifier \fBtransform\fR allows for applying the current transformation matrix to the bounding box\&. .RE .PP \fBdvisvgm:bbox\fR f[ix] \fIx1\fR \fIy1\fR \fIx2\fR \fIy2\fR [\fBtransform\fR] .RS 4 This variant of the bbox special assigns an absolute (final) bounding box to the resulting SVG\&. After executing this command, dvisvgm doesn\(cqt further alter the bounding box coordinates, except this special is called again later\&. The points (\fIx1\fR,\fIy1\fR) and (\fIx2\fR,\fIy2\fR) denote the absolute coordinates of two diagonal corners of the rectangle\&. As with the relative special variant described above, the optional modifier \fBtransform\fR allows for applying the current transformation matrix to the bounding box\&. .sp The following TeX snippet adds two raw SVG elements to the output and updates the bounding box accordingly: .sp .if n \{\ .RS 4 .\} .nf \especial{dvisvgm:raw }% \especial{dvisvgm:bbox 10bp 10bp 10bp transform}% \especial{dvisvgm:bbox \-10bp 10bp 10bp transform} \especial{dvisvgm:raw }% \especial{dvisvgm:bbox abs 10bp 200bp 100bp 250bp transform} .fi .if n \{\ .RE .\} .RE .RE .PP \fBem\fR .RS 4 These specials were introduced with the \fIemTeX\fR distribution by Eberhard Mattes\&. They provide line drawing statements, instructions for embedding MSP, PCX, and BMP image files, as well as two PCL commands\&. dvisvgm supports only the line drawing statements and ignores all other em specials silently\&. A description of the command syntax can be found in the DVI driver documentation coming with emTeX (\m[blue]https://ctan.org/pkg/emtex\m[])\&. .RE .PP \fBhtml\fR .RS 4 The hyperref specification defines several variants on how to mark hyperlinked areas in a DVI file\&. dvisvgm supports the plain HyperTeX special constructs as created with hyperref package option \fIhypertex\fR\&. By default, all linked areas of the document are marked by a rectangle\&. Option \fB\-\-linkmark\fR allows to change this behavior\&. See above for further details\&. Information on syntax and semantics of the HyperTeX specials can be found in the hyperref manual (\m[blue]https://ctan.org/pkg/hyperref\m[])\&. .RE .PP \fBpapersize\fR .RS 4 The \fIpapersize\fR special, which is an extension introduced by dvips, can be used to specify the widths and heights of the pages in the DVI file\&. It affects the page it appears on as well as all following pages until another papersize special is found\&. If there is more than one papersize special present on a page, dvisvgm applies the last one\&. However, in order to stay compatible with previous versions of dvisvgm that did not evaluate these specials, their processing must be explicitly enabled by adding option \fB\-\-bbox=papersize\fR on the command\-line\&. Otherwise, dvisvgm ignores them and computes tight bounding boxes\&. .RE .PP \fBpdf\fR .RS 4 pdfTeX and dvipdfmx introduced several special commands related to the generation of PDF files\&. Currently, only \fIpdf:mapfile\fR, \fIpdf:mapline\fR, \fIpdf:pagesize\fR, and PDF hyperlink specials are supported by dvisvgm\&. The latter are the PDF pendants to the HTML HyperTeX specials generated by the hyperref package in PDF mode\&. .sp \fIpdf:pagesize\fR is similar to the \fIpapersize\fR special (see above) which specifies the size of the current and all folowing pages\&. In order to actually apply the extents to the generated SVG files, option \fB\-\-bbox=papersize\fR must be given\&. .sp \fIpdf:mapfile\fR and \fIpdf:mapline\fR allow for modifying the font map tree while processing the DVI file\&. They are used by CTeX, for example\&. dvisvgm supports both, the dvips and dvipdfm font map format\&. For further information on the command syntax and semantics, see the documentation of \fB\epdfmapfile\fR in the pdfTeX user manual (\m[blue]https://ctan.org/pkg/pdftex\m[])\&. .RE .PP \fBps\fR .RS 4 The famous DVI driver \fIdvips\fR (\m[blue]https://www.tug.org/texinfohtml/dvips.html\m[]) introduced its own set of specials in order to embed PostScript code into DVI files, which greatly improves the capabilities of DVI documents\&. One aim of dvisvgm is to completely evaluate all PostScript fragments and to convert as many of them as possible to SVG\&. In contrast to dvips, dvisvgm uses floating point arithmetics to compute the precise position of each graphic element, i\&.e\&. it doesn\(cqt round the coordinates\&. Therefore, the relative locations of the graphic elements may slightly differ from those computed by dvips\&. .sp Since PostScript is a rather complex language, dvisvgm does not implement its own PostScript interpreter but relies on Ghostscript (\m[blue]https://ghostscript.com\m[]) instead\&. If the Ghostscript library was not linked to the dvisvgm binary, it is looked up and loaded dynamically during runtime\&. In this case, dvisvgm looks for \fIlibgs\&.so\&.X\fR on Unix\-like systems (supported ABI versions: 7,8,9), for \fIlibgs\&.X\&.dylib\fR on macOS, and for \fIgsdll32\&.dll\fR or \fIgsdll64\&.dll\fR on Windows\&. You can override the default file names with environment variable \fBLIBGS\fR or the command\-line option \fB\-\-libgs\fR\&. The library must be reachable through the ld search path (*nix) or the PATH environment variable (Windows)\&. Alternatively, the absolute file path can be specified\&. If the library cannot be found, dvisvgm disables the processing of PostScript specials and prints a warning message\&. Use option \fB\-\-list\-specials\fR to check whether PostScript support is available, i\&.e\&. entry \fIps\fR is present\&. .sp The PostScript handler also recognizes and evaluates bounding box data generated by the preview package (\m[blue]https://ctan.org/pkg/preview\m[]) with option \fItightpage\fR\&. If such data is present in the DVI file and if dvisvgm is called with option \fB\-\-bbox=preview\fR, dvisvgm sets the width and total height of the SVG file to the values derived from the preview data\&. Additionally, it prints a message showing the width, height, and depth of the box in TeX point units to the console\&. Especially, the depth value can be read by a post\-processor to vertically align the SVG graphics with the baseline of surrounding text in HTML or XSL\-FO documents, for example\&. Please note that SVG bounding boxes are defined by a width and (total) height\&. In contrast to TeX, SVG provides no means to differentiate between height and depth, i\&.e\&. the vertical extents above and below the baseline, respectively\&. Therefore, it is generally not possible to retrieve the depth value from the SVG file itself\&. .sp If you call dvisvgm with option \fB\-\-bbox=min\fR (the default) and preview data is present in the DVI file, dvisvgm doesn\(cqt apply the preview extents but computes a bounding box that tightly encloses the page contents\&. The height, depth and width values written to console are adapted accordingly\&. .RE .PP \fBtpic\fR .RS 4 The TPIC special set defines instructions for drawing simple geometric objects\&. Some LaTeX packages, like eepic and tplot, use these specials to describe graphics\&. .RE .SH "EXAMPLES" .PP \fBdvisvgm file\fR .RS 4 Converts the first page of \fIfile\&.dvi\fR to \fIfile\&.svg\fR\&. .RE .PP \fBdvisvgm \-p1\-5 file\fR .RS 4 Converts the first five pages of \fIfile\&.dvi\fR to \fIfile\-1\&.svg\fR,\&...,\fIfile\-5\&.svg\fR\&. .RE .PP \fBdvisvgm \-p1\- file\fR .RS 4 Converts all pages of \fIfile\&.dvi\fR to separate SVG files\&. .RE .PP \fBdvisvgm \-p1,3 \-O file\fR .RS 4 Converts the first and third page of \fIfile\&.dvi\fR to optimized SVG files\&. .RE .PP \fBdvisvgm \- < file\&.dvi\fR .RS 4 Converts the first page of \fIfile\&.dvi\fR to \fIstdin\&.svg\fR where the contents of \fIfile\&.dvi\fR is read from \fBstdin\fR\&. .RE .PP \fBdvisvgm \-z file\fR .RS 4 Converts the first page of \fIfile\&.dvi\fR to \fIfile\&.svgz\fR with default compression level 9\&. .RE .PP \fBdvisvgm \-p5 \-z3 \-ba4\-l \-o newfile file\fR .RS 4 Converts the fifth page of \fIfile\&.dvi\fR to \fInewfile\&.svgz\fR with compression level 3\&. The bounding box is set to DIN/ISO A4 in landscape format\&. .RE .PP \fBdvisvgm \-\-transform="R20,w/3,2h/5 T1cm,1cm S2,3" file\fR .RS 4 Converts the first page of \fIfile\&.dvi\fR to \fIfile\&.svg\fR where three transformations are applied\&. .RE .SH "ENVIRONMENT" .sp dvisvgm uses the \fBkpathsea\fR library for locating the files that it opens\&. Hence, the environment variables described in the library\(cqs documentation influence the converter\&. .sp If dvisvgm was linked without the Ghostscript library, and if PostScript support has not been disabled, the shared Ghostscript library is looked up during runtime via dlopen()\&. The environment variable \fBLIBGS\fR can be used to specify path and file name of the library\&. .sp The pre\-compiled Windows versions of dvisvgm require a working installation of MiKTeX 2\&.9 or above\&. dvisvgm does not work together with the portable edition of MiKTeX because it relies on MiKTeX\(cqs COM interface that is only accessible in a local installation\&. To enable the evaluation of PostScript specials, the original Ghostscript DLL \fIgsdll32\&.dll\fR must be present and reachable through the search path\&. 64\-bit Windows builds require the 64\-bit Ghostscript DLL \fIgsdll64\&.dll\fR\&. Both DLLs come with the corresponding Ghostscript installers available from \m[blue]\fBhttps://ghostscript\&.com\fR\m[]\&. .sp The environment variable \fBDVISVGM_COLORS\fR specifies the colors used to highlight various parts of dvisvgm\(cqs message output\&. It is only evaluated if option \fB\-\-color\fR is given\&. The value of \fBDVISVGM_COLORS\fR is a list of colon\-separated entries of the form \fIgg\fR=\fIBF\fR, where \fIgg\fR denotes one of the color group indicators listed below, and \fIBF\fR are two hexadecimal digits specifying the background (first digit) and foreground/text color (second digit)\&. The color values are defined as follows: 0=black, 1=red, 2=green, 3=yellow, 4=blue, 5=magenta, 6=cyan, 7=gray, 8=bright red, 9=bright green, A=bright yellow, B=bright blue, C=bright magenta, D=bright cyan, E=bright gray, F=white\&. Depending on the terminal, the colors may differ\&. Rather than changing both the text and background color, it\(cqs also possible to change only one of them: An asterisk (*) in place of a hexadecimal digit indicates the default text or background color of the terminal\&. .sp All malformed entries in the list are silently ignored\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fBer\fR T}:T{ .sp error messages T} T{ .sp \fBwn\fR T}:T{ .sp warning messages T} T{ .sp \fBpn\fR T}:T{ .sp messages about page numbers T} T{ .sp \fBps\fR T}:T{ .sp page size messages T} T{ .sp \fBfw\fR T}:T{ .sp information about the files written T} T{ .sp \fBsm\fR T}:T{ .sp state messages T} T{ .sp \fBtr\fR T}:T{ .sp messages of the glyph tracer T} T{ .sp \fBpi\fR T}:T{ .sp progress indicator T} .TE .sp 1 .sp \fBExample:\fR \fBer=01:pi=*5\fR sets the colors of error messages (\fBer\fR) to red (\fB1\fR) on black (\fB0\fR), and those of progress indicators (\fBpi\fR) to cyan (\fB5\fR) on default background (\fB*\fR)\&. .SH "FILES" .sp The location of the following files is determined by the kpathsea library\&. To check the actual kpathsea configuration you can use the \fBkpsewhich\fR utility\&. .TS tab(:); lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt lt. T{ .sp \fB*\&.enc\fR T}:T{ .sp Font encoding files T} T{ .sp \fB*\&.fgd\fR T}:T{ .sp Font glyph data files (cache files created by dvisvgm) T} T{ .sp \fB*\&.map\fR T}:T{ .sp Font map files T} T{ .sp \fB*\&.mf\fR T}:T{ .sp Metafont input files T} T{ .sp \fB*\&.pfb\fR T}:T{ .sp PostScript Type 1 font files T} T{ .sp \fB*\&.pro\fR T}:T{ .sp PostScript header/prologue files T} T{ .sp \fB*\&.tfm\fR T}:T{ .sp TeX font metric files T} T{ .sp \fB*\&.ttf\fR T}:T{ .sp TrueType font files T} T{ .sp \fB*\&.vf\fR T}:T{ .sp Virtual font files T} .TE .sp 1 .SH "SEE ALSO" .sp \fBtex(1), mf(1), mktexmf(1), grodvi(1), potrace(1)\fR, and the \fBkpathsea library\fR info documentation\&. .SH "RESOURCES" .PP Project home page .RS 4 \m[blue]\fBhttps://dvisvgm\&.de\fR\m[] .RE .PP Code repository .RS 4 \m[blue]\fBhttps://github\&.com/mgieseki/dvisvgm\fR\m[] .RE .SH "BUGS" .sp Please report bugs using the bug tracker at GitHub (\m[blue]https://github.com/mgieseki/dvisvgm/issues\m[])\&. .SH "AUTHOR" .sp Written by Martin Gieseking <\m[blue]\fBmartin\&.gieseking@uos\&.de\fR\m[]> .SH "COPYING" .sp Copyright \(co 2005\-2019 Martin Gieseking\&. Free use of this software is granted under the terms of the GNU General Public License (GPL) version 3 or, (at your option) any later version\&. dvisvgm-2.8.1/doc/dvisvgm.txt.in0000664000175000017500000015727313563265465013554 00000000000000////////////////////////////////////////////////////////////////////////// // This file is part of dvisvgm -- a fast DVI to SVG converter // // Copyright (C) 2005-2019 Martin Gieseking // // // // This program is free software; you can redistribute it and/or // // modify it under the terms of the GNU General Public License as // // published by the Free Software Foundation; either version 3 of // // the License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, but // // WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program; if not, see . // ////////////////////////////////////////////////////////////////////////// dvisvgm(1) ========== Martin Gieseking <@PACKAGE_BUGREPORT@> :man source: dvisvgm :man version: @VERSION@ :man manual: dvisvgm Manual :revdate: 2019-11-12 20:21 +0100 Name ---- dvisvgm - converts DVI and EPS files to the XML-based SVG format Synopsis -------- *dvisvgm* [ 'options' ] 'file' [.dvi] *dvisvgm* --eps [ 'options' ] 'file' [.eps] *dvisvgm* --pdf [ 'options' ] 'file' [.pdf] Description ----------- The command-line utility *dvisvgm* converts DVI files, as generated by TeX/LaTeX, to the XML-based scalable vector graphics format SVG. It supports the classic DVI version 2 as well as version 3 (created by pTeX in vertical mode), and the XeTeX versions 5 to 7 which are also known as XDV. Besides the basic DVI commands, dvisvgm also evaluates many so-called 'specials' which heavily extend the capabilities of the plain DVI format. For a more detailed overview, see section <> below. Since the current SVG standard 1.1 doesn't specify multi-page graphics, dvisvgm creates separate SVG files for each DVI page. Because of compatibility reasons, only the first page is converted by default. In order to select a different page or arbitrary page sequences, use option *-p* which is described below. SVG is a vector-based graphics format and therefore dvisvgm tries to convert the glyph outlines of all fonts referenced in a DVI page section to scalable path descriptions. The fastest way to achieve this is to extract the path information from vector-based font files available in PFB, TTF, or OTF format. If dvisvgm is able to find such a file, it extracts all necessary outline information about the glyphs from it. However, TeX's main source for font descriptions is Metafont, which produces bitmap output (GF files). That's why not all obtainable TeX fonts are available in a scalable format. In these cases, dvisvgm tries to vectorize Metafont's output by tracing the glyph bitmaps. The results are not as perfect as most (manually optimized) PFB or OTF counterparts, but are nonetheless really nice in most cases. When running dvisvgm without option *--no-fonts*, it creates 'font' elements (++...++) to embed the font data into the SVG files. Unfortunately, only few SVG renderers support these elements yet. Most web browsers and vector graphics applications don't evaluate them properly so that the text components of the resulting graphics might look strange. In order to create more compatible SVG files, command-line option *--no-fonts* can be given to replace the font elements by plain graphics paths. Options ------- dvisvgm provides a POSIX-compliant command-line interface with short and long option names. They may be given before and/or after the name of the file to be converted. Also, the order of specifying the options is not significant, i.e. you can add them in any order without changing dvisvgm's behavior. Certain options accept or require additional parameters which are directly appended to or separated by whitespace from a short option (e.g. +-v0+ or +-v 0+). Long options require an additional equals sign (+=+) between option name and argument but without any surrounding whitespace (e.g. +--verbosity=0+). Multiple short options that don't expect a further parameter can be combined after a single dash (e.g. +-ejs+ rather than +-e -j -s+). *-b, --bbox*='fmt':: Sets the bounding box of the generated graphic to the specified format. The parameter 'fmt' takes either one of the format specifiers listed below, or a sequence of four comma- or whitespace-separated length values 'x1', 'y1', 'x2' and 'y2'. The latter define the absolute coordinates of two diagonal corners of the bounding box. Each length value consists of a floating point number and an optional length unit (pt, bp, cm, mm, in, pc, dd, cc, or sp). If the unit is omitted, TeX points (pt) are assumed. + It's also possible to give only one length value 'l'. In this case, the minimal bounding box is computed and enlarged by adding (-'l',-'l') to the upper left and ('l','l') to the lower right corner. + Additionally, dvisvgm also supports the following format specifiers: *International DIN/ISO paper sizes*;; A__n__, B__n__, C__n__, D__n__, where 'n' is a non-negative integer, e.g. A4 or a4 for DIN/ISO A4 format (210mm × 297mm). *North American paper sizes*;; invoice, executive, legal, letter, ledger *Special bounding box sizes*;; [horizontal] *dvi*::: page size stored in the DVI file *min*::: computes the minimal/tightest bounding box *none*::: no bounding box is assigned *papersize*::: box sizes specified by 'papersize' specials present in the DVI file *preview*::: bounding box data computed by the preview package (if present in the DVI file) // *Page orientation*;; The default page orientation for DIN/ISO and American paper sizes is 'portrait', i.e. 'width' < 'height'. Appending *-landscape* or simply *-l* to the format string switches to 'landscape' mode ('width' > 'height'). For symmetry reasons you can also explicitly add *-portrait* or *-p* to indicate the default portrait format. Note that these suffixes are part of the size string and not separate options. Thus, they must directly follow the size specifier without additional blanks. Furthermore, the orientation suffixes can't be used with *dvi*, *min*, and *none*. + [NOTE] Option *-b, --bbox* only affects the bounding box and does not transform the page content. Hence, if you choose a landscape format, the page won't be rotated. + // // *-C, --cache*[='dir']:: To speed up the conversion process of bitmap fonts, dvisvgm saves intermediate conversion information in cache files. By default, these files are stored in +$XDG_CACHE_HOME/dvisvgm/+ or +$HOME/.cache/dvisvgm+ if +XDG_CACHE_HOME+ is not set. If you prefer a different location, use option *--cache* to overwrite the default. Furthermore, it is also possible to disable the font caching mechanism completely with option *--cache=none*. If argument 'dir' is omitted, dvisvgm prints the path of the default cache directory together with further information about the stored fonts. Additionally, outdated and corrupted cache files are removed. *-j, --clipjoin*:: This option tells dvisvgm to compute all intersections of clipping paths itself rather than delegating this task to the SVG renderer. The resulting SVG files are more portable because some SVG viewers don't support intersecting clipping paths which are defined by 'clipPath' elements containing a 'clip-path' attribute. *--color*:: Enables colorization of messages printed during the conversion process. The colors can be customized via environment variable *DVISVGM_COLORS*. See the <> below for further information. *--colornames*:: By default, dvisvgm exclusively uses RGB values of the form '#RRGGBB' or '#RGB' to represent colors in the SVG file. The latter is a short form for colors whose RGB components each consist of two identical hex digits, e.g. +#123+ equals +#112233+. According to the SVG standard, it's also possible to use color names (like +black+ and +darkblue+) for a limited number of https://www.w3.org/TR/SVG11/types.html#ColorKeywords[predefined colors]. In order to apply these color names rather than their RGB values, call dvisvgm with option *--colornames*. All colors without an SVG color name will still be represented by RGB values. *--comments*:: Adds comments with further information about selected data to the SVG file. Currently, only font elements and font CSS rules related to native fonts are annotated. *-E, --eps*:: If this option is given, dvisvgm does not expect a DVI but an EPS input file, and tries to convert it to SVG. In order to do so, a single 'psfile' special command is created and forwarded to the PostScript special handler. This option is only available if dvisvgm was built with PostScript support enabled, and requires Ghostscript to be available. See option *--libgs* for further information. *-e, --exact-bbox*:: This option tells dvisvgm to compute the precise bounding box of each character. By default, the values stored in a font's TFM file are used to determine a glyph's extent. As these values are intended to implement optimal character placements and are not designed to represent the exact dimensions, they don't necessarily correspond with the bounds of the visual glyphs. Thus, width and/or height of some glyphs may be larger (or smaller) than the respective TFM values. As a result, this can lead to clipped characters at the bounds of the SVG graphics. With option *--exact-bbox* given, dvisvgm analyzes the actual shape of each character and derives a usually tight bounding box. *-f, --font-format*='format':: Selects the file format used to embed the font data into the SVG files. Following formats are supported: +SVG+ (that's the default), +TTF+ (TrueType), +WOFF+, and +WOFF2+ (Web Open Font Format version 1 and 2). By default, dvisvgm creates unhinted fonts that might look bad on low-resolution devices. In order to improve the display quality, the generated TrueType, WOFF, or WOFF2 fonts can be autohinted. The autohinter is enabled by appending +,autohint+ or +,ah+ to the font format, e.g. +--font-format=woff,autohint+ or +--font-format=woff,ah+. + Option *--font-format* is only available if dvisvgm was built with WOFF support enabled. *-m, --fontmap*='filenames':: Loads and evaluates a single font map file or a sequence of font map files. These files are required to resolve font file names and encodings. dvisvgm does not provide its own map files but tries to read available ones coming with dvips or dvipdfm. If option *--fontmap* is omitted, dvisvgm looks for the default map files 'ps2pk.map', 'pdftex.map', 'dvipdfm.map', and 'psfonts.map' (in this order). Otherwise, the files given as option arguments are evaluated in the given order. Multiple filenames must be separated by commas without leading and/or trailing whitespace. + By default, redefined mappings do not replace previous ones. However, each filename can be preceded by an optional mode specifier (*+*, *-*, or *=*) to change this behavior: +mapfile;; Only those entries in the given map file that don't redefine a font mapping are applied, i.e. fonts already mapped keep untouched. That's also the default mode if no mode specifier is given. -mapfile;; Ensures that none of the font mappings defined in the given map file are used, i.e. previously defined mappings for the specified fonts are removed. =mapfile;; All mappings defined in the map file are applied. Previously defined settings for the same fonts are replaced. + If the first filename in the filename sequence is preceded by a mode specifier, dvisvgm loads the default font map (see above) and applies the other map files afterwards. Otherwise, none of default map files will be loaded automatically. + Examples: +--fontmap=myfile1.map,+myfile2.map+ loads 'myfile1.map' followed by 'myfile2.map' where all redefinitions of `myfile2.map` are ignored. +--fontmap==myfile1.map,-myfile2.map+ loads the default map file followed by 'myfile1.map' and 'myfile2.map' where all redefinitions of 'myfile1.map' replace previous entries. Afterwards, all definitions for the fonts given in 'myfile2.map' are removed from the font map tree. + For further information about the map file formats and the mode specifiers, see the manuals of https://tug.org/texinfohtml/dvips.html[dvips] and https://ctan.org/tex-archive/dviware/dvipdfm[dvipdfm]. *--grad-overlap*:: Tells dvisvgm to create overlapping grid segments when approximating color gradient fills (also see option *--grad-segments* below). By default, adjacent segments don't overlap but only touch each other like separate tiles. However, this alignment can lead to visible gaps between the segments because the background color usually influences the color at the boundary of the segments if the SVG renderer uses anti-aliasing to create smooth contours. One way to avoid this and to create seamlessly touching color regions is to enlarge the segments so that they extent into the area of their right and bottom neighbors. Since the latter are drawn on top of the overlapping parts, the visible size of all segments keeps unchanged. Just the former gaps disappear as the background is now completely covered by the correct colors. Currently, dvisvgm computes the overlapping segments separately for each patch of the mesh (a patch mesh may consist of multiple patches of the same type). Therefore, there still might be visible gaps at the seam of two adjacent patches. *--grad-segments*='number':: Determines the maximal number of segments per column and row used to approximate gradient color fills. Since SVG 1.1 only supports a small subset of the shading algorithms available in PostScript, dvisvgm approximates some of them by subdividing the area to be filled into smaller, monochromatic segments. Each of these segments gets the average color of the region it covers. Thus, increasing the number of segments leads to smaller monochromatic areas and therefore a better approximation of the actual color gradient. As a drawback, more segments imply bigger SVG files because every segment is represented by a separate path element. + Currently, dvisvgm supports free- and lattice-form triangular patch meshes as well as Coons and tensor-product patch meshes. They are approximated by subdividing the area of each patch into a __n__×__n__ grid of smaller segments. The maximal number of segments per column and row can be changed with option *--grad-segments*. *--grad-simplify*='delta':: If the size of the segments created to approximate gradient color fills falls below the given delta value, dvisvgm reduces their level of detail. For example, Bézier curves are replaced by straight lines, and triangular segments are combined to tetragons. For a small 'delta', these simplifications are usually not noticeable but reduce the size of the generated SVG files significantly. *-h, --help*[='mode']:: Prints a short summary of all available command-line options. The optional 'mode' parameter is an integer value between 0 and 2. It selects the display variant of the help text. Mode 0 lists all options divided into categories with section headers. This is also the default if dvisvgm is called without parameters. Mode 1 lists all options ordered by the short option names, while mode 2 sorts the lines by the long option names. *--keep*:: Disables the removal of temporary files as created by Metafont (usually .gf, .tfm, and .log files) or the TrueType/WOFF module. *--libgs*='path':: This option is only available if the Ghostscript library is not directly linked to dvisvgm and if PostScript support was not completely disabled during compilation. In this case, dvisvgm tries to load the shared GS library dynamically during runtime. By default, it expects the library's name to be +libgs.so.X+ (on Unix-like systems, where +X+ is the ABI version of the library) or +gsdll32.dll+/+gsdll64.dll+ (Windows). If dvisvgm doesn't find the library, option *--libgs* can be used to specify the correct path and filename, e.g. +--libgs=/usr/local/lib/libgs.so.9+ or +--libgs=\gs\gs9.25\bin\gsdll64.dll+. + Alternatively, it's also possible to assign the path to environment variable *LIBGS*, e.g. +export LIBGS=/usr/local/lib/libgs.so.9+ or +set LIBGS=\gs\gs9.25\bin\gsdll63.dll+. *LIBGS* has less precedence than the command-line option, i.e. dvisvgm ignores variable *LIBGS* if *--libgs* is given. *-L, --linkmark*='style':: Selects the method how to mark hyperlinked areas. The 'style' argument can take one of the values 'none', 'box', and 'line', where 'box' is the default, i.e. a rectangle is drawn around the linked region if option *--linkmark* is omitted. Style argument 'line' just draws the lower edge of the bounding rectangle, and 'none' tells dvisvgm not to add any visible objects to hyperlinks. The lines and boxes get the current text color selected. In order to apply a different, constant color, a colon followed by a color specifier can be appended to the style string. A 'color specifier' is either a hexadecimal RGB value of the form '#RRGGBB', or a https://en.wikibooks.org/wiki/LaTeX/Colors#The_68_standard_colors_known_to_dvips[dvips color name]. + Moreover, argument 'style' can take a single color specifier to highlight the linked region by a frameless box filled with that color. An optional second color specifier separated by a colon selects the frame color. + Examples: +box:red+ or +box:#ff0000+ draws red boxes around the linked areas. +yellow:blue+ creates yellow filled rectangles with blue frames. *-l, --list-specials*:: Prints a list of registered special handlers and exits. Each handler processes a set of special statements belonging to the same category. In most cases, the categories are identified by the prefix of the special statements. It's usually a leading string followed by a colon or a blank, e.g. 'color' or 'ps'. The listed handler names, however, don't need to match these prefixes, e.g. if there is no common prefix or if functionality is split into separate handlers in order to allow to disable them separately with option *--no-specials*. All special statements not covered by one of the special handlers are silently ignored. *-M, --mag*='factor':: Sets the magnification factor applied in conjunction with Metafont calls prior tracing the glyphs. The larger this value, the better the tracing results. Nevertheless, large magnification values can cause Metafont arithmetic errors due to number overflows. So, use this option with care. The default setting usually produces nice results. *--no-merge*:: Puts every single character in a separate 'text' element with corresponding 'x' and 'y' attributes. By default, new 'text' or 'tspan' elements are only created if a string starts at a location that differs from the regular position defined by the characters' advance values. *--no-mktexmf*:: Suppresses the generation of missing font files. If dvisvgm can't find a font file through the kpathsea lookup mechanism, it calls the external tools 'mktextfm' or 'mktexmf'. This option disables these calls. *-n, --no-fonts*[='variant']:: If this option is given, dvisvgm doesn't create SVG 'font' elements but uses 'paths' instead. The resulting SVG files tend to be larger but are concurrently more compatible with most applications that don't support SVG fonts. The optional argument 'variant' selects the method how to substitute fonts by paths. Variant 0 creates 'path' and 'use' elements in order to avoid lengthy duplicates. Variant 1 creates 'path' elements only. Option *--no-fonts* implies *--no-styles*. *-c, --scale*='sx'[,'sy']:: Scales the page content horizontally by 'sx' and vertically by 'sy'. This option is equivalent to *-TS*'sx','sy'. *-S, --no-specials*[='names']:: Disable processing of special commands embedded in the DVI file. If no further parameter is given, all specials are ignored. To disable a selected set of specials, an optional comma-separated list of names can be appended to this option. A 'name' is the unique identifier referencing the intended special handler as listed by option *--list-specials*. *--no-styles*:: By default, dvisvgm creates CSS styles and class attributes to reference fonts. This variant is more compact than adding the complete font information to each text element over and over again. However, if you prefer direct font references, the default behavior can be disabled with option *--no-styles*. *-O, --optimize*[='modules']:: Applies several optimizations on the generated SVG tree to reduce the file size. The optimizations are performed by running separate optimizer modules specified by optional argument 'modules'. It may consist of a single module name or a comma-separated list of several module names. The corresponding modules are executed one by one in the given order and thus transform the XML tree gradually. + The following list describes the currently available optimizer modules. *list*;; Lists all available optimizer modules and exits. *none*;; If this argument is given, dvisvgm doesn't apply any optimization. *none* can't be combined with other module names. *all*;; Performs all optimizations listed below. This is also the default if option *--optimize* is used without argument. The modules are executed in a predefined order that usually leads to the best results. *all* can't be combined with other module names. *collapse-groups*;; Combines nested group elements (++...++) that contain only a single group each. If possible, the group attributes are moved to the outermost element of the processed subtree. This module also unwraps group elements that have no attributes at all. *group-attributes*;; Creates groups (++...++) for common attributes around adjacent elements. Each attribute is moved to a separate group so that multiple common attributes lead to nested groups. They can be combined by applying optimizer module 'collapse-groups' afterwards. The algorithm only takes inheritable properties, such as +fill+ or +stroke-width+, into account and only removes them from an element if none of the other attributes, like +id+, prevents this. *remove-clippath*;; Removes all redundant 'clipPath' elements. This optimization was already present in former versions of dvisvgm and was always applied by default. This behavior is retained, i.e. dvisvgm executes this module even if option *--optimize* is not given. You can use argument 'none' to prevent that. *simplify-text*;; If a +text+ element only contains whitespace nodes and +tspan+ elements, all common inheritable attributes of the latter are moved to the enclosing text element. All +tspan+ elements without further attributes are unwrapped. *simplify-transform*;; Tries to shorten all 'transform' attributes. This module combines the transformation commands of each attribute and decomposes the resulting transformation matrix into a sequence of basic transformations, i.e. translation, scaling, rotation, and skewing. If this sequence is shorter than the equivalent 'matrix' expression, it's assigned to the attribute. Otherwise, the matrix expression is used. *-o, --output*='pattern':: Sets the pattern specifying the names of the generated SVG files. Parameter 'pattern' is a string that may contain static character sequences as well as the variables +%f+, +%p+, +%P+, +%hd+, +%ho+, and +%hc+. +%f+ expands to the base name of the DVI file, i.e. the filename without suffix, +%p+ is the current page number, and +%P+ the total number of pages in the DVI file. An optional number (0-9) given directly after the percent sign specifies the minimal number of digits to be written. If a particular value consists of less digits, the number is padded with leading zeros. Example: +%3p+ enforces 3 digits for the current page number (001, 002, etc.). Without an explicit width specifier, +%p+ gets the same number of digits as +%P+. + If you need more control over the numbering, you can use arithmetic expressions as part of a pattern. The syntax is +%(+'expr'+)+ where 'expr' may contain additions, subtractions, multiplications, and integer divisions with common precedence. The variables *p* and *P* contain the current page number and the total number of pages, respectively. For example, +--output="%f-%(p-1)"+ creates filenames where the numbering starts with 0 rather than 1. + The variables +%hX+ contain different hash values computed from the DVI page data and the options given on the command-line. +%hd+ and +%hc+ are only set if option *--page-hashes* is present. Otherwise, it's empty. For further information, see the description of option *--page-hashes* below. + The default pattern is +%f-%p.svg+ if the DVI file consists of more than one page, and +%f.svg+ otherwise. That means, a DVI file 'foo.dvi' is converted to 'foo.svg' if 'foo.dvi' is a single-page document. Otherwise, multiple SVG files 'foo-01.svg', 'foo-02.svg', etc. are produced. In Windows environments, the percent sign indicates dereferenced environment variables, and must therefore be protected by a second percent sign, e.g. +--output=%%f-%%p+. *-p, --page*='ranges':: This option selects the pages to be processed. Parameter 'ranges' consists of a comma-separated list of single page numbers and/or page ranges. A page range is a pair of numbers separated by a hyphen, e.g. 5-12. Thus, a page sequence might look like this: 2-4,6,9-12,15. It doesn't matter if a page is given more than once or if page ranges overlap. dvisvgm always extracts the page numbers in ascending order and converts them only once. In order to stay compatible with previous versions, the default page sequence is 1. dvisvgm therefore converts only the first page and not the whole document if option *--page* is omitted. Usually, page ranges consist of two numbers denoting the first and last page to be converted. If the conversion should start at page 1, or if it should continue up to the last DVI page, the first or second range number can be omitted, respectively. Example: +--page=-10+ converts all pages up to page 10, +--page=10-+ converts all pages starting with page 10. Please consider that the page values don't refer to the page numbers printed on the corresponding page. Instead, the physical page count is expected, where the first page always gets number 1. *-H, --page-hashes*[='params']:: If this option is given, dvisvgm computes hash values of all pages to be processed. As long as the page contents don't change, the hash value of that page stays the same. This property can be used to determine whether a DVI page must be converted again or can be skipped in consecutive runs of dvisvgm. This is done by propagating the hash value to variable +%hd+ which can be accessed in the output pattern (see option *--output*). By default, dvisvgm changes the output pattern to +%f-%hd+ if option *--page-hashes* is given. As a result, all SVG file names contain the hash value instead of the page number. When calling dvisvgm again with option *--page-hashes* with the same output pattern, it checks the existence of the SVG file to be created and skips the conversion if it's already present. This also applies for consecutive calls of dvisvgm with different command-line parameters. If you want to force another conversion of a DVI file that hasn't changed, you must remove the corresponding SVG files beforehand or add the parameter +replace+ (see below). If you manually set the output pattern to not contain a hash value, the conversion won't be skipped. + Alternatively, the output pattern may contain the variables +%ho+ and +%hc+. +%ho+ expands to a 32-bit hash representing the given command-line options that affect the generated SVG output, like *--no-fonts* and *--precision*. Different combinations of options and parameters lead to different hashes. Thus pattern +%f-%hd-%ho+ creates filenames that change depending on the DVI data and the given command-line options. Variable +%hc+ provides a combined hash computed from the DVI data and the command-line options. It has the same length as +%hd+. + Since the page number isn't part of the file name by default, different DVI pages with identical contents get the same file name. Therefore, only the first one is converted while the others are skipped. To create separate files for each page, you can add the page number to the output pattern, e.g. +--output="%f-%p-%hc"+. + By default, dvisvgm uses the fast XXH64 hash algorithm to compute the values provided through +%hd+ and +%hc+. 64-bit hashes should be sufficient for most documents with an average size of pages. Alternatively, XXH32 and MD5 can be used as well. The desired algorithm is specified by argument 'params' of option *--page-hashes*. It takes one of the strings +MD5+, +XXH32+, and +XXH64+, where the names can be given in lower case too, like +--page-hashes=md5+. Since version 0.7.1, xxHash provides an experimental 128-bit hash function, whose algorithm may still change with the next versions of the library. If the corresponding API is available, dvisvgm supports the new hash function and option *--page-hashes* additionally accepts the algorithm specifier +XXH128+. + Finally, option *--page-hashes* can take a second argument that must be separated by a comma. Currently, only the two parameters 'list' and 'replace' are evaluated, e.g. +--page-hashes=md5,list+ or +--page-hashes=replace+. When 'list' is present, dvisvgm doesn't perform any conversion but just lists the hash values +%hd+ and +%hc+ of the pages specified by option *--page*. Parameter 'replace' forces dvisvgm to convert a DVI page even if a file with the target name already exists. *-P, --pdf*:: If this option is given, dvisvgm does not expect a DVI but a PDF input file, and tries to convert it to SVG. Similar to the conversion of DVI files, only the first page is processed by default. Option *--page* can be used to select different pages, page ranges, and/or page sequences. The conversion is realized by creating a single 'pdffile' special command which is forwarded to the PostScript special handler. Therefore, this option is only available if dvisvgm was built with PostScript support enabled, and requires Ghostscript to be accessible. See option *--libgs* for further information. *-d, --precision*='digits':: Specifies the maximal number of decimal places applied to floating-point attribute values. All attribute values written to the generated SVG file(s) are rounded accordingly. The parameter 'digits' accepts integer values from 0 to 6, where 0 enables the automatic selection of significant decimal places. This is also the default value if dvisvgm is called without option *--precision*. *--progress*[='delay']:: Enables a simple progress indicator shown when time-consuming operations like PostScript specials are processed. The indicator doesn't appear before the given delay (in seconds) has elapsed. The default delay value is 0.5 seconds. *-r, --rotate*='angle':: Rotates the page content clockwise by 'angle' degrees around the page center. This option is equivalent to *-TR*'angle'. *-R, --relative*:: SVG allows to define graphics paths by a sequence of absolute and/or relative path commands, i.e. each command expects either absolute coordinates or coordinates relative to the current drawing position. By default, dvisvgm creates paths made up of absolute commands. If option *--relative* is given, relative commands are created instead. This slightly reduces the size of the SVG files in most cases. *--stdin*:: Tells dvisvgm to read the DVI or EPS input data from *stdin* instead from a file. Alternatively to option *--stdin*, a single dash (-) can be given. The default name of the generated SVG file is 'stdin.svg' which can be changed with option *--output*. *-s, --stdout*:: Don't write the SVG output to a file but redirect it to *stdout*. *--tmpdir*[='path']:: In some cases, dvisvgm needs to create temporary files to work properly. These files go to the system's temporary folder by default, e.g. +/tmp+ on Linux systems. Option *--tmpdir* allows to specify a different location if necessary for some reason. Please note that dvisvgm does not create this folder, so you must ensure that it actually exists before running dvisvgm. + If the optional parameter 'path' is omitted, dvisvgm prints the location of the system's temp folder and exits. *-a, --trace-all*=['retrace']:: This option forces dvisvgm to vectorize not only the glyphs actually required to render the SVG file correctly – which is the default –, but processes all glyphs of all fonts referenced in the DVI file. Because dvisvgm stores the tracing results in a font cache, all following conversions of these fonts will speed up significantly. The boolean option 'retrace' determines how to handle glyphs already stored in the cache. By default, these glyphs are skipped. Setting argument 'retrace' to 'yes' or 'true' forces dvisvgm to retrace the corresponding bitmaps again. + [NOTE] This option only takes effect if font caching is active. Therefore, *--trace-all* cannot be combined with option *--cache=none*. + *-T, --transform*='commands':: Applies a sequence of transformations to the SVG content. Each transformation is described by a 'command' beginning with a capital letter followed by a list of comma-separated parameters. Following transformation commands are supported: *T* 'tx'[,'ty'];; Translates (moves/shifts) the page in direction of vector ('tx','ty'). If 'ty' is omitted, 'ty'=0 is assumed. The expected unit length of 'tx' and 'ty' are TeX points (1pt = 1/72.27in). However, there are several constants defined to simplify the unit conversion (see below). *S* 'sx'[,'sy'];; Scales the page horizontally by 'sx' and vertically by 'sy'. If 'sy' is omitted, 'sy'='sx' is assumed. *R* 'angle'[,'x','y'];; Rotates the page clockwise by 'angle' degrees around point ('x','y'). If the optional arguments 'x' and 'y' are omitted, the page will be rotated around its center depending on the chosen page format. When option *-bnone* is given, the rotation center is origin (0,0). *KX* 'angle';; Skews the page along the 'x'-axis by 'angle' degrees. Argument 'angle' can take any value except 90+180__k__, where 'k' is an integer. *KY* 'angle';; Skews the page along the 'y'-axis by 'angle' degrees. Argument 'angle' can take any value except 90+180__k__, where 'k' is an integer. *FH* ['y'];; Mirrors (flips) the page at the horizontal line through point (0,'y'). Omitting the optional argument leads to 'y'='h'/2, where 'h' denotes the page height (see <> below). *FV* ['x'];; Mirrors (flips) the page at the vertical line through point ('x',0). Omitting the optional argument leads to 'x'='w'/2, where 'w' denotes the page width (see <> below). *M* 'm1',...,'m6';; Applies a transformation described by the 3×3 matrix \(('m1','m2','m3'),('m4','m5','m6'),(0,0,1)), where the inner triples denote the rows. + [NOTE] ================================================================================================= All transformation commands of option *-T, --transform* are applied in the order of their appearance. Multiple commands can optionally be separated by spaces. In this case the whole transformation string has to be enclosed in double quotes to keep them together. All parameters are expressions of floating point type. You can either give plain numbers or arithmetic terms combined by the operators *+* (addition), *-* (subtraction), *** (multiplication), */* (division) or *%* (modulo) with common associativity and precedence rules. Parentheses may be used as well. [[constants]] Additionally, some pre-defined constants are provided: [horizontal] *ux*:: horizontal position of upper left page corner in TeX point units *uy*:: vertical position of upper left page corner in TeX point units *h*:: page height in TeX point units (0 in case of *-bnone*) *w*:: page width in TeX point units (0 in case of *-bnone*) Furthermore, you can use the 9 length constants +pt+, +bp+, +cm+, +mm+, +in+, +pc+, +dd+, +cc+, and +sp+, e.g. +2cm+ or +1.6in+. Thus, option +-TT1in,0R45+ moves the page content 1 inch to the right and rotates it by 45 degrees around the page center afterwards. For single transformations, there are also the short-hand options *-c*, *-t* and *-r* available. In contrast to the *--transform* commands, the order of these options is not significant, so that it's not possible to describe transformation sequences with them. ================================================================================================= + // // *-t, --translate*='tx'[,'ty']:: Translates (moves) the page content in direction of vector ('tx','ty'). This option is equivalent to *-TT*'tx','ty'. *-v, --verbosity*='level':: Controls the type of messages printed during a dvisvgm run: [horizontal] *0*;; no message output at all *1*;; error messages only *2*;; warning messages only *4*;; informational messages only + [NOTE] By adding these values you can combine the categories. The default level is 7, i.e. all messages are printed. + *-V, --version*[='extended']:: Prints the version of dvisvgm and exits. If the optional argument is set to 'yes', the version numbers of the linked libraries are printed as well. *-z, --zip*[='level']:: Creates a compressed SVG file with suffix .svgz. The optional argument specifies the compression level. Valid values are in the range of 1 to 9 (default value is 9). Larger values cause better compression results but may take slightly more computation time. *-Z, --zoom*='factor':: Multiplies the values of the 'width' and 'height' attributes of the SVG root element by argument 'factor' while the coordinate system of the graphic content is retained. As a result, most SVG viewers zoom the graphics accordingly. If a negative zoom factor is given, the 'width' and 'height' attributes are omitted. [[specials]] Supported Specials ------------------ dvisvgm supports several sets of 'special commands' that can be used to enrich DVI files with additional features, like color, graphics, and hyperlinks. The evaluation of special commands is delegated to dedicated handlers provided by dvisvgm. Each handler is responsible for all special statements of the same command set, i.e. commands beginning with the same prefix. To get a list of the actually provided special handlers, use option *--list-specials* (see above). This section gives an overview of the special commands currently supported. *bgcolor*:: Special statement for changing the background/page color. Since SVG 1.1 doesn't support background colors, dvisvgm inserts a rectangle of the chosen color into the generated SVG document. This rectangle always gets the same size as the selected or computed bounding box. This background color command is part of the color special set but is handled separately in order to let the user turn it off. For an overview of the command syntax, see the documentation of dvips, for instance. *color*:: Statements of this command set provide instructions to change the text/paint color. For an overview of the exact syntax, see the documentation of dvips, for instance. *dvisvgm*:: dvisvgm offers its own small set of specials. The following list gives a brief overview. *dvisvgm:raw* 'text';; Adds an arbitrary sequence of XML nodes to the page section of the SVG document. dvisvgm checks syntax and proper nesting of the inserted elements but does not perform any validation, thus the user has to ensure that the resulting SVG is still valid. Opening and closing tags may be distributed among different +raw+ specials. The tags themselves can also be split but must be continued with the immediatly following +raw+ special. Both syntactically incorrect and wrongly nested tags lead to error messages. Parameter 'text' may also contain the expressions *{?x}*, *{?y}*, *{?color}*, and *{?matrix}* that expand to the current 'x' or 'y' coordinate, the current color, and current transformation matrix, respectively. Furthermore, *{?nl}* expands to a newline character. *dvisvgm:rawdef* 'text';; This command is similar to *dvisvgm:raw*, but puts the XML nodes into the section of the SVG document currently being generated. *dvisvgm:rawset* 'name' ... *dvisvgm:endrawset*;; This pair of specials marks the begin and end of a definition of a named raw SVG fragment. All *dvisvgm:raw* and *dvisvgm:rawdef* specials enclosed by *dvisvgm:rawset* and *dvisvgm:endrawset* are not evaluated immediately but stored together under the given 'name' for later use. Once defined, the named fragment can be referenced throughout the DVI file by *dvisvgm:rawput* (see below). The two commands *dvisvgm:rawset* and *dvisvgm:endrawset* must not be nested, i.e. each call of *dvisvgm:rawset* has to be followed by a corresponding call of *dvisvgm:endrawset* before another *dvisvgm:rawset* may occur. Also, the identifier 'name' must be unique throughout the DVI file. Using *dvisvgm:rawset* multiple times together with the same 'name' leads to warning messages. *dvisvgm:rawput* 'name';; Inserts raw SVG fragments previously stored under the given 'name'. dvisvgm distinguishes between fragments that were specified with *dvisvgm:raw* or *dvisvgm:rawdef*, and handles them differently: It inserts all *dvisvgm:raw* parts every time *dvisvgm:rawput* is called, whereas the *dvisvgm:rawdef* portions go to the section of the current SVG document only once. *dvisvgm:img* 'width' 'height' 'file';; Creates an image element at the current graphic position referencing the given file. JPEG, PNG, and SVG images can be used here. However, dvisvgm does not check the file format or the file name suffix. The lengths 'width' and 'height' can be given together with a unit specifier (see option *--bbox*) or as plain floating point numbers. In the latter case, TeX point units are assumed (1in = 72.27pt). *dvisvgm:bbox* lock;; Locks the bounding box of the current page and prevents it from further updating, i.e. graphics elements added after calling this special are not taken into account in determining the extent of the bounding box. *dvisvgm:bbox* unlock;; Unlocks the previously locked bounding box of the current page so that it gets updated again when adding graphics elements to the page. *dvisvgm:bbox* n[ew] 'name';; Defines or resets a local bounding box called 'name'. The name may consist of letters and digits. While processing a DVI page, dvisvgm continuously updates the (global) bounding box of the current page in order to determine the minimal rectangle containing all visible page components (characters, images, drawing elements etc.) Additionally to the global bounding box, the user can request an arbitrary number of named local bounding boxes. Once defined, these boxes are updated together with the global bounding box starting with the first character that follows the definition. Thus, the local boxes can be used to compute the extent of parts of the page. This is useful for scenarios where the generated SVG file is post-processed. In conjunction with special *dvisvgm:raw*, the macro *{?bbox 'name'}* expands to the four values 'x', 'y', 'w', and 'h' (separated by spaces) specifying the coordinates of the upper left corner, width, and height of the local box 'name'. If box 'name' wasn't previously defined, all four values equal to zero. *dvisvgm:bbox* 'width' 'height' ['depth'] [+transform+];; Updates the bounding box of the current page by embedding a virtual rectangle ('x', 'y', 'width', 'height') where the lower left corner is located at the current DVI drawing position ('x','y'). If the optional parameter 'depth' is specified, dvisvgm embeds a second rectangle ('x', 'y', 'width', -__depth__). The lengths 'width', 'height', and 'depth' can be given together with a unit specifier (see option *--bbox*) or as plain floating point numbers. In the latter case, TeX point units are assumed (1in = 72.27pt). Depending on size and position of the virtual rectangle, this command either enlarges the overall bounding box or leaves it as is. It's not possible to reduce its extent. This special should be used together with *dvisvgm:raw* in order to update the viewport of the page properly. By default, the box extents are assigned unchanged and, in particular, are not altered by transformation commands. In order to apply the current transformation matrix, the optional modifier +transform+ can be added at the end of the special statement. *dvisvgm:bbox* a[bs] 'x1' 'y1' 'x2' 'y2' [+transform+];; This variant of the bbox special updates the bounding box by embedding a virtual rectangle ('x1','y1','x2','y2'). The points ('x1','y1') and ('x2','y2') denote the absolute coordinates of two diagonal corners of the rectangle. As with the relative special variant described above, the optional modifier +transform+ allows for applying the current transformation matrix to the bounding box. *dvisvgm:bbox* f[ix] 'x1' 'y1' 'x2' 'y2' [+transform+];; This variant of the bbox special assigns an absolute (final) bounding box to the resulting SVG. After executing this command, dvisvgm doesn't further alter the bounding box coordinates, except this special is called again later. The points ('x1','y1') and ('x2','y2') denote the absolute coordinates of two diagonal corners of the rectangle. As with the relative special variant described above, the optional modifier +transform+ allows for applying the current transformation matrix to the bounding box. + The following TeX snippet adds two raw SVG elements to the output and updates the bounding box accordingly: + [source,tex] ------------------------------------------------------------------------------------- \special{dvisvgm:raw }% \special{dvisvgm:bbox 10bp 10bp 10bp transform}% \special{dvisvgm:bbox -10bp 10bp 10bp transform} \special{dvisvgm:raw }% \special{dvisvgm:bbox abs 10bp 200bp 100bp 250bp transform} ------------------------------------------------------------------------------------- + *em*:: These specials were introduced with the 'emTeX' distribution by Eberhard Mattes. They provide line drawing statements, instructions for embedding MSP, PCX, and BMP image files, as well as two PCL commands. dvisvgm supports only the line drawing statements and ignores all other em specials silently. A description of the command syntax can be found in the DVI driver documentation coming with https://ctan.org/pkg/emtex[emTeX]. *html*:: The hyperref specification defines several variants on how to mark hyperlinked areas in a DVI file. dvisvgm supports the plain HyperTeX special constructs as created with hyperref package option 'hypertex'. By default, all linked areas of the document are marked by a rectangle. Option *--linkmark* allows to change this behavior. See above for further details. Information on syntax and semantics of the HyperTeX specials can be found in the https://ctan.org/pkg/hyperref[hyperref manual]. *papersize*:: The 'papersize' special, which is an extension introduced by dvips, can be used to specify the widths and heights of the pages in the DVI file. It affects the page it appears on as well as all following pages until another papersize special is found. If there is more than one papersize special present on a page, dvisvgm applies the last one. However, in order to stay compatible with previous versions of dvisvgm that did not evaluate these specials, their processing must be explicitly enabled by adding option *--bbox=papersize* on the command-line. Otherwise, dvisvgm ignores them and computes tight bounding boxes. *pdf*:: pdfTeX and dvipdfmx introduced several special commands related to the generation of PDF files. Currently, only 'pdf:mapfile', 'pdf:mapline', 'pdf:pagesize', and PDF hyperlink specials are supported by dvisvgm. The latter are the PDF pendants to the HTML HyperTeX specials generated by the hyperref package in PDF mode. + 'pdf:pagesize' is similar to the 'papersize' special (see above) which specifies the size of the current and all folowing pages. In order to actually apply the extents to the generated SVG files, option *--bbox=papersize* must be given. + 'pdf:mapfile' and 'pdf:mapline' allow for modifying the font map tree while processing the DVI file. They are used by CTeX, for example. dvisvgm supports both, the dvips and dvipdfm font map format. For further information on the command syntax and semantics, see the documentation of +\pdfmapfile+ in the https://ctan.org/pkg/pdftex[pdfTeX user manual]. *ps*:: The famous DVI driver https://www.tug.org/texinfohtml/dvips.html['dvips'] introduced its own set of specials in order to embed PostScript code into DVI files, which greatly improves the capabilities of DVI documents. One aim of dvisvgm is to completely evaluate all PostScript fragments and to convert as many of them as possible to SVG. In contrast to dvips, dvisvgm uses floating point arithmetics to compute the precise position of each graphic element, i.e. it doesn't round the coordinates. Therefore, the relative locations of the graphic elements may slightly differ from those computed by dvips. + Since PostScript is a rather complex language, dvisvgm does not implement its own PostScript interpreter but relies on https://ghostscript.com[Ghostscript] instead. If the Ghostscript library was not linked to the dvisvgm binary, it is looked up and loaded dynamically during runtime. In this case, dvisvgm looks for 'libgs.so.X' on Unix-like systems (supported ABI versions: 7,8,9), for 'libgs.X.dylib' on macOS, and for 'gsdll32.dll' or 'gsdll64.dll' on Windows. You can override the default file names with environment variable *LIBGS* or the command-line option *--libgs*. The library must be reachable through the ld search path (\*nix) or the PATH environment variable (Windows). Alternatively, the absolute file path can be specified. If the library cannot be found, dvisvgm disables the processing of PostScript specials and prints a warning message. Use option *--list-specials* to check whether PostScript support is available, i.e. entry 'ps' is present. + The PostScript handler also recognizes and evaluates bounding box data generated by the https://ctan.org/pkg/preview[preview package] with option 'tightpage'. If such data is present in the DVI file and if dvisvgm is called with option *--bbox=preview*, dvisvgm sets the width and total height of the SVG file to the values derived from the preview data. Additionally, it prints a message showing the width, height, and depth of the box in TeX point units to the console. Especially, the depth value can be read by a post-processor to vertically align the SVG graphics with the baseline of surrounding text in HTML or XSL-FO documents, for example. Please note that SVG bounding boxes are defined by a width and (total) height. In contrast to TeX, SVG provides no means to differentiate between height and depth, i.e. the vertical extents above and below the baseline, respectively. Therefore, it is generally not possible to retrieve the depth value from the SVG file itself. + If you call dvisvgm with option *--bbox=min* (the default) and preview data is present in the DVI file, dvisvgm doesn't apply the preview extents but computes a bounding box that tightly encloses the page contents. The height, depth and width values written to console are adapted accordingly. *tpic*:: The TPIC special set defines instructions for drawing simple geometric objects. Some LaTeX packages, like eepic and tplot, use these specials to describe graphics. Examples -------- +dvisvgm file+:: Converts the first page of 'file.dvi' to 'file.svg'. +dvisvgm -p1-5 file+:: Converts the first five pages of 'file.dvi' to 'file-1.svg',...,'file-5.svg'. +dvisvgm -p1- file+:: Converts all pages of 'file.dvi' to separate SVG files. +dvisvgm -p1,3 -O file+:: Converts the first and third page of 'file.dvi' to optimized SVG files. +dvisvgm - < file.dvi+:: Converts the first page of 'file.dvi' to 'stdin.svg' where the contents of 'file.dvi' is read from *stdin*. +dvisvgm -z file+:: Converts the first page of 'file.dvi' to 'file.svgz' with default compression level 9. +dvisvgm -p5 -z3 -ba4-l -o newfile file+:: Converts the fifth page of 'file.dvi' to 'newfile.svgz' with compression level 3. The bounding box is set to DIN/ISO A4 in landscape format. +dvisvgm --transform="R20,w/3,2h/5 T1cm,1cm S2,3" file+:: Converts the first page of 'file.dvi' to 'file.svg' where three transformations are applied. [[environment]] Environment ----------- dvisvgm uses the *kpathsea* library for locating the files that it opens. Hence, the environment variables described in the library's documentation influence the converter. If dvisvgm was linked without the Ghostscript library, and if PostScript support has not been disabled, the shared Ghostscript library is looked up during runtime via dlopen(). The environment variable *LIBGS* can be used to specify path and file name of the library. The pre-compiled Windows versions of dvisvgm require a working installation of MiKTeX 2.9 or above. dvisvgm does not work together with the portable edition of MiKTeX because it relies on MiKTeX's COM interface that is only accessible in a local installation. To enable the evaluation of PostScript specials, the original Ghostscript DLL 'gsdll32.dll' must be present and reachable through the search path. 64-bit Windows builds require the 64-bit Ghostscript DLL 'gsdll64.dll'. Both DLLs come with the corresponding Ghostscript installers available from https://ghostscript.com. The environment variable *DVISVGM_COLORS* specifies the colors used to highlight various parts of dvisvgm's message output. It is only evaluated if option *--color* is given. The value of *DVISVGM_COLORS* is a list of colon-separated entries of the form 'gg'='BF', where 'gg' denotes one of the color group indicators listed below, and 'BF' are two hexadecimal digits specifying the background (first digit) and foreground/text color (second digit). The color values are defined as follows: 0=black, 1=red, 2=green, 3=yellow, 4=blue, 5=magenta, 6=cyan, 7=gray, 8=bright red, 9=bright green, A=bright yellow, B=bright blue, C=bright magenta, D=bright cyan, E=bright gray, F=white. Depending on the terminal, the colors may differ. Rather than changing both the text and background color, it's also possible to change only one of them: An asterisk (*) in place of a hexadecimal digit indicates the default text or background color of the terminal. All malformed entries in the list are silently ignored. [horizontal] *er*:: error messages *wn*:: warning messages *pn*:: messages about page numbers *ps*:: page size messages *fw*:: information about the files written *sm*:: state messages *tr*:: messages of the glyph tracer *pi*:: progress indicator *Example:* +er=01:pi=\*5+ sets the colors of error messages (+er+) to red (+1+) on black (+0+), and those of progress indicators (+pi+) to cyan (+5+) on default background (+*+). Files ----- The location of the following files is determined by the kpathsea library. To check the actual kpathsea configuration you can use the *kpsewhich* utility. [horizontal] **.enc*:: Font encoding files **.fgd*:: Font glyph data files (cache files created by dvisvgm) **.map*:: Font map files **.mf*:: Metafont input files **.pfb*:: PostScript Type 1 font files **.pro*:: PostScript header/prologue files **.tfm*:: TeX font metric files **.ttf*:: TrueType font files **.vf*:: Virtual font files See also -------- *tex(1), mf(1), mktexmf(1), grodvi(1), potrace(1)*, and the *kpathsea library* info documentation. Resources --------- Project home page::: https://dvisvgm.de Code repository::: https://github.com/mgieseki/dvisvgm Bugs ---- Please report bugs using the bug tracker at https://github.com/mgieseki/dvisvgm/issues[GitHub]. Author ------ Written by {author} <{email}> Copying ------- Copyright (C) 2005-2019 Martin Gieseking. Free use of this software is granted under the terms of the GNU General Public License (GPL) version 3 or, (at your option) any later version. // vim: set syntax=asciidoc: dvisvgm-2.8.1/aclocal.m40000664000175000017500000015676213563265553012022 00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 11 (pkg-config-0.29.1) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [AC_LANG_PUSH([C]) am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) AC_LANG_POP([C])]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_code_coverage.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) dvisvgm-2.8.1/configure0000775000175000017500000246426113563265600012060 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for dvisvgm 2.8.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: martin.gieseking@uos.de about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='dvisvgm' PACKAGE_TARNAME='dvisvgm' PACKAGE_VERSION='2.8.1' PACKAGE_STRING='dvisvgm 2.8.1' PACKAGE_BUGREPORT='martin.gieseking@uos.de' PACKAGE_URL='' ac_unique_file="src" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_func_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS AM_LDFLAGS AM_CPPFLAGS DATE dvisvgm_srcdir CODE_COVERAGE_RULES CODE_COVERAGE_LDFLAGS CODE_COVERAGE_LIBS CODE_COVERAGE_CXXFLAGS CODE_COVERAGE_CFLAGS CODE_COVERAGE_CPPFLAGS GENHTML LCOV GCOV CODE_COVERAGE_ENABLED CODE_COVERAGE_ENABLED_FALSE CODE_COVERAGE_ENABLED_TRUE BUILD_MANPAGE_FALSE BUILD_MANPAGE_TRUE XSLTPROC XMLTO ASCIIDOC ZLIB_LIBS ZLIB_CFLAGS LIBOBJS USE_BUNDLED_MD5_FALSE USE_BUNDLED_MD5_TRUE LIBCRYPTO_LIBS LIBCRYPTO_CFLAGS TTFAUTOHINT_LIBS TTFAUTOHINT_CFLAGS HAVE_XXHASH_FALSE HAVE_XXHASH_TRUE HAVE_WOFF2_FALSE HAVE_WOFF2_TRUE HAVE_BROTLI_FALSE HAVE_BROTLI_TRUE HAVE_POTRACE_FALSE HAVE_POTRACE_TRUE WOFF2_LIBS WOFF2_CFLAGS BROTLI_LIBS BROTLI_CFLAGS USE_BUNDLED_LIBS_FALSE USE_BUNDLED_LIBS_TRUE ENABLE_WOFF_FALSE ENABLE_WOFF_TRUE FREETYPE_LIBS FREETYPE_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG KPSE_LIBS KPSE_CFLAGS CXXCPP CPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL ac_ct_AR AR HAVE_CXX11 am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock with_kpathsea enable_woff with_ttfautohint enable_bundled_libs with_zlib enable_manpage with_gcov enable_code_coverage ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC LT_SYS_LIBRARY_PATH CPP CXXCPP KPSE_CFLAGS KPSE_LIBS PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR FREETYPE_CFLAGS FREETYPE_LIBS BROTLI_CFLAGS BROTLI_LIBS WOFF2_CFLAGS WOFF2_LIBS TTFAUTOHINT_CFLAGS TTFAUTOHINT_LIBS LIBCRYPTO_CFLAGS LIBCRYPTO_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures dvisvgm 2.8.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/dvisvgm] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of dvisvgm 2.8.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --disable-woff Disable WOFF support [default=no] --enable-bundled-libs use bundled libraries instead of the system ones [default=no] --disable-manpage disable generation of manual page [default=no] --enable-code-coverage Whether to enable code coverage support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-kpathsea=prefix set location of kpathsea library --with-ttfautohint[=prefix] enable ttfautohint support (disabled by default) --with-zlib=DIR set location of the zlib library --with-gcov=GCOV use given GCOV for coverage (GCOV=gcov). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags LT_SYS_LIBRARY_PATH User-defined run-time library search path. CPP C preprocessor CXXCPP C++ preprocessor KPSE_CFLAGS C/C++ compiler flags for the kpathsea library KPSE_LIBS linker flags for the kpathsea library PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path FREETYPE_CFLAGS C compiler flags for FREETYPE, overriding pkg-config FREETYPE_LIBS linker flags for FREETYPE, overriding pkg-config BROTLI_CFLAGS C compiler flags for BROTLI, overriding pkg-config BROTLI_LIBS linker flags for BROTLI, overriding pkg-config WOFF2_CFLAGS C compiler flags for WOFF2, overriding pkg-config WOFF2_LIBS linker flags for WOFF2, overriding pkg-config TTFAUTOHINT_CFLAGS C compiler flags for TTFAUTOHINT, overriding pkg-config TTFAUTOHINT_LIBS linker flags for TTFAUTOHINT, overriding pkg-config LIBCRYPTO_CFLAGS C compiler flags for LIBCRYPTO, overriding pkg-config LIBCRYPTO_LIBS linker flags for LIBCRYPTO, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF dvisvgm configure 2.8.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------------- ## ## Report this to martin.gieseking@uos.de ## ## -------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by dvisvgm $as_me 2.8.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " libintl.h" as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " string.h" as_fn_append ac_header_list " strings.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_func_list " ftime" as_fn_append ac_func_list " gettimeofday" as_fn_append ac_func_list " sigaction" as_fn_append ac_func_list " umask" as_fn_append ac_func_list " uselocale" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DATE="November 2019" ac_config_headers="$ac_config_headers config.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.16' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_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 rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='dvisvgm' VERSION='2.8.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi cat >>confdefs.h <<_ACEOF #define TARGET_SYSTEM "$target" _ACEOF # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_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" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ax_cxx_compile_alternatives="11 0x" ax_cxx_compile_cxx11_required=true ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_success=no if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do switch="-std=gnu++${alternative}" cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXX="$ac_save_CXX" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201103L #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXX="$ac_save_CXX" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi fi if test x$ac_success = xno; then HAVE_CXX11=0 { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 $as_echo "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 $as_echo "#define HAVE_CXX11 1" >>confdefs.h fi if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&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 am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err 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 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. 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' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&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. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname 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 yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs 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 variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_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 # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) 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 ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&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 # that responds to the $file_magic_cmd with a given extended 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 aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) 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*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) 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|DragonFly)/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 ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) 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_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' 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 ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) 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 ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&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]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$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=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && 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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_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 -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else 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 fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; 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" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-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. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --enable-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. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-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. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF 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 set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs 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 <<_LT_EOF 1>&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 _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs 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 <<_LT_EOF 1>&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 _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # 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_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # 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_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && 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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && 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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # 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 extended regexp 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_|_GLOBAL__F[ID]_.*' # 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. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # 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 yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, 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 install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) 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 ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': 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* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; 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 $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&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. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' 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 ;; 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 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $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 no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= 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 yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; 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 # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : 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' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; 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 $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) 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 ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # 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. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''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' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=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* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; 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 ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; 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" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$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='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' 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' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; 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) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) 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 ;; esac 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' ;; 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*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$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=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so 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" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $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' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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" # 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* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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 library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") 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" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # 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$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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 # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' 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 ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=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 ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; 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 ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; 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 <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #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 /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; 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 <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #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 /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 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; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$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 striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&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" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&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 CC=$lt_save_CC if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&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. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname 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 yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs 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 variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; 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 # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; 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. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=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_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # 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_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # 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_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && 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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && 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 $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX 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. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so 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" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' 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 # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # 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$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # 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$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) 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=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $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' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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" # 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* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # 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 library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' 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. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") 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" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # 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 dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # 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 # Add ABI-specific directories to the system library path. sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi # 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$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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 # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' 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 ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$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$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=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 ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" 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_config_commands="$ac_config_commands libtool" # Only expand once: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wmismatched-tags -Wno-mismatched-tags" >&5 $as_echo_n "checking whether C compiler accepts -Wmismatched-tags -Wno-mismatched-tags... " >&6; } if ${ax_cv_check_cflags___Wmismatched_tags__Wno_mismatched_tags+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS -Wmismatched-tags -Wno-mismatched-tags" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_check_cflags___Wmismatched_tags__Wno_mismatched_tags=yes else ax_cv_check_cflags___Wmismatched_tags__Wno_mismatched_tags=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wmismatched_tags__Wno_mismatched_tags" >&5 $as_echo "$ax_cv_check_cflags___Wmismatched_tags__Wno_mismatched_tags" >&6; } if test "x$ax_cv_check_cflags___Wmismatched_tags__Wno_mismatched_tags" = xyes; then : CXXFLAGS="$CXXFLAGS -Wno-mismatched-tags" else : fi for ac_header in sys/time.h sys/timeb.h xlocale.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether termios.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_termios_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_termios_h=yes else ac_cv_sys_tiocgwinsz_in_termios_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes else ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then $as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h fi fi CPPFLAGS_SAVE="$CPPFLAGS" CFLAGS_SAVE="$CFLAGS" LDFLAGS_SAVE="$LDFLAGS" # Check availability and usability of the kpathsea library # Check whether --with-kpathsea was given. if test "${with_kpathsea+set}" = set; then : withval=$with_kpathsea; with_kpathsea="$withval" else with_kpathsea=yes fi if test "x$with_kpathsea" != "xyes"; then : KPSE_CFLAGS="-I$with_kpathsea/include" KPSE_LIBS="-L$with_kpathsea/lib" CPPFLAGS="$CPPFLAGS $KPSE_CFLAGS" CFLAGS="$CFLAGS $KPSE_CFLAGS" LDFLAGS="$LDFLAGS $KPSE_LIBS" fi ac_fn_c_check_header_mongrel "$LINENO" "kpathsea/kpathsea.h" "ac_cv_header_kpathsea_kpathsea_h" "$ac_includes_default" if test "x$ac_cv_header_kpathsea_kpathsea_h" = xyes; then : else as_fn_error $? "please install the kpathsea development package" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kpse_find_file in -lkpathsea" >&5 $as_echo_n "checking for kpse_find_file in -lkpathsea... " >&6; } if ${ac_cv_lib_kpathsea_kpse_find_file+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lkpathsea $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char kpse_find_file (); int main () { return kpse_find_file (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_kpathsea_kpse_find_file=yes else ac_cv_lib_kpathsea_kpse_find_file=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kpathsea_kpse_find_file" >&5 $as_echo "$ac_cv_lib_kpathsea_kpse_find_file" >&6; } if test "x$ac_cv_lib_kpathsea_kpse_find_file" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBKPATHSEA 1 _ACEOF LIBS="-lkpathsea $LIBS" else as_fn_error $? "libkpathsea not found, please install the corresponding package first" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking kpathsea version" >&5 $as_echo_n "checking kpathsea version... " >&6; } if test "$cross_compiling" = yes; then : kpseversion=unknown else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main() { FILE *f; f = fopen("kpseversion", "w"); if(!f) exit(1); fprintf(f, "%s\n", KPSEVERSION); fclose(f); exit(0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : kpseversion=`cat kpseversion|sed 's/kpathsea version //'` else kpseversion= fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$kpseversion\"" >&5 $as_echo "\"$kpseversion\"" >&6; } rm -f kpseversion if test -z "$kpseversion"; then : as_fn_error $? "Could not compile a simple kpathsea program -- check your installation" "$LINENO" 5 fi # Check how to link Ghostscript have_libgs=yes ac_fn_c_check_header_mongrel "$LINENO" "ghostscript/iapi.h" "ac_cv_header_ghostscript_iapi_h" "$ac_includes_default" if test "x$ac_cv_header_ghostscript_iapi_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsapi_revision in -lgs" >&5 $as_echo_n "checking for gsapi_revision in -lgs... " >&6; } if ${ac_cv_lib_gs_gsapi_revision+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgs $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gsapi_revision (); int main () { return gsapi_revision (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gs_gsapi_revision=yes else ac_cv_lib_gs_gsapi_revision=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gs_gsapi_revision" >&5 $as_echo "$ac_cv_lib_gs_gsapi_revision" >&6; } if test "x$ac_cv_lib_gs_gsapi_revision" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGS 1 _ACEOF LIBS="-lgs $LIBS" else have_libgs=no fi else have_libgs=no fi if test "x$have_libgs" = "xno"; then : # Ghostscript not found, check for dlopen { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" else $as_echo "#define DISABLE_GS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PostScript support disabled" >&5 $as_echo "$as_me: WARNING: PostScript support disabled" >&2;} fi fi # Check for pkg-config if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check for libraries. pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5 $as_echo_n "checking for FREETYPE... " >&6; } if test -n "$FREETYPE_CFLAGS"; then pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FREETYPE_LIBS"; then pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` else FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FREETYPE_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (freetype2) were not met: $FREETYPE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FREETYPE_CFLAGS and FREETYPE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FREETYPE_CFLAGS and FREETYPE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # Check whether --enable-woff was given. if test "${enable_woff+set}" = set; then : enableval=$enable_woff; else enable_woff=yes fi if test "x$enable_woff" = "xyes"; then ENABLE_WOFF_TRUE= ENABLE_WOFF_FALSE='#' else ENABLE_WOFF_TRUE='#' ENABLE_WOFF_FALSE= fi # Check whether --with-ttfautohint was given. if test "${with_ttfautohint+set}" = set; then : withval=$with_ttfautohint; with_ttfautohint="$withval" else with_ttfautohint=no fi # Add option to enable linking of bundled libraries (brotli, potrace, woff2, xxhash). # Check whether --enable-bundled-libs was given. if test "${enable_bundled_libs+set}" = set; then : enableval=$enable_bundled_libs; fi if test "x$enable_bundled_libs" = "xyes"; then USE_BUNDLED_LIBS_TRUE= USE_BUNDLED_LIBS_FALSE='#' else USE_BUNDLED_LIBS_TRUE='#' USE_BUNDLED_LIBS_FALSE= fi # If option --enable-bundled-libs is not given, look for system libraries of brotli, potrace, woff2, and xxhash. if test "x$enable_bundled_libs" != "xyes"; then : ac_fn_c_check_header_mongrel "$LINENO" "potracelib.h" "ac_cv_header_potracelib_h" "$ac_includes_default" if test "x$ac_cv_header_potracelib_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing potrace_trace" >&5 $as_echo_n "checking for library containing potrace_trace... " >&6; } if ${ac_cv_search_potrace_trace+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char potrace_trace (); int main () { return potrace_trace (); ; return 0; } _ACEOF for ac_lib in '' potrace; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_potrace_trace=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_potrace_trace+:} false; then : break fi done if ${ac_cv_search_potrace_trace+:} false; then : else ac_cv_search_potrace_trace=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_potrace_trace" >&5 $as_echo "$ac_cv_search_potrace_trace" >&6; } ac_res=$ac_cv_search_potrace_trace if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_potrace=yes fi fi ac_fn_c_check_header_mongrel "$LINENO" "xxhash.h" "ac_cv_header_xxhash_h" "$ac_includes_default" if test "x$ac_cv_header_xxhash_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing XXH32" >&5 $as_echo_n "checking for library containing XXH32... " >&6; } if ${ac_cv_search_XXH32+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XXH32 (); int main () { return XXH32 (); ; return 0; } _ACEOF for ac_lib in '' xxhash; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_XXH32=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_XXH32+:} false; then : break fi done if ${ac_cv_search_XXH32+:} false; then : else ac_cv_search_XXH32=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_XXH32" >&5 $as_echo "$ac_cv_search_XXH32" >&6; } ac_res=$ac_cv_search_XXH32 if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_xxhash=yes fi fi if test "x$enable_woff" = "xyes"; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BROTLI" >&5 $as_echo_n "checking for BROTLI... " >&6; } if test -n "$BROTLI_CFLAGS"; then pkg_cv_BROTLI_CFLAGS="$BROTLI_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbrotlienc\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbrotlienc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BROTLI_CFLAGS=`$PKG_CONFIG --cflags "libbrotlienc" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$BROTLI_LIBS"; then pkg_cv_BROTLI_LIBS="$BROTLI_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbrotlienc\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbrotlienc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BROTLI_LIBS=`$PKG_CONFIG --libs "libbrotlienc" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then BROTLI_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libbrotlienc" 2>&1` else BROTLI_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libbrotlienc" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$BROTLI_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libbrotlienc) were not met: $BROTLI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables BROTLI_CFLAGS and BROTLI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables BROTLI_CFLAGS and BROTLI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else BROTLI_CFLAGS=$pkg_cv_BROTLI_CFLAGS BROTLI_LIBS=$pkg_cv_BROTLI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_brotli=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WOFF2" >&5 $as_echo_n "checking for WOFF2... " >&6; } if test -n "$WOFF2_CFLAGS"; then pkg_cv_WOFF2_CFLAGS="$WOFF2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwoff2enc\""; } >&5 ($PKG_CONFIG --exists --print-errors "libwoff2enc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WOFF2_CFLAGS=`$PKG_CONFIG --cflags "libwoff2enc" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$WOFF2_LIBS"; then pkg_cv_WOFF2_LIBS="$WOFF2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwoff2enc\""; } >&5 ($PKG_CONFIG --exists --print-errors "libwoff2enc") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_WOFF2_LIBS=`$PKG_CONFIG --libs "libwoff2enc" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then WOFF2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libwoff2enc" 2>&1` else WOFF2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libwoff2enc" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$WOFF2_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libwoff2enc) were not met: $WOFF2_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables WOFF2_CFLAGS and WOFF2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables WOFF2_CFLAGS and WOFF2_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else WOFF2_CFLAGS=$pkg_cv_WOFF2_CFLAGS WOFF2_LIBS=$pkg_cv_WOFF2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_woff2=yes fi fi fi if test "x$have_potrace" = "xyes"; then HAVE_POTRACE_TRUE= HAVE_POTRACE_FALSE='#' else HAVE_POTRACE_TRUE='#' HAVE_POTRACE_FALSE= fi if test "x$have_brotli" = "xyes"; then HAVE_BROTLI_TRUE= HAVE_BROTLI_FALSE='#' else HAVE_BROTLI_TRUE='#' HAVE_BROTLI_FALSE= fi if test "x$have_woff2" = "xyes"; then HAVE_WOFF2_TRUE= HAVE_WOFF2_FALSE='#' else HAVE_WOFF2_TRUE='#' HAVE_WOFF2_FALSE= fi if test "x$have_xxhash" = "xyes"; then HAVE_XXHASH_TRUE= HAVE_XXHASH_FALSE='#' else HAVE_XXHASH_TRUE='#' HAVE_XXHASH_FALSE= fi if test "x$enable_woff" != "xyes"; then : $as_echo "#define DISABLE_WOFF 1" >>confdefs.h else if test "x$with_ttfautohint" != "xno"; then : if test "x$with_ttfautohint" = "xyes"; then : # --with-ttfautohint without path => check via pkg-config pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TTFAUTOHINT" >&5 $as_echo_n "checking for TTFAUTOHINT... " >&6; } if test -n "$TTFAUTOHINT_CFLAGS"; then pkg_cv_TTFAUTOHINT_CFLAGS="$TTFAUTOHINT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ttfautohint\""; } >&5 ($PKG_CONFIG --exists --print-errors "ttfautohint") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TTFAUTOHINT_CFLAGS=`$PKG_CONFIG --cflags "ttfautohint" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TTFAUTOHINT_LIBS"; then pkg_cv_TTFAUTOHINT_LIBS="$TTFAUTOHINT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ttfautohint\""; } >&5 ($PKG_CONFIG --exists --print-errors "ttfautohint") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TTFAUTOHINT_LIBS=`$PKG_CONFIG --libs "ttfautohint" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TTFAUTOHINT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ttfautohint" 2>&1` else TTFAUTOHINT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ttfautohint" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TTFAUTOHINT_PKG_ERRORS" >&5 as_fn_error $? "can't locate ttfautohint, use \"--with-ttfautohint=path\" to specify its location" "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "can't locate ttfautohint, use \"--with-ttfautohint=path\" to specify its location" "$LINENO" 5 else TTFAUTOHINT_CFLAGS=$pkg_cv_TTFAUTOHINT_CFLAGS TTFAUTOHINT_LIBS=$pkg_cv_TTFAUTOHINT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else # --with-ttfautohint=/path/ttfautohint given TTFAUTOHINT_CFLAGS="-I$with_ttfautohint/include" TTFAUTOHINT_LIBS="-L$with_ttfautohint/lib" fi CPPFLAGS="$CPPFLAGS $TTFAUTOHINT_CFLAGS" CFLAGS="$CFLAGS $TTFAUTOHINT_CFLAGS" LDFLAGS="$LDFLAGS $TTFAUTOHINT_LIBS" for ac_header in ttfautohint.h do : ac_fn_c_check_header_mongrel "$LINENO" "ttfautohint.h" "ac_cv_header_ttfautohint_h" "$ac_includes_default" if test "x$ac_cv_header_ttfautohint_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TTFAUTOHINT_H 1 _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ttfautohint.h not found" >&5 $as_echo "$as_me: WARNING: ttfautohint.h not found" >&2;} fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TTF_autohint in -lttfautohint" >&5 $as_echo_n "checking for TTF_autohint in -lttfautohint... " >&6; } if ${ac_cv_lib_ttfautohint_TTF_autohint+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lttfautohint $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TTF_autohint (); int main () { return TTF_autohint (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ttfautohint_TTF_autohint=yes else ac_cv_lib_ttfautohint_TTF_autohint=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ttfautohint_TTF_autohint" >&5 $as_echo "$ac_cv_lib_ttfautohint_TTF_autohint" >&6; } if test "x$ac_cv_lib_ttfautohint_TTF_autohint" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBTTFAUTOHINT 1 _ACEOF LIBS="-lttfautohint $LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no working ttfautohint library found" >&5 $as_echo "$as_me: WARNING: no working ttfautohint library found" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: enabled dynamic loading of ttfautohint" >&5 $as_echo "$as_me: enabled dynamic loading of ttfautohint" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: disabled ttfautohint support" >&5 $as_echo "$as_me: WARNING: disabled ttfautohint support" >&2;} fi fi fi fi for ac_header in openssl/md5.h do : ac_fn_c_check_header_mongrel "$LINENO" "openssl/md5.h" "ac_cv_header_openssl_md5_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_md5_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENSSL_MD5_H 1 _ACEOF fi done pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBCRYPTO" >&5 $as_echo_n "checking for LIBCRYPTO... " >&6; } if test -n "$LIBCRYPTO_CFLAGS"; then pkg_cv_LIBCRYPTO_CFLAGS="$LIBCRYPTO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcrypto") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCRYPTO_CFLAGS=`$PKG_CONFIG --cflags "libcrypto" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBCRYPTO_LIBS"; then pkg_cv_LIBCRYPTO_LIBS="$LIBCRYPTO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcrypto\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcrypto") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBCRYPTO_LIBS=`$PKG_CONFIG --libs "libcrypto" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBCRYPTO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcrypto" 2>&1` else LIBCRYPTO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcrypto" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBCRYPTO_PKG_ERRORS" >&5 HAVE_LIBCRYPTO=0 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_LIBCRYPTO=0 else LIBCRYPTO_CFLAGS=$pkg_cv_LIBCRYPTO_CFLAGS LIBCRYPTO_LIBS=$pkg_cv_LIBCRYPTO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_LIBCRYPTO=1 fi if test "$HAVE_LIBCRYPTO" -eq 0; then USE_BUNDLED_MD5_TRUE= USE_BUNDLED_MD5_FALSE='#' else USE_BUNDLED_MD5_TRUE='#' USE_BUNDLED_MD5_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzopen in -lz" >&5 $as_echo_n "checking for gzopen in -lz... " >&6; } if ${ac_cv_lib_z_gzopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzopen=yes else ac_cv_lib_z_gzopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzopen" >&5 $as_echo "$ac_cv_lib_z_gzopen" >&6; } if test "x$ac_cv_lib_z_gzopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBZ 1 _ACEOF LIBS="-lz $LIBS" fi # Check for header files. ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi # Check for library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; } if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then : $as_echo_n "(cached) " >&6 else rm -f conftest.sym conftest.file echo >conftest.file if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then if test "$cross_compiling" = yes; then : ac_cv_func_lstat_dereferences_slashed_symlink=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; /* Linux will dereference the symlink and fail, as required by POSIX. That is better in the sense that it means we will not have to compile and use the lstat wrapper. */ return lstat ("conftest.sym/", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_lstat_dereferences_slashed_symlink=yes else ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else # If the `ln -s' command failed, then we probably don't even # have an lstat function. ac_cv_func_lstat_dereferences_slashed_symlink=no fi rm -f conftest.sym conftest.file fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 $as_echo "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && cat >>confdefs.h <<_ACEOF #define LSTAT_FOLLOWS_SLASHED_SYMLINK 1 _ACEOF if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then case " $LIBOBJS " in *" lstat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 $as_echo_n "checking whether stat accepts an empty string... " >&6; } if ${ac_cv_func_stat_empty_string_bug+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_stat_empty_string_bug=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { struct stat sbuf; return stat ("", &sbuf) == 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_stat_empty_string_bug=no else ac_cv_func_stat_empty_string_bug=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 $as_echo "$ac_cv_func_stat_empty_string_bug" >&6; } if test $ac_cv_func_stat_empty_string_bug = yes; then case " $LIBOBJS " in *" stat.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; esac cat >>confdefs.h <<_ACEOF #define HAVE_STAT_EMPTY_STRING_BUG 1 _ACEOF fi for ac_func in $ac_func_list do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # add options for selection of "optional" library locations # currently these libraries are mandatory; the --with-foo options # are used to specify the locations explicitely # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; if test "x$withval" != "xno"; then : if test "x$withval" != "xyes"; then : ZLIB_DIR=$withval fi if test -n "$ZLIB_DIR"; then : ZLIB_CFLAGS="-I$ZLIB_DIR -I$ZLIB_DIR/include" ZLIB_LIBS="-L$ZLIB_DIR/lib" -lz fi fi fi # Check if the kpathsea headers are C++ safe { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the kpathsea headers are C++ safe" >&5 $as_echo_n "checking if the kpathsea headers are C++ safe... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { printf("%s\n", concat("one", "two")) ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define KPSE_CXX_UNSAFE 1" >>confdefs.h fi rm -f core conftest.err 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 CPPFLAGS="$CPPFLAGS_SAVE" CFLAGS="$CFLAGS_SAVE" LDFLAGS="$LDFLAGS_SAVE" # Check whether --enable-manpage was given. if test "${enable_manpage+set}" = set; then : enableval=$enable_manpage; fi if test "x$enable_manpage" != "xno"; then : enable_manpage="no" # Check for utilities required to build the manpage # Extract the first word of "asciidoc", so it can be a program name with args. set dummy asciidoc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ASCIIDOC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ASCIIDOC"; then ac_cv_prog_ASCIIDOC="$ASCIIDOC" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ASCIIDOC="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ASCIIDOC=$ac_cv_prog_ASCIIDOC if test -n "$ASCIIDOC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ASCIIDOC" >&5 $as_echo "$ASCIIDOC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ASCIIDOC" = "xyes"; then : # Extract the first word of "xmlto", so it can be a program name with args. set dummy xmlto; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XMLTO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XMLTO"; then ac_cv_prog_XMLTO="$XMLTO" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XMLTO="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XMLTO=$ac_cv_prog_XMLTO if test -n "$XMLTO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLTO" >&5 $as_echo "$XMLTO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XMLTO" = "xyes"; then : # Extract the first word of "xsltproc", so it can be a program name with args. set dummy xsltproc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XSLTPROC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XSLTPROC"; then ac_cv_prog_XSLTPROC="$XSLTPROC" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XSLTPROC="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XSLTPROC=$ac_cv_prog_XSLTPROC if test -n "$XSLTPROC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 $as_echo "$XSLTPROC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$XSLTPROC" = "xyes"; then : enable_manpage="yes" fi fi fi fi if test "x$enable_manpage" != "xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: generation of manual page has been disabled" >&5 $as_echo "$as_me: generation of manual page has been disabled" >&6;} fi if test "x$enable_manpage" = "xyes"; then BUILD_MANPAGE_TRUE= BUILD_MANPAGE_FALSE='#' else BUILD_MANPAGE_TRUE='#' BUILD_MANPAGE_FALSE= fi # allow to override gcov location # Check whether --with-gcov was given. if test "${with_gcov+set}" = set; then : withval=$with_gcov; _AX_CODE_COVERAGE_GCOV_PROG_WITH=$with_gcov else _AX_CODE_COVERAGE_GCOV_PROG_WITH=gcov fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with code coverage support" >&5 $as_echo_n "checking whether to build with code coverage support... " >&6; } # Check whether --enable-code-coverage was given. if test "${enable_code_coverage+set}" = set; then : enableval=$enable_code_coverage; else enable_code_coverage=no fi if test x$enable_code_coverage = xyes; then CODE_COVERAGE_ENABLED_TRUE= CODE_COVERAGE_ENABLED_FALSE='#' else CODE_COVERAGE_ENABLED_TRUE='#' CODE_COVERAGE_ENABLED_FALSE= fi CODE_COVERAGE_ENABLED=$enable_code_coverage { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_code_coverage" >&5 $as_echo "$enable_code_coverage" >&6; } if test "$enable_code_coverage" = "yes" ; then : # check for gcov if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args. set dummy ${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GCOV+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GCOV"; then ac_cv_prog_GCOV="$GCOV" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GCOV="${ac_tool_prefix}$_AX_CODE_COVERAGE_GCOV_PROG_WITH" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GCOV=$ac_cv_prog_GCOV if test -n "$GCOV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCOV" >&5 $as_echo "$GCOV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_GCOV"; then ac_ct_GCOV=$GCOV # Extract the first word of "$_AX_CODE_COVERAGE_GCOV_PROG_WITH", so it can be a program name with args. set dummy $_AX_CODE_COVERAGE_GCOV_PROG_WITH; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_GCOV+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_GCOV"; then ac_cv_prog_ac_ct_GCOV="$ac_ct_GCOV" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_GCOV="$_AX_CODE_COVERAGE_GCOV_PROG_WITH" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_GCOV=$ac_cv_prog_ac_ct_GCOV if test -n "$ac_ct_GCOV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_GCOV" >&5 $as_echo "$ac_ct_GCOV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_GCOV" = x; then GCOV=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac GCOV=$ac_ct_GCOV fi else GCOV="$ac_cv_prog_GCOV" fi if test "X$GCOV" = "X:"; then : as_fn_error $? "gcov is needed to do coverage" "$LINENO" 5 fi if test "$GCC" = "no" ; then : as_fn_error $? "not compiling with gcc, which is required for gcov code coverage" "$LINENO" 5 fi # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LCOV+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LCOV"; then ac_cv_prog_LCOV="$LCOV" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LCOV="lcov" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LCOV=$ac_cv_prog_LCOV if test -n "$LCOV"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LCOV" >&5 $as_echo "$LCOV" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "genhtml", so it can be a program name with args. set dummy genhtml; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GENHTML+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GENHTML"; then ac_cv_prog_GENHTML="$GENHTML" # 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_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GENHTML="genhtml" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GENHTML=$ac_cv_prog_GENHTML if test -n "$GENHTML"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GENHTML" >&5 $as_echo "$GENHTML" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$LCOV" ; then : as_fn_error $? "To enable code coverage reporting you must have lcov installed" "$LINENO" 5 fi if test -z "$GENHTML" ; then : as_fn_error $? "Could not find genhtml from the lcov package" "$LINENO" 5 fi CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_LIBS="-lgcov" CODE_COVERAGE_LDFLAGS="$CODE_COVERAGE_LIBS" CODE_COVERAGE_RULES_CHECK=' -$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k check $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) code-coverage-capture ' CODE_COVERAGE_RULES_CAPTURE=' $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f $(CODE_COVERAGE_OUTPUT_FILE).tmp $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" ' CODE_COVERAGE_RULES_CLEAN=' clean: code-coverage-clean distclean: code-coverage-clean code-coverage-clean: -$(LCOV) --directory $(top_builddir) -z -rm -rf $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_FILE).tmp $(CODE_COVERAGE_OUTPUT_DIRECTORY) -find . \( -name "*.gcda" -o -name "*.gcno" -o -name "*.gcov" \) -delete ' else CODE_COVERAGE_RULES_CHECK=' @echo "Need to reconfigure with --enable-code-coverage" ' CODE_COVERAGE_RULES_CAPTURE="$CODE_COVERAGE_RULES_CHECK" CODE_COVERAGE_RULES_CLEAN='' fi CODE_COVERAGE_RULES=' # Code coverage # # Optional: # - CODE_COVERAGE_DIRECTORY: Top-level directory for code coverage reporting. # Multiple directories may be specified, separated by whitespace. # (Default: $(top_builddir)) # - CODE_COVERAGE_OUTPUT_FILE: Filename and path for the .info file generated # by lcov for code coverage. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info) # - CODE_COVERAGE_OUTPUT_DIRECTORY: Directory for generated code coverage # reports to be created. (Default: # $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage) # - CODE_COVERAGE_BRANCH_COVERAGE: Set to 1 to enforce branch coverage, # set to 0 to disable it and leave empty to stay with the default. # (Default: empty) # - CODE_COVERAGE_LCOV_SHOPTS_DEFAULT: Extra options shared between both lcov # instances. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_LCOV_SHOPTS: Extra options to shared between both lcov # instances. (Default: $CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) # - CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH: --gcov-tool pathtogcov # - CODE_COVERAGE_LCOV_OPTIONS_DEFAULT: Extra options to pass to the # collecting lcov instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) # - CODE_COVERAGE_LCOV_OPTIONS: Extra options to pass to the collecting lcov # instance. (Default: $CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) # - CODE_COVERAGE_LCOV_RMOPTS_DEFAULT: Extra options to pass to the filtering # lcov instance. (Default: empty) # - CODE_COVERAGE_LCOV_RMOPTS: Extra options to pass to the filtering lcov # instance. (Default: $CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) # - CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT: Extra options to pass to the # genhtml instance. (Default: based on $CODE_COVERAGE_BRANCH_COVERAGE) # - CODE_COVERAGE_GENHTML_OPTIONS: Extra options to pass to the genhtml # instance. (Default: $CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) # - CODE_COVERAGE_IGNORE_PATTERN: Extra glob pattern of files to ignore # # The generated report will be titled using the $(PACKAGE_NAME) and # $(PACKAGE_VERSION). In order to add the current git hash to the title, # use the git-version-gen script, available online. # Optional variables CODE_COVERAGE_DIRECTORY ?= $(top_builddir) CODE_COVERAGE_OUTPUT_FILE ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage.info CODE_COVERAGE_OUTPUT_DIRECTORY ?= $(PACKAGE_NAME)-$(PACKAGE_VERSION)-coverage CODE_COVERAGE_BRANCH_COVERAGE ?= CODE_COVERAGE_LCOV_SHOPTS_DEFAULT ?= $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc lcov_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_LCOV_SHOPTS ?= $(CODE_COVERAGE_LCOV_SHOPTS_DEFAULT) CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH ?= --gcov-tool "$(GCOV)" CODE_COVERAGE_LCOV_OPTIONS_DEFAULT ?= $(CODE_COVERAGE_LCOV_OPTIONS_GCOVPATH) CODE_COVERAGE_LCOV_OPTIONS ?= $(CODE_COVERAGE_LCOV_OPTIONS_DEFAULT) CODE_COVERAGE_LCOV_RMOPTS_DEFAULT ?= CODE_COVERAGE_LCOV_RMOPTS ?= $(CODE_COVERAGE_LCOV_RMOPTS_DEFAULT) CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT ?=\ $(if $(CODE_COVERAGE_BRANCH_COVERAGE),\ --rc genhtml_branch_coverage=$(CODE_COVERAGE_BRANCH_COVERAGE)) CODE_COVERAGE_GENHTML_OPTIONS ?= $(CODE_COVERAGE_GENHTML_OPTIONS_DEFAULT) CODE_COVERAGE_IGNORE_PATTERN ?= GITIGNOREFILES ?= GITIGNOREFILES += $(CODE_COVERAGE_OUTPUT_FILE) $(CODE_COVERAGE_OUTPUT_DIRECTORY) code_coverage_v_lcov_cap = $(code_coverage_v_lcov_cap_$(V)) code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_cap_0 = @echo " LCOV --capture"\ $(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*"\ $(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo " GEN " $(CODE_COVERAGE_OUTPUT_DIRECTORY); code_coverage_quiet = $(code_coverage_quiet_$(V)) code_coverage_quiet_ = $(code_coverage_quiet_$(AM_DEFAULT_VERBOSITY)) code_coverage_quiet_0 = --quiet # sanitizes the test-name: replaces with underscores: dashes and dots code_coverage_sanitize = $(subst -,_,$(subst .,_,$(1))) # Use recursive makes in order to ignore errors during check check-code-coverage:'"$CODE_COVERAGE_RULES_CHECK"' # Capture code coverage data code-coverage-capture: code-coverage-capture-hook'"$CODE_COVERAGE_RULES_CAPTURE"' # Hook rule executed before code-coverage-capture, overridable by the user code-coverage-capture-hook: '"$CODE_COVERAGE_RULES_CLEAN"' A''M_DISTCHECK_CONFIGURE_FLAGS ?= A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-code-coverage .PHONY: check-code-coverage code-coverage-capture code-coverage-capture-hook code-coverage-clean ' if test "$enable_code_coverage" = "yes" ; then : # disable optimization CFLAGS=`echo $CFLAGS | sed 's/-O[1-9s]//g'` CXXFLAGS=`echo $CXXFLAGS | sed 's/-O[1-9s]//g'` fi dvisvgm_srcdir='$(top_srcdir)' ac_config_files="$ac_config_files Makefile libs/Makefile libs/brotli/Makefile libs/clipper/Makefile libs/ff-woff/Makefile libs/md5/Makefile libs/potrace/Makefile libs/variant/Makefile libs/woff2/Makefile libs/xxHash/Makefile m4/Makefile src/Makefile src/version.hpp src/optimizer/Makefile tests/Makefile tests/data/Makefile doc/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, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_WOFF_TRUE}" && test -z "${ENABLE_WOFF_FALSE}"; then as_fn_error $? "conditional \"ENABLE_WOFF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_BUNDLED_LIBS_TRUE}" && test -z "${USE_BUNDLED_LIBS_FALSE}"; then as_fn_error $? "conditional \"USE_BUNDLED_LIBS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_POTRACE_TRUE}" && test -z "${HAVE_POTRACE_FALSE}"; then as_fn_error $? "conditional \"HAVE_POTRACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_BROTLI_TRUE}" && test -z "${HAVE_BROTLI_FALSE}"; then as_fn_error $? "conditional \"HAVE_BROTLI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WOFF2_TRUE}" && test -z "${HAVE_WOFF2_FALSE}"; then as_fn_error $? "conditional \"HAVE_WOFF2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_XXHASH_TRUE}" && test -z "${HAVE_XXHASH_FALSE}"; then as_fn_error $? "conditional \"HAVE_XXHASH\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_BUNDLED_MD5_TRUE}" && test -z "${USE_BUNDLED_MD5_FALSE}"; then as_fn_error $? "conditional \"USE_BUNDLED_MD5\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MANPAGE_TRUE}" && test -z "${BUILD_MANPAGE_FALSE}"; then as_fn_error $? "conditional \"BUILD_MANPAGE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CODE_COVERAGE_ENABLED_TRUE}" && test -z "${CODE_COVERAGE_ENABLED_FALSE}"; then as_fn_error $? "conditional \"CODE_COVERAGE_ENABLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by dvisvgm $as_me 2.8.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ dvisvgm config.status 2.8.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "libs/Makefile") CONFIG_FILES="$CONFIG_FILES libs/Makefile" ;; "libs/brotli/Makefile") CONFIG_FILES="$CONFIG_FILES libs/brotli/Makefile" ;; "libs/clipper/Makefile") CONFIG_FILES="$CONFIG_FILES libs/clipper/Makefile" ;; "libs/ff-woff/Makefile") CONFIG_FILES="$CONFIG_FILES libs/ff-woff/Makefile" ;; "libs/md5/Makefile") CONFIG_FILES="$CONFIG_FILES libs/md5/Makefile" ;; "libs/potrace/Makefile") CONFIG_FILES="$CONFIG_FILES libs/potrace/Makefile" ;; "libs/variant/Makefile") CONFIG_FILES="$CONFIG_FILES libs/variant/Makefile" ;; "libs/woff2/Makefile") CONFIG_FILES="$CONFIG_FILES libs/woff2/Makefile" ;; "libs/xxHash/Makefile") CONFIG_FILES="$CONFIG_FILES libs/xxHash/Makefile" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/version.hpp") CONFIG_FILES="$CONFIG_FILES src/version.hpp" ;; "src/optimizer/Makefile") CONFIG_FILES="$CONFIG_FILES src/optimizer/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/data/Makefile") CONFIG_FILES="$CONFIG_FILES tests/data/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # 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 # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # 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 # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # 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 # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # 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 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # 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 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # 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 a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # 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\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # 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 # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # 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 # 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 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # 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 set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # 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_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi dvisvgm-2.8.1/libs/0000775000175000017500000000000013563265647011156 500000000000000dvisvgm-2.8.1/libs/variant/0000775000175000017500000000000013563265645012620 500000000000000dvisvgm-2.8.1/libs/variant/Makefile.am0000664000175000017500000000010713510660062014552 00000000000000noinst_HEADERS = \ include/mpark/variant.hpp EXTRA_DIST = LICENSE.md dvisvgm-2.8.1/libs/variant/LICENSE.md0000664000175000017500000000247213510660062014131 00000000000000Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. dvisvgm-2.8.1/libs/variant/Makefile.in0000664000175000017500000003635113563265577014621 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/variant ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_HEADERS = \ include/mpark/variant.hpp EXTRA_DIST = LICENSE.md all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/variant/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/variant/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/variant/include/0000775000175000017500000000000013563265645014243 500000000000000dvisvgm-2.8.1/libs/variant/include/mpark/0000775000175000017500000000000013563265645015355 500000000000000dvisvgm-2.8.1/libs/variant/include/mpark/variant.hpp0000664000175000017500000031026613510660062017442 00000000000000// MPark.Variant // // Copyright Michael Park, 2015-2017 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #ifndef MPARK_VARIANT_HPP #define MPARK_VARIANT_HPP /* variant synopsis namespace std { // 20.7.2, class template variant template class variant { public: // 20.7.2.1, constructors constexpr variant() noexcept(see below); variant(const variant&); variant(variant&&) noexcept(see below); template constexpr variant(T&&) noexcept(see below); template constexpr explicit variant(in_place_type_t, Args&&...); template constexpr explicit variant( in_place_type_t, initializer_list, Args&&...); template constexpr explicit variant(in_place_index_t, Args&&...); template constexpr explicit variant( in_place_index_t, initializer_list, Args&&...); // 20.7.2.2, destructor ~variant(); // 20.7.2.3, assignment variant& operator=(const variant&); variant& operator=(variant&&) noexcept(see below); template variant& operator=(T&&) noexcept(see below); // 20.7.2.4, modifiers template T& emplace(Args&&...); template T& emplace(initializer_list, Args&&...); template variant_alternative& emplace(Args&&...); template variant_alternative& emplace(initializer_list, Args&&...); // 20.7.2.5, value status constexpr bool valueless_by_exception() const noexcept; constexpr size_t index() const noexcept; // 20.7.2.6, swap void swap(variant&) noexcept(see below); }; // 20.7.3, variant helper classes template struct variant_size; // undefined template constexpr size_t variant_size_v = variant_size::value; template struct variant_size; template struct variant_size; template struct variant_size; template struct variant_size>; template struct variant_alternative; // undefined template using variant_alternative_t = typename variant_alternative::type; template struct variant_alternative; template struct variant_alternative; template struct variant_alternative; template struct variant_alternative>; constexpr size_t variant_npos = -1; // 20.7.4, value access template constexpr bool holds_alternative(const variant&) noexcept; template constexpr variant_alternative_t>& get(variant&); template constexpr variant_alternative_t>&& get(variant&&); template constexpr variant_alternative_t> const& get(const variant&); template constexpr variant_alternative_t> const&& get(const variant&&); template constexpr T& get(variant&); template constexpr T&& get(variant&&); template constexpr const T& get(const variant&); template constexpr const T&& get(const variant&&); template constexpr add_pointer_t>> get_if(variant*) noexcept; template constexpr add_pointer_t>> get_if(const variant*) noexcept; template constexpr add_pointer_t get_if(variant*) noexcept; template constexpr add_pointer_t get_if(const variant*) noexcept; // 20.7.5, relational operators template constexpr bool operator==(const variant&, const variant&); template constexpr bool operator!=(const variant&, const variant&); template constexpr bool operator<(const variant&, const variant&); template constexpr bool operator>(const variant&, const variant&); template constexpr bool operator<=(const variant&, const variant&); template constexpr bool operator>=(const variant&, const variant&); // 20.7.6, visitation template constexpr see below visit(Visitor&&, Variants&&...); // 20.7.7, class monostate struct monostate; // 20.7.8, monostate relational operators constexpr bool operator<(monostate, monostate) noexcept; constexpr bool operator>(monostate, monostate) noexcept; constexpr bool operator<=(monostate, monostate) noexcept; constexpr bool operator>=(monostate, monostate) noexcept; constexpr bool operator==(monostate, monostate) noexcept; constexpr bool operator!=(monostate, monostate) noexcept; // 20.7.9, specialized algorithms template void swap(variant&, variant&) noexcept(see below); // 20.7.10, class bad_variant_access class bad_variant_access; // 20.7.11, hash support template struct hash; template struct hash>; template <> struct hash; } // namespace std */ #include #include #include #include #include #include #include // MPark.Variant // // Copyright Michael Park, 2015-2017 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #ifndef MPARK_CONFIG_HPP #define MPARK_CONFIG_HPP // MSVC 2015 Update 3. #if __cplusplus < 201103L && (!defined(_MSC_VER) || _MSC_FULL_VER < 190024210) #error "MPark.Variant requires C++11 support." #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_builtin #define __has_builtin(x) 0 #endif #ifndef __has_include #define __has_include(x) 0 #endif #ifndef __has_feature #define __has_feature(x) 0 #endif #if __has_attribute(always_inline) || defined(__GNUC__) #define MPARK_ALWAYS_INLINE __attribute__((__always_inline__)) inline #elif defined(_MSC_VER) #define MPARK_ALWAYS_INLINE __forceinline #else #define MPARK_ALWAYS_INLINE inline #endif #if __has_builtin(__builtin_addressof) || \ (defined(__GNUC__) && __GNUC__ >= 7) || defined(_MSC_VER) #define MPARK_BUILTIN_ADDRESSOF #endif #if __has_builtin(__builtin_unreachable) || defined(__GNUC__) #define MPARK_BUILTIN_UNREACHABLE __builtin_unreachable() #elif defined(_MSC_VER) #define MPARK_BUILTIN_UNREACHABLE __assume(false) #else #define MPARK_BUILTIN_UNREACHABLE #endif #if __has_builtin(__type_pack_element) #define MPARK_TYPE_PACK_ELEMENT #endif #if defined(__cpp_constexpr) && __cpp_constexpr >= 200704 && \ !(defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 9) #define MPARK_CPP11_CONSTEXPR #endif #if defined(__cpp_constexpr) && __cpp_constexpr >= 201304 #define MPARK_CPP14_CONSTEXPR #endif #if __has_feature(cxx_exceptions) || defined(__cpp_exceptions) || \ (defined(_MSC_VER) && defined(_CPPUNWIND)) #define MPARK_EXCEPTIONS #endif #if defined(__cpp_generic_lambdas) || defined(_MSC_VER) #define MPARK_GENERIC_LAMBDAS #endif #if defined(__cpp_lib_integer_sequence) #define MPARK_INTEGER_SEQUENCE #endif #if defined(__cpp_return_type_deduction) || defined(_MSC_VER) #define MPARK_RETURN_TYPE_DEDUCTION #endif #if defined(__cpp_lib_transparent_operators) || defined(_MSC_VER) #define MPARK_TRANSPARENT_OPERATORS #endif #if defined(__cpp_variable_templates) || defined(_MSC_VER) #define MPARK_VARIABLE_TEMPLATES #endif #if !defined(__GLIBCXX__) || __has_include() // >= libstdc++-5 #define MPARK_TRIVIALITY_TYPE_TRAITS #define MPARK_INCOMPLETE_TYPE_TRAITS #endif #endif // MPARK_CONFIG_HPP // MPark.Variant // // Copyright Michael Park, 2015-2017 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #ifndef MPARK_IN_PLACE_HPP #define MPARK_IN_PLACE_HPP #include namespace mpark { struct in_place_t { explicit in_place_t() = default; }; template struct in_place_index_t { explicit in_place_index_t() = default; }; template struct in_place_type_t { explicit in_place_type_t() = default; }; #ifdef MPARK_VARIABLE_TEMPLATES constexpr in_place_t in_place{}; template constexpr in_place_index_t in_place_index{}; template constexpr in_place_type_t in_place_type{}; #endif } // namespace mpark #endif // MPARK_IN_PLACE_HPP // MPark.Variant // // Copyright Michael Park, 2015-2017 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #ifndef MPARK_LIB_HPP #define MPARK_LIB_HPP #include #include #include #include #define MPARK_RETURN(...) \ noexcept(noexcept(__VA_ARGS__)) -> decltype(__VA_ARGS__) { return __VA_ARGS__; } namespace mpark { namespace lib { template struct identity { using type = T; }; inline namespace cpp14 { template struct array { constexpr const T &operator[](std::size_t index) const { return data[index]; } T data[N == 0 ? 1 : N]; }; template using add_pointer_t = typename std::add_pointer::type; template using common_type_t = typename std::common_type::type; template using decay_t = typename std::decay::type; template using enable_if_t = typename std::enable_if::type; template using remove_const_t = typename std::remove_const::type; template using remove_reference_t = typename std::remove_reference::type; template inline constexpr T &&forward(remove_reference_t &t) noexcept { return static_cast(t); } template inline constexpr T &&forward(remove_reference_t &&t) noexcept { static_assert(!std::is_lvalue_reference::value, "can not forward an rvalue as an lvalue"); return static_cast(t); } template inline constexpr remove_reference_t &&move(T &&t) noexcept { return static_cast &&>(t); } #ifdef MPARK_INTEGER_SEQUENCE using std::integer_sequence; using std::index_sequence; using std::make_index_sequence; using std::index_sequence_for; #else template struct integer_sequence { using value_type = T; static constexpr std::size_t size() noexcept { return sizeof...(Is); } }; template using index_sequence = integer_sequence; template struct make_index_sequence_concat; template struct make_index_sequence_concat, index_sequence> : identity> {}; template struct make_index_sequence_impl; template using make_index_sequence = typename make_index_sequence_impl::type; template struct make_index_sequence_impl : make_index_sequence_concat, make_index_sequence> {}; template <> struct make_index_sequence_impl<0> : identity> {}; template <> struct make_index_sequence_impl<1> : identity> {}; template using index_sequence_for = make_index_sequence; #endif // #ifdef MPARK_TRANSPARENT_OPERATORS using equal_to = std::equal_to<>; #else struct equal_to { template inline constexpr auto operator()(Lhs &&lhs, Rhs &&rhs) const MPARK_RETURN(lib::forward(lhs) == lib::forward(rhs)) }; #endif #ifdef MPARK_TRANSPARENT_OPERATORS using not_equal_to = std::not_equal_to<>; #else struct not_equal_to { template inline constexpr auto operator()(Lhs &&lhs, Rhs &&rhs) const MPARK_RETURN(lib::forward(lhs) != lib::forward(rhs)) }; #endif #ifdef MPARK_TRANSPARENT_OPERATORS using less = std::less<>; #else struct less { template inline constexpr auto operator()(Lhs &&lhs, Rhs &&rhs) const MPARK_RETURN(lib::forward(lhs) < lib::forward(rhs)) }; #endif #ifdef MPARK_TRANSPARENT_OPERATORS using greater = std::greater<>; #else struct greater { template inline constexpr auto operator()(Lhs &&lhs, Rhs &&rhs) const MPARK_RETURN(lib::forward(lhs) > lib::forward(rhs)) }; #endif #ifdef MPARK_TRANSPARENT_OPERATORS using less_equal = std::less_equal<>; #else struct less_equal { template inline constexpr auto operator()(Lhs &&lhs, Rhs &&rhs) const MPARK_RETURN(lib::forward(lhs) <= lib::forward(rhs)) }; #endif #ifdef MPARK_TRANSPARENT_OPERATORS using greater_equal = std::greater_equal<>; #else struct greater_equal { template inline constexpr auto operator()(Lhs &&lhs, Rhs &&rhs) const MPARK_RETURN(lib::forward(lhs) >= lib::forward(rhs)) }; #endif } // namespace cpp14 inline namespace cpp17 { // template using bool_constant = std::integral_constant; template struct voider : identity {}; template using void_t = typename voider::type; namespace detail { namespace swappable { using std::swap; template struct is_swappable { private: template (), std::declval()))> inline static std::true_type test(int); template inline static std::false_type test(...); public: static constexpr bool value = decltype(test(0))::value; }; template struct is_nothrow_swappable { static constexpr bool value = noexcept(swap(std::declval(), std::declval())); }; template struct is_nothrow_swappable : std::false_type {}; } // namespace swappable } // namespace detail using detail::swappable::is_swappable; template using is_nothrow_swappable = detail::swappable::is_nothrow_swappable::value, T>; // namespace detail { template struct is_reference_wrapper : std::false_type {}; template struct is_reference_wrapper> : std::true_type {}; template struct Invoke; template <> struct Invoke { template inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&... args) MPARK_RETURN((lib::forward(arg).*pmf)(lib::forward(args)...)) }; template <> struct Invoke { template inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&... args) MPARK_RETURN((lib::forward(arg).get().*pmf)(lib::forward(args)...)) }; template <> struct Invoke { template inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&... args) MPARK_RETURN(((*lib::forward(arg)).*pmf)(lib::forward(args)...)) }; template <> struct Invoke { template inline static constexpr auto invoke(R T::*pmo, Arg &&arg) MPARK_RETURN(lib::forward(arg).*pmo) }; template <> struct Invoke { template inline static constexpr auto invoke(R T::*pmo, Arg &&arg) MPARK_RETURN(lib::forward(arg).get().*pmo) }; template <> struct Invoke { template inline static constexpr auto invoke(R T::*pmo, Arg &&arg) MPARK_RETURN((*lib::forward(arg)).*pmo) }; template inline constexpr auto invoke(R T::*f, Arg &&arg, Args &&... args) MPARK_RETURN( Invoke::value, (std::is_base_of>::value ? 0 : is_reference_wrapper>::value ? 1 : 2)>::invoke(f, lib::forward(arg), lib::forward(args)...)) #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4100) #endif template inline constexpr auto invoke(F &&f, Args &&... args) MPARK_RETURN(lib::forward(f)(lib::forward(args)...)) #ifdef _MSC_VER #pragma warning(pop) #endif } // namespace detail template inline constexpr auto invoke(F &&f, Args &&... args) MPARK_RETURN(detail::invoke(lib::forward(f), lib::forward(args)...)) namespace detail { template struct invoke_result {}; template struct invoke_result(), std::declval()...))>, F, Args...> : identity(), std::declval()...))> {}; } // namespace detail template using invoke_result = detail::invoke_result; template using invoke_result_t = typename invoke_result::type; namespace detail { template struct is_invocable : std::false_type {}; template struct is_invocable>, F, Args...> : std::true_type {}; template struct is_invocable_r : std::false_type {}; template struct is_invocable_r>, R, F, Args...> : std::is_convertible, R> {}; } // namespace detail template using is_invocable = detail::is_invocable; template using is_invocable_r = detail::is_invocable_r; namespace detail { template struct is_nothrow_invocable { static constexpr bool value = noexcept(lib::invoke(std::declval(), std::declval()...)); }; template struct is_nothrow_invocable : std::false_type {}; template struct is_nothrow_invocable_r { private: inline static R impl() { return lib::invoke(std::declval(), std::declval()...); } public: static constexpr bool value = noexcept(impl()); }; template struct is_nothrow_invocable_r : std::false_type {}; } // namespace detail template using is_nothrow_invocable = detail:: is_nothrow_invocable::value, F, Args...>; template using is_nothrow_invocable_r = detail::is_nothrow_invocable_r::value, R, F, Args...>; // #ifdef MPARK_BUILTIN_ADDRESSOF template inline constexpr T *addressof(T &arg) noexcept { return __builtin_addressof(arg); } #else namespace detail { namespace has_addressof_impl { struct fail; template inline fail operator&(T &&); template inline static constexpr bool impl() { return (std::is_class::value || std::is_union::value) && !std::is_same()), fail>::value; } } // namespace has_addressof_impl template using has_addressof = bool_constant()>; template inline constexpr T *addressof(T &arg, std::true_type) noexcept { return std::addressof(arg); } template inline constexpr T *addressof(T &arg, std::false_type) noexcept { return &arg; } } // namespace detail template inline constexpr T *addressof(T &arg) noexcept { return detail::addressof(arg, detail::has_addressof{}); } #endif template inline constexpr T *addressof(const T &&) = delete; } // namespace cpp17 template struct remove_all_extents : identity {}; template struct remove_all_extents> : remove_all_extents {}; template using remove_all_extents_t = typename remove_all_extents::type; template using size_constant = std::integral_constant; template struct indexed_type : size_constant { using type = T; }; template using all = std::is_same, integer_sequence>; #ifdef MPARK_TYPE_PACK_ELEMENT template using type_pack_element_t = __type_pack_element; #else template struct type_pack_element_impl { private: template struct set; template struct set> : indexed_type... {}; template inline static std::enable_if impl(indexed_type); inline static std::enable_if impl(...); public: using type = decltype(impl(set>{})); }; template using type_pack_element = typename type_pack_element_impl::type; template using type_pack_element_t = typename type_pack_element::type; #endif #ifdef MPARK_TRIVIALITY_TYPE_TRAITS using std::is_trivially_copy_constructible; using std::is_trivially_move_constructible; using std::is_trivially_copy_assignable; using std::is_trivially_move_assignable; #else template struct is_trivially_copy_constructible : bool_constant< std::is_copy_constructible::value && __has_trivial_copy(T)> {}; template struct is_trivially_move_constructible : bool_constant<__is_trivial(T)> {}; template struct is_trivially_copy_assignable : bool_constant< std::is_copy_assignable::value && __has_trivial_assign(T)> {}; template struct is_trivially_move_assignable : bool_constant<__is_trivial(T)> {}; #endif template struct dependent_type : T {}; template struct push_back; template using push_back_t = typename push_back::type; template struct push_back, J> { using type = index_sequence; }; } // namespace lib } // namespace mpark #undef MPARK_RETURN #endif // MPARK_LIB_HPP namespace mpark { #ifdef MPARK_RETURN_TYPE_DEDUCTION #define AUTO auto #define AUTO_RETURN(...) { return __VA_ARGS__; } #define AUTO_REFREF auto && #define AUTO_REFREF_RETURN(...) { return __VA_ARGS__; } #define DECLTYPE_AUTO decltype(auto) #define DECLTYPE_AUTO_RETURN(...) { return __VA_ARGS__; } #else #define AUTO auto #define AUTO_RETURN(...) \ -> lib::decay_t { return __VA_ARGS__; } #define AUTO_REFREF auto #define AUTO_REFREF_RETURN(...) \ -> decltype((__VA_ARGS__)) { \ static_assert(std::is_reference::value, ""); \ return __VA_ARGS__; \ } #define DECLTYPE_AUTO auto #define DECLTYPE_AUTO_RETURN(...) \ -> decltype(__VA_ARGS__) { return __VA_ARGS__; } #endif class bad_variant_access : public std::exception { public: virtual const char *what() const noexcept override { return "bad_variant_access"; } }; [[noreturn]] inline void throw_bad_variant_access() { #ifdef MPARK_EXCEPTIONS throw bad_variant_access{}; #else std::terminate(); MPARK_BUILTIN_UNREACHABLE; #endif } template class variant; template struct variant_size; #ifdef MPARK_VARIABLE_TEMPLATES template constexpr std::size_t variant_size_v = variant_size::value; #endif template struct variant_size : variant_size {}; template struct variant_size : variant_size {}; template struct variant_size : variant_size {}; template struct variant_size> : lib::size_constant {}; template struct variant_alternative; template using variant_alternative_t = typename variant_alternative::type; template struct variant_alternative : std::add_const> {}; template struct variant_alternative : std::add_volatile> {}; template struct variant_alternative : std::add_cv> {}; template struct variant_alternative> { static_assert(I < sizeof...(Ts), "index out of bounds in `std::variant_alternative<>`"); using type = lib::type_pack_element_t; }; constexpr std::size_t variant_npos = static_cast(-1); namespace detail { constexpr std::size_t not_found = static_cast(-1); constexpr std::size_t ambiguous = static_cast(-2); #ifdef MPARK_CPP14_CONSTEXPR template inline constexpr std::size_t find_index() { constexpr lib::array matches = { {std::is_same::value...} }; std::size_t result = not_found; for (std::size_t i = 0; i < sizeof...(Ts); ++i) { if (matches[i]) { if (result != not_found) { return ambiguous; } result = i; } } return result; } #else inline constexpr std::size_t find_index_impl(std::size_t result, std::size_t) { return result; } template inline constexpr std::size_t find_index_impl(std::size_t result, std::size_t idx, bool b, Bs... bs) { return b ? (result != not_found ? ambiguous : find_index_impl(idx, idx + 1, bs...)) : find_index_impl(result, idx + 1, bs...); } template inline constexpr std::size_t find_index() { return find_index_impl(not_found, 0, std::is_same::value...); } #endif template using find_index_sfinae_impl = lib::enable_if_t>; template using find_index_sfinae = find_index_sfinae_impl()>; template struct find_index_checked_impl : lib::size_constant { static_assert(I != not_found, "the specified type is not found."); static_assert(I != ambiguous, "the specified type is ambiguous."); }; template using find_index_checked = find_index_checked_impl()>; struct valueless_t {}; enum class Trait { TriviallyAvailable, Available, Unavailable }; template class IsTriviallyAvailable, template class IsAvailable> inline constexpr Trait trait() { return IsTriviallyAvailable::value ? Trait::TriviallyAvailable : IsAvailable::value ? Trait::Available : Trait::Unavailable; } #ifdef MPARK_CPP14_CONSTEXPR template inline constexpr Trait common_trait(Traits... traits_) { Trait result = Trait::TriviallyAvailable; lib::array traits = {{traits_...}}; for (std::size_t i = 0; i < sizeof...(Traits); ++i) { Trait t = traits[i]; if (static_cast(t) > static_cast(result)) { result = t; } } return result; } #else inline constexpr Trait common_trait_impl(Trait result) { return result; } template inline constexpr Trait common_trait_impl(Trait result, Trait t, Traits... ts) { return static_cast(t) > static_cast(result) ? common_trait_impl(t, ts...) : common_trait_impl(result, ts...); } template inline constexpr Trait common_trait(Traits... ts) { return common_trait_impl(Trait::TriviallyAvailable, ts...); } #endif template struct traits { static constexpr Trait copy_constructible_trait = common_trait(trait()...); static constexpr Trait move_constructible_trait = common_trait(trait()...); static constexpr Trait copy_assignable_trait = common_trait(copy_constructible_trait, trait()...); static constexpr Trait move_assignable_trait = common_trait(move_constructible_trait, trait()...); static constexpr Trait destructible_trait = common_trait(trait()...); }; namespace access { struct recursive_union { #ifdef MPARK_RETURN_TYPE_DEDUCTION template inline static constexpr auto &&get_alt(V &&v, in_place_index_t<0>) { return lib::forward(v).head_; } template inline static constexpr auto &&get_alt(V &&v, in_place_index_t) { return get_alt(lib::forward(v).tail_, in_place_index_t{}); } #else template struct get_alt_impl { template inline constexpr AUTO_REFREF operator()(V &&v) const AUTO_REFREF_RETURN(get_alt_impl{}(lib::forward(v).tail_)) }; template struct get_alt_impl<0, Dummy> { template inline constexpr AUTO_REFREF operator()(V &&v) const AUTO_REFREF_RETURN(lib::forward(v).head_) }; template inline static constexpr AUTO_REFREF get_alt(V &&v, in_place_index_t) AUTO_REFREF_RETURN(get_alt_impl{}(lib::forward(v))) #endif }; struct base { template inline static constexpr AUTO_REFREF get_alt(V &&v) #ifdef _MSC_VER AUTO_REFREF_RETURN(recursive_union::get_alt( lib::forward(v).data_, in_place_index_t{})) #else AUTO_REFREF_RETURN(recursive_union::get_alt( data(lib::forward(v)), in_place_index_t{})) #endif }; struct variant { template inline static constexpr AUTO_REFREF get_alt(V &&v) AUTO_REFREF_RETURN(base::get_alt(lib::forward(v).impl_)) }; } // namespace access namespace visitation { #if defined(MPARK_CPP14_CONSTEXPR) && !defined(_MSC_VER) #define MPARK_VARIANT_SWITCH_VISIT #endif struct base { template using dispatch_result_t = decltype( lib::invoke(std::declval(), access::base::get_alt<0>(std::declval())...)); template struct expected { template inline static constexpr bool but_got() { return std::is_same::value; } }; template struct visit_return_type_check { static_assert( expected::template but_got(), "`visit` requires the visitor to have a single return type"); template inline static constexpr DECLTYPE_AUTO invoke(Visitor &&visitor, Alts &&... alts) DECLTYPE_AUTO_RETURN(lib::invoke(lib::forward(visitor), lib::forward(alts)...)) }; #ifdef MPARK_VARIANT_SWITCH_VISIT template struct dispatcher; template struct dispatcher { template MPARK_ALWAYS_INLINE static constexpr R dispatch( F &&, typename ITs::type &&..., Vs &&...) { MPARK_BUILTIN_UNREACHABLE; } template MPARK_ALWAYS_INLINE static constexpr R dispatch_case(F &&, Vs &&...) { MPARK_BUILTIN_UNREACHABLE; } template MPARK_ALWAYS_INLINE static constexpr R dispatch_at(std::size_t, F &&, Vs &&...) { MPARK_BUILTIN_UNREACHABLE; } }; template struct dispatcher { template MPARK_ALWAYS_INLINE static constexpr R dispatch( F &&f, typename ITs::type &&... visited_vs) { using Expected = R; using Actual = decltype(lib::invoke( lib::forward(f), access::base::get_alt( lib::forward(visited_vs))...)); return visit_return_type_check::invoke( lib::forward(f), access::base::get_alt( lib::forward(visited_vs))...); } template MPARK_ALWAYS_INLINE static constexpr R dispatch( F &&f, typename ITs::type &&... visited_vs, V &&v, Vs &&... vs) { #define MPARK_DISPATCH(I) \ dispatcher<(I < lib::decay_t::size()), \ R, \ ITs..., \ lib::indexed_type>:: \ template dispatch<0>(lib::forward(f), \ lib::forward(visited_vs)..., \ lib::forward(v), \ lib::forward(vs)...) #define MPARK_DEFAULT(I) \ dispatcher<(I < lib::decay_t::size()), R, ITs...>::template dispatch( \ lib::forward(f), \ lib::forward(visited_vs)..., \ lib::forward(v), \ lib::forward(vs)...) switch (v.index()) { case B + 0: return MPARK_DISPATCH(B + 0); case B + 1: return MPARK_DISPATCH(B + 1); case B + 2: return MPARK_DISPATCH(B + 2); case B + 3: return MPARK_DISPATCH(B + 3); case B + 4: return MPARK_DISPATCH(B + 4); case B + 5: return MPARK_DISPATCH(B + 5); case B + 6: return MPARK_DISPATCH(B + 6); case B + 7: return MPARK_DISPATCH(B + 7); case B + 8: return MPARK_DISPATCH(B + 8); case B + 9: return MPARK_DISPATCH(B + 9); case B + 10: return MPARK_DISPATCH(B + 10); case B + 11: return MPARK_DISPATCH(B + 11); case B + 12: return MPARK_DISPATCH(B + 12); case B + 13: return MPARK_DISPATCH(B + 13); case B + 14: return MPARK_DISPATCH(B + 14); case B + 15: return MPARK_DISPATCH(B + 15); case B + 16: return MPARK_DISPATCH(B + 16); case B + 17: return MPARK_DISPATCH(B + 17); case B + 18: return MPARK_DISPATCH(B + 18); case B + 19: return MPARK_DISPATCH(B + 19); case B + 20: return MPARK_DISPATCH(B + 20); case B + 21: return MPARK_DISPATCH(B + 21); case B + 22: return MPARK_DISPATCH(B + 22); case B + 23: return MPARK_DISPATCH(B + 23); case B + 24: return MPARK_DISPATCH(B + 24); case B + 25: return MPARK_DISPATCH(B + 25); case B + 26: return MPARK_DISPATCH(B + 26); case B + 27: return MPARK_DISPATCH(B + 27); case B + 28: return MPARK_DISPATCH(B + 28); case B + 29: return MPARK_DISPATCH(B + 29); case B + 30: return MPARK_DISPATCH(B + 30); case B + 31: return MPARK_DISPATCH(B + 31); default: return MPARK_DEFAULT(B + 32); } #undef MPARK_DEFAULT #undef MPARK_DISPATCH } template MPARK_ALWAYS_INLINE static constexpr R dispatch_case(F &&f, Vs &&... vs) { using Expected = R; using Actual = decltype( lib::invoke(lib::forward(f), access::base::get_alt(lib::forward(vs))...)); return visit_return_type_check::invoke( lib::forward(f), access::base::get_alt(lib::forward(vs))...); } template MPARK_ALWAYS_INLINE static constexpr R dispatch_at(std::size_t index, F &&f, V &&v, Vs &&... vs) { static_assert(lib::all<(lib::decay_t::size() == lib::decay_t::size())...>::value, "all of the variants must be the same size."); #define MPARK_DISPATCH_AT(I) \ dispatcher<(I < lib::decay_t::size()), R>::template dispatch_case( \ lib::forward(f), lib::forward(v), lib::forward(vs)...) #define MPARK_DEFAULT(I) \ dispatcher<(I < lib::decay_t::size()), R>::template dispatch_at( \ index, lib::forward(f), lib::forward(v), lib::forward(vs)...) switch (index) { case B + 0: return MPARK_DISPATCH_AT(B + 0); case B + 1: return MPARK_DISPATCH_AT(B + 1); case B + 2: return MPARK_DISPATCH_AT(B + 2); case B + 3: return MPARK_DISPATCH_AT(B + 3); case B + 4: return MPARK_DISPATCH_AT(B + 4); case B + 5: return MPARK_DISPATCH_AT(B + 5); case B + 6: return MPARK_DISPATCH_AT(B + 6); case B + 7: return MPARK_DISPATCH_AT(B + 7); case B + 8: return MPARK_DISPATCH_AT(B + 8); case B + 9: return MPARK_DISPATCH_AT(B + 9); case B + 10: return MPARK_DISPATCH_AT(B + 10); case B + 11: return MPARK_DISPATCH_AT(B + 11); case B + 12: return MPARK_DISPATCH_AT(B + 12); case B + 13: return MPARK_DISPATCH_AT(B + 13); case B + 14: return MPARK_DISPATCH_AT(B + 14); case B + 15: return MPARK_DISPATCH_AT(B + 15); case B + 16: return MPARK_DISPATCH_AT(B + 16); case B + 17: return MPARK_DISPATCH_AT(B + 17); case B + 18: return MPARK_DISPATCH_AT(B + 18); case B + 19: return MPARK_DISPATCH_AT(B + 19); case B + 20: return MPARK_DISPATCH_AT(B + 20); case B + 21: return MPARK_DISPATCH_AT(B + 21); case B + 22: return MPARK_DISPATCH_AT(B + 22); case B + 23: return MPARK_DISPATCH_AT(B + 23); case B + 24: return MPARK_DISPATCH_AT(B + 24); case B + 25: return MPARK_DISPATCH_AT(B + 25); case B + 26: return MPARK_DISPATCH_AT(B + 26); case B + 27: return MPARK_DISPATCH_AT(B + 27); case B + 28: return MPARK_DISPATCH_AT(B + 28); case B + 29: return MPARK_DISPATCH_AT(B + 29); case B + 30: return MPARK_DISPATCH_AT(B + 30); case B + 31: return MPARK_DISPATCH_AT(B + 31); default: return MPARK_DEFAULT(B + 32); } #undef MPARK_DEFAULT #undef MPARK_DISPATCH_AT } }; #else template inline static constexpr const T &at(const T &elem) noexcept { return elem; } template inline static constexpr const lib::remove_all_extents_t &at( const lib::array &elems, std::size_t i, Is... is) noexcept { return at(elems[i], is...); } template inline static constexpr lib::array, sizeof...(Fs) + 1> make_farray(F &&f, Fs &&... fs) { return {{lib::forward(f), lib::forward(fs)...}}; } template struct make_fmatrix_impl { template inline static constexpr dispatch_result_t dispatch( F &&f, Vs &&... vs) { using Expected = dispatch_result_t; using Actual = decltype(lib::invoke( lib::forward(f), access::base::get_alt(lib::forward(vs))...)); return visit_return_type_check::invoke( lib::forward(f), access::base::get_alt(lib::forward(vs))...); } #ifdef MPARK_RETURN_TYPE_DEDUCTION template inline static constexpr auto impl(lib::index_sequence) { return &dispatch; } template inline static constexpr auto impl(Is, lib::index_sequence, Ls... ls) { return make_farray(impl(lib::push_back_t{}, ls...)...); } #else template struct impl; template struct impl> { inline constexpr AUTO operator()() const AUTO_RETURN(&dispatch) }; template struct impl, Ls...> { inline constexpr AUTO operator()() const AUTO_RETURN( make_farray(impl, Ls...>{}()...)) }; #endif }; #ifdef MPARK_RETURN_TYPE_DEDUCTION template inline static constexpr auto make_fmatrix() { return make_fmatrix_impl::impl( lib::index_sequence<>{}, lib::make_index_sequence::size()>{}...); } #else template inline static constexpr AUTO make_fmatrix() AUTO_RETURN( typename make_fmatrix_impl::template impl< lib::index_sequence<>, lib::make_index_sequence::size()>...>{}()) #endif template struct make_fdiagonal_impl { template inline static constexpr dispatch_result_t dispatch( F &&f, Vs &&... vs) { using Expected = dispatch_result_t; using Actual = decltype( lib::invoke(lib::forward(f), access::base::get_alt(lib::forward(vs))...)); return visit_return_type_check::invoke( lib::forward(f), access::base::get_alt(lib::forward(vs))...); } template inline static constexpr AUTO impl(lib::index_sequence) AUTO_RETURN(make_farray(&dispatch...)) }; template inline static constexpr auto make_fdiagonal() -> decltype(make_fdiagonal_impl::impl( lib::make_index_sequence::size()>{})) { static_assert(lib::all<(lib::decay_t::size() == lib::decay_t::size())...>::value, "all of the variants must be the same size."); return make_fdiagonal_impl::impl( lib::make_index_sequence::size()>{}); } #endif }; #if !defined(MPARK_VARIANT_SWITCH_VISIT) && \ (!defined(_MSC_VER) || _MSC_VER >= 1910) template using fmatrix_t = decltype(base::make_fmatrix()); template struct fmatrix { static constexpr fmatrix_t value = base::make_fmatrix(); }; template constexpr fmatrix_t fmatrix::value; template using fdiagonal_t = decltype(base::make_fdiagonal()); template struct fdiagonal { static constexpr fdiagonal_t value = base::make_fdiagonal(); }; template constexpr fdiagonal_t fdiagonal::value; #endif struct alt { template inline static constexpr DECLTYPE_AUTO visit_alt(Visitor &&visitor, Vs &&... vs) #ifdef MPARK_VARIANT_SWITCH_VISIT DECLTYPE_AUTO_RETURN( base::dispatcher< true, base::dispatch_result_t(vs)))...>>:: template dispatch<0>(lib::forward(visitor), as_base(lib::forward(vs))...)) #elif !defined(_MSC_VER) || _MSC_VER >= 1910 DECLTYPE_AUTO_RETURN(base::at( fmatrix(vs)))...>::value, vs.index()...)(lib::forward(visitor), as_base(lib::forward(vs))...)) #else DECLTYPE_AUTO_RETURN(base::at( base::make_fmatrix(vs)))...>(), vs.index()...)(lib::forward(visitor), as_base(lib::forward(vs))...)) #endif template inline static constexpr DECLTYPE_AUTO visit_alt_at(std::size_t index, Visitor &&visitor, Vs &&... vs) #ifdef MPARK_VARIANT_SWITCH_VISIT DECLTYPE_AUTO_RETURN( base::dispatcher< true, base::dispatch_result_t(vs)))...>>:: template dispatch_at<0>(index, lib::forward(visitor), as_base(lib::forward(vs))...)) #elif !defined(_MSC_VER) || _MSC_VER >= 1910 DECLTYPE_AUTO_RETURN(base::at( fdiagonal(vs)))...>::value, index)(lib::forward(visitor), as_base(lib::forward(vs))...)) #else DECLTYPE_AUTO_RETURN(base::at( base::make_fdiagonal(vs)))...>(), index)(lib::forward(visitor), as_base(lib::forward(vs))...)) #endif }; struct variant { private: template struct visitor { template inline static constexpr bool does_not_handle() { return lib::is_invocable::value; } }; template struct visit_exhaustiveness_check { static_assert(visitor::template does_not_handle(), "`visit` requires the visitor to be exhaustive."); inline static constexpr DECLTYPE_AUTO invoke(Visitor &&visitor, Values &&... values) DECLTYPE_AUTO_RETURN(lib::invoke(lib::forward(visitor), lib::forward(values)...)) }; template struct value_visitor { Visitor &&visitor_; template inline constexpr DECLTYPE_AUTO operator()(Alts &&... alts) const DECLTYPE_AUTO_RETURN( visit_exhaustiveness_check< Visitor, decltype((lib::forward(alts).value))...>:: invoke(lib::forward(visitor_), lib::forward(alts).value...)) }; template inline static constexpr AUTO make_value_visitor(Visitor &&visitor) AUTO_RETURN(value_visitor{lib::forward(visitor)}) public: template inline static constexpr DECLTYPE_AUTO visit_alt(Visitor &&visitor, Vs &&... vs) DECLTYPE_AUTO_RETURN(alt::visit_alt(lib::forward(visitor), lib::forward(vs).impl_...)) template inline static constexpr DECLTYPE_AUTO visit_alt_at(std::size_t index, Visitor &&visitor, Vs &&... vs) DECLTYPE_AUTO_RETURN( alt::visit_alt_at(index, lib::forward(visitor), lib::forward(vs).impl_...)) template inline static constexpr DECLTYPE_AUTO visit_value(Visitor &&visitor, Vs &&... vs) DECLTYPE_AUTO_RETURN( visit_alt(make_value_visitor(lib::forward(visitor)), lib::forward(vs)...)) template inline static constexpr DECLTYPE_AUTO visit_value_at(std::size_t index, Visitor &&visitor, Vs &&... vs) DECLTYPE_AUTO_RETURN( visit_alt_at(index, make_value_visitor(lib::forward(visitor)), lib::forward(vs)...)) }; } // namespace visitation template struct alt { using value_type = T; #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4244) #endif template inline explicit constexpr alt(in_place_t, Args &&... args) : value(lib::forward(args)...) {} #ifdef _MSC_VER #pragma warning(pop) #endif T value; }; template union recursive_union; template union recursive_union {}; #define MPARK_VARIANT_RECURSIVE_UNION(destructible_trait, destructor) \ template \ union recursive_union { \ public: \ inline explicit constexpr recursive_union(valueless_t) noexcept \ : dummy_{} {} \ \ template \ inline explicit constexpr recursive_union(in_place_index_t<0>, \ Args &&... args) \ : head_(in_place_t{}, lib::forward(args)...) {} \ \ template \ inline explicit constexpr recursive_union(in_place_index_t, \ Args &&... args) \ : tail_(in_place_index_t{}, lib::forward(args)...) {} \ \ recursive_union(const recursive_union &) = default; \ recursive_union(recursive_union &&) = default; \ \ destructor \ \ recursive_union &operator=(const recursive_union &) = default; \ recursive_union &operator=(recursive_union &&) = default; \ \ private: \ char dummy_; \ alt head_; \ recursive_union tail_; \ \ friend struct access::recursive_union; \ } MPARK_VARIANT_RECURSIVE_UNION(Trait::TriviallyAvailable, ~recursive_union() = default;); MPARK_VARIANT_RECURSIVE_UNION(Trait::Available, ~recursive_union() {}); MPARK_VARIANT_RECURSIVE_UNION(Trait::Unavailable, ~recursive_union() = delete;); #undef MPARK_VARIANT_RECURSIVE_UNION using index_t = unsigned int; template class base { public: inline explicit constexpr base(valueless_t tag) noexcept : data_(tag), index_(static_cast(-1)) {} template inline explicit constexpr base(in_place_index_t, Args &&... args) : data_(in_place_index_t{}, lib::forward(args)...), index_(I) {} inline constexpr bool valueless_by_exception() const noexcept { return index_ == static_cast(-1); } inline constexpr std::size_t index() const noexcept { return valueless_by_exception() ? variant_npos : index_; } protected: using data_t = recursive_union; friend inline constexpr base &as_base(base &b) { return b; } friend inline constexpr const base &as_base(const base &b) { return b; } friend inline constexpr base &&as_base(base &&b) { return lib::move(b); } friend inline constexpr const base &&as_base(const base &&b) { return lib::move(b); } friend inline constexpr data_t &data(base &b) { return b.data_; } friend inline constexpr const data_t &data(const base &b) { return b.data_; } friend inline constexpr data_t &&data(base &&b) { return lib::move(b).data_; } friend inline constexpr const data_t &&data(const base &&b) { return lib::move(b).data_; } inline static constexpr std::size_t size() { return sizeof...(Ts); } data_t data_; index_t index_; friend struct access::base; friend struct visitation::base; }; struct dtor { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4100) #endif template inline void operator()(Alt &alt) const noexcept { alt.~Alt(); } #ifdef _MSC_VER #pragma warning(pop) #endif }; #if !defined(_MSC_VER) || _MSC_VER >= 1910 #define MPARK_INHERITING_CTOR(type, base) using base::base; #else #define MPARK_INHERITING_CTOR(type, base) \ template \ inline explicit constexpr type(Args &&... args) \ : base(lib::forward(args)...) {} #endif template class destructor; #define MPARK_VARIANT_DESTRUCTOR(destructible_trait, definition, destroy) \ template \ class destructor, destructible_trait> \ : public base { \ using super = base; \ \ public: \ MPARK_INHERITING_CTOR(destructor, super) \ using super::operator=; \ \ destructor(const destructor &) = default; \ destructor(destructor &&) = default; \ definition \ destructor &operator=(const destructor &) = default; \ destructor &operator=(destructor &&) = default; \ \ protected: \ destroy \ } MPARK_VARIANT_DESTRUCTOR( Trait::TriviallyAvailable, ~destructor() = default;, inline void destroy() noexcept { this->index_ = static_cast(-1); }); MPARK_VARIANT_DESTRUCTOR( Trait::Available, ~destructor() { destroy(); }, inline void destroy() noexcept { if (!this->valueless_by_exception()) { visitation::alt::visit_alt(dtor{}, *this); } this->index_ = static_cast(-1); }); MPARK_VARIANT_DESTRUCTOR( Trait::Unavailable, ~destructor() = delete;, inline void destroy() noexcept = delete;); #undef MPARK_VARIANT_DESTRUCTOR template class constructor : public destructor { using super = destructor; public: MPARK_INHERITING_CTOR(constructor, super) using super::operator=; protected: #ifndef MPARK_GENERIC_LAMBDAS struct ctor { template inline void operator()(LhsAlt &lhs_alt, RhsAlt &&rhs_alt) const { constructor::construct_alt(lhs_alt, lib::forward(rhs_alt).value); } }; #endif template inline static T &construct_alt(alt &a, Args &&... args) { auto *result = ::new (static_cast(lib::addressof(a))) alt(in_place_t{}, lib::forward(args)...); return result->value; } template inline static void generic_construct(constructor &lhs, Rhs &&rhs) { lhs.destroy(); if (!rhs.valueless_by_exception()) { visitation::alt::visit_alt_at( rhs.index(), #ifdef MPARK_GENERIC_LAMBDAS [](auto &lhs_alt, auto &&rhs_alt) { constructor::construct_alt( lhs_alt, lib::forward(rhs_alt).value); } #else ctor{} #endif , lhs, lib::forward(rhs)); lhs.index_ = rhs.index_; } } }; template class move_constructor; #define MPARK_VARIANT_MOVE_CONSTRUCTOR(move_constructible_trait, definition) \ template \ class move_constructor, move_constructible_trait> \ : public constructor> { \ using super = constructor>; \ \ public: \ MPARK_INHERITING_CTOR(move_constructor, super) \ using super::operator=; \ \ move_constructor(const move_constructor &) = default; \ definition \ ~move_constructor() = default; \ move_constructor &operator=(const move_constructor &) = default; \ move_constructor &operator=(move_constructor &&) = default; \ } MPARK_VARIANT_MOVE_CONSTRUCTOR( Trait::TriviallyAvailable, move_constructor(move_constructor &&that) = default;); MPARK_VARIANT_MOVE_CONSTRUCTOR( Trait::Available, move_constructor(move_constructor &&that) noexcept( lib::all::value...>::value) : move_constructor(valueless_t{}) { this->generic_construct(*this, lib::move(that)); }); MPARK_VARIANT_MOVE_CONSTRUCTOR( Trait::Unavailable, move_constructor(move_constructor &&) = delete;); #undef MPARK_VARIANT_MOVE_CONSTRUCTOR template class copy_constructor; #define MPARK_VARIANT_COPY_CONSTRUCTOR(copy_constructible_trait, definition) \ template \ class copy_constructor, copy_constructible_trait> \ : public move_constructor> { \ using super = move_constructor>; \ \ public: \ MPARK_INHERITING_CTOR(copy_constructor, super) \ using super::operator=; \ \ definition \ copy_constructor(copy_constructor &&) = default; \ ~copy_constructor() = default; \ copy_constructor &operator=(const copy_constructor &) = default; \ copy_constructor &operator=(copy_constructor &&) = default; \ } MPARK_VARIANT_COPY_CONSTRUCTOR( Trait::TriviallyAvailable, copy_constructor(const copy_constructor &that) = default;); MPARK_VARIANT_COPY_CONSTRUCTOR( Trait::Available, copy_constructor(const copy_constructor &that) : copy_constructor(valueless_t{}) { this->generic_construct(*this, that); }); MPARK_VARIANT_COPY_CONSTRUCTOR( Trait::Unavailable, copy_constructor(const copy_constructor &) = delete;); #undef MPARK_VARIANT_COPY_CONSTRUCTOR template class assignment : public copy_constructor { using super = copy_constructor; public: MPARK_INHERITING_CTOR(assignment, super) using super::operator=; template inline /* auto & */ auto emplace(Args &&... args) -> decltype(this->construct_alt(access::base::get_alt(*this), lib::forward(args)...)) { this->destroy(); auto &result = this->construct_alt(access::base::get_alt(*this), lib::forward(args)...); this->index_ = I; return result; } protected: #ifndef MPARK_GENERIC_LAMBDAS template struct assigner { template inline void operator()(ThisAlt &this_alt, ThatAlt &&that_alt) const { self->assign_alt(this_alt, lib::forward(that_alt).value); } assignment *self; }; #endif template inline void assign_alt(alt &a, Arg &&arg) { if (this->index() == I) { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4244) #endif a.value = lib::forward(arg); #ifdef _MSC_VER #pragma warning(pop) #endif } else { struct { void operator()(std::true_type) const { this_->emplace(lib::forward(arg_)); } void operator()(std::false_type) const { this_->emplace(T(lib::forward(arg_))); } assignment *this_; Arg &&arg_; } impl{this, lib::forward(arg)}; impl(lib::bool_constant< std::is_nothrow_constructible::value || !std::is_nothrow_move_constructible::value>{}); } } template inline void generic_assign(That &&that) { if (this->valueless_by_exception() && that.valueless_by_exception()) { // do nothing. } else if (that.valueless_by_exception()) { this->destroy(); } else { visitation::alt::visit_alt_at( that.index(), #ifdef MPARK_GENERIC_LAMBDAS [this](auto &this_alt, auto &&that_alt) { this->assign_alt( this_alt, lib::forward(that_alt).value); } #else assigner{this} #endif , *this, lib::forward(that)); } } }; template class move_assignment; #define MPARK_VARIANT_MOVE_ASSIGNMENT(move_assignable_trait, definition) \ template \ class move_assignment, move_assignable_trait> \ : public assignment> { \ using super = assignment>; \ \ public: \ MPARK_INHERITING_CTOR(move_assignment, super) \ using super::operator=; \ \ move_assignment(const move_assignment &) = default; \ move_assignment(move_assignment &&) = default; \ ~move_assignment() = default; \ move_assignment &operator=(const move_assignment &) = default; \ definition \ } MPARK_VARIANT_MOVE_ASSIGNMENT( Trait::TriviallyAvailable, move_assignment &operator=(move_assignment &&that) = default;); MPARK_VARIANT_MOVE_ASSIGNMENT( Trait::Available, move_assignment & operator=(move_assignment &&that) noexcept( lib::all<(std::is_nothrow_move_constructible::value && std::is_nothrow_move_assignable::value)...>::value) { this->generic_assign(lib::move(that)); return *this; }); MPARK_VARIANT_MOVE_ASSIGNMENT( Trait::Unavailable, move_assignment &operator=(move_assignment &&) = delete;); #undef MPARK_VARIANT_MOVE_ASSIGNMENT template class copy_assignment; #define MPARK_VARIANT_COPY_ASSIGNMENT(copy_assignable_trait, definition) \ template \ class copy_assignment, copy_assignable_trait> \ : public move_assignment> { \ using super = move_assignment>; \ \ public: \ MPARK_INHERITING_CTOR(copy_assignment, super) \ using super::operator=; \ \ copy_assignment(const copy_assignment &) = default; \ copy_assignment(copy_assignment &&) = default; \ ~copy_assignment() = default; \ definition \ copy_assignment &operator=(copy_assignment &&) = default; \ } MPARK_VARIANT_COPY_ASSIGNMENT( Trait::TriviallyAvailable, copy_assignment &operator=(const copy_assignment &that) = default;); MPARK_VARIANT_COPY_ASSIGNMENT( Trait::Available, copy_assignment &operator=(const copy_assignment &that) { this->generic_assign(that); return *this; }); MPARK_VARIANT_COPY_ASSIGNMENT( Trait::Unavailable, copy_assignment &operator=(const copy_assignment &) = delete;); #undef MPARK_VARIANT_COPY_ASSIGNMENT template class impl : public copy_assignment> { using super = copy_assignment>; public: MPARK_INHERITING_CTOR(impl, super) using super::operator=; template inline void assign(Arg &&arg) { this->assign_alt(access::base::get_alt(*this), lib::forward(arg)); } inline void swap(impl &that) { if (this->valueless_by_exception() && that.valueless_by_exception()) { // do nothing. } else if (this->index() == that.index()) { visitation::alt::visit_alt_at(this->index(), #ifdef MPARK_GENERIC_LAMBDAS [](auto &this_alt, auto &that_alt) { using std::swap; swap(this_alt.value, that_alt.value); } #else swapper{} #endif , *this, that); } else { impl *lhs = this; impl *rhs = lib::addressof(that); if (lhs->move_nothrow() && !rhs->move_nothrow()) { std::swap(lhs, rhs); } impl tmp(lib::move(*rhs)); #ifdef MPARK_EXCEPTIONS // EXTENSION: When the move construction of `lhs` into `rhs` throws // and `tmp` is nothrow move constructible then we move `tmp` back // into `rhs` and provide the strong exception safety guarantee. try { this->generic_construct(*rhs, lib::move(*lhs)); } catch (...) { if (tmp.move_nothrow()) { this->generic_construct(*rhs, lib::move(tmp)); } throw; } #else this->generic_construct(*rhs, lib::move(*lhs)); #endif this->generic_construct(*lhs, lib::move(tmp)); } } private: #ifndef MPARK_GENERIC_LAMBDAS struct swapper { template inline void operator()(ThisAlt &this_alt, ThatAlt &that_alt) const { using std::swap; swap(this_alt.value, that_alt.value); } }; #endif inline constexpr bool move_nothrow() const { return this->valueless_by_exception() || lib::array{ {std::is_nothrow_move_constructible::value...} }[this->index()]; } }; #undef MPARK_INHERITING_CTOR template struct overload_leaf { using F = lib::size_constant (*)(T); operator F() const { return nullptr; } }; template struct overload_impl { private: template struct impl; template struct impl> : overload_leaf... {}; public: using type = impl>; }; template using overload = typename overload_impl::type; template using best_match = lib::invoke_result_t, T &&>; template struct is_in_place_index : std::false_type {}; template struct is_in_place_index> : std::true_type {}; template struct is_in_place_type : std::false_type {}; template struct is_in_place_type> : std::true_type {}; } // detail template class variant { static_assert(0 < sizeof...(Ts), "variant must consist of at least one alternative."); static_assert(lib::all::value...>::value, "variant can not have an array type as an alternative."); static_assert(lib::all::value...>::value, "variant can not have a reference type as an alternative."); static_assert(lib::all::value...>::value, "variant can not have a void type as an alternative."); public: template < typename Front = lib::type_pack_element_t<0, Ts...>, lib::enable_if_t::value, int> = 0> inline constexpr variant() noexcept( std::is_nothrow_default_constructible::value) : impl_(in_place_index_t<0>{}) {} variant(const variant &) = default; variant(variant &&) = default; template < typename Arg, typename Decayed = lib::decay_t, lib::enable_if_t::value, int> = 0, lib::enable_if_t::value, int> = 0, lib::enable_if_t::value, int> = 0, std::size_t I = detail::best_match::value, typename T = lib::type_pack_element_t, lib::enable_if_t::value, int> = 0> inline constexpr variant(Arg &&arg) noexcept( std::is_nothrow_constructible::value) : impl_(in_place_index_t{}, lib::forward(arg)) {} template < std::size_t I, typename... Args, typename T = lib::type_pack_element_t, lib::enable_if_t::value, int> = 0> inline explicit constexpr variant( in_place_index_t, Args &&... args) noexcept(std::is_nothrow_constructible::value) : impl_(in_place_index_t{}, lib::forward(args)...) {} template < std::size_t I, typename Up, typename... Args, typename T = lib::type_pack_element_t, lib::enable_if_t &, Args...>::value, int> = 0> inline explicit constexpr variant( in_place_index_t, std::initializer_list il, Args &&... args) noexcept(std:: is_nothrow_constructible< T, std::initializer_list &, Args...>::value) : impl_(in_place_index_t{}, il, lib::forward(args)...) {} template < typename T, typename... Args, std::size_t I = detail::find_index_sfinae::value, lib::enable_if_t::value, int> = 0> inline explicit constexpr variant( in_place_type_t, Args &&... args) noexcept(std::is_nothrow_constructible::value) : impl_(in_place_index_t{}, lib::forward(args)...) {} template < typename T, typename Up, typename... Args, std::size_t I = detail::find_index_sfinae::value, lib::enable_if_t &, Args...>::value, int> = 0> inline explicit constexpr variant( in_place_type_t, std::initializer_list il, Args &&... args) noexcept(std:: is_nothrow_constructible< T, std::initializer_list &, Args...>::value) : impl_(in_place_index_t{}, il, lib::forward(args)...) {} ~variant() = default; variant &operator=(const variant &) = default; variant &operator=(variant &&) = default; template , variant>::value, int> = 0, std::size_t I = detail::best_match::value, typename T = lib::type_pack_element_t, lib::enable_if_t<(std::is_assignable::value && std::is_constructible::value), int> = 0> inline variant &operator=(Arg &&arg) noexcept( (std::is_nothrow_assignable::value && std::is_nothrow_constructible::value)) { impl_.template assign(lib::forward(arg)); return *this; } template < std::size_t I, typename... Args, typename T = lib::type_pack_element_t, lib::enable_if_t::value, int> = 0> inline T &emplace(Args &&... args) { return impl_.template emplace(lib::forward(args)...); } template < std::size_t I, typename Up, typename... Args, typename T = lib::type_pack_element_t, lib::enable_if_t &, Args...>::value, int> = 0> inline T &emplace(std::initializer_list il, Args &&... args) { return impl_.template emplace(il, lib::forward(args)...); } template < typename T, typename... Args, std::size_t I = detail::find_index_sfinae::value, lib::enable_if_t::value, int> = 0> inline T &emplace(Args &&... args) { return impl_.template emplace(lib::forward(args)...); } template < typename T, typename Up, typename... Args, std::size_t I = detail::find_index_sfinae::value, lib::enable_if_t &, Args...>::value, int> = 0> inline T &emplace(std::initializer_list il, Args &&... args) { return impl_.template emplace(il, lib::forward(args)...); } inline constexpr bool valueless_by_exception() const noexcept { return impl_.valueless_by_exception(); } inline constexpr std::size_t index() const noexcept { return impl_.index(); } template , Dummy>::value && lib::dependent_type, Dummy>::value)...>::value, int> = 0> inline void swap(variant &that) noexcept( lib::all<(std::is_nothrow_move_constructible::value && lib::is_nothrow_swappable::value)...>::value) { impl_.swap(that.impl_); } private: detail::impl impl_; friend struct detail::access::variant; friend struct detail::visitation::variant; }; template inline constexpr bool holds_alternative(const variant &v) noexcept { return v.index() == I; } template inline constexpr bool holds_alternative(const variant &v) noexcept { return holds_alternative::value>(v); } namespace detail { template struct generic_get_impl { constexpr generic_get_impl(int) noexcept {} constexpr AUTO_REFREF operator()(V &&v) const AUTO_REFREF_RETURN( access::variant::get_alt(lib::forward(v)).value) }; template inline constexpr AUTO_REFREF generic_get(V &&v) AUTO_REFREF_RETURN(generic_get_impl( holds_alternative(v) ? 0 : (throw_bad_variant_access(), 0))( lib::forward(v))) } // namespace detail template inline constexpr variant_alternative_t> &get( variant &v) { return detail::generic_get(v); } template inline constexpr variant_alternative_t> &&get( variant &&v) { return detail::generic_get(lib::move(v)); } template inline constexpr const variant_alternative_t> &get( const variant &v) { return detail::generic_get(v); } template inline constexpr const variant_alternative_t> &&get( const variant &&v) { return detail::generic_get(lib::move(v)); } template inline constexpr T &get(variant &v) { return get::value>(v); } template inline constexpr T &&get(variant &&v) { return get::value>(lib::move(v)); } template inline constexpr const T &get(const variant &v) { return get::value>(v); } template inline constexpr const T &&get(const variant &&v) { return get::value>(lib::move(v)); } namespace detail { template inline constexpr /* auto * */ AUTO generic_get_if(V *v) noexcept AUTO_RETURN(v && holds_alternative(*v) ? lib::addressof(access::variant::get_alt(*v).value) : nullptr) } // namespace detail template inline constexpr lib::add_pointer_t>> get_if(variant *v) noexcept { return detail::generic_get_if(v); } template inline constexpr lib::add_pointer_t< const variant_alternative_t>> get_if(const variant *v) noexcept { return detail::generic_get_if(v); } template inline constexpr lib::add_pointer_t get_if(variant *v) noexcept { return get_if::value>(v); } template inline constexpr lib::add_pointer_t get_if(const variant *v) noexcept { return get_if::value>(v); } namespace detail { template struct convert_to_bool { template inline constexpr bool operator()(Lhs &&lhs, Rhs &&rhs) const { static_assert(std::is_convertible, bool>::value, "relational operators must return a type" " implicitly convertible to bool"); return lib::invoke( RelOp{}, lib::forward(lhs), lib::forward(rhs)); } }; } // namespace detail template inline constexpr bool operator==(const variant &lhs, const variant &rhs) { using detail::visitation::variant; using equal_to = detail::convert_to_bool; #ifdef MPARK_CPP14_CONSTEXPR if (lhs.index() != rhs.index()) return false; if (lhs.valueless_by_exception()) return true; return variant::visit_value_at(lhs.index(), equal_to{}, lhs, rhs); #else return lhs.index() == rhs.index() && (lhs.valueless_by_exception() || variant::visit_value_at(lhs.index(), equal_to{}, lhs, rhs)); #endif } template inline constexpr bool operator!=(const variant &lhs, const variant &rhs) { using detail::visitation::variant; using not_equal_to = detail::convert_to_bool; #ifdef MPARK_CPP14_CONSTEXPR if (lhs.index() != rhs.index()) return true; if (lhs.valueless_by_exception()) return false; return variant::visit_value_at(lhs.index(), not_equal_to{}, lhs, rhs); #else return lhs.index() != rhs.index() || (!lhs.valueless_by_exception() && variant::visit_value_at(lhs.index(), not_equal_to{}, lhs, rhs)); #endif } template inline constexpr bool operator<(const variant &lhs, const variant &rhs) { using detail::visitation::variant; using less = detail::convert_to_bool; #ifdef MPARK_CPP14_CONSTEXPR if (rhs.valueless_by_exception()) return false; if (lhs.valueless_by_exception()) return true; if (lhs.index() < rhs.index()) return true; if (lhs.index() > rhs.index()) return false; return variant::visit_value_at(lhs.index(), less{}, lhs, rhs); #else return !rhs.valueless_by_exception() && (lhs.valueless_by_exception() || lhs.index() < rhs.index() || (lhs.index() == rhs.index() && variant::visit_value_at(lhs.index(), less{}, lhs, rhs))); #endif } template inline constexpr bool operator>(const variant &lhs, const variant &rhs) { using detail::visitation::variant; using greater = detail::convert_to_bool; #ifdef MPARK_CPP14_CONSTEXPR if (lhs.valueless_by_exception()) return false; if (rhs.valueless_by_exception()) return true; if (lhs.index() > rhs.index()) return true; if (lhs.index() < rhs.index()) return false; return variant::visit_value_at(lhs.index(), greater{}, lhs, rhs); #else return !lhs.valueless_by_exception() && (rhs.valueless_by_exception() || lhs.index() > rhs.index() || (lhs.index() == rhs.index() && variant::visit_value_at(lhs.index(), greater{}, lhs, rhs))); #endif } template inline constexpr bool operator<=(const variant &lhs, const variant &rhs) { using detail::visitation::variant; using less_equal = detail::convert_to_bool; #ifdef MPARK_CPP14_CONSTEXPR if (lhs.valueless_by_exception()) return true; if (rhs.valueless_by_exception()) return false; if (lhs.index() < rhs.index()) return true; if (lhs.index() > rhs.index()) return false; return variant::visit_value_at(lhs.index(), less_equal{}, lhs, rhs); #else return lhs.valueless_by_exception() || (!rhs.valueless_by_exception() && (lhs.index() < rhs.index() || (lhs.index() == rhs.index() && variant::visit_value_at(lhs.index(), less_equal{}, lhs, rhs)))); #endif } template inline constexpr bool operator>=(const variant &lhs, const variant &rhs) { using detail::visitation::variant; using greater_equal = detail::convert_to_bool; #ifdef MPARK_CPP14_CONSTEXPR if (rhs.valueless_by_exception()) return true; if (lhs.valueless_by_exception()) return false; if (lhs.index() > rhs.index()) return true; if (lhs.index() < rhs.index()) return false; return variant::visit_value_at(lhs.index(), greater_equal{}, lhs, rhs); #else return rhs.valueless_by_exception() || (!lhs.valueless_by_exception() && (lhs.index() > rhs.index() || (lhs.index() == rhs.index() && variant::visit_value_at( lhs.index(), greater_equal{}, lhs, rhs)))); #endif } struct monostate {}; inline constexpr bool operator<(monostate, monostate) noexcept { return false; } inline constexpr bool operator>(monostate, monostate) noexcept { return false; } inline constexpr bool operator<=(monostate, monostate) noexcept { return true; } inline constexpr bool operator>=(monostate, monostate) noexcept { return true; } inline constexpr bool operator==(monostate, monostate) noexcept { return true; } inline constexpr bool operator!=(monostate, monostate) noexcept { return false; } #ifdef MPARK_CPP14_CONSTEXPR namespace detail { inline constexpr bool all(std::initializer_list bs) { for (bool b : bs) { if (!b) { return false; } } return true; } } // namespace detail template inline constexpr decltype(auto) visit(Visitor &&visitor, Vs &&... vs) { return (detail::all({!vs.valueless_by_exception()...}) ? (void)0 : throw_bad_variant_access()), detail::visitation::variant::visit_value( lib::forward(visitor), lib::forward(vs)...); } #else namespace detail { template inline constexpr bool all_impl(const lib::array &bs, std::size_t idx) { return idx >= N || (bs[idx] && all_impl(bs, idx + 1)); } template inline constexpr bool all(const lib::array &bs) { return all_impl(bs, 0); } } // namespace detail template inline constexpr DECLTYPE_AUTO visit(Visitor &&visitor, Vs &&... vs) DECLTYPE_AUTO_RETURN( (detail::all( lib::array{{!vs.valueless_by_exception()...}}) ? (void)0 : throw_bad_variant_access()), detail::visitation::variant::visit_value(lib::forward(visitor), lib::forward(vs)...)) #endif template inline auto swap(variant &lhs, variant &rhs) noexcept(noexcept(lhs.swap(rhs))) -> decltype(lhs.swap(rhs)) { lhs.swap(rhs); } namespace detail { template using enabled_type = T; namespace hash { template constexpr bool meets_requirements() noexcept { return std::is_copy_constructible::value && std::is_move_constructible::value && lib::is_invocable_r::value; } template constexpr bool is_enabled() noexcept { using H = std::hash; return meets_requirements() && std::is_default_constructible::value && std::is_copy_assignable::value && std::is_move_assignable::value; } } // namespace hash } // namespace detail #undef AUTO #undef AUTO_RETURN #undef AUTO_REFREF #undef AUTO_REFREF_RETURN #undef DECLTYPE_AUTO #undef DECLTYPE_AUTO_RETURN } // namespace mpark namespace std { template struct hash, mpark::lib::enable_if_t>()...>::value>>> { using argument_type = mpark::variant; using result_type = std::size_t; inline result_type operator()(const argument_type &v) const { using mpark::detail::visitation::variant; std::size_t result = v.valueless_by_exception() ? 299792458 // Random value chosen by the universe upon creation : variant::visit_alt( #ifdef MPARK_GENERIC_LAMBDAS [](const auto &alt) { using alt_type = mpark::lib::decay_t; using value_type = mpark::lib::remove_const_t< typename alt_type::value_type>; return hash{}(alt.value); } #else hasher{} #endif , v); return hash_combine(result, hash{}(v.index())); } private: #ifndef MPARK_GENERIC_LAMBDAS struct hasher { template inline std::size_t operator()(const Alt &alt) const { using alt_type = mpark::lib::decay_t; using value_type = mpark::lib::remove_const_t; return hash{}(alt.value); } }; #endif static std::size_t hash_combine(std::size_t lhs, std::size_t rhs) { return lhs ^= rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2); } }; template <> struct hash { using argument_type = mpark::monostate; using result_type = std::size_t; inline result_type operator()(const argument_type &) const noexcept { return 66740831; // return a fundamentally attractive random value. } }; } // namespace std #endif // MPARK_VARIANT_HPP dvisvgm-2.8.1/libs/Makefile.am0000664000175000017500000000036113510660062013110 00000000000000## This file is part of dvisvgm ## Copyright (C) 2005-2019 Martin Gieseking ## ## Process this file with automake. SUBDIRS = clipper md5 potrace variant xxHash if ENABLE_WOFF SUBDIRS += brotli ff-woff woff2 endif dvisvgm-2.8.1/libs/brotli/0000775000175000017500000000000013563265646012450 500000000000000dvisvgm-2.8.1/libs/brotli/enc/0000775000175000017500000000000013563265646013215 500000000000000dvisvgm-2.8.1/libs/brotli/enc/hash_composite_inc.h0000664000175000017500000001150513510660062017125 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2018 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, HASHER_A, HASHER_B */ /* Composite hasher: This hasher allows to combine two other hashers, HASHER_A and HASHER_B. */ #define HashComposite HASHER() #define FN_A(X) EXPAND_CAT(X, HASHER_A) #define FN_B(X) EXPAND_CAT(X, HASHER_B) static BROTLI_INLINE size_t FN(HashTypeLength)(void) { size_t a = FN_A(HashTypeLength)(); size_t b = FN_B(HashTypeLength)(); return a > b ? a : b; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { size_t a = FN_A(StoreLookahead)(); size_t b = FN_B(StoreLookahead)(); return a > b ? a : b; } typedef struct HashComposite { HasherHandle ha; HasherHandle hb; const BrotliEncoderParams* params; } HashComposite; static BROTLI_INLINE HashComposite* FN(Self)(HasherHandle handle) { return (HashComposite*)&(GetHasherCommon(handle)[1]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { HashComposite* self = FN(Self)(handle); self->ha = 0; self->hb = 0; self->params = params; /* TODO: Initialize of the hashers is defered to Prepare (and params remembered here) because we don't get the one_shot and input_size params here that are needed to know the memory size of them. Instead provide those params to all hashers FN(Initialize) */ } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashComposite* self = FN(Self)(handle); if (!self->ha) { HasherCommon* common_a; HasherCommon* common_b; self->ha = handle + sizeof(HasherCommon) + sizeof(HashComposite); common_a = (HasherCommon*)self->ha; common_a->params = self->params->hasher; common_a->is_prepared_ = BROTLI_FALSE; common_a->dict_num_lookups = 0; common_a->dict_num_matches = 0; FN_A(Initialize)(self->ha, self->params); self->hb = self->ha + sizeof(HasherCommon) + FN_A(HashMemAllocInBytes)( self->params, one_shot, input_size); common_b = (HasherCommon*)self->hb; common_b->params = self->params->hasher; common_b->is_prepared_ = BROTLI_FALSE; common_b->dict_num_lookups = 0; common_b->dict_num_matches = 0; FN_B(Initialize)(self->hb, self->params); } FN_A(Prepare)(self->ha, one_shot, input_size, data); FN_B(Prepare)(self->hb, one_shot, input_size, data); } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { return sizeof(HashComposite) + 2 * sizeof(HasherCommon) + FN_A(HashMemAllocInBytes)(params, one_shot, input_size) + FN_B(HashMemAllocInBytes)(params, one_shot, input_size); } static BROTLI_INLINE void FN(Store)(HasherHandle BROTLI_RESTRICT handle, const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) { HashComposite* self = FN(Self)(handle); FN_A(Store)(self->ha, data, mask, ix); FN_B(Store)(self->hb, data, mask, ix); } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { HashComposite* self = FN(Self)(handle); FN_A(StoreRange)(self->ha, data, mask, ix_start, ix_end); FN_B(StoreRange)(self->hb, data, mask, ix_start, ix_end); } static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ring_buffer_mask) { HashComposite* self = FN(Self)(handle); FN_A(StitchToPreviousBlock)(self->ha, num_bytes, position, ringbuffer, ring_buffer_mask); FN_B(StitchToPreviousBlock)(self->hb, num_bytes, position, ringbuffer, ring_buffer_mask); } static BROTLI_INLINE void FN(PrepareDistanceCache)( HasherHandle handle, int* BROTLI_RESTRICT distance_cache) { HashComposite* self = FN(Self)(handle); FN_A(PrepareDistanceCache)(self->ha, distance_cache); FN_B(PrepareDistanceCache)(self->hb, distance_cache); } static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) { HashComposite* self = FN(Self)(handle); FN_A(FindLongestMatch)(self->ha, dictionary, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out); FN_B(FindLongestMatch)(self->hb, dictionary, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out); } #undef HashComposite dvisvgm-2.8.1/libs/brotli/enc/brotli_bit_stream.c0000664000175000017500000014177713510660062017005 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Brotli bit stream functions to support the low level format. There are no compression algorithms here, just the right ordering of bits to match the specs. */ #include "./brotli_bit_stream.h" #include /* memcpy, memset */ #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" #include #include "./entropy_encode.h" #include "./entropy_encode_static.h" #include "./fast_log.h" #include "./histogram.h" #include "./memory.h" #include "./write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define MAX_HUFFMAN_TREE_SIZE (2 * BROTLI_NUM_COMMAND_SYMBOLS + 1) /* The maximum size of Huffman dictionary for distances assuming that NPOSTFIX = 0 and NDIRECT = 0. */ #define MAX_SIMPLE_DISTANCE_ALPHABET_SIZE \ BROTLI_DISTANCE_ALPHABET_SIZE(0, 0, BROTLI_LARGE_MAX_DISTANCE_BITS) /* MAX_SIMPLE_DISTANCE_ALPHABET_SIZE == 140 */ /* Represents the range of values belonging to a prefix code: [offset, offset + 2^nbits) */ typedef struct PrefixCodeRange { uint32_t offset; uint32_t nbits; } PrefixCodeRange; static const PrefixCodeRange kBlockLengthPrefixCode[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = { { 1, 2}, { 5, 2}, { 9, 2}, {13, 2}, {17, 3}, { 25, 3}, { 33, 3}, {41, 3}, {49, 4}, {65, 4}, {81, 4}, {97, 4}, {113, 5}, {145, 5}, {177, 5}, { 209, 5}, { 241, 6}, { 305, 6}, { 369, 7}, { 497, 8}, {753, 9}, {1265, 10}, {2289, 11}, {4337, 12}, {8433, 13}, {16625, 24} }; static BROTLI_INLINE uint32_t BlockLengthPrefixCode(uint32_t len) { uint32_t code = (len >= 177) ? (len >= 753 ? 20 : 14) : (len >= 41 ? 7 : 0); while (code < (BROTLI_NUM_BLOCK_LEN_SYMBOLS - 1) && len >= kBlockLengthPrefixCode[code + 1].offset) ++code; return code; } static BROTLI_INLINE void GetBlockLengthPrefixCode(uint32_t len, size_t* code, uint32_t* n_extra, uint32_t* extra) { *code = BlockLengthPrefixCode(len); *n_extra = kBlockLengthPrefixCode[*code].nbits; *extra = len - kBlockLengthPrefixCode[*code].offset; } typedef struct BlockTypeCodeCalculator { size_t last_type; size_t second_last_type; } BlockTypeCodeCalculator; static void InitBlockTypeCodeCalculator(BlockTypeCodeCalculator* self) { self->last_type = 1; self->second_last_type = 0; } static BROTLI_INLINE size_t NextBlockTypeCode( BlockTypeCodeCalculator* calculator, uint8_t type) { size_t type_code = (type == calculator->last_type + 1) ? 1u : (type == calculator->second_last_type) ? 0u : type + 2u; calculator->second_last_type = calculator->last_type; calculator->last_type = type; return type_code; } /* |nibblesbits| represents the 2 bits to encode MNIBBLES (0-3) REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ static void BrotliEncodeMlen(size_t length, uint64_t* bits, size_t* numbits, uint64_t* nibblesbits) { size_t lg = (length == 1) ? 1 : Log2FloorNonZero((uint32_t)(length - 1)) + 1; size_t mnibbles = (lg < 16 ? 16 : (lg + 3)) / 4; BROTLI_DCHECK(length > 0); BROTLI_DCHECK(length <= (1 << 24)); BROTLI_DCHECK(lg <= 24); *nibblesbits = mnibbles - 4; *numbits = mnibbles * 4; *bits = length - 1; } static BROTLI_INLINE void StoreCommandExtra( const Command* cmd, size_t* storage_ix, uint8_t* storage) { uint32_t copylen_code = CommandCopyLenCode(cmd); uint16_t inscode = GetInsertLengthCode(cmd->insert_len_); uint16_t copycode = GetCopyLengthCode(copylen_code); uint32_t insnumextra = GetInsertExtra(inscode); uint64_t insextraval = cmd->insert_len_ - GetInsertBase(inscode); uint64_t copyextraval = copylen_code - GetCopyBase(copycode); uint64_t bits = (copyextraval << insnumextra) | insextraval; BrotliWriteBits( insnumextra + GetCopyExtra(copycode), bits, storage_ix, storage); } /* Data structure that stores almost everything that is needed to encode each block switch command. */ typedef struct BlockSplitCode { BlockTypeCodeCalculator type_code_calculator; uint8_t type_depths[BROTLI_MAX_BLOCK_TYPE_SYMBOLS]; uint16_t type_bits[BROTLI_MAX_BLOCK_TYPE_SYMBOLS]; uint8_t length_depths[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; uint16_t length_bits[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; } BlockSplitCode; /* Stores a number between 0 and 255. */ static void StoreVarLenUint8(size_t n, size_t* storage_ix, uint8_t* storage) { if (n == 0) { BrotliWriteBits(1, 0, storage_ix, storage); } else { size_t nbits = Log2FloorNonZero(n); BrotliWriteBits(1, 1, storage_ix, storage); BrotliWriteBits(3, nbits, storage_ix, storage); BrotliWriteBits(nbits, n - ((size_t)1 << nbits), storage_ix, storage); } } /* Stores the compressed meta-block header. REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ static void StoreCompressedMetaBlockHeader(BROTLI_BOOL is_final_block, size_t length, size_t* storage_ix, uint8_t* storage) { uint64_t lenbits; size_t nlenbits; uint64_t nibblesbits; /* Write ISLAST bit. */ BrotliWriteBits(1, (uint64_t)is_final_block, storage_ix, storage); /* Write ISEMPTY bit. */ if (is_final_block) { BrotliWriteBits(1, 0, storage_ix, storage); } BrotliEncodeMlen(length, &lenbits, &nlenbits, &nibblesbits); BrotliWriteBits(2, nibblesbits, storage_ix, storage); BrotliWriteBits(nlenbits, lenbits, storage_ix, storage); if (!is_final_block) { /* Write ISUNCOMPRESSED bit. */ BrotliWriteBits(1, 0, storage_ix, storage); } } /* Stores the uncompressed meta-block header. REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ static void BrotliStoreUncompressedMetaBlockHeader(size_t length, size_t* storage_ix, uint8_t* storage) { uint64_t lenbits; size_t nlenbits; uint64_t nibblesbits; /* Write ISLAST bit. Uncompressed block cannot be the last one, so set to 0. */ BrotliWriteBits(1, 0, storage_ix, storage); BrotliEncodeMlen(length, &lenbits, &nlenbits, &nibblesbits); BrotliWriteBits(2, nibblesbits, storage_ix, storage); BrotliWriteBits(nlenbits, lenbits, storage_ix, storage); /* Write ISUNCOMPRESSED bit. */ BrotliWriteBits(1, 1, storage_ix, storage); } static void BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask( const int num_codes, const uint8_t* code_length_bitdepth, size_t* storage_ix, uint8_t* storage) { static const uint8_t kStorageOrder[BROTLI_CODE_LENGTH_CODES] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; /* The bit lengths of the Huffman code over the code length alphabet are compressed with the following static Huffman code: Symbol Code ------ ---- 0 00 1 1110 2 110 3 01 4 10 5 1111 */ static const uint8_t kHuffmanBitLengthHuffmanCodeSymbols[6] = { 0, 7, 3, 2, 1, 15 }; static const uint8_t kHuffmanBitLengthHuffmanCodeBitLengths[6] = { 2, 4, 3, 2, 2, 4 }; size_t skip_some = 0; /* skips none. */ /* Throw away trailing zeros: */ size_t codes_to_store = BROTLI_CODE_LENGTH_CODES; if (num_codes > 1) { for (; codes_to_store > 0; --codes_to_store) { if (code_length_bitdepth[kStorageOrder[codes_to_store - 1]] != 0) { break; } } } if (code_length_bitdepth[kStorageOrder[0]] == 0 && code_length_bitdepth[kStorageOrder[1]] == 0) { skip_some = 2; /* skips two. */ if (code_length_bitdepth[kStorageOrder[2]] == 0) { skip_some = 3; /* skips three. */ } } BrotliWriteBits(2, skip_some, storage_ix, storage); { size_t i; for (i = skip_some; i < codes_to_store; ++i) { size_t l = code_length_bitdepth[kStorageOrder[i]]; BrotliWriteBits(kHuffmanBitLengthHuffmanCodeBitLengths[l], kHuffmanBitLengthHuffmanCodeSymbols[l], storage_ix, storage); } } } static void BrotliStoreHuffmanTreeToBitMask( const size_t huffman_tree_size, const uint8_t* huffman_tree, const uint8_t* huffman_tree_extra_bits, const uint8_t* code_length_bitdepth, const uint16_t* code_length_bitdepth_symbols, size_t* BROTLI_RESTRICT storage_ix, uint8_t* BROTLI_RESTRICT storage) { size_t i; for (i = 0; i < huffman_tree_size; ++i) { size_t ix = huffman_tree[i]; BrotliWriteBits(code_length_bitdepth[ix], code_length_bitdepth_symbols[ix], storage_ix, storage); /* Extra bits */ switch (ix) { case BROTLI_REPEAT_PREVIOUS_CODE_LENGTH: BrotliWriteBits(2, huffman_tree_extra_bits[i], storage_ix, storage); break; case BROTLI_REPEAT_ZERO_CODE_LENGTH: BrotliWriteBits(3, huffman_tree_extra_bits[i], storage_ix, storage); break; } } } static void StoreSimpleHuffmanTree(const uint8_t* depths, size_t symbols[4], size_t num_symbols, size_t max_bits, size_t* storage_ix, uint8_t* storage) { /* value of 1 indicates a simple Huffman code */ BrotliWriteBits(2, 1, storage_ix, storage); BrotliWriteBits(2, num_symbols - 1, storage_ix, storage); /* NSYM - 1 */ { /* Sort */ size_t i; for (i = 0; i < num_symbols; i++) { size_t j; for (j = i + 1; j < num_symbols; j++) { if (depths[symbols[j]] < depths[symbols[i]]) { BROTLI_SWAP(size_t, symbols, j, i); } } } } if (num_symbols == 2) { BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); BrotliWriteBits(max_bits, symbols[1], storage_ix, storage); } else if (num_symbols == 3) { BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); BrotliWriteBits(max_bits, symbols[1], storage_ix, storage); BrotliWriteBits(max_bits, symbols[2], storage_ix, storage); } else { BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); BrotliWriteBits(max_bits, symbols[1], storage_ix, storage); BrotliWriteBits(max_bits, symbols[2], storage_ix, storage); BrotliWriteBits(max_bits, symbols[3], storage_ix, storage); /* tree-select */ BrotliWriteBits(1, depths[symbols[0]] == 1 ? 1 : 0, storage_ix, storage); } } /* num = alphabet size depths = symbol depths */ void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num, HuffmanTree* tree, size_t* storage_ix, uint8_t* storage) { /* Write the Huffman tree into the brotli-representation. The command alphabet is the largest, so this allocation will fit all alphabets. */ uint8_t huffman_tree[BROTLI_NUM_COMMAND_SYMBOLS]; uint8_t huffman_tree_extra_bits[BROTLI_NUM_COMMAND_SYMBOLS]; size_t huffman_tree_size = 0; uint8_t code_length_bitdepth[BROTLI_CODE_LENGTH_CODES] = { 0 }; uint16_t code_length_bitdepth_symbols[BROTLI_CODE_LENGTH_CODES]; uint32_t huffman_tree_histogram[BROTLI_CODE_LENGTH_CODES] = { 0 }; size_t i; int num_codes = 0; size_t code = 0; BROTLI_DCHECK(num <= BROTLI_NUM_COMMAND_SYMBOLS); BrotliWriteHuffmanTree(depths, num, &huffman_tree_size, huffman_tree, huffman_tree_extra_bits); /* Calculate the statistics of the Huffman tree in brotli-representation. */ for (i = 0; i < huffman_tree_size; ++i) { ++huffman_tree_histogram[huffman_tree[i]]; } for (i = 0; i < BROTLI_CODE_LENGTH_CODES; ++i) { if (huffman_tree_histogram[i]) { if (num_codes == 0) { code = i; num_codes = 1; } else if (num_codes == 1) { num_codes = 2; break; } } } /* Calculate another Huffman tree to use for compressing both the earlier Huffman tree with. */ BrotliCreateHuffmanTree(huffman_tree_histogram, BROTLI_CODE_LENGTH_CODES, 5, tree, code_length_bitdepth); BrotliConvertBitDepthsToSymbols(code_length_bitdepth, BROTLI_CODE_LENGTH_CODES, code_length_bitdepth_symbols); /* Now, we have all the data, let's start storing it */ BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask(num_codes, code_length_bitdepth, storage_ix, storage); if (num_codes == 1) { code_length_bitdepth[code] = 0; } /* Store the real Huffman tree now. */ BrotliStoreHuffmanTreeToBitMask(huffman_tree_size, huffman_tree, huffman_tree_extra_bits, code_length_bitdepth, code_length_bitdepth_symbols, storage_ix, storage); } /* Builds a Huffman tree from histogram[0:length] into depth[0:length] and bits[0:length] and stores the encoded tree to the bit stream. */ static void BuildAndStoreHuffmanTree(const uint32_t* histogram, const size_t histogram_length, const size_t alphabet_size, HuffmanTree* tree, uint8_t* depth, uint16_t* bits, size_t* storage_ix, uint8_t* storage) { size_t count = 0; size_t s4[4] = { 0 }; size_t i; size_t max_bits = 0; for (i = 0; i < histogram_length; i++) { if (histogram[i]) { if (count < 4) { s4[count] = i; } else if (count > 4) { break; } count++; } } { size_t max_bits_counter = alphabet_size - 1; while (max_bits_counter) { max_bits_counter >>= 1; ++max_bits; } } if (count <= 1) { BrotliWriteBits(4, 1, storage_ix, storage); BrotliWriteBits(max_bits, s4[0], storage_ix, storage); depth[s4[0]] = 0; bits[s4[0]] = 0; return; } memset(depth, 0, histogram_length * sizeof(depth[0])); BrotliCreateHuffmanTree(histogram, histogram_length, 15, tree, depth); BrotliConvertBitDepthsToSymbols(depth, histogram_length, bits); if (count <= 4) { StoreSimpleHuffmanTree(depth, s4, count, max_bits, storage_ix, storage); } else { BrotliStoreHuffmanTree(depth, histogram_length, tree, storage_ix, storage); } } static BROTLI_INLINE BROTLI_BOOL SortHuffmanTree( const HuffmanTree* v0, const HuffmanTree* v1) { return TO_BROTLI_BOOL(v0->total_count_ < v1->total_count_); } void BrotliBuildAndStoreHuffmanTreeFast(MemoryManager* m, const uint32_t* histogram, const size_t histogram_total, const size_t max_bits, uint8_t* depth, uint16_t* bits, size_t* storage_ix, uint8_t* storage) { size_t count = 0; size_t symbols[4] = { 0 }; size_t length = 0; size_t total = histogram_total; while (total != 0) { if (histogram[length]) { if (count < 4) { symbols[count] = length; } ++count; total -= histogram[length]; } ++length; } if (count <= 1) { BrotliWriteBits(4, 1, storage_ix, storage); BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); depth[symbols[0]] = 0; bits[symbols[0]] = 0; return; } memset(depth, 0, length * sizeof(depth[0])); { const size_t max_tree_size = 2 * length + 1; HuffmanTree* tree = BROTLI_ALLOC(m, HuffmanTree, max_tree_size); uint32_t count_limit; if (BROTLI_IS_OOM(m)) return; for (count_limit = 1; ; count_limit *= 2) { HuffmanTree* node = tree; size_t l; for (l = length; l != 0;) { --l; if (histogram[l]) { if (BROTLI_PREDICT_TRUE(histogram[l] >= count_limit)) { InitHuffmanTree(node, histogram[l], -1, (int16_t)l); } else { InitHuffmanTree(node, count_limit, -1, (int16_t)l); } ++node; } } { const int n = (int)(node - tree); HuffmanTree sentinel; int i = 0; /* Points to the next leaf node. */ int j = n + 1; /* Points to the next non-leaf node. */ int k; SortHuffmanTreeItems(tree, (size_t)n, SortHuffmanTree); /* The nodes are: [0, n): the sorted leaf nodes that we start with. [n]: we add a sentinel here. [n + 1, 2n): new parent nodes are added here, starting from (n+1). These are naturally in ascending order. [2n]: we add a sentinel at the end as well. There will be (2n+1) elements at the end. */ InitHuffmanTree(&sentinel, BROTLI_UINT32_MAX, -1, -1); *node++ = sentinel; *node++ = sentinel; for (k = n - 1; k > 0; --k) { int left, right; if (tree[i].total_count_ <= tree[j].total_count_) { left = i; ++i; } else { left = j; ++j; } if (tree[i].total_count_ <= tree[j].total_count_) { right = i; ++i; } else { right = j; ++j; } /* The sentinel node becomes the parent node. */ node[-1].total_count_ = tree[left].total_count_ + tree[right].total_count_; node[-1].index_left_ = (int16_t)left; node[-1].index_right_or_value_ = (int16_t)right; /* Add back the last sentinel node. */ *node++ = sentinel; } if (BrotliSetDepth(2 * n - 1, tree, depth, 14)) { /* We need to pack the Huffman tree in 14 bits. If this was not successful, add fake entities to the lowest values and retry. */ break; } } } BROTLI_FREE(m, tree); } BrotliConvertBitDepthsToSymbols(depth, length, bits); if (count <= 4) { size_t i; /* value of 1 indicates a simple Huffman code */ BrotliWriteBits(2, 1, storage_ix, storage); BrotliWriteBits(2, count - 1, storage_ix, storage); /* NSYM - 1 */ /* Sort */ for (i = 0; i < count; i++) { size_t j; for (j = i + 1; j < count; j++) { if (depth[symbols[j]] < depth[symbols[i]]) { BROTLI_SWAP(size_t, symbols, j, i); } } } if (count == 2) { BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); BrotliWriteBits(max_bits, symbols[1], storage_ix, storage); } else if (count == 3) { BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); BrotliWriteBits(max_bits, symbols[1], storage_ix, storage); BrotliWriteBits(max_bits, symbols[2], storage_ix, storage); } else { BrotliWriteBits(max_bits, symbols[0], storage_ix, storage); BrotliWriteBits(max_bits, symbols[1], storage_ix, storage); BrotliWriteBits(max_bits, symbols[2], storage_ix, storage); BrotliWriteBits(max_bits, symbols[3], storage_ix, storage); /* tree-select */ BrotliWriteBits(1, depth[symbols[0]] == 1 ? 1 : 0, storage_ix, storage); } } else { uint8_t previous_value = 8; size_t i; /* Complex Huffman Tree */ StoreStaticCodeLengthCode(storage_ix, storage); /* Actual RLE coding. */ for (i = 0; i < length;) { const uint8_t value = depth[i]; size_t reps = 1; size_t k; for (k = i + 1; k < length && depth[k] == value; ++k) { ++reps; } i += reps; if (value == 0) { BrotliWriteBits(kZeroRepsDepth[reps], kZeroRepsBits[reps], storage_ix, storage); } else { if (previous_value != value) { BrotliWriteBits(kCodeLengthDepth[value], kCodeLengthBits[value], storage_ix, storage); --reps; } if (reps < 3) { while (reps != 0) { reps--; BrotliWriteBits(kCodeLengthDepth[value], kCodeLengthBits[value], storage_ix, storage); } } else { reps -= 3; BrotliWriteBits(kNonZeroRepsDepth[reps], kNonZeroRepsBits[reps], storage_ix, storage); } previous_value = value; } } } } static size_t IndexOf(const uint8_t* v, size_t v_size, uint8_t value) { size_t i = 0; for (; i < v_size; ++i) { if (v[i] == value) return i; } return i; } static void MoveToFront(uint8_t* v, size_t index) { uint8_t value = v[index]; size_t i; for (i = index; i != 0; --i) { v[i] = v[i - 1]; } v[0] = value; } static void MoveToFrontTransform(const uint32_t* BROTLI_RESTRICT v_in, const size_t v_size, uint32_t* v_out) { size_t i; uint8_t mtf[256]; uint32_t max_value; if (v_size == 0) { return; } max_value = v_in[0]; for (i = 1; i < v_size; ++i) { if (v_in[i] > max_value) max_value = v_in[i]; } BROTLI_DCHECK(max_value < 256u); for (i = 0; i <= max_value; ++i) { mtf[i] = (uint8_t)i; } { size_t mtf_size = max_value + 1; for (i = 0; i < v_size; ++i) { size_t index = IndexOf(mtf, mtf_size, (uint8_t)v_in[i]); BROTLI_DCHECK(index < mtf_size); v_out[i] = (uint32_t)index; MoveToFront(mtf, index); } } } /* Finds runs of zeros in v[0..in_size) and replaces them with a prefix code of the run length plus extra bits (lower 9 bits is the prefix code and the rest are the extra bits). Non-zero values in v[] are shifted by *max_length_prefix. Will not create prefix codes bigger than the initial value of *max_run_length_prefix. The prefix code of run length L is simply Log2Floor(L) and the number of extra bits is the same as the prefix code. */ static void RunLengthCodeZeros(const size_t in_size, uint32_t* BROTLI_RESTRICT v, size_t* BROTLI_RESTRICT out_size, uint32_t* BROTLI_RESTRICT max_run_length_prefix) { uint32_t max_reps = 0; size_t i; uint32_t max_prefix; for (i = 0; i < in_size;) { uint32_t reps = 0; for (; i < in_size && v[i] != 0; ++i) ; for (; i < in_size && v[i] == 0; ++i) { ++reps; } max_reps = BROTLI_MAX(uint32_t, reps, max_reps); } max_prefix = max_reps > 0 ? Log2FloorNonZero(max_reps) : 0; max_prefix = BROTLI_MIN(uint32_t, max_prefix, *max_run_length_prefix); *max_run_length_prefix = max_prefix; *out_size = 0; for (i = 0; i < in_size;) { BROTLI_DCHECK(*out_size <= i); if (v[i] != 0) { v[*out_size] = v[i] + *max_run_length_prefix; ++i; ++(*out_size); } else { uint32_t reps = 1; size_t k; for (k = i + 1; k < in_size && v[k] == 0; ++k) { ++reps; } i += reps; while (reps != 0) { if (reps < (2u << max_prefix)) { uint32_t run_length_prefix = Log2FloorNonZero(reps); const uint32_t extra_bits = reps - (1u << run_length_prefix); v[*out_size] = run_length_prefix + (extra_bits << 9); ++(*out_size); break; } else { const uint32_t extra_bits = (1u << max_prefix) - 1u; v[*out_size] = max_prefix + (extra_bits << 9); reps -= (2u << max_prefix) - 1u; ++(*out_size); } } } } } #define SYMBOL_BITS 9 static void EncodeContextMap(MemoryManager* m, const uint32_t* context_map, size_t context_map_size, size_t num_clusters, HuffmanTree* tree, size_t* storage_ix, uint8_t* storage) { size_t i; uint32_t* rle_symbols; uint32_t max_run_length_prefix = 6; size_t num_rle_symbols = 0; uint32_t histogram[BROTLI_MAX_CONTEXT_MAP_SYMBOLS]; static const uint32_t kSymbolMask = (1u << SYMBOL_BITS) - 1u; uint8_t depths[BROTLI_MAX_CONTEXT_MAP_SYMBOLS]; uint16_t bits[BROTLI_MAX_CONTEXT_MAP_SYMBOLS]; StoreVarLenUint8(num_clusters - 1, storage_ix, storage); if (num_clusters == 1) { return; } rle_symbols = BROTLI_ALLOC(m, uint32_t, context_map_size); if (BROTLI_IS_OOM(m)) return; MoveToFrontTransform(context_map, context_map_size, rle_symbols); RunLengthCodeZeros(context_map_size, rle_symbols, &num_rle_symbols, &max_run_length_prefix); memset(histogram, 0, sizeof(histogram)); for (i = 0; i < num_rle_symbols; ++i) { ++histogram[rle_symbols[i] & kSymbolMask]; } { BROTLI_BOOL use_rle = TO_BROTLI_BOOL(max_run_length_prefix > 0); BrotliWriteBits(1, (uint64_t)use_rle, storage_ix, storage); if (use_rle) { BrotliWriteBits(4, max_run_length_prefix - 1, storage_ix, storage); } } BuildAndStoreHuffmanTree(histogram, num_clusters + max_run_length_prefix, num_clusters + max_run_length_prefix, tree, depths, bits, storage_ix, storage); for (i = 0; i < num_rle_symbols; ++i) { const uint32_t rle_symbol = rle_symbols[i] & kSymbolMask; const uint32_t extra_bits_val = rle_symbols[i] >> SYMBOL_BITS; BrotliWriteBits(depths[rle_symbol], bits[rle_symbol], storage_ix, storage); if (rle_symbol > 0 && rle_symbol <= max_run_length_prefix) { BrotliWriteBits(rle_symbol, extra_bits_val, storage_ix, storage); } } BrotliWriteBits(1, 1, storage_ix, storage); /* use move-to-front */ BROTLI_FREE(m, rle_symbols); } /* Stores the block switch command with index block_ix to the bit stream. */ static BROTLI_INLINE void StoreBlockSwitch(BlockSplitCode* code, const uint32_t block_len, const uint8_t block_type, BROTLI_BOOL is_first_block, size_t* storage_ix, uint8_t* storage) { size_t typecode = NextBlockTypeCode(&code->type_code_calculator, block_type); size_t lencode; uint32_t len_nextra; uint32_t len_extra; if (!is_first_block) { BrotliWriteBits(code->type_depths[typecode], code->type_bits[typecode], storage_ix, storage); } GetBlockLengthPrefixCode(block_len, &lencode, &len_nextra, &len_extra); BrotliWriteBits(code->length_depths[lencode], code->length_bits[lencode], storage_ix, storage); BrotliWriteBits(len_nextra, len_extra, storage_ix, storage); } /* Builds a BlockSplitCode data structure from the block split given by the vector of block types and block lengths and stores it to the bit stream. */ static void BuildAndStoreBlockSplitCode(const uint8_t* types, const uint32_t* lengths, const size_t num_blocks, const size_t num_types, HuffmanTree* tree, BlockSplitCode* code, size_t* storage_ix, uint8_t* storage) { uint32_t type_histo[BROTLI_MAX_BLOCK_TYPE_SYMBOLS]; uint32_t length_histo[BROTLI_NUM_BLOCK_LEN_SYMBOLS]; size_t i; BlockTypeCodeCalculator type_code_calculator; memset(type_histo, 0, (num_types + 2) * sizeof(type_histo[0])); memset(length_histo, 0, sizeof(length_histo)); InitBlockTypeCodeCalculator(&type_code_calculator); for (i = 0; i < num_blocks; ++i) { size_t type_code = NextBlockTypeCode(&type_code_calculator, types[i]); if (i != 0) ++type_histo[type_code]; ++length_histo[BlockLengthPrefixCode(lengths[i])]; } StoreVarLenUint8(num_types - 1, storage_ix, storage); if (num_types > 1) { /* TODO: else? could StoreBlockSwitch occur? */ BuildAndStoreHuffmanTree(&type_histo[0], num_types + 2, num_types + 2, tree, &code->type_depths[0], &code->type_bits[0], storage_ix, storage); BuildAndStoreHuffmanTree(&length_histo[0], BROTLI_NUM_BLOCK_LEN_SYMBOLS, BROTLI_NUM_BLOCK_LEN_SYMBOLS, tree, &code->length_depths[0], &code->length_bits[0], storage_ix, storage); StoreBlockSwitch(code, lengths[0], types[0], 1, storage_ix, storage); } } /* Stores a context map where the histogram type is always the block type. */ static void StoreTrivialContextMap(size_t num_types, size_t context_bits, HuffmanTree* tree, size_t* storage_ix, uint8_t* storage) { StoreVarLenUint8(num_types - 1, storage_ix, storage); if (num_types > 1) { size_t repeat_code = context_bits - 1u; size_t repeat_bits = (1u << repeat_code) - 1u; size_t alphabet_size = num_types + repeat_code; uint32_t histogram[BROTLI_MAX_CONTEXT_MAP_SYMBOLS]; uint8_t depths[BROTLI_MAX_CONTEXT_MAP_SYMBOLS]; uint16_t bits[BROTLI_MAX_CONTEXT_MAP_SYMBOLS]; size_t i; memset(histogram, 0, alphabet_size * sizeof(histogram[0])); /* Write RLEMAX. */ BrotliWriteBits(1, 1, storage_ix, storage); BrotliWriteBits(4, repeat_code - 1, storage_ix, storage); histogram[repeat_code] = (uint32_t)num_types; histogram[0] = 1; for (i = context_bits; i < alphabet_size; ++i) { histogram[i] = 1; } BuildAndStoreHuffmanTree(histogram, alphabet_size, alphabet_size, tree, depths, bits, storage_ix, storage); for (i = 0; i < num_types; ++i) { size_t code = (i == 0 ? 0 : i + context_bits - 1); BrotliWriteBits(depths[code], bits[code], storage_ix, storage); BrotliWriteBits( depths[repeat_code], bits[repeat_code], storage_ix, storage); BrotliWriteBits(repeat_code, repeat_bits, storage_ix, storage); } /* Write IMTF (inverse-move-to-front) bit. */ BrotliWriteBits(1, 1, storage_ix, storage); } } /* Manages the encoding of one block category (literal, command or distance). */ typedef struct BlockEncoder { size_t histogram_length_; size_t num_block_types_; const uint8_t* block_types_; /* Not owned. */ const uint32_t* block_lengths_; /* Not owned. */ size_t num_blocks_; BlockSplitCode block_split_code_; size_t block_ix_; size_t block_len_; size_t entropy_ix_; uint8_t* depths_; uint16_t* bits_; } BlockEncoder; static void InitBlockEncoder(BlockEncoder* self, size_t histogram_length, size_t num_block_types, const uint8_t* block_types, const uint32_t* block_lengths, const size_t num_blocks) { self->histogram_length_ = histogram_length; self->num_block_types_ = num_block_types; self->block_types_ = block_types; self->block_lengths_ = block_lengths; self->num_blocks_ = num_blocks; InitBlockTypeCodeCalculator(&self->block_split_code_.type_code_calculator); self->block_ix_ = 0; self->block_len_ = num_blocks == 0 ? 0 : block_lengths[0]; self->entropy_ix_ = 0; self->depths_ = 0; self->bits_ = 0; } static void CleanupBlockEncoder(MemoryManager* m, BlockEncoder* self) { BROTLI_FREE(m, self->depths_); BROTLI_FREE(m, self->bits_); } /* Creates entropy codes of block lengths and block types and stores them to the bit stream. */ static void BuildAndStoreBlockSwitchEntropyCodes(BlockEncoder* self, HuffmanTree* tree, size_t* storage_ix, uint8_t* storage) { BuildAndStoreBlockSplitCode(self->block_types_, self->block_lengths_, self->num_blocks_, self->num_block_types_, tree, &self->block_split_code_, storage_ix, storage); } /* Stores the next symbol with the entropy code of the current block type. Updates the block type and block length at block boundaries. */ static void StoreSymbol(BlockEncoder* self, size_t symbol, size_t* storage_ix, uint8_t* storage) { if (self->block_len_ == 0) { size_t block_ix = ++self->block_ix_; uint32_t block_len = self->block_lengths_[block_ix]; uint8_t block_type = self->block_types_[block_ix]; self->block_len_ = block_len; self->entropy_ix_ = block_type * self->histogram_length_; StoreBlockSwitch(&self->block_split_code_, block_len, block_type, 0, storage_ix, storage); } --self->block_len_; { size_t ix = self->entropy_ix_ + symbol; BrotliWriteBits(self->depths_[ix], self->bits_[ix], storage_ix, storage); } } /* Stores the next symbol with the entropy code of the current block type and context value. Updates the block type and block length at block boundaries. */ static void StoreSymbolWithContext(BlockEncoder* self, size_t symbol, size_t context, const uint32_t* context_map, size_t* storage_ix, uint8_t* storage, const size_t context_bits) { if (self->block_len_ == 0) { size_t block_ix = ++self->block_ix_; uint32_t block_len = self->block_lengths_[block_ix]; uint8_t block_type = self->block_types_[block_ix]; self->block_len_ = block_len; self->entropy_ix_ = (size_t)block_type << context_bits; StoreBlockSwitch(&self->block_split_code_, block_len, block_type, 0, storage_ix, storage); } --self->block_len_; { size_t histo_ix = context_map[self->entropy_ix_ + context]; size_t ix = histo_ix * self->histogram_length_ + symbol; BrotliWriteBits(self->depths_[ix], self->bits_[ix], storage_ix, storage); } } #define FN(X) X ## Literal /* NOLINTNEXTLINE(build/include) */ #include "./block_encoder_inc.h" #undef FN #define FN(X) X ## Command /* NOLINTNEXTLINE(build/include) */ #include "./block_encoder_inc.h" #undef FN #define FN(X) X ## Distance /* NOLINTNEXTLINE(build/include) */ #include "./block_encoder_inc.h" #undef FN static void JumpToByteBoundary(size_t* storage_ix, uint8_t* storage) { *storage_ix = (*storage_ix + 7u) & ~7u; storage[*storage_ix >> 3] = 0; } void BrotliStoreMetaBlock(MemoryManager* m, const uint8_t* input, size_t start_pos, size_t length, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, BROTLI_BOOL is_last, const BrotliEncoderParams* params, ContextType literal_context_mode, const Command* commands, size_t n_commands, const MetaBlockSplit* mb, size_t* storage_ix, uint8_t* storage) { size_t pos = start_pos; size_t i; uint32_t num_distance_symbols = params->dist.alphabet_size; uint32_t num_effective_distance_symbols = num_distance_symbols; HuffmanTree* tree; ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode); BlockEncoder literal_enc; BlockEncoder command_enc; BlockEncoder distance_enc; const BrotliDistanceParams* dist = ¶ms->dist; if (params->large_window && num_effective_distance_symbols > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS) { num_effective_distance_symbols = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS; } StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage); tree = BROTLI_ALLOC(m, HuffmanTree, MAX_HUFFMAN_TREE_SIZE); if (BROTLI_IS_OOM(m)) return; InitBlockEncoder(&literal_enc, BROTLI_NUM_LITERAL_SYMBOLS, mb->literal_split.num_types, mb->literal_split.types, mb->literal_split.lengths, mb->literal_split.num_blocks); InitBlockEncoder(&command_enc, BROTLI_NUM_COMMAND_SYMBOLS, mb->command_split.num_types, mb->command_split.types, mb->command_split.lengths, mb->command_split.num_blocks); InitBlockEncoder(&distance_enc, num_effective_distance_symbols, mb->distance_split.num_types, mb->distance_split.types, mb->distance_split.lengths, mb->distance_split.num_blocks); BuildAndStoreBlockSwitchEntropyCodes(&literal_enc, tree, storage_ix, storage); BuildAndStoreBlockSwitchEntropyCodes(&command_enc, tree, storage_ix, storage); BuildAndStoreBlockSwitchEntropyCodes( &distance_enc, tree, storage_ix, storage); BrotliWriteBits(2, dist->distance_postfix_bits, storage_ix, storage); BrotliWriteBits( 4, dist->num_direct_distance_codes >> dist->distance_postfix_bits, storage_ix, storage); for (i = 0; i < mb->literal_split.num_types; ++i) { BrotliWriteBits(2, literal_context_mode, storage_ix, storage); } if (mb->literal_context_map_size == 0) { StoreTrivialContextMap(mb->literal_histograms_size, BROTLI_LITERAL_CONTEXT_BITS, tree, storage_ix, storage); } else { EncodeContextMap(m, mb->literal_context_map, mb->literal_context_map_size, mb->literal_histograms_size, tree, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; } if (mb->distance_context_map_size == 0) { StoreTrivialContextMap(mb->distance_histograms_size, BROTLI_DISTANCE_CONTEXT_BITS, tree, storage_ix, storage); } else { EncodeContextMap(m, mb->distance_context_map, mb->distance_context_map_size, mb->distance_histograms_size, tree, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; } BuildAndStoreEntropyCodesLiteral(m, &literal_enc, mb->literal_histograms, mb->literal_histograms_size, BROTLI_NUM_LITERAL_SYMBOLS, tree, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; BuildAndStoreEntropyCodesCommand(m, &command_enc, mb->command_histograms, mb->command_histograms_size, BROTLI_NUM_COMMAND_SYMBOLS, tree, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; BuildAndStoreEntropyCodesDistance(m, &distance_enc, mb->distance_histograms, mb->distance_histograms_size, num_distance_symbols, tree, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, tree); for (i = 0; i < n_commands; ++i) { const Command cmd = commands[i]; size_t cmd_code = cmd.cmd_prefix_; StoreSymbol(&command_enc, cmd_code, storage_ix, storage); StoreCommandExtra(&cmd, storage_ix, storage); if (mb->literal_context_map_size == 0) { size_t j; for (j = cmd.insert_len_; j != 0; --j) { StoreSymbol(&literal_enc, input[pos & mask], storage_ix, storage); ++pos; } } else { size_t j; for (j = cmd.insert_len_; j != 0; --j) { size_t context = BROTLI_CONTEXT(prev_byte, prev_byte2, literal_context_lut); uint8_t literal = input[pos & mask]; StoreSymbolWithContext(&literal_enc, literal, context, mb->literal_context_map, storage_ix, storage, BROTLI_LITERAL_CONTEXT_BITS); prev_byte2 = prev_byte; prev_byte = literal; ++pos; } } pos += CommandCopyLen(&cmd); if (CommandCopyLen(&cmd)) { prev_byte2 = input[(pos - 2) & mask]; prev_byte = input[(pos - 1) & mask]; if (cmd.cmd_prefix_ >= 128) { size_t dist_code = cmd.dist_prefix_ & 0x3FF; uint32_t distnumextra = cmd.dist_prefix_ >> 10; uint64_t distextra = cmd.dist_extra_; if (mb->distance_context_map_size == 0) { StoreSymbol(&distance_enc, dist_code, storage_ix, storage); } else { size_t context = CommandDistanceContext(&cmd); StoreSymbolWithContext(&distance_enc, dist_code, context, mb->distance_context_map, storage_ix, storage, BROTLI_DISTANCE_CONTEXT_BITS); } BrotliWriteBits(distnumextra, distextra, storage_ix, storage); } } } CleanupBlockEncoder(m, &distance_enc); CleanupBlockEncoder(m, &command_enc); CleanupBlockEncoder(m, &literal_enc); if (is_last) { JumpToByteBoundary(storage_ix, storage); } } static void BuildHistograms(const uint8_t* input, size_t start_pos, size_t mask, const Command* commands, size_t n_commands, HistogramLiteral* lit_histo, HistogramCommand* cmd_histo, HistogramDistance* dist_histo) { size_t pos = start_pos; size_t i; for (i = 0; i < n_commands; ++i) { const Command cmd = commands[i]; size_t j; HistogramAddCommand(cmd_histo, cmd.cmd_prefix_); for (j = cmd.insert_len_; j != 0; --j) { HistogramAddLiteral(lit_histo, input[pos & mask]); ++pos; } pos += CommandCopyLen(&cmd); if (CommandCopyLen(&cmd) && cmd.cmd_prefix_ >= 128) { HistogramAddDistance(dist_histo, cmd.dist_prefix_ & 0x3FF); } } } static void StoreDataWithHuffmanCodes(const uint8_t* input, size_t start_pos, size_t mask, const Command* commands, size_t n_commands, const uint8_t* lit_depth, const uint16_t* lit_bits, const uint8_t* cmd_depth, const uint16_t* cmd_bits, const uint8_t* dist_depth, const uint16_t* dist_bits, size_t* storage_ix, uint8_t* storage) { size_t pos = start_pos; size_t i; for (i = 0; i < n_commands; ++i) { const Command cmd = commands[i]; const size_t cmd_code = cmd.cmd_prefix_; size_t j; BrotliWriteBits( cmd_depth[cmd_code], cmd_bits[cmd_code], storage_ix, storage); StoreCommandExtra(&cmd, storage_ix, storage); for (j = cmd.insert_len_; j != 0; --j) { const uint8_t literal = input[pos & mask]; BrotliWriteBits( lit_depth[literal], lit_bits[literal], storage_ix, storage); ++pos; } pos += CommandCopyLen(&cmd); if (CommandCopyLen(&cmd) && cmd.cmd_prefix_ >= 128) { const size_t dist_code = cmd.dist_prefix_ & 0x3FF; const uint32_t distnumextra = cmd.dist_prefix_ >> 10; const uint32_t distextra = cmd.dist_extra_; BrotliWriteBits(dist_depth[dist_code], dist_bits[dist_code], storage_ix, storage); BrotliWriteBits(distnumextra, distextra, storage_ix, storage); } } } void BrotliStoreMetaBlockTrivial(MemoryManager* m, const uint8_t* input, size_t start_pos, size_t length, size_t mask, BROTLI_BOOL is_last, const BrotliEncoderParams* params, const Command* commands, size_t n_commands, size_t* storage_ix, uint8_t* storage) { HistogramLiteral lit_histo; HistogramCommand cmd_histo; HistogramDistance dist_histo; uint8_t lit_depth[BROTLI_NUM_LITERAL_SYMBOLS]; uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS]; uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS]; uint16_t cmd_bits[BROTLI_NUM_COMMAND_SYMBOLS]; uint8_t dist_depth[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; uint16_t dist_bits[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; HuffmanTree* tree; uint32_t num_distance_symbols = params->dist.alphabet_size; StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage); HistogramClearLiteral(&lit_histo); HistogramClearCommand(&cmd_histo); HistogramClearDistance(&dist_histo); BuildHistograms(input, start_pos, mask, commands, n_commands, &lit_histo, &cmd_histo, &dist_histo); BrotliWriteBits(13, 0, storage_ix, storage); tree = BROTLI_ALLOC(m, HuffmanTree, MAX_HUFFMAN_TREE_SIZE); if (BROTLI_IS_OOM(m)) return; BuildAndStoreHuffmanTree(lit_histo.data_, BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_NUM_LITERAL_SYMBOLS, tree, lit_depth, lit_bits, storage_ix, storage); BuildAndStoreHuffmanTree(cmd_histo.data_, BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_NUM_COMMAND_SYMBOLS, tree, cmd_depth, cmd_bits, storage_ix, storage); BuildAndStoreHuffmanTree(dist_histo.data_, MAX_SIMPLE_DISTANCE_ALPHABET_SIZE, num_distance_symbols, tree, dist_depth, dist_bits, storage_ix, storage); BROTLI_FREE(m, tree); StoreDataWithHuffmanCodes(input, start_pos, mask, commands, n_commands, lit_depth, lit_bits, cmd_depth, cmd_bits, dist_depth, dist_bits, storage_ix, storage); if (is_last) { JumpToByteBoundary(storage_ix, storage); } } void BrotliStoreMetaBlockFast(MemoryManager* m, const uint8_t* input, size_t start_pos, size_t length, size_t mask, BROTLI_BOOL is_last, const BrotliEncoderParams* params, const Command* commands, size_t n_commands, size_t* storage_ix, uint8_t* storage) { uint32_t num_distance_symbols = params->dist.alphabet_size; uint32_t distance_alphabet_bits = Log2FloorNonZero(num_distance_symbols - 1) + 1; StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage); BrotliWriteBits(13, 0, storage_ix, storage); if (n_commands <= 128) { uint32_t histogram[BROTLI_NUM_LITERAL_SYMBOLS] = { 0 }; size_t pos = start_pos; size_t num_literals = 0; size_t i; uint8_t lit_depth[BROTLI_NUM_LITERAL_SYMBOLS]; uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS]; for (i = 0; i < n_commands; ++i) { const Command cmd = commands[i]; size_t j; for (j = cmd.insert_len_; j != 0; --j) { ++histogram[input[pos & mask]]; ++pos; } num_literals += cmd.insert_len_; pos += CommandCopyLen(&cmd); } BrotliBuildAndStoreHuffmanTreeFast(m, histogram, num_literals, /* max_bits = */ 8, lit_depth, lit_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; StoreStaticCommandHuffmanTree(storage_ix, storage); StoreStaticDistanceHuffmanTree(storage_ix, storage); StoreDataWithHuffmanCodes(input, start_pos, mask, commands, n_commands, lit_depth, lit_bits, kStaticCommandCodeDepth, kStaticCommandCodeBits, kStaticDistanceCodeDepth, kStaticDistanceCodeBits, storage_ix, storage); } else { HistogramLiteral lit_histo; HistogramCommand cmd_histo; HistogramDistance dist_histo; uint8_t lit_depth[BROTLI_NUM_LITERAL_SYMBOLS]; uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS]; uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS]; uint16_t cmd_bits[BROTLI_NUM_COMMAND_SYMBOLS]; uint8_t dist_depth[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; uint16_t dist_bits[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE]; HistogramClearLiteral(&lit_histo); HistogramClearCommand(&cmd_histo); HistogramClearDistance(&dist_histo); BuildHistograms(input, start_pos, mask, commands, n_commands, &lit_histo, &cmd_histo, &dist_histo); BrotliBuildAndStoreHuffmanTreeFast(m, lit_histo.data_, lit_histo.total_count_, /* max_bits = */ 8, lit_depth, lit_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; BrotliBuildAndStoreHuffmanTreeFast(m, cmd_histo.data_, cmd_histo.total_count_, /* max_bits = */ 10, cmd_depth, cmd_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; BrotliBuildAndStoreHuffmanTreeFast(m, dist_histo.data_, dist_histo.total_count_, /* max_bits = */ distance_alphabet_bits, dist_depth, dist_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; StoreDataWithHuffmanCodes(input, start_pos, mask, commands, n_commands, lit_depth, lit_bits, cmd_depth, cmd_bits, dist_depth, dist_bits, storage_ix, storage); } if (is_last) { JumpToByteBoundary(storage_ix, storage); } } /* This is for storing uncompressed blocks (simple raw storage of bytes-as-bytes). */ void BrotliStoreUncompressedMetaBlock(BROTLI_BOOL is_final_block, const uint8_t* BROTLI_RESTRICT input, size_t position, size_t mask, size_t len, size_t* BROTLI_RESTRICT storage_ix, uint8_t* BROTLI_RESTRICT storage) { size_t masked_pos = position & mask; BrotliStoreUncompressedMetaBlockHeader(len, storage_ix, storage); JumpToByteBoundary(storage_ix, storage); if (masked_pos + len > mask + 1) { size_t len1 = mask + 1 - masked_pos; memcpy(&storage[*storage_ix >> 3], &input[masked_pos], len1); *storage_ix += len1 << 3; len -= len1; masked_pos = 0; } memcpy(&storage[*storage_ix >> 3], &input[masked_pos], len); *storage_ix += len << 3; /* We need to clear the next 4 bytes to continue to be compatible with BrotliWriteBits. */ BrotliWriteBitsPrepareStorage(*storage_ix, storage); /* Since the uncompressed block itself may not be the final block, add an empty one after this. */ if (is_final_block) { BrotliWriteBits(1, 1, storage_ix, storage); /* islast */ BrotliWriteBits(1, 1, storage_ix, storage); /* isempty */ JumpToByteBoundary(storage_ix, storage); } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/literal_cost.h0000664000175000017500000000157413510660062015760 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Literal cost model to allow backward reference replacement to be efficient. */ #ifndef BROTLI_ENC_LITERAL_COST_H_ #define BROTLI_ENC_LITERAL_COST_H_ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Estimates how many bits the literals in the interval [pos, pos + len) in the ring-buffer (data, mask) will take entropy coded and writes these estimates to the cost[0..len) array. */ BROTLI_INTERNAL void BrotliEstimateBitCostsForLiterals( size_t pos, size_t len, size_t mask, const uint8_t* data, float* cost); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_LITERAL_COST_H_ */ dvisvgm-2.8.1/libs/brotli/enc/encode.c0000664000175000017500000021342413510660062014523 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Implementation of Brotli compressor. */ #include #include /* free, malloc */ #include /* memcpy, memset */ #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" #include "../common/version.h" #include "./backward_references.h" #include "./backward_references_hq.h" #include "./bit_cost.h" #include "./brotli_bit_stream.h" #include "./compress_fragment.h" #include "./compress_fragment_two_pass.h" #include "./encoder_dict.h" #include "./entropy_encode.h" #include "./fast_log.h" #include "./hash.h" #include "./histogram.h" #include "./memory.h" #include "./metablock.h" #include "./prefix.h" #include "./quality.h" #include "./ringbuffer.h" #include "./utf8_util.h" #include "./write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define COPY_ARRAY(dst, src) memcpy(dst, src, sizeof(src)); typedef enum BrotliEncoderStreamState { /* Default state. */ BROTLI_STREAM_PROCESSING = 0, /* Intermediate state; after next block is emitted, byte-padding should be performed before getting back to default state. */ BROTLI_STREAM_FLUSH_REQUESTED = 1, /* Last metablock was produced; no more input is acceptable. */ BROTLI_STREAM_FINISHED = 2, /* Flushing compressed block and writing meta-data block header. */ BROTLI_STREAM_METADATA_HEAD = 3, /* Writing metadata block body. */ BROTLI_STREAM_METADATA_BODY = 4 } BrotliEncoderStreamState; typedef struct BrotliEncoderStateStruct { BrotliEncoderParams params; MemoryManager memory_manager_; HasherHandle hasher_; uint64_t input_pos_; RingBuffer ringbuffer_; size_t cmd_alloc_size_; Command* commands_; size_t num_commands_; size_t num_literals_; size_t last_insert_len_; uint64_t last_flush_pos_; uint64_t last_processed_pos_; int dist_cache_[BROTLI_NUM_DISTANCE_SHORT_CODES]; int saved_dist_cache_[4]; uint16_t last_bytes_; uint8_t last_bytes_bits_; uint8_t prev_byte_; uint8_t prev_byte2_; size_t storage_size_; uint8_t* storage_; /* Hash table for FAST_ONE_PASS_COMPRESSION_QUALITY mode. */ int small_table_[1 << 10]; /* 4KiB */ int* large_table_; /* Allocated only when needed */ size_t large_table_size_; /* Command and distance prefix codes (each 64 symbols, stored back-to-back) used for the next block in FAST_ONE_PASS_COMPRESSION_QUALITY. The command prefix code is over a smaller alphabet with the following 64 symbols: 0 - 15: insert length code 0, copy length code 0 - 15, same distance 16 - 39: insert length code 0, copy length code 0 - 23 40 - 63: insert length code 0 - 23, copy length code 0 Note that symbols 16 and 40 represent the same code in the full alphabet, but we do not use either of them in FAST_ONE_PASS_COMPRESSION_QUALITY. */ uint8_t cmd_depths_[128]; uint16_t cmd_bits_[128]; /* The compressed form of the command and distance prefix codes for the next block in FAST_ONE_PASS_COMPRESSION_QUALITY. */ uint8_t cmd_code_[512]; size_t cmd_code_numbits_; /* Command and literal buffers for FAST_TWO_PASS_COMPRESSION_QUALITY. */ uint32_t* command_buf_; uint8_t* literal_buf_; uint8_t* next_out_; size_t available_out_; size_t total_out_; /* Temporary buffer for padding flush bits or metadata block header / body. */ union { uint64_t u64[2]; uint8_t u8[16]; } tiny_buf_; uint32_t remaining_metadata_bytes_; BrotliEncoderStreamState stream_state_; BROTLI_BOOL is_last_block_emitted_; BROTLI_BOOL is_initialized_; } BrotliEncoderStateStruct; static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s); static size_t InputBlockSize(BrotliEncoderState* s) { return (size_t)1 << s->params.lgblock; } static uint64_t UnprocessedInputSize(BrotliEncoderState* s) { return s->input_pos_ - s->last_processed_pos_; } static size_t RemainingInputBlockSize(BrotliEncoderState* s) { const uint64_t delta = UnprocessedInputSize(s); size_t block_size = InputBlockSize(s); if (delta >= block_size) return 0; return block_size - (size_t)delta; } BROTLI_BOOL BrotliEncoderSetParameter( BrotliEncoderState* state, BrotliEncoderParameter p, uint32_t value) { /* Changing parameters on the fly is not implemented yet. */ if (state->is_initialized_) return BROTLI_FALSE; /* TODO: Validate/clamp parameters here. */ switch (p) { case BROTLI_PARAM_MODE: state->params.mode = (BrotliEncoderMode)value; return BROTLI_TRUE; case BROTLI_PARAM_QUALITY: state->params.quality = (int)value; return BROTLI_TRUE; case BROTLI_PARAM_LGWIN: state->params.lgwin = (int)value; return BROTLI_TRUE; case BROTLI_PARAM_LGBLOCK: state->params.lgblock = (int)value; return BROTLI_TRUE; case BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: if ((value != 0) && (value != 1)) return BROTLI_FALSE; state->params.disable_literal_context_modeling = TO_BROTLI_BOOL(!!value); return BROTLI_TRUE; case BROTLI_PARAM_SIZE_HINT: state->params.size_hint = value; return BROTLI_TRUE; case BROTLI_PARAM_LARGE_WINDOW: state->params.large_window = TO_BROTLI_BOOL(!!value); return BROTLI_TRUE; case BROTLI_PARAM_NPOSTFIX: state->params.dist.distance_postfix_bits = value; return BROTLI_TRUE; case BROTLI_PARAM_NDIRECT: state->params.dist.num_direct_distance_codes = value; return BROTLI_TRUE; default: return BROTLI_FALSE; } } /* Wraps 64-bit input position to 32-bit ring-buffer position preserving "not-a-first-lap" feature. */ static uint32_t WrapPosition(uint64_t position) { uint32_t result = (uint32_t)position; uint64_t gb = position >> 30; if (gb > 2) { /* Wrap every 2GiB; The first 3GB are continuous. */ result = (result & ((1u << 30) - 1)) | ((uint32_t)((gb - 1) & 1) + 1) << 30; } return result; } static uint8_t* GetBrotliStorage(BrotliEncoderState* s, size_t size) { MemoryManager* m = &s->memory_manager_; if (s->storage_size_ < size) { BROTLI_FREE(m, s->storage_); s->storage_ = BROTLI_ALLOC(m, uint8_t, size); if (BROTLI_IS_OOM(m)) return NULL; s->storage_size_ = size; } return s->storage_; } static size_t HashTableSize(size_t max_table_size, size_t input_size) { size_t htsize = 256; while (htsize < max_table_size && htsize < input_size) { htsize <<= 1; } return htsize; } static int* GetHashTable(BrotliEncoderState* s, int quality, size_t input_size, size_t* table_size) { /* Use smaller hash table when input.size() is smaller, since we fill the table, incurring O(hash table size) overhead for compression, and if the input is short, we won't need that many hash table entries anyway. */ MemoryManager* m = &s->memory_manager_; const size_t max_table_size = MaxHashTableSize(quality); size_t htsize = HashTableSize(max_table_size, input_size); int* table; BROTLI_DCHECK(max_table_size >= 256); if (quality == FAST_ONE_PASS_COMPRESSION_QUALITY) { /* Only odd shifts are supported by fast-one-pass. */ if ((htsize & 0xAAAAA) == 0) { htsize <<= 1; } } if (htsize <= sizeof(s->small_table_) / sizeof(s->small_table_[0])) { table = s->small_table_; } else { if (htsize > s->large_table_size_) { s->large_table_size_ = htsize; BROTLI_FREE(m, s->large_table_); s->large_table_ = BROTLI_ALLOC(m, int, htsize); if (BROTLI_IS_OOM(m)) return 0; } table = s->large_table_; } *table_size = htsize; memset(table, 0, htsize * sizeof(*table)); return table; } static void EncodeWindowBits(int lgwin, BROTLI_BOOL large_window, uint16_t* last_bytes, uint8_t* last_bytes_bits) { if (large_window) { *last_bytes = (uint16_t)(((lgwin & 0x3F) << 8) | 0x11); *last_bytes_bits = 14; } else { if (lgwin == 16) { *last_bytes = 0; *last_bytes_bits = 1; } else if (lgwin == 17) { *last_bytes = 1; *last_bytes_bits = 7; } else if (lgwin > 17) { *last_bytes = (uint16_t)(((lgwin - 17) << 1) | 0x01); *last_bytes_bits = 4; } else { *last_bytes = (uint16_t)(((lgwin - 8) << 4) | 0x01); *last_bytes_bits = 7; } } } /* Initializes the command and distance prefix codes for the first block. */ static void InitCommandPrefixCodes(uint8_t cmd_depths[128], uint16_t cmd_bits[128], uint8_t cmd_code[512], size_t* cmd_code_numbits) { static const uint8_t kDefaultCommandDepths[128] = { 0, 4, 4, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 0, 0, 0, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 0, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 7, 8, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, }; static const uint16_t kDefaultCommandBits[128] = { 0, 0, 8, 9, 3, 35, 7, 71, 39, 103, 23, 47, 175, 111, 239, 31, 0, 0, 0, 4, 12, 2, 10, 6, 13, 29, 11, 43, 27, 59, 87, 55, 15, 79, 319, 831, 191, 703, 447, 959, 0, 14, 1, 25, 5, 21, 19, 51, 119, 159, 95, 223, 479, 991, 63, 575, 127, 639, 383, 895, 255, 767, 511, 1023, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 59, 7, 39, 23, 55, 30, 1, 17, 9, 25, 5, 0, 8, 4, 12, 2, 10, 6, 21, 13, 29, 3, 19, 11, 15, 47, 31, 95, 63, 127, 255, 767, 2815, 1791, 3839, 511, 2559, 1535, 3583, 1023, 3071, 2047, 4095, }; static const uint8_t kDefaultCommandCode[] = { 0xff, 0x77, 0xd5, 0xbf, 0xe7, 0xde, 0xea, 0x9e, 0x51, 0x5d, 0xde, 0xc6, 0x70, 0x57, 0xbc, 0x58, 0x58, 0x58, 0xd8, 0xd8, 0x58, 0xd5, 0xcb, 0x8c, 0xea, 0xe0, 0xc3, 0x87, 0x1f, 0x83, 0xc1, 0x60, 0x1c, 0x67, 0xb2, 0xaa, 0x06, 0x83, 0xc1, 0x60, 0x30, 0x18, 0xcc, 0xa1, 0xce, 0x88, 0x54, 0x94, 0x46, 0xe1, 0xb0, 0xd0, 0x4e, 0xb2, 0xf7, 0x04, 0x00, }; static const size_t kDefaultCommandCodeNumBits = 448; COPY_ARRAY(cmd_depths, kDefaultCommandDepths); COPY_ARRAY(cmd_bits, kDefaultCommandBits); /* Initialize the pre-compressed form of the command and distance prefix codes. */ COPY_ARRAY(cmd_code, kDefaultCommandCode); *cmd_code_numbits = kDefaultCommandCodeNumBits; } /* Decide about the context map based on the ability of the prediction ability of the previous byte UTF8-prefix on the next byte. The prediction ability is calculated as Shannon entropy. Here we need Shannon entropy instead of 'BitsEntropy' since the prefix will be encoded with the remaining 6 bits of the following byte, and BitsEntropy will assume that symbol to be stored alone using Huffman coding. */ static void ChooseContextMap(int quality, uint32_t* bigram_histo, size_t* num_literal_contexts, const uint32_t** literal_context_map) { static const uint32_t kStaticContextMapContinuation[64] = { 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const uint32_t kStaticContextMapSimpleUTF8[64] = { 0, 0, 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, }; uint32_t monogram_histo[3] = { 0 }; uint32_t two_prefix_histo[6] = { 0 }; size_t total; size_t i; size_t dummy; double entropy[4]; for (i = 0; i < 9; ++i) { monogram_histo[i % 3] += bigram_histo[i]; two_prefix_histo[i % 6] += bigram_histo[i]; } entropy[1] = ShannonEntropy(monogram_histo, 3, &dummy); entropy[2] = (ShannonEntropy(two_prefix_histo, 3, &dummy) + ShannonEntropy(two_prefix_histo + 3, 3, &dummy)); entropy[3] = 0; for (i = 0; i < 3; ++i) { entropy[3] += ShannonEntropy(bigram_histo + 3 * i, 3, &dummy); } total = monogram_histo[0] + monogram_histo[1] + monogram_histo[2]; BROTLI_DCHECK(total != 0); entropy[0] = 1.0 / (double)total; entropy[1] *= entropy[0]; entropy[2] *= entropy[0]; entropy[3] *= entropy[0]; if (quality < MIN_QUALITY_FOR_HQ_CONTEXT_MODELING) { /* 3 context models is a bit slower, don't use it at lower qualities. */ entropy[3] = entropy[1] * 10; } /* If expected savings by symbol are less than 0.2 bits, skip the context modeling -- in exchange for faster decoding speed. */ if (entropy[1] - entropy[2] < 0.2 && entropy[1] - entropy[3] < 0.2) { *num_literal_contexts = 1; } else if (entropy[2] - entropy[3] < 0.02) { *num_literal_contexts = 2; *literal_context_map = kStaticContextMapSimpleUTF8; } else { *num_literal_contexts = 3; *literal_context_map = kStaticContextMapContinuation; } } /* Decide if we want to use a more complex static context map containing 13 context values, based on the entropy reduction of histograms over the first 5 bits of literals. */ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input, size_t start_pos, size_t length, size_t mask, int quality, size_t size_hint, size_t* num_literal_contexts, const uint32_t** literal_context_map) { static const uint32_t kStaticContextMapComplexUTF8[64] = { 11, 11, 12, 12, /* 0 special */ 0, 0, 0, 0, /* 4 lf */ 1, 1, 9, 9, /* 8 space */ 2, 2, 2, 2, /* !, first after space/lf and after something else. */ 1, 1, 1, 1, /* " */ 8, 3, 3, 3, /* % */ 1, 1, 1, 1, /* ({[ */ 2, 2, 2, 2, /* }]) */ 8, 4, 4, 4, /* :; */ 8, 7, 4, 4, /* . */ 8, 0, 0, 0, /* > */ 3, 3, 3, 3, /* [0..9] */ 5, 5, 10, 5, /* [A-Z] */ 5, 5, 10, 5, 6, 6, 6, 6, /* [a-z] */ 6, 6, 6, 6, }; BROTLI_UNUSED(quality); /* Try the more complex static context map only for long data. */ if (size_hint < (1 << 20)) { return BROTLI_FALSE; } else { const size_t end_pos = start_pos + length; /* To make entropy calculations faster and to fit on the stack, we collect histograms over the 5 most significant bits of literals. One histogram without context and 13 additional histograms for each context value. */ uint32_t combined_histo[32] = { 0 }; uint32_t context_histo[13][32] = { { 0 } }; uint32_t total = 0; double entropy[3]; size_t dummy; size_t i; ContextLut utf8_lut = BROTLI_CONTEXT_LUT(CONTEXT_UTF8); for (; start_pos + 64 <= end_pos; start_pos += 4096) { const size_t stride_end_pos = start_pos + 64; uint8_t prev2 = input[start_pos & mask]; uint8_t prev1 = input[(start_pos + 1) & mask]; size_t pos; /* To make the analysis of the data faster we only examine 64 byte long strides at every 4kB intervals. */ for (pos = start_pos + 2; pos < stride_end_pos; ++pos) { const uint8_t literal = input[pos & mask]; const uint8_t context = (uint8_t)kStaticContextMapComplexUTF8[ BROTLI_CONTEXT(prev1, prev2, utf8_lut)]; ++total; ++combined_histo[literal >> 3]; ++context_histo[context][literal >> 3]; prev2 = prev1; prev1 = literal; } } entropy[1] = ShannonEntropy(combined_histo, 32, &dummy); entropy[2] = 0; for (i = 0; i < 13; ++i) { entropy[2] += ShannonEntropy(&context_histo[i][0], 32, &dummy); } entropy[0] = 1.0 / (double)total; entropy[1] *= entropy[0]; entropy[2] *= entropy[0]; /* The triggering heuristics below were tuned by compressing the individual files of the silesia corpus. If we skip this kind of context modeling for not very well compressible input (i.e. entropy using context modeling is 60% of maximal entropy) or if expected savings by symbol are less than 0.2 bits, then in every case when it triggers, the final compression ratio is improved. Note however that this heuristics might be too strict for some cases and could be tuned further. */ if (entropy[2] > 3.0 || entropy[1] - entropy[2] < 0.2) { return BROTLI_FALSE; } else { *num_literal_contexts = 13; *literal_context_map = kStaticContextMapComplexUTF8; return BROTLI_TRUE; } } } static void DecideOverLiteralContextModeling(const uint8_t* input, size_t start_pos, size_t length, size_t mask, int quality, size_t size_hint, size_t* num_literal_contexts, const uint32_t** literal_context_map) { if (quality < MIN_QUALITY_FOR_CONTEXT_MODELING || length < 64) { return; } else if (ShouldUseComplexStaticContextMap( input, start_pos, length, mask, quality, size_hint, num_literal_contexts, literal_context_map)) { /* Context map was already set, nothing else to do. */ } else { /* Gather bi-gram data of the UTF8 byte prefixes. To make the analysis of UTF8 data faster we only examine 64 byte long strides at every 4kB intervals. */ const size_t end_pos = start_pos + length; uint32_t bigram_prefix_histo[9] = { 0 }; for (; start_pos + 64 <= end_pos; start_pos += 4096) { static const int lut[4] = { 0, 0, 1, 2 }; const size_t stride_end_pos = start_pos + 64; int prev = lut[input[start_pos & mask] >> 6] * 3; size_t pos; for (pos = start_pos + 1; pos < stride_end_pos; ++pos) { const uint8_t literal = input[pos & mask]; ++bigram_prefix_histo[prev + lut[literal >> 6]]; prev = lut[literal >> 6] * 3; } } ChooseContextMap(quality, &bigram_prefix_histo[0], num_literal_contexts, literal_context_map); } } static BROTLI_BOOL ShouldCompress( const uint8_t* data, const size_t mask, const uint64_t last_flush_pos, const size_t bytes, const size_t num_literals, const size_t num_commands) { /* TODO: find more precise minimal block overhead. */ if (bytes <= 2) return BROTLI_FALSE; if (num_commands < (bytes >> 8) + 2) { if (num_literals > 0.99 * (double)bytes) { uint32_t literal_histo[256] = { 0 }; static const uint32_t kSampleRate = 13; static const double kMinEntropy = 7.92; const double bit_cost_threshold = (double)bytes * kMinEntropy / kSampleRate; size_t t = (bytes + kSampleRate - 1) / kSampleRate; uint32_t pos = (uint32_t)last_flush_pos; size_t i; for (i = 0; i < t; i++) { ++literal_histo[data[pos & mask]]; pos += kSampleRate; } if (BitsEntropy(literal_histo, 256) > bit_cost_threshold) { return BROTLI_FALSE; } } } return BROTLI_TRUE; } /* Chooses the literal context mode for a metablock */ static ContextType ChooseContextMode(const BrotliEncoderParams* params, const uint8_t* data, const size_t pos, const size_t mask, const size_t length) { /* We only do the computation for the option of something else than CONTEXT_UTF8 for the highest qualities */ if (params->quality >= MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING && !BrotliIsMostlyUTF8(data, pos, mask, length, kMinUTF8Ratio)) { return CONTEXT_SIGNED; } return CONTEXT_UTF8; } static void WriteMetaBlockInternal(MemoryManager* m, const uint8_t* data, const size_t mask, const uint64_t last_flush_pos, const size_t bytes, const BROTLI_BOOL is_last, ContextType literal_context_mode, const BrotliEncoderParams* params, const uint8_t prev_byte, const uint8_t prev_byte2, const size_t num_literals, const size_t num_commands, Command* commands, const int* saved_dist_cache, int* dist_cache, size_t* storage_ix, uint8_t* storage) { const uint32_t wrapped_last_flush_pos = WrapPosition(last_flush_pos); uint16_t last_bytes; uint8_t last_bytes_bits; ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode); BrotliEncoderParams block_params = *params; if (bytes == 0) { /* Write the ISLAST and ISEMPTY bits. */ BrotliWriteBits(2, 3, storage_ix, storage); *storage_ix = (*storage_ix + 7u) & ~7u; return; } if (!ShouldCompress(data, mask, last_flush_pos, bytes, num_literals, num_commands)) { /* Restore the distance cache, as its last update by CreateBackwardReferences is now unused. */ memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0])); BrotliStoreUncompressedMetaBlock(is_last, data, wrapped_last_flush_pos, mask, bytes, storage_ix, storage); return; } BROTLI_DCHECK(*storage_ix <= 14); last_bytes = (uint16_t)((storage[1] << 8) | storage[0]); last_bytes_bits = (uint8_t)(*storage_ix); if (params->quality <= MAX_QUALITY_FOR_STATIC_ENTROPY_CODES) { BrotliStoreMetaBlockFast(m, data, wrapped_last_flush_pos, bytes, mask, is_last, params, commands, num_commands, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; } else if (params->quality < MIN_QUALITY_FOR_BLOCK_SPLIT) { BrotliStoreMetaBlockTrivial(m, data, wrapped_last_flush_pos, bytes, mask, is_last, params, commands, num_commands, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; } else { MetaBlockSplit mb; InitMetaBlockSplit(&mb); if (params->quality < MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING) { size_t num_literal_contexts = 1; const uint32_t* literal_context_map = NULL; if (!params->disable_literal_context_modeling) { DecideOverLiteralContextModeling( data, wrapped_last_flush_pos, bytes, mask, params->quality, params->size_hint, &num_literal_contexts, &literal_context_map); } BrotliBuildMetaBlockGreedy(m, data, wrapped_last_flush_pos, mask, prev_byte, prev_byte2, literal_context_lut, num_literal_contexts, literal_context_map, commands, num_commands, &mb); if (BROTLI_IS_OOM(m)) return; } else { BrotliBuildMetaBlock(m, data, wrapped_last_flush_pos, mask, &block_params, prev_byte, prev_byte2, commands, num_commands, literal_context_mode, &mb); if (BROTLI_IS_OOM(m)) return; } if (params->quality >= MIN_QUALITY_FOR_OPTIMIZE_HISTOGRAMS) { /* The number of distance symbols effectively used for distance histograms. It might be less than distance alphabet size for "Large Window Brotli" (32-bit). */ uint32_t num_effective_dist_codes = block_params.dist.alphabet_size; if (num_effective_dist_codes > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS) { num_effective_dist_codes = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS; } BrotliOptimizeHistograms(num_effective_dist_codes, &mb); } BrotliStoreMetaBlock(m, data, wrapped_last_flush_pos, bytes, mask, prev_byte, prev_byte2, is_last, &block_params, literal_context_mode, commands, num_commands, &mb, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; DestroyMetaBlockSplit(m, &mb); } if (bytes + 4 < (*storage_ix >> 3)) { /* Restore the distance cache and last byte. */ memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0])); storage[0] = (uint8_t)last_bytes; storage[1] = (uint8_t)(last_bytes >> 8); *storage_ix = last_bytes_bits; BrotliStoreUncompressedMetaBlock(is_last, data, wrapped_last_flush_pos, mask, bytes, storage_ix, storage); } } static void ChooseDistanceParams(BrotliEncoderParams* params) { uint32_t distance_postfix_bits = 0; uint32_t num_direct_distance_codes = 0; if (params->quality >= MIN_QUALITY_FOR_NONZERO_DISTANCE_PARAMS) { uint32_t ndirect_msb; if (params->mode == BROTLI_MODE_FONT) { distance_postfix_bits = 1; num_direct_distance_codes = 12; } else { distance_postfix_bits = params->dist.distance_postfix_bits; num_direct_distance_codes = params->dist.num_direct_distance_codes; } ndirect_msb = (num_direct_distance_codes >> distance_postfix_bits) & 0x0F; if (distance_postfix_bits > BROTLI_MAX_NPOSTFIX || num_direct_distance_codes > BROTLI_MAX_NDIRECT || (ndirect_msb << distance_postfix_bits) != num_direct_distance_codes) { distance_postfix_bits = 0; num_direct_distance_codes = 0; } } BrotliInitDistanceParams( params, distance_postfix_bits, num_direct_distance_codes); } static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s) { if (BROTLI_IS_OOM(&s->memory_manager_)) return BROTLI_FALSE; if (s->is_initialized_) return BROTLI_TRUE; s->last_bytes_bits_ = 0; s->last_bytes_ = 0; s->remaining_metadata_bytes_ = BROTLI_UINT32_MAX; SanitizeParams(&s->params); s->params.lgblock = ComputeLgBlock(&s->params); ChooseDistanceParams(&s->params); RingBufferSetup(&s->params, &s->ringbuffer_); /* Initialize last byte with stream header. */ { int lgwin = s->params.lgwin; if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY || s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) { lgwin = BROTLI_MAX(int, lgwin, 18); } EncodeWindowBits(lgwin, s->params.large_window, &s->last_bytes_, &s->last_bytes_bits_); } if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) { InitCommandPrefixCodes(s->cmd_depths_, s->cmd_bits_, s->cmd_code_, &s->cmd_code_numbits_); } s->is_initialized_ = BROTLI_TRUE; return BROTLI_TRUE; } static void BrotliEncoderInitParams(BrotliEncoderParams* params) { params->mode = BROTLI_DEFAULT_MODE; params->large_window = BROTLI_FALSE; params->quality = BROTLI_DEFAULT_QUALITY; params->lgwin = BROTLI_DEFAULT_WINDOW; params->lgblock = 0; params->size_hint = 0; params->disable_literal_context_modeling = BROTLI_FALSE; BrotliInitEncoderDictionary(¶ms->dictionary); params->dist.distance_postfix_bits = 0; params->dist.num_direct_distance_codes = 0; params->dist.alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE(0, 0, BROTLI_MAX_DISTANCE_BITS); params->dist.max_distance = BROTLI_MAX_DISTANCE; } static void BrotliEncoderInitState(BrotliEncoderState* s) { BrotliEncoderInitParams(&s->params); s->input_pos_ = 0; s->num_commands_ = 0; s->num_literals_ = 0; s->last_insert_len_ = 0; s->last_flush_pos_ = 0; s->last_processed_pos_ = 0; s->prev_byte_ = 0; s->prev_byte2_ = 0; s->storage_size_ = 0; s->storage_ = 0; s->hasher_ = NULL; s->large_table_ = NULL; s->large_table_size_ = 0; s->cmd_code_numbits_ = 0; s->command_buf_ = NULL; s->literal_buf_ = NULL; s->next_out_ = NULL; s->available_out_ = 0; s->total_out_ = 0; s->stream_state_ = BROTLI_STREAM_PROCESSING; s->is_last_block_emitted_ = BROTLI_FALSE; s->is_initialized_ = BROTLI_FALSE; RingBufferInit(&s->ringbuffer_); s->commands_ = 0; s->cmd_alloc_size_ = 0; /* Initialize distance cache. */ s->dist_cache_[0] = 4; s->dist_cache_[1] = 11; s->dist_cache_[2] = 15; s->dist_cache_[3] = 16; /* Save the state of the distance cache in case we need to restore it for emitting an uncompressed block. */ memcpy(s->saved_dist_cache_, s->dist_cache_, sizeof(s->saved_dist_cache_)); } BrotliEncoderState* BrotliEncoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { BrotliEncoderState* state = 0; if (!alloc_func && !free_func) { state = (BrotliEncoderState*)malloc(sizeof(BrotliEncoderState)); } else if (alloc_func && free_func) { state = (BrotliEncoderState*)alloc_func(opaque, sizeof(BrotliEncoderState)); } if (state == 0) { /* BROTLI_DUMP(); */ return 0; } BrotliInitMemoryManager( &state->memory_manager_, alloc_func, free_func, opaque); BrotliEncoderInitState(state); return state; } static void BrotliEncoderCleanupState(BrotliEncoderState* s) { MemoryManager* m = &s->memory_manager_; if (BROTLI_IS_OOM(m)) { BrotliWipeOutMemoryManager(m); return; } BROTLI_FREE(m, s->storage_); BROTLI_FREE(m, s->commands_); RingBufferFree(m, &s->ringbuffer_); DestroyHasher(m, &s->hasher_); BROTLI_FREE(m, s->large_table_); BROTLI_FREE(m, s->command_buf_); BROTLI_FREE(m, s->literal_buf_); } /* Deinitializes and frees BrotliEncoderState instance. */ void BrotliEncoderDestroyInstance(BrotliEncoderState* state) { if (!state) { return; } else { MemoryManager* m = &state->memory_manager_; brotli_free_func free_func = m->free_func; void* opaque = m->opaque; BrotliEncoderCleanupState(state); free_func(opaque, state); } } /* Copies the given input data to the internal ring buffer of the compressor. No processing of the data occurs at this time and this function can be called multiple times before calling WriteBrotliData() to process the accumulated input. At most input_block_size() bytes of input data can be copied to the ring buffer, otherwise the next WriteBrotliData() will fail. */ static void CopyInputToRingBuffer(BrotliEncoderState* s, const size_t input_size, const uint8_t* input_buffer) { RingBuffer* ringbuffer_ = &s->ringbuffer_; MemoryManager* m = &s->memory_manager_; RingBufferWrite(m, input_buffer, input_size, ringbuffer_); if (BROTLI_IS_OOM(m)) return; s->input_pos_ += input_size; /* TL;DR: If needed, initialize 7 more bytes in the ring buffer to make the hashing not depend on uninitialized data. This makes compression deterministic and it prevents uninitialized memory warnings in Valgrind. Even without erasing, the output would be valid (but nondeterministic). Background information: The compressor stores short (at most 8 bytes) substrings of the input already read in a hash table, and detects repetitions by looking up such substrings in the hash table. If it can find a substring, it checks whether the substring is really there in the ring buffer (or it's just a hash collision). Should the hash table become corrupt, this check makes sure that the output is still valid, albeit the compression ratio would be bad. The compressor populates the hash table from the ring buffer as it's reading new bytes from the input. However, at the last few indexes of the ring buffer, there are not enough bytes to build full-length substrings from. Since the hash table always contains full-length substrings, we erase with dummy zeros here to make sure that those substrings will contain zeros at the end instead of uninitialized data. Please note that erasing is not necessary (because the memory region is already initialized since he ring buffer has a `tail' that holds a copy of the beginning,) so we skip erasing if we have already gone around at least once in the ring buffer. Only clear during the first round of ring-buffer writes. On subsequent rounds data in the ring-buffer would be affected. */ if (ringbuffer_->pos_ <= ringbuffer_->mask_) { /* This is the first time when the ring buffer is being written. We clear 7 bytes just after the bytes that have been copied from the input buffer. The ring-buffer has a "tail" that holds a copy of the beginning, but only once the ring buffer has been fully written once, i.e., pos <= mask. For the first time, we need to write values in this tail (where index may be larger than mask), so that we have exactly defined behavior and don't read uninitialized memory. Due to performance reasons, hashing reads data using a LOAD64, which can go 7 bytes beyond the bytes written in the ring-buffer. */ memset(ringbuffer_->buffer_ + ringbuffer_->pos_, 0, 7); } } /* Marks all input as processed. Returns true if position wrapping occurs. */ static BROTLI_BOOL UpdateLastProcessedPos(BrotliEncoderState* s) { uint32_t wrapped_last_processed_pos = WrapPosition(s->last_processed_pos_); uint32_t wrapped_input_pos = WrapPosition(s->input_pos_); s->last_processed_pos_ = s->input_pos_; return TO_BROTLI_BOOL(wrapped_input_pos < wrapped_last_processed_pos); } static void ExtendLastCommand(BrotliEncoderState* s, uint32_t* bytes, uint32_t* wrapped_last_processed_pos) { Command* last_command = &s->commands_[s->num_commands_ - 1]; const uint8_t* data = s->ringbuffer_.buffer_; const uint32_t mask = s->ringbuffer_.mask_; uint64_t max_backward_distance = (((uint64_t)1) << s->params.lgwin) - BROTLI_WINDOW_GAP; uint64_t last_copy_len = last_command->copy_len_ & 0x1FFFFFF; uint64_t last_processed_pos = s->last_processed_pos_ - last_copy_len; uint64_t max_distance = last_processed_pos < max_backward_distance ? last_processed_pos : max_backward_distance; uint64_t cmd_dist = (uint64_t)s->dist_cache_[0]; uint32_t distance_code = CommandRestoreDistanceCode(last_command, &s->params.dist); if (distance_code < BROTLI_NUM_DISTANCE_SHORT_CODES || distance_code - (BROTLI_NUM_DISTANCE_SHORT_CODES - 1) == cmd_dist) { if (cmd_dist <= max_distance) { while (*bytes != 0 && data[*wrapped_last_processed_pos & mask] == data[(*wrapped_last_processed_pos - cmd_dist) & mask]) { last_command->copy_len_++; (*bytes)--; (*wrapped_last_processed_pos)++; } } /* The copy length is at most the metablock size, and thus expressible. */ GetLengthCode(last_command->insert_len_, (size_t)((int)(last_command->copy_len_ & 0x1FFFFFF) + (int)(last_command->copy_len_ >> 25)), TO_BROTLI_BOOL((last_command->dist_prefix_ & 0x3FF) == 0), &last_command->cmd_prefix_); } } /* Processes the accumulated input data and sets |*out_size| to the length of the new output meta-block, or to zero if no new output meta-block has been created (in this case the processed input data is buffered internally). If |*out_size| is positive, |*output| points to the start of the output data. If |is_last| or |force_flush| is BROTLI_TRUE, an output meta-block is always created. However, until |is_last| is BROTLI_TRUE encoder may retain up to 7 bits of the last byte of output. To force encoder to dump the remaining bits use WriteMetadata() to append an empty meta-data block. Returns BROTLI_FALSE if the size of the input data is larger than input_block_size(). */ static BROTLI_BOOL EncodeData( BrotliEncoderState* s, const BROTLI_BOOL is_last, const BROTLI_BOOL force_flush, size_t* out_size, uint8_t** output) { const uint64_t delta = UnprocessedInputSize(s); uint32_t bytes = (uint32_t)delta; uint32_t wrapped_last_processed_pos = WrapPosition(s->last_processed_pos_); uint8_t* data; uint32_t mask; MemoryManager* m = &s->memory_manager_; ContextType literal_context_mode; data = s->ringbuffer_.buffer_; mask = s->ringbuffer_.mask_; /* Adding more blocks after "last" block is forbidden. */ if (s->is_last_block_emitted_) return BROTLI_FALSE; if (is_last) s->is_last_block_emitted_ = BROTLI_TRUE; if (delta > InputBlockSize(s)) { return BROTLI_FALSE; } if (s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY && !s->command_buf_) { s->command_buf_ = BROTLI_ALLOC(m, uint32_t, kCompressFragmentTwoPassBlockSize); s->literal_buf_ = BROTLI_ALLOC(m, uint8_t, kCompressFragmentTwoPassBlockSize); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY || s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) { uint8_t* storage; size_t storage_ix = s->last_bytes_bits_; size_t table_size; int* table; if (delta == 0 && !is_last) { /* We have no new input data and we don't have to finish the stream, so nothing to do. */ *out_size = 0; return BROTLI_TRUE; } storage = GetBrotliStorage(s, 2 * bytes + 503); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; storage[0] = (uint8_t)s->last_bytes_; storage[1] = (uint8_t)(s->last_bytes_ >> 8); table = GetHashTable(s, s->params.quality, bytes, &table_size); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) { BrotliCompressFragmentFast( m, &data[wrapped_last_processed_pos & mask], bytes, is_last, table, table_size, s->cmd_depths_, s->cmd_bits_, &s->cmd_code_numbits_, s->cmd_code_, &storage_ix, storage); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } else { BrotliCompressFragmentTwoPass( m, &data[wrapped_last_processed_pos & mask], bytes, is_last, s->command_buf_, s->literal_buf_, table, table_size, &storage_ix, storage); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } s->last_bytes_ = (uint16_t)(storage[storage_ix >> 3]); s->last_bytes_bits_ = storage_ix & 7u; UpdateLastProcessedPos(s); *output = &storage[0]; *out_size = storage_ix >> 3; return BROTLI_TRUE; } { /* Theoretical max number of commands is 1 per 2 bytes. */ size_t newsize = s->num_commands_ + bytes / 2 + 1; if (newsize > s->cmd_alloc_size_) { Command* new_commands; /* Reserve a bit more memory to allow merging with a next block without reallocation: that would impact speed. */ newsize += (bytes / 4) + 16; s->cmd_alloc_size_ = newsize; new_commands = BROTLI_ALLOC(m, Command, newsize); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; if (s->commands_) { memcpy(new_commands, s->commands_, sizeof(Command) * s->num_commands_); BROTLI_FREE(m, s->commands_); } s->commands_ = new_commands; } } InitOrStitchToPreviousBlock(m, &s->hasher_, data, mask, &s->params, wrapped_last_processed_pos, bytes, is_last); literal_context_mode = ChooseContextMode( &s->params, data, WrapPosition(s->last_flush_pos_), mask, (size_t)(s->input_pos_ - s->last_flush_pos_)); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; if (s->num_commands_ && s->last_insert_len_ == 0) { ExtendLastCommand(s, &bytes, &wrapped_last_processed_pos); } if (s->params.quality == ZOPFLIFICATION_QUALITY) { BROTLI_DCHECK(s->params.hasher.type == 10); BrotliCreateZopfliBackwardReferences(m, bytes, wrapped_last_processed_pos, data, mask, &s->params, s->hasher_, s->dist_cache_, &s->last_insert_len_, &s->commands_[s->num_commands_], &s->num_commands_, &s->num_literals_); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } else if (s->params.quality == HQ_ZOPFLIFICATION_QUALITY) { BROTLI_DCHECK(s->params.hasher.type == 10); BrotliCreateHqZopfliBackwardReferences(m, bytes, wrapped_last_processed_pos, data, mask, &s->params, s->hasher_, s->dist_cache_, &s->last_insert_len_, &s->commands_[s->num_commands_], &s->num_commands_, &s->num_literals_); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } else { BrotliCreateBackwardReferences(bytes, wrapped_last_processed_pos, data, mask, &s->params, s->hasher_, s->dist_cache_, &s->last_insert_len_, &s->commands_[s->num_commands_], &s->num_commands_, &s->num_literals_); } { const size_t max_length = MaxMetablockSize(&s->params); const size_t max_literals = max_length / 8; const size_t max_commands = max_length / 8; const size_t processed_bytes = (size_t)(s->input_pos_ - s->last_flush_pos_); /* If maximal possible additional block doesn't fit metablock, flush now. */ /* TODO: Postpone decision until next block arrives? */ const BROTLI_BOOL next_input_fits_metablock = TO_BROTLI_BOOL( processed_bytes + InputBlockSize(s) <= max_length); /* If block splitting is not used, then flush as soon as there is some amount of commands / literals produced. */ const BROTLI_BOOL should_flush = TO_BROTLI_BOOL( s->params.quality < MIN_QUALITY_FOR_BLOCK_SPLIT && s->num_literals_ + s->num_commands_ >= MAX_NUM_DELAYED_SYMBOLS); if (!is_last && !force_flush && !should_flush && next_input_fits_metablock && s->num_literals_ < max_literals && s->num_commands_ < max_commands) { /* Merge with next input block. Everything will happen later. */ if (UpdateLastProcessedPos(s)) { HasherReset(s->hasher_); } *out_size = 0; return BROTLI_TRUE; } } /* Create the last insert-only command. */ if (s->last_insert_len_ > 0) { InitInsertCommand(&s->commands_[s->num_commands_++], s->last_insert_len_); s->num_literals_ += s->last_insert_len_; s->last_insert_len_ = 0; } if (!is_last && s->input_pos_ == s->last_flush_pos_) { /* We have no new input data and we don't have to finish the stream, so nothing to do. */ *out_size = 0; return BROTLI_TRUE; } BROTLI_DCHECK(s->input_pos_ >= s->last_flush_pos_); BROTLI_DCHECK(s->input_pos_ > s->last_flush_pos_ || is_last); BROTLI_DCHECK(s->input_pos_ - s->last_flush_pos_ <= 1u << 24); { const uint32_t metablock_size = (uint32_t)(s->input_pos_ - s->last_flush_pos_); uint8_t* storage = GetBrotliStorage(s, 2 * metablock_size + 503); size_t storage_ix = s->last_bytes_bits_; if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; storage[0] = (uint8_t)s->last_bytes_; storage[1] = (uint8_t)(s->last_bytes_ >> 8); WriteMetaBlockInternal( m, data, mask, s->last_flush_pos_, metablock_size, is_last, literal_context_mode, &s->params, s->prev_byte_, s->prev_byte2_, s->num_literals_, s->num_commands_, s->commands_, s->saved_dist_cache_, s->dist_cache_, &storage_ix, storage); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; s->last_bytes_ = (uint16_t)(storage[storage_ix >> 3]); s->last_bytes_bits_ = storage_ix & 7u; s->last_flush_pos_ = s->input_pos_; if (UpdateLastProcessedPos(s)) { HasherReset(s->hasher_); } if (s->last_flush_pos_ > 0) { s->prev_byte_ = data[((uint32_t)s->last_flush_pos_ - 1) & mask]; } if (s->last_flush_pos_ > 1) { s->prev_byte2_ = data[(uint32_t)(s->last_flush_pos_ - 2) & mask]; } s->num_commands_ = 0; s->num_literals_ = 0; /* Save the state of the distance cache in case we need to restore it for emitting an uncompressed block. */ memcpy(s->saved_dist_cache_, s->dist_cache_, sizeof(s->saved_dist_cache_)); *output = &storage[0]; *out_size = storage_ix >> 3; return BROTLI_TRUE; } } /* Dumps remaining output bits and metadata header to |header|. Returns number of produced bytes. REQUIRED: |header| should be 8-byte aligned and at least 16 bytes long. REQUIRED: |block_size| <= (1 << 24). */ static size_t WriteMetadataHeader( BrotliEncoderState* s, const size_t block_size, uint8_t* header) { size_t storage_ix; storage_ix = s->last_bytes_bits_; header[0] = (uint8_t)s->last_bytes_; header[1] = (uint8_t)(s->last_bytes_ >> 8); s->last_bytes_ = 0; s->last_bytes_bits_ = 0; BrotliWriteBits(1, 0, &storage_ix, header); BrotliWriteBits(2, 3, &storage_ix, header); BrotliWriteBits(1, 0, &storage_ix, header); if (block_size == 0) { BrotliWriteBits(2, 0, &storage_ix, header); } else { uint32_t nbits = (block_size == 1) ? 0 : (Log2FloorNonZero((uint32_t)block_size - 1) + 1); uint32_t nbytes = (nbits + 7) / 8; BrotliWriteBits(2, nbytes, &storage_ix, header); BrotliWriteBits(8 * nbytes, block_size - 1, &storage_ix, header); } return (storage_ix + 7u) >> 3; } static BROTLI_BOOL BrotliCompressBufferQuality10( int lgwin, size_t input_size, const uint8_t* input_buffer, size_t* encoded_size, uint8_t* encoded_buffer) { MemoryManager memory_manager; MemoryManager* m = &memory_manager; const size_t mask = BROTLI_SIZE_MAX >> 1; int dist_cache[4] = { 4, 11, 15, 16 }; int saved_dist_cache[4] = { 4, 11, 15, 16 }; BROTLI_BOOL ok = BROTLI_TRUE; const size_t max_out_size = *encoded_size; size_t total_out_size = 0; uint16_t last_bytes; uint8_t last_bytes_bits; HasherHandle hasher = NULL; const size_t hasher_eff_size = BROTLI_MIN(size_t, input_size, BROTLI_MAX_BACKWARD_LIMIT(lgwin) + BROTLI_WINDOW_GAP); BrotliEncoderParams params; const int lgmetablock = BROTLI_MIN(int, 24, lgwin + 1); size_t max_block_size; const size_t max_metablock_size = (size_t)1 << lgmetablock; const size_t max_literals_per_metablock = max_metablock_size / 8; const size_t max_commands_per_metablock = max_metablock_size / 8; size_t metablock_start = 0; uint8_t prev_byte = 0; uint8_t prev_byte2 = 0; BrotliEncoderInitParams(¶ms); params.quality = 10; params.lgwin = lgwin; if (lgwin > BROTLI_MAX_WINDOW_BITS) { params.large_window = BROTLI_TRUE; } SanitizeParams(¶ms); params.lgblock = ComputeLgBlock(¶ms); ChooseDistanceParams(¶ms); max_block_size = (size_t)1 << params.lgblock; BrotliInitMemoryManager(m, 0, 0, 0); BROTLI_DCHECK(input_size <= mask + 1); EncodeWindowBits(lgwin, params.large_window, &last_bytes, &last_bytes_bits); InitOrStitchToPreviousBlock(m, &hasher, input_buffer, mask, ¶ms, 0, hasher_eff_size, BROTLI_TRUE); if (BROTLI_IS_OOM(m)) goto oom; while (ok && metablock_start < input_size) { const size_t metablock_end = BROTLI_MIN(size_t, input_size, metablock_start + max_metablock_size); const size_t expected_num_commands = (metablock_end - metablock_start) / 12 + 16; Command* commands = 0; size_t num_commands = 0; size_t last_insert_len = 0; size_t num_literals = 0; size_t metablock_size = 0; size_t cmd_alloc_size = 0; BROTLI_BOOL is_last; uint8_t* storage; size_t storage_ix; ContextType literal_context_mode = ChooseContextMode(¶ms, input_buffer, metablock_start, mask, metablock_end - metablock_start); size_t block_start; for (block_start = metablock_start; block_start < metablock_end; ) { size_t block_size = BROTLI_MIN(size_t, metablock_end - block_start, max_block_size); ZopfliNode* nodes = BROTLI_ALLOC(m, ZopfliNode, block_size + 1); size_t path_size; size_t new_cmd_alloc_size; if (BROTLI_IS_OOM(m)) goto oom; BrotliInitZopfliNodes(nodes, block_size + 1); StitchToPreviousBlockH10(hasher, block_size, block_start, input_buffer, mask); path_size = BrotliZopfliComputeShortestPath(m, block_size, block_start, input_buffer, mask, ¶ms, dist_cache, hasher, nodes); if (BROTLI_IS_OOM(m)) goto oom; /* We allocate a command buffer in the first iteration of this loop that will be likely big enough for the whole metablock, so that for most inputs we will not have to reallocate in later iterations. We do the allocation here and not before the loop, because if the input is small, this will be allocated after the Zopfli cost model is freed, so this will not increase peak memory usage. TODO: If the first allocation is too small, increase command buffer size exponentially. */ new_cmd_alloc_size = BROTLI_MAX(size_t, expected_num_commands, num_commands + path_size + 1); if (cmd_alloc_size != new_cmd_alloc_size) { Command* new_commands = BROTLI_ALLOC(m, Command, new_cmd_alloc_size); if (BROTLI_IS_OOM(m)) goto oom; cmd_alloc_size = new_cmd_alloc_size; if (commands) { memcpy(new_commands, commands, sizeof(Command) * num_commands); BROTLI_FREE(m, commands); } commands = new_commands; } BrotliZopfliCreateCommands(block_size, block_start, &nodes[0], dist_cache, &last_insert_len, ¶ms, &commands[num_commands], &num_literals); num_commands += path_size; block_start += block_size; metablock_size += block_size; BROTLI_FREE(m, nodes); if (num_literals > max_literals_per_metablock || num_commands > max_commands_per_metablock) { break; } } if (last_insert_len > 0) { InitInsertCommand(&commands[num_commands++], last_insert_len); num_literals += last_insert_len; } is_last = TO_BROTLI_BOOL(metablock_start + metablock_size == input_size); storage = NULL; storage_ix = last_bytes_bits; if (metablock_size == 0) { /* Write the ISLAST and ISEMPTY bits. */ storage = BROTLI_ALLOC(m, uint8_t, 16); if (BROTLI_IS_OOM(m)) goto oom; storage[0] = (uint8_t)last_bytes; storage[1] = (uint8_t)(last_bytes >> 8); BrotliWriteBits(2, 3, &storage_ix, storage); storage_ix = (storage_ix + 7u) & ~7u; } else if (!ShouldCompress(input_buffer, mask, metablock_start, metablock_size, num_literals, num_commands)) { /* Restore the distance cache, as its last update by CreateBackwardReferences is now unused. */ memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0])); storage = BROTLI_ALLOC(m, uint8_t, metablock_size + 16); if (BROTLI_IS_OOM(m)) goto oom; storage[0] = (uint8_t)last_bytes; storage[1] = (uint8_t)(last_bytes >> 8); BrotliStoreUncompressedMetaBlock(is_last, input_buffer, metablock_start, mask, metablock_size, &storage_ix, storage); } else { MetaBlockSplit mb; BrotliEncoderParams block_params = params; InitMetaBlockSplit(&mb); BrotliBuildMetaBlock(m, input_buffer, metablock_start, mask, &block_params, prev_byte, prev_byte2, commands, num_commands, literal_context_mode, &mb); if (BROTLI_IS_OOM(m)) goto oom; { /* The number of distance symbols effectively used for distance histograms. It might be less than distance alphabet size for "Large Window Brotli" (32-bit). */ uint32_t num_effective_dist_codes = block_params.dist.alphabet_size; if (num_effective_dist_codes > BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS) { num_effective_dist_codes = BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS; } BrotliOptimizeHistograms(num_effective_dist_codes, &mb); } storage = BROTLI_ALLOC(m, uint8_t, 2 * metablock_size + 503); if (BROTLI_IS_OOM(m)) goto oom; storage[0] = (uint8_t)last_bytes; storage[1] = (uint8_t)(last_bytes >> 8); BrotliStoreMetaBlock(m, input_buffer, metablock_start, metablock_size, mask, prev_byte, prev_byte2, is_last, &block_params, literal_context_mode, commands, num_commands, &mb, &storage_ix, storage); if (BROTLI_IS_OOM(m)) goto oom; if (metablock_size + 4 < (storage_ix >> 3)) { /* Restore the distance cache and last byte. */ memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0])); storage[0] = (uint8_t)last_bytes; storage[1] = (uint8_t)(last_bytes >> 8); storage_ix = last_bytes_bits; BrotliStoreUncompressedMetaBlock(is_last, input_buffer, metablock_start, mask, metablock_size, &storage_ix, storage); } DestroyMetaBlockSplit(m, &mb); } last_bytes = (uint16_t)(storage[storage_ix >> 3]); last_bytes_bits = storage_ix & 7u; metablock_start += metablock_size; if (metablock_start < input_size) { prev_byte = input_buffer[metablock_start - 1]; prev_byte2 = input_buffer[metablock_start - 2]; } /* Save the state of the distance cache in case we need to restore it for emitting an uncompressed block. */ memcpy(saved_dist_cache, dist_cache, 4 * sizeof(dist_cache[0])); { const size_t out_size = storage_ix >> 3; total_out_size += out_size; if (total_out_size <= max_out_size) { memcpy(encoded_buffer, storage, out_size); encoded_buffer += out_size; } else { ok = BROTLI_FALSE; } } BROTLI_FREE(m, storage); BROTLI_FREE(m, commands); } *encoded_size = total_out_size; DestroyHasher(m, &hasher); return ok; oom: BrotliWipeOutMemoryManager(m); return BROTLI_FALSE; } size_t BrotliEncoderMaxCompressedSize(size_t input_size) { /* [window bits / empty metadata] + N * [uncompressed] + [last empty] */ size_t num_large_blocks = input_size >> 14; size_t overhead = 2 + (4 * num_large_blocks) + 3 + 1; size_t result = input_size + overhead; if (input_size == 0) return 2; return (result < input_size) ? 0 : result; } /* Wraps data to uncompressed brotli stream with minimal window size. |output| should point at region with at least BrotliEncoderMaxCompressedSize addressable bytes. Returns the length of stream. */ static size_t MakeUncompressedStream( const uint8_t* input, size_t input_size, uint8_t* output) { size_t size = input_size; size_t result = 0; size_t offset = 0; if (input_size == 0) { output[0] = 6; return 1; } output[result++] = 0x21; /* window bits = 10, is_last = false */ output[result++] = 0x03; /* empty metadata, padding */ while (size > 0) { uint32_t nibbles = 0; uint32_t chunk_size; uint32_t bits; chunk_size = (size > (1u << 24)) ? (1u << 24) : (uint32_t)size; if (chunk_size > (1u << 16)) nibbles = (chunk_size > (1u << 20)) ? 2 : 1; bits = (nibbles << 1) | ((chunk_size - 1) << 3) | (1u << (19 + 4 * nibbles)); output[result++] = (uint8_t)bits; output[result++] = (uint8_t)(bits >> 8); output[result++] = (uint8_t)(bits >> 16); if (nibbles == 2) output[result++] = (uint8_t)(bits >> 24); memcpy(&output[result], &input[offset], chunk_size); result += chunk_size; offset += chunk_size; size -= chunk_size; } output[result++] = 3; return result; } BROTLI_BOOL BrotliEncoderCompress( int quality, int lgwin, BrotliEncoderMode mode, size_t input_size, const uint8_t* input_buffer, size_t* encoded_size, uint8_t* encoded_buffer) { BrotliEncoderState* s; size_t out_size = *encoded_size; const uint8_t* input_start = input_buffer; uint8_t* output_start = encoded_buffer; size_t max_out_size = BrotliEncoderMaxCompressedSize(input_size); if (out_size == 0) { /* Output buffer needs at least one byte. */ return BROTLI_FALSE; } if (input_size == 0) { /* Handle the special case of empty input. */ *encoded_size = 1; *encoded_buffer = 6; return BROTLI_TRUE; } if (quality == 10) { /* TODO: Implement this direct path for all quality levels. */ const int lg_win = BROTLI_MIN(int, BROTLI_LARGE_MAX_WINDOW_BITS, BROTLI_MAX(int, 16, lgwin)); int ok = BrotliCompressBufferQuality10(lg_win, input_size, input_buffer, encoded_size, encoded_buffer); if (!ok || (max_out_size && *encoded_size > max_out_size)) { goto fallback; } return BROTLI_TRUE; } s = BrotliEncoderCreateInstance(0, 0, 0); if (!s) { return BROTLI_FALSE; } else { size_t available_in = input_size; const uint8_t* next_in = input_buffer; size_t available_out = *encoded_size; uint8_t* next_out = encoded_buffer; size_t total_out = 0; BROTLI_BOOL result = BROTLI_FALSE; BrotliEncoderSetParameter(s, BROTLI_PARAM_QUALITY, (uint32_t)quality); BrotliEncoderSetParameter(s, BROTLI_PARAM_LGWIN, (uint32_t)lgwin); BrotliEncoderSetParameter(s, BROTLI_PARAM_MODE, (uint32_t)mode); BrotliEncoderSetParameter(s, BROTLI_PARAM_SIZE_HINT, (uint32_t)input_size); if (lgwin > BROTLI_MAX_WINDOW_BITS) { BrotliEncoderSetParameter(s, BROTLI_PARAM_LARGE_WINDOW, BROTLI_TRUE); } result = BrotliEncoderCompressStream(s, BROTLI_OPERATION_FINISH, &available_in, &next_in, &available_out, &next_out, &total_out); if (!BrotliEncoderIsFinished(s)) result = 0; *encoded_size = total_out; BrotliEncoderDestroyInstance(s); if (!result || (max_out_size && *encoded_size > max_out_size)) { goto fallback; } return BROTLI_TRUE; } fallback: *encoded_size = 0; if (!max_out_size) return BROTLI_FALSE; if (out_size >= max_out_size) { *encoded_size = MakeUncompressedStream(input_start, input_size, output_start); return BROTLI_TRUE; } return BROTLI_FALSE; } static void InjectBytePaddingBlock(BrotliEncoderState* s) { uint32_t seal = s->last_bytes_; size_t seal_bits = s->last_bytes_bits_; uint8_t* destination; s->last_bytes_ = 0; s->last_bytes_bits_ = 0; /* is_last = 0, data_nibbles = 11, reserved = 0, meta_nibbles = 00 */ seal |= 0x6u << seal_bits; seal_bits += 6; /* If we have already created storage, then append to it. Storage is valid until next block is being compressed. */ if (s->next_out_) { destination = s->next_out_ + s->available_out_; } else { destination = s->tiny_buf_.u8; s->next_out_ = destination; } destination[0] = (uint8_t)seal; if (seal_bits > 8) destination[1] = (uint8_t)(seal >> 8); if (seal_bits > 16) destination[2] = (uint8_t)(seal >> 16); s->available_out_ += (seal_bits + 7) >> 3; } /* Injects padding bits or pushes compressed data to output. Returns false if nothing is done. */ static BROTLI_BOOL InjectFlushOrPushOutput(BrotliEncoderState* s, size_t* available_out, uint8_t** next_out, size_t* total_out) { if (s->stream_state_ == BROTLI_STREAM_FLUSH_REQUESTED && s->last_bytes_bits_ != 0) { InjectBytePaddingBlock(s); return BROTLI_TRUE; } if (s->available_out_ != 0 && *available_out != 0) { size_t copy_output_size = BROTLI_MIN(size_t, s->available_out_, *available_out); memcpy(*next_out, s->next_out_, copy_output_size); *next_out += copy_output_size; *available_out -= copy_output_size; s->next_out_ += copy_output_size; s->available_out_ -= copy_output_size; s->total_out_ += copy_output_size; if (total_out) *total_out = s->total_out_; return BROTLI_TRUE; } return BROTLI_FALSE; } static void CheckFlushComplete(BrotliEncoderState* s) { if (s->stream_state_ == BROTLI_STREAM_FLUSH_REQUESTED && s->available_out_ == 0) { s->stream_state_ = BROTLI_STREAM_PROCESSING; s->next_out_ = 0; } } static BROTLI_BOOL BrotliEncoderCompressStreamFast( BrotliEncoderState* s, BrotliEncoderOperation op, size_t* available_in, const uint8_t** next_in, size_t* available_out, uint8_t** next_out, size_t* total_out) { const size_t block_size_limit = (size_t)1 << s->params.lgwin; const size_t buf_size = BROTLI_MIN(size_t, kCompressFragmentTwoPassBlockSize, BROTLI_MIN(size_t, *available_in, block_size_limit)); uint32_t* tmp_command_buf = NULL; uint32_t* command_buf = NULL; uint8_t* tmp_literal_buf = NULL; uint8_t* literal_buf = NULL; MemoryManager* m = &s->memory_manager_; if (s->params.quality != FAST_ONE_PASS_COMPRESSION_QUALITY && s->params.quality != FAST_TWO_PASS_COMPRESSION_QUALITY) { return BROTLI_FALSE; } if (s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) { if (!s->command_buf_ && buf_size == kCompressFragmentTwoPassBlockSize) { s->command_buf_ = BROTLI_ALLOC(m, uint32_t, kCompressFragmentTwoPassBlockSize); s->literal_buf_ = BROTLI_ALLOC(m, uint8_t, kCompressFragmentTwoPassBlockSize); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } if (s->command_buf_) { command_buf = s->command_buf_; literal_buf = s->literal_buf_; } else { tmp_command_buf = BROTLI_ALLOC(m, uint32_t, buf_size); tmp_literal_buf = BROTLI_ALLOC(m, uint8_t, buf_size); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; command_buf = tmp_command_buf; literal_buf = tmp_literal_buf; } } while (BROTLI_TRUE) { if (InjectFlushOrPushOutput(s, available_out, next_out, total_out)) { continue; } /* Compress block only when internal output buffer is empty, stream is not finished, there is no pending flush request, and there is either additional input or pending operation. */ if (s->available_out_ == 0 && s->stream_state_ == BROTLI_STREAM_PROCESSING && (*available_in != 0 || op != BROTLI_OPERATION_PROCESS)) { size_t block_size = BROTLI_MIN(size_t, block_size_limit, *available_in); BROTLI_BOOL is_last = (*available_in == block_size) && (op == BROTLI_OPERATION_FINISH); BROTLI_BOOL force_flush = (*available_in == block_size) && (op == BROTLI_OPERATION_FLUSH); size_t max_out_size = 2 * block_size + 503; BROTLI_BOOL inplace = BROTLI_TRUE; uint8_t* storage = NULL; size_t storage_ix = s->last_bytes_bits_; size_t table_size; int* table; if (force_flush && block_size == 0) { s->stream_state_ = BROTLI_STREAM_FLUSH_REQUESTED; continue; } if (max_out_size <= *available_out) { storage = *next_out; } else { inplace = BROTLI_FALSE; storage = GetBrotliStorage(s, max_out_size); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } storage[0] = (uint8_t)s->last_bytes_; storage[1] = (uint8_t)(s->last_bytes_ >> 8); table = GetHashTable(s, s->params.quality, block_size, &table_size); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) { BrotliCompressFragmentFast(m, *next_in, block_size, is_last, table, table_size, s->cmd_depths_, s->cmd_bits_, &s->cmd_code_numbits_, s->cmd_code_, &storage_ix, storage); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } else { BrotliCompressFragmentTwoPass(m, *next_in, block_size, is_last, command_buf, literal_buf, table, table_size, &storage_ix, storage); if (BROTLI_IS_OOM(m)) return BROTLI_FALSE; } *next_in += block_size; *available_in -= block_size; if (inplace) { size_t out_bytes = storage_ix >> 3; BROTLI_DCHECK(out_bytes <= *available_out); BROTLI_DCHECK((storage_ix & 7) == 0 || out_bytes < *available_out); *next_out += out_bytes; *available_out -= out_bytes; s->total_out_ += out_bytes; if (total_out) *total_out = s->total_out_; } else { size_t out_bytes = storage_ix >> 3; s->next_out_ = storage; s->available_out_ = out_bytes; } s->last_bytes_ = (uint16_t)(storage[storage_ix >> 3]); s->last_bytes_bits_ = storage_ix & 7u; if (force_flush) s->stream_state_ = BROTLI_STREAM_FLUSH_REQUESTED; if (is_last) s->stream_state_ = BROTLI_STREAM_FINISHED; continue; } break; } BROTLI_FREE(m, tmp_command_buf); BROTLI_FREE(m, tmp_literal_buf); CheckFlushComplete(s); return BROTLI_TRUE; } static BROTLI_BOOL ProcessMetadata( BrotliEncoderState* s, size_t* available_in, const uint8_t** next_in, size_t* available_out, uint8_t** next_out, size_t* total_out) { if (*available_in > (1u << 24)) return BROTLI_FALSE; /* Switch to metadata block workflow, if required. */ if (s->stream_state_ == BROTLI_STREAM_PROCESSING) { s->remaining_metadata_bytes_ = (uint32_t)*available_in; s->stream_state_ = BROTLI_STREAM_METADATA_HEAD; } if (s->stream_state_ != BROTLI_STREAM_METADATA_HEAD && s->stream_state_ != BROTLI_STREAM_METADATA_BODY) { return BROTLI_FALSE; } while (BROTLI_TRUE) { if (InjectFlushOrPushOutput(s, available_out, next_out, total_out)) { continue; } if (s->available_out_ != 0) break; if (s->input_pos_ != s->last_flush_pos_) { BROTLI_BOOL result = EncodeData(s, BROTLI_FALSE, BROTLI_TRUE, &s->available_out_, &s->next_out_); if (!result) return BROTLI_FALSE; continue; } if (s->stream_state_ == BROTLI_STREAM_METADATA_HEAD) { s->next_out_ = s->tiny_buf_.u8; s->available_out_ = WriteMetadataHeader(s, s->remaining_metadata_bytes_, s->next_out_); s->stream_state_ = BROTLI_STREAM_METADATA_BODY; continue; } else { /* Exit workflow only when there is no more input and no more output. Otherwise client may continue producing empty metadata blocks. */ if (s->remaining_metadata_bytes_ == 0) { s->remaining_metadata_bytes_ = BROTLI_UINT32_MAX; s->stream_state_ = BROTLI_STREAM_PROCESSING; break; } if (*available_out) { /* Directly copy input to output. */ uint32_t copy = (uint32_t)BROTLI_MIN( size_t, s->remaining_metadata_bytes_, *available_out); memcpy(*next_out, *next_in, copy); *next_in += copy; *available_in -= copy; s->remaining_metadata_bytes_ -= copy; *next_out += copy; *available_out -= copy; } else { /* This guarantees progress in "TakeOutput" workflow. */ uint32_t copy = BROTLI_MIN(uint32_t, s->remaining_metadata_bytes_, 16); s->next_out_ = s->tiny_buf_.u8; memcpy(s->next_out_, *next_in, copy); *next_in += copy; *available_in -= copy; s->remaining_metadata_bytes_ -= copy; s->available_out_ = copy; } continue; } } return BROTLI_TRUE; } static void UpdateSizeHint(BrotliEncoderState* s, size_t available_in) { if (s->params.size_hint == 0) { uint64_t delta = UnprocessedInputSize(s); uint64_t tail = available_in; uint32_t limit = 1u << 30; uint32_t total; if ((delta >= limit) || (tail >= limit) || ((delta + tail) >= limit)) { total = limit; } else { total = (uint32_t)(delta + tail); } s->params.size_hint = total; } } BROTLI_BOOL BrotliEncoderCompressStream( BrotliEncoderState* s, BrotliEncoderOperation op, size_t* available_in, const uint8_t** next_in, size_t* available_out,uint8_t** next_out, size_t* total_out) { if (!EnsureInitialized(s)) return BROTLI_FALSE; /* Unfinished metadata block; check requirements. */ if (s->remaining_metadata_bytes_ != BROTLI_UINT32_MAX) { if (*available_in != s->remaining_metadata_bytes_) return BROTLI_FALSE; if (op != BROTLI_OPERATION_EMIT_METADATA) return BROTLI_FALSE; } if (op == BROTLI_OPERATION_EMIT_METADATA) { UpdateSizeHint(s, 0); /* First data metablock might be emitted here. */ return ProcessMetadata( s, available_in, next_in, available_out, next_out, total_out); } if (s->stream_state_ == BROTLI_STREAM_METADATA_HEAD || s->stream_state_ == BROTLI_STREAM_METADATA_BODY) { return BROTLI_FALSE; } if (s->stream_state_ != BROTLI_STREAM_PROCESSING && *available_in != 0) { return BROTLI_FALSE; } if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY || s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) { return BrotliEncoderCompressStreamFast(s, op, available_in, next_in, available_out, next_out, total_out); } while (BROTLI_TRUE) { size_t remaining_block_size = RemainingInputBlockSize(s); if (remaining_block_size != 0 && *available_in != 0) { size_t copy_input_size = BROTLI_MIN(size_t, remaining_block_size, *available_in); CopyInputToRingBuffer(s, copy_input_size, *next_in); *next_in += copy_input_size; *available_in -= copy_input_size; continue; } if (InjectFlushOrPushOutput(s, available_out, next_out, total_out)) { continue; } /* Compress data only when internal output buffer is empty, stream is not finished and there is no pending flush request. */ if (s->available_out_ == 0 && s->stream_state_ == BROTLI_STREAM_PROCESSING) { if (remaining_block_size == 0 || op != BROTLI_OPERATION_PROCESS) { BROTLI_BOOL is_last = TO_BROTLI_BOOL( (*available_in == 0) && op == BROTLI_OPERATION_FINISH); BROTLI_BOOL force_flush = TO_BROTLI_BOOL( (*available_in == 0) && op == BROTLI_OPERATION_FLUSH); BROTLI_BOOL result; UpdateSizeHint(s, *available_in); result = EncodeData(s, is_last, force_flush, &s->available_out_, &s->next_out_); if (!result) return BROTLI_FALSE; if (force_flush) s->stream_state_ = BROTLI_STREAM_FLUSH_REQUESTED; if (is_last) s->stream_state_ = BROTLI_STREAM_FINISHED; continue; } } break; } CheckFlushComplete(s); return BROTLI_TRUE; } BROTLI_BOOL BrotliEncoderIsFinished(BrotliEncoderState* s) { return TO_BROTLI_BOOL(s->stream_state_ == BROTLI_STREAM_FINISHED && !BrotliEncoderHasMoreOutput(s)); } BROTLI_BOOL BrotliEncoderHasMoreOutput(BrotliEncoderState* s) { return TO_BROTLI_BOOL(s->available_out_ != 0); } const uint8_t* BrotliEncoderTakeOutput(BrotliEncoderState* s, size_t* size) { size_t consumed_size = s->available_out_; uint8_t* result = s->next_out_; if (*size) { consumed_size = BROTLI_MIN(size_t, *size, s->available_out_); } if (consumed_size) { s->next_out_ += consumed_size; s->available_out_ -= consumed_size; s->total_out_ += consumed_size; CheckFlushComplete(s); *size = consumed_size; } else { *size = 0; result = 0; } return result; } uint32_t BrotliEncoderVersion(void) { return BROTLI_VERSION; } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/bit_cost_inc.h0000664000175000017500000001001513510660062015721 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN */ #define HistogramType FN(Histogram) double FN(BrotliPopulationCost)(const HistogramType* histogram) { static const double kOneSymbolHistogramCost = 12; static const double kTwoSymbolHistogramCost = 20; static const double kThreeSymbolHistogramCost = 28; static const double kFourSymbolHistogramCost = 37; const size_t data_size = FN(HistogramDataSize)(); int count = 0; size_t s[5]; double bits = 0.0; size_t i; if (histogram->total_count_ == 0) { return kOneSymbolHistogramCost; } for (i = 0; i < data_size; ++i) { if (histogram->data_[i] > 0) { s[count] = i; ++count; if (count > 4) break; } } if (count == 1) { return kOneSymbolHistogramCost; } if (count == 2) { return (kTwoSymbolHistogramCost + (double)histogram->total_count_); } if (count == 3) { const uint32_t histo0 = histogram->data_[s[0]]; const uint32_t histo1 = histogram->data_[s[1]]; const uint32_t histo2 = histogram->data_[s[2]]; const uint32_t histomax = BROTLI_MAX(uint32_t, histo0, BROTLI_MAX(uint32_t, histo1, histo2)); return (kThreeSymbolHistogramCost + 2 * (histo0 + histo1 + histo2) - histomax); } if (count == 4) { uint32_t histo[4]; uint32_t h23; uint32_t histomax; for (i = 0; i < 4; ++i) { histo[i] = histogram->data_[s[i]]; } /* Sort */ for (i = 0; i < 4; ++i) { size_t j; for (j = i + 1; j < 4; ++j) { if (histo[j] > histo[i]) { BROTLI_SWAP(uint32_t, histo, j, i); } } } h23 = histo[2] + histo[3]; histomax = BROTLI_MAX(uint32_t, h23, histo[0]); return (kFourSymbolHistogramCost + 3 * h23 + 2 * (histo[0] + histo[1]) - histomax); } { /* In this loop we compute the entropy of the histogram and simultaneously build a simplified histogram of the code length codes where we use the zero repeat code 17, but we don't use the non-zero repeat code 16. */ size_t max_depth = 1; uint32_t depth_histo[BROTLI_CODE_LENGTH_CODES] = { 0 }; const double log2total = FastLog2(histogram->total_count_); for (i = 0; i < data_size;) { if (histogram->data_[i] > 0) { /* Compute -log2(P(symbol)) = -log2(count(symbol)/total_count) = = log2(total_count) - log2(count(symbol)) */ double log2p = log2total - FastLog2(histogram->data_[i]); /* Approximate the bit depth by round(-log2(P(symbol))) */ size_t depth = (size_t)(log2p + 0.5); bits += histogram->data_[i] * log2p; if (depth > 15) { depth = 15; } if (depth > max_depth) { max_depth = depth; } ++depth_histo[depth]; ++i; } else { /* Compute the run length of zeros and add the appropriate number of 0 and 17 code length codes to the code length code histogram. */ uint32_t reps = 1; size_t k; for (k = i + 1; k < data_size && histogram->data_[k] == 0; ++k) { ++reps; } i += reps; if (i == data_size) { /* Don't add any cost for the last zero run, since these are encoded only implicitly. */ break; } if (reps < 3) { depth_histo[0] += reps; } else { reps -= 2; while (reps > 0) { ++depth_histo[BROTLI_REPEAT_ZERO_CODE_LENGTH]; /* Add the 3 extra bits for the 17 code length code. */ bits += 3; reps >>= 3; } } } } /* Add the estimated encoding cost of the code length code histogram. */ bits += (double)(18 + 2 * max_depth); /* Add the entropy of the code length code histogram. */ bits += BitsEntropy(depth_histo, BROTLI_CODE_LENGTH_CODES); } return bits; } #undef HistogramType dvisvgm-2.8.1/libs/brotli/enc/utf8_util.c0000664000175000017500000000432713510660062015211 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Heuristics for deciding about the UTF8-ness of strings. */ #include "./utf8_util.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static size_t BrotliParseAsUTF8( int* symbol, const uint8_t* input, size_t size) { /* ASCII */ if ((input[0] & 0x80) == 0) { *symbol = input[0]; if (*symbol > 0) { return 1; } } /* 2-byte UTF8 */ if (size > 1u && (input[0] & 0xE0) == 0xC0 && (input[1] & 0xC0) == 0x80) { *symbol = (((input[0] & 0x1F) << 6) | (input[1] & 0x3F)); if (*symbol > 0x7F) { return 2; } } /* 3-byte UFT8 */ if (size > 2u && (input[0] & 0xF0) == 0xE0 && (input[1] & 0xC0) == 0x80 && (input[2] & 0xC0) == 0x80) { *symbol = (((input[0] & 0x0F) << 12) | ((input[1] & 0x3F) << 6) | (input[2] & 0x3F)); if (*symbol > 0x7FF) { return 3; } } /* 4-byte UFT8 */ if (size > 3u && (input[0] & 0xF8) == 0xF0 && (input[1] & 0xC0) == 0x80 && (input[2] & 0xC0) == 0x80 && (input[3] & 0xC0) == 0x80) { *symbol = (((input[0] & 0x07) << 18) | ((input[1] & 0x3F) << 12) | ((input[2] & 0x3F) << 6) | (input[3] & 0x3F)); if (*symbol > 0xFFFF && *symbol <= 0x10FFFF) { return 4; } } /* Not UTF8, emit a special symbol above the UTF8-code space */ *symbol = 0x110000 | input[0]; return 1; } /* Returns 1 if at least min_fraction of the data is UTF8-encoded.*/ BROTLI_BOOL BrotliIsMostlyUTF8( const uint8_t* data, const size_t pos, const size_t mask, const size_t length, const double min_fraction) { size_t size_utf8 = 0; size_t i = 0; while (i < length) { int symbol; size_t bytes_read = BrotliParseAsUTF8(&symbol, &data[(pos + i) & mask], length - i); i += bytes_read; if (symbol < 0x110000) size_utf8 += bytes_read; } return TO_BROTLI_BOOL(size_utf8 > min_fraction * (double)length); } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/compress_fragment.h0000664000175000017500000000541113510660062017004 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function for fast encoding of an input fragment, independently from the input history. This function uses one-pass processing: when we find a backward match, we immediately emit the corresponding command and literal codes to the bit stream. */ #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_H_ #define BROTLI_ENC_COMPRESS_FRAGMENT_H_ #include "../common/platform.h" #include #include "./memory.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Compresses "input" string to the "*storage" buffer as one or more complete meta-blocks, and updates the "*storage_ix" bit position. If "is_last" is 1, emits an additional empty last meta-block. "cmd_depth" and "cmd_bits" contain the command and distance prefix codes (see comment in encode.h) used for the encoding of this input fragment. If "is_last" is 0, they are updated to reflect the statistics of this input fragment, to be used for the encoding of the next fragment. "*cmd_code_numbits" is the number of bits of the compressed representation of the command and distance prefix codes, and "cmd_code" is an array of at least "(*cmd_code_numbits + 7) >> 3" size that contains the compressed command and distance prefix codes. If "is_last" is 0, these are also updated to represent the updated "cmd_depth" and "cmd_bits". REQUIRES: "input_size" is greater than zero, or "is_last" is 1. REQUIRES: "input_size" is less or equal to maximal metablock size (1 << 24). REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero. REQUIRES: "table_size" is an odd (9, 11, 13, 15) power of two OUTPUT: maximal copy distance <= |input_size| OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */ BROTLI_INTERNAL void BrotliCompressFragmentFast(MemoryManager* m, const uint8_t* input, size_t input_size, BROTLI_BOOL is_last, int* table, size_t table_size, uint8_t cmd_depth[128], uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code, size_t* storage_ix, uint8_t* storage); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_COMPRESS_FRAGMENT_H_ */ dvisvgm-2.8.1/libs/brotli/enc/bit_cost.c0000664000175000017500000000147013510660062015070 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions to estimate the bit cost of Huffman trees. */ #include "./bit_cost.h" #include "../common/constants.h" #include "../common/platform.h" #include #include "./fast_log.h" #include "./histogram.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define FN(X) X ## Literal #include "./bit_cost_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Command #include "./bit_cost_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Distance #include "./bit_cost_inc.h" /* NOLINT(build/include) */ #undef FN #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/dictionary_hash.c0000664000175000017500000025553213510660062016444 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Hash table on the 4-byte prefixes of static dictionary words. */ #include "../common/platform.h" #include "./dictionary_hash.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif BROTLI_INTERNAL const uint16_t kStaticDictionaryHash[32768] = { 32072,0,0,0,0,0,0,0,0,21860,0,0,0,0,0,0,0,40486,0,0,0,0,0,45798,0,0,0,0,0,0,1292 ,0,0,0,0,4964,278,23717,0,19972,0,0,0,0,0,0,0,0,0,0,0,0,2126,16102,0,0,0,14437,0 ,0,0,0,0,0,0,26727,2253,0,0,17252,0,0,0,0,0,0,0,0,0,3622,0,0,0,0,22984,0,0,0,0,0 ,0,16647,0,34247,0,0,0,0,0,48486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2511,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19532,0,0,24004,0,0,0,9828,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30853,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,31974,0,0,0,0,0,0,0,0,20650,2404,0,20773,1677,9031,0,6404,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6761,7206 ,0,0,21992,22983,0,0,3529,0,1864,0,0,0,0,0,0,11046,0,0,9641,0,0,0,6507,0,0,36934 ,21576,62375,0,0,0,0,0,0,0,0,0,8294,0,0,0,0,0,0,0,40807,0,0,0,39398,8136,0,0,0,0 ,0,0,0,8875,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7941,0,0,25609,0,0,0,936, 3716,3213,15687,0,0,0,0,0,52519,0,17381,0,0,0,0,1320,5797,0,21029,0,0,6472,807,0 ,0,0,0,0,0,0,0,0,0,13545,0,0,0,3624,0,0,0,29674,30820,0,31237,0,6596,0,0,0,0,0,0 ,0,0,0,64070,0,0,0,0,0,0,0,0,0,0,0,22278,0,37446,0,0,0,0,7240,423,0,24612,21705, 17636,0,0,0,0,0,0,1833,0,0,0,328,6021,0,0,0,19974,0,0,0,0,0,0,0,0,0,62119,4178,0 ,0,0,0,12100,8617,0,0,16900,0,36678,0,0,0,35366,0,51718,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,20998,0,62086,0,0,0,0,0,5542,0,0,0,0,0,0,0,0,0,0,0,14629,10952,25927,0,0,0 ,0,19849,0,0,0,0,0,0,0,30952,3046,14314,12998,0,0,0,15268,0,40582,30216,62118,0, 0,0,20132,0,0,0,0,0,12005,0,0,0,52358,0,0,0,0,24778,0,44,33095,0,0,0,0,0,26372,0 ,0,0,0,0,3781,0,0,17928,9479,0,0,0,0,0,0,0,0,32297,28613,0,0,0,0,0,0,0,0,0,0,0,0 ,0,47174,11723,0,0,0,0,0,0,0,0,0,2536,55143,0,0,6410,0,0,0,0,0,0,0,0,56294,11914 ,0,529,0,30184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8261,0,0,28808,58854,22633, 965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64135,0,0,331,3684,0,1605,0,0,0,0,0,0, 0,0,0,0,16650,37,0,23622,3144,15429,0,0,0,0,0,0,0,0,0,0,22443,69,0,0,0,0,0,0,0,0 ,17832,0,0,0,0,0,0,0,0,0,11113,0,0,0,0,18309,0,0,0,0,0,0,0,0,0,26630,0,0,25512, 25895,0,0,0,0,0,0,0,0,0,0,0,16901,0,0,0,27558,0,0,9418,0,0,0,3508,0,0,0,0,0,0,0, 0,37990,9289,8517,0,0,0,0,1578,1604,23944,0,0,14916,12781,0,0,0,0,0,0,0,12105,0, 16617,0,0,0,0,0,0,0,0,0,0,0,0,21348,11240,28870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,5772,0,0,27812,0,0,0,0,0,0,0,8324,0,0,0,0,0,0,0,0,0,0,16748,1157,0,0,18794, 16324,25898,935,8333,0,0,0,0,0,0,0,0,18246,0,18086,0,46854,0,0,0,0,0,0,339,0,0, 25188,12780,12166,6409,0,0,0,0,16516,0,27012,28395,0,0,0,0,0,0,0,1420,0,0,0,9768 ,52967,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25163,324,0,0,0,0,0,0,0,0,0,64998,0,0,0,0,0, 21893,0,0,0,0,0,47366,0,0,0,870,0,0,0,12646,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,26020,16360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1809,0,0,0,6601,15878,0,0,0,0,0, 29092,0,28516,0,0,0,0,0,0,0,0,0,21988,0,0,0,42950,0,0,0,0,0,0,0,0,0,0,5133,1318, 0,0,0,0,0,0,0,0,0,0,0,54982,24904,0,0,0,0,0,0,0,0,0,0,51526,0,0,0,0,0,3685,0,0,0 ,0,10062,9412,0,0,0,31460,5708,6181,0,0,0,0,0,0,0,0,0,5575,0,0,0,0,0,0,0,0,0,0, 27144,57478,0,0,0,0,0,0,7084,0,21993,53126,0,0,0,0,8397,0,0,5733,0,0,0,0,0,2116, 0,24742,0,11271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1133,0,4873,0,0,38310,0,0,0,0,0, 0,0,0,0,0,0,0,17932,0,0,18053,0,0,0,25510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17798,0, 26214,0,0,0,0,0,0,0,0,23016,17415,20392,164,0,0,0,0,0,0,0,0,0,0,0,3239,0,46119,0 ,0,0,28580,0,0,0,0,0,0,0,0,0,7621,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41478,0,0,31016, 55334,10056,1924,0,0,0,0,0,36614,0,36711,0,0,0,0,0,0,0,0,0,0,13994,59303,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,26501,0,5639,0,0,0,0,0,0,13897,1253,0,0,0,0,0,5095,0,0,0, 28869,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8646,0,0,0,0,25641,17796,0,0,0,0,0,0,0, 13316,620,6309,11819,0,0,0,0,0,0,0,0,0,904,1095,0,24229,0,0,28744,49703,0,23077, 0,0,0,0,32392,0,0,0,0,35271,0,28740,5866,0,0,0,0,0,0,0,4361,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7917,8869,0,0,0,13924,0,0,0,0, 0,41958,0,0,0,0,0,0,6766,13989,0,0,0,903,0,0,24010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,64390,0,22468,0,25861,0,0,0,0,23656,5317,0,0,0,0,0,0,23017,5445,16009 ,0,0,0,0,0,0,0,0,48006,10473,0,0,14404,0,0,0,42183,0,0,0,51270,0,0,10602,24132,0 ,0,0,0,0,43782,0,0,17834,0,0,0,25576,27205,0,0,0,0,0,0,0,0,29066,0,0,0,0,0,626, 1988,14700,0,0,0,0,0,0,0,0,0,0,0,0,57670,0,0,0,0,0,0,0,0,0,44710,0,0,0,0,3848, 7623,0,0,0,0,0,0,0,0,0,0,0,42374,0,0,0,0,0,0,0,0,19272,6436,0,0,5256,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,19685,0,0,0,0,0,0,0,0,0,0,0,0,0,39783,0,0,0,0,30984,0,0,0,0,0,0 ,28230,0,0,0,29028,10538,3205,0,0,0,0,0,0,0,0,0,0,0,5636,840,295,0,0,8488,8198,0 ,0,0,0,0,0,0,0,0,20580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4074,19526,0,0,0,0, 31144,64038,0,0,0,0,0,0,16716,0,0,0,0,0,0,0,0,0,0,0,17706,0,0,0,0,0,0,50630,0, 50503,0,0,0,0,0,0,0,0,0,0,0,25446,0,0,0,13831,0,0,0,0,0,0,2696,4039,0,0,0,0, 25288,0,12076,2054,0,48934,0,0,0,0,16969,59431,17259,35335,0,0,0,0,0,0,0,0,0,0,0 ,0,31275,0,0,0,1097,0,0,0,0,0,0,0,0,0,0,0,776,839,0,0,29386,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,5864,12134,0,0,0,0,0,0,0,25349,0,0,0,0,0,0,0,0,0,61447 ,0,0,0,0,0,0,0,0,0,24678,0,0,0,63335,0,28836,8142,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4494,0,0,0,0,0,14088,1188,0,16260,0,0,0, 16421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,276,0,0,17060,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24076,29445,0,33543,0,4901,0 ,0,12522,0,0,62471,0,0,0,0,0,0,0,0,0,0,4046,0,0,0,0,20486,0,15460,2217,51719,0,0 ,0,0,0,23495,0,0,0,0,0,0,15370,0,15849,0,15113,0,0,0,0,0,0,0,0,27972,7337,0,0,0, 0,30342,0,0,0,0,0,0,0,0,32299,23940,0,17766,0,0,0,0,0,0,6184,0,20904,0,0,0,0,0,0 ,0,0,0,0,31492,0,0,0,5509,0,0,0,0,0,0,0,0,2669,50182,0,0,12299,0,0,0,0,0,0,0, 5257,28167,0,0,0,0,0,0,0,0,0,0,0,11750,3890,0,0,26500,0,0,0,0,0,0,0,49318,0,0,0, 0,0,0,0,10981,0,0,0,0,0,0,0,0,17961,1831,0,0,0,0,0,0,0,29638,0,0,0,0,26473,0, 6216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,711,0,0,0,0,0,0,0,0,0,0,28683,39975 ,0,0,0,0,0,51654,0,0,0,27527,0,0,0,0,0,0,0,0,30859,3268,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28772,0,18212,0,0,0,0,25448,65446,0,0,0,0, 0,0,3337,1670,0,0,0,0,0,19332,0,0,0,0,24936,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1043,0 ,0,0,0,15814,0,21670,0,0,0,0,0,0,0,16263,0,0,0,0,0,0,0,0,0,32454,0,30630,0,0, 20170,9926,0,0,0,18247,0,0,14376,0,2056,17191,0,0,0,0,0,0,0,7812,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,22474,52806,1588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10825,0, 0,0,0,40934,0,0,0,0,0,0,0,28677,0,0,5714,0,0,0,0,0,0,0,0,0,0,0,0,0,25865,22246,0 ,0,0,0,17256,35751,0,0,0,0,0,0,0,0,8236,0,32108,0,0,0,43,14342,0,16517,0,0,30732 ,0,4012,133,0,40583,971,23942,0,0,27275,0,0,0,204,0,0,27140,7564,44327,27592, 57958,0,0,0,0,22344,25701,0,0,0,0,0,0,0,19524,31755,0,0,28102,0,59111,0,0,0,0,0, 0,0,12261,0,44934,0,0,0,0,31560,0,11114,0,0,0,0,0,0,0,0,0,0,0,18953,18311,0, 45159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2059,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 19399,0,0,0,0,0,0,0,0,0,0,0,0,0,58534,0,0,0,0,0,0,0,0,0,0,0,0,22411,23943,0,0,0, 0,0,0,11690,0,0,4069,0,0,2668,6342,0,0,0,0,0,0,27658,1766,0,0,0,0,23240,56070,0, 0,0,0,0,0,0,0,0,0,0,0,0,34119,0,24453,0,0,0,0,21867,0,17610,9894,0,0,27976,38790 ,0,0,0,43654,0,31559,12202,23142,0,0,0,50343,0,0,0,0,0,32806,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,49895,0,0,0,0,15786,4263,0,0,0,0,4746,3814,0,0,0,0,0,0,17192, 453,17323,0,20328,4036,0,0,0,15844,0,0,0,0,27561,31940,32296,0,0,0,0,0,0,0,11499 ,11782,0,0,0,0,9738,50471,0,0,0,0,0,35430,0,0,0,0,0,29734,0,0,0,36551,0,0,0,0, 9257,5606,0,13829,0,7015,0,0,0,0,0,25127,0,0,19051,0,0,0,0,0,0,0,0,0,0,0,0,0, 2572,0,0,0,0,0,0,29797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42342,0,0,0,0,9293, 0,17896,56038,4077,0,0,0,29899,37351,0,30823,0,8326,0,0,0,18342,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18569,54054,0,0,0,0,0,0,0,0,0,37254,0,0,31433, 61510,0,2022,0,0,0,0,0,25381,0,0,0,0,0,0,0,0,0,0,0,0,0,2149,25289,0,0,0,0,0,0,0, 0,0,0,12516,14185,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8676,0,0,0,0,0 ,0,0,0,0,0,0,36486,0,0,0,0,10889,9607,0,28711,0,0,0,0,0,0,0,0,0,0,28490,0,0,0,0, 26181,10283,1701,0,0,0,0,0,0,0,0,0,14980,0,7783,0,27846,0,0,0,56486,3892,0,0,0, 5770,16583,0,26309,13422,20292,0,0,0,0,0,0,0,0,0,28742,0,0,0,0,14536,1158,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25801,0,0,0,0,0,0,0,0,0,0,0,0,42438,0,3332,0,0 ,0,0,0,0,0,0,0,8327,0,0,0,0,0,0,0,0,0,0,0,0,17353,1447,0,0,8427,48518,1359,0,0,0 ,0,0,14986,0,32168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9230,2791,0,0,0,0,0,0,0,0, 16073,31623,4269,0,0,0,0,0,0,4519,0,0,27912,58950,0,0,0,0,0,0,0,0,8361,19812,0,0 ,0,0,6056,7877,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21701,0,0,0,0,0,0,0,0,0,0,0 ,0,9128,1125,0,16548,0,0,0,0,0,0,0,0,0,0,17292,6854,21352,0,2380,0,0,4007,0,0,0, 0,0,24357,4202,0,0,0,0,0,0,0,0,0,0,0,0,0,10664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,42823,3022,0,0,0,0,0,0,0,0,0,0,0,0,14373,0,20677,3304,2759,20522,64903,0, 0,0,38,0,0,0,0,0,0,0,0,0,0,0,27814,2802,8870,3758,1255,0,0,0,0,0,0,0,0,30027, 9510,0,0,0,0,17864,14855,0,0,0,0,0,0,0,0,0,0,23404,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 51462,0,0,0,0,0,0,0,45734,0,0,23467,32327,0,0,10826,52999,0,0,0,33222,31336, 64326,0,0,0,0,0,0,0,32166,0,0,3891,0,0,0,7017,645,0,0,0,0,0,0,27915,46087,0,0,0, 21863,0,34246,0,0,16715,0,0,0,0,14052,21416,0,0,0,0,0,0,0,0,39846,0,0,0,0,0, 38982,0,0,17512,7460,0,0,0,0,0,0,0,0,0,15428,0,0,0,0,0,0,0,28356,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,25445,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11879,0,0,0,0,0,0 ,0,0,0,0,0,0,0,19911,0,20007,0,0,0,10855,943,0,0,10821,0,0,0,0,4170,0,0,0,0,0,0, 0,0,0,9836,0,0,0,0,0,0,0,0,0,0,65415,0,0,0,0,0,0,0,0,9865,24646,0,0,0,0,0,40519, 0,0,0,0,0,0,0,0,0,12804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22091,23655,0,0,0,0,0,0, 0,31686,0,0,0,58599,0,0,0,0,0,0,0,0,0,0,0,0,0,19620,0,0,0,0,0,0,0,0,0,0,0,0,0, 24421,0,28100,0,0,0,31268,0,3204,0,0,0,0,0,0,0,0,0,14822,0,0,0,0,19947,10182,0,0 ,9480,14821,4398,0,0,14532,0,0,0,48871,1873,0,0,0,0,0,0,0,589,1541,0,0,0,0,0, 23333,0,0,0,14149,0,0,0,0,1296,14374,0,27300,0,0,0,0,0,0,7276,0,0,0,0,0,0,47718, 0,0,0,0,0,0,0,0,0,0,5164,1765,0,14405,0,37574,1994,0,6636,0,0,0,0,0,0,0,0,27815, 0,0,0,0,2568,6820,0,0,0,0,0,0,0,0,0,0,11336,26247,0,0,23912,0,0,0,30536,0,0, 34342,0,17799,0,0,0,22149,0,6118,0,25732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,26600,5190,0,0,1142,0,0,0,0,0,0,0,0,39527,0,0,0,0,0,39494,0,0,0,0,0,0,0 ,0,0,0,3085,0,0,0,0,0,0,0,4786,0,0,0,28873,6532,0,0,26664,0,9193,11719,0,0,0,0,0 ,0,31752,64646,0,0,0,0,0,0,0,0,0,0,0,11397,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25094,0 ,0,18153,20167,0,0,0,17254,0,0,878,0,0,0,0,0,0,0,0,0,0,24166,0,0,0,0,0,0,0,0,0,0 ,0,0,26059,0,0,0,0,0,0,0,0,0,0,0,0,0,31592,0,0,8167,24362,6212,0,34758,0,0,0,0,0 ,0,32520,0,0,44679,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17989,8681,29222,0,0,0, 0,0,0,0,0,10251,4902,1452,15207,0,0,0,0,0,0,0,22822,0,10469,0,0,0,0,0,0,19337, 17670,107,11494,0,0,0,0,27305,2565,0,0,0,0,0,0,0,64518,200,28389,0,0,0,0,31208,0 ,30762,0,0,0,0,0,29321,60518,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3209,3237, 12490,22663,0,0,0,18789,31464,16391,0,0,0,0,0,0,0,0,0,0,0,20646,0,0,0,27238,0,0, 0,0,0,15940,4488,6951,0,0,0,46342,0,0,0,0,0,0,0,0,0,28965,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,20584,3367,0,25350,0,0,0,0,0,0,0,0,0,0,0,0,1814,0,0,0,0,0,0,0,0,0,0,17125, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55943,0,0,0,0,0,24133,0,0,0,0,0,0,0,0,0,0,0,0,2929 ,0,0,50086,0,2918,25356,30052,115,11846,0,0,0,0,3056,0,0,0,0,17639,239,19815,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36806,0,0,0,0,0,0,0,0,0,0,0,0,0,21479,0,0,0,0,0, 28420,11786,4772,0,0,3368,36295,0,31463,0,0,14665,996,0,20582,0,0,0,9988,0,23685 ,0,0,0,52551,0,0,0,0,0,0,0,7556,0,0,0,0,0,0,0,1895,2186,0,0,0,0,0,27755,25447,0, 0,0,0,31052,63270,0,0,0,0,0,0,0,36742,0,24804,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,31048,0,0,0,0,0,0,0,0,0,21290,2276,0,0,0,0,26475,0,0,0,0,0,0,0,0,0 ,0,15332,0,0,0,0,0,0,0,0,3176,19431,0,0,0,0,0,0,0,62726,0,0,0,25380,0,0,27883, 1316,0,0,7724,3015,0,0,0,0,6697,0,0,47910,0,0,0,0,0,0,0,0,0,3141,0,0,0,14820,0,0 ,0,0,9326,0,0,0,0,0,0,0,0,0,0,31493,0,0,0,0,0,6566,0,0,0,0,0,0,6569,1348,0,25638 ,0,0,0,0,0,20324,0,0,17067,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11876,0,41030,0,0,0,26405 ,0,0,0,0,0,0,0,0,0,11431,28137,14950,0,10151,0,0,0,0,0,0,0,29574,0,0,0,0,27176, 57446,0,0,0,0,28650,57574,1387,0,0,0,0,0,0,0,0,0,0,58247,0,0,0,0,0,0,0,16805,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3526,0,15781,0,5572,13352,0,0,0,0,0,18665 ,23463,0,0,0,0,0,0,15405,6885,0,0,0,0,15272,0,0,0,0,0,0,0,0,9861,0,0,0,0,0,0,0,0 ,9512,4037,0,0,11563,49639,0,0,0,0,0,0,27880,57830,0,0,0,0,0,41831,0,21924,0,0,0 ,0,0,0,0,25509,0,27462,0,18085,0,0,0,0,0,0,0,0,0,0,0,0,13898,8068,26441,0,0,0,0, 0,0,25316,0,0,0,0,16298,7397,5706,19239,0,0,0,0,0,0,0,0,1392,50919,0,0,0,0,0, 53863,0,0,0,0,1451,0,0,0,0,0,0,0,0,0,0,35847,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,17801,15813,0,12740,0,0,0,32967,0,0,0,0,0,0,5389,0,0,0,0,0,0,0,0,0,0,31143,0, 20548,0,0,0,0,0,0,0,0,0,51686,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 12109,19015,0,34983,0,21732,3600,0,0,0,0,47750,17288,43975,22857,47559,0,0,0,0, 26408,48358,0,0,0,0,0,0,0,0,0,0,0,0,0,30470,0,0,23560,4581,0,22404,0,49286,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49831,0,0,0,27525,31691,7,0,0,25835,0,0,0,0,0, 4201,16485,0,20676,0,0,0,0,3753,23303,16264,3878,0,0,0,0,0,0,11434,0,0,0,0,0,0, 7589,0,0,0,0,0,0,0,0,0,57095,0,0,0,0,0,0,0,0,0,0,0,22820,11146,49158,0,23623,0,0 ,0,0,0,0,0,13893,0,0,0,0,0,0,11722,60071,1258,0,0,0,0,0,0,18564,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,27945,0,0,0,0,5479,0,20006,17608,3431,10988,30180,0,0,0,0,0,0,0, 24581,14,0,0,0,0,0,0,25572,0,0,0,28612,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53543,0 ,0,0,0,0,0,0,0,0,0,0,33670,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8710,0,14116,0,0,116, 292,0,0,0,37831,0,43078,0,0,0,0,0,0,0,0,21832,0,0,32134,783,0,0,30982,0,0,0,68,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5932,0,0,0,18505, 15175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3630,16965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,17797,0,0,0,0,0,0,520,42150,0,0,3122,0,0,0,22506,0,0,0,0,0,0,0,0,28550,0, 0,0,50278,0,0,13641,5958,0,35238,0,0,0,0,0,0,0,0,29993,18724,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,20619,9319,0,0,0,0,23977,0,5193,0,0,12196,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,24390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20105,677,0,0,0,0 ,0,0,0,0,29419,0,0,0,0,0,0,0,0,0,20266,0,0,0,0,10631,0,0,0,0,0,0,0,0,0,47655,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26628,12744,0,20648,0,0,0,432,0,0 ,0,0,0,0,0,0,0,0,646,0,25604,0,0,0,0,0,0,0,0,0,0,0,0,0,63782,0,0,0,0,24616,0,0,0 ,21291,0,0,0,0,0,0,0,0,0,0,45638,0,0,0,0,1931,0,0,0,20521,59975,0,20614,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,56231,0,0,0,0,0,29991,0,52871,0,20934,0,0,0,0,0,0,0,16871, 0,0,0,0,0,0,0,0,0,0,0,0,0,7237,0,0,0,0,0,47558,0,0,0,0,0,0,0,0,0,0,0,10406,0,0,0 ,0,0,0,0,43046,0,0,2930,0,12936,0,0,0,0,0,0,0,0,0,0,0,0,31141,0,0,0,0,0,0,0, 37639,0,17572,0,0,0,0,0,0,0,0,0,0,31240,0,0,0,0,0,688,0,0,0,0,0,1648,0,0,0,0, 10055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,146,0,0,0,0,0,0,0,0,0,6345,199,0,34982,0,0 ,0,0,0,0,0,0,0,0,0,0,0,56839,0,0,0,0,0,48902,0,13412,0,0,0,0,0,0,0,0,2441,4420,0 ,0,0,0,20428,933,0,0,0,0,0,0,0,45383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,54726,0,0,0,0,0,0,0,0,0,0,0,0,17036,741,0,0,0,0,0,0,0,27589,0,0,30282 ,18950,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2248,0,0,0,0,0,0,0,0,0,25993,0,0,0, 2443,0,0,31622,0,14150,0,0,0,28679,0,0,0,0,0,0,15464,0,0,0,0,54694,0,0,0,0,0,0, 3827,0,0,0,3756,0,9897,0,0,0,0,0,19082,31239,0,0,0,0,0,0,0,0,0,0,0,24580,0,0,0,0 ,0,0,0,0,0,16580,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27625,0,0,0,784,4647,32652,0,0, 63494,0,0,0,0,0,0,0,21062,0,0,0,0,0,0,0,0,0,0,3404,58470,0,32325,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,18634,2789,0,0,0,0,0,0,0,8548,0,0,0,22501,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,15881,0,0,0,0,35879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7978,17956,0,0,0, 0,0,0,0,24324,0,0,4937,0,0,0,8168,0,13420,10340,0,0,0,0,0,11780,0,0,0,0,0,0,0,0, 0,0,16712,0,0,0,0,0,0,0,17640,17991,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,2953,0,0,0,0,0,0,0,9100,16806,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30667,0,0, 19013,0,0,0,0,0,0,205,15334,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1969,0,0,0,0,0,0,0,26248 ,52518,0,49798,0,0,0,0,0,0,0,9668,0,0,0,0,0,4742,0,0,21641,0,0,0,0,0,0,53574,0,0 ,0,0,0,0,5707,0,0,0,0,0,0,0,3018,12454,0,0,0,0,2920,262,0,0,0,0,0,0,0,0,0,0,3593 ,0,0,0,0,0,0,0,0,0,0,23910,0,0,0,0,0,0,0,55879,0,0,0,0,0,775,0,43270,5066,48967, 0,0,22986,4165,8971,44838,0,0,0,0,0,62279,272,0,0,0,0,51430,0,0,0,0,0,0,28234,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13349,0,0,0,51111,20265,13861,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,585,7494,0,0,0,0,0,0,0,0,21768,62407,0,0,0,0,7979,166,0, 0,0,0,0,0,0,0,0,38918,0,56742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16296,5767,0,0,0,0,0,0 ,0,32068,0,0,0,0,0,0,0,0,0,0,0,0,0,29796,0,0,0,0,0,0,0,0,23916,30183,0,58791,0,0 ,0,0,0,0,0,20518,0,0,0,0,8969,0,0,0,183,0,0,0,0,0,2314,17445,0,0,0,0,0,0,0,0,0, 23748,0,0,8139,4839,27914,0,0,0,0,0,0,0,0,0,0,0,0,29478,0,0,16552,26663,0,53767, 0,0,13960,8039,18696,0,0,0,0,0,0,0,0,0,0,0,782,16005,0,0,0,0,0,0,0,0,6258,56806, 16456,12455,0,0,0,0,0,0,0,23780,0,0,0,0,0,0,9355,0,0,0,7273,41063,24780,57766,0, 0,0,0,0,0,0,0,0,0,3820,2597,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29225,61126,0,0,0,58439, 15691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37190,22408,967,0,0,0, 23078,26858,0,0,0,19753,0,0,0,0,0,0,0,0,0,5416,13702,0,0,0,0,0,52742,20394,38567 ,0,0,0,51079,0,0,136,8516,0,0,0,0,0,0,0,0,0,0,0,27588,0,0,0,0,0,0,0,0,0,0,531,0, 0,0,0,0,0,0,0,0,8936,5031,12520,19334,0,0,22827,30247,28074,31140,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,27497,18148,20104,59079,0,0,0,0,0,0,0,0,0,24389,0,0,6125,0,0,0,0, 9541,0,0,24553,29095,0,0,0,0,0,0,0,25444,0,0,9643,0,0,63047,0,0,0,0,0,0,0,0,0, 39558,0,0,0,0,0,0,20620,11815,499,0,5128,2278,0,0,0,0,0,46310,0,0,0,0,0,0,0,0, 23530,40166,2440,0,0,0,0,0,0,0,0,0,0,15174,0,0,0,0,0,0,0,0,0,0,26922,0,0,0,0,0,0 ,0,0,0,0,26758,0,0,0,0,0,51911,0,0,23532,0,0,0,0,51238,25737,44486,12622,0,0,0,0 ,0,0,3078,0,9253,0,0,1128,22023,0,0,0,21350,0,16420,0,0,0,0,0,0,0,65094,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22532,0,48774,0,34503,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,9797,0,0,0,0,0,0,0,13797,0,38279,0,0,1738,0,489,46343,0,45382,0,0,0,0,0,0, 0,0,0,29030,0,0,0,0,0,0,6220,56550,0,0,0,0,0,26885,0,28806,0,0,0,0,0,0,0,0,0,0,0 ,45958,0,0,0,0,20553,49927,0,0,0,0,0,0,3019,12358,0,0,0,0,0,0,0,0,0,0,26571, 13319,0,0,653,23399,0,0,0,0,0,0,0,0,22316,0,0,21188,0,0,0,0,0,0,0,0,0,27556,0,0, 0,0,0,0,0,27878,21483,27653,0,29701,237,0,10632,0,0,0,0,33766,0,0,0,0,0,0,31563, 0,0,0,0,0,1416,2439,0,0,0,0,0,0,0,0,0,0,9611,0,0,0,0,0,0,0,5611,16581,26601, 35462,0,0,0,26756,0,59271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26984,57734,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,7882,0,0,0,19528,6469,0,0,1161,0,0,0,7688,20935,425,0, 0,0,0,0,0,0,0,12519,0,12902,0,0,0,0,0,0,0,0,0,0,2411,0,11725,26086,0,0,20201,0,0 ,0,0,0,0,0,0,11045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30471,0,0,0,0,0,0,0,0,0,0,0, 21541,1141,21190,0,9188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,1093,0,0,0,0,0,0,0,0, 4842,0,13672,0,0,12230,0,0,0,10532,0,0,8937,0,0,0,0,0,0,0,0,0,0,28996,0,0,11720, 26982,0,46182,0,43911,31754,0,1160,3940,0,20772,0,0,0,0,0,24549,0,32582,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,31845,0,0,0,0,0,0,0,2310,11788,0,0,43047,0,0,0,18853,0 ,0,0,0,0,0,0,0,0,63622,0,0,7048,17318,0,0,0,21957,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1039,6279,0,0,0,0,0,0,0,0,0,0,0,0,0,12197,0,0,0,0,0,0,0,0,0, 46470,0,0,24,19719,0,0,0,0,0,0,0,0,0,39335,0,0,0,0,0,0,0,0,0,0,21353,3846,0,0,0, 0,0,0,0,36679,0,0,0,0,0,0,0,0,0,0,0,11268,0,0,0,0,0,9382,0,0,0,0,0,0,0,0,0,0,0,0 ,0,29926,0,33606,0,4708,2828,0,0,29543,0,0,0,0,0,29893,0,0,0,0,0,0,0,0,3663,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10920,7111,0,0,0,0,0,0,0,0,0,0 ,9384,0,0,0,0,0,0,0,0,0,0,0,0,20388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37094,0,0,0, 27110,0,0,0,0,0,0,21865,0,27753,30214,0,0,0,0,0,57895,0,0,0,0,0,0,0,0,0,0,12648, 5446,0,0,0,0,0,0,0,0,0,0,19784,17124,0,52007,0,0,0,0,0,0,0,0,758,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,24900,0,0,0,0,0,1476,0,65031,0,0,1205,46663,0,30023,11625, 1094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10058,0,0,0,0,0,0,28455,0,0,0,0,0,0,0,0,0,0,0, 14788,0,0,0,0,16808,0,0,742,0,0,0,0,0,0,0,0,0,0,0,21636,0,0,0,0,0,0,0,0,0,0,0,0, 15944,23207,0,0,0,0,247,0,0,0,0,24743,0,0,0,5252,0,0,0,0,0,0,0,0,29961,18660, 21099,46791,0,7045,0,0,0,0,25707,0,0,17412,3828,0,0,0,0,0,0,0,0,0,0,0,5803,5637, 0,38151,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60103,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,853,0,0,0,0,0,0,30215,0,0,0,0,0,0,0,8741,0,0,0,0,0,27366,0,0,0,0,171, 4070,0,0,0,0,0,0,0,0,24073,7366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2184,5189,0, 20932,1545,4996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7684,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6313,0,0,0,0,0,0,0,30826,0,0,0,0,0,0, 0,0,0,0,27463,0,0,0,0,0,0,0,0,0,0,21640,63303,0,0,3275,31111,0,0,0,0,0,0,0,11556 ,0,14756,0,0,0,15108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23914,28966,0,0,0,4965,0,0,0,0, 0,0,0,0,0,0,10216,5223,0,0,0,0,0,0,0,0,0,27142,0,0,1173,20198,0,0,0,0,0,56614,0, 0,0,0,0,4612,0,0,0,0,0,0,0,0,0,0,11822,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17769,7910, 0,0,31880,0,0,6055,0,0,0,0,0,0,0,0,0,0,8970,0,0,0,0,0,0,0,0,0,0,0,16840,23879,0, 0,11051,0,0,0,32552,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20842,13701,0,0,0,37191,7373, 10471,17482,25348,0,0,0,38502,0,0,0,0,0,0,0,0,0,21509,6058,0,0,0,0,0,0,3173,0,0, 0,9543,0,0,0,0,0,0,17768,12708,0,0,0,0,0,37030,0,0,0,0,0,0,0,0,0,0,12748,48743,0 ,11718,0,0,25194,0,0,0,9033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5028,0,30118,0,0,0,0,0, 42759,0,0,3720,0,0,0,0,0,0,25190,0,0,0,0,0,0,0,0,0,0,5450,5125,0,58086,0,0,0,0,0 ,27716,0,0,0,0,0,0,0,0,0,22052,0,0,0,0,26249,0,15947,3460,0,0,0,35814,0,0,0,7813 ,19500,32167,0,18597,0,0,0,0,0,28644,0,0,0,60743,0,0,0,0,0,29636,0,0,0,0,0,0,0,0 ,0,0,0,0,0,17220,15885,9414,9642,0,0,0,593,0,0,24228,0,0,0,0,0,40422,0,26244,0, 23109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64902,0,0,0,0,3979,60007,0,0,0,28199 ,0,0,0,43142,0,0,0,0,0,0,0,29158,0,30532,0,0,0,0,13256,0,0,0,0,16549,0,0,0,0,0, 26116,0,0,0,0,0,0,0,0,22825,0,0,0,0,0,0,0,1065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,18985,4805,0,0,0,0,0,17702,0,0,0,0,0,0,0,0,0,0,3468,0,0,0,0,13447,0,0,0 ,0,0,0,0,0,0,0,0,56871,0,0,1776,15780,0,0,2603,0,10280,31366,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,11592,3591,0,2372,0,0,0,0,0,0,0,20004,0,0,0,0,0,0,12072,518,0,0,1960, 8999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7178,32999,0,0,0,0,0,0,1641,0,0,0,0,0,0,0,6764, 9893,490,4005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25258,5541,0,14053,306,20743,0,0, 9422,0,0,0,0,0,0,0,11977,260,0,35175,0,0,0,0,0,0,0,18405,0,0,0,16582,0,0,0,22470 ,0,0,0,0,0,0,2792,0,0,0,14026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14858,3909,0,0,0 ,57671,0,0,0,0,0,0,15979,0,0,0,2794,15239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26884, 9070,0,0,0,0,51846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19499,37127,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,19205,10350,11910,0,0,0,0,15083,23108,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,15274,41735,0,56774,0,0,2825,0,14025, 389,0,0,0,0,0,0,0,0,21482,31910,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20456,710,0,0,25032, 21797,0,0,0,0,0,0,0,0,0,0,32427,21252,0,30150,0,43174,0,0,0,0,0,0,0,0,0,0,0,0, 11403,0,0,1029,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6892,9252,0,63206, 3496,14406,0,0,0,0,0,0,0,0,0,0,22568,0,0,21253,0,0,0,0,0,0,0,39623,0,0,10189,0,0 ,0,0,0,0,0,0,0,0,0,0,0,30729,59910,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3305,0,0,0,0,0,0, 0,0,0,7660,24871,0,838,0,0,0,0,0,0,0,0,0,0,0,0,12013,13252,0,551,0,0,0,43207,0, 30567,0,0,0,0,0,0,0,0,28394,30724,0,0,0,0,0,0,0,0,0,0,22665,22725,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,29414,0,0,0,0,16074,8966,245,1445,0,0,0,0,24872,0,0,0,0, 13124,0,35527,0,0,0,0,0,0,13259,10917,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 25191,0,0,0,13956,0,0,0,0,0,0,0,54631,19625,12070,3083,0,0,0,0,14436,0,0,0,0,0,0 ,0,0,0,0,0,0,0,21766,0,15463,29322,0,0,0,0,0,0,29990,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,23653,0,0,0,0,0,0,0,0,2643,0,0,21223,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,4114,0,0,0,0,0,0,0,0,34790,0,0,0,0,0,0,0,16103,0,0,0,0,0,0,297,3620,3338, 10372,0,14727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29924,22473,13895, 15529,32455,30378,13540,0,28807,0,0,0,0,0,0,0,64582,18380,0,0,0,0,0,0,0,0,0,0,0, 0,38598,0,0,0,0,0,0,0,0,1236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32710,0,0,0,0,4590,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64935,0,0,0,0,0,0,0,0,0,0,0,0,16744,0,0, 0,0,0,0,20005,0,0,13608,1191,0,0,0,62183,0,0,0,0,0,24484,0,0,0,0,0,0,0,0,0,0, 17643,0,0,0,0,0,0,0,0,0,0,0,0,5380,0,0,32328,0,0,63814,0,0,0,2919,0,0,0,0,17034, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,60295,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,7690,486,0,0,0,39270,0,49094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12555,0,0,0,0,0,0,0,0 ,0,0,0,0,20967,17993,12647,0,0,0,16036,32616,0,0,0,0,16294,8555,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35174,0,0,0,0,0,0,30346,0,0,0,0,0,0,0, 14797,3652,0,0,8268,12934,0,54950,0,0,0,0,2632,33959,0,23175,0,0,0,0,0,36262,0,0 ,0,0,0,0,32684,26918,0,32676,0,0,0,0,0,0,0,0,0,0,15625,11943,1206,0,0,0,0,18052, 0,0,0,0,0,16422,0,0,0,26404,0,0,28777,0,0,24902,0,0,408,45351,0,35719,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,3658,17446,0,165,0,0,0,0,0,0,0,6151,0,0,24424,0,0,0,0,0,0,0, 24170,24293,0,0,0,0,0,0,0,0,0,11847,0,39591,0,0,0,0,0,0,9549,2788,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1010,0,0,0,0,0,0,26055,31724,0,24233, 1828,0,0,0,0,0,0,0,0,0,17284,0,0,0,0,19464,0,0,0,0,0,0,0,0,32452,0,0,0,28871,0,0 ,0,0,17704,53383,0,0,0,0,0,0,0,0,0,17892,1938,0,0,0,0,0,16362,0,0,21605,0,0,5003 ,0,0,0,0,0,0,22693,0,22342,0,0,0,55846,0,0,0,0,0,0,0,0,0,22853,0,0,0,0,0,0,0,0, 6600,263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24836,0,0,0,0,0,0,0,0,0, 40711,0,0,0,0,0,33894,0,0,0,0,0,0,13000,0,0,0,0,0,0,0,0,0,0,30308,0,0,0,0,0,0, 5386,0,0,0,0,0,0,27844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17740,0,0,0,0 ,25093,29064,0,0,0,0,0,0,0,12680,11462,0,0,0,0,0,0,0,0,84,7303,0,0,0,0,0,0,0,0,0 ,0,0,27044,457,0,22924,58246,19016,0,2606,45703,0,5157,0,25028,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,2065,0,0,0,0,0,31946,0,0,0,0,0,0,0,0,0,0,0,0,33382,0, 47878,0,0,0,0,0,0,0,0,25004,0,0,0,0,0,0,0,26153,35654,0,58055,30668,0,0,0,0, 25988,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,7560,20583,0,0,0,0,0,0,0,0,0,37510,0,0,0,0,0,0,0,0,0,42822,0,0,0,0,0,0,0,0, 0,0,0,1733,0,0,0,8196,0,0,11241,0,30572,60326,0,15013,0,0,0,40646,0,23812,0, 10022,0,0,0,0,0,0,0,0,12874,31015,0,0,0,0,0,0,1608,0,0,0,0,18308,0,0,0,0,27114,0 ,0,0,0,0,0,0,7944,1382,0,11813,0,0,0,0,0,0,0,0,0,0,0,0,0,24517,0,11621,0,0,0,0,0 ,0,0,0,0,0,0,21702,0,0,13100,8262,2644,7973,0,0,0,0,0,0,0,0,0,0,0,0,1033,12581,0 ,25221,0,0,0,40998,16301,62983,0,0,0,0,1263,9318,0,0,0,18854,0,0,1741,33895,0,0, 0,0,0,0,26377,0,0,0,0,0,0,0,0,0,0,32165,0,51143,0,0,0,0,0,29412,0,0,0,0,0,0,0,0, 1674,4230,0,0,0,0,0,10502,0,0,0,0,5545,0,0,0,0,0,2099,45158,0,0,0,0,0,0,0,0,0,0, 14157,0,26955,0,0,0,0,0,0,0,0,0,17096,0,0,0,0,0,0,0,0,0,0,0,0,0,27050,6726,0,0,0 ,0,0,0,0,0,28554,0,0,7142,0,0,0,0,16936,0,0,0,25833,0,4399,6980,0,46214,0,0,0,0, 0,10630,21164,0,0,0,0,0,0,0,2446,48551,0,0,0,0,0,0,0,0,0,0,0,13381,0,0,0,0,0,0,0 ,0,15400,12135,0,0,0,0,0,4774,586,0,0,0,0,0,0,0,0,23751,9736,4548,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25577,29607,6250,1637,0,0,0,0, 22024,0,0,0,0,22308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37414,24044,0,0,0,14474,29735, 0,7077,0,45990,0,0,0,0,30568,40039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 6150,0,4228,0,0,0,0,0,27687,0,0,0,0,0,0,0,24548,21513,1350,0,0,0,33607,0,0,0,0,0 ,0,0,0,11784,1414,0,0,0,0,0,0,0,18244,940,0,0,0,0,0,0,7270,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,16709,0,0,0,0,0,0,0,48935,0,0,0,0,0,0,23660,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,53350,0,0,0,0,0,0,4236,16358,0,4422,6665,32644,0,0,744,18084,0,11014,0,0,0,0,0, 29508,0,0,0,0,0,0,0,7686,0,0,13289,5478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,12872,0,0,24134,1005,22916,0,31429,23400,0,0,0,0,0,0,0,28424,0,0,0, 25706,27109,0,0,26345,0,0,0,0,0,0,25126,0,0,88,0,0,0,0,0,0,0,17032,0,0,21799,0,0 ,10060,0,12296,21892,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20777,14311,0,58182, 32232,0,10282,0,2121,11527,0,0,0,12325,0,0,0,0,0,0,0,28804,2344,8133,0,0,0,0, 21864,62695,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2771,0,0, 23204,0,0,0,0,0,6278,0,0,0,0,0,26597,0,0,0,0,23144,0,0,0,0,0,31816,20070,0,0,0,0 ,0,0,0,0,0,0,24456,2118,0,0,0,0,6570,1156,0,0,0,0,0,0,0,30406,0,0,0,28388,3572,0 ,0,26599,12426,5286,0,0,0,0,0,4967,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24970,24167,0,0,0 ,0,28745,4678,0,0,0,0,0,0,0,1444,236,0,0,0,0,0,0,0,0,19428,0,0,0,0,0,0,2092,0,0, 0,0,0,0,0,0,0,2827,0,0,0,0,0,19881,19204,0,11749,0,0,0,0,0,0,0,17958,0,17894,0, 18726,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,21510,5033,0,0,0,0,22855,0,0,0,0,0,14598,0,29605,0,0,0,0,0,0,0,0, 617,0,0,0,0,47142,0,0,0,0,0,0,0,0,0,0,3627,0,0,0,0,0,0,0,0,0,0,0,0,0,2225,14823, 0,0,2637,6182,78,15078,0,0,0,0,20264,0,0,0,0,0,0,36743,4140,44551,17352,25703,0, 0,0,0,0,0,0,0,0,0,0,0,14024,0,0,0,0,0,0,28004,0,0,0,0,0,7588,0,0,0,0,0,0,0,2087, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18028,0,0,0,300,14212,0,0,1386,40327,0,0,0,0 ,0,0,31082,0,0,22374,0,0,0,0,0,35718,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 26532,7756,0,0,18982,0,0,0,0,0,0,0,0,6440,1159,7180,0,0,0,0,0,0,45766,0,57798,0, 16740,0,0,6802,60454,0,0,0,26470,0,0,0,0,0,65382,4362,7750,0,0,0,0,0,0,9096,4743 ,334,0,0,0,0,0,0,39974,0,0,0,25828,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3027,0,0, 0,15816,0,0,0,0,0,0,0,0,48327,0,0,0,0,0,0,0,0,0,0,16168,41799,0,0,24458,8581,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12292,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,54503,0,0,0,0,5097,30852,18664,0,0,0,0,0,0,16484,0,0,27337,0,0,0, 0,0,0,0,0,0,0,0,0,35942,0,0,0,0,0,0,0,4356,0,0,0,0,0,57030,0,0,1417,41191,0,0,0, 0,0,23429,0,0,0,0,10024,21735,0,0,10126,0,0,0,0,19046,0,0,0,0,0,0,24105,4710,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4394,0,0,0,0,13253,0,56391,0,0,0,0,0,0,0,0,0,0, 0,19174,0,0,0,0,0,0,0,0,0,55974,0,0,0,52070,0,15620,0,0,0,0,0,2660,0,0,0,0,21644 ,0,0,52455,0,0,0,0,0,0,0,0,0,8902,0,0,0,0,0,0,3116,0,464,34726,0,0,0,0,0,0,25003 ,12423,0,27172,1896,7335,0,0,0,0,0,35686,0,0,0,0,3472,0,0,0,0,22406,0,0,0,0,0,0, 0,0,0,45254,0,0,0,0,0,0,0,0,0,0,0,0,0,21124,23594,33127,0,0,0,0,0,0,16684,22087, 0,0,0,0,0,0,0,0,0,0,0,0,8714,0,0,0,0,0,0,0,0,0,0,55814,0,0,0,0,0,0,4109,23460,0, 0,8874,0,0,0,0,0,0,0,0,0,147,0,0,0,0,0,0,0,0,0,0,0,0,0,29960,63398,1302,0,0,0,0, 0,0,0,0,24806,0,0,0,0,0,0,0,0,0,9799,0,0,0,0,0,0,0,31333,0,0,0,0,0,19557,0,0,0,0 ,0,5701,0,0,0,63014,0,0,0,0,0,0,0,21254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12484,0,0, 0,48326,0,0,0,0,0,0,0,0,0,0,0,15783,0,0,1202,0,0,0,0,23174,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,3086,49191,0,0,5387,15141,0,0,0,3365,0,0,0,0,20076,14021, 0,0,0,0,0,0,0,0,0,0,376,40198,0,0,0,52039,0,24932,0,0,0,0,808,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,9860,0,0,0,0,0,23719,0,21476,0,0,0,0,20776,4807,0,0,3177,16678,0,0,110 ,10853,0,0,0,17382,0,0,0,0,0,0,0,0,0,43462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,7500,4966,0,0,0,0,0,0,0,52102,0,24516,0,0,0,0,0,0,0,0,0,0,0,0,0,26535,0,0 ,0,46247,0,0,0,15557,0,0,0,0,76,52327,0,0,0,0,17866,0,0,0,0,0,0,0,0,0,0,46758,0, 0,0,0,0,19173,0,0,0,0,0,0,0,0,0,44038,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2985,0 ,0,0,0,0,0,14310,0,0,2125,45831,0,0,0,0,0,0,9838,0,13227,19492,0,0,0,29764,0,0,0 ,0,686,30053,0,0,0,0,0,30789,139,20837,0,0,0,0,502,18533,0,0,0,0,0,19111,0,0,0,0 ,0,31396,0,0,0,17444,0,0,0,0,0,0,0,49862,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25610,550,0 ,0,561,0,29034,0,0,0,3528,0,0,0,1715,14661,18,63463,0,0,0,0,0,0,0,0,0,0,14186,0, 0,0,0,0,0,0,0,0,0,0,29578,59014,0,39430,0,0,0,0,2250,16612,0,31780,0,0,0,0,0,0, 462,16967,0,29029,0,0,0,0,0,23462,0,0,0,0,0,0,0,0,1768,0,6025,16998,1804,0,0, 54182,0,0,0,0,0,0,0,0,14124,0,6154,29702,0,0,0,0,0,7716,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,48807,0,8292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16389,5933,0, 14857,51303,0,0,0,0,0,0,0,0,0,0,0,35623,9097,23047,0,0,23112,0,0,0,0,0,438,0,0,0 ,0,0,0,0,151,9254,1390,0,0,0,0,0,0,54215,0,0,0,0,6187,0,0,0,0,13095,0,0,0,0,0,0, 0,0,0,0,0,0,9866,0,0,59622,0,0,0,0,0,0,0,0,0,25286,0,0,23848,32069,0,0,0,0,0,0,0 ,0,0,9255,2187,15270,437,0,0,0,0,0,0,0,0,0,0,19493,0,0,0,0,0,0,0,0,0,0,0,11748,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16902,0,0,0,0,0,0,0,0,0,22212,1865,17543,0, 0,0,0,0,0,21996,0,0,0,0,55975,0,0,0,0,0,0,0,0,32138,21156,0,0,0,0,0,0,14249,0,0, 0,2388,0,0,0,0,6823,0,0,0,0,0,0,0,0,0,0,0,0,0,26694,0,0,6059,53511,0,0,0,0,0,0,0 ,49542,6159,0,0,0,0,0,0,0,0,0,0,0,0,0,1036,24036,0,2501,0,0,0,0,0,0,17419,51271, 3377,15142,0,0,0,0,0,0,5007,62374,0,56935,0,0,0,0,0,0,0,0,0,0,0,24422,0,0,0,0,0, 0,0,0,942,0,0,0,0,0,0,0,0,0,0,28263,0,0,0,0,0,0,0,15622,0,19749,0,0,1611,0,22219 ,48583,25129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17476,0,0,0,0,0,0,0,0,0,0, 721,0,0,0,0,32518,0,0,0,18469,0,0,0,0,0,0,5896,29927,3657,23046,0,0,3214,0,0,0,0 ,0,0,0,0,0,112,0,0,0,0,0,3048,455,0,31012,0,0,0,0,0,0,0,23270,0,32677,0,0,0,0,0, 38086,0,0,0,0,0,0,0,0,0,0,0,0,0,4900,0,0,0,0,0,0,0,0,0,25541,0,18788,0,0,22248, 1351,0,61734,4524,30629,0,14887,242,29063,0,0,14408,4741,0,0,0,37318,0,0,0,0,0,0 ,0,0,0,0,0,0,8106,0,32107,0,0,0,0,0,0,0,0,0,0,0,1481,0,0,28132,0,25798,0,59783,0 ,0,0,0,0,59078,0,0,0,23366,0,0,0,0,0,0,0,30887,0,0,0,0,16200,0,0,0,335,0,0,0,714 ,0,0,0,0,0,0,0,0,0,0,0,0,0,30730,9478,0,0,0,0,0,0,0,0,0,0,0,18790,0,0,0,0,663,0, 0,0,1034,31431,0,0,0,0,0,0,0,0,0,0,30120,0,0,0,0,13925,0,0,0,0,0,0,2280,13414,0, 0,0,0,0,0,22028,23687,3017,11047,0,0,21738,18630,0,0,0,0,0,0,0,30246,0,0,0,0,0,0 ,0,0,0,0,0,0,17257,0,21896,63783,0,0,0,21094,0,18662,0,25700,0,22533,0,0,0,0,0, 6341,5800,11111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15399, 12970,6501,0,0,3179,26438,0,0,0,0,0,0,0,15750,0,13062,0,0,0,0,0,0,0,0,0,0,142,0, 0,0,0,21284,11177,4391,0,0,0,0,19595,40647,0,0,0,0,0,11877,0,0,0,26439,0,0,0,0, 695,49126,27467,11972,0,0,0,0,0,0,9961,0,0,0,31722,62982,0,0,0,0,15817,52710,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24614,0,0,0,0,0,20550,0,0,5034,3942,0,0,0, 45927,0,0,0,0,0,0,0,0,0,0,2548,0,0,0,0,0,0,45606,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,3405,12582,15563,54087,0,0,0,0,0,0,0,0,0,0,0,0,24202,5893,0,0,0, 44230,0,0,0,5605,0,47782,0,32230,0,0,0,0,0,0,0,0,0,0,0,7014,0,0,0,0,16488,3175,0 ,27237,0,0,0,0,0,40902,0,0,0,0,0,0,0,32004,31434,0,24392,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,29130,58214,0,0,0,0,0,0,29002,0,0,0,0,0,0,0,0,0,0,55366,0,0,0,0,0,0,0 ,0,0,0,0,37926,0,0,0,0,0,0,0,0,1290,0,0,0,4713,0,0,0,0,0,0,0,0,0,0,0,0,0,20812,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1803,966,0,17700,0,0,654,19109,0,51655,0,0,0,0,0, 10470,1584,0,0,0,0,0,0,0,2506,0,0,25159,4303,0,0,0,395,15879,0,0,0,0,0,0,0,0,0,0 ,1352,6535,0,19652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4722,7909,0,0,0,0 ,30152,0,0,64742,0,0,0,0,0,0,2153,9125,0,0,279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,41894,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,1328,17030,0,0,0,0,0,0,0,54151,0,0,0,0,1775,54535,0,0,0,0,31624,0,0,0, 7150,0,0,0,0,0,0,0,1840,35943,0,0,0,0,0,56455,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 64486,0,0,0,51174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4134 ,0,0,0,0,0,0,0,0,0,0,0,17092,0,0,0,0,0,0,0,0,0,0,0,0,12,16134,19883,39943,10281, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44711,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 14125,2407,0,0,0,0,0,0,0,0,0,0,26921,0,0,0,0,0,22188,0,20810,10053,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28170,0,15208,0,0 ,32517,5736,19271,3562,10534,0,0,0,59655,0,0,0,0,27084,60422,0,0,24969,0,0,0, 2636,0,0,0,0,26277,0,0,0,0,0,0,0,0,0,0,0,30596,3594,0,0,0,8362,14565,0,0,0,0,0,0 ,10793,12326,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5906,59686,0,0,23081,517,0,15556,0,0,0, 8486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19877 ,0,0,0,0,0,0,0,0,7497,0,0,26085,0,0,23784,63591,6568,6310,0,0,0,0,0,0,0,0,0, 10054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7018,14470,18858,0,5641,10660,0,0,0,0,0,0,0, 35526,1515,0,0,0,0,0,0,0,0,0,0,0,27656,0,0,9606,0,39590,0,0,0,0,0,0,0,0,0,0,0, 53926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,4327,12649,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,20199,0,0,0,0,0,0,26730,0,0,0,19400,14695,0,31334,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19589,0,0,0,0,0,0,0,0,5064,11908,0,27333,0, 0,0,0,0,0,0,47751,0,0,0,26662,0,0,0,0,0,0,0,55655,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,6245,0,0,0,0,0,0,0,0,23368,63911,0,0,0,0,0,0,0,0,1974,0,0,0,0,0,0,0, 8520,24037,0,0,0,0,0,0,0,26279,0,0,0,22886,0,0,0,27782,0,30694,0,0,0,0,0,0,0,0,0 ,0,0,33703,0,0,0,30405,0,34598,0,51047,0,0,0,0,1908,0,0,0,0,0,0,0,0,0,0,1511, 21897,0,0,0,0,0,0,51398,0,24870,0,32647,0,0,0,35015,0,0,0,0,0,0,0,11204,0,0,0,0, 0,0,7758,57991,0,0,0,30949,0,0,22,15140,9162,0,0,0,0,0,0,25540,20136,7108,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16427,10789,9805,0,0,0,0,0,0,0,0,0,4680,0,0,52679, 0,0,0,0,0,14884,0,0,0,16804,0,0,0,0,0,0,9578,5287,0,0,0,0,0,0,0,34054,0,0,0,0,0, 19076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7627,55719,0,39463,14446,58374,0,0,0,0,23465, 15845,0,0,0,0,0,38534,0,0,0,17893,10922,0,7176,678,0,0,0,0,0,0,0,0,3113,46279,0, 0,0,0,0,0,0,23334,0,0,18088,23268,0,62342,0,0,0,16613,0,0,0,0,0,0,0,0,0,38182,0, 0,0,0,0,0,25292,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10344,71,6446,0,0,1893,0,0, 1106,0,28680,30756,0,41126,0,0,1492,0,15341,0,0,0,0,17575,0,21220,0,0,0,0,0, 25060,2088,21828,0,0,0,0,0,358,0,0,0,0,0,16708,0,0,0,1668,0,0,0,0,0,12260,0,0,0, 0,0,0,0,0,4078,0,0,0,0,0,12713,6215,0,0,20329,0,0,0,0,0,0,0,0,0,0,31204,0,0,0,0, 0,0,0,0,0,0,3732,0,1646,0,0,27460,0,34406,17128,14341,0,0,0,0,0,19527,0,0,0,0,0, 0,0,0,0,0,6120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8551,21546,10212,3020, 2951,0,17638,0,0,6985,44999,2218,8197,0,0,30472,63366,0,26660,0,0,0,0,0,0,0,0,0, 0,0,0,1265,0,0,0,0,0,0,0,2610,0,0,0,11278,20295,0,0,0,0,0,19780,0,0,0,0,0,0,2353 ,10852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5421,24292,0,0,0,0,0,0,0,0,0,0,0,0,0,34407,0, 0,0,0,0,0,15432,20774,0,0,0,0,0,0,0,0,12360,10757,0,0,0,33126,0,0,0,0,0,0,0,0,0, 0,0,29573,0,2343,0,0,0,0,0,63079,0,0,0,0,0,0,0,0,0,43015,0,16038,0,0,0,0,0,0,0,0 ,1480,25573,0,0,0,0,0,0,0,8839,0,0,0,0,0,0,0,24645,0,0,0,0,0,0,0,0,0,0,0,0,0, 5063,0,0,0,0,0,45830,0,0,0,0,0,0,0,0,0,0,823,0,0,64039,0,0,0,0,0,0,0,0,0,0,0,0,0 ,15300,0,0,0,0,0,0,2924,46759,6760,19268,0,0,0,0,0,0,0,0,0,34182,0,0,3977,18149, 0,0,0,32199,0,0,0,0,0,0,0,0,0,23524,25994,0,0,10343,0,0,0,9733,0,0,0,0,0,0,0,0,0 ,4740,0,0,0,0,0,0,0,0,0,16741,0,0,4626,23367,0,0,31400,0,0,3557,0,0,4234,0,0,0,0 ,0,0,28486,0,0,0,0,0,14213,0,57191,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,65318,29832,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29989,0,31846,0,0,8170,0,0,4421,27626,30884,0 ,0,20204,0,0,0,0,44614,534,20868,0,0,0,0,0,0,0,0,0,0,0,0,0,28710,0,10277,0,0,0,0 ,0,29511,0,19813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27020,0,0,0,0,0,0,53094 ,0,35207,0,0,0,37542,0,61766,8584,8037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12488 ,22757,0,0,0,0,0,0,0,0,0,0,0,0,0,23814,0,0,0,0,0,0,0,0,0,19973,0,0,0,63943,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36006,0,0,0,19012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,8580,0,0,0,0,0,0,0,18021,0,0,0,0,0,0,0,0,80,1254,0,0,0,42630,0,0,0,0,0, 0,0,16262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2124,25479,0,0,0,0,16873,0,0,0,0,3142, 0,0,18443,0,0,0,0,0,3917,0,8841,1190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,20645,0,0,0,0,0,0,0,0,0,0,0,9284,0,0,24394,41351,0,0,0,42087,0,62566,0,0,0,0, 0,0,0,0,0,0,6728,4199,0,0,0,0,25515,0,1231,0,374,15623,0,29956,0,14118,0,0,0,0,0 ,19047,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31718,0,0,0,0,0,0,0,0,0,0,0,20900,0,16743,0 ,0,0,28902,0,0,0,0,0,0,0,0,0,0,0,0,2578,0,0,0,0,0,0,0,0,0,13838,0,0,10052,0,0,0, 0,7432,43783,17097,0,0,0,0,0,873,0,0,0,398,0,0,0,0,0,0,0,0,0,8459,23559,0,53030, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35750,0,4071,0,0,0,38662,0,41414,0,0,0,0,11656,0,0 ,0,0,0,4011,42695,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25353,0,0,0,0,0,0,0,27177,22372,0, 0,0,0,0,30980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46278,3976,12711 ,0,0,0,0,0,0,0,0,0,0,0,20517,0,0,0,0,0,0,0,0,0,0,0,0,4072,11078,0,0,16553,2405,0 ,0,0,0,0,0,0,0,2670,0,0,0,0,0,0,32998,0,0,0,0,0,0,0,47046,0,30533,0,0,11050,9734 ,13129,0,0,0,0,23494,0,0,0,0,0,58310,0,0,0,57543,0,0,0,0,0,0,0,0,0,0,0,0,0,454,0 ,0,0,0,0,0,5163,59687,2220,0,0,0,0,0,0,29510,0,0,0,0,0,0,0,0,0,0,0,17316,0,20069 ,0,0,0,0,0,0,0,0,0,5319,0,0,0,0,0,0,0,0,0,27174,0,0,0,0,0,0,0,22949,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,19208,0,0,0,0,0,0,20933,0,0,6026,8742,0,0,0,17380,0,13127,2797,0 ,0,30116,0,0,5963,8004,0,57126,0,0,0,0,0,42854,14792,30759,0,24964,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,16933,0,0,0,0,0,0,15176,40839,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 788,30341,0,0,0,0,21036,24102,0,0,0,0,30123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 22597,31531,26789,0,59559,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9352,29863,0,0,0,0,0,0,0,0 ,0,24551,0,0,0,0,0,0,0,20516,0,0,0,39462,3665,0,28265,0,8778,64262,0,57414,9132, 0,0,18276,0,0,0,0,0,0,0,0,0,0,26344,30725,524,19751,0,13796,0,0,0,0,0,0,0,0,0,0, 18155,0,12841,0,74,24998,13579,1061,0,64199,0,0,8776,0,0,60231,0,25412,0,0,0, 59143,0,0,0,0,0,0,14344,1510,0,0,0,38374,0,0,0,0,0,0,0,0,13353,0,0,0,0,0,0,0,0,0 ,0,9446,0,0,0,0,0,0,0,32613,0,0,0,0,0,0,0,0,0,0,0,0,0,19844,0,0,0,0,14859,0,0,0, 0,6662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14154,0,29770,0,0,0,0,0, 16520,2182,0,0,0,0,0,36102,3340,0,0,0,0,0,0,0,0,25189,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,15720,0,0,0,0,0,0,22758,0,0,304,0,3243,14117,0,0,0,0,0,0,0,0,0,0,5130, 12679,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21733,10441,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,36103,0,0,0,0,0,23590,0,57479,0,0,0,0,0,0,0,0,0,0,0,0,10824, 18372,0,0,0,0,0,35078,15722,12967,0,0,0,0,0,34599,0,0,0,0,0,0,0,0,0,0,0,0,0, 53639,0,38630,0,0,0,0,0,0,31017,11333,0,0,0,0,19144,0,9513,0,0,0,0,0,0,0,0,56711 ,24042,0,1197,0,0,58502,0,0,0,0,0,0,0,0,0,8230,6121,18628,0,0,0,0,0,0,25290,0,0, 0,0,0,1514,0,0,0,0,0,0,0,14378,9798,32363,0,0,0,0,0,9577,0,0,0,0,0,0,26788,0,0,0 ,0,0,0,330,10533,0,0,0,0,0,42246,0,0,0,0,0,0,5074,21028,0,38119,0,0,0,0,0,0,248, 0,31176,62054,0,53287,0,0,0,0,271,0,0,0,0,0,0,0,0,0,0,0,0,0,9224,2117,0,0,0,0, 15818,5607,0,52582,0,0,0,0,0,0,0,0,18248,24005,23018,0,0,0,0,0,0,0,0,0,0,0,0,0, 427,0,0,39910,0,0,7080,11399,0,0,0,0,0,0,0,0,0,0,22220,57894,0,0,0,0,0,0,0,13156 ,0,1413,1007,0,0,0,0,21415,0,21543,0,0,0,0,0,0,0,0,0,41702,22538,9573,0,0,0,8806 ,0,0,6920,56359,0,0,0,0,0,0,0,0,0,0,0,42215,0,0,13708,0,0,0,0,0,0,0,0,0,0,16453, 0,0,0,0,0,0,1582,1764,3282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11653,0,0,0,0,12139,0, 29482,31076,1673,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40262,0,0,0,33862,0 ,0,0,0,0,20996,0,0,0,0,0,4615,0,0,0,0,0,0,0,0,0,0,0,43943,333,19367,0,0,0,0,0,0, 0,26821,0,32389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4936,11687,0,0,0,0,0,0,0,0,0,10885,0 ,0,0,0,0,25926,0,0,0,0,0,0,15851,0,0,0,0,0,0,0,0,0,8360,0,17130,7942,0,11460,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,18150,14248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 22310,0,0,0,42758,0,0,0,0,0,0,0,0,29354,5574,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,31109,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11236,0,0,0,0,0,0,0,0 ,0,0,0,0,0,9156,0,0,1801,14023,0,0,0,0,0,62406,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 23620,0,0,0,0,0,0,0,0,0,0,31018,65510,0,0,0,0,0,0,0,26182,0,0,0,0,0,0,0,27717,0, 0,0,0,0,0,0,46950,0,0,0,0,0,0,0,0,0,0,0,0,0,31108,0,11366,0,0,0,3717,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8552,6054,3339,0,0,0,0,51622,0, 0,0,0,0,0,0,3718,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28358,0,2756,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1462,0,0,27622,0,0,0,0,0,0,0,62502,14410,56743,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,12206,0,0,0,0,0,0,0,0,0,0,0,0,36550,0,38054,0,0,0, 21221,0,0,0,0,0,0,0,27077,0,0,16906,0,12587,12101,0,0,0,0,0,0,10414,28775,21769, 60167,0,56646,0,0,0,0,0,20740,0,0,0,0,0,0,5931,5351,0,65478,0,0,0,0,0,0,7977, 52647,0,4868,0,0,0,55463,0,0,0,0,0,32197,0,0,0,0,0,13445,0,0,0,26631,0,0,0,0,0, 11237,0,0,0,0,209,1285,0,0,1928,0,0,0,0,43334,23849,23172,0,0,0,0,0,0,0,0,24712, 62439,8811,3463,20457,0,0,0,0,0,0,0,0,0,16008,56263,0,0,0,0,0,0,0,0,0,0,0,60358, 22761,6565,0,0,30888,27686,0,0,0,17093,0,0,0,0,22121,0,0,0,7593,14182,0,28103,0, 0,0,0,0,45126,0,0,0,0,0,0,0,0,0,0,0,0,0,31844,0,0,0,0,0,0,0,0,0,0,0,0,0,18500,0, 0,0,0,28202,0,0,0,0,0,0,0,0,26308,0,29541,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 29572,0,0,0,21285,0,0,0,0,0,60839,0,0,0,0,0,30407,15949,2981,0,0,0,46439,0,0,0,0 ,0,23911,26505,25222,12811,5895,0,6343,0,0,0,0,0,0,0,0,0,0,0,31815,0,0,0,0,0,0,0 ,0,19688,10245,0,0,0,31301,26985,28964,0,0,0,0,0,0,0,0,27208,31172,0,0,0,0,216,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16292,0,0,0,0,0,8743,0,0,0,0,0,0,0,0, 0,0,0,0,0,6438,0,0,0,33319,0,0,0,33286,0,0,0,0,0,0,0,0,0,22181,7499,24774,0, 10756,0,44775,724,0,25768,25669,24873,5349,25257,0,0,54566,0,0,0,0,0,0,0,0,0,0,0 ,327,439,357,0,0,6536,8452,0,0,1802,0,0,61350,0,15045,0,0,0,0,0,0,0,0,0,0,0, 38343,0,0,0,0,0,0,0,0,0,0,32491,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 22885,0,0,32073,0,0,0,9546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27748,0,0,23176,0,0,0 ,0,0,0,0,0,0,0,0,0,24583,0,0,0,0,0,34118,0,0,0,0,2158,0,5586,30340,0,0,0,0,0,0,0 ,0,0,0,0,0,0,24452,0,0,0,0,2409,4390,0,24196,0,0,0,0,0,0,32264,26948,20587,0,0,0 ,2155,0,0,0,0,0,0,0,0,0,0,0,4328,26276,0,0,0,0,0,0,0,0,23564,0,12458,11367,0,0, 25162,0,0,0,0,0,0,65414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32966,0,0,0, 34662,0,0,0,0,0,39238,0,0,0,0,11400,10214,266,12452,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,15173,0,0,0,13668,0,13222,0,23364,0,0,0,0,0,11941,0,0,0,0,0,0,0,0,0, 25575,0,0,0,57383,0,0,0,10308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,2865,9287,75,0,0,0,0,0,0,0,0,0,0,21508,22380,59526,0,0,0,23589,0,0,0,51590 ,0,0,0,0,0,0,0,0,0,0,0,4645,3980,28295,0,0,0,0,0,12388,0,0,0,0,0,0,0,0,0,0,0, 21734,0,17607,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41767,0,0,0,0,0,0,0,18436,0,0,0,0,0, 0,0,21958,0,19430,0,0,1204,0,0,0,0,0,0,0,0,0,3240,55239,0,0,0,0,0,30660,0,0,0, 28901,0,0,0,0,4716,0,0,0,0,0,0,0,0,0,0,0,11754,0,0,0,0,22086,0,22564,8749,0,0, 28391,0,0,0,0,0,0,0,0,0,0,0,2886,0,0,0,0,0,0,0,29062,0,0,0,0,0,0,0,40358,0,0, 15916,39526,0,13735,0,0,0,0,28938,0,407,4006,0,0,0,26916,0,0,0,0,0,27526,30280,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24586,0,24649,5126, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8684,0,0,0,0,0,0,0,23019,0,22377,18599,0 ,0,0,0,0,0,0,0,0,0,27593,9735,0,20196,0,0,0,0,28168,48423,0,0,0,0,0,31399,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,13892,0,0,0,0,0,17606,0,0,15242,29767,26378,17701,0,0, 14472,0,4840,0,0,0,0,0,0,24708,0,9349,4330,0,0,0,0,0,0,0,16137,0,0,34854,0,0,0,0 ,0,0,0,0,0,0,0,25063,0,0,0,0,0,0,6603,12583,0,0,0,0,0,0,0,0,7433,29188,0,0,0,0,0 ,31270,0,0,22920,3143,0,0,0,0,0,23461,0,0,0,0,0,0,0,0,618,0,0,0,0,21381,0,11524, 0,0,0,0,0,0,21004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,312,23239,0,0,0,0,0,0,0,0,0,0,0, 0,2313,0,0,40614,0,0,14825,0,0,0,0,0,0,46535,0,41190,7853,0,31656,0,0,0,0,0,0,0, 0,0,3433,5255,0,0,0,0,0,0,0,33958,0,0,0,0,72,15493,0,0,0,0,0,0,0,36070,0,0,0,0,0 ,0,0,14724,0,0,0,0,0,29828,0,0,0,0,0,0,0,18822,20008,0,0,0,0,2438,2952,0,0,0,0,0 ,0,0,0,0,0,0,0,0,3342,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24420,0,19908,0,0,0,8101,0, 17479,0,0,3530,0,8202,29319,0,0,1132,6789,0,0,23881,0,0,0,4810,0,0,46918,0,0,0, 41574,0,0,0,0,0,0,0,0,0,48582,0,0,0,0,0,0,0,0,0,0,0,0,0,39334,0,0,0,26117,0,0,0, 0,0,0,5100,0,0,0,0,0,23496,27813,4045,54918,0,0,0,0,0,0,6473,7428,0,0,0,0,6792,0 ,0,0,0,0,3560,32103,0,0,0,0,0,0,0,0,0,0,0,54790,0,0,6926,0,0,0,0,16518,0,0,0,0,0 ,20806,0,0,0,0,1841,3174,0,0,0,0,9612,18374,0,0,0,0,32744,0,0,9671,0,59879,0, 23300,8073,0,0,14758,0,0,0,10342,0,0,0,0,0,0,24808,14759,0,0,0,0,0,0,5515,0,0, 14852,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2354,23271,0,32740,0,0,0,0,0,0,0,0 ,0,0,18472,0,0,0,0,0,0,0,0,33190,0,0,0,0,0,0,0,0,8972,21669,0,0,0,0,0,0,0,0,0,0, 0,25574,0,0,0,0,5096,0,14283,55367,0,0,0,0,0,0,0,0,0,12644,0,0,0,0,4651,0,0,0,0, 0,0,0,661,0,0,13638,19466,0,0,0,0,0,31273,0,8010,0,0,0,0,0,3211,0,0,0,0,63430,0, 0,0,0,0,15237,0,0,0,0,0,0,19018,2437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14312,0 ,0,0,0,16836,0,0,471,35975,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,6023,0,0,0,0,0,0,0,0,11593,9639,0,0,0,55783,0,5700,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27908,0,26598,0,0,6667,6470,0,0,0,0,0,0,0, 62534,0,0,0,0,16522,27911,0,0,10025,7172,0,0,779,0,360,17477,0,0,0,61991,7752, 7717,1494,0,0,0,26569,40742,0,0,0,0,0,0,0,26406,10474,32196,0,0,0,0,0,50567, 16521,11716,0,0,0,0,0,55558,0,0,0,0,0,0,0,0,0,0,0,61926,0,26436,0,0,0,0,4459, 10598,0,0,0,0,0,0,0,0,0,0,0,9223,0,29318,0,0,0,0,0,60423,0,0,0,0,0,0,0,47078,0, 50246,0,12612,0,0,0,0,0,0,0,61799,0,55015,0,21060,7309,0,0,0,0,0,11976,0,0,0,0, 23527,0,0,0,0,0,0,10347,15942,0,34023,0,0,0,0,4969,0,0,0,0,0,0,0,0,28997,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3466,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19716, 28872,0,0,0,0,0,22152,0,0,0,0,0,0,26342,0,0,0,9764,0,0,0,0,0,0,0,21798,0,0,0,0, 13,6853,32136,0,0,0,0,0,0,0,750,0,0,54502,0,0,0,0,0,0,0,0,0,46183,0,0,625,22854, 0,0,0,0,2061,23588,0,0,11049,56262,0,0,18538,1509,0,0,17258,4453,0,0,0,0,12429,0 ,0,0,0,8102,0,0,0,0,0,0,8074,0,23852,0,0,0,0,0,0,0,0,0,0,0,16136,3428,0,27876,0, 0,0,7332,0,0,0,0,0,28900,0,0,2284,0,0,17573,201,1508,0,0,0,0,0,0,0,0,0,31365, 27688,22565,0,0,0,5159,0,0,0,0,4584,42599,0,0,0,44422,1068,23173,0,0,0,613,0,0,0 ,12645,0,0,0,0,0,27076,6732,0,0,0,3913,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,22244,29992,15911,0,0,0,0,0,22982,0,0,0,0,0,0,0,50598,0,0 ,0,0,0,0,5161,1574,0,0,0,0,0,0,0,0,0,19108,0,0,0,35014,0,0,0,25956,29067,0,0,0,0 ,0,0,0,0,0,0,47079,0,0,0,0,0,0,0,0,0,0,1356,61927,0,0,0,64455,2122,64231,0,0, 18763,0,0,0,0,0,0,0,0,0,907,34471,0,0,0,39078,0,0,1995,0,0,0,0,0,0,0,0,0,0,56518 ,0,0,0,0,0,0,0,0,0,0,0,0,822,0,15978,44423,0,0,3112,325,0,0,0,0,0,15397,0,0,0,0, 0,0,0,0,0,0,1193,4294,4968,15559,0,46150,0,0,0,0,0,18917,0,0,0,0,0,0,9928,37543, 0,0,0,0,13097,36999,0,0,0,15430,0,0,8424,29639,0,0,0,0,0,0,0,0,0,0,0,0,0,25734,0 ,0,0,0,0,0,0,0,0,0,0,0,0,40487,0,13284,0,11141,0,0,0,32388,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5298,57702,0,0,0,0,0,0,0,13060,0,0,0,0,0,0, 8233,42278,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36422,0,0,0,7972,0,0,0, 18437,0,0,0,0,7406,0,0,0,9225,0,0,0,0,0,0,0,0,0,13865,47591,18220,53703,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2796,0,0,0,0,0,24940,17223,0,0,0 ,13221,0,0,0,0,0,0,0,0,0,0,15848,0,0,0,0,0,6122,1735,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,16968,18151,0,0,0,0,0,47494,0,0,0,0,0,0,26089,19494,0,0,0,0,0,15494,0,0 ,0,0,0,0,0,0,0,0,28809,0,0,0,0,42727,0,55174,0,0,0,0,0,0,0,0,0,0,0,20485,0,0,0,0 ,0,0,0,0,0,0,0,58598,0,0,0,0,0,0,0,0,0,0,0,0,0,15172,0,0,0,0,0,0,0,0,0,35302,0, 48135,20972,33094,0,0,0,0,0,9765,0,0,0,0,0,0,0,0,0,39559,0,0,13736,6950,0,0,0,0, 23658,8903,0,0,0,0,0,0,0,22662,0,0,0,0,0,58886,7468,0,0,0,0,0,0,0,0,64550,0,0,0, 0,0,47622,0,0,0,50886,0,0,0,0,0,57606,912,0,0,0,0,0,0,0,0,0,1449,0,1169,0,718, 46151,12104,0,0,0,0,0,0,48230,0,0,0,0,0,0,0,0,0,0,1259,0,0,33734,23208,62567,0, 65158,0,0,0,0,0,0,0,0,0,0,28684,59878,0,0,0,0,0,0,0,0,0,0,25769,0,0,0,0,65479,0, 0,0,0,555,22789,0,19748,1769,10246,8680,0,0,0,0,0,0,0,0,0,14250,0,5899,3303,0,0, 0,0,0,0,0,0,21097,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21638,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,10795,0,0,0,16204,0,0,0,0,0,26986,2469,0,14660,0,0,0,0,0,45447, 12234,3494,4555,10566,0,0,0,0,0,0,0,0,0,0,0,0,2801,0,0,0,15755,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,39654,0,0,0,0,0,0,6763,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 33574,0,10279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63527,0,0,3912,0,0,7492,0,0,0,35142, 0,0,0,0,0,0,17576,8103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16713,4198,0,0,4782,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,16228,0,0,0,0,25961,20166,0,0,0,10980,0,0,0,0,0,14340, 18922,14567,0,44199,0,0,0,0,0,0,0,18406,0,0,0,0,0,37606,0,0,0,0,0,0,0,0,0,20902, 0,0,0,56358,0,38342,0,0,0,0,9514,36071,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21700,0,0, 5266,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1134,0,1453,0,0,0,0,0,3882,0,0,0, 0,0,0,0,0,4004,0,0,0,51910,0,0,0,0,0,23076,4648,0,0,0,31051,25351,0,0,0,22884,0, 0,0,0,0,63975,0,0,2376,16997,0,0,2096,0,0,0,3373,7046,0,0,0,0,0,0,0,30726,0,0,0, 0,20,0,13707,614,0,0,12840,3079,0,0,0,0,0,51046,3729,0,32680,0,0,0,0,0,24008, 62759,0,0,4745,0,0,0,0,0,0,0,0,0,0,0,0,0,2414,0,0,44262,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,24937,0,0,0,0,0,0,0,0,19140,0,13575,0,0,0,0,0,0,0,39110,0,0,0,28036,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,4261,0,0,0,0,5992,0,264,0,0,0,0,0,0,0,13739,0,21928,0, 0,0,0,0,0,0,0,0,0,0,4232,15110,0,0,0,0,0,0,0,0,0,30022,0,0,27977,0,0,0,0,0,24776 ,0,0,0,0,0,2962,0,0,0,0,0,0,26564,22441,0,0,0,0,0,13640,11205,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,19305,1894,0,0,0,0,0,0,0,0,0,0,9389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14119, 5224,135,0,0,0,0,0,0,0,0,0,25796,0,0,0,0,0,0,7470,0,0,0,0,63815,0,55654,0,0, 12584,0,1524,33223,0,0,0,9895,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11624, 0,0,0,5614,0,0,0,0,0,0,0,21320,0,0,53607,0,51206,0,0,0,25863,0,0,0,0,0,0,0,0,0,0 ,0,8964,1740,0,0,0,0,0,0,0,0,13476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7975,0, 0,3306,8134,0,8389,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25766,0,0,0,0,0,0,0,0,0, 52166,0,0,0,0,0,0,0,0,0,0,0,0,0,21477,31112,31652,0,0,0,0,0,0,0,28452,0,0,0, 44231,0,0,0,0,0,0,0,24805,0,0,0,0,0,0,0,0,0,0,12428,6471,0,0,0,0,525,17926,0,0,0 ,26919,0,0,18120,0,0,0,30024,0,0,0,0,0,0,0,0,0,0,29189,0,0,0,43559,0,0,0,0,0,0, 19787,7557,0,59334,0,0,10184,6085,0,44039,0,0,0,0,0,0,0,11175,0,0,0,0,30440, 63110,0,0,0,0,0,0,11017,0,0,0,0,0,0,0,0,27204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,29126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,622,0,5226,2727,0,15588,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4650,0,2675,0,0,32420,0,0,0,61511,0,0, 5419,17829,2123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38183,2640,0,11274,14533,1842,0,0, 42663,12681,3430,0,11845,0,0,0,0,0,0,0,0,0,6533,0,0,0,0,0,54598,0,0,0,0,0,0,0,0, 0,0,0,0,12616,38535,0,0,0,0,0,32229,0,0,0,54279,0,48614,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,31401,0,0,0,0,34310,0,0,0,22788,0,52134,0,0,0,0,0,0,0,23302,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,40678,0,0,0,51463,535,0,0,0,0,15525,0,0,0,0,0,0,4904,869,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63718,0,0,0,0,0,0,0,0,1678,0,692,0,0,0, 0,0,0,0,0,0,26216,0,0,0,0,0,29355,0,0,0,0,25095,0,0,0,0,4335,0,0,0,0,0,14538,0,0 ,0,0,0,0,0,0,0,27273,55014,0,0,0,0,0,27271,0,0,0,0,0,30468,0,0,0,0,18186,0,0,0,0 ,0,14345,0,0,0,2152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58438,21034,0,23339,21318,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,21412,0,0,0,0,0,0,0,12869,0,0,4875,0,0,0,0,29191,0,0,0,0 ,0,0,1640,10247,0,14244,0,0,0,0,9867,0,0,0,0,0,12363,0,0,7653,0,0,4168,2663,0, 4580,0,11143,0,0,0,0,0,0,0,30662,0,0,0,0,0,6724,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,13764,0,0,0,0,0,0,0,0,0,0,0,0,234,6821,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,25639,0,0,0,0,0,0,0,0,0,29958,0,3461,0,0,0,0,0,0,0,0,0,28324, 18795,7013,12746,11655,0,37287,0,0,10953,7718,9705,0,0,0,0,0,0,0,0,0,0,46534,0,0 ,0,0,0,0,0,0,0,0,8137,17988,0,25156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41415,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15784,6918,0,0,0,0,7019,10919,0,0,0, 0,0,0,0,0,0,0,4171,55495,4940,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22440,19333,0,0, 28136,0,6249,21317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53414,0,0,0,57318,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39303,0,0,0,0,0,19940,0,0,0,0,0,0,0,25543,0,0,0 ,0,0,0,0,0,0,0,0,0,2698,3911,0,0,0,26790,0,0,0,0,0,0,32424,0,0,18470,0,0,0,14726 ,29834,0,0,0,0,0,0,0,0,0,0,0,1000,4197,0,0,0,19366,0,0,0,39878,0,0,0,0,2185,8901 ,5288,9829,25000,0,0,0,0,0,0,1062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35622,0, 0,23048,62503,6506,0,0,0,0,0,0,0,13609,10438,0,0,0,0,0,0,0,0,0,0,7723,42119,0,0, 0,0,0,13317,0,0,0,41606,0,27111,0,0,21194,11461,0,0,0,0,26856,58342,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,20940,48710,0,0,0,0,0,0,5227,0,0,0,0,0,10061,31300,0,0,0,19236,0 ,0,0,0,0,30277,13896,0,0,0,12876,13159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,428, 46951,13134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,21668,0,0,0,0,0,0,0,0,0,0,0,0,2249,0,0,0,0,44967,0,0,0,0 ,0,0,3465,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24868,0,0,0,0,0,23909,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,2190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16164,0, 10437,0,0,5263,20102,20938,0,0,0,1192,1030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,21385,4870,0,0,0,0,0,0,0,0,0,0,0,18596,0,0,0,0,1422,4038,2858,0,0,0,0,0,0,0,0 ,48998,0,0,0,0,0,0,0,0,6508,37350,0,0,0,0,0,0,0,0,17001,39431,0,0,0,0,0,30182,0, 21445,7403,28164,0,51750,0,0,0,62631,0,0,0,0,0,0,0,31206,0,0,0,0,0,0,0,0,0,0,0, 7751,0,0,0,0,0,0,0,0,0,13477,0,0,456,26693,0,0,0,0,0,0,0,0,0,0,0,0,14890,0,0,0,0 ,0,26697,22022,13225,27364,0,0,0,18884,0,0,0,0,0,0,0,0,3659,0,0,0,0,0,0,0,0,0,0, 0,1448,5413,0,0,0,0,0,0,0,0,0,0,0,6340,0,0,18091,18725,0,0,0,0,0,0,0,0,0,0,0,0,0 ,22118,0,0,0,18981,0,0,0,0,0,0,0,0,0,29223,3724,0,0,0,0,43526,0,0,0,25668,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21545,9862,0,22692,32201,60646,0,7300,0,0, 0,58887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19460,0,0,0,0,0,0,0,0,0,50342,0, 65255,4360,17286,0,0,0,0,0,0,0,28708,0,0,30025,60102,0,0,0,0,0,0,0,0,0,47014,0, 31973,0,9572,0,0,0,0,0,0,0,18501,0,0,0,0,0,14597,0,0,0,53735,5228,22183,0,0,0,0, 0,0,1554,24164,0,0,0,0,0,0,0,0,0,0,0,0,10827,0,0,0,0,34918,0,0,0,0,22252,0,0, 46855,0,0,0,0,0,31207,0,0,10733,0,0,63334,0,0,0,0,8616,50119,20169,12678,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58087,20298,5,0,0,30920,0,0,0,0,0,0,0,296,13190,0 ,30663,0,0,18536,12228,0,6788,0,0,0,0,30890,21796,0,0,526,0,0,0,0,0,0,0,0,0,0,0, 0,20965,0,0,0,0,2161,0,0,0,0,0,0,24038,0,0,0,0,13544,7398,0,0,32522,9605,0,0,0,0 ,3208,7590,0,0,0,43846,0,0,0,38663,0,0,0,0,0,39014,4142,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,6373,0,0,13676,0,0,0,0,30374,21288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22791,0,0,0,0,0,37958,0,0,0,0,0,0,0,0,0,0,9452, 9990,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4841,0,0,0,0,18820,152,0,0,0,0,0,13260,3334,0,0 ,24234,8422,0,17957,0,0,0,10244,0,0,0,0,0,0,0,0,0,0,0,7204,0,0,0,0,1201,26151,0, 31173,0,0,0,0,0,0,0,0,0,0,0,0,0,64838,4203,7525,521,0,18888,37031,0,0,0,0,0,0,0, 0,7082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4490,12487,0,0,0,0,0,0,0,36615,0,0, 0,14854,0,0,0,0,0,0,0,0,0,0,0,0,6539,13029,9704,38983,0,0,0,0,168,10405,0,0,0,0, 394,25607,0,57063,0,0,0,0,0,0,0,0,0,0,16141,19878,0,0,0,0,0,0,0,0,0,29446,0, 12036,0,0,0,0,0,6982,18572,0,24584,14535,0,0,0,0,0,0,0,0,0,0,16,0,21642,0,0,0,0, 0,0,5254,0,0,0,0,0,0,0,0,1622,0,0,0,0,0,0,0,0,0,0,0,0,0,3853,9126,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,7241,10982,0,0,0,0,0,0,0,0,0,0,0,0,0,0,950,0,0,57990,0,0,277,0 ,0,0,694,36007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42470,0,0,0,0,18409, 51142,0,0,0,0,0,0,0,0,0,28646,0,0,0,30693,0,0,0,0,0,56295,5544,0,0,0,0,8518,8366 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45670,0,0, 9608,33062,0,0,0,0,0,0,0,0,0,0,0,18694,0,0,0,0,1672,23493,0,0,6955,7655,0,36134, 0,0,0,0,0,0,0,0,23432,647,0,0,0,0,0,0,0,0,0,0,0,13382,0,0,0,19621,0,0,0,0,0,0,0, 0,0,20228,0,0,2728,31495,0,0,0,0,29096,22213,235,35495,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,5348,0,0,0,0,8968,1989,0,0,1066,0,0,11492,5965,31367,0,0,0,0,0,0,0,0,0,0,0, 18727,0,0,0,6757,0,0,10765,4646,0,36166,0,27943,0,0,26888,8420,0,0,0,0,0,0,0,0,0 ,29316,0,0,0,0,0,0,0,0,0,0,4975,0,0,0,14762,3111,0,0,0,0,0,43399,0,0,0,0,0,0,0, 18980,0,0,0,0,0,44550,0,0,0,0,4051,0,0,0,0,37734,0,0,0,0,0,5188,0,0,0,0,0,24486, 0,5989,0,41159,0,0,0,0,0,0,0,0,0,20326,0,0,747,6884,0,0,0,41798,0,0,3117,22919,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21032,0,0,0,0,0,0,0,0,9574,0,0,0,0,0,0, 4302,0,0,0,0,0,0,0,0,0,0,0,21068,34630,0,0,0,0,0,64071,0,0,0,0,0,0,26667,7943,0, 0,0,0,0,52934,0,0,17002,0,0,0,0,0,0,20294,0,0,0,0,0,0,0,0,0,27301,18347,7974,0,0 ,0,0,0,0,0,0,16874,0,0,0,0,45414,0,0,0,0,0,0,648,1575,0,0,0,31749,0,0,0,23301,0, 0,0,0,0,0,0,0,0,0,0,0,15912,50535,0,0,0,0,1993,8582,0,0,0,0,0,0,0,38438,0,0,0,0, 0,0,0,0,0,0,0,0,15850,6183,0,0,0,0,3402,0,0,27494,0,0,749,0,0,0,0,0,0,0,26025, 29606,0,0,7144,19622,30504,0,0,0,0,0,0,0,0,21316,0,0,0,0,0,0,0,0,0,21444,0,0, 1289,6919,0,0,0,0,0,0,8299,0,0,0,14090,35655,0,0,0,0,0,0,0,0,2377,15206,0,0,6028 ,4452,0,25508,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50310,0,0,0,0,1269,0,0,0,0,0,0,0,0,0 ,0,0,0,51014,0,0,0,0,0,0,0,9286,0,7429,0,0,28393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,16680,452,0,0,0,0,0,23718,0,0,0,31750,0,0,0,0,0,0,0,0,3568,0,0,13604,0,0, 0,0,0,25255,0,0,0,50982,0,56582,0,0,7467,0,0,0,0,30181,0,0,0,0,0,0,0,30564,7208, 7845,0,0,0,0,0,0,7726,0,0,0,0,62182,0,0,0,41094,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,22695,0,0,0,0,0,0,17736,0,0,0,0,0,0,0,0,50054,0,0,0,14180,0,0,0,0, 0,0,8974,0,0,0,0,0,0,0,0,23332,0,0,0,11140,0,0,0,0,0,0,0,24262,27145,9540,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,26537,45510,6062,3879,0,0,20233,25991,0,0,17803,0,0,0,0,0, 13962,5508,16971,27013,7437,31494,0,0,0,0,0,0,0,0,0,0,4714,0,0,0,0,0,0,0,0,17189 ,0,0,0,0,0,27492,0,0,26953,0,0,0,0,0,0,0,0,0,0,41319,0,0,0,0,0,0,0,0,0,0,0,47430 ,19596,12549,0,0,0,8390,1006,0,0,0,0,0,0,0,0,0,0,24100,17577,4,0,0,0,0,0,22277,0 ,0,0,0,0,0,0,26692,0,0,0,0,0,24676,0,0,0,0,0,0,0,0,0,0,0,0,0,29477,0,0,0,21573,0 ,0,0,0,0,0,0,0,0,0,9864,14214,0,0,0,0,0,0,25771,5766,0,0,8909,8679,0,0,6861, 16166,0,38887,0,0,0,0,0,0,12392,8678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 52646,1354,2950,0,14692,0,0,10572,49830,0,0,0,0,0,0,0,0,3626,582,0,0,0,55750,0,0 ,0,30885,0,0,0,0,0,0,0,0,0,0,0,0,0,5830,0,0,2090,0,0,0,0,0,0,0,0,0,0,0,0,31142,0 ,0,0,0,0,10503,0,0,18825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 57158,0,0,30792,63526,0,0,0,9863,16267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,18824,0,0,0,0,0,0,19653,25388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9292,0,0,0,0,0,0,0,0,0,0,36358,0,0,0,0,0,0,0,0, 0,0,25480,23015,0,0,10440,6725,0,0,0,22436,24265,15109,0,0,0,62311,8906,34534,0, 0,0,0,0,0,15913,1319,0,0,20296,1477,30760,0,25928,16772,0,0,1069,0,0,0,0,0,0,0,0 ,0,0,0,0,17029,0,31909,0,0,0,0,0,0,0,0,0,0,0,41638,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,41542,0,21478,0,0,0,9796,0,0,0,0,0,0,0,0,0,0,22187,58343,0,0,0,24295,0, 0,0,0,0,61831,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2833,5829,0,0,0,62855,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,16676,0,0,0,0,0,0,13577,27431,0,0,0,0,21480,10501,0,16932, 0,0,0,0,0,22918,0,48294,2574,2150,0,0,0,0,1897,4518,0,0,0,0,0,0,25064,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47942,0,0,0,0,10990,13767, 25705,37863,21672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43430,1712,0,0,0,0, 18886,0,0,0,0,0,0,0,0,0,0,0,0,0,10535,0,0,0,0,0,0,0,15012,0,0,0,0,0,0,0,0,0,0, 14734,0,0,55782,0,0,30824,10886,0,0,0,0,0,51302,0,0,8012,0,0,0,0,0,20680,6981,0, 57415,11,0,0,18277,0,14564,0,0,0,32390,0,0,0,0,0,0,0,0,0,0,0,0,19113,5158,0, 11172,0,16774,0,0,0,0,0,0,0,0,0,0,0,0,10315,13830,0,0,0,0,0,0,10410,7141,0,0,0,0 ,0,18116,0,0,0,44615,15403,13958,0,1540,14632,19525,24201,19781,0,0,0,24165,0, 38951,0,0,0,0,0,6308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17416,15749,3438,13255,0,0,0,0, 0,0,0,0,0,0,0,32228,0,0,0,0,176,0,0,50566,0,0,0,0,0,0,0,0,0,0,0,0,0,21540,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,58982,0,0,0,0,0,0,0,0,0,5284,0,0,0,0,0,0,25897,28326,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15945,0,0,0,9804,293,0,0,0,0,0,0,0,13988,23082,4677 ,0,0,0,0,0,0,0,0,0,0,0,5670,0,0,0,0,0,0,0,44070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,6405,0,30692,0,0,0,61702,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,45926,0,15398,0,0,0,0,0,0,4554,2692,0,0,0,0,0,32485,0,0,0,10084,0,0,0,0,0,0, 24297,0,0,0,0,0,0,0,0,22790,0,0,0,55110,0,0,0,0,0,0,0,0,0,0,0,0,7112,0,31530, 45255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40743,17226,22599,0, 0,0,0,0,0,0,0,3695,0,0,0,0,0,0,0,0,0,0,56999,0,0,0,0,0,13799,3114,21287,1353, 7591,0,0,0,8455,0,0,6824,0,0,0,0,0,0,0,14569,0,0,0,29000,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,19979,0,18376,0,0,0,0,0,0,0,0,0,0,0,0,11332,0,0,0,49863,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,2191,7527,23148,58022,0,0,0,30631,0,26565,0,0,0,0,0,0,0,0,0,0,0,0,754 ,0,0,15877,0,0,0,0,0,0,0,17510,7657,2821,0,0,0,0,0,0,0,0,0,41927,0,0,0,0,0,0,0,0 ,2569,34439,0,0,3790,0,0,0,15339,8775,0,0,0,0,0,0,0,0,0,0,0,15908,0,0,21419,8359 ,0,0,0,0,424,0,0,0,0,0,0,25318,8008,20551,0,0,0,45735,30058,30372,0,0,0,0,0,0,0, 0,0,0,0,0,0,26180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31432,10567,0,0,0,0, 17450,0,0,0,0,0,0,30310,0,38022,0,0,0,0,0,28932,0,0,0,0,0,43910,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,22180,12075,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22247,0,0,22826, 12359,0,0,0,0,4105,50407,0,0,0,0,0,0,13581,28583,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,28936,0,0,0,0,0,17673,10310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,905,57862, 1580,0,0,0,0,58630,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13479,0,0, 14153,13286,0,0,9259,0,0,0,0,0,6606,3524,0,0,0,0,0,6567,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,631,49255,0,0,0,0,0,42886,0,38215,0,0,0,0,0,0,0,0,17580, 0,0,0,0,0,0,0,0,55046,0,0,0,0,0,0,0,0,0,10213,0,0,0,0,3604,37767,0,0,0,0,0,0,0,0 ,0,0,0,30950,0,0,0,0,0,0,0,0,0,62087,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23528,0 ,0,0,0,0,0,0,0,0,28715,4229,0,0,0,0,0,0,0,0,0,0,1226,26820,0,0,0,12133,6984,261, 21130,32548,0,0,0,0,0,0,3565,12390,20713,28071,0,0,1706,25287,0,0,0,0,0,0,0,0, 14670,0,0,0,0,0,0,30534,0,0,0,12615,0,43750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28228, 0,0,0,0,0,0,0,45095,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1224,3975,10954,6375,0,0,0,0 ,0,0,0,0,0,0,23180,20100,0,0,0,0,25736,8519,0,0,0,0,0,6663,0,2534,0,0,0,0,0,0,0, 0,23720,0,0,0,0,0,0,0,0,0,0,19398,0,47814,26281,49702,0,0,4332,12965,0,0,5704, 3206,0,0,0,0,0,0,0,0,0,0,0,0,0,15396,0,0,0,44102,0,0,0,0,0,0,0,0,0,0,0,0,0,25317 ,1064,39271,27433,0,14952,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14308,0,0,0,0,0,0,2763 ,4100,0,0,0,0,0,0,18792,0,0,0,22154,32583,0,6244,0,0,0,0,0,0,0,49478,0,0,0,0,0,0 ,0,0,0,0,0,21894,0,0,11048,0,0,0,0,0,0,11685,0,53862,0,0,15114,0,13870,0,0,0,0,0 ,0,0,919,0,0,0,31916,0,22570,101,0,0,0,0,0,0,0,0,0,7333,0,0,0,0,3272,0,0,0,0, 27718,32712,0,0,0,0,0,0,0,0,0,1782,0,3688,0,0,0,0,29862,0,0,0,0,0,0,0,22469,0,0, 0,0,0,0,0,55302,850,15492,0,0,0,5927,19786,13350,0,25702,0,0,0,0,0,0,0,0,0,0,0, 40390,0,0,0,0,0,0,0,0,0,0,0,0,0,20260,0,0,0,0,0,0,0,0,0,0,0,0,0,15335,8394,0,0,0 ,0,0,0,26566,0,0,0,0,843,2245,0,0,0,0,0,0,0,0,6959,0,20488,1638,0,0,11533,50759, 0,0,0,0,0,20871,0,0,0,0,0,24519,0,0,0,0,9544,23591,0,0,0,0,0,0,0,0,0,0,20969, 7109,29001,0,0,32422,31720,64294,0,0,0,0,16106,0,0,0,6930,4933,0,0,0,22917,0, 27015,0,0,0,0,19880,8070,0,0,0,0,23945,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3310,0,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18439,0,0,0,20742,0,0,0,10597,0,0,0,0,0,0, 0,0,0,0,0,0,20236,0,0,0,16584,3429,0,0,0,0,0,0,0,0,27241,0,0,0,0,16132,0,0,0,0,0 ,0,0,0,0,0,0,0,244,28261,0,0,0,0,0,0,0,29509,0,0,0,0,0,0,0,0,2921,31781,0,0,0,0, 0,0,6408,4196,344,0,0,0,0,0,0,0,0,0,0,0,0,0,11689,45863,0,0,0,0,906,3301,0,0, 25544,32421,0,0,0,0,0,0,0,0,1260,61607,0,27302,0,0,8682,16614,0,0,0,0,10830,0,0, 9604,15049,13413,0,0,0,0,0,0,26761,0,0,0,0,0,0,61990,0,0,0,0,0,12580,0,0,11432,0 ,0,0,0,0,22507,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12389,0,0,0,0,0,0, 2408,22661,14507,43239,0,9700,0,0,24714,0,0,0,0,0,0,0,0,23972,0,0,0,0,0,0,0,0,0, 0,0,0,0,34086,0,0,22955,7238,0,0,0,0,0,28485,13806,20038,0,0,0,0,22602,0,0,0, 1645,22340,0,0,0,0,0,0,0,0,0,0,0,26502,0,0,554,0,0,0,0,61735,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,2694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,883,27879,15948,0,3242,57382,0,0 ,0,0,0,0,13930,0,0,0,0,0,30922,0,4137,52615,0,0,0,0,0,0,0,0,0,0,0,0,0,31911, 16072,0,0,0,0,0,0,0,0,0,0,0,0,26340,0,61671,0,0,0,0,3145,56199,0,0,0,0,0,0,0,0,0 ,0,0,0,280,0,5131,33479,0,15751,0,0,0,0,0,0,4136,1446,0,0,0,0,0,0,11304,17863,0, 0,0,0,0,25125,0,0,0,36646,6057,0,0,0,855,11301,0,0,0,0,0,64774,0,0,0,19397,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,1040,27367,0,0,0,0,0,0,0,0,0,0,0,0,0,64358,0,0,178, 132,0,0,14763,24455,0,0,0,46374,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46246,0,0,0,37382, 0,0,0,7462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8166,0,0,6921,0,0,0,9163,0,0,0,119, 0,0,0,23146,17156,0,0,0,0,0,9127,0,0,0,17927,0,0,0,0,0,22084,0,0,0,0,0,39879,0,0 ,2035,0,1067,0,0,0,0,0,16652,59591,0,0,0,0,0,0,0,0,0,0,0,0,20171,0,0,0,0,17733,0 ,0,0,0,0,32037,0,0,0,0,0,14277,0,0,0,0,0,0,0,42022,0,0,26793,20358,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,8907,0,0,0,0,0,0,0,0,27780,0,0,0,0,32330,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,39399,0,9732,0,16199,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,854,0,2984,45063,25418,26980,22539,0,9133,3653,15528,28743,4649,0,616, 65127,0,0,0,61863,0,0,0,0,0,0,0,55303,0,0,0,0,0,0,0,0,23880,0,0,0,0,0,0,0,31848, 62854,0,0,0,0,0,0,0,0,0,0,0,49606,0,27974,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,32580,0,0,0,26052,4043,0,0,40454,0,0,26056,30565,0,0,0,0,0,0,0,31398,0,0,0,0 ,0,0,0,0,29288,1797,0,0,3220,0,0,0,0,0,0,0,0,0,20427,0,0,0,0,23621,0,0,0,0,0,0,0 ,0,0,24261,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35591,0,0,6862,0,0,0,4265,0,6285, 5383,0,0,0,0,0,36870,0,39847,0,0,17224,5414,27882,58118,0,0,13224,4262,0,0,0, 31302,0,0,1388,2982,11881,0,0,0,0,0,0,16837,809,0,24140,10724,0,0,0,0,5835,0,0,0 ,0,0,0,0,0,0,0,0,1256,19237,0,0,0,0,0,0,0,5796,11848,0,0,52870,11464,0,0,0,0,0,0 ,0,0,0,5645,9158,0,25223,0,0,0,0,0,39142,24968,8135,32104,28678,0,0,0,46311,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23820,0,0,0,0,0,4050,0,1323,25220,0,0,0,20133,0, 0,0,0,0,0,0,0,0,0,0,9381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,13444,1198,60806,0,0,0,0,17356,50247,30632,0,0,0,0,0,0,0,11944, 999,0,0,0,0,4010,10404,0,0,0,0,0,0,10346,0,0,49510,0,0,0,0,0,0,0,0,0,0,0,0,0, 38919,0,0,0,0,0,0,6351,60966,20137,487,0,0,0,0,0,0,655,2406,17387,43303,0,0,0, 17063,0,0,213,0,0,0,0,0,0,17221,0,0,0,0,0,0,0,0,0,0,0,10820,0,0,0,0,369,6,0,0, 9098,21093,0,31653,0,0,0,0,0,0,0,0,0,27143,0,0,16234,0,0,0,0,0,0,0,0,6020,31723, 28293,0,0,0,0,1936,30695,0,0,0,0,0,52902,0,0,29512,10791,0,20420,0,0,16010,0,0,0 ,0,0,0,0,0,0,0,0,5324,0,0,0,0,0,0,0,0,0,0,0,0,13383,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,24328,0,0,0,0,0,0,40870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,24648,0,0,0,0,0,0,0,7786,2852,0,0,0,0,0,0,0,0,0,44678,0,17925,0,0,105,53062, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18762,0,0,40679,0,0,0,16165,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,20390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62310,1322, 14247,0,0,0,0,0,0,0,0,1832,6052,0,0,11882,0,0,0,0,17668,0,28262,0,29542,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28007,0,0,0,57223, 1585,0,0,0,0,0,0,0,0,0,0,0,21162,0,0,62247,0,0,0,0,0,25414,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,36326,0,0,0,23845,0,0,0,0,0,0,0,2693,0,0,0,0,0,0,0, 13125,0,31236,0,0,0,0,0,22502,0,0,0,0,0,0,5994,10309,0,0,0,7269,0,0,0,0,17929,0, 1011,44647,0,0,0,0,0,14919,0,0,0,0,20586,5350,0,0,0,45702,0,13189,0,0,0,0,0,0,0, 0,0,35782,17992,0,0,0,0,0,8203,0,0,0,0,0,0,56678,0,0,0,0,0,38087,4233,0,2127,0,0 ,0,0,0,0,0,0,0,0,10148,0,0,0,2021,0,0,0,0,0,0,0,47206,0,0,0,0,0,0,0,9220,0,0,0,0 ,19465,0,0,0,0,0,0,0,0,39206,0,38055,0,0,0,0,0,0,0,46982,0,0,0,0,0,22054,3850,0, 0,0,0,0,0,0,55,0,10542,0,0,0,0,7239,0,0,0,0,0,59367,0,0,14761,0,0,0,0,43079,0,0, 0,0,0,2726,0,0,9582,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37478,0, 0,0,31364,0,0,0,0,0,0,0,0,20393,8933,0,0,0,0,0,9380,0,0,0,0,16905,549,0,0,0,0, 182,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1558,0,0,0,0,0,0,0,19242,0 ,0,0,0,0,0,24933,0,6276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42310,23595, 24068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13191,6158,2567,0,0,268,47047,0,0,0,0,0,0,0, 0,0,27940,0,0,0,0,0,26726,0,0,0,0,8200,1222,31562,0,0,0,0,0,0,0,0,0,2922,8231, 8904,29157,0,0,0,0,0,0,0,0,23976,4836,0,0,0,0,0,0,0,0,0,0,0,0,31658,0,0,31685,0, 0,2889,6213,0,0,0,0,0,13605,0,0,0,0,0,24772,0,0,0,0,0,0,0,0,0,0,20684,26468, 24075,0,0,0,21193,0,715,679,0,0,0,0,0,0,3050,7654,0,0,0,13798,0,0,0,0,15,27973,0 ,0,8491,2086,0,0,0,43206,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60391,0,0,0,0,0,0 ,0,25892,0,22276,0,34374,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20165,0,0,25672,0 ,0,0,1811,24839,0,31044,0,0,25513,0,0,0,0,0,12810,0,0,62438,0,0,1325,0,364,3782, 0,0,0,0,0,0,0,0,8042,19687,0,0,0,33415,0,0,0,0,0,0,0,0,0,0,0,7205,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,11844,0,0,0,0,3341,1543,6698,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,29766,0,0,0,0,0,0,0,0,0,0,0,41158,0,24294,0,3844,12329, 0,0,0,13738,0,0,0,0,0,0,0,0,26245,0,0,0,0,0,0,6378,0,343,4838,0,0,0,24358,11688, 0,0,0,0,0,0,0,0,0,1489,34759,0,0,0,0,363,51974,1878,11013,0,0,32265,59782,0,0,0, 28421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22756,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14089,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,29257,61222,0,30661,0,28327,0,0,0,0,0,0,0,0,0,0,0,0,0, 27108,8843,0,9673,2084,0,0,0,16327,0,48455,0,0,0,0,0,0,4876,9316,0,0,0,0,0,0,0,0 ,0,0,0,0,9035,18852,0,0,0,0,0,0,0,0,0,0,0,0,0,4164,0,0,14827,1349,0,0,0,0,0, 11909,0,0,0,0,0,0,0,0,0,21765,0,0,0,0,0,0,0,0,31272,63910,0,0,0,25924,0,0,0,0,0, 0,0,0,0,44487,0,0,0,20612,0,0,27754,31428,0,0,0,0,0,0,0,17287,0,3943,0,0,0,63302 ,0,0,0,0,25256,19942,0,55142,0,39046,0,0,0,0,0,0,0,15367,0,0,0,0,0,0,0,0,0,0,0, 28422,0,0,0,0,0,0,0,0,0,0,0,0,9576,63847,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,25226,5734,0,0,0,0,0,0,13801,4997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,43942,1270,2566,6284,0,0,16230,0,0,0,20678,0,0,0,0,0,38855,0,0,0,0, 29643,0,0,0,41,3655,0,0,0,0,0,14276,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,15686,0,0,0,15718,0,50694,0,0,16232,8007,0,0,0,5060, 329,11591,51,0,0,0,0,0,0,0,0,0,13065,7302,27530,15366,0,24934,0,0,0,17828,0,0, 4552,6311,0,0,0,0,0,0,0,0,0,0,0,47686,368,12103,10122,33830,0,0,599,18534,9579, 49479,0,5668,0,0,0,0,0,0,0,0,0,13157,0,0,0,0,23274,14055,0,0,0,0,0,48903,0,0,0,0 ,0,0,1871,0,15434,0,0,0,16174,62470,0,0,0,0,0,0,0,0,0,0,0,7749,0,0,0,0,0,0,0, 30501,0,0,0,0,25675,0,0,0,0,0,0,0,0,0,0,9285,0,0,25323,1669,0,0,0,0,0,0,0,0,0,0, 0,3588,0,0,0,0,0,32902,0,0,4426,0,0,0,0,57959,0,0,0,0,0,0,29898,58278,0,0,0,0, 11880,1220,0,0,0,41479,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23141,0,0,0,0,0,0,0,0,0,0,0 ,0,0,42566,0,0,0,0,0,0,0,40167,9484,3493,0,0,0,0,0,21126,0,0,0,0,8649,18918,0,0, 0,0,0,0,0,34886,2601,0,0,0,0,12518,0,0,0,0,7976,10311,0,0,0,0,0,0,0,45190,0,0,0, 0,0,0,0,0,0,0,16842,20229,0,0,0,0,0,0,7528,4614,0,0,0,0,0,30086,0,0,0,1671,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,9896,6277,0,0,0,0,0,61191,0,41287,0,21956,0,0,20010,0,0,0 ,0,0,0,0,0,0,0,0,13195,0,0,0,0,1381,0,0,0,0,365,30951,24268,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,7044,0,0,0,0,0,0,0,0,0,0,27944,359,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,28487,0,0,77,0,0,0,0,0,0,0,0,56775,12586,8421,0,0,0,0,0,0,26185,14599,0,0, 8040,5702,12585,3109,0,0,0,0,0,21574,5388,0,0,0,0,0,0,0,5106,52454,0,0,0,0,0,0,0 ,0,1907,29895,0,6116,0,0,0,0,11081,5285,0,28069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4104 ,0,0,0,0,0,0,41511,0,0,0,0,0,0,5262,0,0,0,503,4231,7720,34343,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7304,10374,1718,0,0,29127,0,0,0,0,0,0,0,0,23497, 22567,6952,2340,0,0,0,0,0,0,0,0,20360,12453,0,45094,0,0,0,0,0,28582,0,0,0,0,680, 0,0,0,0,0,0,0,0,0,0,0,0,0,23084,0,0,0,30696,0,0,0,0,45862,0,0,0,0,0,0,0,0,0,0,0, 0,5580,6053,0,0,0,0,0,0,0,0,0,0,712,70,0,0,26091,11335,0,0,0,0,13612,0,13160, 1926,435,51559,0,0,0,0,0,0,0,0,0,0,0,0,0,47302,19083,0,0,12742,0,1607,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,6155,37095,0,0,0,0,0,18948,7146,0,0,0,0,0,0,0,7848, 2055,0,0,0,0,8910,0,19336,0,0,48070,8490,0,0,0,0,0,0,0,9932,56423,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,4133,0,0,0,0,0,0,0,0,0,43398,0,0,0,0,0,0,0,0,16173,0,0,0,0,0 ,0,0,32011,0,0,30918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26854,0,0,0,0,0,0,0,0,0,0,0,0 ,0,20389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18889,0,0,0,0,8965,0,0,0,44358,0,0,0,8997,0 ,34055,0,0,0,0,0,29350,0,0,501,17767,0,0,32457,60262,0,0,0,30886,0,0,3757,1063,0 ,0,0,25637,0,0,0,0,0,28068,0,26374,0,0,0,0,0,0,0,0,0,0,0,11684,0,0,0,0,0,0,24779 ,229,0,13766,0,0,7402,11525,0,0,0,0,0,0,0,0,26313,23686,0,0,29736,47527,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27268,0,0,0,0,553,0,0,0,0,0,0,32038,0,0,0,0,1135, 26596,0,0,12300,14631,0,0,0,43238,0,871,0,0,31496,0,8457,17669,0,12836,0,0,0, 22726,0,38758,0,0,375,6564,0,0,0,0,0,0,0,0,0,0,0,0,170,18535,0,22948,0,0,32360,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,25764,0,0,0,0,0,0,0,0,0,0,0,15652,0,0,0,32774,0,0,0,0 ,0,0,0,0,0,28551,0,0,0,0,0,0,0,0,0,0,0,0,15145,0,0,0,21100,27654,0,0,0,0,0,0, 4874,26215,0,1639,0,0,0,0,0,0,0,0,0,0,4169,0,0,0,0,0,7336,0,0,0,0,21572,0,0,0,0, 0,0,0,0,0,24644,1675,2533,0,0,0,53318,0,13094,0,0,0,0,0,0,0,6246,0,22020,0,0,0,0 ,0,0,0,0,0,0,0,28453,5576,5124,0,0,0,0,0,0,0,0,0,0,0,0,0,27910,0,29382,18216, 8583,0,0,0,39174,0,43558,0,0,0,0,0,0,0,0,0,11973,0,0,0,0,0,23397,0,0,0,0,6091,0, 0,0,0,0,0,0,6474,16197,14217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,26728,0,567,48839,0,0,0,0,0,15271,0,0,31818,43974,2450,0,0,0,0,0,0,0, 11368,9191,0,44454,0,0,0,0,0,0,14568,12293,0,0,0,8453,0,0,0,0,0,0,0,0,0,0,0,0, 32040,0,0,0,0,0,0,0,0,0,0,0,0,902,0,0,0,27236,5612,11495,0,0,0,0,0,0,0,0,9194, 23684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27430,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 26217,44870,0,0,0,0,0,0,5581,7173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 52775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20968,18340,0,0,0,0,0,0,0,0,4107,11239 ,0,0,0,0,0,0,0,0,0,0,0,29381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21990,0,0,0,0 ,0,0,0,0,0,48806,0,0,0,32292,0,0,0,0,0,0,0,10884,0,0,0,0,0,0,0,0,0,0,27562,0, 5643,0,0,0,0,0,0,0,0,0,3089,31525,0,19684,0,0,0,0,0,0,0,61415,0,0,0,0,0,36198,0, 0,0,0,0,0,0,7908,0,0,0,0,872,743,0,0,0,0,0,0,0,0,1229,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,32484,0,0,0,0,0,34822,0,0,0,0,0,50726,0,0,0,0,7274,0,0,0,15304, 11526,0,0,0,3047,0,0,0,0,0,0,22376,0,0,0,846,0,0,0,0,35815,0,0,0,23652,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,23721,2148,0,0,0,0,0,0,14856,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1358,0,3082,0,0,0,848,10949,0,0,0,0,0,0,6504,0,0,14372,0,0,0,0,0,0 ,0,0,0,0,8201,9958,0,0,0,0,0,0,24266,0,0,0,0,0,0,0,0,26469,0,0,0,0,18604,2053,0, 33511,0,0,0,0,0,9222,0,0,0,0,0,44006,0,0,0,0,0,0,0,0,0,0,0,41895,0,0,0,0,0,0,0,0 ,12044,390,0,0,0,0,0,4935,0,48646,0,56102,3052,16070,0,0,0,0,0,0,0,8612,9320, 38311,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,0,0,0,42918,0, 32550,0,0,0,0,0,0,0,0,27434,57926,17064,0,0,46502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,26760,6756,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,624,0,5000,0,0,0,0,32293,0, 0,0,0,0,0,0,0,0,0,0,0,0,26246,0,0,0,0,0,0,0,0,23,7301,0,0,0,36199,0,40838,0,0,0, 0,0,0,0,0,0,0,0,0,27178,57350,0,0,12457,9317,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16810,0,0,0,14510,0,0,0,0,21319,0,0,0,13508,17, 11365,0,0,0,0,5291,0,8329,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27685,0,0,0,0,0,0,0, 52006,0,0,0,7493,0,44263,0,0,0,0,0,0,0,0,9800,0,0,0,25676,61478,0,0,0,0,0,0,5773 ,0,0,0,0,41991,26057,0,0,0,0,0,0,0,0,0,0,22629,0,0,0,47783,362,1959,23468,0,0,0, 10921,0,0,0,3150,0,0,0,0,0,0,0,0,0,0,0,32456,0,0,0,0,0,0,0,4559,3270,0,0,983,0,0 ,26343,0,33446,0,0,0,61767,0,48390,0,0,0,0,0,0,0,2790,0,39782,7849,0,0,0,0,0,0,0 ,1544,2183,0,0,0,0,0,0,0,0,4040,2471,20009,30020,0,0,11242,0,0,0,5578,53382,0, 22631,0,0,0,0,0,0,0,0,0,0,0,12901,0,0,0,0,0,0,0,0,0,0,0,0,215,0,0,9030,0,0,0,0,0 ,0,265,1412,0,0,11626,3687,0,0,0,0,0,0,0,0,0,0,0,0,17449,24359,0,0,26729,40134,0 ,0,0,0,29768,61958,0,0,0,0,0,0,0,0,20908,0,0,0,0,0,11016,0,0,47462,21547,5926,0, 0,14728,2983,24104,15301,0,0,0,0,0,32645,0,0,0,0,0,0,0,3300,0,0,0,15972,0,0,0,0, 0,0,6634,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3076,0,30983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,106,0,0,0,0,12775,0,0,0,0,7177,18022,0,0,0,0,0,22534,0,0,0,0,0,0,0,0,0,0,0, 49894,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27560,0,0,0,0,30278,10668,23877,0, 0,0,0,0,0,0,29124,0,0,0,0,0,0,0,0,0,0,0,0,0,20870,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,44582,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48454,0,0,0,0,6442,0,16330,22951,0,0 ,16904,0,0,0,0,644,0,0,0,40038,0,0,0,37222,0,0,0,9830,0,0,0,0,0,34919,0,0,0,0,0, 0,0,0,0,0,0,13733,0,0,0,28196,0,0,0,0,0,19876,0,0,0,0,0,0,0,23558,0,11142,0, 27781,0,0,0,0,13864,0,0,0,24682,47847,0,0,0,0,6890,0,0,0,0,0,3981,0,0,0,0,0,0,0, 0,0,0,0,1772,0,0,0,0,0,0,0,3603,1991,0,27396,8652,0,18312,0,0,0,0,30054,0,0,0,0, 0,0,0,11270,0,0,0,0,0,0,0,0,0,20708,0,0,0,0,338,0,0,0,0,0,0,0,7050,0,0,0,0,0,0,0 ,0,0,0,0,0,0,14862,0,0,3492,0,0,0,55878,0,0,0,16486,0,0,0,18119,0,0,0,0,0,0,2154 ,1284,0,0,23113,31751,0,0,29547,0,0,0,0,0,0,36647,0,0,0,0,0,0,0,0,0,0,0,18183,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,7913,0,0,0,0,20644,0,0,10508,0,0,0,0,0,0,0,0,0,0,0,0, 43622,0,0,0,0,0,40966,0,0,0,0,0,0,0,0,0,0,246,901,11529,5191,0,0,0,0,0,0,0,0,0,0 ,0,24454,0,0,26665,27590,0,27397,0,0,0,0,0,0,23562,2949,0,0,30344,62214,0,47334, 2026,18885,0,0,0,48678,0,0,0,22694,0,0,1972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,15465,0,0,0,0,38822,0,0,0,0,945,32708,0,54791,0,14918,0,0,0,0,0,0, 0,0,0,0,0,0,0,23396,0,0,0,0,0,0,5486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7722,0,0, 0,0,0,0,0,0,0,0,0,30856,64166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35206,0,0,0,30535,0, 0,0,0,0,0,0,0,0,62663,0,0,1096,17574,31820,0,0,14375,4402,27207,0,0,21448,4676,0 ,0,0,0,16585,5094,0,0,0,0,0,0,0,0,4845,0,0,32870,0,0,0,0,0,0,0,0,0,0,31466,0,0,0 ,0,31783,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4522,16039,0,0,0,0,0,0,0,0, 0,14469,0,0,0,0,0,0,0,0,0,0,7464,4773,0,0,0,0,0,0,0,0,18636,0,0,0,25640,0,0,0,0, 0,0,2244,0,0,11818,0,1168,0,0,0,0,0,0,0,6540,23079,13770,7719,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58150,528, 34502,32682,0,0,12997,0,0,0,0,0,2214,0,0,0,0,0,58567,0,0,0,26375,0,0,0,0,0,0,0,0 ,0,26437,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,32005,22952,59047,0,13543,0,0,0,0,0,0,0,0,16328,0,0,33542,0,0,0,19782,0,0,0, 16644,0,0,0,0,31688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10276,0,0,0, 0,0,0,0,36327,0,0,29480,0,0,0,777,12709,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27398,0,0, 0,4455,9037,31397,0,9221,0,0,0,60487,20840,1796,0,0,0,0,0,0,0,0,8364,0,0,0,0,0,0 ,0,0,0,0,0,19752,44902,0,38566,0,0,18027,0,0,0,0,0,0,0,0,10662,0,0,0,0,0,11812,0 ,0,0,0,0,0,0,0,0,19910,0,0,0,45030,0,0,0,0,0,0,0,0,0,0,0,0,19978,5127,0,11620,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,19817,0,5579,9350,0,0,21002,19718,0,0,0,21926,0,0,0,0,0,0,0,0,0,0,0,0,0,20711, 0,0,0,20197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40550,0,0,0,57510,0,0,0,53895, 0,0,15017,0,17000,39367,2347,0,0,0,0,0,0,0,0,0,8588,0,0,0,0,0,3273,17862,3498, 2085,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19048,0,0,0,0,0,11978,58631,0,0,0,0 ,0,0,523,0,12969,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28197,0,47846,0,0,0,0,0,0 ,0,0,0,4549,0,0,0,0,0,0,0,0,0,0,687,14917,748,8229,0,0,0,0,0,0,2476,12935,0,0,0, 0,0,0,22792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27528,59142,0,0,20876,20134,0,0,0, 0,440,12068,0,58951,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48038,0,0,0,60999,0,0,0,0, 0,0,0,0,0,0,0,0,0,15716,7498,5476,0,0,0,0,20202,37959,0,0,0,0,0,0,0,0,0,0,0,0, 29801,0,5451,0,0,0,0,0,0,0,0,0,0,50790,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24485,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13573,0,0,22856,0,0,0,0,21927,0,0,0,0,0 ,0,9130,0,0,0,0,0,0,13732,0,0,0,0,0,0,0,0,0,0,2282,583,0,0,0,0,0,0,0,0,0,0,3726, 26503,0,0,0,0,0,0,9258,0,0,0,0,0,0,0,0,21604,0,0,0,45574,0,0,0,0,0,20710,0,0,0, 42694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1163,6694,0,0,0,0,0,0,0,10948,0,0,0,29700,0,0, 0,0,0,58823,3796,27399,20939,10180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 19,29287,28649,14534,0,0,16428,45607,0,0,0,0,0,0,25322,0,4908,0,0,0,0,0,0,25476, 29097,14246,11053,0,0,0,0,0,0,0,0,18502,0,0,0,44390,0,0,0,17765,0,0,0,0,0,0, 24520,0,0,0,0,0,0,0,0,0,0,17319,0,0,0,0,0,0,0,0,0,0,0,0,0,28166,0,0,0,0,0,48198, 0,0,31467,0,24585,0,0,0,0,18692,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23596,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,7236,968,13637,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3763,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14791,0,0,0,12324,0,12741,0,0,0 ,0,0,0,0,0,0,11108,0,0,0,0,4009,40295,20616,4357,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 15015,0,0,0,0,0,43751,0,0,0,0,0,0,0,0,0,0,0,23013,0,0,0,0,0,0,0,0,0,0,0,0,0, 45542,0,0,0,0,0,0,0,0,0,23974,0,0,0,0,17480,20647,0,0,0,0,0,0,8876,0,0,40806,0,0 ,0,0,0,0,0,14502,17160,17764,0,0,31594,35431,0,0,2890,0,0,0,0,0,0,0,0,27524,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8228,0,56583,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,34278,0,0,0,0,0,0,0,0,0,0,0,0,0,2662,0,26724,0,0,0,0,0,0,0,64198,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22281,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3049, 54983,0,0,0,0,0,0,0,837,0,17604,0,0,0,0,0,28838,0,0,0,0,0,0,26312,0,0,3910,0,0,0 ,25830,0,0,0,0,0,8391,0,19845,19240,1092,0,0,5449,0,0,0,0,17188,0,0,0,0,0,0,0,0, 0,10629,0,0,6671,61094,5832,8358,0,0,0,55078,0,0,0,0,0,29860,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,51494,0,28647,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25989,0,0,30153,61318 ,0,0,0,0,0,0,0,24903,0,0,0,4388,0,42054,0,0,0,0,0,0,0,53158,0,0,0,0,0,0,0,50918, 0,0,0,0,0,0,26251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5929,2853,0,37126, 7372,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2027,934,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,55686,0,0,5672,5447,0,62758,0,0,0,0,0,0,0,0,0,0,0,0,2923,0,556,1415, 0,0,0,0,0,0,0,0,0,8645,0,9477,0,0,0,0,0,0,0,48742,0,0,0,0,0,0,0,0,0,0,24235,228, 0,0,0,0,0,0,0,0,0,0,16970,18823,0,0,0,0,0,0,0,0,0,25158,0,0,0,0,0,18567,20072, 2823,14313,1830,0,0,0,0,0,0,0,0,27048,23526,0,0,0,0,0,997,492,0,14730,16677,396, 13574,0,0,0,41671,0,0,0,0,0,0,0,19045,0,0,0,421,17545,3110,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,47111,14475,56551,0,0,0,0,0,0,0,0,0,0,3697,0,0,0,0,0,0,49382,0,35559,0, 0,0,0,40,0,11496,15621,0,8550,0,0,0,63462,0,0,0,0,0,0,0,36966,0,50406,0,46022, 1001,0,0,12069,3249,0,0,0,0,0,0,0,0,0,0,0,0,0,15241,0,0,0,0,0,0,0,0,64743,0,0,0, 0,0,58759,0,0,0,0,1136,26981,0,0,0,0,0,0,0,17732,0,0,0,17157,20011,6629,0,43879, 0,0,0,13572,25128,10759,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28676,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,875,24007,0,0,0,0,7628,0,0,0,0,0,12268,0,0,0,0,0,0,0,0,19300 ,23210,356,0,0,0,0,0,0,0,0,0,15236,0,0,0,0,0,49670,0,0,0,0,0,0,0,21764,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,13931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45799,0,0,436,3589, 0,0,11402,0,0,0,0,0,0,0,0,0,0,62822,0,0,0,39814,588,0,0,0,0,0,0,27750,0,0,0,0,0, 0,1609,22660,2346,18951,0,16068,0,0,0,0,0,0,5162,11110,0,0,0,0,15048,1060,0,7879 ,18280,326,0,14886,19656,0,7594,0,0,0,0,0,781,581,0,16198,0,0,0,0,0,0,1078,9892, 0,0,0,0,0,0,0,0,0,0,4489,0,0,0,0,33798,0,0,0,54534,0,0,0,0,0,0,0,33158,0,0,0,0,0 ,0,0,0,0,42086,13834,2757,8456,16773,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3434,0,0,0, 0,0,3946,29668,0,0,30634,36775,0,0,0,0,0,24901,0,16069,6280,0,0,0,0,41990,0,0,0, 0,0,0,0,27365,0,0,0,0,0,0,0,0,0,0,1450,44807,0,0,0,32100,0,0,0,0,0,35110,0,0,0,0 ,0,0,0,0,17448,19591,0,0,0,0,0,0,0,0,0,0,0,0,1739,0,0,0,0,5511,0,0,0,32934,0,0,0 ,0,0,0,0,0,0,18180,0,0,0,23428,19754,0,0,31174,3021,31655,23464,0,0,0,0,0,0, 57255,0,0,21292,64487,0,0,0,0,0,0,25802,9189,0,0,0,0,0,49254,0,0,0,0,0,0,0,0,0,0 ,5837,50023,0,0,0,0,0,0,0,0,0,15495,0,0,0,0,0,51942,0,0,0,0,0,0,0,0,28104,58662, 0,50214,0,0,0,0,0,0,0,0,2988,0,22888,31812,0,0,0,0,0,2020,0,18916,0,0,0,0,0,0,0, 23973,0,0,0,0,17516,11717,0,0,0,55911,0,0,0,0,0,0,0,2855,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,46822,0,24710,28586,0,0,0,1556,0,0,30117,0,0,22090,57127,3403,14087,0 ,0,0,0,0,0,0,0,0,0,1041,0,10633,6916,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27269,0,0,13322,18055,0,29380,0,56454,0,0,120 ,0,0,8773,0,0,0,0,16040,0,0,0,0,0,0,0,27242,23781,0,1572,0,28134,0,0,1512,0,0,0, 0,0,0,27684,0,38470,0,0,0,0,0,0,1513,8709,0,0,0,0,0,0,0,0,0,0,0,46566,0,0,0,0, 28521,61159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24356,0,0,0,0,0,0,0,0,0,13028,0, 5863,0,0,15693,0,0,0,0,0,0,0,1131,23398,0,0,0,0,0,0,0,26212,0,0,0,0,0,0,0,0,0,0, 0,0,0,18404,0,0,0,0,1457,26183,0,0,2475,7110,0,0,0,0,27180,60166,0,0,0,20262,0, 41862,0,0,0,0,0,0,0,0,0,0,2762,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26148,0,0,0,0,0,0,0,0 ,0,28229,0,0,0,29254,0,0,0,0,0,0,0,0,0,0,27690,0,0,13636,12776,1862,0,0,0,0,0,0, 17225,3271,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28039,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,4457,18117,0,2023,402,0,0,0,0,0,0,0,0,0,0,0,0,0,104,3654,0,0, 0,0,0,0,0,0,18440,0,0,0,0,0,0,0,0,29861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,22150,0,0,0,0,0,0,0,0,0,0,0,0,24074,0,0,0,0,0,0,0,0,12004,0,32358, 0,0,3081,0,0,0,0,0,0,0,0,0,4749,0,0,0,0,0,0,0,0,0,0,0,10792,1799,21322,0,7880, 12613,0,0,0,0,0,0,0,0,13993,0,0,0,16202,0,0,0,0,32102,0,37223,0,10500,0,0,0,0,0, 0,0,0,32008,0,0,0,0,0,23816,3236,0,0,0,0,0,23237,0,0,5642,0,4684,294,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,26852,0,0,0,0,0,0,7148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,7890,61798,939,0,0,56679,0,0,0,0,0,27078,202,5029,0,0,0,0,0, 0,0,0,0,28005,0,0,15273,24741,5676,20452,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55910,0,0 ,0,0,5069,27942,0,21092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12517,0,0,0,0,0,0, 0,0,0,0,0,0,21384,28260,0,2502,20108,0,0,0,0,0,0,0,0,0,0,0,0,46726,0,30790,0,0,0 ,0,0,14725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1099,6372,0,0,0,12422,15182,0,8683,0, 10665,19462,0,0,0,0,0,0,1590,0,31628,0,22632,19750,0,0,0,0,0,0,0,24198,0,0,0,0,0 ,50662,0,0,0,0,0,0,0,0,0,0,9131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11015,0,0,0,0,0,0,0, 0,16490,54695,0,0,0,0,0,0,0,0,12937,0,0,0,0,16004,0,0,0,0,0,0,0,0,0,2181,6923,0, 0,0,0,0,0,0,15624,11302,0,0,5673,7559,0,0,14668,15684,0,0,0,0,0,0,24204,48134,0, 24230,0,55527,0,0,3464,19141,0,0,0,0}; #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/compress_fragment.c0000664000175000017500000007716613510660062017017 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function for fast encoding of an input fragment, independently from the input history. This function uses one-pass processing: when we find a backward match, we immediately emit the corresponding command and literal codes to the bit stream. Adapted from the CompressFragment() function in https://github.com/google/snappy/blob/master/snappy.cc */ #include "./compress_fragment.h" #include /* memcmp, memcpy, memset */ #include "../common/constants.h" #include "../common/platform.h" #include #include "./brotli_bit_stream.h" #include "./entropy_encode.h" #include "./fast_log.h" #include "./find_match_length.h" #include "./memory.h" #include "./write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define MAX_DISTANCE (long)BROTLI_MAX_BACKWARD_LIMIT(18) /* kHashMul32 multiplier has these properties: * The multiplier must be odd. Otherwise we may lose the highest bit. * No long streaks of ones or zeros. * There is no effort to ensure that it is a prime, the oddity is enough for this use. * The number has been tuned heuristically against compression benchmarks. */ static const uint32_t kHashMul32 = 0x1E35A7BD; static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift) { const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(p) << 24) * kHashMul32; return (uint32_t)(h >> shift); } static BROTLI_INLINE uint32_t HashBytesAtOffset( uint64_t v, int offset, size_t shift) { BROTLI_DCHECK(offset >= 0); BROTLI_DCHECK(offset <= 3); { const uint64_t h = ((v >> (8 * offset)) << 24) * kHashMul32; return (uint32_t)(h >> shift); } } static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2) { return TO_BROTLI_BOOL( BrotliUnalignedRead32(p1) == BrotliUnalignedRead32(p2) && p1[4] == p2[4]); } /* Builds a literal prefix code into "depths" and "bits" based on the statistics of the "input" string and stores it into the bit stream. Note that the prefix code here is built from the pre-LZ77 input, therefore we can only approximate the statistics of the actual literal stream. Moreover, for long inputs we build a histogram from a sample of the input and thus have to assign a non-zero depth for each literal. Returns estimated compression ratio millibytes/char for encoding given input with generated code. */ static size_t BuildAndStoreLiteralPrefixCode(MemoryManager* m, const uint8_t* input, const size_t input_size, uint8_t depths[256], uint16_t bits[256], size_t* storage_ix, uint8_t* storage) { uint32_t histogram[256] = { 0 }; size_t histogram_total; size_t i; if (input_size < (1 << 15)) { for (i = 0; i < input_size; ++i) { ++histogram[input[i]]; } histogram_total = input_size; for (i = 0; i < 256; ++i) { /* We weigh the first 11 samples with weight 3 to account for the balancing effect of the LZ77 phase on the histogram. */ const uint32_t adjust = 2 * BROTLI_MIN(uint32_t, histogram[i], 11u); histogram[i] += adjust; histogram_total += adjust; } } else { static const size_t kSampleRate = 29; for (i = 0; i < input_size; i += kSampleRate) { ++histogram[input[i]]; } histogram_total = (input_size + kSampleRate - 1) / kSampleRate; for (i = 0; i < 256; ++i) { /* We add 1 to each population count to avoid 0 bit depths (since this is only a sample and we don't know if the symbol appears or not), and we weigh the first 11 samples with weight 3 to account for the balancing effect of the LZ77 phase on the histogram (more frequent symbols are more likely to be in backward references instead as literals). */ const uint32_t adjust = 1 + 2 * BROTLI_MIN(uint32_t, histogram[i], 11u); histogram[i] += adjust; histogram_total += adjust; } } BrotliBuildAndStoreHuffmanTreeFast(m, histogram, histogram_total, /* max_bits = */ 8, depths, bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return 0; { size_t literal_ratio = 0; for (i = 0; i < 256; ++i) { if (histogram[i]) literal_ratio += histogram[i] * depths[i]; } /* Estimated encoding ratio, millibytes per symbol. */ return (literal_ratio * 125) / histogram_total; } } /* Builds a command and distance prefix code (each 64 symbols) into "depth" and "bits" based on "histogram" and stores it into the bit stream. */ static void BuildAndStoreCommandPrefixCode(const uint32_t histogram[128], uint8_t depth[128], uint16_t bits[128], size_t* storage_ix, uint8_t* storage) { /* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */ HuffmanTree tree[129]; uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0 }; uint16_t cmd_bits[64]; BrotliCreateHuffmanTree(histogram, 64, 15, tree, depth); BrotliCreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]); /* We have to jump through a few hoops here in order to compute the command bits because the symbols are in a different order than in the full alphabet. This looks complicated, but having the symbols in this order in the command bits saves a few branches in the Emit* functions. */ memcpy(cmd_depth, depth, 24); memcpy(cmd_depth + 24, depth + 40, 8); memcpy(cmd_depth + 32, depth + 24, 8); memcpy(cmd_depth + 40, depth + 48, 8); memcpy(cmd_depth + 48, depth + 32, 8); memcpy(cmd_depth + 56, depth + 56, 8); BrotliConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits); memcpy(bits, cmd_bits, 48); memcpy(bits + 24, cmd_bits + 32, 16); memcpy(bits + 32, cmd_bits + 48, 16); memcpy(bits + 40, cmd_bits + 24, 16); memcpy(bits + 48, cmd_bits + 40, 16); memcpy(bits + 56, cmd_bits + 56, 16); BrotliConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]); { /* Create the bit length array for the full command alphabet. */ size_t i; memset(cmd_depth, 0, 64); /* only 64 first values were used */ memcpy(cmd_depth, depth, 8); memcpy(cmd_depth + 64, depth + 8, 8); memcpy(cmd_depth + 128, depth + 16, 8); memcpy(cmd_depth + 192, depth + 24, 8); memcpy(cmd_depth + 384, depth + 32, 8); for (i = 0; i < 8; ++i) { cmd_depth[128 + 8 * i] = depth[40 + i]; cmd_depth[256 + 8 * i] = depth[48 + i]; cmd_depth[448 + 8 * i] = depth[56 + i]; } BrotliStoreHuffmanTree( cmd_depth, BROTLI_NUM_COMMAND_SYMBOLS, tree, storage_ix, storage); } BrotliStoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage); } /* REQUIRES: insertlen < 6210 */ static BROTLI_INLINE void EmitInsertLen(size_t insertlen, const uint8_t depth[128], const uint16_t bits[128], uint32_t histo[128], size_t* storage_ix, uint8_t* storage) { if (insertlen < 6) { const size_t code = insertlen + 40; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); ++histo[code]; } else if (insertlen < 130) { const size_t tail = insertlen - 2; const uint32_t nbits = Log2FloorNonZero(tail) - 1u; const size_t prefix = tail >> nbits; const size_t inscode = (nbits << 1) + prefix + 42; BrotliWriteBits(depth[inscode], bits[inscode], storage_ix, storage); BrotliWriteBits(nbits, tail - (prefix << nbits), storage_ix, storage); ++histo[inscode]; } else if (insertlen < 2114) { const size_t tail = insertlen - 66; const uint32_t nbits = Log2FloorNonZero(tail); const size_t code = nbits + 50; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); BrotliWriteBits(nbits, tail - ((size_t)1 << nbits), storage_ix, storage); ++histo[code]; } else { BrotliWriteBits(depth[61], bits[61], storage_ix, storage); BrotliWriteBits(12, insertlen - 2114, storage_ix, storage); ++histo[61]; } } static BROTLI_INLINE void EmitLongInsertLen(size_t insertlen, const uint8_t depth[128], const uint16_t bits[128], uint32_t histo[128], size_t* storage_ix, uint8_t* storage) { if (insertlen < 22594) { BrotliWriteBits(depth[62], bits[62], storage_ix, storage); BrotliWriteBits(14, insertlen - 6210, storage_ix, storage); ++histo[62]; } else { BrotliWriteBits(depth[63], bits[63], storage_ix, storage); BrotliWriteBits(24, insertlen - 22594, storage_ix, storage); ++histo[63]; } } static BROTLI_INLINE void EmitCopyLen(size_t copylen, const uint8_t depth[128], const uint16_t bits[128], uint32_t histo[128], size_t* storage_ix, uint8_t* storage) { if (copylen < 10) { BrotliWriteBits( depth[copylen + 14], bits[copylen + 14], storage_ix, storage); ++histo[copylen + 14]; } else if (copylen < 134) { const size_t tail = copylen - 6; const uint32_t nbits = Log2FloorNonZero(tail) - 1u; const size_t prefix = tail >> nbits; const size_t code = (nbits << 1) + prefix + 20; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); BrotliWriteBits(nbits, tail - (prefix << nbits), storage_ix, storage); ++histo[code]; } else if (copylen < 2118) { const size_t tail = copylen - 70; const uint32_t nbits = Log2FloorNonZero(tail); const size_t code = nbits + 28; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); BrotliWriteBits(nbits, tail - ((size_t)1 << nbits), storage_ix, storage); ++histo[code]; } else { BrotliWriteBits(depth[39], bits[39], storage_ix, storage); BrotliWriteBits(24, copylen - 2118, storage_ix, storage); ++histo[39]; } } static BROTLI_INLINE void EmitCopyLenLastDistance(size_t copylen, const uint8_t depth[128], const uint16_t bits[128], uint32_t histo[128], size_t* storage_ix, uint8_t* storage) { if (copylen < 12) { BrotliWriteBits(depth[copylen - 4], bits[copylen - 4], storage_ix, storage); ++histo[copylen - 4]; } else if (copylen < 72) { const size_t tail = copylen - 8; const uint32_t nbits = Log2FloorNonZero(tail) - 1; const size_t prefix = tail >> nbits; const size_t code = (nbits << 1) + prefix + 4; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); BrotliWriteBits(nbits, tail - (prefix << nbits), storage_ix, storage); ++histo[code]; } else if (copylen < 136) { const size_t tail = copylen - 8; const size_t code = (tail >> 5) + 30; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); BrotliWriteBits(5, tail & 31, storage_ix, storage); BrotliWriteBits(depth[64], bits[64], storage_ix, storage); ++histo[code]; ++histo[64]; } else if (copylen < 2120) { const size_t tail = copylen - 72; const uint32_t nbits = Log2FloorNonZero(tail); const size_t code = nbits + 28; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); BrotliWriteBits(nbits, tail - ((size_t)1 << nbits), storage_ix, storage); BrotliWriteBits(depth[64], bits[64], storage_ix, storage); ++histo[code]; ++histo[64]; } else { BrotliWriteBits(depth[39], bits[39], storage_ix, storage); BrotliWriteBits(24, copylen - 2120, storage_ix, storage); BrotliWriteBits(depth[64], bits[64], storage_ix, storage); ++histo[39]; ++histo[64]; } } static BROTLI_INLINE void EmitDistance(size_t distance, const uint8_t depth[128], const uint16_t bits[128], uint32_t histo[128], size_t* storage_ix, uint8_t* storage) { const size_t d = distance + 3; const uint32_t nbits = Log2FloorNonZero(d) - 1u; const size_t prefix = (d >> nbits) & 1; const size_t offset = (2 + prefix) << nbits; const size_t distcode = 2 * (nbits - 1) + prefix + 80; BrotliWriteBits(depth[distcode], bits[distcode], storage_ix, storage); BrotliWriteBits(nbits, d - offset, storage_ix, storage); ++histo[distcode]; } static BROTLI_INLINE void EmitLiterals(const uint8_t* input, const size_t len, const uint8_t depth[256], const uint16_t bits[256], size_t* storage_ix, uint8_t* storage) { size_t j; for (j = 0; j < len; j++) { const uint8_t lit = input[j]; BrotliWriteBits(depth[lit], bits[lit], storage_ix, storage); } } /* REQUIRES: len <= 1 << 24. */ static void BrotliStoreMetaBlockHeader( size_t len, BROTLI_BOOL is_uncompressed, size_t* storage_ix, uint8_t* storage) { size_t nibbles = 6; /* ISLAST */ BrotliWriteBits(1, 0, storage_ix, storage); if (len <= (1U << 16)) { nibbles = 4; } else if (len <= (1U << 20)) { nibbles = 5; } BrotliWriteBits(2, nibbles - 4, storage_ix, storage); BrotliWriteBits(nibbles * 4, len - 1, storage_ix, storage); /* ISUNCOMPRESSED */ BrotliWriteBits(1, (uint64_t)is_uncompressed, storage_ix, storage); } static void UpdateBits(size_t n_bits, uint32_t bits, size_t pos, uint8_t* array) { while (n_bits > 0) { size_t byte_pos = pos >> 3; size_t n_unchanged_bits = pos & 7; size_t n_changed_bits = BROTLI_MIN(size_t, n_bits, 8 - n_unchanged_bits); size_t total_bits = n_unchanged_bits + n_changed_bits; uint32_t mask = (~((1u << total_bits) - 1u)) | ((1u << n_unchanged_bits) - 1u); uint32_t unchanged_bits = array[byte_pos] & mask; uint32_t changed_bits = bits & ((1u << n_changed_bits) - 1u); array[byte_pos] = (uint8_t)((changed_bits << n_unchanged_bits) | unchanged_bits); n_bits -= n_changed_bits; bits >>= n_changed_bits; pos += n_changed_bits; } } static void RewindBitPosition(const size_t new_storage_ix, size_t* storage_ix, uint8_t* storage) { const size_t bitpos = new_storage_ix & 7; const size_t mask = (1u << bitpos) - 1; storage[new_storage_ix >> 3] &= (uint8_t)mask; *storage_ix = new_storage_ix; } static BROTLI_BOOL ShouldMergeBlock( const uint8_t* data, size_t len, const uint8_t* depths) { size_t histo[256] = { 0 }; static const size_t kSampleRate = 43; size_t i; for (i = 0; i < len; i += kSampleRate) { ++histo[data[i]]; } { const size_t total = (len + kSampleRate - 1) / kSampleRate; double r = (FastLog2(total) + 0.5) * (double)total + 200; for (i = 0; i < 256; ++i) { r -= (double)histo[i] * (depths[i] + FastLog2(histo[i])); } return TO_BROTLI_BOOL(r >= 0.0); } } /* Acceptable loss for uncompressible speedup is 2% */ #define MIN_RATIO 980 static BROTLI_INLINE BROTLI_BOOL ShouldUseUncompressedMode( const uint8_t* metablock_start, const uint8_t* next_emit, const size_t insertlen, const size_t literal_ratio) { const size_t compressed = (size_t)(next_emit - metablock_start); if (compressed * 50 > insertlen) { return BROTLI_FALSE; } else { return TO_BROTLI_BOOL(literal_ratio > MIN_RATIO); } } static void EmitUncompressedMetaBlock(const uint8_t* begin, const uint8_t* end, const size_t storage_ix_start, size_t* storage_ix, uint8_t* storage) { const size_t len = (size_t)(end - begin); RewindBitPosition(storage_ix_start, storage_ix, storage); BrotliStoreMetaBlockHeader(len, 1, storage_ix, storage); *storage_ix = (*storage_ix + 7u) & ~7u; memcpy(&storage[*storage_ix >> 3], begin, len); *storage_ix += len << 3; storage[*storage_ix >> 3] = 0; } static uint32_t kCmdHistoSeed[128] = { 0, 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, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, }; static BROTLI_INLINE void BrotliCompressFragmentFastImpl( MemoryManager* m, const uint8_t* input, size_t input_size, BROTLI_BOOL is_last, int* table, size_t table_bits, uint8_t cmd_depth[128], uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code, size_t* storage_ix, uint8_t* storage) { uint32_t cmd_histo[128]; const uint8_t* ip_end; /* "next_emit" is a pointer to the first byte that is not covered by a previous copy. Bytes between "next_emit" and the start of the next copy or the end of the input will be emitted as literal bytes. */ const uint8_t* next_emit = input; /* Save the start of the first block for position and distance computations. */ const uint8_t* base_ip = input; static const size_t kFirstBlockSize = 3 << 15; static const size_t kMergeBlockSize = 1 << 16; const size_t kInputMarginBytes = BROTLI_WINDOW_GAP; const size_t kMinMatchLen = 5; const uint8_t* metablock_start = input; size_t block_size = BROTLI_MIN(size_t, input_size, kFirstBlockSize); size_t total_block_size = block_size; /* Save the bit position of the MLEN field of the meta-block header, so that we can update it later if we decide to extend this meta-block. */ size_t mlen_storage_ix = *storage_ix + 3; uint8_t lit_depth[256]; uint16_t lit_bits[256]; size_t literal_ratio; const uint8_t* ip; int last_distance; const size_t shift = 64u - table_bits; BrotliStoreMetaBlockHeader(block_size, 0, storage_ix, storage); /* No block splits, no contexts. */ BrotliWriteBits(13, 0, storage_ix, storage); literal_ratio = BuildAndStoreLiteralPrefixCode( m, input, block_size, lit_depth, lit_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; { /* Store the pre-compressed command and distance prefix codes. */ size_t i; for (i = 0; i + 7 < *cmd_code_numbits; i += 8) { BrotliWriteBits(8, cmd_code[i >> 3], storage_ix, storage); } } BrotliWriteBits(*cmd_code_numbits & 7, cmd_code[*cmd_code_numbits >> 3], storage_ix, storage); emit_commands: /* Initialize the command and distance histograms. We will gather statistics of command and distance codes during the processing of this block and use it to update the command and distance prefix codes for the next block. */ memcpy(cmd_histo, kCmdHistoSeed, sizeof(kCmdHistoSeed)); /* "ip" is the input pointer. */ ip = input; last_distance = -1; ip_end = input + block_size; if (BROTLI_PREDICT_TRUE(block_size >= kInputMarginBytes)) { /* For the last block, we need to keep a 16 bytes margin so that we can be sure that all distances are at most window size - 16. For all other blocks, we only need to keep a margin of 5 bytes so that we don't go over the block size with a copy. */ const size_t len_limit = BROTLI_MIN(size_t, block_size - kMinMatchLen, input_size - kInputMarginBytes); const uint8_t* ip_limit = input + len_limit; uint32_t next_hash; for (next_hash = Hash(++ip, shift); ; ) { /* Step 1: Scan forward in the input looking for a 5-byte-long match. If we get close to exhausting the input then goto emit_remainder. Heuristic match skipping: If 32 bytes are scanned with no matches found, start looking only at every other byte. If 32 more bytes are scanned, look at every third byte, etc.. When a match is found, immediately go back to looking at every byte. This is a small loss (~5% performance, ~0.1% density) for compressible data due to more bookkeeping, but for non-compressible data (such as JPEG) it's a huge win since the compressor quickly "realizes" the data is incompressible and doesn't bother looking for matches everywhere. The "skip" variable keeps track of how many bytes there are since the last match; dividing it by 32 (i.e. right-shifting by five) gives the number of bytes to move ahead for each iteration. */ uint32_t skip = 32; const uint8_t* next_ip = ip; const uint8_t* candidate; BROTLI_DCHECK(next_emit < ip); trawl: do { uint32_t hash = next_hash; uint32_t bytes_between_hash_lookups = skip++ >> 5; BROTLI_DCHECK(hash == Hash(next_ip, shift)); ip = next_ip; next_ip = ip + bytes_between_hash_lookups; if (BROTLI_PREDICT_FALSE(next_ip > ip_limit)) { goto emit_remainder; } next_hash = Hash(next_ip, shift); candidate = ip - last_distance; if (IsMatch(ip, candidate)) { if (BROTLI_PREDICT_TRUE(candidate < ip)) { table[hash] = (int)(ip - base_ip); break; } } candidate = base_ip + table[hash]; BROTLI_DCHECK(candidate >= base_ip); BROTLI_DCHECK(candidate < ip); table[hash] = (int)(ip - base_ip); } while (BROTLI_PREDICT_TRUE(!IsMatch(ip, candidate))); /* Check copy distance. If candidate is not feasible, continue search. Checking is done outside of hot loop to reduce overhead. */ if (ip - candidate > MAX_DISTANCE) goto trawl; /* Step 2: Emit the found match together with the literal bytes from "next_emit" to the bit stream, and then see if we can find a next match immediately afterwards. Repeat until we find no match for the input without emitting some literal bytes. */ { /* We have a 5-byte match at ip, and we need to emit bytes in [next_emit, ip). */ const uint8_t* base = ip; size_t matched = 5 + FindMatchLengthWithLimit( candidate + 5, ip + 5, (size_t)(ip_end - ip) - 5); int distance = (int)(base - candidate); /* > 0 */ size_t insert = (size_t)(base - next_emit); ip += matched; BROTLI_DCHECK(0 == memcmp(base, candidate, matched)); if (BROTLI_PREDICT_TRUE(insert < 6210)) { EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); } else if (ShouldUseUncompressedMode(metablock_start, next_emit, insert, literal_ratio)) { EmitUncompressedMetaBlock(metablock_start, base, mlen_storage_ix - 3, storage_ix, storage); input_size -= (size_t)(base - input); input = base; next_emit = input; goto next_block; } else { EmitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); } EmitLiterals(next_emit, insert, lit_depth, lit_bits, storage_ix, storage); if (distance == last_distance) { BrotliWriteBits(cmd_depth[64], cmd_bits[64], storage_ix, storage); ++cmd_histo[64]; } else { EmitDistance((size_t)distance, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); last_distance = distance; } EmitCopyLenLastDistance(matched, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); next_emit = ip; if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) { goto emit_remainder; } /* We could immediately start working at ip now, but to improve compression we first update "table" with the hashes of some positions within the last copy. */ { uint64_t input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 3); uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift); uint32_t cur_hash = HashBytesAtOffset(input_bytes, 3, shift); table[prev_hash] = (int)(ip - base_ip - 3); prev_hash = HashBytesAtOffset(input_bytes, 1, shift); table[prev_hash] = (int)(ip - base_ip - 2); prev_hash = HashBytesAtOffset(input_bytes, 2, shift); table[prev_hash] = (int)(ip - base_ip - 1); candidate = base_ip + table[cur_hash]; table[cur_hash] = (int)(ip - base_ip); } } while (IsMatch(ip, candidate)) { /* We have a 5-byte match at ip, and no need to emit any literal bytes prior to ip. */ const uint8_t* base = ip; size_t matched = 5 + FindMatchLengthWithLimit( candidate + 5, ip + 5, (size_t)(ip_end - ip) - 5); if (ip - candidate > MAX_DISTANCE) break; ip += matched; last_distance = (int)(base - candidate); /* > 0 */ BROTLI_DCHECK(0 == memcmp(base, candidate, matched)); EmitCopyLen(matched, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); EmitDistance((size_t)last_distance, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); next_emit = ip; if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) { goto emit_remainder; } /* We could immediately start working at ip now, but to improve compression we first update "table" with the hashes of some positions within the last copy. */ { uint64_t input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 3); uint32_t prev_hash = HashBytesAtOffset(input_bytes, 0, shift); uint32_t cur_hash = HashBytesAtOffset(input_bytes, 3, shift); table[prev_hash] = (int)(ip - base_ip - 3); prev_hash = HashBytesAtOffset(input_bytes, 1, shift); table[prev_hash] = (int)(ip - base_ip - 2); prev_hash = HashBytesAtOffset(input_bytes, 2, shift); table[prev_hash] = (int)(ip - base_ip - 1); candidate = base_ip + table[cur_hash]; table[cur_hash] = (int)(ip - base_ip); } } next_hash = Hash(++ip, shift); } } emit_remainder: BROTLI_DCHECK(next_emit <= ip_end); input += block_size; input_size -= block_size; block_size = BROTLI_MIN(size_t, input_size, kMergeBlockSize); /* Decide if we want to continue this meta-block instead of emitting the last insert-only command. */ if (input_size > 0 && total_block_size + block_size <= (1 << 20) && ShouldMergeBlock(input, block_size, lit_depth)) { BROTLI_DCHECK(total_block_size > (1 << 16)); /* Update the size of the current meta-block and continue emitting commands. We can do this because the current size and the new size both have 5 nibbles. */ total_block_size += block_size; UpdateBits(20, (uint32_t)(total_block_size - 1), mlen_storage_ix, storage); goto emit_commands; } /* Emit the remaining bytes as literals. */ if (next_emit < ip_end) { const size_t insert = (size_t)(ip_end - next_emit); if (BROTLI_PREDICT_TRUE(insert < 6210)) { EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); EmitLiterals(next_emit, insert, lit_depth, lit_bits, storage_ix, storage); } else if (ShouldUseUncompressedMode(metablock_start, next_emit, insert, literal_ratio)) { EmitUncompressedMetaBlock(metablock_start, ip_end, mlen_storage_ix - 3, storage_ix, storage); } else { EmitLongInsertLen(insert, cmd_depth, cmd_bits, cmd_histo, storage_ix, storage); EmitLiterals(next_emit, insert, lit_depth, lit_bits, storage_ix, storage); } } next_emit = ip_end; next_block: /* If we have more data, write a new meta-block header and prefix codes and then continue emitting commands. */ if (input_size > 0) { metablock_start = input; block_size = BROTLI_MIN(size_t, input_size, kFirstBlockSize); total_block_size = block_size; /* Save the bit position of the MLEN field of the meta-block header, so that we can update it later if we decide to extend this meta-block. */ mlen_storage_ix = *storage_ix + 3; BrotliStoreMetaBlockHeader(block_size, 0, storage_ix, storage); /* No block splits, no contexts. */ BrotliWriteBits(13, 0, storage_ix, storage); literal_ratio = BuildAndStoreLiteralPrefixCode( m, input, block_size, lit_depth, lit_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depth, cmd_bits, storage_ix, storage); goto emit_commands; } if (!is_last) { /* If this is not the last block, update the command and distance prefix codes for the next block and store the compressed forms. */ cmd_code[0] = 0; *cmd_code_numbits = 0; BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depth, cmd_bits, cmd_code_numbits, cmd_code); } } #define FOR_TABLE_BITS_(X) X(9) X(11) X(13) X(15) #define BAKE_METHOD_PARAM_(B) \ static BROTLI_NOINLINE void BrotliCompressFragmentFastImpl ## B( \ MemoryManager* m, const uint8_t* input, size_t input_size, \ BROTLI_BOOL is_last, int* table, uint8_t cmd_depth[128], \ uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code, \ size_t* storage_ix, uint8_t* storage) { \ BrotliCompressFragmentFastImpl(m, input, input_size, is_last, table, B, \ cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); \ } FOR_TABLE_BITS_(BAKE_METHOD_PARAM_) #undef BAKE_METHOD_PARAM_ void BrotliCompressFragmentFast( MemoryManager* m, const uint8_t* input, size_t input_size, BROTLI_BOOL is_last, int* table, size_t table_size, uint8_t cmd_depth[128], uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code, size_t* storage_ix, uint8_t* storage) { const size_t initial_storage_ix = *storage_ix; const size_t table_bits = Log2FloorNonZero(table_size); if (input_size == 0) { BROTLI_DCHECK(is_last); BrotliWriteBits(1, 1, storage_ix, storage); /* islast */ BrotliWriteBits(1, 1, storage_ix, storage); /* isempty */ *storage_ix = (*storage_ix + 7u) & ~7u; return; } switch (table_bits) { #define CASE_(B) \ case B: \ BrotliCompressFragmentFastImpl ## B( \ m, input, input_size, is_last, table, cmd_depth, cmd_bits, \ cmd_code_numbits, cmd_code, storage_ix, storage); \ break; FOR_TABLE_BITS_(CASE_) #undef CASE_ default: BROTLI_DCHECK(0); break; } /* If output is larger than single uncompressed block, rewrite it. */ if (*storage_ix - initial_storage_ix > 31 + (input_size << 3)) { EmitUncompressedMetaBlock(input, input + input_size, initial_storage_ix, storage_ix, storage); } if (is_last) { BrotliWriteBits(1, 1, storage_ix, storage); /* islast */ BrotliWriteBits(1, 1, storage_ix, storage); /* isempty */ *storage_ix = (*storage_ix + 7u) & ~7u; } } #undef FOR_TABLE_BITS_ #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/bit_cost.h0000664000175000017500000000322013510660062015070 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions to estimate the bit cost of Huffman trees. */ #ifndef BROTLI_ENC_BIT_COST_H_ #define BROTLI_ENC_BIT_COST_H_ #include "../common/platform.h" #include #include "./fast_log.h" #include "./histogram.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static BROTLI_INLINE double ShannonEntropy( const uint32_t* population, size_t size, size_t* total) { size_t sum = 0; double retval = 0; const uint32_t* population_end = population + size; size_t p; if (size & 1) { goto odd_number_of_elements_left; } while (population < population_end) { p = *population++; sum += p; retval -= (double)p * FastLog2(p); odd_number_of_elements_left: p = *population++; sum += p; retval -= (double)p * FastLog2(p); } if (sum) retval += (double)sum * FastLog2(sum); *total = sum; return retval; } static BROTLI_INLINE double BitsEntropy( const uint32_t* population, size_t size) { size_t sum; double retval = ShannonEntropy(population, size, &sum); if (retval < sum) { /* At least one bit per literal is needed. */ retval = (double)sum; } return retval; } BROTLI_INTERNAL double BrotliPopulationCostLiteral(const HistogramLiteral*); BROTLI_INTERNAL double BrotliPopulationCostCommand(const HistogramCommand*); BROTLI_INTERNAL double BrotliPopulationCostDistance(const HistogramDistance*); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_BIT_COST_H_ */ dvisvgm-2.8.1/libs/brotli/enc/utf8_util.h0000664000175000017500000000161013510660062015206 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Heuristics for deciding about the UTF8-ness of strings. */ #ifndef BROTLI_ENC_UTF8_UTIL_H_ #define BROTLI_ENC_UTF8_UTIL_H_ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static const double kMinUTF8Ratio = 0.75; /* Returns 1 if at least min_fraction of the bytes between pos and pos + length in the (data, mask) ring-buffer is UTF8-encoded, otherwise returns 0. */ BROTLI_INTERNAL BROTLI_BOOL BrotliIsMostlyUTF8( const uint8_t* data, const size_t pos, const size_t mask, const size_t length, const double min_fraction); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_UTF8_UTIL_H_ */ dvisvgm-2.8.1/libs/brotli/enc/fast_log.h0000664000175000017500000001606513510660062015073 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Utilities for fast computation of logarithms. */ #ifndef BROTLI_ENC_FAST_LOG_H_ #define BROTLI_ENC_FAST_LOG_H_ #include #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static BROTLI_INLINE uint32_t Log2FloorNonZero(size_t n) { /* TODO: generalize and move to platform.h */ #if BROTLI_GNUC_HAS_BUILTIN(__builtin_clz, 3, 4, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) return 31u ^ (uint32_t)__builtin_clz((uint32_t)n); #else uint32_t result = 0; while (n >>= 1) result++; return result; #endif } /* A lookup table for small values of log2(int) to be used in entropy computation. ", ".join(["%.16ff" % x for x in [0.0]+[log2(x) for x in range(1, 256)]]) */ static const float kLog2Table[] = { 0.0000000000000000f, 0.0000000000000000f, 1.0000000000000000f, 1.5849625007211563f, 2.0000000000000000f, 2.3219280948873622f, 2.5849625007211561f, 2.8073549220576042f, 3.0000000000000000f, 3.1699250014423126f, 3.3219280948873626f, 3.4594316186372978f, 3.5849625007211565f, 3.7004397181410922f, 3.8073549220576037f, 3.9068905956085187f, 4.0000000000000000f, 4.0874628412503400f, 4.1699250014423122f, 4.2479275134435852f, 4.3219280948873626f, 4.3923174227787607f, 4.4594316186372973f, 4.5235619560570131f, 4.5849625007211570f, 4.6438561897747244f, 4.7004397181410926f, 4.7548875021634691f, 4.8073549220576037f, 4.8579809951275728f, 4.9068905956085187f, 4.9541963103868758f, 5.0000000000000000f, 5.0443941193584534f, 5.0874628412503400f, 5.1292830169449664f, 5.1699250014423122f, 5.2094533656289501f, 5.2479275134435852f, 5.2854022188622487f, 5.3219280948873626f, 5.3575520046180838f, 5.3923174227787607f, 5.4262647547020979f, 5.4594316186372973f, 5.4918530963296748f, 5.5235619560570131f, 5.5545888516776376f, 5.5849625007211570f, 5.6147098441152083f, 5.6438561897747244f, 5.6724253419714961f, 5.7004397181410926f, 5.7279204545631996f, 5.7548875021634691f, 5.7813597135246599f, 5.8073549220576046f, 5.8328900141647422f, 5.8579809951275719f, 5.8826430493618416f, 5.9068905956085187f, 5.9307373375628867f, 5.9541963103868758f, 5.9772799234999168f, 6.0000000000000000f, 6.0223678130284544f, 6.0443941193584534f, 6.0660891904577721f, 6.0874628412503400f, 6.1085244567781700f, 6.1292830169449672f, 6.1497471195046822f, 6.1699250014423122f, 6.1898245588800176f, 6.2094533656289510f, 6.2288186904958804f, 6.2479275134435861f, 6.2667865406949019f, 6.2854022188622487f, 6.3037807481771031f, 6.3219280948873617f, 6.3398500028846252f, 6.3575520046180847f, 6.3750394313469254f, 6.3923174227787598f, 6.4093909361377026f, 6.4262647547020979f, 6.4429434958487288f, 6.4594316186372982f, 6.4757334309663976f, 6.4918530963296748f, 6.5077946401986964f, 6.5235619560570131f, 6.5391588111080319f, 6.5545888516776376f, 6.5698556083309478f, 6.5849625007211561f, 6.5999128421871278f, 6.6147098441152092f, 6.6293566200796095f, 6.6438561897747253f, 6.6582114827517955f, 6.6724253419714952f, 6.6865005271832185f, 6.7004397181410917f, 6.7142455176661224f, 6.7279204545631988f, 6.7414669864011465f, 6.7548875021634691f, 6.7681843247769260f, 6.7813597135246599f, 6.7944158663501062f, 6.8073549220576037f, 6.8201789624151887f, 6.8328900141647422f, 6.8454900509443757f, 6.8579809951275719f, 6.8703647195834048f, 6.8826430493618416f, 6.8948177633079437f, 6.9068905956085187f, 6.9188632372745955f, 6.9307373375628867f, 6.9425145053392399f, 6.9541963103868758f, 6.9657842846620879f, 6.9772799234999168f, 6.9886846867721664f, 7.0000000000000000f, 7.0112272554232540f, 7.0223678130284544f, 7.0334230015374501f, 7.0443941193584534f, 7.0552824355011898f, 7.0660891904577721f, 7.0768155970508317f, 7.0874628412503400f, 7.0980320829605272f, 7.1085244567781700f, 7.1189410727235076f, 7.1292830169449664f, 7.1395513523987937f, 7.1497471195046822f, 7.1598713367783891f, 7.1699250014423130f, 7.1799090900149345f, 7.1898245588800176f, 7.1996723448363644f, 7.2094533656289492f, 7.2191685204621621f, 7.2288186904958804f, 7.2384047393250794f, 7.2479275134435861f, 7.2573878426926521f, 7.2667865406949019f, 7.2761244052742384f, 7.2854022188622487f, 7.2946207488916270f, 7.3037807481771031f, 7.3128829552843557f, 7.3219280948873617f, 7.3309168781146177f, 7.3398500028846243f, 7.3487281542310781f, 7.3575520046180847f, 7.3663222142458151f, 7.3750394313469254f, 7.3837042924740528f, 7.3923174227787607f, 7.4008794362821844f, 7.4093909361377026f, 7.4178525148858991f, 7.4262647547020979f, 7.4346282276367255f, 7.4429434958487288f, 7.4512111118323299f, 7.4594316186372973f, 7.4676055500829976f, 7.4757334309663976f, 7.4838157772642564f, 7.4918530963296748f, 7.4998458870832057f, 7.5077946401986964f, 7.5156998382840436f, 7.5235619560570131f, 7.5313814605163119f, 7.5391588111080319f, 7.5468944598876373f, 7.5545888516776376f, 7.5622424242210728f, 7.5698556083309478f, 7.5774288280357487f, 7.5849625007211561f, 7.5924570372680806f, 7.5999128421871278f, 7.6073303137496113f, 7.6147098441152075f, 7.6220518194563764f, 7.6293566200796095f, 7.6366246205436488f, 7.6438561897747244f, 7.6510516911789290f, 7.6582114827517955f, 7.6653359171851765f, 7.6724253419714952f, 7.6794800995054464f, 7.6865005271832185f, 7.6934869574993252f, 7.7004397181410926f, 7.7073591320808825f, 7.7142455176661224f, 7.7210991887071856f, 7.7279204545631996f, 7.7347096202258392f, 7.7414669864011465f, 7.7481928495894596f, 7.7548875021634691f, 7.7615512324444795f, 7.7681843247769260f, 7.7747870596011737f, 7.7813597135246608f, 7.7879025593914317f, 7.7944158663501062f, 7.8008998999203047f, 7.8073549220576037f, 7.8137811912170374f, 7.8201789624151887f, 7.8265484872909159f, 7.8328900141647422f, 7.8392037880969445f, 7.8454900509443757f, 7.8517490414160571f, 7.8579809951275719f, 7.8641861446542798f, 7.8703647195834048f, 7.8765169465650002f, 7.8826430493618425f, 7.8887432488982601f, 7.8948177633079446f, 7.9008668079807496f, 7.9068905956085187f, 7.9128893362299619f, 7.9188632372745955f, 7.9248125036057813f, 7.9307373375628867f, 7.9366379390025719f, 7.9425145053392399f, 7.9483672315846778f, 7.9541963103868758f, 7.9600019320680806f, 7.9657842846620870f, 7.9715435539507720f, 7.9772799234999168f, 7.9829935746943104f, 7.9886846867721664f, 7.9943534368588578f }; #define LOG_2_INV 1.4426950408889634 /* Faster logarithm for small integers, with the property of log2(0) == 0. */ static BROTLI_INLINE double FastLog2(size_t v) { if (v < sizeof(kLog2Table) / sizeof(kLog2Table[0])) { return kLog2Table[v]; } #if (defined(_MSC_VER) && _MSC_VER <= 1700) || \ (defined(__ANDROID_API__) && __ANDROID_API__ < 18) /* Visual Studio 2012 and Android API levels < 18 do not have the log2() * function defined, so we use log() and a multiplication instead. */ return log((double)v) * LOG_2_INV; #else return log2((double)v); #endif } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_FAST_LOG_H_ */ dvisvgm-2.8.1/libs/brotli/enc/static_dict.h0000664000175000017500000000237413510660062015565 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Class to model the static dictionary. */ #ifndef BROTLI_ENC_STATIC_DICT_H_ #define BROTLI_ENC_STATIC_DICT_H_ #include "../common/dictionary.h" #include "../common/platform.h" #include #include "./encoder_dict.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN 37 static const uint32_t kInvalidMatch = 0xFFFFFFF; /* Matches data against static dictionary words, and for each length l, for which a match is found, updates matches[l] to be the minimum possible (distance << 5) + len_code. Returns 1 if matches have been found, otherwise 0. Prerequisites: matches array is at least BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1 long all elements are initialized to kInvalidMatch */ BROTLI_INTERNAL BROTLI_BOOL BrotliFindAllStaticDictionaryMatches( const BrotliEncoderDictionary* dictionary, const uint8_t* data, size_t min_length, size_t max_length, uint32_t* matches); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_STATIC_DICT_H_ */ dvisvgm-2.8.1/libs/brotli/enc/brotli_bit_stream.h0000664000175000017500000000645313510660062017001 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions to convert brotli-related data structures into the brotli bit stream. The functions here operate under assumption that there is enough space in the storage, i.e., there are no out-of-range checks anywhere. These functions do bit addressing into a byte array. The byte array is called "storage" and the index to the bit is called storage_ix in function arguments. */ #ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_ #define BROTLI_ENC_BROTLI_BIT_STREAM_H_ #include "../common/context.h" #include "../common/platform.h" #include #include "./command.h" #include "./entropy_encode.h" #include "./memory.h" #include "./metablock.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* All Store functions here will use a storage_ix, which is always the bit position for the current storage. */ BROTLI_INTERNAL void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num, HuffmanTree* tree, size_t* storage_ix, uint8_t* storage); BROTLI_INTERNAL void BrotliBuildAndStoreHuffmanTreeFast( MemoryManager* m, const uint32_t* histogram, const size_t histogram_total, const size_t max_bits, uint8_t* depth, uint16_t* bits, size_t* storage_ix, uint8_t* storage); /* REQUIRES: length > 0 */ /* REQUIRES: length <= (1 << 24) */ BROTLI_INTERNAL void BrotliStoreMetaBlock(MemoryManager* m, const uint8_t* input, size_t start_pos, size_t length, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, BROTLI_BOOL is_last, const BrotliEncoderParams* params, ContextType literal_context_mode, const Command* commands, size_t n_commands, const MetaBlockSplit* mb, size_t* storage_ix, uint8_t* storage); /* Stores the meta-block without doing any block splitting, just collects one histogram per block category and uses that for entropy coding. REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ BROTLI_INTERNAL void BrotliStoreMetaBlockTrivial(MemoryManager* m, const uint8_t* input, size_t start_pos, size_t length, size_t mask, BROTLI_BOOL is_last, const BrotliEncoderParams* params, const Command* commands, size_t n_commands, size_t* storage_ix, uint8_t* storage); /* Same as above, but uses static prefix codes for histograms with a only a few symbols, and uses static code length prefix codes for all other histograms. REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ BROTLI_INTERNAL void BrotliStoreMetaBlockFast(MemoryManager* m, const uint8_t* input, size_t start_pos, size_t length, size_t mask, BROTLI_BOOL is_last, const BrotliEncoderParams* params, const Command* commands, size_t n_commands, size_t* storage_ix, uint8_t* storage); /* This is for storing uncompressed blocks (simple raw storage of bytes-as-bytes). REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ BROTLI_INTERNAL void BrotliStoreUncompressedMetaBlock( BROTLI_BOOL is_final_block, const uint8_t* BROTLI_RESTRICT input, size_t position, size_t mask, size_t len, size_t* BROTLI_RESTRICT storage_ix, uint8_t* BROTLI_RESTRICT storage); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_BROTLI_BIT_STREAM_H_ */ dvisvgm-2.8.1/libs/brotli/enc/hash.h0000664000175000017500000003550213510660062014215 00000000000000/* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* A (forgetful) hash table to the data seen by the compressor, to help create backward references to previous data. */ #ifndef BROTLI_ENC_HASH_H_ #define BROTLI_ENC_HASH_H_ #include /* memcmp, memset */ #include "../common/constants.h" #include "../common/dictionary.h" #include "../common/platform.h" #include #include "./encoder_dict.h" #include "./fast_log.h" #include "./find_match_length.h" #include "./memory.h" #include "./quality.h" #include "./static_dict.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Pointer to hasher data. * * Excluding initialization and destruction, hasher can be passed as * HasherHandle by value. * * Typically hasher data consists of 3 sections: * * HasherCommon structure * * private structured hasher data, depending on hasher type * * private dynamic hasher data, depending on hasher type and parameters * * Using "define" instead of "typedef", because on MSVC __restrict does not work * on typedef pointer types. */ #define HasherHandle uint8_t* typedef struct { BrotliHasherParams params; /* False if hasher needs to be "prepared" before use. */ BROTLI_BOOL is_prepared_; size_t dict_num_lookups; size_t dict_num_matches; } HasherCommon; static BROTLI_INLINE HasherCommon* GetHasherCommon(HasherHandle handle) { return (HasherCommon*)handle; } #define score_t size_t static const uint32_t kCutoffTransformsCount = 10; /* 0, 12, 27, 23, 42, 63, 56, 48, 59, 64 */ /* 0+0, 4+8, 8+19, 12+11, 16+26, 20+43, 24+32, 28+20, 32+27, 36+28 */ static const uint64_t kCutoffTransforms = BROTLI_MAKE_UINT64_T(0x071B520A, 0xDA2D3200); typedef struct HasherSearchResult { size_t len; size_t distance; score_t score; int len_code_delta; /* == len_code - len */ } HasherSearchResult; /* kHashMul32 multiplier has these properties: * The multiplier must be odd. Otherwise we may lose the highest bit. * No long streaks of ones or zeros. * There is no effort to ensure that it is a prime, the oddity is enough for this use. * The number has been tuned heuristically against compression benchmarks. */ static const uint32_t kHashMul32 = 0x1E35A7BD; static const uint64_t kHashMul64 = BROTLI_MAKE_UINT64_T(0x1E35A7BD, 0x1E35A7BD); static const uint64_t kHashMul64Long = BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u); static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) { uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return h >> (32 - 14); } static BROTLI_INLINE void PrepareDistanceCache( int* BROTLI_RESTRICT distance_cache, const int num_distances) { if (num_distances > 4) { int last_distance = distance_cache[0]; distance_cache[4] = last_distance - 1; distance_cache[5] = last_distance + 1; distance_cache[6] = last_distance - 2; distance_cache[7] = last_distance + 2; distance_cache[8] = last_distance - 3; distance_cache[9] = last_distance + 3; if (num_distances > 10) { int next_last_distance = distance_cache[1]; distance_cache[10] = next_last_distance - 1; distance_cache[11] = next_last_distance + 1; distance_cache[12] = next_last_distance - 2; distance_cache[13] = next_last_distance + 2; distance_cache[14] = next_last_distance - 3; distance_cache[15] = next_last_distance + 3; } } } #define BROTLI_LITERAL_BYTE_SCORE 135 #define BROTLI_DISTANCE_BIT_PENALTY 30 /* Score must be positive after applying maximal penalty. */ #define BROTLI_SCORE_BASE (BROTLI_DISTANCE_BIT_PENALTY * 8 * sizeof(size_t)) /* Usually, we always choose the longest backward reference. This function allows for the exception of that rule. If we choose a backward reference that is further away, it will usually be coded with more bits. We approximate this by assuming log2(distance). If the distance can be expressed in terms of the last four distances, we use some heuristic constants to estimate the bits cost. For the first up to four literals we use the bit cost of the literals from the literal cost model, after that we use the average bit cost of the cost model. This function is used to sometimes discard a longer backward reference when it is not much longer and the bit cost for encoding it is more than the saved literals. backward_reference_offset MUST be positive. */ static BROTLI_INLINE score_t BackwardReferenceScore( size_t copy_length, size_t backward_reference_offset) { return BROTLI_SCORE_BASE + BROTLI_LITERAL_BYTE_SCORE * (score_t)copy_length - BROTLI_DISTANCE_BIT_PENALTY * Log2FloorNonZero(backward_reference_offset); } static BROTLI_INLINE score_t BackwardReferenceScoreUsingLastDistance( size_t copy_length) { return BROTLI_LITERAL_BYTE_SCORE * (score_t)copy_length + BROTLI_SCORE_BASE + 15; } static BROTLI_INLINE score_t BackwardReferencePenaltyUsingLastDistance( size_t distance_short_code) { return (score_t)39 + ((0x1CA10 >> (distance_short_code & 0xE)) & 0xE); } static BROTLI_INLINE BROTLI_BOOL TestStaticDictionaryItem( const BrotliEncoderDictionary* dictionary, size_t item, const uint8_t* data, size_t max_length, size_t max_backward, size_t max_distance, HasherSearchResult* out) { size_t len; size_t word_idx; size_t offset; size_t matchlen; size_t backward; score_t score; len = item & 0x1F; word_idx = item >> 5; offset = dictionary->words->offsets_by_length[len] + len * word_idx; if (len > max_length) { return BROTLI_FALSE; } matchlen = FindMatchLengthWithLimit(data, &dictionary->words->data[offset], len); if (matchlen + dictionary->cutoffTransformsCount <= len || matchlen == 0) { return BROTLI_FALSE; } { size_t cut = len - matchlen; size_t transform_id = (cut << 2) + (size_t)((dictionary->cutoffTransforms >> (cut * 6)) & 0x3F); backward = max_backward + 1 + word_idx + (transform_id << dictionary->words->size_bits_by_length[len]); } if (backward > max_distance) { return BROTLI_FALSE; } score = BackwardReferenceScore(matchlen, backward); if (score < out->score) { return BROTLI_FALSE; } out->len = matchlen; out->len_code_delta = (int)len - (int)matchlen; out->distance = backward; out->score = score; return BROTLI_TRUE; } static BROTLI_INLINE void SearchInStaticDictionary( const BrotliEncoderDictionary* dictionary, HasherHandle handle, const uint8_t* data, size_t max_length, size_t max_backward, size_t max_distance, HasherSearchResult* out, BROTLI_BOOL shallow) { size_t key; size_t i; HasherCommon* self = GetHasherCommon(handle); if (self->dict_num_matches < (self->dict_num_lookups >> 7)) { return; } key = Hash14(data) << 1; for (i = 0; i < (shallow ? 1u : 2u); ++i, ++key) { size_t item = dictionary->hash_table[key]; self->dict_num_lookups++; if (item != 0) { BROTLI_BOOL item_matches = TestStaticDictionaryItem( dictionary, item, data, max_length, max_backward, max_distance, out); if (item_matches) { self->dict_num_matches++; } } } } typedef struct BackwardMatch { uint32_t distance; uint32_t length_and_code; } BackwardMatch; static BROTLI_INLINE void InitBackwardMatch(BackwardMatch* self, size_t dist, size_t len) { self->distance = (uint32_t)dist; self->length_and_code = (uint32_t)(len << 5); } static BROTLI_INLINE void InitDictionaryBackwardMatch(BackwardMatch* self, size_t dist, size_t len, size_t len_code) { self->distance = (uint32_t)dist; self->length_and_code = (uint32_t)((len << 5) | (len == len_code ? 0 : len_code)); } static BROTLI_INLINE size_t BackwardMatchLength(const BackwardMatch* self) { return self->length_and_code >> 5; } static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) { size_t code = self->length_and_code & 31; return code ? code : BackwardMatchLength(self); } #define EXPAND_CAT(a, b) CAT(a, b) #define CAT(a, b) a ## b #define FN(X) EXPAND_CAT(X, HASHER()) #define HASHER() H10 #define BUCKET_BITS 17 #define MAX_TREE_SEARCH_DEPTH 64 #define MAX_TREE_COMP_LENGTH 128 #include "./hash_to_binary_tree_inc.h" /* NOLINT(build/include) */ #undef MAX_TREE_SEARCH_DEPTH #undef MAX_TREE_COMP_LENGTH #undef BUCKET_BITS #undef HASHER /* MAX_NUM_MATCHES == 64 + MAX_TREE_SEARCH_DEPTH */ #define MAX_NUM_MATCHES_H10 128 /* For BUCKET_SWEEP == 1, enabling the dictionary lookup makes compression a little faster (0.5% - 1%) and it compresses 0.15% better on small text and HTML inputs. */ #define HASHER() H2 #define BUCKET_BITS 16 #define BUCKET_SWEEP 1 #define HASH_LEN 5 #define USE_DICTIONARY 1 #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */ #undef BUCKET_SWEEP #undef USE_DICTIONARY #undef HASHER #define HASHER() H3 #define BUCKET_SWEEP 2 #define USE_DICTIONARY 0 #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */ #undef USE_DICTIONARY #undef BUCKET_SWEEP #undef BUCKET_BITS #undef HASHER #define HASHER() H4 #define BUCKET_BITS 17 #define BUCKET_SWEEP 4 #define USE_DICTIONARY 1 #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */ #undef USE_DICTIONARY #undef HASH_LEN #undef BUCKET_SWEEP #undef BUCKET_BITS #undef HASHER #define HASHER() H5 #include "./hash_longest_match_inc.h" /* NOLINT(build/include) */ #undef HASHER #define HASHER() H6 #include "./hash_longest_match64_inc.h" /* NOLINT(build/include) */ #undef HASHER #define BUCKET_BITS 15 #define NUM_LAST_DISTANCES_TO_CHECK 4 #define NUM_BANKS 1 #define BANK_BITS 16 #define HASHER() H40 #include "./hash_forgetful_chain_inc.h" /* NOLINT(build/include) */ #undef HASHER #undef NUM_LAST_DISTANCES_TO_CHECK #define NUM_LAST_DISTANCES_TO_CHECK 10 #define HASHER() H41 #include "./hash_forgetful_chain_inc.h" /* NOLINT(build/include) */ #undef HASHER #undef NUM_LAST_DISTANCES_TO_CHECK #undef NUM_BANKS #undef BANK_BITS #define NUM_LAST_DISTANCES_TO_CHECK 16 #define NUM_BANKS 512 #define BANK_BITS 9 #define HASHER() H42 #include "./hash_forgetful_chain_inc.h" /* NOLINT(build/include) */ #undef HASHER #undef NUM_LAST_DISTANCES_TO_CHECK #undef NUM_BANKS #undef BANK_BITS #undef BUCKET_BITS #define HASHER() H54 #define BUCKET_BITS 20 #define BUCKET_SWEEP 4 #define HASH_LEN 7 #define USE_DICTIONARY 0 #include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */ #undef USE_DICTIONARY #undef HASH_LEN #undef BUCKET_SWEEP #undef BUCKET_BITS #undef HASHER /* fast large window hashers */ #define HASHER() HROLLING_FAST #define CHUNKLEN 32 #define JUMP 4 #define NUMBUCKETS 16777216 #define MASK ((NUMBUCKETS * 64) - 1) #include "./hash_rolling_inc.h" /* NOLINT(build/include) */ #undef JUMP #undef HASHER #define HASHER() HROLLING #define JUMP 1 #include "./hash_rolling_inc.h" /* NOLINT(build/include) */ #undef MASK #undef NUMBUCKETS #undef JUMP #undef CHUNKLEN #undef HASHER #define HASHER() H35 #define HASHER_A H3 #define HASHER_B HROLLING_FAST #include "./hash_composite_inc.h" /* NOLINT(build/include) */ #undef HASHER_A #undef HASHER_B #undef HASHER #define HASHER() H55 #define HASHER_A H54 #define HASHER_B HROLLING_FAST #include "./hash_composite_inc.h" /* NOLINT(build/include) */ #undef HASHER_A #undef HASHER_B #undef HASHER #define HASHER() H65 #define HASHER_A H6 #define HASHER_B HROLLING #include "./hash_composite_inc.h" /* NOLINT(build/include) */ #undef HASHER_A #undef HASHER_B #undef HASHER #undef FN #undef CAT #undef EXPAND_CAT #define FOR_GENERIC_HASHERS(H) H(2) H(3) H(4) H(5) H(6) H(40) H(41) H(42) H(54)\ H(35) H(55) H(65) #define FOR_ALL_HASHERS(H) FOR_GENERIC_HASHERS(H) H(10) static BROTLI_INLINE void DestroyHasher( MemoryManager* m, HasherHandle* handle) { if (*handle == NULL) return; BROTLI_FREE(m, *handle); } static BROTLI_INLINE void HasherReset(HasherHandle handle) { if (handle == NULL) return; GetHasherCommon(handle)->is_prepared_ = BROTLI_FALSE; } static BROTLI_INLINE size_t HasherSize(const BrotliEncoderParams* params, BROTLI_BOOL one_shot, const size_t input_size) { size_t result = sizeof(HasherCommon); switch (params->hasher.type) { #define SIZE_(N) \ case N: \ result += HashMemAllocInBytesH ## N(params, one_shot, input_size); \ break; FOR_ALL_HASHERS(SIZE_) #undef SIZE_ default: break; } return result; } static BROTLI_INLINE void HasherSetup(MemoryManager* m, HasherHandle* handle, BrotliEncoderParams* params, const uint8_t* data, size_t position, size_t input_size, BROTLI_BOOL is_last) { HasherHandle self = NULL; HasherCommon* common = NULL; BROTLI_BOOL one_shot = (position == 0 && is_last); if (*handle == NULL) { size_t alloc_size; ChooseHasher(params, ¶ms->hasher); alloc_size = HasherSize(params, one_shot, input_size); self = BROTLI_ALLOC(m, uint8_t, alloc_size); if (BROTLI_IS_OOM(m)) return; *handle = self; common = GetHasherCommon(self); common->params = params->hasher; switch (common->params.type) { #define INITIALIZE_(N) \ case N: \ InitializeH ## N(*handle, params); \ break; FOR_ALL_HASHERS(INITIALIZE_); #undef INITIALIZE_ default: break; } HasherReset(*handle); } self = *handle; common = GetHasherCommon(self); if (!common->is_prepared_) { switch (common->params.type) { #define PREPARE_(N) \ case N: \ PrepareH ## N(self, one_shot, input_size, data); \ break; FOR_ALL_HASHERS(PREPARE_) #undef PREPARE_ default: break; } if (position == 0) { common->dict_num_lookups = 0; common->dict_num_matches = 0; } common->is_prepared_ = BROTLI_TRUE; } } static BROTLI_INLINE void InitOrStitchToPreviousBlock( MemoryManager* m, HasherHandle* handle, const uint8_t* data, size_t mask, BrotliEncoderParams* params, size_t position, size_t input_size, BROTLI_BOOL is_last) { HasherHandle self; HasherSetup(m, handle, params, data, position, input_size, is_last); if (BROTLI_IS_OOM(m)) return; self = *handle; switch (GetHasherCommon(self)->params.type) { #define INIT_(N) \ case N: \ StitchToPreviousBlockH ## N(self, input_size, position, data, mask); \ break; FOR_ALL_HASHERS(INIT_) #undef INIT_ default: break; } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_HASH_H_ */ dvisvgm-2.8.1/libs/brotli/enc/block_splitter.c0000664000175000017500000001401213510660062016276 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Block split point selection utilities. */ #include "./block_splitter.h" #include /* memcpy, memset */ #include "../common/platform.h" #include "./bit_cost.h" #include "./cluster.h" #include "./command.h" #include "./fast_log.h" #include "./histogram.h" #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static const size_t kMaxLiteralHistograms = 100; static const size_t kMaxCommandHistograms = 50; static const double kLiteralBlockSwitchCost = 28.1; static const double kCommandBlockSwitchCost = 13.5; static const double kDistanceBlockSwitchCost = 14.6; static const size_t kLiteralStrideLength = 70; static const size_t kCommandStrideLength = 40; static const size_t kSymbolsPerLiteralHistogram = 544; static const size_t kSymbolsPerCommandHistogram = 530; static const size_t kSymbolsPerDistanceHistogram = 544; static const size_t kMinLengthForBlockSplitting = 128; static const size_t kIterMulForRefining = 2; static const size_t kMinItersForRefining = 100; static size_t CountLiterals(const Command* cmds, const size_t num_commands) { /* Count how many we have. */ size_t total_length = 0; size_t i; for (i = 0; i < num_commands; ++i) { total_length += cmds[i].insert_len_; } return total_length; } static void CopyLiteralsToByteArray(const Command* cmds, const size_t num_commands, const uint8_t* data, const size_t offset, const size_t mask, uint8_t* literals) { size_t pos = 0; size_t from_pos = offset & mask; size_t i; for (i = 0; i < num_commands; ++i) { size_t insert_len = cmds[i].insert_len_; if (from_pos + insert_len > mask) { size_t head_size = mask + 1 - from_pos; memcpy(literals + pos, data + from_pos, head_size); from_pos = 0; pos += head_size; insert_len -= head_size; } if (insert_len > 0) { memcpy(literals + pos, data + from_pos, insert_len); pos += insert_len; } from_pos = (from_pos + insert_len + CommandCopyLen(&cmds[i])) & mask; } } static BROTLI_INLINE uint32_t MyRand(uint32_t* seed) { /* Initial seed should be 7. In this case, loop length is (1 << 29). */ *seed *= 16807U; return *seed; } static BROTLI_INLINE double BitCost(size_t count) { return count == 0 ? -2.0 : FastLog2(count); } #define HISTOGRAMS_PER_BATCH 64 #define CLUSTERS_PER_BATCH 16 #define FN(X) X ## Literal #define DataType uint8_t /* NOLINTNEXTLINE(build/include) */ #include "./block_splitter_inc.h" #undef DataType #undef FN #define FN(X) X ## Command #define DataType uint16_t /* NOLINTNEXTLINE(build/include) */ #include "./block_splitter_inc.h" #undef FN #define FN(X) X ## Distance /* NOLINTNEXTLINE(build/include) */ #include "./block_splitter_inc.h" #undef DataType #undef FN void BrotliInitBlockSplit(BlockSplit* self) { self->num_types = 0; self->num_blocks = 0; self->types = 0; self->lengths = 0; self->types_alloc_size = 0; self->lengths_alloc_size = 0; } void BrotliDestroyBlockSplit(MemoryManager* m, BlockSplit* self) { BROTLI_FREE(m, self->types); BROTLI_FREE(m, self->lengths); } void BrotliSplitBlock(MemoryManager* m, const Command* cmds, const size_t num_commands, const uint8_t* data, const size_t pos, const size_t mask, const BrotliEncoderParams* params, BlockSplit* literal_split, BlockSplit* insert_and_copy_split, BlockSplit* dist_split) { { size_t literals_count = CountLiterals(cmds, num_commands); uint8_t* literals = BROTLI_ALLOC(m, uint8_t, literals_count); if (BROTLI_IS_OOM(m)) return; /* Create a continuous array of literals. */ CopyLiteralsToByteArray(cmds, num_commands, data, pos, mask, literals); /* Create the block split on the array of literals. Literal histograms have alphabet size 256. */ SplitByteVectorLiteral( m, literals, literals_count, kSymbolsPerLiteralHistogram, kMaxLiteralHistograms, kLiteralStrideLength, kLiteralBlockSwitchCost, params, literal_split); if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, literals); } { /* Compute prefix codes for commands. */ uint16_t* insert_and_copy_codes = BROTLI_ALLOC(m, uint16_t, num_commands); size_t i; if (BROTLI_IS_OOM(m)) return; for (i = 0; i < num_commands; ++i) { insert_and_copy_codes[i] = cmds[i].cmd_prefix_; } /* Create the block split on the array of command prefixes. */ SplitByteVectorCommand( m, insert_and_copy_codes, num_commands, kSymbolsPerCommandHistogram, kMaxCommandHistograms, kCommandStrideLength, kCommandBlockSwitchCost, params, insert_and_copy_split); if (BROTLI_IS_OOM(m)) return; /* TODO: reuse for distances? */ BROTLI_FREE(m, insert_and_copy_codes); } { /* Create a continuous array of distance prefixes. */ uint16_t* distance_prefixes = BROTLI_ALLOC(m, uint16_t, num_commands); size_t j = 0; size_t i; if (BROTLI_IS_OOM(m)) return; for (i = 0; i < num_commands; ++i) { const Command* cmd = &cmds[i]; if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) { distance_prefixes[j++] = cmd->dist_prefix_ & 0x3FF; } } /* Create the block split on the array of distance prefixes. */ SplitByteVectorDistance( m, distance_prefixes, j, kSymbolsPerDistanceHistogram, kMaxCommandHistograms, kCommandStrideLength, kDistanceBlockSwitchCost, params, dist_split); if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, distance_prefixes); } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/backward_references_inc.h0000664000175000017500000001445113510660062020102 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: EXPORT_FN, FN */ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)( size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals) { /* Set maximum distance, see section 9.1. of the spec. */ const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin); const Command* const orig_commands = commands; size_t insert_length = *last_insert_len; const size_t pos_end = position + num_bytes; const size_t store_end = num_bytes >= FN(StoreLookahead)() ? position + num_bytes - FN(StoreLookahead)() + 1 : position; /* For speed up heuristics for random data. */ const size_t random_heuristics_window_size = LiteralSpreeLengthForSparseSearch(params); size_t apply_random_heuristics = position + random_heuristics_window_size; const size_t gap = 0; /* Minimum score to accept a backward reference. */ const score_t kMinScore = BROTLI_SCORE_BASE + 100; FN(PrepareDistanceCache)(hasher, dist_cache); while (position + FN(HashTypeLength)() < pos_end) { size_t max_length = pos_end - position; size_t max_distance = BROTLI_MIN(size_t, position, max_backward_limit); HasherSearchResult sr; sr.len = 0; sr.len_code_delta = 0; sr.distance = 0; sr.score = kMinScore; FN(FindLongestMatch)(hasher, ¶ms->dictionary, ringbuffer, ringbuffer_mask, dist_cache, position, max_length, max_distance, gap, params->dist.max_distance, &sr); if (sr.score > kMinScore) { /* Found a match. Let's look for something even better ahead. */ int delayed_backward_references_in_row = 0; --max_length; for (;; --max_length) { const score_t cost_diff_lazy = 175; HasherSearchResult sr2; sr2.len = params->quality < MIN_QUALITY_FOR_EXTENSIVE_REFERENCE_SEARCH ? BROTLI_MIN(size_t, sr.len - 1, max_length) : 0; sr2.len_code_delta = 0; sr2.distance = 0; sr2.score = kMinScore; max_distance = BROTLI_MIN(size_t, position + 1, max_backward_limit); FN(FindLongestMatch)(hasher, ¶ms->dictionary, ringbuffer, ringbuffer_mask, dist_cache, position + 1, max_length, max_distance, gap, params->dist.max_distance, &sr2); if (sr2.score >= sr.score + cost_diff_lazy) { /* Ok, let's just write one byte for now and start a match from the next byte. */ ++position; ++insert_length; sr = sr2; if (++delayed_backward_references_in_row < 4 && position + FN(HashTypeLength)() < pos_end) { continue; } } break; } apply_random_heuristics = position + 2 * sr.len + random_heuristics_window_size; max_distance = BROTLI_MIN(size_t, position, max_backward_limit); { /* The first 16 codes are special short-codes, and the minimum offset is 1. */ size_t distance_code = ComputeDistanceCode( sr.distance, max_distance + gap, dist_cache); if ((sr.distance <= (max_distance + gap)) && distance_code > 0) { dist_cache[3] = dist_cache[2]; dist_cache[2] = dist_cache[1]; dist_cache[1] = dist_cache[0]; dist_cache[0] = (int)sr.distance; FN(PrepareDistanceCache)(hasher, dist_cache); } InitCommand(commands++, ¶ms->dist, insert_length, sr.len, sr.len_code_delta, distance_code); } *num_literals += insert_length; insert_length = 0; /* Put the hash keys into the table, if there are enough bytes left. Depending on the hasher implementation, it can push all positions in the given range or only a subset of them. Avoid hash poisoning with RLE data. */ { size_t range_start = position + 2; size_t range_end = BROTLI_MIN(size_t, position + sr.len, store_end); if (sr.distance < (sr.len >> 2)) { range_start = BROTLI_MIN(size_t, range_end, BROTLI_MAX(size_t, range_start, position + sr.len - (sr.distance << 2))); } FN(StoreRange)(hasher, ringbuffer, ringbuffer_mask, range_start, range_end); } position += sr.len; } else { ++insert_length; ++position; /* If we have not seen matches for a long time, we can skip some match lookups. Unsuccessful match lookups are very very expensive and this kind of a heuristic speeds up compression quite a lot. */ if (position > apply_random_heuristics) { /* Going through uncompressible data, jump. */ if (position > apply_random_heuristics + 4 * random_heuristics_window_size) { /* It is quite a long time since we saw a copy, so we assume that this data is not compressible, and store hashes less often. Hashes of non compressible data are less likely to turn out to be useful in the future, too, so we store less of them to not to flood out the hash table of good compressible data. */ const size_t kMargin = BROTLI_MAX(size_t, FN(StoreLookahead)() - 1, 4); size_t pos_jump = BROTLI_MIN(size_t, position + 16, pos_end - kMargin); for (; position < pos_jump; position += 4) { FN(Store)(hasher, ringbuffer, ringbuffer_mask, position); insert_length += 4; } } else { const size_t kMargin = BROTLI_MAX(size_t, FN(StoreLookahead)() - 1, 2); size_t pos_jump = BROTLI_MIN(size_t, position + 8, pos_end - kMargin); for (; position < pos_jump; position += 2) { FN(Store)(hasher, ringbuffer, ringbuffer_mask, position); insert_length += 2; } } } } } insert_length += pos_end - position; *last_insert_len = insert_length; *num_commands += (size_t)(commands - orig_commands); } dvisvgm-2.8.1/libs/brotli/enc/cluster_inc.h0000664000175000017500000002621713510660062015607 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, CODE */ #define HistogramType FN(Histogram) /* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */ BROTLI_INTERNAL void FN(BrotliCompareAndPushToQueue)( const HistogramType* out, const uint32_t* cluster_size, uint32_t idx1, uint32_t idx2, size_t max_num_pairs, HistogramPair* pairs, size_t* num_pairs) CODE({ BROTLI_BOOL is_good_pair = BROTLI_FALSE; HistogramPair p; p.idx1 = p.idx2 = 0; p.cost_diff = p.cost_combo = 0; if (idx1 == idx2) { return; } if (idx2 < idx1) { uint32_t t = idx2; idx2 = idx1; idx1 = t; } p.idx1 = idx1; p.idx2 = idx2; p.cost_diff = 0.5 * ClusterCostDiff(cluster_size[idx1], cluster_size[idx2]); p.cost_diff -= out[idx1].bit_cost_; p.cost_diff -= out[idx2].bit_cost_; if (out[idx1].total_count_ == 0) { p.cost_combo = out[idx2].bit_cost_; is_good_pair = BROTLI_TRUE; } else if (out[idx2].total_count_ == 0) { p.cost_combo = out[idx1].bit_cost_; is_good_pair = BROTLI_TRUE; } else { double threshold = *num_pairs == 0 ? 1e99 : BROTLI_MAX(double, 0.0, pairs[0].cost_diff); HistogramType combo = out[idx1]; double cost_combo; FN(HistogramAddHistogram)(&combo, &out[idx2]); cost_combo = FN(BrotliPopulationCost)(&combo); if (cost_combo < threshold - p.cost_diff) { p.cost_combo = cost_combo; is_good_pair = BROTLI_TRUE; } } if (is_good_pair) { p.cost_diff += p.cost_combo; if (*num_pairs > 0 && HistogramPairIsLess(&pairs[0], &p)) { /* Replace the top of the queue if needed. */ if (*num_pairs < max_num_pairs) { pairs[*num_pairs] = pairs[0]; ++(*num_pairs); } pairs[0] = p; } else if (*num_pairs < max_num_pairs) { pairs[*num_pairs] = p; ++(*num_pairs); } } }) BROTLI_INTERNAL size_t FN(BrotliHistogramCombine)(HistogramType* out, uint32_t* cluster_size, uint32_t* symbols, uint32_t* clusters, HistogramPair* pairs, size_t num_clusters, size_t symbols_size, size_t max_clusters, size_t max_num_pairs) CODE({ double cost_diff_threshold = 0.0; size_t min_cluster_size = 1; size_t num_pairs = 0; { /* We maintain a vector of histogram pairs, with the property that the pair with the maximum bit cost reduction is the first. */ size_t idx1; for (idx1 = 0; idx1 < num_clusters; ++idx1) { size_t idx2; for (idx2 = idx1 + 1; idx2 < num_clusters; ++idx2) { FN(BrotliCompareAndPushToQueue)(out, cluster_size, clusters[idx1], clusters[idx2], max_num_pairs, &pairs[0], &num_pairs); } } } while (num_clusters > min_cluster_size) { uint32_t best_idx1; uint32_t best_idx2; size_t i; if (pairs[0].cost_diff >= cost_diff_threshold) { cost_diff_threshold = 1e99; min_cluster_size = max_clusters; continue; } /* Take the best pair from the top of heap. */ best_idx1 = pairs[0].idx1; best_idx2 = pairs[0].idx2; FN(HistogramAddHistogram)(&out[best_idx1], &out[best_idx2]); out[best_idx1].bit_cost_ = pairs[0].cost_combo; cluster_size[best_idx1] += cluster_size[best_idx2]; for (i = 0; i < symbols_size; ++i) { if (symbols[i] == best_idx2) { symbols[i] = best_idx1; } } for (i = 0; i < num_clusters; ++i) { if (clusters[i] == best_idx2) { memmove(&clusters[i], &clusters[i + 1], (num_clusters - i - 1) * sizeof(clusters[0])); break; } } --num_clusters; { /* Remove pairs intersecting the just combined best pair. */ size_t copy_to_idx = 0; for (i = 0; i < num_pairs; ++i) { HistogramPair* p = &pairs[i]; if (p->idx1 == best_idx1 || p->idx2 == best_idx1 || p->idx1 == best_idx2 || p->idx2 == best_idx2) { /* Remove invalid pair from the queue. */ continue; } if (HistogramPairIsLess(&pairs[0], p)) { /* Replace the top of the queue if needed. */ HistogramPair front = pairs[0]; pairs[0] = *p; pairs[copy_to_idx] = front; } else { pairs[copy_to_idx] = *p; } ++copy_to_idx; } num_pairs = copy_to_idx; } /* Push new pairs formed with the combined histogram to the heap. */ for (i = 0; i < num_clusters; ++i) { FN(BrotliCompareAndPushToQueue)(out, cluster_size, best_idx1, clusters[i], max_num_pairs, &pairs[0], &num_pairs); } } return num_clusters; }) /* What is the bit cost of moving histogram from cur_symbol to candidate. */ BROTLI_INTERNAL double FN(BrotliHistogramBitCostDistance)( const HistogramType* histogram, const HistogramType* candidate) CODE({ if (histogram->total_count_ == 0) { return 0.0; } else { HistogramType tmp = *histogram; FN(HistogramAddHistogram)(&tmp, candidate); return FN(BrotliPopulationCost)(&tmp) - candidate->bit_cost_; } }) /* Find the best 'out' histogram for each of the 'in' histograms. When called, clusters[0..num_clusters) contains the unique values from symbols[0..in_size), but this property is not preserved in this function. Note: we assume that out[]->bit_cost_ is already up-to-date. */ BROTLI_INTERNAL void FN(BrotliHistogramRemap)(const HistogramType* in, size_t in_size, const uint32_t* clusters, size_t num_clusters, HistogramType* out, uint32_t* symbols) CODE({ size_t i; for (i = 0; i < in_size; ++i) { uint32_t best_out = i == 0 ? symbols[0] : symbols[i - 1]; double best_bits = FN(BrotliHistogramBitCostDistance)(&in[i], &out[best_out]); size_t j; for (j = 0; j < num_clusters; ++j) { const double cur_bits = FN(BrotliHistogramBitCostDistance)(&in[i], &out[clusters[j]]); if (cur_bits < best_bits) { best_bits = cur_bits; best_out = clusters[j]; } } symbols[i] = best_out; } /* Recompute each out based on raw and symbols. */ for (i = 0; i < num_clusters; ++i) { FN(HistogramClear)(&out[clusters[i]]); } for (i = 0; i < in_size; ++i) { FN(HistogramAddHistogram)(&out[symbols[i]], &in[i]); } }) /* Reorders elements of the out[0..length) array and changes values in symbols[0..length) array in the following way: * when called, symbols[] contains indexes into out[], and has N unique values (possibly N < length) * on return, symbols'[i] = f(symbols[i]) and out'[symbols'[i]] = out[symbols[i]], for each 0 <= i < length, where f is a bijection between the range of symbols[] and [0..N), and the first occurrences of values in symbols'[i] come in consecutive increasing order. Returns N, the number of unique values in symbols[]. */ BROTLI_INTERNAL size_t FN(BrotliHistogramReindex)(MemoryManager* m, HistogramType* out, uint32_t* symbols, size_t length) CODE({ static const uint32_t kInvalidIndex = BROTLI_UINT32_MAX; uint32_t* new_index = BROTLI_ALLOC(m, uint32_t, length); uint32_t next_index; HistogramType* tmp; size_t i; if (BROTLI_IS_OOM(m)) return 0; for (i = 0; i < length; ++i) { new_index[i] = kInvalidIndex; } next_index = 0; for (i = 0; i < length; ++i) { if (new_index[symbols[i]] == kInvalidIndex) { new_index[symbols[i]] = next_index; ++next_index; } } /* TODO: by using idea of "cycle-sort" we can avoid allocation of tmp and reduce the number of copying by the factor of 2. */ tmp = BROTLI_ALLOC(m, HistogramType, next_index); if (BROTLI_IS_OOM(m)) return 0; next_index = 0; for (i = 0; i < length; ++i) { if (new_index[symbols[i]] == next_index) { tmp[next_index] = out[symbols[i]]; ++next_index; } symbols[i] = new_index[symbols[i]]; } BROTLI_FREE(m, new_index); for (i = 0; i < next_index; ++i) { out[i] = tmp[i]; } BROTLI_FREE(m, tmp); return next_index; }) BROTLI_INTERNAL void FN(BrotliClusterHistograms)( MemoryManager* m, const HistogramType* in, const size_t in_size, size_t max_histograms, HistogramType* out, size_t* out_size, uint32_t* histogram_symbols) CODE({ uint32_t* cluster_size = BROTLI_ALLOC(m, uint32_t, in_size); uint32_t* clusters = BROTLI_ALLOC(m, uint32_t, in_size); size_t num_clusters = 0; const size_t max_input_histograms = 64; size_t pairs_capacity = max_input_histograms * max_input_histograms / 2; /* For the first pass of clustering, we allow all pairs. */ HistogramPair* pairs = BROTLI_ALLOC(m, HistogramPair, pairs_capacity + 1); size_t i; if (BROTLI_IS_OOM(m)) return; for (i = 0; i < in_size; ++i) { cluster_size[i] = 1; } for (i = 0; i < in_size; ++i) { out[i] = in[i]; out[i].bit_cost_ = FN(BrotliPopulationCost)(&in[i]); histogram_symbols[i] = (uint32_t)i; } for (i = 0; i < in_size; i += max_input_histograms) { size_t num_to_combine = BROTLI_MIN(size_t, in_size - i, max_input_histograms); size_t num_new_clusters; size_t j; for (j = 0; j < num_to_combine; ++j) { clusters[num_clusters + j] = (uint32_t)(i + j); } num_new_clusters = FN(BrotliHistogramCombine)(out, cluster_size, &histogram_symbols[i], &clusters[num_clusters], pairs, num_to_combine, num_to_combine, max_histograms, pairs_capacity); num_clusters += num_new_clusters; } { /* For the second pass, we limit the total number of histogram pairs. After this limit is reached, we only keep searching for the best pair. */ size_t max_num_pairs = BROTLI_MIN(size_t, 64 * num_clusters, (num_clusters / 2) * num_clusters); BROTLI_ENSURE_CAPACITY( m, HistogramPair, pairs, pairs_capacity, max_num_pairs + 1); if (BROTLI_IS_OOM(m)) return; /* Collapse similar histograms. */ num_clusters = FN(BrotliHistogramCombine)(out, cluster_size, histogram_symbols, clusters, pairs, num_clusters, in_size, max_histograms, max_num_pairs); } BROTLI_FREE(m, pairs); BROTLI_FREE(m, cluster_size); /* Find the optimal map from original histograms to the final ones. */ FN(BrotliHistogramRemap)(in, in_size, clusters, num_clusters, out, histogram_symbols); BROTLI_FREE(m, clusters); /* Convert the context map to a canonical form. */ *out_size = FN(BrotliHistogramReindex)(m, out, histogram_symbols, in_size); if (BROTLI_IS_OOM(m)) return; }) #undef HistogramType dvisvgm-2.8.1/libs/brotli/enc/encoder_dict.c0000664000175000017500000000144613510660062015707 00000000000000/* Copyright 2017 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ #include "./encoder_dict.h" #include "../common/dictionary.h" #include "../common/transform.h" #include "./dictionary_hash.h" #include "./hash.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict) { dict->words = BrotliGetDictionary(); dict->hash_table = kStaticDictionaryHash; dict->buckets = kStaticDictionaryBuckets; dict->dict_words = kStaticDictionaryWords; dict->cutoffTransformsCount = kCutoffTransformsCount; dict->cutoffTransforms = kCutoffTransforms; } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/hash_longest_match_quickly_inc.h0000664000175000017500000002100013510660062021502 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, BUCKET_BITS, BUCKET_SWEEP, HASH_LEN, USE_DICTIONARY */ #define HashLongestMatchQuickly HASHER() #define BUCKET_SIZE (1 << BUCKET_BITS) #define HASH_MAP_SIZE (4 << BUCKET_BITS) static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 8; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 8; } /* HashBytes is the function that chooses the bucket to place the address in. The HashLongestMatch and HashLongestMatchQuickly classes have separate, different implementations of hashing. */ static uint32_t FN(HashBytes)(const uint8_t* data) { const uint64_t h = ((BROTLI_UNALIGNED_LOAD64LE(data) << (64 - 8 * HASH_LEN)) * kHashMul64); /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return (uint32_t)(h >> (64 - BUCKET_BITS)); } /* A (forgetful) hash table to the data seen by the compressor, to help create backward references to previous data. This is a hash map of fixed size (BUCKET_SIZE). Starting from the given index, BUCKET_SWEEP buckets are used to store values of a key. */ typedef struct HashLongestMatchQuickly { uint32_t buckets_[BUCKET_SIZE + BUCKET_SWEEP]; } HashLongestMatchQuickly; static BROTLI_INLINE HashLongestMatchQuickly* FN(Self)(HasherHandle handle) { return (HashLongestMatchQuickly*)&(GetHasherCommon(handle)[1]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { BROTLI_UNUSED(handle); BROTLI_UNUSED(params); } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashLongestMatchQuickly* self = FN(Self)(handle); /* Partial preparation is 100 times slower (per socket). */ size_t partial_prepare_threshold = HASH_MAP_SIZE >> 7; if (one_shot && input_size <= partial_prepare_threshold) { size_t i; for (i = 0; i < input_size; ++i) { const uint32_t key = FN(HashBytes)(&data[i]); memset(&self->buckets_[key], 0, BUCKET_SWEEP * sizeof(self->buckets_[0])); } } else { /* It is not strictly necessary to fill this buffer here, but not filling will make the results of the compression stochastic (but correct). This is because random data would cause the system to find accidentally good backward references here and there. */ memset(&self->buckets_[0], 0, sizeof(self->buckets_)); } } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { BROTLI_UNUSED(params); BROTLI_UNUSED(one_shot); BROTLI_UNUSED(input_size); return sizeof(HashLongestMatchQuickly); } /* Look at 5 bytes at &data[ix & mask]. Compute a hash from these, and store the value somewhere within [ix .. ix+3]. */ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix) { const uint32_t key = FN(HashBytes)(&data[ix & mask]); /* Wiggle the value with the bucket sweep range. */ const uint32_t off = (ix >> 3) % BUCKET_SWEEP; FN(Self)(handle)->buckets_[key + off] = (uint32_t)ix; } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { size_t i; for (i = ix_start; i < ix_end; ++i) { FN(Store)(handle, data, mask, i); } } static BROTLI_INLINE void FN(StitchToPreviousBlock)( HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask) { if (num_bytes >= FN(HashTypeLength)() - 1 && position >= 3) { /* Prepare the hashes for three last bytes of the last write. These could not be calculated before, since they require knowledge of both the previous and the current block. */ FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 3); FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 2); FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 1); } } static BROTLI_INLINE void FN(PrepareDistanceCache)( HasherHandle handle, int* BROTLI_RESTRICT distance_cache) { BROTLI_UNUSED(handle); BROTLI_UNUSED(distance_cache); } /* Find a longest backward match of &data[cur_ix & ring_buffer_mask] up to the length of max_length and stores the position cur_ix in the hash table. Does not look for matches longer than max_length. Does not look for matches further away than max_backward. Writes the best match into |out|. |out|->score is updated only if a better match is found. */ static BROTLI_INLINE void FN(FindLongestMatch)( HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) { HashLongestMatchQuickly* self = FN(Self)(handle); const size_t best_len_in = out->len; const size_t cur_ix_masked = cur_ix & ring_buffer_mask; const uint32_t key = FN(HashBytes)(&data[cur_ix_masked]); int compare_char = data[cur_ix_masked + best_len_in]; score_t min_score = out->score; score_t best_score = out->score; size_t best_len = best_len_in; size_t cached_backward = (size_t)distance_cache[0]; size_t prev_ix = cur_ix - cached_backward; out->len_code_delta = 0; if (prev_ix < cur_ix) { prev_ix &= (uint32_t)ring_buffer_mask; if (compare_char == data[prev_ix + best_len]) { size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 4) { const score_t score = BackwardReferenceScoreUsingLastDistance(len); if (best_score < score) { best_score = score; best_len = len; out->len = len; out->distance = cached_backward; out->score = best_score; compare_char = data[cur_ix_masked + best_len]; if (BUCKET_SWEEP == 1) { self->buckets_[key] = (uint32_t)cur_ix; return; } } } } } if (BUCKET_SWEEP == 1) { size_t backward; size_t len; /* Only one to look for, don't bother to prepare for a loop. */ prev_ix = self->buckets_[key]; self->buckets_[key] = (uint32_t)cur_ix; backward = cur_ix - prev_ix; prev_ix &= (uint32_t)ring_buffer_mask; if (compare_char != data[prev_ix + best_len_in]) { return; } if (BROTLI_PREDICT_FALSE(backward == 0 || backward > max_backward)) { return; } len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 4) { const score_t score = BackwardReferenceScore(len, backward); if (best_score < score) { out->len = len; out->distance = backward; out->score = score; return; } } } else { uint32_t* bucket = self->buckets_ + key; int i; prev_ix = *bucket++; for (i = 0; i < BUCKET_SWEEP; ++i, prev_ix = *bucket++) { const size_t backward = cur_ix - prev_ix; size_t len; prev_ix &= (uint32_t)ring_buffer_mask; if (compare_char != data[prev_ix + best_len]) { continue; } if (BROTLI_PREDICT_FALSE(backward == 0 || backward > max_backward)) { continue; } len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 4) { const score_t score = BackwardReferenceScore(len, backward); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = score; compare_char = data[cur_ix_masked + best_len]; } } } } if (USE_DICTIONARY && min_score == out->score) { SearchInStaticDictionary(dictionary, handle, &data[cur_ix_masked], max_length, max_backward + gap, max_distance, out, BROTLI_TRUE); } self->buckets_[key + ((cur_ix >> 3) % BUCKET_SWEEP)] = (uint32_t)cur_ix; } #undef HASH_MAP_SIZE #undef BUCKET_SIZE #undef HashLongestMatchQuickly dvisvgm-2.8.1/libs/brotli/enc/hash_longest_match64_inc.h0000664000175000017500000002430013510660062020121 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN */ /* A (forgetful) hash table to the data seen by the compressor, to help create backward references to previous data. This is a hash map of fixed size (bucket_size_) to a ring buffer of fixed size (block_size_). The ring buffer contains the last block_size_ index positions of the given hash key in the compressed data. */ #define HashLongestMatch HASHER() static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 8; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 8; } /* HashBytes is the function that chooses the bucket to place the address in. */ static BROTLI_INLINE uint32_t FN(HashBytes)(const uint8_t* data, const uint64_t mask, const int shift) { const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(data) & mask) * kHashMul64Long; /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return (uint32_t)(h >> shift); } typedef struct HashLongestMatch { /* Number of hash buckets. */ size_t bucket_size_; /* Only block_size_ newest backward references are kept, and the older are forgotten. */ size_t block_size_; /* Left-shift for computing hash bucket index from hash value. */ int hash_shift_; /* Mask for selecting the next 4-8 bytes of input */ uint64_t hash_mask_; /* Mask for accessing entries in a block (in a ring-buffer manner). */ uint32_t block_mask_; /* --- Dynamic size members --- */ /* Number of entries in a particular bucket. */ /* uint16_t num[bucket_size]; */ /* Buckets containing block_size_ of backward references. */ /* uint32_t* buckets[bucket_size * block_size]; */ } HashLongestMatch; static BROTLI_INLINE HashLongestMatch* FN(Self)(HasherHandle handle) { return (HashLongestMatch*)&(GetHasherCommon(handle)[1]); } static BROTLI_INLINE uint16_t* FN(Num)(HashLongestMatch* self) { return (uint16_t*)(&self[1]); } static BROTLI_INLINE uint32_t* FN(Buckets)(HashLongestMatch* self) { return (uint32_t*)(&FN(Num)(self)[self->bucket_size_]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { HasherCommon* common = GetHasherCommon(handle); HashLongestMatch* self = FN(Self)(handle); BROTLI_UNUSED(params); self->hash_shift_ = 64 - common->params.bucket_bits; self->hash_mask_ = (~((uint64_t)0U)) >> (64 - 8 * common->params.hash_len); self->bucket_size_ = (size_t)1 << common->params.bucket_bits; self->block_size_ = (size_t)1 << common->params.block_bits; self->block_mask_ = (uint32_t)(self->block_size_ - 1); } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashLongestMatch* self = FN(Self)(handle); uint16_t* num = FN(Num)(self); /* Partial preparation is 100 times slower (per socket). */ size_t partial_prepare_threshold = self->bucket_size_ >> 6; if (one_shot && input_size <= partial_prepare_threshold) { size_t i; for (i = 0; i < input_size; ++i) { const uint32_t key = FN(HashBytes)(&data[i], self->hash_mask_, self->hash_shift_); num[key] = 0; } } else { memset(num, 0, self->bucket_size_ * sizeof(num[0])); } } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { size_t bucket_size = (size_t)1 << params->hasher.bucket_bits; size_t block_size = (size_t)1 << params->hasher.block_bits; BROTLI_UNUSED(one_shot); BROTLI_UNUSED(input_size); return sizeof(HashLongestMatch) + bucket_size * (2 + 4 * block_size); } /* Look at 4 bytes at &data[ix & mask]. Compute a hash from these, and store the value of ix at that position. */ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix) { HashLongestMatch* self = FN(Self)(handle); uint16_t* num = FN(Num)(self); const uint32_t key = FN(HashBytes)(&data[ix & mask], self->hash_mask_, self->hash_shift_); const size_t minor_ix = num[key] & self->block_mask_; const size_t offset = minor_ix + (key << GetHasherCommon(handle)->params.block_bits); FN(Buckets)(self)[offset] = (uint32_t)ix; ++num[key]; } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { size_t i; for (i = ix_start; i < ix_end; ++i) { FN(Store)(handle, data, mask, i); } } static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask) { if (num_bytes >= FN(HashTypeLength)() - 1 && position >= 3) { /* Prepare the hashes for three last bytes of the last write. These could not be calculated before, since they require knowledge of both the previous and the current block. */ FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 3); FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 2); FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 1); } } static BROTLI_INLINE void FN(PrepareDistanceCache)( HasherHandle handle, int* BROTLI_RESTRICT distance_cache) { PrepareDistanceCache(distance_cache, GetHasherCommon(handle)->params.num_last_distances_to_check); } /* Find a longest backward match of &data[cur_ix] up to the length of max_length and stores the position cur_ix in the hash table. REQUIRES: FN(PrepareDistanceCache) must be invoked for current distance cache values; if this method is invoked repeatedly with the same distance cache values, it is enough to invoke FN(PrepareDistanceCache) once. Does not look for matches longer than max_length. Does not look for matches further away than max_backward. Writes the best match into |out|. |out|->score is updated only if a better match is found. */ static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) { HasherCommon* common = GetHasherCommon(handle); HashLongestMatch* self = FN(Self)(handle); uint16_t* num = FN(Num)(self); uint32_t* buckets = FN(Buckets)(self); const size_t cur_ix_masked = cur_ix & ring_buffer_mask; /* Don't accept a short copy from far away. */ score_t min_score = out->score; score_t best_score = out->score; size_t best_len = out->len; size_t i; out->len = 0; out->len_code_delta = 0; /* Try last distance first. */ for (i = 0; i < (size_t)common->params.num_last_distances_to_check; ++i) { const size_t backward = (size_t)distance_cache[i]; size_t prev_ix = (size_t)(cur_ix - backward); if (prev_ix >= cur_ix) { continue; } if (BROTLI_PREDICT_FALSE(backward > max_backward)) { continue; } prev_ix &= ring_buffer_mask; if (cur_ix_masked + best_len > ring_buffer_mask || prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 3 || (len == 2 && i < 2)) { /* Comparing for >= 2 does not change the semantics, but just saves for a few unnecessary binary logarithms in backward reference score, since we are not interested in such short matches. */ score_t score = BackwardReferenceScoreUsingLastDistance(len); if (best_score < score) { if (i != 0) score -= BackwardReferencePenaltyUsingLastDistance(i); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = best_score; } } } } } { const uint32_t key = FN(HashBytes)( &data[cur_ix_masked], self->hash_mask_, self->hash_shift_); uint32_t* BROTLI_RESTRICT bucket = &buckets[key << common->params.block_bits]; const size_t down = (num[key] > self->block_size_) ? (num[key] - self->block_size_) : 0u; for (i = num[key]; i > down;) { size_t prev_ix = bucket[--i & self->block_mask_]; const size_t backward = cur_ix - prev_ix; if (BROTLI_PREDICT_FALSE(backward > max_backward)) { break; } prev_ix &= ring_buffer_mask; if (cur_ix_masked + best_len > ring_buffer_mask || prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 4) { /* Comparing for >= 3 does not change the semantics, but just saves for a few unnecessary binary logarithms in backward reference score, since we are not interested in such short matches. */ score_t score = BackwardReferenceScore(len, backward); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = best_score; } } } } bucket[num[key] & self->block_mask_] = (uint32_t)cur_ix; ++num[key]; } if (min_score == out->score) { SearchInStaticDictionary(dictionary, handle, &data[cur_ix_masked], max_length, max_backward + gap, max_distance, out, BROTLI_FALSE); } } #undef HashLongestMatch dvisvgm-2.8.1/libs/brotli/enc/histogram.h0000664000175000017500000000353413510660062015267 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Models the histograms of literals, commands and distance codes. */ #ifndef BROTLI_ENC_HISTOGRAM_H_ #define BROTLI_ENC_HISTOGRAM_H_ #include /* memset */ #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" #include #include "./block_splitter.h" #include "./command.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* The distance symbols effectively used by "Large Window Brotli" (32-bit). */ #define BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS 544 #define FN(X) X ## Literal #define DATA_SIZE BROTLI_NUM_LITERAL_SYMBOLS #define DataType uint8_t #include "./histogram_inc.h" /* NOLINT(build/include) */ #undef DataType #undef DATA_SIZE #undef FN #define FN(X) X ## Command #define DataType uint16_t #define DATA_SIZE BROTLI_NUM_COMMAND_SYMBOLS #include "./histogram_inc.h" /* NOLINT(build/include) */ #undef DATA_SIZE #undef FN #define FN(X) X ## Distance #define DATA_SIZE BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS #include "./histogram_inc.h" /* NOLINT(build/include) */ #undef DataType #undef DATA_SIZE #undef FN BROTLI_INTERNAL void BrotliBuildHistogramsWithContext( const Command* cmds, const size_t num_commands, const BlockSplit* literal_split, const BlockSplit* insert_and_copy_split, const BlockSplit* dist_split, const uint8_t* ringbuffer, size_t pos, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, const ContextType* context_modes, HistogramLiteral* literal_histograms, HistogramCommand* insert_and_copy_histograms, HistogramDistance* copy_dist_histograms); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_HISTOGRAM_H_ */ dvisvgm-2.8.1/libs/brotli/enc/backward_references.c0000664000175000017500000000755013510660062017246 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function to find backward reference copies. */ #include "./backward_references.h" #include "../common/constants.h" #include "../common/dictionary.h" #include "../common/platform.h" #include #include "./command.h" #include "./dictionary_hash.h" #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance, size_t max_distance, const int* dist_cache) { if (distance <= max_distance) { size_t distance_plus_3 = distance + 3; size_t offset0 = distance_plus_3 - (size_t)dist_cache[0]; size_t offset1 = distance_plus_3 - (size_t)dist_cache[1]; if (distance == (size_t)dist_cache[0]) { return 0; } else if (distance == (size_t)dist_cache[1]) { return 1; } else if (offset0 < 7) { return (0x9750468 >> (4 * offset0)) & 0xF; } else if (offset1 < 7) { return (0xFDB1ACE >> (4 * offset1)) & 0xF; } else if (distance == (size_t)dist_cache[2]) { return 2; } else if (distance == (size_t)dist_cache[3]) { return 3; } } return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1; } #define EXPAND_CAT(a, b) CAT(a, b) #define CAT(a, b) a ## b #define FN(X) EXPAND_CAT(X, HASHER()) #define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER())) #define PREFIX() N #define HASHER() H2 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H3 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H4 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H5 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H6 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H40 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H41 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H42 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H54 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H35 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H55 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #define HASHER() H65 /* NOLINTNEXTLINE(build/include) */ #include "./backward_references_inc.h" #undef HASHER #undef PREFIX #undef EXPORT_FN #undef FN #undef CAT #undef EXPAND_CAT void BrotliCreateBackwardReferences( size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals) { switch (params->hasher.type) { #define CASE_(N) \ case N: \ CreateBackwardReferencesNH ## N( \ num_bytes, position, ringbuffer, \ ringbuffer_mask, params, hasher, dist_cache, \ last_insert_len, commands, num_commands, num_literals); \ return; FOR_GENERIC_HASHERS(CASE_) #undef CASE_ default: break; } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/prefix.h0000664000175000017500000000366213510660062014571 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions for encoding of integers into prefix codes the amount of extra bits, and the actual values of the extra bits. */ #ifndef BROTLI_ENC_PREFIX_H_ #define BROTLI_ENC_PREFIX_H_ #include "../common/constants.h" #include "../common/platform.h" #include #include "./fast_log.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Here distance_code is an intermediate code, i.e. one of the special codes or the actual distance increased by BROTLI_NUM_DISTANCE_SHORT_CODES - 1. */ static BROTLI_INLINE void PrefixEncodeCopyDistance(size_t distance_code, size_t num_direct_codes, size_t postfix_bits, uint16_t* code, uint32_t* extra_bits) { if (distance_code < BROTLI_NUM_DISTANCE_SHORT_CODES + num_direct_codes) { *code = (uint16_t)distance_code; *extra_bits = 0; return; } else { size_t dist = ((size_t)1 << (postfix_bits + 2u)) + (distance_code - BROTLI_NUM_DISTANCE_SHORT_CODES - num_direct_codes); size_t bucket = Log2FloorNonZero(dist) - 1; size_t postfix_mask = (1u << postfix_bits) - 1; size_t postfix = dist & postfix_mask; size_t prefix = (dist >> bucket) & 1; size_t offset = (2 + prefix) << bucket; size_t nbits = bucket - postfix_bits; *code = (uint16_t)((nbits << 10) | (BROTLI_NUM_DISTANCE_SHORT_CODES + num_direct_codes + ((2 * (nbits - 1) + prefix) << postfix_bits) + postfix)); *extra_bits = (uint32_t)((dist - offset) >> postfix_bits); } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_PREFIX_H_ */ dvisvgm-2.8.1/libs/brotli/enc/block_splitter.h0000664000175000017500000000321713510660062016310 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Block split point selection utilities. */ #ifndef BROTLI_ENC_BLOCK_SPLITTER_H_ #define BROTLI_ENC_BLOCK_SPLITTER_H_ #include "../common/platform.h" #include #include "./command.h" #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct BlockSplit { size_t num_types; /* Amount of distinct types */ size_t num_blocks; /* Amount of values in types and length */ uint8_t* types; uint32_t* lengths; size_t types_alloc_size; size_t lengths_alloc_size; } BlockSplit; BROTLI_INTERNAL void BrotliInitBlockSplit(BlockSplit* self); BROTLI_INTERNAL void BrotliDestroyBlockSplit(MemoryManager* m, BlockSplit* self); BROTLI_INTERNAL void BrotliSplitBlock(MemoryManager* m, const Command* cmds, const size_t num_commands, const uint8_t* data, const size_t offset, const size_t mask, const BrotliEncoderParams* params, BlockSplit* literal_split, BlockSplit* insert_and_copy_split, BlockSplit* dist_split); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_BLOCK_SPLITTER_H_ */ dvisvgm-2.8.1/libs/brotli/enc/memory.h0000664000175000017500000000553013510660062014600 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Macros for memory management. */ #ifndef BROTLI_ENC_MEMORY_H_ #define BROTLI_ENC_MEMORY_H_ #include /* memcpy */ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #if !defined(BROTLI_ENCODER_CLEANUP_ON_OOM) && \ !defined(BROTLI_ENCODER_EXIT_ON_OOM) #define BROTLI_ENCODER_EXIT_ON_OOM #endif typedef struct MemoryManager { brotli_alloc_func alloc_func; brotli_free_func free_func; void* opaque; #if !defined(BROTLI_ENCODER_EXIT_ON_OOM) BROTLI_BOOL is_oom; size_t perm_allocated; size_t new_allocated; size_t new_freed; void* pointers[256]; #endif /* BROTLI_ENCODER_EXIT_ON_OOM */ } MemoryManager; BROTLI_INTERNAL void BrotliInitMemoryManager( MemoryManager* m, brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque); BROTLI_INTERNAL void* BrotliAllocate(MemoryManager* m, size_t n); #define BROTLI_ALLOC(M, T, N) \ ((N) > 0 ? ((T*)BrotliAllocate((M), (N) * sizeof(T))) : NULL) BROTLI_INTERNAL void BrotliFree(MemoryManager* m, void* p); #define BROTLI_FREE(M, P) { \ BrotliFree((M), (P)); \ P = NULL; \ } #if defined(BROTLI_ENCODER_EXIT_ON_OOM) #define BROTLI_IS_OOM(M) (!!0) #else /* BROTLI_ENCODER_EXIT_ON_OOM */ #define BROTLI_IS_OOM(M) (!!(M)->is_oom) #endif /* BROTLI_ENCODER_EXIT_ON_OOM */ BROTLI_INTERNAL void BrotliWipeOutMemoryManager(MemoryManager* m); /* Dynamically grows array capacity to at least the requested size M: MemoryManager T: data type A: array C: capacity R: requested size */ #define BROTLI_ENSURE_CAPACITY(M, T, A, C, R) { \ if (C < (R)) { \ size_t _new_size = (C == 0) ? (R) : C; \ T* new_array; \ while (_new_size < (R)) _new_size *= 2; \ new_array = BROTLI_ALLOC((M), T, _new_size); \ if (!BROTLI_IS_OOM(M) && C != 0) \ memcpy(new_array, A, C * sizeof(T)); \ BROTLI_FREE((M), A); \ A = new_array; \ C = _new_size; \ } \ } /* Appends value and dynamically grows array capacity when needed M: MemoryManager T: data type A: array C: array capacity S: array size V: value to append */ #define BROTLI_ENSURE_CAPACITY_APPEND(M, T, A, C, S, V) { \ (S)++; \ BROTLI_ENSURE_CAPACITY(M, T, A, C, S); \ A[(S) - 1] = (V); \ } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_MEMORY_H_ */ dvisvgm-2.8.1/libs/brotli/enc/backward_references_hq.h0000664000175000017500000000725313510660062017743 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function to find backward reference copies. */ #ifndef BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_ #define BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_ #include "../common/constants.h" #include "../common/dictionary.h" #include "../common/platform.h" #include #include "./command.h" #include "./hash.h" #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif BROTLI_INTERNAL void BrotliCreateZopfliBackwardReferences(MemoryManager* m, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals); BROTLI_INTERNAL void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals); typedef struct ZopfliNode { /* Best length to get up to this byte (not including this byte itself) highest 7 bit is used to reconstruct the length code. */ uint32_t length; /* Distance associated with the length. */ uint32_t distance; /* Number of literal inserts before this copy; highest 5 bits contain distance short code + 1 (or zero if no short code). */ uint32_t dcode_insert_length; /* This union holds information used by dynamic-programming. During forward pass |cost| it used to store the goal function. When node is processed its |cost| is invalidated in favor of |shortcut|. On path back-tracing pass |next| is assigned the offset to next node on the path. */ union { /* Smallest cost to get to this byte from the beginning, as found so far. */ float cost; /* Offset to the next node on the path. Equals to command_length() of the next node on the path. For last node equals to BROTLI_UINT32_MAX */ uint32_t next; /* Node position that provides next distance for distance cache. */ uint32_t shortcut; } u; } ZopfliNode; BROTLI_INTERNAL void BrotliInitZopfliNodes(ZopfliNode* array, size_t length); /* Computes the shortest path of commands from position to at most position + num_bytes. On return, path->size() is the number of commands found and path[i] is the length of the i-th command (copy length plus insert length). Note that the sum of the lengths of all commands can be less than num_bytes. On return, the nodes[0..num_bytes] array will have the following "ZopfliNode array invariant": For each i in [1..num_bytes], if nodes[i].cost < kInfinity, then (1) nodes[i].copy_length() >= 2 (2) nodes[i].command_length() <= i and (3) nodes[i - nodes[i].command_length()].cost < kInfinity */ BROTLI_INTERNAL size_t BrotliZopfliComputeShortestPath( MemoryManager* m, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, const int* dist_cache, HasherHandle hasher, ZopfliNode* nodes); BROTLI_INTERNAL void BrotliZopfliCreateCommands( const size_t num_bytes, const size_t block_start, const ZopfliNode* nodes, int* dist_cache, size_t* last_insert_len, const BrotliEncoderParams* params, Command* commands, size_t* num_literals); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_ */ dvisvgm-2.8.1/libs/brotli/enc/command.h0000664000175000017500000001566113510660062014714 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* This class models a sequence of literals and a backward reference copy. */ #ifndef BROTLI_ENC_COMMAND_H_ #define BROTLI_ENC_COMMAND_H_ #include "../common/constants.h" #include "../common/platform.h" #include #include "./fast_log.h" #include "./params.h" #include "./prefix.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static uint32_t kInsBase[] = { 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594 }; static uint32_t kInsExtra[] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24 }; static uint32_t kCopyBase[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 18, 22, 30, 38, 54, 70, 102, 134, 198, 326, 582, 1094, 2118 }; static uint32_t kCopyExtra[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24 }; static BROTLI_INLINE uint16_t GetInsertLengthCode(size_t insertlen) { if (insertlen < 6) { return (uint16_t)insertlen; } else if (insertlen < 130) { uint32_t nbits = Log2FloorNonZero(insertlen - 2) - 1u; return (uint16_t)((nbits << 1) + ((insertlen - 2) >> nbits) + 2); } else if (insertlen < 2114) { return (uint16_t)(Log2FloorNonZero(insertlen - 66) + 10); } else if (insertlen < 6210) { return 21u; } else if (insertlen < 22594) { return 22u; } else { return 23u; } } static BROTLI_INLINE uint16_t GetCopyLengthCode(size_t copylen) { if (copylen < 10) { return (uint16_t)(copylen - 2); } else if (copylen < 134) { uint32_t nbits = Log2FloorNonZero(copylen - 6) - 1u; return (uint16_t)((nbits << 1) + ((copylen - 6) >> nbits) + 4); } else if (copylen < 2118) { return (uint16_t)(Log2FloorNonZero(copylen - 70) + 12); } else { return 23u; } } static BROTLI_INLINE uint16_t CombineLengthCodes( uint16_t inscode, uint16_t copycode, BROTLI_BOOL use_last_distance) { uint16_t bits64 = (uint16_t)((copycode & 0x7u) | ((inscode & 0x7u) << 3u)); if (use_last_distance && inscode < 8u && copycode < 16u) { return (copycode < 8u) ? bits64 : (bits64 | 64u); } else { /* Specification: 5 Encoding of ... (last table) */ /* offset = 2 * index, where index is in range [0..8] */ uint32_t offset = 2u * ((copycode >> 3u) + 3u * (inscode >> 3u)); /* All values in specification are K * 64, where K = [2, 3, 6, 4, 5, 8, 7, 9, 10], i + 1 = [1, 2, 3, 4, 5, 6, 7, 8, 9], K - i - 1 = [1, 1, 3, 0, 0, 2, 0, 1, 2] = D. All values in D require only 2 bits to encode. Magic constant is shifted 6 bits left, to avoid final multiplication. */ offset = (offset << 5u) + 0x40u + ((0x520D40u >> offset) & 0xC0u); return (uint16_t)(offset | bits64); } } static BROTLI_INLINE void GetLengthCode(size_t insertlen, size_t copylen, BROTLI_BOOL use_last_distance, uint16_t* code) { uint16_t inscode = GetInsertLengthCode(insertlen); uint16_t copycode = GetCopyLengthCode(copylen); *code = CombineLengthCodes(inscode, copycode, use_last_distance); } static BROTLI_INLINE uint32_t GetInsertBase(uint16_t inscode) { return kInsBase[inscode]; } static BROTLI_INLINE uint32_t GetInsertExtra(uint16_t inscode) { return kInsExtra[inscode]; } static BROTLI_INLINE uint32_t GetCopyBase(uint16_t copycode) { return kCopyBase[copycode]; } static BROTLI_INLINE uint32_t GetCopyExtra(uint16_t copycode) { return kCopyExtra[copycode]; } typedef struct Command { uint32_t insert_len_; /* Stores copy_len in low 25 bits and copy_code - copy_len in high 7 bit. */ uint32_t copy_len_; /* Stores distance extra bits. */ uint32_t dist_extra_; uint16_t cmd_prefix_; /* Stores distance code in low 10 bits and number of extra bits in high 6 bits. */ uint16_t dist_prefix_; } Command; /* distance_code is e.g. 0 for same-as-last short code, or 16 for offset 1. */ static BROTLI_INLINE void InitCommand(Command* self, const BrotliDistanceParams* dist, size_t insertlen, size_t copylen, int copylen_code_delta, size_t distance_code) { /* Don't rely on signed int representation, use honest casts. */ uint32_t delta = (uint8_t)((int8_t)copylen_code_delta); self->insert_len_ = (uint32_t)insertlen; self->copy_len_ = (uint32_t)(copylen | (delta << 25)); /* The distance prefix and extra bits are stored in this Command as if npostfix and ndirect were 0, they are only recomputed later after the clustering if needed. */ PrefixEncodeCopyDistance( distance_code, dist->num_direct_distance_codes, dist->distance_postfix_bits, &self->dist_prefix_, &self->dist_extra_); GetLengthCode( insertlen, (size_t)((int)copylen + copylen_code_delta), TO_BROTLI_BOOL((self->dist_prefix_ & 0x3FF) == 0), &self->cmd_prefix_); } static BROTLI_INLINE void InitInsertCommand(Command* self, size_t insertlen) { self->insert_len_ = (uint32_t)insertlen; self->copy_len_ = 4 << 25; self->dist_extra_ = 0; self->dist_prefix_ = BROTLI_NUM_DISTANCE_SHORT_CODES; GetLengthCode(insertlen, 4, BROTLI_FALSE, &self->cmd_prefix_); } static BROTLI_INLINE uint32_t CommandRestoreDistanceCode( const Command* self, const BrotliDistanceParams* dist) { if ((self->dist_prefix_ & 0x3FFu) < BROTLI_NUM_DISTANCE_SHORT_CODES + dist->num_direct_distance_codes) { return self->dist_prefix_ & 0x3FFu; } else { uint32_t dcode = self->dist_prefix_ & 0x3FFu; uint32_t nbits = self->dist_prefix_ >> 10; uint32_t extra = self->dist_extra_; uint32_t postfix_mask = (1U << dist->distance_postfix_bits) - 1U; uint32_t hcode = (dcode - dist->num_direct_distance_codes - BROTLI_NUM_DISTANCE_SHORT_CODES) >> dist->distance_postfix_bits; uint32_t lcode = (dcode - dist->num_direct_distance_codes - BROTLI_NUM_DISTANCE_SHORT_CODES) & postfix_mask; uint32_t offset = ((2U + (hcode & 1U)) << nbits) - 4U; return ((offset + extra) << dist->distance_postfix_bits) + lcode + dist->num_direct_distance_codes + BROTLI_NUM_DISTANCE_SHORT_CODES; } } static BROTLI_INLINE uint32_t CommandDistanceContext(const Command* self) { uint32_t r = self->cmd_prefix_ >> 6; uint32_t c = self->cmd_prefix_ & 7; if ((r == 0 || r == 2 || r == 4 || r == 7) && (c <= 2)) { return c; } return 3; } static BROTLI_INLINE uint32_t CommandCopyLen(const Command* self) { return self->copy_len_ & 0x1FFFFFF; } static BROTLI_INLINE uint32_t CommandCopyLenCode(const Command* self) { uint32_t modifier = self->copy_len_ >> 25; int32_t delta = (int8_t)((uint8_t)(modifier | ((modifier & 0x40) << 1))); return (uint32_t)((int32_t)(self->copy_len_ & 0x1FFFFFF) + delta); } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_COMMAND_H_ */ dvisvgm-2.8.1/libs/brotli/enc/backward_references.h0000664000175000017500000000234113510660062017244 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function to find backward reference copies. */ #ifndef BROTLI_ENC_BACKWARD_REFERENCES_H_ #define BROTLI_ENC_BACKWARD_REFERENCES_H_ #include "../common/constants.h" #include "../common/dictionary.h" #include "../common/platform.h" #include #include "./command.h" #include "./hash.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* "commands" points to the next output command to write to, "*num_commands" is initially the total amount of commands output by previous CreateBackwardReferences calls, and must be incremented by the amount written by this call. */ BROTLI_INTERNAL void BrotliCreateBackwardReferences( size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_BACKWARD_REFERENCES_H_ */ dvisvgm-2.8.1/libs/brotli/enc/encoder_dict.h0000664000175000017500000000207513510660062015713 00000000000000/* Copyright 2017 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ #ifndef BROTLI_ENC_ENCODER_DICT_H_ #define BROTLI_ENC_ENCODER_DICT_H_ #include "../common/dictionary.h" #include "../common/platform.h" #include #include "./static_dict_lut.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Dictionary data (words and transforms) for 1 possible context */ typedef struct BrotliEncoderDictionary { const BrotliDictionary* words; /* cut off for fast encoder */ uint32_t cutoffTransformsCount; uint64_t cutoffTransforms; /* from dictionary_hash.h, for fast encoder */ const uint16_t* hash_table; /* from static_dict_lut.h, for slow encoder */ const uint16_t* buckets; const DictWord* dict_words; } BrotliEncoderDictionary; BROTLI_INTERNAL void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_ENCODER_DICT_H_ */ dvisvgm-2.8.1/libs/brotli/enc/find_match_length.h0000664000175000017500000000475213510660062016732 00000000000000/* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function to find maximal matching prefixes of strings. */ #ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_ #define BROTLI_ENC_FIND_MATCH_LENGTH_H_ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* Separate implementation for little-endian 64-bit targets, for speed. */ #if defined(__GNUC__) && defined(_LP64) && defined(BROTLI_LITTLE_ENDIAN) static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1, const uint8_t* s2, size_t limit) { size_t matched = 0; size_t limit2 = (limit >> 3) + 1; /* + 1 is for pre-decrement in while */ while (BROTLI_PREDICT_TRUE(--limit2)) { if (BROTLI_PREDICT_FALSE(BROTLI_UNALIGNED_LOAD64LE(s2) == BROTLI_UNALIGNED_LOAD64LE(s1 + matched))) { s2 += 8; matched += 8; } else { uint64_t x = BROTLI_UNALIGNED_LOAD64LE(s2) ^ BROTLI_UNALIGNED_LOAD64LE(s1 + matched); size_t matching_bits = (size_t)__builtin_ctzll(x); matched += matching_bits >> 3; return matched; } } limit = (limit & 7) + 1; /* + 1 is for pre-decrement in while */ while (--limit) { if (BROTLI_PREDICT_TRUE(s1[matched] == *s2)) { ++s2; ++matched; } else { return matched; } } return matched; } #else static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1, const uint8_t* s2, size_t limit) { size_t matched = 0; const uint8_t* s2_limit = s2 + limit; const uint8_t* s2_ptr = s2; /* Find out how long the match is. We loop over the data 32 bits at a time until we find a 32-bit block that doesn't match; then we find the first non-matching bit and use that to calculate the total length of the match. */ while (s2_ptr <= s2_limit - 4 && BrotliUnalignedRead32(s2_ptr) == BrotliUnalignedRead32(s1 + matched)) { s2_ptr += 4; matched += 4; } while ((s2_ptr < s2_limit) && (s1[matched] == *s2_ptr)) { ++s2_ptr; ++matched; } return matched; } #endif #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_FIND_MATCH_LENGTH_H_ */ dvisvgm-2.8.1/libs/brotli/enc/hash_to_binary_tree_inc.h0000664000175000017500000003117413510660062020134 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, BUCKET_BITS, MAX_TREE_COMP_LENGTH, MAX_TREE_SEARCH_DEPTH */ /* A (forgetful) hash table where each hash bucket contains a binary tree of sequences whose first 4 bytes share the same hash code. Each sequence is MAX_TREE_COMP_LENGTH long and is identified by its starting position in the input data. The binary tree is sorted by the lexicographic order of the sequences, and it is also a max-heap with respect to the starting positions. */ #define HashToBinaryTree HASHER() #define BUCKET_SIZE (1 << BUCKET_BITS) static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return MAX_TREE_COMP_LENGTH; } static uint32_t FN(HashBytes)(const uint8_t* data) { uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return h >> (32 - BUCKET_BITS); } typedef struct HashToBinaryTree { /* The window size minus 1 */ size_t window_mask_; /* Hash table that maps the 4-byte hashes of the sequence to the last position where this hash was found, which is the root of the binary tree of sequences that share this hash bucket. */ uint32_t buckets_[BUCKET_SIZE]; /* A position used to mark a non-existent sequence, i.e. a tree is empty if its root is at invalid_pos_ and a node is a leaf if both its children are at invalid_pos_. */ uint32_t invalid_pos_; /* --- Dynamic size members --- */ /* The union of the binary trees of each hash bucket. The root of the tree corresponding to a hash is a sequence starting at buckets_[hash] and the left and right children of a sequence starting at pos are forest_[2 * pos] and forest_[2 * pos + 1]. */ /* uint32_t forest[2 * num_nodes] */ } HashToBinaryTree; static BROTLI_INLINE HashToBinaryTree* FN(Self)(HasherHandle handle) { return (HashToBinaryTree*)&(GetHasherCommon(handle)[1]); } static BROTLI_INLINE uint32_t* FN(Forest)(HashToBinaryTree* self) { return (uint32_t*)(&self[1]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { HashToBinaryTree* self = FN(Self)(handle); self->window_mask_ = (1u << params->lgwin) - 1u; self->invalid_pos_ = (uint32_t)(0 - self->window_mask_); } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashToBinaryTree* self = FN(Self)(handle); uint32_t invalid_pos = self->invalid_pos_; uint32_t i; BROTLI_UNUSED(data); BROTLI_UNUSED(one_shot); BROTLI_UNUSED(input_size); for (i = 0; i < BUCKET_SIZE; i++) { self->buckets_[i] = invalid_pos; } } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { size_t num_nodes = (size_t)1 << params->lgwin; if (one_shot && input_size < num_nodes) { num_nodes = input_size; } return sizeof(HashToBinaryTree) + 2 * sizeof(uint32_t) * num_nodes; } static BROTLI_INLINE size_t FN(LeftChildIndex)(HashToBinaryTree* self, const size_t pos) { return 2 * (pos & self->window_mask_); } static BROTLI_INLINE size_t FN(RightChildIndex)(HashToBinaryTree* self, const size_t pos) { return 2 * (pos & self->window_mask_) + 1; } /* Stores the hash of the next 4 bytes and in a single tree-traversal, the hash bucket's binary tree is searched for matches and is re-rooted at the current position. If less than MAX_TREE_COMP_LENGTH data is available, the hash bucket of the current position is searched for matches, but the state of the hash table is not changed, since we can not know the final sorting order of the current (incomplete) sequence. This function must be called with increasing cur_ix positions. */ static BROTLI_INLINE BackwardMatch* FN(StoreAndFindMatches)( HashToBinaryTree* self, const uint8_t* const BROTLI_RESTRICT data, const size_t cur_ix, const size_t ring_buffer_mask, const size_t max_length, const size_t max_backward, size_t* const BROTLI_RESTRICT best_len, BackwardMatch* BROTLI_RESTRICT matches) { const size_t cur_ix_masked = cur_ix & ring_buffer_mask; const size_t max_comp_len = BROTLI_MIN(size_t, max_length, MAX_TREE_COMP_LENGTH); const BROTLI_BOOL should_reroot_tree = TO_BROTLI_BOOL(max_length >= MAX_TREE_COMP_LENGTH); const uint32_t key = FN(HashBytes)(&data[cur_ix_masked]); uint32_t* forest = FN(Forest)(self); size_t prev_ix = self->buckets_[key]; /* The forest index of the rightmost node of the left subtree of the new root, updated as we traverse and re-root the tree of the hash bucket. */ size_t node_left = FN(LeftChildIndex)(self, cur_ix); /* The forest index of the leftmost node of the right subtree of the new root, updated as we traverse and re-root the tree of the hash bucket. */ size_t node_right = FN(RightChildIndex)(self, cur_ix); /* The match length of the rightmost node of the left subtree of the new root, updated as we traverse and re-root the tree of the hash bucket. */ size_t best_len_left = 0; /* The match length of the leftmost node of the right subtree of the new root, updated as we traverse and re-root the tree of the hash bucket. */ size_t best_len_right = 0; size_t depth_remaining; if (should_reroot_tree) { self->buckets_[key] = (uint32_t)cur_ix; } for (depth_remaining = MAX_TREE_SEARCH_DEPTH; ; --depth_remaining) { const size_t backward = cur_ix - prev_ix; const size_t prev_ix_masked = prev_ix & ring_buffer_mask; if (backward == 0 || backward > max_backward || depth_remaining == 0) { if (should_reroot_tree) { forest[node_left] = self->invalid_pos_; forest[node_right] = self->invalid_pos_; } break; } { const size_t cur_len = BROTLI_MIN(size_t, best_len_left, best_len_right); size_t len; BROTLI_DCHECK(cur_len <= MAX_TREE_COMP_LENGTH); len = cur_len + FindMatchLengthWithLimit(&data[cur_ix_masked + cur_len], &data[prev_ix_masked + cur_len], max_length - cur_len); BROTLI_DCHECK( 0 == memcmp(&data[cur_ix_masked], &data[prev_ix_masked], len)); if (matches && len > *best_len) { *best_len = len; InitBackwardMatch(matches++, backward, len); } if (len >= max_comp_len) { if (should_reroot_tree) { forest[node_left] = forest[FN(LeftChildIndex)(self, prev_ix)]; forest[node_right] = forest[FN(RightChildIndex)(self, prev_ix)]; } break; } if (data[cur_ix_masked + len] > data[prev_ix_masked + len]) { best_len_left = len; if (should_reroot_tree) { forest[node_left] = (uint32_t)prev_ix; } node_left = FN(RightChildIndex)(self, prev_ix); prev_ix = forest[node_left]; } else { best_len_right = len; if (should_reroot_tree) { forest[node_right] = (uint32_t)prev_ix; } node_right = FN(LeftChildIndex)(self, prev_ix); prev_ix = forest[node_right]; } } } return matches; } /* Finds all backward matches of &data[cur_ix & ring_buffer_mask] up to the length of max_length and stores the position cur_ix in the hash table. Sets *num_matches to the number of matches found, and stores the found matches in matches[0] to matches[*num_matches - 1]. The matches will be sorted by strictly increasing length and (non-strictly) increasing distance. */ static BROTLI_INLINE size_t FN(FindAllMatches)(HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* data, const size_t ring_buffer_mask, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const BrotliEncoderParams* params, BackwardMatch* matches) { BackwardMatch* const orig_matches = matches; const size_t cur_ix_masked = cur_ix & ring_buffer_mask; size_t best_len = 1; const size_t short_match_max_backward = params->quality != HQ_ZOPFLIFICATION_QUALITY ? 16 : 64; size_t stop = cur_ix - short_match_max_backward; uint32_t dict_matches[BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1]; size_t i; if (cur_ix < short_match_max_backward) { stop = 0; } for (i = cur_ix - 1; i > stop && best_len <= 2; --i) { size_t prev_ix = i; const size_t backward = cur_ix - prev_ix; if (BROTLI_PREDICT_FALSE(backward > max_backward)) { break; } prev_ix &= ring_buffer_mask; if (data[cur_ix_masked] != data[prev_ix] || data[cur_ix_masked + 1] != data[prev_ix + 1]) { continue; } { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len > best_len) { best_len = len; InitBackwardMatch(matches++, backward, len); } } } if (best_len < max_length) { matches = FN(StoreAndFindMatches)(FN(Self)(handle), data, cur_ix, ring_buffer_mask, max_length, max_backward, &best_len, matches); } for (i = 0; i <= BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN; ++i) { dict_matches[i] = kInvalidMatch; } { size_t minlen = BROTLI_MAX(size_t, 4, best_len + 1); if (BrotliFindAllStaticDictionaryMatches(dictionary, &data[cur_ix_masked], minlen, max_length, &dict_matches[0])) { size_t maxlen = BROTLI_MIN( size_t, BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN, max_length); size_t l; for (l = minlen; l <= maxlen; ++l) { uint32_t dict_id = dict_matches[l]; if (dict_id < kInvalidMatch) { size_t distance = max_backward + gap + (dict_id >> 5) + 1; if (distance <= params->dist.max_distance) { InitDictionaryBackwardMatch(matches++, distance, l, dict_id & 31); } } } } } return (size_t)(matches - orig_matches); } /* Stores the hash of the next 4 bytes and re-roots the binary tree at the current sequence, without returning any matches. REQUIRES: ix + MAX_TREE_COMP_LENGTH <= end-of-current-block */ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix) { HashToBinaryTree* self = FN(Self)(handle); /* Maximum distance is window size - 16, see section 9.1. of the spec. */ const size_t max_backward = self->window_mask_ - BROTLI_WINDOW_GAP + 1; FN(StoreAndFindMatches)(self, data, ix, mask, MAX_TREE_COMP_LENGTH, max_backward, NULL, NULL); } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { size_t i = ix_start; size_t j = ix_start; if (ix_start + 63 <= ix_end) { i = ix_end - 63; } if (ix_start + 512 <= i) { for (; j < i; j += 8) { FN(Store)(handle, data, mask, j); } } for (; i < ix_end; ++i) { FN(Store)(handle, data, mask, i); } } static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask) { HashToBinaryTree* self = FN(Self)(handle); if (num_bytes >= FN(HashTypeLength)() - 1 && position >= MAX_TREE_COMP_LENGTH) { /* Store the last `MAX_TREE_COMP_LENGTH - 1` positions in the hasher. These could not be calculated before, since they require knowledge of both the previous and the current block. */ const size_t i_start = position - MAX_TREE_COMP_LENGTH + 1; const size_t i_end = BROTLI_MIN(size_t, position, i_start + num_bytes); size_t i; for (i = i_start; i < i_end; ++i) { /* Maximum distance is window size - 16, see section 9.1. of the spec. Furthermore, we have to make sure that we don't look further back from the start of the next block than the window size, otherwise we could access already overwritten areas of the ring-buffer. */ const size_t max_backward = self->window_mask_ - BROTLI_MAX(size_t, BROTLI_WINDOW_GAP - 1, position - i); /* We know that i + MAX_TREE_COMP_LENGTH <= position + num_bytes, i.e. the end of the current block and that we have at least MAX_TREE_COMP_LENGTH tail in the ring-buffer. */ FN(StoreAndFindMatches)(self, ringbuffer, i, ringbuffer_mask, MAX_TREE_COMP_LENGTH, max_backward, NULL, NULL); } } } #undef BUCKET_SIZE #undef HashToBinaryTree dvisvgm-2.8.1/libs/brotli/enc/entropy_encode.c0000664000175000017500000003427513510660062016310 00000000000000/* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Entropy encoding (Huffman) utilities. */ #include "./entropy_encode.h" #include /* memset */ #include "../common/constants.h" #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif BROTLI_BOOL BrotliSetDepth( int p0, HuffmanTree* pool, uint8_t* depth, int max_depth) { int stack[16]; int level = 0; int p = p0; BROTLI_DCHECK(max_depth <= 15); stack[0] = -1; while (BROTLI_TRUE) { if (pool[p].index_left_ >= 0) { level++; if (level > max_depth) return BROTLI_FALSE; stack[level] = pool[p].index_right_or_value_; p = pool[p].index_left_; continue; } else { depth[pool[p].index_right_or_value_] = (uint8_t)level; } while (level >= 0 && stack[level] == -1) level--; if (level < 0) return BROTLI_TRUE; p = stack[level]; stack[level] = -1; } } /* Sort the root nodes, least popular first. */ static BROTLI_INLINE BROTLI_BOOL SortHuffmanTree( const HuffmanTree* v0, const HuffmanTree* v1) { if (v0->total_count_ != v1->total_count_) { return TO_BROTLI_BOOL(v0->total_count_ < v1->total_count_); } return TO_BROTLI_BOOL(v0->index_right_or_value_ > v1->index_right_or_value_); } /* This function will create a Huffman tree. The catch here is that the tree cannot be arbitrarily deep. Brotli specifies a maximum depth of 15 bits for "code trees" and 7 bits for "code length code trees." count_limit is the value that is to be faked as the minimum value and this minimum value is raised until the tree matches the maximum length requirement. This algorithm is not of excellent performance for very long data blocks, especially when population counts are longer than 2**tree_limit, but we are not planning to use this with extremely long blocks. See http://en.wikipedia.org/wiki/Huffman_coding */ void BrotliCreateHuffmanTree(const uint32_t* data, const size_t length, const int tree_limit, HuffmanTree* tree, uint8_t* depth) { uint32_t count_limit; HuffmanTree sentinel; InitHuffmanTree(&sentinel, BROTLI_UINT32_MAX, -1, -1); /* For block sizes below 64 kB, we never need to do a second iteration of this loop. Probably all of our block sizes will be smaller than that, so this loop is mostly of academic interest. If we actually would need this, we would be better off with the Katajainen algorithm. */ for (count_limit = 1; ; count_limit *= 2) { size_t n = 0; size_t i; size_t j; size_t k; for (i = length; i != 0;) { --i; if (data[i]) { const uint32_t count = BROTLI_MAX(uint32_t, data[i], count_limit); InitHuffmanTree(&tree[n++], count, -1, (int16_t)i); } } if (n == 1) { depth[tree[0].index_right_or_value_] = 1; /* Only one element. */ break; } SortHuffmanTreeItems(tree, n, SortHuffmanTree); /* The nodes are: [0, n): the sorted leaf nodes that we start with. [n]: we add a sentinel here. [n + 1, 2n): new parent nodes are added here, starting from (n+1). These are naturally in ascending order. [2n]: we add a sentinel at the end as well. There will be (2n+1) elements at the end. */ tree[n] = sentinel; tree[n + 1] = sentinel; i = 0; /* Points to the next leaf node. */ j = n + 1; /* Points to the next non-leaf node. */ for (k = n - 1; k != 0; --k) { size_t left, right; if (tree[i].total_count_ <= tree[j].total_count_) { left = i; ++i; } else { left = j; ++j; } if (tree[i].total_count_ <= tree[j].total_count_) { right = i; ++i; } else { right = j; ++j; } { /* The sentinel node becomes the parent node. */ size_t j_end = 2 * n - k; tree[j_end].total_count_ = tree[left].total_count_ + tree[right].total_count_; tree[j_end].index_left_ = (int16_t)left; tree[j_end].index_right_or_value_ = (int16_t)right; /* Add back the last sentinel node. */ tree[j_end + 1] = sentinel; } } if (BrotliSetDepth((int)(2 * n - 1), &tree[0], depth, tree_limit)) { /* We need to pack the Huffman tree in tree_limit bits. If this was not successful, add fake entities to the lowest values and retry. */ break; } } } static void Reverse(uint8_t* v, size_t start, size_t end) { --end; while (start < end) { uint8_t tmp = v[start]; v[start] = v[end]; v[end] = tmp; ++start; --end; } } static void BrotliWriteHuffmanTreeRepetitions( const uint8_t previous_value, const uint8_t value, size_t repetitions, size_t* tree_size, uint8_t* tree, uint8_t* extra_bits_data) { BROTLI_DCHECK(repetitions > 0); if (previous_value != value) { tree[*tree_size] = value; extra_bits_data[*tree_size] = 0; ++(*tree_size); --repetitions; } if (repetitions == 7) { tree[*tree_size] = value; extra_bits_data[*tree_size] = 0; ++(*tree_size); --repetitions; } if (repetitions < 3) { size_t i; for (i = 0; i < repetitions; ++i) { tree[*tree_size] = value; extra_bits_data[*tree_size] = 0; ++(*tree_size); } } else { size_t start = *tree_size; repetitions -= 3; while (BROTLI_TRUE) { tree[*tree_size] = BROTLI_REPEAT_PREVIOUS_CODE_LENGTH; extra_bits_data[*tree_size] = repetitions & 0x3; ++(*tree_size); repetitions >>= 2; if (repetitions == 0) { break; } --repetitions; } Reverse(tree, start, *tree_size); Reverse(extra_bits_data, start, *tree_size); } } static void BrotliWriteHuffmanTreeRepetitionsZeros( size_t repetitions, size_t* tree_size, uint8_t* tree, uint8_t* extra_bits_data) { if (repetitions == 11) { tree[*tree_size] = 0; extra_bits_data[*tree_size] = 0; ++(*tree_size); --repetitions; } if (repetitions < 3) { size_t i; for (i = 0; i < repetitions; ++i) { tree[*tree_size] = 0; extra_bits_data[*tree_size] = 0; ++(*tree_size); } } else { size_t start = *tree_size; repetitions -= 3; while (BROTLI_TRUE) { tree[*tree_size] = BROTLI_REPEAT_ZERO_CODE_LENGTH; extra_bits_data[*tree_size] = repetitions & 0x7; ++(*tree_size); repetitions >>= 3; if (repetitions == 0) { break; } --repetitions; } Reverse(tree, start, *tree_size); Reverse(extra_bits_data, start, *tree_size); } } void BrotliOptimizeHuffmanCountsForRle(size_t length, uint32_t* counts, uint8_t* good_for_rle) { size_t nonzero_count = 0; size_t stride; size_t limit; size_t sum; const size_t streak_limit = 1240; /* Let's make the Huffman code more compatible with RLE encoding. */ size_t i; for (i = 0; i < length; i++) { if (counts[i]) { ++nonzero_count; } } if (nonzero_count < 16) { return; } while (length != 0 && counts[length - 1] == 0) { --length; } if (length == 0) { return; /* All zeros. */ } /* Now counts[0..length - 1] does not have trailing zeros. */ { size_t nonzeros = 0; uint32_t smallest_nonzero = 1 << 30; for (i = 0; i < length; ++i) { if (counts[i] != 0) { ++nonzeros; if (smallest_nonzero > counts[i]) { smallest_nonzero = counts[i]; } } } if (nonzeros < 5) { /* Small histogram will model it well. */ return; } if (smallest_nonzero < 4) { size_t zeros = length - nonzeros; if (zeros < 6) { for (i = 1; i < length - 1; ++i) { if (counts[i - 1] != 0 && counts[i] == 0 && counts[i + 1] != 0) { counts[i] = 1; } } } } if (nonzeros < 28) { return; } } /* 2) Let's mark all population counts that already can be encoded with an RLE code. */ memset(good_for_rle, 0, length); { /* Let's not spoil any of the existing good RLE codes. Mark any seq of 0's that is longer as 5 as a good_for_rle. Mark any seq of non-0's that is longer as 7 as a good_for_rle. */ uint32_t symbol = counts[0]; size_t step = 0; for (i = 0; i <= length; ++i) { if (i == length || counts[i] != symbol) { if ((symbol == 0 && step >= 5) || (symbol != 0 && step >= 7)) { size_t k; for (k = 0; k < step; ++k) { good_for_rle[i - k - 1] = 1; } } step = 1; if (i != length) { symbol = counts[i]; } } else { ++step; } } } /* 3) Let's replace those population counts that lead to more RLE codes. Math here is in 24.8 fixed point representation. */ stride = 0; limit = 256 * (counts[0] + counts[1] + counts[2]) / 3 + 420; sum = 0; for (i = 0; i <= length; ++i) { if (i == length || good_for_rle[i] || (i != 0 && good_for_rle[i - 1]) || (256 * counts[i] - limit + streak_limit) >= 2 * streak_limit) { if (stride >= 4 || (stride >= 3 && sum == 0)) { size_t k; /* The stride must end, collapse what we have, if we have enough (4). */ size_t count = (sum + stride / 2) / stride; if (count == 0) { count = 1; } if (sum == 0) { /* Don't make an all zeros stride to be upgraded to ones. */ count = 0; } for (k = 0; k < stride; ++k) { /* We don't want to change value at counts[i], that is already belonging to the next stride. Thus - 1. */ counts[i - k - 1] = (uint32_t)count; } } stride = 0; sum = 0; if (i < length - 2) { /* All interesting strides have a count of at least 4, */ /* at least when non-zeros. */ limit = 256 * (counts[i] + counts[i + 1] + counts[i + 2]) / 3 + 420; } else if (i < length) { limit = 256 * counts[i]; } else { limit = 0; } } ++stride; if (i != length) { sum += counts[i]; if (stride >= 4) { limit = (256 * sum + stride / 2) / stride; } if (stride == 4) { limit += 120; } } } } static void DecideOverRleUse(const uint8_t* depth, const size_t length, BROTLI_BOOL* use_rle_for_non_zero, BROTLI_BOOL* use_rle_for_zero) { size_t total_reps_zero = 0; size_t total_reps_non_zero = 0; size_t count_reps_zero = 1; size_t count_reps_non_zero = 1; size_t i; for (i = 0; i < length;) { const uint8_t value = depth[i]; size_t reps = 1; size_t k; for (k = i + 1; k < length && depth[k] == value; ++k) { ++reps; } if (reps >= 3 && value == 0) { total_reps_zero += reps; ++count_reps_zero; } if (reps >= 4 && value != 0) { total_reps_non_zero += reps; ++count_reps_non_zero; } i += reps; } *use_rle_for_non_zero = TO_BROTLI_BOOL(total_reps_non_zero > count_reps_non_zero * 2); *use_rle_for_zero = TO_BROTLI_BOOL(total_reps_zero > count_reps_zero * 2); } void BrotliWriteHuffmanTree(const uint8_t* depth, size_t length, size_t* tree_size, uint8_t* tree, uint8_t* extra_bits_data) { uint8_t previous_value = BROTLI_INITIAL_REPEATED_CODE_LENGTH; size_t i; BROTLI_BOOL use_rle_for_non_zero = BROTLI_FALSE; BROTLI_BOOL use_rle_for_zero = BROTLI_FALSE; /* Throw away trailing zeros. */ size_t new_length = length; for (i = 0; i < length; ++i) { if (depth[length - i - 1] == 0) { --new_length; } else { break; } } /* First gather statistics on if it is a good idea to do RLE. */ if (length > 50) { /* Find RLE coding for longer codes. Shorter codes seem not to benefit from RLE. */ DecideOverRleUse(depth, new_length, &use_rle_for_non_zero, &use_rle_for_zero); } /* Actual RLE coding. */ for (i = 0; i < new_length;) { const uint8_t value = depth[i]; size_t reps = 1; if ((value != 0 && use_rle_for_non_zero) || (value == 0 && use_rle_for_zero)) { size_t k; for (k = i + 1; k < new_length && depth[k] == value; ++k) { ++reps; } } if (value == 0) { BrotliWriteHuffmanTreeRepetitionsZeros( reps, tree_size, tree, extra_bits_data); } else { BrotliWriteHuffmanTreeRepetitions(previous_value, value, reps, tree_size, tree, extra_bits_data); previous_value = value; } i += reps; } } static uint16_t BrotliReverseBits(size_t num_bits, uint16_t bits) { static const size_t kLut[16] = { /* Pre-reversed 4-bit values. */ 0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F }; size_t retval = kLut[bits & 0x0F]; size_t i; for (i = 4; i < num_bits; i += 4) { retval <<= 4; bits = (uint16_t)(bits >> 4); retval |= kLut[bits & 0x0F]; } retval >>= ((0 - num_bits) & 0x03); return (uint16_t)retval; } /* 0..15 are values for bits */ #define MAX_HUFFMAN_BITS 16 void BrotliConvertBitDepthsToSymbols(const uint8_t* depth, size_t len, uint16_t* bits) { /* In Brotli, all bit depths are [1..15] 0 bit depth means that the symbol does not exist. */ uint16_t bl_count[MAX_HUFFMAN_BITS] = { 0 }; uint16_t next_code[MAX_HUFFMAN_BITS]; size_t i; int code = 0; for (i = 0; i < len; ++i) { ++bl_count[depth[i]]; } bl_count[0] = 0; next_code[0] = 0; for (i = 1; i < MAX_HUFFMAN_BITS; ++i) { code = (code + bl_count[i - 1]) << 1; next_code[i] = (uint16_t)code; } for (i = 0; i < len; ++i) { if (depth[i]) { bits[i] = BrotliReverseBits(depth[i], next_code[depth[i]]++); } } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/literal_cost.c0000664000175000017500000001275613510660062015757 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Literal cost model to allow backward reference replacement to be efficient. */ #include "./literal_cost.h" #include "../common/platform.h" #include #include "./fast_log.h" #include "./utf8_util.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static size_t UTF8Position(size_t last, size_t c, size_t clamp) { if (c < 128) { return 0; /* Next one is the 'Byte 1' again. */ } else if (c >= 192) { /* Next one is the 'Byte 2' of utf-8 encoding. */ return BROTLI_MIN(size_t, 1, clamp); } else { /* Let's decide over the last byte if this ends the sequence. */ if (last < 0xE0) { return 0; /* Completed two or three byte coding. */ } else { /* Next one is the 'Byte 3' of utf-8 encoding. */ return BROTLI_MIN(size_t, 2, clamp); } } } static size_t DecideMultiByteStatsLevel(size_t pos, size_t len, size_t mask, const uint8_t* data) { size_t counts[3] = { 0 }; size_t max_utf8 = 1; /* should be 2, but 1 compresses better. */ size_t last_c = 0; size_t i; for (i = 0; i < len; ++i) { size_t c = data[(pos + i) & mask]; ++counts[UTF8Position(last_c, c, 2)]; last_c = c; } if (counts[2] < 500) { max_utf8 = 1; } if (counts[1] + counts[2] < 25) { max_utf8 = 0; } return max_utf8; } static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask, const uint8_t* data, float* cost) { /* max_utf8 is 0 (normal ASCII single byte modeling), 1 (for 2-byte UTF-8 modeling), or 2 (for 3-byte UTF-8 modeling). */ const size_t max_utf8 = DecideMultiByteStatsLevel(pos, len, mask, data); size_t histogram[3][256] = { { 0 } }; size_t window_half = 495; size_t in_window = BROTLI_MIN(size_t, window_half, len); size_t in_window_utf8[3] = { 0 }; size_t i; { /* Bootstrap histograms. */ size_t last_c = 0; size_t utf8_pos = 0; for (i = 0; i < in_window; ++i) { size_t c = data[(pos + i) & mask]; ++histogram[utf8_pos][c]; ++in_window_utf8[utf8_pos]; utf8_pos = UTF8Position(last_c, c, max_utf8); last_c = c; } } /* Compute bit costs with sliding window. */ for (i = 0; i < len; ++i) { if (i >= window_half) { /* Remove a byte in the past. */ size_t c = i < window_half + 1 ? 0 : data[(pos + i - window_half - 1) & mask]; size_t last_c = i < window_half + 2 ? 0 : data[(pos + i - window_half - 2) & mask]; size_t utf8_pos2 = UTF8Position(last_c, c, max_utf8); --histogram[utf8_pos2][data[(pos + i - window_half) & mask]]; --in_window_utf8[utf8_pos2]; } if (i + window_half < len) { /* Add a byte in the future. */ size_t c = data[(pos + i + window_half - 1) & mask]; size_t last_c = data[(pos + i + window_half - 2) & mask]; size_t utf8_pos2 = UTF8Position(last_c, c, max_utf8); ++histogram[utf8_pos2][data[(pos + i + window_half) & mask]]; ++in_window_utf8[utf8_pos2]; } { size_t c = i < 1 ? 0 : data[(pos + i - 1) & mask]; size_t last_c = i < 2 ? 0 : data[(pos + i - 2) & mask]; size_t utf8_pos = UTF8Position(last_c, c, max_utf8); size_t masked_pos = (pos + i) & mask; size_t histo = histogram[utf8_pos][data[masked_pos]]; double lit_cost; if (histo == 0) { histo = 1; } lit_cost = FastLog2(in_window_utf8[utf8_pos]) - FastLog2(histo); lit_cost += 0.02905; if (lit_cost < 1.0) { lit_cost *= 0.5; lit_cost += 0.5; } /* Make the first bytes more expensive -- seems to help, not sure why. Perhaps because the entropy source is changing its properties rapidly in the beginning of the file, perhaps because the beginning of the data is a statistical "anomaly". */ if (i < 2000) { lit_cost += 0.7 - ((double)(2000 - i) / 2000.0 * 0.35); } cost[i] = (float)lit_cost; } } } void BrotliEstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask, const uint8_t* data, float* cost) { if (BrotliIsMostlyUTF8(data, pos, mask, len, kMinUTF8Ratio)) { EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, cost); return; } else { size_t histogram[256] = { 0 }; size_t window_half = 2000; size_t in_window = BROTLI_MIN(size_t, window_half, len); /* Bootstrap histogram. */ size_t i; for (i = 0; i < in_window; ++i) { ++histogram[data[(pos + i) & mask]]; } /* Compute bit costs with sliding window. */ for (i = 0; i < len; ++i) { size_t histo; if (i >= window_half) { /* Remove a byte in the past. */ --histogram[data[(pos + i - window_half) & mask]]; --in_window; } if (i + window_half < len) { /* Add a byte in the future. */ ++histogram[data[(pos + i + window_half) & mask]]; ++in_window; } histo = histogram[data[(pos + i) & mask]]; if (histo == 0) { histo = 1; } { double lit_cost = FastLog2(in_window) - FastLog2(histo); lit_cost += 0.029; if (lit_cost < 1.0) { lit_cost *= 0.5; lit_cost += 0.5; } cost[i] = (float)lit_cost; } } } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/histogram_inc.h0000664000175000017500000000257113510660062016120 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: Histogram, DATA_SIZE, DataType */ /* A simple container for histograms of data in blocks. */ typedef struct FN(Histogram) { uint32_t data_[DATA_SIZE]; size_t total_count_; double bit_cost_; } FN(Histogram); static BROTLI_INLINE void FN(HistogramClear)(FN(Histogram)* self) { memset(self->data_, 0, sizeof(self->data_)); self->total_count_ = 0; self->bit_cost_ = HUGE_VAL; } static BROTLI_INLINE void FN(ClearHistograms)( FN(Histogram)* array, size_t length) { size_t i; for (i = 0; i < length; ++i) FN(HistogramClear)(array + i); } static BROTLI_INLINE void FN(HistogramAdd)(FN(Histogram)* self, size_t val) { ++self->data_[val]; ++self->total_count_; } static BROTLI_INLINE void FN(HistogramAddVector)(FN(Histogram)* self, const DataType* p, size_t n) { self->total_count_ += n; n += 1; while (--n) ++self->data_[*p++]; } static BROTLI_INLINE void FN(HistogramAddHistogram)(FN(Histogram)* self, const FN(Histogram)* v) { size_t i; self->total_count_ += v->total_count_; for (i = 0; i < DATA_SIZE; ++i) { self->data_[i] += v->data_[i]; } } static BROTLI_INLINE size_t FN(HistogramDataSize)(void) { return DATA_SIZE; } dvisvgm-2.8.1/libs/brotli/enc/cluster.h0000664000175000017500000000201113510660062014740 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions for clustering similar histograms together. */ #ifndef BROTLI_ENC_CLUSTER_H_ #define BROTLI_ENC_CLUSTER_H_ #include "../common/platform.h" #include #include "./histogram.h" #include "./memory.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct HistogramPair { uint32_t idx1; uint32_t idx2; double cost_combo; double cost_diff; } HistogramPair; #define CODE(X) /* Declaration */; #define FN(X) X ## Literal #include "./cluster_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Command #include "./cluster_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Distance #include "./cluster_inc.h" /* NOLINT(build/include) */ #undef FN #undef CODE #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_CLUSTER_H_ */ dvisvgm-2.8.1/libs/brotli/enc/compress_fragment_two_pass.c0000664000175000017500000006224413510660062020725 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function for fast encoding of an input fragment, independently from the input history. This function uses two-pass processing: in the first pass we save the found backward matches and literal bytes into a buffer, and in the second pass we emit them into the bit stream using prefix codes built based on the actual command and literal byte histograms. */ #include "./compress_fragment_two_pass.h" #include /* memcmp, memcpy, memset */ #include "../common/constants.h" #include "../common/platform.h" #include #include "./bit_cost.h" #include "./brotli_bit_stream.h" #include "./entropy_encode.h" #include "./fast_log.h" #include "./find_match_length.h" #include "./memory.h" #include "./write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define MAX_DISTANCE (long)BROTLI_MAX_BACKWARD_LIMIT(18) /* kHashMul32 multiplier has these properties: * The multiplier must be odd. Otherwise we may lose the highest bit. * No long streaks of ones or zeros. * There is no effort to ensure that it is a prime, the oddity is enough for this use. * The number has been tuned heuristically against compression benchmarks. */ static const uint32_t kHashMul32 = 0x1E35A7BD; static BROTLI_INLINE uint32_t Hash(const uint8_t* p, size_t shift, size_t length) { const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(p) << ((8 - length) * 8)) * kHashMul32; return (uint32_t)(h >> shift); } static BROTLI_INLINE uint32_t HashBytesAtOffset(uint64_t v, size_t offset, size_t shift, size_t length) { BROTLI_DCHECK(offset <= 8 - length); { const uint64_t h = ((v >> (8 * offset)) << ((8 - length) * 8)) * kHashMul32; return (uint32_t)(h >> shift); } } static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2, size_t length) { if (BrotliUnalignedRead32(p1) == BrotliUnalignedRead32(p2)) { if (length == 4) return BROTLI_TRUE; return TO_BROTLI_BOOL(p1[4] == p2[4] && p1[5] == p2[5]); } return BROTLI_FALSE; } /* Builds a command and distance prefix code (each 64 symbols) into "depth" and "bits" based on "histogram" and stores it into the bit stream. */ static void BuildAndStoreCommandPrefixCode( const uint32_t histogram[128], uint8_t depth[128], uint16_t bits[128], size_t* storage_ix, uint8_t* storage) { /* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */ HuffmanTree tree[129]; uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0 }; uint16_t cmd_bits[64]; BrotliCreateHuffmanTree(histogram, 64, 15, tree, depth); BrotliCreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]); /* We have to jump through a few hoops here in order to compute the command bits because the symbols are in a different order than in the full alphabet. This looks complicated, but having the symbols in this order in the command bits saves a few branches in the Emit* functions. */ memcpy(cmd_depth, depth + 24, 24); memcpy(cmd_depth + 24, depth, 8); memcpy(cmd_depth + 32, depth + 48, 8); memcpy(cmd_depth + 40, depth + 8, 8); memcpy(cmd_depth + 48, depth + 56, 8); memcpy(cmd_depth + 56, depth + 16, 8); BrotliConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits); memcpy(bits, cmd_bits + 24, 16); memcpy(bits + 8, cmd_bits + 40, 16); memcpy(bits + 16, cmd_bits + 56, 16); memcpy(bits + 24, cmd_bits, 48); memcpy(bits + 48, cmd_bits + 32, 16); memcpy(bits + 56, cmd_bits + 48, 16); BrotliConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]); { /* Create the bit length array for the full command alphabet. */ size_t i; memset(cmd_depth, 0, 64); /* only 64 first values were used */ memcpy(cmd_depth, depth + 24, 8); memcpy(cmd_depth + 64, depth + 32, 8); memcpy(cmd_depth + 128, depth + 40, 8); memcpy(cmd_depth + 192, depth + 48, 8); memcpy(cmd_depth + 384, depth + 56, 8); for (i = 0; i < 8; ++i) { cmd_depth[128 + 8 * i] = depth[i]; cmd_depth[256 + 8 * i] = depth[8 + i]; cmd_depth[448 + 8 * i] = depth[16 + i]; } BrotliStoreHuffmanTree( cmd_depth, BROTLI_NUM_COMMAND_SYMBOLS, tree, storage_ix, storage); } BrotliStoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage); } static BROTLI_INLINE void EmitInsertLen( uint32_t insertlen, uint32_t** commands) { if (insertlen < 6) { **commands = insertlen; } else if (insertlen < 130) { const uint32_t tail = insertlen - 2; const uint32_t nbits = Log2FloorNonZero(tail) - 1u; const uint32_t prefix = tail >> nbits; const uint32_t inscode = (nbits << 1) + prefix + 2; const uint32_t extra = tail - (prefix << nbits); **commands = inscode | (extra << 8); } else if (insertlen < 2114) { const uint32_t tail = insertlen - 66; const uint32_t nbits = Log2FloorNonZero(tail); const uint32_t code = nbits + 10; const uint32_t extra = tail - (1u << nbits); **commands = code | (extra << 8); } else if (insertlen < 6210) { const uint32_t extra = insertlen - 2114; **commands = 21 | (extra << 8); } else if (insertlen < 22594) { const uint32_t extra = insertlen - 6210; **commands = 22 | (extra << 8); } else { const uint32_t extra = insertlen - 22594; **commands = 23 | (extra << 8); } ++(*commands); } static BROTLI_INLINE void EmitCopyLen(size_t copylen, uint32_t** commands) { if (copylen < 10) { **commands = (uint32_t)(copylen + 38); } else if (copylen < 134) { const size_t tail = copylen - 6; const size_t nbits = Log2FloorNonZero(tail) - 1; const size_t prefix = tail >> nbits; const size_t code = (nbits << 1) + prefix + 44; const size_t extra = tail - (prefix << nbits); **commands = (uint32_t)(code | (extra << 8)); } else if (copylen < 2118) { const size_t tail = copylen - 70; const size_t nbits = Log2FloorNonZero(tail); const size_t code = nbits + 52; const size_t extra = tail - ((size_t)1 << nbits); **commands = (uint32_t)(code | (extra << 8)); } else { const size_t extra = copylen - 2118; **commands = (uint32_t)(63 | (extra << 8)); } ++(*commands); } static BROTLI_INLINE void EmitCopyLenLastDistance( size_t copylen, uint32_t** commands) { if (copylen < 12) { **commands = (uint32_t)(copylen + 20); ++(*commands); } else if (copylen < 72) { const size_t tail = copylen - 8; const size_t nbits = Log2FloorNonZero(tail) - 1; const size_t prefix = tail >> nbits; const size_t code = (nbits << 1) + prefix + 28; const size_t extra = tail - (prefix << nbits); **commands = (uint32_t)(code | (extra << 8)); ++(*commands); } else if (copylen < 136) { const size_t tail = copylen - 8; const size_t code = (tail >> 5) + 54; const size_t extra = tail & 31; **commands = (uint32_t)(code | (extra << 8)); ++(*commands); **commands = 64; ++(*commands); } else if (copylen < 2120) { const size_t tail = copylen - 72; const size_t nbits = Log2FloorNonZero(tail); const size_t code = nbits + 52; const size_t extra = tail - ((size_t)1 << nbits); **commands = (uint32_t)(code | (extra << 8)); ++(*commands); **commands = 64; ++(*commands); } else { const size_t extra = copylen - 2120; **commands = (uint32_t)(63 | (extra << 8)); ++(*commands); **commands = 64; ++(*commands); } } static BROTLI_INLINE void EmitDistance(uint32_t distance, uint32_t** commands) { uint32_t d = distance + 3; uint32_t nbits = Log2FloorNonZero(d) - 1; const uint32_t prefix = (d >> nbits) & 1; const uint32_t offset = (2 + prefix) << nbits; const uint32_t distcode = 2 * (nbits - 1) + prefix + 80; uint32_t extra = d - offset; **commands = distcode | (extra << 8); ++(*commands); } /* REQUIRES: len <= 1 << 24. */ static void BrotliStoreMetaBlockHeader( size_t len, BROTLI_BOOL is_uncompressed, size_t* storage_ix, uint8_t* storage) { size_t nibbles = 6; /* ISLAST */ BrotliWriteBits(1, 0, storage_ix, storage); if (len <= (1U << 16)) { nibbles = 4; } else if (len <= (1U << 20)) { nibbles = 5; } BrotliWriteBits(2, nibbles - 4, storage_ix, storage); BrotliWriteBits(nibbles * 4, len - 1, storage_ix, storage); /* ISUNCOMPRESSED */ BrotliWriteBits(1, (uint64_t)is_uncompressed, storage_ix, storage); } static BROTLI_INLINE void CreateCommands(const uint8_t* input, size_t block_size, size_t input_size, const uint8_t* base_ip, int* table, size_t table_bits, size_t min_match, uint8_t** literals, uint32_t** commands) { /* "ip" is the input pointer. */ const uint8_t* ip = input; const size_t shift = 64u - table_bits; const uint8_t* ip_end = input + block_size; /* "next_emit" is a pointer to the first byte that is not covered by a previous copy. Bytes between "next_emit" and the start of the next copy or the end of the input will be emitted as literal bytes. */ const uint8_t* next_emit = input; int last_distance = -1; const size_t kInputMarginBytes = BROTLI_WINDOW_GAP; if (BROTLI_PREDICT_TRUE(block_size >= kInputMarginBytes)) { /* For the last block, we need to keep a 16 bytes margin so that we can be sure that all distances are at most window size - 16. For all other blocks, we only need to keep a margin of 5 bytes so that we don't go over the block size with a copy. */ const size_t len_limit = BROTLI_MIN(size_t, block_size - min_match, input_size - kInputMarginBytes); const uint8_t* ip_limit = input + len_limit; uint32_t next_hash; for (next_hash = Hash(++ip, shift, min_match); ; ) { /* Step 1: Scan forward in the input looking for a 6-byte-long match. If we get close to exhausting the input then goto emit_remainder. Heuristic match skipping: If 32 bytes are scanned with no matches found, start looking only at every other byte. If 32 more bytes are scanned, look at every third byte, etc.. When a match is found, immediately go back to looking at every byte. This is a small loss (~5% performance, ~0.1% density) for compressible data due to more bookkeeping, but for non-compressible data (such as JPEG) it's a huge win since the compressor quickly "realizes" the data is incompressible and doesn't bother looking for matches everywhere. The "skip" variable keeps track of how many bytes there are since the last match; dividing it by 32 (ie. right-shifting by five) gives the number of bytes to move ahead for each iteration. */ uint32_t skip = 32; const uint8_t* next_ip = ip; const uint8_t* candidate; BROTLI_DCHECK(next_emit < ip); trawl: do { uint32_t hash = next_hash; uint32_t bytes_between_hash_lookups = skip++ >> 5; ip = next_ip; BROTLI_DCHECK(hash == Hash(ip, shift, min_match)); next_ip = ip + bytes_between_hash_lookups; if (BROTLI_PREDICT_FALSE(next_ip > ip_limit)) { goto emit_remainder; } next_hash = Hash(next_ip, shift, min_match); candidate = ip - last_distance; if (IsMatch(ip, candidate, min_match)) { if (BROTLI_PREDICT_TRUE(candidate < ip)) { table[hash] = (int)(ip - base_ip); break; } } candidate = base_ip + table[hash]; BROTLI_DCHECK(candidate >= base_ip); BROTLI_DCHECK(candidate < ip); table[hash] = (int)(ip - base_ip); } while (BROTLI_PREDICT_TRUE(!IsMatch(ip, candidate, min_match))); /* Check copy distance. If candidate is not feasible, continue search. Checking is done outside of hot loop to reduce overhead. */ if (ip - candidate > MAX_DISTANCE) goto trawl; /* Step 2: Emit the found match together with the literal bytes from "next_emit", and then see if we can find a next match immediately afterwards. Repeat until we find no match for the input without emitting some literal bytes. */ { /* We have a 6-byte match at ip, and we need to emit bytes in [next_emit, ip). */ const uint8_t* base = ip; size_t matched = min_match + FindMatchLengthWithLimit( candidate + min_match, ip + min_match, (size_t)(ip_end - ip) - min_match); int distance = (int)(base - candidate); /* > 0 */ int insert = (int)(base - next_emit); ip += matched; BROTLI_DCHECK(0 == memcmp(base, candidate, matched)); EmitInsertLen((uint32_t)insert, commands); memcpy(*literals, next_emit, (size_t)insert); *literals += insert; if (distance == last_distance) { **commands = 64; ++(*commands); } else { EmitDistance((uint32_t)distance, commands); last_distance = distance; } EmitCopyLenLastDistance(matched, commands); next_emit = ip; if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) { goto emit_remainder; } { /* We could immediately start working at ip now, but to improve compression we first update "table" with the hashes of some positions within the last copy. */ uint64_t input_bytes; uint32_t cur_hash; uint32_t prev_hash; if (min_match == 4) { input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 3); cur_hash = HashBytesAtOffset(input_bytes, 3, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 3); prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 2); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 1); } else { input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 5); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 5); prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 4); prev_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 3); input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 2); cur_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 2); prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 1); } candidate = base_ip + table[cur_hash]; table[cur_hash] = (int)(ip - base_ip); } } while (ip - candidate <= MAX_DISTANCE && IsMatch(ip, candidate, min_match)) { /* We have a 6-byte match at ip, and no need to emit any literal bytes prior to ip. */ const uint8_t* base = ip; size_t matched = min_match + FindMatchLengthWithLimit( candidate + min_match, ip + min_match, (size_t)(ip_end - ip) - min_match); ip += matched; last_distance = (int)(base - candidate); /* > 0 */ BROTLI_DCHECK(0 == memcmp(base, candidate, matched)); EmitCopyLen(matched, commands); EmitDistance((uint32_t)last_distance, commands); next_emit = ip; if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) { goto emit_remainder; } { /* We could immediately start working at ip now, but to improve compression we first update "table" with the hashes of some positions within the last copy. */ uint64_t input_bytes; uint32_t cur_hash; uint32_t prev_hash; if (min_match == 4) { input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 3); cur_hash = HashBytesAtOffset(input_bytes, 3, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 3); prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 2); prev_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 1); } else { input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 5); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 5); prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 4); prev_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 3); input_bytes = BROTLI_UNALIGNED_LOAD64LE(ip - 2); cur_hash = HashBytesAtOffset(input_bytes, 2, shift, min_match); prev_hash = HashBytesAtOffset(input_bytes, 0, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 2); prev_hash = HashBytesAtOffset(input_bytes, 1, shift, min_match); table[prev_hash] = (int)(ip - base_ip - 1); } candidate = base_ip + table[cur_hash]; table[cur_hash] = (int)(ip - base_ip); } } next_hash = Hash(++ip, shift, min_match); } } emit_remainder: BROTLI_DCHECK(next_emit <= ip_end); /* Emit the remaining bytes as literals. */ if (next_emit < ip_end) { const uint32_t insert = (uint32_t)(ip_end - next_emit); EmitInsertLen(insert, commands); memcpy(*literals, next_emit, insert); *literals += insert; } } static void StoreCommands(MemoryManager* m, const uint8_t* literals, const size_t num_literals, const uint32_t* commands, const size_t num_commands, size_t* storage_ix, uint8_t* storage) { static const uint32_t kNumExtraBits[128] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, }; static const uint32_t kInsertOffset[24] = { 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594, }; uint8_t lit_depths[256]; uint16_t lit_bits[256]; uint32_t lit_histo[256] = { 0 }; uint8_t cmd_depths[128] = { 0 }; uint16_t cmd_bits[128] = { 0 }; uint32_t cmd_histo[128] = { 0 }; size_t i; for (i = 0; i < num_literals; ++i) { ++lit_histo[literals[i]]; } BrotliBuildAndStoreHuffmanTreeFast(m, lit_histo, num_literals, /* max_bits = */ 8, lit_depths, lit_bits, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < num_commands; ++i) { const uint32_t code = commands[i] & 0xFF; BROTLI_DCHECK(code < 128); ++cmd_histo[code]; } cmd_histo[1] += 1; cmd_histo[2] += 1; cmd_histo[64] += 1; cmd_histo[84] += 1; BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depths, cmd_bits, storage_ix, storage); for (i = 0; i < num_commands; ++i) { const uint32_t cmd = commands[i]; const uint32_t code = cmd & 0xFF; const uint32_t extra = cmd >> 8; BROTLI_DCHECK(code < 128); BrotliWriteBits(cmd_depths[code], cmd_bits[code], storage_ix, storage); BrotliWriteBits(kNumExtraBits[code], extra, storage_ix, storage); if (code < 24) { const uint32_t insert = kInsertOffset[code] + extra; uint32_t j; for (j = 0; j < insert; ++j) { const uint8_t lit = *literals; BrotliWriteBits(lit_depths[lit], lit_bits[lit], storage_ix, storage); ++literals; } } } } /* Acceptable loss for uncompressible speedup is 2% */ #define MIN_RATIO 0.98 #define SAMPLE_RATE 43 static BROTLI_BOOL ShouldCompress( const uint8_t* input, size_t input_size, size_t num_literals) { double corpus_size = (double)input_size; if (num_literals < MIN_RATIO * corpus_size) { return BROTLI_TRUE; } else { uint32_t literal_histo[256] = { 0 }; const double max_total_bit_cost = corpus_size * 8 * MIN_RATIO / SAMPLE_RATE; size_t i; for (i = 0; i < input_size; i += SAMPLE_RATE) { ++literal_histo[input[i]]; } return TO_BROTLI_BOOL(BitsEntropy(literal_histo, 256) < max_total_bit_cost); } } static void RewindBitPosition(const size_t new_storage_ix, size_t* storage_ix, uint8_t* storage) { const size_t bitpos = new_storage_ix & 7; const size_t mask = (1u << bitpos) - 1; storage[new_storage_ix >> 3] &= (uint8_t)mask; *storage_ix = new_storage_ix; } static void EmitUncompressedMetaBlock(const uint8_t* input, size_t input_size, size_t* storage_ix, uint8_t* storage) { BrotliStoreMetaBlockHeader(input_size, 1, storage_ix, storage); *storage_ix = (*storage_ix + 7u) & ~7u; memcpy(&storage[*storage_ix >> 3], input, input_size); *storage_ix += input_size << 3; storage[*storage_ix >> 3] = 0; } static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl( MemoryManager* m, const uint8_t* input, size_t input_size, BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, int* table, size_t table_bits, size_t min_match, size_t* storage_ix, uint8_t* storage) { /* Save the start of the first block for position and distance computations. */ const uint8_t* base_ip = input; BROTLI_UNUSED(is_last); while (input_size > 0) { size_t block_size = BROTLI_MIN(size_t, input_size, kCompressFragmentTwoPassBlockSize); uint32_t* commands = command_buf; uint8_t* literals = literal_buf; size_t num_literals; CreateCommands(input, block_size, input_size, base_ip, table, table_bits, min_match, &literals, &commands); num_literals = (size_t)(literals - literal_buf); if (ShouldCompress(input, block_size, num_literals)) { const size_t num_commands = (size_t)(commands - command_buf); BrotliStoreMetaBlockHeader(block_size, 0, storage_ix, storage); /* No block splits, no contexts. */ BrotliWriteBits(13, 0, storage_ix, storage); StoreCommands(m, literal_buf, num_literals, command_buf, num_commands, storage_ix, storage); if (BROTLI_IS_OOM(m)) return; } else { /* Since we did not find many backward references and the entropy of the data is close to 8 bits, we can simply emit an uncompressed block. This makes compression speed of uncompressible data about 3x faster. */ EmitUncompressedMetaBlock(input, block_size, storage_ix, storage); } input += block_size; input_size -= block_size; } } #define FOR_TABLE_BITS_(X) \ X(8) X(9) X(10) X(11) X(12) X(13) X(14) X(15) X(16) X(17) #define BAKE_METHOD_PARAM_(B) \ static BROTLI_NOINLINE void BrotliCompressFragmentTwoPassImpl ## B( \ MemoryManager* m, const uint8_t* input, size_t input_size, \ BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, \ int* table, size_t* storage_ix, uint8_t* storage) { \ size_t min_match = (B <= 15) ? 4 : 6; \ BrotliCompressFragmentTwoPassImpl(m, input, input_size, is_last, command_buf,\ literal_buf, table, B, min_match, storage_ix, storage); \ } FOR_TABLE_BITS_(BAKE_METHOD_PARAM_) #undef BAKE_METHOD_PARAM_ void BrotliCompressFragmentTwoPass( MemoryManager* m, const uint8_t* input, size_t input_size, BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, int* table, size_t table_size, size_t* storage_ix, uint8_t* storage) { const size_t initial_storage_ix = *storage_ix; const size_t table_bits = Log2FloorNonZero(table_size); switch (table_bits) { #define CASE_(B) \ case B: \ BrotliCompressFragmentTwoPassImpl ## B( \ m, input, input_size, is_last, command_buf, \ literal_buf, table, storage_ix, storage); \ break; FOR_TABLE_BITS_(CASE_) #undef CASE_ default: BROTLI_DCHECK(0); break; } /* If output is larger than single uncompressed block, rewrite it. */ if (*storage_ix - initial_storage_ix > 31 + (input_size << 3)) { RewindBitPosition(initial_storage_ix, storage_ix, storage); EmitUncompressedMetaBlock(input, input_size, storage_ix, storage); } if (is_last) { BrotliWriteBits(1, 1, storage_ix, storage); /* islast */ BrotliWriteBits(1, 1, storage_ix, storage); /* isempty */ *storage_ix = (*storage_ix + 7u) & ~7u; } } #undef FOR_TABLE_BITS_ #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/write_bits.h0000664000175000017500000000542713510660062015450 00000000000000/* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Write bits into a byte array. */ #ifndef BROTLI_ENC_WRITE_BITS_H_ #define BROTLI_ENC_WRITE_BITS_H_ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /*#define BIT_WRITER_DEBUG */ /* This function writes bits into bytes in increasing addresses, and within a byte least-significant-bit first. The function can write up to 56 bits in one go with WriteBits Example: let's assume that 3 bits (Rs below) have been written already: BYTE-0 BYTE+1 BYTE+2 0000 0RRR 0000 0000 0000 0000 Now, we could write 5 or less bits in MSB by just sifting by 3 and OR'ing to BYTE-0. For n bits, we take the last 5 bits, OR that with high bits in BYTE-0, and locate the rest in BYTE+1, BYTE+2, etc. */ static BROTLI_INLINE void BrotliWriteBits(size_t n_bits, uint64_t bits, size_t* BROTLI_RESTRICT pos, uint8_t* BROTLI_RESTRICT array) { #if defined(BROTLI_LITTLE_ENDIAN) /* This branch of the code can write up to 56 bits at a time, 7 bits are lost by being perhaps already in *p and at least 1 bit is needed to initialize the bit-stream ahead (i.e. if 7 bits are in *p and we write 57 bits, then the next write will access a byte that was never initialized). */ uint8_t* p = &array[*pos >> 3]; uint64_t v = (uint64_t)(*p); /* Zero-extend 8 to 64 bits. */ BROTLI_LOG(("WriteBits %2d 0x%08x%08x %10d\n", (int)n_bits, (uint32_t)(bits >> 32), (uint32_t)(bits & 0xFFFFFFFF), (int)*pos)); BROTLI_DCHECK((bits >> n_bits) == 0); BROTLI_DCHECK(n_bits <= 56); v |= bits << (*pos & 7); BROTLI_UNALIGNED_STORE64LE(p, v); /* Set some bits. */ *pos += n_bits; #else /* implicit & 0xFF is assumed for uint8_t arithmetics */ uint8_t* array_pos = &array[*pos >> 3]; const size_t bits_reserved_in_first_byte = (*pos & 7); size_t bits_left_to_write; bits <<= bits_reserved_in_first_byte; *array_pos++ |= (uint8_t)bits; for (bits_left_to_write = n_bits + bits_reserved_in_first_byte; bits_left_to_write >= 9; bits_left_to_write -= 8) { bits >>= 8; *array_pos++ = (uint8_t)bits; } *array_pos = 0; *pos += n_bits; #endif } static BROTLI_INLINE void BrotliWriteBitsPrepareStorage( size_t pos, uint8_t* array) { BROTLI_LOG(("WriteBitsPrepareStorage %10d\n", (int)pos)); BROTLI_DCHECK((pos & 7) == 0); array[pos >> 3] = 0; } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_WRITE_BITS_H_ */ dvisvgm-2.8.1/libs/brotli/enc/block_splitter_inc.h0000664000175000017500000003766313510660062017155 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, DataType */ #define HistogramType FN(Histogram) static void FN(InitialEntropyCodes)(const DataType* data, size_t length, size_t stride, size_t num_histograms, HistogramType* histograms) { uint32_t seed = 7; size_t block_length = length / num_histograms; size_t i; FN(ClearHistograms)(histograms, num_histograms); for (i = 0; i < num_histograms; ++i) { size_t pos = length * i / num_histograms; if (i != 0) { pos += MyRand(&seed) % block_length; } if (pos + stride >= length) { pos = length - stride - 1; } FN(HistogramAddVector)(&histograms[i], data + pos, stride); } } static void FN(RandomSample)(uint32_t* seed, const DataType* data, size_t length, size_t stride, HistogramType* sample) { size_t pos = 0; if (stride >= length) { stride = length; } else { pos = MyRand(seed) % (length - stride + 1); } FN(HistogramAddVector)(sample, data + pos, stride); } static void FN(RefineEntropyCodes)(const DataType* data, size_t length, size_t stride, size_t num_histograms, HistogramType* histograms) { size_t iters = kIterMulForRefining * length / stride + kMinItersForRefining; uint32_t seed = 7; size_t iter; iters = ((iters + num_histograms - 1) / num_histograms) * num_histograms; for (iter = 0; iter < iters; ++iter) { HistogramType sample; FN(HistogramClear)(&sample); FN(RandomSample)(&seed, data, length, stride, &sample); FN(HistogramAddHistogram)(&histograms[iter % num_histograms], &sample); } } /* Assigns a block id from the range [0, num_histograms) to each data element in data[0..length) and fills in block_id[0..length) with the assigned values. Returns the number of blocks, i.e. one plus the number of block switches. */ static size_t FN(FindBlocks)(const DataType* data, const size_t length, const double block_switch_bitcost, const size_t num_histograms, const HistogramType* histograms, double* insert_cost, double* cost, uint8_t* switch_signal, uint8_t* block_id) { const size_t data_size = FN(HistogramDataSize)(); const size_t bitmaplen = (num_histograms + 7) >> 3; size_t num_blocks = 1; size_t i; size_t j; BROTLI_DCHECK(num_histograms <= 256); if (num_histograms <= 1) { for (i = 0; i < length; ++i) { block_id[i] = 0; } return 1; } memset(insert_cost, 0, sizeof(insert_cost[0]) * data_size * num_histograms); for (i = 0; i < num_histograms; ++i) { insert_cost[i] = FastLog2((uint32_t)histograms[i].total_count_); } for (i = data_size; i != 0;) { --i; for (j = 0; j < num_histograms; ++j) { insert_cost[i * num_histograms + j] = insert_cost[j] - BitCost(histograms[j].data_[i]); } } memset(cost, 0, sizeof(cost[0]) * num_histograms); memset(switch_signal, 0, sizeof(switch_signal[0]) * length * bitmaplen); /* After each iteration of this loop, cost[k] will contain the difference between the minimum cost of arriving at the current byte position using entropy code k, and the minimum cost of arriving at the current byte position. This difference is capped at the block switch cost, and if it reaches block switch cost, it means that when we trace back from the last position, we need to switch here. */ for (i = 0; i < length; ++i) { const size_t byte_ix = i; size_t ix = byte_ix * bitmaplen; size_t insert_cost_ix = data[byte_ix] * num_histograms; double min_cost = 1e99; double block_switch_cost = block_switch_bitcost; size_t k; for (k = 0; k < num_histograms; ++k) { /* We are coding the symbol in data[byte_ix] with entropy code k. */ cost[k] += insert_cost[insert_cost_ix + k]; if (cost[k] < min_cost) { min_cost = cost[k]; block_id[byte_ix] = (uint8_t)k; } } /* More blocks for the beginning. */ if (byte_ix < 2000) { block_switch_cost *= 0.77 + 0.07 * (double)byte_ix / 2000; } for (k = 0; k < num_histograms; ++k) { cost[k] -= min_cost; if (cost[k] >= block_switch_cost) { const uint8_t mask = (uint8_t)(1u << (k & 7)); cost[k] = block_switch_cost; BROTLI_DCHECK((k >> 3) < bitmaplen); switch_signal[ix + (k >> 3)] |= mask; } } } { /* Trace back from the last position and switch at the marked places. */ size_t byte_ix = length - 1; size_t ix = byte_ix * bitmaplen; uint8_t cur_id = block_id[byte_ix]; while (byte_ix > 0) { const uint8_t mask = (uint8_t)(1u << (cur_id & 7)); BROTLI_DCHECK(((size_t)cur_id >> 3) < bitmaplen); --byte_ix; ix -= bitmaplen; if (switch_signal[ix + (cur_id >> 3)] & mask) { if (cur_id != block_id[byte_ix]) { cur_id = block_id[byte_ix]; ++num_blocks; } } block_id[byte_ix] = cur_id; } } return num_blocks; } static size_t FN(RemapBlockIds)(uint8_t* block_ids, const size_t length, uint16_t* new_id, const size_t num_histograms) { static const uint16_t kInvalidId = 256; uint16_t next_id = 0; size_t i; for (i = 0; i < num_histograms; ++i) { new_id[i] = kInvalidId; } for (i = 0; i < length; ++i) { BROTLI_DCHECK(block_ids[i] < num_histograms); if (new_id[block_ids[i]] == kInvalidId) { new_id[block_ids[i]] = next_id++; } } for (i = 0; i < length; ++i) { block_ids[i] = (uint8_t)new_id[block_ids[i]]; BROTLI_DCHECK(block_ids[i] < num_histograms); } BROTLI_DCHECK(next_id <= num_histograms); return next_id; } static void FN(BuildBlockHistograms)(const DataType* data, const size_t length, const uint8_t* block_ids, const size_t num_histograms, HistogramType* histograms) { size_t i; FN(ClearHistograms)(histograms, num_histograms); for (i = 0; i < length; ++i) { FN(HistogramAdd)(&histograms[block_ids[i]], data[i]); } } static void FN(ClusterBlocks)(MemoryManager* m, const DataType* data, const size_t length, const size_t num_blocks, uint8_t* block_ids, BlockSplit* split) { uint32_t* histogram_symbols = BROTLI_ALLOC(m, uint32_t, num_blocks); uint32_t* block_lengths = BROTLI_ALLOC(m, uint32_t, num_blocks); const size_t expected_num_clusters = CLUSTERS_PER_BATCH * (num_blocks + HISTOGRAMS_PER_BATCH - 1) / HISTOGRAMS_PER_BATCH; size_t all_histograms_size = 0; size_t all_histograms_capacity = expected_num_clusters; HistogramType* all_histograms = BROTLI_ALLOC(m, HistogramType, all_histograms_capacity); size_t cluster_size_size = 0; size_t cluster_size_capacity = expected_num_clusters; uint32_t* cluster_size = BROTLI_ALLOC(m, uint32_t, cluster_size_capacity); size_t num_clusters = 0; HistogramType* histograms = BROTLI_ALLOC(m, HistogramType, BROTLI_MIN(size_t, num_blocks, HISTOGRAMS_PER_BATCH)); size_t max_num_pairs = HISTOGRAMS_PER_BATCH * HISTOGRAMS_PER_BATCH / 2; size_t pairs_capacity = max_num_pairs + 1; HistogramPair* pairs = BROTLI_ALLOC(m, HistogramPair, pairs_capacity); size_t pos = 0; uint32_t* clusters; size_t num_final_clusters; static const uint32_t kInvalidIndex = BROTLI_UINT32_MAX; uint32_t* new_index; size_t i; uint32_t sizes[HISTOGRAMS_PER_BATCH] = { 0 }; uint32_t new_clusters[HISTOGRAMS_PER_BATCH] = { 0 }; uint32_t symbols[HISTOGRAMS_PER_BATCH] = { 0 }; uint32_t remap[HISTOGRAMS_PER_BATCH] = { 0 }; if (BROTLI_IS_OOM(m)) return; memset(block_lengths, 0, num_blocks * sizeof(uint32_t)); { size_t block_idx = 0; for (i = 0; i < length; ++i) { BROTLI_DCHECK(block_idx < num_blocks); ++block_lengths[block_idx]; if (i + 1 == length || block_ids[i] != block_ids[i + 1]) { ++block_idx; } } BROTLI_DCHECK(block_idx == num_blocks); } for (i = 0; i < num_blocks; i += HISTOGRAMS_PER_BATCH) { const size_t num_to_combine = BROTLI_MIN(size_t, num_blocks - i, HISTOGRAMS_PER_BATCH); size_t num_new_clusters; size_t j; for (j = 0; j < num_to_combine; ++j) { size_t k; FN(HistogramClear)(&histograms[j]); for (k = 0; k < block_lengths[i + j]; ++k) { FN(HistogramAdd)(&histograms[j], data[pos++]); } histograms[j].bit_cost_ = FN(BrotliPopulationCost)(&histograms[j]); new_clusters[j] = (uint32_t)j; symbols[j] = (uint32_t)j; sizes[j] = 1; } num_new_clusters = FN(BrotliHistogramCombine)( histograms, sizes, symbols, new_clusters, pairs, num_to_combine, num_to_combine, HISTOGRAMS_PER_BATCH, max_num_pairs); BROTLI_ENSURE_CAPACITY(m, HistogramType, all_histograms, all_histograms_capacity, all_histograms_size + num_new_clusters); BROTLI_ENSURE_CAPACITY(m, uint32_t, cluster_size, cluster_size_capacity, cluster_size_size + num_new_clusters); if (BROTLI_IS_OOM(m)) return; for (j = 0; j < num_new_clusters; ++j) { all_histograms[all_histograms_size++] = histograms[new_clusters[j]]; cluster_size[cluster_size_size++] = sizes[new_clusters[j]]; remap[new_clusters[j]] = (uint32_t)j; } for (j = 0; j < num_to_combine; ++j) { histogram_symbols[i + j] = (uint32_t)num_clusters + remap[symbols[j]]; } num_clusters += num_new_clusters; BROTLI_DCHECK(num_clusters == cluster_size_size); BROTLI_DCHECK(num_clusters == all_histograms_size); } BROTLI_FREE(m, histograms); max_num_pairs = BROTLI_MIN(size_t, 64 * num_clusters, (num_clusters / 2) * num_clusters); if (pairs_capacity < max_num_pairs + 1) { BROTLI_FREE(m, pairs); pairs = BROTLI_ALLOC(m, HistogramPair, max_num_pairs + 1); if (BROTLI_IS_OOM(m)) return; } clusters = BROTLI_ALLOC(m, uint32_t, num_clusters); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < num_clusters; ++i) { clusters[i] = (uint32_t)i; } num_final_clusters = FN(BrotliHistogramCombine)( all_histograms, cluster_size, histogram_symbols, clusters, pairs, num_clusters, num_blocks, BROTLI_MAX_NUMBER_OF_BLOCK_TYPES, max_num_pairs); BROTLI_FREE(m, pairs); BROTLI_FREE(m, cluster_size); new_index = BROTLI_ALLOC(m, uint32_t, num_clusters); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < num_clusters; ++i) new_index[i] = kInvalidIndex; pos = 0; { uint32_t next_index = 0; for (i = 0; i < num_blocks; ++i) { HistogramType histo; size_t j; uint32_t best_out; double best_bits; FN(HistogramClear)(&histo); for (j = 0; j < block_lengths[i]; ++j) { FN(HistogramAdd)(&histo, data[pos++]); } best_out = (i == 0) ? histogram_symbols[0] : histogram_symbols[i - 1]; best_bits = FN(BrotliHistogramBitCostDistance)(&histo, &all_histograms[best_out]); for (j = 0; j < num_final_clusters; ++j) { const double cur_bits = FN(BrotliHistogramBitCostDistance)( &histo, &all_histograms[clusters[j]]); if (cur_bits < best_bits) { best_bits = cur_bits; best_out = clusters[j]; } } histogram_symbols[i] = best_out; if (new_index[best_out] == kInvalidIndex) { new_index[best_out] = next_index++; } } } BROTLI_FREE(m, clusters); BROTLI_FREE(m, all_histograms); BROTLI_ENSURE_CAPACITY( m, uint8_t, split->types, split->types_alloc_size, num_blocks); BROTLI_ENSURE_CAPACITY( m, uint32_t, split->lengths, split->lengths_alloc_size, num_blocks); if (BROTLI_IS_OOM(m)) return; { uint32_t cur_length = 0; size_t block_idx = 0; uint8_t max_type = 0; for (i = 0; i < num_blocks; ++i) { cur_length += block_lengths[i]; if (i + 1 == num_blocks || histogram_symbols[i] != histogram_symbols[i + 1]) { const uint8_t id = (uint8_t)new_index[histogram_symbols[i]]; split->types[block_idx] = id; split->lengths[block_idx] = cur_length; max_type = BROTLI_MAX(uint8_t, max_type, id); cur_length = 0; ++block_idx; } } split->num_blocks = block_idx; split->num_types = (size_t)max_type + 1; } BROTLI_FREE(m, new_index); BROTLI_FREE(m, block_lengths); BROTLI_FREE(m, histogram_symbols); } static void FN(SplitByteVector)(MemoryManager* m, const DataType* data, const size_t length, const size_t literals_per_histogram, const size_t max_histograms, const size_t sampling_stride_length, const double block_switch_cost, const BrotliEncoderParams* params, BlockSplit* split) { const size_t data_size = FN(HistogramDataSize)(); size_t num_histograms = length / literals_per_histogram + 1; HistogramType* histograms; if (num_histograms > max_histograms) { num_histograms = max_histograms; } if (length == 0) { split->num_types = 1; return; } else if (length < kMinLengthForBlockSplitting) { BROTLI_ENSURE_CAPACITY(m, uint8_t, split->types, split->types_alloc_size, split->num_blocks + 1); BROTLI_ENSURE_CAPACITY(m, uint32_t, split->lengths, split->lengths_alloc_size, split->num_blocks + 1); if (BROTLI_IS_OOM(m)) return; split->num_types = 1; split->types[split->num_blocks] = 0; split->lengths[split->num_blocks] = (uint32_t)length; split->num_blocks++; return; } histograms = BROTLI_ALLOC(m, HistogramType, num_histograms); if (BROTLI_IS_OOM(m)) return; /* Find good entropy codes. */ FN(InitialEntropyCodes)(data, length, sampling_stride_length, num_histograms, histograms); FN(RefineEntropyCodes)(data, length, sampling_stride_length, num_histograms, histograms); { /* Find a good path through literals with the good entropy codes. */ uint8_t* block_ids = BROTLI_ALLOC(m, uint8_t, length); size_t num_blocks = 0; const size_t bitmaplen = (num_histograms + 7) >> 3; double* insert_cost = BROTLI_ALLOC(m, double, data_size * num_histograms); double* cost = BROTLI_ALLOC(m, double, num_histograms); uint8_t* switch_signal = BROTLI_ALLOC(m, uint8_t, length * bitmaplen); uint16_t* new_id = BROTLI_ALLOC(m, uint16_t, num_histograms); const size_t iters = params->quality < HQ_ZOPFLIFICATION_QUALITY ? 3 : 10; size_t i; if (BROTLI_IS_OOM(m)) return; for (i = 0; i < iters; ++i) { num_blocks = FN(FindBlocks)(data, length, block_switch_cost, num_histograms, histograms, insert_cost, cost, switch_signal, block_ids); num_histograms = FN(RemapBlockIds)(block_ids, length, new_id, num_histograms); FN(BuildBlockHistograms)(data, length, block_ids, num_histograms, histograms); } BROTLI_FREE(m, insert_cost); BROTLI_FREE(m, cost); BROTLI_FREE(m, switch_signal); BROTLI_FREE(m, new_id); BROTLI_FREE(m, histograms); FN(ClusterBlocks)(m, data, length, num_blocks, block_ids, split); if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, block_ids); } } #undef HistogramType dvisvgm-2.8.1/libs/brotli/enc/entropy_encode.h0000664000175000017500000000771313510660062016312 00000000000000/* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Entropy encoding (Huffman) utilities. */ #ifndef BROTLI_ENC_ENTROPY_ENCODE_H_ #define BROTLI_ENC_ENTROPY_ENCODE_H_ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* A node of a Huffman tree. */ typedef struct HuffmanTree { uint32_t total_count_; int16_t index_left_; int16_t index_right_or_value_; } HuffmanTree; static BROTLI_INLINE void InitHuffmanTree(HuffmanTree* self, uint32_t count, int16_t left, int16_t right) { self->total_count_ = count; self->index_left_ = left; self->index_right_or_value_ = right; } /* Returns 1 is assignment of depths succeeded, otherwise 0. */ BROTLI_INTERNAL BROTLI_BOOL BrotliSetDepth( int p, HuffmanTree* pool, uint8_t* depth, int max_depth); /* This function will create a Huffman tree. The (data,length) contains the population counts. The tree_limit is the maximum bit depth of the Huffman codes. The depth contains the tree, i.e., how many bits are used for the symbol. The actual Huffman tree is constructed in the tree[] array, which has to be at least 2 * length + 1 long. See http://en.wikipedia.org/wiki/Huffman_coding */ BROTLI_INTERNAL void BrotliCreateHuffmanTree(const uint32_t* data, const size_t length, const int tree_limit, HuffmanTree* tree, uint8_t* depth); /* Change the population counts in a way that the consequent Huffman tree compression, especially its RLE-part will be more likely to compress this data more efficiently. length contains the size of the histogram. counts contains the population counts. good_for_rle is a buffer of at least length size */ BROTLI_INTERNAL void BrotliOptimizeHuffmanCountsForRle( size_t length, uint32_t* counts, uint8_t* good_for_rle); /* Write a Huffman tree from bit depths into the bit-stream representation of a Huffman tree. The generated Huffman tree is to be compressed once more using a Huffman tree */ BROTLI_INTERNAL void BrotliWriteHuffmanTree(const uint8_t* depth, size_t num, size_t* tree_size, uint8_t* tree, uint8_t* extra_bits_data); /* Get the actual bit values for a tree of bit depths. */ BROTLI_INTERNAL void BrotliConvertBitDepthsToSymbols(const uint8_t* depth, size_t len, uint16_t* bits); /* Input size optimized Shell sort. */ typedef BROTLI_BOOL (*HuffmanTreeComparator)( const HuffmanTree*, const HuffmanTree*); static BROTLI_INLINE void SortHuffmanTreeItems(HuffmanTree* items, const size_t n, HuffmanTreeComparator comparator) { static const size_t gaps[] = {132, 57, 23, 10, 4, 1}; if (n < 13) { /* Insertion sort. */ size_t i; for (i = 1; i < n; ++i) { HuffmanTree tmp = items[i]; size_t k = i; size_t j = i - 1; while (comparator(&tmp, &items[j])) { items[k] = items[j]; k = j; if (!j--) break; } items[k] = tmp; } return; } else { /* Shell sort. */ int g = n < 57 ? 2 : 0; for (; g < 6; ++g) { size_t gap = gaps[g]; size_t i; for (i = gap; i < n; ++i) { size_t j = i; HuffmanTree tmp = items[i]; for (; j >= gap && comparator(&tmp, &items[j - gap]); j -= gap) { items[j] = items[j - gap]; } items[j] = tmp; } } } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_ENTROPY_ENCODE_H_ */ dvisvgm-2.8.1/libs/brotli/enc/hash_rolling_inc.h0000664000175000017500000001631013510660062016570 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2018 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, JUMP, NUMBUCKETS, MASK, CHUNKLEN */ /* NUMBUCKETS / (MASK + 1) = probability of storing and using hash code. */ /* JUMP = skip bytes for speedup */ /* Rolling hash for long distance long string matches. Stores one position per bucket, bucket key is computed over a long region. */ #define HashRolling HASHER() static const uint32_t FN(kRollingHashMul32) = 69069; static const uint32_t FN(kInvalidPos) = 0xffffffff; /* This hasher uses a longer forward length, but returning a higher value here will hurt compression by the main hasher when combined with a composite hasher. The hasher tests for forward itself instead. */ static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; } /* Computes a code from a single byte. A lookup table of 256 values could be used, but simply adding 1 works about as good. */ static uint32_t FN(HashByte)(uint8_t byte) { return (uint32_t)byte + 1u; } static uint32_t FN(HashRollingFunctionInitial)(uint32_t state, uint8_t add, uint32_t factor) { return (uint32_t)(factor * state + FN(HashByte)(add)); } static uint32_t FN(HashRollingFunction)(uint32_t state, uint8_t add, uint8_t rem, uint32_t factor, uint32_t factor_remove) { return (uint32_t)(factor * state + FN(HashByte)(add) - factor_remove * FN(HashByte)(rem)); } typedef struct HashRolling { uint32_t state; uint32_t* table; size_t next_ix; uint32_t chunk_len; uint32_t factor; uint32_t factor_remove; } HashRolling; static BROTLI_INLINE HashRolling* FN(Self)(HasherHandle handle) { return (HashRolling*)&(GetHasherCommon(handle)[1]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { HashRolling* self = FN(Self)(handle); size_t i; self->state = 0; self->next_ix = 0; self->factor = FN(kRollingHashMul32); /* Compute the factor of the oldest byte to remove: factor**steps modulo 0xffffffff (the multiplications rely on 32-bit overflow) */ self->factor_remove = 1; for (i = 0; i < CHUNKLEN; i += JUMP) { self->factor_remove *= self->factor; } self->table = (uint32_t*)((HasherHandle)self + sizeof(HashRolling)); for (i = 0; i < NUMBUCKETS; i++) { self->table[i] = FN(kInvalidPos); } BROTLI_UNUSED(params); } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashRolling* self = FN(Self)(handle); size_t i; /* Too small size, cannot use this hasher. */ if (input_size < CHUNKLEN) return; self->state = 0; for (i = 0; i < CHUNKLEN; i += JUMP) { self->state = FN(HashRollingFunctionInitial)( self->state, data[i], self->factor); } BROTLI_UNUSED(one_shot); } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { return sizeof(HashRolling) + NUMBUCKETS * sizeof(uint32_t); BROTLI_UNUSED(params); BROTLI_UNUSED(one_shot); BROTLI_UNUSED(input_size); } static BROTLI_INLINE void FN(Store)(HasherHandle BROTLI_RESTRICT handle, const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) { BROTLI_UNUSED(handle); BROTLI_UNUSED(data); BROTLI_UNUSED(mask); BROTLI_UNUSED(ix); } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { BROTLI_UNUSED(handle); BROTLI_UNUSED(data); BROTLI_UNUSED(mask); BROTLI_UNUSED(ix_start); BROTLI_UNUSED(ix_end); } static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ring_buffer_mask) { /* In this case we must re-initialize the hasher from scratch from the current position. */ HashRolling* self = FN(Self)(handle); size_t position_masked; size_t available = num_bytes; if ((position & (JUMP - 1)) != 0) { size_t diff = JUMP - (position & (JUMP - 1)); available = (diff > available) ? 0 : (available - diff); position += diff; } position_masked = position & ring_buffer_mask; /* wrapping around ringbuffer not handled. */ if (available > ring_buffer_mask - position_masked) { available = ring_buffer_mask - position_masked; } FN(Prepare)(handle, BROTLI_FALSE, available, ringbuffer + (position & ring_buffer_mask)); self->next_ix = position; BROTLI_UNUSED(num_bytes); } static BROTLI_INLINE void FN(PrepareDistanceCache)( HasherHandle handle, int* BROTLI_RESTRICT distance_cache) { BROTLI_UNUSED(handle); BROTLI_UNUSED(distance_cache); } static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) { HashRolling* self = FN(Self)(handle); const size_t cur_ix_masked = cur_ix & ring_buffer_mask; size_t pos = self->next_ix; if ((cur_ix & (JUMP - 1)) != 0) return; /* Not enough lookahead */ if (max_length < CHUNKLEN) return; for (pos = self->next_ix; pos <= cur_ix; pos += JUMP) { uint32_t code = self->state & MASK; uint8_t rem = data[pos & ring_buffer_mask]; uint8_t add = data[(pos + CHUNKLEN) & ring_buffer_mask]; size_t found_ix = FN(kInvalidPos); self->state = FN(HashRollingFunction)( self->state, add, rem, self->factor, self->factor_remove); if (code < NUMBUCKETS) { found_ix = self->table[code]; self->table[code] = (uint32_t)pos; if (pos == cur_ix && found_ix != FN(kInvalidPos)) { /* The cast to 32-bit makes backward distances up to 4GB work even if cur_ix is above 4GB, despite using 32-bit values in the table. */ size_t backward = (uint32_t)(cur_ix - found_ix); if (backward <= max_backward) { const size_t found_ix_masked = found_ix & ring_buffer_mask; const size_t len = FindMatchLengthWithLimit(&data[found_ix_masked], &data[cur_ix_masked], max_length); if (len >= 4 && len > out->len) { score_t score = BackwardReferenceScore(len, backward); if (score > out->score) { out->len = len; out->distance = backward; out->score = score; out->len_code_delta = 0; } } } } } } self->next_ix = cur_ix + JUMP; /* NOTE: this hasher does not search in the dictionary. It is used as backup-hasher, the main hasher already searches in it. */ BROTLI_UNUSED(dictionary); BROTLI_UNUSED(distance_cache); BROTLI_UNUSED(gap); BROTLI_UNUSED(max_distance); } #undef HashRolling dvisvgm-2.8.1/libs/brotli/enc/backward_references_hq.c0000664000175000017500000007517513510660062017746 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function to find backward reference copies. */ #include "./backward_references_hq.h" #include /* memcpy, memset */ #include "../common/constants.h" #include "../common/platform.h" #include #include "./command.h" #include "./fast_log.h" #include "./find_match_length.h" #include "./literal_cost.h" #include "./memory.h" #include "./params.h" #include "./prefix.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE 544 static const float kInfinity = 1.7e38f; /* ~= 2 ^ 127 */ static const uint32_t kDistanceCacheIndex[] = { 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, }; static const int kDistanceCacheOffset[] = { 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3 }; void BrotliInitZopfliNodes(ZopfliNode* array, size_t length) { ZopfliNode stub; size_t i; stub.length = 1; stub.distance = 0; stub.dcode_insert_length = 0; stub.u.cost = kInfinity; for (i = 0; i < length; ++i) array[i] = stub; } static BROTLI_INLINE uint32_t ZopfliNodeCopyLength(const ZopfliNode* self) { return self->length & 0x1FFFFFF; } static BROTLI_INLINE uint32_t ZopfliNodeLengthCode(const ZopfliNode* self) { const uint32_t modifier = self->length >> 25; return ZopfliNodeCopyLength(self) + 9u - modifier; } static BROTLI_INLINE uint32_t ZopfliNodeCopyDistance(const ZopfliNode* self) { return self->distance; } static BROTLI_INLINE uint32_t ZopfliNodeDistanceCode(const ZopfliNode* self) { const uint32_t short_code = self->dcode_insert_length >> 27; return short_code == 0 ? ZopfliNodeCopyDistance(self) + BROTLI_NUM_DISTANCE_SHORT_CODES - 1 : short_code - 1; } static BROTLI_INLINE uint32_t ZopfliNodeCommandLength(const ZopfliNode* self) { return ZopfliNodeCopyLength(self) + (self->dcode_insert_length & 0x7FFFFFF); } /* Histogram based cost model for zopflification. */ typedef struct ZopfliCostModel { /* The insert and copy length symbols. */ float cost_cmd_[BROTLI_NUM_COMMAND_SYMBOLS]; float* cost_dist_; uint32_t distance_histogram_size; /* Cumulative costs of literals per position in the stream. */ float* literal_costs_; float min_cost_cmd_; size_t num_bytes_; } ZopfliCostModel; static void InitZopfliCostModel( MemoryManager* m, ZopfliCostModel* self, const BrotliDistanceParams* dist, size_t num_bytes) { uint32_t distance_histogram_size = dist->alphabet_size; if (distance_histogram_size > BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE) { distance_histogram_size = BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE; } self->num_bytes_ = num_bytes; self->literal_costs_ = BROTLI_ALLOC(m, float, num_bytes + 2); self->cost_dist_ = BROTLI_ALLOC(m, float, dist->alphabet_size); self->distance_histogram_size = distance_histogram_size; if (BROTLI_IS_OOM(m)) return; } static void CleanupZopfliCostModel(MemoryManager* m, ZopfliCostModel* self) { BROTLI_FREE(m, self->literal_costs_); BROTLI_FREE(m, self->cost_dist_); } static void SetCost(const uint32_t* histogram, size_t histogram_size, BROTLI_BOOL literal_histogram, float* cost) { size_t sum = 0; size_t missing_symbol_sum; float log2sum; float missing_symbol_cost; size_t i; for (i = 0; i < histogram_size; i++) { sum += histogram[i]; } log2sum = (float)FastLog2(sum); missing_symbol_sum = sum; if (!literal_histogram) { for (i = 0; i < histogram_size; i++) { if (histogram[i] == 0) missing_symbol_sum++; } } missing_symbol_cost = (float)FastLog2(missing_symbol_sum) + 2; for (i = 0; i < histogram_size; i++) { if (histogram[i] == 0) { cost[i] = missing_symbol_cost; continue; } /* Shannon bits for this symbol. */ cost[i] = log2sum - (float)FastLog2(histogram[i]); /* Cannot be coded with less than 1 bit */ if (cost[i] < 1) cost[i] = 1; } } static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const Command* commands, size_t num_commands, size_t last_insert_len) { uint32_t histogram_literal[BROTLI_NUM_LITERAL_SYMBOLS]; uint32_t histogram_cmd[BROTLI_NUM_COMMAND_SYMBOLS]; uint32_t histogram_dist[BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE]; float cost_literal[BROTLI_NUM_LITERAL_SYMBOLS]; size_t pos = position - last_insert_len; float min_cost_cmd = kInfinity; size_t i; float* cost_cmd = self->cost_cmd_; memset(histogram_literal, 0, sizeof(histogram_literal)); memset(histogram_cmd, 0, sizeof(histogram_cmd)); memset(histogram_dist, 0, sizeof(histogram_dist)); for (i = 0; i < num_commands; i++) { size_t inslength = commands[i].insert_len_; size_t copylength = CommandCopyLen(&commands[i]); size_t distcode = commands[i].dist_prefix_ & 0x3FF; size_t cmdcode = commands[i].cmd_prefix_; size_t j; histogram_cmd[cmdcode]++; if (cmdcode >= 128) histogram_dist[distcode]++; for (j = 0; j < inslength; j++) { histogram_literal[ringbuffer[(pos + j) & ringbuffer_mask]]++; } pos += inslength + copylength; } SetCost(histogram_literal, BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_TRUE, cost_literal); SetCost(histogram_cmd, BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_FALSE, cost_cmd); SetCost(histogram_dist, self->distance_histogram_size, BROTLI_FALSE, self->cost_dist_); for (i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; ++i) { min_cost_cmd = BROTLI_MIN(float, min_cost_cmd, cost_cmd[i]); } self->min_cost_cmd_ = min_cost_cmd; { float* literal_costs = self->literal_costs_; float literal_carry = 0.0; size_t num_bytes = self->num_bytes_; literal_costs[0] = 0.0; for (i = 0; i < num_bytes; ++i) { literal_carry += cost_literal[ringbuffer[(position + i) & ringbuffer_mask]]; literal_costs[i + 1] = literal_costs[i] + literal_carry; literal_carry -= literal_costs[i + 1] - literal_costs[i]; } } } static void ZopfliCostModelSetFromLiteralCosts(ZopfliCostModel* self, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask) { float* literal_costs = self->literal_costs_; float literal_carry = 0.0; float* cost_dist = self->cost_dist_; float* cost_cmd = self->cost_cmd_; size_t num_bytes = self->num_bytes_; size_t i; BrotliEstimateBitCostsForLiterals(position, num_bytes, ringbuffer_mask, ringbuffer, &literal_costs[1]); literal_costs[0] = 0.0; for (i = 0; i < num_bytes; ++i) { literal_carry += literal_costs[i + 1]; literal_costs[i + 1] = literal_costs[i] + literal_carry; literal_carry -= literal_costs[i + 1] - literal_costs[i]; } for (i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; ++i) { cost_cmd[i] = (float)FastLog2(11 + (uint32_t)i); } for (i = 0; i < self->distance_histogram_size; ++i) { cost_dist[i] = (float)FastLog2(20 + (uint32_t)i); } self->min_cost_cmd_ = (float)FastLog2(11); } static BROTLI_INLINE float ZopfliCostModelGetCommandCost( const ZopfliCostModel* self, uint16_t cmdcode) { return self->cost_cmd_[cmdcode]; } static BROTLI_INLINE float ZopfliCostModelGetDistanceCost( const ZopfliCostModel* self, size_t distcode) { return self->cost_dist_[distcode]; } static BROTLI_INLINE float ZopfliCostModelGetLiteralCosts( const ZopfliCostModel* self, size_t from, size_t to) { return self->literal_costs_[to] - self->literal_costs_[from]; } static BROTLI_INLINE float ZopfliCostModelGetMinCostCmd( const ZopfliCostModel* self) { return self->min_cost_cmd_; } /* REQUIRES: len >= 2, start_pos <= pos */ /* REQUIRES: cost < kInfinity, nodes[start_pos].cost < kInfinity */ /* Maintains the "ZopfliNode array invariant". */ static BROTLI_INLINE void UpdateZopfliNode(ZopfliNode* nodes, size_t pos, size_t start_pos, size_t len, size_t len_code, size_t dist, size_t short_code, float cost) { ZopfliNode* next = &nodes[pos + len]; next->length = (uint32_t)(len | ((len + 9u - len_code) << 25)); next->distance = (uint32_t)dist; next->dcode_insert_length = (uint32_t)( (short_code << 27) | (pos - start_pos)); next->u.cost = cost; } typedef struct PosData { size_t pos; int distance_cache[4]; float costdiff; float cost; } PosData; /* Maintains the smallest 8 cost difference together with their positions */ typedef struct StartPosQueue { PosData q_[8]; size_t idx_; } StartPosQueue; static BROTLI_INLINE void InitStartPosQueue(StartPosQueue* self) { self->idx_ = 0; } static size_t StartPosQueueSize(const StartPosQueue* self) { return BROTLI_MIN(size_t, self->idx_, 8); } static void StartPosQueuePush(StartPosQueue* self, const PosData* posdata) { size_t offset = ~(self->idx_++) & 7; size_t len = StartPosQueueSize(self); size_t i; PosData* q = self->q_; q[offset] = *posdata; /* Restore the sorted order. In the list of |len| items at most |len - 1| adjacent element comparisons / swaps are required. */ for (i = 1; i < len; ++i) { if (q[offset & 7].costdiff > q[(offset + 1) & 7].costdiff) { BROTLI_SWAP(PosData, q, offset & 7, (offset + 1) & 7); } ++offset; } } static const PosData* StartPosQueueAt(const StartPosQueue* self, size_t k) { return &self->q_[(k - self->idx_) & 7]; } /* Returns the minimum possible copy length that can improve the cost of any */ /* future position. */ static size_t ComputeMinimumCopyLength(const float start_cost, const ZopfliNode* nodes, const size_t num_bytes, const size_t pos) { /* Compute the minimum possible cost of reaching any future position. */ float min_cost = start_cost; size_t len = 2; size_t next_len_bucket = 4; size_t next_len_offset = 10; while (pos + len <= num_bytes && nodes[pos + len].u.cost <= min_cost) { /* We already reached (pos + len) with no more cost than the minimum possible cost of reaching anything from this pos, so there is no point in looking for lengths <= len. */ ++len; if (len == next_len_offset) { /* We reached the next copy length code bucket, so we add one more extra bit to the minimum cost. */ min_cost += 1.0f; next_len_offset += next_len_bucket; next_len_bucket *= 2; } } return len; } /* REQUIRES: nodes[pos].cost < kInfinity REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */ static uint32_t ComputeDistanceShortcut(const size_t block_start, const size_t pos, const size_t max_backward_limit, const size_t gap, const ZopfliNode* nodes) { const size_t clen = ZopfliNodeCopyLength(&nodes[pos]); const size_t ilen = nodes[pos].dcode_insert_length & 0x7FFFFFF; const size_t dist = ZopfliNodeCopyDistance(&nodes[pos]); /* Since |block_start + pos| is the end position of the command, the copy part starts from |block_start + pos - clen|. Distances that are greater than this or greater than |max_backward_limit| + |gap| are static dictionary references, and do not update the last distances. Also distance code 0 (last distance) does not update the last distances. */ if (pos == 0) { return 0; } else if (dist + clen <= block_start + pos + gap && dist <= max_backward_limit + gap && ZopfliNodeDistanceCode(&nodes[pos]) > 0) { return (uint32_t)pos; } else { return nodes[pos - clen - ilen].u.shortcut; } } /* Fills in dist_cache[0..3] with the last four distances (as defined by Section 4. of the Spec) that would be used at (block_start + pos) if we used the shortest path of commands from block_start, computed from nodes[0..pos]. The last four distances at block_start are in starting_dist_cache[0..3]. REQUIRES: nodes[pos].cost < kInfinity REQUIRES: nodes[0..pos] satisfies that "ZopfliNode array invariant". */ static void ComputeDistanceCache(const size_t pos, const int* starting_dist_cache, const ZopfliNode* nodes, int* dist_cache) { int idx = 0; size_t p = nodes[pos].u.shortcut; while (idx < 4 && p > 0) { const size_t ilen = nodes[p].dcode_insert_length & 0x7FFFFFF; const size_t clen = ZopfliNodeCopyLength(&nodes[p]); const size_t dist = ZopfliNodeCopyDistance(&nodes[p]); dist_cache[idx++] = (int)dist; /* Because of prerequisite, p >= clen + ilen >= 2. */ p = nodes[p - clen - ilen].u.shortcut; } for (; idx < 4; ++idx) { dist_cache[idx] = *starting_dist_cache++; } } /* Maintains "ZopfliNode array invariant" and pushes node to the queue, if it is eligible. */ static void EvaluateNode( const size_t block_start, const size_t pos, const size_t max_backward_limit, const size_t gap, const int* starting_dist_cache, const ZopfliCostModel* model, StartPosQueue* queue, ZopfliNode* nodes) { /* Save cost, because ComputeDistanceCache invalidates it. */ float node_cost = nodes[pos].u.cost; nodes[pos].u.shortcut = ComputeDistanceShortcut( block_start, pos, max_backward_limit, gap, nodes); if (node_cost <= ZopfliCostModelGetLiteralCosts(model, 0, pos)) { PosData posdata; posdata.pos = pos; posdata.cost = node_cost; posdata.costdiff = node_cost - ZopfliCostModelGetLiteralCosts(model, 0, pos); ComputeDistanceCache( pos, starting_dist_cache, nodes, posdata.distance_cache); StartPosQueuePush(queue, &posdata); } } /* Returns longest copy length. */ static size_t UpdateNodes( const size_t num_bytes, const size_t block_start, const size_t pos, const uint8_t* ringbuffer, const size_t ringbuffer_mask, const BrotliEncoderParams* params, const size_t max_backward_limit, const int* starting_dist_cache, const size_t num_matches, const BackwardMatch* matches, const ZopfliCostModel* model, StartPosQueue* queue, ZopfliNode* nodes) { const size_t cur_ix = block_start + pos; const size_t cur_ix_masked = cur_ix & ringbuffer_mask; const size_t max_distance = BROTLI_MIN(size_t, cur_ix, max_backward_limit); const size_t max_len = num_bytes - pos; const size_t max_zopfli_len = MaxZopfliLen(params); const size_t max_iters = MaxZopfliCandidates(params); size_t min_len; size_t result = 0; size_t k; size_t gap = 0; EvaluateNode(block_start, pos, max_backward_limit, gap, starting_dist_cache, model, queue, nodes); { const PosData* posdata = StartPosQueueAt(queue, 0); float min_cost = (posdata->cost + ZopfliCostModelGetMinCostCmd(model) + ZopfliCostModelGetLiteralCosts(model, posdata->pos, pos)); min_len = ComputeMinimumCopyLength(min_cost, nodes, num_bytes, pos); } /* Go over the command starting positions in order of increasing cost difference. */ for (k = 0; k < max_iters && k < StartPosQueueSize(queue); ++k) { const PosData* posdata = StartPosQueueAt(queue, k); const size_t start = posdata->pos; const uint16_t inscode = GetInsertLengthCode(pos - start); const float start_costdiff = posdata->costdiff; const float base_cost = start_costdiff + (float)GetInsertExtra(inscode) + ZopfliCostModelGetLiteralCosts(model, 0, pos); /* Look for last distance matches using the distance cache from this starting position. */ size_t best_len = min_len - 1; size_t j = 0; for (; j < BROTLI_NUM_DISTANCE_SHORT_CODES && best_len < max_len; ++j) { const size_t idx = kDistanceCacheIndex[j]; const size_t backward = (size_t)(posdata->distance_cache[idx] + kDistanceCacheOffset[j]); size_t prev_ix = cur_ix - backward; size_t len = 0; uint8_t continuation = ringbuffer[cur_ix_masked + best_len]; if (cur_ix_masked + best_len > ringbuffer_mask) { break; } if (BROTLI_PREDICT_FALSE(backward > max_distance + gap)) { /* Word dictionary -> ignore. */ continue; } if (backward <= max_distance) { /* Regular backward reference. */ if (prev_ix >= cur_ix) { continue; } prev_ix &= ringbuffer_mask; if (prev_ix + best_len > ringbuffer_mask || continuation != ringbuffer[prev_ix + best_len]) { continue; } len = FindMatchLengthWithLimit(&ringbuffer[prev_ix], &ringbuffer[cur_ix_masked], max_len); } else { continue; } { const float dist_cost = base_cost + ZopfliCostModelGetDistanceCost(model, j); size_t l; for (l = best_len + 1; l <= len; ++l) { const uint16_t copycode = GetCopyLengthCode(l); const uint16_t cmdcode = CombineLengthCodes(inscode, copycode, j == 0); const float cost = (cmdcode < 128 ? base_cost : dist_cost) + (float)GetCopyExtra(copycode) + ZopfliCostModelGetCommandCost(model, cmdcode); if (cost < nodes[pos + l].u.cost) { UpdateZopfliNode(nodes, pos, start, l, l, backward, j + 1, cost); result = BROTLI_MAX(size_t, result, l); } best_len = l; } } } /* At higher iterations look only for new last distance matches, since looking only for new command start positions with the same distances does not help much. */ if (k >= 2) continue; { /* Loop through all possible copy lengths at this position. */ size_t len = min_len; for (j = 0; j < num_matches; ++j) { BackwardMatch match = matches[j]; size_t dist = match.distance; BROTLI_BOOL is_dictionary_match = TO_BROTLI_BOOL(dist > max_distance + gap); /* We already tried all possible last distance matches, so we can use normal distance code here. */ size_t dist_code = dist + BROTLI_NUM_DISTANCE_SHORT_CODES - 1; uint16_t dist_symbol; uint32_t distextra; uint32_t distnumextra; float dist_cost; size_t max_match_len; PrefixEncodeCopyDistance( dist_code, params->dist.num_direct_distance_codes, params->dist.distance_postfix_bits, &dist_symbol, &distextra); distnumextra = dist_symbol >> 10; dist_cost = base_cost + (float)distnumextra + ZopfliCostModelGetDistanceCost(model, dist_symbol & 0x3FF); /* Try all copy lengths up until the maximum copy length corresponding to this distance. If the distance refers to the static dictionary, or the maximum length is long enough, try only one maximum length. */ max_match_len = BackwardMatchLength(&match); if (len < max_match_len && (is_dictionary_match || max_match_len > max_zopfli_len)) { len = max_match_len; } for (; len <= max_match_len; ++len) { const size_t len_code = is_dictionary_match ? BackwardMatchLengthCode(&match) : len; const uint16_t copycode = GetCopyLengthCode(len_code); const uint16_t cmdcode = CombineLengthCodes(inscode, copycode, 0); const float cost = dist_cost + (float)GetCopyExtra(copycode) + ZopfliCostModelGetCommandCost(model, cmdcode); if (cost < nodes[pos + len].u.cost) { UpdateZopfliNode(nodes, pos, start, len, len_code, dist, 0, cost); result = BROTLI_MAX(size_t, result, len); } } } } } return result; } static size_t ComputeShortestPathFromNodes(size_t num_bytes, ZopfliNode* nodes) { size_t index = num_bytes; size_t num_commands = 0; while ((nodes[index].dcode_insert_length & 0x7FFFFFF) == 0 && nodes[index].length == 1) --index; nodes[index].u.next = BROTLI_UINT32_MAX; while (index != 0) { size_t len = ZopfliNodeCommandLength(&nodes[index]); index -= len; nodes[index].u.next = (uint32_t)len; num_commands++; } return num_commands; } /* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */ void BrotliZopfliCreateCommands(const size_t num_bytes, const size_t block_start, const ZopfliNode* nodes, int* dist_cache, size_t* last_insert_len, const BrotliEncoderParams* params, Command* commands, size_t* num_literals) { const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin); size_t pos = 0; uint32_t offset = nodes[0].u.next; size_t i; size_t gap = 0; for (i = 0; offset != BROTLI_UINT32_MAX; i++) { const ZopfliNode* next = &nodes[pos + offset]; size_t copy_length = ZopfliNodeCopyLength(next); size_t insert_length = next->dcode_insert_length & 0x7FFFFFF; pos += insert_length; offset = next->u.next; if (i == 0) { insert_length += *last_insert_len; *last_insert_len = 0; } { size_t distance = ZopfliNodeCopyDistance(next); size_t len_code = ZopfliNodeLengthCode(next); size_t max_distance = BROTLI_MIN(size_t, block_start + pos, max_backward_limit); BROTLI_BOOL is_dictionary = TO_BROTLI_BOOL(distance > max_distance + gap); size_t dist_code = ZopfliNodeDistanceCode(next); InitCommand(&commands[i], ¶ms->dist, insert_length, copy_length, (int)len_code - (int)copy_length, dist_code); if (!is_dictionary && dist_code > 0) { dist_cache[3] = dist_cache[2]; dist_cache[2] = dist_cache[1]; dist_cache[1] = dist_cache[0]; dist_cache[0] = (int)distance; } } *num_literals += insert_length; pos += copy_length; } *last_insert_len += num_bytes - pos; } static size_t ZopfliIterate(size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, const size_t gap, const int* dist_cache, const ZopfliCostModel* model, const uint32_t* num_matches, const BackwardMatch* matches, ZopfliNode* nodes) { const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin); const size_t max_zopfli_len = MaxZopfliLen(params); StartPosQueue queue; size_t cur_match_pos = 0; size_t i; nodes[0].length = 0; nodes[0].u.cost = 0; InitStartPosQueue(&queue); for (i = 0; i + 3 < num_bytes; i++) { size_t skip = UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches[i], &matches[cur_match_pos], model, &queue, nodes); if (skip < BROTLI_LONG_COPY_QUICK_STEP) skip = 0; cur_match_pos += num_matches[i]; if (num_matches[i] == 1 && BackwardMatchLength(&matches[cur_match_pos - 1]) > max_zopfli_len) { skip = BROTLI_MAX(size_t, BackwardMatchLength(&matches[cur_match_pos - 1]), skip); } if (skip > 1) { skip--; while (skip) { i++; if (i + 3 >= num_bytes) break; EvaluateNode(position, i, max_backward_limit, gap, dist_cache, model, &queue, nodes); cur_match_pos += num_matches[i]; skip--; } } } return ComputeShortestPathFromNodes(num_bytes, nodes); } /* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */ size_t BrotliZopfliComputeShortestPath(MemoryManager* m, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, const int* dist_cache, HasherHandle hasher, ZopfliNode* nodes) { const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin); const size_t max_zopfli_len = MaxZopfliLen(params); ZopfliCostModel model; StartPosQueue queue; BackwardMatch matches[2 * (MAX_NUM_MATCHES_H10 + 64)]; const size_t store_end = num_bytes >= StoreLookaheadH10() ? position + num_bytes - StoreLookaheadH10() + 1 : position; size_t i; size_t gap = 0; size_t lz_matches_offset = 0; nodes[0].length = 0; nodes[0].u.cost = 0; InitZopfliCostModel(m, &model, ¶ms->dist, num_bytes); if (BROTLI_IS_OOM(m)) return 0; ZopfliCostModelSetFromLiteralCosts( &model, position, ringbuffer, ringbuffer_mask); InitStartPosQueue(&queue); for (i = 0; i + HashTypeLengthH10() - 1 < num_bytes; i++) { const size_t pos = position + i; const size_t max_distance = BROTLI_MIN(size_t, pos, max_backward_limit); size_t skip; size_t num_matches; num_matches = FindAllMatchesH10(hasher, ¶ms->dictionary, ringbuffer, ringbuffer_mask, pos, num_bytes - i, max_distance, gap, params, &matches[lz_matches_offset]); if (num_matches > 0 && BackwardMatchLength(&matches[num_matches - 1]) > max_zopfli_len) { matches[0] = matches[num_matches - 1]; num_matches = 1; } skip = UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask, params, max_backward_limit, dist_cache, num_matches, matches, &model, &queue, nodes); if (skip < BROTLI_LONG_COPY_QUICK_STEP) skip = 0; if (num_matches == 1 && BackwardMatchLength(&matches[0]) > max_zopfli_len) { skip = BROTLI_MAX(size_t, BackwardMatchLength(&matches[0]), skip); } if (skip > 1) { /* Add the tail of the copy to the hasher. */ StoreRangeH10(hasher, ringbuffer, ringbuffer_mask, pos + 1, BROTLI_MIN( size_t, pos + skip, store_end)); skip--; while (skip) { i++; if (i + HashTypeLengthH10() - 1 >= num_bytes) break; EvaluateNode(position, i, max_backward_limit, gap, dist_cache, &model, &queue, nodes); skip--; } } } CleanupZopfliCostModel(m, &model); return ComputeShortestPathFromNodes(num_bytes, nodes); } void BrotliCreateZopfliBackwardReferences(MemoryManager* m, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals) { ZopfliNode* nodes; nodes = BROTLI_ALLOC(m, ZopfliNode, num_bytes + 1); if (BROTLI_IS_OOM(m)) return; BrotliInitZopfliNodes(nodes, num_bytes + 1); *num_commands += BrotliZopfliComputeShortestPath(m, num_bytes, position, ringbuffer, ringbuffer_mask, params, dist_cache, hasher, nodes); if (BROTLI_IS_OOM(m)) return; BrotliZopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals); BROTLI_FREE(m, nodes); } void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask, const BrotliEncoderParams* params, HasherHandle hasher, int* dist_cache, size_t* last_insert_len, Command* commands, size_t* num_commands, size_t* num_literals) { const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin); uint32_t* num_matches = BROTLI_ALLOC(m, uint32_t, num_bytes); size_t matches_size = 4 * num_bytes; const size_t store_end = num_bytes >= StoreLookaheadH10() ? position + num_bytes - StoreLookaheadH10() + 1 : position; size_t cur_match_pos = 0; size_t i; size_t orig_num_literals; size_t orig_last_insert_len; int orig_dist_cache[4]; size_t orig_num_commands; ZopfliCostModel model; ZopfliNode* nodes; BackwardMatch* matches = BROTLI_ALLOC(m, BackwardMatch, matches_size); size_t gap = 0; size_t shadow_matches = 0; if (BROTLI_IS_OOM(m)) return; for (i = 0; i + HashTypeLengthH10() - 1 < num_bytes; ++i) { const size_t pos = position + i; size_t max_distance = BROTLI_MIN(size_t, pos, max_backward_limit); size_t max_length = num_bytes - i; size_t num_found_matches; size_t cur_match_end; size_t j; /* Ensure that we have enough free slots. */ BROTLI_ENSURE_CAPACITY(m, BackwardMatch, matches, matches_size, cur_match_pos + MAX_NUM_MATCHES_H10 + shadow_matches); if (BROTLI_IS_OOM(m)) return; num_found_matches = FindAllMatchesH10(hasher, ¶ms->dictionary, ringbuffer, ringbuffer_mask, pos, max_length, max_distance, gap, params, &matches[cur_match_pos + shadow_matches]); cur_match_end = cur_match_pos + num_found_matches; for (j = cur_match_pos; j + 1 < cur_match_end; ++j) { BROTLI_DCHECK(BackwardMatchLength(&matches[j]) <= BackwardMatchLength(&matches[j + 1])); } num_matches[i] = (uint32_t)num_found_matches; if (num_found_matches > 0) { const size_t match_len = BackwardMatchLength(&matches[cur_match_end - 1]); if (match_len > MAX_ZOPFLI_LEN_QUALITY_11) { const size_t skip = match_len - 1; matches[cur_match_pos++] = matches[cur_match_end - 1]; num_matches[i] = 1; /* Add the tail of the copy to the hasher. */ StoreRangeH10(hasher, ringbuffer, ringbuffer_mask, pos + 1, BROTLI_MIN(size_t, pos + match_len, store_end)); memset(&num_matches[i + 1], 0, skip * sizeof(num_matches[0])); i += skip; } else { cur_match_pos = cur_match_end; } } } orig_num_literals = *num_literals; orig_last_insert_len = *last_insert_len; memcpy(orig_dist_cache, dist_cache, 4 * sizeof(dist_cache[0])); orig_num_commands = *num_commands; nodes = BROTLI_ALLOC(m, ZopfliNode, num_bytes + 1); if (BROTLI_IS_OOM(m)) return; InitZopfliCostModel(m, &model, ¶ms->dist, num_bytes); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < 2; i++) { BrotliInitZopfliNodes(nodes, num_bytes + 1); if (i == 0) { ZopfliCostModelSetFromLiteralCosts( &model, position, ringbuffer, ringbuffer_mask); } else { ZopfliCostModelSetFromCommands(&model, position, ringbuffer, ringbuffer_mask, commands, *num_commands - orig_num_commands, orig_last_insert_len); } *num_commands = orig_num_commands; *num_literals = orig_num_literals; *last_insert_len = orig_last_insert_len; memcpy(dist_cache, orig_dist_cache, 4 * sizeof(dist_cache[0])); *num_commands += ZopfliIterate(num_bytes, position, ringbuffer, ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches, nodes); BrotliZopfliCreateCommands(num_bytes, position, nodes, dist_cache, last_insert_len, params, commands, num_literals); } CleanupZopfliCostModel(m, &model); BROTLI_FREE(m, nodes); BROTLI_FREE(m, matches); BROTLI_FREE(m, num_matches); } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/static_dict.c0000664000175000017500000004510413510660062015556 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ #include "./static_dict.h" #include "../common/dictionary.h" #include "../common/platform.h" #include "../common/transform.h" #include "./encoder_dict.h" #include "./find_match_length.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static BROTLI_INLINE uint32_t Hash(const uint8_t* data) { uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kDictHashMul32; /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return h >> (32 - kDictNumBits); } static BROTLI_INLINE void AddMatch(size_t distance, size_t len, size_t len_code, uint32_t* matches) { uint32_t match = (uint32_t)((distance << 5) + len_code); matches[len] = BROTLI_MIN(uint32_t, matches[len], match); } static BROTLI_INLINE size_t DictMatchLength(const BrotliDictionary* dictionary, const uint8_t* data, size_t id, size_t len, size_t maxlen) { const size_t offset = dictionary->offsets_by_length[len] + len * id; return FindMatchLengthWithLimit(&dictionary->data[offset], data, BROTLI_MIN(size_t, len, maxlen)); } static BROTLI_INLINE BROTLI_BOOL IsMatch(const BrotliDictionary* dictionary, DictWord w, const uint8_t* data, size_t max_length) { if (w.len > max_length) { return BROTLI_FALSE; } else { const size_t offset = dictionary->offsets_by_length[w.len] + (size_t)w.len * (size_t)w.idx; const uint8_t* dict = &dictionary->data[offset]; if (w.transform == 0) { /* Match against base dictionary word. */ return TO_BROTLI_BOOL(FindMatchLengthWithLimit(dict, data, w.len) == w.len); } else if (w.transform == 10) { /* Match against uppercase first transform. Note that there are only ASCII uppercase words in the lookup table. */ return TO_BROTLI_BOOL(dict[0] >= 'a' && dict[0] <= 'z' && (dict[0] ^ 32) == data[0] && FindMatchLengthWithLimit(&dict[1], &data[1], w.len - 1u) == w.len - 1u); } else { /* Match against uppercase all transform. Note that there are only ASCII uppercase words in the lookup table. */ size_t i; for (i = 0; i < w.len; ++i) { if (dict[i] >= 'a' && dict[i] <= 'z') { if ((dict[i] ^ 32) != data[i]) return BROTLI_FALSE; } else { if (dict[i] != data[i]) return BROTLI_FALSE; } } return BROTLI_TRUE; } } } BROTLI_BOOL BrotliFindAllStaticDictionaryMatches( const BrotliEncoderDictionary* dictionary, const uint8_t* data, size_t min_length, size_t max_length, uint32_t* matches) { BROTLI_BOOL has_found_match = BROTLI_FALSE; { size_t offset = dictionary->buckets[Hash(data)]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; const size_t l = w.len & 0x1F; const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l]; const size_t id = w.idx; end = !!(w.len & 0x80); w.len = (uint8_t)l; if (w.transform == 0) { const size_t matchlen = DictMatchLength(dictionary->words, data, id, l, max_length); const uint8_t* s; size_t minlen; size_t maxlen; size_t len; /* Transform "" + BROTLI_TRANSFORM_IDENTITY + "" */ if (matchlen == l) { AddMatch(id, l, l, matches); has_found_match = BROTLI_TRUE; } /* Transforms "" + BROTLI_TRANSFORM_OMIT_LAST_1 + "" and "" + BROTLI_TRANSFORM_OMIT_LAST_1 + "ing " */ if (matchlen >= l - 1) { AddMatch(id + 12 * n, l - 1, l, matches); if (l + 2 < max_length && data[l - 1] == 'i' && data[l] == 'n' && data[l + 1] == 'g' && data[l + 2] == ' ') { AddMatch(id + 49 * n, l + 3, l, matches); } has_found_match = BROTLI_TRUE; } /* Transform "" + BROTLI_TRANSFORM_OMIT_LAST_# + "" (# = 2 .. 9) */ minlen = min_length; if (l > 9) minlen = BROTLI_MAX(size_t, minlen, l - 9); maxlen = BROTLI_MIN(size_t, matchlen, l - 2); for (len = minlen; len <= maxlen; ++len) { size_t cut = l - len; size_t transform_id = (cut << 2) + (size_t)((dictionary->cutoffTransforms >> (cut * 6)) & 0x3F); AddMatch(id + transform_id * n, len, l, matches); has_found_match = BROTLI_TRUE; } if (matchlen < l || l + 6 >= max_length) { continue; } s = &data[l]; /* Transforms "" + BROTLI_TRANSFORM_IDENTITY + */ if (s[0] == ' ') { AddMatch(id + n, l + 1, l, matches); if (s[1] == 'a') { if (s[2] == ' ') { AddMatch(id + 28 * n, l + 3, l, matches); } else if (s[2] == 's') { if (s[3] == ' ') AddMatch(id + 46 * n, l + 4, l, matches); } else if (s[2] == 't') { if (s[3] == ' ') AddMatch(id + 60 * n, l + 4, l, matches); } else if (s[2] == 'n') { if (s[3] == 'd' && s[4] == ' ') { AddMatch(id + 10 * n, l + 5, l, matches); } } } else if (s[1] == 'b') { if (s[2] == 'y' && s[3] == ' ') { AddMatch(id + 38 * n, l + 4, l, matches); } } else if (s[1] == 'i') { if (s[2] == 'n') { if (s[3] == ' ') AddMatch(id + 16 * n, l + 4, l, matches); } else if (s[2] == 's') { if (s[3] == ' ') AddMatch(id + 47 * n, l + 4, l, matches); } } else if (s[1] == 'f') { if (s[2] == 'o') { if (s[3] == 'r' && s[4] == ' ') { AddMatch(id + 25 * n, l + 5, l, matches); } } else if (s[2] == 'r') { if (s[3] == 'o' && s[4] == 'm' && s[5] == ' ') { AddMatch(id + 37 * n, l + 6, l, matches); } } } else if (s[1] == 'o') { if (s[2] == 'f') { if (s[3] == ' ') AddMatch(id + 8 * n, l + 4, l, matches); } else if (s[2] == 'n') { if (s[3] == ' ') AddMatch(id + 45 * n, l + 4, l, matches); } } else if (s[1] == 'n') { if (s[2] == 'o' && s[3] == 't' && s[4] == ' ') { AddMatch(id + 80 * n, l + 5, l, matches); } } else if (s[1] == 't') { if (s[2] == 'h') { if (s[3] == 'e') { if (s[4] == ' ') AddMatch(id + 5 * n, l + 5, l, matches); } else if (s[3] == 'a') { if (s[4] == 't' && s[5] == ' ') { AddMatch(id + 29 * n, l + 6, l, matches); } } } else if (s[2] == 'o') { if (s[3] == ' ') AddMatch(id + 17 * n, l + 4, l, matches); } } else if (s[1] == 'w') { if (s[2] == 'i' && s[3] == 't' && s[4] == 'h' && s[5] == ' ') { AddMatch(id + 35 * n, l + 6, l, matches); } } } else if (s[0] == '"') { AddMatch(id + 19 * n, l + 1, l, matches); if (s[1] == '>') { AddMatch(id + 21 * n, l + 2, l, matches); } } else if (s[0] == '.') { AddMatch(id + 20 * n, l + 1, l, matches); if (s[1] == ' ') { AddMatch(id + 31 * n, l + 2, l, matches); if (s[2] == 'T' && s[3] == 'h') { if (s[4] == 'e') { if (s[5] == ' ') AddMatch(id + 43 * n, l + 6, l, matches); } else if (s[4] == 'i') { if (s[5] == 's' && s[6] == ' ') { AddMatch(id + 75 * n, l + 7, l, matches); } } } } } else if (s[0] == ',') { AddMatch(id + 76 * n, l + 1, l, matches); if (s[1] == ' ') { AddMatch(id + 14 * n, l + 2, l, matches); } } else if (s[0] == '\n') { AddMatch(id + 22 * n, l + 1, l, matches); if (s[1] == '\t') { AddMatch(id + 50 * n, l + 2, l, matches); } } else if (s[0] == ']') { AddMatch(id + 24 * n, l + 1, l, matches); } else if (s[0] == '\'') { AddMatch(id + 36 * n, l + 1, l, matches); } else if (s[0] == ':') { AddMatch(id + 51 * n, l + 1, l, matches); } else if (s[0] == '(') { AddMatch(id + 57 * n, l + 1, l, matches); } else if (s[0] == '=') { if (s[1] == '"') { AddMatch(id + 70 * n, l + 2, l, matches); } else if (s[1] == '\'') { AddMatch(id + 86 * n, l + 2, l, matches); } } else if (s[0] == 'a') { if (s[1] == 'l' && s[2] == ' ') { AddMatch(id + 84 * n, l + 3, l, matches); } } else if (s[0] == 'e') { if (s[1] == 'd') { if (s[2] == ' ') AddMatch(id + 53 * n, l + 3, l, matches); } else if (s[1] == 'r') { if (s[2] == ' ') AddMatch(id + 82 * n, l + 3, l, matches); } else if (s[1] == 's') { if (s[2] == 't' && s[3] == ' ') { AddMatch(id + 95 * n, l + 4, l, matches); } } } else if (s[0] == 'f') { if (s[1] == 'u' && s[2] == 'l' && s[3] == ' ') { AddMatch(id + 90 * n, l + 4, l, matches); } } else if (s[0] == 'i') { if (s[1] == 'v') { if (s[2] == 'e' && s[3] == ' ') { AddMatch(id + 92 * n, l + 4, l, matches); } } else if (s[1] == 'z') { if (s[2] == 'e' && s[3] == ' ') { AddMatch(id + 100 * n, l + 4, l, matches); } } } else if (s[0] == 'l') { if (s[1] == 'e') { if (s[2] == 's' && s[3] == 's' && s[4] == ' ') { AddMatch(id + 93 * n, l + 5, l, matches); } } else if (s[1] == 'y') { if (s[2] == ' ') AddMatch(id + 61 * n, l + 3, l, matches); } } else if (s[0] == 'o') { if (s[1] == 'u' && s[2] == 's' && s[3] == ' ') { AddMatch(id + 106 * n, l + 4, l, matches); } } } else { /* Set is_all_caps=0 for BROTLI_TRANSFORM_UPPERCASE_FIRST and is_all_caps=1 otherwise (BROTLI_TRANSFORM_UPPERCASE_ALL) transform. */ const BROTLI_BOOL is_all_caps = TO_BROTLI_BOOL(w.transform != BROTLI_TRANSFORM_UPPERCASE_FIRST); const uint8_t* s; if (!IsMatch(dictionary->words, w, data, max_length)) { continue; } /* Transform "" + kUppercase{First,All} + "" */ AddMatch(id + (is_all_caps ? 44 : 9) * n, l, l, matches); has_found_match = BROTLI_TRUE; if (l + 1 >= max_length) { continue; } /* Transforms "" + kUppercase{First,All} + */ s = &data[l]; if (s[0] == ' ') { AddMatch(id + (is_all_caps ? 68 : 4) * n, l + 1, l, matches); } else if (s[0] == '"') { AddMatch(id + (is_all_caps ? 87 : 66) * n, l + 1, l, matches); if (s[1] == '>') { AddMatch(id + (is_all_caps ? 97 : 69) * n, l + 2, l, matches); } } else if (s[0] == '.') { AddMatch(id + (is_all_caps ? 101 : 79) * n, l + 1, l, matches); if (s[1] == ' ') { AddMatch(id + (is_all_caps ? 114 : 88) * n, l + 2, l, matches); } } else if (s[0] == ',') { AddMatch(id + (is_all_caps ? 112 : 99) * n, l + 1, l, matches); if (s[1] == ' ') { AddMatch(id + (is_all_caps ? 107 : 58) * n, l + 2, l, matches); } } else if (s[0] == '\'') { AddMatch(id + (is_all_caps ? 94 : 74) * n, l + 1, l, matches); } else if (s[0] == '(') { AddMatch(id + (is_all_caps ? 113 : 78) * n, l + 1, l, matches); } else if (s[0] == '=') { if (s[1] == '"') { AddMatch(id + (is_all_caps ? 105 : 104) * n, l + 2, l, matches); } else if (s[1] == '\'') { AddMatch(id + (is_all_caps ? 116 : 108) * n, l + 2, l, matches); } } } } } /* Transforms with prefixes " " and "." */ if (max_length >= 5 && (data[0] == ' ' || data[0] == '.')) { BROTLI_BOOL is_space = TO_BROTLI_BOOL(data[0] == ' '); size_t offset = dictionary->buckets[Hash(&data[1])]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; const size_t l = w.len & 0x1F; const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l]; const size_t id = w.idx; end = !!(w.len & 0x80); w.len = (uint8_t)l; if (w.transform == 0) { const uint8_t* s; if (!IsMatch(dictionary->words, w, &data[1], max_length - 1)) { continue; } /* Transforms " " + BROTLI_TRANSFORM_IDENTITY + "" and "." + BROTLI_TRANSFORM_IDENTITY + "" */ AddMatch(id + (is_space ? 6 : 32) * n, l + 1, l, matches); has_found_match = BROTLI_TRUE; if (l + 2 >= max_length) { continue; } /* Transforms " " + BROTLI_TRANSFORM_IDENTITY + and "." + BROTLI_TRANSFORM_IDENTITY + */ s = &data[l + 1]; if (s[0] == ' ') { AddMatch(id + (is_space ? 2 : 77) * n, l + 2, l, matches); } else if (s[0] == '(') { AddMatch(id + (is_space ? 89 : 67) * n, l + 2, l, matches); } else if (is_space) { if (s[0] == ',') { AddMatch(id + 103 * n, l + 2, l, matches); if (s[1] == ' ') { AddMatch(id + 33 * n, l + 3, l, matches); } } else if (s[0] == '.') { AddMatch(id + 71 * n, l + 2, l, matches); if (s[1] == ' ') { AddMatch(id + 52 * n, l + 3, l, matches); } } else if (s[0] == '=') { if (s[1] == '"') { AddMatch(id + 81 * n, l + 3, l, matches); } else if (s[1] == '\'') { AddMatch(id + 98 * n, l + 3, l, matches); } } } } else if (is_space) { /* Set is_all_caps=0 for BROTLI_TRANSFORM_UPPERCASE_FIRST and is_all_caps=1 otherwise (BROTLI_TRANSFORM_UPPERCASE_ALL) transform. */ const BROTLI_BOOL is_all_caps = TO_BROTLI_BOOL(w.transform != BROTLI_TRANSFORM_UPPERCASE_FIRST); const uint8_t* s; if (!IsMatch(dictionary->words, w, &data[1], max_length - 1)) { continue; } /* Transforms " " + kUppercase{First,All} + "" */ AddMatch(id + (is_all_caps ? 85 : 30) * n, l + 1, l, matches); has_found_match = BROTLI_TRUE; if (l + 2 >= max_length) { continue; } /* Transforms " " + kUppercase{First,All} + */ s = &data[l + 1]; if (s[0] == ' ') { AddMatch(id + (is_all_caps ? 83 : 15) * n, l + 2, l, matches); } else if (s[0] == ',') { if (!is_all_caps) { AddMatch(id + 109 * n, l + 2, l, matches); } if (s[1] == ' ') { AddMatch(id + (is_all_caps ? 111 : 65) * n, l + 3, l, matches); } } else if (s[0] == '.') { AddMatch(id + (is_all_caps ? 115 : 96) * n, l + 2, l, matches); if (s[1] == ' ') { AddMatch(id + (is_all_caps ? 117 : 91) * n, l + 3, l, matches); } } else if (s[0] == '=') { if (s[1] == '"') { AddMatch(id + (is_all_caps ? 110 : 118) * n, l + 3, l, matches); } else if (s[1] == '\'') { AddMatch(id + (is_all_caps ? 119 : 120) * n, l + 3, l, matches); } } } } } if (max_length >= 6) { /* Transforms with prefixes "e ", "s ", ", " and "\xC2\xA0" */ if ((data[1] == ' ' && (data[0] == 'e' || data[0] == 's' || data[0] == ',')) || (data[0] == 0xC2 && data[1] == 0xA0)) { size_t offset = dictionary->buckets[Hash(&data[2])]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; const size_t l = w.len & 0x1F; const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l]; const size_t id = w.idx; end = !!(w.len & 0x80); w.len = (uint8_t)l; if (w.transform == 0 && IsMatch(dictionary->words, w, &data[2], max_length - 2)) { if (data[0] == 0xC2) { AddMatch(id + 102 * n, l + 2, l, matches); has_found_match = BROTLI_TRUE; } else if (l + 2 < max_length && data[l + 2] == ' ') { size_t t = data[0] == 'e' ? 18 : (data[0] == 's' ? 7 : 13); AddMatch(id + t * n, l + 3, l, matches); has_found_match = BROTLI_TRUE; } } } } } if (max_length >= 9) { /* Transforms with prefixes " the " and ".com/" */ if ((data[0] == ' ' && data[1] == 't' && data[2] == 'h' && data[3] == 'e' && data[4] == ' ') || (data[0] == '.' && data[1] == 'c' && data[2] == 'o' && data[3] == 'm' && data[4] == '/')) { size_t offset = dictionary->buckets[Hash(&data[5])]; BROTLI_BOOL end = !offset; while (!end) { DictWord w = dictionary->dict_words[offset++]; const size_t l = w.len & 0x1F; const size_t n = (size_t)1 << dictionary->words->size_bits_by_length[l]; const size_t id = w.idx; end = !!(w.len & 0x80); w.len = (uint8_t)l; if (w.transform == 0 && IsMatch(dictionary->words, w, &data[5], max_length - 5)) { AddMatch(id + (data[0] == ' ' ? 41 : 72) * n, l + 5, l, matches); has_found_match = BROTLI_TRUE; if (l + 5 < max_length) { const uint8_t* s = &data[l + 5]; if (data[0] == ' ') { if (l + 8 < max_length && s[0] == ' ' && s[1] == 'o' && s[2] == 'f' && s[3] == ' ') { AddMatch(id + 62 * n, l + 9, l, matches); if (l + 12 < max_length && s[4] == 't' && s[5] == 'h' && s[6] == 'e' && s[7] == ' ') { AddMatch(id + 73 * n, l + 13, l, matches); } } } } } } } } return has_found_match; } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/metablock_inc.h0000664000175000017500000001654613510660062016073 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN */ #define HistogramType FN(Histogram) /* Greedy block splitter for one block category (literal, command or distance). */ typedef struct FN(BlockSplitter) { /* Alphabet size of particular block category. */ size_t alphabet_size_; /* We collect at least this many symbols for each block. */ size_t min_block_size_; /* We merge histograms A and B if entropy(A+B) < entropy(A) + entropy(B) + split_threshold_, where A is the current histogram and B is the histogram of the last or the second last block type. */ double split_threshold_; size_t num_blocks_; BlockSplit* split_; /* not owned */ HistogramType* histograms_; /* not owned */ size_t* histograms_size_; /* not owned */ /* The number of symbols that we want to collect before deciding on whether or not to merge the block with a previous one or emit a new block. */ size_t target_block_size_; /* The number of symbols in the current histogram. */ size_t block_size_; /* Offset of the current histogram. */ size_t curr_histogram_ix_; /* Offset of the histograms of the previous two block types. */ size_t last_histogram_ix_[2]; /* Entropy of the previous two block types. */ double last_entropy_[2]; /* The number of times we merged the current block with the last one. */ size_t merge_last_count_; } FN(BlockSplitter); static void FN(InitBlockSplitter)( MemoryManager* m, FN(BlockSplitter)* self, size_t alphabet_size, size_t min_block_size, double split_threshold, size_t num_symbols, BlockSplit* split, HistogramType** histograms, size_t* histograms_size) { size_t max_num_blocks = num_symbols / min_block_size + 1; /* We have to allocate one more histogram than the maximum number of block types for the current histogram when the meta-block is too big. */ size_t max_num_types = BROTLI_MIN(size_t, max_num_blocks, BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + 1); self->alphabet_size_ = alphabet_size; self->min_block_size_ = min_block_size; self->split_threshold_ = split_threshold; self->num_blocks_ = 0; self->split_ = split; self->histograms_size_ = histograms_size; self->target_block_size_ = min_block_size; self->block_size_ = 0; self->curr_histogram_ix_ = 0; self->merge_last_count_ = 0; BROTLI_ENSURE_CAPACITY(m, uint8_t, split->types, split->types_alloc_size, max_num_blocks); BROTLI_ENSURE_CAPACITY(m, uint32_t, split->lengths, split->lengths_alloc_size, max_num_blocks); if (BROTLI_IS_OOM(m)) return; self->split_->num_blocks = max_num_blocks; BROTLI_DCHECK(*histograms == 0); *histograms_size = max_num_types; *histograms = BROTLI_ALLOC(m, HistogramType, *histograms_size); self->histograms_ = *histograms; if (BROTLI_IS_OOM(m)) return; /* Clear only current histogram. */ FN(HistogramClear)(&self->histograms_[0]); self->last_histogram_ix_[0] = self->last_histogram_ix_[1] = 0; } /* Does either of three things: (1) emits the current block with a new block type; (2) emits the current block with the type of the second last block; (3) merges the current block with the last block. */ static void FN(BlockSplitterFinishBlock)( FN(BlockSplitter)* self, BROTLI_BOOL is_final) { BlockSplit* split = self->split_; double* last_entropy = self->last_entropy_; HistogramType* histograms = self->histograms_; self->block_size_ = BROTLI_MAX(size_t, self->block_size_, self->min_block_size_); if (self->num_blocks_ == 0) { /* Create first block. */ split->lengths[0] = (uint32_t)self->block_size_; split->types[0] = 0; last_entropy[0] = BitsEntropy(histograms[0].data_, self->alphabet_size_); last_entropy[1] = last_entropy[0]; ++self->num_blocks_; ++split->num_types; ++self->curr_histogram_ix_; if (self->curr_histogram_ix_ < *self->histograms_size_) FN(HistogramClear)(&histograms[self->curr_histogram_ix_]); self->block_size_ = 0; } else if (self->block_size_ > 0) { double entropy = BitsEntropy(histograms[self->curr_histogram_ix_].data_, self->alphabet_size_); HistogramType combined_histo[2]; double combined_entropy[2]; double diff[2]; size_t j; for (j = 0; j < 2; ++j) { size_t last_histogram_ix = self->last_histogram_ix_[j]; combined_histo[j] = histograms[self->curr_histogram_ix_]; FN(HistogramAddHistogram)(&combined_histo[j], &histograms[last_histogram_ix]); combined_entropy[j] = BitsEntropy( &combined_histo[j].data_[0], self->alphabet_size_); diff[j] = combined_entropy[j] - entropy - last_entropy[j]; } if (split->num_types < BROTLI_MAX_NUMBER_OF_BLOCK_TYPES && diff[0] > self->split_threshold_ && diff[1] > self->split_threshold_) { /* Create new block. */ split->lengths[self->num_blocks_] = (uint32_t)self->block_size_; split->types[self->num_blocks_] = (uint8_t)split->num_types; self->last_histogram_ix_[1] = self->last_histogram_ix_[0]; self->last_histogram_ix_[0] = (uint8_t)split->num_types; last_entropy[1] = last_entropy[0]; last_entropy[0] = entropy; ++self->num_blocks_; ++split->num_types; ++self->curr_histogram_ix_; if (self->curr_histogram_ix_ < *self->histograms_size_) FN(HistogramClear)(&histograms[self->curr_histogram_ix_]); self->block_size_ = 0; self->merge_last_count_ = 0; self->target_block_size_ = self->min_block_size_; } else if (diff[1] < diff[0] - 20.0) { /* Combine this block with second last block. */ split->lengths[self->num_blocks_] = (uint32_t)self->block_size_; split->types[self->num_blocks_] = split->types[self->num_blocks_ - 2]; BROTLI_SWAP(size_t, self->last_histogram_ix_, 0, 1); histograms[self->last_histogram_ix_[0]] = combined_histo[1]; last_entropy[1] = last_entropy[0]; last_entropy[0] = combined_entropy[1]; ++self->num_blocks_; self->block_size_ = 0; FN(HistogramClear)(&histograms[self->curr_histogram_ix_]); self->merge_last_count_ = 0; self->target_block_size_ = self->min_block_size_; } else { /* Combine this block with last block. */ split->lengths[self->num_blocks_ - 1] += (uint32_t)self->block_size_; histograms[self->last_histogram_ix_[0]] = combined_histo[0]; last_entropy[0] = combined_entropy[0]; if (split->num_types == 1) { last_entropy[1] = last_entropy[0]; } self->block_size_ = 0; FN(HistogramClear)(&histograms[self->curr_histogram_ix_]); if (++self->merge_last_count_ > 1) { self->target_block_size_ += self->min_block_size_; } } } if (is_final) { *self->histograms_size_ = split->num_types; split->num_blocks = self->num_blocks_; } } /* Adds the next symbol to the current histogram. When the current histogram reaches the target size, decides on merging the block. */ static void FN(BlockSplitterAddSymbol)(FN(BlockSplitter)* self, size_t symbol) { FN(HistogramAdd)(&self->histograms_[self->curr_histogram_ix_], symbol); ++self->block_size_; if (self->block_size_ == self->target_block_size_) { FN(BlockSplitterFinishBlock)(self, /* is_final = */ BROTLI_FALSE); } } #undef HistogramType dvisvgm-2.8.1/libs/brotli/enc/compress_fragment_two_pass.h0000664000175000017500000000454713510660062020734 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Function for fast encoding of an input fragment, independently from the input history. This function uses two-pass processing: in the first pass we save the found backward matches and literal bytes into a buffer, and in the second pass we emit them into the bit stream using prefix codes built based on the actual command and literal byte histograms. */ #ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_ #define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_ #include "../common/platform.h" #include #include "./memory.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static const size_t kCompressFragmentTwoPassBlockSize = 1 << 17; /* Compresses "input" string to the "*storage" buffer as one or more complete meta-blocks, and updates the "*storage_ix" bit position. If "is_last" is 1, emits an additional empty last meta-block. REQUIRES: "input_size" is greater than zero, or "is_last" is 1. REQUIRES: "input_size" is less or equal to maximal metablock size (1 << 24). REQUIRES: "command_buf" and "literal_buf" point to at least kCompressFragmentTwoPassBlockSize long arrays. REQUIRES: All elements in "table[0..table_size-1]" are initialized to zero. REQUIRES: "table_size" is a power of two OUTPUT: maximal copy distance <= |input_size| OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */ BROTLI_INTERNAL void BrotliCompressFragmentTwoPass(MemoryManager* m, const uint8_t* input, size_t input_size, BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, int* table, size_t table_size, size_t* storage_ix, uint8_t* storage); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_ */ dvisvgm-2.8.1/libs/brotli/enc/dictionary_hash.h0000664000175000017500000000110713510660062016434 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Hash table on the 4-byte prefixes of static dictionary words. */ #ifndef BROTLI_ENC_DICTIONARY_HASH_H_ #define BROTLI_ENC_DICTIONARY_HASH_H_ #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif extern const uint16_t kStaticDictionaryHash[32768]; #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_DICTIONARY_HASH_H_ */ dvisvgm-2.8.1/libs/brotli/enc/static_dict_lut.h0000664000175000017500000162523213510660062016456 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Lookup table for static dictionary and transforms. */ #ifndef BROTLI_ENC_STATIC_DICT_LUT_H_ #define BROTLI_ENC_STATIC_DICT_LUT_H_ #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct DictWord { /* Highest bit is used to indicate end of bucket. */ uint8_t len; uint8_t transform; uint16_t idx; } DictWord; static const int kDictNumBits = 15; static const uint32_t kDictHashMul32 = 0x1E35A7BD; static const uint16_t kStaticDictionaryBuckets[32768] = { 1,0,0,0,0,0,0,0,0,3,6,0,0,0,0,0,20,0,0,0,21,0,22,0,0,0,0,0,0,0,0,23,0,0,25,0,29, 0,53,0,0,0,0,0,0,55,0,0,0,0,0,0,61,76,0,0,0,94,0,0,0,0,0,0,96,0,97,0,98,0,0,0,0, 0,0,0,99,101,106,108,0,0,0,0,0,110,0,111,112,0,113,118,124,0,0,0,0,0,125,128,0,0 ,0,0,129,0,0,131,0,0,0,0,0,0,132,0,0,135,0,0,0,137,0,0,0,0,0,138,139,0,0,0,0,0,0 ,0,142,143,144,0,0,0,0,0,145,0,0,0,146,149,151,152,0,0,153,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,154,0,0,0,0,0,0,155,0,0,0,0,160,182,0,0,0,0,0,0,183,0,0,0,188,189,0,0, 192,0,0,0,0,0,0,194,0,0,0,0,0,0,0,0,197,202,209,0,0,210,0,224,0,0,0,225,0,0,0,0, 0,0,0,0,0,0,231,0,0,0,232,0,240,0,0,242,0,0,0,0,0,0,0,0,0,0,0,244,0,0,0,246,0,0, 249,251,253,0,0,0,0,0,258,0,0,261,263,0,0,0,267,0,0,268,0,269,0,0,0,0,0,0,0,0,0, 271,0,0,0,0,0,0,272,0,273,0,277,0,278,286,0,0,0,0,287,0,289,290,291,0,0,0,295,0, 0,296,297,0,0,0,0,0,0,0,0,0,0,298,0,0,0,299,0,0,305,0,324,0,0,0,0,0,327,0,328, 329,0,0,0,0,336,0,0,340,0,341,342,343,0,0,346,0,348,0,0,0,0,0,0,349,351,0,0,355, 0,363,0,364,0,368,369,0,370,0,0,0,0,0,0,0,372,0,0,0,0,0,0,0,0,0,0,0,373,0,375,0, 0,0,0,376,377,0,0,394,395,396,0,0,398,0,0,0,0,400,0,0,408,0,0,0,0,420,0,0,0,0,0, 0,421,0,0,422,423,0,0,429,435,436,442,0,0,443,0,444,445,453,456,0,457,0,0,0,0,0, 458,0,0,0,459,0,0,0,460,0,462,463,465,0,0,0,0,0,0,466,469,0,0,0,0,0,0,470,0,0,0, 474,0,476,0,0,0,0,483,0,485,0,0,0,486,0,0,488,491,492,0,0,497,499,500,0,501,0,0, 0,505,0,0,506,0,0,0,507,0,0,0,509,0,0,0,0,511,512,519,0,0,0,0,0,0,529,530,0,0,0, 534,0,0,0,0,543,0,0,0,0,0,0,0,0,0,553,0,0,0,0,557,560,0,0,0,0,0,0,561,0,564,0,0, 0,0,0,0,565,566,0,575,0,619,0,620,0,0,623,624,0,0,0,625,0,0,626,627,0,0,628,0,0, 0,0,630,0,631,0,0,0,0,0,0,0,0,0,641,0,0,0,0,643,656,668,0,0,0,673,0,0,0,674,0,0, 0,0,0,0,0,0,682,0,687,0,690,0,693,699,700,0,0,0,0,0,0,704,705,0,0,0,0,707,710,0, 711,0,0,0,0,726,0,0,729,0,0,0,730,731,0,0,0,0,0,752,0,0,0,762,0,763,0,0,767,0,0, 0,770,774,0,0,775,0,0,0,0,0,0,0,0,0,0,776,0,0,0,777,783,0,0,0,785,788,0,0,0,0, 790,0,0,0,793,0,0,0,0,794,0,0,804,819,821,0,827,0,0,0,834,0,0,835,0,0,0,841,0, 844,0,850,851,859,0,860,0,0,0,0,0,0,0,874,0,876,0,877,890,0,0,0,0,0,0,0,0,893, 894,898,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,899,0,0,0,900,904,906,0,0,0,907,0,908,909, 0,910,0,0,0,0,911,0,0,0,0,0,916,0,0,0,922,925,0,930,0,934,0,0,0,0,0,943,0,0,944, 0,953,954,0,0,0,0,0,0,955,0,962,963,0,0,976,0,0,977,978,979,980,0,981,0,0,0,0, 984,0,0,985,0,0,987,989,991,0,0,0,0,0,0,0,0,0,992,0,0,0,993,0,0,0,0,0,0,996,0,0, 0,1000,0,0,0,0,0,1002,0,0,0,0,1005,1007,0,0,0,1009,0,0,0,1010,0,0,0,0,0,0,1011,0 ,1012,0,0,0,0,1014,1016,0,0,0,1020,0,1021,0,0,0,0,1022,0,0,0,1024,0,0,0,0,0,0, 1025,0,0,1026,1027,0,0,0,0,0,1031,0,1033,0,0,0,0,1034,0,0,0,1037,1040,0,0,0,1042 ,1043,0,0,1053,0,1054,0,0,1057,0,0,0,1058,0,0,1060,0,0,0,0,0,0,0,1061,0,0,1062,0 ,0,0,0,1063,0,0,0,0,1064,0,0,0,0,0,1065,0,0,0,0,1066,1067,0,0,0,1069,1070,1072,0 ,0,0,0,0,0,1073,0,1075,0,0,0,0,0,0,1080,1084,0,0,0,0,1088,0,0,0,0,0,0,1094,0, 1095,0,1107,0,0,0,1112,1114,0,1119,0,1122,0,0,1126,0,1129,0,1130,0,0,0,0,0,1132, 0,0,0,0,0,0,1144,0,0,1145,1146,0,1148,1149,0,0,1150,1151,0,0,0,0,1152,0,1153,0,0 ,0,0,0,1154,0,1163,0,0,0,1164,0,0,0,0,0,1165,0,1167,0,1170,0,0,0,0,0,1171,1172,0 ,0,0,0,0,0,0,0,1173,1175,1177,0,1186,0,0,0,0,0,0,0,0,0,0,1195,0,0,1221,0,0,1224, 0,0,1227,0,0,0,0,0,1228,1229,0,0,1230,0,0,0,0,0,0,0,0,0,1231,0,0,0,1233,0,0,1243 ,1244,1246,1248,0,0,0,0,1254,1255,1258,1259,0,0,0,1260,0,0,1261,0,0,0,1262,1264, 0,0,1265,0,0,0,0,0,0,0,0,0,0,0,0,1266,0,1267,0,0,0,0,1273,1274,1276,1289,0,0, 1291,1292,1293,0,0,1294,1295,1296,0,0,0,0,1302,0,1304,0,0,0,0,0,0,0,0,0,1311, 1312,0,1314,0,1316,1320,1321,0,0,0,0,0,0,0,1322,1323,1324,0,1335,0,1336,0,0,0,0, 1341,1342,0,1346,0,1357,0,0,0,1358,1360,0,0,0,0,0,0,1361,0,0,0,1362,1365,0,1366, 0,0,0,0,0,0,0,1379,0,0,0,0,0,0,0,0,0,0,0,0,1386,0,1388,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,1395,0,0,0,0,1403,0,1405,0,0,1407,0,0,0,0,0,1408,1409,0,1410,0,0,0,1412,1413, 1416,0,0,1429,1451,0,0,1454,0,0,0,0,0,0,0,1455,0,0,0,0,0,0,0,1456,0,0,0,0,1459, 1460,1461,1475,0,0,0,0,0,0,1477,0,1480,0,1481,0,0,1486,0,0,1495,0,0,0,1496,0,0, 1498,1499,1501,1520,1521,0,0,0,1526,0,0,0,0,1528,1529,0,1533,1536,0,0,0,1537, 1538,1549,0,1550,1558,1559,1572,0,1573,0,0,0,0,0,0,0,0,0,1575,0,0,0,0,0,1579,0, 1599,0,1603,0,1604,0,1605,0,0,0,0,0,1608,1610,0,0,0,0,1611,0,1615,0,1616,1618,0, 1619,0,0,1622,0,0,0,0,1634,0,0,0,1635,0,0,0,1641,0,0,0,0,0,0,0,0,0,1643,0,0,0, 1650,0,0,1652,0,0,0,0,0,1653,0,0,0,1654,0,0,0,0,1655,0,1662,0,0,1663,1664,0,0, 1668,0,0,1669,1670,0,1672,1673,0,0,0,0,0,1674,0,0,0,1675,1676,1680,0,1682,0,0, 1687,0,0,0,0,0,1704,0,0,1705,0,0,1721,0,0,0,0,1734,1735,0,0,0,0,1737,0,0,0,0, 1739,0,0,1740,0,0,0,0,0,0,0,0,0,0,1741,1743,0,0,0,0,1745,0,0,0,1749,0,0,0,1751,0 ,0,0,0,0,0,1760,0,0,0,0,1765,0,0,0,0,0,1784,0,1785,1787,0,0,0,0,1788,1789,0,0,0, 0,1790,1791,1793,0,1798,1799,0,0,0,0,1801,0,1803,1805,0,0,0,1806,1811,0,1812, 1814,0,1821,0,0,0,0,0,1822,1833,0,0,0,0,0,0,1848,0,0,0,0,0,0,1857,0,0,0,1859,0,0 ,0,0,1861,0,0,0,0,0,0,0,1866,0,1921,1925,0,0,0,1929,1930,0,0,0,0,0,0,0,0,0,1931, 0,0,0,0,1932,0,0,0,1934,0,0,0,0,0,0,0,0,1946,0,0,1948,0,0,0,0,1950,0,1957,0,1958 ,0,0,0,0,0,1965,1967,0,0,0,0,1968,0,1969,0,1971,1972,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,1973,0,0,0,0,1975,0,0,0,0,1976,1979,0,1982,0,0,0,0,1984,1988,0,0,0,0,1990, 2004,2008,0,0,0,2012,2013,0,0,0,0,0,0,0,0,0,0,2015,0,2016,2017,0,0,0,0,2021,0,0, 2025,0,0,0,0,0,2029,2036,2040,0,2042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2043,0,0,0,0,0, 2045,0,0,0,0,0,0,0,2046,2047,0,2048,2049,0,2059,0,0,2063,0,2064,2065,0,0,2066,0, 0,0,0,0,0,2069,0,0,0,0,2070,0,2071,0,2072,0,0,0,0,2080,2082,2083,0,0,0,0,0,2085, 0,2086,2088,2089,2105,0,0,0,0,2107,0,0,2116,2117,0,2120,0,0,2122,0,0,0,0,0,2123, 0,0,2125,2127,2128,0,0,0,2130,0,0,0,2137,2139,2140,2141,0,0,0,0,0,0,0,0,0,2144, 2145,0,0,2146,2149,0,0,0,0,2150,0,0,2151,2158,0,2159,0,2160,0,0,0,0,0,0,2161, 2162,0,0,2194,2202,0,0,0,0,0,0,2205,2217,0,2220,0,2221,0,2222,2224,0,0,0,0,2237, 0,0,0,0,0,2238,0,2239,2241,0,0,2242,0,0,0,0,0,2243,0,0,0,0,0,0,2252,0,0,2253,0,0 ,0,2257,2258,0,0,0,2260,0,0,0,0,0,0,0,2262,0,2264,0,0,0,0,0,2269,2270,0,0,0,0,0, 0,0,0,0,2271,0,2273,0,0,0,0,2277,0,0,0,0,2278,0,0,0,0,2279,0,2280,0,2283,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2287,0,0,0,0,0,0,0,2289,2290,0,0,0,0,2291,0,2292,0, 0,0,2293,2295,2296,0,0,0,0,0,0,0,2298,0,0,0,0,0,2303,0,2305,0,0,2306,0,2307,0,0, 0,0,0,0,0,0,0,0,0,0,2313,2314,2315,2316,0,0,2318,0,2319,0,2322,0,0,2323,0,2324,0 ,2326,0,0,0,0,0,0,0,2335,0,2336,2338,2339,0,2340,0,0,0,2355,0,2375,0,2382,2386,0 ,2387,0,0,2394,0,0,0,0,2395,0,2397,0,0,0,0,0,2398,0,0,0,0,0,0,0,2399,2402,2404, 2408,2411,0,0,0,2413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2415,0,0,2416,2417,2419,0,2420, 0,0,0,0,0,2425,0,0,0,2426,0,0,0,0,0,0,0,0,0,0,0,0,2427,2428,0,2429,0,0,2430,2434 ,0,2436,0,0,0,0,0,0,2441,2442,0,2445,0,0,2446,2457,0,2459,0,0,2462,0,2464,0,2477 ,0,2478,2486,0,0,0,2491,0,0,2493,0,0,2494,0,2495,0,2513,2523,0,0,0,0,2524,0,0,0, 0,0,0,2528,2529,2530,0,0,2531,0,2533,0,0,2534,2535,0,2536,2537,0,2538,0,2539, 2540,0,0,0,2545,2546,0,0,0,0,0,0,0,2548,0,0,2549,0,2550,2555,0,0,0,0,0,2557,0, 2560,0,0,0,0,0,0,0,0,0,0,0,2561,0,2576,0,0,0,0,0,0,0,0,0,2577,2578,0,0,0,2579,0, 0,0,0,0,0,0,2580,0,0,0,0,2581,0,0,0,0,2583,0,2584,0,2588,2590,0,0,0,2591,0,0,0,0 ,2593,2594,0,2595,0,2601,2602,0,0,2603,0,2605,0,0,0,2606,2607,2611,0,2615,0,0,0, 2617,0,0,0,0,0,0,0,0,0,0,0,0,0,2619,0,0,2620,0,0,0,2621,0,2623,0,2625,0,0,2628, 2629,0,0,2635,2636,2637,0,0,2639,0,0,0,2642,0,0,0,0,2643,0,2644,0,2649,0,0,0,0,0 ,0,2655,2656,0,0,2657,0,0,0,0,0,2658,0,0,0,0,0,2659,0,0,0,0,2664,2685,0,2687,0, 2688,0,0,2689,0,0,2694,0,2695,0,0,2698,0,2701,2706,0,0,0,2707,0,2709,2710,2711,0 ,0,0,2720,2730,2735,0,0,0,0,2738,2740,0,0,0,0,2747,0,0,0,0,0,0,2748,0,0,2749,0,0 ,0,0,0,2750,0,0,2752,2754,0,0,0,0,0,2758,0,0,0,0,2762,0,0,0,0,2763,0,0,0,0,0,0,0 ,2764,2767,0,0,0,0,2768,0,0,2770,0,0,0,0,0,0,0,2771,0,0,0,0,0,0,0,0,0,2772,0,0,0 ,0,0,2773,2776,0,0,2783,0,0,2784,0,2789,0,2790,0,0,0,2792,0,0,0,0,0,0,0,0,0,0, 2793,2795,0,0,0,0,0,0,2796,0,0,0,0,0,0,2797,2799,0,0,0,0,2803,0,0,0,0,2806,0, 2807,2808,2817,2819,0,0,0,0,0,2821,0,0,0,0,2822,2823,0,0,0,0,0,0,0,2824,0,0,2828 ,0,2834,0,0,0,0,0,0,2836,0,2838,0,0,2839,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2841, 0,0,0,2842,0,0,0,0,0,2843,2844,0,0,0,0,2846,0,0,2847,0,2849,0,2853,0,0,0,0,0, 2857,0,0,0,0,2858,0,2859,0,0,2860,0,2862,2868,0,0,0,0,2875,0,2876,0,0,2877,2878, 2884,2889,2890,0,0,2891,0,0,2892,0,0,0,2906,2912,0,2913,0,0,0,0,0,0,0,0,2916,0, 2934,0,0,0,0,0,2935,0,0,0,0,2939,0,2940,0,0,0,0,0,0,0,2941,0,0,0,2946,0,2949,0,0 ,2950,2954,2955,0,0,0,2959,2961,0,0,2962,0,2963,0,0,0,0,0,0,2964,2965,2966,2967, 0,0,0,0,0,0,0,2969,0,0,0,0,0,2970,2975,0,2982,2983,2984,0,0,0,0,0,2989,0,0,2990, 0,0,0,0,0,0,0,2991,0,0,0,0,0,0,0,0,2998,0,3000,3001,0,0,3002,0,0,0,3003,0,0,3012 ,0,0,3022,0,0,3024,0,0,3025,3027,0,0,0,3030,0,0,0,0,3034,3035,0,0,3036,0,3039,0, 3049,0,0,3050,0,0,0,0,0,0,3051,0,3053,0,0,0,0,3057,0,3058,0,0,0,0,0,0,0,0,3063,0 ,0,3073,3074,3078,3079,0,3080,3086,0,0,0,0,0,0,0,0,3087,0,3092,0,3095,0,3099,0,0 ,0,3100,0,3101,3102,0,3122,0,0,0,3124,0,3125,0,0,0,0,0,0,3132,3134,0,0,3136,0,0, 0,0,0,0,0,3147,0,0,3149,0,0,0,0,0,3150,3151,3152,0,0,0,0,3158,0,0,3160,0,0,3161, 0,0,3162,0,3163,3166,3168,0,0,3169,3170,0,0,3171,0,0,0,0,0,0,0,3182,0,3184,0,0, 3188,0,0,3194,0,0,0,0,0,0,3204,0,0,0,0,3209,0,0,0,0,0,0,0,0,0,0,0,3216,3217,0,0, 0,0,0,0,0,3219,0,0,3220,3222,0,3223,0,0,0,0,3224,0,3225,3226,0,3228,3233,0,3239, 3241,3242,0,0,3251,3252,3253,3255,0,0,0,0,0,0,0,0,3260,0,0,3261,0,0,0,3267,0,0,0 ,0,0,0,0,0,3271,0,0,0,3278,0,3282,0,0,0,3284,0,0,0,3285,3286,0,0,0,0,0,0,0,3287, 3292,0,0,0,0,3294,3296,0,0,3299,3300,3301,0,3302,0,0,0,0,0,3304,3306,0,0,0,0,0,0 ,3308,0,0,0,0,0,0,0,0,0,3311,0,0,0,0,0,0,0,0,3312,3314,3315,0,3318,0,0,0,0,0,0,0 ,0,3319,0,0,0,0,0,3321,0,0,0,0,0,0,0,0,0,3322,0,0,3324,3325,0,0,3326,0,0,3328, 3329,3331,0,0,3335,0,0,3337,0,3338,0,0,0,0,3343,3347,0,0,0,3348,0,0,3351,0,0,0,0 ,0,0,3354,0,0,0,0,0,0,0,0,0,0,3355,0,0,3365,3366,3367,0,0,0,0,0,0,3368,3369,0, 3370,0,0,3373,0,0,3376,0,0,3377,0,3379,3387,0,0,0,0,0,3390,0,0,0,0,0,0,0,3402,0, 3403,3436,3437,3439,0,0,3441,0,0,0,3442,0,0,3449,0,0,0,3450,0,0,0,0,0,0,0,3451,0 ,0,3452,0,3453,3456,0,3457,0,0,3458,0,3459,0,0,0,0,0,0,0,0,0,3460,0,0,3469,3470, 0,0,3475,0,0,0,3480,3487,3489,0,3490,0,0,3491,3499,0,3500,0,0,3501,0,0,0,3502,0, 3514,0,0,0,3516,3517,0,0,0,3518,0,0,0,0,3520,3521,3522,0,0,3526,3530,0,0,0,0, 3531,0,0,0,0,3536,0,0,0,0,0,0,0,3539,3541,0,0,3542,3544,0,3547,3548,0,0,3550,0, 3553,0,0,0,0,0,0,0,3554,0,3555,0,3558,0,3559,0,0,0,0,0,0,0,0,3563,0,3581,0,0,0, 3599,0,0,0,3600,0,3601,0,3602,3603,0,0,3606,3608,0,3610,3611,0,0,0,0,0,0,0,0,0, 3612,3616,3619,0,0,0,0,0,0,0,0,0,0,0,0,0,3624,3628,0,3629,3634,3635,0,0,0,0,0,0, 3636,0,3637,0,0,3638,3651,0,0,0,0,0,0,3652,3653,0,0,0,0,3656,3657,0,0,0,0,0,3658 ,0,0,0,0,3659,0,3661,3663,3664,0,3665,0,3692,0,0,0,3694,3696,0,0,0,0,0,0,0,0,0,0 ,0,0,3698,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3700,0,0,3701,0,0,0,3708,3709,0,0,0,3711 ,3712,0,0,0,0,0,3723,0,3724,3725,0,0,3726,0,0,0,0,0,0,3728,3729,0,3734,3735,3737 ,0,0,0,3743,0,3745,0,0,3746,0,0,3747,3748,0,3757,0,3759,3766,3767,0,3768,0,0,0,0 ,3769,0,0,3771,0,3774,0,0,0,0,0,0,3775,0,0,0,0,0,0,3776,0,3777,3786,0,3788,3789, 0,0,0,0,0,0,0,0,0,3791,0,3811,0,0,0,0,0,3814,3815,3816,3820,0,0,0,0,0,0,0,3821,0 ,0,3825,0,0,0,0,3835,0,0,3848,3849,0,0,0,0,3850,3851,3853,0,0,0,0,3859,0,3860, 3862,0,0,0,0,0,3863,0,0,0,0,0,0,0,0,3873,0,3874,0,3875,3886,0,3887,0,0,0,0,3892, 3913,0,3914,0,0,0,3925,3931,0,0,0,0,3934,3941,3942,0,0,0,0,3943,0,0,0,3944,0,0,0 ,0,0,3945,0,3947,0,0,0,3956,3957,0,0,0,0,0,0,0,0,0,3958,0,3959,3965,0,0,0,0,3966 ,0,0,0,3967,0,0,0,3968,3974,0,0,0,0,0,3975,3977,3978,0,0,0,0,3980,0,3985,0,0,0,0 ,0,0,0,0,3986,4011,0,0,4017,0,0,0,0,0,0,0,0,0,0,0,4018,0,0,0,0,4019,0,4023,0,0,0 ,4027,4028,0,0,0,0,0,0,0,0,4031,4034,0,0,4035,4037,4039,4040,0,0,0,0,0,4059,0, 4060,4061,0,4062,4063,4066,0,0,4072,0,0,0,0,0,0,0,0,0,0,0,0,0,4088,0,0,0,0,0, 4091,0,0,0,0,4094,4095,0,0,4096,0,0,0,0,0,4098,4099,0,0,0,4101,0,4104,0,0,0,4105 ,4108,0,4113,0,0,4115,4116,0,4126,0,0,4127,0,0,0,0,0,0,0,4128,4132,4133,0,4134,0 ,0,0,4137,0,0,4141,0,0,0,0,4144,4146,4147,0,0,0,0,4148,0,0,4311,0,0,0,4314,4329, 0,4331,4332,0,4333,0,4334,0,0,0,4335,0,4336,0,0,0,4337,0,0,0,4342,4345,4346,4350 ,0,4351,4352,0,4354,4355,0,0,4364,0,0,0,0,4369,0,0,0,4373,0,4374,0,0,0,0,4377,0, 0,0,0,4378,0,0,0,4380,0,0,0,4381,4382,0,0,0,0,0,0,0,4384,0,0,0,0,4385,0,0,0,4386 ,0,0,0,4391,4398,0,0,0,0,4407,4409,0,0,0,0,4410,0,0,4411,0,4414,4415,4418,0,4427 ,4428,4430,0,4431,0,4448,0,0,0,0,0,4449,0,0,0,4451,4452,0,4453,4454,0,4456,0,0,0 ,0,0,0,0,4459,0,4463,0,0,0,0,0,4466,0,4467,0,4469,0,0,0,0,0,0,0,0,0,0,0,0,0,4470 ,4471,0,4473,0,0,4475,0,0,0,0,4477,4478,0,0,0,4479,4481,0,4482,0,4484,0,0,0,0,0, 0,0,4486,0,0,4488,0,0,4497,0,4508,0,0,4510,4511,0,4520,4523,0,4524,0,4525,0,4527 ,0,0,4528,0,0,0,0,4530,0,4531,0,0,4532,0,0,0,4533,0,0,0,0,0,4535,0,0,0,4536,0,0, 0,0,0,4541,4543,4544,4545,4547,0,4548,0,0,0,0,4550,4551,0,4553,0,0,0,0,4562,0,0, 4571,0,0,0,4574,0,0,0,4575,0,4576,0,4577,0,0,0,4581,0,0,0,0,0,4582,0,0,4586,0,0, 0,4588,0,0,4597,0,4598,0,0,0,0,4616,4617,0,4618,0,0,0,0,4619,0,4620,0,0,4621,0, 4624,0,0,0,0,0,4625,0,0,0,0,4657,0,4659,0,4667,0,0,0,4668,4670,0,4672,0,0,0,0,0, 4673,4676,0,0,0,0,4687,0,0,0,0,4697,0,0,0,0,4699,0,4701,0,0,0,0,4702,0,0,4706,0, 0,4713,0,0,0,4714,4715,4716,0,0,0,0,0,0,0,0,0,0,0,0,4717,0,0,4720,0,4721,4729, 4735,0,0,0,4737,0,0,0,4739,0,0,0,4740,0,0,0,4741,0,0,0,0,0,4742,0,4745,4746,4747 ,0,0,0,0,0,0,0,0,4748,0,0,0,4749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4751, 4786,0,4787,0,4788,4796,0,0,4797,4798,0,4799,4806,4807,0,0,0,0,4809,4810,0,0,0,0 ,0,0,4811,0,0,0,0,0,4812,0,4813,0,0,4815,0,4821,4822,0,0,0,0,4823,0,0,0,0,0,0,0, 0,0,0,4824,0,0,0,0,4826,0,0,0,4828,0,4829,0,0,0,4843,0,0,4847,0,4853,4855,4858,0 ,0,0,0,0,4859,0,4864,0,0,4879,0,0,0,0,4880,0,0,0,0,4881,0,4882,0,0,0,0,0,0,0,0,0 ,4883,0,0,0,0,4884,0,0,0,0,0,4886,4887,4888,4894,4896,0,4902,0,0,4905,0,0,4915,0 ,0,0,0,0,0,0,4916,4917,4919,4921,0,0,0,0,0,4926,0,0,0,0,4927,0,0,0,0,0,0,0,0, 4929,0,4930,4931,0,4938,0,4952,0,4953,4957,4960,4964,0,0,0,0,0,0,0,5019,5020, 5022,0,0,0,0,0,5023,0,0,0,5024,0,0,0,5025,0,0,0,0,5028,0,0,0,0,5029,5030,5031,0, 5033,0,0,0,0,0,0,0,0,0,5034,5035,0,5036,0,0,5037,0,0,0,0,5038,0,0,5039,0,0,0, 5041,5042,0,0,0,0,5044,5049,5054,0,5055,0,5057,0,0,0,5060,0,0,0,0,0,5063,0,5064, 5065,0,5067,0,0,0,5068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5076,0,0,0,0,0,0, 0,5077,0,0,5078,5080,0,0,5083,0,0,0,0,0,0,0,0,5085,0,0,0,0,0,0,5098,5099,5101, 5105,5107,0,5108,0,5109,0,0,0,0,0,0,0,5110,0,0,0,0,0,5117,5118,0,5121,0,5122,0,0 ,5130,0,0,0,5137,0,0,0,5148,0,0,0,0,0,0,0,5151,5154,0,0,0,5155,0,0,5156,5159, 5161,0,0,0,0,5162,0,0,0,0,5163,5164,0,5166,0,0,0,0,0,0,0,0,0,0,5167,0,0,0,5172,0 ,0,0,0,0,0,5178,5179,0,0,5190,0,0,5191,5192,5194,0,0,5198,5201,0,0,0,0,0,5203,0, 5206,5209,0,0,0,0,0,0,5213,0,5214,5216,0,0,0,0,0,5217,0,0,0,0,0,0,0,0,5218,5219, 0,5231,0,0,5244,5249,0,5254,0,5255,0,0,5257,0,0,0,0,0,5258,0,5260,5270,0,5277,0, 0,0,0,0,0,5280,5281,5282,5283,0,0,0,0,0,5284,0,5285,0,0,0,0,0,5287,5288,0,0,0,0, 0,0,0,0,0,0,5289,5291,0,0,5294,0,0,5295,0,0,0,0,0,0,0,5304,0,0,5306,5307,5308,0, 5309,0,0,5310,0,0,0,0,5311,5312,0,5313,0,0,0,0,0,5316,0,0,0,5317,0,0,0,0,0,0,0,0 ,0,5325,0,0,0,0,0,0,5326,0,5327,5329,0,5332,0,0,0,0,5338,0,0,0,0,0,0,0,0,5340,0, 0,5341,0,0,0,5342,0,5343,5344,0,0,5345,0,0,0,0,0,0,5347,5348,0,0,0,0,0,0,0,0,0, 5349,0,5350,0,5354,0,0,0,0,5358,0,0,5359,0,0,5361,0,0,5365,0,5367,0,5373,0,0,0, 5379,0,0,0,5380,0,0,0,5382,0,5384,0,0,0,0,0,0,5385,0,0,0,0,5387,0,0,0,0,0,0,5388 ,5390,5393,0,0,0,0,0,0,0,0,0,0,0,5396,0,0,0,0,5397,5402,0,0,0,0,0,5403,0,0,0, 5404,5405,0,0,0,0,0,0,0,0,0,0,0,0,5406,0,0,0,0,5410,0,0,5411,0,5415,0,0,0,0,5416 ,5434,0,0,0,0,0,0,0,0,0,0,0,5438,0,5440,0,0,0,0,0,0,5441,5442,0,0,0,5443,5444, 5447,0,0,5448,5449,5451,0,0,0,5456,5457,0,0,0,5459,0,0,0,5461,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,5464,0,5466,0,0,5467,0,5470,0,0,5473,0,0,5474,0,0,5476,0,0,0,0,0,0,0,0 ,0,0,0,5477,0,0,0,0,0,0,0,5484,0,0,5485,5486,0,0,0,0,0,5488,0,0,0,0,0,0,0,5489,0 ,0,0,0,0,5507,0,0,0,5510,0,5511,0,0,5512,0,0,0,5513,0,5515,0,0,5516,5517,0,5518, 0,0,5522,0,0,0,0,0,5534,5535,0,0,5536,0,5538,0,0,5543,0,5544,0,0,5545,0,5547,0, 5557,0,0,5558,0,5560,5567,0,0,0,0,5568,0,0,0,5571,5573,0,5574,0,5575,0,0,0,0, 5577,0,0,5598,0,0,0,0,0,0,0,0,0,5600,5609,0,0,0,0,5610,0,0,5612,0,5624,0,5625,0, 0,0,5629,0,5641,0,5642,5643,0,0,0,0,0,0,5651,0,0,0,5652,5653,0,5661,5662,5678,0, 5679,0,0,0,0,5685,5686,0,0,0,0,0,5690,5692,0,5703,0,0,0,0,0,5706,0,0,0,0,5707,0, 0,0,0,0,0,5708,0,0,5709,0,5710,0,0,0,5712,0,5733,0,5734,5735,0,0,5744,5751,0,0,0 ,0,0,0,0,0,0,0,0,0,5752,0,5754,0,0,0,0,0,0,5757,5758,0,5760,5761,0,0,0,0,5763, 5764,5765,0,5766,0,5767,5768,0,5770,0,0,0,0,5776,5780,0,0,0,0,5782,0,0,0,0,5784, 0,0,5788,0,0,0,0,0,0,0,0,0,0,0,5797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5799,0,0,5801, 0,0,0,5811,0,0,0,0,0,0,5816,0,0,5827,0,0,0,0,0,0,0,0,5830,5831,0,0,5832,0,0,5833 ,0,5835,5844,5845,0,5846,0,0,0,0,0,5850,0,0,0,0,0,5852,0,5855,5857,0,0,5859,0, 5861,0,0,5863,0,5865,0,0,0,5873,5875,0,0,0,5877,0,5879,0,0,0,5888,0,0,5889,5891, 0,5894,0,0,0,0,0,0,5895,0,5897,0,0,0,0,0,0,5907,0,5911,0,0,5912,0,5913,5922,5924 ,0,5927,5928,0,0,0,0,5929,5930,0,5933,0,0,0,0,5949,0,0,5951,0,0,0,0,0,0,0,0,5953 ,0,0,5954,0,5959,5960,5961,0,5964,0,0,0,5976,5978,5987,5990,0,0,0,0,0,5991,0, 5992,0,0,0,5994,5995,0,0,5996,0,0,6001,6003,0,0,0,0,6007,0,0,0,0,0,6008,0,0,6009 ,0,6010,0,0,0,6011,6015,0,6017,0,6019,0,6023,0,0,0,0,0,0,0,6025,0,0,0,0,0,0,0,0, 0,0,6026,0,6030,0,0,6032,0,0,0,6033,6038,6040,0,0,0,6041,6045,0,0,6046,0,0,6053, 0,0,6054,0,6055,0,0,0,0,0,0,6057,0,6063,0,0,0,6064,0,6066,6071,6072,0,0,0,0,0,0, 6075,6076,0,0,6077,0,0,0,0,0,0,0,0,0,6078,6079,0,0,0,0,0,0,0,0,6080,0,6083,0,0,0 ,0,0,6084,0,0,6088,0,6089,0,0,6093,6105,0,0,6107,0,6110,0,0,0,6111,6125,6126,0,0 ,0,6129,0,0,0,0,6130,0,0,0,6131,6134,0,0,0,0,0,0,6142,0,0,0,0,0,6144,0,0,6146, 6151,6153,0,6156,0,6163,0,6180,6181,0,0,0,0,0,6182,0,0,0,0,6184,6195,0,0,6206,0, 6208,0,0,6212,6213,6214,0,6215,0,0,0,6228,0,0,0,6234,0,0,0,0,0,0,6235,6240,0, 6242,6243,6244,0,6250,6255,0,0,0,0,0,6257,0,0,0,6258,6278,0,6284,0,0,0,6285,0,0, 0,0,0,0,0,0,6286,0,0,0,6320,0,0,6322,6332,0,0,0,0,0,0,0,0,6334,0,0,0,0,0,0,0, 6335,0,0,6337,0,6338,0,6339,6340,0,0,6356,6357,6369,0,0,0,6370,6371,6372,0,6373, 0,0,0,0,0,6376,0,0,0,0,0,6382,6383,6384,0,0,0,0,6386,0,6389,6397,6400,6411,0, 6414,0,0,0,0,0,0,0,6415,6416,0,0,0,0,0,0,6417,0,0,0,0,6418,0,0,0,0,0,0,0,6420,0, 6421,6423,6425,0,6429,6430,0,6433,6438,0,0,0,0,0,0,0,0,0,0,6439,6440,0,0,6441,0, 0,6444,0,0,0,0,6446,0,0,0,0,6447,6448,0,0,6450,0,0,0,6454,0,0,6455,0,6461,0,0,0, 0,0,0,6462,0,0,6463,0,6464,0,6465,6467,0,0,0,6468,0,6479,6480,0,0,0,0,0,0,0,6481 ,0,0,6485,6487,0,0,0,0,0,0,6493,0,0,0,0,0,0,0,0,6494,6495,6496,0,0,0,0,0,6498,0, 0,0,6507,6508,0,0,0,0,0,0,0,0,0,0,6511,6512,0,0,0,0,6513,0,0,0,6514,0,0,0,0,0, 6516,0,0,6517,6518,0,0,0,6519,6520,6521,0,6523,0,0,0,0,6524,6528,0,6530,0,0,6532 ,0,6578,0,0,0,6583,0,6584,0,0,0,6587,0,0,0,6590,0,6591,0,0,0,0,0,6592,0,0,0,0, 6593,6594,0,0,0,0,0,6599,6600,0,0,6601,6602,6604,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 6608,0,0,0,0,0,0,0,0,6610,6611,0,6615,0,6616,6618,6620,0,6637,0,0,0,0,6639,0,0,0 ,0,6641,0,6642,0,0,0,6647,0,6660,6663,0,6664,0,6666,6669,0,6675,6676,6677,0,0,0, 0,0,0,0,0,0,6678,0,0,0,6679,0,6680,0,0,0,0,0,0,0,6693,0,0,0,0,0,0,0,0,0,6704, 6705,6706,0,0,6711,6713,0,0,0,0,0,6716,0,0,0,6717,0,6719,6724,0,0,0,0,0,0,0,0, 6725,6726,0,0,0,0,0,6728,6729,6735,0,6737,6742,0,0,6743,6750,0,6751,0,0,6752, 6753,0,0,0,0,0,0,6754,0,0,0,0,0,6756,0,0,0,0,0,0,6763,0,0,6764,6765,0,0,0,6770,0 ,0,0,6776,6780,0,6781,0,0,0,6783,0,6784,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 6785,0,0,0,6792,0,0,0,6793,0,0,6802,0,0,0,0,0,6803,0,0,0,6804,0,0,0,6812,0,0, 6823,0,6824,6839,0,0,0,0,6852,0,0,6854,0,6856,6857,0,0,0,0,0,0,0,0,0,6867,0,6868 ,6870,6872,0,0,0,6873,6874,0,0,0,0,0,6875,0,0,6877,0,0,0,0,0,0,0,6878,0,0,0,6879 ,0,6880,0,0,0,0,0,0,0,0,0,0,6887,0,6888,6891,6893,0,6895,0,0,0,0,0,0,0,0,6899,0, 0,0,0,6901,0,0,0,0,6910,0,6911,0,0,6912,0,0,6913,6914,0,0,0,6915,0,0,0,6916,6919 ,0,0,0,0,0,0,6924,0,6925,0,0,0,6926,6927,6928,0,6929,0,6930,0,0,6931,6935,0,6936 ,0,0,0,0,6939,6940,6941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6942,6948,6949,0,0,0,0,0,0 ,0,6952,6954,6963,6965,6966,0,0,6967,6968,0,0,0,0,0,0,0,0,0,6969,0,0,6970,6979,0 ,0,6980,0,0,6983,0,0,0,0,0,6984,0,0,0,0,0,0,0,6988,6990,6992,0,0,0,0,0,0,0,6995, 0,0,0,7012,0,0,0,0,0,0,0,0,0,7019,0,0,0,0,0,0,0,0,7021,0,0,7022,7023,7028,0,7030 ,7033,0,0,0,0,0,0,7038,0,0,0,0,0,0,0,0,0,0,7039,0,0,0,0,0,7046,0,7047,0,0,0,0,0, 0,0,0,0,0,0,7048,7052,0,0,0,0,0,7054,0,7060,0,0,0,0,7061,0,7065,0,0,0,0,7067, 7069,0,7070,7071,7072,0,0,7078,0,7080,7081,0,7083,0,0,0,7084,7087,7088,0,0,7090, 0,7093,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7107,0,0,7108,0,0,0,0,0,0,0,0,7110,0,7114,0 ,0,0,0,0,0,0,7115,0,7116,0,0,0,0,0,7117,0,0,7118,0,0,7124,0,7125,0,0,7126,0,0,0, 0,7128,0,0,0,0,0,7129,0,7130,0,7132,7133,0,0,7134,0,0,7139,0,7148,7150,0,0,0,0, 7152,0,0,0,7153,7156,7157,0,0,0,0,0,7158,0,0,0,0,0,0,0,0,0,0,7163,7165,7169,0, 7171,0,0,0,0,0,0,0,0,0,7172,0,7173,7181,0,0,0,0,0,7182,7185,0,0,0,0,7187,0,7201, 7204,0,0,0,0,0,7206,7207,0,0,0,0,7211,7216,0,7218,0,0,0,0,7226,7228,7230,7232, 7233,7235,7237,0,0,0,0,7238,7241,0,7242,0,0,7247,0,0,0,7266,0,0,0,0,0,0,0,7289,0 ,0,7290,7291,0,0,7292,0,7297,0,0,0,0,0,0,0,0,0,0,7300,0,7301,0,0,0,0,0,0,0,0,0,0 ,0,0,7302,0,0,0,0,7305,0,0,0,0,7307,0,7308,0,7310,0,7335,0,0,0,0,0,0,0,7337,0, 7343,7347,0,0,0,0,0,7348,0,7349,7350,7352,7354,0,0,0,0,7357,0,7358,7366,0,7367, 7368,0,0,7373,0,0,0,7374,0,0,0,0,0,0,0,7376,0,0,0,7377,0,0,0,0,0,7378,0,7379, 7380,0,0,0,0,0,7383,0,0,7386,0,0,0,0,7398,0,0,0,7399,7400,0,7401,0,0,0,0,0,0,0, 7402,0,0,0,0,0,7405,0,0,0,0,0,7406,0,0,0,0,0,0,0,0,7421,7427,7429,0,0,0,7435,0,0 ,7436,0,0,0,7437,0,0,0,0,0,0,7438,7443,0,7446,0,7448,0,0,0,0,0,0,0,0,0,0,7456,0, 0,0,0,0,7457,0,0,7461,0,0,0,0,0,7462,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7463,7466,7472, 0,7476,0,0,7490,0,7491,0,0,7493,0,0,0,7498,7499,0,0,7508,0,0,0,0,0,7512,0,0,0, 7513,7514,7516,0,0,0,0,7518,0,0,7519,7521,7522,0,0,0,7526,0,0,7529,0,0,7531,0, 7536,0,7538,0,7539,0,0,7541,7542,7546,0,0,0,0,0,7547,0,7548,0,0,0,0,0,7550,0,0, 7552,7553,0,0,0,0,0,0,0,0,0,0,7554,7563,0,7573,0,0,0,0,0,0,7574,7576,0,7578,7581 ,7583,0,0,0,7584,0,7587,0,0,0,0,0,7589,0,0,0,7594,0,0,7595,0,0,7600,7602,7610,0, 0,0,0,0,7612,0,7613,7614,0,0,7615,0,0,7616,0,7620,0,7621,7622,0,7623,0,0,0,0, 7626,0,0,0,0,7627,7629,7631,0,0,7633,0,0,0,0,0,7639,0,7640,7642,0,0,7643,0,0,0,0 ,7644,0,0,0,0,0,0,0,7645,0,0,0,0,0,7661,7662,7663,7665,0,7666,0,7667,0,7684,7688 ,7690,0,7691,0,0,0,0,0,0,7692,0,0,7700,0,7707,0,7708,0,7709,0,7721,0,0,0,7722,0, 7724,0,0,0,0,0,0,7729,7731,0,7732,0,7733,7735,0,0,0,0,0,0,0,7739,0,0,7741,7745,0 ,7748,0,0,0,7751,0,0,0,7752,0,0,0,0,0,0,0,7753,0,0,7756,0,7757,0,7759,0,7760,0,0 ,0,0,7761,7768,0,0,7769,0,0,7770,0,0,7771,0,0,7772,0,0,7773,0,0,0,0,0,7778,7783, 0,0,0,0,0,7784,7785,0,7790,0,0,0,0,7792,0,7798,0,0,0,0,0,7799,0,7810,0,0,7813,0, 7814,0,7816,0,7818,7824,7825,7826,0,7828,7830,0,0,0,7840,0,7842,0,7843,0,0,0,0, 7844,0,0,0,0,0,0,0,7846,0,0,0,0,0,7856,7857,7858,7862,0,7865,0,0,7866,0,0,7913,0 ,0,0,0,7914,0,0,7915,7917,7918,7919,0,7920,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7921, 7922,0,7924,0,0,7925,0,0,7927,0,7930,7935,0,0,7937,0,0,0,0,0,0,7939,0,7940,0,0,0 ,0,0,7941,0,0,0,0,7945,0,0,0,0,7949,0,0,0,0,0,0,0,0,7950,0,7953,0,0,0,0,0,0,0, 7968,0,0,0,0,7969,7972,7992,0,7993,0,0,0,0,0,0,0,0,0,0,0,7994,0,0,0,0,8007,8008, 0,0,0,0,0,0,0,0,0,0,0,0,8010,0,0,0,8012,0,0,0,0,0,0,0,0,8018,0,8028,8029,0,0, 8030,0,0,8032,8033,0,0,8034,8036,0,0,0,0,0,0,0,0,0,0,8037,0,0,0,8043,8052,8059, 8060,0,0,8061,0,0,0,8062,0,8063,0,8064,0,8066,8068,0,0,0,8080,8081,0,8089,0,0,0, 0,0,8092,0,0,0,0,0,0,8093,8110,0,0,0,0,0,0,0,8111,0,0,0,0,0,8112,8115,0,8117,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8120,8121,8122,8128,8129,8130,8131,0,0,8139,0,0, 8144,0,0,0,0,8145,8146,8153,0,0,0,0,0,0,0,0,8154,0,8157,8160,8162,0,8164,8165,0, 0,0,0,8166,8167,0,0,8179,0,0,0,8185,0,0,0,8186,0,0,8187,0,0,0,8188,0,0,0,0,0, 8204,0,0,0,0,8210,0,0,0,0,0,8213,0,8214,0,0,8215,0,0,0,0,0,0,8218,0,0,0,0,0,0,0, 0,0,8219,0,8221,0,0,8222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8225,0,0,0,8233,0,0, 8242,0,0,0,0,0,0,0,0,0,0,0,8247,0,8248,8252,0,8256,8257,0,0,8261,0,8264,8265,0,0 ,0,0,8267,0,0,0,8269,0,0,0,0,0,0,0,0,0,8270,0,0,0,8278,0,8279,8283,0,0,8285,8286 ,8289,8292,0,0,0,0,8293,8295,8299,8300,8301,0,0,0,0,0,0,8304,8307,0,0,0,0,0,0,0, 8321,0,0,0,8322,8323,8325,8326,8327,0,0,8332,8338,0,0,8340,0,0,0,0,0,8350,0,0, 8351,0,8354,8355,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8360,8372,0,0,0,0,0,0,0,0,8377,0,0, 0,0,8380,0,0,0,8383,0,8384,0,0,0,0,8386,8392,0,0,8394,0,0,0,0,0,0,0,8396,8397,0, 8398,0,8399,0,0,0,0,0,8400,0,8401,8410,8411,0,8412,8413,8422,0,0,0,0,8423,0,0,0, 0,8424,0,0,8425,0,0,0,0,0,0,0,8441,8442,0,0,0,0,0,0,8443,0,0,8444,0,8447,0,0,0,0 ,8451,0,8458,0,8462,0,0,8468,0,8469,0,0,0,8470,0,8473,8479,8480,0,0,0,0,8481, 8483,0,0,0,0,0,0,0,0,0,8484,0,0,8490,0,0,0,0,0,0,8491,8493,8494,0,8528,0,0,0,0,0 ,0,0,8530,0,0,0,0,0,0,0,0,8534,8538,8540,0,0,8541,0,0,8545,0,8557,0,0,8569,8570, 0,0,8571,8574,8575,8579,0,8583,0,0,0,0,8591,0,0,0,0,0,0,0,0,8606,0,8607,0,0,0,0, 0,0,0,0,0,8608,0,0,8609,0,0,0,8610,0,0,0,8611,0,0,8613,8617,8621,0,0,8622,0,8623 ,0,8624,8625,0,0,0,0,0,0,0,0,0,8637,8638,8639,8650,0,0,0,0,8652,8654,8655,0,0,0, 0,0,0,0,0,0,0,8656,0,0,0,0,0,8657,0,0,0,0,0,0,0,0,0,8658,0,0,8659,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,8660,0,0,0,0,0,0,8661,8663,8664,0,0,0,0,8665,0,8669,0, 0,0,0,0,0,0,8671,8674,0,8684,0,8686,0,0,0,8689,0,0,0,8690,0,8706,0,0,0,0,0,0,0,0 ,0,0,0,8710,0,8711,8713,8714,8724,8727,8728,8733,8736,0,8737,8739,0,0,0,0,8742, 8743,8745,8754,0,0,0,0,8756,0,0,0,0,0,0,8757,8760,0,0,0,0,0,8762,8763,8764,0, 8766,8769,8770,8773,0,8774,0,8779,0,0,0,0,8780,0,0,8781,0,0,8783,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8784,0,0,0,0,0,0,0,0,8785,0,0,0,0,8786,0,0,0,0,8788 ,8790,0,0,0,8803,0,8813,8814,0,0,0,0,0,8815,8816,0,0,0,0,8818,0,0,0,0,8822,8828, 8829,0,8831,0,0,0,0,8833,0,0,0,8834,0,0,0,8835,0,8836,0,0,0,8837,0,0,0,0,0,0, 8838,8839,0,0,0,0,0,0,0,0,0,0,0,8840,0,0,0,8841,0,8842,0,0,0,8846,0,0,0,0,0,0,0, 8847,0,8848,0,0,8864,0,0,8866,0,0,8870,8872,0,0,8873,8874,0,0,0,0,0,0,8875,0, 8876,0,0,0,0,8896,8900,0,0,0,0,8901,0,0,0,0,0,8904,0,8907,0,0,0,0,8911,8912,8913 ,0,0,0,8914,0,8915,0,0,0,0,0,0,0,0,0,0,0,0,8916,0,0,0,8929,0,0,0,0,0,0,0,0,0,0, 8930,0,8932,0,8943,0,0,0,8945,8947,0,0,0,0,8949,0,8950,0,8954,8957,0,0,8970,0,0, 0,0,8971,0,8996,0,0,0,0,8997,9000,0,0,0,0,9001,9002,0,9004,9009,9024,0,0,0,0,0,0 ,0,0,0,0,0,0,9027,9082,0,0,9083,9089,0,0,0,0,0,0,9090,0,0,0,9092,0,0,9093,0,9095 ,0,0,9096,9097,9101,9102,0,0,0,0,0,0,0,0,9112,0,0,0,0,0,0,9114,0,0,9120,0,9121, 9122,0,0,0,9123,9124,0,0,9125,0,0,9126,0,9127,0,0,9129,9131,0,0,0,9132,0,0,9136, 0,9144,0,0,9148,0,0,0,0,0,0,9149,0,9152,9163,0,0,9165,0,0,0,0,0,0,0,0,0,0,0,0,0, 9166,0,9169,0,0,0,0,0,0,0,9170,0,0,0,0,9172,0,9174,9175,9176,0,9177,0,0,0,0,0,0, 0,0,9186,0,9187,0,0,0,9188,9189,0,0,9190,0,0,0,0,9191,0,0,0,9193,0,0,0,0,9197, 9198,0,0,0,9208,9211,0,0,0,0,9216,9217,0,9220,0,0,0,0,9221,9222,9223,0,9224,9225 ,0,0,9227,0,9228,9229,0,0,9230,0,9232,0,9233,0,0,0,0,0,9234,9235,0,0,9237,0,0,0, 0,0,0,0,0,9238,9240,0,0,9241,0,0,0,0,9244,0,0,0,0,9247,0,0,0,0,0,0,0,0,0,0,9248, 0,0,0,9249,0,0,0,0,0,9250,0,0,0,0,9251,0,0,9252,9255,0,0,0,9256,0,0,0,0,0,0,0, 9257,0,0,9258,0,0,0,0,0,0,9259,0,0,0,0,0,9262,9263,0,0,9265,9266,0,0,0,0,0,0,0,0 ,9268,9271,0,0,0,0,0,0,0,0,0,9273,0,0,0,9276,9277,9279,0,0,0,0,0,0,0,9280,0,0, 9293,0,0,0,0,0,9297,9301,0,0,0,0,0,0,0,0,0,0,0,9308,9309,9313,9321,9322,0,9326, 9327,0,0,9477,0,9479,0,0,0,0,9482,0,0,0,9483,0,9484,0,0,0,0,0,0,0,0,0,9485,0,0, 9486,0,0,0,9489,0,0,0,0,9490,9491,0,0,0,0,9493,0,9495,9496,0,0,0,0,0,0,0,0,9500, 0,9502,0,0,0,0,0,9504,9507,0,9509,0,9511,0,0,9513,0,0,0,0,0,0,0,0,9515,0,0,0,0,0 ,0,9516,9517,0,0,0,0,9532,0,0,9533,0,0,9538,0,9539,9540,0,0,0,0,9541,0,0,0,9542, 0,0,0,0,0,0,0,0,9544,9545,0,9546,0,0,0,0,0,0,9547,9548,0,0,0,9550,0,9557,0,9558, 0,9561,0,9563,9570,0,9572,9574,9575,0,0,0,9577,9592,0,0,9596,0,0,0,9598,0,9600,0 ,9601,0,0,0,0,0,0,9608,0,9638,9639,0,0,0,0,0,0,0,9641,0,0,9643,9644,9645,9646,0, 0,0,9648,0,0,0,0,0,0,0,9650,9654,0,0,0,0,0,0,0,0,9655,0,0,0,0,0,9656,0,9657,0,0, 0,0,9658,0,0,9659,0,0,9664,0,0,9665,0,9667,9669,0,0,0,0,0,0,0,0,0,0,0,0,9671,0, 9673,9681,0,0,0,0,9682,9683,9684,0,0,0,0,9686,9698,0,0,9700,9701,9702,0,9703, 9717,0,0,0,0,9718,0,9726,0,0,0,0,9727,0,0,0,9728,0,9742,0,9744,0,0,0,9750,0,9754 ,9755,0,0,0,0,0,9756,0,9757,9768,0,9769,0,0,0,9770,9771,0,9773,0,9774,0,9775,0,0 ,0,9776,9777,9784,0,0,0,9786,0,9789,0,0,0,0,9793,9794,0,0,0,9808,0,0,0,0,0,9811, 0,0,0,0,0,0,0,0,0,0,0,0,9812,0,9820,0,9823,0,9828,0,0,0,0,9830,0,0,9833,9836,0,0 ,0,9840,0,0,0,9841,0,0,9842,0,9845,0,0,0,9847,9848,0,0,9855,0,0,0,0,0,0,9856, 9863,9865,0,0,0,0,0,0,0,0,9866,9867,9868,9873,9875,0,0,0,0,0,0,9880,0,9886,0,0,0 ,9887,0,0,9891,0,0,0,0,0,0,0,9906,9907,9908,0,0,0,9909,0,0,0,0,0,0,9910,0,0,0,0, 9913,0,0,0,0,9914,0,0,0,0,0,9922,0,0,0,0,9923,9925,0,0,0,0,0,0,9930,0,0,0,9931,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9932,0,9939,0,0,9940,9962,9966,0,9969,9970,0,0,9974 ,0,9979,9981,9982,0,0,0,9985,0,0,0,0,0,0,9987,0,0,0,0,0,0,0,9988,9993,0,0,9994,0 ,0,0,9997,0,10004,0,0,0,0,0,10007,10019,10020,10022,0,0,0,10031,0,0,0,0,0,10032, 0,0,10034,0,10036,0,0,0,0,10038,0,10039,10040,10041,10042,0,0,0,0,0,10043,0,0,0, 0,0,10045,10054,0,0,0,0,10055,0,0,10057,10058,0,0,0,0,0,0,10059,0,0,0,0,0,0,0, 10060,0,0,0,0,0,0,0,10063,0,10066,0,0,0,10070,0,10072,0,0,10076,10077,0,0,10084, 0,10087,10090,10091,0,0,0,10094,10097,0,0,0,0,0,0,10098,0,0,0,0,0,0,10103,0, 10104,0,10108,0,0,0,0,0,0,0,0,10120,0,0,0,10122,0,0,10125,0,0,0,0,10127,10128,0, 0,10134,0,10135,10136,0,10137,0,0,10147,0,10149,10150,0,0,10156,0,10158,10159, 10160,10168,0,0,10171,0,10173,0,0,0,10176,0,0,0,0,10177,0,0,0,0,10178,0,0,0,0, 10194,0,10202,0,0,10203,10204,0,10205,10206,0,10207,0,0,0,0,10209,0,0,0,0,0,0,0, 10213,0,0,0,0,0,0,10217,0,10229,0,10230,10231,0,0,10232,0,0,10237,10238,10244,0, 0,0,0,0,10250,0,10252,0,0,0,0,0,0,10255,0,0,10257,0,0,0,0,0,0,10258,0,10259,0,0, 0,0,0,0,0,0,10260,0,0,0,0,0,0,0,10284,10288,10289,0,0,0,10290,0,10296,0,0,0,0,0, 10297,0,0,0,0,0,0,10298,0,0,0,0,10299,10303,0,0,0,0,0,10306,0,0,0,10307,0,10308, 0,0,0,0,10311,0,0,0,0,0,0,0,10315,10317,0,0,0,10318,10319,0,10321,0,10326,0, 10328,0,0,0,0,10329,0,0,10331,0,10332,0,0,0,0,0,0,10334,0,0,10335,10338,0,0,0,0, 0,10339,10349,0,0,0,0,0,0,10351,0,10353,0,0,0,0,0,0,10362,0,10368,0,10369,0,0,0, 10372,10373,0,0,0,0,0,10374,0,0,0,10375,0,10376,0,0,10386,10388,10390,0,0,0,0,0, 0,0,10391,0,0,10392,10394,0,0,10396,0,10397,0,10403,0,0,0,0,0,0,0,0,10404,0, 10405,10410,0,0,10411,0,10412,0,0,0,0,0,0,0,10421,10422,10423,0,0,0,0,0,0,0,0,0, 10425,0,0,10427,0,0,10430,0,0,0,0,0,10432,0,10433,10434,0,0,0,0,10436,10437,0, 10438,0,10439,0,10444,10446,0,0,0,0,0,10448,0,0,0,0,0,10449,0,0,0,0,0,0,0,10451, 0,10453,0,0,0,10454,10457,0,0,10459,0,10469,0,0,0,0,0,10472,10481,0,0,0,0,0, 10482,10483,0,10492,0,0,0,0,0,0,0,0,0,0,10499,0,0,0,10502,0,0,10510,0,10521, 10524,0,0,10525,10526,10528,0,0,0,0,0,0,0,0,10530,0,0,0,0,10533,0,10534,0,0,0,0, 0,0,0,0,0,0,10535,10536,0,0,10544,0,10553,10556,0,10557,10559,0,0,0,0,0,10562, 10563,10564,0,10565,0,0,0,10566,0,10567,0,0,0,0,10575,0,0,10576,0,10578,0,0,0,0, 0,0,0,0,0,0,10585,10586,10587,10589,0,10590,0,0,10594,0,0,0,0,0,10598,0,0,10601, 0,0,0,10602,0,10603,0,10604,0,10605,0,0,10607,0,10626,0,10627,0,0,0,0,0,10629, 10630,10631,0,0,0,10646,0,0,0,10647,0,10650,0,10651,0,0,0,10652,10653,10655,0, 10658,0,0,10659,0,10667,0,0,0,0,10669,0,0,0,0,0,0,0,0,0,10670,0,0,0,10671,0,0,0, 0,10672,10673,0,10674,0,0,0,10676,0,0,0,0,0,0,10678,0,10682,0,0,10692,0,10697,0, 0,0,0,10698,0,0,0,10700,0,0,0,0,0,10703,0,10704,0,0,0,0,0,0,0,10705,0,10715, 10718,10720,0,0,10722,0,0,0,0,0,0,0,0,10723,0,0,0,0,10726,0,0,0,0,0,10727,10730, 10743,0,0,0,0,0,0,10744,0,0,10745,0,0,0,0,0,0,10748,0,0,0,0,10750,0,0,10752, 10753,0,0,0,10756,0,0,0,0,0,0,10758,0,0,0,10759,0,10769,0,0,10772,0,0,0,0,0,0, 10773,0,0,0,10777,0,0,10779,0,0,0,0,0,0,0,0,10780,10784,0,0,0,10789,0,0,0,10791, 0,0,0,0,0,0,0,0,0,10795,0,0,10796,0,10808,0,10809,0,0,0,10810,0,0,0,10812,0,0, 10814,0,0,0,0,0,0,0,0,0,10815,0,0,0,0,10816,10817,0,0,0,0,10819,0,10820,0,0,0,0, 10821,10822,10823,0,10826,10849,0,0,0,0,10850,0,0,10852,0,10853,0,0,10856,0,0, 10857,10858,10859,10860,0,0,0,0,0,0,10863,0,10866,10867,10872,10890,0,0,10891, 10892,0,0,0,0,0,10893,0,0,0,10896,10899,0,0,10900,10902,0,0,0,0,0,10903,0,0,0,0, 0,0,0,0,0,0,0,0,10905,0,10906,0,0,0,0,10908,10911,0,10912,0,0,10916,0,0,0,0,0, 10917,0,10918,0,0,0,10923,0,0,0,0,0,10924,0,0,10928,10929,0,0,10930,0,0,0,10932, 0,0,0,0,10939,0,0,10945,0,0,0,10947,0,0,10948,0,0,0,0,0,0,0,0,0,0,0,0,10958,0, 10960,10962,0,0,10964,0,0,0,10966,0,0,0,0,0,0,0,0,0,0,10967,0,0,0,10968,0,0,0, 10973,0,0,0,0,0,10975,0,0,0,10976,10978,0,0,10982,10984,10987,0,0,10988,0,10989, 0,0,10991,0,0,0,0,10992,0,0,0,10993,0,10995,0,0,0,10996,10997,0,0,0,10998,0, 10999,0,11001,0,0,0,0,0,0,11010,11012,0,11013,11016,11017,0,0,11019,11020,11021, 0,0,0,0,0,0,0,0,0,0,0,0,11022,0,0,11023,11029,0,0,0,0,11031,0,0,0,11034,0,0,0,0, 11055,0,0,0,0,0,11056,11060,0,0,0,0,0,0,11061,0,0,11064,11065,0,11066,0,11069,0, 11085,0,0,0,0,0,11086,0,0,0,11088,0,0,0,11094,0,0,0,11095,11096,0,0,0,0,0,0, 11097,11098,0,0,0,0,0,0,11099,0,0,11102,11108,0,0,0,11109,0,11114,11119,0,11131, 0,0,0,11142,0,0,11143,0,11146,0,11147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11148,0, 11149,11152,11153,11154,0,11156,0,11157,0,0,0,11158,0,0,11159,11160,0,0,0,0,0,0, 0,0,0,0,0,0,11163,0,0,11164,11166,0,0,0,11172,11174,0,0,0,11176,0,0,0,0,0,11182, 11183,0,0,0,11184,11187,0,0,11188,11189,0,0,0,0,0,0,11194,0,0,0,0,0,0,0,11200, 11202,0,0,0,0,0,0,11203,0,11204,0,0,0,0,0,11205,0,0,0,11206,0,11207,0,0,11209,0, 11211,0,11214,0,0,11231,0,0,0,11293,11295,0,0,11296,11297,11302,0,0,0,11307,0,0, 0,0,11309,11310,0,11311,0,0,0,11313,0,11314,0,0,0,0,11334,0,11338,0,0,0,11339,0, 0,0,0,0,11340,0,11341,11342,0,11344,0,11345,0,0,0,11348,11349,0,0,11350,0,0,0, 11355,0,0,0,0,0,0,11356,0,11357,11370,0,0,11371,0,11374,11376,0,0,0,11377,0,0, 11378,11383,0,11386,11399,0,11400,11406,0,0,0,11408,0,0,11409,11412,0,0,0,0, 11417,0,0,0,11418,0,11421,0,11426,11429,0,0,0,0,0,11430,0,11437,0,11438,0,0,0,0, 0,11440,11453,0,0,0,0,0,0,11454,0,0,0,0,11455,0,0,11456,11460,11461,11463,0, 11469,0,11473,0,0,0,0,11474,0,0,0,11475,0,11476,11477,11480,0,0,0,0,11481,0,0, 11484,0,0,11487,0,0,0,0,0,0,0,0,0,0,11497,0,0,11502,0,11509,0,0,11510,11511, 11513,0,0,0,0,0,0,0,0,0,0,11515,0,0,0,0,11516,0,11520,11521,0,0,0,0,0,0,0,0,0,0, 0,11529,11530,11531,11534,0,0,11543,0,0,0,0,0,11547,0,11548,0,0,0,0,0,11552, 11556,0,11557,0,0,11559,0,11560,0,0,0,0,0,0,11561,0,0,11563,11564,0,11565,0,0,0, 0,11567,0,0,0,11569,0,11574,0,11575,0,0,0,11577,0,11578,0,0,0,11580,11581,0,0,0, 11582,11584,0,0,0,0,0,0,0,11587,0,11588,11591,0,11595,0,0,0,0,0,0,0,0,11596,0, 11597,0,0,0,0,11598,11601,0,0,0,11602,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11603, 11604,0,11606,0,0,11608,0,0,0,0,11610,0,0,11611,0,0,0,0,11613,0,11622,0,0,0, 11623,0,0,0,0,11625,0,0,11626,11627,11628,11630,0,0,0,0,0,0,11639,0,0,11646,0, 11648,11649,0,11650,0,0,0,0,0,0,0,0,0,11651,0,0,11652,11653,11656,0,0,11677, 11679,0,0,0,0,11680,0,0,11681,0,11685,0,0,0,0,0,0,0,0,11688,0,0,0,11716,0,11719, 0,0,0,0,0,11721,0,0,11724,11743,0,0,0,0,0,0,0,0,11745,11748,11750,0,0,0,0,0, 11751,0,0,0,11752,11754,0,11755,0,0,0,0,0,0,0,11759,0,0,0,0,0,0,11760,0,0,0, 11761,0,0,0,0,0,0,11766,11767,0,11772,11773,0,11774,0,0,11775,0,11777,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,11778,11780,0,0,0,0,0,0,0,11783,0,11784,0,0,0,11785, 0,0,0,11786,0,0,0,0,11788,0,0,11789,11791,11792,0,0,0,0,11795,11834,11835,11836, 0,0,11837,0,0,0,11838,0,0,11846,11851,0,11852,0,11869,0,0,0,11871,0,0,0,11872, 11874,0,0,0,0,0,0,11875,0,11876,11877,0,0,0,0,0,0,0,0,0,0,11883,0,0,0,0,0,0,0, 11884,0,11885,0,11886,0,0,11887,0,11894,11895,11897,11909,11910,0,11912,11918,0, 0,11920,0,11922,11924,11927,11928,0,0,0,0,11929,0,11934,0,0,0,0,0,11941,11943, 11944,0,11945,0,0,0,0,11948,11949,0,0,0,0,11953,0,11954,0,11955,0,11956,0,0,0,0, 0,11957,0,0,11959,0,0,0,0,0,0,0,0,11961,0,0,0,0,0,11978,0,0,0,11979,11980,11986, 11987,0,11992,0,0,0,0,0,11993,0,0,0,11994,0,11999,12004,12005,12006,0,0,0,0,0, 12011,0,0,12012,12014,0,0,12015,0,0,12019,12028,0,0,12029,0,0,12032,12033,0,0,0, 0,12034,0,12041,12043,0,0,12044,0,0,0,0,0,0,0,12046,0,0,0,0,0,0,0,12054,12055,0, 12056,0,0,0,12060,12064,0,0,0,0,0,12065,12067,12068,0,0,0,0,0,0,0,0,12074,0,0,0, 12075,12076,0,0,0,12079,0,12081,12086,12087,0,0,12088,0,0,0,0,12089,0,12092,0,0, 0,0,12097,0,0,0,0,0,0,0,0,12098,0,0,0,0,0,0,0,0,0,0,0,0,0,12102,12103,12104, 12111,0,0,12114,12116,0,0,0,12118,0,0,0,12119,12120,12128,0,0,0,0,12130,0,0,0,0, 0,0,12131,0,0,0,12132,12134,0,0,0,0,12137,0,12139,0,12141,0,0,12142,0,0,0,12144, 0,0,0,0,0,12145,0,12148,0,12153,0,0,0,0,12154,12171,12173,0,0,0,12175,0,0,0,0, 12178,0,0,0,0,0,0,0,12183,0,0,0,0,0,0,0,0,12184,0,0,0,12186,0,0,0,0,0,12187, 12188,0,0,12189,0,12196,0,12197,0,0,12198,0,12201,0,0,0,0,12203,0,12209,0,0,0,0, 12210,12211,12212,12213,0,12217,12218,0,0,0,0,0,0,0,0,0,12222,0,0,0,0,0,0,0, 12223,0,0,12229,0,0,0,0,12233,0,0,0,0,12234,0,0,12236,12242,0,0,0,12243,0,0,0, 12244,12253,0,12254,12256,0,12257,0,0,12275,0,0,0,0,0,12277,0,0,0,0,0,12278,0, 12289,0,0,12290,0,12292,12293,0,0,12294,0,12295,0,0,12296,0,12297,0,12298,0,0,0, 0,12301,0,0,0,0,0,0,0,0,0,0,0,0,0,12309,0,12338,12340,0,0,0,0,12341,0,0,0,0,0,0, 0,0,12342,12343,0,12344,0,0,0,0,0,0,0,0,0,12345,0,0,0,0,0,0,0,0,12346,0,0,0,0, 12348,0,0,0,0,0,0,0,0,0,0,0,0,12350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12351,0,12355, 12356,12357,0,0,12367,12370,12371,0,0,0,0,0,12372,12376,0,0,0,0,0,0,0,0,12379,0, 12382,0,12383,0,0,12384,0,0,0,0,12393,0,0,12394,0,0,0,0,12398,12403,0,0,12404,0, 0,0,0,0,0,0,0,0,0,0,0,0,12410,0,0,0,12411,0,0,0,12412,0,0,0,0,12420,0,12421,0,0, 0,0,0,12423,0,12425,12429,0,0,0,12431,12432,0,0,0,0,0,0,0,0,0,0,0,0,12434,0,0,0, 0,0,12435,12436,0,0,0,0,0,0,0,0,12437,0,0,0,0,0,12438,0,0,0,0,0,0,0,0,12445,0,0, 0,12450,12451,0,0,0,0,0,0,0,0,12452,12475,0,0,12493,12494,0,0,0,12495,0,0,0,0, 12496,12502,12509,0,0,0,0,12510,0,12512,12513,0,0,0,0,12514,0,0,0,12515,0,12520, 0,0,0,12524,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12527,0,0,0,12528,0,0,0,12529,0,0,0, 0,0,12530,0,12535,0,0,12536,0,12538,0,0,0,0,0,0,0,0,0,0,0,0,12540,0,12548,0,0,0, 0,0,12550,0,0,0,12551,12552,0,0,0,12554,0,0,0,0,0,0,0,0,12555,0,0,12562,0,12565, 0,12566,0,0,0,0,0,0,0,0,0,0,0,0,12569,0,0,0,12571,12574,0,0,0,0,0,0,0,12577,0,0, 0,0,0,0,0,12578,12579,12603,0,12608,0,0,12611,0,12612,0,12615,0,12625,0,0,0,0, 12627,12646,0,12648,0,0,12657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12670,0,0,12671,0, 12673,12677,0,0,0,0,0,0,0,0,0,0,0,12679,0,12681,0,12682,12693,0,12694,0,12697,0, 12701,0,0,0,12703,12704,0,0,0,0,12707,12737,0,0,12739,0,0,12740,0,0,12742,12743, 0,0,0,0,0,0,0,0,0,12745,0,12746,12747,0,12748,0,0,12759,12767,0,0,0,0,12773,0, 12774,12778,0,0,0,0,0,0,0,12779,0,0,0,0,0,12780,12793,0,12824,0,12825,0,12836,0, 0,0,0,12839,0,12842,0,0,0,0,0,0,0,0,0,0,0,0,12843,12845,0,12846,0,0,0,0,12847,0, 0,12850,12852,12853,0,0,0,12854,0,0,0,12855,0,12856,0,12858,0,0,12859,0,12862,0, 12863,0,0,12866,0,12869,12872,12873,0,0,0,0,0,0,0,0,0,12875,0,12877,0,0,12878,0, 0,0,0,0,0,0,0,0,12884,12885,12888,0,12889,0,0,0,0,12893,0,0,0,12895,12896,12898, 0,0,0,0,0,0,0,12902,0,12909,12910,0,12926,0,12928,0,0,0,12929,0,12930,0,0,0,0, 12931,0,12932,12933,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12934,0,12942,0,0,0,0,12944, 0,0,0,0,0,0,0,0,12946,0,0,12948,0,0,12949,0,0,0,0,12950,0,0,0,0,12951,0,12952,0, 12953,0,0,0,12954,12958,12959,0,0,0,0,0,12960,12964,0,0,0,0,0,12966,0,0,0,0,0,0, 0,0,12970,0,12971,0,0,0,0,0,0,12972,0,0,12982,0,0,0,12984,12985,0,12986,12996, 12997,13001,13002,0,0,0,0,13004,0,0,13005,0,0,13007,13009,0,13017,0,0,0,13020,0, 13021,0,0,0,0,0,0,0,0,0,0,13022,0,0,0,0,0,0,0,0,13024,13027,0,0,0,0,0,13028,0,0, 13029,0,0,0,0,0,0,0,13032,0,13037,0,0,0,0,0,0,13040,0,0,13041,0,0,0,13043,13044, 13046,0,0,0,0,13047,0,0,0,0,0,0,0,13049,13054,0,13056,0,0,13060,13061,0,0,0,0,0, 13067,0,0,13068,0,13071,0,0,0,0,0,13077,13078,0,0,0,0,0,13079,13080,13081,0, 13082,0,0,0,13085,0,0,0,0,0,0,0,13086,0,13087,13088,0,0,0,0,0,13094,0,13099,0, 13100,0,0,0,13101,0,13125,13126,13128,13129,0,0,13130,0,13131,0,0,0,0,0,0,13134, 0,0,0,0,0,0,0,0,0,0,0,13150,0,13168,0,0,0,0,0,0,0,0,0,13169,0,0,13170,0,0,0,0, 13174,0,0,0,13176,0,0,0,0,0,13177,0,13178,13183,13187,0,0,0,13189,0,0,13190,0,0, 13191,0,0,13206,0,0,0,13207,0,0,0,0,0,0,0,0,0,0,13212,0,0,13219,13232,0,0,0, 13241,0,13249,13253,0,0,0,0,0,13255,13259,0,13260,13261,0,13262,0,13272,0,0,0,0, 13276,0,0,0,0,13277,13299,0,0,13301,13302,0,0,13303,0,0,13305,0,13310,0,0,0, 13311,0,0,0,0,13325,0,13328,0,0,0,13329,0,0,0,0,0,0,13330,0,0,13331,0,13335,0,0, 13342,0,0,0,0,0,13343,0,13354,0,13362,0,13366,13367,13369,0,0,13371,13372,0, 13373,13374,0,13376,0,13380,13381,13386,0,13387,13388,0,13389,13391,13395,0,0,0, 0,0,13401,13409,0,13410,0,0,0,0,13420,0,0,0,0,0,13422,0,0,0,0,13423,0,0,0,0, 13425,0,0,0,0,0,13427,0,0,0,13428,0,0,13430,13438,0,13439,0,13445,0,13448,13449, 0,0,0,0,0,0,13451,0,13457,0,0,0,0,13458,13459,0,13460,0,0,0,0,13464,13465,13466, 13470,0,13471,13472,13474,13475,0,13476,0,0,13478,13479,0,13481,0,0,0,0,13487,0, 13490,0,13493,0,0,13494,0,0,13495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13496,13497,0, 13500,0,0,13516,13522,0,0,13525,13528,0,0,0,13530,13535,0,13537,13539,0,13540,0, 13543,0,13544,0,0,0,0,0,0,13545,0,0,0,0,0,0,13547,0,0,0,13549,13555,0,0,0,13556, 13557,0,0,0,0,0,0,0,13558,0,13563,0,0,0,0,13564,0,0,0,0,0,0,0,0,13566,0,0,0,0,0, 0,13569,0,0,13571,0,0,0,0,13573,0,0,0,0,0,0,13578,0,0,0,0,0,0,0,0,0,0,13581,0, 13586,0,13595,0,13600,0,0,0,0,0,0,0,0,13601,13603,0,13604,13605,13606,13607,0,0, 13617,13618,0,0,0,0,0,0,0,13623,0,13625,13627,0,0,0,0,0,0,0,0,13629,0,0,0,13634, 0,0,0,13638,0,0,0,0,0,0,0,0,13654,0,0,0,0,0,0,0,0,0,0,13656,0,13659,0,0,13660,0, 0,13662,0,0,0,13663,0,13664,0,0,0,0,0,13668,0,13669,13671,0,0,13672,0,0,0,0,0,0, 13675,13685,0,13686,0,0,0,13687,0,0,0,13692,13694,13697,0,0,0,13702,0,0,0,0,0, 13705,0,0,0,0,13707,0,0,0,13714,0,0,0,0,0,0,0,0,0,13715,0,13716,13717,0,0,13719, 13724,13730,13731,0,0,0,0,0,0,0,0,13732,0,0,0,0,0,0,0,13734,0,13736,0,0,13737, 13738,13747,0,13751,0,0,13752,0,0,0,13753,0,13757,0,0,13762,13763,0,13764,13765, 0,13766,0,0,13767,0,0,0,13768,0,0,0,0,0,0,0,13769,0,0,13772,0,13775,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,13776,13778,13787,0,0,0,13797,0,13798,0,13801,0,13804, 13806,0,0,0,0,13816,13817,0,0,0,0,0,0,0,0,0,0,0,0,0,13834,0,13836,0,0,13838,0,0, 13839,0,13840,0,0,0,0,13842,0,0,0,0,0,0,13843,0,0,0,0,0,0,0,0,0,13845,0,0,0,0,0, 13858,0,0,13860,0,0,13861,0,0,13862,13863,0,13868,0,13869,13870,0,0,0,0,0,0,0,0, 0,0,13872,0,0,0,0,13873,13878,0,0,0,0,0,0,0,0,0,0,13886,0,13888,13889,13890,0,0, 13891,13894,0,13897,13899,13900,13904,0,0,13906,0,0,0,13909,0,0,0,13910,0,0,0, 13911,0,0,0,0,0,13912,13917,0,0,0,0,13918,0,13919,0,0,13920,0,0,0,13921,0,0, 13922,0,0,0,0,0,0,0,13924,0,13927,0,0,0,0,0,13932,0,13933,0,13934,0,0,13935,0, 13944,0,0,0,13954,0,0,13955,0,0,0,0,13956,0,13957,0,13967,13969,0,0,0,0,0,0,0,0, 0,0,0,0,13970,13990,0,13991,13994,0,13995,0,0,0,0,13996,0,0,13999,0,0,0,14018,0, 14019,0,14021,0,0,0,0,0,0,14041,0,0,0,0,0,0,0,0,14043,0,0,0,0,14046,0,0,0,14048, 14049,0,0,0,0,0,0,0,0,0,0,14051,0,0,14052,14056,0,14063,0,14064,14066,0,0,14067, 0,0,0,0,0,0,0,0,0,14068,0,0,0,14072,0,14074,14075,0,14076,14079,14085,14086, 14087,14093,0,0,0,0,14095,0,0,0,0,0,0,14096,14097,0,0,0,0,0,0,0,14098,0,14102,0, 0,0,0,0,14103,0,0,0,14104,0,0,14105,0,0,0,14107,14108,0,0,14109,0,0,0,0,0,0,0,0, 14117,0,0,0,0,14118,0,0,0,0,14119,0,0,14120,0,0,14121,0,14122,14127,0,14128, 14136,0,0,14138,0,14140,0,0,0,14141,14142,0,0,0,0,14146,0,0,14149,0,14151,0,0,0, 14152,0,0,14153,0,0,0,0,0,0,0,0,0,14154,0,14156,14157,0,0,14159,0,14161,0,0,0,0, 14162,0,0,0,0,0,0,14163,0,0,14173,0,0,0,0,0,0,14174,0,0,14176,0,0,14178,0,0, 14179,14181,0,0,14182,14185,14187,0,14190,0,0,14197,0,0,0,0,0,0,0,0,0,0,0,0, 14198,0,0,0,0,0,0,14199,14200,0,0,0,14204,0,0,14208,0,0,0,0,0,0,0,0,0,0,0,14231, 0,0,0,0,0,0,0,0,0,14234,0,0,14235,0,0,0,14240,14241,0,0,0,14246,0,0,0,14247,0, 14250,0,0,14251,0,0,14254,0,0,14256,0,0,0,14260,0,14261,0,0,0,0,14262,14267, 14269,0,0,14277,0,0,14278,0,14279,14282,0,0,0,14283,0,0,0,14284,14285,0,0,0,0, 14286,0,0,0,14288,0,0,0,14289,0,14290,0,14293,14301,14302,14304,14305,0,14307,0, 14308,14309,0,0,0,0,0,0,0,0,0,0,0,14311,14312,0,0,14317,0,0,0,0,0,0,0,14318,0,0, 0,0,14320,0,0,0,0,14321,14322,0,0,0,0,0,14326,14329,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 14330,14331,0,0,0,0,14332,0,0,0,14333,0,0,14337,14340,0,14341,0,0,14342,0,14345, 14346,0,0,14347,0,14362,0,0,0,0,0,14364,14365,14371,0,14373,0,0,14374,0,14379,0, 14400,0,0,0,0,0,14401,0,0,14405,0,14406,0,14408,14409,0,0,0,14417,0,0,14424,0,0, 0,0,0,0,0,0,0,14430,0,0,0,14431,0,0,14435,0,14440,0,0,0,0,0,0,14442,0,0,14443,0, 0,0,0,0,14446,0,0,0,0,0,0,0,14454,0,14457,0,14460,0,0,14466,0,0,0,0,0,14467,0,0, 0,0,0,0,14469,0,14477,0,0,0,0,0,0,14478,14482,0,0,0,14483,0,0,0,14485,14486,0,0, 0,14487,14488,14489,14492,14493,14494,14495,14496,14497,0,14499,0,14501,0,0,0,0, 0,0,0,0,0,0,14502,0,14507,14512,14513,14514,0,0,0,0,0,0,0,0,0,0,0,14515,14526, 14530,0,14537,0,14544,0,14547,0,0,14548,14550,14551,0,0,14552,0,0,0,14553,0, 14554,0,0,0,0,14556,14564,0,0,14565,14566,0,0,0,0,0,0,14568,0,0,14569,0,0,0, 14571,14576,0,0,14577,14578,14579,0,0,14580,0,0,0,0,14582,0,0,0,0,0,0,0,0,0,0,0, 0,14583,0,0,0,0,0,14587,0,14588,0,0,14600,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,14601,0,0,14604,14605,14611,0,14613,0,0,0,0,14615,0,0,0,0,0,0,14627,0,14628,0, 0,0,0,14631,0,14633,14634,0,0,0,0,14635,0,0,0,0,0,0,0,0,14636,0,0,14639,14642,0, 0,0,0,14644,0,0,0,0,14645,14646,0,14653,0,0,14654,0,14658,0,14661,0,0,0,14665,0, 0,0,14668,0,0,0,0,0,0,0,0,0,14669,0,0,14670,0,0,0,14680,0,0,14681,0,0,0,0,0, 14682,14683,0,0,0,0,14686,0,0,0,0,14687,14697,0,0,0,0,14699,14705,14711,0,0,0,0, 0,0,0,0,0,0,14712,0,0,0,14713,0,0,0,0,14719,0,14720,14721,14726,0,0,0,14728, 14729,0,0,0,0,14731,0,0,0,0,0,0,0,14733,14736,14737,0,0,14740,14742,0,0,0,14744, 14753,0,0,0,0,14755,14758,14760,0,0,0,0,0,14761,14762,14765,14771,0,14772,0, 14773,14774,0,0,14775,0,0,14776,0,0,0,0,14777,0,14779,0,0,14782,0,0,14785,14786, 14788,0,0,0,0,0,14795,0,0,0,0,0,0,14798,0,14803,14804,14806,0,0,0,14809,0,0,0,0, 0,0,14810,0,0,0,0,14811,0,14812,0,0,0,0,0,14815,0,0,0,0,0,0,0,0,14816,0,14818,0, 0,0,0,0,0,14819,0,14820,0,14823,0,0,0,14824,0,0,14826,14827,0,0,0,0,0,0,0,0,0,0, 0,0,14830,0,0,0,0,0,14833,0,14845,0,0,0,0,0,14846,0,0,14847,14871,0,14873,0, 14876,0,14877,14878,14880,0,0,0,0,0,14881,0,14882,14894,0,0,0,0,14895,0,14907,0, 14908,0,0,0,0,0,0,0,14911,0,0,0,0,14920,0,0,14931,0,14932,14934,14935,0,0,14936, 0,14945,0,0,0,0,0,0,0,14947,0,0,14948,14949,14951,0,0,14952,0,0,0,14964,14973,0, 0,14990,0,0,0,0,14995,0,0,14998,15001,0,0,15002,15020,0,0,0,0,0,0,15021,0,15022, 0,0,0,0,15023,0,0,15025,15029,15033,0,0,0,15034,0,0,0,15035,0,0,0,0,0,15043, 15044,0,0,0,15045,15046,15048,15050,0,15065,0,0,0,0,15066,0,0,15075,15082,15084, 0,0,15085,15086,0,0,0,0,0,0,0,0,15088,0,0,0,15089,0,0,0,0,15094,0,15096,0,15097, 0,15100,0,0,15102,0,0,0,0,0,0,0,0,15105,0,0,15106,0,15109,15113,0,0,0,15115,0, 15118,0,0,0,0,0,0,15119,0,0,15120,0,0,0,0,0,15123,15129,0,0,0,15130,0,15131,0,0, 15134,0,15135,0,0,0,15137,15138,0,0,0,0,0,0,15139,0,0,0,0,0,15140,0,0,15154, 15162,0,15169,15170,0,15175,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15177,0,15178,15179,0, 0,0,0,0,15183,0,0,0,0,0,0,0,0,0,0,0,0,15185,15187,0,15194,15195,15196,0,0,0,0,0, 0,0,15204,0,0,0,0,15206,0,0,0,0,0,15207,0,0,0,0,0,0,0,0,0,15213,0,15214,0,0,0,0, 0,0,0,15232,0,0,0,0,15234,0,15238,15240,0,15248,0,0,0,0,15250,15251,0,0,0,0,0,0, 0,15252,0,0,0,15255,15262,15266,0,0,0,15267,0,0,0,15277,15279,0,0,0,15280,15281, 15282,0,0,0,0,0,15285,0,0,0,0,15289,0,0,15291,0,0,0,0,0,0,0,15296,15297,0,0, 15304,0,0,0,0,15306,0,0,0,0,0,0,15307,15308,0,15309,0,0,15311,0,0,15312,15313,0, 0,0,0,0,0,0,0,0,0,0,0,15314,15317,0,0,0,15318,15319,0,0,0,0,15320,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,15321,0,0,0,0,0,15324,0,15325,15326,0,15330,0,0,0,0,15334,0, 15335,0,15341,0,0,15342,0,0,15343,15344,0,0,0,0,15345,0,0,0,0,15347,0,0,15348, 15349,15350,0,15356,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15357,0,15358,0,0,0,0,0,0,0, 15359,15360,15364,0,15380,0,0,0,0,0,15392,0,0,15393,0,15395,0,0,0,0,0,0,0,0, 15396,0,0,15397,15398,0,0,0,0,0,0,0,0,0,15399,0,15400,0,0,0,15402,0,15405,15410, 0,0,0,0,15411,0,0,0,15412,0,15416,0,0,0,0,0,0,0,15428,0,15435,0,0,15438,0,0,0,0, 15439,0,0,0,15440,0,0,0,15441,15449,15451,0,0,0,0,0,0,0,15452,0,0,15455,0,0,0, 15456,0,0,15458,0,15460,15461,0,0,0,0,0,15462,15464,0,15465,0,0,15466,0,0,15467, 0,0,0,0,0,15468,0,0,0,0,15481,0,0,15484,0,15485,15486,0,0,0,15487,0,0,0,0,0, 15488,0,15492,15498,0,0,0,15499,0,0,0,15500,0,15501,0,0,15512,0,15522,0,0,0, 15524,0,15525,15526,0,0,15527,0,0,15545,15546,0,15548,15552,0,15553,0,0,0,15554, 0,15555,0,15557,15565,15573,15577,15578,0,15582,0,15583,0,0,0,0,0,0,0,0,0,0,0,0, 0,15586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15588,0,0,0,0,0,15589,0,0,0,0,0,0,0,15593, 15594,0,0,0,0,15595,0,0,0,0,0,0,15596,0,0,0,15597,0,0,0,0,15600,0,0,15601,0,0,0, 0,15602,15603,0,0,0,0,0,0,15604,0,15609,0,0,15612,0,0,15613,0,0,15615,15617, 15618,0,0,15620,0,15636,15637,0,0,15649,0,0,0,0,0,0,0,15650,0,0,15651,0,0,0, 15656,0,15658,0,0,0,15664,0,0,15665,0,0,15668,0,0,0,0,0,15669,0,0,15674,0,0, 15675,0,0,0,0,15676,0,0,0,0,0,0,0,0,0,0,0,15677,0,0,0,0,15678,0,0,0,0,0,15679,0, 0,15681,0,15686,0,0,0,0,15687,0,15688,0,0,15690,0,0,0,15697,0,15699,15700,0,0,0, 0,0,0,0,0,0,15701,0,15702,15703,0,15704,0,15705,0,15707,0,15709,0,15712,15716,0, 15717,0,15718,15720,0,0,0,0,0,15724,0,0,0,15725,0,15726,0,0,0,15740,0,15745, 15746,0,0,15747,0,15748,0,0,0,0,0,15749,0,0,0,15752,0,15753,0,0,0,0,0,0,15759,0, 0,0,15765,0,0,0,0,0,0,0,0,0,15767,0,0,0,15771,0,0,15784,0,0,0,0,15785,15790, 15791,0,0,15792,0,0,0,15807,0,15811,0,0,0,0,0,0,0,0,0,0,0,0,15818,0,0,0,15819,0, 0,0,0,15821,0,0,0,0,0,15822,15824,0,0,15827,0,0,15829,15831,0,15832,0,0,15833,0, 15835,15838,15839,15843,0,0,0,0,0,0,0,0,0,0,0,15844,0,0,0,0,15845,15851,15856,0, 0,0,0,0,0,0,15858,15860,0,15861,0,0,0,15864,0,0,0,0,15865,0,0,0,0,0,0,15866,0, 15872,0,0,15876,0,0,0,0,15877,15878,15883,15885,0,0,15888,0,0,0,0,0,15889,15890, 0,0,0,0,0,0,0,0,15892,0,0,0,0,0,0,0,15893,0,0,15894,0,0,0,15895,0,15896,15897,0, 15898,15901,15902,0,15911,15915,0,15916,0,15924,15935,0,15937,0,0,0,0,0,15950,0, 0,0,0,0,0,0,15958,0,0,0,15961,0,0,15966,0,15967,0,0,15977,0,0,15978,0,0,15981, 15982,15983,0,0,0,0,0,0,0,15986,0,0,0,15990,0,15991,15995,15998,0,15999,0,16000, 0,0,0,0,16008,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16009,16011,0,16013,0,0,0,0, 0,0,0,0,16014,0,0,16015,16023,16024,16025,0,0,16026,0,16030,0,16032,0,16033,0,0, 0,0,0,0,16035,16036,16037,0,0,0,0,0,16039,0,0,0,0,16041,0,0,0,0,0,16043,16044,0, 0,16047,0,0,0,16048,0,0,16049,16050,16052,0,0,0,0,0,16055,0,0,0,0,0,0,0,0,16056, 0,0,0,0,0,0,0,16058,16060,16061,0,0,16063,0,0,16064,0,0,0,16067,16068,0,0,16069, 16078,0,0,0,16079,0,0,0,16080,0,16081,0,0,0,16088,0,0,0,0,0,0,0,0,0,0,0,16089, 16093,0,16097,0,16103,0,16104,16105,0,0,16256,0,0,16259,0,0,0,0,0,0,0,16260, 16261,0,0,16262,0,0,16263,0,16268,0,0,0,0,0,0,0,16269,0,0,16270,16273,0,16274,0, 0,0,0,16275,16276,16277,16280,0,0,0,16281,16284,0,0,0,16286,0,16289,0,0,0,0,0,0, 0,0,0,16290,0,0,0,0,16291,0,0,0,0,0,0,0,16292,0,0,0,0,0,0,0,0,16293,16295,16297, 0,16302,0,16304,0,16305,0,16306,0,0,0,0,0,0,0,0,0,0,0,0,16307,16308,16312,0,0,0, 0,0,0,16313,16315,0,16318,0,0,0,16321,0,0,0,0,0,0,0,16326,16333,16336,0,0,0,0, 16337,16340,0,0,0,0,0,16345,0,0,16346,0,0,0,0,0,0,0,0,0,16347,0,0,16348,0,0,0,0, 16349,0,0,0,16350,0,16357,0,0,0,0,16359,16360,0,0,0,0,16362,16363,16364,16365,0, 0,16366,0,0,0,0,16367,16368,0,16369,16374,0,0,0,0,0,0,0,16376,0,0,0,0,16378, 16379,0,16380,0,0,0,16381,16383,0,0,0,0,0,16390,0,0,0,16399,0,16402,16404,16406, 16407,0,0,0,16409,16411,0,0,0,0,16412,0,16413,16415,16423,0,0,0,0,0,16424,0,0,0, 16428,16434,16435,16449,0,16450,16451,0,0,0,16453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 16454,0,0,16456,16458,0,0,16459,0,0,16460,0,0,0,0,16462,0,16463,0,0,16466,0,0,0, 0,0,16479,0,0,16480,0,16481,16484,0,0,0,0,0,0,0,0,0,0,16485,0,0,0,0,0,0,16489,0, 0,0,0,0,16491,0,0,16498,0,0,16503,0,16505,0,0,0,0,0,0,0,0,16506,0,0,0,16508, 16509,0,0,0,0,0,0,0,0,16511,16513,0,0,0,16516,0,16517,0,16519,0,16529,0,0,16531, 0,0,0,0,0,0,16534,0,0,16541,16542,0,0,0,0,0,0,0,0,0,16543,16547,16548,0,0,0, 16551,0,16552,0,0,0,16553,0,0,16558,0,0,16562,16565,0,0,0,16570,0,0,0,16573, 16585,0,0,0,16586,16587,16595,0,16596,0,16598,0,0,0,16600,0,0,0,0,0,0,0,0,0,0,0, 0,0,16601,0,0,0,0,16603,0,0,0,0,0,0,0,16604,16612,0,0,0,0,16613,0,16618,0,0,0, 16640,0,0,16641,0,0,0,0,0,0,16645,0,0,0,0,16646,0,0,0,0,0,0,16651,0,0,0,0,16653, 16654,0,0,0,16655,0,0,16656,16667,0,0,0,0,16671,0,16672,0,0,0,16673,0,0,0,0,0, 16676,0,16686,0,0,0,0,16689,0,16690,0,16692,0,16693,0,16694,0,16696,0,0,0,16705, 0,0,0,0,0,0,16707,0,0,0,16709,0,0,0,0,16711,0,16712,16713,0,0,0,16715,0,0,0,0, 16716,0,0,0,0,0,0,0,0,0,16718,16724,0,0,16726,16727,0,0,0,0,0,0,0,16728,0,16729, 0,0,16730,0,0,0,0,0,16731,0,0,0,16732,0,0,0,0,16734,16738,0,0,0,0,0,0,0,0,16743, 0,0,16745,0,0,0,0,0,16749,0,16752,0,0,0,0,16756,0,0,16758,0,16759,0,0,0,0,0, 16760,0,0,0,0,0,0,0,16762,0,16769,0,16770,0,16772,0,0,0,16777,16780,0,0,0,0,0,0, 16781,0,0,16782,0,16784,0,0,16785,16787,16792,0,0,16794,0,0,0,16798,0,0,16809,0, 0,16814,16816,16817,0,16819,0,0,0,0,0,0,0,0,0,0,16820,0,0,16836,16839,0,0,16841, 16851,16857,0,0,16858,16859,0,0,16860,0,0,0,0,0,0,0,0,16862,0,16863,0,0,0,0,0,0, 0,16864,0,0,0,0,0,0,0,16876,0,16881,16882,0,16885,16886,0,16887,0,0,0,16889, 16891,0,0,0,0,0,16894,16895,0,0,0,0,0,0,0,0,0,0,0,16897,0,16898,0,0,0,0,0,16913, 0,0,16924,16925,16926,0,0,16927,0,0,0,16937,16938,0,0,0,16940,16941,0,0,0,16942, 16945,0,16946,16949,16950,0,0,0,16952,16955,0,0,0,16965,0,16969,0,0,16975,0,0, 16976,0,0,0,0,16978,0,0,16981,0,16983,16989,0,0,0,0,16990,0,0,16991,0,0,0,16993, 0,16994,16996,17000,0,0,0,0,0,17002,17004,0,17006,0,0,17007,0,0,0,0,17008,17013, 17014,0,0,0,0,0,0,0,0,0,17021,0,17031,0,0,0,0,0,17033,17036,0,17038,0,0,17039,0, 17045,0,0,17046,17047,0,0,0,0,17048,0,17049,17050,0,17051,17053,0,17054,0,17055, 0,0,0,0,0,17063,0,0,17064,0,0,0,0,0,0,0,17065,0,0,17068,0,0,0,0,0,17072,0,0,0,0, 0,0,17073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17074,0,17080,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,17081,17083,17084,0,0,0,17085,0,0,0,0,17092,0,0,0,0,0,0,0, 0,0,17093,0,17095,17102,0,0,0,0,0,0,17103,0,0,17105,0,17107,0,0,0,0,17114,0,0,0, 0,0,17115,17125,17127,0,0,17128,0,0,0,17129,17130,0,17131,0,0,0,0,0,17132,17135, 17145,0,0,0,0,0,0,0,0,17146,0,17147,0,17148,0,0,0,0,0,0,17149,17150,0,17151, 17153,0,17155,0,0,0,0,17163,17171,0,17174,0,0,0,0,17179,0,0,17182,17185,0,0,0,0, 0,17186,0,0,17188,0,0,0,0,0,0,0,17189,17191,0,17194,0,0,0,0,0,0,0,0,0,17195, 17196,17203,17204,0,0,17205,17217,0,0,0,0,0,17218,0,0,0,0,17219,0,17220,0,17221, 0,0,17230,0,0,0,0,0,17236,0,17238,17239,0,0,0,17241,17244,0,0,17245,0,17248,0,0, 17251,0,17252,0,0,17264,0,17266,0,0,0,17268,0,0,0,0,17271,17272,0,17273,0,17295, 0,17302,0,17305,0,0,0,17306,0,0,0,0,0,0,0,17308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 17309,0,17310,17313,0,0,0,0,17314,17315,0,17317,0,0,0,0,17318,0,0,0,0,0,0,0, 17320,0,0,0,0,0,0,17334,0,17344,17348,0,0,0,17350,17351,0,0,17353,0,0,17354,0,0, 0,0,0,0,0,0,0,17355,0,0,0,0,0,0,17356,17357,0,0,17359,0,0,0,17371,0,17372,0,0,0, 17393,0,0,0,0,17394,0,0,0,0,0,17395,0,0,17399,0,0,0,17401,17417,0,17418,0,17419, 0,0,0,0,0,17422,17423,0,0,0,0,0,17424,0,0,0,0,0,17428,17429,17433,0,0,0,17437,0, 0,17441,0,0,17442,0,0,17453,0,0,0,0,0,0,0,0,17454,17456,17462,0,0,17466,0,0, 17468,0,0,17469,0,0,0,0,17470,0,17475,0,0,0,0,0,17479,0,0,0,17483,17484,0,17485, 0,17486,0,17491,17492,0,0,17493,0,17494,17495,0,0,0,17496,0,0,0,17497,0,0,0, 17502,0,0,0,0,0,17503,0,17505,0,17507,0,0,0,17512,17513,17514,0,0,17515,0,0,0, 17519,0,0,0,17522,0,0,17523,0,0,0,0,0,0,0,0,0,17527,0,0,0,17528,0,0,0,17534,0,0, 0,0,17536,0,0,0,17539,0,17540,17543,17549,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17556, 0,0,17558,0,17559,0,0,17560,0,0,0,17563,0,0,0,0,0,0,17564,0,0,17565,17566,0, 17567,0,0,0,0,0,0,17569,17570,0,17575,0,0,0,0,0,0,0,0,0,0,0,17581,0,0,0,17582, 17583,0,17586,0,0,17587,0,0,0,0,0,0,0,17588,0,0,0,0,17596,17597,0,0,17598,17600, 0,0,0,0,0,0,17601,0,0,0,17604,0,0,17605,0,0,17607,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,17612,0,0,17618,0,17621,17622,0,0,0,0,17623,0,0,17624,0,0,17630,0,0, 17631,17633,17634,0,0,0,0,0,0,0,17635,0,0,17636,0,0,17637,0,17638,0,17640,0,0,0, 0,0,0,0,0,0,0,17641,0,0,0,0,0,0,0,0,0,0,17643,0,0,0,0,17645,0,0,0,0,0,0,0,0, 17646,17662,0,0,0,0,0,0,0,0,0,17663,17664,0,17665,17666,0,0,0,17669,17671,17673, 0,17679,0,0,0,0,0,0,0,17684,0,0,0,17686,0,17714,0,0,17720,17722,17726,0,0,17728, 0,0,17729,0,0,0,17732,0,17733,0,17734,0,0,0,17735,0,0,0,0,17737,0,0,0,0,17739,0, 0,0,17741,17742,0,0,0,0,17743,17744,17745,0,0,0,17749,0,17750,17751,17752,17754, 17761,17762,0,17763,0,17766,0,17772,0,0,0,0,0,17775,0,0,0,0,0,0,0,17776,0,0, 17777,0,0,17778,17779,0,17782,17783,0,0,0,0,0,0,0,0,0,0,17784,0,0,0,0,0,0,0, 17821,0,0,0,17822,0,0,0,17823,17825,0,0,0,0,0,17826,17831,17832,17833,0,0,17845, 0,0,0,17846,0,0,0,17848,17850,17854,0,17855,0,0,17859,0,0,0,0,0,0,17860,17861,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17870,17871,0,0,0,0,0,0,17872,0,0,0,17879,0, 0,0,17881,17883,0,17884,0,17885,0,0,17886,0,0,17887,17891,17953,0,0,0,0,17954,0, 0,17955,0,17968,0,0,17972,0,0,0,0,0,17974,0,0,0,0,17976,17978,0,0,17983,0,0,0,0, 18003,0,0,0,0,0,18007,0,0,0,0,0,18009,0,0,0,0,0,0,0,18010,0,0,0,0,0,0,18012,0,0, 18014,0,0,0,18015,0,0,0,18016,0,18017,0,0,0,18030,0,0,0,0,0,0,0,18031,0,0,18036, 18037,18038,0,0,18049,18056,0,18057,18058,0,18059,0,0,0,0,0,0,0,0,18062,0,0,0,0, 18064,0,0,0,0,0,0,0,0,18067,0,0,0,18068,0,0,18075,0,0,18078,18093,18094,0,0,0,0, 0,0,0,0,18097,0,0,0,0,0,18098,18100,0,0,0,18108,0,18111,0,0,18112,0,18113,0,0, 18115,18116,0,18118,0,0,0,0,18121,0,0,0,0,18123,0,0,0,0,0,0,0,0,0,18124,0,0,0,0, 18125,18126,0,18127,0,0,18128,18135,0,0,0,0,0,0,0,0,0,18150,0,0,0,0,0,18151, 18152,0,0,18156,18164,0,18166,18171,0,0,0,0,0,0,0,0,0,18172,18183,0,18184,0,0,0, 0,18185,0,18187,0,0,0,0,0,18188,0,0,0,0,0,0,0,0,18189,0,0,18190,0,0,18191,18192, 0,0,18194,18195,18196,0,0,0,18197,0,18203,0,18204,0,0,0,0,18205,0,0,0,18207, 18208,0,0,18214,0,0,0,18215,18216,0,0,0,18220,0,0,18222,0,0,0,0,0,18223,0,18225, 18231,0,18234,0,18235,0,0,0,0,18240,0,0,18241,18242,0,0,0,0,0,18243,18251,0, 18253,0,18254,0,0,0,18266,0,0,0,0,0,0,18269,18270,18271,18273,18281,0,0,0,0,0,0, 0,0,0,0,0,0,18282,0,18283,0,18284,0,0,0,0,0,0,18285,0,18287,18289,0,0,18290,0,0, 0,0,18308,0,0,0,18310,0,0,0,0,0,0,0,0,0,0,0,0,18311,0,18312,18313,0,18315,0,0, 18316,18320,0,18331,0,18332,0,18336,0,0,0,0,18337,0,18340,0,0,0,0,0,0,0,0,0, 18341,0,18344,18345,0,18346,0,0,0,0,0,18348,0,18351,0,0,18356,0,0,0,0,0,0,18357, 0,0,0,0,0,18367,0,0,0,18368,0,18369,0,18370,18371,0,0,0,18437,18444,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,18445,18450,0,0,0,0,18451,0,18452,0,0,0,18453,0,0,0,0,0,18455,0, 0,0,18456,0,18457,0,18460,0,0,18461,0,0,0,0,0,0,0,0,18466,0,0,18467,0,0,0,0, 18473,0,0,0,18476,0,18477,0,0,0,18478,18479,18480,0,0,0,18485,0,0,0,18486,0,0,0, 0,0,0,18488,18490,0,0,0,0,0,0,18491,0,0,0,0,0,18495,0,0,18496,0,0,0,0,0,0,18505, 0,18521,0,18522,18523,0,0,0,18525,18526,0,0,0,0,0,18527,0,0,0,0,18532,18533,0, 18534,0,0,0,0,0,0,18535,18537,0,18538,0,0,0,0,0,0,18540,18541,18542,18543,0, 18546,0,0,0,0,18553,18556,0,0,18558,0,0,18569,18571,0,0,0,18572,0,18574,0,0,0,0, 18586,0,0,0,0,0,18588,0,0,18589,0,0,0,0,0,0,18590,0,18592,0,0,0,0,18594,0,0,0, 18596,0,0,18597,18598,0,0,18601,0,0,0,0,18602,0,0,0,18603,18604,0,18605,0,0,0,0, 18608,0,0,18611,0,0,0,0,0,0,0,0,0,18612,0,18616,0,0,18617,18619,0,0,0,18628,0,0, 0,18629,0,0,18630,0,0,0,0,0,0,0,18631,0,18632,0,0,18635,18637,0,0,0,0,0,0,18641, 18643,18648,0,18652,0,0,18653,0,18655,18656,0,0,0,18657,0,0,18666,18674,0,0,0,0, 18677,18684,18685,0,0,18686,0,0,18690,0,0,0,0,0,0,0,18695,18696,0,0,0,0,0,0,0,0, 0,0,18697,0,0,18700,0,0,0,0,0,0,18702,0,18708,0,0,18709,0,18710,0,0,18711,0, 18714,0,0,18718,0,0,0,0,0,0,18719,0,0,18722,0,18726,0,0,0,0,0,0,0,0,0,0,0,0,0, 18731,0,0,0,0,0,18739,18741,0,0,18742,0,18743,18744,18746,18748,0,18752,18753,0, 0,18754,18763,0,18765,0,0,0,18766,0,0,0,18769,0,0,0,0,0,18773,18778,18779,18781, 0,0,18784,18787,0,18788,0,18793,0,0,0,0,0,0,18795,0,0,18800,0,0,0,0,0,18801, 18804,0,0,0,0,0,0,0,18806,0,0,0,18811,18815,18816,0,0,0,0,18825,0,0,18827,18829, 0,0,18830,0,0,0,0,18831,0,0,18832,0,0,0,0,18833,0,18840,0,18841,0,18842,0,0,0,0, 18843,0,18844,0,0,0,0,0,0,18845,18846,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 18848,0,0,0,18853,18860,0,0,18862,18866,0,0,18867,18869,0,0,18874,18881,18891,0, 0,0,0,0,0,0,0,0,0,18892,0,0,0,0,0,0,0,0,18895,0,18896,0,0,0,18900,0,0,0,18901,0, 18902,18915,18916,0,0,0,0,0,0,0,0,18919,0,0,0,0,0,18920,0,0,0,18921,18929,0,0,0, 0,18930,0,0,0,0,0,0,18932,0,0,0,0,18934,18942,0,0,0,18951,18957,0,0,0,0,18958,0, 0,0,0,18959,18960,0,0,18961,0,0,18962,0,0,0,0,18963,18964,0,0,0,18965,0,18967,0, 0,0,0,0,0,0,0,0,18968,0,18969,0,18970,18973,18976,0,0,0,0,0,0,18977,0,0,0,18981, 0,0,0,18990,0,18998,0,0,0,0,0,18999,19003,0,0,19005,0,0,0,19006,0,0,0,0,0,0, 19008,19011,0,0,19018,0,0,19019,0,19024,0,19031,19032,0,19039,0,19041,19050,0,0, 0,19051,19055,19056,0,19059,19063,19064,0,0,19088,0,0,0,19093,19094,0,0,0,0, 19095,0,19096,0,0,0,19097,0,0,19098,0,19099,19100,0,0,19103,0,0,0,0,0,0,0,19111, 0,0,0,0,0,0,19112,0,0,0,19116,19117,0,19121,19122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,19123,19124,0,0,0,0,0,0,0,19125,19126,0,19128,0,0,0,0,0,0,0,0,0,0, 19129,19130,19131,19132,0,0,19146,0,0,19147,19156,19158,0,0,0,0,0,0,0,0,19182, 19185,0,0,19187,0,0,0,19193,0,0,0,0,0,19194,0,19197,0,0,0,0,19198,0,0,0,0,0,0,0, 0,0,0,19202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19203,0,19205,19210, 0,0,0,19213,0,19218,0,0,0,19223,19229,0,0,19230,0,0,19231,19232,19233,19239,0,0, 0,0,0,19240,0,19248,19249,0,0,0,0,19254,0,19256,19258,19259,0,0,19261,0,19266,0, 0,0,19272,0,19278,19281,19282,0,0,0,0,0,0,0,0,0,0,0,0,19283,0,0,19284,0,0,19285, 19287,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19288,19291,0,19292,0,0,0,0,19297,0,19298,0,0, 0,0,19302,19303,0,0,0,0,19304,19305,0,0,0,0,19314,0,0,19315,0,0,19321,0,0,0,0,0, 0,0,19322,0,19333,0,19334,19335,0,19336,19337,0,0,0,0,0,0,0,0,0,0,0,19346,0,0, 19353,0,19354,19362,0,19366,19367,0,0,19369,0,19375,0,19377,19380,19388,0,0,0,0, 0,19389,19390,0,0,0,0,19392,0,0,0,0,0,19402,0,0,0,0,0,0,0,0,19412,0,0,19413, 19422,0,19424,0,0,0,19425,0,0,0,19428,0,0,0,0,19431,0,0,0,0,0,19432,0,0,0,0,0, 19448,19459,0,0,19461,0,19462,19463,0,19467,19474,19482,0,0,0,0,19494,0,0,0,0, 19501,0,0,0,0,0,0,0,0,0,0,19502,19504,0,0,0,0,0,0,0,19505,0,0,0,0,19506,19507,0, 0,0,19508,0,0,19511,0,0,19514,0,19515,0,19516,0,19518,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,19530,0,19537,19538,0,19543,19546,0,19547,19551,0,0,0,0,0,0,19552, 19553,0,0,0,0,0,0,0,0,0,0,0,0,19555,0,0,19556,0,0,0,0,0,0,0,0,0,0,0,0,19560, 19561,0,0,19562,0,0,0,0,0,0,19565,19567,0,19568,0,0,0,19569,19570,0,19578,0,0,0, 0,19580,0,0,0,0,19581,19584,0,0,0,0,0,0,0,19585,19586,0,0,0,19587,19588,0,19589, 0,0,0,0,0,0,19592,19593,19599,0,19600,0,0,19604,0,0,19605,0,19606,19608,19610,0, 19613,19614,0,0,0,0,0,0,19616,19617,0,0,19618,0,0,19619,0,0,0,19620,19621,19631, 0,0,19632,19634,19636,0,19643,0,0,19644,19658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,19659,0,0,0,0,0,0,0,0,0,0,0,19675,19677,0,0,0,0,19679,0,19683,0,19684,0,0, 0,0,0,0,19687,0,0,0,0,0,0,0,0,19688,19689,19692,0,0,0,0,0,0,0,19695,19697,0,0,0, 0,0,19698,19699,0,0,19700,0,19702,0,0,19703,0,0,0,0,0,0,19704,19708,0,19710,0, 19713,0,0,0,19715,0,0,0,0,19718,0,0,0,0,0,0,0,19720,0,19722,0,0,19725,0,0,0,0,0, 0,0,0,0,0,0,0,0,19730,0,0,0,0,0,19731,0,19734,19735,19739,0,0,19740,0,19741,0,0, 0,19746,0,0,19747,0,19771,0,0,0,0,0,0,0,0,19772,19775,0,0,0,0,0,0,19778,0,0,0,0, 0,19779,0,0,19780,19790,0,19791,0,0,19792,0,0,0,19793,0,0,19796,19797,0,0,0, 19799,0,0,0,19801,0,0,0,0,19803,0,19804,0,19805,0,0,19807,0,0,0,19808,0,0,0,0,0, 0,19809,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19816,0,19821,0,19822,19830,19831,0,0, 0,19833,0,0,0,0,0,0,0,0,0,0,19838,0,0,0,0,19839,0,0,19843,0,0,0,0,19845,0,0,0,0, 19847,0,0,19848,0,19849,0,0,0,0,0,0,0,19851,0,0,0,19854,0,0,0,0,0,0,0,0,0,19864, 0,19865,0,19866,0,0,0,0,0,0,0,19868,0,0,19870,0,0,19871,0,0,19872,19873,19875,0, 19880,19882,19884,0,0,19885,19886,19888,0,0,0,0,0,0,0,0,0,0,0,0,19890,19892, 19893,0,0,19894,0,0,0,19895,0,19896,19902,0,0,19903,0,0,19905,0,0,0,19906,0, 19908,0,19909,19911,0,0,0,19913,19920,0,19938,19939,19940,0,0,0,0,0,0,0,19942,0, 19943,0,19945,0,0,0,19951,19952,19954,19960,0,19965,0,19971,0,0,0,0,0,19975,0, 19976,0,19990,0,0,19991,0,19993,0,19995,0,0,0,19998,19999,20001,0,20003,20005,0, 20011,20012,0,0,0,0,0,0,20014,0,20020,0,0,0,0,20021,0,0,0,0,0,20023,20024,0,0,0, 0,0,20025,0,0,20027,0,0,20029,0,0,20032,0,0,0,0,20044,20045,0,20048,20049,0,0, 20050,0,20052,0,0,20054,20057,0,0,0,0,0,0,0,0,0,20059,0,0,20061,0,20062,0,20064, 0,0,20066,0,0,20067,0,0,0,0,20069,0,0,0,0,0,0,20070,20071,0,0,0,0,0,0,0,0,0,0,0, 20072,0,0,20073,20074,0,0,0,0,0,20075,0,20078,0,0,0,0,20080,0,20081,0,0,0,0,0,0, 20095,0,20098,0,0,0,0,0,0,0,20107,0,0,0,0,0,0,0,0,20112,0,0,0,20113,20114,0,0,0, 20115,20123,20124,0,0,0,20131,20133,20134,0,0,0,0,20136,0,0,20137,20138,20150,0, 20152,0,0,0,20153,0,0,20154,0,0,0,20158,0,20163,0,0,20164,0,0,0,0,0,0,0,20166,0, 20168,0,20170,0,20175,0,0,20178,0,0,0,0,20223,0,0,0,0,20224,0,20226,0,0,20230,0, 20231,0,0,0,0,20232,0,0,20233,20234,0,20244,0,20247,0,0,0,0,0,0,20249,0,0,0, 20250,0,0,0,0,20251,0,20253,0,20254,0,0,0,0,20256,0,0,20264,0,0,0,0,20266,0,0,0, 20278,0,0,20279,20282,0,0,0,0,0,20283,0,20284,0,20285,0,20287,20290,0,0,0,0, 20292,0,0,0,0,20293,20297,0,0,0,0,0,0,20299,0,20300,20303,0,0,0,0,0,0,20307,0,0, 20308,0,20309,0,20310,0,0,0,0,0,0,20312,0,0,0,20314,0,0,0,0,20315,20316,0,20322, 0,0,0,0,0,0,20339,0,0,0,20342,0,0,0,0,20352,0,0,0,0,0,0,0,0,0,0,20362,0,0,20365, 0,20375,20377,0,0,0,0,0,0,0,0,0,0,0,20378,20379,0,20380,0,0,20381,0,20382,0, 20383,0,20388,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20390,20392,20393,0,0,20395,0,0,0,0,0, 20396,0,0,0,0,0,0,0,0,20398,20415,0,0,0,20417,0,0,20420,0,0,20426,20428,0,20431, 0,0,20432,0,20433,20434,20435,0,0,0,0,20440,0,0,0,0,0,20442,0,20443,0,20446,0,0, 0,0,20448,0,20451,0,0,0,0,0,0,0,0,0,20452,20453,0,0,20454,0,0,0,0,0,0,20457,0, 20458,0,0,0,20465,0,0,0,0,0,20469,0,0,0,20473,0,20476,0,0,0,0,0,0,0,0,20477,0,0, 20485,0,0,20486,0,0,20487,0,20496,0,20497,0,0,20498,0,0,0,0,0,0,0,0,0,0,20499, 20500,0,20501,0,0,0,0,0,20520,20527,0,20529,0,0,0,0,20539,0,0,20540,0,0,0,20543, 0,0,0,20546,0,0,0,0,0,20548,0,0,20563,0,0,20564,0,20566,0,0,0,0,0,20589,0,0,0,0, 20590,0,0,20593,20594,0,0,0,0,20595,0,20597,20598,0,0,0,20618,20620,0,0,0,0, 20621,0,0,0,0,20627,0,0,0,0,0,20628,0,0,0,20629,0,20630,0,0,20639,0,0,0,0,0, 20707,0,0,20709,0,0,0,20713,20714,0,0,0,0,0,20724,20725,0,0,0,0,20726,20728, 20729,0,20733,0,20734,0,20735,20736,0,20737,0,0,20744,0,20745,0,20748,0,0,20749, 0,0,0,0,0,0,0,0,20750,0,0,0,0,20754,0,0,0,20761,0,0,20763,0,0,0,0,0,0,0,20766,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,20767,0,0,0,0,20768,0,20769,20777,0,0,0,0,0,0,20785,0, 0,0,20786,20795,20801,0,20802,0,20807,0,0,20808,0,0,20810,0,0,20811,0,20812,0,0, 0,0,0,20813,0,0,20818,20820,20821,0,0,0,20822,0,20823,0,0,0,20826,0,0,0,0,0,0,0, 20829,20830,20831,0,20832,20836,0,0,20839,0,0,20840,20842,0,20843,0,20844,0, 20854,0,0,0,20855,0,0,0,0,20856,0,0,0,20869,0,0,20871,0,0,0,0,0,0,0,20873,0,0,0, 0,0,20876,0,0,0,0,0,20880,0,0,20882,0,0,0,0,20883,20884,0,0,20890,0,0,0,0,0,0,0, 0,0,20891,0,0,0,0,0,20905,0,20906,20910,0,0,20912,20915,0,0,0,0,0,20916,0,20917, 0,20919,20920,20922,0,20927,0,20928,20929,20930,0,0,20935,0,0,20939,0,0,20941,0, 0,0,20943,0,0,0,20946,20947,0,0,0,0,0,20950,0,20954,0,0,20955,20964,0,0,20967,0, 0,0,0,0,20973,20975,0,0,0,20984,0,20987,20988,0,0,0,0,0,20989,0,0,0,20995,0, 20998,0,20999,0,0,0,0,21000,21001,0,0,0,0,21008,0,21010,0,21016,0,0,0,21017, 21018,0,0,0,0,0,21021,21026,21027,21028,0,0,21029,0,0,0,0,0,21030,0,0,0,0,0,0,0, 0,0,0,0,0,0,21031,21032,0,0,0,0,0,21037,0,0,21038,0,0,0,0,0,0,0,0,0,21039,0, 21041,0,21046,21047,0,0,0,21049,21053,0,0,21057,21064,21065,0,0,21066,21067,0,0, 0,21069,0,0,0,21071,21072,0,0,21073,0,21074,0,0,21078,0,0,0,0,21079,0,0,21080, 21081,0,0,21086,21087,0,21089,0,0,0,0,0,0,0,21091,0,21093,0,21094,0,0,0,0,0,0,0, 0,21095,0,0,0,0,0,21096,0,21098,0,0,0,0,0,0,0,21099,0,0,21100,21101,21102,0,0,0, 0,0,21103,0,21104,0,0,0,0,0,21105,21108,21109,0,0,21112,21113,0,0,0,0,0,0,21115, 21122,21123,0,0,0,0,0,21125,0,0,0,0,0,0,0,0,21129,21131,0,0,21134,0,0,0,21137, 21142,0,21143,0,0,21144,0,21145,21146,0,21152,21154,21155,21156,0,0,0,21160,0,0, 0,0,0,0,21161,0,21164,0,21166,0,0,0,0,21170,0,0,0,0,21171,0,0,21172,0,21174,0, 21175,0,0,0,0,0,21176,21179,21188,0,0,0,21189,0,0,21190,0,0,0,21192,0,0,21193,0, 0,0,21198,0,21212,0,0,21213,0,0,0,0,0,0,21215,21216,0,0,21223,21225,0,21226,0,0, 0,0,21227,21228,0,0,21229,0,0,0,0,21230,21236,0,0,0,0,0,0,0,0,0,0,0,0,0,21237,0, 0,21238,21239,0,0,0,0,21256,0,0,0,0,0,21257,0,0,0,0,0,0,0,21259,0,0,0,21263,0, 21272,0,21274,0,21282,0,0,0,0,0,0,0,0,21283,0,0,0,0,0,0,0,0,21294,0,0,21297,0,0, 0,0,21298,0,0,0,21299,0,21300,21302,0,21316,0,21318,21322,21323,0,21324,0,21326, 0,0,0,21327,21328,0,0,0,21352,0,0,21354,21361,0,0,0,0,0,0,0,0,0,0,0,0,0,21362,0, 0,0,21363,0,0,0,0,0,0,0,0,0,21366,0,0,21367,21372,21374,0,0,0,21375,21377,0, 21378,0,0,0,21380,0,0,0,0,0,0,0,0,0,0,21381,0,0,0,0,0,0,21382,0,21383,0,0,21384, 0,0,21385,0,0,0,0,21389,21390,0,0,0,0,0,0,0,0,0,0,0,0,0,21397,21398,0,0,0,0,0,0, 0,0,0,0,21399,0,21400,0,0,0,0,21402,0,0,0,21403,21404,0,21405,21406,0,0,0,21407, 0,0,0,0,0,0,0,0,0,0,0,0,21408,0,0,0,0,21409,0,21421,0,21422,0,0,0,21425,21428,0, 0,0,0,21429,0,0,0,0,0,21433,0,0,0,0,0,0,0,0,0,0,21434,0,21443,0,21444,21449,0, 21452,0,21453,21454,0,0,0,21457,0,0,21458,0,0,0,21460,21461,0,0,21464,0,0,0, 21473,21478,0,0,21479,0,0,21481,21483,0,0,0,0,0,0,0,0,21484,0,0,21485,21486,0,0, 21488,0,0,0,0,0,0,21523,0,0,21525,0,0,0,0,0,0,0,21526,0,0,0,0,0,0,21529,21530,0, 0,21531,0,0,21533,0,0,21539,21564,0,21567,0,0,0,0,0,0,0,0,21575,0,0,0,0,21577,0, 0,0,0,0,21591,0,0,21604,0,0,0,0,0,0,0,0,0,21605,0,21606,0,0,21617,21618,21619, 21620,0,0,0,0,0,0,0,0,0,0,0,0,0,21623,0,0,0,0,21631,0,21635,0,0,0,0,21639,21646, 21653,21662,0,0,21663,21664,0,21666,0,0,21667,0,21670,21672,21673,0,21674,21683, 0,0,0,0,0,21684,0,21694,0,0,0,0,21695,21700,0,21703,0,21704,0,0,21709,0,0,0, 21710,0,0,0,0,0,0,0,0,21711,0,0,0,21712,0,21717,0,21730,0,0,0,21731,21733,0,0,0, 0,21737,21741,21742,0,21747,0,0,0,21749,0,0,0,0,0,0,0,0,0,0,0,0,0,21750,0,0,0,0, 0,21752,0,0,0,0,21753,0,0,0,0,0,0,21755,21756,0,21757,0,0,0,0,0,0,21760,0,0, 21763,0,0,0,0,0,0,0,0,0,21764,0,0,21766,0,0,21767,0,0,0,0,0,0,0,0,0,21773,0, 21774,0,0,21775,0,0,0,0,21776,0,0,21777,0,0,0,0,0,0,0,0,0,21780,21787,21788, 21791,0,0,0,21797,0,0,0,0,0,21805,0,0,0,0,21806,0,21807,21809,0,21810,21811,0, 21817,21819,21820,0,21823,0,21824,0,0,21825,0,0,21826,21832,0,0,0,0,0,21833, 21848,21849,0,0,21867,21870,21871,21873,0,0,0,21874,0,0,0,0,0,0,0,0,0,21875,0, 21878,0,0,0,21879,0,21881,21886,0,0,0,0,21887,0,0,21888,21894,21895,21897,0, 21901,0,21904,0,0,21906,0,0,0,21909,21910,21911,0,0,21912,0,0,21913,21914,21915, 0,21919,0,0,0,0,0,0,0,21921,0,0,21922,21933,21939,0,0,0,0,0,0,0,0,0,0,0,21944,0, 0,0,0,0,21945,0,21947,0,0,0,0,0,0,0,0,0,0,21949,0,0,0,21950,0,0,0,0,0,0,0,0,0,0, 0,0,0,21951,0,21952,0,0,0,0,0,0,0,0,0,21954,21957,0,0,0,0,21958,0,21959,0,0,0,0, 0,0,21962,21963,0,0,0,0,0,0,0,0,21964,21965,0,0,21969,21970,0,0,0,21974,0,0, 21980,21981,0,21982,0,0,0,0,0,21985,0,21988,0,21992,0,21999,0,0,0,0,0,0,22001,0, 22002,0,0,0,0,0,0,22003,0,0,0,0,0,22004,0,0,0,22008,0,22009,22015,0,0,22016,0,0, 0,22017,22019,0,0,0,0,0,0,0,0,0,22020,0,0,0,0,0,0,0,0,0,0,22021,22037,0,22039,0, 0,0,22040,0,0,0,22048,22049,0,0,22053,22055,22056,22059,0,0,22060,22061,0,0, 22064,0,0,0,0,22066,0,0,0,0,0,0,0,22073,0,0,0,22074,22075,0,0,0,0,0,0,0,22076,0, 0,0,0,22077,22084,22099,0,0,0,0,0,0,0,22104,0,0,22107,0,22108,0,22109,0,22110,0, 0,0,0,0,0,0,22111,22119,0,22120,22122,0,0,0,0,22125,0,0,0,22128,22129,0,0,0,0,0, 0,22141,0,0,0,22142,0,0,22144,22146,0,22148,22149,22151,22154,0,0,0,22162,0,0,0, 0,22164,22177,0,0,0,0,22179,0,22182,22183,0,0,22184,22188,0,0,0,0,0,0,0,0,22190, 0,22194,22201,0,0,22208,0,22209,0,22212,0,0,22215,0,22223,22231,0,0,22232,0, 22234,0,0,22235,22236,0,22237,0,22240,0,0,0,0,0,22241,0,0,0,22242,22246,22247,0, 0,0,22259,22268,0,22269,0,0,0,0,0,0,0,22270,0,0,0,0,22271,0,22272,0,22277,0,0,0, 0,0,22278,22280,22283,22286,0,0,22287,22289,0,0,22290,0,22293,0,0,0,0,0,0,0,0,0, 0,22295,0,22301,22302,0,0,0,22305,0,22308,0,0,0,0,0,0,0,0,0,0,22315,0,0,0,22317, 0,22334,0,0,0,22335,0,0,0,0,0,22336,0,22338,22344,0,22347,22349,0,22350,0,0,0,0, 0,0,0,22357,0,0,0,0,0,22358,0,0,0,0,0,0,0,0,0,0,22359,22360,0,0,0,0,0,0,0,0, 22361,22366,0,0,22369,0,22370,22373,0,0,0,0,0,22375,0,22377,0,0,0,0,0,22378,0,0, 0,0,22381,0,0,0,0,22382,0,22383,0,0,0,0,0,0,0,0,0,22391,0,0,22392,22395,22396, 22402,0,0,0,0,0,0,0,0,0,0,0,0,0,22405,0,0,22406,0,0,22408,0,0,22409,22410,0,0,0, 0,0,0,22424,0,0,0,0,22426,0,0,0,22427,0,22428,0,22432,0,22435,22442,22443,0,0,0, 0,22444,0,0,0,0,0,22446,0,22454,0,22455,0,0,0,22465,0,22470,0,22471,0,0,0,0, 22472,22473,0,22487,0,0,0,22488,0,0,0,0,22489,0,0,22499,0,0,0,0,0,0,22514,0,0, 22515,0,0,0,0,0,0,0,22516,0,0,0,22517,22520,0,0,0,22534,0,0,22535,0,0,22536,0, 22540,22553,0,22555,0,0,0,0,22561,0,0,22562,0,0,0,0,0,0,0,0,0,0,0,22566,0,0,0,0, 22567,22568,0,0,22575,0,22579,0,22582,22583,22585,0,0,0,0,0,22586,0,0,22587,0,0, 22590,0,0,0,0,0,22591,0,22592,0,0,0,0,0,22593,0,22602,0,0,22604,0,0,22609,0,0, 22618,0,0,0,0,0,0,22619,0,22624,22625,0,0,22638,0,0,0,0,0,22639,0,0,22640,0,0,0, 0,0,0,0,22644,0,22645,22647,0,0,0,0,22652,22653,0,0,0,22654,0,22655,0,0,0,22656, 0,0,0,0,0,0,0,0,0,0,22673,22675,22676,0,0,22678,22679,0,22691,0,0,0,0,0,0,0, 22693,0,0,22696,0,22699,22707,22708,0,0,0,0,0,0,0,0,22718,0,22719,0,0,0,0,22723, 0,0,0,22724,22725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22726,22728,0,0,0,0,0,0,0,0,22729, 0,0,22731,0,0,0,0,22732,22735,22736,0,0,0,0,22739,0,22749,0,0,22751,0,0,0,0,0,0, 0,0,0,0,0,22758,0,0,0,0,0,22760,0,0,0,0,0,22764,22765,22766,0,22768,0,0,0,0,0, 22769,22770,0,0,0,0,0,0,22771,0,0,22772,22775,0,22776,22777,22780,0,0,22782, 22784,0,22787,0,22789,22796,0,0,0,0,0,22798,0,0,0,0,0,0,22802,0,22803,22804,0,0, 0,0,0,0,0,0,0,0,22805,0,0,22810,22811,22814,22816,0,22825,22826,0,22831,22833,0, 0,0,0,0,0,0,0,0,22834,0,22836,22838,0,22839,0,0,0,0,0,22840,0,22847,0,0,0,0,0, 22856,22857,0,22858,22859,0,0,22862,0,0,22864,0,0,0,0,22865,0,0,0,0,0,0,0,0,0,0, 0,22866,0,22867,22868,0,0,0,0,22869,0,22871,0,22872,0,22873,22881,22882,22884, 22885,0,0,0,0,0,0,0,22886,22887,0,22894,0,22895,0,0,0,22900,0,22901,0,0,0,0, 22904,0,0,0,0,22905,22907,0,0,0,22915,22917,0,0,22918,0,0,0,22920,0,0,0,22929, 22930,0,0,0,22941,22942,0,0,0,22943,0,0,0,22944,0,0,0,0,0,0,0,22946,0,22947,0,0, 22954,0,22956,0,0,22962,0,0,0,0,0,0,0,22963,0,0,22964,0,0,0,0,0,0,0,22965,0, 22968,0,0,0,22969,0,0,0,0,0,22970,0,22971,0,0,0,0,0,22978,0,0,22979,0,22987,0,0, 22989,0,0,0,0,0,0,22990,0,23005,0,0,0,0,0,0,0,23006,23007,23008,0,0,23023,23024, 23029,0,0,0,0,23030,0,0,0,0,0,23032,0,0,0,0,0,23035,0,0,0,0,23038,0,0,0,23048,0, 23049,23052,23053,23060,23061,0,23063,0,0,0,0,23067,23068,0,0,0,23069,23073,0,0, 0,23127,0,23128,0,0,0,0,0,23129,0,23138,23141,0,23149,0,0,23150,0,0,0,23152,0,0, 0,0,0,0,0,0,23154,0,0,0,0,23157,23159,23160,0,0,0,0,0,0,0,0,0,0,0,0,23180,0,0,0, 0,23181,0,0,23188,0,23189,0,0,0,0,0,0,0,0,0,0,0,0,23195,0,0,23196,23199,0,0,0,0, 0,0,0,0,0,23202,0,23204,0,23207,0,23209,23210,0,0,0,0,0,0,23227,23229,0,0,23230, 23234,23238,0,0,0,23245,23246,23248,0,0,0,0,23249,23254,0,0,0,23265,0,0,0,0,0,0, 0,23268,0,23276,0,0,0,0,23277,0,23297,0,23298,0,0,0,0,23299,0,23302,0,0,23303, 23312,0,0,23314,0,23320,0,0,0,0,23324,0,23325,0,23328,0,23334,0,0,0,23337,0,0,0, 0,23343,23344,23346,0,23348,0,0,0,0,0,0,0,0,23353,0,0,0,0,23355,0,23356,23358,0, 0,0,23359,23360,0,23361,0,23367,0,23369,0,0,23373,0,23378,23379,0,23382,23383,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,23387,0,0,0,0,0,0,23388,23390,0,0,23393,23398,0,0,0, 23399,0,0,0,23400,0,0,0,0,23401,0,0,0,23415,0,0,0,0,0,0,0,0,23416,0,23422,0, 23443,23444,0,0,0,0,23448,0,23454,0,0,0,0,0,0,23456,0,0,23458,23464,0,0,0,0,0,0, 23465,0,0,0,23470,23471,0,0,23472,0,0,0,23473,23496,0,0,0,0,0,0,0,0,23497,0, 23499,0,0,23502,0,0,23503,0,0,23513,0,0,23515,0,0,0,23517,0,0,0,0,23518,23519, 23521,23524,0,23525,23528,23539,0,0,0,0,0,23541,0,0,23544,0,0,23556,0,0,23557,0, 0,0,0,0,0,0,0,0,0,0,0,0,23559,0,23560,0,0,23561,0,0,23566,0,0,0,0,0,23568,23569, 23570,0,0,0,0,23571,0,23574,0,0,0,0,0,0,0,0,0,0,0,23575,0,23579,0,0,23581,0,0,0, 0,0,0,23587,0,0,0,0,0,0,0,23596,23598,0,0,0,0,23602,23606,0,0,23607,0,23608,0,0, 0,23614,23616,0,0,0,0,0,23618,0,0,23619,0,0,0,0,23621,23626,0,23627,0,0,0,0,0,0, 0,23629,0,23630,0,0,0,0,23634,0,23636,0,0,0,0,0,0,23638,0,0,0,0,23640,23667,0, 23669,0,0,0,23681,0,0,0,0,0,0,0,23682,0,23683,0,0,0,0,0,23684,0,0,0,23685,23689, 0,23693,23694,23700,0,23702,0,23709,0,0,0,0,0,0,0,23712,0,0,0,0,0,23714,0,0, 23715,0,0,0,0,23718,0,0,23720,0,0,0,0,23722,0,0,0,23726,23729,0,23741,23746,0, 23748,0,0,0,0,23749,0,0,0,0,0,23750,0,0,0,0,23751,0,23753,0,0,0,0,23757,23765,0, 0,0,23770,0,0,0,0,0,0,0,23771,0,23772,23781,0,0,23796,0,0,0,0,23798,0,23799,0,0, 0,23802,0,0,23806,0,23807,0,0,23808,0,23809,0,23819,0,0,0,23821,0,23827,0,0,0, 23829,0,0,0,0,0,0,0,23830,0,0,0,0,0,0,23832,23833,23834,23835,0,0,0,0,23837, 23838,0,0,0,0,0,23846,0,0,0,0,0,0,23847,0,0,0,0,0,23879,23881,0,0,23882,23883, 23895,0,23899,0,0,0,0,23901,0,0,0,0,0,0,23902,0,0,0,0,0,23903,23905,0,23906,0, 23907,23918,23919,23920,0,23922,0,23924,0,23927,0,23934,0,23937,23941,0,23942, 23946,0,0,0,0,0,23955,23956,23958,0,0,0,0,0,0,23959,0,23962,23965,0,23966,0,0,0, 0,23967,23968,0,0,23973,0,0,23974,0,0,0,0,23975,0,23976,0,0,0,0,0,0,0,0,0,0,0,0, 0,23977,0,0,0,0,0,0,0,0,23980,0,0,23984,0,23985,0,0,23987,0,0,23988,23990,23991, 0,0,0,0,0,0,23992,0,0,0,0,0,0,0,0,23994,0,0,0,23998,0,0,0,0,0,0,0,0,0,23999,0,0, 24003,0,24004,0,24006,0,0,0,24007,0,0,24008,0,0,0,0,0,0,0,24009,0,0,24010,0,0, 24011,0,0,24013,24014,0,0,24015,24016,24027,0,24028,24029,0,24030,0,0,0,0,0, 24033,24034,0,24035,0,0,24036,0,0,24044,0,24048,24049,24063,24067,0,24068,24070, 0,0,24071,24078,24087,0,24090,0,0,0,24095,0,24098,24101,24104,24106,0,24107,0,0, 0,24108,0,0,0,0,24110,24111,0,24113,0,0,24115,24120,0,0,0,0,0,0,24124,0,24125,0, 24126,0,24127,0,0,0,0,0,24135,0,0,24136,0,24137,24142,0,0,0,24146,0,0,24147, 24149,24154,0,24163,0,0,0,24165,24166,24167,0,0,0,0,0,0,0,0,0,0,24169,24170, 24175,0,0,0,24178,0,0,24179,0,0,24181,0,24184,24197,0,24201,24204,0,0,0,0,0,0, 24206,24212,24220,0,0,0,24224,0,0,0,0,0,0,0,0,24226,0,24234,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,24235,0,24236,0,0,0,0,0,24239,24240,24241,0,0,24248,0,0,24249,0, 24251,0,0,0,0,0,0,24253,0,24268,0,0,0,24269,0,24271,24272,0,0,0,0,24273,0,0, 24274,0,0,24279,0,0,0,0,0,0,0,24280,0,24293,24294,0,0,0,0,0,0,24296,0,0,24323,0, 0,0,24329,24330,24331,24339,0,24351,0,0,24369,24370,0,0,0,24371,0,0,0,0,24372, 24373,24374,0,0,0,0,0,24378,0,0,0,0,24379,0,24381,0,24383,24389,0,24390,0,0, 24394,24395,24400,0,0,0,24401,24402,0,24406,0,0,0,24411,0,0,0,24415,0,24416,0,0, 0,0,0,24417,0,24419,0,24422,0,24423,24428,0,24435,0,0,0,24439,0,0,0,24440,24442, 24446,0,0,0,24447,24448,24449,24452,0,0,0,0,24453,24457,0,0,24458,24459,24460,0, 24465,0,0,0,0,0,0,0,24470,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24471,0,24473, 24474,24475,24476,0,24478,0,0,0,0,24480,0,0,0,0,0,0,0,0,0,0,24481,0,0,0,0,0,0,0, 0,0,0,24482,24485,0,0,0,0,24486,0,0,0,24488,0,0,0,24494,0,0,0,0,24497,0,0,24498, 0,0,0,24499,24506,0,0,0,24507,0,0,24511,0,0,24513,24514,0,0,0,0,0,24517,0,24518, 0,24520,0,24521,24524,24525,0,0,0,0,0,24527,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24528,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24537,24539,0,24540,0,0,0,24548,0,0,0,0,0,24549, 24550,0,0,0,24553,24554,0,24555,0,24556,0,24558,0,0,0,0,0,24560,0,0,0,24561,0,0, 0,0,0,24562,0,0,0,0,0,0,0,0,0,0,0,0,0,24567,0,0,0,0,0,24569,0,0,0,24574,0,24575, 0,0,0,0,0,0,0,0,0,0,0,24577,24581,0,24584,0,0,0,0,0,24585,0,0,0,0,0,24586,0,0, 24587,0,24588,0,0,0,0,0,0,0,0,0,0,24590,24591,0,0,0,0,24592,0,0,0,0,0,0,0,24594, 0,0,0,0,0,0,0,24596,24597,0,0,0,0,24602,24603,0,0,0,0,24604,0,0,24605,0,24610,0, 0,24611,0,0,0,0,24612,24615,24616,24624,0,0,0,24627,0,24638,24639,0,0,0,0,24640, 0,0,0,24655,24656,24657,0,0,0,0,0,0,0,0,24662,0,24663,24664,0,0,0,0,0,24665,0,0, 0,0,24667,0,0,0,0,0,0,24668,24669,0,24670,24674,0,0,0,24675,0,24678,0,0,24679,0, 0,0,24681,0,24683,0,0,0,0,24684,0,24685,0,0,24686,0,0,24688,24689,0,0,0,0,24690, 24691,0,0,0,0,0,0,0,24697,0,24698,0,0,0,0,0,0,0,0,24709,0,0,0,0,0,24710,0,24712, 0,0,0,0,0,0,24713,24714,0,24715,0,24716,24718,0,24719,0,0,0,0,24720,0,0,24725,0, 0,24738,0,24749,24750,0,0,0,24752,0,0,0,24753,0,0,0,24758,0,0,0,0,0,24762,0, 24763,0,0,0,0,0,0,0,24764,0,0,0,0,0,24765,24767,24768,0,24772,0,0,0,0,24773,0,0, 0,0,24777,0,0,0,0,0,24785,0,24786,24788,0,0,0,24789,0,0,0,0,24794,24798,0,24799, 24800,0,0,0,24803,0,24804,24806,0,24807,0,0,0,24810,0,0,0,0,0,0,24827,24828,0, 24835,0,0,0,0,0,0,24836,0,0,0,0,0,24839,0,24843,24844,0,0,0,0,0,0,0,0,0,0,24847, 0,0,24848,0,0,0,0,0,0,24849,0,24850,24851,0,0,0,24852,0,24853,0,0,0,0,0,0,0,0,0, 24854,0,24855,0,0,24868,0,0,0,24883,0,0,0,24884,0,24895,24897,0,0,0,0,0,24899,0, 0,0,0,0,24900,0,24913,0,0,0,0,0,0,24914,0,0,24917,24930,24931,0,0,0,24932,0,0, 24939,0,0,24942,0,0,0,0,0,0,0,0,0,24945,24950,0,24951,0,0,24953,0,0,0,24954,0, 24959,0,0,0,24961,0,0,24962,0,24964,24968,24970,24972,0,0,0,0,0,24976,0,0,0, 24977,0,24982,0,0,24983,0,0,24984,0,0,0,24993,0,0,0,24994,0,0,25001,0,0,0,25003, 0,0,25018,0,0,25023,0,0,0,25034,0,0,25035,25036,0,25037,0,0,0,0,0,0,0,25039,0,0, 0,0,0,25040,0,0,0,0,0,0,0,25042,0,0,25043,25045,0,0,0,0,0,0,25049,0,0,25051,0, 25052,25053,0,0,25054,0,0,0,25055,0,0,0,0,25057,25059,0,0,25060,25064,0,25065, 25069,25070,0,0,0,0,25072,0,25073,0,25090,0,0,25092,25093,25101,0,0,0,0,0,0, 25105,25108,0,0,25113,0,0,25115,25116,0,0,0,0,0,0,25117,0,0,0,25120,25121,0,0,0, 0,0,0,0,25125,0,0,0,25126,0,25130,25134,0,25139,0,25143,0,0,0,25151,0,25161,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25163,0,0,0,0,0,0,0,25174,0,25175,0,25207,0,0, 0,25209,0,0,0,0,25213,0,25219,0,25223,0,25225,0,0,0,25227,0,0,0,25228,0,0,0, 25229,0,0,0,0,0,0,0,25231,25233,0,0,0,0,25237,25239,0,0,0,25243,0,0,0,25252,0, 25257,25258,0,0,0,0,25260,25265,0,25268,0,0,25273,25324,0,25325,0,25326,0,0,0,0, 0,0,0,0,25327,0,0,0,0,0,25328,0,0,0,0,0,0,25332,0,0,0,25333,0,0,0,25336,25337, 25338,0,0,25343,0,25350,0,0,0,0,0,0,0,25352,0,25354,0,25375,0,25379,0,0,0,0, 25384,0,0,0,0,0,0,0,0,0,25386,0,25388,0,25390,0,0,25399,0,0,25401,0,0,0,25402,0, 0,0,25407,0,0,0,0,0,0,0,0,0,0,0,25413,25415,0,0,25417,0,0,0,0,0,0,0,25419,0,0,0, 25421,0,0,0,25424,0,0,0,0,25433,0,0,0,0,0,0,0,0,0,25435,0,0,0,0,0,0,25436,0,0,0, 25437,0,0,25440,0,0,0,0,0,0,25442,0,0,25443,0,25446,0,0,25449,0,0,0,25450,0,0,0, 0,25452,0,25453,25454,25455,0,0,0,25456,0,25457,0,0,0,25459,0,25461,0,25468,0,0, 0,0,0,0,0,0,25469,0,0,0,0,0,25471,0,0,0,0,0,25474,0,0,0,0,0,0,0,0,25475,0,0,0,0, 25477,0,0,0,0,25483,0,0,0,0,0,25484,0,0,0,0,0,0,0,0,0,0,0,0,25485,0,25497,0,0, 25498,0,25504,0,25510,0,25512,0,0,25513,25514,0,0,0,0,0,0,25517,25518,25519,0, 25520,0,0,0,0,0,0,0,25521,0,25522,25527,25534,0,25536,0,25537,0,0,25548,25550,0, 0,25551,0,25552,0,0,0,0,0,25554,0,25555,0,25556,25557,25568,0,0,0,25570,25571,0, 0,0,0,0,0,25574,0,0,0,0,25579,0,0,0,25581,0,0,0,25582,0,0,0,0,0,0,0,0,0,25588,0, 0,0,0,25589,0,0,0,0,25590,0,25591,25592,25593,0,25594,0,0,0,25596,0,25597,25615, 0,0,0,0,0,25618,0,0,0,0,25619,25623,0,0,25629,0,0,25631,0,0,0,25635,25636,0,0, 25649,0,0,0,0,25654,0,0,0,25661,25663,0,0,25671,0,0,25678,25698,0,25699,25702, 25703,0,0,0,0,0,0,0,0,25704,0,0,0,0,0,25706,0,0,25710,0,25711,0,25712,0,25715, 25716,25717,0,0,25718,25728,25732,0,0,0,25734,0,0,0,0,0,0,0,0,0,25737,0,0,25739, 0,0,0,25740,0,25741,25745,0,25746,0,25748,25772,25778,0,0,0,0,0,25780,0,0,0,0, 25781,0,25782,25784,25785,0,0,0,25789,0,0,0,0,0,0,25797,25801,0,0,0,25808,25809, 0,0,25811,25814,25815,0,0,25817,0,0,0,0,0,0,0,0,25820,0,0,0,0,25832,25833,0,0,0, 25846,0,0,0,25847,25848,0,0,0,0,0,0,0,0,0,25849,25850,0,0,25851,0,0,25852,0, 25862,0,0,0,25863,25865,0,0,0,0,0,0,0,25867,25868,0,25869,25874,0,25875,0,25876, 25877,0,0,0,0,25878,25902,0,0,0,0,0,0,0,25903,25904,25905,0,0,0,25908,25909,0,0, 0,0,25910,0,0,0,0,0,0,0,25912,0,25913,0,0,0,0,0,0,0,0,25914,0,0,25916,0,0,0,0,0, 25917,25927,0,0,0,0,25928,0,0,25930,0,0,0,25933,0,0,25938,25942,0,0,0,0,0,0,0, 25945,0,25950,0,25956,0,0,25961,25962,0,0,25963,0,25964,25965,25966,0,0,0,0,0, 25967,0,0,0,0,25968,0,0,0,25969,25971,0,0,0,0,0,25973,25975,0,0,0,0,0,0,0,25978, 0,25981,0,0,0,25982,0,0,0,25984,0,0,0,0,0,0,0,25993,0,0,0,0,0,0,0,0,0,0,0,0,0, 26002,0,0,0,26005,0,0,0,26006,26007,0,0,26014,26015,26016,0,0,0,0,0,0,26017, 26018,26020,0,26022,26023,0,0,0,26024,26028,0,26029,26033,26034,26044,0,0,0,0,0, 26046,0,0,26047,0,0,26049,0,26050,0,26051,0,0,0,0,0,26053,0,0,0,0,26054,26059,0, 0,0,0,0,0,26060,0,26066,0,0,0,0,0,0,0,0,0,0,0,0,26067,0,26069,0,0,26071,0,0,0, 26073,0,26074,26077,0,0,0,0,26078,0,0,0,26079,0,26090,0,0,26094,0,0,0,0,0,0,0,0, 26095,0,0,0,0,0,0,0,0,0,0,0,26096,26101,0,26107,26122,0,26124,0,0,26125,0,0,0,0, 0,0,26136,26141,26155,0,0,0,0,0,0,0,0,0,26164,26166,0,0,0,26167,0,26170,26171,0, 0,26172,0,0,26174,0,0,0,0,0,0,0,0,0,0,0,0,0,26175,0,0,0,26176,26177,0,26321, 26322,0,26323,0,0,26324,0,0,0,0,0,0,0,26325,0,26331,0,0,0,0,0,0,26335,0,0,0, 26350,0,0,0,26379,0,0,26382,26383,26385,0,0,26392,26406,0,0,0,0,26411,0,0,0,0,0, 26412,0,0,26420,0,0,26423,0,26424,26426,26432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 26435,0,26436,0,0,0,0,0,26441,0,26444,0,0,0,26446,0,0,0,0,26447,0,0,0,0,26449,0, 26450,26452,0,26453,26454,0,0,0,26455,0,0,0,26456,0,0,26458,0,0,26460,0,26463,0, 0,0,0,0,0,0,0,26464,26470,0,0,0,0,0,0,0,0,0,26473,0,0,26474,0,0,0,0,0,0,0,26475, 0,0,0,0,0,0,0,26477,0,26485,0,0,26486,0,26487,0,0,26488,26493,26494,0,0,26495,0, 26497,26504,26506,0,0,0,0,0,26507,0,0,0,0,0,26509,0,0,26510,0,0,0,0,0,0,0,0,0,0, 0,0,0,26512,0,26513,26515,0,0,0,26518,0,0,0,26519,0,26524,26526,0,0,0,26527,0, 26532,0,26533,26537,26558,0,0,0,26559,0,0,0,26571,0,0,26573,0,26588,0,26593,0,0, 0,0,0,0,26603,0,26604,0,0,0,0,0,0,0,0,0,0,26606,0,0,0,0,0,0,0,26607,26609,26611, 26614,0,0,0,26616,26620,0,26621,0,0,0,0,0,26627,0,26629,0,0,26630,0,0,26632, 26643,0,0,0,26644,0,0,0,0,0,0,0,0,0,26646,26647,0,0,0,26650,0,0,26656,0,0,0,0, 26663,26670,26671,0,0,0,26685,26686,26687,0,26689,0,0,0,0,26744,0,26745,0,26747, 26748,0,26749,26750,26751,0,0,0,0,26752,26755,0,0,0,26756,26769,0,0,0,26774,0,0, 0,0,0,26775,0,26777,26778,0,26786,0,0,0,26787,0,0,0,0,0,0,0,0,0,0,0,0,0,26788,0, 0,26789,0,0,0,0,0,26791,0,26792,26793,0,0,0,26794,0,26797,26798,0,0,0,26800,0,0, 26803,0,26804,0,0,0,0,0,0,0,0,0,26805,0,0,26808,0,0,26809,0,0,0,0,0,0,0,26812,0, 26825,0,0,0,0,0,0,0,26826,0,0,26827,26829,26834,0,0,0,0,26835,0,0,26849,0,26851, 0,0,0,0,0,0,0,0,0,26852,0,26853,26857,0,26858,0,26859,0,0,0,0,0,0,0,26876,0, 26878,26882,26883,0,0,0,0,26890,26894,0,0,0,0,26895,26896,0,0,0,0,0,26900,0,0,0, 0,0,0,0,26911,26913,26914,26915,26916,26919,0,0,0,26921,26922,0,0,26925,0,0,0, 26928,0,0,26929,26930,0,0,0,26931,0,26932,0,0,0,0,0,26933,0,0,0,0,0,0,26937,0,0, 26943,0,0,26944,0,0,0,26946,0,0,0,0,0,0,0,26956,0,26958,0,0,26963,0,0,0,0,0,0,0, 26965,0,26969,26970,26972,0,0,0,0,0,26973,0,26974,0,26978,0,26980,0,0,0,0,0,0, 26982,0,26986,26987,0,26990,0,0,0,0,27003,27006,0,0,27007,27010,27012,27013,0,0, 0,0,0,0,0,0,27014,27015,27018,0,27019,0,0,0,0,0,27025,0,0,0,27026,0,0,0,0,27029, 27030,27031,27034,0,0,27036,27037,0,0,0,27038,27042,0,0,0,27044,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,27045,0,0,0,0,0,0,0,27046,0,0,0,0,0,0,0,27047,27049,0,27050,0,0,0, 27051,27052,0,27055,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27056,27058,27059,0, 27061,0,27064,0,0,0,0,0,27069,0,0,27070,0,0,0,0,0,0,0,27072,0,0,0,0,0,0,0,0, 27076,0,0,0,0,0,27078,0,27079,0,0,0,27081,0,0,0,0,0,0,27082,0,27083,27086,0,0,0, 0,27087,0,0,0,0,0,27088,27090,0,27094,0,0,27095,0,27099,27102,0,0,0,27103,0,0,0, 0,27105,0,0,0,27106,0,0,0,0,0,0,27107,0,0,0,0,27108,27117,0,0,0,0,27118,0,0, 27124,0,27126,0,0,27130,27131,0,0,0,0,0,0,27147,0,0,0,0,27148,27149,0,0,0,0, 27150,27151,0,27152,0,27159,0,0,0,27164,0,0,0,0,0,0,0,27175,0,27189,0,0,27191,0, 27193,0,27195,0,27198,0,0,0,0,0,27200,0,0,0,0,27202,0,0,0,0,27203,0,0,27204,0,0, 27206,0,27207,0,0,0,0,27209,0,0,0,27213,0,0,27216,27219,27220,27222,27223,0, 27224,0,27225,27226,0,0,27233,0,0,0,0,27235,0,27237,0,27238,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,27239,0,27242,27243,0,27250,0,0,0,27251,0,27253,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,27254,27255,27258,0,0,0,27259,0,0,0,0,0,0,27267,0,27276,27278, 0,0,0,0,0,0,0,0,0,27296,27297,27301,0,0,0,0,0,0,27302,0,0,0,0,0,0,27312,27313,0, 0,0,0,0,27318,0,27320,0,27329,0,27330,27331,0,27332,0,0,0,0,27340,0,0,0,27348,0, 0,0,0,0,0,27350,0,27351,0,0,0,0,27355,0,0,27358,27359,27361,0,0,0,27365,0,27367, 0,27376,27378,0,0,27379,0,0,0,0,0,0,27396,0,27397,27404,0,0,0,0,0,27408,0,0,0,0, 27453,0,0,0,27456,0,0,0,27458,0,0,0,0,0,0,0,27459,0,0,0,27460,0,0,27461,0,27465, 27467,0,0,27469,0,27470,0,27471,0,27477,27482,0,0,0,0,0,0,27484,0,0,0,0,0,0, 27485,0,0,0,0,0,27493,0,27494,27502,0,0,0,0,0,0,0,0,0,0,0,0,27511,27532,0,0,0, 27533,27545,0,0,0,27546,0,0,0,0,0,0,0,0,0,0,27547,0,0,27549,27550,0,27551,0,0,0, 0,0,0,0,27555,0,0,27571,0,27573,27574,27575,27577,0,27578,0,0,27579,27585,0,0,0, 0,0,27586,0,0,27588,27589,0,0,0,0,27596,0,0,27600,0,0,0,0,0,0,0,0,0,0,0,27608,0, 0,0,0,0,0,0,0,0,0,0,27610,0,0,0,27618,0,0,27620,0,0,0,27631,0,0,27632,27634,0, 27636,27638,0,0,0,27643,0,27644,27649,0,0,0,0,0,0,0,0,0,0,0,0,0,27651,27660,0, 27661,0,0,0,0,0,0,0,27662,0,0,27664,0,27665,0,0,0,27669,0,27671,0,0,0,27673, 27674,0,0,0,27682,0,0,0,27711,0,27712,27713,27719,27720,0,0,27728,0,27729,0,0,0, 0,0,0,0,0,0,27731,0,0,27732,0,27733,0,27738,0,0,0,27742,0,0,0,27743,27744,0,0,0, 0,0,0,27745,27746,0,0,0,27747,27748,27751,27752,0,0,0,27768,27770,0,0,0,27774, 27775,0,27776,27777,0,0,27781,0,27784,0,27786,0,0,27791,0,27792,27793,27804,0, 27812,27813,0,0,0,0,0,0,0,0,27814,0,27825,0,27827,0,0,0,0,27828,27861,27862,0,0, 0,27864,0,0,0,27865,27884,0,27889,0,0,0,0,0,27890,0,27891,0,0,0,27892,0,0,0,0,0, 27897,27898,0,0,27899,0,0,0,27901,27905,0,0,27920,0,0,27921,0,27922,0,0,0,27931, 27934,0,0,0,0,0,0,0,0,0,0,27941,0,27942,0,27945,0,27947,27954,0,0,0,0,27960, 27963,0,0,0,0,0,0,0,0,27964,27965,0,0,0,27967,0,27969,27975,0,27976,27977,0, 27981,0,27983,28051,28052,0,0,0,0,0,28056,0,0,0,0,0,0,28058,28059,0,0,28061,0,0, 0,0,0,0,0,28063,0,0,0,0,0,0,28066,0,0,0,0,0,0,28069,28070,28072,0,28073,0,0, 28074,0,0,0,0,28075,0,0,0,0,0,0,0,28078,0,0,0,0,28085,0,0,0,0,28086,0,0,0,0,0,0, 28088,0,0,0,0,0,0,0,0,28090,0,28097,28114,28115,0,0,0,0,0,0,0,28116,0,0,0,0,0, 28118,0,28129,0,28131,0,0,28135,0,0,0,28140,28141,0,0,0,28146,0,0,0,0,28152,0,0, 0,0,28155,28157,28161,0,0,0,0,28166,0,28167,0,0,0,0,0,0,0,0,0,0,0,28172,0,0,0,0, 0,0,28173,0,0,28175,0,0,0,0,0,0,0,0,0,28178,28188,0,28190,0,0,0,0,0,28191,0, 28193,28206,0,0,28207,28209,0,28211,0,28213,0,0,0,28215,28216,28217,0,28222,0, 28223,28225,0,0,0,28226,0,28227,28229,28232,0,0,0,0,0,0,0,0,0,28235,0,28241,0,0, 28242,0,0,0,0,28243,0,0,0,28245,0,0,0,28248,28250,0,28251,28252,0,0,0,0,0,0, 28253,0,0,28254,28255,0,0,28256,0,0,28258,0,0,0,0,0,28259,0,0,28260,0,0,28261,0, 0,0,0,28262,28263,0,0,28264,0,0,0,28266,0,28268,28269,0,28270,28272,28274,0, 28277,28278,0,0,0,28279,0,28280,28281,28283,0,28292,0,28294,0,28297,0,0,0,0, 28299,0,0,0,0,0,28300,0,0,0,0,0,0,0,28301,0,0,0,0,0,0,0,0,0,0,0,0,0,28302,28303, 0,0,0,0,28304,0,0,28305,0,28312,0,28313,28314,0,0,0,0,0,0,28315,0,0,0,28320, 28321,0,0,28328,0,0,0,28329,28338,0,28339,0,0,28344,0,0,0,0,0,0,0,0,28347,0,0,0, 0,0,0,0,0,28348,0,0,0,0,0,28411,0,28412,28413,0,28416,0,0,0,28420,0,0,0,0,0, 28421,0,0,0,0,28423,0,0,0,28424,0,0,28428,0,0,0,0,0,28429,0,0,0,28431,28434,0, 28458,0,0,0,0,0,0,0,0,0,0,0,28464,0,0,0,0,28465,0,28467,0,0,0,0,0,0,28471,0,0,0, 0,28474,0,28480,0,28481,0,0,28485,0,0,0,0,28486,28488,0,0,28489,0,0,0,0,28492,0, 0,0,28495,0,28497,0,28499,0,0,0,0,28500,0,0,28502,28503,0,0,0,28508,0,0,0,28510, 0,0,28512,28513,28514,28521,0,28526,0,28527,28528,0,0,0,0,28529,0,0,28532,0,0, 28537,28538,0,0,0,28539,0,28548,0,28553,28554,0,0,0,0,0,0,0,0,0,0,0,0,28560, 28563,0,0,28564,0,0,0,0,28565,0,0,0,0,0,0,0,28566,28568,0,0,0,0,0,0,28569,0,0,0, 28570,0,28572,28573,0,0,0,0,28575,0,0,0,0,28576,28581,28588,0,0,28589,0,0,0, 28590,28595,0,28598,0,0,28601,0,0,28605,0,0,0,0,28614,28615,28619,0,0,0,0,0,0, 28620,0,28626,0,0,28628,0,28631,0,28632,0,0,0,0,0,0,28635,0,0,0,28637,28638,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28639,0,28643,0,0,28652,0,0,0,28662,0, 28670,28671,0,0,0,0,0,0,0,0,0,28672,28673,28675,28676,0,0,0,0,0,0,0,28691,0,0,0, 28695,0,0,0,28696,0,28697,28698,0,28705,0,28707,28708,28710,0,0,0,0,0,0,0,28711, 28728,0,0,0,28736,0,0,0,28737,0,0,0,0,0,0,0,0,0,28738,0,28739,0,28741,0,0,28742, 0,0,0,0,0,0,0,0,0,0,0,28745,0,0,0,0,0,0,28749,28750,28752,28754,28756,0,28757,0, 0,0,0,28759,28760,0,0,0,0,0,0,28762,0,0,0,28764,0,0,0,0,0,0,28766,0,28767,28768, 0,0,0,0,28769,28770,0,0,0,0,0,0,0,0,0,0,0,0,0,28771,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,28772,0,28773,0,28782,0,0,0,0,0,0,28784,0,28785,0,28786,0,0,0,28787,0,0,0, 28797,0,0,0,0,0,0,28799,0,0,28801,0,0,0,0,28802,0,28805,0,0,28806,0,0,28807,0,0, 0,0,0,0,0,28808,0,0,0,0,0,28810,28812,0,0,28816,28819,0,0,28821,0,28826,0,0,0, 28842,28852,0,0,28853,0,28854,28855,0,0,0,28857,0,0,0,28858,0,28867,28868,28869, 0,0,0,28874,28880,28882,28890,28892,0,0,0,0,0,0,0,28895,0,0,0,28898,28899,0,0,0, 28900,0,0,28904,0,28906,0,0,0,0,28907,0,0,0,0,0,0,28908,0,0,0,28910,0,28914,0,0, 0,0,0,0,0,28915,28916,28919,0,0,28920,0,28921,0,0,0,0,0,0,0,0,28924,0,0,0,0, 28926,28929,0,0,0,28930,0,28936,0,28939,0,0,0,0,28942,0,0,0,0,0,0,28956,0,0,0, 28966,0,0,0,0,28967,0,0,0,0,0,0,0,0,0,28968,0,28971,0,28975,28976,0,28982,28983, 0,0,28984,28989,28996,28997,28998,0,0,0,0,0,0,28999,0,0,0,0,0,29000,0,29001,0,0, 0,29009,0,0,29011,0,0,29021,0,0,0,0,29024,0,29025,0,0,0,0,0,29026,0,0,0,29036,0, 0,0,29037,0,0,0,0,29038,0,29045,0,29047,0,0,0,0,0,0,0,0,0,29051,0,0,0,29054, 29056,29062,0,29070,29082,0,0,0,29083,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29084,0,0, 0,0,29085,29088,0,0,0,0,0,0,0,29090,29097,0,0,0,29103,0,0,0,0,0,0,0,0,29105,0,0, 0,0,0,29107,0,29109,0,0,0,29115,0,0,29120,0,0,29138,29140,0,0,0,0,0,0,0,0,0, 29152,0,29160,29174,0,29176,0,0,29180,0,29181,0,0,0,0,0,0,0,0,29228,0,0,29229,0, 0,29230,0,0,0,0,0,0,0,0,0,0,29234,0,0,0,29241,0,29245,0,29248,0,29250,29256, 29280,0,29282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29285,0,0,29286,29291,29292,0,0,0,0, 29294,0,29295,0,0,0,0,0,29296,29297,29298,29300,0,29302,0,0,29304,29307,0,29312, 0,0,0,29322,0,0,29323,0,0,29324,29326,29328,0,29335,0,0,0,0,0,0,0,29338,29339,0, 0,0,0,0,29341,29343,0,0,0,0,29344,0,0,0,0,0,29345,0,0,0,0,29346,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,29347,29348,29349,0,0,29354,0,0,29355,0,0,0,0,0,0,0,0,29357,0,0, 0,0,29364,0,29365,0,0,0,0,0,0,0,29366,0,0,29368,0,0,0,0,0,0,0,0,29378,0,29381,0, 0,0,0,0,0,0,0,29386,0,0,0,0,0,0,29389,0,0,0,29390,0,0,29391,29397,0,29398,29412, 29414,29418,29419,0,0,0,0,0,0,0,29420,0,0,0,0,0,0,0,29423,0,0,0,29435,0,0,0, 29437,0,0,29439,0,29441,0,0,0,0,29443,0,29446,29450,29452,0,0,0,0,0,29456,0,0,0, 0,0,29461,0,0,0,29464,0,0,0,0,0,0,0,0,29468,0,29473,0,0,0,29486,0,0,0,29490,0,0, 0,29491,29492,0,0,29497,0,0,0,29498,0,29499,0,29502,29505,0,29509,0,0,0,29510,0, 0,0,29512,0,0,0,29516,0,0,0,0,0,0,0,0,29518,0,29519,0,0,0,0,0,29520,29521,29529, 0,0,0,0,0,0,0,0,29530,0,0,29531,29538,0,29540,0,0,0,29542,0,29543,29544,29547,0, 0,29548,0,0,0,29549,0,0,0,29550,0,0,29552,0,0,0,0,29558,29561,0,29562,29564,0,0, 29565,0,0,29566,0,0,0,0,0,0,0,0,0,0,29578,29584,29586,29591,0,0,0,0,29593,29594, 0,0,29597,0,0,29613,0,29614,0,29615,0,0,0,0,29616,29617,0,0,29625,0,0,0,29632,0, 0,0,0,0,0,0,29633,0,0,0,0,0,29634,29635,29637,0,29638,0,29641,29643,0,0,0,0,0,0, 29644,0,29645,0,29649,0,0,0,29650,0,29653,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29656, 29659,0,0,29660,0,0,0,29661,0,0,0,0,0,29664,0,0,0,29671,29673,0,0,0,0,0,0,0, 29675,0,29677,29679,0,0,29684,0,0,0,0,0,29685,0,0,0,29687,0,0,0,29688,0,29689, 29690,29700,0,29701,0,0,0,29702,0,29706,0,0,0,0,0,0,0,29720,0,29721,0,29727,0, 29733,29734,0,29750,29761,0,29763,0,0,0,0,0,29764,0,0,29765,0,0,0,29771,0,0,0,0, 0,0,0,0,0,0,0,0,29772,0,0,0,29773,29774,29775,0,0,0,0,0,0,0,0,0,0,0,29822,0,0,0, 29824,0,29825,0,0,0,0,0,29827,0,0,0,0,0,0,0,0,29829,0,29832,29834,0,0,29835,0,0, 29837,29838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29843,0,0,0,0,29844,29845,0,0,0, 0,0,0,0,0,0,29849,0,0,29869,29872,29890,29905,0,0,0,0,0,29907,29921,0,29922,0,0, 29923,29926,29944,29946,0,0,0,0,0,0,0,29947,29948,0,0,0,29951,0,0,0,0,0,29953,0, 0,29956,0,29957,0,0,29962,0,0,0,0,29971,0,0,0,29972,0,0,0,0,0,29978,0,29979, 29992,30007,30008,30010,0,0,0,30013,0,0,0,0,30014,30016,0,0,0,0,0,0,0,0,0,0,0, 30017,0,0,0,0,0,30023,30031,0,0,30033,0,0,0,0,0,0,0,0,0,0,30034,0,30038,0,30039, 0,30040,0,0,0,0,0,0,30067,30068,0,0,0,30069,0,30072,0,0,0,30073,0,0,0,0,30075,0, 0,0,0,0,0,30079,0,0,30080,0,0,0,0,0,30082,0,0,0,0,0,0,0,0,0,0,0,30084,30090,0,0, 30091,0,0,0,0,30098,30118,0,30119,0,30121,30130,0,0,0,0,0,0,0,0,0,0,0,0,0,30131, 30132,30133,0,0,0,0,0,0,30135,0,0,0,0,0,0,0,0,0,0,0,30136,0,0,30137,30138,0,0,0, 30139,30146,0,0,0,0,0,30147,0,0,30148,30151,0,0,0,30168,0,30172,30173,0,0,0,0,0, 0,0,0,30180,30181,0,30192,0,0,0,0,0,0,0,30194,30196,0,0,30199,0,0,30202,0,0,0,0, 30203,0,0,0,0,0,0,0,0,0,0,30213,0,0,0,30216,0,0,30217,0,0,0,30218,0,0,0,0,30219, 0,30220,0,30222,30227,0,0,0,0,0,30231,0,0,30233,30235,0,0,0,0,30238,0,30240, 30243,30245,0,30250,30252,0,0,0,30269,0,0,30271,30272,0,0,0,30278,30280,0,0, 30282,0,30284,0,30294,0,0,0,0,30295,30296,0,0,0,0,0,30298,30299,30302,30304, 30306,0,0,0,0,0,0,30316,30317,0,0,0,30318,0,0,0,30319,0,30320,30322,30326,0,0,0, 0,0,30327,0,30332,30348,30349,0,0,30356,0,0,0,0,0,0,0,0,30357,0,30358,0,30359, 30360,0,0,30365,30366,30378,0,0,0,0,30379,0,0,30381,0,30385,0,30388,30397,0,0,0, 30401,0,0,0,0,30403,0,0,0,0,0,30404,0,0,30405,0,30406,30408,0,30409,0,30410,0,0, 0,30417,0,0,30418,30419,0,30420,0,30424,0,0,0,30427,30430,30432,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,30433,0,0,0,0,0,0,0,30436,0,30437,30438,0,30441,30442,0,0, 0,30445,0,0,0,0,30452,30456,30457,0,0,0,30458,0,30464,0,0,0,0,0,0,30467,0,30469, 0,0,0,0,0,30477,0,0,30484,0,0,0,0,0,30485,0,0,0,0,0,30486,30487,30497,30498,0,0, 0,0,0,0,0,0,0,0,30505,0,30508,0,0,0,30509,30510,0,30514,30516,0,0,0,0,0,0,0,0,0, 0,0,30523,0,30524,0,30525,0,0,0,0,30537,0,0,30538,0,0,0,0,0,30553,0,0,30555, 30556,30558,30559,30560,0,0,30561,0,30562,0,0,0,0,0,0,0,0,30563,30570,30571,0, 30586,30587,0,0,30590,0,0,30594,0,0,0,0,30611,30612,30623,30634,0,0,30636,30640, 30655,30656,0,30657,0,0,30658,30669,0,30670,0,30676,30678,0,0,0,0,0,0,0,30679,0, 0,0,0,0,0,0,0,0,0,0,30695,0,0,30698,0,0,0,0,30700,0,0,0,0,30701,0,30702,30703,0, 0,0,0,30707,0,0,0,30709,0,0,30710,30719,30729,0,0,0,0,0,0,0,0,0,30731,0,0,30733, 0,0,0,30734,0,0,0,0,0,30736,30737,0,0,0,30740,0,0,0,30743,0,30746,0,30747,30748, 0,0,30751,30752,30753,0,0,0,30754,0,0,30760,0,0,0,0,0,0,0,30763,0,30764,0,0, 30766,0,30769,30770,30771,30774,30777,0,0,30779,30780,30781,0,0,0,0,30790,0,0,0, 30792,0,0,0,0,30810,0,0,0,0,0,0,0,30812,30819,0,0,30823,30824,0,30825,0,30827,0, 0,0,0,0,0,30828,0,0,30830,0,0,0,30834,0,30835,0,30837,30838,0,30845,0,0,0,0,0, 30846,30847,0,0,30849,0,30851,0,0,0,0,0,30852,30858,0,0,30859,0,30865,0,0,30866, 0,0,30868,0,0,30869,0,0,0,30881,30883,0,0,0,0,0,30889,0,30891,0,0,0,0,30894,0, 30895,0,30897,0,30898,0,0,0,30904,30906,0,30909,0,0,0,0,0,0,30910,0,0,0,30915, 30933,30942,0,0,0,0,30943,0,0,30945,0,0,0,0,0,0,30946,0,0,30947,0,0,30955,30956, 0,0,30960,0,0,30961,30962,30966,0,0,30969,30974,0,0,0,30976,0,0,30977,0,30978, 30982,0,0,0,0,0,0,0,30994,30995,30998,0,31000,0,0,31001,0,0,31003,31005,0,0, 31006,31011,0,0,31014,0,31016,0,0,0,0,31018,0,0,31020,31023,31024,31025,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,31027,31028,31029,0,0,0,0,0,0,31032,0,0,0,0,0,0,0,0,0,0,0, 31036,31037,31038,0,0,0,31041,31043,31045,0,31047,0,0,0,31048,0,31049,0,0,0, 31053,31054,31055,0,0,31063,0,0,0,0,0,31066,0,31068,31071,0,0,0,31072,31073,0,0, 0,0,31075,0,0,31076,0,0,0,31077,31079,0,31080,0,0,0,0,0,0,0,0,0,0,31087,0,31142, 0,31144,0,0,31145,31146,31147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31149,0,31151,31152,0, 0,0,0,0,0,0,31162,31171,31174,31175,0,0,0,31176,0,0,0,0,0,0,0,31179,0,0,0,31186, 0,0,0,31192,31195,0,0,31196,0,0,0,0,0,0,0,0,31198,0,0,0,0,0,31199,0,0,0,31205,0, 0,0,0,31211,31215,0,0,0,0,31231,0,31232,0,0,0,0,0,0,0,0,0,0,31233,31236,31253,0, 31254,0,0,0,0,0,0,31255,0,0,31257,0,0,0,0,0,0,0,0,0,31258,31259,0,0,31260,0, 31261,0,0,0,0,0,31262,31263,0,0,31264,0,31266,0,31267,0,0,0,0,0,31281,0,31282,0, 31284,0,0,31285,31287,31288,0,0,31290,0,0,0,31292,31295,0,31299,0,31300,0,0,0,0, 0,31302,0,0,0,0,31303,0,0,0,0,0,0,31304,0,0,0,0,0,31305,31308,31309,31315,0, 31317,0,0,0,0,0,31323,0,31324,0,0,0,0,0,31325,31327,0,0,31331,0,0,0,0,0,31333,0, 0,0,0,0,31336,0,0,31337,0,0,0,0,0,0,31338,0,0,0,0,0,0,0,0,0,0,0,0,31339,0,0,0,0, 0,0,0,31342,0,0,0,0,31345,0,0,0,0,0,0,0,0,31347,0,0,0,0,0,0,31348,0,0,31350, 31351,0,31352,0,0,31354,0,0,0,0,31355,0,0,31356,0,0,0,0,0,0,0,0,0,0,31363,0, 31372,0,0,31373,0,0,0,0,0,0,0,0,0,31376,0,31388,0,31389,0,31392,0,31401,0,31405, 31407,31408,0,31409,0,0,0,0,0,0,31413,31415,0,0,0,31416,31418,0,0,0,0,0,0,31422, 31423,0,0,31424,0,31425,31432,0,0,0,0,0,0,0,0,0,31433,0,0,0,0,0,0,0,0,31434,0,0, 0,0,0,0,31435,0,0,0,0,31438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31442,0,31444,0, 31448,0,0,31451,0,0,0,0,31452,0,31461,31465,0,0,31466,0,0,31467,0,0,31468,0,0,0, 31469,31473,0,31476,0,0,0,0,31489,31490,0,0,0,0,0,0,0,31492,31493,31494,0,0,0,0, 31501,31504,31505,0,0,0,0,0,0,0,0,0,31509,0,0,0,0,31510,0,0,31511,0,0,31513,0,0, 0,0,0,0,0,0,0,31514,0,31522,31536,31539,31540,0,31541,0,0,0,0,0,0,31546,31553, 31559,0,0,0,31560,31561,31562,0,0,31564,31567,0,31569,0,0,0,31570,0,0,0,0,31571, 0,0,0,0,0,0,31572,31574,31580,31581,0,0,31582,31584,31585,31586,31595,0,31596,0, 0,0,0,31597,0,31599,0,31600,31601,0,0,31603,31604,0,0,31608,31610,0,0,0,31611,0, 31615,0,0,0,0,31616,0,0,0,0,0,0,31617,0,0,0,0,0,31618,0,0,0,0,0,0,31621,0,0,0,0, 0,0,0,0,0,31622,31625,0,0,0,0,31627,0,31641,0,0,31642,0,0,31643,0,0,0,0,0,0,0,0, 0,31644,0,31646,0,0,0,0,31648,0,0,0,31652,0,0,0,31657,0,0,31676,0,0,0,0,0,0,0, 31689,31691,31692,0,31694,0,0,0,31696,0,31702,0,31703,0}; static const DictWord kStaticDictionaryWords[31705] = { {0,0,0},{8,0,1002},{136,0,1015},{4,0,683},{4,10,325},{138,10,125},{7,11,572},{9, 11,592},{11,11,680},{11,11,842},{11,11,924},{12,11,356},{12,11,550},{13,11,317}, {13,11,370},{13,11,469},{13,11,471},{14,11,397},{18,11,69},{146,11,145},{134,0, 1265},{136,11,534},{134,0,1431},{11,0,138},{140,0,40},{4,0,155},{7,0,1689},{4,10 ,718},{135,10,1216},{4,0,245},{5,0,151},{5,0,741},{6,0,1147},{7,0,498},{7,0,870} ,{7,0,1542},{12,0,213},{14,0,36},{14,0,391},{17,0,111},{18,0,6},{18,0,46},{18,0, 151},{19,0,36},{20,0,32},{20,0,56},{20,0,69},{20,0,102},{21,0,4},{22,0,8},{22,0, 10},{22,0,14},{150,0,31},{4,0,624},{135,0,1752},{5,10,124},{5,10,144},{6,10,548} ,{7,10,15},{7,10,153},{137,10,629},{6,0,503},{9,0,586},{13,0,468},{14,0,66},{16, 0,58},{7,10,1531},{8,10,416},{9,10,275},{10,10,100},{11,10,658},{11,10,979},{12, 10,86},{14,10,207},{15,10,20},{143,10,25},{5,0,603},{7,0,1212},{9,0,565},{14,0, 301},{5,10,915},{6,10,1783},{7,10,211},{7,10,1353},{9,10,83},{10,10,376},{10,10, 431},{11,10,543},{12,10,664},{13,10,280},{13,10,428},{14,10,128},{17,10,52},{145 ,10,81},{4,0,492},{133,0,451},{135,0,835},{141,0,70},{132,0,539},{7,11,748},{139 ,11,700},{7,11,1517},{11,11,597},{14,11,76},{14,11,335},{148,11,33},{6,0,113},{ 135,0,436},{4,10,338},{133,10,400},{136,0,718},{133,11,127},{133,11,418},{6,0, 1505},{7,0,520},{6,11,198},{11,10,892},{140,11,83},{4,10,221},{5,10,659},{5,10, 989},{7,10,697},{7,10,1211},{138,10,284},{135,0,1070},{5,11,276},{6,11,55},{135, 11,1369},{134,0,1515},{6,11,1752},{136,11,726},{138,10,507},{15,0,78},{4,10,188} ,{135,10,805},{5,10,884},{139,10,991},{133,11,764},{134,10,1653},{6,11,309},{7, 11,331},{138,11,550},{135,11,1861},{132,11,348},{135,11,986},{135,11,1573},{12,0 ,610},{13,0,431},{144,0,59},{9,11,799},{140,10,166},{134,0,1530},{132,0,750},{ 132,0,307},{133,0,964},{6,11,194},{7,11,133},{10,11,493},{10,11,570},{139,11,664 },{5,11,24},{5,11,569},{6,11,3},{6,11,119},{6,11,143},{6,11,440},{7,11,295},{7, 11,599},{7,11,1686},{7,11,1854},{8,11,424},{9,11,43},{9,11,584},{9,11,760},{10, 11,148},{10,11,328},{11,11,159},{11,11,253},{11,11,506},{12,11,487},{12,11,531}, {144,11,33},{136,10,760},{5,11,14},{5,11,892},{6,11,283},{7,11,234},{136,11,537} ,{135,11,1251},{4,11,126},{8,11,635},{147,11,34},{4,11,316},{135,11,1561},{6,0, 999},{6,0,1310},{137,11,861},{4,11,64},{5,11,352},{5,11,720},{6,11,368},{139,11, 359},{4,0,75},{5,0,180},{6,0,500},{7,0,58},{7,0,710},{10,0,645},{136,10,770},{ 133,0,649},{6,0,276},{7,0,282},{7,0,879},{7,0,924},{8,0,459},{9,0,599},{9,0,754} ,{11,0,574},{12,0,128},{12,0,494},{13,0,52},{13,0,301},{15,0,30},{143,0,132},{ 132,0,200},{4,10,89},{5,10,489},{6,10,315},{7,10,553},{7,10,1745},{138,10,243},{ 135,11,1050},{7,0,1621},{6,10,1658},{9,10,3},{10,10,154},{11,10,641},{13,10,85}, {13,10,201},{141,10,346},{6,11,175},{137,11,289},{5,11,432},{133,11,913},{6,0, 225},{137,0,211},{7,0,718},{8,0,687},{139,0,374},{4,10,166},{133,10,505},{9,0, 110},{134,10,1670},{8,0,58},{9,0,724},{11,0,809},{13,0,113},{145,0,72},{6,0,345} ,{7,0,1247},{144,11,82},{5,11,931},{134,11,1698},{8,0,767},{8,0,803},{9,0,301},{ 137,0,903},{139,0,203},{134,0,1154},{7,0,1949},{136,0,674},{134,0,259},{135,0, 1275},{5,11,774},{6,11,1637},{6,11,1686},{134,11,1751},{134,0,1231},{7,10,445},{ 8,10,307},{8,10,704},{10,10,41},{10,10,439},{11,10,237},{11,10,622},{140,10,201} ,{136,0,254},{6,11,260},{135,11,1484},{139,0,277},{135,10,1977},{4,10,189},{5,10 ,713},{6,11,573},{136,10,57},{138,10,371},{132,10,552},{134,11,344},{133,0,248}, {9,0,800},{10,0,693},{11,0,482},{11,0,734},{11,0,789},{134,11,240},{4,0,116},{5, 0,95},{5,0,445},{7,0,1688},{8,0,29},{9,0,272},{11,0,509},{11,0,915},{4,11,292},{ 4,11,736},{5,11,871},{6,11,171},{6,11,1689},{7,11,1324},{7,11,1944},{9,11,415},{ 9,11,580},{14,11,230},{146,11,68},{7,0,490},{13,0,100},{143,0,75},{135,0,1641},{ 133,0,543},{7,11,209},{8,11,661},{10,11,42},{11,11,58},{12,11,58},{12,11,118},{ 141,11,32},{5,0,181},{8,0,41},{6,11,63},{135,11,920},{133,0,657},{133,11,793},{ 138,0,709},{7,0,25},{8,0,202},{138,0,536},{5,11,665},{135,10,1788},{145,10,49},{ 9,0,423},{140,0,89},{5,11,67},{6,11,62},{6,11,374},{135,11,1391},{8,0,113},{9,0, 877},{10,0,554},{11,0,83},{12,0,136},{19,0,109},{9,11,790},{140,11,47},{138,10, 661},{4,0,963},{10,0,927},{14,0,442},{135,10,1945},{133,0,976},{132,0,206},{4,11 ,391},{135,11,1169},{134,0,2002},{6,0,696},{134,0,1008},{134,0,1170},{132,11,271 },{7,0,13},{8,0,226},{10,0,537},{11,0,570},{11,0,605},{11,0,799},{11,0,804},{12, 0,85},{12,0,516},{12,0,623},{13,0,112},{13,0,361},{14,0,77},{14,0,78},{17,0,28}, {19,0,110},{140,11,314},{132,0,769},{134,0,1544},{4,0,551},{137,0,678},{5,10,84} ,{134,10,163},{9,0,57},{9,0,459},{10,0,425},{11,0,119},{12,0,184},{12,0,371},{13 ,0,358},{145,0,51},{5,0,188},{5,0,814},{8,0,10},{9,0,421},{9,0,729},{10,0,609},{ 11,0,689},{4,11,253},{5,10,410},{5,11,544},{7,11,300},{137,11,340},{134,0,624},{ 138,11,321},{135,0,1941},{18,0,130},{5,10,322},{8,10,186},{9,10,262},{10,10,187} ,{142,10,208},{5,11,53},{5,11,541},{6,11,94},{6,11,499},{7,11,230},{139,11,321}, {133,10,227},{4,0,378},{4,11,920},{5,11,25},{5,11,790},{6,11,457},{135,11,853},{ 137,0,269},{132,0,528},{134,0,1146},{7,10,1395},{8,10,486},{9,10,236},{9,10,878} ,{10,10,218},{11,10,95},{19,10,17},{147,10,31},{7,10,2043},{8,10,672},{141,10, 448},{134,0,1105},{134,0,1616},{134,11,1765},{140,11,163},{5,10,412},{133,11,822 },{132,11,634},{6,0,656},{134,11,1730},{134,0,1940},{5,0,104},{6,0,173},{135,0, 1631},{136,10,562},{6,11,36},{7,11,658},{8,11,454},{147,11,86},{5,0,457},{134,10 ,1771},{7,0,810},{8,0,138},{8,0,342},{9,0,84},{10,0,193},{11,0,883},{140,0,359}, {9,0,620},{135,10,1190},{137,10,132},{7,11,975},{137,11,789},{6,0,95},{6,0,1934} ,{136,0,967},{141,11,335},{6,0,406},{10,0,409},{10,0,447},{11,0,44},{140,0,100}, {4,10,317},{135,10,1279},{132,0,477},{134,0,1268},{6,0,1941},{8,0,944},{5,10,63} ,{133,10,509},{132,0,629},{132,11,104},{4,0,246},{133,0,375},{6,0,1636},{132,10, 288},{135,11,1614},{9,0,49},{10,0,774},{8,10,89},{8,10,620},{11,10,628},{12,10, 322},{143,10,124},{4,0,282},{7,0,1034},{11,0,398},{11,0,634},{12,0,1},{12,0,79}, {12,0,544},{14,0,237},{17,0,10},{146,0,20},{132,0,824},{7,11,45},{9,11,542},{9, 11,566},{138,11,728},{5,0,118},{5,0,499},{6,0,476},{6,0,665},{6,0,1176},{6,0, 1196},{7,0,600},{7,0,888},{135,0,1096},{7,0,296},{7,0,596},{8,0,560},{8,0,586},{ 9,0,612},{11,0,304},{12,0,46},{13,0,89},{14,0,112},{145,0,122},{5,0,894},{6,0, 1772},{9,0,1009},{138,10,120},{5,11,533},{7,11,755},{138,11,780},{151,10,1},{6,0 ,1474},{7,11,87},{142,11,288},{139,0,366},{137,10,461},{7,11,988},{7,11,1939},{9 ,11,64},{9,11,502},{12,11,7},{12,11,34},{13,11,12},{13,11,234},{147,11,77},{7,0, 1599},{7,0,1723},{8,0,79},{8,0,106},{8,0,190},{8,0,302},{8,0,383},{8,0,713},{9,0 ,119},{9,0,233},{9,0,419},{9,0,471},{10,0,181},{10,0,406},{11,0,57},{11,0,85},{ 11,0,120},{11,0,177},{11,0,296},{11,0,382},{11,0,454},{11,0,758},{11,0,999},{12, 0,27},{12,0,98},{12,0,131},{12,0,245},{12,0,312},{12,0,446},{12,0,454},{13,0,25} ,{13,0,98},{13,0,426},{13,0,508},{14,0,70},{14,0,163},{14,0,272},{14,0,277},{14, 0,370},{15,0,95},{15,0,138},{15,0,167},{17,0,38},{148,0,96},{135,10,1346},{10,0, 200},{19,0,2},{151,0,22},{135,11,141},{134,10,85},{134,0,1759},{138,0,372},{145, 0,16},{8,0,943},{132,11,619},{139,11,88},{5,11,246},{8,11,189},{9,11,355},{9,11, 512},{10,11,124},{10,11,453},{11,11,143},{11,11,416},{11,11,859},{141,11,341},{5 ,0,258},{134,0,719},{6,0,1798},{6,0,1839},{8,0,900},{10,0,874},{10,0,886},{12,0, 698},{12,0,732},{12,0,770},{16,0,106},{18,0,163},{18,0,170},{18,0,171},{152,0,20 },{9,0,707},{11,0,326},{11,0,339},{12,0,423},{12,0,502},{20,0,62},{9,11,707},{11 ,11,326},{11,11,339},{12,11,423},{12,11,502},{148,11,62},{5,0,30},{7,0,495},{8,0 ,134},{9,0,788},{140,0,438},{133,11,678},{5,10,279},{6,10,235},{7,10,468},{8,10, 446},{9,10,637},{10,10,717},{11,10,738},{140,10,514},{5,11,35},{6,11,287},{7,11, 862},{7,11,1886},{138,11,179},{7,0,1948},{7,0,2004},{132,11,517},{5,10,17},{6,10 ,371},{137,10,528},{4,0,115},{5,0,669},{6,0,407},{8,0,311},{11,0,10},{141,0,5},{ 137,0,381},{5,0,50},{6,0,439},{7,0,780},{135,0,1040},{136,11,667},{11,11,403},{ 146,11,83},{5,0,1},{6,0,81},{138,0,520},{134,0,738},{5,0,482},{8,0,98},{9,0,172} ,{10,0,360},{10,0,700},{10,0,822},{11,0,302},{11,0,778},{12,0,50},{12,0,127},{12 ,0,396},{13,0,62},{13,0,328},{14,0,122},{147,0,72},{9,11,157},{10,11,131},{140, 11,72},{135,11,714},{135,11,539},{5,0,2},{6,0,512},{7,0,797},{7,0,1494},{8,0,253 },{8,0,589},{9,0,77},{10,0,1},{10,0,129},{10,0,225},{11,0,118},{11,0,226},{11,0, 251},{11,0,430},{11,0,701},{11,0,974},{11,0,982},{12,0,64},{12,0,260},{12,0,488} ,{140,0,690},{5,11,394},{7,11,367},{7,11,487},{7,11,857},{7,11,1713},{8,11,246}, {9,11,537},{10,11,165},{12,11,219},{140,11,561},{136,0,557},{5,10,779},{5,10,807 },{6,10,1655},{134,10,1676},{4,10,196},{5,10,558},{133,10,949},{11,11,827},{12, 11,56},{14,11,34},{143,11,148},{137,0,347},{133,0,572},{134,0,832},{4,0,12},{7,0 ,504},{7,0,522},{7,0,809},{8,0,797},{141,0,88},{4,10,752},{133,11,449},{7,11,86} ,{8,11,103},{145,11,69},{7,11,2028},{138,11,641},{5,0,528},{6,11,1},{142,11,2},{ 134,0,861},{10,0,294},{4,10,227},{5,10,159},{5,10,409},{7,10,80},{10,10,479},{12 ,10,418},{14,10,50},{14,10,249},{142,10,295},{7,10,1470},{8,10,66},{8,10,137},{8 ,10,761},{9,10,638},{11,10,80},{11,10,212},{11,10,368},{11,10,418},{12,10,8},{13 ,10,15},{16,10,61},{17,10,59},{19,10,28},{148,10,84},{20,0,109},{135,11,1148},{6 ,11,277},{7,11,1274},{7,11,1386},{7,11,1392},{12,11,129},{146,11,87},{6,11,187}, {7,11,39},{7,11,1203},{8,11,380},{8,11,542},{14,11,117},{149,11,28},{134,0,1187} ,{5,0,266},{9,0,290},{9,0,364},{10,0,293},{11,0,606},{142,0,45},{6,11,297},{7,11 ,793},{139,11,938},{4,0,50},{6,0,594},{9,0,121},{10,0,49},{10,0,412},{139,0,834} ,{136,0,748},{7,11,464},{8,11,438},{11,11,105},{11,11,363},{12,11,231},{14,11, 386},{15,11,102},{148,11,75},{132,0,466},{13,0,399},{14,0,337},{6,10,38},{7,10, 1220},{8,10,185},{8,10,256},{9,10,22},{9,10,331},{10,10,738},{11,10,205},{11,10, 540},{11,10,746},{13,10,465},{142,10,194},{9,0,378},{141,0,162},{137,0,519},{4, 10,159},{6,10,115},{7,10,252},{7,10,257},{7,10,1928},{8,10,69},{9,10,384},{10,10 ,91},{10,10,615},{12,10,375},{14,10,235},{18,10,117},{147,10,123},{5,11,604},{5, 10,911},{136,10,278},{132,0,667},{8,0,351},{9,0,322},{4,10,151},{135,10,1567},{ 134,0,902},{133,10,990},{12,0,180},{5,10,194},{7,10,1662},{137,10,90},{4,0,869}, {134,0,1996},{134,0,813},{133,10,425},{137,11,761},{132,0,260},{133,10,971},{5, 11,20},{6,11,298},{7,11,659},{7,11,1366},{137,11,219},{4,0,39},{5,0,36},{7,0, 1843},{8,0,407},{11,0,144},{140,0,523},{4,0,510},{10,0,587},{139,10,752},{7,0,29 },{7,0,66},{7,0,1980},{10,0,487},{138,0,809},{13,0,260},{14,0,82},{18,0,63},{137 ,10,662},{5,10,72},{6,10,264},{7,10,21},{7,10,46},{7,10,2013},{8,10,215},{8,10, 513},{10,10,266},{139,10,22},{134,0,570},{6,0,565},{7,0,1667},{4,11,439},{10,10, 95},{11,10,603},{12,11,242},{13,10,443},{14,10,160},{143,10,4},{134,0,1464},{134 ,10,431},{9,0,372},{15,0,2},{19,0,10},{19,0,18},{5,10,874},{6,10,1677},{143,10,0 },{132,0,787},{6,0,380},{12,0,399},{21,0,19},{7,10,939},{7,10,1172},{7,10,1671}, {9,10,540},{10,10,696},{11,10,265},{11,10,732},{11,10,928},{11,10,937},{141,10, 438},{137,0,200},{132,11,233},{132,0,516},{134,11,577},{132,0,844},{11,0,887},{ 14,0,365},{142,0,375},{132,11,482},{8,0,821},{140,0,44},{7,0,1655},{136,0,305},{ 5,10,682},{135,10,1887},{135,11,346},{132,10,696},{4,0,10},{7,0,917},{139,0,786} ,{5,11,795},{6,11,1741},{8,11,417},{137,11,782},{4,0,1016},{134,0,2031},{5,0,684 },{4,10,726},{133,10,630},{6,0,1021},{134,0,1480},{8,10,802},{136,10,838},{134,0 ,27},{134,0,395},{135,11,622},{7,11,625},{135,11,1750},{4,11,203},{135,11,1936}, {6,10,118},{7,10,215},{7,10,1521},{140,10,11},{132,0,813},{136,0,511},{7,10,615} ,{138,10,251},{135,10,1044},{145,0,56},{133,10,225},{6,0,342},{6,0,496},{8,0,275 },{137,0,206},{4,0,909},{133,0,940},{132,0,891},{7,11,311},{9,11,308},{140,11, 255},{4,10,370},{5,10,756},{135,10,1326},{4,0,687},{134,0,1596},{134,0,1342},{6, 10,1662},{7,10,48},{8,10,771},{10,10,116},{13,10,104},{14,10,105},{14,10,184},{ 15,10,168},{19,10,92},{148,10,68},{138,10,209},{4,11,400},{5,11,267},{135,11,232 },{151,11,12},{6,0,41},{141,0,160},{141,11,314},{134,0,1718},{136,0,778},{142,11 ,261},{134,0,1610},{133,0,115},{132,0,294},{14,0,314},{132,10,120},{132,0,983},{ 5,0,193},{140,0,178},{138,10,429},{5,10,820},{135,10,931},{6,0,994},{6,0,1051},{ 6,0,1439},{7,0,174},{133,11,732},{4,11,100},{7,11,679},{8,11,313},{138,10,199},{ 6,10,151},{6,10,1675},{7,10,383},{151,10,10},{6,0,1796},{8,0,848},{8,0,867},{8,0 ,907},{10,0,855},{140,0,703},{140,0,221},{4,0,122},{5,0,796},{5,0,952},{6,0,1660 },{6,0,1671},{8,0,567},{9,0,687},{9,0,742},{10,0,686},{11,0,682},{11,0,909},{140 ,0,281},{5,11,362},{5,11,443},{6,11,318},{7,11,1019},{139,11,623},{5,11,463},{ 136,11,296},{11,0,583},{13,0,262},{6,10,1624},{12,10,422},{142,10,360},{5,0,179} ,{7,0,1095},{135,0,1213},{4,10,43},{4,11,454},{5,10,344},{133,10,357},{4,0,66},{ 7,0,722},{135,0,904},{134,0,773},{7,0,352},{133,10,888},{5,11,48},{5,11,404},{6, 11,557},{7,11,458},{8,11,597},{10,11,455},{10,11,606},{11,11,49},{11,11,548},{12 ,11,476},{13,11,18},{141,11,450},{134,11,418},{132,10,711},{5,11,442},{135,11, 1984},{141,0,35},{137,0,152},{134,0,1197},{135,11,1093},{137,11,203},{137,10,440 },{10,0,592},{10,0,753},{12,0,317},{12,0,355},{12,0,465},{12,0,469},{12,0,560},{ 12,0,578},{141,0,243},{133,0,564},{134,0,797},{5,10,958},{133,10,987},{5,11,55}, {7,11,376},{140,11,161},{133,11,450},{134,0,556},{134,0,819},{11,10,276},{142,10 ,293},{7,0,544},{138,0,61},{8,0,719},{4,10,65},{5,10,479},{5,10,1004},{7,10,1913 },{8,10,317},{9,10,302},{10,10,612},{141,10,22},{4,0,5},{5,0,498},{8,0,637},{9,0 ,521},{4,11,213},{4,10,261},{7,11,223},{7,10,510},{136,11,80},{5,0,927},{7,0,101 },{4,10,291},{7,11,381},{7,11,806},{7,11,820},{8,11,354},{8,11,437},{8,11,787},{ 9,10,515},{9,11,657},{10,11,58},{10,11,339},{10,11,749},{11,11,914},{12,10,152}, {12,11,162},{12,10,443},{13,11,75},{13,10,392},{14,11,106},{14,11,198},{14,11, 320},{14,10,357},{14,11,413},{146,11,43},{6,0,1153},{7,0,1441},{136,11,747},{4,0 ,893},{5,0,780},{133,0,893},{138,11,654},{133,11,692},{133,0,238},{134,11,191},{ 4,10,130},{135,10,843},{6,0,1296},{5,10,42},{5,10,879},{7,10,245},{7,10,324},{7, 10,1532},{11,10,463},{11,10,472},{13,10,363},{144,10,52},{134,0,1729},{6,0,1999} ,{136,0,969},{4,10,134},{133,10,372},{4,0,60},{7,0,941},{7,0,1800},{8,0,314},{9, 0,700},{139,0,487},{134,0,1144},{6,11,162},{7,11,1960},{136,11,831},{132,11,706} ,{135,0,1147},{138,11,426},{138,11,89},{7,0,1853},{138,0,437},{136,0,419},{135, 10,1634},{133,0,828},{5,0,806},{7,0,176},{7,0,178},{7,0,1240},{7,0,1976},{132,10 ,644},{135,11,1877},{5,11,420},{135,11,1449},{4,0,51},{5,0,39},{6,0,4},{7,0,591} ,{7,0,849},{7,0,951},{7,0,1613},{7,0,1760},{7,0,1988},{9,0,434},{10,0,754},{11,0 ,25},{139,0,37},{10,11,57},{138,11,277},{135,10,540},{132,11,204},{135,0,159},{ 139,11,231},{133,0,902},{7,0,928},{7,11,366},{9,11,287},{12,11,199},{12,11,556}, {140,11,577},{6,10,623},{136,10,789},{4,10,908},{5,10,359},{5,10,508},{6,10,1723 },{7,10,343},{7,10,1996},{135,10,2026},{134,0,270},{4,10,341},{135,10,480},{5,11 ,356},{135,11,224},{11,11,588},{11,11,864},{11,11,968},{143,11,160},{132,0,556}, {137,0,801},{132,0,416},{142,0,372},{5,0,152},{5,0,197},{7,0,340},{7,0,867},{10, 0,548},{10,0,581},{11,0,6},{12,0,3},{12,0,19},{14,0,110},{142,0,289},{139,0,369} ,{7,11,630},{9,11,567},{11,11,150},{11,11,444},{141,11,119},{134,11,539},{7,10, 1995},{8,10,299},{11,10,890},{140,10,674},{7,0,34},{7,0,190},{8,0,28},{8,0,141}, {8,0,444},{8,0,811},{9,0,468},{11,0,334},{12,0,24},{12,0,386},{140,0,576},{133,0 ,757},{7,0,1553},{136,0,898},{133,0,721},{136,0,1012},{4,0,789},{5,0,647},{135,0 ,1102},{132,0,898},{10,0,183},{4,10,238},{5,10,503},{6,10,179},{7,10,2003},{8,10 ,381},{8,10,473},{9,10,149},{10,10,788},{15,10,45},{15,10,86},{20,10,110},{150, 10,57},{9,0,136},{19,0,107},{4,10,121},{5,10,156},{5,10,349},{10,10,605},{142,10 ,342},{4,11,235},{135,11,255},{4,11,194},{5,11,584},{6,11,384},{7,11,583},{10,11 ,761},{11,11,760},{139,11,851},{6,10,80},{6,10,1694},{7,10,173},{7,10,1974},{9, 10,547},{10,10,730},{14,10,18},{150,10,39},{4,10,923},{134,10,1711},{5,0,277},{ 141,0,247},{132,0,435},{133,11,562},{134,0,1311},{5,11,191},{137,11,271},{132,10 ,595},{7,11,1537},{14,11,96},{143,11,73},{5,0,437},{7,0,502},{7,0,519},{7,0,1122 },{7,0,1751},{14,0,211},{6,10,459},{7,10,1753},{7,10,1805},{8,10,658},{9,10,1},{ 11,10,959},{141,10,446},{6,0,814},{4,11,470},{5,11,473},{6,11,153},{7,11,1503},{ 7,11,1923},{10,11,701},{11,11,132},{11,11,168},{11,11,227},{11,11,320},{11,11, 436},{11,11,525},{11,11,855},{12,11,41},{12,11,286},{13,11,103},{13,11,284},{14, 11,255},{14,11,262},{15,11,117},{143,11,127},{5,0,265},{6,0,212},{135,0,28},{138 ,0,750},{133,11,327},{6,11,552},{7,11,1754},{137,11,604},{134,0,2012},{132,0,702 },{5,11,80},{6,11,405},{7,11,403},{7,11,1502},{7,11,1626},{8,11,456},{9,11,487}, {9,11,853},{9,11,889},{10,11,309},{11,11,721},{11,11,994},{12,11,430},{141,11, 165},{5,0,808},{135,0,2045},{5,0,166},{8,0,739},{140,0,511},{134,10,490},{4,11, 453},{5,11,887},{6,11,535},{8,11,6},{136,11,543},{4,0,119},{5,0,170},{5,0,447},{ 7,0,1708},{7,0,1889},{9,0,357},{9,0,719},{12,0,486},{140,0,596},{137,0,500},{7, 10,250},{136,10,507},{132,10,158},{6,0,809},{134,0,1500},{9,0,327},{11,0,350},{ 11,0,831},{13,0,352},{4,10,140},{7,10,362},{8,10,209},{9,10,10},{9,10,503},{9,10 ,614},{10,10,689},{11,10,327},{11,10,725},{12,10,252},{12,10,583},{13,10,192},{ 14,10,269},{14,10,356},{148,10,50},{135,11,741},{4,0,450},{7,0,1158},{19,10,1},{ 19,10,26},{150,10,9},{6,0,597},{135,0,1318},{134,0,1602},{6,10,228},{7,10,1341}, {9,10,408},{138,10,343},{7,0,1375},{7,0,1466},{138,0,331},{132,0,754},{132,10, 557},{5,11,101},{6,11,88},{6,11,543},{7,11,1677},{9,11,100},{10,11,677},{14,11, 169},{14,11,302},{14,11,313},{15,11,48},{143,11,84},{134,0,1368},{4,11,310},{9, 11,795},{10,11,733},{11,11,451},{12,11,249},{14,11,115},{14,11,286},{143,11,100} ,{132,10,548},{10,0,557},{7,10,197},{8,10,142},{8,10,325},{9,10,150},{9,10,596}, {10,10,353},{11,10,74},{11,10,315},{12,10,662},{12,10,681},{14,10,423},{143,10, 141},{133,11,587},{5,0,850},{136,0,799},{10,0,908},{12,0,701},{12,0,757},{142,0, 466},{4,0,62},{5,0,275},{18,0,19},{6,10,399},{6,10,579},{7,10,692},{7,10,846},{7 ,10,1015},{7,10,1799},{8,10,403},{9,10,394},{10,10,133},{12,10,4},{12,10,297},{ 12,10,452},{16,10,81},{18,10,25},{21,10,14},{22,10,12},{151,10,18},{12,0,459},{7 ,10,1546},{11,10,299},{142,10,407},{132,10,177},{132,11,498},{7,11,217},{8,11, 140},{138,11,610},{5,10,411},{135,10,653},{134,0,1802},{7,10,439},{10,10,727},{ 11,10,260},{139,10,684},{133,11,905},{11,11,580},{142,11,201},{134,0,1397},{5,10 ,208},{7,10,753},{135,10,1528},{7,0,238},{7,0,2033},{8,0,120},{8,0,188},{8,0,659 },{9,0,598},{10,0,466},{12,0,342},{12,0,588},{13,0,503},{14,0,246},{143,0,92},{ 135,11,1041},{4,11,456},{7,11,105},{7,11,358},{7,11,1637},{8,11,643},{139,11,483 },{6,0,1318},{134,0,1324},{4,0,201},{7,0,1744},{8,0,602},{11,0,247},{11,0,826},{ 17,0,65},{133,10,242},{8,0,164},{146,0,62},{133,10,953},{139,10,802},{133,0,615} ,{7,11,1566},{8,11,269},{9,11,212},{9,11,718},{14,11,15},{14,11,132},{142,11,227 },{133,10,290},{132,10,380},{5,10,52},{7,10,277},{9,10,368},{139,10,791},{135,0, 1243},{133,11,539},{11,11,919},{141,11,409},{136,0,968},{133,11,470},{134,0,882} ,{132,0,907},{5,0,100},{10,0,329},{12,0,416},{149,0,29},{10,10,138},{139,10,476} ,{5,10,725},{5,10,727},{6,11,91},{7,11,435},{135,10,1811},{4,11,16},{5,11,316},{ 5,11,842},{6,11,370},{6,11,1778},{8,11,166},{11,11,812},{12,11,206},{12,11,351}, {14,11,418},{16,11,15},{16,11,34},{18,11,3},{19,11,3},{19,11,7},{20,11,4},{149, 11,21},{132,0,176},{5,0,636},{5,0,998},{7,0,9},{7,0,1508},{8,0,26},{9,0,317},{9, 0,358},{10,0,210},{10,0,292},{10,0,533},{11,0,555},{12,0,526},{12,0,607},{13,0, 263},{13,0,459},{142,0,271},{6,0,256},{8,0,265},{4,10,38},{7,10,307},{7,10,999}, {7,10,1481},{7,10,1732},{7,10,1738},{9,10,414},{11,10,316},{12,10,52},{13,10,420 },{147,10,100},{135,10,1296},{4,11,611},{133,11,606},{4,0,643},{142,11,21},{133, 11,715},{133,10,723},{6,0,610},{135,11,597},{10,0,127},{141,0,27},{6,0,1995},{6, 0,2001},{8,0,119},{136,0,973},{4,11,149},{138,11,368},{12,0,522},{4,11,154},{5, 10,109},{6,10,1784},{7,11,1134},{7,10,1895},{8,11,105},{12,10,296},{140,10,302}, {4,11,31},{6,11,429},{7,11,962},{9,11,458},{139,11,691},{10,0,553},{11,0,876},{ 13,0,193},{13,0,423},{14,0,166},{19,0,84},{4,11,312},{5,10,216},{7,10,1879},{9, 10,141},{9,10,270},{9,10,679},{10,10,159},{11,10,197},{12,10,538},{12,10,559},{ 14,10,144},{14,10,167},{143,10,67},{134,0,1582},{7,0,1578},{135,11,1578},{137,10 ,81},{132,11,236},{134,10,391},{134,0,795},{7,10,322},{136,10,249},{5,11,836},{5 ,11,857},{6,11,1680},{7,11,59},{147,11,53},{135,0,432},{10,11,68},{139,11,494},{ 4,11,81},{139,11,867},{7,0,126},{136,0,84},{142,11,280},{5,11,282},{8,11,650},{9 ,11,295},{9,11,907},{138,11,443},{136,0,790},{5,10,632},{138,10,526},{6,0,64},{ 12,0,377},{13,0,309},{14,0,141},{14,0,429},{14,11,141},{142,11,429},{134,0,1529} ,{6,0,321},{7,0,1857},{9,0,530},{19,0,99},{7,10,948},{7,10,1042},{8,10,235},{8, 10,461},{9,10,453},{10,10,354},{145,10,77},{7,0,1104},{11,0,269},{11,0,539},{11, 0,627},{11,0,706},{11,0,975},{12,0,248},{12,0,434},{12,0,600},{12,0,622},{13,0, 297},{13,0,485},{14,0,69},{14,0,409},{143,0,108},{4,10,362},{7,10,52},{7,10,303} ,{10,11,70},{12,11,26},{14,11,17},{14,11,178},{15,11,34},{149,11,12},{11,0,977}, {141,0,507},{9,0,34},{139,0,484},{5,10,196},{6,10,486},{7,10,212},{8,10,309},{ 136,10,346},{6,0,1700},{7,0,26},{7,0,293},{7,0,382},{7,0,1026},{7,0,1087},{7,0, 2027},{8,0,24},{8,0,114},{8,0,252},{8,0,727},{8,0,729},{9,0,30},{9,0,199},{9,0, 231},{9,0,251},{9,0,334},{9,0,361},{9,0,712},{10,0,55},{10,0,60},{10,0,232},{10, 0,332},{10,0,384},{10,0,396},{10,0,504},{10,0,542},{10,0,652},{11,0,20},{11,0,48 },{11,0,207},{11,0,291},{11,0,298},{11,0,342},{11,0,365},{11,0,394},{11,0,620},{ 11,0,705},{11,0,1017},{12,0,123},{12,0,340},{12,0,406},{12,0,643},{13,0,61},{13, 0,269},{13,0,311},{13,0,319},{13,0,486},{14,0,234},{15,0,62},{15,0,85},{16,0,71} ,{18,0,119},{20,0,105},{135,10,1912},{4,11,71},{5,11,376},{7,11,119},{138,11,665 },{10,0,918},{10,0,926},{4,10,686},{136,11,55},{138,10,625},{136,10,706},{132,11 ,479},{4,10,30},{133,10,43},{6,0,379},{7,0,270},{8,0,176},{8,0,183},{9,0,432},{9 ,0,661},{12,0,247},{12,0,617},{18,0,125},{7,11,607},{8,11,99},{152,11,4},{5,0, 792},{133,0,900},{4,11,612},{133,11,561},{4,11,41},{4,10,220},{5,11,74},{7,10, 1535},{7,11,1627},{11,11,871},{140,11,619},{135,0,1920},{7,11,94},{11,11,329},{ 11,11,965},{12,11,241},{14,11,354},{15,11,22},{148,11,63},{9,11,209},{137,11,300 },{134,0,771},{135,0,1979},{4,0,901},{133,0,776},{142,0,254},{133,11,98},{9,11, 16},{141,11,386},{133,11,984},{4,11,182},{6,11,205},{135,11,220},{7,10,1725},{7, 10,1774},{138,10,393},{5,10,263},{134,10,414},{4,11,42},{9,11,205},{9,11,786},{ 138,11,659},{14,0,140},{148,0,41},{8,0,440},{10,0,359},{6,10,178},{6,11,289},{6, 10,1750},{7,11,1670},{9,10,690},{10,10,155},{10,10,373},{11,10,698},{12,11,57},{ 13,10,155},{20,10,93},{151,11,4},{4,0,37},{5,0,334},{7,0,1253},{151,11,25},{4,0, 508},{4,11,635},{5,10,97},{137,10,393},{139,11,533},{4,0,640},{133,0,513},{134, 10,1639},{132,11,371},{4,11,272},{7,11,836},{7,11,1651},{145,11,89},{5,11,825},{ 6,11,444},{6,11,1640},{136,11,308},{4,10,191},{7,10,934},{8,10,647},{145,10,97}, {12,0,246},{15,0,162},{19,0,64},{20,0,8},{20,0,95},{22,0,24},{152,0,17},{4,0,533 },{5,10,165},{9,10,346},{138,10,655},{5,11,737},{139,10,885},{133,10,877},{8,10, 128},{139,10,179},{137,11,307},{140,0,752},{133,0,920},{135,0,1048},{5,0,153},{6 ,0,580},{6,10,1663},{7,10,132},{7,10,1154},{7,10,1415},{7,10,1507},{12,10,493},{ 15,10,105},{151,10,15},{5,10,459},{7,10,1073},{8,10,241},{136,10,334},{138,0,391 },{135,0,1952},{133,11,525},{8,11,641},{11,11,388},{140,11,580},{142,0,126},{134 ,0,640},{132,0,483},{7,0,1616},{9,0,69},{6,10,324},{6,10,520},{7,10,338},{7,10, 1729},{8,10,228},{139,10,750},{5,11,493},{134,11,528},{135,0,734},{4,11,174},{ 135,11,911},{138,0,480},{9,0,495},{146,0,104},{135,10,705},{9,0,472},{4,10,73},{ 6,10,612},{7,10,927},{7,10,1330},{7,10,1822},{8,10,217},{9,10,765},{9,10,766},{ 10,10,408},{11,10,51},{11,10,793},{12,10,266},{15,10,158},{20,10,89},{150,10,32} ,{7,11,548},{137,11,58},{4,11,32},{5,11,215},{6,11,269},{7,11,1782},{7,11,1892}, {10,11,16},{11,11,822},{11,11,954},{141,11,481},{132,0,874},{9,0,229},{5,10,389} ,{136,10,636},{7,11,1749},{136,11,477},{134,0,948},{5,11,308},{135,11,1088},{4,0 ,748},{139,0,1009},{136,10,21},{6,0,555},{135,0,485},{5,11,126},{8,11,297},{9,11 ,366},{9,11,445},{12,11,53},{12,11,374},{141,11,492},{7,11,1551},{139,11,361},{ 136,0,193},{136,0,472},{8,0,653},{13,0,93},{147,0,14},{132,0,984},{132,11,175},{ 5,0,172},{6,0,1971},{132,11,685},{149,11,8},{133,11,797},{13,0,83},{5,10,189},{7 ,10,442},{7,10,443},{8,10,281},{12,10,174},{141,10,261},{134,0,1568},{133,11,565 },{139,0,384},{133,0,260},{7,0,758},{7,0,880},{7,0,1359},{9,0,164},{9,0,167},{10 ,0,156},{10,0,588},{12,0,101},{14,0,48},{15,0,70},{6,10,2},{7,10,1262},{7,10, 1737},{8,10,22},{8,10,270},{8,10,612},{9,10,312},{9,10,436},{10,10,311},{10,10, 623},{11,10,72},{11,10,330},{11,10,455},{12,10,321},{12,10,504},{12,10,530},{12, 10,543},{13,10,17},{13,10,156},{13,10,334},{17,10,60},{148,10,64},{4,11,252},{7, 11,1068},{10,11,434},{11,11,228},{11,11,426},{13,11,231},{18,11,106},{148,11,87} ,{7,10,354},{10,10,410},{139,10,815},{6,0,367},{7,10,670},{7,10,1327},{8,10,411} ,{8,10,435},{9,10,653},{9,10,740},{10,10,385},{11,10,222},{11,10,324},{11,10,829 },{140,10,611},{7,0,1174},{6,10,166},{135,10,374},{146,0,121},{132,0,828},{5,11, 231},{138,11,509},{7,11,601},{9,11,277},{9,11,674},{10,11,178},{10,11,257},{10, 11,418},{11,11,531},{11,11,544},{11,11,585},{12,11,113},{12,11,475},{13,11,99},{ 142,11,428},{134,0,1541},{135,11,1779},{5,0,343},{134,10,398},{135,10,50},{135, 11,1683},{4,0,440},{7,0,57},{8,0,167},{8,0,375},{9,0,82},{9,0,561},{9,0,744},{10 ,0,620},{137,11,744},{134,0,926},{6,10,517},{7,10,1159},{10,10,621},{139,10,192} ,{137,0,827},{8,0,194},{136,0,756},{10,10,223},{139,10,645},{7,10,64},{136,10, 245},{4,11,399},{5,11,119},{5,11,494},{7,11,751},{137,11,556},{132,0,808},{135,0 ,22},{7,10,1763},{140,10,310},{5,0,639},{7,0,1249},{11,0,896},{134,11,584},{134, 0,1614},{135,0,860},{135,11,1121},{5,10,129},{6,10,61},{135,10,947},{4,0,102},{7 ,0,815},{7,0,1699},{139,0,964},{13,10,505},{141,10,506},{139,10,1000},{132,11, 679},{132,0,899},{132,0,569},{5,11,694},{137,11,714},{136,0,795},{6,0,2045},{139 ,11,7},{6,0,52},{9,0,104},{9,0,559},{12,0,308},{147,0,87},{4,0,301},{132,0,604}, {133,10,637},{136,0,779},{5,11,143},{5,11,769},{6,11,1760},{7,11,682},{7,11,1992 },{136,11,736},{137,10,590},{147,0,32},{137,11,527},{5,10,280},{135,10,1226},{ 134,0,494},{6,0,677},{6,0,682},{134,0,1044},{133,10,281},{135,10,1064},{7,0,508} ,{133,11,860},{6,11,422},{7,11,0},{7,11,1544},{9,11,577},{11,11,990},{12,11,141} ,{12,11,453},{13,11,47},{141,11,266},{134,0,1014},{5,11,515},{137,11,131},{134,0 ,957},{132,11,646},{6,0,310},{7,0,1849},{8,0,72},{8,0,272},{8,0,431},{9,0,12},{9 ,0,376},{10,0,563},{10,0,630},{10,0,796},{10,0,810},{11,0,367},{11,0,599},{11,0, 686},{140,0,672},{7,0,570},{4,11,396},{7,10,120},{7,11,728},{8,10,489},{9,11,117 },{9,10,319},{10,10,820},{11,10,1004},{12,10,379},{12,10,679},{13,10,117},{13,11 ,202},{13,10,412},{14,10,25},{15,10,52},{15,10,161},{16,10,47},{20,11,51},{149, 10,2},{6,11,121},{6,11,124},{6,11,357},{7,11,1138},{7,11,1295},{8,11,162},{139, 11,655},{8,0,449},{4,10,937},{5,10,801},{136,11,449},{139,11,958},{6,0,181},{7,0 ,537},{8,0,64},{9,0,127},{10,0,496},{12,0,510},{141,0,384},{138,11,253},{4,0,244 },{135,0,233},{133,11,237},{132,10,365},{6,0,1650},{10,0,702},{139,0,245},{5,10, 7},{139,10,774},{13,0,463},{20,0,49},{13,11,463},{148,11,49},{4,10,734},{5,10, 662},{134,10,430},{4,10,746},{135,10,1090},{5,10,360},{136,10,237},{137,0,338},{ 143,11,10},{7,11,571},{138,11,366},{134,0,1279},{9,11,513},{10,11,22},{10,11,39} ,{12,11,122},{140,11,187},{133,0,896},{146,0,178},{134,0,695},{137,0,808},{134, 11,587},{7,11,107},{7,11,838},{8,11,550},{138,11,401},{7,0,1117},{136,0,539},{4, 10,277},{5,10,608},{6,10,493},{7,10,457},{140,10,384},{133,11,768},{12,0,257},{7 ,10,27},{135,10,316},{140,0,1003},{4,0,207},{5,0,586},{5,0,676},{6,0,448},{8,0, 244},{11,0,1},{13,0,3},{16,0,54},{17,0,4},{18,0,13},{133,10,552},{4,10,401},{137 ,10,264},{5,0,516},{7,0,1883},{135,11,1883},{12,0,960},{132,11,894},{5,0,4},{5,0 ,810},{6,0,13},{6,0,538},{6,0,1690},{6,0,1726},{7,0,499},{7,0,1819},{8,0,148},{8 ,0,696},{8,0,791},{12,0,125},{143,0,9},{135,0,1268},{11,0,30},{14,0,315},{9,10, 543},{10,10,524},{12,10,524},{16,10,18},{20,10,26},{148,10,65},{6,0,748},{4,10, 205},{5,10,623},{7,10,104},{136,10,519},{11,0,542},{139,0,852},{140,0,6},{132,0, 848},{7,0,1385},{11,0,582},{11,0,650},{11,0,901},{11,0,949},{12,0,232},{12,0,236 },{13,0,413},{13,0,501},{18,0,116},{7,10,579},{9,10,41},{9,10,244},{9,10,669},{ 10,10,5},{11,10,861},{11,10,951},{139,10,980},{4,0,945},{6,0,1811},{6,0,1845},{6 ,0,1853},{6,0,1858},{8,0,862},{12,0,782},{12,0,788},{18,0,160},{148,0,117},{132, 10,717},{4,0,925},{5,0,803},{8,0,698},{138,0,828},{134,0,1416},{132,0,610},{139, 0,992},{6,0,878},{134,0,1477},{135,0,1847},{138,11,531},{137,11,539},{134,11,272 },{133,0,383},{134,0,1404},{132,10,489},{4,11,9},{5,11,128},{7,11,368},{11,11, 480},{148,11,3},{136,0,986},{9,0,660},{138,0,347},{135,10,892},{136,11,682},{7,0 ,572},{9,0,592},{11,0,680},{12,0,356},{140,0,550},{7,0,1411},{138,11,527},{4,11, 2},{7,11,545},{135,11,894},{137,10,473},{11,0,64},{7,11,481},{7,10,819},{9,10,26 },{9,10,392},{9,11,792},{10,10,152},{10,10,226},{12,10,276},{12,10,426},{12,10, 589},{13,10,460},{15,10,97},{19,10,48},{148,10,104},{135,10,51},{136,11,445},{ 136,11,646},{135,0,606},{132,10,674},{6,0,1829},{134,0,1830},{132,10,770},{5,10, 79},{7,10,1027},{7,10,1477},{139,10,52},{5,11,530},{142,11,113},{134,10,1666},{7 ,0,748},{139,0,700},{134,10,195},{133,10,789},{9,0,87},{10,0,365},{4,10,251},{4, 10,688},{7,10,513},{135,10,1284},{136,11,111},{133,0,127},{6,0,198},{140,0,83},{ 133,11,556},{133,10,889},{4,10,160},{5,10,330},{7,10,1434},{136,10,174},{5,0,276 },{6,0,55},{7,0,1369},{138,0,864},{8,11,16},{140,11,568},{6,0,1752},{136,0,726}, {135,0,1066},{133,0,764},{6,11,186},{137,11,426},{11,0,683},{139,11,683},{6,0, 309},{7,0,331},{138,0,550},{133,10,374},{6,0,1212},{6,0,1852},{7,0,1062},{8,0, 874},{8,0,882},{138,0,936},{132,11,585},{134,0,1364},{7,0,986},{133,10,731},{6,0 ,723},{6,0,1408},{138,0,381},{135,0,1573},{134,0,1025},{4,10,626},{5,10,642},{6, 10,425},{10,10,202},{139,10,141},{4,11,93},{5,11,252},{6,11,229},{7,11,291},{9, 11,550},{139,11,644},{137,11,749},{137,11,162},{132,11,381},{135,0,1559},{6,0, 194},{7,0,133},{10,0,493},{10,0,570},{139,0,664},{5,0,24},{5,0,569},{6,0,3},{6,0 ,119},{6,0,143},{6,0,440},{7,0,295},{7,0,599},{7,0,1686},{7,0,1854},{8,0,424},{9 ,0,43},{9,0,584},{9,0,760},{10,0,148},{10,0,328},{11,0,159},{11,0,253},{11,0,506 },{12,0,487},{140,0,531},{6,0,661},{134,0,1517},{136,10,835},{151,10,17},{5,0,14 },{5,0,892},{6,0,283},{7,0,234},{136,0,537},{139,0,541},{4,0,126},{8,0,635},{147 ,0,34},{4,0,316},{4,0,495},{135,0,1561},{4,11,187},{5,11,184},{5,11,690},{7,11, 1869},{138,11,756},{139,11,783},{4,0,998},{137,0,861},{136,0,1009},{139,11,292}, {5,11,21},{6,11,77},{6,11,157},{7,11,974},{7,11,1301},{7,11,1339},{7,11,1490},{7 ,11,1873},{137,11,628},{7,11,1283},{9,11,227},{9,11,499},{10,11,341},{11,11,325} ,{11,11,408},{14,11,180},{15,11,144},{18,11,47},{147,11,49},{4,0,64},{5,0,352},{ 5,0,720},{6,0,368},{139,0,359},{5,10,384},{8,10,455},{140,10,48},{5,10,264},{134 ,10,184},{7,0,1577},{10,0,304},{10,0,549},{12,0,365},{13,0,220},{13,0,240},{142, 0,33},{134,0,1107},{134,0,929},{135,0,1142},{6,0,175},{137,0,289},{5,0,432},{133 ,0,913},{6,0,279},{7,0,219},{5,10,633},{135,10,1323},{7,0,785},{7,10,359},{8,10, 243},{140,10,175},{139,0,595},{132,10,105},{8,11,398},{9,11,681},{139,11,632},{ 140,0,80},{5,0,931},{134,0,1698},{142,11,241},{134,11,20},{134,0,1323},{11,0,526 },{11,0,939},{141,0,290},{5,0,774},{6,0,780},{6,0,1637},{6,0,1686},{6,0,1751},{8 ,0,559},{141,0,109},{141,0,127},{7,0,1167},{11,0,934},{13,0,391},{17,0,76},{135, 11,709},{135,0,963},{6,0,260},{135,0,1484},{134,0,573},{4,10,758},{139,11,941},{ 135,10,1649},{145,11,36},{4,0,292},{137,0,580},{4,0,736},{5,0,871},{6,0,1689},{ 135,0,1944},{7,11,945},{11,11,713},{139,11,744},{134,0,1164},{135,11,937},{6,0, 1922},{9,0,982},{15,0,173},{15,0,178},{15,0,200},{18,0,189},{18,0,207},{21,0,47} ,{135,11,1652},{7,0,1695},{139,10,128},{6,0,63},{135,0,920},{133,0,793},{143,11, 134},{133,10,918},{5,0,67},{6,0,62},{6,0,374},{135,0,1391},{9,0,790},{12,0,47},{ 4,11,579},{5,11,226},{5,11,323},{135,11,960},{10,11,784},{141,11,191},{4,0,391}, {135,0,1169},{137,0,443},{13,11,232},{146,11,35},{132,10,340},{132,0,271},{137, 11,313},{5,11,973},{137,11,659},{134,0,1140},{6,11,135},{135,11,1176},{4,0,253}, {5,0,544},{7,0,300},{137,0,340},{7,0,897},{5,10,985},{7,10,509},{145,10,96},{138 ,11,735},{135,10,1919},{138,0,890},{5,0,818},{134,0,1122},{5,0,53},{5,0,541},{6, 0,94},{6,0,499},{7,0,230},{139,0,321},{4,0,920},{5,0,25},{5,0,790},{6,0,457},{7, 0,853},{8,0,788},{142,11,31},{132,10,247},{135,11,314},{132,0,468},{7,0,243},{6, 10,337},{7,10,494},{8,10,27},{8,10,599},{138,10,153},{4,10,184},{5,10,390},{7,10 ,618},{7,10,1456},{139,10,710},{134,0,870},{134,0,1238},{134,0,1765},{10,0,853}, {10,0,943},{14,0,437},{14,0,439},{14,0,443},{14,0,446},{14,0,452},{14,0,469},{14 ,0,471},{14,0,473},{16,0,93},{16,0,102},{16,0,110},{148,0,121},{4,0,605},{7,0, 518},{7,0,1282},{7,0,1918},{10,0,180},{139,0,218},{133,0,822},{4,0,634},{11,0, 916},{142,0,419},{6,11,281},{7,11,6},{8,11,282},{8,11,480},{8,11,499},{9,11,198} ,{10,11,143},{10,11,169},{10,11,211},{10,11,417},{10,11,574},{11,11,147},{11,11, 395},{12,11,75},{12,11,407},{12,11,608},{13,11,500},{142,11,251},{134,0,898},{6, 0,36},{7,0,658},{8,0,454},{150,11,48},{133,11,674},{135,11,1776},{4,11,419},{10, 10,227},{11,10,497},{11,10,709},{140,10,415},{6,10,360},{7,10,1664},{136,10,478} ,{137,0,806},{12,11,508},{14,11,102},{14,11,226},{144,11,57},{135,11,1123},{4,11 ,138},{7,11,1012},{7,11,1280},{137,11,76},{5,11,29},{140,11,638},{136,10,699},{ 134,0,1326},{132,0,104},{135,11,735},{132,10,739},{134,0,1331},{7,0,260},{135,11 ,260},{135,11,1063},{7,0,45},{9,0,542},{9,0,566},{10,0,728},{137,10,869},{4,10, 67},{5,10,422},{7,10,1037},{7,10,1289},{7,10,1555},{9,10,741},{145,10,108},{139, 0,263},{134,0,1516},{14,0,146},{15,0,42},{16,0,23},{17,0,86},{146,0,17},{138,0, 468},{136,0,1005},{4,11,17},{5,11,23},{7,11,995},{11,11,383},{11,11,437},{12,11, 460},{140,11,532},{7,0,87},{142,0,288},{138,10,96},{135,11,626},{144,10,26},{7,0 ,988},{7,0,1939},{9,0,64},{9,0,502},{12,0,22},{12,0,34},{13,0,12},{13,0,234},{ 147,0,77},{13,0,133},{8,10,203},{11,10,823},{11,10,846},{12,10,482},{13,10,277}, {13,10,302},{13,10,464},{14,10,205},{142,10,221},{4,10,449},{133,10,718},{135,0, 141},{6,0,1842},{136,0,872},{8,11,70},{12,11,171},{141,11,272},{4,10,355},{6,10, 311},{9,10,256},{138,10,404},{132,0,619},{137,0,261},{10,11,233},{10,10,758},{ 139,11,76},{5,0,246},{8,0,189},{9,0,355},{9,0,512},{10,0,124},{10,0,453},{11,0, 143},{11,0,416},{11,0,859},{141,0,341},{134,11,442},{133,10,827},{5,10,64},{140, 10,581},{4,10,442},{7,10,1047},{7,10,1352},{135,10,1643},{134,11,1709},{5,0,678} ,{6,0,305},{7,0,775},{7,0,1065},{133,10,977},{11,11,69},{12,11,105},{12,11,117}, {13,11,213},{14,11,13},{14,11,62},{14,11,177},{14,11,421},{15,11,19},{146,11,141 },{137,11,309},{5,0,35},{7,0,862},{7,0,1886},{138,0,179},{136,0,285},{132,0,517} ,{7,11,976},{9,11,146},{10,11,206},{10,11,596},{13,11,218},{142,11,153},{132,10, 254},{6,0,214},{12,0,540},{4,10,275},{7,10,1219},{140,10,376},{8,0,667},{11,0, 403},{146,0,83},{12,0,74},{10,11,648},{11,11,671},{143,11,46},{135,0,125},{134, 10,1753},{133,0,761},{6,0,912},{4,11,518},{6,10,369},{6,10,502},{7,10,1036},{7, 11,1136},{8,10,348},{9,10,452},{10,10,26},{11,10,224},{11,10,387},{11,10,772},{ 12,10,95},{12,10,629},{13,10,195},{13,10,207},{13,10,241},{14,10,260},{14,10,270 },{143,10,140},{10,0,131},{140,0,72},{132,10,269},{5,10,480},{7,10,532},{7,10, 1197},{7,10,1358},{8,10,291},{11,10,349},{142,10,396},{8,11,689},{137,11,863},{8 ,0,333},{138,0,182},{4,11,18},{7,11,145},{7,11,444},{7,11,1278},{8,11,49},{8,11, 400},{9,11,71},{9,11,250},{10,11,459},{12,11,160},{144,11,24},{14,11,35},{142,11 ,191},{135,11,1864},{135,0,1338},{148,10,15},{14,0,94},{15,0,65},{16,0,4},{16,0, 77},{16,0,80},{145,0,5},{12,11,82},{143,11,36},{133,11,1010},{133,0,449},{133,0, 646},{7,0,86},{8,0,103},{135,10,657},{7,0,2028},{138,0,641},{136,10,533},{134,0, 1},{139,11,970},{5,11,87},{7,11,313},{7,11,1103},{10,11,112},{10,11,582},{11,11, 389},{11,11,813},{12,11,385},{13,11,286},{14,11,124},{146,11,108},{6,0,869},{132 ,11,267},{6,0,277},{7,0,1274},{7,0,1386},{146,0,87},{6,0,187},{7,0,39},{7,0,1203 },{8,0,380},{14,0,117},{149,0,28},{4,10,211},{4,10,332},{5,10,335},{6,10,238},{7 ,10,269},{7,10,811},{7,10,1797},{8,10,836},{9,10,507},{141,10,242},{4,0,785},{5, 0,368},{6,0,297},{7,0,793},{139,0,938},{7,0,464},{8,0,558},{11,0,105},{12,0,231} ,{14,0,386},{15,0,102},{148,0,75},{133,10,1009},{8,0,877},{140,0,731},{139,11, 289},{10,11,249},{139,11,209},{132,11,561},{134,0,1608},{132,11,760},{134,0,1429 },{9,11,154},{140,11,485},{5,10,228},{6,10,203},{7,10,156},{8,10,347},{137,10, 265},{7,0,1010},{11,0,733},{11,0,759},{13,0,34},{14,0,427},{146,0,45},{7,10,1131 },{135,10,1468},{136,11,255},{7,0,1656},{9,0,369},{10,0,338},{10,0,490},{11,0, 154},{11,0,545},{11,0,775},{13,0,77},{141,0,274},{133,11,621},{134,0,1038},{4,11 ,368},{135,11,641},{6,0,2010},{8,0,979},{8,0,985},{10,0,951},{138,0,1011},{134,0 ,1005},{19,0,121},{5,10,291},{5,10,318},{7,10,765},{9,10,389},{140,10,548},{5,0, 20},{6,0,298},{7,0,659},{137,0,219},{7,0,1440},{11,0,854},{11,0,872},{11,0,921}, {12,0,551},{13,0,472},{142,0,367},{5,0,490},{6,0,615},{6,0,620},{135,0,683},{6,0 ,1070},{134,0,1597},{139,0,522},{132,0,439},{136,0,669},{6,0,766},{6,0,1143},{6, 0,1245},{10,10,525},{139,10,82},{9,11,92},{147,11,91},{6,0,668},{134,0,1218},{6, 11,525},{9,11,876},{140,11,284},{132,0,233},{136,0,547},{132,10,422},{5,10,355}, {145,10,0},{6,11,300},{135,11,1515},{4,0,482},{137,10,905},{4,0,886},{7,0,346},{ 133,11,594},{133,10,865},{5,10,914},{134,10,1625},{135,0,334},{5,0,795},{6,0, 1741},{133,10,234},{135,10,1383},{6,11,1641},{136,11,820},{135,0,371},{7,11,1313 },{138,11,660},{135,10,1312},{135,0,622},{7,0,625},{135,0,1750},{135,0,339},{4,0 ,203},{135,0,1936},{15,0,29},{16,0,38},{15,11,29},{144,11,38},{5,0,338},{135,0, 1256},{135,10,1493},{10,0,130},{6,10,421},{7,10,61},{7,10,1540},{138,10,501},{6, 11,389},{7,11,149},{9,11,142},{138,11,94},{137,10,341},{11,0,678},{12,0,307},{ 142,10,98},{6,11,8},{7,11,1881},{136,11,91},{135,0,2044},{6,0,770},{6,0,802},{6, 0,812},{7,0,311},{9,0,308},{12,0,255},{6,10,102},{7,10,72},{15,10,142},{147,10, 67},{151,10,30},{135,10,823},{135,0,1266},{135,11,1746},{135,10,1870},{4,0,400}, {5,0,267},{135,0,232},{7,11,24},{11,11,542},{139,11,852},{135,11,1739},{4,11,503 },{135,11,1661},{5,11,130},{7,11,1314},{9,11,610},{10,11,718},{11,11,601},{11,11 ,819},{11,11,946},{140,11,536},{10,11,149},{11,11,280},{142,11,336},{7,0,739},{ 11,0,690},{7,11,1946},{8,10,48},{8,10,88},{8,10,582},{8,10,681},{9,10,373},{9,10 ,864},{11,10,157},{11,10,843},{148,10,27},{134,0,990},{4,10,88},{5,10,137},{5,10 ,174},{5,10,777},{6,10,1664},{6,10,1725},{7,10,77},{7,10,426},{7,10,1317},{7,10, 1355},{8,10,126},{8,10,563},{9,10,523},{9,10,750},{10,10,310},{10,10,836},{11,10 ,42},{11,10,318},{11,10,731},{12,10,68},{12,10,92},{12,10,507},{12,10,692},{13, 10,81},{13,10,238},{13,10,374},{14,10,436},{18,10,138},{19,10,78},{19,10,111},{ 20,10,55},{20,10,77},{148,10,92},{141,10,418},{7,0,1831},{132,10,938},{6,0,776}, {134,0,915},{138,10,351},{5,11,348},{6,11,522},{6,10,1668},{7,10,1499},{8,10,117 },{9,10,314},{138,10,174},{135,10,707},{132,0,613},{133,10,403},{132,11,392},{5, 11,433},{9,11,633},{139,11,629},{133,0,763},{132,0,878},{132,0,977},{132,0,100}, {6,0,463},{4,10,44},{5,10,311},{7,10,639},{7,10,762},{7,10,1827},{9,10,8},{9,10, 462},{148,10,83},{134,11,234},{4,10,346},{7,10,115},{9,10,180},{9,10,456},{138, 10,363},{5,0,362},{5,0,443},{6,0,318},{7,0,1019},{139,0,623},{5,0,463},{8,0,296} ,{7,11,140},{7,11,1950},{8,11,680},{11,11,817},{147,11,88},{7,11,1222},{138,11, 386},{142,0,137},{132,0,454},{7,0,1914},{6,11,5},{7,10,1051},{9,10,545},{11,11, 249},{12,11,313},{16,11,66},{145,11,26},{135,0,1527},{145,0,58},{148,11,59},{5,0 ,48},{5,0,404},{6,0,557},{7,0,458},{8,0,597},{10,0,455},{10,0,606},{11,0,49},{11 ,0,548},{12,0,476},{13,0,18},{141,0,450},{5,11,963},{134,11,1773},{133,0,729},{ 138,11,586},{5,0,442},{135,0,1984},{134,0,449},{144,0,40},{4,0,853},{7,11,180},{ 8,11,509},{136,11,792},{6,10,185},{7,10,1899},{9,10,875},{139,10,673},{134,11, 524},{12,0,227},{4,10,327},{5,10,478},{7,10,1332},{136,10,753},{6,0,1491},{5,10, 1020},{133,10,1022},{4,10,103},{133,10,401},{132,11,931},{4,10,499},{135,10,1421 },{5,0,55},{7,0,376},{140,0,161},{133,0,450},{6,0,1174},{134,0,1562},{10,0,62},{ 13,0,400},{135,11,1837},{140,0,207},{135,0,869},{4,11,773},{5,11,618},{137,11, 756},{132,10,96},{4,0,213},{7,0,223},{8,0,80},{135,10,968},{4,11,90},{5,11,337}, {5,11,545},{7,11,754},{9,11,186},{10,11,72},{10,11,782},{11,11,513},{11,11,577}, {11,11,610},{11,11,889},{11,11,961},{12,11,354},{12,11,362},{12,11,461},{12,11, 595},{13,11,79},{143,11,121},{7,0,381},{7,0,806},{7,0,820},{8,0,354},{8,0,437},{ 8,0,787},{9,0,657},{10,0,58},{10,0,339},{10,0,749},{11,0,914},{12,0,162},{13,0, 75},{14,0,106},{14,0,198},{14,0,320},{14,0,413},{146,0,43},{136,0,747},{136,0, 954},{134,0,1073},{135,0,556},{7,11,151},{9,11,329},{139,11,254},{5,0,692},{134, 0,1395},{6,10,563},{137,10,224},{134,0,191},{132,0,804},{9,11,187},{10,11,36},{ 17,11,44},{146,11,64},{7,11,165},{7,11,919},{136,11,517},{4,11,506},{5,11,295},{ 7,11,1680},{15,11,14},{144,11,5},{4,0,706},{6,0,162},{7,0,1960},{136,0,831},{135 ,11,1376},{7,11,987},{9,11,688},{10,11,522},{11,11,788},{140,11,566},{150,0,35}, {138,0,426},{135,0,1235},{135,11,1741},{7,11,389},{7,11,700},{7,11,940},{8,11, 514},{9,11,116},{9,11,535},{10,11,118},{11,11,107},{11,11,148},{11,11,922},{12, 11,254},{12,11,421},{142,11,238},{134,0,1234},{132,11,743},{4,10,910},{5,10,832} ,{135,11,1335},{141,0,96},{135,11,185},{146,0,149},{4,0,204},{137,0,902},{4,11, 784},{133,11,745},{136,0,833},{136,0,949},{7,0,366},{9,0,287},{12,0,199},{12,0, 556},{12,0,577},{5,11,81},{7,11,146},{7,11,1342},{7,11,1446},{8,11,53},{8,11,561 },{8,11,694},{8,11,754},{9,11,97},{9,11,115},{9,11,894},{10,11,462},{10,11,813}, {11,11,230},{11,11,657},{11,11,699},{11,11,748},{12,11,119},{12,11,200},{12,11, 283},{14,11,273},{145,11,15},{5,11,408},{137,11,747},{9,11,498},{140,11,181},{6, 0,2020},{136,0,992},{5,0,356},{135,0,224},{134,0,784},{7,0,630},{9,0,567},{11,0, 150},{11,0,444},{13,0,119},{8,10,528},{137,10,348},{134,0,539},{4,10,20},{133,10 ,616},{142,0,27},{7,11,30},{8,11,86},{8,11,315},{8,11,700},{9,11,576},{9,11,858} ,{11,11,310},{11,11,888},{11,11,904},{12,11,361},{141,11,248},{138,11,839},{134, 0,755},{134,0,1063},{7,10,1091},{135,10,1765},{134,11,428},{7,11,524},{8,11,169} ,{8,11,234},{9,11,480},{138,11,646},{139,0,814},{7,11,1462},{139,11,659},{4,10, 26},{5,10,429},{6,10,245},{7,10,704},{7,10,1379},{135,10,1474},{7,11,1205},{138, 11,637},{139,11,803},{132,10,621},{136,0,987},{4,11,266},{8,11,4},{9,11,39},{10, 11,166},{11,11,918},{12,11,635},{20,11,10},{22,11,27},{150,11,43},{4,0,235},{135 ,0,255},{4,0,194},{5,0,584},{6,0,384},{7,0,583},{10,0,761},{11,0,760},{139,0,851 },{133,10,542},{134,0,1086},{133,10,868},{8,0,1016},{136,0,1018},{7,0,1396},{7, 11,1396},{136,10,433},{135,10,1495},{138,10,215},{141,10,124},{7,11,157},{8,11, 279},{9,11,759},{16,11,31},{16,11,39},{16,11,75},{18,11,24},{20,11,42},{152,11,1 },{5,0,562},{134,11,604},{134,0,913},{5,0,191},{137,0,271},{4,0,470},{6,0,153},{ 7,0,1503},{7,0,1923},{10,0,701},{11,0,132},{11,0,227},{11,0,320},{11,0,436},{11, 0,525},{11,0,855},{11,0,873},{12,0,41},{12,0,286},{13,0,103},{13,0,284},{14,0, 255},{14,0,262},{15,0,117},{143,0,127},{7,0,475},{12,0,45},{147,10,112},{132,11, 567},{137,11,859},{6,0,713},{6,0,969},{6,0,1290},{134,0,1551},{133,0,327},{6,0, 552},{6,0,1292},{7,0,1754},{137,0,604},{4,0,223},{6,0,359},{11,0,3},{13,0,108},{ 14,0,89},{16,0,22},{5,11,762},{7,11,1880},{9,11,680},{139,11,798},{5,0,80},{6,0, 405},{7,0,403},{7,0,1502},{8,0,456},{9,0,487},{9,0,853},{9,0,889},{10,0,309},{11 ,0,721},{11,0,994},{12,0,430},{141,0,165},{133,11,298},{132,10,647},{134,0,2016} ,{18,10,10},{146,11,10},{4,0,453},{5,0,887},{6,0,535},{8,0,6},{8,0,543},{136,0, 826},{136,0,975},{10,0,961},{138,0,962},{138,10,220},{6,0,1891},{6,0,1893},{9,0, 916},{9,0,965},{9,0,972},{12,0,801},{12,0,859},{12,0,883},{15,0,226},{149,0,51}, {132,10,109},{135,11,267},{7,11,92},{7,11,182},{8,11,453},{9,11,204},{11,11,950} ,{12,11,94},{12,11,644},{16,11,20},{16,11,70},{16,11,90},{147,11,55},{134,10, 1746},{6,11,71},{7,11,845},{7,11,1308},{8,11,160},{137,11,318},{5,0,101},{6,0,88 },{7,0,263},{7,0,628},{7,0,1677},{8,0,349},{9,0,100},{10,0,677},{14,0,169},{14,0 ,302},{14,0,313},{15,0,48},{15,0,84},{7,11,237},{8,11,664},{9,11,42},{9,11,266}, {9,11,380},{9,11,645},{10,11,177},{138,11,276},{138,11,69},{4,0,310},{7,0,708},{ 7,0,996},{9,0,795},{10,0,390},{10,0,733},{11,0,451},{12,0,249},{14,0,115},{14,0, 286},{143,0,100},{5,0,587},{4,10,40},{10,10,67},{11,10,117},{11,10,768},{139,10, 935},{6,0,1942},{7,0,512},{136,0,983},{7,10,992},{8,10,301},{9,10,722},{12,10,63 },{13,10,29},{14,10,161},{143,10,18},{136,11,76},{139,10,923},{134,0,645},{134,0 ,851},{4,0,498},{132,11,293},{7,0,217},{8,0,140},{10,0,610},{14,11,352},{17,11, 53},{18,11,146},{18,11,152},{19,11,11},{150,11,54},{134,0,1448},{138,11,841},{ 133,0,905},{4,11,605},{7,11,518},{7,11,1282},{7,11,1918},{10,11,180},{139,11,218 },{139,11,917},{135,10,825},{140,10,328},{4,0,456},{7,0,105},{7,0,358},{7,0,1637 },{8,0,643},{139,0,483},{134,0,792},{6,11,96},{135,11,1426},{137,11,691},{4,11, 651},{133,11,289},{7,11,688},{8,11,35},{9,11,511},{10,11,767},{147,11,118},{150, 0,56},{5,0,243},{5,0,535},{6,10,204},{10,10,320},{10,10,583},{13,10,502},{14,10, 72},{14,10,274},{14,10,312},{14,10,344},{15,10,159},{16,10,62},{16,10,69},{17,10 ,30},{18,10,42},{18,10,53},{18,10,84},{18,10,140},{19,10,68},{19,10,85},{20,10,5 },{20,10,45},{20,10,101},{22,10,7},{150,10,20},{4,10,558},{6,10,390},{7,10,162}, {7,10,689},{9,10,360},{138,10,653},{146,11,23},{135,0,1748},{5,10,856},{6,10, 1672},{6,10,1757},{134,10,1781},{5,0,539},{5,0,754},{6,0,876},{132,11,704},{135, 11,1078},{5,10,92},{10,10,736},{140,10,102},{17,0,91},{5,10,590},{137,10,213},{ 134,0,1565},{6,0,91},{135,0,435},{4,0,939},{140,0,792},{134,0,1399},{4,0,16},{5, 0,316},{5,0,842},{6,0,370},{6,0,1778},{8,0,166},{11,0,812},{12,0,206},{12,0,351} ,{14,0,418},{16,0,15},{16,0,34},{18,0,3},{19,0,3},{19,0,7},{20,0,4},{21,0,21},{4 ,11,720},{133,11,306},{144,0,95},{133,11,431},{132,11,234},{135,0,551},{4,0,999} ,{6,0,1966},{134,0,2042},{7,0,619},{10,0,547},{11,0,122},{12,0,601},{15,0,7},{ 148,0,20},{5,11,464},{6,11,236},{7,11,276},{7,11,696},{7,11,914},{7,11,1108},{7, 11,1448},{9,11,15},{9,11,564},{10,11,14},{12,11,565},{13,11,449},{14,11,53},{15, 11,13},{16,11,64},{145,11,41},{6,0,884},{6,0,1019},{134,0,1150},{6,11,1767},{12, 11,194},{145,11,107},{136,10,503},{133,11,840},{7,0,671},{134,10,466},{132,0,888 },{4,0,149},{138,0,368},{4,0,154},{7,0,1134},{136,0,105},{135,0,983},{9,11,642}, {11,11,236},{142,11,193},{4,0,31},{6,0,429},{7,0,962},{9,0,458},{139,0,691},{6,0 ,643},{134,0,1102},{132,0,312},{4,11,68},{5,11,634},{6,11,386},{7,11,794},{8,11, 273},{9,11,563},{10,11,105},{10,11,171},{11,11,94},{139,11,354},{133,0,740},{135 ,0,1642},{4,11,95},{7,11,416},{8,11,211},{139,11,830},{132,0,236},{138,10,241},{ 7,11,731},{13,11,20},{143,11,11},{5,0,836},{5,0,857},{6,0,1680},{135,0,59},{10,0 ,68},{11,0,494},{152,11,6},{4,0,81},{139,0,867},{135,0,795},{133,11,689},{4,0, 1001},{5,0,282},{6,0,1932},{6,0,1977},{6,0,1987},{6,0,1992},{8,0,650},{8,0,919}, {8,0,920},{8,0,923},{8,0,926},{8,0,927},{8,0,931},{8,0,939},{8,0,947},{8,0,956}, {8,0,997},{9,0,907},{10,0,950},{10,0,953},{10,0,954},{10,0,956},{10,0,958},{10,0 ,959},{10,0,964},{10,0,970},{10,0,972},{10,0,973},{10,0,975},{10,0,976},{10,0, 980},{10,0,981},{10,0,984},{10,0,988},{10,0,990},{10,0,995},{10,0,999},{10,0, 1002},{10,0,1003},{10,0,1005},{10,0,1006},{10,0,1008},{10,0,1009},{10,0,1012},{ 10,0,1014},{10,0,1015},{10,0,1019},{10,0,1020},{10,0,1022},{12,0,959},{12,0,961} ,{12,0,962},{12,0,963},{12,0,964},{12,0,965},{12,0,967},{12,0,968},{12,0,969},{ 12,0,970},{12,0,971},{12,0,972},{12,0,973},{12,0,974},{12,0,975},{12,0,976},{12, 0,977},{12,0,979},{12,0,981},{12,0,982},{12,0,983},{12,0,984},{12,0,985},{12,0, 986},{12,0,987},{12,0,989},{12,0,990},{12,0,992},{12,0,993},{12,0,995},{12,0,998 },{12,0,999},{12,0,1000},{12,0,1001},{12,0,1002},{12,0,1004},{12,0,1005},{12,0, 1006},{12,0,1007},{12,0,1008},{12,0,1009},{12,0,1010},{12,0,1011},{12,0,1012},{ 12,0,1014},{12,0,1015},{12,0,1016},{12,0,1017},{12,0,1018},{12,0,1019},{12,0, 1022},{12,0,1023},{14,0,475},{14,0,477},{14,0,478},{14,0,479},{14,0,480},{14,0, 482},{14,0,483},{14,0,484},{14,0,485},{14,0,486},{14,0,487},{14,0,488},{14,0,489 },{14,0,490},{14,0,491},{14,0,492},{14,0,493},{14,0,494},{14,0,495},{14,0,496},{ 14,0,497},{14,0,498},{14,0,499},{14,0,500},{14,0,501},{14,0,502},{14,0,503},{14, 0,504},{14,0,506},{14,0,507},{14,0,508},{14,0,509},{14,0,510},{14,0,511},{16,0, 113},{16,0,114},{16,0,115},{16,0,117},{16,0,118},{16,0,119},{16,0,121},{16,0,122 },{16,0,123},{16,0,124},{16,0,125},{16,0,126},{16,0,127},{18,0,242},{18,0,243},{ 18,0,244},{18,0,245},{18,0,248},{18,0,249},{18,0,250},{18,0,251},{18,0,252},{18, 0,253},{18,0,254},{18,0,255},{20,0,125},{20,0,126},{148,0,127},{7,11,1717},{7,11 ,1769},{138,11,546},{7,11,1127},{7,11,1572},{10,11,297},{10,11,422},{11,11,764}, {11,11,810},{12,11,264},{13,11,102},{13,11,300},{13,11,484},{14,11,147},{14,11, 229},{17,11,71},{18,11,118},{147,11,120},{6,0,1148},{134,0,1586},{132,0,775},{ 135,10,954},{133,11,864},{133,11,928},{138,11,189},{135,10,1958},{6,10,549},{8, 10,34},{8,10,283},{9,10,165},{138,10,475},{5,10,652},{5,10,701},{135,10,449},{ 135,11,695},{4,10,655},{7,10,850},{17,10,75},{146,10,137},{140,11,682},{133,11, 523},{8,0,970},{136,10,670},{136,11,555},{7,11,76},{8,11,44},{9,11,884},{10,11, 580},{11,11,399},{11,11,894},{15,11,122},{18,11,144},{147,11,61},{6,10,159},{6, 10,364},{7,10,516},{7,10,1439},{137,10,518},{4,0,71},{5,0,376},{7,0,119},{138,0, 665},{141,10,151},{11,0,827},{14,0,34},{143,0,148},{133,11,518},{4,0,479},{135, 11,1787},{135,11,1852},{135,10,993},{7,0,607},{136,0,99},{134,0,1960},{132,0,793 },{4,0,41},{5,0,74},{7,0,1627},{11,0,871},{140,0,619},{7,0,94},{11,0,329},{11,0, 965},{12,0,241},{14,0,354},{15,0,22},{148,0,63},{7,10,501},{9,10,111},{10,10,141 },{11,10,332},{13,10,43},{13,10,429},{14,10,130},{14,10,415},{145,10,102},{9,0, 209},{137,0,300},{134,0,1497},{138,11,255},{4,11,934},{5,11,138},{136,11,610},{ 133,0,98},{6,0,1316},{10,11,804},{138,11,832},{8,11,96},{9,11,36},{10,11,607},{ 11,11,423},{11,11,442},{12,11,309},{14,11,199},{15,11,90},{145,11,110},{132,0, 463},{5,10,149},{136,10,233},{133,10,935},{4,11,652},{8,11,320},{9,11,13},{9,11, 398},{9,11,727},{10,11,75},{10,11,184},{10,11,230},{10,11,564},{10,11,569},{11, 11,973},{12,11,70},{12,11,189},{13,11,57},{13,11,257},{22,11,6},{150,11,16},{142 ,0,291},{12,10,582},{146,10,131},{136,10,801},{133,0,984},{145,11,116},{4,11,692 },{133,11,321},{4,0,182},{6,0,205},{135,0,220},{4,0,42},{9,0,205},{9,0,786},{138 ,0,659},{6,0,801},{11,11,130},{140,11,609},{132,0,635},{5,11,345},{135,11,1016}, {139,0,533},{132,0,371},{4,0,272},{135,0,836},{6,0,1282},{135,11,1100},{5,0,825} ,{134,0,1640},{135,11,1325},{133,11,673},{4,11,287},{133,11,1018},{135,0,357},{6 ,0,467},{137,0,879},{7,0,317},{135,0,569},{6,0,924},{134,0,1588},{5,11,34},{5,10 ,406},{10,11,724},{12,11,444},{13,11,354},{18,11,32},{23,11,24},{23,11,31},{152, 11,5},{6,0,1795},{6,0,1835},{6,0,1836},{6,0,1856},{8,0,844},{8,0,849},{8,0,854}, {8,0,870},{8,0,887},{10,0,852},{138,0,942},{6,10,69},{135,10,117},{137,0,307},{4 ,0,944},{6,0,1799},{6,0,1825},{10,0,848},{10,0,875},{10,0,895},{10,0,899},{10,0, 902},{140,0,773},{11,0,43},{13,0,72},{141,0,142},{135,10,1830},{134,11,382},{4, 10,432},{135,10,824},{132,11,329},{7,0,1820},{139,11,124},{133,10,826},{133,0, 525},{132,11,906},{7,11,1940},{136,11,366},{138,11,10},{4,11,123},{4,11,649},{5, 11,605},{7,11,1509},{136,11,36},{6,0,110},{135,0,1681},{133,0,493},{133,11,767}, {4,0,174},{135,0,911},{138,11,786},{8,0,417},{137,0,782},{133,10,1000},{7,0,733} ,{137,0,583},{4,10,297},{6,10,529},{7,10,152},{7,10,713},{7,10,1845},{8,10,710}, {8,10,717},{12,10,639},{140,10,685},{4,0,32},{5,0,215},{6,0,269},{7,0,1782},{7,0 ,1892},{10,0,16},{11,0,822},{11,0,954},{141,0,481},{4,11,273},{5,11,658},{133,11 ,995},{136,0,477},{134,11,72},{135,11,1345},{5,0,308},{7,0,1088},{4,10,520},{135 ,10,575},{133,11,589},{5,0,126},{8,0,297},{9,0,366},{140,0,374},{7,0,1551},{139, 0,361},{5,11,117},{6,11,514},{6,11,541},{7,11,1164},{7,11,1436},{8,11,220},{8,11 ,648},{10,11,688},{139,11,560},{133,11,686},{4,0,946},{6,0,1807},{8,0,871},{10,0 ,854},{10,0,870},{10,0,888},{10,0,897},{10,0,920},{12,0,722},{12,0,761},{12,0, 763},{12,0,764},{14,0,454},{14,0,465},{16,0,107},{18,0,167},{18,0,168},{146,0, 172},{132,0,175},{135,0,1307},{132,0,685},{135,11,1834},{133,0,797},{6,0,745},{6 ,0,858},{134,0,963},{133,0,565},{5,10,397},{6,10,154},{7,11,196},{7,10,676},{8, 10,443},{8,10,609},{9,10,24},{9,10,325},{10,10,35},{10,11,765},{11,11,347},{11, 10,535},{11,11,552},{11,11,576},{11,10,672},{11,11,790},{11,10,1018},{12,11,263} ,{12,10,637},{13,11,246},{13,11,270},{13,11,395},{14,11,74},{14,11,176},{14,11, 190},{14,11,398},{14,11,412},{15,11,32},{15,11,63},{16,10,30},{16,11,88},{147,11 ,105},{13,11,84},{141,11,122},{4,0,252},{7,0,1068},{10,0,434},{11,0,228},{11,0, 426},{13,0,231},{18,0,106},{148,0,87},{137,0,826},{4,11,589},{139,11,282},{5,11, 381},{135,11,1792},{132,0,791},{5,0,231},{10,0,509},{133,10,981},{7,0,601},{9,0, 277},{9,0,674},{10,0,178},{10,0,418},{10,0,571},{11,0,531},{12,0,113},{12,0,475} ,{13,0,99},{142,0,428},{4,10,56},{7,11,616},{7,10,1791},{8,10,607},{8,10,651},{ 10,11,413},{11,10,465},{11,10,835},{12,10,337},{141,10,480},{7,0,1591},{144,0,43 },{9,10,158},{138,10,411},{135,0,1683},{8,0,289},{11,0,45},{12,0,278},{140,0,537 },{6,11,120},{7,11,1188},{7,11,1710},{8,11,286},{9,11,667},{11,11,592},{139,11, 730},{136,10,617},{135,0,1120},{135,11,1146},{139,10,563},{4,11,352},{4,10,369}, {135,11,687},{143,11,38},{4,0,399},{5,0,119},{5,0,494},{7,0,751},{9,0,556},{14, 11,179},{15,11,151},{150,11,11},{4,11,192},{5,11,49},{6,11,200},{6,11,293},{6,11 ,1696},{135,11,488},{4,0,398},{133,0,660},{7,0,1030},{134,10,622},{135,11,595},{ 141,0,168},{132,11,147},{7,0,973},{10,10,624},{142,10,279},{132,10,363},{132,0, 642},{133,11,934},{134,0,1615},{7,11,505},{135,11,523},{7,0,594},{7,0,851},{7,0, 1858},{9,0,411},{9,0,574},{9,0,666},{9,0,737},{10,0,346},{10,0,712},{11,0,246},{ 11,0,432},{11,0,517},{11,0,647},{11,0,679},{11,0,727},{12,0,304},{12,0,305},{12, 0,323},{12,0,483},{12,0,572},{12,0,593},{12,0,602},{13,0,95},{13,0,101},{13,0, 171},{13,0,315},{13,0,378},{13,0,425},{13,0,475},{14,0,63},{14,0,380},{14,0,384} ,{15,0,133},{18,0,112},{148,0,72},{135,0,1093},{132,0,679},{8,0,913},{10,0,903}, {10,0,915},{12,0,648},{12,0,649},{14,0,455},{16,0,112},{138,11,438},{137,0,203}, {134,10,292},{134,0,1492},{7,0,1374},{8,0,540},{5,10,177},{6,10,616},{7,10,827}, {9,10,525},{138,10,656},{135,0,1486},{9,0,714},{138,10,31},{136,0,825},{134,0, 1511},{132,11,637},{134,0,952},{4,10,161},{133,10,631},{5,0,143},{5,0,769},{6,0, 1760},{7,0,682},{7,0,1992},{136,0,736},{132,0,700},{134,0,1540},{132,11,777},{9, 11,867},{138,11,837},{7,0,1557},{135,10,1684},{133,0,860},{6,0,422},{7,0,0},{7,0 ,1544},{9,0,605},{11,0,990},{12,0,235},{12,0,453},{13,0,47},{13,0,266},{9,10,469 },{9,10,709},{12,10,512},{14,10,65},{145,10,12},{11,0,807},{10,10,229},{11,10,73 },{139,10,376},{6,11,170},{7,11,1080},{8,11,395},{8,11,487},{11,11,125},{141,11, 147},{5,0,515},{137,0,131},{7,0,1605},{11,0,962},{146,0,139},{132,0,646},{4,0, 396},{7,0,728},{9,0,117},{13,0,202},{148,0,51},{6,0,121},{6,0,124},{6,0,357},{7, 0,1138},{7,0,1295},{8,0,162},{8,0,508},{11,0,655},{4,11,535},{6,10,558},{7,10, 651},{8,11,618},{9,10,0},{10,10,34},{139,10,1008},{135,11,1245},{138,0,357},{150 ,11,23},{133,0,237},{135,0,1784},{7,10,1832},{138,10,374},{132,0,713},{132,11,46 },{6,0,1536},{10,0,348},{5,11,811},{6,11,1679},{6,11,1714},{135,11,2032},{11,11, 182},{142,11,195},{6,0,523},{7,0,738},{7,10,771},{7,10,1731},{9,10,405},{138,10, 421},{7,11,1458},{9,11,407},{139,11,15},{6,11,34},{7,11,69},{7,11,640},{7,11, 1089},{8,11,708},{8,11,721},{9,11,363},{9,11,643},{10,11,628},{148,11,98},{133,0 ,434},{135,0,1877},{7,0,571},{138,0,366},{5,10,881},{133,10,885},{9,0,513},{10,0 ,25},{10,0,39},{12,0,122},{140,0,187},{132,0,580},{5,10,142},{134,10,546},{132, 11,462},{137,0,873},{5,10,466},{11,10,571},{12,10,198},{13,10,283},{14,10,186},{ 15,10,21},{143,10,103},{7,0,171},{4,10,185},{5,10,257},{5,10,839},{5,10,936},{9, 10,399},{10,10,258},{10,10,395},{10,10,734},{11,10,1014},{12,10,23},{13,10,350}, {14,10,150},{147,10,6},{134,0,625},{7,0,107},{7,0,838},{8,0,550},{138,0,401},{5, 11,73},{6,11,23},{134,11,338},{4,0,943},{6,0,1850},{12,0,713},{142,0,434},{11,0, 588},{11,0,864},{11,0,936},{11,0,968},{12,0,73},{12,0,343},{12,0,394},{13,0,275} ,{14,0,257},{15,0,160},{7,10,404},{7,10,1377},{7,10,1430},{7,10,2017},{8,10,149} ,{8,10,239},{8,10,512},{8,10,793},{8,10,818},{9,10,474},{9,10,595},{10,10,122},{ 10,10,565},{10,10,649},{10,10,783},{11,10,239},{11,10,295},{11,10,447},{11,10, 528},{11,10,639},{11,10,800},{12,10,25},{12,10,157},{12,10,316},{12,10,390},{12, 10,391},{12,10,395},{12,10,478},{12,10,503},{12,10,592},{12,10,680},{13,10,50},{ 13,10,53},{13,10,132},{13,10,198},{13,10,322},{13,10,415},{13,10,511},{14,10,71} ,{14,10,395},{15,10,71},{15,10,136},{17,10,123},{18,10,93},{147,10,58},{133,0, 768},{11,0,103},{142,0,0},{136,10,712},{132,0,799},{132,0,894},{7,11,725},{8,11, 498},{139,11,268},{135,11,1798},{135,11,773},{141,11,360},{4,10,377},{152,10,13} ,{135,0,1673},{132,11,583},{134,0,1052},{133,11,220},{140,11,69},{132,11,544},{4 ,10,180},{135,10,1906},{134,0,272},{4,0,441},{134,0,1421},{4,0,9},{5,0,128},{7,0 ,368},{11,0,480},{148,0,3},{5,11,176},{6,11,437},{6,11,564},{11,11,181},{141,11, 183},{132,10,491},{7,0,1182},{141,11,67},{6,0,1346},{4,10,171},{138,10,234},{4, 10,586},{7,10,1186},{138,10,631},{136,0,682},{134,0,1004},{15,0,24},{143,11,24}, {134,0,968},{4,0,2},{6,0,742},{6,0,793},{7,0,545},{7,0,894},{9,10,931},{10,10, 334},{148,10,71},{136,11,600},{133,10,765},{9,0,769},{140,0,185},{4,11,790},{5, 11,273},{134,11,394},{7,0,474},{137,0,578},{4,11,135},{6,11,127},{7,11,1185},{7, 11,1511},{8,11,613},{11,11,5},{12,11,133},{12,11,495},{12,11,586},{14,11,385},{ 15,11,118},{17,11,20},{146,11,98},{133,10,424},{5,0,530},{142,0,113},{6,11,230}, {7,11,961},{7,11,1085},{136,11,462},{7,11,1954},{137,11,636},{136,10,714},{149, 11,6},{135,10,685},{9,10,420},{10,10,269},{10,10,285},{10,10,576},{11,10,397},{ 13,10,175},{145,10,90},{132,10,429},{5,0,556},{5,11,162},{136,11,68},{132,11,654 },{4,11,156},{7,11,998},{7,11,1045},{7,11,1860},{9,11,48},{9,11,692},{11,11,419} ,{139,11,602},{6,0,1317},{8,0,16},{9,0,825},{12,0,568},{7,11,1276},{8,11,474},{ 137,11,652},{18,0,97},{7,10,18},{7,10,699},{7,10,1966},{8,10,752},{9,10,273},{9, 10,412},{9,10,703},{10,10,71},{10,10,427},{138,10,508},{10,0,703},{7,11,1454},{ 138,11,703},{4,10,53},{5,10,186},{135,10,752},{134,0,892},{134,0,1571},{8,10,575 },{10,10,289},{139,10,319},{6,0,186},{137,0,426},{134,0,1101},{132,10,675},{132, 0,585},{6,0,1870},{137,0,937},{152,11,10},{9,11,197},{10,11,300},{12,11,473},{13 ,11,90},{141,11,405},{4,0,93},{5,0,252},{6,0,229},{7,0,291},{9,0,550},{139,0,644 },{137,0,749},{9,0,162},{6,10,209},{8,10,468},{9,10,210},{11,10,36},{12,10,28},{ 12,10,630},{13,10,21},{13,10,349},{14,10,7},{145,10,13},{132,0,381},{132,11,606} ,{4,10,342},{135,10,1179},{7,11,1587},{7,11,1707},{10,11,528},{139,11,504},{12, 11,39},{13,11,265},{141,11,439},{4,10,928},{133,10,910},{7,10,1838},{7,11,1978}, {136,11,676},{6,0,762},{6,0,796},{134,0,956},{4,10,318},{4,10,496},{7,10,856},{ 139,10,654},{137,11,242},{4,11,361},{133,11,315},{132,11,461},{132,11,472},{132, 0,857},{5,0,21},{6,0,77},{6,0,157},{7,0,974},{7,0,1301},{7,0,1339},{7,0,1490},{7 ,0,1873},{9,0,628},{7,10,915},{8,10,247},{147,10,0},{4,10,202},{5,10,382},{6,10, 454},{7,10,936},{7,10,1803},{8,10,758},{9,10,375},{9,10,895},{10,10,743},{10,10, 792},{11,10,978},{11,10,1012},{142,10,109},{7,11,617},{10,11,498},{11,11,501},{ 12,11,16},{140,11,150},{7,10,1150},{7,10,1425},{7,10,1453},{10,11,747},{140,10, 513},{133,11,155},{11,0,919},{141,0,409},{138,10,791},{10,0,633},{139,11,729},{7 ,11,163},{8,11,319},{9,11,402},{10,11,24},{10,11,681},{11,11,200},{11,11,567},{ 12,11,253},{12,11,410},{142,11,219},{5,11,475},{7,11,1780},{9,11,230},{11,11,297 },{11,11,558},{14,11,322},{147,11,76},{7,0,332},{6,10,445},{137,10,909},{135,11, 1956},{136,11,274},{134,10,578},{135,0,1489},{135,11,1848},{5,11,944},{134,11, 1769},{132,11,144},{136,10,766},{4,0,832},{135,10,541},{8,0,398},{9,0,681},{139, 0,632},{136,0,645},{9,0,791},{10,0,93},{16,0,13},{17,0,23},{18,0,135},{19,0,12}, {20,0,1},{20,0,12},{148,0,14},{6,11,247},{137,11,555},{134,0,20},{132,0,800},{ 135,0,1841},{139,10,983},{137,10,768},{132,10,584},{141,11,51},{6,0,1993},{4,11, 620},{138,11,280},{136,0,769},{11,0,290},{11,0,665},{7,11,1810},{11,11,866},{12, 11,103},{13,11,495},{17,11,67},{147,11,74},{134,0,1426},{139,0,60},{4,10,326},{ 135,10,1770},{7,0,1874},{9,0,641},{132,10,226},{6,0,644},{5,10,426},{8,10,30},{9 ,10,2},{11,10,549},{147,10,122},{5,11,428},{138,11,442},{135,11,1871},{135,0, 1757},{147,10,117},{135,0,937},{135,0,1652},{6,0,654},{134,0,1476},{133,11,99},{ 135,0,527},{132,10,345},{4,10,385},{4,11,397},{7,10,265},{135,10,587},{4,0,579}, {5,0,226},{5,0,323},{135,0,960},{134,0,1486},{8,11,502},{144,11,9},{4,10,347},{5 ,10,423},{5,10,996},{135,10,1329},{7,11,727},{146,11,73},{4,11,485},{7,11,353},{ 7,10,1259},{7,11,1523},{9,10,125},{139,10,65},{6,0,325},{5,10,136},{6,11,366},{7 ,11,1384},{7,11,1601},{136,10,644},{138,11,160},{6,0,1345},{137,11,282},{18,0,91 },{147,0,70},{136,0,404},{4,11,157},{133,11,471},{133,0,973},{6,0,135},{135,0, 1176},{8,11,116},{11,11,551},{142,11,159},{4,0,549},{4,10,433},{133,10,719},{136 ,0,976},{5,11,160},{7,11,363},{7,11,589},{10,11,170},{141,11,55},{144,0,21},{144 ,0,51},{135,0,314},{135,10,1363},{4,11,108},{7,11,405},{10,11,491},{139,11,498}, {146,0,4},{4,10,555},{8,10,536},{10,10,288},{139,10,1005},{135,11,1005},{6,0,281 },{7,0,6},{8,0,282},{8,0,480},{8,0,499},{9,0,198},{10,0,143},{10,0,169},{10,0, 211},{10,0,417},{10,0,574},{11,0,147},{11,0,395},{12,0,75},{12,0,407},{12,0,608} ,{13,0,500},{142,0,251},{6,0,1093},{6,0,1405},{9,10,370},{138,10,90},{4,11,926}, {133,11,983},{135,0,1776},{134,0,1528},{132,0,419},{132,11,538},{6,11,294},{7,11 ,1267},{136,11,624},{135,11,1772},{138,11,301},{4,10,257},{135,10,2031},{4,0,138 },{7,0,1012},{7,0,1280},{9,0,76},{135,10,1768},{132,11,757},{5,0,29},{140,0,638} ,{7,11,655},{135,11,1844},{7,0,1418},{6,11,257},{135,11,1522},{8,11,469},{138,11 ,47},{142,11,278},{6,10,83},{6,10,1733},{135,10,1389},{11,11,204},{11,11,243},{ 140,11,293},{135,11,1875},{6,0,1710},{135,0,2038},{137,11,299},{4,0,17},{5,0,23} ,{7,0,995},{11,0,383},{11,0,437},{12,0,460},{140,0,532},{133,0,862},{137,10,696} ,{6,0,592},{138,0,946},{138,11,599},{7,10,1718},{9,10,95},{9,10,274},{10,10,279} ,{10,10,317},{10,10,420},{11,10,303},{11,10,808},{12,10,134},{12,10,367},{13,10, 149},{13,10,347},{14,10,349},{14,10,406},{18,10,22},{18,10,89},{18,10,122},{147, 10,47},{8,0,70},{12,0,171},{141,0,272},{133,10,26},{132,10,550},{137,0,812},{10, 0,233},{139,0,76},{134,0,988},{134,0,442},{136,10,822},{7,0,896},{4,10,902},{5, 10,809},{134,10,122},{5,11,150},{7,11,106},{8,11,603},{9,11,593},{9,11,634},{10, 11,44},{10,11,173},{11,11,462},{11,11,515},{13,11,216},{13,11,288},{142,11,400}, {136,0,483},{135,10,262},{6,0,1709},{133,10,620},{4,10,34},{5,10,574},{7,10,279} ,{7,10,1624},{136,10,601},{137,10,170},{147,0,119},{12,11,108},{141,11,291},{11, 0,69},{12,0,105},{12,0,117},{13,0,213},{14,0,13},{14,0,62},{14,0,177},{14,0,421} ,{15,0,19},{146,0,141},{137,0,309},{11,11,278},{142,11,73},{7,0,608},{7,0,976},{ 9,0,146},{10,0,206},{10,0,596},{13,0,218},{142,0,153},{133,10,332},{6,10,261},{8 ,10,182},{139,10,943},{4,11,493},{144,11,55},{134,10,1721},{132,0,768},{4,10,933 },{133,10,880},{7,11,555},{7,11,1316},{7,11,1412},{7,11,1839},{9,11,192},{9,11, 589},{11,11,241},{11,11,676},{11,11,811},{11,11,891},{12,11,140},{12,11,346},{12 ,11,479},{13,11,30},{13,11,49},{13,11,381},{14,11,188},{15,11,150},{16,11,76},{ 18,11,30},{148,11,52},{4,0,518},{135,0,1136},{6,11,568},{7,11,112},{7,11,1804},{ 8,11,362},{8,11,410},{8,11,830},{9,11,514},{11,11,649},{142,11,157},{135,11,673} ,{8,0,689},{137,0,863},{4,0,18},{7,0,145},{7,0,444},{7,0,1278},{8,0,49},{8,0,400 },{9,0,71},{9,0,250},{10,0,459},{12,0,160},{16,0,24},{132,11,625},{140,0,1020},{ 4,0,997},{6,0,1946},{6,0,1984},{134,0,1998},{6,11,16},{6,11,158},{7,11,43},{7,11 ,129},{7,11,181},{8,11,276},{8,11,377},{10,11,523},{11,11,816},{12,11,455},{13, 11,303},{142,11,135},{133,10,812},{134,0,658},{4,11,1},{7,11,1143},{7,11,1463},{ 8,11,61},{9,11,207},{9,11,390},{9,11,467},{139,11,836},{150,11,26},{140,0,106},{ 6,0,1827},{10,0,931},{18,0,166},{20,0,114},{4,10,137},{7,10,1178},{7,11,1319},{ 135,10,1520},{133,0,1010},{4,11,723},{5,11,895},{7,11,1031},{8,11,199},{8,11,340 },{9,11,153},{9,11,215},{10,11,21},{10,11,59},{10,11,80},{10,11,224},{11,11,229} ,{11,11,652},{12,11,192},{13,11,146},{142,11,91},{132,11,295},{6,11,619},{7,11, 898},{7,11,1092},{8,11,485},{18,11,28},{147,11,116},{137,11,51},{6,10,1661},{7, 10,1975},{7,10,2009},{135,10,2011},{5,11,309},{140,11,211},{5,0,87},{7,0,313},{7 ,0,1103},{10,0,208},{10,0,582},{11,0,389},{11,0,813},{12,0,385},{13,0,286},{14,0 ,124},{146,0,108},{5,11,125},{8,11,77},{138,11,15},{132,0,267},{133,0,703},{137, 11,155},{133,11,439},{11,11,164},{140,11,76},{9,0,496},{5,10,89},{7,10,1915},{9, 10,185},{9,10,235},{10,10,64},{10,10,270},{10,10,403},{10,10,469},{10,10,529},{ 10,10,590},{11,10,140},{11,10,860},{13,10,1},{13,10,422},{14,10,341},{14,10,364} ,{17,10,93},{18,10,113},{19,10,97},{147,10,113},{133,10,695},{135,0,1121},{5,10, 6},{6,10,183},{7,10,680},{7,10,978},{7,10,1013},{7,10,1055},{12,10,230},{13,10, 172},{146,10,29},{4,11,8},{7,11,1152},{7,11,1153},{7,11,1715},{9,11,374},{10,11, 478},{139,11,648},{135,11,1099},{6,10,29},{139,10,63},{4,0,561},{10,0,249},{139, 0,209},{132,0,760},{7,11,799},{138,11,511},{136,11,87},{9,0,154},{140,0,485},{ 136,0,255},{132,0,323},{140,0,419},{132,10,311},{134,10,1740},{4,0,368},{135,0, 641},{7,10,170},{8,10,90},{8,10,177},{8,10,415},{11,10,714},{142,10,281},{4,11, 69},{5,11,122},{9,11,656},{138,11,464},{5,11,849},{134,11,1633},{8,0,522},{142,0 ,328},{11,10,91},{13,10,129},{15,10,101},{145,10,125},{7,0,562},{8,0,551},{4,10, 494},{6,10,74},{7,10,44},{11,11,499},{12,10,17},{15,10,5},{148,10,11},{4,10,276} ,{133,10,296},{9,0,92},{147,0,91},{4,10,7},{5,10,90},{5,10,158},{6,10,542},{7,10 ,221},{7,10,1574},{9,10,490},{10,10,540},{11,10,443},{139,10,757},{6,0,525},{6,0 ,1976},{8,0,806},{9,0,876},{140,0,284},{5,11,859},{7,10,588},{7,11,1160},{8,11, 107},{9,10,175},{9,11,291},{9,11,439},{10,10,530},{10,11,663},{11,11,609},{140, 11,197},{7,11,168},{13,11,196},{141,11,237},{139,0,958},{133,0,594},{135,10,580} ,{7,10,88},{136,10,627},{6,0,479},{6,0,562},{7,0,1060},{13,0,6},{5,10,872},{6,10 ,57},{7,10,471},{9,10,447},{137,10,454},{136,11,413},{145,11,19},{4,11,117},{6, 11,372},{7,11,1905},{142,11,323},{4,11,722},{139,11,471},{17,0,61},{5,10,31},{ 134,10,614},{8,10,330},{140,10,477},{7,10,1200},{138,10,460},{6,10,424},{135,10, 1866},{6,0,1641},{136,0,820},{6,0,1556},{134,0,1618},{9,11,5},{12,11,216},{12,11 ,294},{12,11,298},{12,11,400},{12,11,518},{13,11,229},{143,11,139},{15,11,155},{ 144,11,79},{4,0,302},{135,0,1766},{5,10,13},{134,10,142},{6,0,148},{7,0,1313},{7 ,10,116},{8,10,322},{8,10,755},{9,10,548},{10,10,714},{11,10,884},{141,10,324},{ 137,0,676},{9,11,88},{139,11,270},{5,11,12},{7,11,375},{137,11,438},{134,0,1674} ,{7,10,1472},{135,10,1554},{11,0,178},{7,10,1071},{7,10,1541},{7,10,1767},{7,10, 1806},{11,10,162},{11,10,242},{12,10,605},{15,10,26},{144,10,44},{6,0,389},{7,0, 149},{9,0,142},{138,0,94},{140,11,71},{145,10,115},{6,0,8},{7,0,1881},{8,0,91},{ 11,11,966},{12,11,287},{13,11,342},{13,11,402},{15,11,110},{143,11,163},{4,11, 258},{136,11,639},{6,11,22},{7,11,903},{138,11,577},{133,11,681},{135,10,1111},{ 135,11,1286},{9,0,112},{8,10,1},{138,10,326},{5,10,488},{6,10,527},{7,10,489},{7 ,10,1636},{8,10,121},{8,10,144},{8,10,359},{9,10,193},{9,10,241},{9,10,336},{9, 10,882},{11,10,266},{11,10,372},{11,10,944},{12,10,401},{140,10,641},{4,11,664}, {133,11,804},{6,0,747},{134,0,1015},{135,0,1746},{9,10,31},{10,10,244},{10,10, 699},{12,10,149},{141,10,497},{133,10,377},{135,0,24},{6,0,1352},{5,11,32},{145, 10,101},{7,0,1530},{10,0,158},{13,0,13},{13,0,137},{13,0,258},{14,0,111},{14,0, 225},{14,0,253},{14,0,304},{14,0,339},{14,0,417},{146,0,33},{4,0,503},{135,0, 1661},{5,0,130},{6,0,845},{7,0,1314},{9,0,610},{10,0,718},{11,0,601},{11,0,819}, {11,0,946},{140,0,536},{10,0,149},{11,0,280},{142,0,336},{134,0,1401},{135,0, 1946},{8,0,663},{144,0,8},{134,0,1607},{135,10,2023},{4,11,289},{7,11,629},{7,11 ,1698},{7,11,1711},{140,11,215},{6,11,450},{136,11,109},{10,0,882},{10,0,883},{ 10,0,914},{138,0,928},{133,10,843},{136,11,705},{132,10,554},{133,10,536},{5,0, 417},{9,10,79},{11,10,625},{145,10,7},{7,11,1238},{142,11,37},{4,0,392},{135,0, 1597},{5,0,433},{9,0,633},{11,0,629},{132,10,424},{7,10,336},{136,10,785},{134, 11,355},{6,0,234},{7,0,769},{9,0,18},{138,0,358},{4,10,896},{134,10,1777},{138, 11,323},{7,0,140},{7,0,1950},{8,0,680},{11,0,817},{147,0,88},{7,0,1222},{138,0, 386},{139,11,908},{11,0,249},{12,0,313},{16,0,66},{145,0,26},{134,0,5},{7,10,750 },{9,10,223},{11,10,27},{11,10,466},{12,10,624},{14,10,265},{146,10,61},{134,11, 26},{134,0,1216},{5,0,963},{134,0,1773},{4,11,414},{5,11,467},{9,11,654},{10,11, 451},{12,11,59},{141,11,375},{135,11,17},{4,10,603},{133,10,661},{4,10,11},{6,10 ,128},{7,10,231},{7,10,1533},{138,10,725},{135,11,955},{7,0,180},{8,0,509},{136, 0,792},{132,10,476},{132,0,1002},{133,11,538},{135,10,1807},{132,0,931},{7,0,943 },{11,0,614},{140,0,747},{135,0,1837},{9,10,20},{10,10,324},{10,10,807},{139,10, 488},{134,0,641},{6,11,280},{10,11,502},{11,11,344},{140,11,38},{5,11,45},{7,11, 1161},{11,11,448},{11,11,880},{13,11,139},{13,11,407},{15,11,16},{17,11,95},{18, 11,66},{18,11,88},{18,11,123},{149,11,7},{9,0,280},{138,0,134},{22,0,22},{23,0,5 },{151,0,29},{136,11,777},{4,0,90},{5,0,545},{7,0,754},{9,0,186},{10,0,72},{10,0 ,782},{11,0,577},{11,0,610},{11,0,960},{12,0,354},{12,0,362},{12,0,595},{4,11, 410},{135,11,521},{135,11,1778},{5,10,112},{6,10,103},{134,10,150},{138,10,356}, {132,0,742},{7,0,151},{9,0,329},{139,0,254},{8,0,853},{8,0,881},{8,0,911},{8,0, 912},{10,0,872},{12,0,741},{12,0,742},{152,0,18},{4,11,573},{136,11,655},{6,0, 921},{134,0,934},{9,0,187},{10,0,36},{11,0,1016},{17,0,44},{146,0,64},{7,0,833}, {136,0,517},{4,0,506},{5,0,295},{135,0,1680},{4,10,708},{8,10,15},{9,10,50},{9, 10,386},{11,10,18},{11,10,529},{140,10,228},{7,0,251},{7,0,1701},{8,0,436},{4,10 ,563},{7,10,592},{7,10,637},{7,10,770},{8,10,463},{9,10,60},{9,10,335},{9,10,904 },{10,10,73},{11,10,434},{12,10,585},{13,10,331},{18,10,110},{148,10,60},{132,10 ,502},{136,0,584},{6,10,347},{138,10,161},{7,0,987},{9,0,688},{10,0,522},{11,0, 788},{12,0,137},{12,0,566},{14,0,9},{14,0,24},{14,0,64},{7,11,899},{142,11,325}, {4,0,214},{5,0,500},{5,10,102},{6,10,284},{7,10,1079},{7,10,1423},{7,10,1702},{8 ,10,470},{9,10,554},{9,10,723},{139,10,333},{7,10,246},{135,10,840},{6,10,10},{8 ,10,571},{9,10,739},{143,10,91},{133,10,626},{146,0,195},{134,0,1775},{7,0,389}, {7,0,700},{7,0,940},{8,0,514},{9,0,116},{9,0,535},{10,0,118},{11,0,107},{11,0, 148},{11,0,922},{12,0,254},{12,0,421},{142,0,238},{5,10,18},{6,10,526},{13,10,24 },{13,10,110},{19,10,5},{147,10,44},{132,0,743},{11,0,292},{4,10,309},{5,10,462} ,{7,10,970},{135,10,1097},{22,10,30},{150,10,33},{139,11,338},{135,11,1598},{7,0 ,1283},{9,0,227},{11,0,325},{11,0,408},{14,0,180},{146,0,47},{4,0,953},{6,0,1805 },{6,0,1814},{6,0,1862},{140,0,774},{6,11,611},{135,11,1733},{135,11,1464},{5,0, 81},{7,0,146},{7,0,1342},{8,0,53},{8,0,561},{8,0,694},{8,0,754},{9,0,115},{9,0, 179},{9,0,894},{10,0,462},{10,0,813},{11,0,230},{11,0,657},{11,0,699},{11,0,748} ,{12,0,119},{12,0,200},{12,0,283},{142,0,273},{5,0,408},{6,0,789},{6,0,877},{6,0 ,1253},{6,0,1413},{137,0,747},{134,10,1704},{135,11,663},{6,0,1910},{6,0,1915},{ 6,0,1923},{9,0,913},{9,0,928},{9,0,950},{9,0,954},{9,0,978},{9,0,993},{12,0,812} ,{12,0,819},{12,0,831},{12,0,833},{12,0,838},{12,0,909},{12,0,928},{12,0,931},{ 12,0,950},{15,0,186},{15,0,187},{15,0,195},{15,0,196},{15,0,209},{15,0,215},{15, 0,236},{15,0,241},{15,0,249},{15,0,253},{18,0,180},{18,0,221},{18,0,224},{18,0, 227},{18,0,229},{149,0,60},{7,0,1826},{135,0,1938},{11,0,490},{18,0,143},{5,10, 86},{7,10,743},{9,10,85},{10,10,281},{10,10,432},{12,10,251},{13,10,118},{142,10 ,378},{5,10,524},{133,10,744},{141,11,442},{10,10,107},{140,10,436},{135,11,503} ,{134,0,1162},{132,10,927},{7,0,30},{8,0,86},{8,0,315},{8,0,700},{9,0,576},{9,0, 858},{10,0,414},{11,0,310},{11,0,888},{11,0,904},{12,0,361},{13,0,248},{13,0,371 },{14,0,142},{12,10,670},{146,10,94},{134,0,721},{4,11,113},{5,11,163},{5,11,735 },{7,11,1009},{7,10,1149},{9,11,9},{9,10,156},{9,11,771},{12,11,90},{13,11,138}, {13,11,410},{143,11,128},{138,0,839},{133,10,778},{137,0,617},{133,10,502},{8,10 ,196},{10,10,283},{139,10,406},{6,0,428},{7,0,524},{8,0,169},{8,0,234},{9,0,480} ,{138,0,646},{133,10,855},{134,0,1648},{7,0,1205},{138,0,637},{7,0,1596},{4,11, 935},{133,11,823},{5,11,269},{7,11,434},{7,11,891},{8,11,339},{9,11,702},{11,11, 594},{11,11,718},{145,11,100},{7,11,878},{9,11,485},{141,11,264},{4,0,266},{8,0, 4},{9,0,39},{10,0,166},{11,0,918},{12,0,635},{20,0,10},{22,0,27},{22,0,43},{22,0 ,52},{134,11,1713},{7,10,1400},{9,10,446},{138,10,45},{135,11,900},{132,0,862},{ 134,0,1554},{135,11,1033},{19,0,16},{147,11,16},{135,11,1208},{7,0,157},{136,0, 279},{6,0,604},{136,0,391},{13,10,455},{15,10,99},{15,10,129},{144,10,68},{135, 10,172},{7,0,945},{11,0,713},{139,0,744},{4,0,973},{10,0,877},{10,0,937},{10,0, 938},{140,0,711},{139,0,1022},{132,10,568},{142,11,143},{4,0,567},{9,0,859},{132 ,10,732},{7,0,1846},{136,0,628},{136,10,733},{133,0,762},{4,10,428},{135,10,1789 },{10,0,784},{13,0,191},{7,10,2015},{140,10,665},{133,0,298},{7,0,633},{7,0,905} ,{7,0,909},{7,0,1538},{9,0,767},{140,0,636},{138,10,806},{132,0,795},{139,0,301} ,{135,0,1970},{5,11,625},{135,11,1617},{135,11,275},{7,11,37},{8,11,425},{8,11, 693},{9,11,720},{10,11,380},{10,11,638},{11,11,273},{11,11,307},{11,11,473},{12, 11,61},{143,11,43},{135,11,198},{134,0,1236},{7,0,369},{12,0,644},{12,0,645},{ 144,0,90},{19,0,15},{149,0,27},{6,0,71},{7,0,845},{8,0,160},{9,0,318},{6,10,1623 },{134,10,1681},{134,0,1447},{134,0,1255},{138,0,735},{8,0,76},{132,11,168},{6, 10,1748},{8,10,715},{9,10,802},{10,10,46},{10,10,819},{13,10,308},{14,10,351},{ 14,10,363},{146,10,67},{135,11,91},{6,0,474},{4,10,63},{133,10,347},{133,10,749} ,{138,0,841},{133,10,366},{6,0,836},{132,11,225},{135,0,1622},{135,10,89},{140,0 ,735},{134,0,1601},{138,11,145},{6,0,1390},{137,0,804},{142,0,394},{6,11,15},{7, 11,70},{10,11,240},{147,11,93},{6,0,96},{135,0,1426},{4,0,651},{133,0,289},{7,11 ,956},{7,10,977},{7,11,1157},{7,11,1506},{7,11,1606},{7,11,1615},{7,11,1619},{7, 11,1736},{7,11,1775},{8,11,590},{9,11,324},{9,11,736},{9,11,774},{9,11,776},{9, 11,784},{10,11,567},{10,11,708},{11,11,518},{11,11,613},{11,11,695},{11,11,716}, {11,11,739},{11,11,770},{11,11,771},{11,11,848},{11,11,857},{11,11,931},{11,11, 947},{12,11,326},{12,11,387},{12,11,484},{12,11,528},{12,11,552},{12,11,613},{13 ,11,189},{13,11,256},{13,11,340},{13,11,432},{13,11,436},{13,11,440},{13,11,454} ,{14,11,174},{14,11,220},{14,11,284},{14,11,390},{145,11,121},{7,0,688},{8,0,35} ,{9,0,511},{10,0,767},{147,0,118},{134,0,667},{4,0,513},{5,10,824},{133,10,941}, {7,10,440},{8,10,230},{139,10,106},{134,0,2034},{135,11,1399},{143,11,66},{135, 11,1529},{4,11,145},{6,11,176},{7,11,395},{9,11,562},{144,11,28},{132,11,501},{ 132,0,704},{134,0,1524},{7,0,1078},{134,11,464},{6,11,509},{10,11,82},{20,11,91} ,{151,11,13},{4,0,720},{133,0,306},{133,0,431},{7,0,1196},{4,10,914},{5,10,800}, {133,10,852},{135,11,1189},{10,0,54},{141,10,115},{7,10,564},{142,10,168},{5,0, 464},{6,0,236},{7,0,696},{7,0,914},{7,0,1108},{7,0,1448},{9,0,15},{9,0,564},{10, 0,14},{12,0,565},{13,0,449},{14,0,53},{15,0,13},{16,0,64},{17,0,41},{4,10,918},{ 133,10,876},{6,0,1418},{134,10,1764},{4,10,92},{133,10,274},{134,0,907},{4,11, 114},{8,10,501},{9,11,492},{13,11,462},{142,11,215},{4,11,77},{5,11,361},{6,11, 139},{6,11,401},{6,11,404},{7,11,413},{7,11,715},{7,11,1716},{11,11,279},{12,11, 179},{12,11,258},{13,11,244},{142,11,358},{6,0,1767},{12,0,194},{145,0,107},{134 ,11,1717},{5,10,743},{142,11,329},{4,10,49},{7,10,280},{135,10,1633},{5,0,840},{ 7,11,1061},{8,11,82},{11,11,250},{12,11,420},{141,11,184},{135,11,724},{134,0, 900},{136,10,47},{134,0,1436},{144,11,0},{6,0,675},{7,0,1008},{7,0,1560},{9,0, 642},{11,0,236},{14,0,193},{5,10,272},{5,10,908},{5,10,942},{8,10,197},{9,10,47} ,{11,10,538},{139,10,742},{4,0,68},{5,0,628},{5,0,634},{6,0,386},{7,0,794},{8,0, 273},{9,0,563},{10,0,105},{10,0,171},{11,0,94},{139,0,354},{135,10,1911},{137,10 ,891},{4,0,95},{6,0,1297},{6,0,1604},{7,0,416},{139,0,830},{6,11,513},{135,11, 1052},{7,0,731},{13,0,20},{143,0,11},{137,11,899},{10,0,850},{140,0,697},{4,0, 662},{7,11,1417},{12,11,382},{17,11,48},{152,11,12},{133,0,736},{132,0,861},{4, 10,407},{132,10,560},{141,10,490},{6,11,545},{7,11,565},{7,11,1669},{10,11,114}, {11,11,642},{140,11,618},{6,0,871},{134,0,1000},{5,0,864},{10,0,648},{11,0,671}, {15,0,46},{133,11,5},{133,0,928},{11,0,90},{13,0,7},{4,10,475},{11,10,35},{13,10 ,71},{13,10,177},{142,10,422},{136,0,332},{135,11,192},{134,0,1055},{136,11,763} ,{11,0,986},{140,0,682},{7,0,76},{8,0,44},{9,0,884},{10,0,580},{11,0,399},{11,0, 894},{143,0,122},{135,11,1237},{135,10,636},{11,0,300},{6,10,222},{7,10,1620},{8 ,10,409},{137,10,693},{4,11,87},{5,11,250},{10,11,601},{13,11,298},{13,11,353},{ 141,11,376},{5,0,518},{10,0,340},{11,0,175},{149,0,16},{140,0,771},{6,0,1108},{ 137,0,831},{132,0,836},{135,0,1852},{4,0,957},{6,0,1804},{8,0,842},{8,0,843},{8, 0,851},{8,0,855},{140,0,767},{135,11,814},{4,11,57},{7,11,1195},{7,11,1438},{7, 11,1548},{7,11,1835},{7,11,1904},{9,11,757},{10,11,604},{139,11,519},{133,10,882 },{138,0,246},{4,0,934},{5,0,202},{8,0,610},{7,11,1897},{12,11,290},{13,11,80},{ 13,11,437},{145,11,74},{8,0,96},{9,0,36},{10,0,607},{10,0,804},{10,0,832},{11,0, 423},{11,0,442},{12,0,309},{14,0,199},{15,0,90},{145,0,110},{132,10,426},{7,0, 654},{8,0,240},{6,10,58},{7,10,745},{7,10,1969},{8,10,675},{9,10,479},{9,10,731} ,{10,10,330},{10,10,593},{10,10,817},{11,10,32},{11,10,133},{11,10,221},{145,10, 68},{9,0,13},{9,0,398},{9,0,727},{10,0,75},{10,0,184},{10,0,230},{10,0,564},{10, 0,569},{11,0,973},{12,0,70},{12,0,189},{13,0,57},{141,0,257},{4,11,209},{135,11, 902},{7,0,391},{137,10,538},{134,0,403},{6,11,303},{7,11,335},{7,11,1437},{7,11, 1668},{8,11,553},{8,11,652},{8,11,656},{9,11,558},{11,11,743},{149,11,18},{132, 11,559},{11,0,75},{142,0,267},{6,0,815},{141,11,2},{141,0,366},{137,0,631},{133, 11,1017},{5,0,345},{135,0,1016},{133,11,709},{134,11,1745},{133,10,566},{7,0,952 },{6,10,48},{9,10,139},{10,10,399},{11,10,469},{12,10,634},{141,10,223},{133,0, 673},{9,0,850},{7,11,8},{136,11,206},{6,0,662},{149,0,35},{4,0,287},{133,0,1018} ,{6,10,114},{7,10,1224},{7,10,1556},{136,10,3},{8,10,576},{137,10,267},{4,0,884} ,{5,0,34},{10,0,724},{12,0,444},{13,0,354},{18,0,32},{23,0,24},{23,0,31},{152,0, 5},{133,10,933},{132,11,776},{138,0,151},{136,0,427},{134,0,382},{132,0,329},{9, 0,846},{10,0,827},{138,11,33},{9,0,279},{10,0,407},{14,0,84},{22,0,18},{135,11, 1297},{136,11,406},{132,0,906},{136,0,366},{134,0,843},{134,0,1443},{135,0,1372} ,{138,0,992},{4,0,123},{5,0,605},{7,0,1509},{136,0,36},{132,0,649},{8,11,175},{ 10,11,168},{138,11,573},{133,0,767},{134,0,1018},{135,11,1305},{12,10,30},{13,10 ,148},{14,10,87},{14,10,182},{16,10,42},{148,10,70},{134,11,607},{4,0,273},{5,0, 658},{133,0,995},{6,0,72},{139,11,174},{10,0,483},{12,0,368},{7,10,56},{7,10, 1989},{8,10,337},{8,10,738},{9,10,600},{13,10,447},{142,10,92},{5,11,784},{138, 10,666},{135,0,1345},{139,11,882},{134,0,1293},{133,0,589},{134,0,1988},{5,0,117 },{6,0,514},{6,0,541},{7,0,1164},{7,0,1436},{8,0,220},{8,0,648},{10,0,688},{139, 0,560},{136,0,379},{5,0,686},{7,10,866},{135,10,1163},{132,10,328},{9,11,14},{9, 11,441},{10,11,306},{139,11,9},{4,10,101},{135,10,1171},{5,10,833},{136,10,744}, {5,11,161},{7,11,839},{135,11,887},{7,0,196},{10,0,765},{11,0,347},{11,0,552},{ 11,0,790},{12,0,263},{13,0,246},{13,0,270},{13,0,395},{14,0,176},{14,0,190},{14, 0,398},{14,0,412},{15,0,32},{15,0,63},{16,0,88},{147,0,105},{6,10,9},{6,10,397}, {7,10,53},{7,10,1742},{10,10,632},{11,10,828},{140,10,146},{5,0,381},{135,0,1792 },{134,0,1452},{135,11,429},{8,0,367},{10,0,760},{14,0,79},{20,0,17},{152,0,0},{ 7,0,616},{138,0,413},{11,10,417},{12,10,223},{140,10,265},{7,11,1611},{13,11,14} ,{15,11,44},{19,11,13},{148,11,76},{135,0,1229},{6,0,120},{7,0,1188},{7,0,1710}, {8,0,286},{9,0,667},{11,0,592},{139,0,730},{135,11,1814},{135,0,1146},{4,10,186} ,{5,10,157},{8,10,168},{138,10,6},{4,0,352},{135,0,687},{4,0,192},{5,0,49},{6,0, 200},{6,0,293},{6,0,1696},{135,0,1151},{133,10,875},{5,10,773},{5,10,991},{6,10, 1635},{134,10,1788},{7,10,111},{136,10,581},{6,0,935},{134,0,1151},{134,0,1050}, {132,0,650},{132,0,147},{11,0,194},{12,0,62},{12,0,88},{11,11,194},{12,11,62},{ 140,11,88},{6,0,339},{135,0,923},{134,10,1747},{7,11,643},{136,11,236},{133,0, 934},{7,10,1364},{7,10,1907},{141,10,158},{132,10,659},{4,10,404},{135,10,675},{ 7,11,581},{9,11,644},{137,11,699},{13,0,211},{14,0,133},{14,0,204},{15,0,64},{15 ,0,69},{15,0,114},{16,0,10},{19,0,23},{19,0,35},{19,0,39},{19,0,51},{19,0,71},{ 19,0,75},{152,0,15},{133,10,391},{5,11,54},{135,11,1513},{7,0,222},{8,0,341},{5, 10,540},{134,10,1697},{134,10,78},{132,11,744},{136,0,293},{137,11,701},{7,11, 930},{10,11,402},{10,11,476},{13,11,452},{18,11,55},{147,11,104},{132,0,637},{ 133,10,460},{8,11,50},{137,11,624},{132,11,572},{134,0,1159},{4,10,199},{139,10, 34},{134,0,847},{134,10,388},{6,11,43},{7,11,38},{8,11,248},{9,11,504},{138,11, 513},{9,0,683},{4,10,511},{6,10,608},{9,10,333},{10,10,602},{11,10,441},{11,10, 723},{11,10,976},{140,10,357},{9,0,867},{138,0,837},{6,0,944},{135,11,326},{135, 0,1809},{5,10,938},{7,11,783},{136,10,707},{133,11,766},{133,11,363},{6,0,170},{ 7,0,1080},{8,0,395},{8,0,487},{141,0,147},{6,11,258},{140,11,409},{4,0,535},{8,0 ,618},{5,11,249},{148,11,82},{6,0,1379},{149,11,15},{135,0,1625},{150,0,23},{5, 11,393},{6,11,378},{7,11,1981},{9,11,32},{9,11,591},{10,11,685},{10,11,741},{142 ,11,382},{133,11,788},{7,11,1968},{10,11,19},{139,11,911},{7,11,1401},{135,11, 1476},{4,11,61},{5,11,58},{5,11,171},{5,11,635},{5,11,683},{5,11,700},{6,11,291} ,{6,11,566},{7,11,1650},{11,11,523},{12,11,273},{12,11,303},{15,11,39},{143,11, 111},{6,10,469},{7,10,1709},{138,10,515},{4,0,778},{134,11,589},{132,0,46},{5,0, 811},{6,0,1679},{6,0,1714},{135,0,2032},{7,0,1458},{9,0,407},{11,0,15},{12,0,651 },{149,0,37},{7,0,938},{132,10,500},{6,0,34},{7,0,69},{7,0,1089},{7,0,1281},{8,0 ,708},{8,0,721},{9,0,363},{148,0,98},{10,11,231},{147,11,124},{7,11,726},{152,11 ,9},{5,10,68},{134,10,383},{136,11,583},{4,11,917},{133,11,1005},{11,10,216},{ 139,10,340},{135,11,1675},{8,0,441},{10,0,314},{143,0,3},{132,11,919},{4,10,337} ,{6,10,353},{7,10,1934},{8,10,488},{137,10,429},{7,0,889},{7,10,1795},{8,10,259} ,{9,10,135},{9,10,177},{9,10,860},{10,10,825},{11,10,115},{11,10,370},{11,10,405 },{11,10,604},{12,10,10},{12,10,667},{12,10,669},{13,10,76},{14,10,310},{15,10, 76},{15,10,147},{148,10,23},{4,10,15},{4,11,255},{5,10,22},{5,11,302},{6,11,132} ,{6,10,244},{7,10,40},{7,11,128},{7,10,200},{7,11,283},{7,10,906},{7,10,1199},{7 ,11,1299},{9,10,616},{10,11,52},{10,11,514},{10,10,716},{11,10,635},{11,10,801}, {11,11,925},{12,10,458},{13,11,92},{142,11,309},{132,0,462},{137,11,173},{135,10 ,1735},{8,0,525},{5,10,598},{7,10,791},{8,10,108},{137,10,123},{5,0,73},{6,0,23} ,{134,0,338},{132,0,676},{132,10,683},{7,0,725},{8,0,498},{139,0,268},{12,0,21}, {151,0,7},{135,0,773},{4,10,155},{135,10,1689},{4,0,164},{5,0,730},{5,10,151},{5 ,10,741},{6,11,210},{7,10,498},{7,10,870},{7,10,1542},{12,10,213},{14,10,36},{14 ,10,391},{17,10,111},{18,10,6},{18,10,46},{18,10,151},{19,10,36},{20,10,32},{20, 10,56},{20,10,69},{20,10,102},{21,10,4},{22,10,8},{22,10,10},{22,10,14},{150,10, 31},{4,10,624},{135,10,1752},{4,0,583},{9,0,936},{15,0,214},{18,0,199},{24,0,26} ,{134,11,588},{7,0,1462},{11,0,659},{4,11,284},{134,11,223},{133,0,220},{139,0, 803},{132,0,544},{4,10,492},{133,10,451},{16,0,98},{148,0,119},{4,11,218},{7,11, 526},{143,11,137},{135,10,835},{4,11,270},{5,11,192},{6,11,332},{7,11,1322},{13, 11,9},{13,10,70},{14,11,104},{142,11,311},{132,10,539},{140,11,661},{5,0,176},{6 ,0,437},{6,0,564},{11,0,181},{141,0,183},{135,0,1192},{6,10,113},{135,10,436},{ 136,10,718},{135,10,520},{135,0,1878},{140,11,196},{7,11,379},{8,11,481},{137,11 ,377},{5,11,1003},{6,11,149},{137,11,746},{8,11,262},{9,11,627},{10,11,18},{11, 11,214},{11,11,404},{11,11,457},{11,11,780},{11,11,849},{11,11,913},{13,11,330}, {13,11,401},{142,11,200},{149,0,26},{136,11,304},{132,11,142},{135,0,944},{4,0, 790},{5,0,273},{134,0,394},{134,0,855},{4,0,135},{6,0,127},{7,0,1185},{7,0,1511} ,{8,0,613},{11,0,5},{12,0,336},{12,0,495},{12,0,586},{12,0,660},{12,0,668},{14,0 ,385},{15,0,118},{17,0,20},{146,0,98},{6,0,230},{9,0,752},{18,0,109},{12,10,610} ,{13,10,431},{144,10,59},{7,0,1954},{135,11,925},{4,11,471},{5,11,51},{6,11,602} ,{8,11,484},{10,11,195},{140,11,159},{132,10,307},{136,11,688},{132,11,697},{7, 11,812},{7,11,1261},{7,11,1360},{9,11,632},{140,11,352},{5,0,162},{8,0,68},{133, 10,964},{4,0,654},{136,11,212},{4,0,156},{7,0,998},{7,0,1045},{7,0,1860},{9,0,48 },{9,0,692},{11,0,419},{139,0,602},{133,11,221},{4,11,373},{5,11,283},{6,11,480} ,{135,11,609},{142,11,216},{132,0,240},{6,11,192},{9,11,793},{145,11,55},{4,10, 75},{5,10,180},{6,10,500},{7,10,58},{7,10,710},{138,10,645},{4,11,132},{5,11,69} ,{5,10,649},{135,11,1242},{6,10,276},{7,10,282},{7,10,879},{7,10,924},{8,10,459} ,{9,10,599},{9,10,754},{11,10,574},{12,10,128},{12,10,494},{13,10,52},{13,10,301 },{15,10,30},{143,10,132},{132,10,200},{4,11,111},{135,11,302},{9,0,197},{10,0, 300},{12,0,473},{13,0,90},{141,0,405},{132,11,767},{6,11,42},{7,11,1416},{7,11, 1590},{7,11,2005},{8,11,131},{8,11,466},{9,11,672},{13,11,252},{148,11,103},{8,0 ,958},{8,0,999},{10,0,963},{138,0,1001},{135,10,1621},{135,0,858},{4,0,606},{137 ,11,444},{6,11,44},{136,11,368},{139,11,172},{4,11,570},{133,11,120},{139,11,624 },{7,0,1978},{8,0,676},{6,10,225},{137,10,211},{7,0,972},{11,0,102},{136,10,687} ,{6,11,227},{135,11,1589},{8,10,58},{9,10,724},{11,10,809},{13,10,113},{145,10, 72},{4,0,361},{133,0,315},{132,0,461},{6,10,345},{135,10,1247},{132,0,472},{8,10 ,767},{8,10,803},{9,10,301},{137,10,903},{135,11,1333},{135,11,477},{7,10,1949}, {136,10,674},{6,0,905},{138,0,747},{133,0,155},{134,10,259},{7,0,163},{8,0,319}, {9,0,402},{10,0,24},{10,0,681},{11,0,200},{12,0,253},{12,0,410},{142,0,219},{5,0 ,475},{7,0,1780},{9,0,230},{11,0,297},{11,0,558},{14,0,322},{19,0,76},{6,11,1667 },{7,11,2036},{138,11,600},{136,10,254},{6,0,848},{135,0,1956},{6,11,511},{140, 11,132},{5,11,568},{6,11,138},{135,11,1293},{6,0,631},{137,0,838},{149,0,36},{4, 11,565},{8,11,23},{136,11,827},{5,0,944},{134,0,1769},{4,0,144},{6,0,842},{6,0, 1400},{4,11,922},{133,11,1023},{133,10,248},{9,10,800},{10,10,693},{11,10,482},{ 11,10,734},{139,10,789},{7,11,1002},{139,11,145},{4,10,116},{5,10,95},{5,10,445} ,{7,10,1688},{8,10,29},{9,10,272},{11,10,509},{139,10,915},{14,0,369},{146,0,72} ,{135,10,1641},{132,11,740},{133,10,543},{140,11,116},{6,0,247},{9,0,555},{5,10, 181},{136,10,41},{133,10,657},{136,0,996},{138,10,709},{7,0,189},{8,10,202},{138 ,10,536},{136,11,402},{4,11,716},{141,11,31},{10,0,280},{138,0,797},{9,10,423},{ 140,10,89},{8,10,113},{9,10,877},{10,10,554},{11,10,83},{12,10,136},{147,10,109} ,{133,10,976},{7,0,746},{132,10,206},{136,0,526},{139,0,345},{136,0,1017},{8,11, 152},{9,11,53},{9,11,268},{9,11,901},{10,11,518},{10,11,829},{11,11,188},{13,11, 74},{14,11,46},{15,11,17},{15,11,33},{17,11,40},{18,11,36},{19,11,20},{22,11,1}, {152,11,2},{133,11,736},{136,11,532},{5,0,428},{138,0,651},{135,11,681},{135,0, 1162},{7,0,327},{13,0,230},{17,0,113},{8,10,226},{10,10,537},{11,10,570},{11,10, 605},{11,10,799},{11,10,804},{12,10,85},{12,10,516},{12,10,623},{12,11,677},{13, 10,361},{14,10,77},{14,10,78},{147,10,110},{4,0,792},{7,0,1717},{10,0,546},{132, 10,769},{4,11,684},{136,11,384},{132,10,551},{134,0,1203},{9,10,57},{9,10,459},{ 10,10,425},{11,10,119},{12,10,184},{12,10,371},{13,10,358},{145,10,51},{5,0,672} ,{5,10,814},{8,10,10},{9,10,421},{9,10,729},{10,10,609},{139,10,689},{138,0,189} ,{134,10,624},{7,11,110},{7,11,188},{8,11,290},{8,11,591},{9,11,382},{9,11,649}, {11,11,71},{11,11,155},{11,11,313},{12,11,5},{13,11,325},{142,11,287},{133,0,99} ,{6,0,1053},{135,0,298},{7,11,360},{7,11,425},{9,11,66},{9,11,278},{138,11,644}, {4,0,397},{136,0,555},{137,10,269},{132,10,528},{4,11,900},{133,11,861},{6,0, 1157},{5,11,254},{7,11,985},{136,11,73},{7,11,1959},{136,11,683},{12,0,398},{20, 0,39},{21,0,11},{150,0,41},{4,0,485},{7,0,353},{135,0,1523},{6,0,366},{7,0,1384} ,{135,0,1601},{138,0,787},{137,0,282},{5,10,104},{6,10,173},{135,10,1631},{139, 11,146},{4,0,157},{133,0,471},{134,0,941},{132,11,725},{7,0,1336},{8,10,138},{8, 10,342},{9,10,84},{10,10,193},{11,10,883},{140,10,359},{134,11,196},{136,0,116}, {133,11,831},{134,0,787},{134,10,95},{6,10,406},{10,10,409},{10,10,447},{11,10, 44},{140,10,100},{5,0,160},{7,0,363},{7,0,589},{10,0,170},{141,0,55},{134,0,1815 },{132,0,866},{6,0,889},{6,0,1067},{6,0,1183},{4,11,321},{134,11,569},{5,11,848} ,{134,11,66},{4,11,36},{6,10,1636},{7,11,1387},{10,11,205},{11,11,755},{141,11, 271},{132,0,689},{9,0,820},{4,10,282},{7,10,1034},{11,10,398},{11,10,634},{12,10 ,1},{12,10,79},{12,10,544},{14,10,237},{17,10,10},{146,10,20},{4,0,108},{7,0,804 },{139,0,498},{132,11,887},{6,0,1119},{135,11,620},{6,11,165},{138,11,388},{5,0, 244},{5,10,499},{6,10,476},{7,10,600},{7,10,888},{135,10,1096},{140,0,609},{135, 0,1005},{4,0,412},{133,0,581},{4,11,719},{135,11,155},{7,10,296},{7,10,596},{8, 10,560},{8,10,586},{9,10,612},{11,10,304},{12,10,46},{13,10,89},{14,10,112},{145 ,10,122},{4,0,895},{133,0,772},{142,11,307},{135,0,1898},{4,0,926},{133,0,983},{ 4,11,353},{6,11,146},{6,11,1789},{7,11,288},{7,11,990},{7,11,1348},{9,11,665},{9 ,11,898},{11,11,893},{142,11,212},{132,0,538},{133,11,532},{6,0,294},{7,0,1267}, {8,0,624},{141,0,496},{7,0,1325},{4,11,45},{135,11,1257},{138,0,301},{9,0,298},{ 12,0,291},{13,0,276},{14,0,6},{17,0,18},{21,0,32},{7,10,1599},{7,10,1723},{8,10, 79},{8,10,106},{8,10,190},{8,10,302},{8,10,383},{8,10,713},{9,10,119},{9,10,233} ,{9,10,419},{9,10,471},{10,10,181},{10,10,406},{11,10,57},{11,10,85},{11,10,120} ,{11,10,177},{11,10,296},{11,10,382},{11,10,454},{11,10,758},{11,10,999},{12,10, 27},{12,10,131},{12,10,245},{12,10,312},{12,10,446},{12,10,454},{13,10,98},{13, 10,426},{13,10,508},{14,10,163},{14,10,272},{14,10,277},{14,10,370},{15,10,95},{ 15,10,138},{15,10,167},{17,10,38},{148,10,96},{132,0,757},{134,0,1263},{4,0,820} ,{134,10,1759},{133,0,722},{136,11,816},{138,10,372},{145,10,16},{134,0,1039},{4 ,0,991},{134,0,2028},{133,10,258},{7,0,1875},{139,0,124},{6,11,559},{6,11,1691}, {135,11,586},{5,0,324},{7,0,881},{8,10,134},{9,10,788},{140,10,438},{7,11,1823}, {139,11,693},{6,0,1348},{134,0,1545},{134,0,911},{132,0,954},{8,0,329},{8,0,414} ,{7,10,1948},{135,10,2004},{5,0,517},{6,10,439},{7,10,780},{135,10,1040},{132,0, 816},{5,10,1},{6,10,81},{138,10,520},{9,0,713},{10,0,222},{5,10,482},{8,10,98},{ 10,10,700},{10,10,822},{11,10,302},{11,10,778},{12,10,50},{12,10,127},{12,10,396 },{13,10,62},{13,10,328},{14,10,122},{147,10,72},{137,0,33},{5,10,2},{7,10,1494} ,{136,10,589},{6,10,512},{7,10,797},{8,10,253},{9,10,77},{10,10,1},{10,11,108},{ 10,10,129},{10,10,225},{11,11,116},{11,10,118},{11,10,226},{11,10,251},{11,10, 430},{11,10,701},{11,10,974},{11,10,982},{12,10,64},{12,10,260},{12,10,488},{140 ,10,690},{134,11,456},{133,11,925},{5,0,150},{7,0,106},{7,0,774},{8,0,603},{9,0, 593},{9,0,634},{10,0,44},{10,0,173},{11,0,462},{11,0,515},{13,0,216},{13,0,288}, {142,0,400},{137,10,347},{5,0,748},{134,0,553},{12,0,108},{141,0,291},{7,0,420}, {4,10,12},{7,10,522},{7,10,809},{8,10,797},{141,10,88},{6,11,193},{7,11,240},{7, 11,1682},{10,11,51},{10,11,640},{11,11,410},{13,11,82},{14,11,247},{14,11,331},{ 142,11,377},{133,10,528},{135,0,1777},{4,0,493},{144,0,55},{136,11,633},{139,0, 81},{6,0,980},{136,0,321},{148,10,109},{5,10,266},{9,10,290},{9,10,364},{10,10, 293},{11,10,606},{142,10,45},{6,0,568},{7,0,112},{7,0,1804},{8,0,362},{8,0,410}, {8,0,830},{9,0,514},{11,0,649},{142,0,157},{4,0,74},{6,0,510},{6,10,594},{9,10, 121},{10,10,49},{10,10,412},{139,10,834},{134,0,838},{136,10,748},{132,10,466},{ 132,0,625},{135,11,1443},{4,11,237},{135,11,514},{9,10,378},{141,10,162},{6,0,16 },{6,0,158},{7,0,43},{7,0,129},{7,0,181},{8,0,276},{8,0,377},{10,0,523},{11,0, 816},{12,0,455},{13,0,303},{142,0,135},{135,0,281},{4,0,1},{7,0,1143},{7,0,1463} ,{8,0,61},{9,0,207},{9,0,390},{9,0,467},{139,0,836},{6,11,392},{7,11,65},{135,11 ,2019},{132,10,667},{4,0,723},{5,0,895},{7,0,1031},{8,0,199},{8,0,340},{9,0,153} ,{9,0,215},{10,0,21},{10,0,59},{10,0,80},{10,0,224},{10,0,838},{11,0,229},{11,0, 652},{12,0,192},{13,0,146},{142,0,91},{132,0,295},{137,0,51},{9,11,222},{10,11, 43},{139,11,900},{5,0,309},{140,0,211},{5,0,125},{8,0,77},{138,0,15},{136,11,604 },{138,0,789},{5,0,173},{4,10,39},{7,10,1843},{8,10,407},{11,10,144},{140,10,523 },{138,11,265},{133,0,439},{132,10,510},{7,0,648},{7,0,874},{11,0,164},{12,0,76} ,{18,0,9},{7,10,1980},{10,10,487},{138,10,809},{12,0,111},{14,0,294},{19,0,45},{ 13,10,260},{146,10,63},{133,11,549},{134,10,570},{4,0,8},{7,0,1152},{7,0,1153},{ 7,0,1715},{9,0,374},{10,0,478},{139,0,648},{135,0,1099},{5,0,575},{6,0,354},{135 ,0,701},{7,11,36},{8,11,201},{136,11,605},{4,10,787},{136,11,156},{6,0,518},{149 ,11,13},{140,11,224},{134,0,702},{132,10,516},{5,11,724},{10,11,305},{11,11,151} ,{12,11,33},{12,11,121},{12,11,381},{17,11,3},{17,11,27},{17,11,78},{18,11,18},{ 19,11,54},{149,11,5},{8,0,87},{4,11,523},{5,11,638},{11,10,887},{14,10,365},{142 ,10,375},{138,0,438},{136,10,821},{135,11,1908},{6,11,242},{7,11,227},{7,11,1581 },{8,11,104},{9,11,113},{9,11,220},{9,11,427},{10,11,74},{10,11,239},{11,11,579} ,{11,11,1023},{13,11,4},{13,11,204},{13,11,316},{18,11,95},{148,11,86},{4,0,69}, {5,0,122},{5,0,849},{6,0,1633},{9,0,656},{138,0,464},{7,0,1802},{4,10,10},{139, 10,786},{135,11,861},{139,0,499},{7,0,476},{7,0,1592},{138,0,87},{133,10,684},{4 ,0,840},{134,10,27},{142,0,283},{6,0,1620},{7,11,1328},{136,11,494},{5,0,859},{7 ,0,1160},{8,0,107},{9,0,291},{9,0,439},{10,0,663},{11,0,609},{140,0,197},{7,11, 1306},{8,11,505},{9,11,482},{10,11,126},{11,11,225},{12,11,347},{12,11,449},{13, 11,19},{142,11,218},{5,11,268},{10,11,764},{12,11,120},{13,11,39},{145,11,127},{ 145,10,56},{7,11,1672},{10,11,472},{11,11,189},{143,11,51},{6,10,342},{6,10,496} ,{8,10,275},{137,10,206},{133,0,600},{4,0,117},{6,0,372},{7,0,1905},{142,0,323}, {4,10,909},{5,10,940},{135,11,1471},{132,10,891},{4,0,722},{139,0,471},{4,11,384 },{135,11,1022},{132,10,687},{9,0,5},{12,0,216},{12,0,294},{12,0,298},{12,0,400} ,{12,0,518},{13,0,229},{143,0,139},{135,11,1703},{7,11,1602},{10,11,698},{12,11, 212},{141,11,307},{6,10,41},{141,10,160},{135,11,1077},{9,11,159},{11,11,28},{ 140,11,603},{4,0,514},{7,0,1304},{138,0,477},{134,0,1774},{9,0,88},{139,0,270},{ 5,0,12},{7,0,375},{9,0,438},{134,10,1718},{132,11,515},{136,10,778},{8,11,632},{ 8,11,697},{137,11,854},{6,0,362},{6,0,997},{146,0,51},{7,0,816},{7,0,1241},{9,0, 283},{9,0,520},{10,0,213},{10,0,307},{10,0,463},{10,0,671},{10,0,746},{11,0,401} ,{11,0,794},{12,0,517},{18,0,107},{147,0,115},{133,10,115},{150,11,28},{4,11,136 },{133,11,551},{142,10,314},{132,0,258},{6,0,22},{7,0,903},{7,0,1963},{8,0,639}, {138,0,577},{5,0,681},{8,0,782},{13,0,130},{17,0,84},{5,10,193},{140,10,178},{9, 11,17},{138,11,291},{7,11,1287},{9,11,44},{10,11,552},{10,11,642},{11,11,839},{ 12,11,274},{12,11,275},{12,11,372},{13,11,91},{142,11,125},{135,10,174},{4,0,664 },{5,0,804},{139,0,1013},{134,0,942},{6,0,1349},{6,0,1353},{6,0,1450},{7,11,1518 },{139,11,694},{11,0,356},{4,10,122},{5,10,796},{5,10,952},{6,10,1660},{6,10, 1671},{8,10,567},{9,10,687},{9,10,742},{10,10,686},{11,10,682},{140,10,281},{5,0 ,32},{6,11,147},{7,11,886},{9,11,753},{138,11,268},{5,10,179},{7,10,1095},{135, 10,1213},{4,10,66},{7,10,722},{135,10,904},{135,10,352},{9,11,245},{138,11,137}, {4,0,289},{7,0,629},{7,0,1698},{7,0,1711},{12,0,215},{133,11,414},{6,0,1975},{ 135,11,1762},{6,0,450},{136,0,109},{141,10,35},{134,11,599},{136,0,705},{133,0, 664},{134,11,1749},{11,11,402},{12,11,109},{12,11,431},{13,11,179},{13,11,206},{ 14,11,175},{14,11,217},{16,11,3},{148,11,53},{135,0,1238},{134,11,1627},{132,11, 488},{13,0,318},{10,10,592},{10,10,753},{12,10,317},{12,10,355},{12,10,465},{12, 10,469},{12,10,560},{140,10,578},{133,10,564},{132,11,83},{140,11,676},{6,0,1872 },{6,0,1906},{6,0,1907},{9,0,934},{9,0,956},{9,0,960},{9,0,996},{12,0,794},{12,0 ,876},{12,0,880},{12,0,918},{15,0,230},{18,0,234},{18,0,238},{21,0,38},{149,0,62 },{134,10,556},{134,11,278},{137,0,103},{7,10,544},{8,10,719},{138,10,61},{4,10, 5},{5,10,498},{8,10,637},{137,10,521},{7,0,777},{12,0,229},{12,0,239},{15,0,12}, {12,11,229},{12,11,239},{143,11,12},{6,0,26},{7,11,388},{7,11,644},{139,11,781}, {7,11,229},{8,11,59},{9,11,190},{9,11,257},{10,11,378},{140,11,191},{133,10,927} ,{135,10,1441},{4,10,893},{5,10,780},{133,10,893},{4,0,414},{5,0,467},{9,0,654}, {10,0,451},{12,0,59},{141,0,375},{142,0,173},{135,0,17},{7,0,1350},{133,10,238}, {135,0,955},{4,0,960},{10,0,887},{12,0,753},{18,0,161},{18,0,162},{152,0,19},{ 136,11,344},{6,10,1729},{137,11,288},{132,11,660},{4,0,217},{5,0,710},{7,0,760}, {7,0,1926},{9,0,428},{9,0,708},{10,0,254},{10,0,296},{10,0,720},{11,0,109},{11,0 ,255},{12,0,165},{12,0,315},{13,0,107},{13,0,203},{14,0,54},{14,0,99},{14,0,114} ,{14,0,388},{16,0,85},{17,0,9},{17,0,33},{20,0,25},{20,0,28},{20,0,29},{21,0,9}, {21,0,10},{21,0,34},{22,0,17},{4,10,60},{7,10,1800},{8,10,314},{9,10,700},{139, 10,487},{7,11,1035},{138,11,737},{7,11,690},{9,11,217},{9,11,587},{140,11,521},{ 6,0,919},{7,11,706},{7,11,1058},{138,11,538},{7,10,1853},{138,10,437},{136,10, 419},{6,0,280},{10,0,502},{11,0,344},{140,0,38},{5,0,45},{7,0,1161},{11,0,448},{ 11,0,880},{13,0,139},{13,0,407},{15,0,16},{17,0,95},{18,0,66},{18,0,88},{18,0, 123},{149,0,7},{11,11,92},{11,11,196},{11,11,409},{11,11,450},{11,11,666},{11,11 ,777},{12,11,262},{13,11,385},{13,11,393},{15,11,115},{16,11,45},{145,11,82},{ 136,0,777},{134,11,1744},{4,0,410},{7,0,521},{133,10,828},{134,0,673},{7,0,1110} ,{7,0,1778},{7,10,176},{135,10,178},{5,10,806},{7,11,268},{7,10,1976},{136,11, 569},{4,11,733},{9,11,194},{10,11,92},{11,11,198},{12,11,84},{12,11,87},{13,11, 128},{144,11,74},{5,0,341},{7,0,1129},{11,0,414},{4,10,51},{6,10,4},{7,10,591},{ 7,10,849},{7,10,951},{7,10,1613},{7,10,1760},{7,10,1988},{9,10,434},{10,10,754}, {11,10,25},{139,10,37},{133,10,902},{135,10,928},{135,0,787},{132,0,436},{134,10 ,270},{7,0,1587},{135,0,1707},{6,0,377},{7,0,1025},{9,0,613},{145,0,104},{7,11, 982},{7,11,1361},{10,11,32},{143,11,56},{139,0,96},{132,0,451},{132,10,416},{142 ,10,372},{5,10,152},{5,10,197},{7,11,306},{7,10,340},{7,10,867},{10,10,548},{10, 10,581},{11,10,6},{12,10,3},{12,10,19},{14,10,110},{142,10,289},{134,0,680},{134 ,11,609},{7,0,483},{7,10,190},{8,10,28},{8,10,141},{8,10,444},{8,10,811},{9,10, 468},{11,10,334},{12,10,24},{12,10,386},{140,10,576},{10,0,916},{133,10,757},{5, 10,721},{135,10,1553},{133,11,178},{134,0,937},{132,10,898},{133,0,739},{147,0, 82},{135,0,663},{146,0,128},{5,10,277},{141,10,247},{134,0,1087},{132,10,435},{6 ,11,381},{7,11,645},{7,11,694},{136,11,546},{7,0,503},{135,0,1885},{6,0,1965},{8 ,0,925},{138,0,955},{4,0,113},{5,0,163},{5,0,735},{7,0,1009},{9,0,9},{9,0,771},{ 12,0,90},{13,0,138},{13,0,410},{143,0,128},{4,0,324},{138,0,104},{7,0,460},{5,10 ,265},{134,10,212},{133,11,105},{7,11,261},{7,11,1107},{7,11,1115},{7,11,1354},{ 7,11,1588},{7,11,1705},{7,11,1902},{9,11,465},{10,11,248},{10,11,349},{10,11,647 },{11,11,527},{11,11,660},{11,11,669},{12,11,529},{141,11,305},{5,11,438},{9,11, 694},{12,11,627},{141,11,210},{152,11,11},{4,0,935},{133,0,823},{132,10,702},{5, 0,269},{7,0,434},{7,0,891},{8,0,339},{9,0,702},{11,0,594},{11,0,718},{17,0,100}, {5,10,808},{135,10,2045},{7,0,1014},{9,0,485},{141,0,264},{134,0,1713},{7,0,1810 },{11,0,866},{12,0,103},{13,0,495},{140,11,233},{4,0,423},{10,0,949},{138,0,1013 },{135,0,900},{8,11,25},{138,11,826},{5,10,166},{8,10,739},{140,10,511},{134,0, 2018},{7,11,1270},{139,11,612},{4,10,119},{5,10,170},{5,10,447},{7,10,1708},{7, 10,1889},{9,10,357},{9,10,719},{12,10,486},{140,10,596},{12,0,574},{140,11,574}, {132,11,308},{6,0,964},{6,0,1206},{134,0,1302},{4,10,450},{135,10,1158},{135,11, 150},{136,11,649},{14,0,213},{148,0,38},{9,11,45},{9,11,311},{141,11,42},{134,11 ,521},{7,10,1375},{7,10,1466},{138,10,331},{132,10,754},{5,11,339},{7,11,1442},{ 14,11,3},{15,11,41},{147,11,66},{136,11,378},{134,0,1022},{5,10,850},{136,10,799 },{142,0,143},{135,0,2029},{134,11,1628},{8,0,523},{150,0,34},{5,0,625},{135,0, 1617},{7,0,275},{7,10,238},{7,10,2033},{8,10,120},{8,10,188},{8,10,659},{9,10, 598},{10,10,466},{12,10,342},{12,10,588},{13,10,503},{14,10,246},{143,10,92},{7, 0,37},{8,0,425},{8,0,693},{9,0,720},{10,0,380},{10,0,638},{11,0,273},{11,0,473}, {12,0,61},{143,0,43},{135,11,829},{135,0,1943},{132,0,765},{5,11,486},{135,11, 1349},{7,11,1635},{8,11,17},{10,11,217},{138,11,295},{4,10,201},{7,10,1744},{8, 10,602},{11,10,247},{11,10,826},{145,10,65},{138,11,558},{11,0,551},{142,0,159}, {8,10,164},{146,10,62},{139,11,176},{132,0,168},{136,0,1010},{134,0,1994},{135,0 ,91},{138,0,532},{135,10,1243},{135,0,1884},{132,10,907},{5,10,100},{10,10,329}, {12,10,416},{149,10,29},{134,11,447},{132,10,176},{5,10,636},{5,10,998},{7,10,9} ,{7,10,1508},{8,10,26},{9,10,317},{9,10,358},{10,10,210},{10,10,292},{10,10,533} ,{11,10,555},{12,10,526},{12,10,607},{13,10,263},{13,10,459},{142,10,271},{4,11, 609},{135,11,756},{6,0,15},{7,0,70},{10,0,240},{147,0,93},{4,11,930},{133,11,947 },{134,0,1227},{134,0,1534},{133,11,939},{133,11,962},{5,11,651},{8,11,170},{9, 11,61},{9,11,63},{10,11,23},{10,11,37},{10,11,834},{11,11,4},{11,11,187},{11,11, 281},{11,11,503},{11,11,677},{12,11,96},{12,11,130},{12,11,244},{14,11,5},{14,11 ,40},{14,11,162},{14,11,202},{146,11,133},{4,11,406},{5,11,579},{12,11,492},{150 ,11,15},{139,0,392},{6,10,610},{10,10,127},{141,10,27},{7,0,655},{7,0,1844},{136 ,10,119},{4,0,145},{6,0,176},{7,0,395},{137,0,562},{132,0,501},{140,11,145},{136 ,0,1019},{134,0,509},{139,0,267},{6,11,17},{7,11,16},{7,11,1001},{7,11,1982},{9, 11,886},{10,11,489},{10,11,800},{11,11,782},{12,11,320},{13,11,467},{14,11,145}, {14,11,387},{143,11,119},{145,11,17},{6,0,1099},{133,11,458},{7,11,1983},{8,11,0 },{8,11,171},{9,11,120},{9,11,732},{10,11,473},{11,11,656},{11,11,998},{18,11,0} ,{18,11,2},{147,11,21},{12,11,427},{146,11,38},{10,0,948},{138,0,968},{7,10,126} ,{136,10,84},{136,10,790},{4,0,114},{9,0,492},{13,0,462},{142,0,215},{6,10,64},{ 12,10,377},{141,10,309},{4,0,77},{5,0,361},{6,0,139},{6,0,401},{6,0,404},{7,0, 413},{7,0,715},{7,0,1716},{11,0,279},{12,0,179},{12,0,258},{13,0,244},{142,0,358 },{134,0,1717},{7,0,772},{7,0,1061},{7,0,1647},{8,0,82},{11,0,250},{11,0,607},{ 12,0,311},{12,0,420},{13,0,184},{13,0,367},{7,10,1104},{11,10,269},{11,10,539},{ 11,10,627},{11,10,706},{11,10,975},{12,10,248},{12,10,434},{12,10,600},{12,10, 622},{13,10,297},{13,10,485},{14,10,69},{14,10,409},{143,10,108},{135,0,724},{4, 11,512},{4,11,519},{133,11,342},{134,0,1133},{145,11,29},{11,10,977},{141,10,507 },{6,0,841},{6,0,1042},{6,0,1194},{10,0,993},{140,0,1021},{6,11,31},{7,11,491},{ 7,11,530},{8,11,592},{9,10,34},{11,11,53},{11,10,484},{11,11,779},{12,11,167},{ 12,11,411},{14,11,14},{14,11,136},{15,11,72},{16,11,17},{144,11,72},{4,0,1021},{ 6,0,2037},{133,11,907},{7,0,373},{8,0,335},{8,0,596},{9,0,488},{6,10,1700},{7,10 ,293},{7,10,382},{7,10,1026},{7,10,1087},{7,10,2027},{8,10,252},{8,10,727},{8,10 ,729},{9,10,30},{9,10,199},{9,10,231},{9,10,251},{9,10,334},{9,10,361},{9,10,712 },{10,10,55},{10,10,60},{10,10,232},{10,10,332},{10,10,384},{10,10,396},{10,10, 504},{10,10,542},{10,10,652},{11,10,20},{11,10,48},{11,10,207},{11,10,291},{11, 10,298},{11,10,342},{11,10,365},{11,10,394},{11,10,620},{11,10,705},{11,10,1017} ,{12,10,123},{12,10,340},{12,10,406},{12,10,643},{13,10,61},{13,10,269},{13,10, 311},{13,10,319},{13,10,486},{14,10,234},{15,10,62},{15,10,85},{16,10,71},{18,10 ,119},{148,10,105},{150,0,37},{4,11,208},{5,11,106},{6,11,531},{8,11,408},{9,11, 188},{138,11,572},{132,0,564},{6,0,513},{135,0,1052},{132,0,825},{9,0,899},{140, 11,441},{134,0,778},{133,11,379},{7,0,1417},{12,0,382},{17,0,48},{152,0,12},{132 ,11,241},{7,0,1116},{6,10,379},{7,10,270},{8,10,176},{8,10,183},{9,10,432},{9,10 ,661},{12,10,247},{12,10,617},{146,10,125},{5,10,792},{133,10,900},{6,0,545},{7, 0,565},{7,0,1669},{10,0,114},{11,0,642},{140,0,618},{133,0,5},{138,11,7},{132,11 ,259},{135,0,192},{134,0,701},{136,0,763},{135,10,1979},{4,10,901},{133,10,776}, {10,0,755},{147,0,29},{133,0,759},{4,11,173},{5,11,312},{5,11,512},{135,11,1285} ,{7,11,1603},{7,11,1691},{9,11,464},{11,11,195},{12,11,279},{12,11,448},{14,11, 11},{147,11,102},{7,0,370},{7,0,1007},{7,0,1177},{135,0,1565},{135,0,1237},{4,0, 87},{5,0,250},{141,0,298},{4,11,452},{5,11,583},{5,11,817},{6,11,433},{7,11,593} ,{7,11,720},{7,11,1378},{8,11,161},{9,11,284},{10,11,313},{139,11,886},{4,11,547 },{135,11,1409},{136,11,722},{4,10,37},{5,10,334},{135,10,1253},{132,10,508},{12 ,0,107},{146,0,31},{8,11,420},{139,11,193},{135,0,814},{135,11,409},{140,0,991}, {4,0,57},{7,0,1195},{7,0,1438},{7,0,1548},{7,0,1835},{7,0,1904},{9,0,757},{10,0, 604},{139,0,519},{132,0,540},{138,11,308},{132,10,533},{136,0,608},{144,11,65},{ 4,0,1014},{134,0,2029},{4,0,209},{7,0,902},{5,11,1002},{136,11,745},{134,0,2030} ,{6,0,303},{7,0,335},{7,0,1437},{7,0,1668},{8,0,553},{8,0,652},{8,0,656},{9,0, 558},{11,0,743},{149,0,18},{5,11,575},{6,11,354},{135,11,701},{4,11,239},{6,11, 477},{7,11,1607},{11,11,68},{139,11,617},{132,0,559},{8,0,527},{18,0,60},{147,0, 24},{133,10,920},{138,0,511},{133,0,1017},{133,0,675},{138,10,391},{11,0,156},{ 135,10,1952},{138,11,369},{132,11,367},{133,0,709},{6,0,698},{134,0,887},{142,10 ,126},{134,0,1745},{132,10,483},{13,11,299},{142,11,75},{133,0,714},{7,0,8},{136 ,0,206},{138,10,480},{4,11,694},{9,10,495},{146,10,104},{7,11,1248},{11,11,621}, {139,11,702},{140,11,687},{132,0,776},{139,10,1009},{135,0,1272},{134,0,1059},{8 ,10,653},{13,10,93},{147,10,14},{135,11,213},{136,0,406},{133,10,172},{132,0,947 },{8,0,175},{10,0,168},{138,0,573},{132,0,870},{6,0,1567},{151,11,28},{134,11, 472},{5,10,260},{136,11,132},{4,11,751},{11,11,390},{140,11,32},{4,11,409},{133, 11,78},{12,0,554},{6,11,473},{145,11,105},{133,0,784},{8,0,908},{136,11,306},{ 139,0,882},{6,0,358},{7,0,1393},{8,0,396},{10,0,263},{14,0,154},{16,0,48},{17,0, 8},{7,11,1759},{8,11,396},{10,11,263},{14,11,154},{16,11,48},{145,11,8},{13,11, 163},{13,11,180},{18,11,78},{148,11,35},{14,0,32},{18,0,85},{20,0,2},{152,0,16}, {7,0,228},{10,0,770},{8,10,167},{8,10,375},{9,10,82},{9,10,561},{138,10,620},{ 132,0,845},{9,0,14},{9,0,441},{10,0,306},{139,0,9},{11,0,966},{12,0,287},{13,0, 342},{13,0,402},{15,0,110},{15,0,163},{8,10,194},{136,10,756},{134,0,1578},{4,0, 967},{6,0,1820},{6,0,1847},{140,0,716},{136,0,594},{7,0,1428},{7,0,1640},{7,0, 1867},{9,0,169},{9,0,182},{9,0,367},{9,0,478},{9,0,506},{9,0,551},{9,0,557},{9,0 ,648},{9,0,697},{9,0,705},{9,0,725},{9,0,787},{9,0,794},{10,0,198},{10,0,214},{ 10,0,267},{10,0,275},{10,0,456},{10,0,551},{10,0,561},{10,0,613},{10,0,627},{10, 0,668},{10,0,675},{10,0,691},{10,0,695},{10,0,707},{10,0,715},{11,0,183},{11,0, 201},{11,0,244},{11,0,262},{11,0,352},{11,0,439},{11,0,493},{11,0,572},{11,0,591 },{11,0,608},{11,0,611},{11,0,646},{11,0,674},{11,0,711},{11,0,751},{11,0,761},{ 11,0,776},{11,0,785},{11,0,850},{11,0,853},{11,0,862},{11,0,865},{11,0,868},{11, 0,875},{11,0,898},{11,0,902},{11,0,903},{11,0,910},{11,0,932},{11,0,942},{11,0, 957},{11,0,967},{11,0,972},{12,0,148},{12,0,195},{12,0,220},{12,0,237},{12,0,318 },{12,0,339},{12,0,393},{12,0,445},{12,0,450},{12,0,474},{12,0,505},{12,0,509},{ 12,0,533},{12,0,591},{12,0,594},{12,0,597},{12,0,621},{12,0,633},{12,0,642},{13, 0,59},{13,0,60},{13,0,145},{13,0,239},{13,0,250},{13,0,329},{13,0,344},{13,0,365 },{13,0,372},{13,0,387},{13,0,403},{13,0,414},{13,0,456},{13,0,470},{13,0,478},{ 13,0,483},{13,0,489},{14,0,55},{14,0,57},{14,0,81},{14,0,90},{14,0,148},{14,0, 239},{14,0,266},{14,0,321},{14,0,326},{14,0,327},{14,0,330},{14,0,347},{14,0,355 },{14,0,401},{14,0,404},{14,0,411},{14,0,414},{14,0,416},{14,0,420},{15,0,61},{ 15,0,74},{15,0,87},{15,0,88},{15,0,94},{15,0,96},{15,0,116},{15,0,149},{15,0,154 },{16,0,50},{16,0,63},{16,0,73},{17,0,2},{17,0,66},{17,0,92},{17,0,103},{17,0, 112},{17,0,120},{18,0,50},{18,0,54},{18,0,82},{18,0,86},{18,0,90},{18,0,111},{18 ,0,115},{18,0,156},{19,0,40},{19,0,79},{20,0,78},{21,0,22},{135,11,883},{5,0,161 },{135,0,839},{4,0,782},{13,11,293},{142,11,56},{133,11,617},{139,11,50},{135,10 ,22},{145,0,64},{5,10,639},{7,10,1249},{139,10,896},{138,0,998},{135,11,2042},{4 ,11,546},{142,11,233},{6,0,1043},{134,0,1574},{134,0,1496},{4,10,102},{7,10,815} ,{7,10,1699},{139,10,964},{12,0,781},{142,0,461},{4,11,313},{133,11,577},{6,0, 639},{6,0,1114},{137,0,817},{8,11,184},{141,11,433},{7,0,1814},{135,11,935},{10, 0,997},{140,0,958},{4,0,812},{137,11,625},{132,10,899},{136,10,795},{5,11,886},{ 6,11,46},{6,11,1790},{7,11,14},{7,11,732},{7,11,1654},{8,11,95},{8,11,327},{8,11 ,616},{10,11,598},{10,11,769},{11,11,134},{11,11,747},{12,11,378},{142,11,97},{ 136,0,139},{6,10,52},{9,10,104},{9,10,559},{12,10,308},{147,10,87},{133,11,1021} ,{132,10,604},{132,10,301},{136,10,779},{7,0,643},{136,0,236},{132,11,153},{134, 0,1172},{147,10,32},{133,11,798},{6,0,1338},{132,11,587},{6,11,598},{7,11,42},{8 ,11,695},{10,11,212},{11,11,158},{14,11,196},{145,11,85},{135,10,508},{5,11,957} ,{5,11,1008},{135,11,249},{4,11,129},{135,11,465},{5,0,54},{7,11,470},{7,11,1057 },{7,11,1201},{9,11,755},{11,11,906},{140,11,527},{7,11,908},{146,11,7},{5,11, 148},{136,11,450},{144,11,1},{4,0,256},{135,0,1488},{9,0,351},{6,10,310},{7,10, 1849},{8,10,72},{8,10,272},{8,10,431},{9,10,12},{10,10,563},{10,10,630},{10,10, 796},{10,10,810},{11,10,367},{11,10,599},{11,10,686},{140,10,672},{6,0,1885},{6, 0,1898},{6,0,1899},{140,0,955},{4,0,714},{133,0,469},{6,0,1270},{134,0,1456},{ 132,0,744},{6,0,313},{7,10,537},{8,10,64},{9,10,127},{10,10,496},{12,10,510},{ 141,10,384},{4,11,217},{4,10,244},{5,11,710},{7,10,233},{7,11,1926},{9,11,428},{ 9,11,708},{10,11,254},{10,11,296},{10,11,720},{11,11,109},{11,11,255},{12,11,165 },{12,11,315},{13,11,107},{13,11,203},{14,11,54},{14,11,99},{14,11,114},{14,11, 388},{16,11,85},{17,11,9},{17,11,33},{20,11,25},{20,11,28},{20,11,29},{21,11,9}, {21,11,10},{21,11,34},{150,11,17},{138,0,402},{7,0,969},{146,0,55},{8,0,50},{137 ,0,624},{134,0,1355},{132,0,572},{134,10,1650},{10,10,702},{139,10,245},{10,0, 847},{142,0,445},{6,0,43},{7,0,38},{8,0,248},{138,0,513},{133,0,369},{137,10,338 },{133,0,766},{133,0,363},{133,10,896},{8,11,392},{11,11,54},{13,11,173},{13,11, 294},{148,11,7},{134,0,678},{7,11,1230},{136,11,531},{6,0,258},{140,0,409},{5,0, 249},{148,0,82},{7,10,1117},{136,10,539},{5,0,393},{6,0,378},{7,0,1981},{9,0,32} ,{9,0,591},{10,0,685},{10,0,741},{142,0,382},{133,0,788},{134,0,1281},{134,0, 1295},{7,0,1968},{141,0,509},{4,0,61},{5,0,58},{5,0,171},{5,0,683},{6,0,291},{6, 0,566},{7,0,1650},{11,0,523},{12,0,273},{12,0,303},{15,0,39},{143,0,111},{6,0, 706},{134,0,1283},{134,0,589},{135,11,1433},{133,11,435},{7,0,1059},{13,0,54},{5 ,10,4},{5,10,810},{6,10,13},{6,10,538},{6,10,1690},{6,10,1726},{7,10,1819},{8,10 ,148},{8,10,696},{8,10,791},{12,10,125},{143,10,9},{135,10,1268},{5,11,85},{6,11 ,419},{7,11,134},{7,11,305},{7,11,361},{7,11,1337},{8,11,71},{140,11,519},{137,0 ,824},{140,11,688},{5,11,691},{7,11,345},{7,10,1385},{9,11,94},{11,10,582},{11, 10,650},{11,10,901},{11,10,949},{12,11,169},{12,10,232},{12,10,236},{13,10,413}, {13,10,501},{146,10,116},{4,0,917},{133,0,1005},{7,0,1598},{5,11,183},{6,11,582} ,{9,11,344},{10,11,679},{140,11,435},{4,10,925},{5,10,803},{8,10,698},{138,10, 828},{132,0,919},{135,11,511},{139,10,992},{4,0,255},{5,0,302},{6,0,132},{7,0, 128},{7,0,283},{7,0,1299},{10,0,52},{10,0,514},{11,0,925},{13,0,92},{142,0,309}, {134,0,1369},{135,10,1847},{134,0,328},{7,11,1993},{136,11,684},{133,10,383},{ 137,0,173},{134,11,583},{134,0,1411},{19,0,65},{5,11,704},{8,11,357},{10,11,745} ,{14,11,426},{17,11,94},{147,11,57},{9,10,660},{138,10,347},{4,11,179},{5,11,198 },{133,11,697},{7,11,347},{7,11,971},{8,11,181},{138,11,711},{141,0,442},{11,0, 842},{11,0,924},{13,0,317},{13,0,370},{13,0,469},{13,0,471},{14,0,397},{18,0,69} ,{18,0,145},{7,10,572},{9,10,592},{11,10,680},{12,10,356},{140,10,550},{14,11,19 },{14,11,28},{144,11,29},{136,0,534},{4,11,243},{5,11,203},{7,11,19},{7,11,71},{ 7,11,113},{10,11,405},{11,11,357},{142,11,240},{6,0,210},{10,0,845},{138,0,862}, {7,11,1351},{9,11,581},{10,11,639},{11,11,453},{140,11,584},{7,11,1450},{139,11, 99},{10,0,892},{12,0,719},{144,0,105},{4,0,284},{6,0,223},{134,11,492},{5,11,134 },{6,11,408},{6,11,495},{135,11,1593},{136,0,529},{137,0,807},{4,0,218},{7,0,526 },{143,0,137},{6,0,1444},{142,11,4},{132,11,665},{4,0,270},{5,0,192},{6,0,332},{ 7,0,1322},{4,11,248},{7,11,137},{137,11,349},{140,0,661},{7,0,1517},{11,0,597},{ 14,0,76},{14,0,335},{20,0,33},{7,10,748},{139,10,700},{5,11,371},{135,11,563},{ 146,11,57},{133,10,127},{133,0,418},{4,11,374},{7,11,547},{7,11,1700},{7,11,1833 },{139,11,858},{6,10,198},{140,10,83},{7,11,1812},{13,11,259},{13,11,356},{14,11 ,242},{147,11,114},{7,0,379},{8,0,481},{9,0,377},{5,10,276},{6,10,55},{135,10, 1369},{138,11,286},{5,0,1003},{6,0,149},{6,10,1752},{136,10,726},{8,0,262},{9,0, 627},{10,0,18},{11,0,214},{11,0,404},{11,0,457},{11,0,780},{11,0,913},{13,0,401} ,{14,0,200},{6,11,1647},{7,11,1552},{7,11,2010},{9,11,494},{137,11,509},{135,0, 742},{136,0,304},{132,0,142},{133,10,764},{6,10,309},{7,10,331},{138,10,550},{ 135,10,1062},{6,11,123},{7,11,214},{7,10,986},{9,11,728},{10,11,157},{11,11,346} ,{11,11,662},{143,11,106},{135,10,1573},{7,0,925},{137,0,799},{4,0,471},{5,0,51} ,{6,0,602},{8,0,484},{138,0,195},{136,0,688},{132,0,697},{6,0,1169},{6,0,1241},{ 6,10,194},{7,10,133},{10,10,493},{10,10,570},{139,10,664},{140,0,751},{7,0,929}, {10,0,452},{11,0,878},{16,0,33},{5,10,24},{5,10,569},{6,10,3},{6,10,119},{6,10, 143},{6,10,440},{7,10,599},{7,10,1686},{7,10,1854},{8,10,424},{9,10,43},{9,10, 584},{9,10,760},{10,10,328},{11,10,159},{11,10,253},{12,10,487},{140,10,531},{4, 11,707},{13,11,106},{18,11,49},{147,11,41},{5,0,221},{5,11,588},{134,11,393},{ 134,0,1437},{6,11,211},{7,11,1690},{11,11,486},{140,11,369},{5,10,14},{5,10,892} ,{6,10,283},{7,10,234},{136,10,537},{4,0,988},{136,0,955},{135,0,1251},{4,10,126 },{8,10,635},{147,10,34},{4,10,316},{135,10,1561},{137,10,861},{4,10,64},{5,10, 352},{5,10,720},{6,10,368},{139,10,359},{134,0,192},{4,0,132},{5,0,69},{135,0, 1242},{7,10,1577},{10,10,304},{10,10,549},{12,10,365},{13,10,220},{13,10,240},{ 142,10,33},{4,0,111},{7,0,865},{134,11,219},{5,11,582},{6,11,1646},{7,11,99},{7, 11,1962},{7,11,1986},{8,11,515},{8,11,773},{9,11,23},{9,11,491},{12,11,620},{14, 11,52},{145,11,50},{132,0,767},{7,11,568},{148,11,21},{6,0,42},{7,0,1416},{7,0, 2005},{8,0,131},{8,0,466},{9,0,672},{13,0,252},{20,0,103},{133,11,851},{135,0, 1050},{6,10,175},{137,10,289},{5,10,432},{133,10,913},{6,0,44},{136,0,368},{135, 11,784},{132,0,570},{133,0,120},{139,10,595},{140,0,29},{6,0,227},{135,0,1589},{ 4,11,98},{7,11,1365},{9,11,422},{9,11,670},{10,11,775},{11,11,210},{13,11,26},{ 13,11,457},{141,11,476},{140,10,80},{5,10,931},{134,10,1698},{133,0,522},{134,0, 1120},{135,0,1529},{12,0,739},{14,0,448},{142,0,467},{11,10,526},{11,10,939},{ 141,10,290},{5,10,774},{6,10,1637},{6,10,1686},{134,10,1751},{6,0,1667},{135,0, 2036},{7,10,1167},{11,10,934},{13,10,391},{145,10,76},{137,11,147},{6,10,260},{7 ,10,1484},{11,11,821},{12,11,110},{12,11,153},{18,11,41},{150,11,19},{6,0,511},{ 12,0,132},{134,10,573},{5,0,568},{6,0,138},{135,0,1293},{132,0,1020},{8,0,258},{ 9,0,208},{137,0,359},{4,0,565},{8,0,23},{136,0,827},{134,0,344},{4,0,922},{5,0, 1023},{13,11,477},{14,11,120},{148,11,61},{134,0,240},{5,11,209},{6,11,30},{11, 11,56},{139,11,305},{6,0,171},{7,0,1002},{7,0,1324},{9,0,415},{14,0,230},{18,0, 68},{4,10,292},{4,10,736},{5,10,871},{6,10,1689},{7,10,1944},{137,10,580},{9,11, 635},{139,11,559},{4,11,150},{5,11,303},{134,11,327},{6,10,63},{135,10,920},{133 ,10,793},{8,11,192},{10,11,78},{10,11,555},{11,11,308},{13,11,359},{147,11,95},{ 135,11,786},{135,11,1712},{136,0,402},{6,0,754},{6,11,1638},{7,11,79},{7,11,496} ,{9,11,138},{10,11,336},{11,11,12},{12,11,412},{12,11,440},{142,11,305},{4,0,716 },{141,0,31},{133,0,982},{8,0,691},{8,0,731},{5,10,67},{6,10,62},{6,10,374},{135 ,10,1391},{9,10,790},{140,10,47},{139,11,556},{151,11,1},{7,11,204},{7,11,415},{ 8,11,42},{10,11,85},{11,11,33},{11,11,564},{12,11,571},{149,11,1},{8,0,888},{7, 11,610},{135,11,1501},{4,10,391},{135,10,1169},{5,0,847},{9,0,840},{138,0,803},{ 137,0,823},{134,0,785},{8,0,152},{9,0,53},{9,0,268},{9,0,901},{10,0,518},{10,0, 829},{11,0,188},{13,0,74},{14,0,46},{15,0,17},{15,0,33},{17,0,40},{18,0,36},{19, 0,20},{22,0,1},{152,0,2},{4,11,3},{5,11,247},{5,11,644},{7,11,744},{7,11,1207},{ 7,11,1225},{7,11,1909},{146,11,147},{136,0,532},{135,0,681},{132,10,271},{140,0, 314},{140,0,677},{4,0,684},{136,0,384},{5,11,285},{9,11,67},{13,11,473},{143,11, 82},{4,10,253},{5,10,544},{7,10,300},{137,10,340},{7,0,110},{7,0,447},{8,0,290}, {8,0,591},{9,0,382},{9,0,649},{11,0,71},{11,0,155},{11,0,313},{12,0,5},{13,0,325 },{142,0,287},{134,0,1818},{136,0,1007},{138,0,321},{7,0,360},{7,0,425},{9,0,66} ,{9,0,278},{138,0,644},{133,10,818},{5,0,385},{5,10,541},{6,10,94},{6,10,499},{7 ,10,230},{139,10,321},{4,10,920},{5,10,25},{5,10,790},{6,10,457},{7,10,853},{136 ,10,788},{4,0,900},{133,0,861},{5,0,254},{7,0,985},{136,0,73},{7,0,1959},{136,0, 683},{134,10,1765},{133,10,822},{132,10,634},{4,11,29},{6,11,532},{7,11,1628},{7 ,11,1648},{9,11,303},{9,11,350},{10,11,433},{11,11,97},{11,11,557},{11,11,745},{ 12,11,289},{12,11,335},{12,11,348},{12,11,606},{13,11,116},{13,11,233},{13,11, 466},{14,11,181},{14,11,209},{14,11,232},{14,11,236},{14,11,300},{16,11,41},{148 ,11,97},{19,0,86},{6,10,36},{7,10,658},{136,10,454},{135,11,1692},{132,0,725},{5 ,11,501},{7,11,1704},{9,11,553},{11,11,520},{12,11,557},{141,11,249},{134,0,196} ,{133,0,831},{136,0,723},{7,0,1897},{13,0,80},{13,0,437},{145,0,74},{4,0,992},{6 ,0,627},{136,0,994},{135,11,1294},{132,10,104},{5,0,848},{6,0,66},{136,0,764},{4 ,0,36},{7,0,1387},{10,0,205},{139,0,755},{6,0,1046},{134,0,1485},{134,0,950},{ 132,0,887},{14,0,450},{148,0,111},{7,0,620},{7,0,831},{9,10,542},{9,10,566},{138 ,10,728},{6,0,165},{138,0,388},{139,10,263},{4,0,719},{135,0,155},{138,10,468},{ 6,11,453},{144,11,36},{134,11,129},{5,0,533},{7,0,755},{138,0,780},{134,0,1465}, {4,0,353},{6,0,146},{6,0,1789},{7,0,427},{7,0,990},{7,0,1348},{9,0,665},{9,0,898 },{11,0,893},{142,0,212},{7,10,87},{142,10,288},{4,0,45},{135,0,1257},{12,0,7},{ 7,10,988},{7,10,1939},{9,10,64},{9,10,502},{12,10,34},{13,10,12},{13,10,234},{ 147,10,77},{4,0,607},{5,11,60},{6,11,504},{7,11,614},{7,11,1155},{140,11,0},{135 ,10,141},{8,11,198},{11,11,29},{140,11,534},{140,0,65},{136,0,816},{132,10,619}, {139,0,88},{5,10,246},{8,10,189},{9,10,355},{9,10,512},{10,10,124},{10,10,453},{ 11,10,143},{11,10,416},{11,10,859},{141,10,341},{4,11,379},{135,11,1397},{4,0, 600},{137,0,621},{133,0,367},{134,0,561},{6,0,559},{134,0,1691},{6,0,585},{134, 11,585},{135,11,1228},{4,11,118},{5,10,678},{6,11,274},{6,11,361},{7,11,75},{141 ,11,441},{135,11,1818},{137,11,841},{5,0,573},{6,0,287},{7,10,862},{7,10,1886},{ 138,10,179},{132,10,517},{140,11,693},{5,11,314},{6,11,221},{7,11,419},{10,11, 650},{11,11,396},{12,11,156},{13,11,369},{14,11,333},{145,11,47},{140,10,540},{ 136,10,667},{11,10,403},{146,10,83},{6,0,672},{133,10,761},{9,0,157},{10,10,131} ,{140,10,72},{7,0,714},{134,11,460},{134,0,456},{133,0,925},{5,11,682},{135,11, 1887},{136,11,510},{136,11,475},{133,11,1016},{9,0,19},{7,11,602},{8,11,179},{10 ,11,781},{140,11,126},{6,11,329},{138,11,111},{6,0,822},{134,0,1473},{144,11,86} ,{11,0,113},{139,11,113},{5,11,821},{134,11,1687},{133,10,449},{7,0,463},{17,0, 69},{136,10,103},{7,10,2028},{138,10,641},{6,0,193},{7,0,240},{7,0,1682},{10,0, 51},{10,0,640},{11,0,410},{13,0,82},{14,0,247},{14,0,331},{142,0,377},{6,0,471}, {11,0,411},{142,0,2},{5,11,71},{7,11,1407},{9,11,388},{9,11,704},{10,11,261},{10 ,11,619},{11,11,547},{11,11,619},{143,11,157},{136,0,633},{135,0,1148},{6,0,554} ,{7,0,1392},{12,0,129},{7,10,1274},{7,10,1386},{7,11,2008},{9,11,337},{10,11,517 },{146,10,87},{7,0,803},{8,0,542},{6,10,187},{7,10,1203},{8,10,380},{14,10,117}, {149,10,28},{6,10,297},{7,10,793},{139,10,938},{8,0,438},{11,0,363},{7,10,464},{ 11,10,105},{12,10,231},{14,10,386},{15,10,102},{148,10,75},{5,11,16},{6,11,86},{ 6,11,603},{7,11,292},{7,11,561},{8,11,257},{8,11,382},{9,11,721},{9,11,778},{11, 11,581},{140,11,466},{6,0,717},{4,11,486},{133,11,491},{132,0,875},{132,11,72},{ 6,11,265},{135,11,847},{4,0,237},{135,0,514},{6,0,392},{7,0,65},{135,0,2019},{ 140,11,261},{135,11,922},{137,11,404},{12,0,563},{14,0,101},{18,0,129},{7,10, 1010},{11,10,733},{11,10,759},{13,10,34},{146,10,45},{7,10,1656},{9,10,369},{10, 10,338},{10,10,490},{11,10,154},{11,10,545},{11,10,775},{13,10,77},{141,10,274}, {4,0,444},{10,0,146},{140,0,9},{139,11,163},{7,0,1260},{135,0,1790},{9,0,222},{ 10,0,43},{139,0,900},{137,11,234},{138,0,971},{137,0,761},{134,0,699},{136,11, 434},{6,0,1116},{7,0,1366},{5,10,20},{6,11,197},{6,10,298},{7,10,659},{8,11,205} ,{137,10,219},{132,11,490},{11,11,820},{150,11,51},{7,10,1440},{11,10,854},{11, 10,872},{11,10,921},{12,10,551},{13,10,472},{142,10,367},{140,11,13},{132,0,829} ,{12,0,242},{132,10,439},{136,10,669},{6,0,593},{6,11,452},{7,11,312},{138,11, 219},{4,11,333},{9,11,176},{12,11,353},{141,11,187},{7,0,36},{8,0,201},{136,0, 605},{140,0,224},{132,10,233},{134,0,1430},{134,0,1806},{4,0,523},{133,0,638},{6 ,0,1889},{9,0,958},{9,0,971},{9,0,976},{12,0,796},{12,0,799},{12,0,808},{12,0, 835},{12,0,836},{12,0,914},{12,0,946},{15,0,216},{15,0,232},{18,0,183},{18,0,187 },{18,0,194},{18,0,212},{18,0,232},{149,0,49},{132,10,482},{6,0,827},{134,0,1434 },{135,10,346},{134,0,2043},{6,0,242},{7,0,227},{7,0,1581},{8,0,104},{9,0,113},{ 9,0,220},{9,0,427},{10,0,136},{10,0,239},{11,0,579},{11,0,1023},{13,0,4},{13,0, 204},{13,0,316},{148,0,86},{134,11,1685},{7,0,148},{8,0,284},{141,0,63},{142,0, 10},{135,11,584},{134,0,1249},{7,0,861},{135,10,334},{5,10,795},{6,10,1741},{137 ,11,70},{132,0,807},{7,11,135},{8,11,7},{8,11,62},{9,11,243},{10,11,658},{10,11, 697},{11,11,456},{139,11,756},{9,11,395},{138,11,79},{137,11,108},{147,0,94},{ 136,0,494},{135,11,631},{135,10,622},{7,0,1510},{135,10,1750},{4,10,203},{135,10 ,1936},{7,11,406},{7,11,459},{8,11,606},{139,11,726},{7,0,1306},{8,0,505},{9,0, 482},{10,0,126},{11,0,225},{12,0,347},{12,0,449},{13,0,19},{14,0,218},{142,0,435 },{5,0,268},{10,0,764},{12,0,120},{13,0,39},{145,0,127},{142,11,68},{11,10,678}, {140,10,307},{12,11,268},{12,11,640},{142,11,119},{135,10,2044},{133,11,612},{4, 11,372},{7,11,482},{8,11,158},{9,11,602},{9,11,615},{10,11,245},{10,11,678},{10, 11,744},{11,11,248},{139,11,806},{7,10,311},{9,10,308},{140,10,255},{4,0,384},{ 135,0,1022},{5,11,854},{135,11,1991},{135,10,1266},{4,10,400},{5,10,267},{135,10 ,232},{135,0,1703},{9,0,159},{11,0,661},{140,0,603},{4,0,964},{14,0,438},{14,0, 444},{14,0,456},{22,0,60},{22,0,63},{9,11,106},{9,11,163},{9,11,296},{10,11,167} ,{10,11,172},{10,11,777},{139,11,16},{136,0,583},{132,0,515},{8,0,632},{8,0,697} ,{137,0,854},{5,11,195},{135,11,1685},{6,0,1123},{134,0,1365},{134,11,328},{7,11 ,1997},{8,11,730},{139,11,1006},{4,0,136},{133,0,551},{134,0,1782},{7,0,1287},{9 ,0,44},{10,0,552},{10,0,642},{11,0,839},{12,0,274},{12,0,275},{12,0,372},{13,0, 91},{142,0,125},{5,11,751},{11,11,797},{140,11,203},{133,0,732},{7,0,679},{8,0, 313},{4,10,100},{135,11,821},{10,0,361},{142,0,316},{134,0,595},{6,0,147},{7,0, 886},{9,0,753},{138,0,268},{5,10,362},{5,10,443},{6,10,318},{7,10,1019},{139,10, 623},{5,10,463},{136,10,296},{4,10,454},{5,11,950},{5,11,994},{134,11,351},{138, 0,137},{5,10,48},{5,10,404},{6,10,557},{7,10,458},{8,10,597},{10,10,455},{10,10, 606},{11,10,49},{11,10,548},{12,10,476},{13,10,18},{141,10,450},{133,0,414},{135 ,0,1762},{5,11,421},{135,11,47},{5,10,442},{135,10,1984},{134,0,599},{134,0,1749 },{134,0,1627},{4,0,488},{132,11,350},{137,11,751},{132,0,83},{140,0,676},{133, 11,967},{7,0,1639},{5,10,55},{140,10,161},{4,11,473},{7,11,623},{8,11,808},{9,11 ,871},{9,11,893},{11,11,38},{11,11,431},{12,11,112},{12,11,217},{12,11,243},{12, 11,562},{12,11,683},{13,11,141},{13,11,197},{13,11,227},{13,11,406},{13,11,487}, {14,11,156},{14,11,203},{14,11,224},{14,11,256},{18,11,58},{150,11,0},{133,10, 450},{7,11,736},{139,11,264},{134,0,278},{4,11,222},{7,11,286},{136,11,629},{135 ,10,869},{140,0,97},{144,0,14},{134,0,1085},{4,10,213},{7,10,223},{136,10,80},{7 ,0,388},{7,0,644},{139,0,781},{132,0,849},{7,0,229},{8,0,59},{9,0,190},{10,0,378 },{140,0,191},{7,10,381},{7,10,806},{7,10,820},{8,10,354},{8,10,437},{8,10,787}, {9,10,657},{10,10,58},{10,10,339},{10,10,749},{11,10,914},{12,10,162},{13,10,75} ,{14,10,106},{14,10,198},{14,10,320},{14,10,413},{146,10,43},{141,11,306},{136, 10,747},{134,0,1115},{16,0,94},{16,0,108},{136,11,146},{6,0,700},{6,0,817},{134, 0,1002},{133,10,692},{4,11,465},{135,11,1663},{134,10,191},{6,0,1414},{135,11, 913},{132,0,660},{7,0,1035},{138,0,737},{6,10,162},{7,10,1960},{136,10,831},{132 ,10,706},{7,0,690},{9,0,217},{9,0,587},{140,0,521},{138,10,426},{135,10,1235},{6 ,11,82},{7,11,138},{7,11,517},{9,11,673},{139,11,238},{138,0,272},{5,11,495},{7, 11,834},{9,11,733},{139,11,378},{134,0,1744},{132,0,1011},{7,11,828},{142,11,116 },{4,0,733},{9,0,194},{10,0,92},{11,0,198},{12,0,84},{13,0,128},{133,11,559},{10 ,0,57},{10,0,277},{6,11,21},{6,11,1737},{7,11,1444},{136,11,224},{4,10,204},{137 ,10,902},{136,10,833},{11,0,348},{12,0,99},{18,0,1},{18,0,11},{19,0,4},{7,10,366 },{9,10,287},{12,10,199},{12,10,556},{140,10,577},{6,0,1981},{136,0,936},{21,0, 33},{150,0,40},{5,11,519},{138,11,204},{5,10,356},{135,10,224},{134,0,775},{135, 0,306},{7,10,630},{9,10,567},{11,10,150},{11,10,444},{141,10,119},{5,0,979},{134 ,10,539},{133,0,611},{4,11,402},{135,11,1679},{5,0,178},{7,11,2},{8,11,323},{136 ,11,479},{5,11,59},{135,11,672},{4,0,1010},{6,0,1969},{138,11,237},{133,11,412}, {146,11,34},{7,11,1740},{146,11,48},{134,0,664},{139,10,814},{4,11,85},{135,11, 549},{133,11,94},{133,11,457},{132,0,390},{134,0,1510},{4,10,235},{135,10,255},{ 4,10,194},{5,10,584},{6,11,11},{6,10,384},{7,11,187},{7,10,583},{10,10,761},{11, 10,760},{139,10,851},{4,11,522},{139,11,802},{135,0,493},{10,11,776},{13,11,345} ,{142,11,425},{146,0,37},{4,11,52},{135,11,661},{134,0,724},{134,0,829},{133,11, 520},{133,10,562},{4,11,281},{5,11,38},{7,11,194},{7,11,668},{7,11,1893},{137,11 ,397},{5,10,191},{137,10,271},{7,0,1537},{14,0,96},{143,0,73},{5,0,473},{11,0, 168},{4,10,470},{6,10,153},{7,10,1503},{7,10,1923},{10,10,701},{11,10,132},{11, 10,227},{11,10,320},{11,10,436},{11,10,525},{11,10,855},{12,10,41},{12,10,286},{ 13,10,103},{13,10,284},{14,10,255},{14,10,262},{15,10,117},{143,10,127},{133,0, 105},{5,0,438},{9,0,694},{12,0,627},{141,0,210},{133,10,327},{6,10,552},{7,10, 1754},{137,10,604},{134,0,1256},{152,0,11},{5,11,448},{11,11,98},{139,11,524},{7 ,0,1626},{5,10,80},{6,10,405},{7,10,403},{7,10,1502},{8,10,456},{9,10,487},{9,10 ,853},{9,10,889},{10,10,309},{11,10,721},{11,10,994},{12,10,430},{13,10,165},{14 ,11,16},{146,11,44},{132,0,779},{8,0,25},{138,0,826},{4,10,453},{5,10,887},{6,10 ,535},{8,10,6},{8,10,543},{136,10,826},{137,11,461},{140,11,632},{132,0,308},{ 135,0,741},{132,0,671},{7,0,150},{8,0,649},{136,0,1020},{9,0,99},{6,11,336},{8, 11,552},{9,11,285},{10,11,99},{139,11,568},{134,0,521},{5,0,339},{14,0,3},{15,0, 41},{15,0,166},{147,0,66},{6,11,423},{7,11,665},{7,11,1210},{9,11,218},{141,11, 222},{6,0,543},{5,10,101},{5,11,256},{6,10,88},{7,10,1677},{9,10,100},{10,10,677 },{14,10,169},{14,10,302},{14,10,313},{15,10,48},{143,10,84},{4,10,310},{7,10, 708},{7,10,996},{9,10,795},{10,10,390},{10,10,733},{11,10,451},{12,10,249},{14, 10,115},{14,10,286},{143,10,100},{133,10,587},{13,11,417},{14,11,129},{143,11,15 },{134,0,1358},{136,11,554},{132,10,498},{7,10,217},{8,10,140},{138,10,610},{135 ,11,989},{135,11,634},{6,0,155},{140,0,234},{135,11,462},{132,11,618},{134,0, 1628},{132,0,766},{4,11,339},{5,10,905},{135,11,259},{135,0,829},{4,11,759},{141 ,11,169},{7,0,1445},{4,10,456},{7,10,358},{7,10,1637},{8,10,643},{139,10,483},{5 ,0,486},{135,0,1349},{5,11,688},{135,11,712},{7,0,1635},{8,0,17},{10,0,217},{10, 0,295},{12,0,2},{140,11,2},{138,0,558},{150,10,56},{4,11,278},{5,11,465},{135,11 ,1367},{136,11,482},{133,10,535},{6,0,1362},{6,0,1461},{10,11,274},{10,11,625},{ 139,11,530},{5,0,599},{5,11,336},{6,11,341},{6,11,478},{6,11,1763},{136,11,386}, {7,10,1748},{137,11,151},{134,0,1376},{133,10,539},{135,11,73},{135,11,1971},{ 139,11,283},{9,0,93},{139,0,474},{6,10,91},{135,10,435},{6,0,447},{5,11,396},{ 134,11,501},{4,10,16},{5,10,316},{5,10,842},{6,10,370},{6,10,1778},{8,10,166},{ 11,10,812},{12,10,206},{12,10,351},{14,10,418},{16,10,15},{16,10,34},{18,10,3},{ 19,10,3},{19,10,7},{20,10,4},{149,10,21},{7,0,577},{7,0,1432},{9,0,475},{9,0,505 },{9,0,526},{9,0,609},{9,0,689},{9,0,726},{9,0,735},{9,0,738},{10,0,556},{10,0, 674},{10,0,684},{11,0,89},{11,0,202},{11,0,272},{11,0,380},{11,0,415},{11,0,505} ,{11,0,537},{11,0,550},{11,0,562},{11,0,640},{11,0,667},{11,0,688},{11,0,847},{ 11,0,927},{11,0,930},{11,0,940},{12,0,144},{12,0,325},{12,0,329},{12,0,389},{12, 0,403},{12,0,451},{12,0,515},{12,0,604},{12,0,616},{12,0,626},{13,0,66},{13,0, 131},{13,0,167},{13,0,236},{13,0,368},{13,0,411},{13,0,434},{13,0,453},{13,0,461 },{13,0,474},{14,0,59},{14,0,60},{14,0,139},{14,0,152},{14,0,276},{14,0,353},{14 ,0,402},{15,0,28},{15,0,81},{15,0,123},{15,0,152},{18,0,136},{148,0,88},{4,11, 929},{133,11,799},{136,11,46},{142,0,307},{4,0,609},{7,0,756},{9,0,544},{11,0, 413},{144,0,25},{10,0,687},{7,10,619},{10,10,547},{11,10,122},{140,10,601},{4,0, 930},{133,0,947},{133,0,939},{142,0,21},{4,11,892},{133,11,770},{133,0,962},{5,0 ,651},{8,0,170},{9,0,61},{9,0,63},{10,0,23},{10,0,37},{10,0,834},{11,0,4},{11,0, 187},{11,0,281},{11,0,503},{11,0,677},{12,0,96},{12,0,130},{12,0,244},{14,0,5},{ 14,0,40},{14,0,162},{14,0,202},{146,0,133},{4,0,406},{5,0,579},{12,0,492},{150,0 ,15},{135,11,158},{135,0,597},{132,0,981},{132,10,888},{4,10,149},{138,10,368},{ 132,0,545},{4,10,154},{7,10,1134},{136,10,105},{135,11,2001},{134,0,1558},{4,10, 31},{6,10,429},{7,10,962},{9,10,458},{139,10,691},{132,10,312},{135,10,1642},{6, 0,17},{6,0,1304},{7,0,16},{7,0,1001},{9,0,886},{10,0,489},{10,0,800},{11,0,782}, {12,0,320},{13,0,467},{14,0,145},{14,0,387},{143,0,119},{135,0,1982},{17,0,17},{ 7,11,1461},{140,11,91},{4,10,236},{132,11,602},{138,0,907},{136,0,110},{7,0,272} ,{19,0,53},{5,10,836},{5,10,857},{134,10,1680},{5,0,458},{7,11,1218},{136,11,303 },{7,0,1983},{8,0,0},{8,0,171},{9,0,120},{9,0,732},{10,0,473},{11,0,656},{11,0, 998},{18,0,0},{18,0,2},{19,0,21},{10,10,68},{139,10,494},{137,11,662},{4,11,13}, {5,11,567},{7,11,1498},{9,11,124},{11,11,521},{140,11,405},{4,10,81},{139,10,867 },{135,11,1006},{7,11,800},{7,11,1783},{138,11,12},{9,0,295},{10,0,443},{5,10, 282},{8,10,650},{137,10,907},{132,11,735},{4,11,170},{4,10,775},{135,11,323},{6, 0,1844},{10,0,924},{11,11,844},{12,11,104},{140,11,625},{5,11,304},{7,11,1403},{ 140,11,498},{134,0,1232},{4,0,519},{10,0,70},{12,0,26},{14,0,17},{14,0,178},{15, 0,34},{149,0,12},{132,0,993},{4,11,148},{133,11,742},{6,0,31},{7,0,491},{7,0,530 },{8,0,592},{11,0,53},{11,0,779},{12,0,167},{12,0,411},{14,0,14},{14,0,136},{15, 0,72},{16,0,17},{144,0,72},{133,0,907},{134,0,733},{133,11,111},{4,10,71},{5,10, 376},{7,10,119},{138,10,665},{136,0,55},{8,0,430},{136,11,430},{4,0,208},{5,0, 106},{6,0,531},{8,0,408},{9,0,188},{138,0,572},{12,0,56},{11,10,827},{14,10,34}, {143,10,148},{134,0,1693},{133,11,444},{132,10,479},{140,0,441},{9,0,449},{10,0, 192},{138,0,740},{134,0,928},{4,0,241},{7,10,607},{136,10,99},{8,11,123},{15,11, 6},{144,11,7},{6,11,285},{8,11,654},{11,11,749},{12,11,190},{12,11,327},{13,11, 120},{13,11,121},{13,11,327},{15,11,47},{146,11,40},{4,10,41},{5,10,74},{7,10, 1627},{11,10,871},{140,10,619},{7,0,1525},{11,10,329},{11,10,965},{12,10,241},{ 14,10,354},{15,10,22},{148,10,63},{132,0,259},{135,11,183},{9,10,209},{137,10, 300},{5,11,937},{135,11,100},{133,10,98},{4,0,173},{5,0,312},{5,0,512},{135,0, 1285},{141,0,185},{7,0,1603},{7,0,1691},{9,0,464},{11,0,195},{12,0,279},{12,0, 448},{14,0,11},{147,0,102},{135,0,1113},{133,10,984},{4,0,452},{5,0,583},{135,0, 720},{4,0,547},{5,0,817},{6,0,433},{7,0,593},{7,0,1378},{8,0,161},{9,0,284},{10, 0,313},{139,0,886},{8,0,722},{4,10,182},{6,10,205},{135,10,220},{150,0,13},{4,10 ,42},{9,10,205},{9,10,786},{138,10,659},{6,0,289},{7,0,1670},{12,0,57},{151,0,4} ,{132,10,635},{14,0,43},{146,0,21},{139,10,533},{135,0,1694},{8,0,420},{139,0, 193},{135,0,409},{132,10,371},{4,10,272},{135,10,836},{5,10,825},{134,10,1640},{ 5,11,251},{5,11,956},{8,11,268},{9,11,214},{146,11,142},{138,0,308},{6,0,1863},{ 141,11,37},{137,10,879},{7,10,317},{135,10,569},{132,11,294},{134,0,790},{5,0, 1002},{136,0,745},{5,11,346},{5,11,711},{136,11,390},{135,0,289},{5,0,504},{11,0 ,68},{137,10,307},{4,0,239},{6,0,477},{7,0,1607},{139,0,617},{149,0,13},{133,0, 609},{133,11,624},{5,11,783},{7,11,1998},{135,11,2047},{133,10,525},{132,0,367}, {132,11,594},{6,0,528},{133,10,493},{4,10,174},{135,10,911},{8,10,417},{137,10, 782},{132,0,694},{7,0,548},{137,0,58},{4,10,32},{5,10,215},{6,10,269},{7,10,1782 },{7,10,1892},{10,10,16},{11,10,822},{11,10,954},{141,10,481},{140,0,687},{7,0, 1749},{136,10,477},{132,11,569},{133,10,308},{135,10,1088},{4,0,661},{138,0,1004 },{5,11,37},{6,11,39},{6,11,451},{7,11,218},{7,11,667},{7,11,1166},{7,11,1687},{ 8,11,662},{144,11,2},{9,0,445},{12,0,53},{13,0,492},{5,10,126},{8,10,297},{9,10, 366},{140,10,374},{7,10,1551},{139,10,361},{148,0,74},{134,11,508},{135,0,213},{ 132,10,175},{132,10,685},{6,0,760},{6,0,834},{134,0,1248},{7,11,453},{7,11,635}, {7,11,796},{8,11,331},{9,11,328},{9,11,330},{9,11,865},{10,11,119},{10,11,235},{ 11,11,111},{11,11,129},{11,11,240},{12,11,31},{12,11,66},{12,11,222},{12,11,269} ,{12,11,599},{12,11,689},{13,11,186},{13,11,364},{142,11,345},{7,0,1672},{139,0, 189},{133,10,797},{133,10,565},{6,0,1548},{6,11,98},{7,11,585},{135,11,702},{9,0 ,968},{15,0,192},{149,0,56},{4,10,252},{6,11,37},{7,11,299},{7,10,1068},{7,11, 1666},{8,11,195},{8,11,316},{9,11,178},{9,11,276},{9,11,339},{9,11,536},{10,11, 102},{10,11,362},{10,10,434},{10,11,785},{11,11,55},{11,11,149},{11,10,228},{11, 10,426},{11,11,773},{13,10,231},{13,11,416},{13,11,419},{14,11,38},{14,11,41},{ 14,11,210},{18,10,106},{148,10,87},{4,0,751},{11,0,390},{140,0,32},{4,0,409},{ 133,0,78},{11,11,458},{12,11,15},{140,11,432},{7,0,1602},{10,0,257},{10,0,698},{ 11,0,544},{11,0,585},{12,0,212},{13,0,307},{5,10,231},{7,10,601},{9,10,277},{9, 10,674},{10,10,178},{10,10,418},{10,10,509},{11,10,531},{12,10,113},{12,10,475}, {13,10,99},{142,10,428},{6,0,473},{145,0,105},{6,0,1949},{15,0,156},{133,11,645} ,{7,10,1591},{144,10,43},{135,0,1779},{135,10,1683},{4,11,290},{135,11,1356},{ 134,0,763},{6,11,70},{7,11,1292},{10,11,762},{139,11,288},{142,0,29},{140,11,428 },{7,0,883},{7,11,131},{7,11,422},{8,11,210},{140,11,573},{134,0,488},{4,10,399} ,{5,10,119},{5,10,494},{7,10,751},{137,10,556},{133,0,617},{132,11,936},{139,0, 50},{7,0,1518},{139,0,694},{137,0,785},{4,0,546},{135,0,2042},{7,11,716},{13,11, 97},{141,11,251},{132,11,653},{145,0,22},{134,0,1016},{4,0,313},{133,0,577},{136 ,11,657},{8,0,184},{141,0,433},{135,0,935},{6,0,720},{9,0,114},{146,11,80},{12,0 ,186},{12,0,292},{14,0,100},{18,0,70},{7,10,594},{7,10,851},{7,10,1858},{9,10, 411},{9,10,574},{9,10,666},{9,10,737},{10,10,346},{10,10,712},{11,10,246},{11,10 ,432},{11,10,517},{11,10,647},{11,10,679},{11,10,727},{12,10,304},{12,10,305},{ 12,10,323},{12,10,483},{12,10,572},{12,10,593},{12,10,602},{13,10,95},{13,10,101 },{13,10,171},{13,10,315},{13,10,378},{13,10,425},{13,10,475},{14,10,63},{14,10, 380},{14,10,384},{15,10,133},{18,10,112},{148,10,72},{135,10,1093},{135,11,1836} ,{132,10,679},{137,10,203},{11,0,402},{12,0,109},{12,0,431},{13,0,179},{13,0,206 },{14,0,217},{16,0,3},{148,0,53},{7,11,1368},{8,11,232},{8,11,361},{10,11,682},{ 138,11,742},{137,10,714},{5,0,886},{6,0,46},{6,0,1790},{7,0,14},{7,0,732},{7,0, 1654},{8,0,95},{8,0,327},{8,0,616},{9,0,892},{10,0,598},{10,0,769},{11,0,134},{ 11,0,747},{12,0,378},{14,0,97},{137,11,534},{4,0,969},{136,10,825},{137,11,27},{ 6,0,727},{142,11,12},{133,0,1021},{134,0,1190},{134,11,1657},{5,10,143},{5,10, 769},{6,10,1760},{7,10,682},{7,10,1992},{136,10,736},{132,0,153},{135,11,127},{ 133,0,798},{132,0,587},{6,0,598},{7,0,42},{8,0,695},{10,0,212},{11,0,158},{14,0, 196},{145,0,85},{133,10,860},{6,0,1929},{134,0,1933},{5,0,957},{5,0,1008},{9,0, 577},{12,0,141},{6,10,422},{7,10,0},{7,10,1544},{8,11,364},{11,10,990},{12,10, 453},{13,10,47},{141,10,266},{134,0,1319},{4,0,129},{135,0,465},{7,0,470},{7,0, 1057},{7,0,1201},{9,0,755},{11,0,906},{140,0,527},{7,0,908},{146,0,7},{5,0,148}, {136,0,450},{5,10,515},{137,10,131},{7,10,1605},{11,10,962},{146,10,139},{132,10 ,646},{134,0,1166},{4,10,396},{7,10,728},{9,10,117},{13,10,202},{148,10,51},{6, 10,121},{6,10,124},{6,10,357},{7,10,1138},{7,10,1295},{8,10,162},{139,10,655},{ 14,0,374},{142,11,374},{138,0,253},{139,0,1003},{5,11,909},{9,11,849},{138,11, 805},{133,10,237},{7,11,525},{7,11,1579},{8,11,497},{136,11,573},{137,0,46},{132 ,0,879},{134,0,806},{135,0,1868},{6,0,1837},{134,0,1846},{6,0,730},{134,0,881},{ 7,0,965},{7,0,1460},{7,0,1604},{7,11,193},{7,11,397},{7,11,1105},{8,11,124},{8, 11,619},{9,11,305},{10,11,264},{11,11,40},{12,11,349},{13,11,134},{13,11,295},{ 14,11,155},{15,11,120},{146,11,105},{136,0,506},{143,0,10},{4,11,262},{7,11,342} ,{7,10,571},{7,10,1877},{10,10,366},{141,11,23},{133,11,641},{10,0,22},{9,10,513 },{10,10,39},{12,10,122},{140,10,187},{135,11,1431},{150,11,49},{4,11,99},{6,11, 250},{6,11,346},{8,11,127},{138,11,81},{6,0,2014},{8,0,928},{10,0,960},{10,0,979 },{140,0,996},{134,0,296},{132,11,915},{5,11,75},{9,11,517},{10,11,470},{12,11, 155},{141,11,224},{137,10,873},{4,0,854},{140,11,18},{134,0,587},{7,10,107},{7, 10,838},{8,10,550},{138,10,401},{11,0,636},{15,0,145},{17,0,34},{19,0,50},{23,0, 20},{11,10,588},{11,10,864},{11,10,968},{143,10,160},{135,11,216},{7,0,982},{10, 0,32},{143,0,56},{133,10,768},{133,11,954},{6,11,304},{7,11,1114},{8,11,418},{10 ,11,345},{11,11,341},{11,11,675},{141,11,40},{9,11,410},{139,11,425},{136,0,941} ,{5,0,435},{132,10,894},{5,0,85},{6,0,419},{7,0,134},{7,0,305},{7,0,361},{7,0, 1337},{8,0,71},{140,0,519},{140,0,688},{135,0,740},{5,0,691},{7,0,345},{9,0,94}, {140,0,169},{5,0,183},{6,0,582},{10,0,679},{140,0,435},{134,11,14},{6,0,945},{ 135,0,511},{134,11,1708},{5,11,113},{6,11,243},{7,11,1865},{11,11,161},{16,11,37 },{145,11,99},{132,11,274},{137,0,539},{7,0,1993},{8,0,684},{134,10,272},{6,0, 659},{134,0,982},{4,10,9},{5,10,128},{7,10,368},{11,10,480},{148,10,3},{134,0, 583},{132,0,803},{133,0,704},{4,0,179},{5,0,198},{133,0,697},{7,0,347},{7,0,971} ,{8,0,181},{10,0,711},{135,11,166},{136,10,682},{4,10,2},{7,10,545},{7,10,894},{ 136,11,521},{135,0,481},{132,0,243},{5,0,203},{7,0,19},{7,0,71},{7,0,113},{10,0, 405},{11,0,357},{142,0,240},{5,11,725},{5,11,727},{135,11,1811},{6,0,826},{137, 11,304},{7,0,1450},{139,0,99},{133,11,654},{134,0,492},{5,0,134},{6,0,408},{6,0, 495},{7,0,1593},{6,11,273},{10,11,188},{13,11,377},{146,11,77},{9,10,769},{140, 10,185},{135,11,410},{142,0,4},{4,0,665},{134,11,1785},{4,0,248},{7,0,137},{137, 0,349},{5,10,530},{142,10,113},{7,0,1270},{139,0,612},{132,11,780},{5,0,371},{ 135,0,563},{135,0,826},{6,0,1535},{23,0,21},{151,0,23},{4,0,374},{7,0,547},{7,0, 1700},{7,0,1833},{139,0,858},{133,10,556},{7,11,612},{8,11,545},{8,11,568},{8,11 ,642},{9,11,717},{10,11,541},{10,11,763},{11,11,449},{12,11,489},{13,11,153},{13 ,11,296},{14,11,138},{14,11,392},{15,11,50},{16,11,6},{16,11,12},{148,11,9},{9,0 ,311},{141,0,42},{8,10,16},{140,10,568},{6,0,1968},{6,0,2027},{138,0,991},{6,0, 1647},{7,0,1552},{7,0,2010},{9,0,494},{137,0,509},{133,11,948},{6,10,186},{137, 10,426},{134,0,769},{134,0,642},{132,10,585},{6,0,123},{7,0,214},{9,0,728},{10,0 ,157},{11,0,346},{11,0,662},{143,0,106},{142,11,381},{135,0,1435},{4,11,532},{5, 11,706},{135,11,662},{5,11,837},{134,11,1651},{4,10,93},{5,10,252},{6,10,229},{7 ,10,291},{9,10,550},{139,10,644},{148,0,79},{137,10,749},{134,0,1425},{137,10, 162},{4,11,362},{7,11,52},{7,11,303},{140,11,166},{132,10,381},{4,11,330},{7,11, 933},{7,11,2012},{136,11,292},{135,11,767},{4,0,707},{5,0,588},{6,0,393},{13,0, 106},{18,0,49},{147,0,41},{6,0,211},{7,0,1690},{11,0,486},{140,0,369},{137,11, 883},{4,11,703},{135,11,207},{4,0,187},{5,0,184},{5,0,690},{7,0,1869},{10,0,756} ,{139,0,783},{132,11,571},{134,0,1382},{5,0,175},{6,10,77},{6,10,157},{7,10,974} ,{7,10,1301},{7,10,1339},{7,10,1490},{7,10,1873},{137,10,628},{134,0,1493},{5,11 ,873},{133,11,960},{134,0,1007},{12,11,93},{12,11,501},{13,11,362},{14,11,151},{ 15,11,40},{15,11,59},{16,11,46},{17,11,25},{18,11,14},{18,11,134},{19,11,25},{19 ,11,69},{20,11,16},{20,11,19},{20,11,66},{21,11,23},{21,11,25},{150,11,42},{11, 10,919},{141,10,409},{134,0,219},{5,0,582},{6,0,1646},{7,0,99},{7,0,1962},{7,0, 1986},{8,0,515},{8,0,773},{9,0,23},{9,0,491},{12,0,620},{142,0,93},{133,0,851},{ 5,11,33},{134,11,470},{135,11,1291},{134,0,1278},{135,11,1882},{135,10,1489},{ 132,0,1000},{138,0,982},{8,0,762},{8,0,812},{137,0,910},{6,11,47},{7,11,90},{7, 11,664},{7,11,830},{7,11,1380},{7,11,2025},{8,11,448},{136,11,828},{4,0,98},{4,0 ,940},{6,0,1819},{6,0,1834},{6,0,1841},{7,0,1365},{8,0,859},{8,0,897},{8,0,918}, {9,0,422},{9,0,670},{10,0,775},{10,0,894},{10,0,909},{10,0,910},{10,0,935},{11,0 ,210},{12,0,750},{12,0,755},{13,0,26},{13,0,457},{13,0,476},{16,0,100},{16,0,109 },{18,0,173},{18,0,175},{8,10,398},{9,10,681},{139,10,632},{9,11,417},{137,11, 493},{136,10,645},{138,0,906},{134,0,1730},{134,10,20},{133,11,1019},{134,0,1185 },{10,0,40},{136,10,769},{9,0,147},{134,11,208},{140,0,650},{5,0,209},{6,0,30},{ 11,0,56},{139,0,305},{132,0,553},{138,11,344},{6,11,68},{7,11,398},{7,11,448},{7 ,11,1629},{7,11,1813},{8,11,387},{8,11,442},{9,11,710},{10,11,282},{138,11,722}, {5,0,597},{14,0,20},{142,11,20},{135,0,1614},{135,10,1757},{4,0,150},{5,0,303},{ 6,0,327},{135,10,937},{16,0,49},{7,10,1652},{144,11,49},{8,0,192},{10,0,78},{141 ,0,359},{135,0,786},{143,0,134},{6,0,1638},{7,0,79},{7,0,496},{9,0,138},{10,0, 336},{11,0,12},{12,0,412},{12,0,440},{142,0,305},{136,11,491},{4,10,579},{5,10, 226},{5,10,323},{135,10,960},{7,0,204},{7,0,415},{8,0,42},{10,0,85},{139,0,564}, {132,0,614},{4,11,403},{5,11,441},{7,11,450},{11,11,101},{12,11,193},{141,11,430 },{135,11,1927},{135,11,1330},{4,0,3},{5,0,247},{5,0,644},{7,0,744},{7,0,1207},{ 7,0,1225},{7,0,1909},{146,0,147},{136,0,942},{4,0,1019},{134,0,2023},{5,11,679}, {133,10,973},{5,0,285},{9,0,67},{13,0,473},{143,0,82},{7,11,328},{137,11,326},{ 151,0,8},{6,10,135},{135,10,1176},{135,11,1128},{134,0,1309},{135,11,1796},{135, 10,314},{4,11,574},{7,11,350},{7,11,1024},{8,11,338},{9,11,677},{10,11,808},{139 ,11,508},{7,11,818},{17,11,14},{17,11,45},{18,11,75},{148,11,18},{146,10,4},{135 ,11,1081},{4,0,29},{6,0,532},{7,0,1628},{7,0,1648},{9,0,350},{10,0,433},{11,0,97 },{11,0,557},{11,0,745},{12,0,289},{12,0,335},{12,0,348},{12,0,606},{13,0,116},{ 13,0,233},{13,0,466},{14,0,181},{14,0,209},{14,0,232},{14,0,236},{14,0,300},{16, 0,41},{148,0,97},{7,0,318},{6,10,281},{8,10,282},{8,10,480},{8,10,499},{9,10,198 },{10,10,143},{10,10,169},{10,10,211},{10,10,417},{10,10,574},{11,10,147},{11,10 ,395},{12,10,75},{12,10,407},{12,10,608},{13,10,500},{142,10,251},{135,11,1676}, {135,11,2037},{135,0,1692},{5,0,501},{7,0,1704},{9,0,553},{11,0,520},{12,0,557}, {141,0,249},{6,0,1527},{14,0,324},{15,0,55},{15,0,80},{14,11,324},{15,11,55},{ 143,11,80},{135,10,1776},{8,0,988},{137,11,297},{132,10,419},{142,0,223},{139,11 ,234},{7,0,1123},{12,0,508},{14,0,102},{14,0,226},{144,0,57},{4,10,138},{7,10, 1012},{7,10,1280},{137,10,76},{7,0,1764},{5,10,29},{140,10,638},{134,0,2015},{ 134,0,1599},{138,11,56},{6,11,306},{7,11,1140},{7,11,1340},{8,11,133},{138,11, 449},{139,11,1011},{6,10,1710},{135,10,2038},{7,11,1763},{140,11,310},{6,0,129}, {4,10,17},{5,10,23},{7,10,995},{11,10,383},{11,10,437},{12,10,460},{140,10,532}, {5,11,329},{136,11,260},{133,10,862},{132,0,534},{6,0,811},{135,0,626},{132,11, 657},{4,0,25},{5,0,60},{6,0,504},{7,0,614},{7,0,1155},{12,0,0},{152,11,7},{7,0, 1248},{11,0,621},{139,0,702},{137,0,321},{8,10,70},{12,10,171},{141,10,272},{10, 10,233},{139,10,76},{4,0,379},{7,0,1397},{134,10,442},{5,11,66},{7,11,1896},{136 ,11,288},{134,11,1643},{134,10,1709},{4,11,21},{5,11,91},{5,11,570},{5,11,648},{ 5,11,750},{5,11,781},{6,11,54},{6,11,112},{6,11,402},{6,11,1732},{7,11,315},{7, 11,749},{7,11,1347},{7,11,1900},{9,11,78},{9,11,508},{10,11,611},{11,11,510},{11 ,11,728},{13,11,36},{14,11,39},{16,11,83},{17,11,124},{148,11,30},{4,0,118},{6,0 ,274},{6,0,361},{7,0,75},{141,0,441},{10,11,322},{10,11,719},{139,11,407},{147, 10,119},{12,11,549},{14,11,67},{147,11,60},{11,10,69},{12,10,105},{12,10,117},{ 13,10,213},{14,10,13},{14,10,62},{14,10,177},{14,10,421},{15,10,19},{146,10,141} ,{9,0,841},{137,10,309},{7,10,608},{7,10,976},{8,11,125},{8,11,369},{8,11,524},{ 9,10,146},{10,10,206},{10,11,486},{10,10,596},{11,11,13},{11,11,381},{11,11,736} ,{11,11,766},{11,11,845},{13,11,114},{13,10,218},{13,11,292},{14,11,47},{142,10, 153},{12,0,693},{135,11,759},{5,0,314},{6,0,221},{7,0,419},{10,0,650},{11,0,396} ,{12,0,156},{13,0,369},{14,0,333},{145,0,47},{6,11,1684},{6,11,1731},{7,11,356}, {7,11,1932},{8,11,54},{8,11,221},{9,11,225},{9,11,356},{10,11,77},{10,11,446},{ 10,11,731},{12,11,404},{141,11,491},{132,11,375},{4,10,518},{135,10,1136},{4,0, 913},{4,11,411},{11,11,643},{140,11,115},{4,11,80},{133,11,44},{8,10,689},{137, 10,863},{138,0,880},{4,10,18},{7,10,145},{7,10,444},{7,10,1278},{8,10,49},{8,10, 400},{9,10,71},{9,10,250},{10,10,459},{12,10,160},{144,10,24},{136,0,475},{5,0, 1016},{5,11,299},{135,11,1083},{7,0,602},{8,0,179},{10,0,781},{140,0,126},{6,0, 329},{138,0,111},{135,0,1864},{4,11,219},{7,11,1761},{137,11,86},{6,0,1888},{6,0 ,1892},{6,0,1901},{6,0,1904},{9,0,953},{9,0,985},{9,0,991},{9,0,1001},{12,0,818} ,{12,0,846},{12,0,847},{12,0,861},{12,0,862},{12,0,873},{12,0,875},{12,0,877},{ 12,0,879},{12,0,881},{12,0,884},{12,0,903},{12,0,915},{12,0,926},{12,0,939},{15, 0,182},{15,0,219},{15,0,255},{18,0,191},{18,0,209},{18,0,211},{149,0,41},{5,11, 328},{135,11,918},{137,0,780},{12,0,82},{143,0,36},{133,10,1010},{5,0,821},{134, 0,1687},{133,11,514},{132,0,956},{134,0,1180},{10,0,112},{5,10,87},{7,10,313},{7 ,10,1103},{10,10,582},{11,10,389},{11,10,813},{12,10,385},{13,10,286},{14,10,124 },{146,10,108},{5,0,71},{7,0,1407},{9,0,704},{10,0,261},{10,0,619},{11,0,547},{ 11,0,619},{143,0,157},{4,0,531},{5,0,455},{5,11,301},{6,11,571},{14,11,49},{146, 11,102},{132,10,267},{6,0,385},{7,0,2008},{9,0,337},{138,0,517},{133,11,726},{ 133,11,364},{4,11,76},{7,11,1550},{9,11,306},{9,11,430},{9,11,663},{10,11,683},{ 11,11,427},{11,11,753},{12,11,334},{12,11,442},{14,11,258},{14,11,366},{143,11, 131},{6,0,1865},{6,0,1879},{6,0,1881},{6,0,1894},{6,0,1908},{9,0,915},{9,0,926}, {9,0,940},{9,0,943},{9,0,966},{9,0,980},{9,0,989},{9,0,1005},{9,0,1010},{12,0, 813},{12,0,817},{12,0,840},{12,0,843},{12,0,855},{12,0,864},{12,0,871},{12,0,872 },{12,0,899},{12,0,905},{12,0,924},{15,0,171},{15,0,181},{15,0,224},{15,0,235},{ 15,0,251},{146,0,184},{137,11,52},{5,0,16},{6,0,86},{6,0,603},{7,0,292},{7,0,561 },{8,0,257},{8,0,382},{9,0,721},{9,0,778},{11,0,581},{140,0,466},{4,0,486},{5,0, 491},{135,10,1121},{4,0,72},{6,0,265},{135,0,1300},{135,11,1183},{10,10,249},{ 139,10,209},{132,10,561},{137,11,519},{4,11,656},{4,10,760},{135,11,779},{9,10, 154},{140,10,485},{135,11,1793},{135,11,144},{136,10,255},{133,0,621},{4,10,368} ,{135,10,641},{135,11,1373},{7,11,554},{7,11,605},{141,11,10},{137,0,234},{5,0, 815},{6,0,1688},{134,0,1755},{5,11,838},{5,11,841},{134,11,1649},{7,0,1987},{7,0 ,2040},{136,0,743},{133,11,1012},{6,0,197},{136,0,205},{6,0,314},{134,11,314},{ 144,11,53},{6,11,251},{7,11,365},{7,11,1357},{7,11,1497},{8,11,154},{141,11,281} ,{133,11,340},{6,0,452},{7,0,312},{138,0,219},{138,0,589},{4,0,333},{9,0,176},{ 12,0,353},{141,0,187},{9,10,92},{147,10,91},{134,0,1110},{11,0,47},{139,11,495}, {6,10,525},{8,10,806},{9,10,876},{140,10,284},{8,11,261},{9,11,144},{9,11,466},{ 10,11,370},{12,11,470},{13,11,144},{142,11,348},{137,11,897},{8,0,863},{8,0,864} ,{8,0,868},{8,0,884},{10,0,866},{10,0,868},{10,0,873},{10,0,911},{10,0,912},{10, 0,944},{12,0,727},{6,11,248},{9,11,546},{10,11,535},{11,11,681},{141,11,135},{6, 0,300},{135,0,1515},{134,0,1237},{139,10,958},{133,10,594},{140,11,250},{134,0, 1685},{134,11,567},{7,0,135},{8,0,7},{8,0,62},{9,0,243},{10,0,658},{10,0,697},{ 11,0,456},{139,0,756},{9,0,395},{138,0,79},{6,10,1641},{136,10,820},{4,10,302},{ 135,10,1766},{134,11,174},{135,10,1313},{135,0,631},{134,10,1674},{134,11,395},{ 138,0,835},{7,0,406},{7,0,459},{8,0,606},{139,0,726},{134,11,617},{134,0,979},{6 ,10,389},{7,10,149},{9,10,142},{138,10,94},{5,11,878},{133,11,972},{6,10,8},{7, 10,1881},{8,10,91},{136,11,511},{133,0,612},{132,11,351},{4,0,372},{7,0,482},{8, 0,158},{9,0,602},{9,0,615},{10,0,245},{10,0,678},{10,0,744},{11,0,248},{139,0, 806},{5,0,854},{135,0,1991},{132,11,286},{135,11,344},{7,11,438},{7,11,627},{7, 11,1516},{8,11,40},{9,11,56},{9,11,294},{10,11,30},{10,11,259},{11,11,969},{146, 11,148},{135,0,1492},{5,11,259},{7,11,414},{7,11,854},{142,11,107},{135,10,1746} ,{6,0,833},{134,0,998},{135,10,24},{6,0,750},{135,0,1739},{4,10,503},{135,10, 1661},{5,10,130},{7,10,1314},{9,10,610},{10,10,718},{11,10,601},{11,10,819},{11, 10,946},{140,10,536},{10,10,149},{11,10,280},{142,10,336},{132,11,738},{135,10, 1946},{5,0,195},{135,0,1685},{7,0,1997},{8,0,730},{139,0,1006},{151,11,17},{133, 11,866},{14,0,463},{14,0,470},{150,0,61},{5,0,751},{8,0,266},{11,0,578},{4,10, 392},{135,10,1597},{5,10,433},{9,10,633},{139,10,629},{135,0,821},{6,0,715},{134 ,0,1325},{133,11,116},{6,0,868},{132,11,457},{134,0,959},{6,10,234},{138,11,199} ,{7,0,1053},{7,10,1950},{8,10,680},{11,10,817},{147,10,88},{7,10,1222},{138,10, 386},{5,0,950},{5,0,994},{6,0,351},{134,0,1124},{134,0,1081},{7,0,1595},{6,10,5} ,{11,10,249},{12,10,313},{16,10,66},{145,10,26},{148,0,59},{5,11,527},{6,11,189} ,{135,11,859},{5,10,963},{6,10,1773},{11,11,104},{11,11,554},{15,11,60},{143,11, 125},{135,0,47},{137,0,684},{134,11,116},{134,0,1606},{134,0,777},{7,0,1020},{8, 10,509},{136,10,792},{135,0,1094},{132,0,350},{133,11,487},{4,11,86},{5,11,667}, {5,11,753},{6,11,316},{6,11,455},{135,11,946},{7,0,1812},{13,0,259},{13,0,356},{ 14,0,242},{147,0,114},{132,10,931},{133,0,967},{4,0,473},{7,0,623},{8,0,808},{9, 0,871},{9,0,893},{11,0,38},{11,0,431},{12,0,112},{12,0,217},{12,0,243},{12,0,562 },{12,0,663},{12,0,683},{13,0,141},{13,0,197},{13,0,227},{13,0,406},{13,0,487},{ 14,0,156},{14,0,203},{14,0,224},{14,0,256},{18,0,58},{150,0,0},{138,0,286},{7,10 ,943},{139,10,614},{135,10,1837},{150,11,45},{132,0,798},{4,0,222},{7,0,286},{ 136,0,629},{4,11,79},{7,11,1773},{10,11,450},{11,11,589},{13,11,332},{13,11,493} ,{14,11,183},{14,11,334},{14,11,362},{14,11,368},{14,11,376},{14,11,379},{19,11, 90},{19,11,103},{19,11,127},{148,11,90},{5,0,337},{11,0,513},{11,0,889},{11,0, 961},{12,0,461},{13,0,79},{15,0,121},{4,10,90},{5,10,545},{7,10,754},{9,10,186}, {10,10,72},{10,10,782},{11,10,577},{11,10,610},{12,10,354},{12,10,362},{140,10, 595},{141,0,306},{136,0,146},{7,0,1646},{9,10,329},{11,10,254},{141,11,124},{4,0 ,465},{135,0,1663},{132,0,525},{133,11,663},{10,0,299},{18,0,74},{9,10,187},{11, 10,1016},{145,10,44},{7,0,165},{7,0,919},{4,10,506},{136,10,517},{5,10,295},{135 ,10,1680},{133,11,846},{134,0,1064},{5,11,378},{7,11,1402},{7,11,1414},{8,11,465 },{9,11,286},{10,11,185},{10,11,562},{10,11,635},{11,11,31},{11,11,393},{12,11, 456},{13,11,312},{18,11,65},{18,11,96},{147,11,89},{132,0,596},{7,10,987},{9,10, 688},{10,10,522},{11,10,788},{140,10,566},{6,0,82},{7,0,138},{7,0,517},{7,0,1741 },{11,0,238},{4,11,648},{134,10,1775},{7,0,1233},{7,10,700},{7,10,940},{8,10,514 },{9,10,116},{9,10,535},{10,10,118},{11,10,107},{11,10,148},{11,10,922},{12,10, 254},{12,10,421},{142,10,238},{4,0,962},{6,0,1824},{8,0,894},{12,0,708},{12,0, 725},{14,0,451},{20,0,94},{22,0,59},{150,0,62},{5,11,945},{6,11,1656},{6,11,1787 },{7,11,167},{8,11,824},{9,11,391},{10,11,375},{139,11,185},{5,0,495},{7,0,834}, {9,0,733},{139,0,378},{4,10,743},{135,11,1273},{6,0,1204},{7,11,1645},{8,11,352} ,{137,11,249},{139,10,292},{133,0,559},{132,11,152},{9,0,499},{10,0,341},{15,0, 144},{19,0,49},{7,10,1283},{9,10,227},{11,10,325},{11,10,408},{14,10,180},{146, 10,47},{6,0,21},{6,0,1737},{7,0,1444},{136,0,224},{133,11,1006},{7,0,1446},{9,0, 97},{17,0,15},{5,10,81},{7,10,146},{7,10,1342},{8,10,53},{8,10,561},{8,10,694},{ 8,10,754},{9,10,115},{9,10,894},{10,10,462},{10,10,813},{11,10,230},{11,10,657}, {11,10,699},{11,10,748},{12,10,119},{12,10,200},{12,10,283},{142,10,273},{5,10, 408},{137,10,747},{135,11,431},{135,11,832},{6,0,729},{134,0,953},{4,0,727},{8,0 ,565},{5,11,351},{7,11,264},{136,11,565},{134,0,1948},{5,0,519},{5,11,40},{7,11, 598},{7,11,1638},{8,11,78},{9,11,166},{9,11,640},{9,11,685},{9,11,773},{11,11, 215},{13,11,65},{14,11,172},{14,11,317},{145,11,6},{8,11,60},{9,11,343},{139,11, 769},{137,11,455},{134,0,1193},{140,0,790},{7,11,1951},{8,11,765},{8,11,772},{ 140,11,671},{7,11,108},{8,11,219},{8,11,388},{9,11,639},{9,11,775},{11,11,275},{ 140,11,464},{132,11,468},{7,10,30},{8,10,86},{8,10,315},{8,10,700},{9,10,576},{9 ,10,858},{11,10,310},{11,10,888},{11,10,904},{12,10,361},{141,10,248},{5,11,15}, {6,11,56},{7,11,1758},{8,11,500},{9,11,730},{11,11,331},{13,11,150},{142,11,282} ,{4,0,402},{7,0,2},{8,0,323},{136,0,479},{138,10,839},{11,0,580},{142,0,201},{5, 0,59},{135,0,672},{137,10,617},{146,0,34},{134,11,1886},{4,0,961},{136,0,896},{6 ,0,1285},{5,11,205},{6,11,438},{137,11,711},{134,10,428},{7,10,524},{8,10,169},{ 8,10,234},{9,10,480},{138,10,646},{148,0,46},{141,0,479},{133,11,534},{6,0,2019} ,{134,10,1648},{4,0,85},{7,0,549},{7,10,1205},{138,10,637},{4,0,663},{5,0,94},{7 ,11,235},{7,11,1475},{15,11,68},{146,11,120},{6,11,443},{9,11,237},{9,11,571},{9 ,11,695},{10,11,139},{11,11,715},{12,11,417},{141,11,421},{132,0,783},{4,0,682}, {8,0,65},{9,10,39},{10,10,166},{11,10,918},{12,10,635},{20,10,10},{22,10,27},{22 ,10,43},{150,10,52},{6,0,11},{135,0,187},{132,0,522},{4,0,52},{135,0,661},{4,0, 383},{133,0,520},{135,11,546},{11,0,343},{142,0,127},{4,11,578},{7,10,157},{7,11 ,624},{7,11,916},{8,10,279},{10,11,256},{11,11,87},{139,11,703},{134,10,604},{4, 0,281},{5,0,38},{7,0,194},{7,0,668},{7,0,1893},{137,0,397},{7,10,945},{11,10,713 },{139,10,744},{139,10,1022},{9,0,635},{139,0,559},{5,11,923},{7,11,490},{12,11, 553},{13,11,100},{14,11,118},{143,11,75},{132,0,975},{132,10,567},{137,10,859},{ 7,10,1846},{7,11,1846},{8,10,628},{136,11,628},{148,0,116},{138,11,750},{14,0,51 },{14,11,51},{15,11,7},{148,11,20},{132,0,858},{134,0,1075},{4,11,924},{133,10, 762},{136,0,535},{133,0,448},{10,10,784},{141,10,191},{133,10,298},{7,0,610},{ 135,0,1501},{7,10,633},{7,10,905},{7,10,909},{7,10,1538},{9,10,767},{140,10,636} ,{4,11,265},{7,11,807},{135,11,950},{5,11,93},{12,11,267},{144,11,26},{136,0,191 },{139,10,301},{135,10,1970},{135,0,267},{4,0,319},{5,0,699},{138,0,673},{6,0, 336},{7,0,92},{7,0,182},{8,0,453},{8,0,552},{9,0,204},{9,0,285},{10,0,99},{11,0, 568},{11,0,950},{12,0,94},{16,0,20},{16,0,70},{19,0,55},{12,10,644},{144,10,90}, {6,0,551},{7,0,1308},{7,10,845},{7,11,994},{8,10,160},{137,10,318},{19,11,1},{19 ,11,26},{150,11,9},{7,0,1406},{9,0,218},{141,0,222},{5,0,256},{138,0,69},{5,11, 233},{5,11,320},{6,11,140},{7,11,330},{136,11,295},{6,0,1980},{136,0,952},{4,0, 833},{137,11,678},{133,11,978},{4,11,905},{6,11,1701},{137,11,843},{138,10,735}, {136,10,76},{17,0,39},{148,0,36},{18,0,81},{146,11,81},{14,0,352},{17,0,53},{18, 0,146},{18,0,152},{19,0,11},{150,0,54},{135,0,634},{138,10,841},{132,0,618},{4,0 ,339},{7,0,259},{17,0,73},{4,11,275},{140,11,376},{132,11,509},{7,11,273},{139, 11,377},{4,0,759},{13,0,169},{137,10,804},{6,10,96},{135,10,1426},{4,10,651},{ 133,10,289},{7,0,1075},{8,10,35},{9,10,511},{10,10,767},{147,10,118},{6,0,649},{ 6,0,670},{136,0,482},{5,0,336},{6,0,341},{6,0,478},{6,0,1763},{136,0,386},{5,11, 802},{7,11,2021},{8,11,805},{14,11,94},{15,11,65},{16,11,4},{16,11,77},{16,11,80 },{145,11,5},{6,0,1035},{5,11,167},{5,11,899},{6,11,410},{137,11,777},{134,11, 1705},{5,0,924},{133,0,969},{132,10,704},{135,0,73},{135,11,10},{135,10,1078},{5 ,11,11},{6,11,117},{6,11,485},{7,11,1133},{9,11,582},{9,11,594},{11,11,21},{11, 11,818},{12,11,535},{141,11,86},{135,0,1971},{4,11,264},{7,11,1067},{8,11,204},{ 8,11,385},{139,11,953},{6,0,1458},{135,0,1344},{5,0,396},{134,0,501},{4,10,720}, {133,10,306},{4,0,929},{5,0,799},{8,0,46},{8,0,740},{133,10,431},{7,11,646},{7, 11,1730},{11,11,446},{141,11,178},{7,0,276},{5,10,464},{6,10,236},{7,10,696},{7, 10,914},{7,10,1108},{7,10,1448},{9,10,15},{9,10,564},{10,10,14},{12,10,565},{13, 10,449},{14,10,53},{15,10,13},{16,10,64},{145,10,41},{4,0,892},{133,0,770},{6,10 ,1767},{12,10,194},{145,10,107},{135,0,158},{5,10,840},{138,11,608},{134,0,1432} ,{138,11,250},{8,11,794},{9,11,400},{10,11,298},{142,11,228},{151,0,25},{7,11, 1131},{135,11,1468},{135,0,2001},{9,10,642},{11,10,236},{142,10,193},{4,10,68},{ 5,10,634},{6,10,386},{7,10,794},{8,10,273},{9,10,563},{10,10,105},{10,10,171},{ 11,10,94},{139,10,354},{136,11,724},{132,0,478},{11,11,512},{13,11,205},{19,11, 30},{22,11,36},{151,11,19},{7,0,1461},{140,0,91},{6,11,190},{7,11,768},{135,11, 1170},{4,0,602},{8,0,211},{4,10,95},{7,10,416},{139,10,830},{7,10,731},{13,10,20 },{143,10,11},{6,0,1068},{135,0,1872},{4,0,13},{5,0,567},{7,0,1498},{9,0,124},{ 11,0,521},{12,0,405},{135,11,1023},{135,0,1006},{132,0,735},{138,0,812},{4,0,170 },{135,0,323},{6,11,137},{9,11,75},{9,11,253},{10,11,194},{138,11,444},{5,0,304} ,{7,0,1403},{5,10,864},{10,10,648},{11,10,671},{143,10,46},{135,11,1180},{133,10 ,928},{4,0,148},{133,0,742},{11,10,986},{140,10,682},{133,0,523},{135,11,1743},{ 7,0,730},{18,0,144},{19,0,61},{8,10,44},{9,10,884},{10,10,580},{11,10,399},{11, 10,894},{143,10,122},{5,11,760},{7,11,542},{8,11,135},{136,11,496},{136,0,981},{ 133,0,111},{10,0,132},{11,0,191},{11,0,358},{139,0,460},{7,11,319},{7,11,355},{7 ,11,763},{10,11,389},{145,11,43},{134,0,890},{134,0,1420},{136,11,557},{133,10, 518},{133,0,444},{135,0,1787},{135,10,1852},{8,0,123},{15,0,6},{144,0,7},{6,0, 2041},{10,11,38},{139,11,784},{136,0,932},{5,0,937},{135,0,100},{6,0,995},{4,11, 58},{5,11,286},{6,11,319},{7,11,402},{7,11,1254},{7,11,1903},{8,11,356},{140,11, 408},{4,11,389},{9,11,181},{9,11,255},{10,11,8},{10,11,29},{10,11,816},{11,11, 311},{11,11,561},{12,11,67},{141,11,181},{138,0,255},{5,0,138},{4,10,934},{136, 10,610},{4,0,965},{10,0,863},{138,0,898},{10,10,804},{138,10,832},{12,0,631},{8, 10,96},{9,10,36},{10,10,607},{11,10,423},{11,10,442},{12,10,309},{14,10,199},{15 ,10,90},{145,10,110},{134,0,1394},{4,0,652},{8,0,320},{22,0,6},{22,0,16},{9,10, 13},{9,10,398},{9,10,727},{10,10,75},{10,10,184},{10,10,230},{10,10,564},{10,10, 569},{11,10,973},{12,10,70},{12,10,189},{13,10,57},{141,10,257},{6,0,897},{134,0 ,1333},{4,0,692},{133,0,321},{133,11,373},{135,0,922},{5,0,619},{133,0,698},{137 ,10,631},{5,10,345},{135,10,1016},{9,0,957},{9,0,1018},{12,0,828},{12,0,844},{12 ,0,897},{12,0,901},{12,0,943},{15,0,180},{18,0,197},{18,0,200},{18,0,213},{18,0, 214},{146,0,226},{5,0,917},{134,0,1659},{135,0,1100},{134,0,1173},{134,0,1930},{ 5,0,251},{5,0,956},{8,0,268},{9,0,214},{146,0,142},{133,10,673},{137,10,850},{4, 10,287},{133,10,1018},{132,11,672},{5,0,346},{5,0,711},{8,0,390},{11,11,752},{ 139,11,885},{5,10,34},{10,10,724},{12,10,444},{13,10,354},{18,10,32},{23,10,24}, {23,10,31},{152,10,5},{4,11,710},{134,11,606},{134,0,744},{134,10,382},{133,11, 145},{4,10,329},{7,11,884},{140,11,124},{4,11,467},{5,11,405},{134,11,544},{9,10 ,846},{138,10,827},{133,0,624},{9,11,372},{15,11,2},{19,11,10},{147,11,18},{4,11 ,387},{135,11,1288},{5,0,783},{7,0,1998},{135,0,2047},{132,10,906},{136,10,366}, {135,11,550},{4,10,123},{4,10,649},{5,10,605},{7,10,1509},{136,10,36},{134,0, 1125},{132,0,594},{133,10,767},{135,11,1227},{136,11,467},{4,11,576},{135,11, 1263},{4,0,268},{7,0,1534},{135,11,1534},{4,10,273},{5,10,658},{5,11,919},{5,10, 995},{134,11,1673},{133,0,563},{134,10,72},{135,10,1345},{4,11,82},{5,11,333},{5 ,11,904},{6,11,207},{7,11,325},{7,11,1726},{8,11,101},{10,11,778},{139,11,220},{ 5,0,37},{6,0,39},{6,0,451},{7,0,218},{7,0,667},{7,0,1166},{7,0,1687},{8,0,662},{ 16,0,2},{133,10,589},{134,0,1332},{133,11,903},{134,0,508},{5,10,117},{6,10,514} ,{6,10,541},{7,10,1164},{7,10,1436},{8,10,220},{8,10,648},{10,10,688},{11,10,560 },{140,11,147},{6,11,555},{135,11,485},{133,10,686},{7,0,453},{7,0,635},{7,0,796 },{8,0,331},{9,0,330},{9,0,865},{10,0,119},{10,0,235},{11,0,111},{11,0,129},{11, 0,240},{12,0,31},{12,0,66},{12,0,222},{12,0,269},{12,0,599},{12,0,684},{12,0,689 },{12,0,691},{142,0,345},{135,0,1834},{4,11,705},{7,11,615},{138,11,251},{136,11 ,345},{137,0,527},{6,0,98},{7,0,702},{135,0,991},{11,0,576},{14,0,74},{7,10,196} ,{10,10,765},{11,10,347},{11,10,552},{11,10,790},{12,10,263},{13,10,246},{13,10, 270},{13,10,395},{14,10,176},{14,10,190},{14,10,398},{14,10,412},{15,10,32},{15, 10,63},{16,10,88},{147,10,105},{134,11,90},{13,0,84},{141,0,122},{6,0,37},{7,0, 299},{7,0,1666},{8,0,195},{8,0,316},{9,0,178},{9,0,276},{9,0,339},{9,0,536},{10, 0,102},{10,0,362},{10,0,785},{11,0,55},{11,0,149},{11,0,773},{13,0,416},{13,0, 419},{14,0,38},{14,0,41},{142,0,210},{5,10,381},{135,10,1792},{7,11,813},{12,11, 497},{141,11,56},{7,10,616},{138,10,413},{133,0,645},{6,11,125},{135,11,1277},{ 132,0,290},{6,0,70},{7,0,1292},{10,0,762},{139,0,288},{6,10,120},{7,10,1188},{7, 10,1710},{8,10,286},{9,10,667},{11,10,592},{139,10,730},{135,11,1784},{7,0,1315} ,{135,11,1315},{134,0,1955},{135,10,1146},{7,0,131},{7,0,422},{8,0,210},{140,0, 573},{4,10,352},{135,10,687},{139,0,797},{143,0,38},{14,0,179},{15,0,151},{150,0 ,11},{7,0,488},{4,10,192},{5,10,49},{6,10,200},{6,10,293},{134,10,1696},{132,0, 936},{135,11,703},{6,11,160},{7,11,1106},{9,11,770},{10,11,618},{11,11,112},{140 ,11,413},{5,0,453},{134,0,441},{135,0,595},{132,10,650},{132,10,147},{6,0,991},{ 6,0,1182},{12,11,271},{145,11,109},{133,10,934},{140,11,221},{132,0,653},{7,0, 505},{135,0,523},{134,0,903},{135,11,479},{7,11,304},{9,11,646},{9,11,862},{10, 11,262},{11,11,696},{12,11,208},{15,11,79},{147,11,108},{146,0,80},{135,11,981}, {142,0,432},{132,0,314},{137,11,152},{7,0,1368},{8,0,232},{8,0,361},{10,0,682},{ 138,0,742},{135,11,1586},{9,0,534},{4,11,434},{11,11,663},{12,11,210},{13,11,166 },{13,11,310},{14,11,373},{147,11,43},{7,11,1091},{135,11,1765},{6,11,550},{135, 11,652},{137,0,27},{142,0,12},{4,10,637},{5,11,553},{7,11,766},{138,11,824},{7, 11,737},{8,11,298},{136,11,452},{7,0,736},{139,0,264},{134,0,1657},{133,11,292}, {138,11,135},{6,0,844},{134,0,1117},{135,0,127},{9,10,867},{138,10,837},{6,0, 1184},{134,0,1208},{134,0,1294},{136,0,364},{6,0,1415},{7,0,1334},{11,0,125},{6, 10,170},{7,11,393},{8,10,395},{8,10,487},{10,11,603},{11,11,206},{141,10,147},{ 137,11,748},{4,11,912},{137,11,232},{4,10,535},{136,10,618},{137,0,792},{7,11, 1973},{136,11,716},{135,11,98},{5,0,909},{9,0,849},{138,0,805},{4,0,630},{132,0, 699},{5,11,733},{14,11,103},{150,10,23},{12,11,158},{18,11,8},{19,11,62},{20,11, 6},{22,11,4},{23,11,2},{151,11,9},{132,0,968},{132,10,778},{132,10,46},{5,10,811 },{6,10,1679},{6,10,1714},{135,10,2032},{6,0,1446},{7,10,1458},{9,10,407},{139, 10,15},{7,0,206},{7,0,397},{7,0,621},{7,0,640},{8,0,124},{8,0,619},{9,0,305},{9, 0,643},{10,0,264},{10,0,628},{11,0,40},{12,0,349},{13,0,134},{13,0,295},{14,0, 155},{15,0,120},{18,0,105},{6,10,34},{7,10,1089},{8,10,708},{8,10,721},{9,10,363 },{148,10,98},{4,0,262},{5,0,641},{135,0,342},{137,11,72},{4,0,99},{6,0,250},{6, 0,346},{8,0,127},{138,0,81},{132,0,915},{5,0,75},{9,0,517},{10,0,470},{12,0,155} ,{141,0,224},{132,10,462},{11,11,600},{11,11,670},{141,11,245},{142,0,83},{5,10, 73},{6,10,23},{134,10,338},{6,0,1031},{139,11,923},{7,11,164},{7,11,1571},{9,11, 107},{140,11,225},{134,0,1470},{133,0,954},{6,0,304},{8,0,418},{10,0,345},{11,0, 341},{139,0,675},{9,0,410},{139,0,425},{4,11,27},{5,11,484},{5,11,510},{6,11,434 },{7,11,1000},{7,11,1098},{8,11,2},{136,11,200},{134,0,734},{140,11,257},{7,10, 725},{8,10,498},{139,10,268},{134,0,1822},{135,0,1798},{135,10,773},{132,11,460} ,{4,11,932},{133,11,891},{134,0,14},{132,10,583},{7,10,1462},{8,11,625},{139,10, 659},{5,0,113},{6,0,243},{6,0,1708},{7,0,1865},{11,0,161},{16,0,37},{17,0,99},{ 133,10,220},{134,11,76},{5,11,461},{135,11,1925},{140,0,69},{8,11,92},{137,11, 221},{139,10,803},{132,10,544},{4,0,274},{134,0,922},{132,0,541},{5,0,627},{6,10 ,437},{6,10,564},{11,10,181},{141,10,183},{135,10,1192},{7,0,166},{132,11,763},{ 133,11,253},{134,0,849},{9,11,73},{10,11,110},{14,11,185},{145,11,119},{5,11,212 },{12,11,35},{141,11,382},{133,0,717},{137,0,304},{136,0,600},{133,0,654},{6,0, 273},{10,0,188},{13,0,377},{146,0,77},{4,10,790},{5,10,273},{134,10,394},{132,0, 543},{135,0,410},{11,0,98},{11,0,524},{141,0,87},{132,0,941},{135,11,1175},{4,0, 250},{7,0,1612},{11,0,186},{12,0,133},{6,10,127},{7,10,1511},{8,10,613},{12,10, 495},{12,10,586},{12,10,660},{12,10,668},{14,10,385},{15,10,118},{17,10,20},{146 ,10,98},{6,0,1785},{133,11,816},{134,0,1339},{7,0,961},{7,0,1085},{7,0,1727},{8, 0,462},{6,10,230},{135,11,1727},{9,0,636},{135,10,1954},{132,0,780},{5,11,869},{ 5,11,968},{6,11,1626},{8,11,734},{136,11,784},{4,11,542},{6,11,1716},{6,11,1727} ,{7,11,1082},{7,11,1545},{8,11,56},{8,11,118},{8,11,412},{8,11,564},{9,11,888},{ 9,11,908},{10,11,50},{10,11,423},{11,11,685},{11,11,697},{11,11,933},{12,11,299} ,{13,11,126},{13,11,136},{13,11,170},{141,11,190},{134,11,226},{4,11,232},{9,11, 202},{10,11,474},{140,11,433},{137,11,500},{5,0,529},{136,10,68},{132,10,654},{4 ,10,156},{7,10,998},{7,10,1045},{7,10,1860},{9,10,48},{9,10,692},{11,10,419},{ 139,10,602},{7,0,1276},{8,0,474},{9,0,652},{6,11,108},{7,11,1003},{7,11,1181},{ 136,11,343},{7,11,1264},{7,11,1678},{11,11,945},{12,11,341},{12,11,471},{140,11, 569},{134,11,1712},{5,0,948},{12,0,468},{19,0,96},{148,0,24},{4,11,133},{7,11, 711},{7,11,1298},{7,11,1585},{135,11,1929},{6,0,753},{140,0,657},{139,0,941},{6, 11,99},{7,11,1808},{145,11,57},{6,11,574},{7,11,428},{7,11,1250},{10,11,669},{11 ,11,485},{11,11,840},{12,11,300},{142,11,250},{4,0,532},{5,0,706},{135,0,662},{5 ,0,837},{6,0,1651},{139,0,985},{7,0,1861},{9,10,197},{10,10,300},{12,10,473},{13 ,10,90},{141,10,405},{137,11,252},{6,11,323},{135,11,1564},{4,0,330},{4,0,863},{ 7,0,933},{7,0,2012},{8,0,292},{7,11,461},{8,11,775},{138,11,435},{132,10,606},{4 ,11,655},{7,11,850},{17,11,75},{146,11,137},{135,0,767},{7,10,1978},{136,10,676} ,{132,0,641},{135,11,1559},{134,0,1233},{137,0,242},{17,0,114},{4,10,361},{133, 10,315},{137,0,883},{132,10,461},{138,0,274},{134,0,2008},{134,0,1794},{4,0,703} ,{135,0,207},{12,0,285},{132,10,472},{132,0,571},{5,0,873},{5,0,960},{8,0,823},{ 9,0,881},{136,11,577},{7,0,617},{10,0,498},{11,0,501},{12,0,16},{140,0,150},{138 ,10,747},{132,0,431},{133,10,155},{11,0,283},{11,0,567},{7,10,163},{8,10,319},{9 ,10,402},{10,10,24},{10,10,681},{11,10,200},{12,10,253},{12,10,410},{142,10,219} ,{4,11,413},{5,11,677},{8,11,432},{140,11,280},{9,0,401},{5,10,475},{7,10,1780}, {11,10,297},{11,10,558},{14,10,322},{147,10,76},{6,0,781},{9,0,134},{10,0,2},{10 ,0,27},{10,0,333},{11,0,722},{143,0,1},{5,0,33},{6,0,470},{139,0,424},{135,0, 2006},{12,0,783},{135,10,1956},{136,0,274},{135,0,1882},{132,0,794},{135,0,1848} ,{5,10,944},{134,10,1769},{6,0,47},{7,0,90},{7,0,664},{7,0,830},{7,0,1380},{7,0, 2025},{8,0,448},{136,0,828},{132,10,144},{134,0,1199},{4,11,395},{139,11,762},{ 135,11,1504},{9,0,417},{137,0,493},{9,11,174},{10,11,164},{11,11,440},{11,11,841 },{143,11,98},{134,11,426},{139,11,1002},{134,0,295},{134,0,816},{6,10,247},{137 ,10,555},{133,0,1019},{4,0,620},{5,11,476},{10,10,280},{138,10,797},{139,0,464}, {5,11,76},{6,11,458},{6,11,497},{7,11,764},{7,11,868},{9,11,658},{10,11,594},{11 ,11,173},{11,11,566},{12,11,20},{12,11,338},{141,11,200},{134,0,208},{4,11,526}, {7,11,1029},{135,11,1054},{132,11,636},{6,11,233},{7,11,660},{7,11,1124},{17,11, 31},{19,11,22},{151,11,14},{10,0,442},{133,10,428},{10,0,930},{140,0,778},{6,0, 68},{7,0,448},{7,0,1629},{7,0,1769},{7,0,1813},{8,0,442},{8,0,516},{9,0,710},{10 ,0,282},{10,0,722},{7,10,1717},{138,10,546},{134,0,1128},{11,0,844},{12,0,104},{ 140,0,625},{4,11,432},{135,11,824},{138,10,189},{133,0,787},{133,10,99},{4,11, 279},{7,11,301},{137,11,362},{8,0,491},{4,10,397},{136,10,555},{4,11,178},{133, 11,399},{134,0,711},{144,0,9},{4,0,403},{5,0,441},{7,0,450},{10,0,840},{11,0,101 },{12,0,193},{141,0,430},{135,11,1246},{12,10,398},{20,10,39},{21,10,11},{150,10 ,41},{4,10,485},{7,10,353},{135,10,1523},{6,10,366},{7,10,1384},{7,10,1601},{135 ,11,1912},{7,0,396},{10,0,160},{135,11,396},{137,10,282},{134,11,1692},{4,10,157 },{5,10,471},{6,11,202},{10,11,448},{11,11,208},{12,11,360},{17,11,117},{17,11, 118},{18,11,27},{148,11,67},{133,0,679},{137,0,326},{136,10,116},{7,11,872},{10, 11,516},{139,11,167},{132,11,224},{5,11,546},{7,11,35},{8,11,11},{8,11,12},{9,11 ,315},{9,11,533},{10,11,802},{11,11,166},{12,11,525},{142,11,243},{7,0,1128},{ 135,11,1920},{5,11,241},{8,11,242},{9,11,451},{10,11,667},{11,11,598},{140,11, 429},{6,0,737},{5,10,160},{7,10,363},{7,10,589},{10,10,170},{141,10,55},{135,0, 1796},{142,11,254},{4,0,574},{7,0,350},{7,0,1024},{8,0,338},{9,0,677},{138,0,808 },{134,0,1096},{137,11,516},{7,0,405},{10,0,491},{4,10,108},{4,11,366},{139,10, 498},{11,11,337},{142,11,303},{134,11,1736},{7,0,1081},{140,11,364},{7,10,1005}, {140,10,609},{7,0,1676},{4,10,895},{133,10,772},{135,0,2037},{6,0,1207},{11,11, 916},{142,11,419},{14,11,140},{148,11,41},{6,11,331},{136,11,623},{9,0,944},{9,0 ,969},{9,0,1022},{12,0,913},{12,0,936},{15,0,177},{15,0,193},{4,10,926},{133,10, 983},{5,0,354},{135,11,506},{8,0,598},{9,0,664},{138,0,441},{4,11,640},{133,11, 513},{137,0,297},{132,10,538},{6,10,294},{7,10,1267},{136,10,624},{7,0,1772},{7, 11,1888},{8,11,289},{11,11,45},{12,11,278},{140,11,537},{135,10,1325},{138,0,751 },{141,0,37},{134,0,1828},{132,10,757},{132,11,394},{6,0,257},{135,0,1522},{4,0, 582},{9,0,191},{135,11,1931},{7,11,574},{7,11,1719},{137,11,145},{132,11,658},{ 10,0,790},{132,11,369},{9,11,781},{10,11,144},{11,11,385},{13,11,161},{13,11,228 },{13,11,268},{148,11,107},{8,0,469},{10,0,47},{136,11,374},{6,0,306},{7,0,1140} ,{7,0,1340},{8,0,133},{138,0,449},{139,0,1011},{7,10,1875},{139,10,124},{4,11, 344},{6,11,498},{139,11,323},{137,0,299},{132,0,837},{133,11,906},{5,0,329},{8,0 ,260},{138,0,10},{134,0,1320},{4,0,657},{146,0,158},{135,0,1191},{152,0,7},{6,0, 1939},{8,0,974},{138,0,996},{135,0,1665},{11,11,126},{139,11,287},{143,0,8},{14, 11,149},{14,11,399},{143,11,57},{5,0,66},{7,0,1896},{136,0,288},{7,0,175},{10,0, 494},{5,10,150},{8,10,603},{9,10,593},{9,10,634},{10,10,173},{11,10,462},{11,10, 515},{13,10,216},{13,10,288},{142,10,400},{134,0,1643},{136,11,21},{4,0,21},{5,0 ,91},{5,0,648},{5,0,750},{5,0,781},{6,0,54},{6,0,112},{6,0,402},{6,0,1732},{7,0, 315},{7,0,749},{7,0,1427},{7,0,1900},{9,0,78},{9,0,508},{10,0,611},{10,0,811},{ 11,0,510},{11,0,728},{13,0,36},{14,0,39},{16,0,83},{17,0,124},{148,0,30},{4,0, 668},{136,0,570},{10,0,322},{10,0,719},{139,0,407},{135,11,1381},{136,11,193},{ 12,10,108},{141,10,291},{132,11,616},{136,11,692},{8,0,125},{8,0,369},{8,0,524}, {10,0,486},{11,0,13},{11,0,381},{11,0,736},{11,0,766},{11,0,845},{13,0,114},{13, 0,292},{142,0,47},{134,0,1247},{6,0,1684},{6,0,1731},{7,0,356},{8,0,54},{8,0,221 },{9,0,225},{9,0,356},{10,0,77},{10,0,446},{10,0,731},{12,0,404},{141,0,491},{ 135,10,1777},{4,11,305},{4,10,493},{144,10,55},{4,0,951},{6,0,1809},{6,0,1849},{ 8,0,846},{8,0,866},{8,0,899},{10,0,896},{12,0,694},{142,0,468},{5,11,214},{7,11, 603},{8,11,611},{9,11,686},{10,11,88},{11,11,459},{11,11,496},{12,11,463},{12,11 ,590},{13,11,0},{142,11,214},{132,0,411},{4,0,80},{133,0,44},{140,11,74},{143,0, 31},{7,0,669},{6,10,568},{7,10,1804},{8,10,362},{8,10,410},{8,10,830},{9,10,514} ,{11,10,649},{142,10,157},{7,0,673},{134,11,1703},{132,10,625},{134,0,1303},{5,0 ,299},{135,0,1083},{138,0,704},{6,0,275},{7,0,408},{6,10,158},{7,10,129},{7,10, 181},{8,10,276},{8,10,377},{10,10,523},{11,10,816},{12,10,455},{13,10,303},{142, 10,135},{4,0,219},{7,0,367},{7,0,1713},{7,0,1761},{9,0,86},{9,0,537},{10,0,165}, {12,0,219},{140,0,561},{8,0,216},{4,10,1},{4,11,737},{6,11,317},{7,10,1143},{7, 10,1463},{9,10,207},{9,10,390},{9,10,467},{10,11,98},{11,11,294},{11,10,836},{12 ,11,60},{12,11,437},{13,11,64},{13,11,380},{142,11,430},{6,11,1758},{8,11,520},{ 9,11,345},{9,11,403},{142,11,350},{5,11,47},{10,11,242},{138,11,579},{5,11,139}, {7,11,1168},{138,11,539},{135,0,1319},{4,10,295},{4,10,723},{5,10,895},{7,10, 1031},{8,10,199},{8,10,340},{9,10,153},{9,10,215},{10,10,21},{10,10,59},{10,10, 80},{10,10,224},{10,10,838},{11,10,229},{11,10,652},{12,10,192},{13,10,146},{142 ,10,91},{140,0,428},{137,10,51},{133,0,514},{5,10,309},{140,10,211},{6,0,1010},{ 5,10,125},{8,10,77},{138,10,15},{4,0,55},{5,0,301},{6,0,571},{142,0,49},{146,0, 102},{136,11,370},{4,11,107},{7,11,613},{8,11,358},{8,11,439},{8,11,504},{9,11, 501},{10,11,383},{139,11,477},{132,11,229},{133,0,364},{133,10,439},{4,11,903},{ 135,11,1816},{11,0,379},{140,10,76},{4,0,76},{4,0,971},{7,0,1550},{9,0,306},{9,0 ,430},{9,0,663},{10,0,683},{10,0,921},{11,0,427},{11,0,753},{12,0,334},{12,0,442 },{14,0,258},{14,0,366},{143,0,131},{137,0,52},{4,11,47},{6,11,373},{7,11,452},{ 7,11,543},{7,11,1714},{7,11,1856},{9,11,6},{11,11,257},{139,11,391},{4,10,8},{7, 10,1152},{7,10,1153},{7,10,1715},{9,10,374},{10,10,478},{139,10,648},{4,11,785}, {133,11,368},{135,10,1099},{135,11,860},{5,11,980},{134,11,1754},{134,0,1258},{6 ,0,1058},{6,0,1359},{7,11,536},{7,11,1331},{136,11,143},{4,0,656},{135,0,779},{ 136,10,87},{5,11,19},{6,11,533},{146,11,126},{7,0,144},{138,10,438},{5,11,395},{ 5,11,951},{134,11,1776},{135,0,1373},{7,0,554},{7,0,605},{141,0,10},{4,10,69},{5 ,10,122},{9,10,656},{138,10,464},{5,10,849},{134,10,1633},{5,0,838},{5,0,841},{ 134,0,1649},{133,0,1012},{139,10,499},{7,10,476},{7,10,1592},{138,10,87},{6,0, 251},{7,0,365},{7,0,1357},{7,0,1497},{8,0,154},{141,0,281},{132,11,441},{132,11, 695},{7,11,497},{9,11,387},{147,11,81},{133,0,340},{14,10,283},{142,11,283},{134 ,0,810},{135,11,1894},{139,0,495},{5,11,284},{6,11,49},{6,11,350},{7,11,1},{7,11 ,377},{7,11,1693},{8,11,18},{8,11,678},{9,11,161},{9,11,585},{9,11,671},{9,11, 839},{11,11,912},{141,11,427},{5,10,859},{7,10,1160},{8,10,107},{9,10,291},{9,10 ,439},{10,10,663},{11,10,609},{140,10,197},{8,0,261},{9,0,144},{9,0,466},{10,0, 370},{12,0,470},{13,0,144},{142,0,348},{137,0,897},{6,0,248},{9,0,546},{10,0,535 },{11,0,681},{141,0,135},{4,0,358},{135,0,1496},{134,0,567},{136,0,445},{4,10, 117},{6,10,372},{7,10,1905},{142,10,323},{4,10,722},{139,10,471},{6,0,697},{134, 0,996},{7,11,2007},{9,11,101},{9,11,450},{10,11,66},{10,11,842},{11,11,536},{140 ,11,587},{132,0,577},{134,0,1336},{9,10,5},{12,10,216},{12,10,294},{12,10,298},{ 12,10,400},{12,10,518},{13,10,229},{143,10,139},{6,0,174},{138,0,917},{134,10, 1774},{5,10,12},{7,10,375},{9,10,88},{9,10,438},{11,11,62},{139,10,270},{134,11, 1766},{6,11,0},{7,11,84},{7,10,816},{7,10,1241},{9,10,283},{9,10,520},{10,10,213 },{10,10,307},{10,10,463},{10,10,671},{10,10,746},{11,10,401},{11,10,794},{11,11 ,895},{12,10,517},{17,11,11},{18,10,107},{147,10,115},{5,0,878},{133,0,972},{6, 11,1665},{7,11,256},{7,11,1388},{138,11,499},{4,10,258},{136,10,639},{4,11,22},{ 5,11,10},{6,10,22},{7,11,848},{7,10,903},{7,10,1963},{8,11,97},{138,10,577},{5, 10,681},{136,10,782},{133,11,481},{132,0,351},{4,10,664},{5,10,804},{139,10,1013 },{6,11,134},{7,11,437},{7,11,959},{9,11,37},{14,11,285},{14,11,371},{144,11,60} ,{7,11,486},{8,11,155},{11,11,93},{140,11,164},{132,0,286},{7,0,438},{7,0,627},{ 7,0,1516},{8,0,40},{9,0,56},{9,0,294},{10,0,30},{11,0,969},{11,0,995},{146,0,148 },{5,11,591},{135,11,337},{134,0,1950},{133,10,32},{138,11,500},{5,11,380},{5,11 ,650},{136,11,310},{4,11,364},{7,11,1156},{7,11,1187},{137,11,409},{4,0,738},{ 134,11,482},{4,11,781},{6,11,487},{7,11,926},{8,11,263},{139,11,500},{135,11,418 },{6,0,2047},{10,0,969},{4,10,289},{7,10,629},{7,10,1698},{7,10,1711},{140,10, 215},{6,10,450},{136,10,109},{134,0,818},{136,10,705},{133,0,866},{4,11,94},{135 ,11,1265},{132,11,417},{134,0,1467},{135,10,1238},{4,0,972},{6,0,1851},{134,0, 1857},{134,0,355},{133,0,116},{132,0,457},{135,11,1411},{4,11,408},{4,11,741},{ 135,11,500},{134,10,26},{142,11,137},{5,0,527},{6,0,189},{7,0,859},{136,0,267},{ 11,0,104},{11,0,554},{15,0,60},{143,0,125},{134,0,1613},{4,10,414},{5,10,467},{9 ,10,654},{10,10,451},{12,10,59},{141,10,375},{135,10,17},{134,0,116},{135,11,541 },{135,10,955},{6,11,73},{135,11,177},{133,11,576},{134,0,886},{133,0,487},{4,0, 86},{5,0,667},{5,0,753},{6,0,316},{6,0,455},{135,0,946},{142,11,231},{150,0,45}, {134,0,863},{134,0,1953},{6,10,280},{10,10,502},{11,10,344},{140,10,38},{4,0,79} ,{7,0,1773},{10,0,450},{11,0,589},{13,0,332},{13,0,493},{14,0,183},{14,0,334},{ 14,0,362},{14,0,368},{14,0,376},{14,0,379},{19,0,90},{19,0,103},{19,0,127},{148, 0,90},{5,10,45},{7,10,1161},{11,10,448},{11,10,880},{13,10,139},{13,10,407},{15, 10,16},{17,10,95},{18,10,66},{18,10,88},{18,10,123},{149,10,7},{136,10,777},{4, 10,410},{135,10,521},{135,10,1778},{135,11,538},{142,0,381},{133,11,413},{134,0, 1142},{6,0,1189},{136,11,495},{5,0,663},{6,0,1962},{134,0,2003},{7,11,54},{8,11, 312},{10,11,191},{10,11,614},{140,11,567},{132,10,436},{133,0,846},{10,0,528},{ 11,0,504},{7,10,1587},{135,10,1707},{5,0,378},{8,0,465},{9,0,286},{10,0,185},{10 ,0,562},{10,0,635},{11,0,31},{11,0,393},{13,0,312},{18,0,65},{18,0,96},{147,0,89 },{7,0,899},{14,0,325},{6,11,468},{7,11,567},{7,11,1478},{8,11,530},{142,11,290} ,{7,0,1880},{9,0,680},{139,0,798},{134,0,1770},{132,0,648},{150,11,35},{5,0,945} ,{6,0,1656},{6,0,1787},{7,0,167},{8,0,824},{9,0,391},{10,0,375},{139,0,185},{6, 11,484},{135,11,822},{134,0,2046},{7,0,1645},{8,0,352},{137,0,249},{132,0,152},{ 6,0,611},{135,0,1733},{6,11,1724},{135,11,2022},{133,0,1006},{141,11,96},{5,0, 420},{135,0,1449},{146,11,149},{135,0,832},{135,10,663},{133,0,351},{5,0,40},{7, 0,598},{7,0,1638},{8,0,78},{9,0,166},{9,0,640},{9,0,685},{9,0,773},{11,0,215},{ 13,0,65},{14,0,172},{14,0,317},{145,0,6},{8,0,60},{9,0,343},{139,0,769},{134,0, 1354},{132,0,724},{137,0,745},{132,11,474},{7,0,1951},{8,0,765},{8,0,772},{140,0 ,671},{7,0,108},{8,0,219},{8,0,388},{9,0,775},{11,0,275},{140,0,464},{137,0,639} ,{135,10,503},{133,11,366},{5,0,15},{6,0,56},{7,0,1758},{8,0,500},{9,0,730},{11, 0,331},{13,0,150},{14,0,282},{5,11,305},{9,11,560},{141,11,208},{4,10,113},{5,10 ,163},{5,10,735},{7,10,1009},{9,10,9},{9,10,771},{12,10,90},{13,10,138},{13,10, 410},{143,10,128},{4,10,324},{138,10,104},{135,11,466},{142,11,27},{134,0,1886}, {5,0,205},{6,0,438},{9,0,711},{4,11,480},{6,11,167},{6,11,302},{6,11,1642},{7,11 ,130},{7,11,656},{7,11,837},{7,11,1547},{7,11,1657},{8,11,429},{9,11,228},{10,11 ,643},{13,11,289},{13,11,343},{147,11,101},{134,0,865},{6,0,2025},{136,0,965},{7 ,11,278},{10,11,739},{11,11,708},{141,11,348},{133,0,534},{135,11,1922},{137,0, 691},{4,10,935},{133,10,823},{6,0,443},{9,0,237},{9,0,571},{9,0,695},{10,0,139}, {11,0,715},{12,0,417},{141,0,421},{5,10,269},{7,10,434},{7,10,891},{8,10,339},{9 ,10,702},{11,10,594},{11,10,718},{145,10,100},{6,0,1555},{7,0,878},{9,10,485},{ 141,10,264},{134,10,1713},{7,10,1810},{11,10,866},{12,10,103},{141,10,495},{135, 10,900},{6,0,1410},{9,11,316},{139,11,256},{4,0,995},{135,0,1033},{132,0,578},{ 10,0,881},{12,0,740},{12,0,743},{140,0,759},{132,0,822},{133,0,923},{142,10,143} ,{135,11,1696},{6,11,363},{7,11,1955},{136,11,725},{132,0,924},{133,0,665},{135, 10,2029},{135,0,1901},{4,0,265},{6,0,1092},{6,0,1417},{7,0,807},{135,0,950},{5,0 ,93},{12,0,267},{141,0,498},{135,0,1451},{5,11,813},{135,11,2046},{5,10,625},{ 135,10,1617},{135,0,747},{6,0,788},{137,0,828},{7,0,184},{11,0,307},{11,0,400},{ 15,0,130},{5,11,712},{7,11,1855},{8,10,425},{8,10,693},{9,10,720},{10,10,380},{ 10,10,638},{11,11,17},{11,10,473},{12,10,61},{13,11,321},{144,11,67},{135,0,198} ,{6,11,320},{7,11,781},{7,11,1921},{9,11,55},{10,11,186},{10,11,273},{10,11,664} ,{10,11,801},{11,11,996},{11,11,997},{13,11,157},{142,11,170},{136,11,271},{135, 0,994},{7,11,103},{7,11,863},{11,11,184},{14,11,299},{145,11,62},{11,10,551},{ 142,10,159},{5,0,233},{5,0,320},{6,0,140},{8,0,295},{8,0,615},{136,11,615},{133, 0,978},{4,0,905},{6,0,1701},{137,0,843},{132,10,168},{4,0,974},{8,0,850},{12,0, 709},{12,0,768},{140,0,786},{135,10,91},{152,0,6},{138,10,532},{135,10,1884},{ 132,0,509},{6,0,1307},{135,0,273},{5,11,77},{7,11,1455},{10,11,843},{19,11,73},{ 150,11,5},{132,11,458},{135,11,1420},{6,11,109},{138,11,382},{6,0,201},{6,11,330 },{7,10,70},{7,11,1084},{10,10,240},{11,11,142},{147,10,93},{7,0,1041},{140,11, 328},{133,11,354},{134,0,1040},{133,0,693},{134,0,774},{139,0,234},{132,0,336},{ 7,0,1399},{139,10,392},{20,0,22},{148,11,22},{5,0,802},{7,0,2021},{136,0,805},{5 ,0,167},{5,0,899},{6,0,410},{137,0,777},{137,0,789},{134,0,1705},{7,10,655},{135 ,10,1844},{4,10,145},{6,10,176},{7,10,395},{137,10,562},{132,10,501},{135,0,10}, {5,0,11},{6,0,117},{6,0,485},{7,0,1133},{9,0,582},{9,0,594},{10,0,82},{11,0,21}, {11,0,818},{12,0,535},{13,0,86},{20,0,91},{23,0,13},{134,10,509},{4,0,264},{7,0, 1067},{8,0,204},{8,0,385},{139,0,953},{139,11,737},{138,0,56},{134,0,1917},{133, 0,470},{10,11,657},{14,11,297},{142,11,361},{135,11,412},{7,0,1198},{7,11,1198}, {8,11,556},{14,11,123},{14,11,192},{143,11,27},{7,11,1985},{14,11,146},{15,11,42 },{16,11,23},{17,11,86},{146,11,17},{11,0,1015},{136,11,122},{4,10,114},{9,10, 492},{13,10,462},{142,10,215},{4,10,77},{5,10,361},{6,10,139},{6,10,401},{6,10, 404},{7,10,413},{7,10,715},{7,10,1716},{11,10,279},{12,10,179},{12,10,258},{13, 10,244},{142,10,358},{134,10,1717},{7,10,1061},{8,10,82},{11,10,250},{12,10,420} ,{141,10,184},{133,0,715},{135,10,724},{9,0,919},{9,0,922},{9,0,927},{9,0,933},{ 9,0,962},{9,0,1000},{9,0,1002},{9,0,1021},{12,0,890},{12,0,907},{12,0,930},{15,0 ,207},{15,0,228},{15,0,238},{149,0,61},{8,0,794},{9,0,400},{10,0,298},{142,0,228 },{5,11,430},{5,11,932},{6,11,131},{7,11,417},{9,11,522},{11,11,314},{141,11,390 },{132,0,867},{8,0,724},{132,11,507},{137,11,261},{4,11,343},{133,11,511},{6,0, 190},{7,0,768},{135,0,1170},{6,10,513},{135,10,1052},{7,11,455},{138,11,591},{ 134,0,1066},{137,10,899},{14,0,67},{147,0,60},{4,0,948},{18,0,174},{146,0,176},{ 135,0,1023},{7,10,1417},{12,10,382},{17,10,48},{152,10,12},{134,11,575},{132,0, 764},{6,10,545},{7,10,565},{7,10,1669},{10,10,114},{11,10,642},{140,10,618},{6,0 ,137},{9,0,75},{9,0,253},{10,0,194},{138,0,444},{4,0,756},{133,10,5},{8,0,1008}, {135,10,192},{132,0,842},{11,0,643},{12,0,115},{136,10,763},{139,0,67},{133,10, 759},{4,0,821},{5,0,760},{7,0,542},{8,0,135},{8,0,496},{135,11,580},{7,10,370},{ 7,10,1007},{7,10,1177},{135,10,1565},{135,10,1237},{140,0,736},{7,0,319},{7,0, 355},{7,0,763},{10,0,389},{145,0,43},{8,11,333},{138,11,182},{4,10,87},{5,10,250 },{141,10,298},{138,0,786},{134,0,2044},{8,11,330},{140,11,477},{135,11,1338},{ 132,11,125},{134,0,1030},{134,0,1083},{132,11,721},{135,10,814},{7,11,776},{8,11 ,145},{147,11,56},{134,0,1226},{4,10,57},{7,10,1195},{7,10,1438},{7,10,1548},{7, 10,1835},{7,10,1904},{9,10,757},{10,10,604},{139,10,519},{7,11,792},{8,11,147},{ 10,11,821},{139,11,1021},{137,11,797},{4,0,58},{5,0,286},{6,0,319},{7,0,402},{7, 0,1254},{7,0,1903},{8,0,356},{140,0,408},{4,0,389},{4,0,815},{9,0,181},{9,0,255} ,{10,0,8},{10,0,29},{10,0,816},{11,0,311},{11,0,561},{12,0,67},{141,0,181},{7,11 ,1472},{135,11,1554},{7,11,1071},{7,11,1541},{7,11,1767},{7,11,1806},{7,11,1999} ,{9,11,248},{10,11,400},{11,11,162},{11,11,178},{11,11,242},{12,11,605},{15,11, 26},{144,11,44},{5,11,168},{5,11,930},{8,11,74},{9,11,623},{12,11,500},{12,11, 579},{13,11,41},{143,11,93},{6,11,220},{7,11,1101},{141,11,105},{5,0,474},{7,0, 507},{4,10,209},{7,11,507},{135,10,902},{132,0,427},{6,0,413},{7,10,335},{7,10, 1437},{7,10,1668},{8,10,553},{8,10,652},{8,10,656},{9,10,558},{11,10,743},{149, 10,18},{132,0,730},{6,11,19},{7,11,1413},{139,11,428},{133,0,373},{132,10,559},{ 7,11,96},{8,11,401},{137,11,896},{7,0,799},{7,0,1972},{5,10,1017},{138,10,511},{ 135,0,1793},{7,11,1961},{7,11,1965},{8,11,702},{136,11,750},{8,11,150},{8,11,737 },{140,11,366},{132,0,322},{133,10,709},{8,11,800},{9,11,148},{9,11,872},{9,11, 890},{11,11,309},{11,11,1001},{13,11,267},{141,11,323},{134,10,1745},{7,0,290},{ 136,10,206},{7,0,1651},{145,0,89},{139,0,2},{132,0,672},{6,0,1860},{8,0,905},{10 ,0,844},{10,0,846},{10,0,858},{12,0,699},{12,0,746},{140,0,772},{135,11,424},{ 133,11,547},{133,0,737},{5,11,490},{6,11,615},{6,11,620},{135,11,683},{6,0,746}, {134,0,1612},{132,10,776},{9,11,385},{149,11,17},{133,0,145},{135,10,1272},{7,0, 884},{140,0,124},{4,0,387},{135,0,1288},{5,11,133},{136,10,406},{136,11,187},{6, 0,679},{8,11,8},{138,11,0},{135,0,550},{135,11,798},{136,11,685},{7,11,1086},{ 145,11,46},{8,10,175},{10,10,168},{138,10,573},{135,0,1305},{4,0,576},{135,0, 1263},{6,0,686},{134,0,1563},{134,0,607},{5,0,919},{134,0,1673},{148,0,37},{8,11 ,774},{10,11,670},{140,11,51},{133,10,784},{139,10,882},{4,0,82},{5,0,333},{5,0, 904},{6,0,207},{7,0,325},{7,0,1726},{8,0,101},{10,0,778},{139,0,220},{135,11,371 },{132,0,958},{133,0,903},{4,11,127},{5,11,350},{6,11,356},{8,11,426},{9,11,572} ,{10,11,247},{139,11,312},{140,0,147},{6,11,59},{7,11,885},{9,11,603},{141,11, 397},{10,0,367},{9,10,14},{9,10,441},{139,10,9},{11,10,966},{12,10,287},{13,10, 342},{13,10,402},{15,10,110},{143,10,163},{134,0,690},{132,0,705},{9,0,651},{11, 0,971},{13,0,273},{7,10,1428},{7,10,1640},{7,10,1867},{9,10,169},{9,10,182},{9, 10,367},{9,10,478},{9,10,506},{9,10,551},{9,10,557},{9,10,648},{9,10,697},{9,10, 705},{9,10,725},{9,10,787},{9,10,794},{10,10,198},{10,10,214},{10,10,267},{10,10 ,275},{10,10,456},{10,10,551},{10,10,561},{10,10,613},{10,10,627},{10,10,668},{ 10,10,675},{10,10,691},{10,10,695},{10,10,707},{10,10,715},{11,10,183},{11,10, 201},{11,10,262},{11,10,352},{11,10,439},{11,10,493},{11,10,572},{11,10,591},{11 ,10,608},{11,10,611},{11,10,646},{11,10,674},{11,10,711},{11,10,751},{11,10,761} ,{11,10,776},{11,10,785},{11,10,850},{11,10,853},{11,10,862},{11,10,865},{11,10, 868},{11,10,875},{11,10,898},{11,10,902},{11,10,903},{11,10,910},{11,10,932},{11 ,10,942},{11,10,957},{11,10,967},{11,10,972},{12,10,148},{12,10,195},{12,10,220} ,{12,10,237},{12,10,318},{12,10,339},{12,10,393},{12,10,445},{12,10,450},{12,10, 474},{12,10,505},{12,10,509},{12,10,533},{12,10,591},{12,10,594},{12,10,597},{12 ,10,621},{12,10,633},{12,10,642},{13,10,59},{13,10,60},{13,10,145},{13,10,239},{ 13,10,250},{13,10,329},{13,10,344},{13,10,365},{13,10,372},{13,10,387},{13,10, 403},{13,10,414},{13,10,456},{13,10,470},{13,10,478},{13,10,483},{13,10,489},{14 ,10,55},{14,10,57},{14,10,81},{14,10,90},{14,10,148},{14,10,239},{14,10,266},{14 ,10,321},{14,10,326},{14,10,327},{14,10,330},{14,10,347},{14,10,355},{14,10,401} ,{14,10,404},{14,10,411},{14,10,414},{14,10,416},{14,10,420},{15,10,61},{15,10, 74},{15,10,87},{15,10,88},{15,10,94},{15,10,96},{15,10,116},{15,10,149},{15,10, 154},{16,10,50},{16,10,63},{16,10,73},{17,10,2},{17,10,66},{17,10,92},{17,10,103 },{17,10,112},{17,10,120},{18,10,50},{18,10,54},{18,10,82},{18,10,86},{18,10,90} ,{18,10,111},{18,10,115},{18,10,156},{19,10,40},{19,10,79},{20,10,78},{149,10,22 },{7,0,887},{5,10,161},{135,10,839},{142,11,98},{134,0,90},{138,11,356},{135,11, 441},{6,11,111},{7,11,4},{8,11,163},{8,11,776},{138,11,566},{134,0,908},{134,0, 1261},{7,0,813},{12,0,497},{141,0,56},{134,0,1235},{135,0,429},{135,11,1994},{ 138,0,904},{6,0,125},{7,0,1277},{137,0,772},{151,0,12},{4,0,841},{5,0,386},{133, 11,386},{5,11,297},{135,11,1038},{6,0,860},{6,0,1069},{135,11,309},{136,0,946},{ 135,10,1814},{141,11,418},{136,11,363},{10,0,768},{139,0,787},{22,11,30},{150,11 ,33},{6,0,160},{7,0,1106},{9,0,770},{11,0,112},{140,0,413},{11,11,216},{139,11, 340},{136,10,139},{135,11,1390},{135,11,808},{132,11,280},{12,0,271},{17,0,109}, {7,10,643},{136,10,236},{140,11,54},{4,11,421},{133,11,548},{11,0,719},{12,0,36} ,{141,0,337},{7,0,581},{9,0,644},{137,0,699},{11,11,511},{13,11,394},{14,11,298} ,{14,11,318},{146,11,103},{7,0,304},{9,0,646},{9,0,862},{11,0,696},{12,0,208},{ 15,0,79},{147,0,108},{4,0,631},{7,0,1126},{135,0,1536},{135,11,1527},{8,0,880},{ 10,0,869},{138,0,913},{7,0,1513},{5,10,54},{6,11,254},{9,11,109},{138,11,103},{ 135,0,981},{133,11,729},{132,10,744},{132,0,434},{134,0,550},{7,0,930},{10,0,476 },{13,0,452},{19,0,104},{6,11,1630},{10,10,402},{146,10,55},{5,0,553},{138,0,824 },{136,0,452},{8,0,151},{137,10,624},{132,10,572},{132,0,772},{133,11,671},{133, 0,292},{138,0,135},{132,11,889},{140,11,207},{9,0,504},{6,10,43},{7,10,38},{8,10 ,248},{138,10,513},{6,0,1089},{135,11,1910},{4,11,627},{133,11,775},{135,0,783}, {133,10,766},{133,10,363},{7,0,387},{135,11,387},{7,0,393},{10,0,603},{11,0,206} ,{7,11,202},{11,11,362},{11,11,948},{140,11,388},{6,11,507},{7,11,451},{8,11,389 },{12,11,490},{13,11,16},{13,11,215},{13,11,351},{18,11,132},{147,11,125},{4,0, 912},{9,0,232},{135,11,841},{6,10,258},{140,10,409},{5,10,249},{148,10,82},{136, 11,566},{6,0,977},{135,11,1214},{7,0,1973},{136,0,716},{135,0,98},{133,0,733},{5 ,11,912},{134,11,1695},{5,10,393},{6,10,378},{7,10,1981},{9,10,32},{9,10,591},{ 10,10,685},{10,10,741},{142,10,382},{133,10,788},{10,0,19},{11,0,911},{7,10,1968 },{141,10,509},{5,0,668},{5,11,236},{6,11,572},{8,11,492},{11,11,618},{144,11,56 },{135,11,1789},{4,0,360},{5,0,635},{5,0,700},{5,10,58},{5,10,171},{5,10,683},{6 ,10,291},{6,10,566},{7,10,1650},{11,10,523},{12,10,273},{12,10,303},{15,10,39},{ 143,10,111},{133,0,901},{134,10,589},{5,11,190},{136,11,318},{140,0,656},{7,0, 726},{152,0,9},{4,10,917},{133,10,1005},{135,10,1598},{134,11,491},{4,10,919},{ 133,11,434},{137,0,72},{6,0,1269},{6,0,1566},{134,0,1621},{9,0,463},{10,0,595},{ 4,10,255},{5,10,302},{6,10,132},{7,10,128},{7,10,283},{7,10,1299},{10,10,52},{10 ,10,514},{11,10,925},{13,10,92},{142,10,309},{135,0,1454},{134,0,1287},{11,0,600 },{13,0,245},{137,10,173},{136,0,989},{7,0,164},{7,0,1571},{9,0,107},{140,0,225} ,{6,0,1061},{141,10,442},{4,0,27},{5,0,484},{5,0,510},{6,0,434},{7,0,1000},{7,0, 1098},{136,0,2},{7,11,85},{7,11,247},{8,11,585},{10,11,163},{138,11,316},{11,11, 103},{142,11,0},{134,0,1127},{4,0,460},{134,0,852},{134,10,210},{4,0,932},{133,0 ,891},{6,0,588},{147,11,83},{8,0,625},{4,10,284},{134,10,223},{134,0,76},{8,0,92 },{137,0,221},{4,11,124},{10,11,457},{11,11,121},{11,11,169},{11,11,422},{11,11, 870},{12,11,214},{13,11,389},{14,11,187},{143,11,77},{9,11,618},{138,11,482},{4, 10,218},{7,10,526},{143,10,137},{13,0,9},{14,0,104},{14,0,311},{4,10,270},{5,10, 192},{6,10,332},{135,10,1322},{140,10,661},{135,11,1193},{6,11,107},{7,11,638},{ 7,11,1632},{137,11,396},{132,0,763},{4,0,622},{5,11,370},{134,11,1756},{133,0, 253},{135,0,546},{9,0,73},{10,0,110},{14,0,185},{17,0,119},{133,11,204},{7,0,624 },{7,0,916},{10,0,256},{139,0,87},{7,10,379},{8,10,481},{137,10,377},{5,0,212},{ 12,0,35},{13,0,382},{5,11,970},{134,11,1706},{9,0,746},{5,10,1003},{134,10,149}, {10,0,150},{11,0,849},{13,0,330},{8,10,262},{9,10,627},{11,10,214},{11,10,404},{ 11,10,457},{11,10,780},{11,10,913},{13,10,401},{142,10,200},{134,0,1466},{135,11 ,3},{6,0,1299},{4,11,35},{5,11,121},{5,11,483},{5,11,685},{6,11,489},{7,11,1204} ,{136,11,394},{135,10,742},{4,10,142},{136,10,304},{4,11,921},{133,11,1007},{134 ,0,1518},{6,0,1229},{135,0,1175},{133,0,816},{12,0,159},{4,10,471},{4,11,712},{5 ,10,51},{6,10,602},{7,10,925},{8,10,484},{138,10,195},{134,11,1629},{5,0,869},{5 ,0,968},{6,0,1626},{8,0,734},{136,0,784},{4,0,542},{6,0,1716},{6,0,1727},{7,0, 1082},{7,0,1545},{8,0,56},{8,0,118},{8,0,412},{8,0,564},{9,0,888},{9,0,908},{10, 0,50},{10,0,423},{11,0,685},{11,0,697},{11,0,933},{12,0,299},{13,0,126},{13,0, 136},{13,0,170},{13,0,190},{136,10,688},{132,10,697},{4,0,232},{9,0,202},{10,0, 474},{140,0,433},{136,0,212},{6,0,108},{7,0,1003},{7,0,1181},{8,0,111},{136,0, 343},{5,10,221},{135,11,1255},{133,11,485},{134,0,1712},{142,0,216},{5,0,643},{6 ,0,516},{4,11,285},{5,11,317},{6,11,301},{7,11,7},{8,11,153},{10,11,766},{11,11, 468},{12,11,467},{141,11,143},{4,0,133},{7,0,711},{7,0,1298},{135,0,1585},{134,0 ,650},{135,11,512},{6,0,99},{7,0,1808},{145,0,57},{6,0,246},{6,0,574},{7,0,428}, {9,0,793},{10,0,669},{11,0,485},{11,0,840},{12,0,300},{14,0,250},{145,0,55},{4, 10,132},{5,10,69},{135,10,1242},{136,0,1023},{7,0,302},{132,10,111},{135,0,1871} ,{132,0,728},{9,0,252},{132,10,767},{6,0,461},{7,0,1590},{7,10,1416},{7,10,2005} ,{8,10,131},{8,10,466},{9,10,672},{13,10,252},{148,10,103},{6,0,323},{135,0,1564 },{7,0,461},{136,0,775},{6,10,44},{136,10,368},{139,0,172},{132,0,464},{4,10,570 },{133,10,120},{137,11,269},{6,10,227},{135,10,1589},{6,11,1719},{6,11,1735},{7, 11,2016},{7,11,2020},{8,11,837},{137,11,852},{7,0,727},{146,0,73},{132,0,1023},{ 135,11,852},{135,10,1529},{136,0,577},{138,11,568},{134,0,1037},{8,11,67},{138, 11,419},{4,0,413},{5,0,677},{8,0,432},{140,0,280},{10,0,600},{6,10,1667},{7,11, 967},{7,10,2036},{141,11,11},{6,10,511},{140,10,132},{6,0,799},{5,10,568},{6,10, 138},{135,10,1293},{8,0,159},{4,10,565},{136,10,827},{7,0,646},{7,0,1730},{11,0, 446},{141,0,178},{4,10,922},{133,10,1023},{135,11,11},{132,0,395},{11,0,145},{ 135,10,1002},{9,0,174},{10,0,164},{11,0,440},{11,0,514},{11,0,841},{15,0,98},{ 149,0,20},{134,0,426},{10,0,608},{139,0,1002},{7,11,320},{8,11,51},{12,11,481},{ 12,11,570},{148,11,106},{9,0,977},{9,0,983},{132,11,445},{138,0,250},{139,0,100} ,{6,0,1982},{136,10,402},{133,11,239},{4,10,716},{141,10,31},{5,0,476},{7,11,83} ,{7,11,1990},{8,11,130},{139,11,720},{8,10,691},{136,10,731},{5,11,123},{6,11, 530},{7,11,348},{135,11,1419},{5,0,76},{6,0,458},{6,0,497},{7,0,868},{9,0,658},{ 10,0,594},{11,0,173},{11,0,566},{12,0,20},{12,0,338},{141,0,200},{9,11,139},{10, 11,399},{11,11,469},{12,11,634},{141,11,223},{9,10,840},{138,10,803},{133,10,847 },{11,11,223},{140,11,168},{132,11,210},{8,0,447},{9,10,53},{9,10,268},{9,10,901 },{10,10,518},{10,10,829},{11,10,188},{13,10,74},{14,10,46},{15,10,17},{15,10,33 },{17,10,40},{18,10,36},{19,10,20},{22,10,1},{152,10,2},{4,0,526},{7,0,1029},{ 135,0,1054},{19,11,59},{150,11,2},{4,0,636},{6,0,1875},{6,0,1920},{9,0,999},{12, 0,807},{12,0,825},{15,0,179},{15,0,190},{18,0,182},{136,10,532},{6,0,1699},{7,0, 660},{7,0,1124},{17,0,31},{19,0,22},{151,0,14},{135,10,681},{132,11,430},{140,10 ,677},{4,10,684},{136,10,384},{132,11,756},{133,11,213},{7,0,188},{7,10,110},{8, 10,290},{8,10,591},{9,10,382},{9,10,649},{11,10,71},{11,10,155},{11,10,313},{12, 10,5},{13,10,325},{142,10,287},{7,10,360},{7,10,425},{9,10,66},{9,10,278},{138, 10,644},{142,11,164},{4,0,279},{7,0,301},{137,0,362},{134,11,586},{135,0,1743},{ 4,0,178},{133,0,399},{4,10,900},{133,10,861},{5,10,254},{7,10,985},{136,10,73},{ 133,11,108},{7,10,1959},{136,10,683},{133,11,219},{4,11,193},{5,11,916},{7,11, 364},{10,11,398},{10,11,726},{11,11,317},{11,11,626},{12,11,142},{12,11,288},{12 ,11,678},{13,11,313},{15,11,113},{18,11,114},{21,11,30},{150,11,53},{6,11,241},{ 7,11,907},{8,11,832},{9,11,342},{10,11,729},{11,11,284},{11,11,445},{11,11,651}, {11,11,863},{13,11,398},{146,11,99},{132,0,872},{134,0,831},{134,0,1692},{6,0, 202},{6,0,1006},{9,0,832},{10,0,636},{11,0,208},{12,0,360},{17,0,118},{18,0,27}, {20,0,67},{137,11,734},{132,10,725},{7,11,993},{138,11,666},{134,0,1954},{134,10 ,196},{7,0,872},{10,0,516},{139,0,167},{133,10,831},{4,11,562},{9,11,254},{139, 11,879},{137,0,313},{4,0,224},{132,11,786},{11,0,24},{12,0,170},{136,10,723},{5, 0,546},{7,0,35},{8,0,11},{8,0,12},{9,0,315},{9,0,533},{10,0,802},{11,0,166},{12, 0,525},{142,0,243},{7,0,1937},{13,10,80},{13,10,437},{145,10,74},{5,0,241},{8,0, 242},{9,0,451},{10,0,667},{11,0,598},{140,0,429},{150,0,46},{6,0,1273},{137,0, 830},{5,10,848},{6,10,66},{136,10,764},{6,0,825},{134,0,993},{4,0,1006},{10,0, 327},{13,0,271},{4,10,36},{7,10,1387},{139,10,755},{134,0,1023},{135,0,1580},{4, 0,366},{137,0,516},{132,10,887},{6,0,1736},{135,0,1891},{6,11,216},{7,11,901},{7 ,11,1343},{136,11,493},{6,10,165},{138,10,388},{7,11,341},{139,11,219},{4,10,719 },{135,10,155},{134,0,1935},{132,0,826},{6,0,331},{6,0,1605},{8,0,623},{11,0,139 },{139,0,171},{135,11,1734},{10,11,115},{11,11,420},{12,11,154},{13,11,404},{14, 11,346},{15,11,54},{143,11,112},{7,0,288},{4,10,353},{6,10,146},{6,10,1789},{7, 10,990},{7,10,1348},{9,10,665},{9,10,898},{11,10,893},{142,10,212},{6,0,916},{ 134,0,1592},{7,0,1888},{4,10,45},{135,10,1257},{5,11,1011},{136,11,701},{139,11, 596},{4,11,54},{5,11,666},{7,11,1039},{7,11,1130},{9,11,195},{138,11,302},{134,0 ,1471},{134,0,1570},{132,0,394},{140,10,65},{136,10,816},{135,0,1931},{7,0,574}, {135,0,1719},{134,11,467},{132,0,658},{9,0,781},{10,0,144},{11,0,385},{13,0,161} ,{13,0,228},{13,0,268},{20,0,107},{134,11,1669},{136,0,374},{135,0,735},{4,0,344 },{6,0,498},{139,0,323},{7,0,586},{7,0,1063},{6,10,559},{134,10,1691},{137,0,155 },{133,0,906},{7,11,122},{9,11,259},{10,11,84},{11,11,470},{12,11,541},{141,11, 379},{134,0,1139},{10,0,108},{139,0,116},{134,10,456},{133,10,925},{5,11,82},{5, 11,131},{7,11,1755},{8,11,31},{9,11,168},{9,11,764},{139,11,869},{134,11,605},{5 ,11,278},{137,11,68},{4,11,163},{5,11,201},{5,11,307},{5,11,310},{6,11,335},{7, 11,284},{136,11,165},{135,11,1660},{6,11,33},{135,11,1244},{4,0,616},{136,11,483 },{8,0,857},{8,0,902},{8,0,910},{10,0,879},{12,0,726},{4,11,199},{139,11,34},{ 136,0,692},{6,10,193},{7,10,240},{7,10,1682},{10,10,51},{10,10,640},{11,10,410}, {13,10,82},{14,10,247},{14,10,331},{142,10,377},{6,0,823},{134,0,983},{139,10, 411},{132,0,305},{136,10,633},{138,11,203},{134,0,681},{6,11,326},{7,11,677},{ 137,11,425},{5,0,214},{7,0,603},{8,0,611},{9,0,686},{10,0,88},{11,0,459},{11,0, 496},{12,0,463},{12,0,590},{141,0,0},{136,0,1004},{142,0,23},{134,0,1703},{147, 11,8},{145,11,56},{135,0,1443},{4,10,237},{135,10,514},{6,0,714},{145,0,19},{5, 11,358},{7,11,473},{7,11,1184},{10,11,662},{13,11,212},{13,11,304},{13,11,333},{ 145,11,98},{4,0,737},{10,0,98},{11,0,294},{12,0,60},{12,0,437},{13,0,64},{13,0, 380},{142,0,430},{6,10,392},{7,10,65},{135,10,2019},{6,0,1758},{8,0,520},{9,0, 345},{9,0,403},{142,0,350},{5,0,47},{10,0,242},{138,0,579},{5,0,139},{7,0,1168}, {138,0,539},{134,0,1459},{13,0,388},{141,11,388},{134,0,253},{7,10,1260},{135,10 ,1790},{10,0,252},{9,10,222},{139,10,900},{140,0,745},{133,11,946},{4,0,107},{7, 0,613},{8,0,439},{8,0,504},{9,0,501},{10,0,383},{139,0,477},{135,11,1485},{132,0 ,871},{7,11,411},{7,11,590},{8,11,631},{9,11,323},{10,11,355},{11,11,491},{12,11 ,143},{12,11,402},{13,11,73},{14,11,408},{15,11,107},{146,11,71},{132,0,229},{ 132,0,903},{140,0,71},{133,0,549},{4,0,47},{6,0,373},{7,0,452},{7,0,543},{7,0, 1828},{7,0,1856},{9,0,6},{11,0,257},{139,0,391},{7,11,1467},{8,11,328},{10,11, 544},{11,11,955},{13,11,320},{145,11,83},{5,0,980},{134,0,1754},{136,0,865},{5,0 ,705},{137,0,606},{7,0,161},{8,10,201},{136,10,605},{143,11,35},{5,11,835},{6,11 ,483},{140,10,224},{7,0,536},{7,0,1331},{136,0,143},{134,0,1388},{5,0,724},{10,0 ,305},{11,0,151},{12,0,33},{12,0,121},{12,0,381},{17,0,3},{17,0,27},{17,0,78},{ 18,0,18},{19,0,54},{149,0,5},{4,10,523},{133,10,638},{5,0,19},{134,0,533},{5,0, 395},{5,0,951},{134,0,1776},{135,0,1908},{132,0,846},{10,0,74},{11,0,663},{12,0, 210},{13,0,166},{13,0,310},{14,0,373},{18,0,95},{19,0,43},{6,10,242},{7,10,227}, {7,10,1581},{8,10,104},{9,10,113},{9,10,220},{9,10,427},{10,10,239},{11,10,579}, {11,10,1023},{13,10,4},{13,10,204},{13,10,316},{148,10,86},{9,11,716},{11,11,108 },{13,11,123},{14,11,252},{19,11,38},{21,11,3},{151,11,11},{8,0,372},{9,0,122},{ 138,0,175},{132,11,677},{7,11,1374},{136,11,540},{135,10,861},{132,0,695},{7,0, 497},{9,0,387},{147,0,81},{136,0,937},{134,0,718},{7,0,1328},{136,10,494},{132, 11,331},{6,0,1581},{133,11,747},{5,0,284},{6,0,49},{6,0,350},{7,0,1},{7,0,377},{ 7,0,1693},{8,0,18},{8,0,678},{9,0,161},{9,0,585},{9,0,671},{9,0,839},{11,0,912}, {141,0,427},{7,10,1306},{8,10,505},{9,10,482},{10,10,126},{11,10,225},{12,10,347 },{12,10,449},{13,10,19},{14,10,218},{142,10,435},{10,10,764},{12,10,120},{13,10 ,39},{145,10,127},{4,0,597},{133,10,268},{134,0,1094},{4,0,1008},{134,0,1973},{ 132,0,811},{139,0,908},{135,0,1471},{133,11,326},{4,10,384},{135,10,1022},{7,0, 1935},{8,0,324},{12,0,42},{4,11,691},{7,11,1935},{8,11,324},{9,11,35},{10,11,680 },{11,11,364},{12,11,42},{13,11,357},{146,11,16},{135,0,2014},{7,0,2007},{9,0, 101},{9,0,450},{10,0,66},{10,0,842},{11,0,536},{12,0,587},{6,11,32},{7,11,385},{ 7,11,757},{7,11,1916},{8,11,37},{8,11,94},{8,11,711},{9,11,541},{10,11,162},{10, 11,795},{11,11,989},{11,11,1010},{12,11,14},{142,11,308},{139,0,586},{135,10, 1703},{7,0,1077},{11,0,28},{9,10,159},{140,10,603},{6,0,1221},{136,10,583},{6,11 ,152},{6,11,349},{6,11,1682},{7,11,1252},{8,11,112},{9,11,435},{9,11,668},{10,11 ,290},{10,11,319},{10,11,815},{11,11,180},{11,11,837},{12,11,240},{13,11,152},{ 13,11,219},{142,11,158},{139,0,62},{132,10,515},{8,10,632},{8,10,697},{137,10, 854},{134,0,1766},{132,11,581},{6,11,126},{7,11,573},{8,11,397},{142,11,44},{150 ,0,28},{11,0,670},{22,0,25},{4,10,136},{133,10,551},{6,0,1665},{7,0,256},{7,0, 1388},{138,0,499},{4,0,22},{5,0,10},{7,0,1576},{136,0,97},{134,10,1782},{5,0,481 },{7,10,1287},{9,10,44},{10,10,552},{10,10,642},{11,10,839},{12,10,274},{12,10, 275},{12,10,372},{13,10,91},{142,10,125},{133,11,926},{7,11,1232},{137,11,531},{ 6,0,134},{7,0,437},{7,0,1824},{9,0,37},{14,0,285},{142,0,371},{7,0,486},{8,0,155 },{11,0,93},{140,0,164},{6,0,1391},{134,0,1442},{133,11,670},{133,0,591},{6,10, 147},{7,10,886},{7,11,1957},{9,10,753},{138,10,268},{5,0,380},{5,0,650},{7,0, 1173},{136,0,310},{4,0,364},{7,0,1156},{7,0,1187},{137,0,409},{135,11,1621},{134 ,0,482},{133,11,506},{4,0,781},{6,0,487},{7,0,926},{8,0,263},{139,0,500},{138,10 ,137},{135,11,242},{139,11,96},{133,10,414},{135,10,1762},{134,0,804},{5,11,834} ,{7,11,1202},{8,11,14},{9,11,481},{137,11,880},{134,10,599},{4,0,94},{135,0,1265 },{4,0,415},{132,0,417},{5,0,348},{6,0,522},{6,10,1749},{7,11,1526},{138,11,465} ,{134,10,1627},{132,0,1012},{132,10,488},{4,11,357},{6,11,172},{7,11,143},{137, 11,413},{4,10,83},{4,11,590},{146,11,76},{140,10,676},{7,11,287},{8,11,355},{9, 11,293},{137,11,743},{134,10,278},{6,0,1803},{18,0,165},{24,0,21},{5,11,169},{7, 11,333},{136,11,45},{12,10,97},{140,11,97},{4,0,408},{4,0,741},{135,0,500},{132, 11,198},{7,10,388},{7,10,644},{139,10,781},{4,11,24},{5,11,140},{5,11,185},{7,11 ,1500},{11,11,565},{139,11,838},{6,0,1321},{9,0,257},{7,10,229},{8,10,59},{9,10, 190},{10,10,378},{140,10,191},{4,11,334},{133,11,593},{135,11,1885},{134,0,1138} ,{4,0,249},{6,0,73},{135,0,177},{133,0,576},{142,0,231},{137,0,288},{132,10,660} ,{7,10,1035},{138,10,737},{135,0,1487},{6,0,989},{9,0,433},{7,10,690},{9,10,587} ,{140,10,521},{7,0,1264},{7,0,1678},{11,0,945},{12,0,341},{12,0,471},{140,0,569} ,{132,11,709},{133,11,897},{5,11,224},{13,11,174},{146,11,52},{135,11,1840},{134 ,10,1744},{12,0,87},{16,0,74},{4,10,733},{9,10,194},{10,10,92},{11,10,198},{12, 10,84},{141,10,128},{140,0,779},{135,0,538},{4,11,608},{133,11,497},{133,0,413}, {7,11,1375},{7,11,1466},{138,11,331},{136,0,495},{6,11,540},{136,11,136},{7,0,54 },{8,0,312},{10,0,191},{10,0,614},{140,0,567},{6,0,468},{7,0,567},{7,0,1478},{8, 0,530},{14,0,290},{133,11,999},{4,11,299},{7,10,306},{135,11,1004},{142,11,296}, {134,0,1484},{133,10,979},{6,0,609},{9,0,815},{12,11,137},{14,11,9},{14,11,24},{ 142,11,64},{133,11,456},{6,0,484},{135,0,822},{133,10,178},{136,11,180},{132,11, 755},{137,0,900},{135,0,1335},{6,0,1724},{135,0,2022},{135,11,1139},{5,0,640},{ 132,10,390},{6,0,1831},{138,11,633},{135,11,566},{4,11,890},{5,11,805},{5,11,819 },{5,11,961},{6,11,396},{6,11,1631},{6,11,1678},{7,11,1967},{7,11,2041},{9,11, 630},{11,11,8},{11,11,1019},{12,11,176},{13,11,225},{14,11,292},{149,11,24},{132 ,0,474},{134,0,1103},{135,0,1504},{134,0,1576},{6,0,961},{6,0,1034},{140,0,655}, {11,11,514},{149,11,20},{5,0,305},{135,11,1815},{7,11,1505},{10,11,190},{10,11, 634},{11,11,792},{12,11,358},{140,11,447},{5,11,0},{6,11,536},{7,11,604},{13,11, 445},{145,11,126},{7,0,1236},{133,10,105},{4,0,480},{6,0,217},{6,0,302},{6,0, 1642},{7,0,130},{7,0,837},{7,0,1321},{7,0,1547},{7,0,1657},{8,0,429},{9,0,228},{ 13,0,289},{13,0,343},{19,0,101},{6,11,232},{6,11,412},{7,11,1074},{8,11,9},{8,11 ,157},{8,11,786},{9,11,196},{9,11,352},{9,11,457},{10,11,337},{11,11,232},{11,11 ,877},{12,11,480},{140,11,546},{5,10,438},{7,11,958},{9,10,694},{12,10,627},{13, 11,38},{141,10,210},{4,11,382},{136,11,579},{7,0,278},{10,0,739},{11,0,708},{141 ,0,348},{4,11,212},{135,11,1206},{135,11,1898},{6,0,708},{6,0,1344},{152,10,11}, {137,11,768},{134,0,1840},{140,0,233},{8,10,25},{138,10,826},{6,0,2017},{133,11, 655},{6,0,1488},{139,11,290},{132,10,308},{134,0,1590},{134,0,1800},{134,0,1259} ,{16,0,28},{6,11,231},{7,11,95},{136,11,423},{133,11,300},{135,10,150},{136,10, 649},{7,11,1874},{137,11,641},{6,11,237},{7,11,611},{8,11,100},{9,11,416},{11,11 ,335},{12,11,173},{146,11,101},{137,0,45},{134,10,521},{17,0,36},{14,11,26},{146 ,11,150},{7,0,1442},{14,0,22},{5,10,339},{15,10,41},{15,10,166},{147,10,66},{8,0 ,378},{6,11,581},{135,11,1119},{134,0,1507},{147,11,117},{139,0,39},{134,0,1054} ,{6,0,363},{7,0,1955},{136,0,725},{134,0,2036},{133,11,199},{6,0,1871},{9,0,935} ,{9,0,961},{9,0,1004},{9,0,1016},{12,0,805},{12,0,852},{12,0,853},{12,0,869},{12 ,0,882},{12,0,896},{12,0,906},{12,0,917},{12,0,940},{15,0,170},{15,0,176},{15,0, 188},{15,0,201},{15,0,205},{15,0,212},{15,0,234},{15,0,244},{18,0,181},{18,0,193 },{18,0,196},{18,0,201},{18,0,202},{18,0,210},{18,0,217},{18,0,235},{18,0,236},{ 18,0,237},{21,0,54},{21,0,55},{21,0,58},{21,0,59},{152,0,22},{134,10,1628},{137, 0,805},{5,0,813},{135,0,2046},{142,11,42},{5,0,712},{6,0,1240},{11,0,17},{13,0, 321},{144,0,67},{132,0,617},{135,10,829},{6,0,320},{7,0,781},{7,0,1921},{9,0,55} ,{10,0,186},{10,0,273},{10,0,664},{10,0,801},{11,0,996},{11,0,997},{13,0,157},{ 142,0,170},{136,0,271},{5,10,486},{135,10,1349},{18,11,91},{147,11,70},{10,0,445 },{7,10,1635},{8,10,17},{138,10,295},{136,11,404},{7,0,103},{7,0,863},{11,0,184} ,{145,0,62},{138,10,558},{137,0,659},{6,11,312},{6,11,1715},{10,11,584},{11,11, 546},{11,11,692},{12,11,259},{12,11,295},{13,11,46},{141,11,154},{134,0,676},{ 132,11,588},{4,11,231},{5,11,61},{6,11,104},{7,11,729},{7,11,964},{7,11,1658},{ 140,11,414},{6,11,263},{138,11,757},{11,0,337},{142,0,303},{135,11,1363},{132,11 ,320},{140,0,506},{134,10,447},{5,0,77},{7,0,1455},{10,0,843},{147,0,73},{7,10, 577},{7,10,1432},{9,10,475},{9,10,505},{9,10,526},{9,10,609},{9,10,689},{9,10, 726},{9,10,735},{9,10,738},{10,10,556},{10,10,674},{10,10,684},{11,10,89},{11,10 ,202},{11,10,272},{11,10,380},{11,10,415},{11,10,505},{11,10,537},{11,10,550},{ 11,10,562},{11,10,640},{11,10,667},{11,10,688},{11,10,847},{11,10,927},{11,10, 930},{11,10,940},{12,10,144},{12,10,325},{12,10,329},{12,10,389},{12,10,403},{12 ,10,451},{12,10,515},{12,10,604},{12,10,616},{12,10,626},{13,10,66},{13,10,131}, {13,10,167},{13,10,236},{13,10,368},{13,10,411},{13,10,434},{13,10,453},{13,10, 461},{13,10,474},{14,10,59},{14,10,60},{14,10,139},{14,10,152},{14,10,276},{14, 10,353},{14,10,402},{15,10,28},{15,10,81},{15,10,123},{15,10,152},{18,10,136},{ 148,10,88},{132,0,458},{135,0,1420},{6,0,109},{10,0,382},{4,11,405},{4,10,609},{ 7,10,756},{7,11,817},{9,10,544},{11,10,413},{14,11,58},{14,10,307},{16,10,25},{ 17,11,37},{146,11,124},{6,0,330},{7,0,1084},{11,0,142},{133,11,974},{4,10,930},{ 133,10,947},{5,10,939},{142,11,394},{16,0,91},{145,0,87},{5,11,235},{5,10,962},{ 7,11,1239},{11,11,131},{140,11,370},{11,0,492},{5,10,651},{8,10,170},{9,10,61},{ 9,10,63},{10,10,23},{10,10,37},{10,10,834},{11,10,4},{11,10,281},{11,10,503},{11 ,10,677},{12,10,96},{12,10,130},{12,10,244},{14,10,5},{14,10,40},{14,10,162},{14 ,10,202},{146,10,133},{4,10,406},{5,10,579},{12,10,492},{150,10,15},{9,11,137},{ 138,11,221},{134,0,1239},{11,0,211},{140,0,145},{7,11,390},{138,11,140},{135,11, 1418},{135,11,1144},{134,0,1049},{7,0,321},{6,10,17},{7,10,1001},{7,10,1982},{9, 10,886},{10,10,489},{10,10,800},{11,10,782},{12,10,320},{13,10,467},{14,10,145}, {14,10,387},{143,10,119},{145,10,17},{5,11,407},{11,11,489},{19,11,37},{20,11,73 },{150,11,38},{133,10,458},{135,0,1985},{7,10,1983},{8,10,0},{8,10,171},{9,10, 120},{9,10,732},{10,10,473},{11,10,656},{11,10,998},{18,10,0},{18,10,2},{147,10, 21},{5,11,325},{7,11,1483},{8,11,5},{8,11,227},{9,11,105},{10,11,585},{140,11, 614},{136,0,122},{132,0,234},{135,11,1196},{6,0,976},{6,0,1098},{134,0,1441},{7, 0,253},{136,0,549},{6,11,621},{13,11,504},{144,11,19},{132,10,519},{5,0,430},{5, 0,932},{6,0,131},{7,0,417},{9,0,522},{11,0,314},{141,0,390},{14,0,149},{14,0,399 },{143,0,57},{5,10,907},{6,10,31},{6,11,218},{7,10,491},{7,10,530},{8,10,592},{ 11,10,53},{11,10,779},{12,10,167},{12,10,411},{14,10,14},{14,10,136},{15,10,72}, {16,10,17},{144,10,72},{140,11,330},{7,11,454},{7,11,782},{136,11,768},{132,0, 507},{10,11,676},{140,11,462},{6,0,630},{9,0,811},{4,10,208},{5,10,106},{6,10, 531},{8,10,408},{9,10,188},{138,10,572},{4,0,343},{5,0,511},{134,10,1693},{134, 11,164},{132,0,448},{7,0,455},{138,0,591},{135,0,1381},{12,10,441},{150,11,50},{ 9,10,449},{10,10,192},{138,10,740},{6,0,575},{132,10,241},{134,0,1175},{134,0, 653},{134,0,1761},{134,0,1198},{132,10,259},{6,11,343},{7,11,195},{9,11,226},{10 ,11,197},{10,11,575},{11,11,502},{139,11,899},{7,0,1127},{7,0,1572},{10,0,297},{ 10,0,422},{11,0,764},{11,0,810},{12,0,264},{13,0,102},{13,0,300},{13,0,484},{14, 0,147},{14,0,229},{17,0,71},{18,0,118},{147,0,120},{135,11,666},{132,0,678},{4, 10,173},{5,10,312},{5,10,512},{135,10,1285},{7,10,1603},{7,10,1691},{9,10,464},{ 11,10,195},{12,10,279},{12,10,448},{14,10,11},{147,10,102},{16,0,99},{146,0,164} ,{7,11,1125},{9,11,143},{11,11,61},{14,11,405},{150,11,21},{137,11,260},{4,10, 452},{5,10,583},{5,10,817},{6,10,433},{7,10,593},{7,10,720},{7,10,1378},{8,10, 161},{9,10,284},{10,10,313},{139,10,886},{132,10,547},{136,10,722},{14,0,35},{ 142,0,191},{141,0,45},{138,0,121},{132,0,125},{134,0,1622},{133,11,959},{8,10, 420},{139,10,193},{132,0,721},{135,10,409},{136,0,145},{7,0,792},{8,0,147},{10,0 ,821},{11,0,970},{11,0,1021},{136,11,173},{134,11,266},{132,0,715},{7,0,1999},{ 138,10,308},{133,0,531},{5,0,168},{5,0,930},{8,0,74},{9,0,623},{12,0,500},{140,0 ,579},{144,0,65},{138,11,246},{6,0,220},{7,0,1101},{13,0,105},{142,11,314},{5,10 ,1002},{136,10,745},{134,0,960},{20,0,0},{148,11,0},{4,0,1005},{4,10,239},{6,10, 477},{7,10,1607},{11,10,68},{139,10,617},{6,0,19},{7,0,1413},{139,0,428},{149,10 ,13},{7,0,96},{8,0,401},{8,0,703},{9,0,896},{136,11,300},{134,0,1595},{145,0,116 },{136,0,1021},{7,0,1961},{7,0,1965},{7,0,2030},{8,0,150},{8,0,702},{8,0,737},{8 ,0,750},{140,0,366},{11,11,75},{142,11,267},{132,10,367},{8,0,800},{9,0,148},{9, 0,872},{9,0,890},{11,0,309},{11,0,1001},{13,0,267},{13,0,323},{5,11,427},{5,11, 734},{7,11,478},{136,11,52},{7,11,239},{11,11,217},{142,11,165},{132,11,323},{ 140,11,419},{13,0,299},{142,0,75},{6,11,87},{6,11,1734},{7,11,20},{7,11,1056},{8 ,11,732},{9,11,406},{9,11,911},{138,11,694},{134,0,1383},{132,10,694},{133,11, 613},{137,0,779},{4,0,598},{140,10,687},{6,0,970},{135,0,424},{133,0,547},{7,11, 32},{7,11,984},{8,11,85},{8,11,709},{9,11,579},{9,11,847},{9,11,856},{10,11,799} ,{11,11,258},{11,11,1007},{12,11,331},{12,11,615},{13,11,188},{13,11,435},{14,11 ,8},{15,11,165},{16,11,27},{148,11,40},{6,0,1222},{134,0,1385},{132,0,876},{138, 11,151},{135,10,213},{4,11,167},{135,11,82},{133,0,133},{6,11,24},{7,11,74},{7, 11,678},{137,11,258},{5,11,62},{6,11,534},{7,11,684},{7,11,1043},{7,11,1072},{8, 11,280},{8,11,541},{8,11,686},{10,11,519},{11,11,252},{140,11,282},{136,0,187},{ 8,0,8},{10,0,0},{10,0,818},{139,0,988},{132,11,359},{11,0,429},{15,0,51},{135,10 ,1672},{136,0,685},{5,11,211},{7,11,88},{136,11,627},{134,0,472},{136,0,132},{6, 11,145},{141,11,336},{4,10,751},{11,10,390},{140,10,32},{6,0,938},{6,0,1060},{4, 11,263},{4,10,409},{133,10,78},{137,0,874},{8,0,774},{10,0,670},{12,0,51},{4,11, 916},{6,10,473},{7,10,1602},{10,10,698},{12,10,212},{13,10,307},{145,10,105},{ 146,0,92},{143,10,156},{132,0,830},{137,0,701},{4,11,599},{6,11,1634},{7,11,5},{ 7,11,55},{7,11,67},{7,11,97},{7,11,691},{7,11,979},{7,11,1697},{8,11,207},{8,11, 214},{8,11,231},{8,11,294},{8,11,336},{8,11,428},{8,11,451},{8,11,460},{8,11,471 },{8,11,622},{8,11,626},{8,11,679},{8,11,759},{8,11,829},{9,11,11},{9,11,246},{9 ,11,484},{9,11,573},{9,11,706},{9,11,762},{9,11,798},{9,11,855},{9,11,870},{9,11 ,912},{10,11,303},{10,11,335},{10,11,424},{10,11,461},{10,11,543},{10,11,759},{ 10,11,814},{11,11,59},{11,11,199},{11,11,235},{11,11,475},{11,11,590},{11,11,929 },{11,11,963},{12,11,114},{12,11,182},{12,11,226},{12,11,332},{12,11,439},{12,11 ,575},{12,11,598},{13,11,8},{13,11,125},{13,11,194},{13,11,287},{14,11,197},{14, 11,383},{15,11,53},{17,11,63},{19,11,46},{19,11,98},{19,11,106},{148,11,85},{4,0 ,127},{5,0,350},{6,0,356},{8,0,426},{9,0,572},{10,0,247},{139,0,312},{134,0,1215 },{6,0,59},{9,0,603},{13,0,397},{7,11,1853},{138,11,437},{134,0,1762},{147,11, 126},{135,10,883},{13,0,293},{142,0,56},{133,10,617},{139,10,50},{5,11,187},{7, 10,1518},{139,10,694},{135,0,441},{6,0,111},{7,0,4},{8,0,163},{8,0,776},{138,0, 566},{132,0,806},{4,11,215},{9,11,38},{10,11,3},{11,11,23},{11,11,127},{139,11, 796},{14,0,233},{4,10,546},{135,10,2042},{135,0,1994},{134,0,1739},{135,11,1530} ,{136,0,393},{5,0,297},{7,0,1038},{14,0,359},{19,0,52},{148,0,47},{135,0,309},{4 ,10,313},{133,10,577},{8,10,184},{141,10,433},{135,10,935},{12,10,186},{12,10, 292},{14,10,100},{146,10,70},{136,0,363},{14,0,175},{11,10,402},{12,10,109},{12, 10,431},{13,10,179},{13,10,206},{14,10,217},{16,10,3},{148,10,53},{5,10,886},{6, 10,46},{6,10,1790},{7,10,14},{7,10,732},{7,10,1654},{8,10,95},{8,10,327},{8,10, 616},{9,10,892},{10,10,598},{10,10,769},{11,10,134},{11,10,747},{12,10,378},{142 ,10,97},{136,0,666},{135,0,1675},{6,0,655},{134,0,1600},{135,0,808},{133,10,1021 },{4,11,28},{5,11,440},{7,11,248},{11,11,833},{140,11,344},{134,11,1654},{132,0, 280},{140,0,54},{4,0,421},{133,0,548},{132,10,153},{6,11,339},{135,11,923},{133, 11,853},{133,10,798},{132,10,587},{6,11,249},{7,11,1234},{139,11,573},{6,10,598} ,{7,10,42},{8,10,695},{10,10,212},{11,10,158},{14,10,196},{145,10,85},{7,0,249}, {5,10,957},{133,10,1008},{4,10,129},{135,10,465},{6,0,254},{7,0,842},{7,0,1659}, {9,0,109},{10,0,103},{7,10,908},{7,10,1201},{9,10,755},{11,10,906},{12,10,527},{ 146,10,7},{5,0,262},{136,10,450},{144,0,1},{10,11,201},{142,11,319},{7,11,49},{7 ,11,392},{8,11,20},{8,11,172},{8,11,690},{9,11,383},{9,11,845},{10,11,48},{11,11 ,293},{11,11,832},{11,11,920},{141,11,221},{5,11,858},{133,11,992},{134,0,805},{ 139,10,1003},{6,0,1630},{134,11,307},{7,11,1512},{135,11,1794},{6,11,268},{137, 11,62},{135,10,1868},{133,0,671},{4,0,989},{8,0,972},{136,0,998},{132,11,423},{ 132,0,889},{135,0,1382},{135,0,1910},{7,10,965},{7,10,1460},{135,10,1604},{4,0, 627},{5,0,775},{138,11,106},{134,11,348},{7,0,202},{11,0,362},{11,0,948},{140,0, 388},{138,11,771},{6,11,613},{136,11,223},{6,0,560},{7,0,451},{8,0,389},{12,0, 490},{13,0,16},{13,0,215},{13,0,351},{18,0,132},{147,0,125},{135,0,841},{136,0, 566},{136,0,938},{132,11,670},{5,0,912},{6,0,1695},{140,11,55},{9,11,40},{139,11 ,136},{7,0,1361},{7,10,982},{10,10,32},{143,10,56},{11,11,259},{140,11,270},{5,0 ,236},{6,0,572},{8,0,492},{11,0,618},{144,0,56},{8,11,572},{9,11,310},{9,11,682} ,{137,11,698},{134,0,1854},{5,0,190},{136,0,318},{133,10,435},{135,0,1376},{4,11 ,296},{6,11,352},{7,11,401},{7,11,1410},{7,11,1594},{7,11,1674},{8,11,63},{8,11, 660},{137,11,74},{7,0,349},{5,10,85},{6,10,419},{7,10,305},{7,10,361},{7,10,1337 },{8,10,71},{140,10,519},{4,11,139},{4,11,388},{140,11,188},{6,0,1972},{6,0,2013 },{8,0,951},{10,0,947},{10,0,974},{10,0,1018},{142,0,476},{140,10,688},{135,10, 740},{5,10,691},{7,10,345},{9,10,94},{140,10,169},{9,0,344},{5,10,183},{6,10,582 },{10,10,679},{140,10,435},{135,10,511},{132,0,850},{8,11,441},{10,11,314},{143, 11,3},{7,10,1993},{136,10,684},{4,11,747},{6,11,290},{6,10,583},{7,11,649},{7,11 ,1479},{135,11,1583},{133,11,232},{133,10,704},{134,0,910},{4,10,179},{5,10,198} ,{133,10,697},{7,10,347},{7,10,971},{8,10,181},{138,10,711},{136,11,525},{14,0, 19},{14,0,28},{144,0,29},{7,0,85},{7,0,247},{8,0,585},{138,0,163},{4,0,487},{7, 11,472},{7,11,1801},{10,11,748},{141,11,458},{4,10,243},{5,10,203},{7,10,19},{7, 10,71},{7,10,113},{10,10,405},{11,10,357},{142,10,240},{7,10,1450},{139,10,99},{ 132,11,425},{138,0,145},{147,0,83},{6,10,492},{137,11,247},{4,0,1013},{134,0, 2033},{5,10,134},{6,10,408},{6,10,495},{135,10,1593},{135,0,1922},{134,11,1768}, {4,0,124},{10,0,457},{11,0,121},{11,0,169},{11,0,870},{11,0,874},{12,0,214},{14, 0,187},{143,0,77},{5,0,557},{135,0,1457},{139,0,66},{5,11,943},{6,11,1779},{142, 10,4},{4,10,248},{4,10,665},{7,10,137},{137,10,349},{7,0,1193},{5,11,245},{6,11, 576},{7,11,582},{136,11,225},{144,0,82},{7,10,1270},{139,10,612},{5,0,454},{10,0 ,352},{138,11,352},{18,0,57},{5,10,371},{135,10,563},{135,0,1333},{6,0,107},{7,0 ,638},{7,0,1632},{9,0,396},{134,11,610},{5,0,370},{134,0,1756},{4,10,374},{7,10, 547},{7,10,1700},{7,10,1833},{139,10,858},{133,0,204},{6,0,1305},{9,10,311},{141 ,10,42},{5,0,970},{134,0,1706},{6,10,1647},{7,10,1552},{7,10,2010},{9,10,494},{ 137,10,509},{13,11,455},{15,11,99},{15,11,129},{144,11,68},{135,0,3},{4,0,35},{5 ,0,121},{5,0,483},{5,0,685},{6,0,489},{6,0,782},{6,0,1032},{7,0,1204},{136,0,394 },{4,0,921},{133,0,1007},{8,11,360},{138,11,63},{135,0,1696},{134,0,1519},{132, 11,443},{135,11,944},{6,10,123},{7,10,214},{9,10,728},{10,10,157},{11,10,346},{ 11,10,662},{143,10,106},{137,0,981},{135,10,1435},{134,0,1072},{132,0,712},{134, 0,1629},{134,0,728},{4,11,298},{137,11,483},{6,0,1177},{6,0,1271},{5,11,164},{7, 11,121},{142,11,189},{7,0,1608},{4,10,707},{5,10,588},{6,10,393},{13,10,106},{18 ,10,49},{147,10,41},{23,0,16},{151,11,16},{6,10,211},{7,10,1690},{11,10,486},{ 140,10,369},{133,0,485},{19,11,15},{149,11,27},{4,11,172},{9,11,611},{10,11,436} ,{12,11,673},{141,11,255},{5,11,844},{10,11,484},{11,11,754},{12,11,457},{14,11, 171},{14,11,389},{146,11,153},{4,0,285},{5,0,27},{5,0,317},{6,0,301},{7,0,7},{8, 0,153},{10,0,766},{11,0,468},{12,0,467},{141,0,143},{134,0,1462},{9,11,263},{10, 11,147},{138,11,492},{133,11,537},{6,0,1945},{6,0,1986},{6,0,1991},{134,0,2038}, {134,10,219},{137,11,842},{14,0,52},{17,0,50},{5,10,582},{6,10,1646},{7,10,99},{ 7,10,1962},{7,10,1986},{8,10,515},{8,10,773},{9,10,23},{9,10,491},{12,10,620},{ 142,10,93},{138,11,97},{20,0,21},{20,0,44},{133,10,851},{136,0,819},{139,0,917}, {5,11,230},{5,11,392},{6,11,420},{8,10,762},{8,10,812},{9,11,568},{9,10,910},{ 140,11,612},{135,0,784},{15,0,135},{143,11,135},{10,0,454},{140,0,324},{4,11,0}, {5,11,41},{7,11,1459},{7,11,1469},{7,11,1618},{7,11,1859},{9,11,549},{139,11,905 },{4,10,98},{7,10,1365},{9,10,422},{9,10,670},{10,10,775},{11,10,210},{13,10,26} ,{13,10,457},{141,10,476},{6,0,1719},{6,0,1735},{7,0,2016},{7,0,2020},{8,0,837}, {137,0,852},{133,11,696},{135,0,852},{132,0,952},{134,10,1730},{132,11,771},{138 ,0,568},{137,0,448},{139,0,146},{8,0,67},{138,0,419},{133,11,921},{137,10,147},{ 134,0,1826},{10,0,657},{14,0,297},{142,0,361},{6,0,666},{6,0,767},{134,0,1542},{ 139,0,729},{6,11,180},{7,11,1137},{8,11,751},{139,11,805},{4,11,183},{7,11,271}, {11,11,824},{11,11,952},{13,11,278},{13,11,339},{13,11,482},{14,11,424},{148,11, 99},{4,0,669},{5,11,477},{5,11,596},{6,11,505},{7,11,1221},{11,11,907},{12,11, 209},{141,11,214},{135,11,1215},{5,0,402},{6,10,30},{11,10,56},{139,10,305},{7, 11,564},{142,11,168},{139,0,152},{7,0,912},{135,10,1614},{4,10,150},{5,10,303},{ 134,10,327},{7,0,320},{8,0,51},{9,0,868},{10,0,833},{12,0,481},{12,0,570},{148,0 ,106},{132,0,445},{7,11,274},{11,11,263},{11,11,479},{11,11,507},{140,11,277},{ 10,0,555},{11,0,308},{19,0,95},{6,11,1645},{8,10,192},{10,10,78},{141,10,359},{ 135,10,786},{6,11,92},{6,11,188},{7,11,1269},{7,11,1524},{7,11,1876},{10,11,228} ,{139,11,1020},{4,11,459},{133,11,966},{11,0,386},{6,10,1638},{7,10,79},{7,10, 496},{9,10,138},{10,10,336},{12,10,412},{12,10,440},{142,10,305},{133,0,239},{7, 0,83},{7,0,1990},{8,0,130},{139,0,720},{138,11,709},{4,0,143},{5,0,550},{133,0, 752},{5,0,123},{6,0,530},{7,0,348},{135,0,1419},{135,0,2024},{6,11,18},{7,11,179 },{7,11,721},{7,11,932},{8,11,548},{8,11,757},{9,11,54},{9,11,65},{9,11,532},{9, 11,844},{10,11,113},{10,11,117},{10,11,236},{10,11,315},{10,11,430},{10,11,798}, {11,11,153},{11,11,351},{11,11,375},{12,11,78},{12,11,151},{12,11,392},{14,11, 248},{143,11,23},{7,10,204},{7,10,415},{8,10,42},{10,10,85},{139,10,564},{134,0, 958},{133,11,965},{132,0,210},{135,11,1429},{138,11,480},{134,11,182},{139,11, 345},{10,11,65},{10,11,488},{138,11,497},{4,10,3},{5,10,247},{5,10,644},{7,10, 744},{7,10,1207},{7,10,1225},{7,10,1909},{146,10,147},{132,0,430},{5,10,285},{9, 10,67},{13,10,473},{143,10,82},{144,11,16},{7,11,1162},{9,11,588},{10,11,260},{ 151,10,8},{133,0,213},{138,0,7},{135,0,801},{134,11,1786},{135,11,308},{6,0,936} ,{134,0,1289},{133,0,108},{132,0,885},{133,0,219},{139,0,587},{4,0,193},{5,0,916 },{6,0,1041},{7,0,364},{10,0,398},{10,0,726},{11,0,317},{11,0,626},{12,0,142},{ 12,0,288},{12,0,678},{13,0,313},{15,0,113},{146,0,114},{135,0,1165},{6,0,241},{9 ,0,342},{10,0,729},{11,0,284},{11,0,445},{11,0,651},{11,0,863},{13,0,398},{146,0 ,99},{7,0,907},{136,0,832},{9,0,303},{4,10,29},{6,10,532},{7,10,1628},{7,10,1648 },{9,10,350},{10,10,433},{11,10,97},{11,10,557},{11,10,745},{12,10,289},{12,10, 335},{12,10,348},{12,10,606},{13,10,116},{13,10,233},{13,10,466},{14,10,181},{14 ,10,209},{14,10,232},{14,10,236},{14,10,300},{16,10,41},{148,10,97},{7,11,423},{ 7,10,1692},{136,11,588},{6,0,931},{134,0,1454},{5,10,501},{7,10,1704},{9,10,553} ,{11,10,520},{12,10,557},{141,10,249},{136,11,287},{4,0,562},{9,0,254},{139,0, 879},{132,0,786},{14,11,32},{18,11,85},{20,11,2},{152,11,16},{135,0,1294},{7,11, 723},{135,11,1135},{6,0,216},{7,0,901},{7,0,1343},{8,0,493},{134,11,403},{7,11, 719},{8,11,809},{136,11,834},{5,11,210},{6,11,213},{7,11,60},{10,11,364},{139,11 ,135},{7,0,341},{11,0,219},{5,11,607},{8,11,326},{136,11,490},{4,11,701},{5,11, 472},{5,11,639},{7,11,1249},{9,11,758},{139,11,896},{135,11,380},{135,11,1947},{ 139,0,130},{135,0,1734},{10,0,115},{11,0,420},{12,0,154},{13,0,404},{14,0,346},{ 143,0,54},{134,10,129},{4,11,386},{7,11,41},{8,11,405},{9,11,497},{11,11,110},{ 11,11,360},{15,11,37},{144,11,84},{141,11,282},{5,11,46},{7,11,1452},{7,11,1480} ,{8,11,634},{140,11,472},{4,11,524},{136,11,810},{10,11,238},{141,11,33},{133,0, 604},{5,0,1011},{136,0,701},{8,0,856},{8,0,858},{8,0,879},{12,0,702},{142,0,447} ,{4,0,54},{5,0,666},{7,0,1039},{7,0,1130},{9,0,195},{138,0,302},{4,10,25},{5,10, 60},{6,10,504},{7,10,614},{7,10,1155},{140,10,0},{7,10,1248},{11,10,621},{139,10 ,702},{133,11,997},{137,10,321},{134,0,1669},{134,0,1791},{4,10,379},{135,10, 1397},{138,11,372},{5,11,782},{5,11,829},{134,11,1738},{135,0,1228},{4,10,118},{ 6,10,274},{6,10,361},{7,10,75},{141,10,441},{132,0,623},{9,11,279},{10,11,407},{ 14,11,84},{150,11,18},{137,10,841},{135,0,798},{140,10,693},{5,10,314},{6,10,221 },{7,10,419},{10,10,650},{11,10,396},{12,10,156},{13,10,369},{14,10,333},{145,10 ,47},{135,11,1372},{7,0,122},{9,0,259},{10,0,84},{11,0,470},{12,0,541},{141,0, 379},{134,0,837},{8,0,1013},{4,11,78},{5,11,96},{5,11,182},{7,11,1724},{7,11, 1825},{10,11,394},{10,11,471},{11,11,532},{14,11,340},{145,11,88},{134,0,577},{ 135,11,1964},{132,10,913},{134,0,460},{8,0,891},{10,0,901},{10,0,919},{10,0,932} ,{12,0,715},{12,0,728},{12,0,777},{14,0,457},{144,0,103},{5,0,82},{5,0,131},{7,0 ,1755},{8,0,31},{9,0,168},{9,0,764},{139,0,869},{136,10,475},{6,0,605},{5,10, 1016},{9,11,601},{9,11,619},{10,11,505},{10,11,732},{11,11,355},{140,11,139},{7, 10,602},{8,10,179},{10,10,781},{140,10,126},{134,0,1246},{6,10,329},{138,10,111} ,{6,11,215},{7,11,1028},{7,11,1473},{7,11,1721},{9,11,424},{138,11,779},{5,0,278 },{137,0,68},{6,0,932},{6,0,1084},{144,0,86},{4,0,163},{5,0,201},{5,0,307},{5,0, 310},{6,0,335},{7,0,284},{7,0,1660},{136,0,165},{136,0,781},{134,0,707},{6,0,33} ,{135,0,1244},{5,10,821},{6,11,67},{6,10,1687},{7,11,258},{7,11,1630},{9,11,354} ,{9,11,675},{10,11,830},{14,11,80},{145,11,80},{6,11,141},{7,11,225},{9,11,59},{ 9,11,607},{10,11,312},{11,11,687},{12,11,555},{13,11,373},{13,11,494},{148,11,58 },{134,0,1113},{9,0,388},{5,10,71},{7,10,1407},{9,10,704},{10,10,261},{10,10,619 },{11,10,547},{11,10,619},{143,10,157},{7,0,1953},{136,0,720},{138,0,203},{7,10, 2008},{9,10,337},{138,10,517},{6,0,326},{7,0,677},{137,0,425},{139,11,81},{7,0, 1316},{7,0,1412},{7,0,1839},{9,0,589},{11,0,241},{11,0,676},{11,0,811},{11,0,891 },{12,0,140},{12,0,346},{12,0,479},{13,0,140},{13,0,381},{14,0,188},{18,0,30},{ 148,0,108},{5,0,416},{6,10,86},{6,10,603},{7,10,292},{7,10,561},{8,10,257},{8,10 ,382},{9,10,721},{9,10,778},{11,10,581},{140,10,466},{4,10,486},{133,10,491},{ 134,0,1300},{132,10,72},{7,0,847},{6,10,265},{7,11,430},{139,11,46},{5,11,602},{ 6,11,106},{7,11,1786},{7,11,1821},{7,11,2018},{9,11,418},{137,11,763},{5,0,358}, {7,0,535},{7,0,1184},{10,0,662},{13,0,212},{13,0,304},{13,0,333},{145,0,98},{5, 11,65},{6,11,416},{7,11,1720},{7,11,1924},{8,11,677},{10,11,109},{11,11,14},{11, 11,70},{11,11,569},{11,11,735},{15,11,153},{148,11,80},{6,0,1823},{8,0,839},{8,0 ,852},{8,0,903},{10,0,940},{12,0,707},{140,0,775},{135,11,1229},{6,0,1522},{140, 0,654},{136,11,595},{139,0,163},{141,0,314},{132,0,978},{4,0,601},{6,0,2035},{ 137,10,234},{5,10,815},{6,10,1688},{134,10,1755},{133,0,946},{136,0,434},{6,10, 197},{136,10,205},{7,0,411},{7,0,590},{8,0,631},{9,0,323},{10,0,355},{11,0,491}, {12,0,143},{12,0,402},{13,0,73},{14,0,408},{15,0,107},{146,0,71},{7,0,1467},{8,0 ,328},{10,0,544},{11,0,955},{12,0,13},{13,0,320},{145,0,83},{142,0,410},{11,0, 511},{13,0,394},{14,0,298},{14,0,318},{146,0,103},{6,10,452},{7,10,312},{138,10, 219},{138,10,589},{4,10,333},{9,10,176},{12,10,353},{141,10,187},{135,11,329},{ 132,11,469},{5,0,835},{134,0,483},{134,11,1743},{5,11,929},{6,11,340},{8,11,376} ,{136,11,807},{134,10,1685},{132,0,677},{5,11,218},{7,11,1610},{138,11,83},{5,11 ,571},{135,11,1842},{132,11,455},{137,0,70},{135,0,1405},{7,10,135},{8,10,7},{8, 10,62},{9,10,243},{10,10,658},{10,10,697},{11,10,456},{139,10,756},{9,10,395},{ 138,10,79},{137,0,108},{6,11,161},{7,11,372},{137,11,597},{132,11,349},{132,0, 777},{132,0,331},{135,10,631},{133,0,747},{6,11,432},{6,11,608},{139,11,322},{ 138,10,835},{5,11,468},{7,11,1809},{10,11,325},{11,11,856},{12,11,345},{143,11, 104},{133,11,223},{7,10,406},{7,10,459},{8,10,606},{139,10,726},{132,11,566},{ 142,0,68},{4,11,59},{135,11,1394},{6,11,436},{139,11,481},{4,11,48},{5,11,271},{ 135,11,953},{139,11,170},{5,11,610},{136,11,457},{133,11,755},{135,11,1217},{133 ,10,612},{132,11,197},{132,0,505},{4,10,372},{7,10,482},{8,10,158},{9,10,602},{9 ,10,615},{10,10,245},{10,10,678},{10,10,744},{11,10,248},{139,10,806},{133,0,326 },{5,10,854},{135,10,1991},{4,0,691},{146,0,16},{6,0,628},{9,0,35},{10,0,680},{ 10,0,793},{11,0,364},{13,0,357},{143,0,164},{138,0,654},{6,0,32},{7,0,385},{7,0, 757},{7,0,1916},{8,0,37},{8,0,94},{8,0,711},{9,0,541},{10,0,162},{10,0,795},{11, 0,989},{11,0,1010},{12,0,14},{142,0,308},{133,11,217},{6,0,152},{6,0,349},{6,0, 1682},{7,0,1252},{8,0,112},{9,0,435},{9,0,668},{10,0,290},{10,0,319},{10,0,815}, {11,0,180},{11,0,837},{12,0,240},{13,0,152},{13,0,219},{142,0,158},{4,0,581},{ 134,0,726},{5,10,195},{135,10,1685},{6,0,126},{7,0,573},{8,0,397},{142,0,44},{ 138,0,89},{7,10,1997},{8,10,730},{139,10,1006},{134,0,1531},{134,0,1167},{5,0, 926},{12,0,203},{133,10,751},{4,11,165},{7,11,1398},{135,11,1829},{7,0,1232},{ 137,0,531},{135,10,821},{134,0,943},{133,0,670},{4,0,880},{139,0,231},{134,0, 1617},{135,0,1957},{5,11,9},{7,11,297},{7,11,966},{140,11,306},{6,0,975},{134,0, 985},{5,10,950},{5,10,994},{134,10,351},{12,11,21},{151,11,7},{5,11,146},{6,11, 411},{138,11,721},{7,0,242},{135,0,1942},{6,11,177},{135,11,467},{5,0,421},{7,10 ,47},{137,10,684},{5,0,834},{7,0,1202},{8,0,14},{9,0,481},{137,0,880},{138,0,465 },{6,0,688},{9,0,834},{132,10,350},{132,0,855},{4,0,357},{6,0,172},{7,0,143},{ 137,0,413},{133,11,200},{132,0,590},{7,10,1812},{13,10,259},{13,10,356},{14,10, 242},{147,10,114},{133,10,967},{11,0,114},{4,10,473},{7,10,623},{8,10,808},{9,10 ,871},{9,10,893},{11,10,431},{12,10,112},{12,10,217},{12,10,243},{12,10,562},{12 ,10,663},{12,10,683},{13,10,141},{13,10,197},{13,10,227},{13,10,406},{13,10,487} ,{14,10,156},{14,10,203},{14,10,224},{14,10,256},{18,10,58},{150,10,0},{138,10, 286},{4,10,222},{7,10,286},{136,10,629},{5,0,169},{7,0,333},{136,0,45},{134,11, 481},{132,0,198},{4,0,24},{5,0,140},{5,0,185},{7,0,1500},{11,0,565},{11,0,838},{ 4,11,84},{7,11,1482},{10,11,76},{138,11,142},{133,0,585},{141,10,306},{133,11, 1015},{4,11,315},{5,11,507},{135,11,1370},{136,10,146},{6,0,691},{134,0,1503},{4 ,0,334},{133,0,593},{4,10,465},{135,10,1663},{142,11,173},{135,0,913},{12,0,116} ,{134,11,1722},{134,0,1360},{132,0,802},{8,11,222},{8,11,476},{9,11,238},{11,11, 516},{11,11,575},{15,11,109},{146,11,100},{6,0,308},{9,0,673},{7,10,138},{7,10, 517},{139,10,238},{132,0,709},{6,0,1876},{6,0,1895},{9,0,994},{9,0,1006},{12,0, 829},{12,0,888},{12,0,891},{146,0,185},{148,10,94},{4,0,228},{133,0,897},{7,0, 1840},{5,10,495},{7,10,834},{9,10,733},{139,10,378},{133,10,559},{6,10,21},{6,10 ,1737},{7,10,1444},{136,10,224},{4,0,608},{133,0,497},{6,11,40},{135,11,1781},{ 134,0,1573},{135,0,2039},{6,0,540},{136,0,136},{4,0,897},{5,0,786},{133,10,519}, {6,0,1878},{6,0,1884},{9,0,938},{9,0,948},{9,0,955},{9,0,973},{9,0,1012},{12,0, 895},{12,0,927},{143,0,254},{134,0,1469},{133,0,999},{4,0,299},{135,0,1004},{4,0 ,745},{133,0,578},{136,11,574},{133,0,456},{134,0,1457},{7,0,1679},{132,10,402}, {7,0,693},{8,0,180},{12,0,163},{8,10,323},{136,10,479},{11,10,580},{142,10,201}, {5,10,59},{135,10,672},{132,11,354},{146,10,34},{4,0,755},{135,11,1558},{7,0, 1740},{146,0,48},{4,10,85},{135,10,549},{139,0,338},{133,10,94},{134,0,1091},{ 135,11,469},{12,0,695},{12,0,704},{20,0,113},{5,11,830},{14,11,338},{148,11,81}, {135,0,1464},{6,10,11},{135,10,187},{135,0,975},{13,0,335},{132,10,522},{134,0, 1979},{5,11,496},{135,11,203},{4,10,52},{135,10,661},{7,0,1566},{8,0,269},{9,0, 212},{9,0,718},{14,0,15},{14,0,132},{142,0,227},{4,0,890},{5,0,805},{5,0,819},{5 ,0,961},{6,0,396},{6,0,1631},{6,0,1678},{7,0,1967},{7,0,2041},{9,0,630},{11,0,8} ,{11,0,1019},{12,0,176},{13,0,225},{14,0,292},{21,0,24},{4,10,383},{133,10,520}, {134,11,547},{135,11,1748},{5,11,88},{137,11,239},{146,11,128},{7,11,650},{135, 11,1310},{4,10,281},{5,10,38},{7,10,194},{7,10,668},{7,10,1893},{137,10,397},{ 135,0,1815},{9,10,635},{139,10,559},{7,0,1505},{10,0,190},{10,0,634},{11,0,792}, {12,0,358},{140,0,447},{5,0,0},{6,0,536},{7,0,604},{13,0,445},{145,0,126},{7,11, 1076},{9,11,80},{11,11,78},{11,11,421},{11,11,534},{140,11,545},{8,0,966},{10,0, 1023},{14,11,369},{146,11,72},{135,11,1641},{6,0,232},{6,0,412},{7,0,1074},{8,0, 9},{8,0,157},{8,0,786},{9,0,196},{9,0,352},{9,0,457},{10,0,337},{11,0,232},{11,0 ,877},{12,0,480},{140,0,546},{135,0,958},{4,0,382},{136,0,579},{4,0,212},{135,0, 1206},{4,11,497},{5,11,657},{135,11,1584},{132,0,681},{8,0,971},{138,0,965},{5, 10,448},{136,10,535},{14,0,16},{146,0,44},{11,0,584},{11,0,616},{14,0,275},{11, 11,584},{11,11,616},{142,11,275},{136,11,13},{7,10,610},{135,10,1501},{7,11,642} ,{8,11,250},{11,11,123},{11,11,137},{13,11,48},{142,11,95},{133,0,655},{17,0,67} ,{147,0,74},{134,0,751},{134,0,1967},{6,0,231},{136,0,423},{5,0,300},{138,0,1016 },{4,10,319},{5,10,699},{138,10,673},{6,0,237},{7,0,611},{8,0,100},{9,0,416},{11 ,0,335},{12,0,173},{18,0,101},{6,10,336},{8,10,552},{9,10,285},{10,10,99},{139, 10,568},{134,0,1370},{7,10,1406},{9,10,218},{141,10,222},{133,10,256},{135,0, 1208},{14,11,213},{148,11,38},{6,0,1219},{135,11,1642},{13,0,417},{14,0,129},{ 143,0,15},{10,11,545},{140,11,301},{17,10,39},{148,10,36},{133,0,199},{4,11,904} ,{133,11,794},{12,0,427},{146,0,38},{134,0,949},{8,0,665},{135,10,634},{132,10, 618},{135,10,259},{132,10,339},{133,11,761},{141,10,169},{132,10,759},{5,0,688}, {7,0,539},{135,0,712},{7,11,386},{138,11,713},{134,0,1186},{6,11,7},{6,11,35},{7 ,11,147},{7,11,1069},{7,11,1568},{7,11,1575},{7,11,1917},{8,11,43},{8,11,208},{9 ,11,128},{9,11,866},{10,11,20},{11,11,981},{147,11,33},{7,11,893},{8,10,482},{ 141,11,424},{6,0,312},{6,0,1715},{10,0,584},{11,0,546},{11,0,692},{12,0,259},{12 ,0,295},{13,0,46},{141,0,154},{5,10,336},{6,10,341},{6,10,478},{6,10,1763},{136, 10,386},{137,0,151},{132,0,588},{152,0,4},{6,11,322},{9,11,552},{11,11,274},{13, 11,209},{13,11,499},{14,11,85},{15,11,126},{145,11,70},{135,10,73},{4,0,231},{5, 0,61},{6,0,104},{7,0,729},{7,0,964},{7,0,1658},{140,0,414},{6,0,263},{138,0,757} ,{135,10,1971},{4,0,612},{133,0,561},{132,0,320},{135,10,1344},{8,11,83},{8,11, 817},{9,11,28},{9,11,29},{9,11,885},{10,11,387},{11,11,633},{11,11,740},{13,11, 235},{13,11,254},{15,11,143},{143,11,146},{5,10,396},{134,10,501},{140,11,49},{ 132,0,225},{4,10,929},{5,10,799},{8,10,46},{136,10,740},{4,0,405},{7,0,817},{14, 0,58},{17,0,37},{146,0,124},{133,0,974},{4,11,412},{133,11,581},{4,10,892},{133, 10,770},{4,0,996},{134,0,2026},{4,0,527},{5,0,235},{7,0,1239},{11,0,131},{140,0, 370},{9,0,16},{13,0,386},{135,11,421},{7,0,956},{7,0,1157},{7,0,1506},{7,0,1606} ,{7,0,1615},{7,0,1619},{7,0,1736},{7,0,1775},{8,0,590},{9,0,324},{9,0,736},{9,0, 774},{9,0,776},{9,0,784},{10,0,567},{10,0,708},{11,0,518},{11,0,613},{11,0,695}, {11,0,716},{11,0,739},{11,0,770},{11,0,771},{11,0,848},{11,0,857},{11,0,931},{11 ,0,947},{12,0,326},{12,0,387},{12,0,484},{12,0,528},{12,0,552},{12,0,613},{13,0, 189},{13,0,256},{13,0,340},{13,0,432},{13,0,436},{13,0,440},{13,0,454},{14,0,174 },{14,0,220},{14,0,284},{14,0,390},{145,0,121},{135,10,158},{9,0,137},{138,0,221 },{4,11,110},{10,11,415},{10,11,597},{142,11,206},{141,11,496},{135,11,205},{151 ,10,25},{135,11,778},{7,11,1656},{7,10,2001},{9,11,369},{10,11,338},{10,11,490}, {11,11,154},{11,11,545},{11,11,775},{13,11,77},{141,11,274},{4,11,444},{10,11, 146},{140,11,9},{7,0,390},{138,0,140},{135,0,1144},{134,0,464},{7,10,1461},{140, 10,91},{132,10,602},{4,11,283},{135,11,1194},{5,0,407},{11,0,204},{11,0,243},{11 ,0,489},{12,0,293},{19,0,37},{20,0,73},{150,0,38},{7,0,1218},{136,0,303},{5,0, 325},{8,0,5},{8,0,227},{9,0,105},{10,0,585},{12,0,614},{4,10,13},{5,10,567},{7, 10,1498},{9,10,124},{11,10,521},{140,10,405},{135,10,1006},{7,0,800},{10,0,12},{ 134,11,1720},{135,0,1783},{132,10,735},{138,10,812},{4,10,170},{135,10,323},{6,0 ,621},{13,0,504},{144,0,89},{5,10,304},{135,10,1403},{137,11,216},{6,0,920},{6,0 ,1104},{9,11,183},{139,11,286},{4,0,376},{133,10,742},{134,0,218},{8,0,641},{11, 0,388},{140,0,580},{7,0,454},{7,0,782},{8,0,768},{140,0,686},{137,11,33},{133,10 ,111},{144,0,0},{10,0,676},{140,0,462},{6,0,164},{136,11,735},{133,10,444},{150, 0,50},{7,11,1862},{12,11,491},{12,11,520},{13,11,383},{14,11,244},{146,11,12},{5 ,11,132},{9,11,486},{9,11,715},{10,11,458},{11,11,373},{11,11,668},{11,11,795},{ 11,11,897},{12,11,272},{12,11,424},{12,11,539},{12,11,558},{14,11,245},{14,11, 263},{14,11,264},{14,11,393},{142,11,403},{8,10,123},{15,10,6},{144,10,7},{6,0, 285},{8,0,654},{11,0,749},{12,0,190},{12,0,327},{13,0,120},{13,0,121},{13,0,327} ,{15,0,47},{146,0,40},{5,11,8},{6,11,89},{6,11,400},{7,11,1569},{7,11,1623},{7, 11,1850},{8,11,218},{8,11,422},{9,11,570},{138,11,626},{6,11,387},{7,11,882},{ 141,11,111},{6,0,343},{7,0,195},{9,0,226},{10,0,197},{10,0,575},{11,0,502},{11,0 ,899},{6,11,224},{7,11,877},{137,11,647},{5,10,937},{135,10,100},{135,11,790},{ 150,0,29},{147,0,8},{134,0,1812},{149,0,8},{135,11,394},{7,0,1125},{9,0,143},{11 ,0,61},{14,0,405},{150,0,21},{10,11,755},{147,11,29},{9,11,378},{141,11,162},{ 135,10,922},{5,10,619},{133,10,698},{134,0,1327},{6,0,1598},{137,0,575},{9,11, 569},{12,11,12},{12,11,81},{12,11,319},{13,11,69},{14,11,259},{16,11,87},{17,11, 1},{17,11,21},{17,11,24},{18,11,15},{18,11,56},{18,11,59},{18,11,127},{18,11,154 },{19,11,19},{148,11,31},{6,0,895},{135,11,1231},{5,0,959},{7,11,124},{136,11,38 },{5,11,261},{7,11,78},{7,11,199},{8,11,815},{9,11,126},{138,11,342},{5,10,917}, {134,10,1659},{7,0,1759},{5,11,595},{135,11,1863},{136,0,173},{134,0,266},{142,0 ,261},{132,11,628},{5,10,251},{5,10,956},{8,10,268},{9,10,214},{146,10,142},{7, 11,266},{136,11,804},{135,11,208},{6,11,79},{7,11,1021},{135,11,1519},{11,11,704 },{141,11,396},{5,10,346},{5,10,711},{136,10,390},{136,11,741},{134,11,376},{134 ,0,1427},{6,0,1033},{6,0,1217},{136,0,300},{133,10,624},{6,11,100},{7,11,244},{7 ,11,632},{7,11,1609},{8,11,178},{8,11,638},{141,11,58},{6,0,584},{5,10,783},{7, 10,1998},{135,10,2047},{5,0,427},{5,0,734},{7,0,478},{136,0,52},{7,0,239},{11,0, 217},{142,0,165},{134,0,1129},{6,0,168},{6,0,1734},{7,0,20},{7,0,1056},{8,0,732} ,{9,0,406},{9,0,911},{138,0,694},{132,10,594},{133,11,791},{7,11,686},{8,11,33}, {8,11,238},{10,11,616},{11,11,467},{11,11,881},{13,11,217},{13,11,253},{142,11, 268},{137,11,476},{134,0,418},{133,0,613},{132,0,632},{132,11,447},{7,0,32},{7,0 ,984},{8,0,85},{8,0,709},{9,0,579},{9,0,847},{9,0,856},{10,0,799},{11,0,258},{11 ,0,1007},{12,0,331},{12,0,615},{13,0,188},{13,0,435},{14,0,8},{15,0,165},{16,0, 27},{20,0,40},{144,11,35},{4,11,128},{5,11,415},{6,11,462},{7,11,294},{7,11,578} ,{10,11,710},{139,11,86},{5,0,694},{136,0,909},{7,0,1109},{11,0,7},{5,10,37},{6, 10,39},{6,10,451},{7,10,218},{7,10,1166},{7,10,1687},{8,10,662},{144,10,2},{136, 11,587},{6,11,427},{7,11,1018},{138,11,692},{4,11,195},{6,10,508},{135,11,802},{ 4,0,167},{135,0,82},{5,0,62},{6,0,24},{6,0,534},{7,0,74},{7,0,678},{7,0,684},{7, 0,1043},{7,0,1072},{8,0,280},{8,0,541},{8,0,686},{9,0,258},{10,0,519},{11,0,252} ,{140,0,282},{138,0,33},{4,0,359},{133,11,738},{7,0,980},{9,0,328},{13,0,186},{ 13,0,364},{7,10,635},{7,10,796},{8,10,331},{9,10,330},{9,10,865},{10,10,119},{10 ,10,235},{11,10,111},{11,10,129},{11,10,240},{12,10,31},{12,10,66},{12,10,222},{ 12,10,269},{12,10,599},{12,10,684},{12,10,689},{12,10,691},{142,10,345},{137,10, 527},{6,0,596},{7,0,585},{135,10,702},{134,11,1683},{133,0,211},{6,0,145},{141,0 ,336},{134,0,1130},{7,0,873},{6,10,37},{7,10,1666},{8,10,195},{8,10,316},{9,10, 178},{9,10,276},{9,10,339},{9,10,536},{10,10,102},{10,10,362},{10,10,785},{11,10 ,55},{11,10,149},{11,10,773},{13,10,416},{13,10,419},{14,10,38},{14,10,41},{142, 10,210},{8,0,840},{136,0,841},{132,0,263},{5,11,3},{8,11,578},{9,11,118},{10,11, 705},{12,11,383},{141,11,279},{132,0,916},{133,11,229},{133,10,645},{15,0,155},{ 16,0,79},{8,11,102},{10,11,578},{10,11,672},{12,11,496},{13,11,408},{14,11,121}, {145,11,106},{4,0,599},{5,0,592},{6,0,1634},{7,0,5},{7,0,55},{7,0,67},{7,0,97},{ 7,0,691},{7,0,979},{7,0,1600},{7,0,1697},{8,0,207},{8,0,214},{8,0,231},{8,0,294} ,{8,0,336},{8,0,428},{8,0,471},{8,0,622},{8,0,626},{8,0,679},{8,0,759},{8,0,829} ,{9,0,11},{9,0,246},{9,0,484},{9,0,573},{9,0,706},{9,0,762},{9,0,798},{9,0,855}, {9,0,870},{9,0,912},{10,0,303},{10,0,335},{10,0,424},{10,0,461},{10,0,543},{10,0 ,759},{10,0,814},{11,0,59},{11,0,199},{11,0,235},{11,0,590},{11,0,631},{11,0,929 },{11,0,963},{11,0,987},{12,0,114},{12,0,182},{12,0,226},{12,0,332},{12,0,439},{ 12,0,575},{12,0,598},{12,0,675},{13,0,8},{13,0,125},{13,0,194},{13,0,287},{14,0, 197},{14,0,383},{15,0,53},{17,0,63},{19,0,46},{19,0,98},{19,0,106},{148,0,85},{7 ,0,1356},{132,10,290},{6,10,70},{7,10,1292},{10,10,762},{139,10,288},{150,11,55} ,{4,0,593},{8,11,115},{8,11,350},{9,11,489},{10,11,128},{11,11,306},{12,11,373}, {14,11,30},{17,11,79},{147,11,80},{135,11,1235},{134,0,1392},{4,11,230},{133,11, 702},{147,0,126},{7,10,131},{7,10,422},{8,10,210},{140,10,573},{134,0,1179},{139 ,11,435},{139,10,797},{134,11,1728},{4,0,162},{18,11,26},{19,11,42},{20,11,43},{ 21,11,0},{23,11,27},{152,11,14},{132,10,936},{6,0,765},{5,10,453},{134,10,441},{ 133,0,187},{135,0,1286},{6,0,635},{6,0,904},{6,0,1210},{134,0,1489},{4,0,215},{8 ,0,890},{9,0,38},{10,0,923},{11,0,23},{11,0,127},{139,0,796},{6,0,1165},{134,0, 1306},{7,0,716},{13,0,97},{141,0,251},{132,10,653},{136,0,657},{146,10,80},{5,11 ,622},{7,11,1032},{11,11,26},{11,11,213},{11,11,707},{12,11,380},{13,11,226},{ 141,11,355},{6,0,299},{5,11,70},{6,11,334},{9,11,171},{11,11,637},{12,11,202},{ 14,11,222},{145,11,42},{142,0,134},{4,11,23},{5,11,313},{5,11,1014},{6,11,50},{6 ,11,51},{7,11,142},{7,11,384},{9,11,783},{139,11,741},{4,11,141},{7,11,559},{8, 11,640},{9,11,460},{12,11,183},{141,11,488},{136,11,614},{7,10,1368},{8,10,232}, {8,10,361},{10,10,682},{138,10,742},{137,10,534},{6,0,1082},{140,0,658},{137,10, 27},{135,0,2002},{142,10,12},{4,0,28},{5,0,440},{7,0,248},{11,0,833},{140,0,344} ,{7,10,736},{139,10,264},{134,10,1657},{134,0,1654},{138,0,531},{5,11,222},{9,11 ,140},{138,11,534},{6,0,634},{6,0,798},{134,0,840},{138,11,503},{135,10,127},{ 133,0,853},{5,11,154},{7,11,1491},{10,11,379},{138,11,485},{6,0,249},{7,0,1234}, {139,0,573},{133,11,716},{7,11,1570},{140,11,542},{136,10,364},{138,0,527},{4,11 ,91},{5,11,388},{5,11,845},{6,11,206},{6,11,252},{6,11,365},{7,11,136},{7,11,531 },{8,11,264},{136,11,621},{134,0,1419},{135,11,1441},{7,0,49},{7,0,392},{8,0,20} ,{8,0,172},{8,0,690},{9,0,383},{9,0,845},{10,0,48},{11,0,293},{11,0,832},{11,0, 920},{11,0,984},{141,0,221},{5,0,858},{133,0,992},{5,0,728},{137,10,792},{5,10, 909},{9,10,849},{138,10,805},{7,0,525},{7,0,1579},{8,0,497},{136,0,573},{6,0,268 },{137,0,62},{135,11,576},{134,0,1201},{5,11,771},{5,11,863},{5,11,898},{6,11, 1632},{6,11,1644},{134,11,1780},{133,11,331},{7,0,193},{7,0,1105},{10,0,495},{7, 10,397},{8,10,124},{8,10,619},{9,10,305},{11,10,40},{12,10,349},{13,10,134},{13, 10,295},{14,10,155},{15,10,120},{146,10,105},{138,0,106},{6,0,859},{5,11,107},{7 ,11,201},{136,11,518},{6,11,446},{135,11,1817},{13,0,23},{4,10,262},{135,10,342} ,{133,10,641},{137,11,851},{6,0,925},{137,0,813},{132,11,504},{6,0,613},{136,0, 223},{4,10,99},{6,10,250},{6,10,346},{8,10,127},{138,10,81},{136,0,953},{132,10, 915},{139,11,892},{5,10,75},{9,10,517},{10,10,470},{12,10,155},{141,10,224},{4,0 ,666},{7,0,1017},{7,11,996},{138,11,390},{5,11,883},{133,11,975},{14,10,83},{142 ,11,83},{4,0,670},{5,11,922},{134,11,1707},{135,0,216},{9,0,40},{11,0,136},{135, 11,787},{5,10,954},{5,11,993},{7,11,515},{137,11,91},{139,0,259},{7,0,1114},{9,0 ,310},{9,0,682},{10,0,440},{13,0,40},{6,10,304},{8,10,418},{11,10,341},{139,10, 675},{14,0,296},{9,10,410},{139,10,425},{10,11,377},{12,11,363},{13,11,68},{13, 11,94},{14,11,108},{142,11,306},{7,0,1401},{135,0,1476},{4,0,296},{6,0,475},{7,0 ,401},{7,0,1410},{7,0,1594},{7,0,1674},{8,0,63},{8,0,660},{137,0,74},{4,0,139},{ 4,0,388},{140,0,188},{132,0,797},{132,11,766},{5,11,103},{7,11,921},{8,11,580},{ 8,11,593},{8,11,630},{138,11,28},{4,11,911},{5,11,867},{133,11,1013},{134,10,14} ,{134,0,1572},{134,10,1708},{21,0,39},{5,10,113},{6,10,243},{7,10,1865},{11,10, 161},{16,10,37},{145,10,99},{7,11,1563},{141,11,182},{5,11,135},{6,11,519},{7,11 ,1722},{10,11,271},{11,11,261},{145,11,54},{132,10,274},{134,0,1594},{4,11,300}, {5,11,436},{135,11,484},{4,0,747},{6,0,290},{7,0,649},{7,0,1479},{135,0,1583},{ 133,11,535},{147,11,82},{133,0,232},{137,0,887},{135,10,166},{136,0,521},{4,0,14 },{7,0,472},{7,0,1801},{10,0,748},{141,0,458},{134,0,741},{134,0,992},{16,0,111} ,{137,10,304},{4,0,425},{5,11,387},{7,11,557},{12,11,547},{142,11,86},{135,11, 1747},{5,10,654},{135,11,1489},{7,0,789},{4,11,6},{5,11,708},{136,11,75},{6,10, 273},{10,10,188},{13,10,377},{146,10,77},{6,0,1593},{4,11,303},{7,11,619},{10,11 ,547},{10,11,687},{11,11,122},{140,11,601},{134,0,1768},{135,10,410},{138,11,772 },{11,0,233},{139,10,524},{5,0,943},{134,0,1779},{134,10,1785},{136,11,529},{132 ,0,955},{5,0,245},{6,0,576},{7,0,582},{136,0,225},{132,10,780},{142,0,241},{134, 0,1943},{4,11,106},{7,11,310},{7,11,1785},{10,11,690},{139,11,717},{134,0,1284}, {5,11,890},{133,11,988},{6,11,626},{142,11,431},{10,11,706},{145,11,32},{137,11, 332},{132,11,698},{135,0,709},{5,10,948},{138,11,17},{136,0,554},{134,0,1564},{ 139,10,941},{132,0,443},{134,0,909},{134,11,84},{142,0,280},{4,10,532},{5,10,706 },{135,10,662},{132,0,729},{5,10,837},{6,10,1651},{139,10,985},{135,10,1861},{4, 0,348},{152,11,3},{5,11,986},{6,11,130},{7,11,1582},{8,11,458},{10,11,101},{10, 11,318},{138,11,823},{134,0,758},{4,0,298},{137,0,848},{4,10,330},{7,10,933},{7, 10,2012},{136,10,292},{7,11,1644},{137,11,129},{6,0,1422},{9,0,829},{135,10,767} ,{5,0,164},{7,0,121},{142,0,189},{7,0,812},{7,0,1261},{7,0,1360},{9,0,632},{140, 0,352},{135,11,1788},{139,0,556},{135,11,997},{145,10,114},{4,0,172},{9,0,611},{ 10,0,436},{12,0,673},{13,0,255},{137,10,883},{11,0,530},{138,10,274},{133,0,844} ,{134,0,984},{13,0,232},{18,0,35},{4,10,703},{135,10,207},{132,10,571},{9,0,263} ,{10,0,147},{138,0,492},{7,11,1756},{137,11,98},{5,10,873},{5,10,960},{8,10,823} ,{137,10,881},{133,0,537},{132,0,859},{7,11,1046},{139,11,160},{137,0,842},{139, 10,283},{5,10,33},{6,10,470},{139,10,424},{6,11,45},{7,11,433},{8,11,129},{9,11, 21},{10,11,392},{11,11,79},{12,11,499},{13,11,199},{141,11,451},{135,0,1291},{ 135,10,1882},{7,11,558},{136,11,353},{134,0,1482},{5,0,230},{5,0,392},{6,0,420}, {9,0,568},{140,0,612},{6,0,262},{7,10,90},{7,10,664},{7,10,830},{7,10,1380},{7, 10,2025},{8,11,81},{8,10,448},{8,10,828},{9,11,189},{9,11,201},{11,11,478},{11, 11,712},{141,11,338},{142,0,31},{5,11,353},{151,11,26},{132,0,753},{4,0,0},{5,0, 41},{7,0,1459},{7,0,1469},{7,0,1859},{9,0,549},{139,0,905},{9,10,417},{137,10, 493},{135,11,1113},{133,0,696},{141,11,448},{134,10,295},{132,0,834},{4,0,771},{ 5,10,1019},{6,11,25},{7,11,855},{7,11,1258},{144,11,32},{134,0,1076},{133,0,921} ,{133,0,674},{4,11,4},{7,11,1118},{7,11,1320},{7,11,1706},{8,11,277},{9,11,622}, {10,11,9},{11,11,724},{12,11,350},{12,11,397},{13,11,28},{13,11,159},{15,11,89}, {18,11,5},{19,11,9},{20,11,34},{150,11,47},{134,10,208},{6,0,444},{136,0,308},{6 ,0,180},{7,0,1137},{8,0,751},{139,0,805},{4,0,183},{7,0,271},{11,0,824},{11,0, 952},{13,0,278},{13,0,339},{13,0,482},{14,0,424},{148,0,99},{7,11,317},{135,11, 569},{4,0,19},{5,0,477},{5,0,596},{6,0,505},{7,0,1221},{11,0,907},{12,0,209},{ 141,0,214},{135,0,1215},{6,0,271},{7,0,398},{8,0,387},{10,0,344},{7,10,448},{7, 10,1629},{7,10,1813},{8,10,442},{9,10,710},{10,10,282},{138,10,722},{11,10,844}, {12,10,104},{140,10,625},{134,11,255},{133,10,787},{134,0,1645},{11,11,956},{151 ,11,3},{6,0,92},{6,0,188},{7,0,209},{7,0,1269},{7,0,1524},{7,0,1876},{8,0,661},{ 10,0,42},{10,0,228},{11,0,58},{11,0,1020},{12,0,58},{12,0,118},{141,0,32},{4,0, 459},{133,0,966},{4,11,536},{7,11,1141},{10,11,723},{139,11,371},{140,0,330},{ 134,0,1557},{7,11,285},{135,11,876},{136,10,491},{135,11,560},{6,0,18},{7,0,179} ,{7,0,932},{8,0,548},{8,0,757},{9,0,54},{9,0,65},{9,0,532},{9,0,844},{10,0,113}, {10,0,117},{10,0,315},{10,0,560},{10,0,622},{10,0,798},{11,0,153},{11,0,351},{11 ,0,375},{12,0,78},{12,0,151},{12,0,392},{12,0,666},{14,0,248},{143,0,23},{6,0, 1742},{132,11,690},{4,10,403},{5,10,441},{7,10,450},{10,10,840},{11,10,101},{12, 10,193},{141,10,430},{133,0,965},{134,0,182},{10,0,65},{10,0,488},{138,0,497},{ 135,11,1346},{6,0,973},{6,0,1158},{10,11,200},{19,11,2},{151,11,22},{4,11,190},{ 133,11,554},{133,10,679},{7,0,328},{137,10,326},{133,11,1001},{9,0,588},{138,0, 260},{133,11,446},{135,10,1128},{135,10,1796},{147,11,119},{134,0,1786},{6,0, 1328},{6,0,1985},{8,0,962},{138,0,1017},{135,0,308},{11,0,508},{4,10,574},{7,10, 350},{7,10,1024},{8,10,338},{9,10,677},{138,10,808},{138,11,752},{135,10,1081},{ 137,11,96},{7,10,1676},{135,10,2037},{136,0,588},{132,11,304},{133,0,614},{140,0 ,793},{136,0,287},{137,10,297},{141,10,37},{6,11,53},{6,11,199},{7,11,1408},{8, 11,32},{8,11,93},{9,11,437},{10,11,397},{10,11,629},{11,11,593},{11,11,763},{13, 11,326},{145,11,35},{134,11,105},{9,11,320},{10,11,506},{138,11,794},{5,11,114}, {5,11,255},{141,11,285},{140,0,290},{7,11,2035},{8,11,19},{9,11,89},{138,11,831} ,{134,0,1136},{7,0,719},{8,0,796},{8,0,809},{8,0,834},{6,10,306},{7,10,1140},{7, 10,1340},{8,10,133},{138,10,449},{139,10,1011},{5,0,210},{6,0,213},{7,0,60},{10, 0,364},{139,0,135},{5,0,607},{8,0,326},{136,0,490},{138,11,176},{132,0,701},{5,0 ,472},{7,0,380},{137,0,758},{135,0,1947},{6,0,1079},{138,0,278},{138,11,391},{5, 10,329},{8,10,260},{139,11,156},{4,0,386},{7,0,41},{8,0,405},{8,0,728},{9,0,497} ,{11,0,110},{11,0,360},{15,0,37},{144,0,84},{5,0,46},{7,0,1452},{7,0,1480},{8,0, 634},{140,0,472},{136,0,961},{4,0,524},{136,0,810},{10,0,238},{141,0,33},{132,10 ,657},{152,10,7},{133,0,532},{5,0,997},{135,10,1665},{7,11,594},{7,11,851},{7,11 ,1858},{9,11,411},{9,11,574},{9,11,666},{9,11,737},{10,11,346},{10,11,712},{11, 11,246},{11,11,432},{11,11,517},{11,11,647},{11,11,679},{11,11,727},{12,11,304}, {12,11,305},{12,11,323},{12,11,483},{12,11,572},{12,11,593},{12,11,602},{13,11, 95},{13,11,101},{13,11,171},{13,11,315},{13,11,378},{13,11,425},{13,11,475},{14, 11,63},{14,11,380},{14,11,384},{15,11,133},{18,11,112},{148,11,72},{5,11,955},{ 136,11,814},{134,0,1301},{5,10,66},{7,10,1896},{136,10,288},{133,11,56},{134,10, 1643},{6,0,1298},{148,11,100},{5,0,782},{5,0,829},{6,0,671},{6,0,1156},{6,0,1738 },{137,11,621},{4,0,306},{5,0,570},{7,0,1347},{5,10,91},{5,10,648},{5,10,750},{5 ,10,781},{6,10,54},{6,10,112},{6,10,402},{6,10,1732},{7,10,315},{7,10,749},{7,10 ,1900},{9,10,78},{9,10,508},{10,10,611},{10,10,811},{11,10,510},{11,10,728},{13, 10,36},{14,10,39},{16,10,83},{17,10,124},{148,10,30},{8,10,570},{9,11,477},{141, 11,78},{4,11,639},{10,11,4},{10,10,322},{10,10,719},{11,10,407},{11,11,638},{12, 11,177},{148,11,57},{7,0,1823},{139,0,693},{7,0,759},{5,11,758},{8,10,125},{8,10 ,369},{8,10,524},{10,10,486},{11,10,13},{11,10,381},{11,10,736},{11,10,766},{11, 10,845},{13,10,114},{13,10,292},{142,10,47},{7,0,1932},{6,10,1684},{6,10,1731},{ 7,10,356},{8,10,54},{8,10,221},{9,10,225},{9,10,356},{10,10,77},{10,10,446},{10, 10,731},{12,10,404},{141,10,491},{135,11,552},{135,11,1112},{4,0,78},{5,0,96},{5 ,0,182},{6,0,1257},{7,0,1724},{7,0,1825},{10,0,394},{10,0,471},{11,0,532},{14,0, 340},{145,0,88},{139,11,328},{135,0,1964},{132,10,411},{4,10,80},{5,10,44},{137, 11,133},{5,11,110},{6,11,169},{6,11,1702},{7,11,400},{8,11,538},{9,11,184},{9,11 ,524},{140,11,218},{4,0,521},{5,10,299},{7,10,1083},{140,11,554},{6,11,133},{9, 11,353},{12,11,628},{146,11,79},{6,0,215},{7,0,584},{7,0,1028},{7,0,1473},{7,0, 1721},{9,0,424},{138,0,779},{7,0,857},{7,0,1209},{7,10,1713},{9,10,537},{10,10, 165},{12,10,219},{140,10,561},{4,10,219},{6,11,93},{7,11,1422},{7,10,1761},{7,11 ,1851},{8,11,673},{9,10,86},{9,11,529},{140,11,43},{137,11,371},{136,0,671},{5,0 ,328},{135,0,918},{132,0,529},{9,11,25},{10,11,467},{138,11,559},{4,11,335},{135 ,11,942},{134,0,716},{134,0,1509},{6,0,67},{7,0,258},{7,0,1630},{9,0,354},{9,0, 675},{10,0,830},{14,0,80},{17,0,80},{140,10,428},{134,0,1112},{6,0,141},{7,0,225 },{9,0,59},{9,0,607},{10,0,312},{11,0,687},{12,0,555},{13,0,373},{13,0,494},{148 ,0,58},{133,10,514},{8,11,39},{10,11,773},{11,11,84},{12,11,205},{142,11,1},{8,0 ,783},{5,11,601},{133,11,870},{136,11,594},{4,10,55},{5,10,301},{6,10,571},{14, 10,49},{146,10,102},{132,11,181},{134,11,1652},{133,10,364},{4,11,97},{5,11,147} ,{6,11,286},{7,11,1362},{141,11,176},{4,10,76},{7,10,1550},{9,10,306},{9,10,430} ,{9,10,663},{10,10,683},{11,10,427},{11,10,753},{12,10,334},{12,10,442},{14,10, 258},{14,10,366},{143,10,131},{137,10,52},{6,0,955},{134,0,1498},{6,11,375},{7, 11,169},{7,11,254},{136,11,780},{7,0,430},{11,0,46},{14,0,343},{142,11,343},{135 ,0,1183},{5,0,602},{7,0,2018},{9,0,418},{9,0,803},{135,11,1447},{8,0,677},{135, 11,1044},{139,11,285},{4,10,656},{135,10,779},{135,10,144},{5,11,629},{135,11, 1549},{135,10,1373},{138,11,209},{7,10,554},{7,10,605},{141,10,10},{5,10,838},{5 ,10,841},{134,10,1649},{133,10,1012},{6,0,1357},{134,0,1380},{144,0,53},{6,0,590 },{7,10,365},{7,10,1357},{7,10,1497},{8,10,154},{141,10,281},{133,10,340},{132, 11,420},{135,0,329},{147,11,32},{4,0,469},{10,11,429},{139,10,495},{8,10,261},{9 ,10,144},{9,10,466},{10,10,370},{12,10,470},{13,10,144},{142,10,348},{142,0,460} ,{4,11,325},{9,10,897},{138,11,125},{6,0,1743},{6,10,248},{9,10,546},{10,10,535} ,{11,10,681},{141,10,135},{4,0,990},{5,0,929},{6,0,340},{8,0,376},{8,0,807},{8,0 ,963},{8,0,980},{138,0,1007},{134,0,1603},{140,0,250},{4,11,714},{133,11,469},{ 134,10,567},{136,10,445},{5,0,218},{7,0,1610},{8,0,646},{10,0,83},{11,11,138},{ 140,11,40},{7,0,1512},{135,0,1794},{135,11,1216},{11,0,0},{16,0,78},{132,11,718} ,{133,0,571},{132,0,455},{134,0,1012},{5,11,124},{5,11,144},{6,11,548},{7,11,15} ,{7,11,153},{137,11,629},{142,11,10},{6,11,75},{7,11,1531},{8,11,416},{9,11,240} ,{9,11,275},{10,11,100},{11,11,658},{11,11,979},{12,11,86},{13,11,468},{14,11,66 },{14,11,207},{15,11,20},{15,11,25},{144,11,58},{132,10,577},{5,11,141},{5,11, 915},{6,11,1783},{7,11,211},{7,11,698},{7,11,1353},{9,11,83},{9,11,281},{10,11, 376},{10,11,431},{11,11,543},{12,11,664},{13,11,280},{13,11,428},{14,11,61},{14, 11,128},{17,11,52},{145,11,81},{6,0,161},{7,0,372},{137,0,597},{132,0,349},{10, 11,702},{139,11,245},{134,0,524},{134,10,174},{6,0,432},{9,0,751},{139,0,322},{ 147,11,94},{4,11,338},{133,11,400},{5,0,468},{10,0,325},{11,0,856},{12,0,345},{ 143,0,104},{133,0,223},{132,0,566},{4,11,221},{5,11,659},{5,11,989},{7,11,697},{ 7,11,1211},{138,11,284},{135,11,1070},{4,0,59},{135,0,1394},{6,0,436},{11,0,481} ,{5,10,878},{133,10,972},{4,0,48},{5,0,271},{135,0,953},{5,0,610},{136,0,457},{4 ,0,773},{5,0,618},{137,0,756},{133,0,755},{135,0,1217},{138,11,507},{132,10,351} ,{132,0,197},{143,11,78},{4,11,188},{7,11,805},{11,11,276},{142,11,293},{5,11, 884},{139,11,991},{132,10,286},{10,0,259},{10,0,428},{7,10,438},{7,10,627},{7,10 ,1516},{8,10,40},{9,10,56},{9,10,294},{11,10,969},{11,10,995},{146,10,148},{4,0, 356},{5,0,217},{5,0,492},{5,0,656},{8,0,544},{136,11,544},{5,0,259},{6,0,1230},{ 7,0,414},{7,0,854},{142,0,107},{132,0,1007},{15,0,14},{144,0,5},{6,0,1580},{132, 10,738},{132,11,596},{132,0,673},{133,10,866},{6,0,1843},{135,11,1847},{4,0,165} ,{7,0,1398},{135,0,1829},{135,11,1634},{147,11,65},{6,0,885},{6,0,1009},{137,0, 809},{133,10,116},{132,10,457},{136,11,770},{9,0,498},{12,0,181},{10,11,361},{ 142,11,316},{134,11,595},{5,0,9},{7,0,297},{7,0,966},{140,0,306},{4,11,89},{5,11 ,489},{6,11,315},{7,11,553},{7,11,1745},{138,11,243},{134,0,1487},{132,0,437},{5 ,0,146},{6,0,411},{138,0,721},{5,10,527},{6,10,189},{135,10,859},{11,10,104},{11 ,10,554},{15,10,60},{143,10,125},{6,11,1658},{9,11,3},{10,11,154},{11,11,641},{ 13,11,85},{13,11,201},{141,11,346},{6,0,177},{135,0,467},{134,0,1377},{134,10, 116},{136,11,645},{4,11,166},{5,11,505},{6,11,1670},{137,11,110},{133,10,487},{4 ,10,86},{5,10,667},{5,10,753},{6,10,316},{6,10,455},{135,10,946},{133,0,200},{ 132,0,959},{6,0,1928},{134,0,1957},{139,11,203},{150,10,45},{4,10,79},{7,10,1773 },{10,10,450},{11,10,589},{13,10,332},{13,10,493},{14,10,183},{14,10,334},{14,10 ,362},{14,10,368},{14,10,376},{14,10,379},{19,10,90},{19,10,103},{19,10,127},{ 148,10,90},{6,0,1435},{135,11,1275},{134,0,481},{7,11,445},{8,11,307},{8,11,704} ,{10,11,41},{10,11,439},{11,11,237},{11,11,622},{140,11,201},{135,11,869},{4,0, 84},{7,0,1482},{10,0,76},{138,0,142},{11,11,277},{144,11,14},{135,11,1977},{4,11 ,189},{5,11,713},{136,11,57},{133,0,1015},{138,11,371},{4,0,315},{5,0,507},{135, 0,1370},{4,11,552},{142,10,381},{9,0,759},{16,0,31},{16,0,39},{16,0,75},{18,0,24 },{20,0,42},{152,0,1},{134,0,712},{134,0,1722},{133,10,663},{133,10,846},{8,0, 222},{8,0,476},{9,0,238},{11,0,516},{11,0,575},{15,0,109},{146,0,100},{7,0,1402} ,{7,0,1414},{12,0,456},{5,10,378},{8,10,465},{9,10,286},{10,10,185},{10,10,562}, {10,10,635},{11,10,31},{11,10,393},{13,10,312},{18,10,65},{18,10,96},{147,10,89} ,{4,0,986},{6,0,1958},{6,0,2032},{8,0,934},{138,0,985},{7,10,1880},{9,10,680},{ 139,10,798},{134,10,1770},{145,11,49},{132,11,614},{132,10,648},{5,10,945},{6,10 ,1656},{6,10,1787},{7,10,167},{8,10,824},{9,10,391},{10,10,375},{139,10,185},{ 138,11,661},{7,0,1273},{135,11,1945},{7,0,706},{7,0,1058},{138,0,538},{7,10,1645 },{8,10,352},{137,10,249},{132,10,152},{11,0,92},{11,0,196},{11,0,409},{11,0,450 },{11,0,666},{11,0,777},{12,0,262},{13,0,385},{13,0,393},{15,0,115},{16,0,45},{ 145,0,82},{133,10,1006},{6,0,40},{135,0,1781},{9,11,614},{139,11,327},{5,10,420} ,{135,10,1449},{135,0,431},{10,0,97},{135,10,832},{6,0,423},{7,0,665},{135,0, 1210},{7,0,237},{8,0,664},{9,0,42},{9,0,266},{9,0,380},{9,0,645},{10,0,177},{138 ,0,276},{7,0,264},{133,10,351},{8,0,213},{5,10,40},{7,10,598},{7,10,1638},{9,10, 166},{9,10,640},{9,10,685},{9,10,773},{11,10,215},{13,10,65},{14,10,172},{14,10, 317},{145,10,6},{5,11,84},{134,11,163},{8,10,60},{9,10,343},{139,10,769},{137,0, 455},{133,11,410},{8,0,906},{12,0,700},{12,0,706},{140,0,729},{21,11,33},{150,11 ,40},{7,10,1951},{8,10,765},{8,10,772},{140,10,671},{7,10,108},{8,10,219},{8,10, 388},{9,10,639},{9,10,775},{11,10,275},{140,10,464},{5,11,322},{7,11,1941},{8,11 ,186},{9,11,262},{10,11,187},{14,11,208},{146,11,130},{139,0,624},{8,0,574},{5, 11,227},{140,11,29},{7,11,1546},{11,11,299},{142,11,407},{5,10,15},{6,10,56},{7, 10,1758},{8,10,500},{9,10,730},{11,10,331},{13,10,150},{142,10,282},{7,11,1395}, {8,11,486},{9,11,236},{9,11,878},{10,11,218},{11,11,95},{19,11,17},{147,11,31},{ 135,11,2043},{4,0,354},{146,11,4},{140,11,80},{135,0,1558},{134,10,1886},{5,10, 205},{6,10,438},{137,10,711},{133,11,522},{133,10,534},{7,0,235},{7,0,1475},{15, 0,68},{146,0,120},{137,10,691},{4,0,942},{6,0,1813},{8,0,917},{10,0,884},{12,0, 696},{12,0,717},{12,0,723},{12,0,738},{12,0,749},{12,0,780},{16,0,97},{146,0,169 },{6,10,443},{8,11,562},{9,10,237},{9,10,571},{9,10,695},{10,10,139},{11,10,715} ,{12,10,417},{141,10,421},{135,0,957},{133,0,830},{134,11,1771},{146,0,23},{5,0, 496},{6,0,694},{7,0,203},{7,11,1190},{137,11,620},{137,11,132},{6,0,547},{134,0, 1549},{8,11,258},{9,11,208},{137,11,359},{4,0,864},{5,0,88},{137,0,239},{135,11, 493},{4,11,317},{135,11,1279},{132,11,477},{4,10,578},{5,11,63},{133,11,509},{7, 0,650},{135,0,1310},{7,0,1076},{9,0,80},{11,0,78},{11,0,421},{11,0,534},{140,0, 545},{132,11,288},{12,0,553},{14,0,118},{133,10,923},{7,0,274},{11,0,479},{139,0 ,507},{8,11,89},{8,11,620},{9,11,49},{10,11,774},{11,11,628},{12,11,322},{143,11 ,124},{4,0,497},{135,0,1584},{7,0,261},{7,0,1115},{7,0,1354},{7,0,1404},{7,0, 1588},{7,0,1705},{7,0,1902},{9,0,465},{10,0,248},{10,0,349},{10,0,647},{11,0,527 },{11,0,660},{11,0,669},{12,0,529},{13,0,305},{132,10,924},{133,10,665},{136,0, 13},{6,0,791},{138,11,120},{7,0,642},{8,0,250},{11,0,123},{11,0,137},{13,0,48},{ 142,0,95},{4,10,265},{7,10,807},{135,10,950},{5,10,93},{140,10,267},{135,0,1429} ,{4,0,949},{10,0,885},{10,0,891},{10,0,900},{10,0,939},{12,0,760},{142,0,449},{ 139,11,366},{132,0,818},{134,11,85},{135,10,994},{7,0,330},{5,10,233},{5,10,320} ,{6,10,140},{136,10,295},{4,0,1004},{8,0,982},{136,0,993},{133,10,978},{4,10,905 },{6,10,1701},{137,10,843},{10,0,545},{140,0,301},{6,0,947},{134,0,1062},{134,0, 1188},{4,0,904},{5,0,794},{152,10,6},{134,0,1372},{135,11,608},{5,11,279},{6,11, 235},{7,11,468},{8,11,446},{9,11,637},{10,11,717},{11,11,738},{140,11,514},{132, 10,509},{5,11,17},{6,11,371},{137,11,528},{132,0,693},{4,11,115},{5,11,669},{6, 11,407},{8,11,311},{11,11,10},{141,11,5},{11,0,377},{7,10,273},{137,11,381},{135 ,0,695},{7,0,386},{138,0,713},{135,10,1041},{134,0,1291},{6,0,7},{6,0,35},{7,0, 147},{7,0,1069},{7,0,1568},{7,0,1575},{7,0,1917},{8,0,43},{8,0,208},{9,0,128},{9 ,0,866},{10,0,20},{11,0,981},{147,0,33},{7,0,893},{141,0,424},{139,10,234},{150, 11,56},{5,11,779},{5,11,807},{6,11,1655},{134,11,1676},{5,10,802},{7,10,2021},{ 136,10,805},{4,11,196},{5,10,167},{5,11,558},{5,10,899},{5,11,949},{6,10,410},{ 137,10,777},{137,10,789},{134,10,1705},{8,0,904},{140,0,787},{6,0,322},{9,0,552} ,{11,0,274},{13,0,209},{13,0,499},{14,0,85},{15,0,126},{145,0,70},{135,10,10},{5 ,10,11},{6,10,117},{6,10,485},{7,10,1133},{9,10,582},{9,10,594},{11,10,21},{11, 10,818},{12,10,535},{141,10,86},{4,10,264},{7,10,1067},{8,10,204},{8,10,385},{ 139,10,953},{132,11,752},{138,10,56},{133,10,470},{6,0,1808},{8,0,83},{8,0,742}, {8,0,817},{9,0,28},{9,0,29},{9,0,885},{10,0,387},{11,0,633},{11,0,740},{13,0,235 },{13,0,254},{15,0,143},{143,0,146},{140,0,49},{134,0,1832},{4,11,227},{5,11,159 },{5,11,409},{7,11,80},{10,11,294},{10,11,479},{12,11,418},{14,11,50},{14,11,249 },{142,11,295},{7,11,1470},{8,11,66},{8,11,137},{8,11,761},{9,11,638},{11,11,80} ,{11,11,212},{11,11,368},{11,11,418},{12,11,8},{13,11,15},{16,11,61},{17,11,59}, {19,11,28},{148,11,84},{139,10,1015},{138,11,468},{135,0,421},{6,0,415},{7,0, 1049},{137,0,442},{6,11,38},{7,11,1220},{8,11,185},{8,11,256},{9,11,22},{9,11, 331},{10,11,738},{11,11,205},{11,11,540},{11,11,746},{13,11,399},{13,11,465},{14 ,11,88},{142,11,194},{139,0,289},{133,10,715},{4,0,110},{10,0,415},{10,0,597},{ 142,0,206},{4,11,159},{6,11,115},{7,11,252},{7,11,257},{7,11,1928},{8,11,69},{9, 11,384},{10,11,91},{10,11,615},{12,11,375},{14,11,235},{18,11,117},{147,11,123}, {5,11,911},{136,11,278},{7,0,205},{7,0,2000},{8,10,794},{9,10,400},{10,10,298},{ 142,10,228},{135,11,1774},{4,11,151},{7,11,1567},{8,11,351},{137,11,322},{136,10 ,724},{133,11,990},{7,0,1539},{11,0,512},{13,0,205},{19,0,30},{22,0,36},{23,0,19 },{135,11,1539},{5,11,194},{7,11,1662},{9,11,90},{140,11,180},{6,10,190},{7,10, 768},{135,10,1170},{134,0,1340},{4,0,283},{135,0,1194},{133,11,425},{133,11,971} ,{12,0,549},{14,10,67},{147,10,60},{135,10,1023},{134,0,1720},{138,11,587},{5,11 ,72},{6,11,264},{7,11,21},{7,11,46},{7,11,2013},{8,11,215},{8,11,513},{10,11,266 },{139,11,22},{5,0,319},{135,0,534},{6,10,137},{9,10,75},{9,10,253},{10,10,194}, {138,10,444},{7,0,1180},{20,0,112},{6,11,239},{7,11,118},{10,11,95},{11,11,603}, {13,11,443},{14,11,160},{143,11,4},{134,11,431},{5,11,874},{6,11,1677},{11,10, 643},{12,10,115},{143,11,0},{134,0,967},{6,11,65},{7,11,939},{7,11,1172},{7,11, 1671},{9,11,540},{10,11,696},{11,11,265},{11,11,732},{11,11,928},{11,11,937},{12 ,11,399},{13,11,438},{149,11,19},{137,11,200},{135,0,1940},{5,10,760},{7,10,542} ,{8,10,135},{136,10,496},{140,11,44},{7,11,1655},{136,11,305},{7,10,319},{7,10, 355},{7,10,763},{10,10,389},{145,10,43},{136,0,735},{138,10,786},{137,11,19},{ 132,11,696},{5,0,132},{9,0,486},{9,0,715},{10,0,458},{11,0,373},{11,0,668},{11,0 ,795},{11,0,897},{12,0,272},{12,0,424},{12,0,539},{12,0,558},{14,0,245},{14,0, 263},{14,0,264},{14,0,393},{142,0,403},{10,0,38},{139,0,784},{132,0,838},{4,11, 302},{135,11,1766},{133,0,379},{5,0,8},{6,0,89},{6,0,400},{7,0,1569},{7,0,1623}, {7,0,1850},{8,0,218},{8,0,422},{9,0,570},{10,0,626},{4,11,726},{133,11,630},{4,0 ,1017},{138,0,660},{6,0,387},{7,0,882},{141,0,111},{6,0,224},{7,0,877},{137,0, 647},{4,10,58},{5,10,286},{6,10,319},{7,10,402},{7,10,1254},{7,10,1903},{8,10, 356},{140,10,408},{135,0,790},{9,0,510},{10,0,53},{4,10,389},{9,10,181},{10,10, 29},{10,10,816},{11,10,311},{11,10,561},{12,10,67},{141,10,181},{142,0,458},{6, 11,118},{7,11,215},{7,11,1521},{140,11,11},{134,0,954},{135,0,394},{134,0,1367}, {5,11,225},{133,10,373},{132,0,882},{7,0,1409},{135,10,1972},{135,10,1793},{4,11 ,370},{5,11,756},{135,11,1326},{150,11,13},{7,11,354},{10,11,410},{139,11,815},{ 6,11,1662},{7,11,48},{8,11,771},{10,11,116},{13,11,104},{14,11,105},{14,11,184}, {15,11,168},{19,11,92},{148,11,68},{7,0,124},{136,0,38},{5,0,261},{7,0,78},{7,0, 199},{8,0,815},{9,0,126},{10,0,342},{140,0,647},{4,0,628},{140,0,724},{7,0,266}, {8,0,804},{7,10,1651},{145,10,89},{135,0,208},{134,0,1178},{6,0,79},{135,0,1519} ,{132,10,672},{133,10,737},{136,0,741},{132,11,120},{4,0,710},{6,0,376},{134,0, 606},{134,0,1347},{134,0,1494},{6,0,850},{6,0,1553},{137,0,821},{5,10,145},{134, 11,593},{7,0,1311},{140,0,135},{4,0,467},{5,0,405},{134,0,544},{5,11,820},{135, 11,931},{6,0,100},{7,0,244},{7,0,632},{7,0,1609},{8,0,178},{8,0,638},{141,0,58}, {4,10,387},{135,10,1288},{6,11,151},{6,11,1675},{7,11,383},{151,11,10},{132,0, 481},{135,10,550},{134,0,1378},{6,11,1624},{11,11,11},{12,11,422},{13,11,262},{ 142,11,360},{133,0,791},{4,11,43},{5,11,344},{133,11,357},{7,0,1227},{140,0,978} ,{7,0,686},{8,0,33},{8,0,238},{10,0,616},{11,0,467},{11,0,881},{13,0,217},{13,0, 253},{142,0,268},{137,0,857},{8,0,467},{8,0,1006},{7,11,148},{8,11,284},{141,11, 63},{4,10,576},{135,10,1263},{133,11,888},{5,10,919},{134,10,1673},{20,10,37},{ 148,11,37},{132,0,447},{132,11,711},{4,0,128},{5,0,415},{6,0,462},{7,0,294},{7,0 ,578},{10,0,710},{139,0,86},{4,10,82},{5,10,333},{5,10,904},{6,10,207},{7,10,325 },{7,10,1726},{8,10,101},{10,10,778},{139,10,220},{136,0,587},{137,11,440},{133, 10,903},{6,0,427},{7,0,1018},{138,0,692},{4,0,195},{135,0,802},{140,10,147},{134 ,0,1546},{134,0,684},{132,10,705},{136,0,345},{11,11,678},{140,11,307},{133,0, 365},{134,0,1683},{4,11,65},{5,11,479},{5,11,1004},{7,11,1913},{8,11,317},{9,11, 302},{10,11,612},{141,11,22},{138,0,472},{4,11,261},{135,11,510},{134,10,90},{ 142,0,433},{151,0,28},{4,11,291},{7,11,101},{9,11,515},{12,11,152},{12,11,443},{ 13,11,392},{142,11,357},{140,0,997},{5,0,3},{8,0,578},{9,0,118},{10,0,705},{141, 0,279},{135,11,1266},{7,10,813},{12,10,497},{141,10,56},{133,0,229},{6,10,125},{ 135,10,1277},{8,0,102},{10,0,578},{10,0,672},{12,0,496},{13,0,408},{14,0,121},{ 17,0,106},{151,10,12},{6,0,866},{134,0,1080},{136,0,1022},{4,11,130},{135,11,843 },{5,11,42},{5,11,879},{7,11,245},{7,11,324},{7,11,1532},{11,11,463},{11,11,472} ,{13,11,363},{144,11,52},{150,0,55},{8,0,115},{8,0,350},{9,0,489},{10,0,128},{11 ,0,306},{12,0,373},{14,0,30},{17,0,79},{19,0,80},{4,11,134},{133,11,372},{134,0, 657},{134,0,933},{135,11,1147},{4,0,230},{133,0,702},{134,0,1728},{4,0,484},{18, 0,26},{19,0,42},{20,0,43},{21,0,0},{23,0,27},{152,0,14},{7,0,185},{135,0,703},{6 ,0,417},{10,0,618},{7,10,1106},{9,10,770},{11,10,112},{140,10,413},{134,0,803},{ 132,11,644},{134,0,1262},{7,11,540},{12,10,271},{145,10,109},{135,11,123},{132,0 ,633},{134,11,623},{4,11,908},{5,11,359},{5,11,508},{6,11,1723},{7,11,343},{7,11 ,1996},{135,11,2026},{135,0,479},{10,0,262},{7,10,304},{9,10,646},{9,10,862},{11 ,10,696},{12,10,208},{15,10,79},{147,10,108},{4,11,341},{135,11,480},{134,0,830} ,{5,0,70},{5,0,622},{6,0,334},{7,0,1032},{9,0,171},{11,0,26},{11,0,213},{11,0, 637},{11,0,707},{12,0,202},{12,0,380},{13,0,226},{13,0,355},{14,0,222},{145,0,42 },{135,10,981},{143,0,217},{137,11,114},{4,0,23},{4,0,141},{5,0,313},{5,0,1014}, {6,0,50},{6,0,51},{7,0,142},{7,0,384},{7,0,559},{8,0,640},{9,0,460},{9,0,783},{ 11,0,741},{12,0,183},{141,0,488},{141,0,360},{7,0,1586},{7,11,1995},{8,11,299},{ 11,11,890},{140,11,674},{132,10,434},{7,0,652},{134,10,550},{7,0,766},{5,10,553} ,{138,10,824},{7,0,737},{8,0,298},{136,10,452},{4,11,238},{5,11,503},{6,11,179}, {7,11,2003},{8,11,381},{8,11,473},{9,11,149},{10,11,183},{15,11,45},{143,11,86}, {133,10,292},{5,0,222},{9,0,655},{138,0,534},{138,10,135},{4,11,121},{5,11,156}, {5,11,349},{9,11,136},{10,11,605},{14,11,342},{147,11,107},{137,0,906},{6,0,1013 },{134,0,1250},{6,0,1956},{6,0,2009},{8,0,991},{144,0,120},{135,11,1192},{138,0, 503},{5,0,154},{7,0,1491},{10,0,379},{138,0,485},{6,0,1867},{6,0,1914},{6,0,1925 },{9,0,917},{9,0,925},{9,0,932},{9,0,951},{9,0,1007},{9,0,1013},{12,0,806},{12,0 ,810},{12,0,814},{12,0,816},{12,0,824},{12,0,832},{12,0,837},{12,0,863},{12,0, 868},{12,0,870},{12,0,889},{12,0,892},{12,0,900},{12,0,902},{12,0,908},{12,0,933 },{12,0,942},{12,0,949},{12,0,954},{15,0,175},{15,0,203},{15,0,213},{15,0,218},{ 15,0,225},{15,0,231},{15,0,239},{15,0,248},{15,0,252},{18,0,190},{18,0,204},{18, 0,215},{18,0,216},{18,0,222},{18,0,225},{18,0,230},{18,0,239},{18,0,241},{21,0, 42},{21,0,43},{21,0,44},{21,0,45},{21,0,46},{21,0,53},{24,0,27},{152,0,31},{133, 0,716},{135,0,844},{4,0,91},{5,0,388},{5,0,845},{6,0,206},{6,0,252},{6,0,365},{7 ,0,136},{7,0,531},{136,0,621},{7,10,393},{10,10,603},{139,10,206},{6,11,80},{6, 11,1694},{7,11,173},{7,11,1974},{9,11,547},{10,11,730},{14,11,18},{150,11,39},{ 137,0,748},{4,11,923},{134,11,1711},{4,10,912},{137,10,232},{7,10,98},{7,10,1973 },{136,10,716},{14,0,103},{133,10,733},{132,11,595},{12,0,158},{18,0,8},{19,0,62 },{20,0,6},{22,0,4},{23,0,2},{23,0,9},{5,11,240},{6,11,459},{7,11,12},{7,11,114} ,{7,11,502},{7,11,1751},{7,11,1753},{7,11,1805},{8,11,658},{9,11,1},{11,11,959}, {13,11,446},{142,11,211},{135,0,576},{5,0,771},{5,0,863},{5,0,898},{6,0,648},{6, 0,1632},{6,0,1644},{134,0,1780},{133,0,331},{7,11,633},{7,11,905},{7,11,909},{7, 11,1538},{9,11,767},{140,11,636},{140,0,632},{5,0,107},{7,0,201},{136,0,518},{6, 0,446},{7,0,1817},{134,11,490},{9,0,851},{141,0,510},{7,11,250},{8,11,506},{136, 11,507},{4,0,504},{137,10,72},{132,11,158},{4,11,140},{7,11,362},{8,11,209},{9, 11,10},{9,11,160},{9,11,503},{10,11,689},{11,11,350},{11,11,553},{11,11,725},{12 ,11,252},{12,11,583},{13,11,192},{13,11,352},{14,11,269},{14,11,356},{148,11,50} ,{6,11,597},{135,11,1318},{135,10,1454},{5,0,883},{5,0,975},{8,0,392},{148,0,7}, {6,11,228},{7,11,1341},{9,11,408},{138,11,343},{11,11,348},{11,10,600},{12,11,99 },{13,10,245},{18,11,1},{18,11,11},{147,11,4},{134,11,296},{5,0,922},{134,0,1707 },{132,11,557},{4,11,548},{7,10,164},{7,10,1571},{9,10,107},{140,10,225},{7,11, 197},{8,11,142},{8,11,325},{9,11,150},{9,11,596},{10,11,350},{10,11,353},{11,11, 74},{11,11,315},{14,11,423},{143,11,141},{5,0,993},{7,0,515},{137,0,91},{4,0,131 },{8,0,200},{5,10,484},{5,10,510},{6,10,434},{7,10,1000},{7,10,1098},{136,10,2}, {152,0,10},{4,11,62},{5,11,83},{6,11,399},{6,11,579},{7,11,692},{7,11,846},{7,11 ,1015},{7,11,1799},{8,11,403},{9,11,394},{10,11,133},{12,11,4},{12,11,297},{12, 11,452},{16,11,81},{18,11,19},{18,11,25},{21,11,14},{22,11,12},{151,11,18},{140, 11,459},{132,11,177},{7,0,1433},{9,0,365},{137,11,365},{132,10,460},{5,0,103},{6 ,0,2004},{7,0,921},{8,0,580},{8,0,593},{8,0,630},{10,0,28},{5,11,411},{135,11, 653},{4,10,932},{133,10,891},{4,0,911},{5,0,867},{5,0,1013},{7,0,2034},{8,0,798} ,{136,0,813},{7,11,439},{10,11,727},{11,11,260},{139,11,684},{136,10,625},{5,11, 208},{7,11,753},{135,11,1528},{5,0,461},{7,0,1925},{12,0,39},{13,0,265},{13,0, 439},{134,10,76},{6,0,853},{8,10,92},{137,10,221},{5,0,135},{6,0,519},{7,0,1722} ,{10,0,271},{11,0,261},{145,0,54},{139,11,814},{14,0,338},{148,0,81},{4,0,300},{ 133,0,436},{5,0,419},{5,0,687},{7,0,864},{9,0,470},{135,11,864},{9,0,836},{133, 11,242},{134,0,1937},{4,10,763},{133,11,953},{132,10,622},{132,0,393},{133,10, 253},{8,0,357},{10,0,745},{14,0,426},{17,0,94},{19,0,57},{135,10,546},{5,11,615} ,{146,11,37},{9,10,73},{10,10,110},{14,10,185},{145,10,119},{11,0,703},{7,10,624 },{7,10,916},{10,10,256},{139,10,87},{133,11,290},{5,10,212},{12,10,35},{141,10, 382},{132,11,380},{5,11,52},{7,11,277},{9,11,368},{139,11,791},{133,0,387},{10, 11,138},{139,11,476},{4,0,6},{5,0,708},{136,0,75},{7,0,1351},{9,0,581},{10,0,639 },{11,0,453},{140,0,584},{132,0,303},{138,0,772},{135,10,1175},{4,0,749},{5,10, 816},{6,11,256},{7,11,307},{7,11,999},{7,11,1481},{7,11,1732},{7,11,1738},{8,11, 265},{9,11,414},{11,11,316},{12,11,52},{13,11,420},{147,11,100},{135,11,1296},{6 ,0,1065},{5,10,869},{5,10,968},{6,10,1626},{8,10,734},{136,10,784},{4,10,542},{6 ,10,1716},{6,10,1727},{7,10,1082},{7,10,1545},{8,10,56},{8,10,118},{8,10,412},{8 ,10,564},{9,10,888},{9,10,908},{10,10,50},{10,10,423},{11,10,685},{11,10,697},{ 11,10,933},{12,10,299},{13,10,126},{13,10,136},{13,10,170},{141,10,190},{134,0, 226},{4,0,106},{7,0,310},{11,0,717},{133,11,723},{5,0,890},{5,0,988},{4,10,232}, {9,10,202},{10,10,474},{140,10,433},{6,0,626},{142,0,431},{10,0,706},{150,0,44}, {13,0,51},{6,10,108},{7,10,1003},{7,10,1181},{8,10,111},{136,10,343},{132,0,698} ,{5,11,109},{6,11,1784},{7,11,1895},{12,11,296},{140,11,302},{134,0,828},{134,10 ,1712},{138,0,17},{7,0,1929},{4,10,133},{5,11,216},{7,10,711},{7,10,1298},{7,10, 1585},{7,11,1879},{9,11,141},{9,11,270},{9,11,679},{10,11,159},{10,11,553},{11, 11,197},{11,11,438},{12,11,538},{12,11,559},{13,11,193},{13,11,423},{14,11,144}, {14,11,166},{14,11,167},{15,11,67},{147,11,84},{141,11,127},{7,11,1872},{137,11, 81},{6,10,99},{7,10,1808},{145,10,57},{134,11,391},{5,0,689},{6,0,84},{7,0,1250} ,{6,10,574},{7,10,428},{10,10,669},{11,10,485},{11,10,840},{12,10,300},{142,10, 250},{7,11,322},{136,11,249},{7,11,432},{135,11,1649},{135,10,1871},{137,10,252} ,{6,11,155},{140,11,234},{7,0,871},{19,0,27},{147,11,27},{140,0,498},{5,0,986},{ 6,0,130},{138,0,823},{6,0,1793},{7,0,1582},{8,0,458},{10,0,101},{10,0,318},{10,0 ,945},{12,0,734},{16,0,104},{18,0,177},{6,10,323},{135,10,1564},{5,11,632},{138, 11,526},{10,0,435},{7,10,461},{136,10,775},{6,11,144},{7,11,948},{7,11,1042},{7, 11,1857},{8,11,235},{8,11,461},{9,11,453},{9,11,530},{10,11,354},{17,11,77},{19, 11,99},{148,11,79},{138,0,966},{7,0,1644},{137,0,129},{135,0,997},{136,0,502},{5 ,11,196},{6,11,486},{7,11,212},{8,11,309},{136,11,346},{7,10,727},{146,10,73},{ 132,0,823},{132,11,686},{135,0,1927},{4,0,762},{7,0,1756},{137,0,98},{136,10,577 },{24,0,8},{4,11,30},{5,11,43},{152,11,8},{7,0,1046},{139,0,160},{7,0,492},{4,10 ,413},{5,10,677},{7,11,492},{8,10,432},{140,10,280},{6,0,45},{7,0,433},{8,0,129} ,{9,0,21},{10,0,392},{11,0,79},{12,0,499},{13,0,199},{141,0,451},{7,0,558},{136, 0,353},{4,11,220},{7,11,1535},{9,11,93},{139,11,474},{7,10,646},{7,10,1730},{11, 10,446},{141,10,178},{133,0,785},{134,0,1145},{8,0,81},{9,0,189},{9,0,201},{11,0 ,478},{11,0,712},{141,0,338},{5,0,353},{151,0,26},{11,0,762},{132,10,395},{134,0 ,2024},{4,0,611},{133,0,606},{9,10,174},{10,10,164},{11,10,440},{11,10,841},{143 ,10,98},{134,10,426},{10,10,608},{139,10,1002},{138,10,250},{6,0,25},{7,0,855},{ 7,0,1258},{144,0,32},{7,11,1725},{138,11,393},{5,11,263},{134,11,414},{6,0,2011} ,{133,10,476},{4,0,4},{7,0,1118},{7,0,1320},{7,0,1706},{8,0,277},{9,0,622},{10,0 ,9},{11,0,724},{12,0,350},{12,0,397},{13,0,28},{13,0,159},{15,0,89},{18,0,5},{19 ,0,9},{20,0,34},{22,0,47},{6,11,178},{6,11,1750},{8,11,251},{9,11,690},{10,11, 155},{10,11,196},{10,11,373},{11,11,698},{13,11,155},{148,11,93},{5,11,97},{137, 11,393},{7,0,764},{11,0,461},{12,0,172},{5,10,76},{6,10,458},{6,10,497},{7,10, 868},{9,10,658},{10,10,594},{11,10,566},{12,10,338},{141,10,200},{134,0,1449},{ 138,11,40},{134,11,1639},{134,0,1445},{6,0,1168},{4,10,526},{7,10,1029},{135,10, 1054},{4,11,191},{7,11,934},{8,11,647},{145,11,97},{132,10,636},{6,0,233},{7,10, 660},{7,10,1124},{17,10,31},{19,10,22},{151,10,14},{6,10,1699},{136,11,110},{12, 11,246},{15,11,162},{19,11,64},{20,11,8},{20,11,95},{22,11,24},{152,11,17},{5,11 ,165},{9,11,346},{138,11,655},{5,11,319},{135,11,534},{134,0,255},{9,0,216},{8, 11,128},{139,11,179},{9,0,183},{139,0,286},{11,0,956},{151,0,3},{4,0,536},{7,0, 1141},{10,0,723},{139,0,371},{4,10,279},{7,10,301},{137,10,362},{7,0,285},{5,11, 57},{6,11,101},{6,11,1663},{7,11,132},{7,11,1048},{7,11,1154},{7,11,1415},{7,11, 1507},{12,11,493},{15,11,105},{151,11,15},{5,11,459},{7,11,1073},{7,10,1743},{8, 11,241},{136,11,334},{4,10,178},{133,10,399},{135,0,560},{132,0,690},{135,0,1246 },{18,0,157},{147,0,63},{10,0,599},{11,0,33},{12,0,571},{149,0,1},{6,11,324},{6, 11,520},{7,11,338},{7,11,1616},{7,11,1729},{8,11,228},{9,11,69},{139,11,750},{7, 0,1862},{12,0,491},{12,0,520},{13,0,383},{142,0,244},{135,11,734},{134,10,1692}, {10,0,448},{11,0,630},{17,0,117},{6,10,202},{7,11,705},{12,10,360},{17,10,118},{ 18,10,27},{148,10,67},{4,11,73},{6,11,612},{7,11,927},{7,11,1822},{8,11,217},{9, 11,472},{9,11,765},{9,11,766},{10,11,408},{11,11,51},{11,11,793},{12,11,266},{15 ,11,158},{20,11,89},{150,11,32},{4,0,190},{133,0,554},{133,0,1001},{5,11,389},{8 ,11,636},{137,11,229},{5,0,446},{7,10,872},{10,10,516},{139,10,167},{137,10,313} ,{132,10,224},{134,0,1313},{5,10,546},{7,10,35},{8,10,11},{8,10,12},{9,10,315},{ 9,10,533},{10,10,802},{11,10,166},{12,10,525},{142,10,243},{6,0,636},{137,0,837} ,{5,10,241},{8,10,242},{9,10,451},{10,10,667},{11,10,598},{140,10,429},{22,10,46 },{150,11,46},{136,11,472},{11,0,278},{142,0,73},{141,11,185},{132,0,868},{134,0 ,972},{4,10,366},{137,10,516},{138,0,1010},{5,11,189},{6,10,1736},{7,11,442},{7, 11,443},{8,11,281},{12,11,174},{13,11,83},{141,11,261},{139,11,384},{6,11,2},{7, 11,191},{7,11,446},{7,11,758},{7,11,1262},{7,11,1737},{8,11,22},{8,11,270},{8,11 ,612},{9,11,4},{9,11,167},{9,11,312},{9,11,436},{10,11,156},{10,11,216},{10,11, 311},{10,11,623},{11,11,72},{11,11,330},{11,11,455},{12,11,101},{12,11,321},{12, 11,504},{12,11,530},{12,11,543},{13,11,17},{13,11,156},{13,11,334},{14,11,48},{ 15,11,70},{17,11,60},{148,11,64},{6,10,331},{136,10,623},{135,0,1231},{132,0,304 },{6,11,60},{7,11,670},{7,11,1327},{8,11,411},{8,11,435},{9,11,653},{9,11,740},{ 10,11,385},{11,11,222},{11,11,324},{11,11,829},{140,11,611},{7,0,506},{6,11,166} ,{7,11,374},{135,11,1174},{14,11,43},{146,11,21},{135,11,1694},{135,10,1888},{5, 11,206},{134,11,398},{135,11,50},{150,0,26},{6,0,53},{6,0,199},{7,0,1408},{8,0, 32},{8,0,93},{10,0,397},{10,0,629},{11,0,593},{11,0,763},{13,0,326},{145,0,35},{ 134,0,105},{132,10,394},{4,0,843},{138,0,794},{11,0,704},{141,0,396},{5,0,114},{ 5,0,255},{141,0,285},{6,0,619},{7,0,898},{7,0,1092},{8,0,485},{18,0,28},{19,0, 116},{135,10,1931},{9,0,145},{7,10,574},{135,10,1719},{7,0,2035},{8,0,19},{9,0, 89},{138,0,831},{132,10,658},{6,11,517},{7,11,1159},{10,11,621},{139,11,192},{7, 0,1933},{7,11,1933},{9,10,781},{10,10,144},{11,10,385},{13,10,161},{13,10,228},{ 13,10,268},{148,10,107},{136,10,374},{10,11,223},{139,11,645},{135,0,1728},{7,11 ,64},{7,11,289},{136,11,245},{4,10,344},{6,10,498},{139,10,323},{136,0,746},{135 ,10,1063},{137,10,155},{4,0,987},{6,0,1964},{6,0,1974},{6,0,1990},{136,0,995},{ 133,11,609},{133,10,906},{134,0,1550},{134,0,874},{5,11,129},{6,11,61},{135,11, 947},{4,0,1018},{6,0,1938},{6,0,2021},{134,0,2039},{132,0,814},{11,0,126},{139,0 ,287},{134,0,1264},{5,0,955},{136,0,814},{141,11,506},{132,11,314},{6,0,981},{ 139,11,1000},{5,0,56},{8,0,892},{8,0,915},{140,0,776},{148,0,100},{10,0,4},{10,0 ,13},{11,0,638},{148,0,57},{148,11,74},{5,0,738},{132,10,616},{133,11,637},{136, 10,692},{133,0,758},{132,10,305},{137,11,590},{5,11,280},{135,11,1226},{134,11, 494},{135,0,1112},{133,11,281},{13,0,44},{14,0,214},{5,10,214},{7,10,603},{8,10, 611},{9,10,686},{10,10,88},{11,10,459},{11,10,496},{12,10,463},{140,10,590},{139 ,0,328},{135,11,1064},{137,0,133},{7,0,168},{13,0,196},{141,0,237},{134,10,1703} ,{134,0,1152},{135,0,1245},{5,0,110},{6,0,169},{6,0,1702},{7,0,400},{8,0,538},{9 ,0,184},{9,0,524},{140,0,218},{6,0,1816},{10,0,871},{12,0,769},{140,0,785},{132, 11,630},{7,11,33},{7,11,120},{8,11,489},{9,11,319},{10,11,820},{11,11,1004},{12, 11,379},{13,11,117},{13,11,412},{14,11,25},{15,11,52},{15,11,161},{16,11,47},{ 149,11,2},{6,0,133},{8,0,413},{9,0,353},{139,0,993},{145,10,19},{4,11,937},{133, 11,801},{134,0,978},{6,0,93},{6,0,1508},{7,0,1422},{7,0,1851},{8,0,673},{9,0,529 },{140,0,43},{6,0,317},{10,0,512},{4,10,737},{11,10,294},{12,10,60},{12,10,437}, {13,10,64},{13,10,380},{142,10,430},{9,0,371},{7,11,1591},{144,11,43},{6,10,1758 },{8,10,520},{9,10,345},{9,10,403},{142,10,350},{5,0,526},{10,10,242},{138,10, 579},{9,0,25},{10,0,467},{138,0,559},{5,10,139},{7,10,1168},{138,10,539},{4,0, 335},{135,0,942},{140,0,754},{132,11,365},{11,0,182},{142,0,195},{142,11,29},{5, 11,7},{139,11,774},{4,11,746},{135,11,1090},{8,0,39},{10,0,773},{11,0,84},{12,0, 205},{142,0,1},{5,0,601},{5,0,870},{5,11,360},{136,11,237},{132,0,181},{136,0, 370},{134,0,1652},{8,0,358},{4,10,107},{7,10,613},{8,10,439},{8,10,504},{9,10, 501},{10,10,383},{139,10,477},{132,10,229},{137,11,785},{4,0,97},{5,0,147},{6,0, 286},{7,0,1362},{141,0,176},{6,0,537},{7,0,788},{7,0,1816},{132,10,903},{140,10, 71},{6,0,743},{134,0,1223},{6,0,375},{7,0,169},{7,0,254},{8,0,780},{135,11,1493} ,{7,0,1714},{4,10,47},{6,10,373},{7,10,452},{7,10,543},{7,10,1856},{9,10,6},{11, 10,257},{139,10,391},{6,0,896},{136,0,1003},{135,0,1447},{137,11,341},{5,10,980} ,{134,10,1754},{145,11,22},{4,11,277},{5,11,608},{6,11,493},{7,11,457},{140,11, 384},{7,10,536},{7,10,1331},{136,10,143},{140,0,744},{7,11,27},{135,11,316},{18, 0,126},{5,10,19},{134,10,533},{4,0,788},{11,0,41},{5,11,552},{5,11,586},{5,11, 676},{6,11,448},{8,11,244},{11,11,1},{11,11,41},{13,11,3},{16,11,54},{17,11,4},{ 146,11,13},{4,0,985},{6,0,1801},{4,11,401},{137,11,264},{5,10,395},{5,10,951},{ 134,10,1776},{5,0,629},{135,0,1549},{11,10,663},{12,10,210},{13,10,166},{13,10, 310},{14,10,373},{147,10,43},{9,11,543},{10,11,524},{11,11,30},{12,11,524},{14, 11,315},{16,11,18},{20,11,26},{148,11,65},{4,11,205},{5,11,623},{7,11,104},{136, 11,519},{5,0,293},{134,0,601},{7,11,579},{9,11,41},{9,11,244},{9,11,669},{10,11, 5},{11,11,861},{11,11,951},{139,11,980},{132,11,717},{132,10,695},{7,10,497},{9, 10,387},{147,10,81},{132,0,420},{142,0,37},{6,0,1134},{6,0,1900},{12,0,830},{12, 0,878},{12,0,894},{15,0,221},{143,0,245},{132,11,489},{7,0,1570},{140,0,542},{8, 0,933},{136,0,957},{6,0,1371},{7,0,31},{8,0,373},{5,10,284},{6,10,49},{6,10,350} ,{7,10,377},{7,10,1693},{8,10,678},{9,10,161},{9,10,585},{9,10,671},{9,10,839},{ 11,10,912},{141,10,427},{135,11,892},{4,0,325},{138,0,125},{139,11,47},{132,10, 597},{138,0,323},{6,0,1547},{7,11,1605},{9,11,473},{11,11,962},{146,11,139},{139 ,10,908},{7,11,819},{9,11,26},{9,11,392},{10,11,152},{10,11,226},{11,11,19},{12, 11,276},{12,11,426},{12,11,589},{13,11,460},{15,11,97},{19,11,48},{148,11,104},{ 135,11,51},{4,0,718},{135,0,1216},{6,0,1896},{6,0,1905},{6,0,1912},{9,0,947},{9, 0,974},{12,0,809},{12,0,850},{12,0,858},{12,0,874},{12,0,887},{12,0,904},{12,0, 929},{12,0,948},{12,0,952},{15,0,198},{15,0,206},{15,0,220},{15,0,227},{15,0,247 },{18,0,188},{21,0,48},{21,0,50},{24,0,25},{24,0,29},{7,11,761},{7,11,1051},{137 ,11,545},{5,0,124},{5,0,144},{6,0,548},{7,0,15},{7,0,153},{137,0,629},{135,11, 606},{135,10,2014},{7,10,2007},{9,11,46},{9,10,101},{9,10,450},{10,10,66},{10,10 ,842},{11,10,536},{140,10,587},{6,0,75},{7,0,1531},{8,0,416},{9,0,240},{9,0,275} ,{10,0,100},{11,0,658},{11,0,979},{12,0,86},{14,0,207},{15,0,20},{143,0,25},{5,0 ,141},{5,0,915},{6,0,1783},{7,0,211},{7,0,698},{7,0,1353},{9,0,83},{9,0,281},{10 ,0,376},{10,0,431},{11,0,543},{12,0,664},{13,0,280},{13,0,428},{14,0,61},{14,0, 128},{17,0,52},{145,0,81},{132,11,674},{135,0,533},{149,0,6},{132,11,770},{133,0 ,538},{5,11,79},{7,11,1027},{7,11,1477},{139,11,52},{139,10,62},{4,0,338},{133,0 ,400},{5,11,789},{134,11,195},{4,11,251},{4,11,688},{7,11,513},{7,11,1284},{9,11 ,87},{138,11,365},{134,10,1766},{6,0,0},{7,0,84},{11,0,895},{145,0,11},{139,0, 892},{4,0,221},{5,0,659},{7,0,697},{7,0,1211},{138,0,284},{133,0,989},{133,11, 889},{4,11,160},{5,11,330},{7,11,1434},{136,11,174},{6,10,1665},{7,10,256},{7,10 ,1388},{10,10,499},{139,10,670},{7,0,848},{4,10,22},{5,10,10},{136,10,97},{138,0 ,507},{133,10,481},{4,0,188},{135,0,805},{5,0,884},{6,0,732},{139,0,991},{135,11 ,968},{11,11,636},{15,11,145},{17,11,34},{19,11,50},{151,11,20},{7,0,959},{16,0, 60},{6,10,134},{7,10,437},{9,10,37},{14,10,285},{142,10,371},{7,10,486},{8,10, 155},{11,10,93},{140,10,164},{134,0,1653},{7,0,337},{133,10,591},{6,0,1989},{8,0 ,922},{8,0,978},{133,11,374},{132,0,638},{138,0,500},{133,11,731},{5,10,380},{5, 10,650},{136,10,310},{138,11,381},{4,10,364},{7,10,1156},{7,10,1187},{137,10,409 },{137,11,224},{140,0,166},{134,10,482},{4,11,626},{5,11,642},{6,11,425},{10,11, 202},{139,11,141},{4,10,781},{6,10,487},{7,10,926},{8,10,263},{139,10,500},{135, 0,418},{4,10,94},{135,10,1265},{136,0,760},{132,10,417},{136,11,835},{5,10,348}, {134,10,522},{6,0,1277},{134,0,1538},{139,11,541},{135,11,1597},{5,11,384},{8,11 ,455},{140,11,48},{136,0,770},{5,11,264},{134,11,184},{4,0,89},{5,0,489},{6,0, 315},{7,0,553},{7,0,1745},{138,0,243},{4,10,408},{4,10,741},{135,10,500},{134,0, 1396},{133,0,560},{6,0,1658},{9,0,3},{10,0,154},{11,0,641},{13,0,85},{13,0,201}, {141,0,346},{135,11,1595},{5,11,633},{6,11,28},{7,11,219},{135,11,1323},{9,11, 769},{140,11,185},{135,11,785},{7,11,359},{8,11,243},{140,11,175},{138,0,586},{7 ,0,1271},{134,10,73},{132,11,105},{4,0,166},{5,0,505},{134,0,1670},{133,10,576}, {4,11,324},{138,11,104},{142,10,231},{6,0,637},{7,10,1264},{7,10,1678},{11,10, 945},{12,10,341},{12,10,471},{12,10,569},{23,11,21},{151,11,23},{8,11,559},{141, 11,109},{134,0,1947},{7,0,445},{8,0,307},{8,0,704},{10,0,41},{10,0,439},{11,0, 237},{11,0,622},{140,0,201},{135,11,963},{135,0,1977},{4,0,189},{5,0,713},{136,0 ,57},{138,0,371},{135,10,538},{132,0,552},{6,0,883},{133,10,413},{6,0,923},{132, 11,758},{138,11,215},{136,10,495},{7,10,54},{8,10,312},{10,10,191},{10,10,614},{ 140,10,567},{7,11,351},{139,11,128},{7,0,875},{6,10,468},{7,10,1478},{8,10,530}, {142,10,290},{135,0,1788},{17,0,49},{133,11,918},{12,11,398},{20,11,39},{21,11, 11},{150,11,41},{10,0,661},{6,10,484},{135,10,822},{135,0,1945},{134,0,794},{137 ,10,900},{135,10,1335},{6,10,1724},{135,10,2022},{132,11,340},{134,0,1135},{4,0, 784},{133,0,745},{5,0,84},{134,0,163},{133,0,410},{4,0,976},{5,11,985},{7,11,509 },{7,11,529},{145,11,96},{132,10,474},{134,0,703},{135,11,1919},{5,0,322},{8,0, 186},{9,0,262},{10,0,187},{142,0,208},{135,10,1504},{133,0,227},{9,0,560},{13,0, 208},{133,10,305},{132,11,247},{7,0,1395},{8,0,486},{9,0,236},{9,0,878},{10,0, 218},{11,0,95},{19,0,17},{147,0,31},{7,0,2043},{8,0,672},{141,0,448},{4,11,184}, {5,11,390},{6,11,337},{7,11,23},{7,11,494},{7,11,618},{7,11,1456},{8,11,27},{8, 11,599},{10,11,153},{139,11,710},{135,0,466},{135,10,1236},{6,0,167},{7,0,186},{ 7,0,656},{10,0,643},{4,10,480},{6,10,302},{6,10,1642},{7,10,837},{7,10,1547},{7, 10,1657},{8,10,429},{9,10,228},{13,10,289},{13,10,343},{147,10,101},{134,0,1428} ,{134,0,1440},{5,0,412},{7,10,278},{10,10,739},{11,10,708},{141,10,348},{134,0, 1118},{136,0,562},{148,11,46},{9,0,316},{139,0,256},{134,0,1771},{135,0,1190},{ 137,0,132},{10,11,227},{11,11,497},{11,11,709},{140,11,415},{143,0,66},{6,11,360 },{7,11,1664},{136,11,478},{144,10,28},{4,0,317},{135,0,1279},{5,0,63},{133,0, 509},{136,11,699},{145,10,36},{134,0,1475},{11,11,343},{142,11,127},{132,11,739} ,{132,0,288},{135,11,1757},{8,0,89},{8,0,620},{9,0,608},{11,0,628},{12,0,322},{ 143,0,124},{134,0,1225},{7,0,1189},{4,11,67},{5,11,422},{6,10,363},{7,11,1037},{ 7,11,1289},{7,11,1555},{7,10,1955},{8,10,725},{9,11,741},{145,11,108},{134,0, 1468},{6,0,689},{134,0,1451},{138,0,120},{151,0,1},{137,10,805},{142,0,329},{5, 10,813},{135,10,2046},{135,0,226},{138,11,96},{7,0,1855},{5,10,712},{11,10,17},{ 13,10,321},{144,10,67},{9,0,461},{6,10,320},{7,10,781},{7,10,1921},{9,10,55},{10 ,10,186},{10,10,273},{10,10,664},{10,10,801},{11,10,996},{11,10,997},{13,10,157} ,{142,10,170},{8,11,203},{8,10,271},{11,11,823},{11,11,846},{12,11,482},{13,11, 133},{13,11,277},{13,11,302},{13,11,464},{14,11,205},{142,11,221},{135,0,1346},{ 4,11,449},{133,11,718},{134,0,85},{14,0,299},{7,10,103},{7,10,863},{11,10,184},{ 145,10,62},{4,11,355},{6,11,311},{9,11,256},{138,11,404},{137,10,659},{138,11, 758},{133,11,827},{5,11,64},{140,11,581},{134,0,1171},{4,11,442},{7,11,1047},{7, 11,1352},{135,11,1643},{132,0,980},{5,11,977},{6,11,288},{7,11,528},{135,11,1065 },{5,0,279},{6,0,235},{7,0,468},{8,0,446},{9,0,637},{10,0,717},{11,0,738},{140,0 ,514},{132,0,293},{11,10,337},{142,10,303},{136,11,285},{5,0,17},{6,0,371},{9,0, 528},{12,0,364},{132,11,254},{5,10,77},{7,10,1455},{10,10,843},{147,10,73},{150, 0,5},{132,10,458},{6,11,12},{7,11,1219},{145,11,73},{135,10,1420},{6,10,109},{ 138,10,382},{135,11,125},{6,10,330},{7,10,1084},{139,10,142},{6,11,369},{6,11, 502},{7,11,1036},{8,11,348},{9,11,452},{10,11,26},{11,11,224},{11,11,387},{11,11 ,772},{12,11,95},{12,11,629},{13,11,195},{13,11,207},{13,11,241},{14,11,260},{14 ,11,270},{143,11,140},{132,11,269},{5,11,480},{7,11,532},{7,11,1197},{7,11,1358} ,{8,11,291},{11,11,349},{142,11,396},{150,0,48},{10,0,601},{13,0,353},{141,0,376 },{5,0,779},{5,0,807},{6,0,1655},{134,0,1676},{142,11,223},{4,0,196},{5,0,558},{ 133,0,949},{148,11,15},{135,11,1764},{134,0,1322},{132,0,752},{139,0,737},{135, 11,657},{136,11,533},{135,0,412},{4,0,227},{5,0,159},{5,0,409},{7,0,80},{8,0,556 },{10,0,479},{12,0,418},{14,0,50},{14,0,123},{14,0,192},{14,0,249},{14,0,295},{ 143,0,27},{7,0,1470},{8,0,66},{8,0,137},{8,0,761},{9,0,638},{11,0,80},{11,0,212} ,{11,0,368},{11,0,418},{12,0,8},{13,0,15},{16,0,61},{17,0,59},{19,0,28},{148,0, 84},{135,10,1985},{4,11,211},{4,11,332},{5,11,335},{6,11,238},{7,11,269},{7,11, 811},{7,11,1797},{8,10,122},{8,11,836},{9,11,507},{141,11,242},{6,0,683},{134,0, 1252},{4,0,873},{132,10,234},{134,0,835},{6,0,38},{7,0,1220},{8,0,185},{8,0,256} ,{9,0,22},{9,0,331},{10,0,738},{11,0,205},{11,0,540},{11,0,746},{13,0,465},{14,0 ,88},{142,0,194},{138,0,986},{5,11,1009},{12,11,582},{146,11,131},{4,0,159},{6,0 ,115},{7,0,252},{7,0,257},{7,0,1928},{8,0,69},{9,0,384},{10,0,91},{10,0,615},{12 ,0,375},{14,0,235},{18,0,117},{147,0,123},{133,0,911},{136,0,278},{5,10,430},{5, 10,932},{6,10,131},{7,10,417},{9,10,522},{11,10,314},{141,10,390},{14,10,149},{ 14,10,399},{143,10,57},{4,0,151},{7,0,1567},{136,0,749},{5,11,228},{6,11,203},{7 ,11,156},{8,11,347},{137,11,265},{132,10,507},{10,0,989},{140,0,956},{133,0,990} ,{5,0,194},{6,0,927},{7,0,1662},{9,0,90},{140,0,564},{4,10,343},{133,10,511},{ 133,0,425},{7,10,455},{138,10,591},{4,0,774},{7,11,476},{7,11,1592},{138,11,87}, {5,0,971},{135,10,1381},{5,11,318},{147,11,121},{5,11,291},{7,11,765},{9,11,389} ,{140,11,548},{134,10,575},{4,0,827},{12,0,646},{12,0,705},{12,0,712},{140,0,714 },{139,0,752},{137,0,662},{5,0,72},{6,0,264},{7,0,21},{7,0,46},{7,0,2013},{8,0, 215},{8,0,513},{10,0,266},{139,0,22},{139,11,522},{6,0,239},{7,0,118},{10,0,95}, {11,0,603},{13,0,443},{14,0,160},{143,0,4},{6,0,431},{134,0,669},{7,10,1127},{7, 10,1572},{10,10,297},{10,10,422},{11,10,764},{11,10,810},{12,10,264},{13,10,102} ,{13,10,300},{13,10,484},{14,10,147},{14,10,229},{17,10,71},{18,10,118},{147,10, 120},{5,0,874},{6,0,1677},{15,0,0},{10,11,525},{139,11,82},{6,0,65},{7,0,939},{7 ,0,1172},{7,0,1671},{9,0,540},{10,0,696},{11,0,265},{11,0,732},{11,0,928},{11,0, 937},{141,0,438},{134,0,1350},{136,11,547},{132,11,422},{5,11,355},{145,11,0},{ 137,11,905},{5,0,682},{135,0,1887},{132,0,809},{4,0,696},{133,11,865},{6,0,1074} ,{6,0,1472},{14,10,35},{142,10,191},{5,11,914},{134,11,1625},{133,11,234},{135, 11,1383},{137,11,780},{132,10,125},{4,0,726},{133,0,630},{8,0,802},{136,0,838},{ 132,10,721},{6,0,1337},{7,0,776},{19,0,56},{136,10,145},{132,0,970},{7,10,792},{ 8,10,147},{10,10,821},{139,10,1021},{139,10,970},{8,0,940},{137,0,797},{135,11, 1312},{9,0,248},{10,0,400},{7,11,816},{7,11,1241},{7,10,1999},{9,11,283},{9,11, 520},{10,11,213},{10,11,307},{10,11,463},{10,11,671},{10,11,746},{11,11,401},{11 ,11,794},{12,11,517},{18,11,107},{147,11,115},{6,0,1951},{134,0,2040},{135,11, 339},{13,0,41},{15,0,93},{5,10,168},{5,10,930},{8,10,74},{9,10,623},{12,10,500}, {140,10,579},{6,0,118},{7,0,215},{7,0,1521},{140,0,11},{6,10,220},{7,10,1101},{ 141,10,105},{6,11,421},{7,11,61},{7,11,1540},{10,11,11},{138,11,501},{7,0,615},{ 138,0,251},{140,11,631},{135,0,1044},{6,10,19},{7,10,1413},{139,10,428},{133,0, 225},{7,10,96},{8,10,401},{8,10,703},{137,10,896},{145,10,116},{6,11,102},{7,11, 72},{15,11,142},{147,11,67},{7,10,1961},{7,10,1965},{8,10,702},{136,10,750},{7, 10,2030},{8,10,150},{8,10,737},{12,10,366},{151,11,30},{4,0,370},{5,0,756},{7,0, 1326},{135,11,823},{8,10,800},{9,10,148},{9,10,872},{9,10,890},{11,10,309},{11, 10,1001},{13,10,267},{141,10,323},{6,0,1662},{7,0,48},{8,0,771},{10,0,116},{13,0 ,104},{14,0,105},{14,0,184},{15,0,168},{19,0,92},{148,0,68},{10,0,209},{135,11, 1870},{7,11,68},{8,11,48},{8,11,88},{8,11,582},{8,11,681},{9,11,373},{9,11,864}, {11,11,157},{11,11,336},{11,11,843},{148,11,27},{134,0,930},{4,11,88},{5,11,137} ,{5,11,174},{5,11,777},{6,11,1664},{6,11,1725},{7,11,77},{7,11,426},{7,11,1317}, {7,11,1355},{8,11,126},{8,11,563},{9,11,523},{9,11,750},{10,11,310},{10,11,836}, {11,11,42},{11,11,318},{11,11,731},{12,11,68},{12,11,92},{12,11,507},{12,11,692} ,{13,11,81},{13,11,238},{13,11,374},{18,11,138},{19,11,78},{19,11,111},{20,11,55 },{20,11,77},{148,11,92},{4,11,938},{135,11,1831},{5,10,547},{7,10,424},{8,11, 617},{138,11,351},{6,0,1286},{6,11,1668},{7,11,1499},{8,11,117},{9,11,314},{138, 11,174},{6,0,759},{6,0,894},{7,11,707},{139,11,563},{4,0,120},{135,0,1894},{9,0, 385},{149,0,17},{138,0,429},{133,11,403},{5,0,820},{135,0,931},{10,0,199},{133, 10,133},{6,0,151},{6,0,1675},{7,0,383},{151,0,10},{6,0,761},{136,10,187},{8,0, 365},{10,10,0},{10,10,818},{139,10,988},{4,11,44},{5,11,311},{6,11,156},{7,11, 639},{7,11,762},{7,11,1827},{9,11,8},{9,11,462},{148,11,83},{4,11,346},{7,11,115 },{9,11,180},{9,11,456},{138,11,363},{136,10,685},{7,0,1086},{145,0,46},{6,0, 1624},{11,0,11},{12,0,422},{13,0,444},{142,0,360},{6,0,1020},{6,0,1260},{134,0, 1589},{4,0,43},{5,0,344},{5,0,357},{14,0,472},{150,0,58},{6,0,1864},{6,0,1866},{ 6,0,1868},{6,0,1869},{6,0,1874},{6,0,1877},{6,0,1903},{6,0,1911},{9,0,920},{9,0, 921},{9,0,924},{9,0,946},{9,0,959},{9,0,963},{9,0,970},{9,0,997},{9,0,1008},{9,0 ,1017},{12,0,795},{12,0,797},{12,0,798},{12,0,800},{12,0,803},{12,0,811},{12,0, 820},{12,0,821},{12,0,839},{12,0,841},{12,0,848},{12,0,911},{12,0,921},{12,0,922 },{12,0,925},{12,0,937},{12,0,944},{12,0,945},{12,0,953},{15,0,184},{15,0,191},{ 15,0,199},{15,0,237},{15,0,240},{15,0,243},{15,0,246},{18,0,203},{21,0,40},{21,0 ,52},{21,0,57},{24,0,23},{24,0,28},{152,0,30},{134,0,725},{145,11,58},{133,0,888 },{137,10,874},{4,0,711},{8,10,774},{10,10,670},{140,10,51},{144,11,40},{6,11, 185},{7,11,1899},{139,11,673},{137,10,701},{137,0,440},{4,11,327},{5,11,478},{7, 11,1332},{8,11,753},{140,11,227},{4,10,127},{5,10,350},{6,10,356},{8,10,426},{9, 10,572},{10,10,247},{139,10,312},{5,11,1020},{133,11,1022},{4,11,103},{133,11, 401},{6,0,1913},{6,0,1926},{6,0,1959},{9,0,914},{9,0,939},{9,0,952},{9,0,979},{9 ,0,990},{9,0,998},{9,0,1003},{9,0,1023},{12,0,827},{12,0,834},{12,0,845},{12,0, 912},{12,0,935},{12,0,951},{15,0,172},{15,0,174},{18,0,198},{149,0,63},{5,0,958} ,{5,0,987},{4,11,499},{135,11,1421},{7,0,885},{6,10,59},{6,10,1762},{9,10,603},{ 141,10,397},{10,11,62},{141,11,164},{4,0,847},{135,0,326},{11,0,276},{142,0,293} ,{4,0,65},{5,0,479},{5,0,1004},{7,0,1913},{8,0,317},{9,0,302},{10,0,612},{13,0, 22},{132,11,96},{4,0,261},{135,0,510},{135,0,1514},{6,10,111},{7,10,4},{8,10,163 },{8,10,776},{138,10,566},{4,0,291},{9,0,515},{12,0,152},{12,0,443},{13,0,392},{ 142,0,357},{7,11,399},{135,11,1492},{4,0,589},{139,0,282},{6,11,563},{135,10, 1994},{5,10,297},{135,10,1038},{4,0,130},{7,0,843},{135,0,1562},{5,0,42},{5,0, 879},{7,0,245},{7,0,324},{7,0,1532},{11,0,463},{11,0,472},{13,0,363},{144,0,52}, {4,0,134},{133,0,372},{133,0,680},{136,10,363},{6,0,1997},{8,0,935},{136,0,977}, {4,0,810},{135,0,1634},{135,10,1675},{7,0,1390},{4,11,910},{133,11,832},{7,10, 808},{8,11,266},{139,11,578},{132,0,644},{4,0,982},{138,0,867},{132,10,280},{135 ,0,540},{140,10,54},{135,0,123},{134,0,1978},{4,10,421},{133,10,548},{6,0,623},{ 136,0,789},{4,0,908},{5,0,359},{5,0,508},{6,0,1723},{7,0,343},{7,0,1996},{135,0, 2026},{134,0,1220},{4,0,341},{135,0,480},{6,10,254},{9,10,109},{138,10,103},{134 ,0,888},{8,11,528},{137,11,348},{7,0,1995},{8,0,299},{11,0,890},{12,0,674},{4,11 ,20},{133,11,616},{135,11,1094},{134,10,1630},{4,0,238},{5,0,503},{6,0,179},{7,0 ,2003},{8,0,381},{8,0,473},{9,0,149},{10,0,788},{15,0,45},{15,0,86},{20,0,110},{ 150,0,57},{133,10,671},{4,11,26},{5,11,429},{6,11,245},{7,11,704},{7,11,1379},{ 135,11,1474},{4,0,121},{5,0,156},{5,0,349},{9,0,431},{10,0,605},{142,0,342},{7, 11,943},{139,11,614},{132,10,889},{132,11,621},{7,10,1382},{7,11,1382},{135,10, 1910},{132,10,627},{133,10,775},{133,11,542},{133,11,868},{136,11,433},{6,0,1373 },{7,0,1011},{11,10,362},{11,10,948},{140,10,388},{6,0,80},{7,0,173},{9,0,547},{ 10,0,730},{14,0,18},{22,0,39},{135,11,1495},{6,0,1694},{135,0,1974},{140,0,196}, {4,0,923},{6,0,507},{6,0,1711},{7,10,451},{8,10,389},{12,10,490},{13,10,16},{13, 10,215},{13,10,351},{18,10,132},{147,10,125},{6,0,646},{134,0,1047},{135,10,841} ,{136,10,566},{6,0,1611},{135,0,1214},{139,0,926},{132,11,525},{132,0,595},{5,0, 240},{6,0,459},{7,0,12},{7,0,114},{7,0,949},{7,0,1753},{7,0,1805},{8,0,658},{9,0 ,1},{11,0,959},{141,0,446},{5,10,912},{134,10,1695},{132,0,446},{7,11,62},{12,11 ,45},{147,11,112},{5,10,236},{6,10,572},{8,10,492},{11,10,618},{144,10,56},{5,10 ,190},{136,10,318},{135,10,1376},{4,11,223},{6,11,359},{11,11,3},{13,11,108},{14 ,11,89},{144,11,22},{132,11,647},{134,0,490},{134,0,491},{134,0,1584},{135,11, 685},{138,11,220},{7,0,250},{136,0,507},{132,0,158},{4,0,140},{7,0,362},{8,0,209 },{9,0,10},{9,0,160},{9,0,503},{9,0,614},{10,0,689},{11,0,327},{11,0,553},{11,0, 725},{11,0,767},{12,0,252},{12,0,583},{13,0,192},{14,0,269},{14,0,356},{148,0,50 },{19,0,1},{19,0,26},{150,0,9},{132,11,109},{6,0,228},{7,0,1341},{9,0,408},{138, 0,343},{4,0,373},{5,0,283},{6,0,480},{7,0,609},{10,0,860},{138,0,878},{6,0,779}, {134,0,1209},{4,0,557},{7,11,263},{7,11,628},{136,11,349},{132,0,548},{7,0,197}, {8,0,142},{8,0,325},{9,0,150},{9,0,596},{10,0,350},{10,0,353},{11,0,74},{11,0, 315},{12,0,662},{12,0,681},{14,0,423},{143,0,141},{4,11,40},{10,11,67},{11,11, 117},{11,11,768},{139,11,935},{7,11,992},{8,11,301},{9,11,722},{12,11,63},{13,11 ,29},{14,11,161},{143,11,18},{6,0,1490},{138,11,532},{5,0,580},{7,0,378},{7,0, 674},{7,0,1424},{15,0,83},{16,0,11},{15,11,83},{144,11,11},{6,0,1057},{6,0,1335} ,{10,0,316},{7,10,85},{7,10,247},{8,10,585},{138,10,163},{4,0,169},{5,0,83},{6,0 ,399},{6,0,579},{6,0,1513},{7,0,692},{7,0,846},{7,0,1015},{7,0,1799},{8,0,403},{ 9,0,394},{10,0,133},{12,0,4},{12,0,297},{12,0,452},{16,0,81},{18,0,25},{21,0,14} ,{22,0,12},{151,0,18},{134,0,1106},{7,0,1546},{11,0,299},{142,0,407},{134,0,1192 },{132,0,177},{5,0,411},{135,0,653},{7,0,439},{10,0,727},{11,0,260},{139,0,684}, {138,10,145},{147,10,83},{5,0,208},{7,0,753},{135,0,1528},{137,11,617},{135,10, 1922},{135,11,825},{11,0,422},{13,0,389},{4,10,124},{10,10,457},{11,10,121},{11, 10,169},{11,10,870},{12,10,214},{14,10,187},{143,10,77},{11,0,615},{15,0,58},{11 ,11,615},{143,11,58},{9,0,618},{138,0,482},{6,0,1952},{6,0,1970},{142,0,505},{7, 10,1193},{135,11,1838},{133,0,242},{135,10,1333},{6,10,107},{7,10,638},{7,10, 1632},{137,10,396},{133,0,953},{5,10,370},{134,10,1756},{5,11,28},{6,11,204},{10 ,11,320},{10,11,583},{13,11,502},{14,11,72},{14,11,274},{14,11,312},{14,11,344}, {15,11,159},{16,11,62},{16,11,69},{17,11,30},{18,11,42},{18,11,53},{18,11,84},{ 18,11,140},{19,11,68},{19,11,85},{20,11,5},{20,11,45},{20,11,101},{22,11,7},{150 ,11,20},{4,11,558},{6,11,390},{7,11,162},{7,11,689},{9,11,360},{138,11,653},{11, 0,802},{141,0,67},{133,10,204},{133,0,290},{5,10,970},{134,10,1706},{132,0,380}, {5,0,52},{7,0,277},{9,0,368},{139,0,791},{5,11,856},{6,11,1672},{6,11,1757},{6, 11,1781},{7,11,1150},{7,11,1425},{7,11,1453},{140,11,513},{5,11,92},{7,10,3},{10 ,11,736},{140,11,102},{4,0,112},{5,0,653},{5,10,483},{5,10,685},{6,10,489},{7,10 ,1204},{136,10,394},{132,10,921},{6,0,1028},{133,10,1007},{5,11,590},{9,11,213}, {145,11,91},{135,10,1696},{10,0,138},{139,0,476},{5,0,725},{5,0,727},{135,0,1811 },{4,0,979},{6,0,1821},{6,0,1838},{8,0,876},{8,0,883},{8,0,889},{8,0,893},{8,0, 895},{10,0,934},{12,0,720},{14,0,459},{148,0,123},{135,11,551},{4,0,38},{6,0,435 },{7,0,307},{7,0,999},{7,0,1481},{7,0,1732},{7,0,1738},{8,0,371},{9,0,414},{11,0 ,316},{12,0,52},{13,0,420},{147,0,100},{135,0,1296},{132,10,712},{134,10,1629},{ 133,0,723},{134,0,651},{136,11,191},{9,11,791},{10,11,93},{11,11,301},{16,11,13} ,{17,11,23},{18,11,135},{19,11,12},{20,11,1},{20,11,12},{148,11,14},{136,11,503} ,{6,11,466},{135,11,671},{6,0,1200},{134,0,1330},{135,0,1255},{134,0,986},{5,0, 109},{6,0,1784},{7,0,1895},{12,0,296},{140,0,302},{135,11,983},{133,10,485},{134 ,0,660},{134,0,800},{5,0,216},{5,0,294},{6,0,591},{7,0,1879},{9,0,141},{9,0,270} ,{9,0,679},{10,0,159},{11,0,197},{11,0,438},{12,0,538},{12,0,559},{14,0,144},{14 ,0,167},{15,0,67},{4,10,285},{5,10,317},{6,10,301},{7,10,7},{8,10,153},{10,10, 766},{11,10,468},{12,10,467},{141,10,143},{136,0,945},{134,0,1090},{137,0,81},{ 12,11,468},{19,11,96},{148,11,24},{134,0,391},{138,11,241},{7,0,322},{136,0,249} ,{134,0,1412},{135,11,795},{5,0,632},{138,0,526},{136,10,819},{6,0,144},{7,0,948 },{7,0,1042},{8,0,235},{8,0,461},{9,0,453},{9,0,796},{10,0,354},{17,0,77},{135, 11,954},{139,10,917},{6,0,940},{134,0,1228},{4,0,362},{7,0,52},{135,0,303},{6,11 ,549},{8,11,34},{8,11,283},{9,11,165},{138,11,475},{7,11,370},{7,11,1007},{7,11, 1177},{135,11,1565},{5,11,652},{5,11,701},{135,11,449},{5,0,196},{6,0,486},{7,0, 212},{8,0,309},{136,0,346},{6,10,1719},{6,10,1735},{7,10,2016},{7,10,2020},{8,10 ,837},{137,10,852},{6,11,159},{6,11,364},{7,11,516},{7,11,1439},{137,11,518},{ 135,0,1912},{135,0,1290},{132,0,686},{141,11,151},{138,0,625},{136,0,706},{138, 10,568},{139,0,412},{4,0,30},{133,0,43},{8,10,67},{138,10,419},{7,0,967},{141,0, 11},{12,0,758},{14,0,441},{142,0,462},{10,10,657},{14,10,297},{142,10,361},{139, 10,729},{4,0,220},{135,0,1535},{7,11,501},{9,11,111},{10,11,141},{11,11,332},{13 ,11,43},{13,11,429},{14,11,130},{14,11,415},{145,11,102},{4,0,950},{6,0,1859},{7 ,0,11},{8,0,873},{12,0,710},{12,0,718},{12,0,748},{12,0,765},{148,0,124},{5,11, 149},{5,11,935},{136,11,233},{142,11,291},{134,0,1579},{7,0,890},{8,10,51},{9,10 ,868},{10,10,833},{12,10,481},{12,10,570},{148,10,106},{141,0,2},{132,10,445},{ 136,11,801},{135,0,1774},{7,0,1725},{138,0,393},{5,0,263},{134,0,414},{132,11, 322},{133,10,239},{7,0,456},{7,10,1990},{8,10,130},{139,10,720},{137,0,818},{5, 10,123},{6,10,530},{7,10,348},{135,10,1419},{135,10,2024},{6,0,178},{6,0,1750},{ 8,0,251},{9,0,690},{10,0,155},{10,0,196},{10,0,373},{11,0,698},{13,0,155},{148,0 ,93},{5,0,97},{137,0,393},{134,0,674},{11,0,223},{140,0,168},{132,10,210},{139, 11,464},{6,0,1639},{146,0,159},{139,11,2},{7,0,934},{8,0,647},{17,0,97},{19,0,59 },{150,0,2},{132,0,191},{5,0,165},{9,0,346},{10,0,655},{11,0,885},{4,10,430},{ 135,11,357},{133,0,877},{5,10,213},{133,11,406},{8,0,128},{139,0,179},{6,11,69}, {135,11,117},{135,0,1297},{11,11,43},{13,11,72},{141,11,142},{135,11,1830},{142, 0,164},{5,0,57},{6,0,101},{6,0,586},{6,0,1663},{7,0,132},{7,0,1154},{7,0,1415},{ 7,0,1507},{12,0,493},{15,0,105},{151,0,15},{5,0,459},{7,0,1073},{8,0,241},{136,0 ,334},{133,11,826},{133,10,108},{5,10,219},{10,11,132},{11,11,191},{11,11,358},{ 139,11,460},{6,0,324},{6,0,520},{7,0,338},{7,0,1729},{8,0,228},{139,0,750},{21,0 ,30},{22,0,53},{4,10,193},{5,10,916},{7,10,364},{10,10,398},{10,10,726},{11,10, 317},{11,10,626},{12,10,142},{12,10,288},{12,10,678},{13,10,313},{15,10,113},{ 146,10,114},{6,11,110},{135,11,1681},{135,0,910},{6,10,241},{7,10,907},{8,10,832 },{9,10,342},{10,10,729},{11,10,284},{11,10,445},{11,10,651},{11,10,863},{13,10, 398},{146,10,99},{7,0,705},{9,0,734},{5,11,1000},{7,11,733},{137,11,583},{4,0,73 },{6,0,612},{7,0,927},{7,0,1822},{8,0,217},{9,0,765},{9,0,766},{10,0,408},{11,0, 51},{11,0,793},{12,0,266},{15,0,158},{20,0,89},{150,0,32},{7,0,1330},{4,11,297}, {6,11,529},{7,11,152},{7,11,713},{7,11,1845},{8,11,710},{8,11,717},{140,11,639}, {5,0,389},{136,0,636},{134,0,1409},{4,10,562},{9,10,254},{139,10,879},{134,0,893 },{132,10,786},{4,11,520},{135,11,575},{136,0,21},{140,0,721},{136,0,959},{7,11, 1428},{7,11,1640},{9,11,169},{9,11,182},{9,11,367},{9,11,478},{9,11,506},{9,11, 551},{9,11,648},{9,11,651},{9,11,697},{9,11,705},{9,11,725},{9,11,787},{9,11,794 },{10,11,198},{10,11,214},{10,11,267},{10,11,275},{10,11,456},{10,11,551},{10,11 ,561},{10,11,613},{10,11,627},{10,11,668},{10,11,675},{10,11,691},{10,11,695},{ 10,11,707},{10,11,715},{11,11,183},{11,11,201},{11,11,244},{11,11,262},{11,11, 352},{11,11,439},{11,11,493},{11,11,572},{11,11,591},{11,11,608},{11,11,611},{11 ,11,646},{11,11,674},{11,11,711},{11,11,751},{11,11,761},{11,11,776},{11,11,785} ,{11,11,850},{11,11,853},{11,11,862},{11,11,865},{11,11,868},{11,11,898},{11,11, 902},{11,11,903},{11,11,910},{11,11,932},{11,11,942},{11,11,957},{11,11,967},{11 ,11,972},{12,11,148},{12,11,195},{12,11,220},{12,11,237},{12,11,318},{12,11,339} ,{12,11,393},{12,11,445},{12,11,450},{12,11,474},{12,11,509},{12,11,533},{12,11, 591},{12,11,594},{12,11,597},{12,11,621},{12,11,633},{12,11,642},{13,11,59},{13, 11,60},{13,11,145},{13,11,239},{13,11,250},{13,11,273},{13,11,329},{13,11,344},{ 13,11,365},{13,11,372},{13,11,387},{13,11,403},{13,11,414},{13,11,456},{13,11, 478},{13,11,483},{13,11,489},{14,11,55},{14,11,57},{14,11,81},{14,11,90},{14,11, 148},{14,11,239},{14,11,266},{14,11,321},{14,11,326},{14,11,327},{14,11,330},{14 ,11,347},{14,11,355},{14,11,401},{14,11,411},{14,11,414},{14,11,416},{14,11,420} ,{15,11,61},{15,11,74},{15,11,87},{15,11,88},{15,11,94},{15,11,96},{15,11,116},{ 15,11,149},{15,11,154},{16,11,50},{16,11,63},{16,11,73},{17,11,2},{17,11,66},{17 ,11,92},{17,11,103},{17,11,112},{18,11,50},{18,11,54},{18,11,82},{18,11,86},{18, 11,90},{18,11,111},{18,11,115},{18,11,156},{19,11,40},{19,11,79},{20,11,78},{149 ,11,22},{137,11,170},{134,0,1433},{135,11,1307},{139,11,411},{5,0,189},{7,0,442} ,{7,0,443},{8,0,281},{12,0,174},{141,0,261},{6,10,216},{7,10,901},{7,10,1343},{ 136,10,493},{5,11,397},{6,11,154},{7,10,341},{7,11,676},{8,11,443},{8,11,609},{9 ,11,24},{9,11,325},{10,11,35},{11,10,219},{11,11,535},{11,11,672},{11,11,1018},{ 12,11,637},{144,11,30},{6,0,2},{7,0,191},{7,0,446},{7,0,1262},{7,0,1737},{8,0,22 },{8,0,270},{8,0,612},{9,0,4},{9,0,312},{9,0,436},{9,0,626},{10,0,216},{10,0,311 },{10,0,521},{10,0,623},{11,0,72},{11,0,330},{11,0,455},{12,0,321},{12,0,504},{ 12,0,530},{12,0,543},{13,0,17},{13,0,156},{13,0,334},{14,0,131},{17,0,60},{148,0 ,64},{7,0,354},{10,0,410},{139,0,815},{139,10,130},{7,10,1734},{137,11,631},{12, 0,425},{15,0,112},{10,10,115},{11,10,420},{13,10,404},{14,10,346},{143,10,54},{6 ,0,60},{6,0,166},{7,0,374},{7,0,670},{7,0,1327},{8,0,411},{8,0,435},{9,0,653},{9 ,0,740},{10,0,385},{11,0,222},{11,0,324},{11,0,829},{140,0,611},{7,0,1611},{13,0 ,14},{15,0,44},{19,0,13},{148,0,76},{133,11,981},{4,11,56},{7,11,1791},{8,11,607 },{8,11,651},{11,11,465},{11,11,835},{12,11,337},{141,11,480},{6,0,1478},{5,10, 1011},{136,10,701},{139,0,596},{5,0,206},{134,0,398},{4,10,54},{5,10,666},{7,10, 1039},{7,10,1130},{9,10,195},{138,10,302},{7,0,50},{9,11,158},{138,11,411},{135, 11,1120},{6,0,517},{7,0,1159},{10,0,621},{11,0,192},{134,10,1669},{4,0,592},{6,0 ,600},{135,0,1653},{10,0,223},{139,0,645},{136,11,139},{7,0,64},{136,0,245},{142 ,0,278},{6,11,622},{135,11,1030},{136,0,604},{134,0,1502},{138,0,265},{141,11, 168},{7,0,1763},{140,0,310},{7,10,798},{139,11,719},{7,11,160},{10,11,624},{142, 11,279},{132,11,363},{7,10,122},{9,10,259},{10,10,84},{11,10,470},{12,10,541},{ 141,10,379},{5,0,129},{6,0,61},{135,0,947},{134,0,1356},{135,11,1191},{13,0,505} ,{141,0,506},{11,0,1000},{5,10,82},{5,10,131},{7,10,1755},{8,10,31},{9,10,168},{ 9,10,764},{139,10,869},{134,0,966},{134,10,605},{134,11,292},{5,11,177},{6,11, 616},{7,11,827},{9,11,525},{138,11,656},{135,11,1486},{138,11,31},{5,10,278},{ 137,10,68},{4,10,163},{5,10,201},{5,10,307},{5,10,310},{6,10,335},{7,10,284},{ 136,10,165},{6,0,839},{135,10,1660},{136,10,781},{6,10,33},{135,10,1244},{133,0, 637},{4,11,161},{133,11,631},{137,0,590},{7,10,1953},{136,10,720},{5,0,280},{7,0 ,1226},{138,10,203},{134,0,1386},{5,0,281},{6,0,1026},{6,10,326},{7,10,677},{137 ,10,425},{7,11,1557},{135,11,1684},{135,0,1064},{9,11,469},{9,11,709},{12,11,512 },{14,11,65},{145,11,12},{134,0,917},{10,11,229},{11,11,73},{11,11,376},{139,11, 433},{7,0,555},{9,0,192},{13,0,30},{13,0,49},{15,0,150},{16,0,76},{20,0,52},{7, 10,1316},{7,10,1412},{7,10,1839},{9,10,589},{11,10,241},{11,10,676},{11,10,811}, {11,10,891},{12,10,140},{12,10,346},{12,10,479},{13,10,381},{14,10,188},{146,10, 30},{149,0,15},{6,0,1882},{6,0,1883},{6,0,1897},{9,0,945},{9,0,1014},{9,0,1020}, {12,0,823},{12,0,842},{12,0,866},{12,0,934},{15,0,242},{146,0,208},{6,0,965},{ 134,0,1499},{7,0,33},{7,0,120},{8,0,489},{9,0,319},{10,0,820},{11,0,1004},{12,0, 379},{12,0,679},{13,0,117},{13,0,412},{14,0,25},{15,0,52},{15,0,161},{16,0,47},{ 149,0,2},{6,11,558},{7,11,651},{8,11,421},{9,11,0},{138,11,34},{4,0,937},{5,0, 801},{7,0,473},{5,10,358},{7,10,1184},{10,10,662},{13,10,212},{13,10,304},{13,10 ,333},{145,10,98},{132,0,877},{6,0,693},{134,0,824},{132,0,365},{7,11,1832},{138 ,11,374},{5,0,7},{139,0,774},{4,0,734},{5,0,662},{134,0,430},{4,0,746},{135,0, 1090},{5,0,360},{8,0,237},{10,0,231},{147,0,124},{138,11,348},{6,11,6},{7,11,81} ,{7,11,771},{7,11,1731},{9,11,405},{138,11,421},{6,0,740},{137,0,822},{133,10, 946},{7,0,1485},{136,0,929},{7,10,411},{8,10,631},{9,10,323},{10,10,355},{11,10, 491},{12,10,143},{12,10,402},{13,10,73},{14,10,408},{15,10,107},{146,10,71},{135 ,10,590},{5,11,881},{133,11,885},{150,11,25},{4,0,852},{5,11,142},{134,11,546},{ 7,10,1467},{8,10,328},{10,10,544},{11,10,955},{13,10,320},{145,10,83},{9,0,17},{ 10,0,291},{11,10,511},{13,10,394},{14,10,298},{14,10,318},{146,10,103},{5,11,466 },{11,11,571},{12,11,198},{13,11,283},{14,11,186},{15,11,21},{143,11,103},{134,0 ,1001},{4,11,185},{5,11,257},{5,11,839},{5,11,936},{7,11,171},{9,11,399},{10,11, 258},{10,11,395},{10,11,734},{11,11,1014},{12,11,23},{13,11,350},{14,11,150},{ 147,11,6},{143,0,35},{132,0,831},{5,10,835},{134,10,483},{4,0,277},{5,0,608},{6, 0,493},{7,0,457},{12,0,384},{7,11,404},{7,11,1377},{7,11,1430},{7,11,2017},{8,11 ,149},{8,11,239},{8,11,512},{8,11,793},{8,11,818},{9,11,474},{9,11,595},{10,11, 122},{10,11,565},{10,11,649},{10,11,783},{11,11,239},{11,11,295},{11,11,447},{11 ,11,528},{11,11,639},{11,11,800},{11,11,936},{12,11,25},{12,11,73},{12,11,77},{ 12,11,157},{12,11,316},{12,11,390},{12,11,391},{12,11,394},{12,11,395},{12,11, 478},{12,11,503},{12,11,592},{12,11,680},{13,11,50},{13,11,53},{13,11,132},{13, 11,198},{13,11,275},{13,11,322},{13,11,415},{14,11,71},{14,11,257},{14,11,395},{ 15,11,71},{15,11,136},{17,11,123},{18,11,93},{147,11,58},{134,0,1351},{7,0,27},{ 135,0,316},{136,11,712},{136,0,984},{133,0,552},{137,0,264},{132,0,401},{6,0,710 },{6,0,1111},{134,0,1343},{134,0,1211},{9,0,543},{10,0,524},{11,0,108},{11,0,653 },{12,0,524},{13,0,123},{14,0,252},{16,0,18},{19,0,38},{20,0,26},{20,0,65},{21,0 ,3},{151,0,11},{4,0,205},{5,0,623},{7,0,104},{8,0,519},{137,0,716},{132,10,677}, {4,11,377},{152,11,13},{135,11,1673},{7,0,579},{9,0,41},{9,0,244},{9,0,669},{10, 0,5},{11,0,861},{11,0,951},{139,0,980},{132,0,717},{136,0,1011},{132,0,805},{4, 11,180},{135,11,1906},{132,10,777},{132,10,331},{132,0,489},{6,0,1024},{4,11,491 },{133,10,747},{135,11,1182},{4,11,171},{138,11,234},{4,11,586},{7,11,1186},{138 ,11,631},{135,0,892},{135,11,336},{9,11,931},{10,11,334},{148,11,71},{137,0,473} ,{6,0,864},{12,0,659},{139,11,926},{7,0,819},{9,0,26},{9,0,392},{10,0,152},{10,0 ,226},{11,0,19},{12,0,276},{12,0,426},{12,0,589},{13,0,460},{15,0,97},{19,0,48}, {148,0,104},{135,0,51},{133,10,326},{4,10,691},{146,10,16},{9,0,130},{11,0,765}, {10,10,680},{10,10,793},{141,10,357},{133,11,765},{8,0,229},{6,10,32},{7,10,385} ,{7,10,757},{7,10,1916},{8,10,94},{8,10,711},{9,10,541},{10,10,162},{10,10,795}, {11,10,989},{11,10,1010},{12,10,14},{142,10,308},{7,11,474},{137,11,578},{132,0, 674},{132,0,770},{5,0,79},{7,0,1027},{7,0,1477},{139,0,52},{133,11,424},{134,0, 1666},{6,0,409},{6,10,349},{6,10,1682},{7,10,1252},{8,10,112},{8,11,714},{9,10, 435},{9,10,668},{10,10,290},{10,10,319},{10,10,815},{11,10,180},{11,10,837},{12, 10,240},{13,10,152},{13,10,219},{142,10,158},{5,0,789},{134,0,195},{4,0,251},{4, 0,688},{7,0,513},{135,0,1284},{132,10,581},{9,11,420},{10,11,269},{10,11,285},{ 10,11,576},{11,11,397},{13,11,175},{145,11,90},{6,10,126},{7,10,573},{8,10,397}, {142,10,44},{132,11,429},{133,0,889},{4,0,160},{5,0,330},{7,0,1434},{136,0,174}, {7,11,18},{7,11,699},{7,11,1966},{8,11,752},{9,11,273},{9,11,412},{9,11,703},{10 ,11,71},{10,11,427},{10,11,508},{146,11,97},{6,0,872},{134,0,899},{133,10,926},{ 134,0,1126},{134,0,918},{4,11,53},{5,11,186},{135,11,752},{7,0,268},{136,0,569}, {134,0,1224},{6,0,1361},{7,10,1232},{137,10,531},{8,11,575},{10,11,289},{139,11, 319},{133,10,670},{132,11,675},{133,0,374},{135,10,1957},{133,0,731},{11,0,190}, {15,0,49},{11,11,190},{143,11,49},{4,0,626},{5,0,506},{5,0,642},{6,0,425},{10,0, 202},{139,0,141},{137,0,444},{7,10,242},{135,10,1942},{6,11,209},{8,11,468},{9, 11,210},{11,11,36},{12,11,28},{12,11,630},{13,11,21},{13,11,349},{14,11,7},{145, 11,13},{4,11,342},{135,11,1179},{5,10,834},{7,10,1202},{8,10,14},{9,10,481},{137 ,10,880},{4,11,928},{133,11,910},{4,11,318},{4,11,496},{7,11,856},{139,11,654},{ 136,0,835},{7,0,1526},{138,10,465},{151,0,17},{135,0,477},{4,10,357},{6,10,172}, {7,10,143},{137,10,413},{6,0,1374},{138,0,994},{18,0,76},{132,10,590},{7,0,287}, {8,0,355},{9,0,293},{137,0,743},{134,0,1389},{7,11,915},{8,11,247},{147,11,0},{4 ,11,202},{5,11,382},{6,11,454},{7,11,936},{7,11,1803},{8,11,758},{9,11,375},{9, 11,895},{10,11,743},{10,11,792},{11,11,978},{11,11,1012},{142,11,109},{5,0,384}, {8,0,455},{140,0,48},{132,11,390},{5,10,169},{7,10,333},{136,10,45},{5,0,264},{ 134,0,184},{138,11,791},{133,11,717},{132,10,198},{6,11,445},{7,11,332},{137,11, 909},{136,0,1001},{4,10,24},{5,10,140},{5,10,185},{7,10,1500},{11,10,565},{139, 10,838},{134,11,578},{5,0,633},{6,0,28},{135,0,1323},{132,0,851},{136,11,267},{7 ,0,359},{8,0,243},{140,0,175},{4,10,334},{133,10,593},{141,11,87},{136,11,766},{ 10,0,287},{12,0,138},{10,11,287},{140,11,138},{4,0,105},{132,0,740},{140,10,116} ,{134,0,857},{135,11,1841},{6,0,1402},{137,0,819},{132,11,584},{132,10,709},{133 ,10,897},{5,0,224},{13,0,174},{146,0,52},{135,10,1840},{4,10,608},{133,10,497},{ 139,11,60},{4,0,758},{135,0,1649},{4,11,226},{4,11,326},{135,11,1770},{5,11,426} ,{8,11,30},{9,11,2},{11,11,549},{147,11,122},{135,10,2039},{6,10,540},{136,10, 136},{4,0,573},{8,0,655},{4,10,897},{133,10,786},{7,0,351},{139,0,128},{133,10, 999},{4,10,299},{135,10,1004},{133,0,918},{132,11,345},{4,11,385},{7,11,265},{ 135,11,587},{133,10,456},{136,10,180},{6,0,687},{134,0,1537},{4,11,347},{5,11, 423},{5,11,996},{135,11,1329},{132,10,755},{7,11,1259},{9,11,125},{11,11,65},{ 140,11,285},{5,11,136},{6,11,136},{136,11,644},{134,0,1525},{4,0,1009},{135,0, 1139},{139,10,338},{132,0,340},{135,10,1464},{8,0,847},{10,0,861},{10,0,876},{10 ,0,889},{10,0,922},{10,0,929},{10,0,933},{12,0,784},{140,0,791},{139,0,176},{9, 11,134},{10,11,2},{10,11,27},{10,11,333},{11,11,722},{143,11,1},{4,11,433},{133, 11,719},{5,0,985},{7,0,509},{7,0,529},{145,0,96},{132,0,615},{4,10,890},{5,10, 805},{5,10,819},{5,10,961},{6,10,396},{6,10,1631},{6,10,1678},{7,10,1967},{7,10, 2041},{9,10,630},{11,10,8},{11,10,1019},{12,10,176},{13,10,225},{14,10,292},{149 ,10,24},{135,0,1919},{134,0,1131},{144,11,21},{144,11,51},{135,10,1815},{4,0,247 },{7,10,1505},{10,10,190},{10,10,634},{11,10,792},{12,10,358},{140,10,447},{5,10 ,0},{6,10,536},{7,10,604},{13,10,445},{145,10,126},{4,0,184},{5,0,390},{6,0,337} ,{7,0,23},{7,0,494},{7,0,618},{7,0,1456},{8,0,27},{8,0,599},{10,0,153},{139,0, 710},{6,10,232},{6,10,412},{7,10,1074},{8,10,9},{8,10,157},{8,10,786},{9,10,196} ,{9,10,352},{9,10,457},{10,10,337},{11,10,232},{11,10,877},{12,10,480},{140,10, 546},{13,0,38},{135,10,958},{4,10,382},{136,10,579},{4,10,212},{135,10,1206},{4, 11,555},{8,11,536},{138,11,288},{11,11,139},{139,11,171},{9,11,370},{138,11,90}, {132,0,1015},{134,0,1088},{5,10,655},{135,11,977},{134,0,1585},{17,10,67},{147, 10,74},{10,0,227},{11,0,497},{11,0,709},{140,0,415},{6,0,360},{7,0,1664},{136,0, 478},{7,0,95},{6,10,231},{136,10,423},{140,11,65},{4,11,257},{135,11,2031},{135, 11,1768},{133,10,300},{139,11,211},{136,0,699},{6,10,237},{7,10,611},{8,10,100}, {9,10,416},{11,10,335},{12,10,173},{146,10,101},{14,0,26},{146,0,150},{6,0,581}, {135,0,1119},{135,10,1208},{132,0,739},{6,11,83},{6,11,1733},{135,11,1389},{137, 0,869},{4,0,67},{5,0,422},{7,0,1037},{7,0,1289},{7,0,1555},{9,0,741},{145,0,108} ,{133,10,199},{12,10,427},{146,10,38},{136,0,464},{142,0,42},{10,0,96},{8,11,501 },{137,11,696},{134,11,592},{4,0,512},{4,0,966},{5,0,342},{6,0,1855},{8,0,869},{ 8,0,875},{8,0,901},{144,0,26},{8,0,203},{11,0,823},{11,0,846},{12,0,482},{13,0, 277},{13,0,302},{13,0,464},{14,0,205},{142,0,221},{4,0,449},{133,0,718},{7,11, 1718},{9,11,95},{9,11,274},{10,11,279},{10,11,317},{10,11,420},{11,11,303},{11, 11,808},{12,11,134},{12,11,367},{13,11,149},{13,11,347},{14,11,349},{14,11,406}, {18,11,22},{18,11,89},{18,11,122},{147,11,47},{133,11,26},{4,0,355},{6,0,311},{9 ,0,256},{138,0,404},{132,11,550},{10,0,758},{6,10,312},{6,10,1715},{10,10,584},{ 11,10,546},{11,10,692},{12,10,259},{12,10,295},{13,10,46},{141,10,154},{136,11, 822},{5,0,827},{4,11,902},{5,11,809},{6,11,122},{135,11,896},{5,0,64},{140,0,581 },{4,0,442},{6,0,739},{7,0,1047},{7,0,1352},{7,0,1643},{7,11,1911},{9,11,449},{ 10,11,192},{138,11,740},{135,11,262},{132,10,588},{133,11,620},{5,0,977},{6,0, 288},{7,0,528},{4,11,34},{5,11,574},{7,11,279},{7,11,1624},{136,11,601},{6,0, 1375},{4,10,231},{5,10,61},{6,10,104},{7,10,729},{7,10,964},{7,10,1658},{140,10, 414},{6,10,263},{138,10,757},{132,10,320},{4,0,254},{7,0,1309},{5,11,332},{135, 11,1309},{6,11,261},{8,11,182},{139,11,943},{132,10,225},{6,0,12},{135,0,1219},{ 4,0,275},{12,0,376},{6,11,1721},{141,11,490},{4,11,933},{133,11,880},{6,0,951},{ 6,0,1109},{6,0,1181},{7,0,154},{4,10,405},{7,10,817},{14,10,58},{17,10,37},{146, 10,124},{6,0,1520},{133,10,974},{134,0,1753},{6,0,369},{6,0,502},{7,0,1036},{8,0 ,348},{9,0,452},{10,0,26},{11,0,224},{11,0,387},{11,0,772},{12,0,95},{12,0,629}, {13,0,195},{13,0,207},{13,0,241},{14,0,260},{14,0,270},{143,0,140},{132,0,269},{ 5,0,480},{7,0,532},{7,0,1197},{7,0,1358},{8,0,291},{11,0,349},{142,0,396},{5,10, 235},{7,10,1239},{11,10,131},{140,10,370},{7,10,956},{7,10,1157},{7,10,1506},{7, 10,1606},{7,10,1615},{7,10,1619},{7,10,1736},{7,10,1775},{8,10,590},{9,10,324},{ 9,10,736},{9,10,774},{9,10,776},{9,10,784},{10,10,567},{10,10,708},{11,10,518},{ 11,10,613},{11,10,695},{11,10,716},{11,10,739},{11,10,770},{11,10,771},{11,10, 848},{11,10,857},{11,10,931},{11,10,947},{12,10,326},{12,10,387},{12,10,484},{12 ,10,528},{12,10,552},{12,10,613},{13,10,189},{13,10,256},{13,10,340},{13,10,432} ,{13,10,436},{13,10,440},{13,10,454},{14,10,174},{14,10,220},{14,10,284},{14,10, 390},{145,10,121},{8,11,598},{9,11,664},{138,11,441},{9,10,137},{138,10,221},{ 133,11,812},{148,0,15},{134,0,1341},{6,0,1017},{4,11,137},{7,11,1178},{135,11, 1520},{7,10,390},{138,10,140},{7,11,1260},{135,11,1790},{137,11,191},{135,10, 1144},{6,0,1810},{7,0,657},{8,0,886},{10,0,857},{14,0,440},{144,0,96},{8,0,533}, {6,11,1661},{7,11,1975},{7,11,2009},{135,11,2011},{6,0,1453},{134,10,464},{132, 11,715},{5,10,407},{11,10,204},{11,10,243},{11,10,489},{12,10,293},{19,10,37},{ 20,10,73},{150,10,38},{133,11,703},{4,0,211},{7,0,1483},{5,10,325},{8,10,5},{8, 10,227},{9,10,105},{10,10,585},{140,10,614},{4,0,332},{5,0,335},{6,0,238},{7,0, 269},{7,0,811},{7,0,1797},{8,0,836},{9,0,507},{141,0,242},{5,11,89},{7,11,1915}, {9,11,185},{9,11,235},{9,11,496},{10,11,64},{10,11,270},{10,11,403},{10,11,469}, {10,11,529},{10,11,590},{11,11,140},{11,11,860},{13,11,1},{13,11,422},{14,11,341 },{14,11,364},{17,11,93},{18,11,113},{19,11,97},{147,11,113},{133,11,695},{16,0, 19},{5,11,6},{6,11,183},{6,10,621},{7,11,680},{7,11,978},{7,11,1013},{7,11,1055} ,{12,11,230},{13,11,172},{13,10,504},{146,11,29},{136,0,156},{133,0,1009},{6,11, 29},{139,11,63},{134,0,820},{134,10,218},{7,10,454},{7,10,782},{8,10,768},{140, 10,686},{5,0,228},{6,0,203},{7,0,156},{8,0,347},{9,0,265},{18,0,39},{20,0,54},{ 21,0,31},{22,0,3},{23,0,0},{15,11,8},{18,11,39},{20,11,54},{21,11,31},{22,11,3}, {151,11,0},{7,0,1131},{135,0,1468},{144,10,0},{134,0,1276},{10,10,676},{140,10, 462},{132,11,311},{134,11,1740},{7,11,170},{8,11,90},{8,11,177},{8,11,415},{11, 11,714},{142,11,281},{134,10,164},{6,0,1792},{138,0,849},{150,10,50},{5,0,291},{ 5,0,318},{7,0,765},{9,0,389},{12,0,548},{8,11,522},{142,11,328},{11,11,91},{13, 11,129},{15,11,101},{145,11,125},{4,11,494},{6,11,74},{7,11,44},{7,11,407},{8,11 ,551},{12,11,17},{15,11,5},{148,11,11},{4,11,276},{133,11,296},{6,10,343},{7,10, 195},{7,11,1777},{9,10,226},{10,10,197},{10,10,575},{11,10,502},{139,10,899},{10 ,0,525},{139,0,82},{14,0,453},{4,11,7},{5,11,90},{5,11,158},{6,11,542},{7,11,221 },{7,11,1574},{9,11,490},{10,11,540},{11,11,443},{139,11,757},{135,0,666},{22,10 ,29},{150,11,29},{4,0,422},{147,10,8},{5,0,355},{145,0,0},{6,0,1873},{9,0,918},{ 7,11,588},{9,11,175},{138,11,530},{143,11,31},{11,0,165},{7,10,1125},{9,10,143}, {14,10,405},{150,10,21},{9,0,260},{137,0,905},{5,11,872},{6,11,57},{6,11,479},{6 ,11,562},{7,11,471},{7,11,1060},{9,11,447},{9,11,454},{141,11,6},{138,11,704},{ 133,0,865},{5,0,914},{134,0,1625},{133,0,234},{7,0,1383},{5,11,31},{6,11,614},{ 145,11,61},{7,11,1200},{138,11,460},{6,11,424},{135,11,1866},{136,0,306},{5,10, 959},{12,11,30},{13,11,148},{14,11,87},{14,11,182},{16,11,42},{18,11,92},{148,11 ,70},{6,0,1919},{6,0,1921},{9,0,923},{9,0,930},{9,0,941},{9,0,949},{9,0,987},{9, 0,988},{9,0,992},{12,0,802},{12,0,815},{12,0,856},{12,0,885},{12,0,893},{12,0, 898},{12,0,919},{12,0,920},{12,0,941},{12,0,947},{15,0,183},{15,0,185},{15,0,189 },{15,0,197},{15,0,202},{15,0,233},{18,0,218},{18,0,219},{18,0,233},{143,11,156} ,{135,10,1759},{136,10,173},{13,0,163},{13,0,180},{18,0,78},{20,0,35},{5,11,13}, {134,11,142},{134,10,266},{6,11,97},{7,11,116},{8,11,322},{8,11,755},{9,11,548}, {10,11,714},{11,11,884},{141,11,324},{135,0,1312},{9,0,814},{137,11,676},{133,0, 707},{135,0,1493},{6,0,421},{7,0,61},{7,0,1540},{10,0,11},{138,0,501},{12,0,733} ,{12,0,766},{7,11,866},{135,11,1163},{137,0,341},{142,0,98},{145,11,115},{135,11 ,1111},{136,10,300},{136,0,1014},{8,11,1},{9,11,112},{138,11,326},{132,11,730},{ 5,11,488},{6,11,527},{7,11,489},{7,11,1636},{8,11,121},{8,11,144},{8,11,359},{9, 11,193},{9,11,241},{9,11,336},{9,11,882},{11,11,266},{11,11,372},{11,11,944},{12 ,11,401},{140,11,641},{6,0,971},{134,0,1121},{6,0,102},{7,0,72},{15,0,142},{147, 0,67},{151,0,30},{135,0,823},{134,0,1045},{5,10,427},{5,10,734},{7,10,478},{136, 10,52},{7,0,1930},{11,10,217},{142,10,165},{6,0,1512},{135,0,1870},{9,11,31},{10 ,11,244},{10,11,699},{12,11,149},{141,11,497},{133,11,377},{145,11,101},{10,11, 158},{13,11,13},{13,11,137},{13,11,258},{14,11,111},{14,11,225},{14,11,253},{14, 11,304},{14,11,339},{14,11,417},{146,11,33},{6,0,87},{6,10,1734},{7,10,20},{7,10 ,1056},{8,10,732},{9,10,406},{9,10,911},{138,10,694},{134,0,1243},{137,0,245},{7 ,0,68},{8,0,48},{8,0,88},{8,0,582},{8,0,681},{9,0,373},{9,0,864},{11,0,157},{11, 0,336},{11,0,843},{148,0,27},{8,11,663},{144,11,8},{133,10,613},{4,0,88},{5,0, 137},{5,0,174},{5,0,777},{6,0,1664},{6,0,1725},{7,0,77},{7,0,426},{7,0,1317},{7, 0,1355},{8,0,126},{8,0,563},{9,0,523},{9,0,750},{10,0,310},{10,0,836},{11,0,42}, {11,0,318},{11,0,731},{12,0,68},{12,0,92},{12,0,507},{12,0,692},{13,0,81},{13,0, 238},{13,0,374},{14,0,436},{18,0,138},{19,0,78},{19,0,111},{20,0,55},{20,0,77},{ 148,0,92},{141,0,418},{4,0,938},{137,0,625},{138,0,351},{5,11,843},{7,10,32},{7, 10,984},{8,10,85},{8,10,709},{9,10,579},{9,10,847},{9,10,856},{10,10,799},{11,10 ,258},{11,10,1007},{12,10,331},{12,10,615},{13,10,188},{13,10,435},{14,10,8},{15 ,10,165},{16,10,27},{148,10,40},{6,0,1668},{7,0,1499},{8,0,117},{9,0,314},{138,0 ,174},{135,0,707},{132,11,554},{133,11,536},{5,0,403},{5,11,207},{9,11,79},{11, 11,625},{145,11,7},{132,11,424},{136,11,785},{4,10,167},{135,10,82},{9,0,7},{23, 0,6},{9,11,7},{151,11,6},{6,0,282},{5,10,62},{6,10,534},{7,10,74},{7,10,678},{7, 10,684},{7,10,1043},{7,10,1072},{8,10,280},{8,10,541},{8,10,686},{9,10,258},{10, 10,519},{11,10,252},{140,10,282},{138,10,33},{132,10,359},{4,0,44},{5,0,311},{6, 0,156},{7,0,639},{7,0,762},{7,0,1827},{9,0,8},{9,0,462},{148,0,83},{7,11,769},{9 ,11,18},{138,11,358},{4,0,346},{7,0,115},{9,0,180},{9,0,456},{10,0,363},{4,11, 896},{134,11,1777},{133,10,211},{7,0,761},{7,0,1051},{137,0,545},{6,10,145},{141 ,10,336},{7,11,750},{9,11,223},{11,11,27},{11,11,466},{12,11,624},{14,11,265},{ 146,11,61},{6,0,752},{6,0,768},{6,0,1195},{6,0,1254},{6,0,1619},{137,0,835},{6,0 ,1936},{8,0,930},{136,0,960},{132,10,263},{132,11,249},{12,0,653},{132,10,916},{ 4,11,603},{133,11,661},{8,0,344},{4,11,11},{6,11,128},{7,11,231},{7,11,1533},{ 138,11,725},{134,0,1483},{134,0,875},{6,0,185},{7,0,1899},{9,0,875},{139,0,673}, {15,10,155},{144,10,79},{7,0,93},{7,0,210},{7,0,1223},{8,0,451},{8,0,460},{11,0, 353},{11,0,475},{4,10,599},{6,10,1634},{7,10,67},{7,10,691},{7,10,979},{7,10, 1697},{8,10,207},{8,10,214},{8,10,231},{8,10,294},{8,10,336},{8,10,428},{8,10, 471},{8,10,622},{8,10,626},{8,10,679},{8,10,759},{8,10,829},{9,10,11},{9,10,246} ,{9,10,484},{9,10,573},{9,10,706},{9,10,762},{9,10,798},{9,10,855},{9,10,870},{9 ,10,912},{10,10,303},{10,10,335},{10,10,424},{10,10,461},{10,10,543},{10,10,759} ,{10,10,814},{11,10,59},{11,10,235},{11,10,590},{11,10,929},{11,10,963},{11,10, 987},{12,10,114},{12,10,182},{12,10,226},{12,10,332},{12,10,439},{12,10,575},{12 ,10,598},{12,10,675},{13,10,8},{13,10,125},{13,10,194},{13,10,287},{14,10,197},{ 14,10,383},{15,10,53},{17,10,63},{19,10,46},{19,10,98},{19,10,106},{148,10,85},{ 132,11,476},{4,0,327},{5,0,478},{7,0,1332},{136,0,753},{5,0,1020},{133,0,1022},{ 135,11,1807},{4,0,103},{133,0,401},{4,0,499},{135,0,1421},{10,0,207},{13,0,164}, {147,10,126},{9,11,20},{10,11,324},{139,11,488},{132,0,96},{9,11,280},{138,11, 134},{135,0,968},{133,10,187},{135,10,1286},{5,11,112},{6,11,103},{134,11,150},{ 8,0,914},{10,0,3},{4,10,215},{9,10,38},{11,10,23},{11,10,127},{139,10,796},{135, 0,399},{6,0,563},{137,0,224},{6,0,704},{134,0,1214},{4,11,708},{8,11,15},{9,11, 50},{9,11,386},{11,11,18},{11,11,529},{140,11,228},{4,11,563},{7,11,109},{7,11, 592},{7,11,637},{7,11,770},{7,11,1701},{8,11,436},{8,11,463},{9,11,60},{9,11,335 },{9,11,904},{10,11,73},{11,11,434},{12,11,585},{13,11,331},{18,11,110},{148,11, 60},{134,0,1559},{132,11,502},{6,11,347},{138,11,161},{4,11,33},{5,11,102},{5,11 ,500},{6,11,284},{7,11,1079},{7,11,1423},{7,11,1702},{8,11,470},{9,11,554},{9,11 ,723},{139,11,333},{7,11,246},{135,11,840},{6,11,10},{8,11,571},{9,11,739},{143, 11,91},{8,0,861},{10,0,905},{12,0,730},{12,0,789},{133,11,626},{134,0,946},{5,0, 746},{12,0,333},{14,0,332},{12,11,333},{142,11,332},{5,11,18},{6,11,526},{13,11, 24},{13,11,110},{19,11,5},{147,11,44},{4,0,910},{5,0,832},{135,10,2002},{10,11, 768},{139,11,787},{4,11,309},{5,11,462},{7,11,970},{135,11,1097},{4,10,28},{5,10 ,440},{7,10,248},{11,10,833},{140,10,344},{134,10,1654},{6,0,632},{6,0,652},{6,0 ,1272},{6,0,1384},{134,0,1560},{134,11,1704},{6,0,1393},{133,10,853},{6,10,249}, {7,10,1234},{139,10,573},{5,11,86},{7,11,743},{9,11,85},{10,11,281},{10,11,432}, {11,11,490},{12,11,251},{13,11,118},{14,11,378},{146,11,143},{5,11,524},{133,11, 744},{134,0,1514},{10,0,201},{142,0,319},{7,0,717},{10,0,510},{7,10,392},{8,10, 20},{8,10,172},{8,10,690},{9,10,383},{9,10,845},{11,10,293},{11,10,832},{11,10, 920},{11,10,984},{141,10,221},{134,0,1381},{5,10,858},{133,10,992},{8,0,528},{ 137,0,348},{10,11,107},{140,11,436},{4,0,20},{133,0,616},{134,0,1251},{132,11, 927},{10,11,123},{12,11,670},{13,11,371},{14,11,142},{146,11,94},{134,0,1163},{7 ,11,1149},{137,11,156},{134,0,307},{133,11,778},{7,0,1091},{135,0,1765},{5,11, 502},{6,10,268},{137,10,62},{8,11,196},{10,11,283},{139,11,406},{4,0,26},{5,0, 429},{6,0,245},{7,0,704},{7,0,1379},{135,0,1474},{133,11,855},{132,0,881},{4,0, 621},{135,11,1596},{7,11,1400},{9,11,446},{138,11,45},{6,0,736},{138,10,106},{ 133,0,542},{134,0,348},{133,0,868},{136,0,433},{135,0,1495},{138,0,771},{6,10, 613},{136,10,223},{138,0,215},{141,0,124},{136,11,391},{135,11,172},{132,10,670} ,{140,0,55},{9,10,40},{139,10,136},{7,0,62},{147,0,112},{132,0,856},{132,11,568} ,{12,0,270},{139,10,259},{8,0,572},{137,0,698},{4,11,732},{9,10,310},{137,10,682 },{142,10,296},{134,0,939},{136,11,733},{135,11,1435},{7,10,1401},{135,10,1476}, {6,0,352},{4,10,296},{7,10,401},{7,10,1410},{7,10,1594},{7,10,1674},{8,10,63},{8 ,10,660},{137,10,74},{4,11,428},{133,11,668},{4,10,139},{4,10,388},{140,10,188}, {7,11,2015},{140,11,665},{132,0,647},{146,0,10},{138,0,220},{142,0,464},{132,0, 109},{134,0,1746},{6,0,515},{4,10,747},{6,11,1623},{6,11,1681},{7,10,649},{7,10, 1479},{135,10,1583},{133,10,232},{135,0,566},{137,10,887},{4,0,40},{10,0,67},{11 ,0,117},{11,0,768},{139,0,935},{132,0,801},{7,0,992},{8,0,301},{9,0,722},{12,0, 63},{13,0,29},{14,0,161},{143,0,18},{139,0,923},{6,11,1748},{8,11,715},{9,11,802 },{10,11,46},{10,11,819},{13,11,308},{14,11,351},{14,11,363},{146,11,67},{137,11 ,745},{7,0,1145},{4,10,14},{7,10,1801},{10,10,748},{141,10,458},{4,11,63},{5,11, 347},{134,11,474},{135,0,568},{4,10,425},{7,11,577},{7,11,1432},{9,11,475},{9,11 ,505},{9,11,526},{9,11,609},{9,11,689},{9,11,726},{9,11,735},{9,11,738},{10,11, 556},{10,11,674},{10,11,684},{11,11,89},{11,11,202},{11,11,272},{11,11,380},{11, 11,415},{11,11,505},{11,11,537},{11,11,550},{11,11,562},{11,11,640},{11,11,667}, {11,11,688},{11,11,847},{11,11,927},{11,11,930},{11,11,940},{12,11,144},{12,11, 325},{12,11,329},{12,11,389},{12,11,403},{12,11,451},{12,11,515},{12,11,604},{12 ,11,616},{12,11,626},{13,11,66},{13,11,131},{13,11,167},{13,11,236},{13,11,368}, {13,11,411},{13,11,434},{13,11,453},{13,11,461},{13,11,474},{14,11,59},{14,11,60 },{14,11,139},{14,11,152},{14,11,276},{14,11,353},{14,11,402},{15,11,28},{15,11, 81},{15,11,123},{15,11,152},{18,11,136},{148,11,88},{137,0,247},{135,11,1622},{9 ,11,544},{11,11,413},{144,11,25},{4,0,645},{7,0,825},{6,10,1768},{135,11,89},{ 140,0,328},{5,10,943},{134,10,1779},{134,0,1363},{5,10,245},{6,10,576},{7,10,582 },{136,10,225},{134,0,1280},{5,11,824},{133,11,941},{7,11,440},{8,11,230},{139, 11,106},{5,0,28},{6,0,204},{10,0,320},{10,0,583},{13,0,502},{14,0,72},{14,0,274} ,{14,0,312},{14,0,344},{15,0,159},{16,0,62},{16,0,69},{17,0,30},{18,0,42},{18,0, 53},{18,0,84},{18,0,140},{19,0,68},{19,0,85},{20,0,5},{20,0,45},{20,0,101},{22,0 ,7},{150,0,20},{4,0,558},{6,0,390},{7,0,162},{7,0,689},{9,0,360},{138,0,653},{ 134,0,764},{6,0,862},{137,0,833},{5,0,856},{6,0,1672},{6,0,1757},{134,0,1781},{5 ,0,92},{10,0,736},{140,0,102},{6,0,1927},{6,0,1944},{8,0,924},{8,0,948},{10,0, 967},{138,0,978},{134,0,1479},{5,0,590},{8,0,360},{9,0,213},{138,0,63},{134,0, 1521},{6,0,709},{134,0,891},{132,10,443},{13,0,477},{14,0,120},{148,0,61},{4,11, 914},{5,11,800},{133,11,852},{10,11,54},{141,11,115},{4,11,918},{133,11,876},{ 139,11,152},{4,11,92},{133,11,274},{135,11,1901},{9,11,800},{10,11,693},{11,11, 482},{11,11,734},{139,11,789},{9,0,483},{132,10,298},{6,0,1213},{141,11,498},{ 135,11,1451},{133,11,743},{4,0,1022},{10,0,1000},{12,0,957},{12,0,980},{12,0, 1013},{14,0,481},{144,0,116},{8,0,503},{17,0,29},{4,11,49},{7,11,280},{135,11, 1633},{135,0,1712},{134,0,466},{136,11,47},{5,10,164},{7,10,121},{142,10,189},{7 ,10,812},{7,10,1261},{7,10,1360},{9,10,632},{140,10,352},{139,10,556},{132,0,731 },{5,11,272},{5,11,908},{5,11,942},{7,11,1008},{7,11,1560},{8,11,197},{9,11,47}, {11,11,538},{139,11,742},{4,10,172},{9,10,611},{10,10,436},{12,10,673},{141,10, 255},{133,10,844},{10,0,484},{11,0,754},{12,0,457},{14,0,171},{14,0,389},{146,0, 153},{9,10,263},{10,10,147},{138,10,492},{137,11,891},{138,0,241},{133,10,537},{ 6,0,2005},{136,0,964},{137,10,842},{151,11,8},{4,11,407},{132,11,560},{135,11, 1884},{6,0,1100},{134,0,1242},{135,0,954},{5,10,230},{5,10,392},{6,10,420},{9,10 ,568},{140,10,612},{4,11,475},{11,11,35},{11,11,90},{13,11,7},{13,11,71},{13,11, 177},{142,11,422},{136,11,332},{135,0,1958},{6,0,549},{8,0,34},{8,0,283},{9,0, 165},{138,0,475},{10,0,952},{12,0,966},{140,0,994},{5,0,652},{5,0,701},{135,0, 449},{4,0,655},{7,0,850},{17,0,75},{146,0,137},{4,0,146},{7,0,1618},{8,0,670},{5 ,10,41},{7,10,1459},{7,10,1469},{7,10,1859},{9,10,549},{139,10,905},{133,10,696} ,{6,0,159},{6,0,364},{7,0,516},{137,0,518},{135,0,1439},{6,11,222},{7,11,636},{7 ,11,1620},{8,11,409},{9,11,693},{139,11,77},{13,0,151},{141,11,45},{6,0,1027},{4 ,11,336},{132,10,771},{139,11,392},{10,11,121},{11,11,175},{149,11,16},{8,0,950} ,{138,0,983},{133,10,921},{135,0,993},{6,10,180},{7,10,1137},{8,10,751},{139,10, 805},{7,0,501},{9,0,111},{10,0,141},{11,0,332},{13,0,43},{13,0,429},{14,0,130},{ 14,0,415},{145,0,102},{4,10,183},{5,11,882},{7,10,271},{11,10,824},{11,10,952},{ 13,10,278},{13,10,339},{13,10,482},{14,10,424},{148,10,99},{4,10,19},{5,10,477}, {5,10,596},{6,10,505},{7,10,1221},{11,10,907},{12,10,209},{141,10,214},{135,10, 1215},{133,0,452},{132,11,426},{5,0,149},{136,0,233},{133,0,935},{6,11,58},{7,11 ,654},{7,11,745},{7,11,1969},{8,11,240},{8,11,675},{9,11,479},{9,11,731},{10,11, 330},{10,11,593},{10,11,817},{11,11,32},{11,11,133},{11,11,221},{145,11,68},{12, 0,582},{18,0,131},{7,11,102},{137,11,538},{136,0,801},{134,10,1645},{132,0,70},{ 6,10,92},{6,10,188},{7,10,1269},{7,10,1524},{7,10,1876},{10,10,228},{139,10,1020 },{4,10,459},{133,10,966},{138,0,369},{16,0,36},{140,10,330},{141,11,366},{7,0, 721},{10,0,236},{12,0,204},{6,10,18},{7,10,932},{8,10,757},{9,10,54},{9,10,65},{ 9,10,844},{10,10,113},{10,10,315},{10,10,798},{11,10,153},{12,10,151},{12,10,392 },{12,10,666},{142,10,248},{7,0,241},{10,0,430},{8,10,548},{9,10,532},{10,10,117 },{11,10,351},{11,10,375},{143,10,23},{134,10,1742},{133,10,965},{133,11,566},{6 ,11,48},{135,11,63},{134,10,182},{10,10,65},{10,10,488},{138,10,497},{6,11,114}, {7,11,1224},{7,11,1556},{136,11,3},{134,0,1817},{8,11,576},{137,11,267},{6,0, 1078},{144,0,16},{9,10,588},{138,10,260},{138,0,1021},{5,0,406},{134,0,2022},{ 133,11,933},{6,0,69},{135,0,117},{7,0,1830},{136,11,427},{4,0,432},{135,0,824},{ 134,10,1786},{133,0,826},{139,11,67},{133,11,759},{135,10,308},{137,0,816},{133, 0,1000},{4,0,297},{6,0,529},{7,0,152},{7,0,713},{7,0,1845},{8,0,710},{8,0,717},{ 12,0,639},{140,0,685},{7,0,423},{136,10,588},{136,10,287},{136,0,510},{134,0, 1048},{6,0,618},{7,11,56},{7,11,1989},{8,11,337},{8,11,738},{9,11,600},{10,11, 483},{12,11,37},{13,11,447},{142,11,92},{4,0,520},{135,0,575},{8,0,990},{138,0, 977},{135,11,774},{9,11,347},{11,11,24},{140,11,170},{136,11,379},{140,10,290},{ 132,11,328},{4,0,321},{134,0,569},{4,11,101},{135,11,1171},{7,0,723},{7,0,1135}, {5,11,833},{136,11,744},{7,10,719},{8,10,809},{136,10,834},{8,0,921},{136,10,796 },{5,10,210},{6,10,213},{7,10,60},{10,10,364},{139,10,135},{5,0,397},{6,0,154},{ 7,0,676},{8,0,443},{8,0,609},{9,0,24},{9,0,325},{10,0,35},{11,0,535},{11,0,672}, {11,0,1018},{12,0,637},{16,0,30},{5,10,607},{8,10,326},{136,10,490},{4,10,701},{ 5,10,472},{6,11,9},{6,11,397},{7,11,53},{7,11,1742},{9,10,758},{10,11,632},{11, 11,828},{140,11,146},{135,10,380},{135,10,1947},{148,11,109},{10,10,278},{138,11 ,278},{134,0,856},{7,0,139},{4,10,386},{8,10,405},{8,10,728},{9,10,497},{11,10, 110},{11,10,360},{15,10,37},{144,10,84},{141,0,282},{133,0,981},{5,0,288},{7,10, 1452},{7,10,1480},{8,10,634},{140,10,472},{7,0,1890},{8,11,367},{10,11,760},{14, 11,79},{20,11,17},{152,11,0},{4,10,524},{136,10,810},{4,0,56},{7,0,1791},{8,0, 607},{8,0,651},{11,0,465},{11,0,835},{12,0,337},{141,0,480},{10,10,238},{141,10, 33},{11,11,417},{12,11,223},{140,11,265},{9,0,158},{10,0,411},{140,0,261},{133, 10,532},{133,10,997},{12,11,186},{12,11,292},{14,11,100},{146,11,70},{6,0,1403}, {136,0,617},{134,0,1205},{139,0,563},{4,0,242},{134,0,333},{4,11,186},{5,11,157} ,{8,11,168},{138,11,6},{132,0,369},{133,11,875},{5,10,782},{5,10,829},{134,10, 1738},{134,0,622},{135,11,1272},{6,0,1407},{7,11,111},{136,11,581},{7,10,1823},{ 139,10,693},{7,0,160},{10,0,624},{142,0,279},{132,0,363},{10,11,589},{12,11,111} ,{13,11,260},{14,11,82},{18,11,63},{147,11,45},{7,11,1364},{7,11,1907},{141,11, 158},{4,11,404},{4,11,659},{135,11,675},{13,11,211},{14,11,133},{14,11,204},{15, 11,64},{15,11,69},{15,11,114},{16,11,10},{19,11,23},{19,11,35},{19,11,39},{19,11 ,51},{19,11,71},{19,11,75},{152,11,15},{4,10,78},{5,10,96},{5,10,182},{7,10,1724 },{7,10,1825},{10,10,394},{10,10,471},{11,10,532},{14,10,340},{145,10,88},{135, 10,1964},{133,11,391},{11,11,887},{14,11,365},{142,11,375},{5,11,540},{6,11,1697 },{7,11,222},{136,11,341},{134,11,78},{9,0,601},{9,0,619},{10,0,505},{10,0,732}, {11,0,355},{140,0,139},{134,0,292},{139,0,174},{5,0,177},{6,0,616},{7,0,827},{9, 0,525},{138,0,656},{10,0,31},{6,10,215},{7,10,1028},{7,10,1473},{7,10,1721},{9, 10,424},{138,10,779},{135,10,584},{136,11,293},{134,0,685},{135,11,1868},{133,11 ,460},{7,0,647},{6,10,67},{7,10,1630},{9,10,354},{9,10,675},{10,10,830},{14,10, 80},{145,10,80},{4,0,161},{133,0,631},{6,10,141},{7,10,225},{9,10,59},{9,10,607} ,{10,10,312},{11,10,687},{12,10,555},{13,10,373},{13,10,494},{148,10,58},{7,11, 965},{7,11,1460},{135,11,1604},{136,10,783},{134,11,388},{6,0,722},{6,0,1267},{4 ,11,511},{9,11,333},{9,11,379},{10,11,602},{11,11,441},{11,11,723},{11,11,976},{ 140,11,357},{134,0,1797},{135,0,1684},{9,0,469},{9,0,709},{12,0,512},{14,0,65},{ 17,0,12},{5,11,938},{136,11,707},{7,0,1230},{136,0,531},{10,0,229},{11,0,73},{11 ,0,376},{139,0,433},{12,0,268},{12,0,640},{142,0,119},{7,10,430},{139,10,46},{6, 0,558},{7,0,651},{8,0,421},{9,0,0},{10,0,34},{139,0,1008},{6,0,106},{7,0,1786},{ 7,0,1821},{9,0,102},{9,0,763},{5,10,602},{7,10,2018},{137,10,418},{5,0,65},{6,0, 416},{7,0,1720},{7,0,1924},{10,0,109},{11,0,14},{11,0,70},{11,0,569},{11,0,735}, {15,0,153},{20,0,80},{136,10,677},{135,11,1625},{137,11,772},{136,0,595},{6,11, 469},{7,11,1709},{138,11,515},{7,0,1832},{138,0,374},{9,0,106},{9,0,163},{9,0, 296},{10,0,167},{10,0,172},{10,0,777},{139,0,16},{6,0,6},{7,0,81},{7,0,771},{7,0 ,1731},{9,0,405},{138,0,421},{4,11,500},{135,11,938},{5,11,68},{134,11,383},{5,0 ,881},{133,0,885},{6,0,854},{6,0,1132},{6,0,1495},{6,0,1526},{6,0,1533},{134,0, 1577},{4,11,337},{6,11,353},{7,11,1934},{8,11,488},{137,11,429},{7,11,236},{7,11 ,1795},{8,11,259},{9,11,135},{9,11,177},{10,11,825},{11,11,115},{11,11,370},{11, 11,405},{11,11,604},{12,11,10},{12,11,667},{12,11,669},{13,11,76},{14,11,310},{ 15,11,76},{15,11,147},{148,11,23},{5,0,142},{134,0,546},{4,11,15},{5,11,22},{6, 11,244},{7,11,40},{7,11,200},{7,11,906},{7,11,1199},{9,11,616},{10,11,716},{11, 11,635},{11,11,801},{140,11,458},{5,0,466},{11,0,571},{12,0,198},{13,0,283},{14, 0,186},{15,0,21},{15,0,103},{135,10,329},{4,0,185},{5,0,257},{5,0,839},{5,0,936} ,{9,0,399},{10,0,258},{10,0,395},{10,0,734},{11,0,1014},{12,0,23},{13,0,350},{14 ,0,150},{19,0,6},{135,11,1735},{12,11,36},{141,11,337},{5,11,598},{7,11,791},{8, 11,108},{137,11,123},{132,10,469},{7,0,404},{7,0,1377},{7,0,1430},{7,0,2017},{8, 0,149},{8,0,239},{8,0,512},{8,0,793},{8,0,818},{9,0,474},{9,0,595},{10,0,122},{ 10,0,565},{10,0,649},{10,0,783},{11,0,239},{11,0,295},{11,0,447},{11,0,528},{11, 0,639},{11,0,800},{12,0,25},{12,0,77},{12,0,157},{12,0,256},{12,0,316},{12,0,390 },{12,0,391},{12,0,395},{12,0,478},{12,0,503},{12,0,592},{12,0,680},{13,0,50},{ 13,0,53},{13,0,132},{13,0,198},{13,0,322},{13,0,415},{13,0,511},{14,0,71},{14,0, 395},{15,0,71},{15,0,136},{17,0,123},{18,0,93},{147,0,58},{136,0,712},{134,10, 1743},{5,10,929},{6,10,340},{8,10,376},{136,10,807},{6,0,1848},{8,0,860},{10,0, 856},{10,0,859},{10,0,925},{10,0,941},{140,0,762},{6,0,629},{6,0,906},{9,0,810}, {140,0,652},{5,10,218},{7,10,1610},{138,10,83},{7,10,1512},{135,10,1794},{4,0, 377},{24,0,13},{4,11,155},{7,11,1689},{11,10,0},{144,10,78},{4,11,164},{5,11,151 },{5,11,730},{5,11,741},{7,11,498},{7,11,870},{7,11,1542},{12,11,213},{14,11,36} ,{14,11,391},{17,11,111},{18,11,6},{18,11,46},{18,11,151},{19,11,36},{20,11,32}, {20,11,56},{20,11,69},{20,11,102},{21,11,4},{22,11,8},{22,11,10},{22,11,14},{150 ,11,31},{7,0,1842},{133,10,571},{4,10,455},{4,11,624},{135,11,1752},{134,0,1501} ,{4,11,492},{5,11,451},{6,10,161},{7,10,372},{137,10,597},{132,10,349},{4,0,180} ,{135,0,1906},{135,11,835},{141,11,70},{132,0,491},{137,10,751},{6,10,432},{139, 10,322},{4,0,171},{138,0,234},{6,11,113},{135,11,436},{4,0,586},{7,0,1186},{138, 0,631},{5,10,468},{10,10,325},{11,10,856},{12,10,345},{143,10,104},{5,10,223},{ 10,11,592},{10,11,753},{12,11,317},{12,11,355},{12,11,465},{12,11,469},{12,11, 560},{12,11,578},{141,11,243},{132,10,566},{135,11,520},{4,10,59},{135,10,1394}, {6,10,436},{139,10,481},{9,0,931},{10,0,334},{20,0,71},{4,10,48},{5,10,271},{7, 10,953},{135,11,1878},{11,0,170},{5,10,610},{136,10,457},{133,10,755},{6,0,1587} ,{135,10,1217},{4,10,197},{149,11,26},{133,11,585},{137,11,521},{133,0,765},{133 ,10,217},{139,11,586},{133,0,424},{9,11,752},{12,11,610},{13,11,431},{16,11,59}, {146,11,109},{136,0,714},{7,0,685},{132,11,307},{9,0,420},{10,0,269},{10,0,285}, {10,0,576},{11,0,397},{13,0,175},{145,0,90},{132,0,429},{133,11,964},{9,11,463}, {138,11,595},{7,0,18},{7,0,699},{7,0,1966},{8,0,752},{9,0,273},{9,0,412},{9,0, 703},{10,0,71},{10,0,427},{138,0,508},{4,10,165},{7,10,1398},{135,10,1829},{4,0, 53},{5,0,186},{7,0,752},{7,0,828},{142,0,116},{8,0,575},{10,0,289},{139,0,319},{ 132,0,675},{134,0,1424},{4,11,75},{5,11,180},{6,11,500},{7,11,58},{7,11,710},{ 138,11,645},{133,11,649},{6,11,276},{7,11,282},{7,11,879},{7,11,924},{8,11,459}, {9,11,599},{9,11,754},{11,11,574},{12,11,128},{12,11,494},{13,11,52},{13,11,301} ,{15,11,30},{143,11,132},{6,0,647},{134,0,1095},{5,10,9},{7,10,297},{7,10,966},{ 140,10,306},{132,11,200},{134,0,1334},{5,10,146},{6,10,411},{138,10,721},{6,0, 209},{6,0,1141},{6,0,1288},{8,0,468},{9,0,210},{11,0,36},{12,0,28},{12,0,630},{ 13,0,21},{13,0,349},{14,0,7},{145,0,13},{6,10,177},{135,10,467},{4,0,342},{135,0 ,1179},{10,11,454},{140,11,324},{4,0,928},{133,0,910},{7,0,1838},{6,11,225},{137 ,11,211},{16,0,101},{20,0,115},{20,0,118},{148,0,122},{4,0,496},{135,0,856},{4,0 ,318},{11,0,654},{7,11,718},{139,11,102},{8,11,58},{9,11,724},{11,11,809},{13,11 ,113},{145,11,72},{5,10,200},{6,11,345},{135,11,1247},{8,11,767},{8,11,803},{9, 11,301},{137,11,903},{7,0,915},{8,0,247},{19,0,0},{7,11,1949},{136,11,674},{4,0, 202},{5,0,382},{6,0,454},{7,0,936},{7,0,1803},{8,0,758},{9,0,375},{9,0,895},{10, 0,743},{10,0,792},{11,0,978},{11,0,1012},{142,0,109},{7,0,1150},{7,0,1425},{7,0, 1453},{140,0,513},{134,11,259},{138,0,791},{11,0,821},{12,0,110},{12,0,153},{18, 0,41},{150,0,19},{134,10,481},{132,0,796},{6,0,445},{9,0,909},{136,11,254},{10,0 ,776},{13,0,345},{142,0,425},{4,10,84},{7,10,1482},{10,10,76},{138,10,142},{135, 11,742},{6,0,578},{133,10,1015},{6,0,1387},{4,10,315},{5,10,507},{135,10,1370},{ 4,0,438},{133,0,555},{136,0,766},{133,11,248},{134,10,1722},{4,11,116},{5,11,95} ,{5,11,445},{7,11,1688},{8,11,29},{9,11,272},{11,11,509},{139,11,915},{135,0,541 },{133,11,543},{8,10,222},{8,10,476},{9,10,238},{11,10,516},{11,10,575},{15,10, 109},{146,10,100},{6,0,880},{134,0,1191},{5,11,181},{136,11,41},{134,0,1506},{ 132,11,681},{7,11,25},{8,11,202},{138,11,536},{139,0,983},{137,0,768},{132,0,584 },{9,11,423},{140,11,89},{8,11,113},{9,11,877},{10,11,554},{11,11,83},{12,11,136 },{147,11,109},{7,10,706},{7,10,1058},{138,10,538},{133,11,976},{4,11,206},{135, 11,746},{136,11,526},{140,0,737},{11,10,92},{11,10,196},{11,10,409},{11,10,450}, {11,10,666},{11,10,777},{12,10,262},{13,10,385},{13,10,393},{15,10,115},{16,10, 45},{145,10,82},{4,0,226},{4,0,326},{7,0,1770},{4,11,319},{5,11,699},{138,11,673 },{6,10,40},{135,10,1781},{5,0,426},{8,0,30},{9,0,2},{11,0,549},{147,0,122},{6,0 ,1161},{134,0,1329},{138,10,97},{6,10,423},{7,10,665},{135,10,1210},{7,11,13},{8 ,11,226},{10,11,537},{11,11,570},{11,11,605},{11,11,799},{11,11,804},{12,11,85}, {12,11,516},{12,11,623},{13,11,112},{13,11,361},{14,11,77},{14,11,78},{17,11,28} ,{147,11,110},{132,11,769},{132,11,551},{132,11,728},{147,0,117},{9,11,57},{9,11 ,459},{10,11,425},{11,11,119},{12,11,184},{12,11,371},{13,11,358},{145,11,51},{5 ,11,188},{5,11,814},{8,11,10},{9,11,421},{9,11,729},{10,11,609},{139,11,689},{ 134,11,624},{135,11,298},{135,0,462},{4,0,345},{139,10,624},{136,10,574},{4,0, 385},{7,0,265},{135,0,587},{6,0,808},{132,11,528},{133,0,398},{132,10,354},{4,0, 347},{5,0,423},{5,0,996},{135,0,1329},{135,10,1558},{7,0,1259},{9,0,125},{139,0, 65},{5,0,136},{6,0,136},{136,0,644},{5,11,104},{6,11,173},{135,11,1631},{135,0, 469},{133,10,830},{4,0,278},{5,0,465},{135,0,1367},{7,11,810},{8,11,138},{8,11, 342},{9,11,84},{10,11,193},{11,11,883},{140,11,359},{5,10,496},{135,10,203},{4,0 ,433},{133,0,719},{6,11,95},{134,10,547},{5,10,88},{137,10,239},{6,11,406},{10, 11,409},{10,11,447},{11,11,44},{140,11,100},{134,0,1423},{7,10,650},{135,10,1310 },{134,0,749},{135,11,1243},{135,0,1363},{6,0,381},{7,0,645},{7,0,694},{8,0,546} ,{7,10,1076},{9,10,80},{11,10,78},{11,10,421},{11,10,534},{140,10,545},{134,11, 1636},{135,11,1344},{12,0,277},{7,10,274},{11,10,479},{139,10,507},{6,0,705},{6, 0,783},{6,0,1275},{6,0,1481},{4,11,282},{7,11,1034},{11,11,398},{11,11,634},{12, 11,1},{12,11,79},{12,11,544},{14,11,237},{17,11,10},{146,11,20},{134,0,453},{4,0 ,555},{8,0,536},{10,0,288},{11,0,1005},{4,10,497},{135,10,1584},{5,11,118},{5,11 ,499},{6,11,476},{7,11,600},{7,11,888},{135,11,1096},{138,0,987},{7,0,1107},{7, 10,261},{7,10,1115},{7,10,1354},{7,10,1588},{7,10,1705},{7,10,1902},{9,10,465},{ 10,10,248},{10,10,349},{10,10,647},{11,10,527},{11,10,660},{11,10,669},{12,10, 529},{141,10,305},{7,11,296},{7,11,596},{8,11,560},{8,11,586},{9,11,612},{11,11, 100},{11,11,304},{12,11,46},{13,11,89},{14,11,112},{145,11,122},{9,0,370},{138,0 ,90},{136,10,13},{132,0,860},{7,10,642},{8,10,250},{11,10,123},{11,10,137},{13, 10,48},{142,10,95},{135,10,1429},{137,11,321},{132,0,257},{135,0,2031},{7,0,1768 },{7,11,1599},{7,11,1723},{8,11,79},{8,11,106},{8,11,190},{8,11,302},{8,11,383}, {9,11,119},{9,11,233},{9,11,298},{9,11,419},{9,11,471},{10,11,181},{10,11,406},{ 11,11,57},{11,11,85},{11,11,120},{11,11,177},{11,11,296},{11,11,382},{11,11,454} ,{11,11,758},{11,11,999},{12,11,27},{12,11,98},{12,11,131},{12,11,245},{12,11, 312},{12,11,446},{12,11,454},{13,11,25},{13,11,98},{13,11,426},{13,11,508},{14, 11,6},{14,11,163},{14,11,272},{14,11,277},{14,11,370},{15,11,95},{15,11,138},{15 ,11,167},{17,11,18},{17,11,38},{20,11,96},{149,11,32},{5,11,722},{134,11,1759},{ 145,11,16},{6,0,1071},{134,0,1561},{10,10,545},{140,10,301},{6,0,83},{6,0,1733}, {135,0,1389},{4,0,835},{135,0,1818},{133,11,258},{4,10,904},{133,10,794},{134,0, 2006},{5,11,30},{7,11,495},{8,11,134},{9,11,788},{140,11,438},{135,11,2004},{137 ,0,696},{5,11,50},{6,11,439},{7,11,780},{135,11,1040},{7,11,772},{7,11,1104},{7, 11,1647},{11,11,269},{11,11,539},{11,11,607},{11,11,627},{11,11,706},{11,11,975} ,{12,11,248},{12,11,311},{12,11,434},{12,11,600},{12,11,622},{13,11,297},{13,11, 367},{13,11,485},{14,11,69},{14,11,409},{143,11,108},{5,11,1},{6,11,81},{138,11, 520},{7,0,1718},{9,0,95},{9,0,274},{10,0,279},{10,0,317},{10,0,420},{11,0,303},{ 11,0,808},{12,0,134},{12,0,367},{13,0,149},{13,0,347},{14,0,349},{14,0,406},{18, 0,22},{18,0,89},{18,0,122},{147,0,47},{5,11,482},{8,11,98},{9,11,172},{10,11,222 },{10,11,700},{10,11,822},{11,11,302},{11,11,778},{12,11,50},{12,11,127},{12,11, 396},{13,11,62},{13,11,328},{14,11,122},{147,11,72},{7,10,386},{138,10,713},{6, 10,7},{6,10,35},{7,10,147},{7,10,1069},{7,10,1568},{7,10,1575},{7,10,1917},{8,10 ,43},{8,10,208},{9,10,128},{9,10,866},{10,10,20},{11,10,981},{147,10,33},{133,0, 26},{132,0,550},{5,11,2},{7,11,1494},{136,11,589},{6,11,512},{7,11,797},{8,11, 253},{9,11,77},{10,11,1},{10,11,129},{10,11,225},{11,11,118},{11,11,226},{11,11, 251},{11,11,430},{11,11,701},{11,11,974},{11,11,982},{12,11,64},{12,11,260},{12, 11,488},{140,11,690},{7,10,893},{141,10,424},{134,0,901},{136,0,822},{4,0,902},{ 5,0,809},{134,0,122},{6,0,807},{134,0,1366},{7,0,262},{5,11,748},{134,11,553},{ 133,0,620},{4,0,34},{5,0,574},{7,0,279},{7,0,1624},{136,0,601},{9,0,170},{6,10, 322},{9,10,552},{11,10,274},{13,10,209},{13,10,499},{14,10,85},{15,10,126},{145, 10,70},{132,0,537},{4,11,12},{7,11,420},{7,11,522},{7,11,809},{8,11,797},{141,11 ,88},{133,0,332},{8,10,83},{8,10,742},{8,10,817},{9,10,28},{9,10,29},{9,10,885}, {10,10,387},{11,10,633},{11,10,740},{13,10,235},{13,10,254},{15,10,143},{143,10, 146},{6,0,1909},{9,0,964},{12,0,822},{12,0,854},{12,0,865},{12,0,910},{12,0,938} ,{15,0,169},{15,0,208},{15,0,211},{18,0,205},{18,0,206},{18,0,220},{18,0,223},{ 152,0,24},{140,10,49},{5,11,528},{135,11,1580},{6,0,261},{8,0,182},{139,0,943},{ 134,0,1721},{4,0,933},{133,0,880},{136,11,321},{5,11,266},{9,11,290},{9,11,364}, {10,11,293},{11,11,606},{142,11,45},{6,0,1609},{4,11,50},{6,11,510},{6,11,594},{ 9,11,121},{10,11,49},{10,11,412},{139,11,834},{7,0,895},{136,11,748},{132,11,466 },{4,10,110},{10,10,415},{10,10,597},{142,10,206},{133,0,812},{135,11,281},{6,0, 1890},{6,0,1902},{6,0,1916},{9,0,929},{9,0,942},{9,0,975},{9,0,984},{9,0,986},{9 ,0,1011},{9,0,1019},{12,0,804},{12,0,851},{12,0,867},{12,0,916},{12,0,923},{15,0 ,194},{15,0,204},{15,0,210},{15,0,222},{15,0,223},{15,0,229},{15,0,250},{18,0, 179},{18,0,186},{18,0,192},{7,10,205},{135,10,2000},{132,11,667},{135,0,778},{4, 0,137},{7,0,1178},{135,0,1520},{134,0,1314},{4,11,242},{134,11,333},{6,0,1661},{ 7,0,1975},{7,0,2009},{135,0,2011},{134,0,1591},{4,10,283},{135,10,1194},{11,0, 820},{150,0,51},{4,11,39},{5,11,36},{7,11,1843},{8,11,407},{11,11,144},{140,11, 523},{134,10,1720},{4,11,510},{7,11,29},{7,11,66},{7,11,1980},{10,11,487},{10,11 ,809},{146,11,9},{5,0,89},{7,0,1915},{9,0,185},{9,0,235},{10,0,64},{10,0,270},{ 10,0,403},{10,0,469},{10,0,529},{10,0,590},{11,0,140},{11,0,860},{13,0,1},{13,0, 422},{14,0,341},{14,0,364},{17,0,93},{18,0,113},{19,0,97},{147,0,113},{133,0,695 },{6,0,987},{134,0,1160},{5,0,6},{6,0,183},{7,0,680},{7,0,978},{7,0,1013},{7,0, 1055},{12,0,230},{13,0,172},{146,0,29},{134,11,570},{132,11,787},{134,11,518},{6 ,0,29},{139,0,63},{132,11,516},{136,11,821},{132,0,311},{134,0,1740},{7,0,170},{ 8,0,90},{8,0,177},{8,0,415},{11,0,714},{14,0,281},{136,10,735},{134,0,1961},{135 ,11,1405},{4,11,10},{7,11,917},{139,11,786},{5,10,132},{9,10,486},{9,10,715},{10 ,10,458},{11,10,373},{11,10,668},{11,10,795},{11,10,897},{12,10,272},{12,10,424} ,{12,10,539},{12,10,558},{14,10,245},{14,10,263},{14,10,264},{14,10,393},{142,10 ,403},{11,0,91},{13,0,129},{15,0,101},{145,0,125},{135,0,1132},{4,0,494},{6,0,74 },{7,0,44},{7,0,407},{12,0,17},{15,0,5},{148,0,11},{133,10,379},{5,0,270},{5,11, 684},{6,10,89},{6,10,400},{7,10,1569},{7,10,1623},{7,10,1850},{8,10,218},{8,10, 422},{9,10,570},{138,10,626},{4,0,276},{133,0,296},{6,0,1523},{134,11,27},{6,10, 387},{7,10,882},{141,10,111},{6,10,224},{7,10,877},{137,10,647},{135,10,790},{4, 0,7},{5,0,90},{5,0,158},{6,0,542},{7,0,221},{7,0,1574},{9,0,490},{10,0,540},{11, 0,443},{139,0,757},{7,0,588},{9,0,175},{138,0,530},{135,10,394},{142,11,23},{134 ,0,786},{135,0,580},{7,0,88},{136,0,627},{5,0,872},{6,0,57},{7,0,471},{9,0,447}, {137,0,454},{6,11,342},{6,11,496},{8,11,275},{137,11,206},{4,11,909},{133,11,940 },{6,0,735},{132,11,891},{8,0,845},{8,0,916},{135,10,1409},{5,0,31},{134,0,614}, {11,0,458},{12,0,15},{140,0,432},{8,0,330},{140,0,477},{4,0,530},{5,0,521},{7,0, 1200},{10,0,460},{132,11,687},{6,0,424},{135,0,1866},{9,0,569},{12,0,12},{12,0, 81},{12,0,319},{13,0,69},{14,0,259},{16,0,87},{17,0,1},{17,0,21},{17,0,24},{18,0 ,15},{18,0,56},{18,0,59},{18,0,127},{18,0,154},{19,0,19},{148,0,31},{7,0,1302},{ 136,10,38},{134,11,253},{5,10,261},{7,10,78},{7,10,199},{8,10,815},{9,10,126},{ 138,10,342},{5,0,595},{135,0,1863},{6,11,41},{141,11,160},{5,0,13},{134,0,142},{ 6,0,97},{7,0,116},{8,0,322},{8,0,755},{9,0,548},{10,0,714},{11,0,884},{13,0,324} ,{7,11,1304},{138,11,477},{132,10,628},{134,11,1718},{7,10,266},{136,10,804},{ 135,10,208},{7,0,1021},{6,10,79},{135,10,1519},{7,0,1472},{135,0,1554},{6,11,362 },{146,11,51},{7,0,1071},{7,0,1541},{7,0,1767},{7,0,1806},{11,0,162},{11,0,242}, {11,0,452},{12,0,605},{15,0,26},{144,0,44},{136,10,741},{133,11,115},{145,0,115} ,{134,10,376},{6,0,1406},{134,0,1543},{5,11,193},{12,11,178},{13,11,130},{145,11 ,84},{135,0,1111},{8,0,1},{9,0,650},{10,0,326},{5,11,705},{137,11,606},{5,0,488} ,{6,0,527},{7,0,489},{7,0,1636},{8,0,121},{8,0,144},{8,0,359},{9,0,193},{9,0,241 },{9,0,336},{9,0,882},{11,0,266},{11,0,372},{11,0,944},{12,0,401},{140,0,641},{ 135,11,174},{6,0,267},{7,10,244},{7,10,632},{7,10,1609},{8,10,178},{8,10,638},{ 141,10,58},{134,0,1983},{134,0,1155},{134,0,1575},{134,0,1438},{9,0,31},{10,0, 244},{10,0,699},{12,0,149},{141,0,497},{133,0,377},{4,11,122},{5,11,796},{5,11, 952},{6,11,1660},{6,11,1671},{8,11,567},{9,11,687},{9,11,742},{10,11,686},{11,11 ,356},{11,11,682},{140,11,281},{145,0,101},{11,11,0},{144,11,78},{5,11,179},{5, 10,791},{7,11,1095},{135,11,1213},{8,11,372},{9,11,122},{138,11,175},{7,10,686}, {8,10,33},{8,10,238},{10,10,616},{11,10,467},{11,10,881},{13,10,217},{13,10,253} ,{142,10,268},{9,0,476},{4,11,66},{7,11,722},{135,11,904},{7,11,352},{137,11,684 },{135,0,2023},{135,0,1836},{132,10,447},{5,0,843},{144,0,35},{137,11,779},{141, 11,35},{4,10,128},{5,10,415},{6,10,462},{7,10,294},{7,10,578},{10,10,710},{139, 10,86},{132,0,554},{133,0,536},{136,10,587},{5,0,207},{9,0,79},{11,0,625},{145,0 ,7},{7,0,1371},{6,10,427},{138,10,692},{4,0,424},{4,10,195},{135,10,802},{8,0, 785},{133,11,564},{135,0,336},{4,0,896},{6,0,1777},{134,11,556},{137,11,103},{ 134,10,1683},{7,11,544},{8,11,719},{138,11,61},{138,10,472},{4,11,5},{5,11,498}, {136,11,637},{7,0,750},{9,0,223},{11,0,27},{11,0,466},{12,0,624},{14,0,265},{146 ,0,61},{12,0,238},{18,0,155},{12,11,238},{146,11,155},{151,10,28},{133,11,927},{ 12,0,383},{5,10,3},{8,10,578},{9,10,118},{10,10,705},{141,10,279},{4,11,893},{5, 11,780},{133,11,893},{4,0,603},{133,0,661},{4,0,11},{6,0,128},{7,0,231},{7,0, 1533},{10,0,725},{5,10,229},{5,11,238},{135,11,1350},{8,10,102},{10,10,578},{10, 10,672},{12,10,496},{13,10,408},{14,10,121},{145,10,106},{132,0,476},{134,0,1552 },{134,11,1729},{8,10,115},{8,10,350},{9,10,489},{10,10,128},{11,10,306},{12,10, 373},{14,10,30},{17,10,79},{19,10,80},{150,10,55},{135,0,1807},{4,0,680},{4,11, 60},{7,11,760},{7,11,1800},{8,11,314},{9,11,700},{139,11,487},{4,10,230},{5,10, 702},{148,11,94},{132,11,228},{139,0,435},{9,0,20},{10,0,324},{10,0,807},{139,0, 488},{6,10,1728},{136,11,419},{4,10,484},{18,10,26},{19,10,42},{20,10,43},{21,10 ,0},{23,10,27},{152,10,14},{135,0,1431},{133,11,828},{5,0,112},{6,0,103},{6,0, 150},{7,0,1303},{9,0,292},{10,0,481},{20,0,13},{7,11,176},{7,11,178},{7,11,1110} ,{10,11,481},{148,11,13},{138,0,356},{4,11,51},{5,11,39},{6,11,4},{7,11,591},{7, 11,849},{7,11,951},{7,11,1129},{7,11,1613},{7,11,1760},{7,11,1988},{9,11,434},{ 10,11,754},{11,11,25},{11,11,37},{139,11,414},{6,0,1963},{134,0,2000},{132,10, 633},{6,0,1244},{133,11,902},{135,11,928},{140,0,18},{138,0,204},{135,11,1173},{ 134,0,867},{4,0,708},{8,0,15},{9,0,50},{9,0,386},{11,0,18},{11,0,529},{140,0,228 },{134,11,270},{4,0,563},{7,0,109},{7,0,592},{7,0,637},{7,0,770},{8,0,463},{9,0, 60},{9,0,335},{9,0,904},{10,0,73},{11,0,434},{12,0,585},{13,0,331},{18,0,110},{ 148,0,60},{132,0,502},{14,11,359},{19,11,52},{148,11,47},{6,11,377},{7,11,1025}, {9,11,613},{145,11,104},{6,0,347},{10,0,161},{5,10,70},{5,10,622},{6,10,334},{7, 10,1032},{9,10,171},{11,10,26},{11,10,213},{11,10,637},{11,10,707},{12,10,202},{ 12,10,380},{13,10,226},{13,10,355},{14,10,222},{145,10,42},{132,11,416},{4,0,33} ,{5,0,102},{6,0,284},{7,0,1079},{7,0,1423},{7,0,1702},{8,0,470},{9,0,554},{9,0, 723},{11,0,333},{142,11,372},{5,11,152},{5,11,197},{7,11,340},{7,11,867},{10,11, 548},{10,11,581},{11,11,6},{12,11,3},{12,11,19},{14,11,110},{142,11,289},{7,0, 246},{135,0,840},{6,0,10},{8,0,571},{9,0,739},{143,0,91},{6,0,465},{7,0,1465},{4 ,10,23},{4,10,141},{5,10,313},{5,10,1014},{6,10,50},{7,10,142},{7,10,559},{8,10, 640},{9,10,460},{9,10,783},{11,10,741},{12,10,183},{141,10,488},{133,0,626},{136 ,0,614},{138,0,237},{7,11,34},{7,11,190},{8,11,28},{8,11,141},{8,11,444},{8,11, 811},{9,11,468},{11,11,334},{12,11,24},{12,11,386},{140,11,576},{133,11,757},{5, 0,18},{6,0,526},{13,0,24},{13,0,110},{19,0,5},{147,0,44},{6,0,506},{134,11,506}, {135,11,1553},{4,0,309},{5,0,462},{7,0,970},{7,0,1097},{22,0,30},{22,0,33},{7,11 ,1385},{11,11,582},{11,11,650},{11,11,901},{11,11,949},{12,11,232},{12,11,236},{ 13,11,413},{13,11,501},{146,11,116},{9,0,140},{5,10,222},{138,10,534},{6,0,1056} ,{137,10,906},{134,0,1704},{138,10,503},{134,0,1036},{5,10,154},{7,10,1491},{10, 10,379},{138,10,485},{4,11,383},{133,10,716},{134,0,1315},{5,0,86},{7,0,743},{9, 0,85},{10,0,281},{10,0,432},{11,0,825},{12,0,251},{13,0,118},{142,0,378},{8,0, 264},{4,10,91},{5,10,388},{5,10,845},{6,10,206},{6,10,252},{6,10,365},{7,10,136} ,{7,10,531},{136,10,621},{5,0,524},{133,0,744},{5,11,277},{141,11,247},{132,11, 435},{10,0,107},{140,0,436},{132,0,927},{10,0,123},{12,0,670},{146,0,94},{7,0, 1149},{9,0,156},{138,0,957},{5,11,265},{6,11,212},{135,11,28},{133,0,778},{133,0 ,502},{8,0,196},{10,0,283},{139,0,406},{135,10,576},{136,11,535},{134,0,1312},{5 ,10,771},{5,10,863},{5,10,898},{6,10,1632},{6,10,1644},{134,10,1780},{5,0,855},{ 5,10,331},{135,11,1487},{132,11,702},{5,11,808},{135,11,2045},{7,0,1400},{9,0, 446},{138,0,45},{140,10,632},{132,0,1003},{5,11,166},{8,11,739},{140,11,511},{5, 10,107},{7,10,201},{136,10,518},{6,10,446},{135,10,1817},{134,0,1532},{134,0, 1097},{4,11,119},{5,11,170},{5,11,447},{7,11,1708},{7,11,1889},{9,11,357},{9,11, 719},{12,11,486},{140,11,596},{9,10,851},{141,10,510},{7,0,612},{8,0,545},{8,0, 568},{8,0,642},{9,0,717},{10,0,541},{10,0,763},{11,0,449},{12,0,489},{13,0,153}, {13,0,296},{14,0,138},{14,0,392},{15,0,50},{16,0,6},{16,0,12},{20,0,9},{132,10, 504},{4,11,450},{135,11,1158},{11,0,54},{13,0,173},{13,0,294},{5,10,883},{5,10, 975},{8,10,392},{148,10,7},{13,0,455},{15,0,99},{15,0,129},{144,0,68},{135,0,172 },{132,11,754},{5,10,922},{134,10,1707},{134,0,1029},{17,11,39},{148,11,36},{4,0 ,568},{5,10,993},{7,10,515},{137,10,91},{132,0,732},{10,0,617},{138,11,617},{134 ,0,974},{7,0,989},{10,0,377},{12,0,363},{13,0,68},{13,0,94},{14,0,108},{142,0, 306},{136,0,733},{132,0,428},{7,0,1789},{135,11,1062},{7,0,2015},{140,0,665},{ 135,10,1433},{5,0,287},{7,10,921},{8,10,580},{8,10,593},{8,10,630},{138,10,28},{ 138,0,806},{4,10,911},{5,10,867},{5,10,1013},{7,10,2034},{8,10,798},{136,10,813} ,{134,0,1539},{8,11,523},{150,11,34},{135,11,740},{7,11,238},{7,11,2033},{8,11, 120},{8,11,188},{8,11,659},{9,11,598},{10,11,466},{12,11,342},{12,11,588},{13,11 ,503},{14,11,246},{143,11,92},{7,0,1563},{141,0,182},{5,10,135},{6,10,519},{7,10 ,1722},{10,10,271},{11,10,261},{145,10,54},{14,10,338},{148,10,81},{7,0,484},{4, 10,300},{133,10,436},{145,11,114},{6,0,1623},{134,0,1681},{133,11,640},{4,11,201 },{7,11,1744},{8,11,602},{11,11,247},{11,11,826},{145,11,65},{8,11,164},{146,11, 62},{6,0,1833},{6,0,1861},{136,0,878},{134,0,1569},{8,10,357},{10,10,745},{14,10 ,426},{17,10,94},{147,10,57},{12,0,93},{12,0,501},{13,0,362},{14,0,151},{15,0,40 },{15,0,59},{16,0,46},{17,0,25},{18,0,14},{18,0,134},{19,0,25},{19,0,69},{20,0, 16},{20,0,19},{20,0,66},{21,0,23},{21,0,25},{150,0,42},{6,0,1748},{8,0,715},{9,0 ,802},{10,0,46},{10,0,819},{13,0,308},{14,0,351},{14,0,363},{146,0,67},{132,0, 994},{4,0,63},{133,0,347},{132,0,591},{133,0,749},{7,11,1577},{10,11,304},{10,11 ,549},{11,11,424},{12,11,365},{13,11,220},{13,11,240},{142,11,33},{133,0,366},{7 ,0,557},{12,0,547},{14,0,86},{133,10,387},{135,0,1747},{132,11,907},{5,11,100},{ 10,11,329},{12,11,416},{149,11,29},{4,10,6},{5,10,708},{136,10,75},{7,10,1351},{ 9,10,581},{10,10,639},{11,10,453},{140,10,584},{7,0,89},{132,10,303},{138,10,772 },{132,11,176},{5,11,636},{5,11,998},{8,11,26},{137,11,358},{7,11,9},{7,11,1508} ,{9,11,317},{10,11,210},{10,11,292},{10,11,533},{11,11,555},{12,11,526},{12,11, 607},{13,11,263},{13,11,459},{142,11,271},{134,0,1463},{6,0,772},{6,0,1137},{139 ,11,595},{7,0,977},{139,11,66},{138,0,893},{20,0,48},{148,11,48},{5,0,824},{133, 0,941},{134,11,295},{7,0,1543},{7,0,1785},{10,0,690},{4,10,106},{139,10,717},{7, 0,440},{8,0,230},{139,0,106},{5,10,890},{133,10,988},{6,10,626},{142,10,431},{10 ,11,127},{141,11,27},{17,0,32},{10,10,706},{150,10,44},{132,0,216},{137,0,332},{ 4,10,698},{136,11,119},{139,11,267},{138,10,17},{11,11,526},{11,11,939},{141,11, 290},{7,11,1167},{11,11,934},{13,11,391},{145,11,76},{139,11,39},{134,10,84},{4, 0,914},{5,0,800},{133,0,852},{10,0,416},{141,0,115},{7,0,564},{142,0,168},{4,0, 918},{133,0,876},{134,0,1764},{152,0,3},{4,0,92},{5,0,274},{7,11,126},{136,11,84 },{140,10,498},{136,11,790},{8,0,501},{5,10,986},{6,10,130},{7,10,1582},{8,10, 458},{10,10,101},{10,10,318},{138,10,823},{6,11,64},{12,11,377},{141,11,309},{5, 0,743},{138,0,851},{4,0,49},{7,0,280},{135,0,1633},{134,0,879},{136,0,47},{7,10, 1644},{137,10,129},{132,0,865},{134,0,1202},{9,11,34},{139,11,484},{135,10,997}, {5,0,272},{5,0,908},{5,0,942},{8,0,197},{9,0,47},{11,0,538},{139,0,742},{6,11, 1700},{7,11,26},{7,11,293},{7,11,382},{7,11,1026},{7,11,1087},{7,11,2027},{8,11, 24},{8,11,114},{8,11,252},{8,11,727},{8,11,729},{9,11,30},{9,11,199},{9,11,231}, {9,11,251},{9,11,334},{9,11,361},{9,11,488},{9,11,712},{10,11,55},{10,11,60},{10 ,11,232},{10,11,332},{10,11,384},{10,11,396},{10,11,504},{10,11,542},{10,11,652} ,{11,11,20},{11,11,48},{11,11,207},{11,11,291},{11,11,298},{11,11,342},{11,11, 365},{11,11,394},{11,11,620},{11,11,705},{11,11,1017},{12,11,123},{12,11,340},{ 12,11,406},{12,11,643},{13,11,61},{13,11,269},{13,11,311},{13,11,319},{13,11,486 },{14,11,234},{15,11,62},{15,11,85},{16,11,71},{18,11,119},{148,11,105},{6,0, 1455},{150,11,37},{135,10,1927},{135,0,1911},{137,0,891},{7,10,1756},{137,10,98} ,{7,10,1046},{139,10,160},{132,0,761},{6,11,379},{7,11,270},{7,11,1116},{8,11, 176},{8,11,183},{9,11,432},{9,11,661},{12,11,247},{12,11,617},{146,11,125},{6,10 ,45},{7,10,433},{8,10,129},{9,10,21},{10,10,392},{11,10,79},{12,10,499},{13,10, 199},{141,10,451},{4,0,407},{5,11,792},{133,11,900},{132,0,560},{135,0,183},{13, 0,490},{7,10,558},{136,10,353},{4,0,475},{6,0,731},{11,0,35},{13,0,71},{13,0,177 },{14,0,422},{133,10,785},{8,10,81},{9,10,189},{9,10,201},{11,10,478},{11,10,712 },{141,10,338},{4,0,418},{4,0,819},{133,10,353},{151,10,26},{4,11,901},{133,11, 776},{132,0,575},{7,0,818},{16,0,92},{17,0,14},{17,0,45},{18,0,75},{148,0,18},{6 ,0,222},{7,0,636},{7,0,1620},{8,0,409},{9,0,693},{139,0,77},{6,10,25},{7,10,855} ,{7,10,1258},{144,10,32},{6,0,1880},{6,0,1887},{6,0,1918},{6,0,1924},{9,0,967},{ 9,0,995},{9,0,1015},{12,0,826},{12,0,849},{12,0,857},{12,0,860},{12,0,886},{12,0 ,932},{18,0,228},{18,0,231},{146,0,240},{134,0,633},{134,0,1308},{4,11,37},{5,11 ,334},{135,11,1253},{10,0,86},{4,10,4},{7,10,1118},{7,10,1320},{7,10,1706},{8,10 ,277},{9,10,622},{11,10,724},{12,10,350},{12,10,397},{13,10,28},{13,10,159},{15, 10,89},{18,10,5},{19,10,9},{20,10,34},{150,10,47},{132,11,508},{137,11,448},{12, 11,107},{146,11,31},{132,0,817},{134,0,663},{133,0,882},{134,0,914},{132,11,540} ,{132,11,533},{136,11,608},{8,0,885},{138,0,865},{132,0,426},{6,0,58},{7,0,745}, {7,0,1969},{8,0,399},{8,0,675},{9,0,479},{9,0,731},{10,0,330},{10,0,593},{10,0, 817},{11,0,32},{11,0,133},{11,0,221},{145,0,68},{134,10,255},{7,0,102},{137,0, 538},{137,10,216},{7,11,253},{136,11,549},{135,11,912},{9,10,183},{139,10,286},{ 11,10,956},{151,10,3},{8,11,527},{18,11,60},{147,11,24},{4,10,536},{7,10,1141},{ 10,10,723},{139,10,371},{133,11,920},{7,0,876},{135,10,285},{135,10,560},{132,10 ,690},{142,11,126},{11,10,33},{12,10,571},{149,10,1},{133,0,566},{9,0,139},{10,0 ,399},{11,0,469},{12,0,634},{13,0,223},{132,11,483},{6,0,48},{135,0,63},{18,0,12 },{7,10,1862},{12,10,491},{12,10,520},{13,10,383},{142,10,244},{135,11,1665},{ 132,11,448},{9,11,495},{146,11,104},{6,0,114},{7,0,1224},{7,0,1556},{136,0,3},{4 ,10,190},{133,10,554},{8,0,576},{9,0,267},{133,10,1001},{133,10,446},{133,0,933} ,{139,11,1009},{8,11,653},{13,11,93},{147,11,14},{6,0,692},{6,0,821},{134,0,1077 },{5,11,172},{135,11,801},{138,0,752},{4,0,375},{134,0,638},{134,0,1011},{140,11 ,540},{9,0,96},{133,11,260},{139,11,587},{135,10,1231},{12,0,30},{13,0,148},{14, 0,87},{14,0,182},{16,0,42},{20,0,70},{132,10,304},{6,0,1398},{7,0,56},{7,0,1989} ,{8,0,337},{8,0,738},{9,0,600},{12,0,37},{13,0,447},{142,0,92},{138,0,666},{5,0, 394},{7,0,487},{136,0,246},{9,0,437},{6,10,53},{6,10,199},{7,10,1408},{8,10,32}, {8,10,93},{10,10,397},{10,10,629},{11,10,593},{11,10,763},{13,10,326},{145,10,35 },{134,10,105},{9,0,320},{10,0,506},{138,10,794},{7,11,57},{8,11,167},{8,11,375} ,{9,11,82},{9,11,561},{10,11,620},{10,11,770},{11,10,704},{141,10,396},{6,0,1003 },{5,10,114},{5,10,255},{141,10,285},{7,0,866},{135,0,1163},{133,11,531},{132,0, 328},{7,10,2035},{8,10,19},{9,10,89},{138,10,831},{8,11,194},{136,11,756},{136,0 ,1000},{5,11,453},{134,11,441},{4,0,101},{5,0,833},{7,0,1171},{136,0,744},{133,0 ,726},{136,10,746},{138,0,176},{6,0,9},{6,0,397},{7,0,53},{7,0,1742},{10,0,632}, {11,0,828},{140,0,146},{135,11,22},{145,11,64},{132,0,839},{11,0,417},{12,0,223} ,{140,0,265},{4,11,102},{7,11,815},{7,11,1699},{139,11,964},{5,10,955},{136,10, 814},{6,0,1931},{6,0,2007},{18,0,246},{146,0,247},{8,0,198},{11,0,29},{140,0,534 },{135,0,1771},{6,0,846},{7,11,1010},{11,11,733},{11,11,759},{12,11,563},{13,11, 34},{14,11,101},{18,11,45},{146,11,129},{4,0,186},{5,0,157},{8,0,168},{138,0,6}, {132,11,899},{133,10,56},{148,10,100},{133,0,875},{5,0,773},{5,0,991},{6,0,1635} ,{134,0,1788},{6,0,1274},{9,0,477},{141,0,78},{4,0,639},{7,0,111},{8,0,581},{12, 0,177},{6,11,52},{9,11,104},{9,11,559},{10,10,4},{10,10,13},{11,10,638},{12,11, 308},{19,11,87},{148,10,57},{132,11,604},{4,11,301},{133,10,738},{133,10,758},{ 134,0,1747},{7,11,1440},{11,11,854},{11,11,872},{11,11,921},{12,11,551},{13,11, 472},{142,11,367},{7,0,1364},{7,0,1907},{141,0,158},{134,0,873},{4,0,404},{4,0, 659},{7,0,552},{135,0,675},{135,10,1112},{139,10,328},{7,11,508},{137,10,133},{ 133,0,391},{5,10,110},{6,10,169},{6,10,1702},{7,10,400},{8,10,538},{9,10,184},{9 ,10,524},{140,10,218},{6,11,310},{7,11,1849},{8,11,72},{8,11,272},{8,11,431},{9, 11,12},{9,11,351},{10,11,563},{10,11,630},{10,11,810},{11,11,367},{11,11,599},{ 11,11,686},{140,11,672},{5,0,540},{6,0,1697},{136,0,668},{132,0,883},{134,0,78}, {12,0,628},{18,0,79},{6,10,133},{9,10,353},{139,10,993},{6,11,181},{7,11,537},{8 ,11,64},{9,11,127},{10,11,496},{12,11,510},{141,11,384},{6,10,93},{7,10,1422},{7 ,10,1851},{8,10,673},{9,10,529},{140,10,43},{137,10,371},{134,0,1460},{134,0,962 },{4,11,244},{135,11,233},{9,10,25},{10,10,467},{138,10,559},{4,10,335},{135,10, 942},{133,0,460},{135,11,334},{134,11,1650},{4,0,199},{139,0,34},{5,10,601},{8, 10,39},{10,10,773},{11,10,84},{12,10,205},{142,10,1},{133,10,870},{134,0,388},{ 14,0,474},{148,0,120},{133,11,369},{139,0,271},{4,0,511},{9,0,333},{9,0,379},{10 ,0,602},{11,0,441},{11,0,723},{11,0,976},{12,0,357},{132,10,181},{134,0,608},{ 134,10,1652},{22,0,49},{137,11,338},{140,0,988},{134,0,617},{5,0,938},{136,0,707 },{132,10,97},{5,10,147},{6,10,286},{7,10,1362},{141,10,176},{6,0,756},{134,0, 1149},{133,11,896},{6,10,375},{7,10,169},{7,10,254},{136,10,780},{134,0,1583},{ 135,10,1447},{139,0,285},{7,11,1117},{8,11,393},{136,11,539},{135,0,344},{6,0, 469},{7,0,1709},{138,0,515},{5,10,629},{135,10,1549},{5,11,4},{5,11,810},{6,11, 13},{6,11,538},{6,11,1690},{6,11,1726},{7,11,499},{7,11,1819},{8,11,148},{8,11, 696},{8,11,791},{12,11,125},{13,11,54},{143,11,9},{135,11,1268},{137,0,404},{132 ,0,500},{5,0,68},{134,0,383},{11,0,216},{139,0,340},{4,11,925},{5,11,803},{8,11, 698},{138,11,828},{4,0,337},{6,0,353},{7,0,1934},{8,0,488},{137,0,429},{7,0,236} ,{7,0,1795},{8,0,259},{9,0,135},{9,0,177},{9,0,860},{10,0,825},{11,0,115},{11,0, 370},{11,0,405},{11,0,604},{12,0,10},{12,0,667},{12,0,669},{13,0,76},{14,0,310}, {15,0,76},{15,0,147},{148,0,23},{4,0,15},{4,0,490},{5,0,22},{6,0,244},{7,0,40},{ 7,0,200},{7,0,906},{7,0,1199},{9,0,616},{10,0,716},{11,0,635},{11,0,801},{140,0, 458},{12,0,756},{132,10,420},{134,0,1504},{6,0,757},{133,11,383},{6,0,1266},{135 ,0,1735},{5,0,598},{7,0,791},{8,0,108},{9,0,123},{7,10,1570},{140,10,542},{142, 11,410},{9,11,660},{138,11,347} }; #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_STATIC_DICT_LUT_H_ */ dvisvgm-2.8.1/libs/brotli/enc/histogram.c0000664000175000017500000000623313510660062015261 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Build per-context histograms of literals, commands and distance codes. */ #include "./histogram.h" #include "../common/context.h" #include "./block_splitter.h" #include "./command.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct BlockSplitIterator { const BlockSplit* split_; /* Not owned. */ size_t idx_; size_t type_; size_t length_; } BlockSplitIterator; static void InitBlockSplitIterator(BlockSplitIterator* self, const BlockSplit* split) { self->split_ = split; self->idx_ = 0; self->type_ = 0; self->length_ = split->lengths ? split->lengths[0] : 0; } static void BlockSplitIteratorNext(BlockSplitIterator* self) { if (self->length_ == 0) { ++self->idx_; self->type_ = self->split_->types[self->idx_]; self->length_ = self->split_->lengths[self->idx_]; } --self->length_; } void BrotliBuildHistogramsWithContext( const Command* cmds, const size_t num_commands, const BlockSplit* literal_split, const BlockSplit* insert_and_copy_split, const BlockSplit* dist_split, const uint8_t* ringbuffer, size_t start_pos, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, const ContextType* context_modes, HistogramLiteral* literal_histograms, HistogramCommand* insert_and_copy_histograms, HistogramDistance* copy_dist_histograms) { size_t pos = start_pos; BlockSplitIterator literal_it; BlockSplitIterator insert_and_copy_it; BlockSplitIterator dist_it; size_t i; InitBlockSplitIterator(&literal_it, literal_split); InitBlockSplitIterator(&insert_and_copy_it, insert_and_copy_split); InitBlockSplitIterator(&dist_it, dist_split); for (i = 0; i < num_commands; ++i) { const Command* cmd = &cmds[i]; size_t j; BlockSplitIteratorNext(&insert_and_copy_it); HistogramAddCommand(&insert_and_copy_histograms[insert_and_copy_it.type_], cmd->cmd_prefix_); /* TODO: unwrap iterator blocks. */ for (j = cmd->insert_len_; j != 0; --j) { size_t context; BlockSplitIteratorNext(&literal_it); context = literal_it.type_; if (context_modes) { ContextLut lut = BROTLI_CONTEXT_LUT(context_modes[context]); context = (context << BROTLI_LITERAL_CONTEXT_BITS) + BROTLI_CONTEXT(prev_byte, prev_byte2, lut); } HistogramAddLiteral(&literal_histograms[context], ringbuffer[pos & mask]); prev_byte2 = prev_byte; prev_byte = ringbuffer[pos & mask]; ++pos; } pos += CommandCopyLen(cmd); if (CommandCopyLen(cmd)) { prev_byte2 = ringbuffer[(pos - 2) & mask]; prev_byte = ringbuffer[(pos - 1) & mask]; if (cmd->cmd_prefix_ >= 128) { size_t context; BlockSplitIteratorNext(&dist_it); context = (dist_it.type_ << BROTLI_DISTANCE_CONTEXT_BITS) + CommandDistanceContext(cmd); HistogramAddDistance(©_dist_histograms[context], cmd->dist_prefix_ & 0x3FF); } } } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/ringbuffer.h0000664000175000017500000001332213510660062015417 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Sliding window over the input data. */ #ifndef BROTLI_ENC_RINGBUFFER_H_ #define BROTLI_ENC_RINGBUFFER_H_ #include /* memcpy */ #include "../common/platform.h" #include #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* A RingBuffer(window_bits, tail_bits) contains `1 << window_bits' bytes of data in a circular manner: writing a byte writes it to: `position() % (1 << window_bits)'. For convenience, the RingBuffer array contains another copy of the first `1 << tail_bits' bytes: buffer_[i] == buffer_[i + (1 << window_bits)], if i < (1 << tail_bits), and another copy of the last two bytes: buffer_[-1] == buffer_[(1 << window_bits) - 1] and buffer_[-2] == buffer_[(1 << window_bits) - 2]. */ typedef struct RingBuffer { /* Size of the ring-buffer is (1 << window_bits) + tail_size_. */ const uint32_t size_; const uint32_t mask_; const uint32_t tail_size_; const uint32_t total_size_; uint32_t cur_size_; /* Position to write in the ring buffer. */ uint32_t pos_; /* The actual ring buffer containing the copy of the last two bytes, the data, and the copy of the beginning as a tail. */ uint8_t* data_; /* The start of the ring-buffer. */ uint8_t* buffer_; } RingBuffer; static BROTLI_INLINE void RingBufferInit(RingBuffer* rb) { rb->cur_size_ = 0; rb->pos_ = 0; rb->data_ = 0; rb->buffer_ = 0; } static BROTLI_INLINE void RingBufferSetup( const BrotliEncoderParams* params, RingBuffer* rb) { int window_bits = ComputeRbBits(params); int tail_bits = params->lgblock; *(uint32_t*)&rb->size_ = 1u << window_bits; *(uint32_t*)&rb->mask_ = (1u << window_bits) - 1; *(uint32_t*)&rb->tail_size_ = 1u << tail_bits; *(uint32_t*)&rb->total_size_ = rb->size_ + rb->tail_size_; } static BROTLI_INLINE void RingBufferFree(MemoryManager* m, RingBuffer* rb) { BROTLI_FREE(m, rb->data_); } /* Allocates or re-allocates data_ to the given length + plus some slack region before and after. Fills the slack regions with zeros. */ static BROTLI_INLINE void RingBufferInitBuffer( MemoryManager* m, const uint32_t buflen, RingBuffer* rb) { static const size_t kSlackForEightByteHashingEverywhere = 7; uint8_t* new_data = BROTLI_ALLOC( m, uint8_t, 2 + buflen + kSlackForEightByteHashingEverywhere); size_t i; if (BROTLI_IS_OOM(m)) return; if (rb->data_) { memcpy(new_data, rb->data_, 2 + rb->cur_size_ + kSlackForEightByteHashingEverywhere); BROTLI_FREE(m, rb->data_); } rb->data_ = new_data; rb->cur_size_ = buflen; rb->buffer_ = rb->data_ + 2; rb->buffer_[-2] = rb->buffer_[-1] = 0; for (i = 0; i < kSlackForEightByteHashingEverywhere; ++i) { rb->buffer_[rb->cur_size_ + i] = 0; } } static BROTLI_INLINE void RingBufferWriteTail( const uint8_t* bytes, size_t n, RingBuffer* rb) { const size_t masked_pos = rb->pos_ & rb->mask_; if (BROTLI_PREDICT_FALSE(masked_pos < rb->tail_size_)) { /* Just fill the tail buffer with the beginning data. */ const size_t p = rb->size_ + masked_pos; memcpy(&rb->buffer_[p], bytes, BROTLI_MIN(size_t, n, rb->tail_size_ - masked_pos)); } } /* Push bytes into the ring buffer. */ static BROTLI_INLINE void RingBufferWrite( MemoryManager* m, const uint8_t* bytes, size_t n, RingBuffer* rb) { if (rb->pos_ == 0 && n < rb->tail_size_) { /* Special case for the first write: to process the first block, we don't need to allocate the whole ring-buffer and we don't need the tail either. However, we do this memory usage optimization only if the first write is less than the tail size, which is also the input block size, otherwise it is likely that other blocks will follow and we will need to reallocate to the full size anyway. */ rb->pos_ = (uint32_t)n; RingBufferInitBuffer(m, rb->pos_, rb); if (BROTLI_IS_OOM(m)) return; memcpy(rb->buffer_, bytes, n); return; } if (rb->cur_size_ < rb->total_size_) { /* Lazily allocate the full buffer. */ RingBufferInitBuffer(m, rb->total_size_, rb); if (BROTLI_IS_OOM(m)) return; /* Initialize the last two bytes to zero, so that we don't have to worry later when we copy the last two bytes to the first two positions. */ rb->buffer_[rb->size_ - 2] = 0; rb->buffer_[rb->size_ - 1] = 0; } { const size_t masked_pos = rb->pos_ & rb->mask_; /* The length of the writes is limited so that we do not need to worry about a write */ RingBufferWriteTail(bytes, n, rb); if (BROTLI_PREDICT_TRUE(masked_pos + n <= rb->size_)) { /* A single write fits. */ memcpy(&rb->buffer_[masked_pos], bytes, n); } else { /* Split into two writes. Copy into the end of the buffer, including the tail buffer. */ memcpy(&rb->buffer_[masked_pos], bytes, BROTLI_MIN(size_t, n, rb->total_size_ - masked_pos)); /* Copy into the beginning of the buffer */ memcpy(&rb->buffer_[0], bytes + (rb->size_ - masked_pos), n - (rb->size_ - masked_pos)); } } { BROTLI_BOOL not_first_lap = (rb->pos_ & (1u << 31)) != 0; uint32_t rb_pos_mask = (1u << 31) - 1; rb->buffer_[-2] = rb->buffer_[rb->size_ - 2]; rb->buffer_[-1] = rb->buffer_[rb->size_ - 1]; rb->pos_ = (rb->pos_ & rb_pos_mask) + (uint32_t)(n & rb_pos_mask); if (not_first_lap) { /* Wrap, but preserve not-a-first-lap feature. */ rb->pos_ |= 1u << 31; } } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_RINGBUFFER_H_ */ dvisvgm-2.8.1/libs/brotli/enc/cluster.c0000664000175000017500000000273413510660062014747 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions for clustering similar histograms together. */ #include "./cluster.h" #include "../common/platform.h" #include #include "./bit_cost.h" /* BrotliPopulationCost */ #include "./fast_log.h" #include "./histogram.h" #include "./memory.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static BROTLI_INLINE BROTLI_BOOL HistogramPairIsLess( const HistogramPair* p1, const HistogramPair* p2) { if (p1->cost_diff != p2->cost_diff) { return TO_BROTLI_BOOL(p1->cost_diff > p2->cost_diff); } return TO_BROTLI_BOOL((p1->idx2 - p1->idx1) > (p2->idx2 - p2->idx1)); } /* Returns entropy reduction of the context map when we combine two clusters. */ static BROTLI_INLINE double ClusterCostDiff(size_t size_a, size_t size_b) { size_t size_c = size_a + size_b; return (double)size_a * FastLog2(size_a) + (double)size_b * FastLog2(size_b) - (double)size_c * FastLog2(size_c); } #define CODE(X) X #define FN(X) X ## Literal #include "./cluster_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Command #include "./cluster_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Distance #include "./cluster_inc.h" /* NOLINT(build/include) */ #undef FN #undef CODE #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/entropy_encode_static.h0000664000175000017500000010020413510660062017646 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Static entropy codes used for faster meta-block encoding. */ #ifndef BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_ #define BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_ #include "../common/constants.h" #include "../common/platform.h" #include #include "./write_bits.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif static const uint8_t kCodeLengthDepth[18] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 0, 4, 4, }; static const uint8_t kStaticCommandCodeDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, }; static const uint8_t kStaticDistanceCodeDepth[64] = { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, }; static const uint32_t kCodeLengthBits[18] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 15, 31, 0, 11, 7, }; static BROTLI_INLINE void StoreStaticCodeLengthCode( size_t* storage_ix, uint8_t* storage) { BrotliWriteBits( 40, BROTLI_MAKE_UINT64_T(0x0000FFu, 0x55555554u), storage_ix, storage); } static const uint64_t kZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0x00000000, 0x00000000, 0x00000000, 0x00000007, 0x00000017, 0x00000027, 0x00000037, 0x00000047, 0x00000057, 0x00000067, 0x00000077, 0x00000770, 0x00000b87, 0x00001387, 0x00001b87, 0x00002387, 0x00002b87, 0x00003387, 0x00003b87, 0x00000397, 0x00000b97, 0x00001397, 0x00001b97, 0x00002397, 0x00002b97, 0x00003397, 0x00003b97, 0x000003a7, 0x00000ba7, 0x000013a7, 0x00001ba7, 0x000023a7, 0x00002ba7, 0x000033a7, 0x00003ba7, 0x000003b7, 0x00000bb7, 0x000013b7, 0x00001bb7, 0x000023b7, 0x00002bb7, 0x000033b7, 0x00003bb7, 0x000003c7, 0x00000bc7, 0x000013c7, 0x00001bc7, 0x000023c7, 0x00002bc7, 0x000033c7, 0x00003bc7, 0x000003d7, 0x00000bd7, 0x000013d7, 0x00001bd7, 0x000023d7, 0x00002bd7, 0x000033d7, 0x00003bd7, 0x000003e7, 0x00000be7, 0x000013e7, 0x00001be7, 0x000023e7, 0x00002be7, 0x000033e7, 0x00003be7, 0x000003f7, 0x00000bf7, 0x000013f7, 0x00001bf7, 0x000023f7, 0x00002bf7, 0x000033f7, 0x00003bf7, 0x0001c387, 0x0005c387, 0x0009c387, 0x000dc387, 0x0011c387, 0x0015c387, 0x0019c387, 0x001dc387, 0x0001cb87, 0x0005cb87, 0x0009cb87, 0x000dcb87, 0x0011cb87, 0x0015cb87, 0x0019cb87, 0x001dcb87, 0x0001d387, 0x0005d387, 0x0009d387, 0x000dd387, 0x0011d387, 0x0015d387, 0x0019d387, 0x001dd387, 0x0001db87, 0x0005db87, 0x0009db87, 0x000ddb87, 0x0011db87, 0x0015db87, 0x0019db87, 0x001ddb87, 0x0001e387, 0x0005e387, 0x0009e387, 0x000de387, 0x0011e387, 0x0015e387, 0x0019e387, 0x001de387, 0x0001eb87, 0x0005eb87, 0x0009eb87, 0x000deb87, 0x0011eb87, 0x0015eb87, 0x0019eb87, 0x001deb87, 0x0001f387, 0x0005f387, 0x0009f387, 0x000df387, 0x0011f387, 0x0015f387, 0x0019f387, 0x001df387, 0x0001fb87, 0x0005fb87, 0x0009fb87, 0x000dfb87, 0x0011fb87, 0x0015fb87, 0x0019fb87, 0x001dfb87, 0x0001c397, 0x0005c397, 0x0009c397, 0x000dc397, 0x0011c397, 0x0015c397, 0x0019c397, 0x001dc397, 0x0001cb97, 0x0005cb97, 0x0009cb97, 0x000dcb97, 0x0011cb97, 0x0015cb97, 0x0019cb97, 0x001dcb97, 0x0001d397, 0x0005d397, 0x0009d397, 0x000dd397, 0x0011d397, 0x0015d397, 0x0019d397, 0x001dd397, 0x0001db97, 0x0005db97, 0x0009db97, 0x000ddb97, 0x0011db97, 0x0015db97, 0x0019db97, 0x001ddb97, 0x0001e397, 0x0005e397, 0x0009e397, 0x000de397, 0x0011e397, 0x0015e397, 0x0019e397, 0x001de397, 0x0001eb97, 0x0005eb97, 0x0009eb97, 0x000deb97, 0x0011eb97, 0x0015eb97, 0x0019eb97, 0x001deb97, 0x0001f397, 0x0005f397, 0x0009f397, 0x000df397, 0x0011f397, 0x0015f397, 0x0019f397, 0x001df397, 0x0001fb97, 0x0005fb97, 0x0009fb97, 0x000dfb97, 0x0011fb97, 0x0015fb97, 0x0019fb97, 0x001dfb97, 0x0001c3a7, 0x0005c3a7, 0x0009c3a7, 0x000dc3a7, 0x0011c3a7, 0x0015c3a7, 0x0019c3a7, 0x001dc3a7, 0x0001cba7, 0x0005cba7, 0x0009cba7, 0x000dcba7, 0x0011cba7, 0x0015cba7, 0x0019cba7, 0x001dcba7, 0x0001d3a7, 0x0005d3a7, 0x0009d3a7, 0x000dd3a7, 0x0011d3a7, 0x0015d3a7, 0x0019d3a7, 0x001dd3a7, 0x0001dba7, 0x0005dba7, 0x0009dba7, 0x000ddba7, 0x0011dba7, 0x0015dba7, 0x0019dba7, 0x001ddba7, 0x0001e3a7, 0x0005e3a7, 0x0009e3a7, 0x000de3a7, 0x0011e3a7, 0x0015e3a7, 0x0019e3a7, 0x001de3a7, 0x0001eba7, 0x0005eba7, 0x0009eba7, 0x000deba7, 0x0011eba7, 0x0015eba7, 0x0019eba7, 0x001deba7, 0x0001f3a7, 0x0005f3a7, 0x0009f3a7, 0x000df3a7, 0x0011f3a7, 0x0015f3a7, 0x0019f3a7, 0x001df3a7, 0x0001fba7, 0x0005fba7, 0x0009fba7, 0x000dfba7, 0x0011fba7, 0x0015fba7, 0x0019fba7, 0x001dfba7, 0x0001c3b7, 0x0005c3b7, 0x0009c3b7, 0x000dc3b7, 0x0011c3b7, 0x0015c3b7, 0x0019c3b7, 0x001dc3b7, 0x0001cbb7, 0x0005cbb7, 0x0009cbb7, 0x000dcbb7, 0x0011cbb7, 0x0015cbb7, 0x0019cbb7, 0x001dcbb7, 0x0001d3b7, 0x0005d3b7, 0x0009d3b7, 0x000dd3b7, 0x0011d3b7, 0x0015d3b7, 0x0019d3b7, 0x001dd3b7, 0x0001dbb7, 0x0005dbb7, 0x0009dbb7, 0x000ddbb7, 0x0011dbb7, 0x0015dbb7, 0x0019dbb7, 0x001ddbb7, 0x0001e3b7, 0x0005e3b7, 0x0009e3b7, 0x000de3b7, 0x0011e3b7, 0x0015e3b7, 0x0019e3b7, 0x001de3b7, 0x0001ebb7, 0x0005ebb7, 0x0009ebb7, 0x000debb7, 0x0011ebb7, 0x0015ebb7, 0x0019ebb7, 0x001debb7, 0x0001f3b7, 0x0005f3b7, 0x0009f3b7, 0x000df3b7, 0x0011f3b7, 0x0015f3b7, 0x0019f3b7, 0x001df3b7, 0x0001fbb7, 0x0005fbb7, 0x0009fbb7, 0x000dfbb7, 0x0011fbb7, 0x0015fbb7, 0x0019fbb7, 0x001dfbb7, 0x0001c3c7, 0x0005c3c7, 0x0009c3c7, 0x000dc3c7, 0x0011c3c7, 0x0015c3c7, 0x0019c3c7, 0x001dc3c7, 0x0001cbc7, 0x0005cbc7, 0x0009cbc7, 0x000dcbc7, 0x0011cbc7, 0x0015cbc7, 0x0019cbc7, 0x001dcbc7, 0x0001d3c7, 0x0005d3c7, 0x0009d3c7, 0x000dd3c7, 0x0011d3c7, 0x0015d3c7, 0x0019d3c7, 0x001dd3c7, 0x0001dbc7, 0x0005dbc7, 0x0009dbc7, 0x000ddbc7, 0x0011dbc7, 0x0015dbc7, 0x0019dbc7, 0x001ddbc7, 0x0001e3c7, 0x0005e3c7, 0x0009e3c7, 0x000de3c7, 0x0011e3c7, 0x0015e3c7, 0x0019e3c7, 0x001de3c7, 0x0001ebc7, 0x0005ebc7, 0x0009ebc7, 0x000debc7, 0x0011ebc7, 0x0015ebc7, 0x0019ebc7, 0x001debc7, 0x0001f3c7, 0x0005f3c7, 0x0009f3c7, 0x000df3c7, 0x0011f3c7, 0x0015f3c7, 0x0019f3c7, 0x001df3c7, 0x0001fbc7, 0x0005fbc7, 0x0009fbc7, 0x000dfbc7, 0x0011fbc7, 0x0015fbc7, 0x0019fbc7, 0x001dfbc7, 0x0001c3d7, 0x0005c3d7, 0x0009c3d7, 0x000dc3d7, 0x0011c3d7, 0x0015c3d7, 0x0019c3d7, 0x001dc3d7, 0x0001cbd7, 0x0005cbd7, 0x0009cbd7, 0x000dcbd7, 0x0011cbd7, 0x0015cbd7, 0x0019cbd7, 0x001dcbd7, 0x0001d3d7, 0x0005d3d7, 0x0009d3d7, 0x000dd3d7, 0x0011d3d7, 0x0015d3d7, 0x0019d3d7, 0x001dd3d7, 0x0001dbd7, 0x0005dbd7, 0x0009dbd7, 0x000ddbd7, 0x0011dbd7, 0x0015dbd7, 0x0019dbd7, 0x001ddbd7, 0x0001e3d7, 0x0005e3d7, 0x0009e3d7, 0x000de3d7, 0x0011e3d7, 0x0015e3d7, 0x0019e3d7, 0x001de3d7, 0x0001ebd7, 0x0005ebd7, 0x0009ebd7, 0x000debd7, 0x0011ebd7, 0x0015ebd7, 0x0019ebd7, 0x001debd7, 0x0001f3d7, 0x0005f3d7, 0x0009f3d7, 0x000df3d7, 0x0011f3d7, 0x0015f3d7, 0x0019f3d7, 0x001df3d7, 0x0001fbd7, 0x0005fbd7, 0x0009fbd7, 0x000dfbd7, 0x0011fbd7, 0x0015fbd7, 0x0019fbd7, 0x001dfbd7, 0x0001c3e7, 0x0005c3e7, 0x0009c3e7, 0x000dc3e7, 0x0011c3e7, 0x0015c3e7, 0x0019c3e7, 0x001dc3e7, 0x0001cbe7, 0x0005cbe7, 0x0009cbe7, 0x000dcbe7, 0x0011cbe7, 0x0015cbe7, 0x0019cbe7, 0x001dcbe7, 0x0001d3e7, 0x0005d3e7, 0x0009d3e7, 0x000dd3e7, 0x0011d3e7, 0x0015d3e7, 0x0019d3e7, 0x001dd3e7, 0x0001dbe7, 0x0005dbe7, 0x0009dbe7, 0x000ddbe7, 0x0011dbe7, 0x0015dbe7, 0x0019dbe7, 0x001ddbe7, 0x0001e3e7, 0x0005e3e7, 0x0009e3e7, 0x000de3e7, 0x0011e3e7, 0x0015e3e7, 0x0019e3e7, 0x001de3e7, 0x0001ebe7, 0x0005ebe7, 0x0009ebe7, 0x000debe7, 0x0011ebe7, 0x0015ebe7, 0x0019ebe7, 0x001debe7, 0x0001f3e7, 0x0005f3e7, 0x0009f3e7, 0x000df3e7, 0x0011f3e7, 0x0015f3e7, 0x0019f3e7, 0x001df3e7, 0x0001fbe7, 0x0005fbe7, 0x0009fbe7, 0x000dfbe7, 0x0011fbe7, 0x0015fbe7, 0x0019fbe7, 0x001dfbe7, 0x0001c3f7, 0x0005c3f7, 0x0009c3f7, 0x000dc3f7, 0x0011c3f7, 0x0015c3f7, 0x0019c3f7, 0x001dc3f7, 0x0001cbf7, 0x0005cbf7, 0x0009cbf7, 0x000dcbf7, 0x0011cbf7, 0x0015cbf7, 0x0019cbf7, 0x001dcbf7, 0x0001d3f7, 0x0005d3f7, 0x0009d3f7, 0x000dd3f7, 0x0011d3f7, 0x0015d3f7, 0x0019d3f7, 0x001dd3f7, 0x0001dbf7, 0x0005dbf7, 0x0009dbf7, 0x000ddbf7, 0x0011dbf7, 0x0015dbf7, 0x0019dbf7, 0x001ddbf7, 0x0001e3f7, 0x0005e3f7, 0x0009e3f7, 0x000de3f7, 0x0011e3f7, 0x0015e3f7, 0x0019e3f7, 0x001de3f7, 0x0001ebf7, 0x0005ebf7, 0x0009ebf7, 0x000debf7, 0x0011ebf7, 0x0015ebf7, 0x0019ebf7, 0x001debf7, 0x0001f3f7, 0x0005f3f7, 0x0009f3f7, 0x000df3f7, 0x0011f3f7, 0x0015f3f7, 0x0019f3f7, 0x001df3f7, 0x0001fbf7, 0x0005fbf7, 0x0009fbf7, 0x000dfbf7, 0x0011fbf7, 0x0015fbf7, 0x0019fbf7, 0x001dfbf7, 0x00e1c387, 0x02e1c387, 0x04e1c387, 0x06e1c387, 0x08e1c387, 0x0ae1c387, 0x0ce1c387, 0x0ee1c387, 0x00e5c387, 0x02e5c387, 0x04e5c387, 0x06e5c387, 0x08e5c387, 0x0ae5c387, 0x0ce5c387, 0x0ee5c387, 0x00e9c387, 0x02e9c387, 0x04e9c387, 0x06e9c387, 0x08e9c387, 0x0ae9c387, 0x0ce9c387, 0x0ee9c387, 0x00edc387, 0x02edc387, 0x04edc387, 0x06edc387, 0x08edc387, 0x0aedc387, 0x0cedc387, 0x0eedc387, 0x00f1c387, 0x02f1c387, 0x04f1c387, 0x06f1c387, 0x08f1c387, 0x0af1c387, 0x0cf1c387, 0x0ef1c387, 0x00f5c387, 0x02f5c387, 0x04f5c387, 0x06f5c387, 0x08f5c387, 0x0af5c387, 0x0cf5c387, 0x0ef5c387, 0x00f9c387, 0x02f9c387, 0x04f9c387, 0x06f9c387, 0x08f9c387, 0x0af9c387, 0x0cf9c387, 0x0ef9c387, 0x00fdc387, 0x02fdc387, 0x04fdc387, 0x06fdc387, 0x08fdc387, 0x0afdc387, 0x0cfdc387, 0x0efdc387, 0x00e1cb87, 0x02e1cb87, 0x04e1cb87, 0x06e1cb87, 0x08e1cb87, 0x0ae1cb87, 0x0ce1cb87, 0x0ee1cb87, 0x00e5cb87, 0x02e5cb87, 0x04e5cb87, 0x06e5cb87, 0x08e5cb87, 0x0ae5cb87, 0x0ce5cb87, 0x0ee5cb87, 0x00e9cb87, 0x02e9cb87, 0x04e9cb87, 0x06e9cb87, 0x08e9cb87, 0x0ae9cb87, 0x0ce9cb87, 0x0ee9cb87, 0x00edcb87, 0x02edcb87, 0x04edcb87, 0x06edcb87, 0x08edcb87, 0x0aedcb87, 0x0cedcb87, 0x0eedcb87, 0x00f1cb87, 0x02f1cb87, 0x04f1cb87, 0x06f1cb87, 0x08f1cb87, 0x0af1cb87, 0x0cf1cb87, 0x0ef1cb87, 0x00f5cb87, 0x02f5cb87, 0x04f5cb87, 0x06f5cb87, 0x08f5cb87, 0x0af5cb87, 0x0cf5cb87, 0x0ef5cb87, 0x00f9cb87, 0x02f9cb87, 0x04f9cb87, 0x06f9cb87, 0x08f9cb87, }; static const uint32_t kZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0, 4, 8, 7, 7, 7, 7, 7, 7, 7, 7, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, }; static const uint64_t kNonZeroRepsBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0x0000000b, 0x0000001b, 0x0000002b, 0x0000003b, 0x000002cb, 0x000006cb, 0x00000acb, 0x00000ecb, 0x000002db, 0x000006db, 0x00000adb, 0x00000edb, 0x000002eb, 0x000006eb, 0x00000aeb, 0x00000eeb, 0x000002fb, 0x000006fb, 0x00000afb, 0x00000efb, 0x0000b2cb, 0x0001b2cb, 0x0002b2cb, 0x0003b2cb, 0x0000b6cb, 0x0001b6cb, 0x0002b6cb, 0x0003b6cb, 0x0000bacb, 0x0001bacb, 0x0002bacb, 0x0003bacb, 0x0000becb, 0x0001becb, 0x0002becb, 0x0003becb, 0x0000b2db, 0x0001b2db, 0x0002b2db, 0x0003b2db, 0x0000b6db, 0x0001b6db, 0x0002b6db, 0x0003b6db, 0x0000badb, 0x0001badb, 0x0002badb, 0x0003badb, 0x0000bedb, 0x0001bedb, 0x0002bedb, 0x0003bedb, 0x0000b2eb, 0x0001b2eb, 0x0002b2eb, 0x0003b2eb, 0x0000b6eb, 0x0001b6eb, 0x0002b6eb, 0x0003b6eb, 0x0000baeb, 0x0001baeb, 0x0002baeb, 0x0003baeb, 0x0000beeb, 0x0001beeb, 0x0002beeb, 0x0003beeb, 0x0000b2fb, 0x0001b2fb, 0x0002b2fb, 0x0003b2fb, 0x0000b6fb, 0x0001b6fb, 0x0002b6fb, 0x0003b6fb, 0x0000bafb, 0x0001bafb, 0x0002bafb, 0x0003bafb, 0x0000befb, 0x0001befb, 0x0002befb, 0x0003befb, 0x002cb2cb, 0x006cb2cb, 0x00acb2cb, 0x00ecb2cb, 0x002db2cb, 0x006db2cb, 0x00adb2cb, 0x00edb2cb, 0x002eb2cb, 0x006eb2cb, 0x00aeb2cb, 0x00eeb2cb, 0x002fb2cb, 0x006fb2cb, 0x00afb2cb, 0x00efb2cb, 0x002cb6cb, 0x006cb6cb, 0x00acb6cb, 0x00ecb6cb, 0x002db6cb, 0x006db6cb, 0x00adb6cb, 0x00edb6cb, 0x002eb6cb, 0x006eb6cb, 0x00aeb6cb, 0x00eeb6cb, 0x002fb6cb, 0x006fb6cb, 0x00afb6cb, 0x00efb6cb, 0x002cbacb, 0x006cbacb, 0x00acbacb, 0x00ecbacb, 0x002dbacb, 0x006dbacb, 0x00adbacb, 0x00edbacb, 0x002ebacb, 0x006ebacb, 0x00aebacb, 0x00eebacb, 0x002fbacb, 0x006fbacb, 0x00afbacb, 0x00efbacb, 0x002cbecb, 0x006cbecb, 0x00acbecb, 0x00ecbecb, 0x002dbecb, 0x006dbecb, 0x00adbecb, 0x00edbecb, 0x002ebecb, 0x006ebecb, 0x00aebecb, 0x00eebecb, 0x002fbecb, 0x006fbecb, 0x00afbecb, 0x00efbecb, 0x002cb2db, 0x006cb2db, 0x00acb2db, 0x00ecb2db, 0x002db2db, 0x006db2db, 0x00adb2db, 0x00edb2db, 0x002eb2db, 0x006eb2db, 0x00aeb2db, 0x00eeb2db, 0x002fb2db, 0x006fb2db, 0x00afb2db, 0x00efb2db, 0x002cb6db, 0x006cb6db, 0x00acb6db, 0x00ecb6db, 0x002db6db, 0x006db6db, 0x00adb6db, 0x00edb6db, 0x002eb6db, 0x006eb6db, 0x00aeb6db, 0x00eeb6db, 0x002fb6db, 0x006fb6db, 0x00afb6db, 0x00efb6db, 0x002cbadb, 0x006cbadb, 0x00acbadb, 0x00ecbadb, 0x002dbadb, 0x006dbadb, 0x00adbadb, 0x00edbadb, 0x002ebadb, 0x006ebadb, 0x00aebadb, 0x00eebadb, 0x002fbadb, 0x006fbadb, 0x00afbadb, 0x00efbadb, 0x002cbedb, 0x006cbedb, 0x00acbedb, 0x00ecbedb, 0x002dbedb, 0x006dbedb, 0x00adbedb, 0x00edbedb, 0x002ebedb, 0x006ebedb, 0x00aebedb, 0x00eebedb, 0x002fbedb, 0x006fbedb, 0x00afbedb, 0x00efbedb, 0x002cb2eb, 0x006cb2eb, 0x00acb2eb, 0x00ecb2eb, 0x002db2eb, 0x006db2eb, 0x00adb2eb, 0x00edb2eb, 0x002eb2eb, 0x006eb2eb, 0x00aeb2eb, 0x00eeb2eb, 0x002fb2eb, 0x006fb2eb, 0x00afb2eb, 0x00efb2eb, 0x002cb6eb, 0x006cb6eb, 0x00acb6eb, 0x00ecb6eb, 0x002db6eb, 0x006db6eb, 0x00adb6eb, 0x00edb6eb, 0x002eb6eb, 0x006eb6eb, 0x00aeb6eb, 0x00eeb6eb, 0x002fb6eb, 0x006fb6eb, 0x00afb6eb, 0x00efb6eb, 0x002cbaeb, 0x006cbaeb, 0x00acbaeb, 0x00ecbaeb, 0x002dbaeb, 0x006dbaeb, 0x00adbaeb, 0x00edbaeb, 0x002ebaeb, 0x006ebaeb, 0x00aebaeb, 0x00eebaeb, 0x002fbaeb, 0x006fbaeb, 0x00afbaeb, 0x00efbaeb, 0x002cbeeb, 0x006cbeeb, 0x00acbeeb, 0x00ecbeeb, 0x002dbeeb, 0x006dbeeb, 0x00adbeeb, 0x00edbeeb, 0x002ebeeb, 0x006ebeeb, 0x00aebeeb, 0x00eebeeb, 0x002fbeeb, 0x006fbeeb, 0x00afbeeb, 0x00efbeeb, 0x002cb2fb, 0x006cb2fb, 0x00acb2fb, 0x00ecb2fb, 0x002db2fb, 0x006db2fb, 0x00adb2fb, 0x00edb2fb, 0x002eb2fb, 0x006eb2fb, 0x00aeb2fb, 0x00eeb2fb, 0x002fb2fb, 0x006fb2fb, 0x00afb2fb, 0x00efb2fb, 0x002cb6fb, 0x006cb6fb, 0x00acb6fb, 0x00ecb6fb, 0x002db6fb, 0x006db6fb, 0x00adb6fb, 0x00edb6fb, 0x002eb6fb, 0x006eb6fb, 0x00aeb6fb, 0x00eeb6fb, 0x002fb6fb, 0x006fb6fb, 0x00afb6fb, 0x00efb6fb, 0x002cbafb, 0x006cbafb, 0x00acbafb, 0x00ecbafb, 0x002dbafb, 0x006dbafb, 0x00adbafb, 0x00edbafb, 0x002ebafb, 0x006ebafb, 0x00aebafb, 0x00eebafb, 0x002fbafb, 0x006fbafb, 0x00afbafb, 0x00efbafb, 0x002cbefb, 0x006cbefb, 0x00acbefb, 0x00ecbefb, 0x002dbefb, 0x006dbefb, 0x00adbefb, 0x00edbefb, 0x002ebefb, 0x006ebefb, 0x00aebefb, 0x00eebefb, 0x002fbefb, 0x006fbefb, 0x00afbefb, 0x00efbefb, 0x0b2cb2cb, 0x1b2cb2cb, 0x2b2cb2cb, 0x3b2cb2cb, 0x0b6cb2cb, 0x1b6cb2cb, 0x2b6cb2cb, 0x3b6cb2cb, 0x0bacb2cb, 0x1bacb2cb, 0x2bacb2cb, 0x3bacb2cb, 0x0becb2cb, 0x1becb2cb, 0x2becb2cb, 0x3becb2cb, 0x0b2db2cb, 0x1b2db2cb, 0x2b2db2cb, 0x3b2db2cb, 0x0b6db2cb, 0x1b6db2cb, 0x2b6db2cb, 0x3b6db2cb, 0x0badb2cb, 0x1badb2cb, 0x2badb2cb, 0x3badb2cb, 0x0bedb2cb, 0x1bedb2cb, 0x2bedb2cb, 0x3bedb2cb, 0x0b2eb2cb, 0x1b2eb2cb, 0x2b2eb2cb, 0x3b2eb2cb, 0x0b6eb2cb, 0x1b6eb2cb, 0x2b6eb2cb, 0x3b6eb2cb, 0x0baeb2cb, 0x1baeb2cb, 0x2baeb2cb, 0x3baeb2cb, 0x0beeb2cb, 0x1beeb2cb, 0x2beeb2cb, 0x3beeb2cb, 0x0b2fb2cb, 0x1b2fb2cb, 0x2b2fb2cb, 0x3b2fb2cb, 0x0b6fb2cb, 0x1b6fb2cb, 0x2b6fb2cb, 0x3b6fb2cb, 0x0bafb2cb, 0x1bafb2cb, 0x2bafb2cb, 0x3bafb2cb, 0x0befb2cb, 0x1befb2cb, 0x2befb2cb, 0x3befb2cb, 0x0b2cb6cb, 0x1b2cb6cb, 0x2b2cb6cb, 0x3b2cb6cb, 0x0b6cb6cb, 0x1b6cb6cb, 0x2b6cb6cb, 0x3b6cb6cb, 0x0bacb6cb, 0x1bacb6cb, 0x2bacb6cb, 0x3bacb6cb, 0x0becb6cb, 0x1becb6cb, 0x2becb6cb, 0x3becb6cb, 0x0b2db6cb, 0x1b2db6cb, 0x2b2db6cb, 0x3b2db6cb, 0x0b6db6cb, 0x1b6db6cb, 0x2b6db6cb, 0x3b6db6cb, 0x0badb6cb, 0x1badb6cb, 0x2badb6cb, 0x3badb6cb, 0x0bedb6cb, 0x1bedb6cb, 0x2bedb6cb, 0x3bedb6cb, 0x0b2eb6cb, 0x1b2eb6cb, 0x2b2eb6cb, 0x3b2eb6cb, 0x0b6eb6cb, 0x1b6eb6cb, 0x2b6eb6cb, 0x3b6eb6cb, 0x0baeb6cb, 0x1baeb6cb, 0x2baeb6cb, 0x3baeb6cb, 0x0beeb6cb, 0x1beeb6cb, 0x2beeb6cb, 0x3beeb6cb, 0x0b2fb6cb, 0x1b2fb6cb, 0x2b2fb6cb, 0x3b2fb6cb, 0x0b6fb6cb, 0x1b6fb6cb, 0x2b6fb6cb, 0x3b6fb6cb, 0x0bafb6cb, 0x1bafb6cb, 0x2bafb6cb, 0x3bafb6cb, 0x0befb6cb, 0x1befb6cb, 0x2befb6cb, 0x3befb6cb, 0x0b2cbacb, 0x1b2cbacb, 0x2b2cbacb, 0x3b2cbacb, 0x0b6cbacb, 0x1b6cbacb, 0x2b6cbacb, 0x3b6cbacb, 0x0bacbacb, 0x1bacbacb, 0x2bacbacb, 0x3bacbacb, 0x0becbacb, 0x1becbacb, 0x2becbacb, 0x3becbacb, 0x0b2dbacb, 0x1b2dbacb, 0x2b2dbacb, 0x3b2dbacb, 0x0b6dbacb, 0x1b6dbacb, 0x2b6dbacb, 0x3b6dbacb, 0x0badbacb, 0x1badbacb, 0x2badbacb, 0x3badbacb, 0x0bedbacb, 0x1bedbacb, 0x2bedbacb, 0x3bedbacb, 0x0b2ebacb, 0x1b2ebacb, 0x2b2ebacb, 0x3b2ebacb, 0x0b6ebacb, 0x1b6ebacb, 0x2b6ebacb, 0x3b6ebacb, 0x0baebacb, 0x1baebacb, 0x2baebacb, 0x3baebacb, 0x0beebacb, 0x1beebacb, 0x2beebacb, 0x3beebacb, 0x0b2fbacb, 0x1b2fbacb, 0x2b2fbacb, 0x3b2fbacb, 0x0b6fbacb, 0x1b6fbacb, 0x2b6fbacb, 0x3b6fbacb, 0x0bafbacb, 0x1bafbacb, 0x2bafbacb, 0x3bafbacb, 0x0befbacb, 0x1befbacb, 0x2befbacb, 0x3befbacb, 0x0b2cbecb, 0x1b2cbecb, 0x2b2cbecb, 0x3b2cbecb, 0x0b6cbecb, 0x1b6cbecb, 0x2b6cbecb, 0x3b6cbecb, 0x0bacbecb, 0x1bacbecb, 0x2bacbecb, 0x3bacbecb, 0x0becbecb, 0x1becbecb, 0x2becbecb, 0x3becbecb, 0x0b2dbecb, 0x1b2dbecb, 0x2b2dbecb, 0x3b2dbecb, 0x0b6dbecb, 0x1b6dbecb, 0x2b6dbecb, 0x3b6dbecb, 0x0badbecb, 0x1badbecb, 0x2badbecb, 0x3badbecb, 0x0bedbecb, 0x1bedbecb, 0x2bedbecb, 0x3bedbecb, 0x0b2ebecb, 0x1b2ebecb, 0x2b2ebecb, 0x3b2ebecb, 0x0b6ebecb, 0x1b6ebecb, 0x2b6ebecb, 0x3b6ebecb, 0x0baebecb, 0x1baebecb, 0x2baebecb, 0x3baebecb, 0x0beebecb, 0x1beebecb, 0x2beebecb, 0x3beebecb, 0x0b2fbecb, 0x1b2fbecb, 0x2b2fbecb, 0x3b2fbecb, 0x0b6fbecb, 0x1b6fbecb, 0x2b6fbecb, 0x3b6fbecb, 0x0bafbecb, 0x1bafbecb, 0x2bafbecb, 0x3bafbecb, 0x0befbecb, 0x1befbecb, 0x2befbecb, 0x3befbecb, 0x0b2cb2db, 0x1b2cb2db, 0x2b2cb2db, 0x3b2cb2db, 0x0b6cb2db, 0x1b6cb2db, 0x2b6cb2db, 0x3b6cb2db, 0x0bacb2db, 0x1bacb2db, 0x2bacb2db, 0x3bacb2db, 0x0becb2db, 0x1becb2db, 0x2becb2db, 0x3becb2db, 0x0b2db2db, 0x1b2db2db, 0x2b2db2db, 0x3b2db2db, 0x0b6db2db, 0x1b6db2db, 0x2b6db2db, 0x3b6db2db, 0x0badb2db, 0x1badb2db, 0x2badb2db, 0x3badb2db, 0x0bedb2db, 0x1bedb2db, 0x2bedb2db, 0x3bedb2db, 0x0b2eb2db, 0x1b2eb2db, 0x2b2eb2db, 0x3b2eb2db, 0x0b6eb2db, 0x1b6eb2db, 0x2b6eb2db, 0x3b6eb2db, 0x0baeb2db, 0x1baeb2db, 0x2baeb2db, 0x3baeb2db, 0x0beeb2db, 0x1beeb2db, 0x2beeb2db, 0x3beeb2db, 0x0b2fb2db, 0x1b2fb2db, 0x2b2fb2db, 0x3b2fb2db, 0x0b6fb2db, 0x1b6fb2db, 0x2b6fb2db, 0x3b6fb2db, 0x0bafb2db, 0x1bafb2db, 0x2bafb2db, 0x3bafb2db, 0x0befb2db, 0x1befb2db, 0x2befb2db, 0x3befb2db, 0x0b2cb6db, 0x1b2cb6db, 0x2b2cb6db, 0x3b2cb6db, 0x0b6cb6db, 0x1b6cb6db, 0x2b6cb6db, 0x3b6cb6db, 0x0bacb6db, 0x1bacb6db, 0x2bacb6db, 0x3bacb6db, 0x0becb6db, 0x1becb6db, 0x2becb6db, 0x3becb6db, 0x0b2db6db, 0x1b2db6db, 0x2b2db6db, 0x3b2db6db, 0x0b6db6db, 0x1b6db6db, 0x2b6db6db, 0x3b6db6db, 0x0badb6db, 0x1badb6db, 0x2badb6db, 0x3badb6db, 0x0bedb6db, 0x1bedb6db, 0x2bedb6db, 0x3bedb6db, 0x0b2eb6db, 0x1b2eb6db, 0x2b2eb6db, 0x3b2eb6db, 0x0b6eb6db, 0x1b6eb6db, 0x2b6eb6db, 0x3b6eb6db, 0x0baeb6db, 0x1baeb6db, 0x2baeb6db, 0x3baeb6db, }; static const uint32_t kNonZeroRepsDepth[BROTLI_NUM_COMMAND_SYMBOLS] = { 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, }; static const uint16_t kStaticCommandCodeBits[BROTLI_NUM_COMMAND_SYMBOLS] = { 0, 256, 128, 384, 64, 320, 192, 448, 32, 288, 160, 416, 96, 352, 224, 480, 16, 272, 144, 400, 80, 336, 208, 464, 48, 304, 176, 432, 112, 368, 240, 496, 8, 264, 136, 392, 72, 328, 200, 456, 40, 296, 168, 424, 104, 360, 232, 488, 24, 280, 152, 408, 88, 344, 216, 472, 56, 312, 184, 440, 120, 376, 248, 504, 4, 260, 132, 388, 68, 324, 196, 452, 36, 292, 164, 420, 100, 356, 228, 484, 20, 276, 148, 404, 84, 340, 212, 468, 52, 308, 180, 436, 116, 372, 244, 500, 12, 268, 140, 396, 76, 332, 204, 460, 44, 300, 172, 428, 108, 364, 236, 492, 28, 284, 156, 412, 92, 348, 220, 476, 60, 316, 188, 444, 124, 380, 252, 508, 2, 258, 130, 386, 66, 322, 194, 450, 34, 290, 162, 418, 98, 354, 226, 482, 18, 274, 146, 402, 82, 338, 210, 466, 50, 306, 178, 434, 114, 370, 242, 498, 10, 266, 138, 394, 74, 330, 202, 458, 42, 298, 170, 426, 106, 362, 234, 490, 26, 282, 154, 410, 90, 346, 218, 474, 58, 314, 186, 442, 122, 378, 250, 506, 6, 262, 134, 390, 70, 326, 198, 454, 38, 294, 166, 422, 102, 358, 230, 486, 22, 278, 150, 406, 86, 342, 214, 470, 54, 310, 182, 438, 118, 374, 246, 502, 14, 270, 142, 398, 78, 334, 206, 462, 46, 302, 174, 430, 110, 366, 238, 494, 30, 286, 158, 414, 94, 350, 222, 478, 62, 318, 190, 446, 126, 382, 254, 510, 1, 257, 129, 385, 65, 321, 193, 449, 33, 289, 161, 417, 97, 353, 225, 481, 17, 273, 145, 401, 81, 337, 209, 465, 49, 305, 177, 433, 113, 369, 241, 497, 9, 265, 137, 393, 73, 329, 201, 457, 41, 297, 169, 425, 105, 361, 233, 489, 25, 281, 153, 409, 89, 345, 217, 473, 57, 313, 185, 441, 121, 377, 249, 505, 5, 261, 133, 389, 69, 325, 197, 453, 37, 293, 165, 421, 101, 357, 229, 485, 21, 277, 149, 405, 85, 341, 213, 469, 53, 309, 181, 437, 117, 373, 245, 501, 13, 269, 141, 397, 77, 333, 205, 461, 45, 301, 173, 429, 109, 365, 237, 493, 29, 285, 157, 413, 93, 349, 221, 477, 61, 317, 189, 445, 125, 381, 253, 509, 3, 259, 131, 387, 67, 323, 195, 451, 35, 291, 163, 419, 99, 355, 227, 483, 19, 275, 147, 403, 83, 339, 211, 467, 51, 307, 179, 435, 115, 371, 243, 499, 11, 267, 139, 395, 75, 331, 203, 459, 43, 299, 171, 427, 107, 363, 235, 491, 27, 283, 155, 411, 91, 347, 219, 475, 59, 315, 187, 443, 123, 379, 251, 507, 7, 1031, 519, 1543, 263, 1287, 775, 1799, 135, 1159, 647, 1671, 391, 1415, 903, 1927, 71, 1095, 583, 1607, 327, 1351, 839, 1863, 199, 1223, 711, 1735, 455, 1479, 967, 1991, 39, 1063, 551, 1575, 295, 1319, 807, 1831, 167, 1191, 679, 1703, 423, 1447, 935, 1959, 103, 1127, 615, 1639, 359, 1383, 871, 1895, 231, 1255, 743, 1767, 487, 1511, 999, 2023, 23, 1047, 535, 1559, 279, 1303, 791, 1815, 151, 1175, 663, 1687, 407, 1431, 919, 1943, 87, 1111, 599, 1623, 343, 1367, 855, 1879, 215, 1239, 727, 1751, 471, 1495, 983, 2007, 55, 1079, 567, 1591, 311, 1335, 823, 1847, 183, 1207, 695, 1719, 439, 1463, 951, 1975, 119, 1143, 631, 1655, 375, 1399, 887, 1911, 247, 1271, 759, 1783, 503, 1527, 1015, 2039, 15, 1039, 527, 1551, 271, 1295, 783, 1807, 143, 1167, 655, 1679, 399, 1423, 911, 1935, 79, 1103, 591, 1615, 335, 1359, 847, 1871, 207, 1231, 719, 1743, 463, 1487, 975, 1999, 47, 1071, 559, 1583, 303, 1327, 815, 1839, 175, 1199, 687, 1711, 431, 1455, 943, 1967, 111, 1135, 623, 1647, 367, 1391, 879, 1903, 239, 1263, 751, 1775, 495, 1519, 1007, 2031, 31, 1055, 543, 1567, 287, 1311, 799, 1823, 159, 1183, 671, 1695, 415, 1439, 927, 1951, 95, 1119, 607, 1631, 351, 1375, 863, 1887, 223, 1247, 735, 1759, 479, 1503, 991, 2015, 63, 1087, 575, 1599, 319, 1343, 831, 1855, 191, 1215, 703, 1727, 447, 1471, 959, 1983, 127, 1151, 639, 1663, 383, 1407, 895, 1919, 255, 1279, 767, 1791, 511, 1535, 1023, 2047, }; static BROTLI_INLINE void StoreStaticCommandHuffmanTree( size_t* storage_ix, uint8_t* storage) { BrotliWriteBits( 56, BROTLI_MAKE_UINT64_T(0x926244U, 0x16307003U), storage_ix, storage); BrotliWriteBits(3, 0x00000000U, storage_ix, storage); } static const uint16_t kStaticDistanceCodeBits[64] = { 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, 3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63, }; static BROTLI_INLINE void StoreStaticDistanceHuffmanTree( size_t* storage_ix, uint8_t* storage) { BrotliWriteBits(28, 0x0369DC03u, storage_ix, storage); } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_ */ dvisvgm-2.8.1/libs/brotli/enc/memory.c0000664000175000017500000001142713510660062014575 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Algorithms for distributing the literals and commands of a metablock between block types and contexts. */ #include "./memory.h" #include /* exit, free, malloc */ #include /* memcpy */ #include "../common/platform.h" #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define MAX_PERM_ALLOCATED 128 #define MAX_NEW_ALLOCATED 64 #define MAX_NEW_FREED 64 #define PERM_ALLOCATED_OFFSET 0 #define NEW_ALLOCATED_OFFSET MAX_PERM_ALLOCATED #define NEW_FREED_OFFSET (MAX_PERM_ALLOCATED + MAX_NEW_ALLOCATED) void BrotliInitMemoryManager( MemoryManager* m, brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) { if (!alloc_func) { m->alloc_func = BrotliDefaultAllocFunc; m->free_func = BrotliDefaultFreeFunc; m->opaque = 0; } else { m->alloc_func = alloc_func; m->free_func = free_func; m->opaque = opaque; } #if !defined(BROTLI_ENCODER_EXIT_ON_OOM) m->is_oom = BROTLI_FALSE; m->perm_allocated = 0; m->new_allocated = 0; m->new_freed = 0; #endif /* BROTLI_ENCODER_EXIT_ON_OOM */ } #if defined(BROTLI_ENCODER_EXIT_ON_OOM) void* BrotliAllocate(MemoryManager* m, size_t n) { void* result = m->alloc_func(m->opaque, n); if (!result) exit(EXIT_FAILURE); return result; } void BrotliFree(MemoryManager* m, void* p) { m->free_func(m->opaque, p); } void BrotliWipeOutMemoryManager(MemoryManager* m) { BROTLI_UNUSED(m); } #else /* BROTLI_ENCODER_EXIT_ON_OOM */ static void SortPointers(void** items, const size_t n) { /* Shell sort. */ static const size_t gaps[] = {23, 10, 4, 1}; int g = 0; for (; g < 4; ++g) { size_t gap = gaps[g]; size_t i; for (i = gap; i < n; ++i) { size_t j = i; void* tmp = items[i]; for (; j >= gap && tmp < items[j - gap]; j -= gap) { items[j] = items[j - gap]; } items[j] = tmp; } } } static size_t Annihilate(void** a, size_t a_len, void** b, size_t b_len) { size_t a_read_index = 0; size_t b_read_index = 0; size_t a_write_index = 0; size_t b_write_index = 0; size_t annihilated = 0; while (a_read_index < a_len && b_read_index < b_len) { if (a[a_read_index] == b[b_read_index]) { a_read_index++; b_read_index++; annihilated++; } else if (a[a_read_index] < b[b_read_index]) { a[a_write_index++] = a[a_read_index++]; } else { b[b_write_index++] = b[b_read_index++]; } } while (a_read_index < a_len) a[a_write_index++] = a[a_read_index++]; while (b_read_index < b_len) b[b_write_index++] = b[b_read_index++]; return annihilated; } static void CollectGarbagePointers(MemoryManager* m) { size_t annihilated; SortPointers(m->pointers + NEW_ALLOCATED_OFFSET, m->new_allocated); SortPointers(m->pointers + NEW_FREED_OFFSET, m->new_freed); annihilated = Annihilate( m->pointers + NEW_ALLOCATED_OFFSET, m->new_allocated, m->pointers + NEW_FREED_OFFSET, m->new_freed); m->new_allocated -= annihilated; m->new_freed -= annihilated; if (m->new_freed != 0) { annihilated = Annihilate( m->pointers + PERM_ALLOCATED_OFFSET, m->perm_allocated, m->pointers + NEW_FREED_OFFSET, m->new_freed); m->perm_allocated -= annihilated; m->new_freed -= annihilated; BROTLI_DCHECK(m->new_freed == 0); } if (m->new_allocated != 0) { BROTLI_DCHECK(m->perm_allocated + m->new_allocated <= MAX_PERM_ALLOCATED); memcpy(m->pointers + PERM_ALLOCATED_OFFSET + m->perm_allocated, m->pointers + NEW_ALLOCATED_OFFSET, sizeof(void*) * m->new_allocated); m->perm_allocated += m->new_allocated; m->new_allocated = 0; SortPointers(m->pointers + PERM_ALLOCATED_OFFSET, m->perm_allocated); } } void* BrotliAllocate(MemoryManager* m, size_t n) { void* result = m->alloc_func(m->opaque, n); if (!result) { m->is_oom = BROTLI_TRUE; return NULL; } if (m->new_allocated == MAX_NEW_ALLOCATED) CollectGarbagePointers(m); m->pointers[NEW_ALLOCATED_OFFSET + (m->new_allocated++)] = result; return result; } void BrotliFree(MemoryManager* m, void* p) { if (!p) return; m->free_func(m->opaque, p); if (m->new_freed == MAX_NEW_FREED) CollectGarbagePointers(m); m->pointers[NEW_FREED_OFFSET + (m->new_freed++)] = p; } void BrotliWipeOutMemoryManager(MemoryManager* m) { size_t i; CollectGarbagePointers(m); /* Now all unfreed pointers are in perm-allocated list. */ for (i = 0; i < m->perm_allocated; ++i) { m->free_func(m->opaque, m->pointers[PERM_ALLOCATED_OFFSET + i]); } m->perm_allocated = 0; } #endif /* BROTLI_ENCODER_EXIT_ON_OOM */ #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/metablock.c0000664000175000017500000006256713510660062015241 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Algorithms for distributing the literals and commands of a metablock between block types and contexts. */ #include "./metablock.h" #include "../common/constants.h" #include "../common/context.h" #include "../common/platform.h" #include #include "./bit_cost.h" #include "./block_splitter.h" #include "./cluster.h" #include "./entropy_encode.h" #include "./histogram.h" #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif void BrotliInitDistanceParams(BrotliEncoderParams* params, uint32_t npostfix, uint32_t ndirect) { BrotliDistanceParams* dist_params = ¶ms->dist; uint32_t alphabet_size, max_distance; dist_params->distance_postfix_bits = npostfix; dist_params->num_direct_distance_codes = ndirect; alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE( npostfix, ndirect, BROTLI_MAX_DISTANCE_BITS); max_distance = ndirect + (1U << (BROTLI_MAX_DISTANCE_BITS + npostfix + 2)) - (1U << (npostfix + 2)); if (params->large_window) { static const uint32_t bound[BROTLI_MAX_NPOSTFIX + 1] = {0, 4, 12, 28}; uint32_t postfix = 1U << npostfix; alphabet_size = BROTLI_DISTANCE_ALPHABET_SIZE( npostfix, ndirect, BROTLI_LARGE_MAX_DISTANCE_BITS); /* The maximum distance is set so that no distance symbol used can encode a distance larger than BROTLI_MAX_ALLOWED_DISTANCE with all its extra bits set. */ if (ndirect < bound[npostfix]) { max_distance = BROTLI_MAX_ALLOWED_DISTANCE - (bound[npostfix] - ndirect); } else if (ndirect >= bound[npostfix] + postfix) { max_distance = (3U << 29) - 4 + (ndirect - bound[npostfix]); } else { max_distance = BROTLI_MAX_ALLOWED_DISTANCE; } } dist_params->alphabet_size = alphabet_size; dist_params->max_distance = max_distance; } static void RecomputeDistancePrefixes(Command* cmds, size_t num_commands, const BrotliDistanceParams* orig_params, const BrotliDistanceParams* new_params) { size_t i; if (orig_params->distance_postfix_bits == new_params->distance_postfix_bits && orig_params->num_direct_distance_codes == new_params->num_direct_distance_codes) { return; } for (i = 0; i < num_commands; ++i) { Command* cmd = &cmds[i]; if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) { PrefixEncodeCopyDistance(CommandRestoreDistanceCode(cmd, orig_params), new_params->num_direct_distance_codes, new_params->distance_postfix_bits, &cmd->dist_prefix_, &cmd->dist_extra_); } } } static BROTLI_BOOL ComputeDistanceCost(const Command* cmds, size_t num_commands, const BrotliDistanceParams* orig_params, const BrotliDistanceParams* new_params, double* cost) { size_t i; BROTLI_BOOL equal_params = BROTLI_FALSE; uint16_t dist_prefix; uint32_t dist_extra; double extra_bits = 0.0; HistogramDistance histo; HistogramClearDistance(&histo); if (orig_params->distance_postfix_bits == new_params->distance_postfix_bits && orig_params->num_direct_distance_codes == new_params->num_direct_distance_codes) { equal_params = BROTLI_TRUE; } for (i = 0; i < num_commands; i++) { const Command* cmd = &cmds[i]; if (CommandCopyLen(cmd) && cmd->cmd_prefix_ >= 128) { if (equal_params) { dist_prefix = cmd->dist_prefix_; } else { uint32_t distance = CommandRestoreDistanceCode(cmd, orig_params); if (distance > new_params->max_distance) { return BROTLI_FALSE; } PrefixEncodeCopyDistance(distance, new_params->num_direct_distance_codes, new_params->distance_postfix_bits, &dist_prefix, &dist_extra); } HistogramAddDistance(&histo, dist_prefix & 0x3FF); extra_bits += dist_prefix >> 10; } } *cost = BrotliPopulationCostDistance(&histo) + extra_bits; return BROTLI_TRUE; } void BrotliBuildMetaBlock(MemoryManager* m, const uint8_t* ringbuffer, const size_t pos, const size_t mask, BrotliEncoderParams* params, uint8_t prev_byte, uint8_t prev_byte2, Command* cmds, size_t num_commands, ContextType literal_context_mode, MetaBlockSplit* mb) { /* Histogram ids need to fit in one byte. */ static const size_t kMaxNumberOfHistograms = 256; HistogramDistance* distance_histograms; HistogramLiteral* literal_histograms; ContextType* literal_context_modes = NULL; size_t literal_histograms_size; size_t distance_histograms_size; size_t i; size_t literal_context_multiplier = 1; uint32_t npostfix; uint32_t ndirect_msb = 0; BROTLI_BOOL check_orig = BROTLI_TRUE; double best_dist_cost = 1e99; BrotliEncoderParams orig_params = *params; BrotliEncoderParams new_params = *params; for (npostfix = 0; npostfix <= BROTLI_MAX_NPOSTFIX; npostfix++) { for (; ndirect_msb < 16; ndirect_msb++) { uint32_t ndirect = ndirect_msb << npostfix; BROTLI_BOOL skip; double dist_cost; BrotliInitDistanceParams(&new_params, npostfix, ndirect); if (npostfix == orig_params.dist.distance_postfix_bits && ndirect == orig_params.dist.num_direct_distance_codes) { check_orig = BROTLI_FALSE; } skip = !ComputeDistanceCost( cmds, num_commands, &orig_params.dist, &new_params.dist, &dist_cost); if (skip || (dist_cost > best_dist_cost)) { break; } best_dist_cost = dist_cost; params->dist = new_params.dist; } if (ndirect_msb > 0) ndirect_msb--; ndirect_msb /= 2; } if (check_orig) { double dist_cost; ComputeDistanceCost(cmds, num_commands, &orig_params.dist, &orig_params.dist, &dist_cost); if (dist_cost < best_dist_cost) { /* NB: currently unused; uncomment when more param tuning is added. */ /* best_dist_cost = dist_cost; */ params->dist = orig_params.dist; } } RecomputeDistancePrefixes(cmds, num_commands, &orig_params.dist, ¶ms->dist); BrotliSplitBlock(m, cmds, num_commands, ringbuffer, pos, mask, params, &mb->literal_split, &mb->command_split, &mb->distance_split); if (BROTLI_IS_OOM(m)) return; if (!params->disable_literal_context_modeling) { literal_context_multiplier = 1 << BROTLI_LITERAL_CONTEXT_BITS; literal_context_modes = BROTLI_ALLOC(m, ContextType, mb->literal_split.num_types); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < mb->literal_split.num_types; ++i) { literal_context_modes[i] = literal_context_mode; } } literal_histograms_size = mb->literal_split.num_types * literal_context_multiplier; literal_histograms = BROTLI_ALLOC(m, HistogramLiteral, literal_histograms_size); if (BROTLI_IS_OOM(m)) return; ClearHistogramsLiteral(literal_histograms, literal_histograms_size); distance_histograms_size = mb->distance_split.num_types << BROTLI_DISTANCE_CONTEXT_BITS; distance_histograms = BROTLI_ALLOC(m, HistogramDistance, distance_histograms_size); if (BROTLI_IS_OOM(m)) return; ClearHistogramsDistance(distance_histograms, distance_histograms_size); BROTLI_DCHECK(mb->command_histograms == 0); mb->command_histograms_size = mb->command_split.num_types; mb->command_histograms = BROTLI_ALLOC(m, HistogramCommand, mb->command_histograms_size); if (BROTLI_IS_OOM(m)) return; ClearHistogramsCommand(mb->command_histograms, mb->command_histograms_size); BrotliBuildHistogramsWithContext(cmds, num_commands, &mb->literal_split, &mb->command_split, &mb->distance_split, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_modes, literal_histograms, mb->command_histograms, distance_histograms); BROTLI_FREE(m, literal_context_modes); BROTLI_DCHECK(mb->literal_context_map == 0); mb->literal_context_map_size = mb->literal_split.num_types << BROTLI_LITERAL_CONTEXT_BITS; mb->literal_context_map = BROTLI_ALLOC(m, uint32_t, mb->literal_context_map_size); if (BROTLI_IS_OOM(m)) return; BROTLI_DCHECK(mb->literal_histograms == 0); mb->literal_histograms_size = mb->literal_context_map_size; mb->literal_histograms = BROTLI_ALLOC(m, HistogramLiteral, mb->literal_histograms_size); if (BROTLI_IS_OOM(m)) return; BrotliClusterHistogramsLiteral(m, literal_histograms, literal_histograms_size, kMaxNumberOfHistograms, mb->literal_histograms, &mb->literal_histograms_size, mb->literal_context_map); if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, literal_histograms); if (params->disable_literal_context_modeling) { /* Distribute assignment to all contexts. */ for (i = mb->literal_split.num_types; i != 0;) { size_t j = 0; i--; for (; j < (1 << BROTLI_LITERAL_CONTEXT_BITS); j++) { mb->literal_context_map[(i << BROTLI_LITERAL_CONTEXT_BITS) + j] = mb->literal_context_map[i]; } } } BROTLI_DCHECK(mb->distance_context_map == 0); mb->distance_context_map_size = mb->distance_split.num_types << BROTLI_DISTANCE_CONTEXT_BITS; mb->distance_context_map = BROTLI_ALLOC(m, uint32_t, mb->distance_context_map_size); if (BROTLI_IS_OOM(m)) return; BROTLI_DCHECK(mb->distance_histograms == 0); mb->distance_histograms_size = mb->distance_context_map_size; mb->distance_histograms = BROTLI_ALLOC(m, HistogramDistance, mb->distance_histograms_size); if (BROTLI_IS_OOM(m)) return; BrotliClusterHistogramsDistance(m, distance_histograms, mb->distance_context_map_size, kMaxNumberOfHistograms, mb->distance_histograms, &mb->distance_histograms_size, mb->distance_context_map); if (BROTLI_IS_OOM(m)) return; BROTLI_FREE(m, distance_histograms); } #define FN(X) X ## Literal #include "./metablock_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Command #include "./metablock_inc.h" /* NOLINT(build/include) */ #undef FN #define FN(X) X ## Distance #include "./metablock_inc.h" /* NOLINT(build/include) */ #undef FN #define BROTLI_MAX_STATIC_CONTEXTS 13 /* Greedy block splitter for one block category (literal, command or distance). Gathers histograms for all context buckets. */ typedef struct ContextBlockSplitter { /* Alphabet size of particular block category. */ size_t alphabet_size_; size_t num_contexts_; size_t max_block_types_; /* We collect at least this many symbols for each block. */ size_t min_block_size_; /* We merge histograms A and B if entropy(A+B) < entropy(A) + entropy(B) + split_threshold_, where A is the current histogram and B is the histogram of the last or the second last block type. */ double split_threshold_; size_t num_blocks_; BlockSplit* split_; /* not owned */ HistogramLiteral* histograms_; /* not owned */ size_t* histograms_size_; /* not owned */ /* The number of symbols that we want to collect before deciding on whether or not to merge the block with a previous one or emit a new block. */ size_t target_block_size_; /* The number of symbols in the current histogram. */ size_t block_size_; /* Offset of the current histogram. */ size_t curr_histogram_ix_; /* Offset of the histograms of the previous two block types. */ size_t last_histogram_ix_[2]; /* Entropy of the previous two block types. */ double last_entropy_[2 * BROTLI_MAX_STATIC_CONTEXTS]; /* The number of times we merged the current block with the last one. */ size_t merge_last_count_; } ContextBlockSplitter; static void InitContextBlockSplitter( MemoryManager* m, ContextBlockSplitter* self, size_t alphabet_size, size_t num_contexts, size_t min_block_size, double split_threshold, size_t num_symbols, BlockSplit* split, HistogramLiteral** histograms, size_t* histograms_size) { size_t max_num_blocks = num_symbols / min_block_size + 1; size_t max_num_types; BROTLI_DCHECK(num_contexts <= BROTLI_MAX_STATIC_CONTEXTS); self->alphabet_size_ = alphabet_size; self->num_contexts_ = num_contexts; self->max_block_types_ = BROTLI_MAX_NUMBER_OF_BLOCK_TYPES / num_contexts; self->min_block_size_ = min_block_size; self->split_threshold_ = split_threshold; self->num_blocks_ = 0; self->split_ = split; self->histograms_size_ = histograms_size; self->target_block_size_ = min_block_size; self->block_size_ = 0; self->curr_histogram_ix_ = 0; self->merge_last_count_ = 0; /* We have to allocate one more histogram than the maximum number of block types for the current histogram when the meta-block is too big. */ max_num_types = BROTLI_MIN(size_t, max_num_blocks, self->max_block_types_ + 1); BROTLI_ENSURE_CAPACITY(m, uint8_t, split->types, split->types_alloc_size, max_num_blocks); BROTLI_ENSURE_CAPACITY(m, uint32_t, split->lengths, split->lengths_alloc_size, max_num_blocks); if (BROTLI_IS_OOM(m)) return; split->num_blocks = max_num_blocks; if (BROTLI_IS_OOM(m)) return; BROTLI_DCHECK(*histograms == 0); *histograms_size = max_num_types * num_contexts; *histograms = BROTLI_ALLOC(m, HistogramLiteral, *histograms_size); self->histograms_ = *histograms; if (BROTLI_IS_OOM(m)) return; /* Clear only current histogram. */ ClearHistogramsLiteral(&self->histograms_[0], num_contexts); self->last_histogram_ix_[0] = self->last_histogram_ix_[1] = 0; } /* Does either of three things: (1) emits the current block with a new block type; (2) emits the current block with the type of the second last block; (3) merges the current block with the last block. */ static void ContextBlockSplitterFinishBlock( ContextBlockSplitter* self, MemoryManager* m, BROTLI_BOOL is_final) { BlockSplit* split = self->split_; const size_t num_contexts = self->num_contexts_; double* last_entropy = self->last_entropy_; HistogramLiteral* histograms = self->histograms_; if (self->block_size_ < self->min_block_size_) { self->block_size_ = self->min_block_size_; } if (self->num_blocks_ == 0) { size_t i; /* Create first block. */ split->lengths[0] = (uint32_t)self->block_size_; split->types[0] = 0; for (i = 0; i < num_contexts; ++i) { last_entropy[i] = BitsEntropy(histograms[i].data_, self->alphabet_size_); last_entropy[num_contexts + i] = last_entropy[i]; } ++self->num_blocks_; ++split->num_types; self->curr_histogram_ix_ += num_contexts; if (self->curr_histogram_ix_ < *self->histograms_size_) { ClearHistogramsLiteral( &self->histograms_[self->curr_histogram_ix_], self->num_contexts_); } self->block_size_ = 0; } else if (self->block_size_ > 0) { /* Try merging the set of histograms for the current block type with the respective set of histograms for the last and second last block types. Decide over the split based on the total reduction of entropy across all contexts. */ double entropy[BROTLI_MAX_STATIC_CONTEXTS]; HistogramLiteral* combined_histo = BROTLI_ALLOC(m, HistogramLiteral, 2 * num_contexts); double combined_entropy[2 * BROTLI_MAX_STATIC_CONTEXTS]; double diff[2] = { 0.0 }; size_t i; if (BROTLI_IS_OOM(m)) return; for (i = 0; i < num_contexts; ++i) { size_t curr_histo_ix = self->curr_histogram_ix_ + i; size_t j; entropy[i] = BitsEntropy(histograms[curr_histo_ix].data_, self->alphabet_size_); for (j = 0; j < 2; ++j) { size_t jx = j * num_contexts + i; size_t last_histogram_ix = self->last_histogram_ix_[j] + i; combined_histo[jx] = histograms[curr_histo_ix]; HistogramAddHistogramLiteral(&combined_histo[jx], &histograms[last_histogram_ix]); combined_entropy[jx] = BitsEntropy( &combined_histo[jx].data_[0], self->alphabet_size_); diff[j] += combined_entropy[jx] - entropy[i] - last_entropy[jx]; } } if (split->num_types < self->max_block_types_ && diff[0] > self->split_threshold_ && diff[1] > self->split_threshold_) { /* Create new block. */ split->lengths[self->num_blocks_] = (uint32_t)self->block_size_; split->types[self->num_blocks_] = (uint8_t)split->num_types; self->last_histogram_ix_[1] = self->last_histogram_ix_[0]; self->last_histogram_ix_[0] = split->num_types * num_contexts; for (i = 0; i < num_contexts; ++i) { last_entropy[num_contexts + i] = last_entropy[i]; last_entropy[i] = entropy[i]; } ++self->num_blocks_; ++split->num_types; self->curr_histogram_ix_ += num_contexts; if (self->curr_histogram_ix_ < *self->histograms_size_) { ClearHistogramsLiteral( &self->histograms_[self->curr_histogram_ix_], self->num_contexts_); } self->block_size_ = 0; self->merge_last_count_ = 0; self->target_block_size_ = self->min_block_size_; } else if (diff[1] < diff[0] - 20.0) { /* Combine this block with second last block. */ split->lengths[self->num_blocks_] = (uint32_t)self->block_size_; split->types[self->num_blocks_] = split->types[self->num_blocks_ - 2]; BROTLI_SWAP(size_t, self->last_histogram_ix_, 0, 1); for (i = 0; i < num_contexts; ++i) { histograms[self->last_histogram_ix_[0] + i] = combined_histo[num_contexts + i]; last_entropy[num_contexts + i] = last_entropy[i]; last_entropy[i] = combined_entropy[num_contexts + i]; HistogramClearLiteral(&histograms[self->curr_histogram_ix_ + i]); } ++self->num_blocks_; self->block_size_ = 0; self->merge_last_count_ = 0; self->target_block_size_ = self->min_block_size_; } else { /* Combine this block with last block. */ split->lengths[self->num_blocks_ - 1] += (uint32_t)self->block_size_; for (i = 0; i < num_contexts; ++i) { histograms[self->last_histogram_ix_[0] + i] = combined_histo[i]; last_entropy[i] = combined_entropy[i]; if (split->num_types == 1) { last_entropy[num_contexts + i] = last_entropy[i]; } HistogramClearLiteral(&histograms[self->curr_histogram_ix_ + i]); } self->block_size_ = 0; if (++self->merge_last_count_ > 1) { self->target_block_size_ += self->min_block_size_; } } BROTLI_FREE(m, combined_histo); } if (is_final) { *self->histograms_size_ = split->num_types * num_contexts; split->num_blocks = self->num_blocks_; } } /* Adds the next symbol to the current block type and context. When the current block reaches the target size, decides on merging the block. */ static void ContextBlockSplitterAddSymbol( ContextBlockSplitter* self, MemoryManager* m, size_t symbol, size_t context) { HistogramAddLiteral(&self->histograms_[self->curr_histogram_ix_ + context], symbol); ++self->block_size_; if (self->block_size_ == self->target_block_size_) { ContextBlockSplitterFinishBlock(self, m, /* is_final = */ BROTLI_FALSE); if (BROTLI_IS_OOM(m)) return; } } static void MapStaticContexts(MemoryManager* m, size_t num_contexts, const uint32_t* static_context_map, MetaBlockSplit* mb) { size_t i; BROTLI_DCHECK(mb->literal_context_map == 0); mb->literal_context_map_size = mb->literal_split.num_types << BROTLI_LITERAL_CONTEXT_BITS; mb->literal_context_map = BROTLI_ALLOC(m, uint32_t, mb->literal_context_map_size); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < mb->literal_split.num_types; ++i) { uint32_t offset = (uint32_t)(i * num_contexts); size_t j; for (j = 0; j < (1u << BROTLI_LITERAL_CONTEXT_BITS); ++j) { mb->literal_context_map[(i << BROTLI_LITERAL_CONTEXT_BITS) + j] = offset + static_context_map[j]; } } } static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal( MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, ContextLut literal_context_lut, const size_t num_contexts, const uint32_t* static_context_map, const Command* commands, size_t n_commands, MetaBlockSplit* mb) { union { BlockSplitterLiteral plain; ContextBlockSplitter ctx; } lit_blocks; BlockSplitterCommand cmd_blocks; BlockSplitterDistance dist_blocks; size_t num_literals = 0; size_t i; for (i = 0; i < n_commands; ++i) { num_literals += commands[i].insert_len_; } if (num_contexts == 1) { InitBlockSplitterLiteral(m, &lit_blocks.plain, 256, 512, 400.0, num_literals, &mb->literal_split, &mb->literal_histograms, &mb->literal_histograms_size); } else { InitContextBlockSplitter(m, &lit_blocks.ctx, 256, num_contexts, 512, 400.0, num_literals, &mb->literal_split, &mb->literal_histograms, &mb->literal_histograms_size); } if (BROTLI_IS_OOM(m)) return; InitBlockSplitterCommand(m, &cmd_blocks, BROTLI_NUM_COMMAND_SYMBOLS, 1024, 500.0, n_commands, &mb->command_split, &mb->command_histograms, &mb->command_histograms_size); if (BROTLI_IS_OOM(m)) return; InitBlockSplitterDistance(m, &dist_blocks, 64, 512, 100.0, n_commands, &mb->distance_split, &mb->distance_histograms, &mb->distance_histograms_size); if (BROTLI_IS_OOM(m)) return; for (i = 0; i < n_commands; ++i) { const Command cmd = commands[i]; size_t j; BlockSplitterAddSymbolCommand(&cmd_blocks, cmd.cmd_prefix_); for (j = cmd.insert_len_; j != 0; --j) { uint8_t literal = ringbuffer[pos & mask]; if (num_contexts == 1) { BlockSplitterAddSymbolLiteral(&lit_blocks.plain, literal); } else { size_t context = BROTLI_CONTEXT(prev_byte, prev_byte2, literal_context_lut); ContextBlockSplitterAddSymbol(&lit_blocks.ctx, m, literal, static_context_map[context]); if (BROTLI_IS_OOM(m)) return; } prev_byte2 = prev_byte; prev_byte = literal; ++pos; } pos += CommandCopyLen(&cmd); if (CommandCopyLen(&cmd)) { prev_byte2 = ringbuffer[(pos - 2) & mask]; prev_byte = ringbuffer[(pos - 1) & mask]; if (cmd.cmd_prefix_ >= 128) { BlockSplitterAddSymbolDistance(&dist_blocks, cmd.dist_prefix_ & 0x3FF); } } } if (num_contexts == 1) { BlockSplitterFinishBlockLiteral( &lit_blocks.plain, /* is_final = */ BROTLI_TRUE); } else { ContextBlockSplitterFinishBlock( &lit_blocks.ctx, m, /* is_final = */ BROTLI_TRUE); if (BROTLI_IS_OOM(m)) return; } BlockSplitterFinishBlockCommand(&cmd_blocks, /* is_final = */ BROTLI_TRUE); BlockSplitterFinishBlockDistance(&dist_blocks, /* is_final = */ BROTLI_TRUE); if (num_contexts > 1) { MapStaticContexts(m, num_contexts, static_context_map, mb); } } void BrotliBuildMetaBlockGreedy(MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, ContextLut literal_context_lut, size_t num_contexts, const uint32_t* static_context_map, const Command* commands, size_t n_commands, MetaBlockSplit* mb) { if (num_contexts == 1) { BrotliBuildMetaBlockGreedyInternal(m, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, 1, NULL, commands, n_commands, mb); } else { BrotliBuildMetaBlockGreedyInternal(m, ringbuffer, pos, mask, prev_byte, prev_byte2, literal_context_lut, num_contexts, static_context_map, commands, n_commands, mb); } } void BrotliOptimizeHistograms(uint32_t num_distance_codes, MetaBlockSplit* mb) { uint8_t good_for_rle[BROTLI_NUM_COMMAND_SYMBOLS]; size_t i; for (i = 0; i < mb->literal_histograms_size; ++i) { BrotliOptimizeHuffmanCountsForRle(256, mb->literal_histograms[i].data_, good_for_rle); } for (i = 0; i < mb->command_histograms_size; ++i) { BrotliOptimizeHuffmanCountsForRle(BROTLI_NUM_COMMAND_SYMBOLS, mb->command_histograms[i].data_, good_for_rle); } for (i = 0; i < mb->distance_histograms_size; ++i) { BrotliOptimizeHuffmanCountsForRle(num_distance_codes, mb->distance_histograms[i].data_, good_for_rle); } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/enc/hash_forgetful_chain_inc.h0000664000175000017500000002265213510660062020267 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN, BUCKET_BITS, NUM_BANKS, BANK_BITS, NUM_LAST_DISTANCES_TO_CHECK */ /* A (forgetful) hash table to the data seen by the compressor, to help create backward references to previous data. Hashes are stored in chains which are bucketed to groups. Group of chains share a storage "bank". When more than "bank size" chain nodes are added, oldest nodes are replaced; this way several chains may share a tail. */ #define HashForgetfulChain HASHER() #define BANK_SIZE (1 << BANK_BITS) /* Number of hash buckets. */ #define BUCKET_SIZE (1 << BUCKET_BITS) #define CAPPED_CHAINS 0 static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; } /* HashBytes is the function that chooses the bucket to place the address in.*/ static BROTLI_INLINE size_t FN(HashBytes)(const uint8_t* data) { const uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return h >> (32 - BUCKET_BITS); } typedef struct FN(Slot) { uint16_t delta; uint16_t next; } FN(Slot); typedef struct FN(Bank) { FN(Slot) slots[BANK_SIZE]; } FN(Bank); typedef struct HashForgetfulChain { uint32_t addr[BUCKET_SIZE]; uint16_t head[BUCKET_SIZE]; /* Truncated hash used for quick rejection of "distance cache" candidates. */ uint8_t tiny_hash[65536]; FN(Bank) banks[NUM_BANKS]; uint16_t free_slot_idx[NUM_BANKS]; size_t max_hops; } HashForgetfulChain; static BROTLI_INLINE HashForgetfulChain* FN(Self)(HasherHandle handle) { return (HashForgetfulChain*)&(GetHasherCommon(handle)[1]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { FN(Self)(handle)->max_hops = (params->quality > 6 ? 7u : 8u) << (params->quality - 4); } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashForgetfulChain* self = FN(Self)(handle); /* Partial preparation is 100 times slower (per socket). */ size_t partial_prepare_threshold = BUCKET_SIZE >> 6; if (one_shot && input_size <= partial_prepare_threshold) { size_t i; for (i = 0; i < input_size; ++i) { size_t bucket = FN(HashBytes)(&data[i]); /* See InitEmpty comment. */ self->addr[bucket] = 0xCCCCCCCC; self->head[bucket] = 0xCCCC; } } else { /* Fill |addr| array with 0xCCCCCCCC value. Because of wrapping, position processed by hasher never reaches 3GB + 64M; this makes all new chains to be terminated after the first node. */ memset(self->addr, 0xCC, sizeof(self->addr)); memset(self->head, 0, sizeof(self->head)); } memset(self->tiny_hash, 0, sizeof(self->tiny_hash)); memset(self->free_slot_idx, 0, sizeof(self->free_slot_idx)); } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { BROTLI_UNUSED(params); BROTLI_UNUSED(one_shot); BROTLI_UNUSED(input_size); return sizeof(HashForgetfulChain); } /* Look at 4 bytes at &data[ix & mask]. Compute a hash from these, and prepend node to corresponding chain; also update tiny_hash for current position. */ static BROTLI_INLINE void FN(Store)(HasherHandle BROTLI_RESTRICT handle, const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) { HashForgetfulChain* self = FN(Self)(handle); const size_t key = FN(HashBytes)(&data[ix & mask]); const size_t bank = key & (NUM_BANKS - 1); const size_t idx = self->free_slot_idx[bank]++ & (BANK_SIZE - 1); size_t delta = ix - self->addr[key]; self->tiny_hash[(uint16_t)ix] = (uint8_t)key; if (delta > 0xFFFF) delta = CAPPED_CHAINS ? 0 : 0xFFFF; self->banks[bank].slots[idx].delta = (uint16_t)delta; self->banks[bank].slots[idx].next = self->head[key]; self->addr[key] = (uint32_t)ix; self->head[key] = (uint16_t)idx; } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { size_t i; for (i = ix_start; i < ix_end; ++i) { FN(Store)(handle, data, mask, i); } } static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ring_buffer_mask) { if (num_bytes >= FN(HashTypeLength)() - 1 && position >= 3) { /* Prepare the hashes for three last bytes of the last write. These could not be calculated before, since they require knowledge of both the previous and the current block. */ FN(Store)(handle, ringbuffer, ring_buffer_mask, position - 3); FN(Store)(handle, ringbuffer, ring_buffer_mask, position - 2); FN(Store)(handle, ringbuffer, ring_buffer_mask, position - 1); } } static BROTLI_INLINE void FN(PrepareDistanceCache)( HasherHandle handle, int* BROTLI_RESTRICT distance_cache) { BROTLI_UNUSED(handle); PrepareDistanceCache(distance_cache, NUM_LAST_DISTANCES_TO_CHECK); } /* Find a longest backward match of &data[cur_ix] up to the length of max_length and stores the position cur_ix in the hash table. REQUIRES: FN(PrepareDistanceCache) must be invoked for current distance cache values; if this method is invoked repeatedly with the same distance cache values, it is enough to invoke FN(PrepareDistanceCache) once. Does not look for matches longer than max_length. Does not look for matches further away than max_backward. Writes the best match into |out|. |out|->score is updated only if a better match is found. */ static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) { HashForgetfulChain* self = FN(Self)(handle); const size_t cur_ix_masked = cur_ix & ring_buffer_mask; /* Don't accept a short copy from far away. */ score_t min_score = out->score; score_t best_score = out->score; size_t best_len = out->len; size_t i; const size_t key = FN(HashBytes)(&data[cur_ix_masked]); const uint8_t tiny_hash = (uint8_t)(key); out->len = 0; out->len_code_delta = 0; /* Try last distance first. */ for (i = 0; i < NUM_LAST_DISTANCES_TO_CHECK; ++i) { const size_t backward = (size_t)distance_cache[i]; size_t prev_ix = (cur_ix - backward); /* For distance code 0 we want to consider 2-byte matches. */ if (i > 0 && self->tiny_hash[(uint16_t)prev_ix] != tiny_hash) continue; if (prev_ix >= cur_ix || backward > max_backward) { continue; } prev_ix &= ring_buffer_mask; { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 2) { score_t score = BackwardReferenceScoreUsingLastDistance(len); if (best_score < score) { if (i != 0) score -= BackwardReferencePenaltyUsingLastDistance(i); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = best_score; } } } } } { const size_t bank = key & (NUM_BANKS - 1); size_t backward = 0; size_t hops = self->max_hops; size_t delta = cur_ix - self->addr[key]; size_t slot = self->head[key]; while (hops--) { size_t prev_ix; size_t last = slot; backward += delta; if (backward > max_backward || (CAPPED_CHAINS && !delta)) break; prev_ix = (cur_ix - backward) & ring_buffer_mask; slot = self->banks[bank].slots[last].next; delta = self->banks[bank].slots[last].delta; if (cur_ix_masked + best_len > ring_buffer_mask || prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 4) { /* Comparing for >= 3 does not change the semantics, but just saves for a few unnecessary binary logarithms in backward reference score, since we are not interested in such short matches. */ score_t score = BackwardReferenceScore(len, backward); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = best_score; } } } } FN(Store)(handle, data, ring_buffer_mask, cur_ix); } if (out->score == min_score) { SearchInStaticDictionary(dictionary, handle, &data[cur_ix_masked], max_length, max_backward + gap, max_distance, out, BROTLI_FALSE); } } #undef BANK_SIZE #undef BUCKET_SIZE #undef CAPPED_CHAINS #undef HashForgetfulChain dvisvgm-2.8.1/libs/brotli/enc/metablock.h0000664000175000017500000000763213510660062015236 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Algorithms for distributing the literals and commands of a metablock between block types and contexts. */ #ifndef BROTLI_ENC_METABLOCK_H_ #define BROTLI_ENC_METABLOCK_H_ #include "../common/context.h" #include "../common/platform.h" #include #include "./block_splitter.h" #include "./command.h" #include "./histogram.h" #include "./memory.h" #include "./quality.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct MetaBlockSplit { BlockSplit literal_split; BlockSplit command_split; BlockSplit distance_split; uint32_t* literal_context_map; size_t literal_context_map_size; uint32_t* distance_context_map; size_t distance_context_map_size; HistogramLiteral* literal_histograms; size_t literal_histograms_size; HistogramCommand* command_histograms; size_t command_histograms_size; HistogramDistance* distance_histograms; size_t distance_histograms_size; } MetaBlockSplit; static BROTLI_INLINE void InitMetaBlockSplit(MetaBlockSplit* mb) { BrotliInitBlockSplit(&mb->literal_split); BrotliInitBlockSplit(&mb->command_split); BrotliInitBlockSplit(&mb->distance_split); mb->literal_context_map = 0; mb->literal_context_map_size = 0; mb->distance_context_map = 0; mb->distance_context_map_size = 0; mb->literal_histograms = 0; mb->literal_histograms_size = 0; mb->command_histograms = 0; mb->command_histograms_size = 0; mb->distance_histograms = 0; mb->distance_histograms_size = 0; } static BROTLI_INLINE void DestroyMetaBlockSplit( MemoryManager* m, MetaBlockSplit* mb) { BrotliDestroyBlockSplit(m, &mb->literal_split); BrotliDestroyBlockSplit(m, &mb->command_split); BrotliDestroyBlockSplit(m, &mb->distance_split); BROTLI_FREE(m, mb->literal_context_map); BROTLI_FREE(m, mb->distance_context_map); BROTLI_FREE(m, mb->literal_histograms); BROTLI_FREE(m, mb->command_histograms); BROTLI_FREE(m, mb->distance_histograms); } /* Uses the slow shortest-path block splitter and does context clustering. The distance parameters are dynamically selected based on the commands which get recomputed under the new distance parameters. The new distance parameters are stored into *params. */ BROTLI_INTERNAL void BrotliBuildMetaBlock(MemoryManager* m, const uint8_t* ringbuffer, const size_t pos, const size_t mask, BrotliEncoderParams* params, uint8_t prev_byte, uint8_t prev_byte2, Command* cmds, size_t num_commands, ContextType literal_context_mode, MetaBlockSplit* mb); /* Uses a fast greedy block splitter that tries to merge current block with the last or the second last block and uses a static context clustering which is the same for all block types. */ BROTLI_INTERNAL void BrotliBuildMetaBlockGreedy( MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask, uint8_t prev_byte, uint8_t prev_byte2, ContextLut literal_context_lut, size_t num_contexts, const uint32_t* static_context_map, const Command* commands, size_t n_commands, MetaBlockSplit* mb); BROTLI_INTERNAL void BrotliOptimizeHistograms(uint32_t num_distance_codes, MetaBlockSplit* mb); BROTLI_INTERNAL void BrotliInitDistanceParams(BrotliEncoderParams* params, uint32_t npostfix, uint32_t ndirect); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_METABLOCK_H_ */ dvisvgm-2.8.1/libs/brotli/enc/block_encoder_inc.h0000664000175000017500000000216113510660062016707 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN */ #define HistogramType FN(Histogram) /* Creates entropy codes for all block types and stores them to the bit stream. */ static void FN(BuildAndStoreEntropyCodes)(MemoryManager* m, BlockEncoder* self, const HistogramType* histograms, const size_t histograms_size, const size_t alphabet_size, HuffmanTree* tree, size_t* storage_ix, uint8_t* storage) { const size_t table_size = histograms_size * self->histogram_length_; self->depths_ = BROTLI_ALLOC(m, uint8_t, table_size); self->bits_ = BROTLI_ALLOC(m, uint16_t, table_size); if (BROTLI_IS_OOM(m)) return; { size_t i; for (i = 0; i < histograms_size; ++i) { size_t ix = i * self->histogram_length_; BuildAndStoreHuffmanTree(&histograms[i].data_[0], self->histogram_length_, alphabet_size, tree, &self->depths_[ix], &self->bits_[ix], storage_ix, storage); } } } #undef HistogramType dvisvgm-2.8.1/libs/brotli/enc/hash_longest_match_inc.h0000664000175000017500000002341113510660062017751 00000000000000/* NOLINT(build/header_guard) */ /* Copyright 2010 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* template parameters: FN */ /* A (forgetful) hash table to the data seen by the compressor, to help create backward references to previous data. This is a hash map of fixed size (bucket_size_) to a ring buffer of fixed size (block_size_). The ring buffer contains the last block_size_ index positions of the given hash key in the compressed data. */ #define HashLongestMatch HASHER() static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 4; } static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 4; } /* HashBytes is the function that chooses the bucket to place the address in. */ static uint32_t FN(HashBytes)(const uint8_t* data, const int shift) { uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32; /* The higher bits contain more mixture from the multiplication, so we take our results from there. */ return (uint32_t)(h >> shift); } typedef struct HashLongestMatch { /* Number of hash buckets. */ size_t bucket_size_; /* Only block_size_ newest backward references are kept, and the older are forgotten. */ size_t block_size_; /* Left-shift for computing hash bucket index from hash value. */ int hash_shift_; /* Mask for accessing entries in a block (in a ring-buffer manner). */ uint32_t block_mask_; /* --- Dynamic size members --- */ /* Number of entries in a particular bucket. */ /* uint16_t num[bucket_size]; */ /* Buckets containing block_size_ of backward references. */ /* uint32_t* buckets[bucket_size * block_size]; */ } HashLongestMatch; static BROTLI_INLINE HashLongestMatch* FN(Self)(HasherHandle handle) { return (HashLongestMatch*)&(GetHasherCommon(handle)[1]); } static BROTLI_INLINE uint16_t* FN(Num)(HashLongestMatch* self) { return (uint16_t*)(&self[1]); } static BROTLI_INLINE uint32_t* FN(Buckets)(HashLongestMatch* self) { return (uint32_t*)(&FN(Num)(self)[self->bucket_size_]); } static void FN(Initialize)( HasherHandle handle, const BrotliEncoderParams* params) { HasherCommon* common = GetHasherCommon(handle); HashLongestMatch* self = FN(Self)(handle); BROTLI_UNUSED(params); self->hash_shift_ = 32 - common->params.bucket_bits; self->bucket_size_ = (size_t)1 << common->params.bucket_bits; self->block_size_ = (size_t)1 << common->params.block_bits; self->block_mask_ = (uint32_t)(self->block_size_ - 1); } static void FN(Prepare)(HasherHandle handle, BROTLI_BOOL one_shot, size_t input_size, const uint8_t* data) { HashLongestMatch* self = FN(Self)(handle); uint16_t* num = FN(Num)(self); /* Partial preparation is 100 times slower (per socket). */ size_t partial_prepare_threshold = self->bucket_size_ >> 6; if (one_shot && input_size <= partial_prepare_threshold) { size_t i; for (i = 0; i < input_size; ++i) { const uint32_t key = FN(HashBytes)(&data[i], self->hash_shift_); num[key] = 0; } } else { memset(num, 0, self->bucket_size_ * sizeof(num[0])); } } static BROTLI_INLINE size_t FN(HashMemAllocInBytes)( const BrotliEncoderParams* params, BROTLI_BOOL one_shot, size_t input_size) { size_t bucket_size = (size_t)1 << params->hasher.bucket_bits; size_t block_size = (size_t)1 << params->hasher.block_bits; BROTLI_UNUSED(one_shot); BROTLI_UNUSED(input_size); return sizeof(HashLongestMatch) + bucket_size * (2 + 4 * block_size); } /* Look at 4 bytes at &data[ix & mask]. Compute a hash from these, and store the value of ix at that position. */ static BROTLI_INLINE void FN(Store)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix) { HashLongestMatch* self = FN(Self)(handle); uint16_t* num = FN(Num)(self); const uint32_t key = FN(HashBytes)(&data[ix & mask], self->hash_shift_); const size_t minor_ix = num[key] & self->block_mask_; const size_t offset = minor_ix + (key << GetHasherCommon(handle)->params.block_bits); FN(Buckets)(self)[offset] = (uint32_t)ix; ++num[key]; } static BROTLI_INLINE void FN(StoreRange)(HasherHandle handle, const uint8_t* data, const size_t mask, const size_t ix_start, const size_t ix_end) { size_t i; for (i = ix_start; i < ix_end; ++i) { FN(Store)(handle, data, mask, i); } } static BROTLI_INLINE void FN(StitchToPreviousBlock)(HasherHandle handle, size_t num_bytes, size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask) { if (num_bytes >= FN(HashTypeLength)() - 1 && position >= 3) { /* Prepare the hashes for three last bytes of the last write. These could not be calculated before, since they require knowledge of both the previous and the current block. */ FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 3); FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 2); FN(Store)(handle, ringbuffer, ringbuffer_mask, position - 1); } } static BROTLI_INLINE void FN(PrepareDistanceCache)( HasherHandle handle, int* BROTLI_RESTRICT distance_cache) { PrepareDistanceCache(distance_cache, GetHasherCommon(handle)->params.num_last_distances_to_check); } /* Find a longest backward match of &data[cur_ix] up to the length of max_length and stores the position cur_ix in the hash table. REQUIRES: FN(PrepareDistanceCache) must be invoked for current distance cache values; if this method is invoked repeatedly with the same distance cache values, it is enough to invoke FN(PrepareDistanceCache) once. Does not look for matches longer than max_length. Does not look for matches further away than max_backward. Writes the best match into |out|. |out|->score is updated only if a better match is found. */ static BROTLI_INLINE void FN(FindLongestMatch)(HasherHandle handle, const BrotliEncoderDictionary* dictionary, const uint8_t* BROTLI_RESTRICT data, const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache, const size_t cur_ix, const size_t max_length, const size_t max_backward, const size_t gap, const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) { HasherCommon* common = GetHasherCommon(handle); HashLongestMatch* self = FN(Self)(handle); uint16_t* num = FN(Num)(self); uint32_t* buckets = FN(Buckets)(self); const size_t cur_ix_masked = cur_ix & ring_buffer_mask; /* Don't accept a short copy from far away. */ score_t min_score = out->score; score_t best_score = out->score; size_t best_len = out->len; size_t i; out->len = 0; out->len_code_delta = 0; /* Try last distance first. */ for (i = 0; i < (size_t)common->params.num_last_distances_to_check; ++i) { const size_t backward = (size_t)distance_cache[i]; size_t prev_ix = (size_t)(cur_ix - backward); if (prev_ix >= cur_ix) { continue; } if (BROTLI_PREDICT_FALSE(backward > max_backward)) { continue; } prev_ix &= ring_buffer_mask; if (cur_ix_masked + best_len > ring_buffer_mask || prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 3 || (len == 2 && i < 2)) { /* Comparing for >= 2 does not change the semantics, but just saves for a few unnecessary binary logarithms in backward reference score, since we are not interested in such short matches. */ score_t score = BackwardReferenceScoreUsingLastDistance(len); if (best_score < score) { if (i != 0) score -= BackwardReferencePenaltyUsingLastDistance(i); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = best_score; } } } } } { const uint32_t key = FN(HashBytes)(&data[cur_ix_masked], self->hash_shift_); uint32_t* BROTLI_RESTRICT bucket = &buckets[key << common->params.block_bits]; const size_t down = (num[key] > self->block_size_) ? (num[key] - self->block_size_) : 0u; for (i = num[key]; i > down;) { size_t prev_ix = bucket[--i & self->block_mask_]; const size_t backward = cur_ix - prev_ix; if (BROTLI_PREDICT_FALSE(backward > max_backward)) { break; } prev_ix &= ring_buffer_mask; if (cur_ix_masked + best_len > ring_buffer_mask || prev_ix + best_len > ring_buffer_mask || data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { continue; } { const size_t len = FindMatchLengthWithLimit(&data[prev_ix], &data[cur_ix_masked], max_length); if (len >= 4) { /* Comparing for >= 3 does not change the semantics, but just saves for a few unnecessary binary logarithms in backward reference score, since we are not interested in such short matches. */ score_t score = BackwardReferenceScore(len, backward); if (best_score < score) { best_score = score; best_len = len; out->len = best_len; out->distance = backward; out->score = best_score; } } } } bucket[num[key] & self->block_mask_] = (uint32_t)cur_ix; ++num[key]; } if (min_score == out->score) { SearchInStaticDictionary(dictionary, handle, &data[cur_ix_masked], max_length, max_backward + gap, max_distance, out, BROTLI_FALSE); } } #undef HashLongestMatch dvisvgm-2.8.1/libs/brotli/enc/quality.h0000664000175000017500000001402513510660062014757 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Constants and formulas that affect speed-ratio trade-offs and thus define quality levels. */ #ifndef BROTLI_ENC_QUALITY_H_ #define BROTLI_ENC_QUALITY_H_ #include "../common/platform.h" #include #include "./params.h" #define FAST_ONE_PASS_COMPRESSION_QUALITY 0 #define FAST_TWO_PASS_COMPRESSION_QUALITY 1 #define ZOPFLIFICATION_QUALITY 10 #define HQ_ZOPFLIFICATION_QUALITY 11 #define MAX_QUALITY_FOR_STATIC_ENTROPY_CODES 2 #define MIN_QUALITY_FOR_BLOCK_SPLIT 4 #define MIN_QUALITY_FOR_NONZERO_DISTANCE_PARAMS 4 #define MIN_QUALITY_FOR_OPTIMIZE_HISTOGRAMS 4 #define MIN_QUALITY_FOR_EXTENSIVE_REFERENCE_SEARCH 5 #define MIN_QUALITY_FOR_CONTEXT_MODELING 5 #define MIN_QUALITY_FOR_HQ_CONTEXT_MODELING 7 #define MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING 10 /* For quality below MIN_QUALITY_FOR_BLOCK_SPLIT there is no block splitting, so we buffer at most this much literals and commands. */ #define MAX_NUM_DELAYED_SYMBOLS 0x2FFF /* Returns hash-table size for quality levels 0 and 1. */ static BROTLI_INLINE size_t MaxHashTableSize(int quality) { return quality == FAST_ONE_PASS_COMPRESSION_QUALITY ? 1 << 15 : 1 << 17; } /* The maximum length for which the zopflification uses distinct distances. */ #define MAX_ZOPFLI_LEN_QUALITY_10 150 #define MAX_ZOPFLI_LEN_QUALITY_11 325 /* Do not thoroughly search when a long copy is found. */ #define BROTLI_LONG_COPY_QUICK_STEP 16384 static BROTLI_INLINE size_t MaxZopfliLen(const BrotliEncoderParams* params) { return params->quality <= 10 ? MAX_ZOPFLI_LEN_QUALITY_10 : MAX_ZOPFLI_LEN_QUALITY_11; } /* Number of best candidates to evaluate to expand Zopfli chain. */ static BROTLI_INLINE size_t MaxZopfliCandidates( const BrotliEncoderParams* params) { return params->quality <= 10 ? 1 : 5; } static BROTLI_INLINE void SanitizeParams(BrotliEncoderParams* params) { params->quality = BROTLI_MIN(int, BROTLI_MAX_QUALITY, BROTLI_MAX(int, BROTLI_MIN_QUALITY, params->quality)); if (params->quality <= MAX_QUALITY_FOR_STATIC_ENTROPY_CODES) { params->large_window = BROTLI_FALSE; } if (params->lgwin < BROTLI_MIN_WINDOW_BITS) { params->lgwin = BROTLI_MIN_WINDOW_BITS; } else { int max_lgwin = params->large_window ? BROTLI_LARGE_MAX_WINDOW_BITS : BROTLI_MAX_WINDOW_BITS; if (params->lgwin > max_lgwin) params->lgwin = max_lgwin; } } /* Returns optimized lg_block value. */ static BROTLI_INLINE int ComputeLgBlock(const BrotliEncoderParams* params) { int lgblock = params->lgblock; if (params->quality == FAST_ONE_PASS_COMPRESSION_QUALITY || params->quality == FAST_TWO_PASS_COMPRESSION_QUALITY) { lgblock = params->lgwin; } else if (params->quality < MIN_QUALITY_FOR_BLOCK_SPLIT) { lgblock = 14; } else if (lgblock == 0) { lgblock = 16; if (params->quality >= 9 && params->lgwin > lgblock) { lgblock = BROTLI_MIN(int, 18, params->lgwin); } } else { lgblock = BROTLI_MIN(int, BROTLI_MAX_INPUT_BLOCK_BITS, BROTLI_MAX(int, BROTLI_MIN_INPUT_BLOCK_BITS, lgblock)); } return lgblock; } /* Returns log2 of the size of main ring buffer area. Allocate at least lgwin + 1 bits for the ring buffer so that the newly added block fits there completely and we still get lgwin bits and at least read_block_size_bits + 1 bits because the copy tail length needs to be smaller than ring-buffer size. */ static BROTLI_INLINE int ComputeRbBits(const BrotliEncoderParams* params) { return 1 + BROTLI_MAX(int, params->lgwin, params->lgblock); } static BROTLI_INLINE size_t MaxMetablockSize( const BrotliEncoderParams* params) { int bits = BROTLI_MIN(int, ComputeRbBits(params), BROTLI_MAX_INPUT_BLOCK_BITS); return (size_t)1 << bits; } /* When searching for backward references and have not seen matches for a long time, we can skip some match lookups. Unsuccessful match lookups are very expensive and this kind of a heuristic speeds up compression quite a lot. At first 8 byte strides are taken and every second byte is put to hasher. After 4x more literals stride by 16 bytes, every put 4-th byte to hasher. Applied only to qualities 2 to 9. */ static BROTLI_INLINE size_t LiteralSpreeLengthForSparseSearch( const BrotliEncoderParams* params) { return params->quality < 9 ? 64 : 512; } static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params, BrotliHasherParams* hparams) { if (params->quality > 9) { hparams->type = 10; } else if (params->quality == 4 && params->size_hint >= (1 << 20)) { hparams->type = 54; } else if (params->quality < 5) { hparams->type = params->quality; } else if (params->lgwin <= 16) { hparams->type = params->quality < 7 ? 40 : params->quality < 9 ? 41 : 42; } else if (params->size_hint >= (1 << 20) && params->lgwin >= 19) { hparams->type = 6; hparams->block_bits = params->quality - 1; hparams->bucket_bits = 15; hparams->hash_len = 5; hparams->num_last_distances_to_check = params->quality < 7 ? 4 : params->quality < 9 ? 10 : 16; } else { hparams->type = 5; hparams->block_bits = params->quality - 1; hparams->bucket_bits = params->quality < 7 ? 14 : 15; hparams->num_last_distances_to_check = params->quality < 7 ? 4 : params->quality < 9 ? 10 : 16; } if (params->lgwin > 24) { /* Different hashers for large window brotli: not for qualities <= 2, these are too fast for large window. Not for qualities >= 10: their hasher already works well with large window. So the changes are: H3 --> H35: for quality 3. H54 --> H55: for quality 4 with size hint > 1MB H6 --> H65: for qualities 5, 6, 7, 8, 9. */ if (hparams->type == 3) { hparams->type = 35; } if (hparams->type == 54) { hparams->type = 55; } if (hparams->type == 6) { hparams->type = 65; } } } #endif /* BROTLI_ENC_QUALITY_H_ */ dvisvgm-2.8.1/libs/brotli/enc/params.h0000664000175000017500000000206613510660062014554 00000000000000/* Copyright 2017 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Parameters for the Brotli encoder with chosen quality levels. */ #ifndef BROTLI_ENC_PARAMS_H_ #define BROTLI_ENC_PARAMS_H_ #include #include "./encoder_dict.h" typedef struct BrotliHasherParams { int type; int bucket_bits; int block_bits; int hash_len; int num_last_distances_to_check; } BrotliHasherParams; typedef struct BrotliDistanceParams { uint32_t distance_postfix_bits; uint32_t num_direct_distance_codes; uint32_t alphabet_size; size_t max_distance; } BrotliDistanceParams; /* Encoding parameters */ typedef struct BrotliEncoderParams { BrotliEncoderMode mode; int quality; int lgwin; int lgblock; size_t size_hint; BROTLI_BOOL disable_literal_context_modeling; BROTLI_BOOL large_window; BrotliHasherParams hasher; BrotliDistanceParams dist; BrotliEncoderDictionary dictionary; } BrotliEncoderParams; #endif /* BROTLI_ENC_PARAMS_H_ */ dvisvgm-2.8.1/libs/brotli/Makefile.am0000664000175000017500000000355313510660062014411 00000000000000if !HAVE_BROTLI noinst_LIBRARIES = libbrotli.a libbrotli_a_SOURCES = \ common/constants.h \ common/context.h \ common/dictionary.c \ common/dictionary.h \ common/platform.h \ common/transform.c \ common/transform.h \ common/version.h \ enc/backward_references.c \ enc/backward_references.h \ enc/backward_references_hq.c \ enc/backward_references_hq.h \ enc/backward_references_inc.h \ enc/bit_cost.c \ enc/bit_cost.h \ enc/bit_cost_inc.h \ enc/block_encoder_inc.h \ enc/block_splitter.c \ enc/block_splitter.h \ enc/block_splitter_inc.h \ enc/brotli_bit_stream.c \ enc/brotli_bit_stream.h \ enc/cluster.c \ enc/cluster.h \ enc/cluster_inc.h \ enc/command.h \ enc/compress_fragment.c \ enc/compress_fragment.h \ enc/compress_fragment_two_pass.c \ enc/compress_fragment_two_pass.h \ enc/dictionary_hash.c \ enc/dictionary_hash.h \ enc/encode.c \ enc/encoder_dict.c \ enc/encoder_dict.h \ enc/entropy_encode.c \ enc/entropy_encode.h \ enc/entropy_encode_static.h \ enc/fast_log.h \ enc/find_match_length.h \ enc/hash_composite_inc.h \ enc/hash_forgetful_chain_inc.h \ enc/hash.h \ enc/hash_longest_match64_inc.h \ enc/hash_longest_match_inc.h \ enc/hash_longest_match_quickly_inc.h \ enc/hash_rolling_inc.h \ enc/hash_to_binary_tree_inc.h \ enc/histogram.c \ enc/histogram.h \ enc/histogram_inc.h \ enc/literal_cost.c \ enc/literal_cost.h \ enc/memory.c \ enc/memory.h \ enc/metablock.c \ enc/metablock.h \ enc/metablock_inc.h \ enc/params.h \ enc/prefix.h \ enc/quality.h \ enc/ringbuffer.h \ enc/static_dict.c \ enc/static_dict.h \ enc/static_dict_lut.h \ enc/utf8_util.c \ enc/utf8_util.h \ enc/write_bits.h \ include/brotli/decode.h \ include/brotli/encode.h \ include/brotli/port.h \ include/brotli/types.h AM_CFLAGS = -Wall -I$(srcdir)/include @CODE_COVERAGE_RULES@ endif EXTRA_DIST = LICENSE CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/brotli/Makefile.in0000664000175000017500000007540013563265577014446 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/brotli ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libbrotli_a_AR = $(AR) $(ARFLAGS) libbrotli_a_LIBADD = am__libbrotli_a_SOURCES_DIST = common/constants.h common/context.h \ common/dictionary.c common/dictionary.h common/platform.h \ common/transform.c common/transform.h common/version.h \ enc/backward_references.c enc/backward_references.h \ enc/backward_references_hq.c enc/backward_references_hq.h \ enc/backward_references_inc.h enc/bit_cost.c enc/bit_cost.h \ enc/bit_cost_inc.h enc/block_encoder_inc.h \ enc/block_splitter.c enc/block_splitter.h \ enc/block_splitter_inc.h enc/brotli_bit_stream.c \ enc/brotli_bit_stream.h enc/cluster.c enc/cluster.h \ enc/cluster_inc.h enc/command.h enc/compress_fragment.c \ enc/compress_fragment.h enc/compress_fragment_two_pass.c \ enc/compress_fragment_two_pass.h enc/dictionary_hash.c \ enc/dictionary_hash.h enc/encode.c enc/encoder_dict.c \ enc/encoder_dict.h enc/entropy_encode.c enc/entropy_encode.h \ enc/entropy_encode_static.h enc/fast_log.h \ enc/find_match_length.h enc/hash_composite_inc.h \ enc/hash_forgetful_chain_inc.h enc/hash.h \ enc/hash_longest_match64_inc.h enc/hash_longest_match_inc.h \ enc/hash_longest_match_quickly_inc.h enc/hash_rolling_inc.h \ enc/hash_to_binary_tree_inc.h enc/histogram.c enc/histogram.h \ enc/histogram_inc.h enc/literal_cost.c enc/literal_cost.h \ enc/memory.c enc/memory.h enc/metablock.c enc/metablock.h \ enc/metablock_inc.h enc/params.h enc/prefix.h enc/quality.h \ enc/ringbuffer.h enc/static_dict.c enc/static_dict.h \ enc/static_dict_lut.h enc/utf8_util.c enc/utf8_util.h \ enc/write_bits.h include/brotli/decode.h \ include/brotli/encode.h include/brotli/port.h \ include/brotli/types.h am__dirstamp = $(am__leading_dot)dirstamp @HAVE_BROTLI_FALSE@am_libbrotli_a_OBJECTS = \ @HAVE_BROTLI_FALSE@ common/dictionary.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ common/transform.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/backward_references.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/backward_references_hq.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/bit_cost.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/block_splitter.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/brotli_bit_stream.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/cluster.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/compress_fragment.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/compress_fragment_two_pass.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/dictionary_hash.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/encode.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/encoder_dict.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/entropy_encode.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/histogram.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/literal_cost.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/memory.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/metablock.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/static_dict.$(OBJEXT) \ @HAVE_BROTLI_FALSE@ enc/utf8_util.$(OBJEXT) libbrotli_a_OBJECTS = $(am_libbrotli_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = common/$(DEPDIR)/dictionary.Po \ common/$(DEPDIR)/transform.Po \ enc/$(DEPDIR)/backward_references.Po \ enc/$(DEPDIR)/backward_references_hq.Po \ enc/$(DEPDIR)/bit_cost.Po enc/$(DEPDIR)/block_splitter.Po \ enc/$(DEPDIR)/brotli_bit_stream.Po enc/$(DEPDIR)/cluster.Po \ enc/$(DEPDIR)/compress_fragment.Po \ enc/$(DEPDIR)/compress_fragment_two_pass.Po \ enc/$(DEPDIR)/dictionary_hash.Po enc/$(DEPDIR)/encode.Po \ enc/$(DEPDIR)/encoder_dict.Po enc/$(DEPDIR)/entropy_encode.Po \ enc/$(DEPDIR)/histogram.Po enc/$(DEPDIR)/literal_cost.Po \ enc/$(DEPDIR)/memory.Po enc/$(DEPDIR)/metablock.Po \ enc/$(DEPDIR)/static_dict.Po enc/$(DEPDIR)/utf8_util.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libbrotli_a_SOURCES) DIST_SOURCES = $(am__libbrotli_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_BROTLI_FALSE@noinst_LIBRARIES = libbrotli.a @HAVE_BROTLI_FALSE@libbrotli_a_SOURCES = \ @HAVE_BROTLI_FALSE@ common/constants.h \ @HAVE_BROTLI_FALSE@ common/context.h \ @HAVE_BROTLI_FALSE@ common/dictionary.c \ @HAVE_BROTLI_FALSE@ common/dictionary.h \ @HAVE_BROTLI_FALSE@ common/platform.h \ @HAVE_BROTLI_FALSE@ common/transform.c \ @HAVE_BROTLI_FALSE@ common/transform.h \ @HAVE_BROTLI_FALSE@ common/version.h \ @HAVE_BROTLI_FALSE@ enc/backward_references.c \ @HAVE_BROTLI_FALSE@ enc/backward_references.h \ @HAVE_BROTLI_FALSE@ enc/backward_references_hq.c \ @HAVE_BROTLI_FALSE@ enc/backward_references_hq.h \ @HAVE_BROTLI_FALSE@ enc/backward_references_inc.h \ @HAVE_BROTLI_FALSE@ enc/bit_cost.c \ @HAVE_BROTLI_FALSE@ enc/bit_cost.h \ @HAVE_BROTLI_FALSE@ enc/bit_cost_inc.h \ @HAVE_BROTLI_FALSE@ enc/block_encoder_inc.h \ @HAVE_BROTLI_FALSE@ enc/block_splitter.c \ @HAVE_BROTLI_FALSE@ enc/block_splitter.h \ @HAVE_BROTLI_FALSE@ enc/block_splitter_inc.h \ @HAVE_BROTLI_FALSE@ enc/brotli_bit_stream.c \ @HAVE_BROTLI_FALSE@ enc/brotli_bit_stream.h \ @HAVE_BROTLI_FALSE@ enc/cluster.c \ @HAVE_BROTLI_FALSE@ enc/cluster.h \ @HAVE_BROTLI_FALSE@ enc/cluster_inc.h \ @HAVE_BROTLI_FALSE@ enc/command.h \ @HAVE_BROTLI_FALSE@ enc/compress_fragment.c \ @HAVE_BROTLI_FALSE@ enc/compress_fragment.h \ @HAVE_BROTLI_FALSE@ enc/compress_fragment_two_pass.c \ @HAVE_BROTLI_FALSE@ enc/compress_fragment_two_pass.h \ @HAVE_BROTLI_FALSE@ enc/dictionary_hash.c \ @HAVE_BROTLI_FALSE@ enc/dictionary_hash.h \ @HAVE_BROTLI_FALSE@ enc/encode.c \ @HAVE_BROTLI_FALSE@ enc/encoder_dict.c \ @HAVE_BROTLI_FALSE@ enc/encoder_dict.h \ @HAVE_BROTLI_FALSE@ enc/entropy_encode.c \ @HAVE_BROTLI_FALSE@ enc/entropy_encode.h \ @HAVE_BROTLI_FALSE@ enc/entropy_encode_static.h \ @HAVE_BROTLI_FALSE@ enc/fast_log.h \ @HAVE_BROTLI_FALSE@ enc/find_match_length.h \ @HAVE_BROTLI_FALSE@ enc/hash_composite_inc.h \ @HAVE_BROTLI_FALSE@ enc/hash_forgetful_chain_inc.h \ @HAVE_BROTLI_FALSE@ enc/hash.h \ @HAVE_BROTLI_FALSE@ enc/hash_longest_match64_inc.h \ @HAVE_BROTLI_FALSE@ enc/hash_longest_match_inc.h \ @HAVE_BROTLI_FALSE@ enc/hash_longest_match_quickly_inc.h \ @HAVE_BROTLI_FALSE@ enc/hash_rolling_inc.h \ @HAVE_BROTLI_FALSE@ enc/hash_to_binary_tree_inc.h \ @HAVE_BROTLI_FALSE@ enc/histogram.c \ @HAVE_BROTLI_FALSE@ enc/histogram.h \ @HAVE_BROTLI_FALSE@ enc/histogram_inc.h \ @HAVE_BROTLI_FALSE@ enc/literal_cost.c \ @HAVE_BROTLI_FALSE@ enc/literal_cost.h \ @HAVE_BROTLI_FALSE@ enc/memory.c \ @HAVE_BROTLI_FALSE@ enc/memory.h \ @HAVE_BROTLI_FALSE@ enc/metablock.c \ @HAVE_BROTLI_FALSE@ enc/metablock.h \ @HAVE_BROTLI_FALSE@ enc/metablock_inc.h \ @HAVE_BROTLI_FALSE@ enc/params.h \ @HAVE_BROTLI_FALSE@ enc/prefix.h \ @HAVE_BROTLI_FALSE@ enc/quality.h \ @HAVE_BROTLI_FALSE@ enc/ringbuffer.h \ @HAVE_BROTLI_FALSE@ enc/static_dict.c \ @HAVE_BROTLI_FALSE@ enc/static_dict.h \ @HAVE_BROTLI_FALSE@ enc/static_dict_lut.h \ @HAVE_BROTLI_FALSE@ enc/utf8_util.c \ @HAVE_BROTLI_FALSE@ enc/utf8_util.h \ @HAVE_BROTLI_FALSE@ enc/write_bits.h \ @HAVE_BROTLI_FALSE@ include/brotli/decode.h \ @HAVE_BROTLI_FALSE@ include/brotli/encode.h \ @HAVE_BROTLI_FALSE@ include/brotli/port.h \ @HAVE_BROTLI_FALSE@ include/brotli/types.h @HAVE_BROTLI_FALSE@AM_CFLAGS = -Wall -I$(srcdir)/include EXTRA_DIST = LICENSE CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/brotli/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/brotli/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) common/$(am__dirstamp): @$(MKDIR_P) common @: > common/$(am__dirstamp) common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) common/$(DEPDIR) @: > common/$(DEPDIR)/$(am__dirstamp) common/dictionary.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/transform.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) enc/$(am__dirstamp): @$(MKDIR_P) enc @: > enc/$(am__dirstamp) enc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) enc/$(DEPDIR) @: > enc/$(DEPDIR)/$(am__dirstamp) enc/backward_references.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/backward_references_hq.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/bit_cost.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/block_splitter.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/brotli_bit_stream.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/cluster.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/compress_fragment.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/compress_fragment_two_pass.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/dictionary_hash.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/encode.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/encoder_dict.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/entropy_encode.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/histogram.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/literal_cost.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/memory.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/metablock.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/static_dict.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) enc/utf8_util.$(OBJEXT): enc/$(am__dirstamp) \ enc/$(DEPDIR)/$(am__dirstamp) libbrotli.a: $(libbrotli_a_OBJECTS) $(libbrotli_a_DEPENDENCIES) $(EXTRA_libbrotli_a_DEPENDENCIES) $(AM_V_at)-rm -f libbrotli.a $(AM_V_AR)$(libbrotli_a_AR) libbrotli.a $(libbrotli_a_OBJECTS) $(libbrotli_a_LIBADD) $(AM_V_at)$(RANLIB) libbrotli.a mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f common/*.$(OBJEXT) -rm -f enc/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/dictionary.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/transform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/backward_references.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/backward_references_hq.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/bit_cost.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/block_splitter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/brotli_bit_stream.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/cluster.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/compress_fragment.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/compress_fragment_two_pass.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/dictionary_hash.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/encode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/encoder_dict.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/entropy_encode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/histogram.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/literal_cost.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/memory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/metablock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/static_dict.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/utf8_util.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f common/$(DEPDIR)/$(am__dirstamp) -rm -f common/$(am__dirstamp) -rm -f enc/$(DEPDIR)/$(am__dirstamp) -rm -f enc/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f common/$(DEPDIR)/dictionary.Po -rm -f common/$(DEPDIR)/transform.Po -rm -f enc/$(DEPDIR)/backward_references.Po -rm -f enc/$(DEPDIR)/backward_references_hq.Po -rm -f enc/$(DEPDIR)/bit_cost.Po -rm -f enc/$(DEPDIR)/block_splitter.Po -rm -f enc/$(DEPDIR)/brotli_bit_stream.Po -rm -f enc/$(DEPDIR)/cluster.Po -rm -f enc/$(DEPDIR)/compress_fragment.Po -rm -f enc/$(DEPDIR)/compress_fragment_two_pass.Po -rm -f enc/$(DEPDIR)/dictionary_hash.Po -rm -f enc/$(DEPDIR)/encode.Po -rm -f enc/$(DEPDIR)/encoder_dict.Po -rm -f enc/$(DEPDIR)/entropy_encode.Po -rm -f enc/$(DEPDIR)/histogram.Po -rm -f enc/$(DEPDIR)/literal_cost.Po -rm -f enc/$(DEPDIR)/memory.Po -rm -f enc/$(DEPDIR)/metablock.Po -rm -f enc/$(DEPDIR)/static_dict.Po -rm -f enc/$(DEPDIR)/utf8_util.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f common/$(DEPDIR)/dictionary.Po -rm -f common/$(DEPDIR)/transform.Po -rm -f enc/$(DEPDIR)/backward_references.Po -rm -f enc/$(DEPDIR)/backward_references_hq.Po -rm -f enc/$(DEPDIR)/bit_cost.Po -rm -f enc/$(DEPDIR)/block_splitter.Po -rm -f enc/$(DEPDIR)/brotli_bit_stream.Po -rm -f enc/$(DEPDIR)/cluster.Po -rm -f enc/$(DEPDIR)/compress_fragment.Po -rm -f enc/$(DEPDIR)/compress_fragment_two_pass.Po -rm -f enc/$(DEPDIR)/dictionary_hash.Po -rm -f enc/$(DEPDIR)/encode.Po -rm -f enc/$(DEPDIR)/encoder_dict.Po -rm -f enc/$(DEPDIR)/entropy_encode.Po -rm -f enc/$(DEPDIR)/histogram.Po -rm -f enc/$(DEPDIR)/literal_cost.Po -rm -f enc/$(DEPDIR)/memory.Po -rm -f enc/$(DEPDIR)/metablock.Po -rm -f enc/$(DEPDIR)/static_dict.Po -rm -f enc/$(DEPDIR)/utf8_util.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @HAVE_BROTLI_FALSE@@CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/brotli/include/0000775000175000017500000000000013563265646014073 500000000000000dvisvgm-2.8.1/libs/brotli/include/brotli/0000775000175000017500000000000013563265646015366 500000000000000dvisvgm-2.8.1/libs/brotli/include/brotli/decode.h0000664000175000017500000003376313510660062016675 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /** * @file * API for Brotli decompression. */ #ifndef BROTLI_DEC_DECODE_H_ #define BROTLI_DEC_DECODE_H_ #include #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /** * Opaque structure that holds decoder state. * * Allocated and initialized with ::BrotliDecoderCreateInstance. * Cleaned up and deallocated with ::BrotliDecoderDestroyInstance. */ typedef struct BrotliDecoderStateStruct BrotliDecoderState; /** * Result type for ::BrotliDecoderDecompress and * ::BrotliDecoderDecompressStream functions. */ typedef enum { /** Decoding error, e.g. corrupted input or memory allocation problem. */ BROTLI_DECODER_RESULT_ERROR = 0, /** Decoding successfully completed. */ BROTLI_DECODER_RESULT_SUCCESS = 1, /** Partially done; should be called again with more input. */ BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT = 2, /** Partially done; should be called again with more output. */ BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT = 3 } BrotliDecoderResult; /** * Template that evaluates items of ::BrotliDecoderErrorCode. * * Example: @code {.cpp} * // Log Brotli error code. * switch (brotliDecoderErrorCode) { * #define CASE_(PREFIX, NAME, CODE) \ * case BROTLI_DECODER ## PREFIX ## NAME: \ * LOG(INFO) << "error code:" << #NAME; \ * break; * #define NEWLINE_ * BROTLI_DECODER_ERROR_CODES_LIST(CASE_, NEWLINE_) * #undef CASE_ * #undef NEWLINE_ * default: LOG(FATAL) << "unknown brotli error code"; * } * @endcode */ #define BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE, SEPARATOR) \ BROTLI_ERROR_CODE(_, NO_ERROR, 0) SEPARATOR \ /* Same as BrotliDecoderResult values */ \ BROTLI_ERROR_CODE(_, SUCCESS, 1) SEPARATOR \ BROTLI_ERROR_CODE(_, NEEDS_MORE_INPUT, 2) SEPARATOR \ BROTLI_ERROR_CODE(_, NEEDS_MORE_OUTPUT, 3) SEPARATOR \ \ /* Errors caused by invalid input */ \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, EXUBERANT_NIBBLE, -1) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, RESERVED, -2) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, EXUBERANT_META_NIBBLE, -3) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, SIMPLE_HUFFMAN_ALPHABET, -4) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, SIMPLE_HUFFMAN_SAME, -5) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, CL_SPACE, -6) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, HUFFMAN_SPACE, -7) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, CONTEXT_MAP_REPEAT, -8) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_LENGTH_1, -9) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, BLOCK_LENGTH_2, -10) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, TRANSFORM, -11) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, DICTIONARY, -12) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, WINDOW_BITS, -13) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_1, -14) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_FORMAT_, DISTANCE, -16) SEPARATOR \ \ /* -17..-18 codes are reserved */ \ \ BROTLI_ERROR_CODE(_ERROR_, DICTIONARY_NOT_SET, -19) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_, INVALID_ARGUMENTS, -20) SEPARATOR \ \ /* Memory allocation problems */ \ BROTLI_ERROR_CODE(_ERROR_ALLOC_, CONTEXT_MODES, -21) SEPARATOR \ /* Literal, insert and distance trees together */ \ BROTLI_ERROR_CODE(_ERROR_ALLOC_, TREE_GROUPS, -22) SEPARATOR \ /* -23..-24 codes are reserved for distinct tree groups */ \ BROTLI_ERROR_CODE(_ERROR_ALLOC_, CONTEXT_MAP, -25) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_ALLOC_, RING_BUFFER_1, -26) SEPARATOR \ BROTLI_ERROR_CODE(_ERROR_ALLOC_, RING_BUFFER_2, -27) SEPARATOR \ /* -28..-29 codes are reserved for dynamic ring-buffer allocation */ \ BROTLI_ERROR_CODE(_ERROR_ALLOC_, BLOCK_TYPE_TREES, -30) SEPARATOR \ \ /* "Impossible" states */ \ BROTLI_ERROR_CODE(_ERROR_, UNREACHABLE, -31) /** * Error code for detailed logging / production debugging. * * See ::BrotliDecoderGetErrorCode and ::BROTLI_LAST_ERROR_CODE. */ typedef enum { #define BROTLI_COMMA_ , #define BROTLI_ERROR_CODE_ENUM_ITEM_(PREFIX, NAME, CODE) \ BROTLI_DECODER ## PREFIX ## NAME = CODE BROTLI_DECODER_ERROR_CODES_LIST(BROTLI_ERROR_CODE_ENUM_ITEM_, BROTLI_COMMA_) } BrotliDecoderErrorCode; #undef BROTLI_ERROR_CODE_ENUM_ITEM_ #undef BROTLI_COMMA_ /** * The value of the last error code, negative integer. * * All other error code values are in the range from ::BROTLI_LAST_ERROR_CODE * to @c -1. There are also 4 other possible non-error codes @c 0 .. @c 3 in * ::BrotliDecoderErrorCode enumeration. */ #define BROTLI_LAST_ERROR_CODE BROTLI_DECODER_ERROR_UNREACHABLE /** Options to be used with ::BrotliDecoderSetParameter. */ typedef enum BrotliDecoderParameter { /** * Disable "canny" ring buffer allocation strategy. * * Ring buffer is allocated according to window size, despite the real size of * the content. */ BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION = 0, /** * Flag that determines if "Large Window Brotli" is used. */ BROTLI_DECODER_PARAM_LARGE_WINDOW = 1 } BrotliDecoderParameter; /** * Sets the specified parameter to the given decoder instance. * * @param state decoder instance * @param param parameter to set * @param value new parameter value * @returns ::BROTLI_FALSE if parameter is unrecognized, or value is invalid * @returns ::BROTLI_TRUE if value is accepted */ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderSetParameter( BrotliDecoderState* state, BrotliDecoderParameter param, uint32_t value); /** * Creates an instance of ::BrotliDecoderState and initializes it. * * The instance can be used once for decoding and should then be destroyed with * ::BrotliDecoderDestroyInstance, it cannot be reused for a new decoding * session. * * @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the * case they are both zero, default memory allocators are used. @p opaque is * passed to @p alloc_func and @p free_func when they are called. @p free_func * has to return without doing anything when asked to free a NULL pointer. * * @param alloc_func custom memory allocation function * @param free_func custom memory free function * @param opaque custom memory manager handle * @returns @c 0 if instance can not be allocated or initialized * @returns pointer to initialized ::BrotliDecoderState otherwise */ BROTLI_DEC_API BrotliDecoderState* BrotliDecoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque); /** * Deinitializes and frees ::BrotliDecoderState instance. * * @param state decoder instance to be cleaned up and deallocated */ BROTLI_DEC_API void BrotliDecoderDestroyInstance(BrotliDecoderState* state); /** * Performs one-shot memory-to-memory decompression. * * Decompresses the data in @p encoded_buffer into @p decoded_buffer, and sets * @p *decoded_size to the decompressed length. * * @param encoded_size size of @p encoded_buffer * @param encoded_buffer compressed data buffer with at least @p encoded_size * addressable bytes * @param[in, out] decoded_size @b in: size of @p decoded_buffer; \n * @b out: length of decompressed data written to * @p decoded_buffer * @param decoded_buffer decompressed data destination buffer * @returns ::BROTLI_DECODER_RESULT_ERROR if input is corrupted, memory * allocation failed, or @p decoded_buffer is not large enough; * @returns ::BROTLI_DECODER_RESULT_SUCCESS otherwise */ BROTLI_DEC_API BrotliDecoderResult BrotliDecoderDecompress( size_t encoded_size, const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)], size_t* decoded_size, uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]); /** * Decompresses the input stream to the output stream. * * The values @p *available_in and @p *available_out must specify the number of * bytes addressable at @p *next_in and @p *next_out respectively. * When @p *available_out is @c 0, @p next_out is allowed to be @c NULL. * * After each call, @p *available_in will be decremented by the amount of input * bytes consumed, and the @p *next_in pointer will be incremented by that * amount. Similarly, @p *available_out will be decremented by the amount of * output bytes written, and the @p *next_out pointer will be incremented by * that amount. * * @p total_out, if it is not a null-pointer, will be set to the number * of bytes decompressed since the last @p state initialization. * * @note Input is never overconsumed, so @p next_in and @p available_in could be * passed to the next consumer after decoding is complete. * * @param state decoder instance * @param[in, out] available_in @b in: amount of available input; \n * @b out: amount of unused input * @param[in, out] next_in pointer to the next compressed byte * @param[in, out] available_out @b in: length of output buffer; \n * @b out: remaining size of output buffer * @param[in, out] next_out output buffer cursor; * can be @c NULL if @p available_out is @c 0 * @param[out] total_out number of bytes decompressed so far; can be @c NULL * @returns ::BROTLI_DECODER_RESULT_ERROR if input is corrupted, memory * allocation failed, arguments were invalid, etc.; * use ::BrotliDecoderGetErrorCode to get detailed error code * @returns ::BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT decoding is blocked until * more input data is provided * @returns ::BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT decoding is blocked until * more output space is provided * @returns ::BROTLI_DECODER_RESULT_SUCCESS decoding is finished, no more * input might be consumed and no more output will be produced */ BROTLI_DEC_API BrotliDecoderResult BrotliDecoderDecompressStream( BrotliDecoderState* state, size_t* available_in, const uint8_t** next_in, size_t* available_out, uint8_t** next_out, size_t* total_out); /** * Checks if decoder has more output. * * @param state decoder instance * @returns ::BROTLI_TRUE, if decoder has some unconsumed output * @returns ::BROTLI_FALSE otherwise */ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderHasMoreOutput( const BrotliDecoderState* state); /** * Acquires pointer to internal output buffer. * * This method is used to make language bindings easier and more efficient: * -# push data to ::BrotliDecoderDecompressStream, * until ::BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT is reported * -# use ::BrotliDecoderTakeOutput to peek bytes and copy to language-specific * entity * * Also this could be useful if there is an output stream that is able to * consume all the provided data (e.g. when data is saved to file system). * * @attention After every call to ::BrotliDecoderTakeOutput @p *size bytes of * output are considered consumed for all consecutive calls to the * instance methods; returned pointer becomes invalidated as well. * * @note Decoder output is not guaranteed to be contiguous. This means that * after the size-unrestricted call to ::BrotliDecoderTakeOutput, * immediate next call to ::BrotliDecoderTakeOutput may return more data. * * @param state decoder instance * @param[in, out] size @b in: number of bytes caller is ready to take, @c 0 if * any amount could be handled; \n * @b out: amount of data pointed by returned pointer and * considered consumed; \n * out value is never greater than in value, unless it is @c 0 * @returns pointer to output data */ BROTLI_DEC_API const uint8_t* BrotliDecoderTakeOutput( BrotliDecoderState* state, size_t* size); /** * Checks if instance has already consumed input. * * Instance that returns ::BROTLI_FALSE is considered "fresh" and could be * reused. * * @param state decoder instance * @returns ::BROTLI_TRUE if decoder has already used some input bytes * @returns ::BROTLI_FALSE otherwise */ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderIsUsed(const BrotliDecoderState* state); /** * Checks if decoder instance reached the final state. * * @param state decoder instance * @returns ::BROTLI_TRUE if decoder is in a state where it reached the end of * the input and produced all of the output * @returns ::BROTLI_FALSE otherwise */ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderIsFinished( const BrotliDecoderState* state); /** * Acquires a detailed error code. * * Should be used only after ::BrotliDecoderDecompressStream returns * ::BROTLI_DECODER_RESULT_ERROR. * * See also ::BrotliDecoderErrorString * * @param state decoder instance * @returns last saved error code */ BROTLI_DEC_API BrotliDecoderErrorCode BrotliDecoderGetErrorCode( const BrotliDecoderState* state); /** * Converts error code to a c-string. */ BROTLI_DEC_API const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c); /** * Gets a decoder library version. * * Look at BROTLI_VERSION for more information. */ BROTLI_DEC_API uint32_t BrotliDecoderVersion(void); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_DEC_DECODE_H_ */ dvisvgm-2.8.1/libs/brotli/include/brotli/types.h0000664000175000017500000000506713510660062016612 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /** * @file * Common types used in decoder and encoder API. */ #ifndef BROTLI_COMMON_TYPES_H_ #define BROTLI_COMMON_TYPES_H_ #include /* for size_t */ #if defined(_MSC_VER) && (_MSC_VER < 1600) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; typedef __int64 int64_t; #else #include #endif /* defined(_MSC_VER) && (_MSC_VER < 1600) */ /** * A portable @c bool replacement. * * ::BROTLI_BOOL is a "documentation" type: actually it is @c int, but in API it * denotes a type, whose only values are ::BROTLI_TRUE and ::BROTLI_FALSE. * * ::BROTLI_BOOL values passed to Brotli should either be ::BROTLI_TRUE or * ::BROTLI_FALSE, or be a result of ::TO_BROTLI_BOOL macros. * * ::BROTLI_BOOL values returned by Brotli should not be tested for equality * with @c true, @c false, ::BROTLI_TRUE, ::BROTLI_FALSE, but rather should be * evaluated, for example: @code{.cpp} * if (SomeBrotliFunction(encoder, BROTLI_TRUE) && * !OtherBrotliFunction(decoder, BROTLI_FALSE)) { * bool x = !!YetAnotherBrotliFunction(encoder, TO_BROLTI_BOOL(2 * 2 == 4)); * DoSomething(x); * } * @endcode */ #define BROTLI_BOOL int /** Portable @c true replacement. */ #define BROTLI_TRUE 1 /** Portable @c false replacement. */ #define BROTLI_FALSE 0 /** @c bool to ::BROTLI_BOOL conversion macros. */ #define TO_BROTLI_BOOL(X) (!!(X) ? BROTLI_TRUE : BROTLI_FALSE) #define BROTLI_MAKE_UINT64_T(high, low) ((((uint64_t)(high)) << 32) | low) #define BROTLI_UINT32_MAX (~((uint32_t)0)) #define BROTLI_SIZE_MAX (~((size_t)0)) /** * Allocating function pointer type. * * @param opaque custom memory manager handle provided by client * @param size requested memory region size; can not be @c 0 * @returns @c 0 in the case of failure * @returns a valid pointer to a memory region of at least @p size bytes * long otherwise */ typedef void* (*brotli_alloc_func)(void* opaque, size_t size); /** * Deallocating function pointer type. * * This function @b SHOULD do nothing if @p address is @c 0. * * @param opaque custom memory manager handle provided by client * @param address memory region pointer returned by ::brotli_alloc_func, or @c 0 */ typedef void (*brotli_free_func)(void* opaque, void* address); #endif /* BROTLI_COMMON_TYPES_H_ */ dvisvgm-2.8.1/libs/brotli/include/brotli/encode.h0000664000175000017500000004002313510660062016672 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /** * @file * API for Brotli compression. */ #ifndef BROTLI_ENC_ENCODE_H_ #define BROTLI_ENC_ENCODE_H_ #include #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /** Minimal value for ::BROTLI_PARAM_LGWIN parameter. */ #define BROTLI_MIN_WINDOW_BITS 10 /** * Maximal value for ::BROTLI_PARAM_LGWIN parameter. * * @note equal to @c BROTLI_MAX_DISTANCE_BITS constant. */ #define BROTLI_MAX_WINDOW_BITS 24 /** * Maximal value for ::BROTLI_PARAM_LGWIN parameter * in "Large Window Brotli" (32-bit). */ #define BROTLI_LARGE_MAX_WINDOW_BITS 30 /** Minimal value for ::BROTLI_PARAM_LGBLOCK parameter. */ #define BROTLI_MIN_INPUT_BLOCK_BITS 16 /** Maximal value for ::BROTLI_PARAM_LGBLOCK parameter. */ #define BROTLI_MAX_INPUT_BLOCK_BITS 24 /** Minimal value for ::BROTLI_PARAM_QUALITY parameter. */ #define BROTLI_MIN_QUALITY 0 /** Maximal value for ::BROTLI_PARAM_QUALITY parameter. */ #define BROTLI_MAX_QUALITY 11 /** Options for ::BROTLI_PARAM_MODE parameter. */ typedef enum BrotliEncoderMode { /** * Default compression mode. * * In this mode compressor does not know anything in advance about the * properties of the input. */ BROTLI_MODE_GENERIC = 0, /** Compression mode for UTF-8 formatted text input. */ BROTLI_MODE_TEXT = 1, /** Compression mode used in WOFF 2.0. */ BROTLI_MODE_FONT = 2 } BrotliEncoderMode; /** Default value for ::BROTLI_PARAM_QUALITY parameter. */ #define BROTLI_DEFAULT_QUALITY 11 /** Default value for ::BROTLI_PARAM_LGWIN parameter. */ #define BROTLI_DEFAULT_WINDOW 22 /** Default value for ::BROTLI_PARAM_MODE parameter. */ #define BROTLI_DEFAULT_MODE BROTLI_MODE_GENERIC /** Operations that can be performed by streaming encoder. */ typedef enum BrotliEncoderOperation { /** * Process input. * * Encoder may postpone producing output, until it has processed enough input. */ BROTLI_OPERATION_PROCESS = 0, /** * Produce output for all processed input. * * Actual flush is performed when input stream is depleted and there is enough * space in output stream. This means that client should repeat * ::BROTLI_OPERATION_FLUSH operation until @p available_in becomes @c 0, and * ::BrotliEncoderHasMoreOutput returns ::BROTLI_FALSE. If output is acquired * via ::BrotliEncoderTakeOutput, then operation should be repeated after * output buffer is drained. * * @warning Until flush is complete, client @b SHOULD @b NOT swap, * reduce or extend input stream. * * When flush is complete, output data will be sufficient for decoder to * reproduce all the given input. */ BROTLI_OPERATION_FLUSH = 1, /** * Finalize the stream. * * Actual finalization is performed when input stream is depleted and there is * enough space in output stream. This means that client should repeat * ::BROTLI_OPERATION_FINISH operation until @p available_in becomes @c 0, and * ::BrotliEncoderHasMoreOutput returns ::BROTLI_FALSE. If output is acquired * via ::BrotliEncoderTakeOutput, then operation should be repeated after * output buffer is drained. * * @warning Until finalization is complete, client @b SHOULD @b NOT swap, * reduce or extend input stream. * * Helper function ::BrotliEncoderIsFinished checks if stream is finalized and * output fully dumped. * * Adding more input data to finalized stream is impossible. */ BROTLI_OPERATION_FINISH = 2, /** * Emit metadata block to stream. * * Metadata is opaque to Brotli: neither encoder, nor decoder processes this * data or relies on it. It may be used to pass some extra information from * encoder client to decoder client without interfering with main data stream. * * @note Encoder may emit empty metadata blocks internally, to pad encoded * stream to byte boundary. * * @warning Until emitting metadata is complete client @b SHOULD @b NOT swap, * reduce or extend input stream. * * @warning The whole content of input buffer is considered to be the content * of metadata block. Do @b NOT @e append metadata to input stream, * before it is depleted with other operations. * * Stream is soft-flushed before metadata block is emitted. Metadata block * @b MUST be no longer than than 16MiB. */ BROTLI_OPERATION_EMIT_METADATA = 3 } BrotliEncoderOperation; /** Options to be used with ::BrotliEncoderSetParameter. */ typedef enum BrotliEncoderParameter { /** * Tune encoder for specific input. * * ::BrotliEncoderMode enumerates all available values. */ BROTLI_PARAM_MODE = 0, /** * The main compression speed-density lever. * * The higher the quality, the slower the compression. Range is * from ::BROTLI_MIN_QUALITY to ::BROTLI_MAX_QUALITY. */ BROTLI_PARAM_QUALITY = 1, /** * Recommended sliding LZ77 window size. * * Encoder may reduce this value, e.g. if input is much smaller than * window size. * * Window size is `(1 << value) - 16`. * * Range is from ::BROTLI_MIN_WINDOW_BITS to ::BROTLI_MAX_WINDOW_BITS. */ BROTLI_PARAM_LGWIN = 2, /** * Recommended input block size. * * Encoder may reduce this value, e.g. if input is much smaller than input * block size. * * Range is from ::BROTLI_MIN_INPUT_BLOCK_BITS to * ::BROTLI_MAX_INPUT_BLOCK_BITS. * * @note Bigger input block size allows better compression, but consumes more * memory. \n The rough formula of memory used for temporary input * storage is `3 << lgBlock`. */ BROTLI_PARAM_LGBLOCK = 3, /** * Flag that affects usage of "literal context modeling" format feature. * * This flag is a "decoding-speed vs compression ratio" trade-off. */ BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING = 4, /** * Estimated total input size for all ::BrotliEncoderCompressStream calls. * * The default value is 0, which means that the total input size is unknown. */ BROTLI_PARAM_SIZE_HINT = 5, /** * Flag that determines if "Large Window Brotli" is used. */ BROTLI_PARAM_LARGE_WINDOW = 6, /** * Recommended number of postfix bits (NPOSTFIX). * * Encoder may change this value. * * Range is from 0 to ::BROTLI_MAX_NPOSTFIX. */ BROTLI_PARAM_NPOSTFIX = 7, /** * Recommended number of direct distance codes (NDIRECT). * * Encoder may change this value. * * Range is from 0 to (15 << NPOSTFIX) in steps of (1 << NPOSTFIX). */ BROTLI_PARAM_NDIRECT = 8 } BrotliEncoderParameter; /** * Opaque structure that holds encoder state. * * Allocated and initialized with ::BrotliEncoderCreateInstance. * Cleaned up and deallocated with ::BrotliEncoderDestroyInstance. */ typedef struct BrotliEncoderStateStruct BrotliEncoderState; /** * Sets the specified parameter to the given encoder instance. * * @param state encoder instance * @param param parameter to set * @param value new parameter value * @returns ::BROTLI_FALSE if parameter is unrecognized, or value is invalid * @returns ::BROTLI_FALSE if value of parameter can not be changed at current * encoder state (e.g. when encoding is started, window size might be * already encoded and therefore it is impossible to change it) * @returns ::BROTLI_TRUE if value is accepted * @warning invalid values might be accepted in case they would not break * encoding process. */ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderSetParameter( BrotliEncoderState* state, BrotliEncoderParameter param, uint32_t value); /** * Creates an instance of ::BrotliEncoderState and initializes it. * * @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the * case they are both zero, default memory allocators are used. @p opaque is * passed to @p alloc_func and @p free_func when they are called. @p free_func * has to return without doing anything when asked to free a NULL pointer. * * @param alloc_func custom memory allocation function * @param free_func custom memory free function * @param opaque custom memory manager handle * @returns @c 0 if instance can not be allocated or initialized * @returns pointer to initialized ::BrotliEncoderState otherwise */ BROTLI_ENC_API BrotliEncoderState* BrotliEncoderCreateInstance( brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque); /** * Deinitializes and frees ::BrotliEncoderState instance. * * @param state decoder instance to be cleaned up and deallocated */ BROTLI_ENC_API void BrotliEncoderDestroyInstance(BrotliEncoderState* state); /** * Calculates the output size bound for the given @p input_size. * * @warning Result is only valid if quality is at least @c 2 and, in * case ::BrotliEncoderCompressStream was used, no flushes * (::BROTLI_OPERATION_FLUSH) were performed. * * @param input_size size of projected input * @returns @c 0 if result does not fit @c size_t */ BROTLI_ENC_API size_t BrotliEncoderMaxCompressedSize(size_t input_size); /** * Performs one-shot memory-to-memory compression. * * Compresses the data in @p input_buffer into @p encoded_buffer, and sets * @p *encoded_size to the compressed length. * * @note If ::BrotliEncoderMaxCompressedSize(@p input_size) returns non-zero * value, then output is guaranteed to be no longer than that. * * @param quality quality parameter value, e.g. ::BROTLI_DEFAULT_QUALITY * @param lgwin lgwin parameter value, e.g. ::BROTLI_DEFAULT_WINDOW * @param mode mode parameter value, e.g. ::BROTLI_DEFAULT_MODE * @param input_size size of @p input_buffer * @param input_buffer input data buffer with at least @p input_size * addressable bytes * @param[in, out] encoded_size @b in: size of @p encoded_buffer; \n * @b out: length of compressed data written to * @p encoded_buffer, or @c 0 if compression fails * @param encoded_buffer compressed data destination buffer * @returns ::BROTLI_FALSE in case of compression error * @returns ::BROTLI_FALSE if output buffer is too small * @returns ::BROTLI_TRUE otherwise */ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderCompress( int quality, int lgwin, BrotliEncoderMode mode, size_t input_size, const uint8_t input_buffer[BROTLI_ARRAY_PARAM(input_size)], size_t* encoded_size, uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(*encoded_size)]); /** * Compresses input stream to output stream. * * The values @p *available_in and @p *available_out must specify the number of * bytes addressable at @p *next_in and @p *next_out respectively. * When @p *available_out is @c 0, @p next_out is allowed to be @c NULL. * * After each call, @p *available_in will be decremented by the amount of input * bytes consumed, and the @p *next_in pointer will be incremented by that * amount. Similarly, @p *available_out will be decremented by the amount of * output bytes written, and the @p *next_out pointer will be incremented by * that amount. * * @p total_out, if it is not a null-pointer, will be set to the number * of bytes compressed since the last @p state initialization. * * * * Internally workflow consists of 3 tasks: * -# (optionally) copy input data to internal buffer * -# actually compress data and (optionally) store it to internal buffer * -# (optionally) copy compressed bytes from internal buffer to output stream * * Whenever all 3 tasks can't move forward anymore, or error occurs, this * method returns the control flow to caller. * * @p op is used to perform flush, finish the stream, or inject metadata block. * See ::BrotliEncoderOperation for more information. * * Flushing the stream means forcing encoding of all input passed to encoder and * completing the current output block, so it could be fully decoded by stream * decoder. To perform flush set @p op to ::BROTLI_OPERATION_FLUSH. * Under some circumstances (e.g. lack of output stream capacity) this operation * would require several calls to ::BrotliEncoderCompressStream. The method must * be called again until both input stream is depleted and encoder has no more * output (see ::BrotliEncoderHasMoreOutput) after the method is called. * * Finishing the stream means encoding of all input passed to encoder and * adding specific "final" marks, so stream decoder could determine that stream * is complete. To perform finish set @p op to ::BROTLI_OPERATION_FINISH. * Under some circumstances (e.g. lack of output stream capacity) this operation * would require several calls to ::BrotliEncoderCompressStream. The method must * be called again until both input stream is depleted and encoder has no more * output (see ::BrotliEncoderHasMoreOutput) after the method is called. * * @warning When flushing and finishing, @p op should not change until operation * is complete; input stream should not be swapped, reduced or * extended as well. * * @param state encoder instance * @param op requested operation * @param[in, out] available_in @b in: amount of available input; \n * @b out: amount of unused input * @param[in, out] next_in pointer to the next input byte * @param[in, out] available_out @b in: length of output buffer; \n * @b out: remaining size of output buffer * @param[in, out] next_out compressed output buffer cursor; * can be @c NULL if @p available_out is @c 0 * @param[out] total_out number of bytes produced so far; can be @c NULL * @returns ::BROTLI_FALSE if there was an error * @returns ::BROTLI_TRUE otherwise */ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderCompressStream( BrotliEncoderState* state, BrotliEncoderOperation op, size_t* available_in, const uint8_t** next_in, size_t* available_out, uint8_t** next_out, size_t* total_out); /** * Checks if encoder instance reached the final state. * * @param state encoder instance * @returns ::BROTLI_TRUE if encoder is in a state where it reached the end of * the input and produced all of the output * @returns ::BROTLI_FALSE otherwise */ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderIsFinished(BrotliEncoderState* state); /** * Checks if encoder has more output. * * @param state encoder instance * @returns ::BROTLI_TRUE, if encoder has some unconsumed output * @returns ::BROTLI_FALSE otherwise */ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderHasMoreOutput( BrotliEncoderState* state); /** * Acquires pointer to internal output buffer. * * This method is used to make language bindings easier and more efficient: * -# push data to ::BrotliEncoderCompressStream, * until ::BrotliEncoderHasMoreOutput returns BROTL_TRUE * -# use ::BrotliEncoderTakeOutput to peek bytes and copy to language-specific * entity * * Also this could be useful if there is an output stream that is able to * consume all the provided data (e.g. when data is saved to file system). * * @attention After every call to ::BrotliEncoderTakeOutput @p *size bytes of * output are considered consumed for all consecutive calls to the * instance methods; returned pointer becomes invalidated as well. * * @note Encoder output is not guaranteed to be contiguous. This means that * after the size-unrestricted call to ::BrotliEncoderTakeOutput, * immediate next call to ::BrotliEncoderTakeOutput may return more data. * * @param state encoder instance * @param[in, out] size @b in: number of bytes caller is ready to take, @c 0 if * any amount could be handled; \n * @b out: amount of data pointed by returned pointer and * considered consumed; \n * out value is never greater than in value, unless it is @c 0 * @returns pointer to output data */ BROTLI_ENC_API const uint8_t* BrotliEncoderTakeOutput( BrotliEncoderState* state, size_t* size); /** * Gets an encoder library version. * * Look at BROTLI_VERSION for more information. */ BROTLI_ENC_API uint32_t BrotliEncoderVersion(void); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_ENC_ENCODE_H_ */ dvisvgm-2.8.1/libs/brotli/include/brotli/port.h0000664000175000017500000002405013510660062016423 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Macros for compiler / platform specific API declarations. */ #ifndef BROTLI_COMMON_PORT_H_ #define BROTLI_COMMON_PORT_H_ /* The following macros were borrowed from https://github.com/nemequ/hedley * with permission of original author - Evan Nemerson */ /* >>> >>> >>> hedley macros */ #define BROTLI_MAKE_VERSION(major, minor, revision) \ (((major) * 1000000) + ((minor) * 1000) + (revision)) #if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) #define BROTLI_GNUC_VERSION \ BROTLI_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) #elif defined(__GNUC__) #define BROTLI_GNUC_VERSION BROTLI_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, 0) #endif #if defined(BROTLI_GNUC_VERSION) #define BROTLI_GNUC_VERSION_CHECK(major, minor, patch) \ (BROTLI_GNUC_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_GNUC_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) #define BROTLI_MSVC_VERSION \ BROTLI_MAKE_VERSION((_MSC_FULL_VER / 10000000), \ (_MSC_FULL_VER % 10000000) / 100000, \ (_MSC_FULL_VER % 100000) / 100) #elif defined(_MSC_FULL_VER) #define BROTLI_MSVC_VERSION \ BROTLI_MAKE_VERSION((_MSC_FULL_VER / 1000000), \ (_MSC_FULL_VER % 1000000) / 10000, \ (_MSC_FULL_VER % 10000) / 10) #elif defined(_MSC_VER) #define BROTLI_MSVC_VERSION \ BROTLI_MAKE_VERSION(_MSC_VER / 100, _MSC_VER % 100, 0) #endif #if !defined(_MSC_VER) #define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) (0) #elif defined(_MSC_VER) && (_MSC_VER >= 1400) #define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) \ (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) #elif defined(_MSC_VER) && (_MSC_VER >= 1200) #define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) \ (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) #else #define BROTLI_MSVC_VERSION_CHECK(major, minor, patch) \ (_MSC_VER >= ((major * 100) + (minor))) #endif #if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) #define BROTLI_INTEL_VERSION \ BROTLI_MAKE_VERSION(__INTEL_COMPILER / 100, \ __INTEL_COMPILER % 100, \ __INTEL_COMPILER_UPDATE) #elif defined(__INTEL_COMPILER) #define BROTLI_INTEL_VERSION \ BROTLI_MAKE_VERSION(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) #endif #if defined(BROTLI_INTEL_VERSION) #define BROTLI_INTEL_VERSION_CHECK(major, minor, patch) \ (BROTLI_INTEL_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_INTEL_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__PGI) && \ defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) #define BROTLI_PGI_VERSION \ BROTLI_MAKE_VERSION(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) #endif #if defined(BROTLI_PGI_VERSION) #define BROTLI_PGI_VERSION_CHECK(major, minor, patch) \ (BROTLI_PGI_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_PGI_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) #define BROTLI_SUNPRO_VERSION \ BROTLI_MAKE_VERSION( \ (((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), \ (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), \ (__SUNPRO_C & 0xf) * 10) #elif defined(__SUNPRO_C) #define BROTLI_SUNPRO_VERSION \ BROTLI_MAKE_VERSION((__SUNPRO_C >> 8) & 0xf, \ (__SUNPRO_C >> 4) & 0xf, \ (__SUNPRO_C) & 0xf) #elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) #define BROTLI_SUNPRO_VERSION \ BROTLI_MAKE_VERSION( \ (((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), \ (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), \ (__SUNPRO_CC & 0xf) * 10) #elif defined(__SUNPRO_CC) #define BROTLI_SUNPRO_VERSION \ BROTLI_MAKE_VERSION((__SUNPRO_CC >> 8) & 0xf, \ (__SUNPRO_CC >> 4) & 0xf, \ (__SUNPRO_CC) & 0xf) #endif #if defined(BROTLI_SUNPRO_VERSION) #define BROTLI_SUNPRO_VERSION_CHECK(major, minor, patch) \ (BROTLI_SUNPRO_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_SUNPRO_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) #define BROTLI_ARM_VERSION \ BROTLI_MAKE_VERSION((__ARMCOMPILER_VERSION / 1000000), \ (__ARMCOMPILER_VERSION % 1000000) / 10000, \ (__ARMCOMPILER_VERSION % 10000) / 100) #elif defined(__CC_ARM) && defined(__ARMCC_VERSION) #define BROTLI_ARM_VERSION \ BROTLI_MAKE_VERSION((__ARMCC_VERSION / 1000000), \ (__ARMCC_VERSION % 1000000) / 10000, \ (__ARMCC_VERSION % 10000) / 100) #endif #if defined(BROTLI_ARM_VERSION) #define BROTLI_ARM_VERSION_CHECK(major, minor, patch) \ (BROTLI_ARM_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_ARM_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__ibmxl__) #define BROTLI_IBM_VERSION \ BROTLI_MAKE_VERSION(__ibmxl_version__, \ __ibmxl_release__, \ __ibmxl_modification__) #elif defined(__xlC__) && defined(__xlC_ver__) #define BROTLI_IBM_VERSION \ BROTLI_MAKE_VERSION(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) #elif defined(__xlC__) #define BROTLI_IBM_VERSION BROTLI_MAKE_VERSION(__xlC__ >> 8, __xlC__ & 0xff, 0) #endif #if defined(BROTLI_IBM_VERSION) #define BROTLI_IBM_VERSION_CHECK(major, minor, patch) \ (BROTLI_IBM_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_IBM_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__TI_COMPILER_VERSION__) #define BROTLI_TI_VERSION \ BROTLI_MAKE_VERSION((__TI_COMPILER_VERSION__ / 1000000), \ (__TI_COMPILER_VERSION__ % 1000000) / 1000, \ (__TI_COMPILER_VERSION__ % 1000)) #endif #if defined(BROTLI_TI_VERSION) #define BROTLI_TI_VERSION_CHECK(major, minor, patch) \ (BROTLI_TI_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_TI_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__IAR_SYSTEMS_ICC__) #if __VER__ > 1000 #define BROTLI_IAR_VERSION \ BROTLI_MAKE_VERSION((__VER__ / 1000000), \ (__VER__ / 1000) % 1000, \ (__VER__ % 1000)) #else #define BROTLI_IAR_VERSION BROTLI_MAKE_VERSION(VER / 100, __VER__ % 100, 0) #endif #endif #if defined(BROTLI_IAR_VERSION) #define BROTLI_IAR_VERSION_CHECK(major, minor, patch) \ (BROTLI_IAR_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_IAR_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__TINYC__) #define BROTLI_TINYC_VERSION \ BROTLI_MAKE_VERSION(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) #endif #if defined(BROTLI_TINYC_VERSION) #define BROTLI_TINYC_VERSION_CHECK(major, minor, patch) \ (BROTLI_TINYC_VERSION >= BROTLI_MAKE_VERSION(major, minor, patch)) #else #define BROTLI_TINYC_VERSION_CHECK(major, minor, patch) (0) #endif #if defined(__has_attribute) #define BROTLI_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \ __has_attribute(attribute) #else #define BROTLI_GNUC_HAS_ATTRIBUTE(attribute, major, minor, patch) \ BROTLI_GNUC_VERSION_CHECK(major, minor, patch) #endif #if defined(__has_builtin) #define BROTLI_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \ __has_builtin(builtin) #else #define BROTLI_GNUC_HAS_BUILTIN(builtin, major, minor, patch) \ BROTLI_GNUC_VERSION_CHECK(major, minor, patch) #endif #if defined(_WIN32) || defined(__CYGWIN__) #define BROTLI_PUBLIC #elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \ BROTLI_TI_VERSION_CHECK(8, 0, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \ BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \ BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \ (BROTLI_TI_VERSION_CHECK(7, 3, 0) && \ defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__)) #define BROTLI_PUBLIC __attribute__ ((visibility ("default"))) #else #define BROTLI_PUBLIC #endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \ !defined(__PGI) && !defined(__PGIC__) && !defined(__TINYC__) #define BROTLI_ARRAY_PARAM(name) (name) #else #define BROTLI_ARRAY_PARAM(name) #endif /* <<< <<< <<< end of hedley macros. */ #if defined(BROTLI_SHARED_COMPILATION) #if defined(_WIN32) #if defined(BROTLICOMMON_SHARED_COMPILATION) #define BROTLI_COMMON_API __declspec(dllexport) #else #define BROTLI_COMMON_API __declspec(dllimport) #endif /* BROTLICOMMON_SHARED_COMPILATION */ #if defined(BROTLIDEC_SHARED_COMPILATION) #define BROTLI_DEC_API __declspec(dllexport) #else #define BROTLI_DEC_API __declspec(dllimport) #endif /* BROTLIDEC_SHARED_COMPILATION */ #if defined(BROTLIENC_SHARED_COMPILATION) #define BROTLI_ENC_API __declspec(dllexport) #else #define BROTLI_ENC_API __declspec(dllimport) #endif /* BROTLIENC_SHARED_COMPILATION */ #else /* _WIN32 */ #define BROTLI_COMMON_API BROTLI_PUBLIC #define BROTLI_DEC_API BROTLI_PUBLIC #define BROTLI_ENC_API BROTLI_PUBLIC #endif /* _WIN32 */ #else /* BROTLI_SHARED_COMPILATION */ #define BROTLI_COMMON_API #define BROTLI_DEC_API #define BROTLI_ENC_API #endif #endif /* BROTLI_COMMON_PORT_H_ */ dvisvgm-2.8.1/libs/brotli/LICENSE0000664000175000017500000000207413510660062013357 00000000000000Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. dvisvgm-2.8.1/libs/brotli/common/0000775000175000017500000000000013563265646013740 500000000000000dvisvgm-2.8.1/libs/brotli/common/dictionary.c0000664000175000017500000163122213510660062016157 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ #include "./dictionary.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #ifndef BROTLI_EXTERNAL_DICTIONARY_DATA static const uint8_t kBrotliDictionaryData[] = { 116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99, 111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105 ,116,121,111,112,101,110,106,117,115,116,108,105,107,101,102,114,101,101,119,111 ,114,107,116,101,120,116,121,101,97,114,111,118,101,114,98,111,100,121,108,111, 118,101,102,111,114,109,98,111,111,107,112,108,97,121,108,105,118,101,108,105, 110,101,104,101,108,112,104,111,109,101,115,105,100,101,109,111,114,101,119,111, 114,100,108,111,110,103,116,104,101,109,118,105,101,119,102,105,110,100,112,97, 103,101,100,97,121,115,102,117,108,108,104,101,97,100,116,101,114,109,101,97,99, 104,97,114,101,97,102,114,111,109,116,114,117,101,109,97,114,107,97,98,108,101, 117,112,111,110,104,105,103,104,100,97,116,101,108,97,110,100,110,101,119,115, 101,118,101,110,110,101,120,116,99,97,115,101,98,111,116,104,112,111,115,116,117 ,115,101,100,109,97,100,101,104,97,110,100,104,101,114,101,119,104,97,116,110,97 ,109,101,76,105,110,107,98,108,111,103,115,105,122,101,98,97,115,101,104,101,108 ,100,109,97,107,101,109,97,105,110,117,115,101,114,39,41,32,43,104,111,108,100, 101,110,100,115,119,105,116,104,78,101,119,115,114,101,97,100,119,101,114,101, 115,105,103,110,116,97,107,101,104,97,118,101,103,97,109,101,115,101,101,110,99, 97,108,108,112,97,116,104,119,101,108,108,112,108,117,115,109,101,110,117,102, 105,108,109,112,97,114,116,106,111,105,110,116,104,105,115,108,105,115,116,103, 111,111,100,110,101,101,100,119,97,121,115,119,101,115,116,106,111,98,115,109, 105,110,100,97,108,115,111,108,111,103,111,114,105,99,104,117,115,101,115,108,97 ,115,116,116,101,97,109,97,114,109,121,102,111,111,100,107,105,110,103,119,105, 108,108,101,97,115,116,119,97,114,100,98,101,115,116,102,105,114,101,80,97,103, 101,107,110,111,119,97,119,97,121,46,112,110,103,109,111,118,101,116,104,97,110, 108,111,97,100,103,105,118,101,115,101,108,102,110,111,116,101,109,117,99,104, 102,101,101,100,109,97,110,121,114,111,99,107,105,99,111,110,111,110,99,101,108, 111,111,107,104,105,100,101,100,105,101,100,72,111,109,101,114,117,108,101,104, 111,115,116,97,106,97,120,105,110,102,111,99,108,117,98,108,97,119,115,108,101, 115,115,104,97,108,102,115,111,109,101,115,117,99,104,122,111,110,101,49,48,48, 37,111,110,101,115,99,97,114,101,84,105,109,101,114,97,99,101,98,108,117,101,102 ,111,117,114,119,101,101,107,102,97,99,101,104,111,112,101,103,97,118,101,104,97 ,114,100,108,111,115,116,119,104,101,110,112,97,114,107,107,101,112,116,112,97, 115,115,115,104,105,112,114,111,111,109,72,84,77,76,112,108,97,110,84,121,112, 101,100,111,110,101,115,97,118,101,107,101,101,112,102,108,97,103,108,105,110, 107,115,111,108,100,102,105,118,101,116,111,111,107,114,97,116,101,116,111,119, 110,106,117,109,112,116,104,117,115,100,97,114,107,99,97,114,100,102,105,108,101 ,102,101,97,114,115,116,97,121,107,105,108,108,116,104,97,116,102,97,108,108,97, 117,116,111,101,118,101,114,46,99,111,109,116,97,108,107,115,104,111,112,118,111 ,116,101,100,101,101,112,109,111,100,101,114,101,115,116,116,117,114,110,98,111, 114,110,98,97,110,100,102,101,108,108,114,111,115,101,117,114,108,40,115,107,105 ,110,114,111,108,101,99,111,109,101,97,99,116,115,97,103,101,115,109,101,101,116 ,103,111,108,100,46,106,112,103,105,116,101,109,118,97,114,121,102,101,108,116, 116,104,101,110,115,101,110,100,100,114,111,112,86,105,101,119,99,111,112,121,49 ,46,48,34,60,47,97,62,115,116,111,112,101,108,115,101,108,105,101,115,116,111, 117,114,112,97,99,107,46,103,105,102,112,97,115,116,99,115,115,63,103,114,97,121 ,109,101,97,110,38,103,116,59,114,105,100,101,115,104,111,116,108,97,116,101,115 ,97,105,100,114,111,97,100,118,97,114,32,102,101,101,108,106,111,104,110,114,105 ,99,107,112,111,114,116,102,97,115,116,39,85,65,45,100,101,97,100,60,47,98,62, 112,111,111,114,98,105,108,108,116,121,112,101,85,46,83,46,119,111,111,100,109, 117,115,116,50,112,120,59,73,110,102,111,114,97,110,107,119,105,100,101,119,97, 110,116,119,97,108,108,108,101,97,100,91,48,93,59,112,97,117,108,119,97,118,101, 115,117,114,101,36,40,39,35,119,97,105,116,109,97,115,115,97,114,109,115,103,111 ,101,115,103,97,105,110,108,97,110,103,112,97,105,100,33,45,45,32,108,111,99,107 ,117,110,105,116,114,111,111,116,119,97,108,107,102,105,114,109,119,105,102,101, 120,109,108,34,115,111,110,103,116,101,115,116,50,48,112,120,107,105,110,100,114 ,111,119,115,116,111,111,108,102,111,110,116,109,97,105,108,115,97,102,101,115, 116,97,114,109,97,112,115,99,111,114,101,114,97,105,110,102,108,111,119,98,97,98 ,121,115,112,97,110,115,97,121,115,52,112,120,59,54,112,120,59,97,114,116,115, 102,111,111,116,114,101,97,108,119,105,107,105,104,101,97,116,115,116,101,112, 116,114,105,112,111,114,103,47,108,97,107,101,119,101,97,107,116,111,108,100,70, 111,114,109,99,97,115,116,102,97,110,115,98,97,110,107,118,101,114,121,114,117, 110,115,106,117,108,121,116,97,115,107,49,112,120,59,103,111,97,108,103,114,101, 119,115,108,111,119,101,100,103,101,105,100,61,34,115,101,116,115,53,112,120,59, 46,106,115,63,52,48,112,120,105,102,32,40,115,111,111,110,115,101,97,116,110,111 ,110,101,116,117,98,101,122,101,114,111,115,101,110,116,114,101,101,100,102,97, 99,116,105,110,116,111,103,105,102,116,104,97,114,109,49,56,112,120,99,97,109, 101,104,105,108,108,98,111,108,100,122,111,111,109,118,111,105,100,101,97,115, 121,114,105,110,103,102,105,108,108,112,101,97,107,105,110,105,116,99,111,115, 116,51,112,120,59,106,97,99,107,116,97,103,115,98,105,116,115,114,111,108,108, 101,100,105,116,107,110,101,119,110,101,97,114,60,33,45,45,103,114,111,119,74,83 ,79,78,100,117,116,121,78,97,109,101,115,97,108,101,121,111,117,32,108,111,116, 115,112,97,105,110,106,97,122,122,99,111,108,100,101,121,101,115,102,105,115,104 ,119,119,119,46,114,105,115,107,116,97,98,115,112,114,101,118,49,48,112,120,114, 105,115,101,50,53,112,120,66,108,117,101,100,105,110,103,51,48,48,44,98,97,108, 108,102,111,114,100,101,97,114,110,119,105,108,100,98,111,120,46,102,97,105,114, 108,97,99,107,118,101,114,115,112,97,105,114,106,117,110,101,116,101,99,104,105, 102,40,33,112,105,99,107,101,118,105,108,36,40,34,35,119,97,114,109,108,111,114, 100,100,111,101,115,112,117,108,108,44,48,48,48,105,100,101,97,100,114,97,119, 104,117,103,101,115,112,111,116,102,117,110,100,98,117,114,110,104,114,101,102, 99,101,108,108,107,101,121,115,116,105,99,107,104,111,117,114,108,111,115,115, 102,117,101,108,49,50,112,120,115,117,105,116,100,101,97,108,82,83,83,34,97,103, 101,100,103,114,101,121,71,69,84,34,101,97,115,101,97,105,109,115,103,105,114, 108,97,105,100,115,56,112,120,59,110,97,118,121,103,114,105,100,116,105,112,115, 35,57,57,57,119,97,114,115,108,97,100,121,99,97,114,115,41,59,32,125,112,104,112 ,63,104,101,108,108,116,97,108,108,119,104,111,109,122,104,58,229,42,47,13,10,32 ,49,48,48,104,97,108,108,46,10,10,65,55,112,120,59,112,117,115,104,99,104,97,116 ,48,112,120,59,99,114,101,119,42,47,60,47,104,97,115,104,55,53,112,120,102,108, 97,116,114,97,114,101,32,38,38,32,116,101,108,108,99,97,109,112,111,110,116,111, 108,97,105,100,109,105,115,115,115,107,105,112,116,101,110,116,102,105,110,101, 109,97,108,101,103,101,116,115,112,108,111,116,52,48,48,44,13,10,13,10,99,111, 111,108,102,101,101,116,46,112,104,112,60,98,114,62,101,114,105,99,109,111,115, 116,103,117,105,100,98,101,108,108,100,101,115,99,104,97,105,114,109,97,116,104, 97,116,111,109,47,105,109,103,38,35,56,50,108,117,99,107,99,101,110,116,48,48,48 ,59,116,105,110,121,103,111,110,101,104,116,109,108,115,101,108,108,100,114,117, 103,70,82,69,69,110,111,100,101,110,105,99,107,63,105,100,61,108,111,115,101,110 ,117,108,108,118,97,115,116,119,105,110,100,82,83,83,32,119,101,97,114,114,101, 108,121,98,101,101,110,115,97,109,101,100,117,107,101,110,97,115,97,99,97,112, 101,119,105,115,104,103,117,108,102,84,50,51,58,104,105,116,115,115,108,111,116, 103,97,116,101,107,105,99,107,98,108,117,114,116,104,101,121,49,53,112,120,39,39 ,41,59,41,59,34,62,109,115,105,101,119,105,110,115,98,105,114,100,115,111,114, 116,98,101,116,97,115,101,101,107,84,49,56,58,111,114,100,115,116,114,101,101, 109,97,108,108,54,48,112,120,102,97,114,109,226,128,153,115,98,111,121,115,91,48 ,93,46,39,41,59,34,80,79,83,84,98,101,97,114,107,105,100,115,41,59,125,125,109, 97,114,121,116,101,110,100,40,85,75,41,113,117,97,100,122,104,58,230,45,115,105, 122,45,45,45,45,112,114,111,112,39,41,59,13,108,105,102,116,84,49,57,58,118,105, 99,101,97,110,100,121,100,101,98,116,62,82,83,83,112,111,111,108,110,101,99,107, 98,108,111,119,84,49,54,58,100,111,111,114,101,118,97,108,84,49,55,58,108,101, 116,115,102,97,105,108,111,114,97,108,112,111,108,108,110,111,118,97,99,111,108, 115,103,101,110,101,32,226,128,148,115,111,102,116,114,111,109,101,116,105,108, 108,114,111,115,115,60,104,51,62,112,111,117,114,102,97,100,101,112,105,110,107, 60,116,114,62,109,105,110,105,41,124,33,40,109,105,110,101,122,104,58,232,98,97, 114,115,104,101,97,114,48,48,41,59,109,105,108,107,32,45,45,62,105,114,111,110, 102,114,101,100,100,105,115,107,119,101,110,116,115,111,105,108,112,117,116,115, 47,106,115,47,104,111,108,121,84,50,50,58,73,83,66,78,84,50,48,58,97,100,97,109, 115,101,101,115,60,104,50,62,106,115,111,110,39,44,32,39,99,111,110,116,84,50,49 ,58,32,82,83,83,108,111,111,112,97,115,105,97,109,111,111,110,60,47,112,62,115, 111,117,108,76,73,78,69,102,111,114,116,99,97,114,116,84,49,52,58,60,104,49,62, 56,48,112,120,33,45,45,60,57,112,120,59,84,48,52,58,109,105,107,101,58,52,54,90, 110,105,99,101,105,110,99,104,89,111,114,107,114,105,99,101,122,104,58,228,39,41 ,41,59,112,117,114,101,109,97,103,101,112,97,114,97,116,111,110,101,98,111,110, 100,58,51,55,90,95,111,102,95,39,93,41,59,48,48,48,44,122,104,58,231,116,97,110, 107,121,97,114,100,98,111,119,108,98,117,115,104,58,53,54,90,74,97,118,97,51,48, 112,120,10,124,125,10,37,67,51,37,58,51,52,90,106,101,102,102,69,88,80,73,99,97, 115,104,118,105,115,97,103,111,108,102,115,110,111,119,122,104,58,233,113,117, 101,114,46,99,115,115,115,105,99,107,109,101,97,116,109,105,110,46,98,105,110, 100,100,101,108,108,104,105,114,101,112,105,99,115,114,101,110,116,58,51,54,90, 72,84,84,80,45,50,48,49,102,111,116,111,119,111,108,102,69,78,68,32,120,98,111, 120,58,53,52,90,66,79,68,89,100,105,99,107,59,10,125,10,101,120,105,116,58,51,53 ,90,118,97,114,115,98,101,97,116,39,125,41,59,100,105,101,116,57,57,57,59,97,110 ,110,101,125,125,60,47,91,105,93,46,76,97,110,103,107,109,194,178,119,105,114, 101,116,111,121,115,97,100,100,115,115,101,97,108,97,108,101,120,59,10,9,125,101 ,99,104,111,110,105,110,101,46,111,114,103,48,48,53,41,116,111,110,121,106,101, 119,115,115,97,110,100,108,101,103,115,114,111,111,102,48,48,48,41,32,50,48,48, 119,105,110,101,103,101,97,114,100,111,103,115,98,111,111,116,103,97,114,121,99, 117,116,115,116,121,108,101,116,101,109,112,116,105,111,110,46,120,109,108,99, 111,99,107,103,97,110,103,36,40,39,46,53,48,112,120,80,104,46,68,109,105,115,99, 97,108,97,110,108,111,97,110,100,101,115,107,109,105,108,101,114,121,97,110,117, 110,105,120,100,105,115,99,41,59,125,10,100,117,115,116,99,108,105,112,41,46,10, 10,55,48,112,120,45,50,48,48,68,86,68,115,55,93,62,60,116,97,112,101,100,101,109 ,111,105,43,43,41,119,97,103,101,101,117,114,111,112,104,105,108,111,112,116,115 ,104,111,108,101,70,65,81,115,97,115,105,110,45,50,54,84,108,97,98,115,112,101, 116,115,85,82,76,32,98,117,108,107,99,111,111,107,59,125,13,10,72,69,65,68,91,48 ,93,41,97,98,98,114,106,117,97,110,40,49,57,56,108,101,115,104,116,119,105,110, 60,47,105,62,115,111,110,121,103,117,121,115,102,117,99,107,112,105,112,101,124, 45,10,33,48,48,50,41,110,100,111,119,91,49,93,59,91,93,59,10,76,111,103,32,115, 97,108,116,13,10,9,9,98,97,110,103,116,114,105,109,98,97,116,104,41,123,13,10,48 ,48,112,120,10,125,41,59,107,111,58,236,102,101,101,115,97,100,62,13,115,58,47, 47,32,91,93,59,116,111,108,108,112,108,117,103,40,41,123,10,123,13,10,32,46,106, 115,39,50,48,48,112,100,117,97,108,98,111,97,116,46,74,80,71,41,59,10,125,113, 117,111,116,41,59,10,10,39,41,59,10,13,10,125,13,50,48,49,52,50,48,49,53,50,48, 49,54,50,48,49,55,50,48,49,56,50,48,49,57,50,48,50,48,50,48,50,49,50,48,50,50,50 ,48,50,51,50,48,50,52,50,48,50,53,50,48,50,54,50,48,50,55,50,48,50,56,50,48,50, 57,50,48,51,48,50,48,51,49,50,48,51,50,50,48,51,51,50,48,51,52,50,48,51,53,50,48 ,51,54,50,48,51,55,50,48,49,51,50,48,49,50,50,48,49,49,50,48,49,48,50,48,48,57, 50,48,48,56,50,48,48,55,50,48,48,54,50,48,48,53,50,48,48,52,50,48,48,51,50,48,48 ,50,50,48,48,49,50,48,48,48,49,57,57,57,49,57,57,56,49,57,57,55,49,57,57,54,49, 57,57,53,49,57,57,52,49,57,57,51,49,57,57,50,49,57,57,49,49,57,57,48,49,57,56,57 ,49,57,56,56,49,57,56,55,49,57,56,54,49,57,56,53,49,57,56,52,49,57,56,51,49,57, 56,50,49,57,56,49,49,57,56,48,49,57,55,57,49,57,55,56,49,57,55,55,49,57,55,54,49 ,57,55,53,49,57,55,52,49,57,55,51,49,57,55,50,49,57,55,49,49,57,55,48,49,57,54, 57,49,57,54,56,49,57,54,55,49,57,54,54,49,57,54,53,49,57,54,52,49,57,54,51,49,57 ,54,50,49,57,54,49,49,57,54,48,49,57,53,57,49,57,53,56,49,57,53,55,49,57,53,54, 49,57,53,53,49,57,53,52,49,57,53,51,49,57,53,50,49,57,53,49,49,57,53,48,49,48,48 ,48,49,48,50,52,49,51,57,52,48,48,48,48,57,57,57,57,99,111,109,111,109,195,161, 115,101,115,116,101,101,115,116,97,112,101,114,111,116,111,100,111,104,97,99,101 ,99,97,100,97,97,195,177,111,98,105,101,110,100,195,173,97,97,115,195,173,118, 105,100,97,99,97,115,111,111,116,114,111,102,111,114,111,115,111,108,111,111,116 ,114,97,99,117,97,108,100,105,106,111,115,105,100,111,103,114,97,110,116,105,112 ,111,116,101,109,97,100,101,98,101,97,108,103,111,113,117,195,169,101,115,116, 111,110,97,100,97,116,114,101,115,112,111,99,111,99,97,115,97,98,97,106,111,116, 111,100,97,115,105,110,111,97,103,117,97,112,117,101,115,117,110,111,115,97,110, 116,101,100,105,99,101,108,117,105,115,101,108,108,97,109,97,121,111,122,111,110 ,97,97,109,111,114,112,105,115,111,111,98,114,97,99,108,105,99,101,108,108,111, 100,105,111,115,104,111,114,97,99,97,115,105,208,183,208,176,208,189,208,176,208 ,190,208,188,209,128,208,176,209,128,209,131,209,130,208,176,208,189,208,181,208 ,191,208,190,208,190,209,130,208,184,208,183,208,189,208,190,208,180,208,190,209 ,130,208,190,208,182,208,181,208,190,208,189,208,184,209,133,208,157,208,176,208 ,181,208,181,208,177,209,139,208,188,209,139,208,146,209,139,209,129,208,190,208 ,178,209,139,208,178,208,190,208,157,208,190,208,190,208,177,208,159,208,190,208 ,187,208,184,208,189,208,184,208,160,208,164,208,157,208,181,208,156,209,139,209 ,130,209,139,208,158,208,189,208,184,208,188,208,180,208,176,208,151,208,176,208 ,148,208,176,208,157,209,131,208,158,208,177,209,130,208,181,208,152,208,183,208 ,181,208,185,208,189,209,131,208,188,208,188,208,162,209,139,209,131,208,182,217 ,129,217,138,216,163,217,134,217,133,216,167,217,133,216,185,217,131,217,132,216 ,163,217,136,216,177,216,175,217,138,216,167,217,129,217,137,217,135,217,136,217 ,132,217,133,217,132,217,131,216,167,217,136,217,132,217,135,216,168,216,179,216 ,167,217,132,216,165,217,134,217,135,217,138,216,163,217,138,217,130,216,175,217 ,135,217,132,216,171,217,133,216,168,217,135,217,132,217,136,217,132,217,138,216 ,168,217,132,216,167,217,138,216,168,217,131,216,180,217,138,216,167,217,133,216 ,163,217,133,217,134,216,170,216,168,217,138,217,132,217,134,216,173,216,168,217 ,135,217,133,217,133,216,180,217,136,216,180,102,105,114,115,116,118,105,100,101 ,111,108,105,103,104,116,119,111,114,108,100,109,101,100,105,97,119,104,105,116, 101,99,108,111,115,101,98,108,97,99,107,114,105,103,104,116,115,109,97,108,108, 98,111,111,107,115,112,108,97,99,101,109,117,115,105,99,102,105,101,108,100,111, 114,100,101,114,112,111,105,110,116,118,97,108,117,101,108,101,118,101,108,116, 97,98,108,101,98,111,97,114,100,104,111,117,115,101,103,114,111,117,112,119,111, 114,107,115,121,101,97,114,115,115,116,97,116,101,116,111,100,97,121,119,97,116, 101,114,115,116,97,114,116,115,116,121,108,101,100,101,97,116,104,112,111,119, 101,114,112,104,111,110,101,110,105,103,104,116,101,114,114,111,114,105,110,112, 117,116,97,98,111,117,116,116,101,114,109,115,116,105,116,108,101,116,111,111, 108,115,101,118,101,110,116,108,111,99,97,108,116,105,109,101,115,108,97,114,103 ,101,119,111,114,100,115,103,97,109,101,115,115,104,111,114,116,115,112,97,99, 101,102,111,99,117,115,99,108,101,97,114,109,111,100,101,108,98,108,111,99,107, 103,117,105,100,101,114,97,100,105,111,115,104,97,114,101,119,111,109,101,110,97 ,103,97,105,110,109,111,110,101,121,105,109,97,103,101,110,97,109,101,115,121, 111,117,110,103,108,105,110,101,115,108,97,116,101,114,99,111,108,111,114,103, 114,101,101,110,102,114,111,110,116,38,97,109,112,59,119,97,116,99,104,102,111, 114,99,101,112,114,105,99,101,114,117,108,101,115,98,101,103,105,110,97,102,116, 101,114,118,105,115,105,116,105,115,115,117,101,97,114,101,97,115,98,101,108,111 ,119,105,110,100,101,120,116,111,116,97,108,104,111,117,114,115,108,97,98,101, 108,112,114,105,110,116,112,114,101,115,115,98,117,105,108,116,108,105,110,107, 115,115,112,101,101,100,115,116,117,100,121,116,114,97,100,101,102,111,117,110, 100,115,101,110,115,101,117,110,100,101,114,115,104,111,119,110,102,111,114,109, 115,114,97,110,103,101,97,100,100,101,100,115,116,105,108,108,109,111,118,101, 100,116,97,107,101,110,97,98,111,118,101,102,108,97,115,104,102,105,120,101,100, 111,102,116,101,110,111,116,104,101,114,118,105,101,119,115,99,104,101,99,107, 108,101,103,97,108,114,105,118,101,114,105,116,101,109,115,113,117,105,99,107, 115,104,97,112,101,104,117,109,97,110,101,120,105,115,116,103,111,105,110,103, 109,111,118,105,101,116,104,105,114,100,98,97,115,105,99,112,101,97,99,101,115, 116,97,103,101,119,105,100,116,104,108,111,103,105,110,105,100,101,97,115,119, 114,111,116,101,112,97,103,101,115,117,115,101,114,115,100,114,105,118,101,115, 116,111,114,101,98,114,101,97,107,115,111,117,116,104,118,111,105,99,101,115,105 ,116,101,115,109,111,110,116,104,119,104,101,114,101,98,117,105,108,100,119,104, 105,99,104,101,97,114,116,104,102,111,114,117,109,116,104,114,101,101,115,112, 111,114,116,112,97,114,116,121,67,108,105,99,107,108,111,119,101,114,108,105,118 ,101,115,99,108,97,115,115,108,97,121,101,114,101,110,116,114,121,115,116,111, 114,121,117,115,97,103,101,115,111,117,110,100,99,111,117,114,116,121,111,117, 114,32,98,105,114,116,104,112,111,112,117,112,116,121,112,101,115,97,112,112,108 ,121,73,109,97,103,101,98,101,105,110,103,117,112,112,101,114,110,111,116,101, 115,101,118,101,114,121,115,104,111,119,115,109,101,97,110,115,101,120,116,114, 97,109,97,116,99,104,116,114,97,99,107,107,110,111,119,110,101,97,114,108,121,98 ,101,103,97,110,115,117,112,101,114,112,97,112,101,114,110,111,114,116,104,108, 101,97,114,110,103,105,118,101,110,110,97,109,101,100,101,110,100,101,100,84,101 ,114,109,115,112,97,114,116,115,71,114,111,117,112,98,114,97,110,100,117,115,105 ,110,103,119,111,109,97,110,102,97,108,115,101,114,101,97,100,121,97,117,100,105 ,111,116,97,107,101,115,119,104,105,108,101,46,99,111,109,47,108,105,118,101,100 ,99,97,115,101,115,100,97,105,108,121,99,104,105,108,100,103,114,101,97,116,106, 117,100,103,101,116,104,111,115,101,117,110,105,116,115,110,101,118,101,114,98, 114,111,97,100,99,111,97,115,116,99,111,118,101,114,97,112,112,108,101,102,105, 108,101,115,99,121,99,108,101,115,99,101,110,101,112,108,97,110,115,99,108,105, 99,107,119,114,105,116,101,113,117,101,101,110,112,105,101,99,101,101,109,97,105 ,108,102,114,97,109,101,111,108,100,101,114,112,104,111,116,111,108,105,109,105, 116,99,97,99,104,101,99,105,118,105,108,115,99,97,108,101,101,110,116,101,114, 116,104,101,109,101,116,104,101,114,101,116,111,117,99,104,98,111,117,110,100, 114,111,121,97,108,97,115,107,101,100,119,104,111,108,101,115,105,110,99,101,115 ,116,111,99,107,32,110,97,109,101,102,97,105,116,104,104,101,97,114,116,101,109, 112,116,121,111,102,102,101,114,115,99,111,112,101,111,119,110,101,100,109,105, 103,104,116,97,108,98,117,109,116,104,105,110,107,98,108,111,111,100,97,114,114, 97,121,109,97,106,111,114,116,114,117,115,116,99,97,110,111,110,117,110,105,111, 110,99,111,117,110,116,118,97,108,105,100,115,116,111,110,101,83,116,121,108,101 ,76,111,103,105,110,104,97,112,112,121,111,99,99,117,114,108,101,102,116,58,102, 114,101,115,104,113,117,105,116,101,102,105,108,109,115,103,114,97,100,101,110, 101,101,100,115,117,114,98,97,110,102,105,103,104,116,98,97,115,105,115,104,111, 118,101,114,97,117,116,111,59,114,111,117,116,101,46,104,116,109,108,109,105,120 ,101,100,102,105,110,97,108,89,111,117,114,32,115,108,105,100,101,116,111,112, 105,99,98,114,111,119,110,97,108,111,110,101,100,114,97,119,110,115,112,108,105, 116,114,101,97,99,104,82,105,103,104,116,100,97,116,101,115,109,97,114,99,104, 113,117,111,116,101,103,111,111,100,115,76,105,110,107,115,100,111,117,98,116,97 ,115,121,110,99,116,104,117,109,98,97,108,108,111,119,99,104,105,101,102,121,111 ,117,116,104,110,111,118,101,108,49,48,112,120,59,115,101,114,118,101,117,110, 116,105,108,104,97,110,100,115,67,104,101,99,107,83,112,97,99,101,113,117,101, 114,121,106,97,109,101,115,101,113,117,97,108,116,119,105,99,101,48,44,48,48,48, 83,116,97,114,116,112,97,110,101,108,115,111,110,103,115,114,111,117,110,100,101 ,105,103,104,116,115,104,105,102,116,119,111,114,116,104,112,111,115,116,115,108 ,101,97,100,115,119,101,101,107,115,97,118,111,105,100,116,104,101,115,101,109, 105,108,101,115,112,108,97,110,101,115,109,97,114,116,97,108,112,104,97,112,108, 97,110,116,109,97,114,107,115,114,97,116,101,115,112,108,97,121,115,99,108,97, 105,109,115,97,108,101,115,116,101,120,116,115,115,116,97,114,115,119,114,111, 110,103,60,47,104,51,62,116,104,105,110,103,46,111,114,103,47,109,117,108,116, 105,104,101,97,114,100,80,111,119,101,114,115,116,97,110,100,116,111,107,101,110 ,115,111,108,105,100,40,116,104,105,115,98,114,105,110,103,115,104,105,112,115, 115,116,97,102,102,116,114,105,101,100,99,97,108,108,115,102,117,108,108,121,102 ,97,99,116,115,97,103,101,110,116,84,104,105,115,32,47,47,45,45,62,97,100,109, 105,110,101,103,121,112,116,69,118,101,110,116,49,53,112,120,59,69,109,97,105, 108,116,114,117,101,34,99,114,111,115,115,115,112,101,110,116,98,108,111,103,115 ,98,111,120,34,62,110,111,116,101,100,108,101,97,118,101,99,104,105,110,97,115, 105,122,101,115,103,117,101,115,116,60,47,104,52,62,114,111,98,111,116,104,101, 97,118,121,116,114,117,101,44,115,101,118,101,110,103,114,97,110,100,99,114,105, 109,101,115,105,103,110,115,97,119,97,114,101,100,97,110,99,101,112,104,97,115, 101,62,60,33,45,45,101,110,95,85,83,38,35,51,57,59,50,48,48,112,120,95,110,97, 109,101,108,97,116,105,110,101,110,106,111,121,97,106,97,120,46,97,116,105,111, 110,115,109,105,116,104,85,46,83,46,32,104,111,108,100,115,112,101,116,101,114, 105,110,100,105,97,110,97,118,34,62,99,104,97,105,110,115,99,111,114,101,99,111, 109,101,115,100,111,105,110,103,112,114,105,111,114,83,104,97,114,101,49,57,57, 48,115,114,111,109,97,110,108,105,115,116,115,106,97,112,97,110,102,97,108,108, 115,116,114,105,97,108,111,119,110,101,114,97,103,114,101,101,60,47,104,50,62,97 ,98,117,115,101,97,108,101,114,116,111,112,101,114,97,34,45,47,47,87,99,97,114, 100,115,104,105,108,108,115,116,101,97,109,115,80,104,111,116,111,116,114,117, 116,104,99,108,101,97,110,46,112,104,112,63,115,97,105,110,116,109,101,116,97, 108,108,111,117,105,115,109,101,97,110,116,112,114,111,111,102,98,114,105,101, 102,114,111,119,34,62,103,101,110,114,101,116,114,117,99,107,108,111,111,107,115 ,86,97,108,117,101,70,114,97,109,101,46,110,101,116,47,45,45,62,10,60,116,114, 121,32,123,10,118,97,114,32,109,97,107,101,115,99,111,115,116,115,112,108,97,105 ,110,97,100,117,108,116,113,117,101,115,116,116,114,97,105,110,108,97,98,111,114 ,104,101,108,112,115,99,97,117,115,101,109,97,103,105,99,109,111,116,111,114,116 ,104,101,105,114,50,53,48,112,120,108,101,97,115,116,115,116,101,112,115,67,111, 117,110,116,99,111,117,108,100,103,108,97,115,115,115,105,100,101,115,102,117, 110,100,115,104,111,116,101,108,97,119,97,114,100,109,111,117,116,104,109,111, 118,101,115,112,97,114,105,115,103,105,118,101,115,100,117,116,99,104,116,101, 120,97,115,102,114,117,105,116,110,117,108,108,44,124,124,91,93,59,116,111,112, 34,62,10,60,33,45,45,80,79,83,84,34,111,99,101,97,110,60,98,114,47,62,102,108, 111,111,114,115,112,101,97,107,100,101,112,116,104,32,115,105,122,101,98,97,110, 107,115,99,97,116,99,104,99,104,97,114,116,50,48,112,120,59,97,108,105,103,110, 100,101,97,108,115,119,111,117,108,100,53,48,112,120,59,117,114,108,61,34,112,97 ,114,107,115,109,111,117,115,101,77,111,115,116,32,46,46,46,60,47,97,109,111,110 ,103,98,114,97,105,110,98,111,100,121,32,110,111,110,101,59,98,97,115,101,100,99 ,97,114,114,121,100,114,97,102,116,114,101,102,101,114,112,97,103,101,95,104,111 ,109,101,46,109,101,116,101,114,100,101,108,97,121,100,114,101,97,109,112,114, 111,118,101,106,111,105,110,116,60,47,116,114,62,100,114,117,103,115,60,33,45,45 ,32,97,112,114,105,108,105,100,101,97,108,97,108,108,101,110,101,120,97,99,116, 102,111,114,116,104,99,111,100,101,115,108,111,103,105,99,86,105,101,119,32,115, 101,101,109,115,98,108,97,110,107,112,111,114,116,115,32,40,50,48,48,115,97,118, 101,100,95,108,105,110,107,103,111,97,108,115,103,114,97,110,116,103,114,101,101 ,107,104,111,109,101,115,114,105,110,103,115,114,97,116,101,100,51,48,112,120,59 ,119,104,111,115,101,112,97,114,115,101,40,41,59,34,32,66,108,111,99,107,108,105 ,110,117,120,106,111,110,101,115,112,105,120,101,108,39,41,59,34,62,41,59,105, 102,40,45,108,101,102,116,100,97,118,105,100,104,111,114,115,101,70,111,99,117, 115,114,97,105,115,101,98,111,120,101,115,84,114,97,99,107,101,109,101,110,116, 60,47,101,109,62,98,97,114,34,62,46,115,114,99,61,116,111,119,101,114,97,108,116 ,61,34,99,97,98,108,101,104,101,110,114,121,50,52,112,120,59,115,101,116,117,112 ,105,116,97,108,121,115,104,97,114,112,109,105,110,111,114,116,97,115,116,101, 119,97,110,116,115,116,104,105,115,46,114,101,115,101,116,119,104,101,101,108, 103,105,114,108,115,47,99,115,115,47,49,48,48,37,59,99,108,117,98,115,115,116, 117,102,102,98,105,98,108,101,118,111,116,101,115,32,49,48,48,48,107,111,114,101 ,97,125,41,59,13,10,98,97,110,100,115,113,117,101,117,101,61,32,123,125,59,56,48 ,112,120,59,99,107,105,110,103,123,13,10,9,9,97,104,101,97,100,99,108,111,99,107 ,105,114,105,115,104,108,105,107,101,32,114,97,116,105,111,115,116,97,116,115,70 ,111,114,109,34,121,97,104,111,111,41,91,48,93,59,65,98,111,117,116,102,105,110, 100,115,60,47,104,49,62,100,101,98,117,103,116,97,115,107,115,85,82,76,32,61,99, 101,108,108,115,125,41,40,41,59,49,50,112,120,59,112,114,105,109,101,116,101,108 ,108,115,116,117,114,110,115,48,120,54,48,48,46,106,112,103,34,115,112,97,105, 110,98,101,97,99,104,116,97,120,101,115,109,105,99,114,111,97,110,103,101,108,45 ,45,62,60,47,103,105,102,116,115,115,116,101,118,101,45,108,105,110,107,98,111, 100,121,46,125,41,59,10,9,109,111,117,110,116,32,40,49,57,57,70,65,81,60,47,114, 111,103,101,114,102,114,97,110,107,67,108,97,115,115,50,56,112,120,59,102,101, 101,100,115,60,104,49,62,60,115,99,111,116,116,116,101,115,116,115,50,50,112,120 ,59,100,114,105,110,107,41,32,124,124,32,108,101,119,105,115,115,104,97,108,108, 35,48,51,57,59,32,102,111,114,32,108,111,118,101,100,119,97,115,116,101,48,48, 112,120,59,106,97,58,227,130,115,105,109,111,110,60,102,111,110,116,114,101,112, 108,121,109,101,101,116,115,117,110,116,101,114,99,104,101,97,112,116,105,103, 104,116,66,114,97,110,100,41,32,33,61,32,100,114,101,115,115,99,108,105,112,115, 114,111,111,109,115,111,110,107,101,121,109,111,98,105,108,109,97,105,110,46,78, 97,109,101,32,112,108,97,116,101,102,117,110,110,121,116,114,101,101,115,99,111, 109,47,34,49,46,106,112,103,119,109,111,100,101,112,97,114,97,109,83,84,65,82,84 ,108,101,102,116,32,105,100,100,101,110,44,32,50,48,49,41,59,10,125,10,102,111, 114,109,46,118,105,114,117,115,99,104,97,105,114,116,114,97,110,115,119,111,114, 115,116,80,97,103,101,115,105,116,105,111,110,112,97,116,99,104,60,33,45,45,10, 111,45,99,97,99,102,105,114,109,115,116,111,117,114,115,44,48,48,48,32,97,115, 105,97,110,105,43,43,41,123,97,100,111,98,101,39,41,91,48,93,105,100,61,49,48,98 ,111,116,104,59,109,101,110,117,32,46,50,46,109,105,46,112,110,103,34,107,101, 118,105,110,99,111,97,99,104,67,104,105,108,100,98,114,117,99,101,50,46,106,112, 103,85,82,76,41,43,46,106,112,103,124,115,117,105,116,101,115,108,105,99,101,104 ,97,114,114,121,49,50,48,34,32,115,119,101,101,116,116,114,62,13,10,110,97,109, 101,61,100,105,101,103,111,112,97,103,101,32,115,119,105,115,115,45,45,62,10,10, 35,102,102,102,59,34,62,76,111,103,46,99,111,109,34,116,114,101,97,116,115,104, 101,101,116,41,32,38,38,32,49,52,112,120,59,115,108,101,101,112,110,116,101,110, 116,102,105,108,101,100,106,97,58,227,131,105,100,61,34,99,78,97,109,101,34,119, 111,114,115,101,115,104,111,116,115,45,98,111,120,45,100,101,108,116,97,10,38, 108,116,59,98,101,97,114,115,58,52,56,90,60,100,97,116,97,45,114,117,114,97,108, 60,47,97,62,32,115,112,101,110,100,98,97,107,101,114,115,104,111,112,115,61,32, 34,34,59,112,104,112,34,62,99,116,105,111,110,49,51,112,120,59,98,114,105,97,110 ,104,101,108,108,111,115,105,122,101,61,111,61,37,50,70,32,106,111,105,110,109, 97,121,98,101,60,105,109,103,32,105,109,103,34,62,44,32,102,106,115,105,109,103, 34,32,34,41,91,48,93,77,84,111,112,66,84,121,112,101,34,110,101,119,108,121,68, 97,110,115,107,99,122,101,99,104,116,114,97,105,108,107,110,111,119,115,60,47, 104,53,62,102,97,113,34,62,122,104,45,99,110,49,48,41,59,10,45,49,34,41,59,116, 121,112,101,61,98,108,117,101,115,116,114,117,108,121,100,97,118,105,115,46,106, 115,39,59,62,13,10,60,33,115,116,101,101,108,32,121,111,117,32,104,50,62,13,10, 102,111,114,109,32,106,101,115,117,115,49,48,48,37,32,109,101,110,117,46,13,10,9 ,13,10,119,97,108,101,115,114,105,115,107,115,117,109,101,110,116,100,100,105, 110,103,98,45,108,105,107,116,101,97,99,104,103,105,102,34,32,118,101,103,97,115 ,100,97,110,115,107,101,101,115,116,105,115,104,113,105,112,115,117,111,109,105, 115,111,98,114,101,100,101,115,100,101,101,110,116,114,101,116,111,100,111,115, 112,117,101,100,101,97,195,177,111,115,101,115,116,195,161,116,105,101,110,101, 104,97,115,116,97,111,116,114,111,115,112,97,114,116,101,100,111,110,100,101,110 ,117,101,118,111,104,97,99,101,114,102,111,114,109,97,109,105,115,109,111,109, 101,106,111,114,109,117,110,100,111,97,113,117,195,173,100,195,173,97,115,115, 195,179,108,111,97,121,117,100,97,102,101,99,104,97,116,111,100,97,115,116,97, 110,116,111,109,101,110,111,115,100,97,116,111,115,111,116,114,97,115,115,105, 116,105,111,109,117,99,104,111,97,104,111,114,97,108,117,103,97,114,109,97,121, 111,114,101,115,116,111,115,104,111,114,97,115,116,101,110,101,114,97,110,116, 101,115,102,111,116,111,115,101,115,116,97,115,112,97,195,173,115,110,117,101, 118,97,115,97,108,117,100,102,111,114,111,115,109,101,100,105,111,113,117,105, 101,110,109,101,115,101,115,112,111,100,101,114,99,104,105,108,101,115,101,114, 195,161,118,101,99,101,115,100,101,99,105,114,106,111,115,195,169,101,115,116,97 ,114,118,101,110,116,97,103,114,117,112,111,104,101,99,104,111,101,108,108,111, 115,116,101,110,103,111,97,109,105,103,111,99,111,115,97,115,110,105,118,101,108 ,103,101,110,116,101,109,105,115,109,97,97,105,114,101,115,106,117,108,105,111, 116,101,109,97,115,104,97,99,105,97,102,97,118,111,114,106,117,110,105,111,108, 105,98,114,101,112,117,110,116,111,98,117,101,110,111,97,117,116,111,114,97,98, 114,105,108,98,117,101,110,97,116,101,120,116,111,109,97,114,122,111,115,97,98, 101,114,108,105,115,116,97,108,117,101,103,111,99,195,179,109,111,101,110,101, 114,111,106,117,101,103,111,112,101,114,195,186,104,97,98,101,114,101,115,116, 111,121,110,117,110,99,97,109,117,106,101,114,118,97,108,111,114,102,117,101,114 ,97,108,105,98,114,111,103,117,115,116,97,105,103,117,97,108,118,111,116,111,115 ,99,97,115,111,115,103,117,195,173,97,112,117,101,100,111,115,111,109,111,115,97 ,118,105,115,111,117,115,116,101,100,100,101,98,101,110,110,111,99,104,101,98, 117,115,99,97,102,97,108,116,97,101,117,114,111,115,115,101,114,105,101,100,105, 99,104,111,99,117,114,115,111,99,108,97,118,101,99,97,115,97,115,108,101,195,179 ,110,112,108,97,122,111,108,97,114,103,111,111,98,114,97,115,118,105,115,116,97, 97,112,111,121,111,106,117,110,116,111,116,114,97,116,97,118,105,115,116,111,99, 114,101,97,114,99,97,109,112,111,104,101,109,111,115,99,105,110,99,111,99,97,114 ,103,111,112,105,115,111,115,111,114,100,101,110,104,97,99,101,110,195,161,114, 101,97,100,105,115,99,111,112,101,100,114,111,99,101,114,99,97,112,117,101,100, 97,112,97,112,101,108,109,101,110,111,114,195,186,116,105,108,99,108,97,114,111, 106,111,114,103,101,99,97,108,108,101,112,111,110,101,114,116,97,114,100,101,110 ,97,100,105,101,109,97,114,99,97,115,105,103,117,101,101,108,108,97,115,115,105, 103,108,111,99,111,99,104,101,109,111,116,111,115,109,97,100,114,101,99,108,97, 115,101,114,101,115,116,111,110,105,195,177,111,113,117,101,100,97,112,97,115,97 ,114,98,97,110,99,111,104,105,106,111,115,118,105,97,106,101,112,97,98,108,111, 195,169,115,116,101,118,105,101,110,101,114,101,105,110,111,100,101,106,97,114, 102,111,110,100,111,99,97,110,97,108,110,111,114,116,101,108,101,116,114,97,99, 97,117,115,97,116,111,109,97,114,109,97,110,111,115,108,117,110,101,115,97,117, 116,111,115,118,105,108,108,97,118,101,110,100,111,112,101,115,97,114,116,105, 112,111,115,116,101,110,103,97,109,97,114,99,111,108,108,101,118,97,112,97,100, 114,101,117,110,105,100,111,118,97,109,111,115,122,111,110,97,115,97,109,98,111, 115,98,97,110,100,97,109,97,114,105,97,97,98,117,115,111,109,117,99,104,97,115, 117,98,105,114,114,105,111,106,97,118,105,118,105,114,103,114,97,100,111,99,104, 105,99,97,97,108,108,195,173,106,111,118,101,110,100,105,99,104,97,101,115,116, 97,110,116,97,108,101,115,115,97,108,105,114,115,117,101,108,111,112,101,115,111 ,115,102,105,110,101,115,108,108,97,109,97,98,117,115,99,111,195,169,115,116,97, 108,108,101,103,97,110,101,103,114,111,112,108,97,122,97,104,117,109,111,114,112 ,97,103,97,114,106,117,110,116,97,100,111,98,108,101,105,115,108,97,115,98,111, 108,115,97,98,97,195,177,111,104,97,98,108,97,108,117,99,104,97,195,129,114,101, 97,100,105,99,101,110,106,117,103,97,114,110,111,116,97,115,118,97,108,108,101, 97,108,108,195,161,99,97,114,103,97,100,111,108,111,114,97,98,97,106,111,101,115 ,116,195,169,103,117,115,116,111,109,101,110,116,101,109,97,114,105,111,102,105, 114,109,97,99,111,115,116,111,102,105,99,104,97,112,108,97,116,97,104,111,103,97 ,114,97,114,116,101,115,108,101,121,101,115,97,113,117,101,108,109,117,115,101, 111,98,97,115,101,115,112,111,99,111,115,109,105,116,97,100,99,105,101,108,111, 99,104,105,99,111,109,105,101,100,111,103,97,110,97,114,115,97,110,116,111,101, 116,97,112,97,100,101,98,101,115,112,108,97,121,97,114,101,100,101,115,115,105, 101,116,101,99,111,114,116,101,99,111,114,101,97,100,117,100,97,115,100,101,115, 101,111,118,105,101,106,111,100,101,115,101,97,97,103,117,97,115,38,113,117,111, 116,59,100,111,109,97,105,110,99,111,109,109,111,110,115,116,97,116,117,115,101, 118,101,110,116,115,109,97,115,116,101,114,115,121,115,116,101,109,97,99,116,105 ,111,110,98,97,110,110,101,114,114,101,109,111,118,101,115,99,114,111,108,108, 117,112,100,97,116,101,103,108,111,98,97,108,109,101,100,105,117,109,102,105,108 ,116,101,114,110,117,109,98,101,114,99,104,97,110,103,101,114,101,115,117,108, 116,112,117,98,108,105,99,115,99,114,101,101,110,99,104,111,111,115,101,110,111, 114,109,97,108,116,114,97,118,101,108,105,115,115,117,101,115,115,111,117,114,99 ,101,116,97,114,103,101,116,115,112,114,105,110,103,109,111,100,117,108,101,109, 111,98,105,108,101,115,119,105,116,99,104,112,104,111,116,111,115,98,111,114,100 ,101,114,114,101,103,105,111,110,105,116,115,101,108,102,115,111,99,105,97,108, 97,99,116,105,118,101,99,111,108,117,109,110,114,101,99,111,114,100,102,111,108, 108,111,119,116,105,116,108,101,62,101,105,116,104,101,114,108,101,110,103,116, 104,102,97,109,105,108,121,102,114,105,101,110,100,108,97,121,111,117,116,97,117 ,116,104,111,114,99,114,101,97,116,101,114,101,118,105,101,119,115,117,109,109, 101,114,115,101,114,118,101,114,112,108,97,121,101,100,112,108,97,121,101,114, 101,120,112,97,110,100,112,111,108,105,99,121,102,111,114,109,97,116,100,111,117 ,98,108,101,112,111,105,110,116,115,115,101,114,105,101,115,112,101,114,115,111, 110,108,105,118,105,110,103,100,101,115,105,103,110,109,111,110,116,104,115,102, 111,114,99,101,115,117,110,105,113,117,101,119,101,105,103,104,116,112,101,111, 112,108,101,101,110,101,114,103,121,110,97,116,117,114,101,115,101,97,114,99,104 ,102,105,103,117,114,101,104,97,118,105,110,103,99,117,115,116,111,109,111,102, 102,115,101,116,108,101,116,116,101,114,119,105,110,100,111,119,115,117,98,109, 105,116,114,101,110,100,101,114,103,114,111,117,112,115,117,112,108,111,97,100, 104,101,97,108,116,104,109,101,116,104,111,100,118,105,100,101,111,115,115,99, 104,111,111,108,102,117,116,117,114,101,115,104,97,100,111,119,100,101,98,97,116 ,101,118,97,108,117,101,115,79,98,106,101,99,116,111,116,104,101,114,115,114,105 ,103,104,116,115,108,101,97,103,117,101,99,104,114,111,109,101,115,105,109,112, 108,101,110,111,116,105,99,101,115,104,97,114,101,100,101,110,100,105,110,103, 115,101,97,115,111,110,114,101,112,111,114,116,111,110,108,105,110,101,115,113, 117,97,114,101,98,117,116,116,111,110,105,109,97,103,101,115,101,110,97,98,108, 101,109,111,118,105,110,103,108,97,116,101,115,116,119,105,110,116,101,114,70, 114,97,110,99,101,112,101,114,105,111,100,115,116,114,111,110,103,114,101,112, 101,97,116,76,111,110,100,111,110,100,101,116,97,105,108,102,111,114,109,101,100 ,100,101,109,97,110,100,115,101,99,117,114,101,112,97,115,115,101,100,116,111, 103,103,108,101,112,108,97,99,101,115,100,101,118,105,99,101,115,116,97,116,105, 99,99,105,116,105,101,115,115,116,114,101,97,109,121,101,108,108,111,119,97,116, 116,97,99,107,115,116,114,101,101,116,102,108,105,103,104,116,104,105,100,100, 101,110,105,110,102,111,34,62,111,112,101,110,101,100,117,115,101,102,117,108, 118,97,108,108,101,121,99,97,117,115,101,115,108,101,97,100,101,114,115,101,99, 114,101,116,115,101,99,111,110,100,100,97,109,97,103,101,115,112,111,114,116,115 ,101,120,99,101,112,116,114,97,116,105,110,103,115,105,103,110,101,100,116,104, 105,110,103,115,101,102,102,101,99,116,102,105,101,108,100,115,115,116,97,116, 101,115,111,102,102,105,99,101,118,105,115,117,97,108,101,100,105,116,111,114, 118,111,108,117,109,101,82,101,112,111,114,116,109,117,115,101,117,109,109,111, 118,105,101,115,112,97,114,101,110,116,97,99,99,101,115,115,109,111,115,116,108, 121,109,111,116,104,101,114,34,32,105,100,61,34,109,97,114,107,101,116,103,114, 111,117,110,100,99,104,97,110,99,101,115,117,114,118,101,121,98,101,102,111,114, 101,115,121,109,98,111,108,109,111,109,101,110,116,115,112,101,101,99,104,109, 111,116,105,111,110,105,110,115,105,100,101,109,97,116,116,101,114,67,101,110, 116,101,114,111,98,106,101,99,116,101,120,105,115,116,115,109,105,100,100,108, 101,69,117,114,111,112,101,103,114,111,119,116,104,108,101,103,97,99,121,109,97, 110,110,101,114,101,110,111,117,103,104,99,97,114,101,101,114,97,110,115,119,101 ,114,111,114,105,103,105,110,112,111,114,116,97,108,99,108,105,101,110,116,115, 101,108,101,99,116,114,97,110,100,111,109,99,108,111,115,101,100,116,111,112,105 ,99,115,99,111,109,105,110,103,102,97,116,104,101,114,111,112,116,105,111,110, 115,105,109,112,108,121,114,97,105,115,101,100,101,115,99,97,112,101,99,104,111, 115,101,110,99,104,117,114,99,104,100,101,102,105,110,101,114,101,97,115,111,110 ,99,111,114,110,101,114,111,117,116,112,117,116,109,101,109,111,114,121,105,102, 114,97,109,101,112,111,108,105,99,101,109,111,100,101,108,115,78,117,109,98,101, 114,100,117,114,105,110,103,111,102,102,101,114,115,115,116,121,108,101,115,107, 105,108,108,101,100,108,105,115,116,101,100,99,97,108,108,101,100,115,105,108, 118,101,114,109,97,114,103,105,110,100,101,108,101,116,101,98,101,116,116,101, 114,98,114,111,119,115,101,108,105,109,105,116,115,71,108,111,98,97,108,115,105, 110,103,108,101,119,105,100,103,101,116,99,101,110,116,101,114,98,117,100,103, 101,116,110,111,119,114,97,112,99,114,101,100,105,116,99,108,97,105,109,115,101, 110,103,105,110,101,115,97,102,101,116,121,99,104,111,105,99,101,115,112,105,114 ,105,116,45,115,116,121,108,101,115,112,114,101,97,100,109,97,107,105,110,103, 110,101,101,100,101,100,114,117,115,115,105,97,112,108,101,97,115,101,101,120, 116,101,110,116,83,99,114,105,112,116,98,114,111,107,101,110,97,108,108,111,119, 115,99,104,97,114,103,101,100,105,118,105,100,101,102,97,99,116,111,114,109,101, 109,98,101,114,45,98,97,115,101,100,116,104,101,111,114,121,99,111,110,102,105, 103,97,114,111,117,110,100,119,111,114,107,101,100,104,101,108,112,101,100,67, 104,117,114,99,104,105,109,112,97,99,116,115,104,111,117,108,100,97,108,119,97, 121,115,108,111,103,111,34,32,98,111,116,116,111,109,108,105,115,116,34,62,41, 123,118,97,114,32,112,114,101,102,105,120,111,114,97,110,103,101,72,101,97,100, 101,114,46,112,117,115,104,40,99,111,117,112,108,101,103,97,114,100,101,110,98, 114,105,100,103,101,108,97,117,110,99,104,82,101,118,105,101,119,116,97,107,105, 110,103,118,105,115,105,111,110,108,105,116,116,108,101,100,97,116,105,110,103, 66,117,116,116,111,110,98,101,97,117,116,121,116,104,101,109,101,115,102,111,114 ,103,111,116,83,101,97,114,99,104,97,110,99,104,111,114,97,108,109,111,115,116, 108,111,97,100,101,100,67,104,97,110,103,101,114,101,116,117,114,110,115,116,114 ,105,110,103,114,101,108,111,97,100,77,111,98,105,108,101,105,110,99,111,109,101 ,115,117,112,112,108,121,83,111,117,114,99,101,111,114,100,101,114,115,118,105, 101,119,101,100,38,110,98,115,112,59,99,111,117,114,115,101,65,98,111,117,116,32 ,105,115,108,97,110,100,60,104,116,109,108,32,99,111,111,107,105,101,110,97,109, 101,61,34,97,109,97,122,111,110,109,111,100,101,114,110,97,100,118,105,99,101, 105,110,60,47,97,62,58,32,84,104,101,32,100,105,97,108,111,103,104,111,117,115, 101,115,66,69,71,73,78,32,77,101,120,105,99,111,115,116,97,114,116,115,99,101, 110,116,114,101,104,101,105,103,104,116,97,100,100,105,110,103,73,115,108,97,110 ,100,97,115,115,101,116,115,69,109,112,105,114,101,83,99,104,111,111,108,101,102 ,102,111,114,116,100,105,114,101,99,116,110,101,97,114,108,121,109,97,110,117,97 ,108,83,101,108,101,99,116,46,10,10,79,110,101,106,111,105,110,101,100,109,101, 110,117,34,62,80,104,105,108,105,112,97,119,97,114,100,115,104,97,110,100,108, 101,105,109,112,111,114,116,79,102,102,105,99,101,114,101,103,97,114,100,115,107 ,105,108,108,115,110,97,116,105,111,110,83,112,111,114,116,115,100,101,103,114, 101,101,119,101,101,107,108,121,32,40,101,46,103,46,98,101,104,105,110,100,100, 111,99,116,111,114,108,111,103,103,101,100,117,110,105,116,101,100,60,47,98,62, 60,47,98,101,103,105,110,115,112,108,97,110,116,115,97,115,115,105,115,116,97, 114,116,105,115,116,105,115,115,117,101,100,51,48,48,112,120,124,99,97,110,97, 100,97,97,103,101,110,99,121,115,99,104,101,109,101,114,101,109,97,105,110,66, 114,97,122,105,108,115,97,109,112,108,101,108,111,103,111,34,62,98,101,121,111, 110,100,45,115,99,97,108,101,97,99,99,101,112,116,115,101,114,118,101,100,109,97 ,114,105,110,101,70,111,111,116,101,114,99,97,109,101,114,97,60,47,104,49,62,10, 95,102,111,114,109,34,108,101,97,118,101,115,115,116,114,101,115,115,34,32,47,62 ,13,10,46,103,105,102,34,32,111,110,108,111,97,100,108,111,97,100,101,114,79,120 ,102,111,114,100,115,105,115,116,101,114,115,117,114,118,105,118,108,105,115,116 ,101,110,102,101,109,97,108,101,68,101,115,105,103,110,115,105,122,101,61,34,97, 112,112,101,97,108,116,101,120,116,34,62,108,101,118,101,108,115,116,104,97,110, 107,115,104,105,103,104,101,114,102,111,114,99,101,100,97,110,105,109,97,108,97, 110,121,111,110,101,65,102,114,105,99,97,97,103,114,101,101,100,114,101,99,101, 110,116,80,101,111,112,108,101,60,98,114,32,47,62,119,111,110,100,101,114,112, 114,105,99,101,115,116,117,114,110,101,100,124,124,32,123,125,59,109,97,105,110, 34,62,105,110,108,105,110,101,115,117,110,100,97,121,119,114,97,112,34,62,102,97 ,105,108,101,100,99,101,110,115,117,115,109,105,110,117,116,101,98,101,97,99,111 ,110,113,117,111,116,101,115,49,53,48,112,120,124,101,115,116,97,116,101,114,101 ,109,111,116,101,101,109,97,105,108,34,108,105,110,107,101,100,114,105,103,104, 116,59,115,105,103,110,97,108,102,111,114,109,97,108,49,46,104,116,109,108,115, 105,103,110,117,112,112,114,105,110,99,101,102,108,111,97,116,58,46,112,110,103, 34,32,102,111,114,117,109,46,65,99,99,101,115,115,112,97,112,101,114,115,115,111 ,117,110,100,115,101,120,116,101,110,100,72,101,105,103,104,116,115,108,105,100, 101,114,85,84,70,45,56,34,38,97,109,112,59,32,66,101,102,111,114,101,46,32,87, 105,116,104,115,116,117,100,105,111,111,119,110,101,114,115,109,97,110,97,103, 101,112,114,111,102,105,116,106,81,117,101,114,121,97,110,110,117,97,108,112,97, 114,97,109,115,98,111,117,103,104,116,102,97,109,111,117,115,103,111,111,103,108 ,101,108,111,110,103,101,114,105,43,43,41,32,123,105,115,114,97,101,108,115,97, 121,105,110,103,100,101,99,105,100,101,104,111,109,101,34,62,104,101,97,100,101, 114,101,110,115,117,114,101,98,114,97,110,99,104,112,105,101,99,101,115,98,108, 111,99,107,59,115,116,97,116,101,100,116,111,112,34,62,60,114,97,99,105,110,103, 114,101,115,105,122,101,45,45,38,103,116,59,112,97,99,105,116,121,115,101,120, 117,97,108,98,117,114,101,97,117,46,106,112,103,34,32,49,48,44,48,48,48,111,98, 116,97,105,110,116,105,116,108,101,115,97,109,111,117,110,116,44,32,73,110,99,46 ,99,111,109,101,100,121,109,101,110,117,34,32,108,121,114,105,99,115,116,111,100 ,97,121,46,105,110,100,101,101,100,99,111,117,110,116,121,95,108,111,103,111,46, 70,97,109,105,108,121,108,111,111,107,101,100,77,97,114,107,101,116,108,115,101, 32,105,102,80,108,97,121,101,114,116,117,114,107,101,121,41,59,118,97,114,32,102 ,111,114,101,115,116,103,105,118,105,110,103,101,114,114,111,114,115,68,111,109, 97,105,110,125,101,108,115,101,123,105,110,115,101,114,116,66,108,111,103,60,47, 102,111,111,116,101,114,108,111,103,105,110,46,102,97,115,116,101,114,97,103,101 ,110,116,115,60,98,111,100,121,32,49,48,112,120,32,48,112,114,97,103,109,97,102, 114,105,100,97,121,106,117,110,105,111,114,100,111,108,108,97,114,112,108,97,99, 101,100,99,111,118,101,114,115,112,108,117,103,105,110,53,44,48,48,48,32,112,97, 103,101,34,62,98,111,115,116,111,110,46,116,101,115,116,40,97,118,97,116,97,114, 116,101,115,116,101,100,95,99,111,117,110,116,102,111,114,117,109,115,115,99,104 ,101,109,97,105,110,100,101,120,44,102,105,108,108,101,100,115,104,97,114,101, 115,114,101,97,100,101,114,97,108,101,114,116,40,97,112,112,101,97,114,83,117,98 ,109,105,116,108,105,110,101,34,62,98,111,100,121,34,62,10,42,32,84,104,101,84, 104,111,117,103,104,115,101,101,105,110,103,106,101,114,115,101,121,78,101,119, 115,60,47,118,101,114,105,102,121,101,120,112,101,114,116,105,110,106,117,114, 121,119,105,100,116,104,61,67,111,111,107,105,101,83,84,65,82,84,32,97,99,114, 111,115,115,95,105,109,97,103,101,116,104,114,101,97,100,110,97,116,105,118,101, 112,111,99,107,101,116,98,111,120,34,62,10,83,121,115,116,101,109,32,68,97,118, 105,100,99,97,110,99,101,114,116,97,98,108,101,115,112,114,111,118,101,100,65, 112,114,105,108,32,114,101,97,108,108,121,100,114,105,118,101,114,105,116,101, 109,34,62,109,111,114,101,34,62,98,111,97,114,100,115,99,111,108,111,114,115,99, 97,109,112,117,115,102,105,114,115,116,32,124,124,32,91,93,59,109,101,100,105,97 ,46,103,117,105,116,97,114,102,105,110,105,115,104,119,105,100,116,104,58,115, 104,111,119,101,100,79,116,104,101,114,32,46,112,104,112,34,32,97,115,115,117, 109,101,108,97,121,101,114,115,119,105,108,115,111,110,115,116,111,114,101,115, 114,101,108,105,101,102,115,119,101,100,101,110,67,117,115,116,111,109,101,97, 115,105,108,121,32,121,111,117,114,32,83,116,114,105,110,103,10,10,87,104,105, 108,116,97,121,108,111,114,99,108,101,97,114,58,114,101,115,111,114,116,102,114, 101,110,99,104,116,104,111,117,103,104,34,41,32,43,32,34,60,98,111,100,121,62,98 ,117,121,105,110,103,98,114,97,110,100,115,77,101,109,98,101,114,110,97,109,101, 34,62,111,112,112,105,110,103,115,101,99,116,111,114,53,112,120,59,34,62,118,115 ,112,97,99,101,112,111,115,116,101,114,109,97,106,111,114,32,99,111,102,102,101, 101,109,97,114,116,105,110,109,97,116,117,114,101,104,97,112,112,101,110,60,47, 110,97,118,62,107,97,110,115,97,115,108,105,110,107,34,62,73,109,97,103,101,115, 61,102,97,108,115,101,119,104,105,108,101,32,104,115,112,97,99,101,48,38,97,109, 112,59,32,10,10,73,110,32,32,112,111,119,101,114,80,111,108,115,107,105,45,99, 111,108,111,114,106,111,114,100,97,110,66,111,116,116,111,109,83,116,97,114,116, 32,45,99,111,117,110,116,50,46,104,116,109,108,110,101,119,115,34,62,48,49,46, 106,112,103,79,110,108,105,110,101,45,114,105,103,104,116,109,105,108,108,101, 114,115,101,110,105,111,114,73,83,66,78,32,48,48,44,48,48,48,32,103,117,105,100, 101,115,118,97,108,117,101,41,101,99,116,105,111,110,114,101,112,97,105,114,46, 120,109,108,34,32,32,114,105,103,104,116,115,46,104,116,109,108,45,98,108,111,99 ,107,114,101,103,69,120,112,58,104,111,118,101,114,119,105,116,104,105,110,118, 105,114,103,105,110,112,104,111,110,101,115,60,47,116,114,62,13,117,115,105,110, 103,32,10,9,118,97,114,32,62,39,41,59,10,9,60,47,116,100,62,10,60,47,116,114,62, 10,98,97,104,97,115,97,98,114,97,115,105,108,103,97,108,101,103,111,109,97,103, 121,97,114,112,111,108,115,107,105,115,114,112,115,107,105,216,177,216,175,217, 136,228,184,173,230,150,135,231,174,128,228,189,147,231,185,129,233,171,148,228, 191,161,230,129,175,228,184,173,229,155,189,230,136,145,228,187,172,228,184,128, 228,184,170,229,133,172,229,143,184,231,174,161,231,144,134,232,174,186,229,157, 155,229,143,175,228,187,165,230,156,141,229,138,161,230,151,182,233,151,180,228, 184,170,228,186,186,228,186,167,229,147,129,232,135,170,229,183,177,228,188,129, 228,184,154,230,159,165,231,156,139,229,183,165,228,189,156,232,129,148,231,179, 187,230,178,161,230,156,137,231,189,145,231,171,153,230,137,128,230,156,137,232, 175,132,232,174,186,228,184,173,229,191,131,230,150,135,231,171,160,231,148,168, 230,136,183,233,166,150,233,161,181,228,189,156,232,128,133,230,138,128,230,156, 175,233,151,174,233,162,152,231,155,184,229,133,179,228,184,139,232,189,189,230, 144,156,231,180,162,228,189,191,231,148,168,232,189,175,228,187,182,229,156,168, 231,186,191,228,184,187,233,162,152,232,181,132,230,150,153,232,167,134,233,162, 145,229,155,158,229,164,141,230,179,168,229,134,140,231,189,145,231,187,156,230, 148,182,232,151,143,229,134,133,229,174,185,230,142,168,232,141,144,229,184,130, 229,156,186,230,182,136,230,129,175,231,169,186,233,151,180,229,143,145,229,184, 131,228,187,128,228,185,136,229,165,189,229,143,139,231,148,159,230,180,187,229, 155,190,231,137,135,229,143,145,229,177,149,229,166,130,230,158,156,230,137,139, 230,156,186,230,150,176,233,151,187,230,156,128,230,150,176,230,150,185,229,188, 143,229,140,151,228,186,172,230,143,144,228,190,155,229,133,179,228,186,142,230, 155,180,229,164,154,232,191,153,228,184,170,231,179,187,231,187,159,231,159,165, 233,129,147,230,184,184,230,136,143,229,185,191,229,145,138,229,133,182,228,187, 150,229,143,145,232,161,168,229,174,137,229,133,168,231,172,172,228,184,128,228, 188,154,229,145,152,232,191,155,232,161,140,231,130,185,229,135,187,231,137,136, 230,157,131,231,148,181,229,173,144,228,184,150,231,149,140,232,174,190,232,174, 161,229,133,141,232,180,185,230,149,153,232,130,178,229,138,160,229,133,165,230, 180,187,229,138,168,228,187,150,228,187,172,229,149,134,229,147,129,229,141,154, 229,174,162,231,142,176,229,156,168,228,184,138,230,181,183,229,166,130,228,189, 149,229,183,178,231,187,143,231,149,153,232,168,128,232,175,166,231,187,134,231, 164,190,229,140,186,231,153,187,229,189,149,230,156,172,231,171,153,233,156,128, 232,166,129,228,187,183,230,160,188,230,148,175,230,140,129,229,155,189,233,153, 133,233,147,190,230,142,165,229,155,189,229,174,182,229,187,186,232,174,190,230, 156,139,229,143,139,233,152,133,232,175,187,230,179,149,229,190,139,228,189,141, 231,189,174,231,187,143,230,181,142,233,128,137,230,139,169,232,191,153,230,160, 183,229,189,147,229,137,141,229,136,134,231,177,187,230,142,146,232,161,140,229, 155,160,228,184,186,228,186,164,230,152,147,230,156,128,229,144,142,233,159,179, 228,185,144,228,184,141,232,131,189,233,128,154,232,191,135,232,161,140,228,184, 154,231,167,145,230,138,128,229,143,175,232,131,189,232,174,190,229,164,135,229, 144,136,228,189,156,229,164,167,229,174,182,231,164,190,228,188,154,231,160,148, 231,169,182,228,184,147,228,184,154,229,133,168,233,131,168,233,161,185,231,155, 174,232,191,153,233,135,140,232,191,152,230,152,175,229,188,128,229,167,139,230, 131,133,229,134,181,231,148,181,232,132,145,230,150,135,228,187,182,229,147,129, 231,137,140,229,184,174,229,138,169,230,150,135,229,140,150,232,181,132,230,186, 144,229,164,167,229,173,166,229,173,166,228,185,160,229,156,176,229,157,128,230, 181,143,232,167,136,230,138,149,232,181,132,229,183,165,231,168,139,232,166,129, 230,177,130,230,128,142,228,185,136,230,151,182,229,128,153,229,138,159,232,131, 189,228,184,187,232,166,129,231,155,174,229,137,141,232,181,132,232,174,175,229, 159,142,229,184,130,230,150,185,230,179,149,231,148,181,229,189,177,230,139,155, 232,129,152,229,163,176,230,152,142,228,187,187,228,189,149,229,129,165,229,186, 183,230,149,176,230,141,174,231,190,142,229,155,189,230,177,189,232,189,166,228, 187,139,231,187,141,228,189,134,230,152,175,228,186,164,230,181,129,231,148,159, 228,186,167,230,137,128,228,187,165,231,148,181,232,175,157,230,152,190,231,164, 186,228,184,128,228,186,155,229,141,149,228,189,141,228,186,186,229,145,152,229, 136,134,230,158,144,229,156,176,229,155,190,230,151,133,230,184,184,229,183,165, 229,133,183,229,173,166,231,148,159,231,179,187,229,136,151,231,189,145,229,143, 139,229,184,150,229,173,144,229,175,134,231,160,129,233,162,145,233,129,147,230, 142,167,229,136,182,229,156,176,229,140,186,229,159,186,230,156,172,229,133,168, 229,155,189,231,189,145,228,184,138,233,135,141,232,166,129,231,172,172,228,186, 140,229,150,156,230,172,162,232,191,155,229,133,165,229,143,139,230,131,133,232, 191,153,228,186,155,232,128,131,232,175,149,229,143,145,231,142,176,229,159,185, 232,174,173,228,187,165,228,184,138,230,148,191,229,186,156,230,136,144,228,184, 186,231,142,175,229,162,131,233,166,153,230,184,175,229,144,140,230,151,182,229, 168,177,228,185,144,229,143,145,233,128,129,228,184,128,229,174,154,229,188,128, 229,143,145,228,189,156,229,147,129,230,160,135,229,135,134,230,172,162,232,191, 142,232,167,163,229,134,179,229,156,176,230,150,185,228,184,128,228,184,139,228, 187,165,229,143,138,232,180,163,228,187,187,230,136,150,232,128,133,229,174,162, 230,136,183,228,187,163,232,161,168,231,167,175,229,136,134,229,165,179,228,186, 186,230,149,176,231,160,129,233,148,128,229,148,174,229,135,186,231,142,176,231, 166,187,231,186,191,229,186,148,231,148,168,229,136,151,232,161,168,228,184,141, 229,144,140,231,188,150,232,190,145,231,187,159,232,174,161,230,159,165,232,175, 162,228,184,141,232,166,129,230,156,137,229,133,179,230,156,186,230,158,132,229, 190,136,229,164,154,230,146,173,230,148,190,231,187,132,231,187,135,230,148,191, 231,173,150,231,155,180,230,142,165,232,131,189,229,138,155,230,157,165,230,186, 144,230,153,130,233,150,147,231,156,139,229,136,176,231,131,173,233,151,168,229, 133,179,233,148,174,228,184,147,229,140,186,233,157,158,229,184,184,232,139,177, 232,175,173,231,153,190,229,186,166,229,184,140,230,156,155,231,190,142,229,165, 179,230,175,148,232,190,131,231,159,165,232,175,134,232,167,132,229,174,154,229, 187,186,232,174,174,233,131,168,233,151,168,230,132,143,232,167,129,231,178,190, 229,189,169,230,151,165,230,156,172,230,143,144,233,171,152,229,143,145,232,168, 128,230,150,185,233,157,162,229,159,186,233,135,145,229,164,132,231,144,134,230, 157,131,233,153,144,229,189,177,231,137,135,233,147,182,232,161,140,232,191,152, 230,156,137,229,136,134,228,186,171,231,137,169,229,147,129,231,187,143,232,144, 165,230,183,187,229,138,160,228,184,147,229,174,182,232,191,153,231,167,141,232, 175,157,233,162,152,232,181,183,230,157,165,228,184,154,229,138,161,229,133,172, 229,145,138,232,174,176,229,189,149,231,174,128,228,187,139,232,180,168,233,135, 143,231,148,183,228,186,186,229,189,177,229,147,141,229,188,149,231,148,168,230, 138,165,229,145,138,233,131,168,229,136,134,229,191,171,233,128,159,229,146,168, 232,175,162,230,151,182,229,176,154,230,179,168,230,132,143,231,148,179,232,175, 183,229,173,166,230,160,161,229,186,148,232,175,165,229,142,134,229,143,178,229, 143,170,230,152,175,232,191,148,229,155,158,232,180,173,228,185,176,229,144,141, 231,167,176,228,184,186,228,186,134,230,136,144,229,138,159,232,175,180,230,152, 142,228,190,155,229,186,148,229,173,169,229,173,144,228,184,147,233,162,152,231, 168,139,229,186,143,228,184,128,232,136,172,230,156,131,229,147,161,229,143,170, 230,156,137,229,133,182,229,174,131,228,191,157,230,138,164,232,128,140,228,184, 148,228,187,138,229,164,169,231,170,151,229,143,163,229,138,168,230,128,129,231, 138,182,230,128,129,231,137,185,229,136,171,232,174,164,228,184,186,229,191,133, 233,161,187,230,155,180,230,150,176,229,176,143,232,175,180,230,136,145,229,128, 145,228,189,156,228,184,186,229,170,146,228,189,147,229,140,133,230,139,172,233, 130,163,228,185,136,228,184,128,230,160,183,229,155,189,229,134,133,230,152,175, 229,144,166,230,160,185,230,141,174,231,148,181,232,167,134,229,173,166,233,153, 162,229,133,183,230,156,137,232,191,135,231,168,139,231,148,177,228,186,142,228, 186,186,230,137,141,229,135,186,230,157,165,228,184,141,232,191,135,230,173,163, 229,156,168,230,152,142,230,152,159,230,149,133,228,186,139,229,133,179,231,179, 187,230,160,135,233,162,152,229,149,134,229,138,161,232,190,147,229,133,165,228, 184,128,231,155,180,229,159,186,231,161,128,230,149,153,229,173,166,228,186,134, 232,167,163,229,187,186,231,173,145,231,187,147,230,158,156,229,133,168,231,144, 131,233,128,154,231,159,165,232,174,161,229,136,146,229,175,185,228,186,142,232, 137,186,230,156,175,231,155,184,229,134,140,229,143,145,231,148,159,231,156,159, 231,154,132,229,187,186,231,171,139,231,173,137,231,186,167,231,177,187,229,158, 139,231,187,143,233,170,140,229,174,158,231,142,176,229,136,182,228,189,156,230, 157,165,232,135,170,230,160,135,231,173,190,228,187,165,228,184,139,229,142,159, 229,136,155,230,151,160,230,179,149,229,133,182,228,184,173,229,128,139,228,186, 186,228,184,128,229,136,135,230,140,135,229,141,151,229,133,179,233,151,173,233, 155,134,229,155,162,231,172,172,228,184,137,229,133,179,230,179,168,229,155,160, 230,173,164,231,133,167,231,137,135,230,183,177,229,156,179,229,149,134,228,184, 154,229,185,191,229,183,158,230,151,165,230,156,159,233,171,152,231,186,167,230, 156,128,232,191,145,231,187,188,229,144,136,232,161,168,231,164,186,228,184,147, 232,190,145,232,161,140,228,184,186,228,186,164,233,128,154,232,175,132,228,187, 183,232,167,137,229,190,151,231,178,190,229,141,142,229,174,182,229,186,173,229, 174,140,230,136,144,230,132,159,232,167,137,229,174,137,232,163,133,229,190,151, 229,136,176,233,130,174,228,187,182,229,136,182,229,186,166,233,163,159,229,147, 129,232,153,189,231,132,182,232,189,172,232,189,189,230,138,165,228,187,183,232, 174,176,232,128,133,230,150,185,230,161,136,232,161,140,230,148,191,228,186,186, 230,176,145,231,148,168,229,147,129,228,184,156,232,165,191,230,143,144,229,135, 186,233,133,146,229,186,151,231,132,182,229,144,142,228,187,152,230,172,190,231, 131,173,231,130,185,228,187,165,229,137,141,229,174,140,229,133,168,229,143,145, 229,184,150,232,174,190,231,189,174,233,162,134,229,175,188,229,183,165,228,184, 154,229,140,187,233,153,162,231,156,139,231,156,139,231,187,143,229,133,184,229, 142,159,229,155,160,229,185,179,229,143,176,229,144,132,231,167,141,229,162,158, 229,138,160,230,157,144,230,150,153,230,150,176,229,162,158,228,185,139,229,144, 142,232,129,140,228,184,154,230,149,136,230,158,156,228,187,138,229,185,180,232, 174,186,230,150,135,230,136,145,229,155,189,229,145,138,232,175,137,231,137,136, 228,184,187,228,191,174,230,148,185,229,143,130,228,184,142,230,137,147,229,141, 176,229,191,171,228,185,144,230,156,186,230,162,176,232,167,130,231,130,185,229, 173,152,229,156,168,231,178,190,231,165,158,232,142,183,229,190,151,229,136,169, 231,148,168,231,187,167,231,187,173,228,189,160,228,187,172,232,191,153,228,185, 136,230,168,161,229,188,143,232,175,173,232,168,128,232,131,189,229,164,159,233, 155,133,232,153,142,230,147,141,228,189,156,233,163,142,230,160,188,228,184,128, 232,181,183,231,167,145,229,173,166,228,189,147,232,130,178,231,159,173,228,191, 161,230,157,161,228,187,182,230,178,187,231,150,151,232,191,144,229,138,168,228, 186,167,228,184,154,228,188,154,232,174,174,229,175,188,232,136,170,229,133,136, 231,148,159,232,129,148,231,155,159,229,143,175,230,152,175,229,149,143,233,161, 140,231,187,147,230,158,132,228,189,156,231,148,168,232,176,131,230,159,165,232, 179,135,230,150,153,232,135,170,229,138,168,232,180,159,232,180,163,229,134,156, 228,184,154,232,174,191,233,151,174,229,174,158,230,150,189,230,142,165,229,143, 151,232,174,168,232,174,186,233,130,163,228,184,170,229,143,141,233,166,136,229, 138,160,229,188,186,229,165,179,230,128,167,232,140,131,229,155,180,230,156,141, 229,139,153,228,188,145,233,151,178,228,187,138,230,151,165,229,174,162,230,156, 141,232,167,128,231,156,139,229,143,130,229,138,160,231,154,132,232,175,157,228, 184,128,231,130,185,228,191,157,232,175,129,229,155,190,228,185,166,230,156,137, 230,149,136,230,181,139,232,175,149,231,167,187,229,138,168,230,137,141,232,131, 189,229,134,179,229,174,154,232,130,161,231,165,168,228,184,141,230,150,173,233, 156,128,230,177,130,228,184,141,229,190,151,229,138,158,230,179,149,228,185,139, 233,151,180,233,135,135,231,148,168,232,144,165,233,148,128,230,138,149,232,175, 137,231,155,174,230,160,135,231,136,177,230,131,133,230,145,132,229,189,177,230, 156,137,228,186,155,232,164,135,232,163,189,230,150,135,229,173,166,230,156,186, 228,188,154,230,149,176,229,173,151,232,163,133,228,191,174,232,180,173,231,137, 169,229,134,156,230,157,145,229,133,168,233,157,162,231,178,190,229,147,129,229, 133,182,229,174,158,228,186,139,230,131,133,230,176,180,229,185,179,230,143,144, 231,164,186,228,184,138,229,184,130,232,176,162,232,176,162,230,153,174,233,128, 154,230,149,153,229,184,136,228,184,138,228,188,160,231,177,187,229,136,171,230, 173,140,230,155,178,230,139,165,230,156,137,229,136,155,230,150,176,233,133,141, 228,187,182,229,143,170,232,166,129,230,151,182,228,187,163,232,179,135,232,168, 138,232,190,190,229,136,176,228,186,186,231,148,159,232,174,162,233,152,133,232, 128,129,229,184,136,229,177,149,231,164,186,229,191,131,231,144,134,232,180,180, 229,173,144,231,182,178,231,171,153,228,184,187,233,161,140,232,135,170,231,132, 182,231,186,167,229,136,171,231,174,128,229,141,149,230,148,185,233,157,169,233, 130,163,228,186,155,230,157,165,232,175,180,230,137,147,229,188,128,228,187,163, 231,160,129,229,136,160,233,153,164,232,175,129,229,136,184,232,138,130,231,155, 174,233,135,141,231,130,185,230,172,161,230,149,184,229,164,154,229,176,145,232, 167,132,229,136,146,232,181,132,233,135,145,230,137,190,229,136,176,228,187,165, 229,144,142,229,164,167,229,133,168,228,184,187,233,161,181,230,156,128,228,189, 179,229,155,158,231,173,148,229,164,169,228,184,139,228,191,157,233,154,156,231, 142,176,228,187,163,230,163,128,230,159,165,230,138,149,231,165,168,229,176,143, 230,151,182,230,178,146,230,156,137,230,173,163,229,184,184,231,148,154,232,135, 179,228,187,163,231,144,134,231,155,174,229,189,149,229,133,172,229,188,128,229, 164,141,229,136,182,233,135,145,232,158,141,229,185,184,231,166,143,231,137,136, 230,156,172,229,189,162,230,136,144,229,135,134,229,164,135,232,161,140,230,131, 133,229,155,158,229,136,176,230,128,157,230,131,179,230,128,142,230,160,183,229, 141,143,232,174,174,232,174,164,232,175,129,230,156,128,229,165,189,228,186,167, 231,148,159,230,140,137,231,133,167,230,156,141,232,163,133,229,185,191,228,184, 156,229,138,168,230,188,171,233,135,135,232,180,173,230,150,176,230,137,139,231, 187,132,229,155,190,233,157,162,230,157,191,229,143,130,232,128,131,230,148,191, 230,178,187,229,174,185,230,152,147,229,164,169,229,156,176,229,138,170,229,138, 155,228,186,186,228,187,172,229,141,135,231,186,167,233,128,159,229,186,166,228, 186,186,231,137,169,232,176,131,230,149,180,230,181,129,232,161,140,233,128,160, 230,136,144,230,150,135,229,173,151,233,159,169,229,155,189,232,180,184,230,152, 147,229,188,128,229,177,149,231,155,184,233,151,156,232,161,168,231,142,176,229, 189,177,232,167,134,229,166,130,230,173,164,231,190,142,229,174,185,229,164,167, 229,176,143,230,138,165,233,129,147,230,157,161,230,172,190,229,191,131,230,131, 133,232,174,184,229,164,154,230,179,149,232,167,132,229,174,182,229,177,133,228, 185,166,229,186,151,232,191,158,230,142,165,231,171,139,229,141,179,228,184,190, 230,138,165,230,138,128,229,183,167,229,165,165,232,191,144,231,153,187,229,133, 165,228,187,165,230,157,165,231,144,134,232,174,186,228,186,139,228,187,182,232, 135,170,231,148,177,228,184,173,229,141,142,229,138,158,229,133,172,229,166,136, 229,166,136,231,156,159,230,173,163,228,184,141,233,148,153,229,133,168,230,150, 135,229,144,136,229,144,140,228,187,183,229,128,188,229,136,171,228,186,186,231, 155,145,231,157,163,229,133,183,228,189,147,228,184,150,231,186,170,229,155,162, 233,152,159,229,136,155,228,184,154,230,137,191,230,139,133,229,162,158,233,149, 191,230,156,137,228,186,186,228,191,157,230,140,129,229,149,134,229,174,182,231, 187,180,228,191,174,229,143,176,230,185,190,229,183,166,229,143,179,232,130,161, 228,187,189,231,173,148,230,161,136,229,174,158,233,153,133,231,148,181,228,191, 161,231,187,143,231,144,134,231,148,159,229,145,189,229,174,163,228,188,160,228, 187,187,229,138,161,230,173,163,229,188,143,231,137,185,232,137,178,228,184,139, 230,157,165,229,141,143,228,188,154,229,143,170,232,131,189,229,189,147,231,132, 182,233,135,141,230,150,176,229,133,167,229,174,185,230,140,135,229,175,188,232, 191,144,232,161,140,230,151,165,229,191,151,232,179,163,229,174,182,232,182,133, 232,191,135,229,156,159,229,156,176,230,181,153,230,177,159,230,148,175,228,187, 152,230,142,168,229,135,186,231,171,153,233,149,191,230,157,173,229,183,158,230, 137,167,232,161,140,229,136,182,233,128,160,228,185,139,228,184,128,230,142,168, 229,185,191,231,142,176,229,156,186,230,143,143,232,191,176,229,143,152,229,140, 150,228,188,160,231,187,159,230,173,140,230,137,139,228,191,157,233,153,169,232, 175,190,231,168,139,229,140,187,231,150,151,231,187,143,232,191,135,232,191,135, 229,142,187,228,185,139,229,137,141,230,148,182,229,133,165,229,185,180,229,186, 166,230,157,130,229,191,151,231,190,142,228,184,189,230,156,128,233,171,152,231, 153,187,233,153,134,230,156,170,230,157,165,229,138,160,229,183,165,229,133,141, 232,180,163,230,149,153,231,168,139,231,137,136,229,157,151,232,186,171,228,189, 147,233,135,141,229,186,134,229,135,186,229,148,174,230,136,144,230,156,172,229, 189,162,229,188,143,229,156,159,232,177,134,229,135,186,229,131,185,228,184,156, 230,150,185,233,130,174,231,174,177,229,141,151,228,186,172,230,177,130,232,129, 140,229,143,150,229,190,151,232,129,140,228,189,141,231,155,184,228,191,161,233, 161,181,233,157,162,229,136,134,233,146,159,231,189,145,233,161,181,231,161,174, 229,174,154,229,155,190,228,190,139,231,189,145,229,157,128,231,167,175,230,158, 129,233,148,153,232,175,175,231,155,174,231,154,132,229,174,157,232,180,157,230, 156,186,229,133,179,233,163,142,233,153,169,230,142,136,230,157,131,231,151,133, 230,175,146,229,174,160,231,137,169,233,153,164,228,186,134,232,169,149,232,171, 150,231,150,190,231,151,133,229,143,138,230,151,182,230,177,130,232,180,173,231, 171,153,231,130,185,229,132,191,231,171,165,230,175,143,229,164,169,228,184,173, 229,164,174,232,174,164,232,175,134,230,175,143,228,184,170,229,164,169,230,180, 165,229,173,151,228,189,147,229,143,176,231,129,163,231,187,180,230,138,164,230, 156,172,233,161,181,228,184,170,230,128,167,229,174,152,230,150,185,229,184,184, 232,167,129,231,155,184,230,156,186,230,136,152,231,149,165,229,186,148,229,189, 147,229,190,139,229,184,136,230,150,185,228,190,191,230,160,161,229,155,173,232, 130,161,229,184,130,230,136,191,229,177,139,230,160,143,231,155,174,229,145,152, 229,183,165,229,175,188,232,135,180,231,170,129,231,132,182,233,129,147,229,133, 183,230,156,172,231,189,145,231,187,147,229,144,136,230,161,163,230,161,136,229, 138,179,229,138,168,229,143,166,229,164,150,231,190,142,229,133,131,229,188,149, 232,181,183,230,148,185,229,143,152,231,172,172,229,155,155,228,188,154,232,174, 161,232,170,170,230,152,142,233,154,144,231,167,129,229,174,157,229,174,157,232, 167,132,232,140,131,230,182,136,232,180,185,229,133,177,229,144,140,229,191,152, 232,174,176,228,189,147,231,179,187,229,184,166,230,157,165,229,144,141,229,173, 151,231,153,188,232,161,168,229,188,128,230,148,190,229,138,160,231,155,159,229, 143,151,229,136,176,228,186,140,230,137,139,229,164,167,233,135,143,230,136,144, 228,186,186,230,149,176,233,135,143,229,133,177,228,186,171,229,140,186,229,159, 159,229,165,179,229,173,169,229,142,159,229,136,153,230,137,128,229,156,168,231, 187,147,230,157,159,233,128,154,228,191,161,232,182,133,231,186,167,233,133,141, 231,189,174,229,189,147,230,151,182,228,188,152,231,167,128,230,128,167,230,132, 159,230,136,191,228,186,167,233,129,138,230,136,178,229,135,186,229,143,163,230, 143,144,228,186,164,229,176,177,228,184,154,228,191,157,229,129,165,231,168,139, 229,186,166,229,143,130,230,149,176,228,186,139,228,184,154,230,149,180,228,184, 170,229,177,177,228,184,156,230,131,133,230,132,159,231,137,185,230,174,138,229, 136,134,233,161,158,230,144,156,229,176,139,229,177,158,228,186,142,233,151,168, 230,136,183,232,180,162,229,138,161,229,163,176,233,159,179,229,143,138,229,133, 182,232,180,162,231,187,143,229,157,154,230,140,129,229,185,178,233,131,168,230, 136,144,231,171,139,229,136,169,231,155,138,232,128,131,232,153,145,230,136,144, 233,131,189,229,140,133,232,163,133,231,148,168,230,136,182,230,175,148,232,181, 155,230,150,135,230,152,142,230,139,155,229,149,134,229,174,140,230,149,180,231, 156,159,230,152,175,231,156,188,231,157,155,228,188,153,228,188,180,229,168,129, 230,156,155,233,162,134,229,159,159,229,141,171,231,148,159,228,188,152,230,131, 160,232,171,150,229,163,135,229,133,172,229,133,177,232,137,175,229,165,189,229, 133,133,229,136,134,231,172,166,229,144,136,233,153,132,228,187,182,231,137,185, 231,130,185,228,184,141,229,143,175,232,139,177,230,150,135,232,181,132,228,186, 167,230,160,185,230,156,172,230,152,142,230,152,190,229,175,134,231,162,188,229, 133,172,228,188,151,230,176,145,230,151,143,230,155,180,229,138,160,228,186,171, 229,143,151,229,144,140,229,173,166,229,144,175,229,138,168,233,128,130,229,144, 136,229,142,159,230,157,165,233,151,174,231,173,148,230,156,172,230,150,135,231, 190,142,233,163,159,231,187,191,232,137,178,231,168,179,229,174,154,231,187,136, 228,186,142,231,148,159,231,137,169,228,190,155,230,177,130,230,144,156,231,139, 144,229,138,155,233,135,143,228,184,165,233,135,141,230,176,184,232,191,156,229, 134,153,231,156,159,230,156,137,233,153,144,231,171,158,228,186,137,229,175,185, 232,177,161,232,180,185,231,148,168,228,184,141,229,165,189,231,187,157,229,175, 185,229,141,129,229,136,134,228,191,131,232,191,155,231,130,185,232,175,132,229, 189,177,233,159,179,228,188,152,229,138,191,228,184,141,229,176,145,230,172,163, 232,181,143,229,185,182,228,184,148,230,156,137,231,130,185,230,150,185,229,144, 145,229,133,168,230,150,176,228,191,161,231,148,168,232,174,190,230,150,189,229, 189,162,232,177,161,232,181,132,230,160,188,231,170,129,231,160,180,233,154,143, 231,157,128,233,135,141,229,164,167,228,186,142,230,152,175,230,175,149,228,184, 154,230,153,186,232,131,189,229,140,150,229,183,165,229,174,140,231,190,142,229, 149,134,229,159,142,231,187,159,228,184,128,229,135,186,231,137,136,230,137,147, 233,128,160,231,148,162,229,147,129,230,166,130,229,134,181,231,148,168,228,186, 142,228,191,157,231,149,153,229,155,160,231,180,160,228,184,173,229,156,139,229, 173,152,229,130,168,232,180,180,229,155,190,230,156,128,230,132,155,233,149,191, 230,156,159,229,143,163,228,187,183,231,144,134,232,180,162,229,159,186,229,156, 176,229,174,137,230,142,146,230,173,166,230,177,137,233,135,140,233,157,162,229, 136,155,229,187,186,229,164,169,231,169,186,233,166,150,229,133,136,229,174,140, 229,150,132,233,169,177,229,138,168,228,184,139,233,157,162,228,184,141,229,134, 141,232,175,154,228,191,161,230,132,143,228,185,137,233,152,179,229,133,137,232, 139,177,229,155,189,230,188,130,228,186,174,229,134,155,228,186,139,231,142,169, 229,174,182,231,190,164,228,188,151,229,134,156,230,176,145,229,141,179,229,143, 175,229,144,141,231,168,177,229,174,182,229,133,183,229,138,168,231,148,187,230, 131,179,229,136,176,230,179,168,230,152,142,229,176,143,229,173,166,230,128,167, 232,131,189,232,128,131,231,160,148,231,161,172,228,187,182,232,167,130,231,156, 139,230,184,133,230,165,154,230,144,158,231,172,145,233,166,150,233,160,129,233, 187,132,233,135,145,233,128,130,231,148,168,230,177,159,232,139,143,231,156,159, 229,174,158,228,184,187,231,174,161,233,152,182,230,174,181,232,168,187,229,134, 138,231,191,187,232,175,145,230,157,131,229,136,169,229,129,154,229,165,189,228, 188,188,228,185,142,233,128,154,232,174,175,230,150,189,229,183,165,231,139,128, 230,133,139,228,185,159,232,174,184,231,142,175,228,191,157,229,159,185,229,133, 187,230,166,130,229,191,181,229,164,167,229,158,139,230,156,186,231,165,168,231, 144,134,232,167,163,229,140,191,229,144,141,99,117,97,110,100,111,101,110,118, 105,97,114,109,97,100,114,105,100,98,117,115,99,97,114,105,110,105,99,105,111, 116,105,101,109,112,111,112,111,114,113,117,101,99,117,101,110,116,97,101,115, 116,97,100,111,112,117,101,100,101,110,106,117,101,103,111,115,99,111,110,116, 114,97,101,115,116,195,161,110,110,111,109,98,114,101,116,105,101,110,101,110, 112,101,114,102,105,108,109,97,110,101,114,97,97,109,105,103,111,115,99,105,117, 100,97,100,99,101,110,116,114,111,97,117,110,113,117,101,112,117,101,100,101,115 ,100,101,110,116,114,111,112,114,105,109,101,114,112,114,101,99,105,111,115,101, 103,195,186,110,98,117,101,110,111,115,118,111,108,118,101,114,112,117,110,116, 111,115,115,101,109,97,110,97,104,97,98,195,173,97,97,103,111,115,116,111,110, 117,101,118,111,115,117,110,105,100,111,115,99,97,114,108,111,115,101,113,117, 105,112,111,110,105,195,177,111,115,109,117,99,104,111,115,97,108,103,117,110,97 ,99,111,114,114,101,111,105,109,97,103,101,110,112,97,114,116,105,114,97,114,114 ,105,98,97,109,97,114,195,173,97,104,111,109,98,114,101,101,109,112,108,101,111, 118,101,114,100,97,100,99,97,109,98,105,111,109,117,99,104,97,115,102,117,101, 114,111,110,112,97,115,97,100,111,108,195,173,110,101,97,112,97,114,101,99,101, 110,117,101,118,97,115,99,117,114,115,111,115,101,115,116,97,98,97,113,117,105, 101,114,111,108,105,98,114,111,115,99,117,97,110,116,111,97,99,99,101,115,111, 109,105,103,117,101,108,118,97,114,105,111,115,99,117,97,116,114,111,116,105,101 ,110,101,115,103,114,117,112,111,115,115,101,114,195,161,110,101,117,114,111,112 ,97,109,101,100,105,111,115,102,114,101,110,116,101,97,99,101,114,99,97,100,101, 109,195,161,115,111,102,101,114,116,97,99,111,99,104,101,115,109,111,100,101,108 ,111,105,116,97,108,105,97,108,101,116,114,97,115,97,108,103,195,186,110,99,111, 109,112,114,97,99,117,97,108,101,115,101,120,105,115,116,101,99,117,101,114,112, 111,115,105,101,110,100,111,112,114,101,110,115,97,108,108,101,103,97,114,118, 105,97,106,101,115,100,105,110,101,114,111,109,117,114,99,105,97,112,111,100,114 ,195,161,112,117,101,115,116,111,100,105,97,114,105,111,112,117,101,98,108,111, 113,117,105,101,114,101,109,97,110,117,101,108,112,114,111,112,105,111,99,114, 105,115,105,115,99,105,101,114,116,111,115,101,103,117,114,111,109,117,101,114, 116,101,102,117,101,110,116,101,99,101,114,114,97,114,103,114,97,110,100,101,101 ,102,101,99,116,111,112,97,114,116,101,115,109,101,100,105,100,97,112,114,111, 112,105,97,111,102,114,101,99,101,116,105,101,114,114,97,101,45,109,97,105,108, 118,97,114,105,97,115,102,111,114,109,97,115,102,117,116,117,114,111,111,98,106, 101,116,111,115,101,103,117,105,114,114,105,101,115,103,111,110,111,114,109,97, 115,109,105,115,109,111,115,195,186,110,105,99,111,99,97,109,105,110,111,115,105 ,116,105,111,115,114,97,122,195,179,110,100,101,98,105,100,111,112,114,117,101, 98,97,116,111,108,101,100,111,116,101,110,195,173,97,106,101,115,195,186,115,101 ,115,112,101,114,111,99,111,99,105,110,97,111,114,105,103,101,110,116,105,101, 110,100,97,99,105,101,110,116,111,99,195,161,100,105,122,104,97,98,108,97,114, 115,101,114,195,173,97,108,97,116,105,110,97,102,117,101,114,122,97,101,115,116, 105,108,111,103,117,101,114,114,97,101,110,116,114,97,114,195,169,120,105,116, 111,108,195,179,112,101,122,97,103,101,110,100,97,118,195,173,100,101,111,101, 118,105,116,97,114,112,97,103,105,110,97,109,101,116,114,111,115,106,97,118,105, 101,114,112,97,100,114,101,115,102,195,161,99,105,108,99,97,98,101,122,97,195, 161,114,101,97,115,115,97,108,105,100,97,101,110,118,195,173,111,106,97,112,195, 179,110,97,98,117,115,111,115,98,105,101,110,101,115,116,101,120,116,111,115,108 ,108,101,118,97,114,112,117,101,100,97,110,102,117,101,114,116,101,99,111,109, 195,186,110,99,108,97,115,101,115,104,117,109,97,110,111,116,101,110,105,100,111 ,98,105,108,98,97,111,117,110,105,100,97,100,101,115,116,195,161,115,101,100,105 ,116,97,114,99,114,101,97,100,111,208,180,208,187,209,143,209,135,209,130,208, 190,208,186,208,176,208,186,208,184,208,187,208,184,209,141,209,130,208,190,208, 178,209,129,208,181,208,181,208,179,208,190,208,191,209,128,208,184,209,130,208, 176,208,186,208,181,209,137,208,181,209,131,208,182,208,181,208,154,208,176,208, 186,208,177,208,181,208,183,208,177,209,139,208,187,208,190,208,189,208,184,208, 146,209,129,208,181,208,191,208,190,208,180,208,173,209,130,208,190,209,130,208, 190,208,188,209,135,208,181,208,188,208,189,208,181,209,130,208,187,208,181,209, 130,209,128,208,176,208,183,208,190,208,189,208,176,208,179,208,180,208,181,208, 188,208,189,208,181,208,148,208,187,209,143,208,159,209,128,208,184,208,189,208, 176,209,129,208,189,208,184,209,133,209,130,208,181,208,188,208,186,209,130,208, 190,208,179,208,190,208,180,208,178,208,190,209,130,209,130,208,176,208,188,208, 161,208,168,208,144,208,188,208,176,209,143,208,167,209,130,208,190,208,178,208, 176,209,129,208,178,208,176,208,188,208,181,208,188,209,131,208,162,208,176,208, 186,208,180,208,178,208,176,208,189,208,176,208,188,209,141,209,130,208,184,209, 141,209,130,209,131,208,146,208,176,208,188,209,130,208,181,209,133,208,191,209, 128,208,190,209,130,209,131,209,130,208,189,208,176,208,180,208,180,208,189,209, 143,208,146,208,190,209,130,209,130,209,128,208,184,208,189,208,181,208,185,208, 146,208,176,209,129,208,189,208,184,208,188,209,129,208,176,208,188,209,130,208, 190,209,130,209,128,209,131,208,177,208,158,208,189,208,184,208,188,208,184,209, 128,208,189,208,181,208,181,208,158,208,158,208,158,208,187,208,184,209,134,209, 141,209,130,208,176,208,158,208,189,208,176,208,189,208,181,208,188,208,180,208, 190,208,188,208,188,208,190,208,185,208,180,208,178,208,181,208,190,208,189,208, 190,209,129,209,131,208,180,224,164,149,224,165,135,224,164,185,224,165,136,224, 164,149,224,165,128,224,164,184,224,165,135,224,164,149,224,164,190,224,164,149, 224,165,139,224,164,148,224,164,176,224,164,170,224,164,176,224,164,168,224,165, 135,224,164,143,224,164,149,224,164,149,224,164,191,224,164,173,224,165,128,224, 164,135,224,164,184,224,164,149,224,164,176,224,164,164,224,165,139,224,164,185, 224,165,139,224,164,134,224,164,170,224,164,185,224,165,128,224,164,175,224,164, 185,224,164,175,224,164,190,224,164,164,224,164,149,224,164,165,224,164,190,106, 97,103,114,97,110,224,164,134,224,164,156,224,164,156,224,165,139,224,164,133, 224,164,172,224,164,166,224,165,139,224,164,151,224,164,136,224,164,156,224,164, 190,224,164,151,224,164,143,224,164,185,224,164,174,224,164,135,224,164,168,224, 164,181,224,164,185,224,164,175,224,165,135,224,164,165,224,165,135,224,164,165, 224,165,128,224,164,152,224,164,176,224,164,156,224,164,172,224,164,166,224,165, 128,224,164,149,224,164,136,224,164,156,224,165,128,224,164,181,224,165,135,224, 164,168,224,164,136,224,164,168,224,164,143,224,164,185,224,164,176,224,164,137, 224,164,184,224,164,174,224,165,135,224,164,149,224,164,174,224,164,181,224,165, 139,224,164,178,224,165,135,224,164,184,224,164,172,224,164,174,224,164,136,224, 164,166,224,165,135,224,164,147,224,164,176,224,164,134,224,164,174,224,164,172, 224,164,184,224,164,173,224,164,176,224,164,172,224,164,168,224,164,154,224,164, 178,224,164,174,224,164,168,224,164,134,224,164,151,224,164,184,224,165,128,224, 164,178,224,165,128,216,185,217,132,217,137,216,165,217,132,217,137,217,135,216, 176,216,167,216,162,216,174,216,177,216,185,216,175,216,175,216,167,217,132,217, 137,217,135,216,176,217,135,216,181,217,136,216,177,216,186,217,138,216,177,217, 131,216,167,217,134,217,136,217,132,216,167,216,168,217,138,217,134,216,185,216, 177,216,182,216,176,217,132,217,131,217,135,217,134,216,167,217,138,217,136,217, 133,217,130,216,167,217,132,216,185,217,132,217,138,216,167,217,134,216,167,217, 132,217,131,217,134,216,173,216,170,217,137,217,130,216,168,217,132,217,136,216, 173,216,169,216,167,216,174,216,177,217,129,217,130,216,183,216,185,216,168,216, 175,216,177,217,131,217,134,216,165,216,176,216,167,217,131,217,133,216,167,216, 167,216,173,216,175,216,165,217,132,216,167,217,129,217,138,217,135,216,168,216, 185,216,182,217,131,217,138,217,129,216,168,216,173,216,171,217,136,217,133,217, 134,217,136,217,135,217,136,216,163,217,134,216,167,216,172,216,175,216,167,217, 132,217,135,216,167,216,179,217,132,217,133,216,185,217,134,216,175,217,132,217, 138,216,179,216,185,216,168,216,177,216,181,217,132,217,137,217,133,217,134,216, 176,216,168,217,135,216,167,216,163,217,134,217,135,217,133,216,171,217,132,217, 131,217,134,216,170,216,167,217,132,216,167,216,173,217,138,216,171,217,133,216, 181,216,177,216,180,216,177,216,173,216,173,217,136,217,132,217,136,217,129,217, 138,216,167,216,176,216,167,217,132,217,131,217,132,217,133,216,177,216,169,216, 167,217,134,216,170,216,167,217,132,217,129,216,163,216,168,217,136,216,174,216, 167,216,181,216,163,217,134,216,170,216,167,217,134,217,135,216,167,217,132,217, 138,216,185,216,182,217,136,217,136,217,130,216,175,216,167,216,168,217,134,216, 174,217,138,216,177,216,168,217,134,216,170,217,132,217,131,217,133,216,180,216, 167,216,161,217,136,217,135,217,138,216,167,216,168,217,136,217,130,216,181,216, 181,217,136,217,133,216,167,216,177,217,130,217,133,216,163,216,173,216,175,217, 134,216,173,217,134,216,185,216,175,217,133,216,177,216,163,217,138,216,167,216, 173,216,169,217,131,216,170,216,168,216,175,217,136,217,134,217,138,216,172,216, 168,217,133,217,134,217,135,216,170,216,173,216,170,216,172,217,135,216,169,216, 179,217,134,216,169,217,138,216,170,217,133,217,131,216,177,216,169,216,186,216, 178,216,169,217,134,217,129,216,179,216,168,217,138,216,170,217,132,217,132,217, 135,217,132,217,134,216,167,216,170,217,132,217,131,217,130,217,132,216,168,217, 132,217,133,216,167,216,185,217,134,217,135,216,163,217,136,217,132,216,180,217, 138,216,161,217,134,217,136,216,177,216,163,217,133,216,167,217,129,217,138,217, 131,216,168,217,131,217,132,216,176,216,167,216,170,216,177,216,170,216,168,216, 168,216,163,217,134,217,135,217,133,216,179,216,167,217,134,217,131,216,168,217, 138,216,185,217,129,217,130,216,175,216,173,216,179,217,134,217,132,217,135,217, 133,216,180,216,185,216,177,216,163,217,135,217,132,216,180,217,135,216,177,217, 130,216,183,216,177,216,183,217,132,216,168,112,114,111,102,105,108,101,115,101, 114,118,105,99,101,100,101,102,97,117,108,116,104,105,109,115,101,108,102,100, 101,116,97,105,108,115,99,111,110,116,101,110,116,115,117,112,112,111,114,116, 115,116,97,114,116,101,100,109,101,115,115,97,103,101,115,117,99,99,101,115,115, 102,97,115,104,105,111,110,60,116,105,116,108,101,62,99,111,117,110,116,114,121, 97,99,99,111,117,110,116,99,114,101,97,116,101,100,115,116,111,114,105,101,115, 114,101,115,117,108,116,115,114,117,110,110,105,110,103,112,114,111,99,101,115, 115,119,114,105,116,105,110,103,111,98,106,101,99,116,115,118,105,115,105,98,108 ,101,119,101,108,99,111,109,101,97,114,116,105,99,108,101,117,110,107,110,111, 119,110,110,101,116,119,111,114,107,99,111,109,112,97,110,121,100,121,110,97,109 ,105,99,98,114,111,119,115,101,114,112,114,105,118,97,99,121,112,114,111,98,108, 101,109,83,101,114,118,105,99,101,114,101,115,112,101,99,116,100,105,115,112,108 ,97,121,114,101,113,117,101,115,116,114,101,115,101,114,118,101,119,101,98,115, 105,116,101,104,105,115,116,111,114,121,102,114,105,101,110,100,115,111,112,116, 105,111,110,115,119,111,114,107,105,110,103,118,101,114,115,105,111,110,109,105, 108,108,105,111,110,99,104,97,110,110,101,108,119,105,110,100,111,119,46,97,100, 100,114,101,115,115,118,105,115,105,116,101,100,119,101,97,116,104,101,114,99, 111,114,114,101,99,116,112,114,111,100,117,99,116,101,100,105,114,101,99,116,102 ,111,114,119,97,114,100,121,111,117,32,99,97,110,114,101,109,111,118,101,100,115 ,117,98,106,101,99,116,99,111,110,116,114,111,108,97,114,99,104,105,118,101,99, 117,114,114,101,110,116,114,101,97,100,105,110,103,108,105,98,114,97,114,121,108 ,105,109,105,116,101,100,109,97,110,97,103,101,114,102,117,114,116,104,101,114, 115,117,109,109,97,114,121,109,97,99,104,105,110,101,109,105,110,117,116,101,115 ,112,114,105,118,97,116,101,99,111,110,116,101,120,116,112,114,111,103,114,97, 109,115,111,99,105,101,116,121,110,117,109,98,101,114,115,119,114,105,116,116, 101,110,101,110,97,98,108,101,100,116,114,105,103,103,101,114,115,111,117,114,99 ,101,115,108,111,97,100,105,110,103,101,108,101,109,101,110,116,112,97,114,116, 110,101,114,102,105,110,97,108,108,121,112,101,114,102,101,99,116,109,101,97,110 ,105,110,103,115,121,115,116,101,109,115,107,101,101,112,105,110,103,99,117,108, 116,117,114,101,38,113,117,111,116,59,44,106,111,117,114,110,97,108,112,114,111, 106,101,99,116,115,117,114,102,97,99,101,115,38,113,117,111,116,59,101,120,112, 105,114,101,115,114,101,118,105,101,119,115,98,97,108,97,110,99,101,69,110,103, 108,105,115,104,67,111,110,116,101,110,116,116,104,114,111,117,103,104,80,108, 101,97,115,101,32,111,112,105,110,105,111,110,99,111,110,116,97,99,116,97,118, 101,114,97,103,101,112,114,105,109,97,114,121,118,105,108,108,97,103,101,83,112, 97,110,105,115,104,103,97,108,108,101,114,121,100,101,99,108,105,110,101,109,101 ,101,116,105,110,103,109,105,115,115,105,111,110,112,111,112,117,108,97,114,113, 117,97,108,105,116,121,109,101,97,115,117,114,101,103,101,110,101,114,97,108,115 ,112,101,99,105,101,115,115,101,115,115,105,111,110,115,101,99,116,105,111,110, 119,114,105,116,101,114,115,99,111,117,110,116,101,114,105,110,105,116,105,97, 108,114,101,112,111,114,116,115,102,105,103,117,114,101,115,109,101,109,98,101, 114,115,104,111,108,100,105,110,103,100,105,115,112,117,116,101,101,97,114,108, 105,101,114,101,120,112,114,101,115,115,100,105,103,105,116,97,108,112,105,99, 116,117,114,101,65,110,111,116,104,101,114,109,97,114,114,105,101,100,116,114,97 ,102,102,105,99,108,101,97,100,105,110,103,99,104,97,110,103,101,100,99,101,110, 116,114,97,108,118,105,99,116,111,114,121,105,109,97,103,101,115,47,114,101,97, 115,111,110,115,115,116,117,100,105,101,115,102,101,97,116,117,114,101,108,105, 115,116,105,110,103,109,117,115,116,32,98,101,115,99,104,111,111,108,115,86,101, 114,115,105,111,110,117,115,117,97,108,108,121,101,112,105,115,111,100,101,112, 108,97,121,105,110,103,103,114,111,119,105,110,103,111,98,118,105,111,117,115, 111,118,101,114,108,97,121,112,114,101,115,101,110,116,97,99,116,105,111,110,115 ,60,47,117,108,62,13,10,119,114,97,112,112,101,114,97,108,114,101,97,100,121,99, 101,114,116,97,105,110,114,101,97,108,105,116,121,115,116,111,114,97,103,101,97, 110,111,116,104,101,114,100,101,115,107,116,111,112,111,102,102,101,114,101,100, 112,97,116,116,101,114,110,117,110,117,115,117,97,108,68,105,103,105,116,97,108, 99,97,112,105,116,97,108,87,101,98,115,105,116,101,102,97,105,108,117,114,101,99 ,111,110,110,101,99,116,114,101,100,117,99,101,100,65,110,100,114,111,105,100, 100,101,99,97,100,101,115,114,101,103,117,108,97,114,32,38,97,109,112,59,32,97, 110,105,109,97,108,115,114,101,108,101,97,115,101,65,117,116,111,109,97,116,103, 101,116,116,105,110,103,109,101,116,104,111,100,115,110,111,116,104,105,110,103, 80,111,112,117,108,97,114,99,97,112,116,105,111,110,108,101,116,116,101,114,115, 99,97,112,116,117,114,101,115,99,105,101,110,99,101,108,105,99,101,110,115,101, 99,104,97,110,103,101,115,69,110,103,108,97,110,100,61,49,38,97,109,112,59,72, 105,115,116,111,114,121,32,61,32,110,101,119,32,67,101,110,116,114,97,108,117, 112,100,97,116,101,100,83,112,101,99,105,97,108,78,101,116,119,111,114,107,114, 101,113,117,105,114,101,99,111,109,109,101,110,116,119,97,114,110,105,110,103,67 ,111,108,108,101,103,101,116,111,111,108,98,97,114,114,101,109,97,105,110,115,98 ,101,99,97,117,115,101,101,108,101,99,116,101,100,68,101,117,116,115,99,104,102, 105,110,97,110,99,101,119,111,114,107,101,114,115,113,117,105,99,107,108,121,98, 101,116,119,101,101,110,101,120,97,99,116,108,121,115,101,116,116,105,110,103, 100,105,115,101,97,115,101,83,111,99,105,101,116,121,119,101,97,112,111,110,115, 101,120,104,105,98,105,116,38,108,116,59,33,45,45,67,111,110,116,114,111,108,99, 108,97,115,115,101,115,99,111,118,101,114,101,100,111,117,116,108,105,110,101,97 ,116,116,97,99,107,115,100,101,118,105,99,101,115,40,119,105,110,100,111,119,112 ,117,114,112,111,115,101,116,105,116,108,101,61,34,77,111,98,105,108,101,32,107, 105,108,108,105,110,103,115,104,111,119,105,110,103,73,116,97,108,105,97,110,100 ,114,111,112,112,101,100,104,101,97,118,105,108,121,101,102,102,101,99,116,115, 45,49,39,93,41,59,10,99,111,110,102,105,114,109,67,117,114,114,101,110,116,97, 100,118,97,110,99,101,115,104,97,114,105,110,103,111,112,101,110,105,110,103,100 ,114,97,119,105,110,103,98,105,108,108,105,111,110,111,114,100,101,114,101,100, 71,101,114,109,97,110,121,114,101,108,97,116,101,100,60,47,102,111,114,109,62, 105,110,99,108,117,100,101,119,104,101,116,104,101,114,100,101,102,105,110,101, 100,83,99,105,101,110,99,101,99,97,116,97,108,111,103,65,114,116,105,99,108,101, 98,117,116,116,111,110,115,108,97,114,103,101,115,116,117,110,105,102,111,114, 109,106,111,117,114,110,101,121,115,105,100,101,98,97,114,67,104,105,99,97,103, 111,104,111,108,105,100,97,121,71,101,110,101,114,97,108,112,97,115,115,97,103, 101,44,38,113,117,111,116,59,97,110,105,109,97,116,101,102,101,101,108,105,110, 103,97,114,114,105,118,101,100,112,97,115,115,105,110,103,110,97,116,117,114,97, 108,114,111,117,103,104,108,121,46,10,10,84,104,101,32,98,117,116,32,110,111,116 ,100,101,110,115,105,116,121,66,114,105,116,97,105,110,67,104,105,110,101,115, 101,108,97,99,107,32,111,102,116,114,105,98,117,116,101,73,114,101,108,97,110, 100,34,32,100,97,116,97,45,102,97,99,116,111,114,115,114,101,99,101,105,118,101, 116,104,97,116,32,105,115,76,105,98,114,97,114,121,104,117,115,98,97,110,100,105 ,110,32,102,97,99,116,97,102,102,97,105,114,115,67,104,97,114,108,101,115,114,97 ,100,105,99,97,108,98,114,111,117,103,104,116,102,105,110,100,105,110,103,108,97 ,110,100,105,110,103,58,108,97,110,103,61,34,114,101,116,117,114,110,32,108,101, 97,100,101,114,115,112,108,97,110,110,101,100,112,114,101,109,105,117,109,112,97 ,99,107,97,103,101,65,109,101,114,105,99,97,69,100,105,116,105,111,110,93,38,113 ,117,111,116,59,77,101,115,115,97,103,101,110,101,101,100,32,116,111,118,97,108, 117,101,61,34,99,111,109,112,108,101,120,108,111,111,107,105,110,103,115,116,97, 116,105,111,110,98,101,108,105,101,118,101,115,109,97,108,108,101,114,45,109,111 ,98,105,108,101,114,101,99,111,114,100,115,119,97,110,116,32,116,111,107,105,110 ,100,32,111,102,70,105,114,101,102,111,120,121,111,117,32,97,114,101,115,105,109 ,105,108,97,114,115,116,117,100,105,101,100,109,97,120,105,109,117,109,104,101, 97,100,105,110,103,114,97,112,105,100,108,121,99,108,105,109,97,116,101,107,105, 110,103,100,111,109,101,109,101,114,103,101,100,97,109,111,117,110,116,115,102, 111,117,110,100,101,100,112,105,111,110,101,101,114,102,111,114,109,117,108,97, 100,121,110,97,115,116,121,104,111,119,32,116,111,32,83,117,112,112,111,114,116, 114,101,118,101,110,117,101,101,99,111,110,111,109,121,82,101,115,117,108,116, 115,98,114,111,116,104,101,114,115,111,108,100,105,101,114,108,97,114,103,101, 108,121,99,97,108,108,105,110,103,46,38,113,117,111,116,59,65,99,99,111,117,110, 116,69,100,119,97,114,100,32,115,101,103,109,101,110,116,82,111,98,101,114,116, 32,101,102,102,111,114,116,115,80,97,99,105,102,105,99,108,101,97,114,110,101, 100,117,112,32,119,105,116,104,104,101,105,103,104,116,58,119,101,32,104,97,118, 101,65,110,103,101,108,101,115,110,97,116,105,111,110,115,95,115,101,97,114,99, 104,97,112,112,108,105,101,100,97,99,113,117,105,114,101,109,97,115,115,105,118, 101,103,114,97,110,116,101,100,58,32,102,97,108,115,101,116,114,101,97,116,101, 100,98,105,103,103,101,115,116,98,101,110,101,102,105,116,100,114,105,118,105, 110,103,83,116,117,100,105,101,115,109,105,110,105,109,117,109,112,101,114,104, 97,112,115,109,111,114,110,105,110,103,115,101,108,108,105,110,103,105,115,32, 117,115,101,100,114,101,118,101,114,115,101,118,97,114,105,97,110,116,32,114,111 ,108,101,61,34,109,105,115,115,105,110,103,97,99,104,105,101,118,101,112,114,111 ,109,111,116,101,115,116,117,100,101,110,116,115,111,109,101,111,110,101,101,120 ,116,114,101,109,101,114,101,115,116,111,114,101,98,111,116,116,111,109,58,101, 118,111,108,118,101,100,97,108,108,32,116,104,101,115,105,116,101,109,97,112,101 ,110,103,108,105,115,104,119,97,121,32,116,111,32,32,65,117,103,117,115,116,115, 121,109,98,111,108,115,67,111,109,112,97,110,121,109,97,116,116,101,114,115,109, 117,115,105,99,97,108,97,103,97,105,110,115,116,115,101,114,118,105,110,103,125, 41,40,41,59,13,10,112,97,121,109,101,110,116,116,114,111,117,98,108,101,99,111, 110,99,101,112,116,99,111,109,112,97,114,101,112,97,114,101,110,116,115,112,108, 97,121,101,114,115,114,101,103,105,111,110,115,109,111,110,105,116,111,114,32,39 ,39,84,104,101,32,119,105,110,110,105,110,103,101,120,112,108,111,114,101,97,100 ,97,112,116,101,100,71,97,108,108,101,114,121,112,114,111,100,117,99,101,97,98, 105,108,105,116,121,101,110,104,97,110,99,101,99,97,114,101,101,114,115,41,46,32 ,84,104,101,32,99,111,108,108,101,99,116,83,101,97,114,99,104,32,97,110,99,105, 101,110,116,101,120,105,115,116,101,100,102,111,111,116,101,114,32,104,97,110, 100,108,101,114,112,114,105,110,116,101,100,99,111,110,115,111,108,101,69,97,115 ,116,101,114,110,101,120,112,111,114,116,115,119,105,110,100,111,119,115,67,104, 97,110,110,101,108,105,108,108,101,103,97,108,110,101,117,116,114,97,108,115,117 ,103,103,101,115,116,95,104,101,97,100,101,114,115,105,103,110,105,110,103,46, 104,116,109,108,34,62,115,101,116,116,108,101,100,119,101,115,116,101,114,110,99 ,97,117,115,105,110,103,45,119,101,98,107,105,116,99,108,97,105,109,101,100,74, 117,115,116,105,99,101,99,104,97,112,116,101,114,118,105,99,116,105,109,115,84, 104,111,109,97,115,32,109,111,122,105,108,108,97,112,114,111,109,105,115,101,112 ,97,114,116,105,101,115,101,100,105,116,105,111,110,111,117,116,115,105,100,101, 58,102,97,108,115,101,44,104,117,110,100,114,101,100,79,108,121,109,112,105,99, 95,98,117,116,116,111,110,97,117,116,104,111,114,115,114,101,97,99,104,101,100, 99,104,114,111,110,105,99,100,101,109,97,110,100,115,115,101,99,111,110,100,115, 112,114,111,116,101,99,116,97,100,111,112,116,101,100,112,114,101,112,97,114,101 ,110,101,105,116,104,101,114,103,114,101,97,116,108,121,103,114,101,97,116,101, 114,111,118,101,114,97,108,108,105,109,112,114,111,118,101,99,111,109,109,97,110 ,100,115,112,101,99,105,97,108,115,101,97,114,99,104,46,119,111,114,115,104,105, 112,102,117,110,100,105,110,103,116,104,111,117,103,104,116,104,105,103,104,101, 115,116,105,110,115,116,101,97,100,117,116,105,108,105,116,121,113,117,97,114, 116,101,114,67,117,108,116,117,114,101,116,101,115,116,105,110,103,99,108,101,97 ,114,108,121,101,120,112,111,115,101,100,66,114,111,119,115,101,114,108,105,98, 101,114,97,108,125,32,99,97,116,99,104,80,114,111,106,101,99,116,101,120,97,109, 112,108,101,104,105,100,101,40,41,59,70,108,111,114,105,100,97,97,110,115,119, 101,114,115,97,108,108,111,119,101,100,69,109,112,101,114,111,114,100,101,102, 101,110,115,101,115,101,114,105,111,117,115,102,114,101,101,100,111,109,83,101, 118,101,114,97,108,45,98,117,116,116,111,110,70,117,114,116,104,101,114,111,117, 116,32,111,102,32,33,61,32,110,117,108,108,116,114,97,105,110,101,100,68,101,110 ,109,97,114,107,118,111,105,100,40,48,41,47,97,108,108,46,106,115,112,114,101, 118,101,110,116,82,101,113,117,101,115,116,83,116,101,112,104,101,110,10,10,87, 104,101,110,32,111,98,115,101,114,118,101,60,47,104,50,62,13,10,77,111,100,101, 114,110,32,112,114,111,118,105,100,101,34,32,97,108,116,61,34,98,111,114,100,101 ,114,115,46,10,10,70,111,114,32,10,10,77,97,110,121,32,97,114,116,105,115,116, 115,112,111,119,101,114,101,100,112,101,114,102,111,114,109,102,105,99,116,105, 111,110,116,121,112,101,32,111,102,109,101,100,105,99,97,108,116,105,99,107,101, 116,115,111,112,112,111,115,101,100,67,111,117,110,99,105,108,119,105,116,110, 101,115,115,106,117,115,116,105,99,101,71,101,111,114,103,101,32,66,101,108,103, 105,117,109,46,46,46,60,47,97,62,116,119,105,116,116,101,114,110,111,116,97,98, 108,121,119,97,105,116,105,110,103,119,97,114,102,97,114,101,32,79,116,104,101, 114,32,114,97,110,107,105,110,103,112,104,114,97,115,101,115,109,101,110,116,105 ,111,110,115,117,114,118,105,118,101,115,99,104,111,108,97,114,60,47,112,62,13, 10,32,67,111,117,110,116,114,121,105,103,110,111,114,101,100,108,111,115,115,32, 111,102,106,117,115,116,32,97,115,71,101,111,114,103,105,97,115,116,114,97,110, 103,101,60,104,101,97,100,62,60,115,116,111,112,112,101,100,49,39,93,41,59,13,10 ,105,115,108,97,110,100,115,110,111,116,97,98,108,101,98,111,114,100,101,114,58, 108,105,115,116,32,111,102,99,97,114,114,105,101,100,49,48,48,44,48,48,48,60,47, 104,51,62,10,32,115,101,118,101,114,97,108,98,101,99,111,109,101,115,115,101,108 ,101,99,116,32,119,101,100,100,105,110,103,48,48,46,104,116,109,108,109,111,110, 97,114,99,104,111,102,102,32,116,104,101,116,101,97,99,104,101,114,104,105,103, 104,108,121,32,98,105,111,108,111,103,121,108,105,102,101,32,111,102,111,114,32, 101,118,101,110,114,105,115,101,32,111,102,38,114,97,113,117,111,59,112,108,117, 115,111,110,101,104,117,110,116,105,110,103,40,116,104,111,117,103,104,68,111, 117,103,108,97,115,106,111,105,110,105,110,103,99,105,114,99,108,101,115,70,111, 114,32,116,104,101,65,110,99,105,101,110,116,86,105,101,116,110,97,109,118,101, 104,105,99,108,101,115,117,99,104,32,97,115,99,114,121,115,116,97,108,118,97,108 ,117,101,32,61,87,105,110,100,111,119,115,101,110,106,111,121,101,100,97,32,115, 109,97,108,108,97,115,115,117,109,101,100,60,97,32,105,100,61,34,102,111,114,101 ,105,103,110,32,65,108,108,32,114,105,104,111,119,32,116,104,101,68,105,115,112, 108,97,121,114,101,116,105,114,101,100,104,111,119,101,118,101,114,104,105,100, 100,101,110,59,98,97,116,116,108,101,115,115,101,101,107,105,110,103,99,97,98, 105,110,101,116,119,97,115,32,110,111,116,108,111,111,107,32,97,116,99,111,110, 100,117,99,116,103,101,116,32,116,104,101,74,97,110,117,97,114,121,104,97,112, 112,101,110,115,116,117,114,110,105,110,103,97,58,104,111,118,101,114,79,110,108 ,105,110,101,32,70,114,101,110,99,104,32,108,97,99,107,105,110,103,116,121,112, 105,99,97,108,101,120,116,114,97,99,116,101,110,101,109,105,101,115,101,118,101, 110,32,105,102,103,101,110,101,114,97,116,100,101,99,105,100,101,100,97,114,101, 32,110,111,116,47,115,101,97,114,99,104,98,101,108,105,101,102,115,45,105,109,97 ,103,101,58,108,111,99,97,116,101,100,115,116,97,116,105,99,46,108,111,103,105, 110,34,62,99,111,110,118,101,114,116,118,105,111,108,101,110,116,101,110,116,101 ,114,101,100,102,105,114,115,116,34,62,99,105,114,99,117,105,116,70,105,110,108, 97,110,100,99,104,101,109,105,115,116,115,104,101,32,119,97,115,49,48,112,120,59 ,34,62,97,115,32,115,117,99,104,100,105,118,105,100,101,100,60,47,115,112,97,110 ,62,119,105,108,108,32,98,101,108,105,110,101,32,111,102,97,32,103,114,101,97, 116,109,121,115,116,101,114,121,47,105,110,100,101,120,46,102,97,108,108,105,110 ,103,100,117,101,32,116,111,32,114,97,105,108,119,97,121,99,111,108,108,101,103, 101,109,111,110,115,116,101,114,100,101,115,99,101,110,116,105,116,32,119,105, 116,104,110,117,99,108,101,97,114,74,101,119,105,115,104,32,112,114,111,116,101, 115,116,66,114,105,116,105,115,104,102,108,111,119,101,114,115,112,114,101,100, 105,99,116,114,101,102,111,114,109,115,98,117,116,116,111,110,32,119,104,111,32, 119,97,115,108,101,99,116,117,114,101,105,110,115,116,97,110,116,115,117,105,99, 105,100,101,103,101,110,101,114,105,99,112,101,114,105,111,100,115,109,97,114, 107,101,116,115,83,111,99,105,97,108,32,102,105,115,104,105,110,103,99,111,109, 98,105,110,101,103,114,97,112,104,105,99,119,105,110,110,101,114,115,60,98,114, 32,47,62,60,98,121,32,116,104,101,32,78,97,116,117,114,97,108,80,114,105,118,97, 99,121,99,111,111,107,105,101,115,111,117,116,99,111,109,101,114,101,115,111,108 ,118,101,83,119,101,100,105,115,104,98,114,105,101,102,108,121,80,101,114,115, 105,97,110,115,111,32,109,117,99,104,67,101,110,116,117,114,121,100,101,112,105, 99,116,115,99,111,108,117,109,110,115,104,111,117,115,105,110,103,115,99,114,105 ,112,116,115,110,101,120,116,32,116,111,98,101,97,114,105,110,103,109,97,112,112 ,105,110,103,114,101,118,105,115,101,100,106,81,117,101,114,121,40,45,119,105, 100,116,104,58,116,105,116,108,101,34,62,116,111,111,108,116,105,112,83,101,99, 116,105,111,110,100,101,115,105,103,110,115,84,117,114,107,105,115,104,121,111, 117,110,103,101,114,46,109,97,116,99,104,40,125,41,40,41,59,10,10,98,117,114,110 ,105,110,103,111,112,101,114,97,116,101,100,101,103,114,101,101,115,115,111,117, 114,99,101,61,82,105,99,104,97,114,100,99,108,111,115,101,108,121,112,108,97,115 ,116,105,99,101,110,116,114,105,101,115,60,47,116,114,62,13,10,99,111,108,111, 114,58,35,117,108,32,105,100,61,34,112,111,115,115,101,115,115,114,111,108,108, 105,110,103,112,104,121,115,105,99,115,102,97,105,108,105,110,103,101,120,101,99 ,117,116,101,99,111,110,116,101,115,116,108,105,110,107,32,116,111,68,101,102,97 ,117,108,116,60,98,114,32,47,62,10,58,32,116,114,117,101,44,99,104,97,114,116, 101,114,116,111,117,114,105,115,109,99,108,97,115,115,105,99,112,114,111,99,101, 101,100,101,120,112,108,97,105,110,60,47,104,49,62,13,10,111,110,108,105,110,101 ,46,63,120,109,108,32,118,101,104,101,108,112,105,110,103,100,105,97,109,111,110 ,100,117,115,101,32,116,104,101,97,105,114,108,105,110,101,101,110,100,32,45,45, 62,41,46,97,116,116,114,40,114,101,97,100,101,114,115,104,111,115,116,105,110, 103,35,102,102,102,102,102,102,114,101,97,108,105,122,101,86,105,110,99,101,110, 116,115,105,103,110,97,108,115,32,115,114,99,61,34,47,80,114,111,100,117,99,116, 100,101,115,112,105,116,101,100,105,118,101,114,115,101,116,101,108,108,105,110, 103,80,117,98,108,105,99,32,104,101,108,100,32,105,110,74,111,115,101,112,104,32 ,116,104,101,97,116,114,101,97,102,102,101,99,116,115,60,115,116,121,108,101,62, 97,32,108,97,114,103,101,100,111,101,115,110,39,116,108,97,116,101,114,44,32,69, 108,101,109,101,110,116,102,97,118,105,99,111,110,99,114,101,97,116,111,114,72, 117,110,103,97,114,121,65,105,114,112,111,114,116,115,101,101,32,116,104,101,115 ,111,32,116,104,97,116,77,105,99,104,97,101,108,83,121,115,116,101,109,115,80, 114,111,103,114,97,109,115,44,32,97,110,100,32,32,119,105,100,116,104,61,101,38, 113,117,111,116,59,116,114,97,100,105,110,103,108,101,102,116,34,62,10,112,101, 114,115,111,110,115,71,111,108,100,101,110,32,65,102,102,97,105,114,115,103,114, 97,109,109,97,114,102,111,114,109,105,110,103,100,101,115,116,114,111,121,105, 100,101,97,32,111,102,99,97,115,101,32,111,102,111,108,100,101,115,116,32,116, 104,105,115,32,105,115,46,115,114,99,32,61,32,99,97,114,116,111,111,110,114,101, 103,105,115,116,114,67,111,109,109,111,110,115,77,117,115,108,105,109,115,87,104 ,97,116,32,105,115,105,110,32,109,97,110,121,109,97,114,107,105,110,103,114,101, 118,101,97,108,115,73,110,100,101,101,100,44,101,113,117,97,108,108,121,47,115, 104,111,119,95,97,111,117,116,100,111,111,114,101,115,99,97,112,101,40,65,117, 115,116,114,105,97,103,101,110,101,116,105,99,115,121,115,116,101,109,44,73,110, 32,116,104,101,32,115,105,116,116,105,110,103,72,101,32,97,108,115,111,73,115, 108,97,110,100,115,65,99,97,100,101,109,121,10,9,9,60,33,45,45,68,97,110,105,101 ,108,32,98,105,110,100,105,110,103,98,108,111,99,107,34,62,105,109,112,111,115, 101,100,117,116,105,108,105,122,101,65,98,114,97,104,97,109,40,101,120,99,101, 112,116,123,119,105,100,116,104,58,112,117,116,116,105,110,103,41,46,104,116,109 ,108,40,124,124,32,91,93,59,10,68,65,84,65,91,32,42,107,105,116,99,104,101,110, 109,111,117,110,116,101,100,97,99,116,117,97,108,32,100,105,97,108,101,99,116, 109,97,105,110,108,121,32,95,98,108,97,110,107,39,105,110,115,116,97,108,108,101 ,120,112,101,114,116,115,105,102,40,116,121,112,101,73,116,32,97,108,115,111,38, 99,111,112,121,59,32,34,62,84,101,114,109,115,98,111,114,110,32,105,110,79,112, 116,105,111,110,115,101,97,115,116,101,114,110,116,97,108,107,105,110,103,99,111 ,110,99,101,114,110,103,97,105,110,101,100,32,111,110,103,111,105,110,103,106, 117,115,116,105,102,121,99,114,105,116,105,99,115,102,97,99,116,111,114,121,105, 116,115,32,111,119,110,97,115,115,97,117,108,116,105,110,118,105,116,101,100,108 ,97,115,116,105,110,103,104,105,115,32,111,119,110,104,114,101,102,61,34,47,34, 32,114,101,108,61,34,100,101,118,101,108,111,112,99,111,110,99,101,114,116,100, 105,97,103,114,97,109,100,111,108,108,97,114,115,99,108,117,115,116,101,114,112, 104,112,63,105,100,61,97,108,99,111,104,111,108,41,59,125,41,40,41,59,117,115, 105,110,103,32,97,62,60,115,112,97,110,62,118,101,115,115,101,108,115,114,101, 118,105,118,97,108,65,100,100,114,101,115,115,97,109,97,116,101,117,114,97,110, 100,114,111,105,100,97,108,108,101,103,101,100,105,108,108,110,101,115,115,119, 97,108,107,105,110,103,99,101,110,116,101,114,115,113,117,97,108,105,102,121,109 ,97,116,99,104,101,115,117,110,105,102,105,101,100,101,120,116,105,110,99,116,68 ,101,102,101,110,115,101,100,105,101,100,32,105,110,10,9,60,33,45,45,32,99,117, 115,116,111,109,115,108,105,110,107,105,110,103,76,105,116,116,108,101,32,66,111 ,111,107,32,111,102,101,118,101,110,105,110,103,109,105,110,46,106,115,63,97,114 ,101,32,116,104,101,107,111,110,116,97,107,116,116,111,100,97,121,39,115,46,104, 116,109,108,34,32,116,97,114,103,101,116,61,119,101,97,114,105,110,103,65,108, 108,32,82,105,103,59,10,125,41,40,41,59,114,97,105,115,105,110,103,32,65,108,115 ,111,44,32,99,114,117,99,105,97,108,97,98,111,117,116,34,62,100,101,99,108,97, 114,101,45,45,62,10,60,115,99,102,105,114,101,102,111,120,97,115,32,109,117,99, 104,97,112,112,108,105,101,115,105,110,100,101,120,44,32,115,44,32,98,117,116,32 ,116,121,112,101,32,61,32,10,13,10,60,33,45,45,116,111,119,97,114,100,115,82,101 ,99,111,114,100,115,80,114,105,118,97,116,101,70,111,114,101,105,103,110,80,114, 101,109,105,101,114,99,104,111,105,99,101,115,86,105,114,116,117,97,108,114,101, 116,117,114,110,115,67,111,109,109,101,110,116,80,111,119,101,114,101,100,105, 110,108,105,110,101,59,112,111,118,101,114,116,121,99,104,97,109,98,101,114,76, 105,118,105,110,103,32,118,111,108,117,109,101,115,65,110,116,104,111,110,121, 108,111,103,105,110,34,32,82,101,108,97,116,101,100,69,99,111,110,111,109,121, 114,101,97,99,104,101,115,99,117,116,116,105,110,103,103,114,97,118,105,116,121, 108,105,102,101,32,105,110,67,104,97,112,116,101,114,45,115,104,97,100,111,119, 78,111,116,97,98,108,101,60,47,116,100,62,13,10,32,114,101,116,117,114,110,115, 116,97,100,105,117,109,119,105,100,103,101,116,115,118,97,114,121,105,110,103, 116,114,97,118,101,108,115,104,101,108,100,32,98,121,119,104,111,32,97,114,101, 119,111,114,107,32,105,110,102,97,99,117,108,116,121,97,110,103,117,108,97,114, 119,104,111,32,104,97,100,97,105,114,112,111,114,116,116,111,119,110,32,111,102, 10,10,83,111,109,101,32,39,99,108,105,99,107,39,99,104,97,114,103,101,115,107, 101,121,119,111,114,100,105,116,32,119,105,108,108,99,105,116,121,32,111,102,40, 116,104,105,115,41,59,65,110,100,114,101,119,32,117,110,105,113,117,101,32,99, 104,101,99,107,101,100,111,114,32,109,111,114,101,51,48,48,112,120,59,32,114,101 ,116,117,114,110,59,114,115,105,111,110,61,34,112,108,117,103,105,110,115,119, 105,116,104,105,110,32,104,101,114,115,101,108,102,83,116,97,116,105,111,110,70, 101,100,101,114,97,108,118,101,110,116,117,114,101,112,117,98,108,105,115,104, 115,101,110,116,32,116,111,116,101,110,115,105,111,110,97,99,116,114,101,115,115 ,99,111,109,101,32,116,111,102,105,110,103,101,114,115,68,117,107,101,32,111,102 ,112,101,111,112,108,101,44,101,120,112,108,111,105,116,119,104,97,116,32,105, 115,104,97,114,109,111,110,121,97,32,109,97,106,111,114,34,58,34,104,116,116,112 ,105,110,32,104,105,115,32,109,101,110,117,34,62,10,109,111,110,116,104,108,121, 111,102,102,105,99,101,114,99,111,117,110,99,105,108,103,97,105,110,105,110,103, 101,118,101,110,32,105,110,83,117,109,109,97,114,121,100,97,116,101,32,111,102, 108,111,121,97,108,116,121,102,105,116,110,101,115,115,97,110,100,32,119,97,115, 101,109,112,101,114,111,114,115,117,112,114,101,109,101,83,101,99,111,110,100,32 ,104,101,97,114,105,110,103,82,117,115,115,105,97,110,108,111,110,103,101,115, 116,65,108,98,101,114,116,97,108,97,116,101,114,97,108,115,101,116,32,111,102,32 ,115,109,97,108,108,34,62,46,97,112,112,101,110,100,100,111,32,119,105,116,104, 102,101,100,101,114,97,108,98,97,110,107,32,111,102,98,101,110,101,97,116,104,68 ,101,115,112,105,116,101,67,97,112,105,116,97,108,103,114,111,117,110,100,115,41 ,44,32,97,110,100,32,112,101,114,99,101,110,116,105,116,32,102,114,111,109,99, 108,111,115,105,110,103,99,111,110,116,97,105,110,73,110,115,116,101,97,100,102, 105,102,116,101,101,110,97,115,32,119,101,108,108,46,121,97,104,111,111,46,114, 101,115,112,111,110,100,102,105,103,104,116,101,114,111,98,115,99,117,114,101, 114,101,102,108,101,99,116,111,114,103,97,110,105,99,61,32,77,97,116,104,46,101, 100,105,116,105,110,103,111,110,108,105,110,101,32,112,97,100,100,105,110,103,97 ,32,119,104,111,108,101,111,110,101,114,114,111,114,121,101,97,114,32,111,102, 101,110,100,32,111,102,32,98,97,114,114,105,101,114,119,104,101,110,32,105,116, 104,101,97,100,101,114,32,104,111,109,101,32,111,102,114,101,115,117,109,101,100 ,114,101,110,97,109,101,100,115,116,114,111,110,103,62,104,101,97,116,105,110, 103,114,101,116,97,105,110,115,99,108,111,117,100,102,114,119,97,121,32,111,102, 32,77,97,114,99,104,32,49,107,110,111,119,105,110,103,105,110,32,112,97,114,116, 66,101,116,119,101,101,110,108,101,115,115,111,110,115,99,108,111,115,101,115, 116,118,105,114,116,117,97,108,108,105,110,107,115,34,62,99,114,111,115,115,101, 100,69,78,68,32,45,45,62,102,97,109,111,117,115,32,97,119,97,114,100,101,100,76, 105,99,101,110,115,101,72,101,97,108,116,104,32,102,97,105,114,108,121,32,119, 101,97,108,116,104,121,109,105,110,105,109,97,108,65,102,114,105,99,97,110,99, 111,109,112,101,116,101,108,97,98,101,108,34,62,115,105,110,103,105,110,103,102, 97,114,109,101,114,115,66,114,97,115,105,108,41,100,105,115,99,117,115,115,114, 101,112,108,97,99,101,71,114,101,103,111,114,121,102,111,110,116,32,99,111,112, 117,114,115,117,101,100,97,112,112,101,97,114,115,109,97,107,101,32,117,112,114, 111,117,110,100,101,100,98,111,116,104,32,111,102,98,108,111,99,107,101,100,115, 97,119,32,116,104,101,111,102,102,105,99,101,115,99,111,108,111,117,114,115,105, 102,40,100,111,99,117,119,104,101,110,32,104,101,101,110,102,111,114,99,101,112, 117,115,104,40,102,117,65,117,103,117,115,116,32,85,84,70,45,56,34,62,70,97,110, 116,97,115,121,105,110,32,109,111,115,116,105,110,106,117,114,101,100,85,115,117 ,97,108,108,121,102,97,114,109,105,110,103,99,108,111,115,117,114,101,111,98,106 ,101,99,116,32,100,101,102,101,110,99,101,117,115,101,32,111,102,32,77,101,100, 105,99,97,108,60,98,111,100,121,62,10,101,118,105,100,101,110,116,98,101,32,117, 115,101,100,107,101,121,67,111,100,101,115,105,120,116,101,101,110,73,115,108,97 ,109,105,99,35,48,48,48,48,48,48,101,110,116,105,114,101,32,119,105,100,101,108, 121,32,97,99,116,105,118,101,32,40,116,121,112,101,111,102,111,110,101,32,99,97, 110,99,111,108,111,114,32,61,115,112,101,97,107,101,114,101,120,116,101,110,100, 115,80,104,121,115,105,99,115,116,101,114,114,97,105,110,60,116,98,111,100,121, 62,102,117,110,101,114,97,108,118,105,101,119,105,110,103,109,105,100,100,108, 101,32,99,114,105,99,107,101,116,112,114,111,112,104,101,116,115,104,105,102,116 ,101,100,100,111,99,116,111,114,115,82,117,115,115,101,108,108,32,116,97,114,103 ,101,116,99,111,109,112,97,99,116,97,108,103,101,98,114,97,115,111,99,105,97,108 ,45,98,117,108,107,32,111,102,109,97,110,32,97,110,100,60,47,116,100,62,10,32, 104,101,32,108,101,102,116,41,46,118,97,108,40,41,102,97,108,115,101,41,59,108, 111,103,105,99,97,108,98,97,110,107,105,110,103,104,111,109,101,32,116,111,110, 97,109,105,110,103,32,65,114,105,122,111,110,97,99,114,101,100,105,116,115,41,59 ,10,125,41,59,10,102,111,117,110,100,101,114,105,110,32,116,117,114,110,67,111, 108,108,105,110,115,98,101,102,111,114,101,32,66,117,116,32,116,104,101,99,104, 97,114,103,101,100,84,105,116,108,101,34,62,67,97,112,116,97,105,110,115,112,101 ,108,108,101,100,103,111,100,100,101,115,115,84,97,103,32,45,45,62,65,100,100, 105,110,103,58,98,117,116,32,119,97,115,82,101,99,101,110,116,32,112,97,116,105, 101,110,116,98,97,99,107,32,105,110,61,102,97,108,115,101,38,76,105,110,99,111, 108,110,119,101,32,107,110,111,119,67,111,117,110,116,101,114,74,117,100,97,105, 115,109,115,99,114,105,112,116,32,97,108,116,101,114,101,100,39,93,41,59,10,32, 32,104,97,115,32,116,104,101,117,110,99,108,101,97,114,69,118,101,110,116,39,44, 98,111,116,104,32,105,110,110,111,116,32,97,108,108,10,10,60,33,45,45,32,112,108 ,97,99,105,110,103,104,97,114,100,32,116,111,32,99,101,110,116,101,114,115,111, 114,116,32,111,102,99,108,105,101,110,116,115,115,116,114,101,101,116,115,66,101 ,114,110,97,114,100,97,115,115,101,114,116,115,116,101,110,100,32,116,111,102,97 ,110,116,97,115,121,100,111,119,110,32,105,110,104,97,114,98,111,117,114,70,114, 101,101,100,111,109,106,101,119,101,108,114,121,47,97,98,111,117,116,46,46,115, 101,97,114,99,104,108,101,103,101,110,100,115,105,115,32,109,97,100,101,109,111, 100,101,114,110,32,111,110,108,121,32,111,110,111,110,108,121,32,116,111,105,109 ,97,103,101,34,32,108,105,110,101,97,114,32,112,97,105,110,116,101,114,97,110, 100,32,110,111,116,114,97,114,101,108,121,32,97,99,114,111,110,121,109,100,101, 108,105,118,101,114,115,104,111,114,116,101,114,48,48,38,97,109,112,59,97,115,32 ,109,97,110,121,119,105,100,116,104,61,34,47,42,32,60,33,91,67,116,105,116,108, 101,32,61,111,102,32,116,104,101,32,108,111,119,101,115,116,32,112,105,99,107, 101,100,32,101,115,99,97,112,101,100,117,115,101,115,32,111,102,112,101,111,112, 108,101,115,32,80,117,98,108,105,99,77,97,116,116,104,101,119,116,97,99,116,105, 99,115,100,97,109,97,103,101,100,119,97,121,32,102,111,114,108,97,119,115,32,111 ,102,101,97,115,121,32,116,111,32,119,105,110,100,111,119,115,116,114,111,110, 103,32,32,115,105,109,112,108,101,125,99,97,116,99,104,40,115,101,118,101,110, 116,104,105,110,102,111,98,111,120,119,101,110,116,32,116,111,112,97,105,110,116 ,101,100,99,105,116,105,122,101,110,73,32,100,111,110,39,116,114,101,116,114,101 ,97,116,46,32,83,111,109,101,32,119,119,46,34,41,59,10,98,111,109,98,105,110,103 ,109,97,105,108,116,111,58,109,97,100,101,32,105,110,46,32,77,97,110,121,32,99, 97,114,114,105,101,115,124,124,123,125,59,119,105,119,111,114,107,32,111,102,115 ,121,110,111,110,121,109,100,101,102,101,97,116,115,102,97,118,111,114,101,100, 111,112,116,105,99,97,108,112,97,103,101,84,114,97,117,110,108,101,115,115,32, 115,101,110,100,105,110,103,108,101,102,116,34,62,60,99,111,109,83,99,111,114,65 ,108,108,32,116,104,101,106,81,117,101,114,121,46,116,111,117,114,105,115,116,67 ,108,97,115,115,105,99,102,97,108,115,101,34,32,87,105,108,104,101,108,109,115, 117,98,117,114,98,115,103,101,110,117,105,110,101,98,105,115,104,111,112,115,46, 115,112,108,105,116,40,103,108,111,98,97,108,32,102,111,108,108,111,119,115,98, 111,100,121,32,111,102,110,111,109,105,110,97,108,67,111,110,116,97,99,116,115, 101,99,117,108,97,114,108,101,102,116,32,116,111,99,104,105,101,102,108,121,45, 104,105,100,100,101,110,45,98,97,110,110,101,114,60,47,108,105,62,10,10,46,32,87 ,104,101,110,32,105,110,32,98,111,116,104,100,105,115,109,105,115,115,69,120,112 ,108,111,114,101,97,108,119,97,121,115,32,118,105,97,32,116,104,101,115,112,97, 195,177,111,108,119,101,108,102,97,114,101,114,117,108,105,110,103,32,97,114,114 ,97,110,103,101,99,97,112,116,97,105,110,104,105,115,32,115,111,110,114,117,108, 101,32,111,102,104,101,32,116,111,111,107,105,116,115,101,108,102,44,61,48,38,97 ,109,112,59,40,99,97,108,108,101,100,115,97,109,112,108,101,115,116,111,32,109, 97,107,101,99,111,109,47,112,97,103,77,97,114,116,105,110,32,75,101,110,110,101, 100,121,97,99,99,101,112,116,115,102,117,108,108,32,111,102,104,97,110,100,108, 101,100,66,101,115,105,100,101,115,47,47,45,45,62,60,47,97,98,108,101,32,116,111 ,116,97,114,103,101,116,115,101,115,115,101,110,99,101,104,105,109,32,116,111,32 ,105,116,115,32,98,121,32,99,111,109,109,111,110,46,109,105,110,101,114,97,108, 116,111,32,116,97,107,101,119,97,121,115,32,116,111,115,46,111,114,103,47,108,97 ,100,118,105,115,101,100,112,101,110,97,108,116,121,115,105,109,112,108,101,58, 105,102,32,116,104,101,121,76,101,116,116,101,114,115,97,32,115,104,111,114,116, 72,101,114,98,101,114,116,115,116,114,105,107,101,115,32,103,114,111,117,112,115 ,46,108,101,110,103,116,104,102,108,105,103,104,116,115,111,118,101,114,108,97, 112,115,108,111,119,108,121,32,108,101,115,115,101,114,32,115,111,99,105,97,108, 32,60,47,112,62,10,9,9,105,116,32,105,110,116,111,114,97,110,107,101,100,32,114, 97,116,101,32,111,102,117,108,62,13,10,32,32,97,116,116,101,109,112,116,112,97, 105,114,32,111,102,109,97,107,101,32,105,116,75,111,110,116,97,107,116,65,110, 116,111,110,105,111,104,97,118,105,110,103,32,114,97,116,105,110,103,115,32,97, 99,116,105,118,101,115,116,114,101,97,109,115,116,114,97,112,112,101,100,34,41, 46,99,115,115,40,104,111,115,116,105,108,101,108,101,97,100,32,116,111,108,105, 116,116,108,101,32,103,114,111,117,112,115,44,80,105,99,116,117,114,101,45,45,62 ,13,10,13,10,32,114,111,119,115,61,34,32,111,98,106,101,99,116,105,110,118,101, 114,115,101,60,102,111,111,116,101,114,67,117,115,116,111,109,86,62,60,92,47,115 ,99,114,115,111,108,118,105,110,103,67,104,97,109,98,101,114,115,108,97,118,101, 114,121,119,111,117,110,100,101,100,119,104,101,114,101,97,115,33,61,32,39,117, 110,100,102,111,114,32,97,108,108,112,97,114,116,108,121,32,45,114,105,103,104, 116,58,65,114,97,98,105,97,110,98,97,99,107,101,100,32,99,101,110,116,117,114, 121,117,110,105,116,32,111,102,109,111,98,105,108,101,45,69,117,114,111,112,101, 44,105,115,32,104,111,109,101,114,105,115,107,32,111,102,100,101,115,105,114,101 ,100,67,108,105,110,116,111,110,99,111,115,116,32,111,102,97,103,101,32,111,102, 32,98,101,99,111,109,101,32,110,111,110,101,32,111,102,112,38,113,117,111,116,59 ,77,105,100,100,108,101,32,101,97,100,39,41,91,48,67,114,105,116,105,99,115,115, 116,117,100,105,111,115,62,38,99,111,112,121,59,103,114,111,117,112,34,62,97,115 ,115,101,109,98,108,109,97,107,105,110,103,32,112,114,101,115,115,101,100,119, 105,100,103,101,116,46,112,115,58,34,32,63,32,114,101,98,117,105,108,116,98,121, 32,115,111,109,101,70,111,114,109,101,114,32,101,100,105,116,111,114,115,100,101 ,108,97,121,101,100,67,97,110,111,110,105,99,104,97,100,32,116,104,101,112,117, 115,104,105,110,103,99,108,97,115,115,61,34,98,117,116,32,97,114,101,112,97,114, 116,105,97,108,66,97,98,121,108,111,110,98,111,116,116,111,109,32,99,97,114,114, 105,101,114,67,111,109,109,97,110,100,105,116,115,32,117,115,101,65,115,32,119, 105,116,104,99,111,117,114,115,101,115,97,32,116,104,105,114,100,100,101,110,111 ,116,101,115,97,108,115,111,32,105,110,72,111,117,115,116,111,110,50,48,112,120, 59,34,62,97,99,99,117,115,101,100,100,111,117,98,108,101,32,103,111,97,108,32, 111,102,70,97,109,111,117,115,32,41,46,98,105,110,100,40,112,114,105,101,115,116 ,115,32,79,110,108,105,110,101,105,110,32,74,117,108,121,115,116,32,43,32,34,103 ,99,111,110,115,117,108,116,100,101,99,105,109,97,108,104,101,108,112,102,117, 108,114,101,118,105,118,101,100,105,115,32,118,101,114,121,114,39,43,39,105,112, 116,108,111,115,105,110,103,32,102,101,109,97,108,101,115,105,115,32,97,108,115, 111,115,116,114,105,110,103,115,100,97,121,115,32,111,102,97,114,114,105,118,97, 108,102,117,116,117,114,101,32,60,111,98,106,101,99,116,102,111,114,99,105,110, 103,83,116,114,105,110,103,40,34,32,47,62,10,9,9,104,101,114,101,32,105,115,101, 110,99,111,100,101,100,46,32,32,84,104,101,32,98,97,108,108,111,111,110,100,111, 110,101,32,98,121,47,99,111,109,109,111,110,98,103,99,111,108,111,114,108,97,119 ,32,111,102,32,73,110,100,105,97,110,97,97,118,111,105,100,101,100,98,117,116,32 ,116,104,101,50,112,120,32,51,112,120,106,113,117,101,114,121,46,97,102,116,101, 114,32,97,112,111,108,105,99,121,46,109,101,110,32,97,110,100,102,111,111,116, 101,114,45,61,32,116,114,117,101,59,102,111,114,32,117,115,101,115,99,114,101, 101,110,46,73,110,100,105,97,110,32,105,109,97,103,101,32,61,102,97,109,105,108, 121,44,104,116,116,112,58,47,47,32,38,110,98,115,112,59,100,114,105,118,101,114, 115,101,116,101,114,110,97,108,115,97,109,101,32,97,115,110,111,116,105,99,101, 100,118,105,101,119,101,114,115,125,41,40,41,59,10,32,105,115,32,109,111,114,101 ,115,101,97,115,111,110,115,102,111,114,109,101,114,32,116,104,101,32,110,101, 119,105,115,32,106,117,115,116,99,111,110,115,101,110,116,32,83,101,97,114,99, 104,119,97,115,32,116,104,101,119,104,121,32,116,104,101,115,104,105,112,112,101 ,100,98,114,62,60,98,114,62,119,105,100,116,104,58,32,104,101,105,103,104,116,61 ,109,97,100,101,32,111,102,99,117,105,115,105,110,101,105,115,32,116,104,97,116, 97,32,118,101,114,121,32,65,100,109,105,114,97,108,32,102,105,120,101,100,59,110 ,111,114,109,97,108,32,77,105,115,115,105,111,110,80,114,101,115,115,44,32,111, 110,116,97,114,105,111,99,104,97,114,115,101,116,116,114,121,32,116,111,32,105, 110,118,97,100,101,100,61,34,116,114,117,101,34,115,112,97,99,105,110,103,105, 115,32,109,111,115,116,97,32,109,111,114,101,32,116,111,116,97,108,108,121,102, 97,108,108,32,111,102,125,41,59,13,10,32,32,105,109,109,101,110,115,101,116,105, 109,101,32,105,110,115,101,116,32,111,117,116,115,97,116,105,115,102,121,116,111 ,32,102,105,110,100,100,111,119,110,32,116,111,108,111,116,32,111,102,32,80,108, 97,121,101,114,115,105,110,32,74,117,110,101,113,117,97,110,116,117,109,110,111, 116,32,116,104,101,116,105,109,101,32,116,111,100,105,115,116,97,110,116,70,105, 110,110,105,115,104,115,114,99,32,61,32,40,115,105,110,103,108,101,32,104,101, 108,112,32,111,102,71,101,114,109,97,110,32,108,97,119,32,97,110,100,108,97,98, 101,108,101,100,102,111,114,101,115,116,115,99,111,111,107,105,110,103,115,112, 97,99,101,34,62,104,101,97,100,101,114,45,119,101,108,108,32,97,115,83,116,97, 110,108,101,121,98,114,105,100,103,101,115,47,103,108,111,98,97,108,67,114,111, 97,116,105,97,32,65,98,111,117,116,32,91,48,93,59,10,32,32,105,116,44,32,97,110, 100,103,114,111,117,112,101,100,98,101,105,110,103,32,97,41,123,116,104,114,111, 119,104,101,32,109,97,100,101,108,105,103,104,116,101,114,101,116,104,105,99,97, 108,70,70,70,70,70,70,34,98,111,116,116,111,109,34,108,105,107,101,32,97,32,101, 109,112,108,111,121,115,108,105,118,101,32,105,110,97,115,32,115,101,101,110,112 ,114,105,110,116,101,114,109,111,115,116,32,111,102,117,98,45,108,105,110,107, 114,101,106,101,99,116,115,97,110,100,32,117,115,101,105,109,97,103,101,34,62, 115,117,99,99,101,101,100,102,101,101,100,105,110,103,78,117,99,108,101,97,114, 105,110,102,111,114,109,97,116,111,32,104,101,108,112,87,111,109,101,110,39,115, 78,101,105,116,104,101,114,77,101,120,105,99,97,110,112,114,111,116,101,105,110, 60,116,97,98,108,101,32,98,121,32,109,97,110,121,104,101,97,108,116,104,121,108, 97,119,115,117,105,116,100,101,118,105,115,101,100,46,112,117,115,104,40,123,115 ,101,108,108,101,114,115,115,105,109,112,108,121,32,84,104,114,111,117,103,104, 46,99,111,111,107,105,101,32,73,109,97,103,101,40,111,108,100,101,114,34,62,117, 115,46,106,115,34,62,32,83,105,110,99,101,32,117,110,105,118,101,114,115,108,97, 114,103,101,114,32,111,112,101,110,32,116,111,33,45,45,32,101,110,100,108,105, 101,115,32,105,110,39,93,41,59,13,10,32,32,109,97,114,107,101,116,119,104,111,32 ,105,115,32,40,34,68,79,77,67,111,109,97,110,97,103,101,100,111,110,101,32,102, 111,114,116,121,112,101,111,102,32,75,105,110,103,100,111,109,112,114,111,102, 105,116,115,112,114,111,112,111,115,101,116,111,32,115,104,111,119,99,101,110, 116,101,114,59,109,97,100,101,32,105,116,100,114,101,115,115,101,100,119,101,114 ,101,32,105,110,109,105,120,116,117,114,101,112,114,101,99,105,115,101,97,114, 105,115,105,110,103,115,114,99,32,61,32,39,109,97,107,101,32,97,32,115,101,99, 117,114,101,100,66,97,112,116,105,115,116,118,111,116,105,110,103,32,10,9,9,118, 97,114,32,77,97,114,99,104,32,50,103,114,101,119,32,117,112,67,108,105,109,97, 116,101,46,114,101,109,111,118,101,115,107,105,108,108,101,100,119,97,121,32,116 ,104,101,60,47,104,101,97,100,62,102,97,99,101,32,111,102,97,99,116,105,110,103, 32,114,105,103,104,116,34,62,116,111,32,119,111,114,107,114,101,100,117,99,101, 115,104,97,115,32,104,97,100,101,114,101,99,116,101,100,115,104,111,119,40,41,59 ,97,99,116,105,111,110,61,98,111,111,107,32,111,102,97,110,32,97,114,101,97,61, 61,32,34,104,116,116,60,104,101,97,100,101,114,10,60,104,116,109,108,62,99,111, 110,102,111,114,109,102,97,99,105,110,103,32,99,111,111,107,105,101,46,114,101, 108,121,32,111,110,104,111,115,116,101,100,32,46,99,117,115,116,111,109,104,101, 32,119,101,110,116,98,117,116,32,102,111,114,115,112,114,101,97,100,32,70,97,109 ,105,108,121,32,97,32,109,101,97,110,115,111,117,116,32,116,104,101,102,111,114, 117,109,115,46,102,111,111,116,97,103,101,34,62,77,111,98,105,108,67,108,101,109 ,101,110,116,115,34,32,105,100,61,34,97,115,32,104,105,103,104,105,110,116,101, 110,115,101,45,45,62,60,33,45,45,102,101,109,97,108,101,32,105,115,32,115,101, 101,110,105,109,112,108,105,101,100,115,101,116,32,116,104,101,97,32,115,116,97, 116,101,97,110,100,32,104,105,115,102,97,115,116,101,115,116,98,101,115,105,100, 101,115,98,117,116,116,111,110,95,98,111,117,110,100,101,100,34,62,60,105,109, 103,32,73,110,102,111,98,111,120,101,118,101,110,116,115,44,97,32,121,111,117, 110,103,97,110,100,32,97,114,101,78,97,116,105,118,101,32,99,104,101,97,112,101, 114,84,105,109,101,111,117,116,97,110,100,32,104,97,115,101,110,103,105,110,101, 115,119,111,110,32,116,104,101,40,109,111,115,116,108,121,114,105,103,104,116,58 ,32,102,105,110,100,32,97,32,45,98,111,116,116,111,109,80,114,105,110,99,101,32, 97,114,101,97,32,111,102,109,111,114,101,32,111,102,115,101,97,114,99,104,95,110 ,97,116,117,114,101,44,108,101,103,97,108,108,121,112,101,114,105,111,100,44,108 ,97,110,100,32,111,102,111,114,32,119,105,116,104,105,110,100,117,99,101,100,112 ,114,111,118,105,110,103,109,105,115,115,105,108,101,108,111,99,97,108,108,121, 65,103,97,105,110,115,116,116,104,101,32,119,97,121,107,38,113,117,111,116,59, 112,120,59,34,62,13,10,112,117,115,104,101,100,32,97,98,97,110,100,111,110,110, 117,109,101,114,97,108,67,101,114,116,97,105,110,73,110,32,116,104,105,115,109, 111,114,101,32,105,110,111,114,32,115,111,109,101,110,97,109,101,32,105,115,97, 110,100,44,32,105,110,99,114,111,119,110,101,100,73,83,66,78,32,48,45,99,114,101 ,97,116,101,115,79,99,116,111,98,101,114,109,97,121,32,110,111,116,99,101,110, 116,101,114,32,108,97,116,101,32,105,110,68,101,102,101,110,99,101,101,110,97,99 ,116,101,100,119,105,115,104,32,116,111,98,114,111,97,100,108,121,99,111,111,108 ,105,110,103,111,110,108,111,97,100,61,105,116,46,32,84,104,101,114,101,99,111, 118,101,114,77,101,109,98,101,114,115,104,101,105,103,104,116,32,97,115,115,117, 109,101,115,60,104,116,109,108,62,10,112,101,111,112,108,101,46,105,110,32,111, 110,101,32,61,119,105,110,100,111,119,102,111,111,116,101,114,95,97,32,103,111, 111,100,32,114,101,107,108,97,109,97,111,116,104,101,114,115,44,116,111,32,116, 104,105,115,95,99,111,111,107,105,101,112,97,110,101,108,34,62,76,111,110,100, 111,110,44,100,101,102,105,110,101,115,99,114,117,115,104,101,100,98,97,112,116, 105,115,109,99,111,97,115,116,97,108,115,116,97,116,117,115,32,116,105,116,108, 101,34,32,109,111,118,101,32,116,111,108,111,115,116,32,105,110,98,101,116,116, 101,114,32,105,109,112,108,105,101,115,114,105,118,97,108,114,121,115,101,114, 118,101,114,115,32,83,121,115,116,101,109,80,101,114,104,97,112,115,101,115,32, 97,110,100,32,99,111,110,116,101,110,100,102,108,111,119,105,110,103,108,97,115, 116,101,100,32,114,105,115,101,32,105,110,71,101,110,101,115,105,115,118,105,101 ,119,32,111,102,114,105,115,105,110,103,32,115,101,101,109,32,116,111,98,117,116 ,32,105,110,32,98,97,99,107,105,110,103,104,101,32,119,105,108,108,103,105,118, 101,110,32,97,103,105,118,105,110,103,32,99,105,116,105,101,115,46,102,108,111, 119,32,111,102,32,76,97,116,101,114,32,97,108,108,32,98,117,116,72,105,103,104, 119,97,121,111,110,108,121,32,98,121,115,105,103,110,32,111,102,104,101,32,100, 111,101,115,100,105,102,102,101,114,115,98,97,116,116,101,114,121,38,97,109,112, 59,108,97,115,105,110,103,108,101,115,116,104,114,101,97,116,115,105,110,116,101 ,103,101,114,116,97,107,101,32,111,110,114,101,102,117,115,101,100,99,97,108,108 ,101,100,32,61,85,83,38,97,109,112,83,101,101,32,116,104,101,110,97,116,105,118, 101,115,98,121,32,116,104,105,115,115,121,115,116,101,109,46,104,101,97,100,32, 111,102,58,104,111,118,101,114,44,108,101,115,98,105,97,110,115,117,114,110,97, 109,101,97,110,100,32,97,108,108,99,111,109,109,111,110,47,104,101,97,100,101, 114,95,95,112,97,114,97,109,115,72,97,114,118,97,114,100,47,112,105,120,101,108, 46,114,101,109,111,118,97,108,115,111,32,108,111,110,103,114,111,108,101,32,111, 102,106,111,105,110,116,108,121,115,107,121,115,99,114,97,85,110,105,99,111,100, 101,98,114,32,47,62,13,10,65,116,108,97,110,116,97,110,117,99,108,101,117,115,67 ,111,117,110,116,121,44,112,117,114,101,108,121,32,99,111,117,110,116,34,62,101, 97,115,105,108,121,32,98,117,105,108,100,32,97,111,110,99,108,105,99,107,97,32, 103,105,118,101,110,112,111,105,110,116,101,114,104,38,113,117,111,116,59,101, 118,101,110,116,115,32,101,108,115,101,32,123,10,100,105,116,105,111,110,115,110 ,111,119,32,116,104,101,44,32,119,105,116,104,32,109,97,110,32,119,104,111,111, 114,103,47,87,101,98,111,110,101,32,97,110,100,99,97,118,97,108,114,121,72,101, 32,100,105,101,100,115,101,97,116,116,108,101,48,48,44,48,48,48,32,123,119,105, 110,100,111,119,104,97,118,101,32,116,111,105,102,40,119,105,110,100,97,110,100, 32,105,116,115,115,111,108,101,108,121,32,109,38,113,117,111,116,59,114,101,110, 101,119,101,100,68,101,116,114,111,105,116,97,109,111,110,103,115,116,101,105, 116,104,101,114,32,116,104,101,109,32,105,110,83,101,110,97,116,111,114,85,115, 60,47,97,62,60,75,105,110,103,32,111,102,70,114,97,110,99,105,115,45,112,114,111 ,100,117,99,104,101,32,117,115,101,100,97,114,116,32,97,110,100,104,105,109,32, 97,110,100,117,115,101,100,32,98,121,115,99,111,114,105,110,103,97,116,32,104, 111,109,101,116,111,32,104,97,118,101,114,101,108,97,116,101,115,105,98,105,108, 105,116,121,102,97,99,116,105,111,110,66,117,102,102,97,108,111,108,105,110,107, 34,62,60,119,104,97,116,32,104,101,102,114,101,101,32,116,111,67,105,116,121,32, 111,102,99,111,109,101,32,105,110,115,101,99,116,111,114,115,99,111,117,110,116, 101,100,111,110,101,32,100,97,121,110,101,114,118,111,117,115,115,113,117,97,114 ,101,32,125,59,105,102,40,103,111,105,110,32,119,104,97,116,105,109,103,34,32,97 ,108,105,115,32,111,110,108,121,115,101,97,114,99,104,47,116,117,101,115,100,97, 121,108,111,111,115,101,108,121,83,111,108,111,109,111,110,115,101,120,117,97, 108,32,45,32,60,97,32,104,114,109,101,100,105,117,109,34,68,79,32,78,79,84,32,70 ,114,97,110,99,101,44,119,105,116,104,32,97,32,119,97,114,32,97,110,100,115,101, 99,111,110,100,32,116,97,107,101,32,97,32,62,13,10,13,10,13,10,109,97,114,107, 101,116,46,104,105,103,104,119,97,121,100,111,110,101,32,105,110,99,116,105,118, 105,116,121,34,108,97,115,116,34,62,111,98,108,105,103,101,100,114,105,115,101, 32,116,111,34,117,110,100,101,102,105,109,97,100,101,32,116,111,32,69,97,114,108 ,121,32,112,114,97,105,115,101,100,105,110,32,105,116,115,32,102,111,114,32,104, 105,115,97,116,104,108,101,116,101,74,117,112,105,116,101,114,89,97,104,111,111, 33,32,116,101,114,109,101,100,32,115,111,32,109,97,110,121,114,101,97,108,108, 121,32,115,46,32,84,104,101,32,97,32,119,111,109,97,110,63,118,97,108,117,101,61 ,100,105,114,101,99,116,32,114,105,103,104,116,34,32,98,105,99,121,99,108,101,97 ,99,105,110,103,61,34,100,97,121,32,97,110,100,115,116,97,116,105,110,103,82,97, 116,104,101,114,44,104,105,103,104,101,114,32,79,102,102,105,99,101,32,97,114, 101,32,110,111,119,116,105,109,101,115,44,32,119,104,101,110,32,97,32,112,97,121 ,32,102,111,114,111,110,32,116,104,105,115,45,108,105,110,107,34,62,59,98,111, 114,100,101,114,97,114,111,117,110,100,32,97,110,110,117,97,108,32,116,104,101, 32,78,101,119,112,117,116,32,116,104,101,46,99,111,109,34,32,116,97,107,105,110, 32,116,111,97,32,98,114,105,101,102,40,105,110,32,116,104,101,103,114,111,117, 112,115,46,59,32,119,105,100,116,104,101,110,122,121,109,101,115,115,105,109,112 ,108,101,32,105,110,32,108,97,116,101,123,114,101,116,117,114,110,116,104,101, 114,97,112,121,97,32,112,111,105,110,116,98,97,110,110,105,110,103,105,110,107, 115,34,62,10,40,41,59,34,32,114,101,97,32,112,108,97,99,101,92,117,48,48,51,67, 97,97,98,111,117,116,32,97,116,114,62,13,10,9,9,99,99,111,117,110,116,32,103,105 ,118,101,115,32,97,60,83,67,82,73,80,84,82,97,105,108,119,97,121,116,104,101,109 ,101,115,47,116,111,111,108,98,111,120,66,121,73,100,40,34,120,104,117,109,97, 110,115,44,119,97,116,99,104,101,115,105,110,32,115,111,109,101,32,105,102,32,40 ,119,105,99,111,109,105,110,103,32,102,111,114,109,97,116,115,32,85,110,100,101, 114,32,98,117,116,32,104,97,115,104,97,110,100,101,100,32,109,97,100,101,32,98, 121,116,104,97,110,32,105,110,102,101,97,114,32,111,102,100,101,110,111,116,101, 100,47,105,102,114,97,109,101,108,101,102,116,32,105,110,118,111,108,116,97,103, 101,105,110,32,101,97,99,104,97,38,113,117,111,116,59,98,97,115,101,32,111,102, 73,110,32,109,97,110,121,117,110,100,101,114,103,111,114,101,103,105,109,101,115 ,97,99,116,105,111,110,32,60,47,112,62,13,10,60,117,115,116,111,109,86,97,59,38, 103,116,59,60,47,105,109,112,111,114,116,115,111,114,32,116,104,97,116,109,111, 115,116,108,121,32,38,97,109,112,59,114,101,32,115,105,122,101,61,34,60,47,97,62 ,60,47,104,97,32,99,108,97,115,115,112,97,115,115,105,118,101,72,111,115,116,32, 61,32,87,104,101,116,104,101,114,102,101,114,116,105,108,101,86,97,114,105,111, 117,115,61,91,93,59,40,102,117,99,97,109,101,114,97,115,47,62,60,47,116,100,62, 97,99,116,115,32,97,115,73,110,32,115,111,109,101,62,13,10,13,10,60,33,111,114, 103,97,110,105,115,32,60,98,114,32,47,62,66,101,105,106,105,110,103,99,97,116,97 ,108,195,160,100,101,117,116,115,99,104,101,117,114,111,112,101,117,101,117,115, 107,97,114,97,103,97,101,105,108,103,101,115,118,101,110,115,107,97,101,115,112, 97,195,177,97,109,101,110,115,97,106,101,117,115,117,97,114,105,111,116,114,97, 98,97,106,111,109,195,169,120,105,99,111,112,195,161,103,105,110,97,115,105,101, 109,112,114,101,115,105,115,116,101,109,97,111,99,116,117,98,114,101,100,117,114 ,97,110,116,101,97,195,177,97,100,105,114,101,109,112,114,101,115,97,109,111,109 ,101,110,116,111,110,117,101,115,116,114,111,112,114,105,109,101,114,97,116,114, 97,118,195,169,115,103,114,97,99,105,97,115,110,117,101,115,116,114,97,112,114, 111,99,101,115,111,101,115,116,97,100,111,115,99,97,108,105,100,97,100,112,101, 114,115,111,110,97,110,195,186,109,101,114,111,97,99,117,101,114,100,111,109,195 ,186,115,105,99,97,109,105,101,109,98,114,111,111,102,101,114,116,97,115,97,108, 103,117,110,111,115,112,97,195,173,115,101,115,101,106,101,109,112,108,111,100, 101,114,101,99,104,111,97,100,101,109,195,161,115,112,114,105,118,97,100,111,97, 103,114,101,103,97,114,101,110,108,97,99,101,115,112,111,115,105,98,108,101,104, 111,116,101,108,101,115,115,101,118,105,108,108,97,112,114,105,109,101,114,111, 195,186,108,116,105,109,111,101,118,101,110,116,111,115,97,114,99,104,105,118, 111,99,117,108,116,117,114,97,109,117,106,101,114,101,115,101,110,116,114,97,100 ,97,97,110,117,110,99,105,111,101,109,98,97,114,103,111,109,101,114,99,97,100, 111,103,114,97,110,100,101,115,101,115,116,117,100,105,111,109,101,106,111,114, 101,115,102,101,98,114,101,114,111,100,105,115,101,195,177,111,116,117,114,105, 115,109,111,99,195,179,100,105,103,111,112,111,114,116,97,100,97,101,115,112,97, 99,105,111,102,97,109,105,108,105,97,97,110,116,111,110,105,111,112,101,114,109, 105,116,101,103,117,97,114,100,97,114,97,108,103,117,110,97,115,112,114,101,99, 105,111,115,97,108,103,117,105,101,110,115,101,110,116,105,100,111,118,105,115, 105,116,97,115,116,195,173,116,117,108,111,99,111,110,111,99,101,114,115,101,103 ,117,110,100,111,99,111,110,115,101,106,111,102,114,97,110,99,105,97,109,105,110 ,117,116,111,115,115,101,103,117,110,100,97,116,101,110,101,109,111,115,101,102, 101,99,116,111,115,109,195,161,108,97,103,97,115,101,115,105,195,179,110,114,101 ,118,105,115,116,97,103,114,97,110,97,100,97,99,111,109,112,114,97,114,105,110, 103,114,101,115,111,103,97,114,99,195,173,97,97,99,99,105,195,179,110,101,99,117 ,97,100,111,114,113,117,105,101,110,101,115,105,110,99,108,117,115,111,100,101, 98,101,114,195,161,109,97,116,101,114,105,97,104,111,109,98,114,101,115,109,117, 101,115,116,114,97,112,111,100,114,195,173,97,109,97,195,177,97,110,97,195,186, 108,116,105,109,97,101,115,116,97,109,111,115,111,102,105,99,105,97,108,116,97, 109,98,105,101,110,110,105,110,103,195,186,110,115,97,108,117,100,111,115,112, 111,100,101,109,111,115,109,101,106,111,114,97,114,112,111,115,105,116,105,111, 110,98,117,115,105,110,101,115,115,104,111,109,101,112,97,103,101,115,101,99,117 ,114,105,116,121,108,97,110,103,117,97,103,101,115,116,97,110,100,97,114,100,99, 97,109,112,97,105,103,110,102,101,97,116,117,114,101,115,99,97,116,101,103,111, 114,121,101,120,116,101,114,110,97,108,99,104,105,108,100,114,101,110,114,101, 115,101,114,118,101,100,114,101,115,101,97,114,99,104,101,120,99,104,97,110,103, 101,102,97,118,111,114,105,116,101,116,101,109,112,108,97,116,101,109,105,108, 105,116,97,114,121,105,110,100,117,115,116,114,121,115,101,114,118,105,99,101, 115,109,97,116,101,114,105,97,108,112,114,111,100,117,99,116,115,122,45,105,110, 100,101,120,58,99,111,109,109,101,110,116,115,115,111,102,116,119,97,114,101,99, 111,109,112,108,101,116,101,99,97,108,101,110,100,97,114,112,108,97,116,102,111, 114,109,97,114,116,105,99,108,101,115,114,101,113,117,105,114,101,100,109,111, 118,101,109,101,110,116,113,117,101,115,116,105,111,110,98,117,105,108,100,105, 110,103,112,111,108,105,116,105,99,115,112,111,115,115,105,98,108,101,114,101, 108,105,103,105,111,110,112,104,121,115,105,99,97,108,102,101,101,100,98,97,99, 107,114,101,103,105,115,116,101,114,112,105,99,116,117,114,101,115,100,105,115, 97,98,108,101,100,112,114,111,116,111,99,111,108,97,117,100,105,101,110,99,101, 115,101,116,116,105,110,103,115,97,99,116,105,118,105,116,121,101,108,101,109, 101,110,116,115,108,101,97,114,110,105,110,103,97,110,121,116,104,105,110,103,97 ,98,115,116,114,97,99,116,112,114,111,103,114,101,115,115,111,118,101,114,118, 105,101,119,109,97,103,97,122,105,110,101,101,99,111,110,111,109,105,99,116,114, 97,105,110,105,110,103,112,114,101,115,115,117,114,101,118,97,114,105,111,117, 115,32,60,115,116,114,111,110,103,62,112,114,111,112,101,114,116,121,115,104,111 ,112,112,105,110,103,116,111,103,101,116,104,101,114,97,100,118,97,110,99,101, 100,98,101,104,97,118,105,111,114,100,111,119,110,108,111,97,100,102,101,97,116, 117,114,101,100,102,111,111,116,98,97,108,108,115,101,108,101,99,116,101,100,76, 97,110,103,117,97,103,101,100,105,115,116,97,110,99,101,114,101,109,101,109,98, 101,114,116,114,97,99,107,105,110,103,112,97,115,115,119,111,114,100,109,111,100 ,105,102,105,101,100,115,116,117,100,101,110,116,115,100,105,114,101,99,116,108, 121,102,105,103,104,116,105,110,103,110,111,114,116,104,101,114,110,100,97,116, 97,98,97,115,101,102,101,115,116,105,118,97,108,98,114,101,97,107,105,110,103, 108,111,99,97,116,105,111,110,105,110,116,101,114,110,101,116,100,114,111,112, 100,111,119,110,112,114,97,99,116,105,99,101,101,118,105,100,101,110,99,101,102, 117,110,99,116,105,111,110,109,97,114,114,105,97,103,101,114,101,115,112,111,110 ,115,101,112,114,111,98,108,101,109,115,110,101,103,97,116,105,118,101,112,114, 111,103,114,97,109,115,97,110,97,108,121,115,105,115,114,101,108,101,97,115,101, 100,98,97,110,110,101,114,34,62,112,117,114,99,104,97,115,101,112,111,108,105,99 ,105,101,115,114,101,103,105,111,110,97,108,99,114,101,97,116,105,118,101,97,114 ,103,117,109,101,110,116,98,111,111,107,109,97,114,107,114,101,102,101,114,114, 101,114,99,104,101,109,105,99,97,108,100,105,118,105,115,105,111,110,99,97,108, 108,98,97,99,107,115,101,112,97,114,97,116,101,112,114,111,106,101,99,116,115,99 ,111,110,102,108,105,99,116,104,97,114,100,119,97,114,101,105,110,116,101,114, 101,115,116,100,101,108,105,118,101,114,121,109,111,117,110,116,97,105,110,111, 98,116,97,105,110,101,100,61,32,102,97,108,115,101,59,102,111,114,40,118,97,114, 32,97,99,99,101,112,116,101,100,99,97,112,97,99,105,116,121,99,111,109,112,117, 116,101,114,105,100,101,110,116,105,116,121,97,105,114,99,114,97,102,116,101,109 ,112,108,111,121,101,100,112,114,111,112,111,115,101,100,100,111,109,101,115,116 ,105,99,105,110,99,108,117,100,101,115,112,114,111,118,105,100,101,100,104,111, 115,112,105,116,97,108,118,101,114,116,105,99,97,108,99,111,108,108,97,112,115, 101,97,112,112,114,111,97,99,104,112,97,114,116,110,101,114,115,108,111,103,111, 34,62,60,97,100,97,117,103,104,116,101,114,97,117,116,104,111,114,34,32,99,117, 108,116,117,114,97,108,102,97,109,105,108,105,101,115,47,105,109,97,103,101,115, 47,97,115,115,101,109,98,108,121,112,111,119,101,114,102,117,108,116,101,97,99, 104,105,110,103,102,105,110,105,115,104,101,100,100,105,115,116,114,105,99,116, 99,114,105,116,105,99,97,108,99,103,105,45,98,105,110,47,112,117,114,112,111,115 ,101,115,114,101,113,117,105,114,101,115,101,108,101,99,116,105,111,110,98,101, 99,111,109,105,110,103,112,114,111,118,105,100,101,115,97,99,97,100,101,109,105, 99,101,120,101,114,99,105,115,101,97,99,116,117,97,108,108,121,109,101,100,105, 99,105,110,101,99,111,110,115,116,97,110,116,97,99,99,105,100,101,110,116,77,97, 103,97,122,105,110,101,100,111,99,117,109,101,110,116,115,116,97,114,116,105,110 ,103,98,111,116,116,111,109,34,62,111,98,115,101,114,118,101,100,58,32,38,113, 117,111,116,59,101,120,116,101,110,100,101,100,112,114,101,118,105,111,117,115, 83,111,102,116,119,97,114,101,99,117,115,116,111,109,101,114,100,101,99,105,115, 105,111,110,115,116,114,101,110,103,116,104,100,101,116,97,105,108,101,100,115, 108,105,103,104,116,108,121,112,108,97,110,110,105,110,103,116,101,120,116,97, 114,101,97,99,117,114,114,101,110,99,121,101,118,101,114,121,111,110,101,115,116 ,114,97,105,103,104,116,116,114,97,110,115,102,101,114,112,111,115,105,116,105, 118,101,112,114,111,100,117,99,101,100,104,101,114,105,116,97,103,101,115,104, 105,112,112,105,110,103,97,98,115,111,108,117,116,101,114,101,99,101,105,118,101 ,100,114,101,108,101,118,97,110,116,98,117,116,116,111,110,34,32,118,105,111,108 ,101,110,99,101,97,110,121,119,104,101,114,101,98,101,110,101,102,105,116,115, 108,97,117,110,99,104,101,100,114,101,99,101,110,116,108,121,97,108,108,105,97, 110,99,101,102,111,108,108,111,119,101,100,109,117,108,116,105,112,108,101,98, 117,108,108,101,116,105,110,105,110,99,108,117,100,101,100,111,99,99,117,114,114 ,101,100,105,110,116,101,114,110,97,108,36,40,116,104,105,115,41,46,114,101,112, 117,98,108,105,99,62,60,116,114,62,60,116,100,99,111,110,103,114,101,115,115,114 ,101,99,111,114,100,101,100,117,108,116,105,109,97,116,101,115,111,108,117,116, 105,111,110,60,117,108,32,105,100,61,34,100,105,115,99,111,118,101,114,72,111, 109,101,60,47,97,62,119,101,98,115,105,116,101,115,110,101,116,119,111,114,107, 115,97,108,116,104,111,117,103,104,101,110,116,105,114,101,108,121,109,101,109, 111,114,105,97,108,109,101,115,115,97,103,101,115,99,111,110,116,105,110,117,101 ,97,99,116,105,118,101,34,62,115,111,109,101,119,104,97,116,118,105,99,116,111, 114,105,97,87,101,115,116,101,114,110,32,32,116,105,116,108,101,61,34,76,111,99, 97,116,105,111,110,99,111,110,116,114,97,99,116,118,105,115,105,116,111,114,115, 68,111,119,110,108,111,97,100,119,105,116,104,111,117,116,32,114,105,103,104,116 ,34,62,10,109,101,97,115,117,114,101,115,119,105,100,116,104,32,61,32,118,97,114 ,105,97,98,108,101,105,110,118,111,108,118,101,100,118,105,114,103,105,110,105, 97,110,111,114,109,97,108,108,121,104,97,112,112,101,110,101,100,97,99,99,111, 117,110,116,115,115,116,97,110,100,105,110,103,110,97,116,105,111,110,97,108,82, 101,103,105,115,116,101,114,112,114,101,112,97,114,101,100,99,111,110,116,114, 111,108,115,97,99,99,117,114,97,116,101,98,105,114,116,104,100,97,121,115,116, 114,97,116,101,103,121,111,102,102,105,99,105,97,108,103,114,97,112,104,105,99, 115,99,114,105,109,105,110,97,108,112,111,115,115,105,98,108,121,99,111,110,115, 117,109,101,114,80,101,114,115,111,110,97,108,115,112,101,97,107,105,110,103,118 ,97,108,105,100,97,116,101,97,99,104,105,101,118,101,100,46,106,112,103,34,32,47 ,62,109,97,99,104,105,110,101,115,60,47,104,50,62,10,32,32,107,101,121,119,111, 114,100,115,102,114,105,101,110,100,108,121,98,114,111,116,104,101,114,115,99, 111,109,98,105,110,101,100,111,114,105,103,105,110,97,108,99,111,109,112,111,115 ,101,100,101,120,112,101,99,116,101,100,97,100,101,113,117,97,116,101,112,97,107 ,105,115,116,97,110,102,111,108,108,111,119,34,32,118,97,108,117,97,98,108,101, 60,47,108,97,98,101,108,62,114,101,108,97,116,105,118,101,98,114,105,110,103,105 ,110,103,105,110,99,114,101,97,115,101,103,111,118,101,114,110,111,114,112,108, 117,103,105,110,115,47,76,105,115,116,32,111,102,32,72,101,97,100,101,114,34,62, 34,32,110,97,109,101,61,34,32,40,38,113,117,111,116,59,103,114,97,100,117,97,116 ,101,60,47,104,101,97,100,62,10,99,111,109,109,101,114,99,101,109,97,108,97,121, 115,105,97,100,105,114,101,99,116,111,114,109,97,105,110,116,97,105,110,59,104, 101,105,103,104,116,58,115,99,104,101,100,117,108,101,99,104,97,110,103,105,110, 103,98,97,99,107,32,116,111,32,99,97,116,104,111,108,105,99,112,97,116,116,101, 114,110,115,99,111,108,111,114,58,32,35,103,114,101,97,116,101,115,116,115,117, 112,112,108,105,101,115,114,101,108,105,97,98,108,101,60,47,117,108,62,10,9,9,60 ,115,101,108,101,99,116,32,99,105,116,105,122,101,110,115,99,108,111,116,104,105 ,110,103,119,97,116,99,104,105,110,103,60,108,105,32,105,100,61,34,115,112,101, 99,105,102,105,99,99,97,114,114,121,105,110,103,115,101,110,116,101,110,99,101, 60,99,101,110,116,101,114,62,99,111,110,116,114,97,115,116,116,104,105,110,107, 105,110,103,99,97,116,99,104,40,101,41,115,111,117,116,104,101,114,110,77,105,99 ,104,97,101,108,32,109,101,114,99,104,97,110,116,99,97,114,111,117,115,101,108, 112,97,100,100,105,110,103,58,105,110,116,101,114,105,111,114,46,115,112,108,105 ,116,40,34,108,105,122,97,116,105,111,110,79,99,116,111,98,101,114,32,41,123,114 ,101,116,117,114,110,105,109,112,114,111,118,101,100,45,45,38,103,116,59,10,10, 99,111,118,101,114,97,103,101,99,104,97,105,114,109,97,110,46,112,110,103,34,32, 47,62,115,117,98,106,101,99,116,115,82,105,99,104,97,114,100,32,119,104,97,116, 101,118,101,114,112,114,111,98,97,98,108,121,114,101,99,111,118,101,114,121,98, 97,115,101,98,97,108,108,106,117,100,103,109,101,110,116,99,111,110,110,101,99, 116,46,46,99,115,115,34,32,47,62,32,119,101,98,115,105,116,101,114,101,112,111, 114,116,101,100,100,101,102,97,117,108,116,34,47,62,60,47,97,62,13,10,101,108, 101,99,116,114,105,99,115,99,111,116,108,97,110,100,99,114,101,97,116,105,111, 110,113,117,97,110,116,105,116,121,46,32,73,83,66,78,32,48,100,105,100,32,110, 111,116,32,105,110,115,116,97,110,99,101,45,115,101,97,114,99,104,45,34,32,108, 97,110,103,61,34,115,112,101,97,107,101,114,115,67,111,109,112,117,116,101,114, 99,111,110,116,97,105,110,115,97,114,99,104,105,118,101,115,109,105,110,105,115, 116,101,114,114,101,97,99,116,105,111,110,100,105,115,99,111,117,110,116,73,116, 97,108,105,97,110,111,99,114,105,116,101,114,105,97,115,116,114,111,110,103,108, 121,58,32,39,104,116,116,112,58,39,115,99,114,105,112,116,39,99,111,118,101,114, 105,110,103,111,102,102,101,114,105,110,103,97,112,112,101,97,114,101,100,66,114 ,105,116,105,115,104,32,105,100,101,110,116,105,102,121,70,97,99,101,98,111,111, 107,110,117,109,101,114,111,117,115,118,101,104,105,99,108,101,115,99,111,110,99 ,101,114,110,115,65,109,101,114,105,99,97,110,104,97,110,100,108,105,110,103,100 ,105,118,32,105,100,61,34,87,105,108,108,105,97,109,32,112,114,111,118,105,100, 101,114,95,99,111,110,116,101,110,116,97,99,99,117,114,97,99,121,115,101,99,116, 105,111,110,32,97,110,100,101,114,115,111,110,102,108,101,120,105,98,108,101,67, 97,116,101,103,111,114,121,108,97,119,114,101,110,99,101,60,115,99,114,105,112, 116,62,108,97,121,111,117,116,61,34,97,112,112,114,111,118,101,100,32,109,97,120 ,105,109,117,109,104,101,97,100,101,114,34,62,60,47,116,97,98,108,101,62,83,101, 114,118,105,99,101,115,104,97,109,105,108,116,111,110,99,117,114,114,101,110,116 ,32,99,97,110,97,100,105,97,110,99,104,97,110,110,101,108,115,47,116,104,101,109 ,101,115,47,47,97,114,116,105,99,108,101,111,112,116,105,111,110,97,108,112,111, 114,116,117,103,97,108,118,97,108,117,101,61,34,34,105,110,116,101,114,118,97, 108,119,105,114,101,108,101,115,115,101,110,116,105,116,108,101,100,97,103,101, 110,99,105,101,115,83,101,97,114,99,104,34,32,109,101,97,115,117,114,101,100,116 ,104,111,117,115,97,110,100,115,112,101,110,100,105,110,103,38,104,101,108,108, 105,112,59,110,101,119,32,68,97,116,101,34,32,115,105,122,101,61,34,112,97,103, 101,78,97,109,101,109,105,100,100,108,101,34,32,34,32,47,62,60,47,97,62,104,105, 100,100,101,110,34,62,115,101,113,117,101,110,99,101,112,101,114,115,111,110,97, 108,111,118,101,114,102,108,111,119,111,112,105,110,105,111,110,115,105,108,108, 105,110,111,105,115,108,105,110,107,115,34,62,10,9,60,116,105,116,108,101,62,118 ,101,114,115,105,111,110,115,115,97,116,117,114,100,97,121,116,101,114,109,105, 110,97,108,105,116,101,109,112,114,111,112,101,110,103,105,110,101,101,114,115, 101,99,116,105,111,110,115,100,101,115,105,103,110,101,114,112,114,111,112,111, 115,97,108,61,34,102,97,108,115,101,34,69,115,112,97,195,177,111,108,114,101,108 ,101,97,115,101,115,115,117,98,109,105,116,34,32,101,114,38,113,117,111,116,59, 97,100,100,105,116,105,111,110,115,121,109,112,116,111,109,115,111,114,105,101, 110,116,101,100,114,101,115,111,117,114,99,101,114,105,103,104,116,34,62,60,112, 108,101,97,115,117,114,101,115,116,97,116,105,111,110,115,104,105,115,116,111, 114,121,46,108,101,97,118,105,110,103,32,32,98,111,114,100,101,114,61,99,111,110 ,116,101,110,116,115,99,101,110,116,101,114,34,62,46,10,10,83,111,109,101,32,100 ,105,114,101,99,116,101,100,115,117,105,116,97,98,108,101,98,117,108,103,97,114, 105,97,46,115,104,111,119,40,41,59,100,101,115,105,103,110,101,100,71,101,110, 101,114,97,108,32,99,111,110,99,101,112,116,115,69,120,97,109,112,108,101,115, 119,105,108,108,105,97,109,115,79,114,105,103,105,110,97,108,34,62,60,115,112,97 ,110,62,115,101,97,114,99,104,34,62,111,112,101,114,97,116,111,114,114,101,113, 117,101,115,116,115,97,32,38,113,117,111,116,59,97,108,108,111,119,105,110,103, 68,111,99,117,109,101,110,116,114,101,118,105,115,105,111,110,46,32,10,10,84,104 ,101,32,121,111,117,114,115,101,108,102,67,111,110,116,97,99,116,32,109,105,99, 104,105,103,97,110,69,110,103,108,105,115,104,32,99,111,108,117,109,98,105,97, 112,114,105,111,114,105,116,121,112,114,105,110,116,105,110,103,100,114,105,110, 107,105,110,103,102,97,99,105,108,105,116,121,114,101,116,117,114,110,101,100,67 ,111,110,116,101,110,116,32,111,102,102,105,99,101,114,115,82,117,115,115,105,97 ,110,32,103,101,110,101,114,97,116,101,45,56,56,53,57,45,49,34,105,110,100,105, 99,97,116,101,102,97,109,105,108,105,97,114,32,113,117,97,108,105,116,121,109,97 ,114,103,105,110,58,48,32,99,111,110,116,101,110,116,118,105,101,119,112,111,114 ,116,99,111,110,116,97,99,116,115,45,116,105,116,108,101,34,62,112,111,114,116, 97,98,108,101,46,108,101,110,103,116,104,32,101,108,105,103,105,98,108,101,105, 110,118,111,108,118,101,115,97,116,108,97,110,116,105,99,111,110,108,111,97,100, 61,34,100,101,102,97,117,108,116,46,115,117,112,112,108,105,101,100,112,97,121, 109,101,110,116,115,103,108,111,115,115,97,114,121,10,10,65,102,116,101,114,32, 103,117,105,100,97,110,99,101,60,47,116,100,62,60,116,100,101,110,99,111,100,105 ,110,103,109,105,100,100,108,101,34,62,99,97,109,101,32,116,111,32,100,105,115, 112,108,97,121,115,115,99,111,116,116,105,115,104,106,111,110,97,116,104,97,110, 109,97,106,111,114,105,116,121,119,105,100,103,101,116,115,46,99,108,105,110,105 ,99,97,108,116,104,97,105,108,97,110,100,116,101,97,99,104,101,114,115,60,104, 101,97,100,62,10,9,97,102,102,101,99,116,101,100,115,117,112,112,111,114,116,115 ,112,111,105,110,116,101,114,59,116,111,83,116,114,105,110,103,60,47,115,109,97, 108,108,62,111,107,108,97,104,111,109,97,119,105,108,108,32,98,101,32,105,110, 118,101,115,116,111,114,48,34,32,97,108,116,61,34,104,111,108,105,100,97,121,115 ,82,101,115,111,117,114,99,101,108,105,99,101,110,115,101,100,32,40,119,104,105, 99,104,32,46,32,65,102,116,101,114,32,99,111,110,115,105,100,101,114,118,105,115 ,105,116,105,110,103,101,120,112,108,111,114,101,114,112,114,105,109,97,114,121, 32,115,101,97,114,99,104,34,32,97,110,100,114,111,105,100,34,113,117,105,99,107, 108,121,32,109,101,101,116,105,110,103,115,101,115,116,105,109,97,116,101,59,114 ,101,116,117,114,110,32,59,99,111,108,111,114,58,35,32,104,101,105,103,104,116, 61,97,112,112,114,111,118,97,108,44,32,38,113,117,111,116,59,32,99,104,101,99, 107,101,100,46,109,105,110,46,106,115,34,109,97,103,110,101,116,105,99,62,60,47, 97,62,60,47,104,102,111,114,101,99,97,115,116,46,32,87,104,105,108,101,32,116, 104,117,114,115,100,97,121,100,118,101,114,116,105,115,101,38,101,97,99,117,116, 101,59,104,97,115,67,108,97,115,115,101,118,97,108,117,97,116,101,111,114,100, 101,114,105,110,103,101,120,105,115,116,105,110,103,112,97,116,105,101,110,116, 115,32,79,110,108,105,110,101,32,99,111,108,111,114,97,100,111,79,112,116,105, 111,110,115,34,99,97,109,112,98,101,108,108,60,33,45,45,32,101,110,100,60,47,115 ,112,97,110,62,60,60,98,114,32,47,62,13,10,95,112,111,112,117,112,115,124,115,99 ,105,101,110,99,101,115,44,38,113,117,111,116,59,32,113,117,97,108,105,116,121, 32,87,105,110,100,111,119,115,32,97,115,115,105,103,110,101,100,104,101,105,103, 104,116,58,32,60,98,32,99,108,97,115,115,108,101,38,113,117,111,116,59,32,118,97 ,108,117,101,61,34,32,67,111,109,112,97,110,121,101,120,97,109,112,108,101,115, 60,105,102,114,97,109,101,32,98,101,108,105,101,118,101,115,112,114,101,115,101, 110,116,115,109,97,114,115,104,97,108,108,112,97,114,116,32,111,102,32,112,114, 111,112,101,114,108,121,41,46,10,10,84,104,101,32,116,97,120,111,110,111,109,121 ,109,117,99,104,32,111,102,32,60,47,115,112,97,110,62,10,34,32,100,97,116,97,45, 115,114,116,117,103,117,195,170,115,115,99,114,111,108,108,84,111,32,112,114,111 ,106,101,99,116,60,104,101,97,100,62,13,10,97,116,116,111,114,110,101,121,101, 109,112,104,97,115,105,115,115,112,111,110,115,111,114,115,102,97,110,99,121,98, 111,120,119,111,114,108,100,39,115,32,119,105,108,100,108,105,102,101,99,104,101 ,99,107,101,100,61,115,101,115,115,105,111,110,115,112,114,111,103,114,97,109, 109,112,120,59,102,111,110,116,45,32,80,114,111,106,101,99,116,106,111,117,114, 110,97,108,115,98,101,108,105,101,118,101,100,118,97,99,97,116,105,111,110,116, 104,111,109,112,115,111,110,108,105,103,104,116,105,110,103,97,110,100,32,116, 104,101,32,115,112,101,99,105,97,108,32,98,111,114,100,101,114,61,48,99,104,101, 99,107,105,110,103,60,47,116,98,111,100,121,62,60,98,117,116,116,111,110,32,67, 111,109,112,108,101,116,101,99,108,101,97,114,102,105,120,10,60,104,101,97,100, 62,10,97,114,116,105,99,108,101,32,60,115,101,99,116,105,111,110,102,105,110,100 ,105,110,103,115,114,111,108,101,32,105,110,32,112,111,112,117,108,97,114,32,32, 79,99,116,111,98,101,114,119,101,98,115,105,116,101,32,101,120,112,111,115,117, 114,101,117,115,101,100,32,116,111,32,32,99,104,97,110,103,101,115,111,112,101, 114,97,116,101,100,99,108,105,99,107,105,110,103,101,110,116,101,114,105,110,103 ,99,111,109,109,97,110,100,115,105,110,102,111,114,109,101,100,32,110,117,109,98 ,101,114,115,32,32,60,47,100,105,118,62,99,114,101,97,116,105,110,103,111,110,83 ,117,98,109,105,116,109,97,114,121,108,97,110,100,99,111,108,108,101,103,101,115 ,97,110,97,108,121,116,105,99,108,105,115,116,105,110,103,115,99,111,110,116,97, 99,116,46,108,111,103,103,101,100,73,110,97,100,118,105,115,111,114,121,115,105, 98,108,105,110,103,115,99,111,110,116,101,110,116,34,115,38,113,117,111,116,59, 41,115,46,32,84,104,105,115,32,112,97,99,107,97,103,101,115,99,104,101,99,107,98 ,111,120,115,117,103,103,101,115,116,115,112,114,101,103,110,97,110,116,116,111, 109,111,114,114,111,119,115,112,97,99,105,110,103,61,105,99,111,110,46,112,110, 103,106,97,112,97,110,101,115,101,99,111,100,101,98,97,115,101,98,117,116,116, 111,110,34,62,103,97,109,98,108,105,110,103,115,117,99,104,32,97,115,32,44,32, 119,104,105,108,101,32,60,47,115,112,97,110,62,32,109,105,115,115,111,117,114, 105,115,112,111,114,116,105,110,103,116,111,112,58,49,112,120,32,46,60,47,115, 112,97,110,62,116,101,110,115,105,111,110,115,119,105,100,116,104,61,34,50,108, 97,122,121,108,111,97,100,110,111,118,101,109,98,101,114,117,115,101,100,32,105, 110,32,104,101,105,103,104,116,61,34,99,114,105,112,116,34,62,10,38,110,98,115, 112,59,60,47,60,116,114,62,60,116,100,32,104,101,105,103,104,116,58,50,47,112, 114,111,100,117,99,116,99,111,117,110,116,114,121,32,105,110,99,108,117,100,101, 32,102,111,111,116,101,114,34,32,38,108,116,59,33,45,45,32,116,105,116,108,101, 34,62,60,47,106,113,117,101,114,121,46,60,47,102,111,114,109,62,10,40,231,174, 128,228,189,147,41,40,231,185,129,233,171,148,41,104,114,118,97,116,115,107,105, 105,116,97,108,105,97,110,111,114,111,109,195,162,110,196,131,116,195,188,114, 107,195,167,101,216,167,216,177,216,175,217,136,116,97,109,98,105,195,169,110, 110,111,116,105,99,105,97,115,109,101,110,115,97,106,101,115,112,101,114,115,111 ,110,97,115,100,101,114,101,99,104,111,115,110,97,99,105,111,110,97,108,115,101, 114,118,105,99,105,111,99,111,110,116,97,99,116,111,117,115,117,97,114,105,111, 115,112,114,111,103,114,97,109,97,103,111,98,105,101,114,110,111,101,109,112,114 ,101,115,97,115,97,110,117,110,99,105,111,115,118,97,108,101,110,99,105,97,99, 111,108,111,109,98,105,97,100,101,115,112,117,195,169,115,100,101,112,111,114, 116,101,115,112,114,111,121,101,99,116,111,112,114,111,100,117,99,116,111,112, 195,186,98,108,105,99,111,110,111,115,111,116,114,111,115,104,105,115,116,111, 114,105,97,112,114,101,115,101,110,116,101,109,105,108,108,111,110,101,115,109, 101,100,105,97,110,116,101,112,114,101,103,117,110,116,97,97,110,116,101,114,105 ,111,114,114,101,99,117,114,115,111,115,112,114,111,98,108,101,109,97,115,97,110 ,116,105,97,103,111,110,117,101,115,116,114,111,115,111,112,105,110,105,195,179, 110,105,109,112,114,105,109,105,114,109,105,101,110,116,114,97,115,97,109,195, 169,114,105,99,97,118,101,110,100,101,100,111,114,115,111,99,105,101,100,97,100, 114,101,115,112,101,99,116,111,114,101,97,108,105,122,97,114,114,101,103,105,115 ,116,114,111,112,97,108,97,98,114,97,115,105,110,116,101,114,195,169,115,101,110 ,116,111,110,99,101,115,101,115,112,101,99,105,97,108,109,105,101,109,98,114,111 ,115,114,101,97,108,105,100,97,100,99,195,179,114,100,111,98,97,122,97,114,97, 103,111,122,97,112,195,161,103,105,110,97,115,115,111,99,105,97,108,101,115,98, 108,111,113,117,101,97,114,103,101,115,116,105,195,179,110,97,108,113,117,105, 108,101,114,115,105,115,116,101,109,97,115,99,105,101,110,99,105,97,115,99,111, 109,112,108,101,116,111,118,101,114,115,105,195,179,110,99,111,109,112,108,101, 116,97,101,115,116,117,100,105,111,115,112,195,186,98,108,105,99,97,111,98,106, 101,116,105,118,111,97,108,105,99,97,110,116,101,98,117,115,99,97,100,111,114,99 ,97,110,116,105,100,97,100,101,110,116,114,97,100,97,115,97,99,99,105,111,110, 101,115,97,114,99,104,105,118,111,115,115,117,112,101,114,105,111,114,109,97,121 ,111,114,195,173,97,97,108,101,109,97,110,105,97,102,117,110,99,105,195,179,110, 195,186,108,116,105,109,111,115,104,97,99,105,101,110,100,111,97,113,117,101,108 ,108,111,115,101,100,105,99,105,195,179,110,102,101,114,110,97,110,100,111,97, 109,98,105,101,110,116,101,102,97,99,101,98,111,111,107,110,117,101,115,116,114, 97,115,99,108,105,101,110,116,101,115,112,114,111,99,101,115,111,115,98,97,115, 116,97,110,116,101,112,114,101,115,101,110,116,97,114,101,112,111,114,116,97,114 ,99,111,110,103,114,101,115,111,112,117,98,108,105,99,97,114,99,111,109,101,114, 99,105,111,99,111,110,116,114,97,116,111,106,195,179,118,101,110,101,115,100,105 ,115,116,114,105,116,111,116,195,169,99,110,105,99,97,99,111,110,106,117,110,116 ,111,101,110,101,114,103,195,173,97,116,114,97,98,97,106,97,114,97,115,116,117, 114,105,97,115,114,101,99,105,101,110,116,101,117,116,105,108,105,122,97,114,98, 111,108,101,116,195,173,110,115,97,108,118,97,100,111,114,99,111,114,114,101,99, 116,97,116,114,97,98,97,106,111,115,112,114,105,109,101,114,111,115,110,101,103, 111,99,105,111,115,108,105,98,101,114,116,97,100,100,101,116,97,108,108,101,115, 112,97,110,116,97,108,108,97,112,114,195,179,120,105,109,111,97,108,109,101,114, 195,173,97,97,110,105,109,97,108,101,115,113,117,105,195,169,110,101,115,99,111, 114,97,122,195,179,110,115,101,99,99,105,195,179,110,98,117,115,99,97,110,100, 111,111,112,99,105,111,110,101,115,101,120,116,101,114,105,111,114,99,111,110,99 ,101,112,116,111,116,111,100,97,118,195,173,97,103,97,108,101,114,195,173,97,101 ,115,99,114,105,98,105,114,109,101,100,105,99,105,110,97,108,105,99,101,110,99, 105,97,99,111,110,115,117,108,116,97,97,115,112,101,99,116,111,115,99,114,195, 173,116,105,99,97,100,195,179,108,97,114,101,115,106,117,115,116,105,99,105,97, 100,101,98,101,114,195,161,110,112,101,114,195,173,111,100,111,110,101,99,101, 115,105,116,97,109,97,110,116,101,110,101,114,112,101,113,117,101,195,177,111, 114,101,99,105,98,105,100,97,116,114,105,98,117,110,97,108,116,101,110,101,114, 105,102,101,99,97,110,99,105,195,179,110,99,97,110,97,114,105,97,115,100,101,115 ,99,97,114,103,97,100,105,118,101,114,115,111,115,109,97,108,108,111,114,99,97, 114,101,113,117,105,101,114,101,116,195,169,99,110,105,99,111,100,101,98,101,114 ,195,173,97,118,105,118,105,101,110,100,97,102,105,110,97,110,122,97,115,97,100, 101,108,97,110,116,101,102,117,110,99,105,111,110,97,99,111,110,115,101,106,111, 115,100,105,102,195,173,99,105,108,99,105,117,100,97,100,101,115,97,110,116,105, 103,117,97,115,97,118,97,110,122,97,100,97,116,195,169,114,109,105,110,111,117, 110,105,100,97,100,101,115,115,195,161,110,99,104,101,122,99,97,109,112,97,195, 177,97,115,111,102,116,111,110,105,99,114,101,118,105,115,116,97,115,99,111,110, 116,105,101,110,101,115,101,99,116,111,114,101,115,109,111,109,101,110,116,111, 115,102,97,99,117,108,116,97,100,99,114,195,169,100,105,116,111,100,105,118,101, 114,115,97,115,115,117,112,117,101,115,116,111,102,97,99,116,111,114,101,115,115 ,101,103,117,110,100,111,115,112,101,113,117,101,195,177,97,208,179,208,190,208, 180,208,176,208,181,209,129,208,187,208,184,208,181,209,129,209,130,209,140,208, 177,209,139,208,187,208,190,208,177,209,139,209,130,209,140,209,141,209,130,208, 190,208,188,208,149,209,129,208,187,208,184,209,130,208,190,208,179,208,190,208, 188,208,181,208,189,209,143,208,178,209,129,208,181,209,133,209,141,209,130,208, 190,208,185,208,180,208,176,208,182,208,181,208,177,209,139,208,187,208,184,208, 179,208,190,208,180,209,131,208,180,208,181,208,189,209,140,209,141,209,130,208, 190,209,130,208,177,209,139,208,187,208,176,209,129,208,181,208,177,209,143,208, 190,208,180,208,184,208,189,209,129,208,181,208,177,208,181,208,189,208,176,208, 180,208,190,209,129,208,176,208,185,209,130,209,132,208,190,209,130,208,190,208, 189,208,181,208,179,208,190,209,129,208,178,208,190,208,184,209,129,208,178,208, 190,208,185,208,184,208,179,209,128,209,139,209,130,208,190,208,182,208,181,208, 178,209,129,208,181,208,188,209,129,208,178,208,190,209,142,208,187,208,184,209, 136,209,140,209,141,209,130,208,184,209,133,208,191,208,190,208,186,208,176,208, 180,208,189,208,181,208,185,208,180,208,190,208,188,208,176,208,188,208,184,209, 128,208,176,208,187,208,184,208,177,208,190,209,130,208,181,208,188,209,131,209, 133,208,190,209,130,209,143,208,180,208,178,209,131,209,133,209,129,208,181,209, 130,208,184,208,187,209,142,208,180,208,184,208,180,208,181,208,187,208,190,208, 188,208,184,209,128,208,181,209,130,208,181,208,177,209,143,209,129,208,178,208, 190,208,181,208,178,208,184,208,180,208,181,209,135,208,181,208,179,208,190,209, 141,209,130,208,184,208,188,209,129,209,135,208,181,209,130,209,130,208,181,208, 188,209,139,209,134,208,181,208,189,209,139,209,129,209,130,208,176,208,187,208, 178,208,181,208,180,209,140,209,130,208,181,208,188,208,181,208,178,208,190,208, 180,209,139,209,130,208,181,208,177,208,181,208,178,209,139,209,136,208,181,208, 189,208,176,208,188,208,184,209,130,208,184,208,191,208,176,209,130,208,190,208, 188,209,131,208,191,209,128,208,176,208,178,208,187,208,184,209,134,208,176,208, 190,208,180,208,189,208,176,208,179,208,190,208,180,209,139,208,183,208,189,208, 176,209,142,208,188,208,190,208,179,209,131,208,180,209,128,209,131,208,179,208, 178,209,129,208,181,208,185,208,184,208,180,208,181,209,130,208,186,208,184,208, 189,208,190,208,190,208,180,208,189,208,190,208,180,208,181,208,187,208,176,208, 180,208,181,208,187,208,181,209,129,209,128,208,190,208,186,208,184,209,142,208, 189,209,143,208,178,208,181,209,129,209,140,208,149,209,129,209,130,209,140,209, 128,208,176,208,183,208,176,208,189,208,176,209,136,208,184,216,167,217,132,217, 132,217,135,216,167,217,132,216,170,217,138,216,172,217,133,217,138,216,185,216, 174,216,167,216,181,216,169,216,167,217,132,216,176,217,138,216,185,217,132,217, 138,217,135,216,172,216,175,217,138,216,175,216,167,217,132,216,162,217,134,216, 167,217,132,216,177,216,175,216,170,216,173,217,131,217,133,216,181,217,129,216, 173,216,169,217,131,216,167,217,134,216,170,216,167,217,132,217,132,217,138,217, 138,217,131,217,136,217,134,216,180,216,168,217,131,216,169,217,129,217,138,217, 135,216,167,216,168,217,134,216,167,216,170,216,173,217,136,216,167,216,161,216, 163,217,131,216,171,216,177,216,174,217,132,216,167,217,132,216,167,217,132,216, 173,216,168,216,175,217,132,217,138,217,132,216,175,216,177,217,136,216,179,216, 167,216,182,216,186,216,183,216,170,217,131,217,136,217,134,217,135,217,134,216, 167,217,131,216,179,216,167,216,173,216,169,217,134,216,167,216,175,217,138,216, 167,217,132,216,183,216,168,216,185,217,132,217,138,217,131,216,180,217,131,216, 177,216,167,217,138,217,133,217,131,217,134,217,133,217,134,217,135,216,167,216, 180,216,177,217,131,216,169,216,177,216,166,217,138,216,179,217,134,216,180,217, 138,216,183,217,133,216,167,216,176,216,167,216,167,217,132,217,129,217,134,216, 180,216,168,216,167,216,168,216,170,216,185,216,168,216,177,216,177,216,173,217, 133,216,169,217,131,216,167,217,129,216,169,217,138,217,130,217,136,217,132,217, 133,216,177,217,131,216,178,217,131,217,132,217,133,216,169,216,163,216,173,217, 133,216,175,217,130,217,132,216,168,217,138,217,138,216,185,217,134,217,138,216, 181,217,136,216,177,216,169,216,183,216,177,217,138,217,130,216,180,216,167,216, 177,217,131,216,172,217,136,216,167,217,132,216,163,216,174,216,177,217,137,217, 133,216,185,217,134,216,167,216,167,216,168,216,173,216,171,216,185,216,177,217, 136,216,182,216,168,216,180,217,131,217,132,217,133,216,179,216,172,217,132,216, 168,217,134,216,167,217,134,216,174,216,167,217,132,216,175,217,131,216,170,216, 167,216,168,217,131,217,132,217,138,216,169,216,168,216,175,217,136,217,134,216, 163,217,138,216,182,216,167,217,138,217,136,216,172,216,175,217,129,216,177,217, 138,217,130,217,131,216,170,216,168,216,170,216,163,217,129,216,182,217,132,217, 133,216,183,216,168,216,174,216,167,217,131,216,171,216,177,216,168,216,167,216, 177,217,131,216,167,217,129,216,182,217,132,216,167,216,173,217,132,217,137,217, 134,217,129,216,179,217,135,216,163,217,138,216,167,217,133,216,177,216,175,217, 136,216,175,216,163,217,134,217,135,216,167,216,175,217,138,217,134,216,167,216, 167,217,132,216,167,217,134,217,133,216,185,216,177,216,182,216,170,216,185,217, 132,217,133,216,175,216,167,216,174,217,132,217,133,217,133,217,131,217,134,0,0, 0,0,0,0,0,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,0,1,2,3,4,5,6,7,7,6, 5,4,3,2,1,0,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,16,17,18,19,20,21,22,23, 23,22,21,20,19,18,17,16,24,25,26,27,28,29,30,31,31,30,29,28,27,26,25,24,255,255, 255,255,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0, 3,0,0,0,255,255,0,1,0,0,0,1,0,0,255,255,0,1,0,0,0,8,0,8,0,8,0,8,0,0,0,1,0,2,0,3, 0,4,0,5,0,6,0,7,114,101,115,111,117,114,99,101,115,99,111,117,110,116,114,105, 101,115,113,117,101,115,116,105,111,110,115,101,113,117,105,112,109,101,110,116, 99,111,109,109,117,110,105,116,121,97,118,97,105,108,97,98,108,101,104,105,103, 104,108,105,103,104,116,68,84,68,47,120,104,116,109,108,109,97,114,107,101,116, 105,110,103,107,110,111,119,108,101,100,103,101,115,111,109,101,116,104,105,110, 103,99,111,110,116,97,105,110,101,114,100,105,114,101,99,116,105,111,110,115,117 ,98,115,99,114,105,98,101,97,100,118,101,114,116,105,115,101,99,104,97,114,97,99 ,116,101,114,34,32,118,97,108,117,101,61,34,60,47,115,101,108,101,99,116,62,65, 117,115,116,114,97,108,105,97,34,32,99,108,97,115,115,61,34,115,105,116,117,97, 116,105,111,110,97,117,116,104,111,114,105,116,121,102,111,108,108,111,119,105, 110,103,112,114,105,109,97,114,105,108,121,111,112,101,114,97,116,105,111,110,99 ,104,97,108,108,101,110,103,101,100,101,118,101,108,111,112,101,100,97,110,111, 110,121,109,111,117,115,102,117,110,99,116,105,111,110,32,102,117,110,99,116,105 ,111,110,115,99,111,109,112,97,110,105,101,115,115,116,114,117,99,116,117,114, 101,97,103,114,101,101,109,101,110,116,34,32,116,105,116,108,101,61,34,112,111, 116,101,110,116,105,97,108,101,100,117,99,97,116,105,111,110,97,114,103,117,109, 101,110,116,115,115,101,99,111,110,100,97,114,121,99,111,112,121,114,105,103,104 ,116,108,97,110,103,117,97,103,101,115,101,120,99,108,117,115,105,118,101,99,111 ,110,100,105,116,105,111,110,60,47,102,111,114,109,62,13,10,115,116,97,116,101, 109,101,110,116,97,116,116,101,110,116,105,111,110,66,105,111,103,114,97,112,104 ,121,125,32,101,108,115,101,32,123,10,115,111,108,117,116,105,111,110,115,119, 104,101,110,32,116,104,101,32,65,110,97,108,121,116,105,99,115,116,101,109,112, 108,97,116,101,115,100,97,110,103,101,114,111,117,115,115,97,116,101,108,108,105 ,116,101,100,111,99,117,109,101,110,116,115,112,117,98,108,105,115,104,101,114, 105,109,112,111,114,116,97,110,116,112,114,111,116,111,116,121,112,101,105,110, 102,108,117,101,110,99,101,38,114,97,113,117,111,59,60,47,101,102,102,101,99,116 ,105,118,101,103,101,110,101,114,97,108,108,121,116,114,97,110,115,102,111,114, 109,98,101,97,117,116,105,102,117,108,116,114,97,110,115,112,111,114,116,111,114 ,103,97,110,105,122,101,100,112,117,98,108,105,115,104,101,100,112,114,111,109, 105,110,101,110,116,117,110,116,105,108,32,116,104,101,116,104,117,109,98,110,97 ,105,108,78,97,116,105,111,110,97,108,32,46,102,111,99,117,115,40,41,59,111,118, 101,114,32,116,104,101,32,109,105,103,114,97,116,105,111,110,97,110,110,111,117, 110,99,101,100,102,111,111,116,101,114,34,62,10,101,120,99,101,112,116,105,111, 110,108,101,115,115,32,116,104,97,110,101,120,112,101,110,115,105,118,101,102, 111,114,109,97,116,105,111,110,102,114,97,109,101,119,111,114,107,116,101,114, 114,105,116,111,114,121,110,100,105,99,97,116,105,111,110,99,117,114,114,101,110 ,116,108,121,99,108,97,115,115,78,97,109,101,99,114,105,116,105,99,105,115,109, 116,114,97,100,105,116,105,111,110,101,108,115,101,119,104,101,114,101,65,108, 101,120,97,110,100,101,114,97,112,112,111,105,110,116,101,100,109,97,116,101,114 ,105,97,108,115,98,114,111,97,100,99,97,115,116,109,101,110,116,105,111,110,101, 100,97,102,102,105,108,105,97,116,101,60,47,111,112,116,105,111,110,62,116,114, 101,97,116,109,101,110,116,100,105,102,102,101,114,101,110,116,47,100,101,102,97 ,117,108,116,46,80,114,101,115,105,100,101,110,116,111,110,99,108,105,99,107,61, 34,98,105,111,103,114,97,112,104,121,111,116,104,101,114,119,105,115,101,112,101 ,114,109,97,110,101,110,116,70,114,97,110,195,167,97,105,115,72,111,108,108,121, 119,111,111,100,101,120,112,97,110,115,105,111,110,115,116,97,110,100,97,114,100 ,115,60,47,115,116,121,108,101,62,10,114,101,100,117,99,116,105,111,110,68,101, 99,101,109,98,101,114,32,112,114,101,102,101,114,114,101,100,67,97,109,98,114, 105,100,103,101,111,112,112,111,110,101,110,116,115,66,117,115,105,110,101,115, 115,32,99,111,110,102,117,115,105,111,110,62,10,60,116,105,116,108,101,62,112, 114,101,115,101,110,116,101,100,101,120,112,108,97,105,110,101,100,100,111,101, 115,32,110,111,116,32,119,111,114,108,100,119,105,100,101,105,110,116,101,114, 102,97,99,101,112,111,115,105,116,105,111,110,115,110,101,119,115,112,97,112,101 ,114,60,47,116,97,98,108,101,62,10,109,111,117,110,116,97,105,110,115,108,105, 107,101,32,116,104,101,32,101,115,115,101,110,116,105,97,108,102,105,110,97,110, 99,105,97,108,115,101,108,101,99,116,105,111,110,97,99,116,105,111,110,61,34,47, 97,98,97,110,100,111,110,101,100,69,100,117,99,97,116,105,111,110,112,97,114,115 ,101,73,110,116,40,115,116,97,98,105,108,105,116,121,117,110,97,98,108,101,32, 116,111,60,47,116,105,116,108,101,62,10,114,101,108,97,116,105,111,110,115,78, 111,116,101,32,116,104,97,116,101,102,102,105,99,105,101,110,116,112,101,114,102 ,111,114,109,101,100,116,119,111,32,121,101,97,114,115,83,105,110,99,101,32,116, 104,101,116,104,101,114,101,102,111,114,101,119,114,97,112,112,101,114,34,62,97, 108,116,101,114,110,97,116,101,105,110,99,114,101,97,115,101,100,66,97,116,116, 108,101,32,111,102,112,101,114,99,101,105,118,101,100,116,114,121,105,110,103,32 ,116,111,110,101,99,101,115,115,97,114,121,112,111,114,116,114,97,121,101,100, 101,108,101,99,116,105,111,110,115,69,108,105,122,97,98,101,116,104,60,47,105, 102,114,97,109,101,62,100,105,115,99,111,118,101,114,121,105,110,115,117,114,97, 110,99,101,115,46,108,101,110,103,116,104,59,108,101,103,101,110,100,97,114,121, 71,101,111,103,114,97,112,104,121,99,97,110,100,105,100,97,116,101,99,111,114, 112,111,114,97,116,101,115,111,109,101,116,105,109,101,115,115,101,114,118,105, 99,101,115,46,105,110,104,101,114,105,116,101,100,60,47,115,116,114,111,110,103, 62,67,111,109,109,117,110,105,116,121,114,101,108,105,103,105,111,117,115,108, 111,99,97,116,105,111,110,115,67,111,109,109,105,116,116,101,101,98,117,105,108, 100,105,110,103,115,116,104,101,32,119,111,114,108,100,110,111,32,108,111,110, 103,101,114,98,101,103,105,110,110,105,110,103,114,101,102,101,114,101,110,99, 101,99,97,110,110,111,116,32,98,101,102,114,101,113,117,101,110,99,121,116,121, 112,105,99,97,108,108,121,105,110,116,111,32,116,104,101,32,114,101,108,97,116, 105,118,101,59,114,101,99,111,114,100,105,110,103,112,114,101,115,105,100,101, 110,116,105,110,105,116,105,97,108,108,121,116,101,99,104,110,105,113,117,101, 116,104,101,32,111,116,104,101,114,105,116,32,99,97,110,32,98,101,101,120,105, 115,116,101,110,99,101,117,110,100,101,114,108,105,110,101,116,104,105,115,32, 116,105,109,101,116,101,108,101,112,104,111,110,101,105,116,101,109,115,99,111, 112,101,112,114,97,99,116,105,99,101,115,97,100,118,97,110,116,97,103,101,41,59, 114,101,116,117,114,110,32,70,111,114,32,111,116,104,101,114,112,114,111,118,105 ,100,105,110,103,100,101,109,111,99,114,97,99,121,98,111,116,104,32,116,104,101, 32,101,120,116,101,110,115,105,118,101,115,117,102,102,101,114,105,110,103,115, 117,112,112,111,114,116,101,100,99,111,109,112,117,116,101,114,115,32,102,117, 110,99,116,105,111,110,112,114,97,99,116,105,99,97,108,115,97,105,100,32,116,104 ,97,116,105,116,32,109,97,121,32,98,101,69,110,103,108,105,115,104,60,47,102,114 ,111,109,32,116,104,101,32,115,99,104,101,100,117,108,101,100,100,111,119,110, 108,111,97,100,115,60,47,108,97,98,101,108,62,10,115,117,115,112,101,99,116,101, 100,109,97,114,103,105,110,58,32,48,115,112,105,114,105,116,117,97,108,60,47,104 ,101,97,100,62,10,10,109,105,99,114,111,115,111,102,116,103,114,97,100,117,97, 108,108,121,100,105,115,99,117,115,115,101,100,104,101,32,98,101,99,97,109,101, 101,120,101,99,117,116,105,118,101,106,113,117,101,114,121,46,106,115,104,111, 117,115,101,104,111,108,100,99,111,110,102,105,114,109,101,100,112,117,114,99, 104,97,115,101,100,108,105,116,101,114,97,108,108,121,100,101,115,116,114,111, 121,101,100,117,112,32,116,111,32,116,104,101,118,97,114,105,97,116,105,111,110, 114,101,109,97,105,110,105,110,103,105,116,32,105,115,32,110,111,116,99,101,110, 116,117,114,105,101,115,74,97,112,97,110,101,115,101,32,97,109,111,110,103,32, 116,104,101,99,111,109,112,108,101,116,101,100,97,108,103,111,114,105,116,104, 109,105,110,116,101,114,101,115,116,115,114,101,98,101,108,108,105,111,110,117, 110,100,101,102,105,110,101,100,101,110,99,111,117,114,97,103,101,114,101,115, 105,122,97,98,108,101,105,110,118,111,108,118,105,110,103,115,101,110,115,105, 116,105,118,101,117,110,105,118,101,114,115,97,108,112,114,111,118,105,115,105, 111,110,40,97,108,116,104,111,117,103,104,102,101,97,116,117,114,105,110,103,99, 111,110,100,117,99,116,101,100,41,44,32,119,104,105,99,104,32,99,111,110,116,105 ,110,117,101,100,45,104,101,97,100,101,114,34,62,70,101,98,114,117,97,114,121,32 ,110,117,109,101,114,111,117,115,32,111,118,101,114,102,108,111,119,58,99,111, 109,112,111,110,101,110,116,102,114,97,103,109,101,110,116,115,101,120,99,101, 108,108,101,110,116,99,111,108,115,112,97,110,61,34,116,101,99,104,110,105,99,97 ,108,110,101,97,114,32,116,104,101,32,65,100,118,97,110,99,101,100,32,115,111, 117,114,99,101,32,111,102,101,120,112,114,101,115,115,101,100,72,111,110,103,32, 75,111,110,103,32,70,97,99,101,98,111,111,107,109,117,108,116,105,112,108,101,32 ,109,101,99,104,97,110,105,115,109,101,108,101,118,97,116,105,111,110,111,102, 102,101,110,115,105,118,101,60,47,102,111,114,109,62,10,9,115,112,111,110,115, 111,114,101,100,100,111,99,117,109,101,110,116,46,111,114,32,38,113,117,111,116, 59,116,104,101,114,101,32,97,114,101,116,104,111,115,101,32,119,104,111,109,111, 118,101,109,101,110,116,115,112,114,111,99,101,115,115,101,115,100,105,102,102, 105,99,117,108,116,115,117,98,109,105,116,116,101,100,114,101,99,111,109,109,101 ,110,100,99,111,110,118,105,110,99,101,100,112,114,111,109,111,116,105,110,103, 34,32,119,105,100,116,104,61,34,46,114,101,112,108,97,99,101,40,99,108,97,115, 115,105,99,97,108,99,111,97,108,105,116,105,111,110,104,105,115,32,102,105,114, 115,116,100,101,99,105,115,105,111,110,115,97,115,115,105,115,116,97,110,116,105 ,110,100,105,99,97,116,101,100,101,118,111,108,117,116,105,111,110,45,119,114,97 ,112,112,101,114,34,101,110,111,117,103,104,32,116,111,97,108,111,110,103,32,116 ,104,101,100,101,108,105,118,101,114,101,100,45,45,62,13,10,60,33,45,45,65,109, 101,114,105,99,97,110,32,112,114,111,116,101,99,116,101,100,78,111,118,101,109, 98,101,114,32,60,47,115,116,121,108,101,62,60,102,117,114,110,105,116,117,114, 101,73,110,116,101,114,110,101,116,32,32,111,110,98,108,117,114,61,34,115,117, 115,112,101,110,100,101,100,114,101,99,105,112,105,101,110,116,98,97,115,101,100 ,32,111,110,32,77,111,114,101,111,118,101,114,44,97,98,111,108,105,115,104,101, 100,99,111,108,108,101,99,116,101,100,119,101,114,101,32,109,97,100,101,101,109, 111,116,105,111,110,97,108,101,109,101,114,103,101,110,99,121,110,97,114,114,97, 116,105,118,101,97,100,118,111,99,97,116,101,115,112,120,59,98,111,114,100,101, 114,99,111,109,109,105,116,116,101,100,100,105,114,61,34,108,116,114,34,101,109, 112,108,111,121,101,101,115,114,101,115,101,97,114,99,104,46,32,115,101,108,101, 99,116,101,100,115,117,99,99,101,115,115,111,114,99,117,115,116,111,109,101,114, 115,100,105,115,112,108,97,121,101,100,83,101,112,116,101,109,98,101,114,97,100, 100,67,108,97,115,115,40,70,97,99,101,98,111,111,107,32,115,117,103,103,101,115, 116,101,100,97,110,100,32,108,97,116,101,114,111,112,101,114,97,116,105,110,103, 101,108,97,98,111,114,97,116,101,83,111,109,101,116,105,109,101,115,73,110,115, 116,105,116,117,116,101,99,101,114,116,97,105,110,108,121,105,110,115,116,97,108 ,108,101,100,102,111,108,108,111,119,101,114,115,74,101,114,117,115,97,108,101, 109,116,104,101,121,32,104,97,118,101,99,111,109,112,117,116,105,110,103,103,101 ,110,101,114,97,116,101,100,112,114,111,118,105,110,99,101,115,103,117,97,114,97 ,110,116,101,101,97,114,98,105,116,114,97,114,121,114,101,99,111,103,110,105,122 ,101,119,97,110,116,101,100,32,116,111,112,120,59,119,105,100,116,104,58,116,104 ,101,111,114,121,32,111,102,98,101,104,97,118,105,111,117,114,87,104,105,108,101 ,32,116,104,101,101,115,116,105,109,97,116,101,100,98,101,103,97,110,32,116,111, 32,105,116,32,98,101,99,97,109,101,109,97,103,110,105,116,117,100,101,109,117, 115,116,32,104,97,118,101,109,111,114,101,32,116,104,97,110,68,105,114,101,99, 116,111,114,121,101,120,116,101,110,115,105,111,110,115,101,99,114,101,116,97, 114,121,110,97,116,117,114,97,108,108,121,111,99,99,117,114,114,105,110,103,118, 97,114,105,97,98,108,101,115,103,105,118,101,110,32,116,104,101,112,108,97,116, 102,111,114,109,46,60,47,108,97,98,101,108,62,60,102,97,105,108,101,100,32,116, 111,99,111,109,112,111,117,110,100,115,107,105,110,100,115,32,111,102,32,115,111 ,99,105,101,116,105,101,115,97,108,111,110,103,115,105,100,101,32,45,45,38,103, 116,59,10,10,115,111,117,116,104,119,101,115,116,116,104,101,32,114,105,103,104, 116,114,97,100,105,97,116,105,111,110,109,97,121,32,104,97,118,101,32,117,110, 101,115,99,97,112,101,40,115,112,111,107,101,110,32,105,110,34,32,104,114,101, 102,61,34,47,112,114,111,103,114,97,109,109,101,111,110,108,121,32,116,104,101, 32,99,111,109,101,32,102,114,111,109,100,105,114,101,99,116,111,114,121,98,117, 114,105,101,100,32,105,110,97,32,115,105,109,105,108,97,114,116,104,101,121,32, 119,101,114,101,60,47,102,111,110,116,62,60,47,78,111,114,119,101,103,105,97,110 ,115,112,101,99,105,102,105,101,100,112,114,111,100,117,99,105,110,103,112,97, 115,115,101,110,103,101,114,40,110,101,119,32,68,97,116,101,116,101,109,112,111, 114,97,114,121,102,105,99,116,105,111,110,97,108,65,102,116,101,114,32,116,104, 101,101,113,117,97,116,105,111,110,115,100,111,119,110,108,111,97,100,46,114,101 ,103,117,108,97,114,108,121,100,101,118,101,108,111,112,101,114,97,98,111,118, 101,32,116,104,101,108,105,110,107,101,100,32,116,111,112,104,101,110,111,109, 101,110,97,112,101,114,105,111,100,32,111,102,116,111,111,108,116,105,112,34,62, 115,117,98,115,116,97,110,99,101,97,117,116,111,109,97,116,105,99,97,115,112,101 ,99,116,32,111,102,65,109,111,110,103,32,116,104,101,99,111,110,110,101,99,116, 101,100,101,115,116,105,109,97,116,101,115,65,105,114,32,70,111,114,99,101,115, 121,115,116,101,109,32,111,102,111,98,106,101,99,116,105,118,101,105,109,109,101 ,100,105,97,116,101,109,97,107,105,110,103,32,105,116,112,97,105,110,116,105,110 ,103,115,99,111,110,113,117,101,114,101,100,97,114,101,32,115,116,105,108,108, 112,114,111,99,101,100,117,114,101,103,114,111,119,116,104,32,111,102,104,101,97 ,100,101,100,32,98,121,69,117,114,111,112,101,97,110,32,100,105,118,105,115,105, 111,110,115,109,111,108,101,99,117,108,101,115,102,114,97,110,99,104,105,115,101 ,105,110,116,101,110,116,105,111,110,97,116,116,114,97,99,116,101,100,99,104,105 ,108,100,104,111,111,100,97,108,115,111,32,117,115,101,100,100,101,100,105,99,97 ,116,101,100,115,105,110,103,97,112,111,114,101,100,101,103,114,101,101,32,111, 102,102,97,116,104,101,114,32,111,102,99,111,110,102,108,105,99,116,115,60,47,97 ,62,60,47,112,62,10,99,97,109,101,32,102,114,111,109,119,101,114,101,32,117,115, 101,100,110,111,116,101,32,116,104,97,116,114,101,99,101,105,118,105,110,103,69, 120,101,99,117,116,105,118,101,101,118,101,110,32,109,111,114,101,97,99,99,101, 115,115,32,116,111,99,111,109,109,97,110,100,101,114,80,111,108,105,116,105,99, 97,108,109,117,115,105,99,105,97,110,115,100,101,108,105,99,105,111,117,115,112, 114,105,115,111,110,101,114,115,97,100,118,101,110,116,32,111,102,85,84,70,45,56 ,34,32,47,62,60,33,91,67,68,65,84,65,91,34,62,67,111,110,116,97,99,116,83,111, 117,116,104,101,114,110,32,98,103,99,111,108,111,114,61,34,115,101,114,105,101, 115,32,111,102,46,32,73,116,32,119,97,115,32,105,110,32,69,117,114,111,112,101, 112,101,114,109,105,116,116,101,100,118,97,108,105,100,97,116,101,46,97,112,112, 101,97,114,105,110,103,111,102,102,105,99,105,97,108,115,115,101,114,105,111,117 ,115,108,121,45,108,97,110,103,117,97,103,101,105,110,105,116,105,97,116,101,100 ,101,120,116,101,110,100,105,110,103,108,111,110,103,45,116,101,114,109,105,110, 102,108,97,116,105,111,110,115,117,99,104,32,116,104,97,116,103,101,116,67,111, 111,107,105,101,109,97,114,107,101,100,32,98,121,60,47,98,117,116,116,111,110,62 ,105,109,112,108,101,109,101,110,116,98,117,116,32,105,116,32,105,115,105,110,99 ,114,101,97,115,101,115,100,111,119,110,32,116,104,101,32,114,101,113,117,105, 114,105,110,103,100,101,112,101,110,100,101,110,116,45,45,62,10,60,33,45,45,32, 105,110,116,101,114,118,105,101,119,87,105,116,104,32,116,104,101,32,99,111,112, 105,101,115,32,111,102,99,111,110,115,101,110,115,117,115,119,97,115,32,98,117, 105,108,116,86,101,110,101,122,117,101,108,97,40,102,111,114,109,101,114,108,121 ,116,104,101,32,115,116,97,116,101,112,101,114,115,111,110,110,101,108,115,116, 114,97,116,101,103,105,99,102,97,118,111,117,114,32,111,102,105,110,118,101,110, 116,105,111,110,87,105,107,105,112,101,100,105,97,99,111,110,116,105,110,101,110 ,116,118,105,114,116,117,97,108,108,121,119,104,105,99,104,32,119,97,115,112,114 ,105,110,99,105,112,108,101,67,111,109,112,108,101,116,101,32,105,100,101,110, 116,105,99,97,108,115,104,111,119,32,116,104,97,116,112,114,105,109,105,116,105, 118,101,97,119,97,121,32,102,114,111,109,109,111,108,101,99,117,108,97,114,112, 114,101,99,105,115,101,108,121,100,105,115,115,111,108,118,101,100,85,110,100, 101,114,32,116,104,101,118,101,114,115,105,111,110,61,34,62,38,110,98,115,112,59 ,60,47,73,116,32,105,115,32,116,104,101,32,84,104,105,115,32,105,115,32,119,105, 108,108,32,104,97,118,101,111,114,103,97,110,105,115,109,115,115,111,109,101,32, 116,105,109,101,70,114,105,101,100,114,105,99,104,119,97,115,32,102,105,114,115, 116,116,104,101,32,111,110,108,121,32,102,97,99,116,32,116,104,97,116,102,111, 114,109,32,105,100,61,34,112,114,101,99,101,100,105,110,103,84,101,99,104,110, 105,99,97,108,112,104,121,115,105,99,105,115,116,111,99,99,117,114,115,32,105, 110,110,97,118,105,103,97,116,111,114,115,101,99,116,105,111,110,34,62,115,112, 97,110,32,105,100,61,34,115,111,117,103,104,116,32,116,111,98,101,108,111,119,32 ,116,104,101,115,117,114,118,105,118,105,110,103,125,60,47,115,116,121,108,101, 62,104,105,115,32,100,101,97,116,104,97,115,32,105,110,32,116,104,101,99,97,117, 115,101,100,32,98,121,112,97,114,116,105,97,108,108,121,101,120,105,115,116,105, 110,103,32,117,115,105,110,103,32,116,104,101,119,97,115,32,103,105,118,101,110, 97,32,108,105,115,116,32,111,102,108,101,118,101,108,115,32,111,102,110,111,116, 105,111,110,32,111,102,79,102,102,105,99,105,97,108,32,100,105,115,109,105,115, 115,101,100,115,99,105,101,110,116,105,115,116,114,101,115,101,109,98,108,101, 115,100,117,112,108,105,99,97,116,101,101,120,112,108,111,115,105,118,101,114, 101,99,111,118,101,114,101,100,97,108,108,32,111,116,104,101,114,103,97,108,108, 101,114,105,101,115,123,112,97,100,100,105,110,103,58,112,101,111,112,108,101,32 ,111,102,114,101,103,105,111,110,32,111,102,97,100,100,114,101,115,115,101,115, 97,115,115,111,99,105,97,116,101,105,109,103,32,97,108,116,61,34,105,110,32,109, 111,100,101,114,110,115,104,111,117,108,100,32,98,101,109,101,116,104,111,100,32 ,111,102,114,101,112,111,114,116,105,110,103,116,105,109,101,115,116,97,109,112, 110,101,101,100,101,100,32,116,111,116,104,101,32,71,114,101,97,116,114,101,103, 97,114,100,105,110,103,115,101,101,109,101,100,32,116,111,118,105,101,119,101, 100,32,97,115,105,109,112,97,99,116,32,111,110,105,100,101,97,32,116,104,97,116, 116,104,101,32,87,111,114,108,100,104,101,105,103,104,116,32,111,102,101,120,112 ,97,110,100,105,110,103,84,104,101,115,101,32,97,114,101,99,117,114,114,101,110, 116,34,62,99,97,114,101,102,117,108,108,121,109,97,105,110,116,97,105,110,115,99 ,104,97,114,103,101,32,111,102,67,108,97,115,115,105,99,97,108,97,100,100,114, 101,115,115,101,100,112,114,101,100,105,99,116,101,100,111,119,110,101,114,115, 104,105,112,60,100,105,118,32,105,100,61,34,114,105,103,104,116,34,62,13,10,114, 101,115,105,100,101,110,99,101,108,101,97,118,101,32,116,104,101,99,111,110,116, 101,110,116,34,62,97,114,101,32,111,102,116,101,110,32,32,125,41,40,41,59,13,10, 112,114,111,98,97,98,108,121,32,80,114,111,102,101,115,115,111,114,45,98,117,116 ,116,111,110,34,32,114,101,115,112,111,110,100,101,100,115,97,121,115,32,116,104 ,97,116,104,97,100,32,116,111,32,98,101,112,108,97,99,101,100,32,105,110,72,117, 110,103,97,114,105,97,110,115,116,97,116,117,115,32,111,102,115,101,114,118,101, 115,32,97,115,85,110,105,118,101,114,115,97,108,101,120,101,99,117,116,105,111, 110,97,103,103,114,101,103,97,116,101,102,111,114,32,119,104,105,99,104,105,110, 102,101,99,116,105,111,110,97,103,114,101,101,100,32,116,111,104,111,119,101,118 ,101,114,44,32,112,111,112,117,108,97,114,34,62,112,108,97,99,101,100,32,111,110 ,99,111,110,115,116,114,117,99,116,101,108,101,99,116,111,114,97,108,115,121,109 ,98,111,108,32,111,102,105,110,99,108,117,100,105,110,103,114,101,116,117,114, 110,32,116,111,97,114,99,104,105,116,101,99,116,67,104,114,105,115,116,105,97, 110,112,114,101,118,105,111,117,115,32,108,105,118,105,110,103,32,105,110,101,97 ,115,105,101,114,32,116,111,112,114,111,102,101,115,115,111,114,10,38,108,116,59 ,33,45,45,32,101,102,102,101,99,116,32,111,102,97,110,97,108,121,116,105,99,115, 119,97,115,32,116,97,107,101,110,119,104,101,114,101,32,116,104,101,116,111,111, 107,32,111,118,101,114,98,101,108,105,101,102,32,105,110,65,102,114,105,107,97, 97,110,115,97,115,32,102,97,114,32,97,115,112,114,101,118,101,110,116,101,100, 119,111,114,107,32,119,105,116,104,97,32,115,112,101,99,105,97,108,60,102,105, 101,108,100,115,101,116,67,104,114,105,115,116,109,97,115,82,101,116,114,105,101 ,118,101,100,10,10,73,110,32,116,104,101,32,98,97,99,107,32,105,110,116,111,110, 111,114,116,104,101,97,115,116,109,97,103,97,122,105,110,101,115,62,60,115,116, 114,111,110,103,62,99,111,109,109,105,116,116,101,101,103,111,118,101,114,110, 105,110,103,103,114,111,117,112,115,32,111,102,115,116,111,114,101,100,32,105, 110,101,115,116,97,98,108,105,115,104,97,32,103,101,110,101,114,97,108,105,116, 115,32,102,105,114,115,116,116,104,101,105,114,32,111,119,110,112,111,112,117, 108,97,116,101,100,97,110,32,111,98,106,101,99,116,67,97,114,105,98,98,101,97, 110,97,108,108,111,119,32,116,104,101,100,105,115,116,114,105,99,116,115,119,105 ,115,99,111,110,115,105,110,108,111,99,97,116,105,111,110,46,59,32,119,105,100, 116,104,58,32,105,110,104,97,98,105,116,101,100,83,111,99,105,97,108,105,115,116 ,74,97,110,117,97,114,121,32,49,60,47,102,111,111,116,101,114,62,115,105,109,105 ,108,97,114,108,121,99,104,111,105,99,101,32,111,102,116,104,101,32,115,97,109, 101,32,115,112,101,99,105,102,105,99,32,98,117,115,105,110,101,115,115,32,84,104 ,101,32,102,105,114,115,116,46,108,101,110,103,116,104,59,32,100,101,115,105,114 ,101,32,116,111,100,101,97,108,32,119,105,116,104,115,105,110,99,101,32,116,104, 101,117,115,101,114,65,103,101,110,116,99,111,110,99,101,105,118,101,100,105,110 ,100,101,120,46,112,104,112,97,115,32,38,113,117,111,116,59,101,110,103,97,103, 101,32,105,110,114,101,99,101,110,116,108,121,44,102,101,119,32,121,101,97,114, 115,119,101,114,101,32,97,108,115,111,10,60,104,101,97,100,62,10,60,101,100,105, 116,101,100,32,98,121,97,114,101,32,107,110,111,119,110,99,105,116,105,101,115, 32,105,110,97,99,99,101,115,115,107,101,121,99,111,110,100,101,109,110,101,100, 97,108,115,111,32,104,97,118,101,115,101,114,118,105,99,101,115,44,102,97,109, 105,108,121,32,111,102,83,99,104,111,111,108,32,111,102,99,111,110,118,101,114, 116,101,100,110,97,116,117,114,101,32,111,102,32,108,97,110,103,117,97,103,101, 109,105,110,105,115,116,101,114,115,60,47,111,98,106,101,99,116,62,116,104,101, 114,101,32,105,115,32,97,32,112,111,112,117,108,97,114,115,101,113,117,101,110, 99,101,115,97,100,118,111,99,97,116,101,100,84,104,101,121,32,119,101,114,101,97 ,110,121,32,111,116,104,101,114,108,111,99,97,116,105,111,110,61,101,110,116,101 ,114,32,116,104,101,109,117,99,104,32,109,111,114,101,114,101,102,108,101,99,116 ,101,100,119,97,115,32,110,97,109,101,100,111,114,105,103,105,110,97,108,32,97, 32,116,121,112,105,99,97,108,119,104,101,110,32,116,104,101,121,101,110,103,105, 110,101,101,114,115,99,111,117,108,100,32,110,111,116,114,101,115,105,100,101, 110,116,115,119,101,100,110,101,115,100,97,121,116,104,101,32,116,104,105,114, 100,32,112,114,111,100,117,99,116,115,74,97,110,117,97,114,121,32,50,119,104,97, 116,32,116,104,101,121,97,32,99,101,114,116,97,105,110,114,101,97,99,116,105,111 ,110,115,112,114,111,99,101,115,115,111,114,97,102,116,101,114,32,104,105,115, 116,104,101,32,108,97,115,116,32,99,111,110,116,97,105,110,101,100,34,62,60,47, 100,105,118,62,10,60,47,97,62,60,47,116,100,62,100,101,112,101,110,100,32,111, 110,115,101,97,114,99,104,34,62,10,112,105,101,99,101,115,32,111,102,99,111,109, 112,101,116,105,110,103,82,101,102,101,114,101,110,99,101,116,101,110,110,101, 115,115,101,101,119,104,105,99,104,32,104,97,115,32,118,101,114,115,105,111,110, 61,60,47,115,112,97,110,62,32,60,60,47,104,101,97,100,101,114,62,103,105,118,101 ,115,32,116,104,101,104,105,115,116,111,114,105,97,110,118,97,108,117,101,61,34, 34,62,112,97,100,100,105,110,103,58,48,118,105,101,119,32,116,104,97,116,116,111 ,103,101,116,104,101,114,44,116,104,101,32,109,111,115,116,32,119,97,115,32,102, 111,117,110,100,115,117,98,115,101,116,32,111,102,97,116,116,97,99,107,32,111, 110,99,104,105,108,100,114,101,110,44,112,111,105,110,116,115,32,111,102,112,101 ,114,115,111,110,97,108,32,112,111,115,105,116,105,111,110,58,97,108,108,101,103 ,101,100,108,121,67,108,101,118,101,108,97,110,100,119,97,115,32,108,97,116,101, 114,97,110,100,32,97,102,116,101,114,97,114,101,32,103,105,118,101,110,119,97, 115,32,115,116,105,108,108,115,99,114,111,108,108,105,110,103,100,101,115,105, 103,110,32,111,102,109,97,107,101,115,32,116,104,101,109,117,99,104,32,108,101, 115,115,65,109,101,114,105,99,97,110,115,46,10,10,65,102,116,101,114,32,44,32,98 ,117,116,32,116,104,101,77,117,115,101,117,109,32,111,102,108,111,117,105,115, 105,97,110,97,40,102,114,111,109,32,116,104,101,109,105,110,110,101,115,111,116, 97,112,97,114,116,105,99,108,101,115,97,32,112,114,111,99,101,115,115,68,111,109 ,105,110,105,99,97,110,118,111,108,117,109,101,32,111,102,114,101,116,117,114, 110,105,110,103,100,101,102,101,110,115,105,118,101,48,48,112,120,124,114,105, 103,104,109,97,100,101,32,102,114,111,109,109,111,117,115,101,111,118,101,114,34 ,32,115,116,121,108,101,61,34,115,116,97,116,101,115,32,111,102,40,119,104,105, 99,104,32,105,115,99,111,110,116,105,110,117,101,115,70,114,97,110,99,105,115,99 ,111,98,117,105,108,100,105,110,103,32,119,105,116,104,111,117,116,32,97,119,105 ,116,104,32,115,111,109,101,119,104,111,32,119,111,117,108,100,97,32,102,111,114 ,109,32,111,102,97,32,112,97,114,116,32,111,102,98,101,102,111,114,101,32,105, 116,107,110,111,119,110,32,97,115,32,32,83,101,114,118,105,99,101,115,108,111,99 ,97,116,105,111,110,32,97,110,100,32,111,102,116,101,110,109,101,97,115,117,114, 105,110,103,97,110,100,32,105,116,32,105,115,112,97,112,101,114,98,97,99,107,118 ,97,108,117,101,115,32,111,102,13,10,60,116,105,116,108,101,62,61,32,119,105,110 ,100,111,119,46,100,101,116,101,114,109,105,110,101,101,114,38,113,117,111,116, 59,32,112,108,97,121,101,100,32,98,121,97,110,100,32,101,97,114,108,121,60,47,99 ,101,110,116,101,114,62,102,114,111,109,32,116,104,105,115,116,104,101,32,116, 104,114,101,101,112,111,119,101,114,32,97,110,100,111,102,32,38,113,117,111,116, 59,105,110,110,101,114,72,84,77,76,60,97,32,104,114,101,102,61,34,121,58,105,110 ,108,105,110,101,59,67,104,117,114,99,104,32,111,102,116,104,101,32,101,118,101, 110,116,118,101,114,121,32,104,105,103,104,111,102,102,105,99,105,97,108,32,45, 104,101,105,103,104,116,58,32,99,111,110,116,101,110,116,61,34,47,99,103,105,45, 98,105,110,47,116,111,32,99,114,101,97,116,101,97,102,114,105,107,97,97,110,115, 101,115,112,101,114,97,110,116,111,102,114,97,110,195,167,97,105,115,108,97,116, 118,105,101,197,161,117,108,105,101,116,117,118,105,197,179,196,140,101,197,161, 116,105,110,97,196,141,101,197,161,116,105,110,97,224,185,132,224,184,151,224, 184,162,230,151,165,230,156,172,232,170,158,231,174,128,228,189,147,229,173,151, 231,185,129,233,171,148,229,173,151,237,149,156,234,181,173,236,150,180,228,184, 186,228,187,128,228,185,136,232,174,161,231,174,151,230,156,186,231,172,148,232, 174,176,230,156,172,232,168,142,232,171,150,229,141,128,230,156,141,229,138,161, 229,153,168,228,186,146,232,129,148,231,189,145,230,136,191,229,156,176,228,186, 167,228,191,177,228,185,144,233,131,168,229,135,186,231,137,136,231,164,190,230, 142,146,232,161,140,230,166,156,233,131,168,232,144,189,230,160,188,232,191,155, 228,184,128,230,173,165,230,148,175,228,187,152,229,174,157,233,170,140,232,175, 129,231,160,129,229,167,148,229,145,152,228,188,154,230,149,176,230,141,174,229, 186,147,230,182,136,232,180,185,232,128,133,229,138,158,229,133,172,229,174,164, 232,174,168,232,174,186,229,140,186,230,183,177,229,156,179,229,184,130,230,146, 173,230,148,190,229,153,168,229,140,151,228,186,172,229,184,130,229,164,167,229, 173,166,231,148,159,232,182,138,230,157,165,232,182,138,231,174,161,231,144,134, 229,145,152,228,191,161,230,129,175,231,189,145,115,101,114,118,105,99,105,111, 115,97,114,116,195,173,99,117,108,111,97,114,103,101,110,116,105,110,97,98,97, 114,99,101,108,111,110,97,99,117,97,108,113,117,105,101,114,112,117,98,108,105, 99,97,100,111,112,114,111,100,117,99,116,111,115,112,111,108,195,173,116,105,99, 97,114,101,115,112,117,101,115,116,97,119,105,107,105,112,101,100,105,97,115,105 ,103,117,105,101,110,116,101,98,195,186,115,113,117,101,100,97,99,111,109,117, 110,105,100,97,100,115,101,103,117,114,105,100,97,100,112,114,105,110,99,105,112 ,97,108,112,114,101,103,117,110,116,97,115,99,111,110,116,101,110,105,100,111, 114,101,115,112,111,110,100,101,114,118,101,110,101,122,117,101,108,97,112,114, 111,98,108,101,109,97,115,100,105,99,105,101,109,98,114,101,114,101,108,97,99, 105,195,179,110,110,111,118,105,101,109,98,114,101,115,105,109,105,108,97,114, 101,115,112,114,111,121,101,99,116,111,115,112,114,111,103,114,97,109,97,115,105 ,110,115,116,105,116,117,116,111,97,99,116,105,118,105,100,97,100,101,110,99,117 ,101,110,116,114,97,101,99,111,110,111,109,195,173,97,105,109,195,161,103,101, 110,101,115,99,111,110,116,97,99,116,97,114,100,101,115,99,97,114,103,97,114,110 ,101,99,101,115,97,114,105,111,97,116,101,110,99,105,195,179,110,116,101,108,195 ,169,102,111,110,111,99,111,109,105,115,105,195,179,110,99,97,110,99,105,111,110 ,101,115,99,97,112,97,99,105,100,97,100,101,110,99,111,110,116,114,97,114,97,110 ,195,161,108,105,115,105,115,102,97,118,111,114,105,116,111,115,116,195,169,114, 109,105,110,111,115,112,114,111,118,105,110,99,105,97,101,116,105,113,117,101, 116,97,115,101,108,101,109,101,110,116,111,115,102,117,110,99,105,111,110,101, 115,114,101,115,117,108,116,97,100,111,99,97,114,195,161,99,116,101,114,112,114, 111,112,105,101,100,97,100,112,114,105,110,99,105,112,105,111,110,101,99,101,115 ,105,100,97,100,109,117,110,105,99,105,112,97,108,99,114,101,97,99,105,195,179, 110,100,101,115,99,97,114,103,97,115,112,114,101,115,101,110,99,105,97,99,111, 109,101,114,99,105,97,108,111,112,105,110,105,111,110,101,115,101,106,101,114,99 ,105,99,105,111,101,100,105,116,111,114,105,97,108,115,97,108,97,109,97,110,99, 97,103,111,110,122,195,161,108,101,122,100,111,99,117,109,101,110,116,111,112, 101,108,195,173,99,117,108,97,114,101,99,105,101,110,116,101,115,103,101,110,101 ,114,97,108,101,115,116,97,114,114,97,103,111,110,97,112,114,195,161,99,116,105, 99,97,110,111,118,101,100,97,100,101,115,112,114,111,112,117,101,115,116,97,112, 97,99,105,101,110,116,101,115,116,195,169,99,110,105,99,97,115,111,98,106,101, 116,105,118,111,115,99,111,110,116,97,99,116,111,115,224,164,174,224,165,135,224 ,164,130,224,164,178,224,164,191,224,164,143,224,164,185,224,165,136,224,164,130 ,224,164,151,224,164,175,224,164,190,224,164,184,224,164,190,224,164,165,224,164 ,143,224,164,181,224,164,130,224,164,176,224,164,185,224,165,135,224,164,149,224 ,165,139,224,164,136,224,164,149,224,165,129,224,164,155,224,164,176,224,164,185 ,224,164,190,224,164,172,224,164,190,224,164,166,224,164,149,224,164,185,224,164 ,190,224,164,184,224,164,173,224,165,128,224,164,185,224,165,129,224,164,143,224 ,164,176,224,164,185,224,165,128,224,164,174,224,165,136,224,164,130,224,164,166 ,224,164,191,224,164,168,224,164,172,224,164,190,224,164,164,100,105,112,108,111 ,100,111,99,115,224,164,184,224,164,174,224,164,175,224,164,176,224,165,130,224, 164,170,224,164,168,224,164,190,224,164,174,224,164,170,224,164,164,224,164,190, 224,164,171,224,164,191,224,164,176,224,164,148,224,164,184,224,164,164,224,164, 164,224,164,176,224,164,185,224,164,178,224,165,139,224,164,151,224,164,185,224, 165,129,224,164,134,224,164,172,224,164,190,224,164,176,224,164,166,224,165,135, 224,164,182,224,164,185,224,165,129,224,164,136,224,164,150,224,165,135,224,164, 178,224,164,175,224,164,166,224,164,191,224,164,149,224,164,190,224,164,174,224, 164,181,224,165,135,224,164,172,224,164,164,224,165,128,224,164,168,224,164,172, 224,165,128,224,164,154,224,164,174,224,165,140,224,164,164,224,164,184,224,164, 190,224,164,178,224,164,178,224,165,135,224,164,150,224,164,156,224,165,137,224, 164,172,224,164,174,224,164,166,224,164,166,224,164,164,224,164,165,224,164,190, 224,164,168,224,164,185,224,165,128,224,164,182,224,164,185,224,164,176,224,164, 133,224,164,178,224,164,151,224,164,149,224,164,173,224,165,128,224,164,168,224, 164,151,224,164,176,224,164,170,224,164,190,224,164,184,224,164,176,224,164,190, 224,164,164,224,164,149,224,164,191,224,164,143,224,164,137,224,164,184,224,165, 135,224,164,151,224,164,175,224,165,128,224,164,185,224,165,130,224,164,129,224, 164,134,224,164,151,224,165,135,224,164,159,224,165,128,224,164,174,224,164,150, 224,165,139,224,164,156,224,164,149,224,164,190,224,164,176,224,164,133,224,164, 173,224,165,128,224,164,151,224,164,175,224,165,135,224,164,164,224,165,129,224, 164,174,224,164,181,224,165,139,224,164,159,224,164,166,224,165,135,224,164,130, 224,164,133,224,164,151,224,164,176,224,164,144,224,164,184,224,165,135,224,164, 174,224,165,135,224,164,178,224,164,178,224,164,151,224,164,190,224,164,185,224, 164,190,224,164,178,224,164,138,224,164,170,224,164,176,224,164,154,224,164,190, 224,164,176,224,164,144,224,164,184,224,164,190,224,164,166,224,165,135,224,164, 176,224,164,156,224,164,191,224,164,184,224,164,166,224,164,191,224,164,178,224, 164,172,224,164,130,224,164,166,224,164,172,224,164,168,224,164,190,224,164,185, 224,165,130,224,164,130,224,164,178,224,164,190,224,164,150,224,164,156,224,165, 128,224,164,164,224,164,172,224,164,159,224,164,168,224,164,174,224,164,191,224, 164,178,224,164,135,224,164,184,224,165,135,224,164,134,224,164,168,224,165,135, 224,164,168,224,164,175,224,164,190,224,164,149,224,165,129,224,164,178,224,164, 178,224,165,137,224,164,151,224,164,173,224,164,190,224,164,151,224,164,176,224, 165,135,224,164,178,224,164,156,224,164,151,224,164,185,224,164,176,224,164,190, 224,164,174,224,164,178,224,164,151,224,165,135,224,164,170,224,165,135,224,164, 156,224,164,185,224,164,190,224,164,165,224,164,135,224,164,184,224,165,128,224, 164,184,224,164,185,224,165,128,224,164,149,224,164,178,224,164,190,224,164,160, 224,165,128,224,164,149,224,164,185,224,164,190,224,164,129,224,164,166,224,165, 130,224,164,176,224,164,164,224,164,185,224,164,164,224,164,184,224,164,190,224, 164,164,224,164,175,224,164,190,224,164,166,224,164,134,224,164,175,224,164,190, 224,164,170,224,164,190,224,164,149,224,164,149,224,165,140,224,164,168,224,164, 182,224,164,190,224,164,174,224,164,166,224,165,135,224,164,150,224,164,175,224, 164,185,224,165,128,224,164,176,224,164,190,224,164,175,224,164,150,224,165,129, 224,164,166,224,164,178,224,164,151,224,165,128,99,97,116,101,103,111,114,105, 101,115,101,120,112,101,114,105,101,110,99,101,60,47,116,105,116,108,101,62,13, 10,67,111,112,121,114,105,103,104,116,32,106,97,118,97,115,99,114,105,112,116,99 ,111,110,100,105,116,105,111,110,115,101,118,101,114,121,116,104,105,110,103,60, 112,32,99,108,97,115,115,61,34,116,101,99,104,110,111,108,111,103,121,98,97,99, 107,103,114,111,117,110,100,60,97,32,99,108,97,115,115,61,34,109,97,110,97,103, 101,109,101,110,116,38,99,111,112,121,59,32,50,48,49,106,97,118,97,83,99,114,105 ,112,116,99,104,97,114,97,99,116,101,114,115,98,114,101,97,100,99,114,117,109,98 ,116,104,101,109,115,101,108,118,101,115,104,111,114,105,122,111,110,116,97,108, 103,111,118,101,114,110,109,101,110,116,67,97,108,105,102,111,114,110,105,97,97, 99,116,105,118,105,116,105,101,115,100,105,115,99,111,118,101,114,101,100,78,97, 118,105,103,97,116,105,111,110,116,114,97,110,115,105,116,105,111,110,99,111,110 ,110,101,99,116,105,111,110,110,97,118,105,103,97,116,105,111,110,97,112,112,101 ,97,114,97,110,99,101,60,47,116,105,116,108,101,62,60,109,99,104,101,99,107,98, 111,120,34,32,116,101,99,104,110,105,113,117,101,115,112,114,111,116,101,99,116, 105,111,110,97,112,112,97,114,101,110,116,108,121,97,115,32,119,101,108,108,32, 97,115,117,110,116,39,44,32,39,85,65,45,114,101,115,111,108,117,116,105,111,110, 111,112,101,114,97,116,105,111,110,115,116,101,108,101,118,105,115,105,111,110, 116,114,97,110,115,108,97,116,101,100,87,97,115,104,105,110,103,116,111,110,110, 97,118,105,103,97,116,111,114,46,32,61,32,119,105,110,100,111,119,46,105,109,112 ,114,101,115,115,105,111,110,38,108,116,59,98,114,38,103,116,59,108,105,116,101, 114,97,116,117,114,101,112,111,112,117,108,97,116,105,111,110,98,103,99,111,108, 111,114,61,34,35,101,115,112,101,99,105,97,108,108,121,32,99,111,110,116,101,110 ,116,61,34,112,114,111,100,117,99,116,105,111,110,110,101,119,115,108,101,116, 116,101,114,112,114,111,112,101,114,116,105,101,115,100,101,102,105,110,105,116, 105,111,110,108,101,97,100,101,114,115,104,105,112,84,101,99,104,110,111,108,111 ,103,121,80,97,114,108,105,97,109,101,110,116,99,111,109,112,97,114,105,115,111, 110,117,108,32,99,108,97,115,115,61,34,46,105,110,100,101,120,79,102,40,34,99, 111,110,99,108,117,115,105,111,110,100,105,115,99,117,115,115,105,111,110,99,111 ,109,112,111,110,101,110,116,115,98,105,111,108,111,103,105,99,97,108,82,101,118 ,111,108,117,116,105,111,110,95,99,111,110,116,97,105,110,101,114,117,110,100, 101,114,115,116,111,111,100,110,111,115,99,114,105,112,116,62,60,112,101,114,109 ,105,115,115,105,111,110,101,97,99,104,32,111,116,104,101,114,97,116,109,111,115 ,112,104,101,114,101,32,111,110,102,111,99,117,115,61,34,60,102,111,114,109,32, 105,100,61,34,112,114,111,99,101,115,115,105,110,103,116,104,105,115,46,118,97, 108,117,101,103,101,110,101,114,97,116,105,111,110,67,111,110,102,101,114,101, 110,99,101,115,117,98,115,101,113,117,101,110,116,119,101,108,108,45,107,110,111 ,119,110,118,97,114,105,97,116,105,111,110,115,114,101,112,117,116,97,116,105, 111,110,112,104,101,110,111,109,101,110,111,110,100,105,115,99,105,112,108,105, 110,101,108,111,103,111,46,112,110,103,34,32,40,100,111,99,117,109,101,110,116, 44,98,111,117,110,100,97,114,105,101,115,101,120,112,114,101,115,115,105,111,110 ,115,101,116,116,108,101,109,101,110,116,66,97,99,107,103,114,111,117,110,100, 111,117,116,32,111,102,32,116,104,101,101,110,116,101,114,112,114,105,115,101,40 ,34,104,116,116,112,115,58,34,32,117,110,101,115,99,97,112,101,40,34,112,97,115, 115,119,111,114,100,34,32,100,101,109,111,99,114,97,116,105,99,60,97,32,104,114, 101,102,61,34,47,119,114,97,112,112,101,114,34,62,10,109,101,109,98,101,114,115, 104,105,112,108,105,110,103,117,105,115,116,105,99,112,120,59,112,97,100,100,105 ,110,103,112,104,105,108,111,115,111,112,104,121,97,115,115,105,115,116,97,110, 99,101,117,110,105,118,101,114,115,105,116,121,102,97,99,105,108,105,116,105,101 ,115,114,101,99,111,103,110,105,122,101,100,112,114,101,102,101,114,101,110,99, 101,105,102,32,40,116,121,112,101,111,102,109,97,105,110,116,97,105,110,101,100, 118,111,99,97,98,117,108,97,114,121,104,121,112,111,116,104,101,115,105,115,46, 115,117,98,109,105,116,40,41,59,38,97,109,112,59,110,98,115,112,59,97,110,110, 111,116,97,116,105,111,110,98,101,104,105,110,100,32,116,104,101,70,111,117,110, 100,97,116,105,111,110,112,117,98,108,105,115,104,101,114,34,97,115,115,117,109, 112,116,105,111,110,105,110,116,114,111,100,117,99,101,100,99,111,114,114,117, 112,116,105,111,110,115,99,105,101,110,116,105,115,116,115,101,120,112,108,105, 99,105,116,108,121,105,110,115,116,101,97,100,32,111,102,100,105,109,101,110,115 ,105,111,110,115,32,111,110,67,108,105,99,107,61,34,99,111,110,115,105,100,101, 114,101,100,100,101,112,97,114,116,109,101,110,116,111,99,99,117,112,97,116,105, 111,110,115,111,111,110,32,97,102,116,101,114,105,110,118,101,115,116,109,101, 110,116,112,114,111,110,111,117,110,99,101,100,105,100,101,110,116,105,102,105, 101,100,101,120,112,101,114,105,109,101,110,116,77,97,110,97,103,101,109,101,110 ,116,103,101,111,103,114,97,112,104,105,99,34,32,104,101,105,103,104,116,61,34, 108,105,110,107,32,114,101,108,61,34,46,114,101,112,108,97,99,101,40,47,100,101, 112,114,101,115,115,105,111,110,99,111,110,102,101,114,101,110,99,101,112,117, 110,105,115,104,109,101,110,116,101,108,105,109,105,110,97,116,101,100,114,101, 115,105,115,116,97,110,99,101,97,100,97,112,116,97,116,105,111,110,111,112,112, 111,115,105,116,105,111,110,119,101,108,108,32,107,110,111,119,110,115,117,112, 112,108,101,109,101,110,116,100,101,116,101,114,109,105,110,101,100,104,49,32,99 ,108,97,115,115,61,34,48,112,120,59,109,97,114,103,105,110,109,101,99,104,97,110 ,105,99,97,108,115,116,97,116,105,115,116,105,99,115,99,101,108,101,98,114,97, 116,101,100,71,111,118,101,114,110,109,101,110,116,10,10,68,117,114,105,110,103, 32,116,100,101,118,101,108,111,112,101,114,115,97,114,116,105,102,105,99,105,97, 108,101,113,117,105,118,97,108,101,110,116,111,114,105,103,105,110,97,116,101, 100,67,111,109,109,105,115,115,105,111,110,97,116,116,97,99,104,109,101,110,116, 60,115,112,97,110,32,105,100,61,34,116,104,101,114,101,32,119,101,114,101,78,101 ,100,101,114,108,97,110,100,115,98,101,121,111,110,100,32,116,104,101,114,101, 103,105,115,116,101,114,101,100,106,111,117,114,110,97,108,105,115,116,102,114, 101,113,117,101,110,116,108,121,97,108,108,32,111,102,32,116,104,101,108,97,110, 103,61,34,101,110,34,32,60,47,115,116,121,108,101,62,13,10,97,98,115,111,108,117 ,116,101,59,32,115,117,112,112,111,114,116,105,110,103,101,120,116,114,101,109, 101,108,121,32,109,97,105,110,115,116,114,101,97,109,60,47,115,116,114,111,110, 103,62,32,112,111,112,117,108,97,114,105,116,121,101,109,112,108,111,121,109,101 ,110,116,60,47,116,97,98,108,101,62,13,10,32,99,111,108,115,112,97,110,61,34,60, 47,102,111,114,109,62,10,32,32,99,111,110,118,101,114,115,105,111,110,97,98,111, 117,116,32,116,104,101,32,60,47,112,62,60,47,100,105,118,62,105,110,116,101,103, 114,97,116,101,100,34,32,108,97,110,103,61,34,101,110,80,111,114,116,117,103,117 ,101,115,101,115,117,98,115,116,105,116,117,116,101,105,110,100,105,118,105,100, 117,97,108,105,109,112,111,115,115,105,98,108,101,109,117,108,116,105,109,101, 100,105,97,97,108,109,111,115,116,32,97,108,108,112,120,32,115,111,108,105,100, 32,35,97,112,97,114,116,32,102,114,111,109,115,117,98,106,101,99,116,32,116,111, 105,110,32,69,110,103,108,105,115,104,99,114,105,116,105,99,105,122,101,100,101, 120,99,101,112,116,32,102,111,114,103,117,105,100,101,108,105,110,101,115,111, 114,105,103,105,110,97,108,108,121,114,101,109,97,114,107,97,98,108,101,116,104, 101,32,115,101,99,111,110,100,104,50,32,99,108,97,115,115,61,34,60,97,32,116,105 ,116,108,101,61,34,40,105,110,99,108,117,100,105,110,103,112,97,114,97,109,101, 116,101,114,115,112,114,111,104,105,98,105,116,101,100,61,32,34,104,116,116,112, 58,47,47,100,105,99,116,105,111,110,97,114,121,112,101,114,99,101,112,116,105, 111,110,114,101,118,111,108,117,116,105,111,110,102,111,117,110,100,97,116,105, 111,110,112,120,59,104,101,105,103,104,116,58,115,117,99,99,101,115,115,102,117, 108,115,117,112,112,111,114,116,101,114,115,109,105,108,108,101,110,110,105,117, 109,104,105,115,32,102,97,116,104,101,114,116,104,101,32,38,113,117,111,116,59, 110,111,45,114,101,112,101,97,116,59,99,111,109,109,101,114,99,105,97,108,105, 110,100,117,115,116,114,105,97,108,101,110,99,111,117,114,97,103,101,100,97,109, 111,117,110,116,32,111,102,32,117,110,111,102,102,105,99,105,97,108,101,102,102, 105,99,105,101,110,99,121,82,101,102,101,114,101,110,99,101,115,99,111,111,114, 100,105,110,97,116,101,100,105,115,99,108,97,105,109,101,114,101,120,112,101,100 ,105,116,105,111,110,100,101,118,101,108,111,112,105,110,103,99,97,108,99,117, 108,97,116,101,100,115,105,109,112,108,105,102,105,101,100,108,101,103,105,116, 105,109,97,116,101,115,117,98,115,116,114,105,110,103,40,48,34,32,99,108,97,115, 115,61,34,99,111,109,112,108,101,116,101,108,121,105,108,108,117,115,116,114,97, 116,101,102,105,118,101,32,121,101,97,114,115,105,110,115,116,114,117,109,101, 110,116,80,117,98,108,105,115,104,105,110,103,49,34,32,99,108,97,115,115,61,34, 112,115,121,99,104,111,108,111,103,121,99,111,110,102,105,100,101,110,99,101,110 ,117,109,98,101,114,32,111,102,32,97,98,115,101,110,99,101,32,111,102,102,111,99 ,117,115,101,100,32,111,110,106,111,105,110,101,100,32,116,104,101,115,116,114, 117,99,116,117,114,101,115,112,114,101,118,105,111,117,115,108,121,62,60,47,105, 102,114,97,109,101,62,111,110,99,101,32,97,103,97,105,110,98,117,116,32,114,97, 116,104,101,114,105,109,109,105,103,114,97,110,116,115,111,102,32,99,111,117,114 ,115,101,44,97,32,103,114,111,117,112,32,111,102,76,105,116,101,114,97,116,117, 114,101,85,110,108,105,107,101,32,116,104,101,60,47,97,62,38,110,98,115,112,59, 10,102,117,110,99,116,105,111,110,32,105,116,32,119,97,115,32,116,104,101,67,111 ,110,118,101,110,116,105,111,110,97,117,116,111,109,111,98,105,108,101,80,114, 111,116,101,115,116,97,110,116,97,103,103,114,101,115,115,105,118,101,97,102,116 ,101,114,32,116,104,101,32,83,105,109,105,108,97,114,108,121,44,34,32,47,62,60, 47,100,105,118,62,99,111,108,108,101,99,116,105,111,110,13,10,102,117,110,99,116 ,105,111,110,118,105,115,105,98,105,108,105,116,121,116,104,101,32,117,115,101, 32,111,102,118,111,108,117,110,116,101,101,114,115,97,116,116,114,97,99,116,105, 111,110,117,110,100,101,114,32,116,104,101,32,116,104,114,101,97,116,101,110,101 ,100,42,60,33,91,67,68,65,84,65,91,105,109,112,111,114,116,97,110,99,101,105,110 ,32,103,101,110,101,114,97,108,116,104,101,32,108,97,116,116,101,114,60,47,102, 111,114,109,62,10,60,47,46,105,110,100,101,120,79,102,40,39,105,32,61,32,48,59, 32,105,32,60,100,105,102,102,101,114,101,110,99,101,100,101,118,111,116,101,100, 32,116,111,116,114,97,100,105,116,105,111,110,115,115,101,97,114,99,104,32,102, 111,114,117,108,116,105,109,97,116,101,108,121,116,111,117,114,110,97,109,101, 110,116,97,116,116,114,105,98,117,116,101,115,115,111,45,99,97,108,108,101,100, 32,125,10,60,47,115,116,121,108,101,62,101,118,97,108,117,97,116,105,111,110,101 ,109,112,104,97,115,105,122,101,100,97,99,99,101,115,115,105,98,108,101,60,47, 115,101,99,116,105,111,110,62,115,117,99,99,101,115,115,105,111,110,97,108,111, 110,103,32,119,105,116,104,77,101,97,110,119,104,105,108,101,44,105,110,100,117, 115,116,114,105,101,115,60,47,97,62,60,98,114,32,47,62,104,97,115,32,98,101,99, 111,109,101,97,115,112,101,99,116,115,32,111,102,84,101,108,101,118,105,115,105, 111,110,115,117,102,102,105,99,105,101,110,116,98,97,115,107,101,116,98,97,108, 108,98,111,116,104,32,115,105,100,101,115,99,111,110,116,105,110,117,105,110,103 ,97,110,32,97,114,116,105,99,108,101,60,105,109,103,32,97,108,116,61,34,97,100, 118,101,110,116,117,114,101,115,104,105,115,32,109,111,116,104,101,114,109,97, 110,99,104,101,115,116,101,114,112,114,105,110,99,105,112,108,101,115,112,97,114 ,116,105,99,117,108,97,114,99,111,109,109,101,110,116,97,114,121,101,102,102,101 ,99,116,115,32,111,102,100,101,99,105,100,101,100,32,116,111,34,62,60,115,116, 114,111,110,103,62,112,117,98,108,105,115,104,101,114,115,74,111,117,114,110,97, 108,32,111,102,100,105,102,102,105,99,117,108,116,121,102,97,99,105,108,105,116, 97,116,101,97,99,99,101,112,116,97,98,108,101,115,116,121,108,101,46,99,115,115, 34,9,102,117,110,99,116,105,111,110,32,105,110,110,111,118,97,116,105,111,110,62 ,67,111,112,121,114,105,103,104,116,115,105,116,117,97,116,105,111,110,115,119, 111,117,108,100,32,104,97,118,101,98,117,115,105,110,101,115,115,101,115,68,105, 99,116,105,111,110,97,114,121,115,116,97,116,101,109,101,110,116,115,111,102,116 ,101,110,32,117,115,101,100,112,101,114,115,105,115,116,101,110,116,105,110,32, 74,97,110,117,97,114,121,99,111,109,112,114,105,115,105,110,103,60,47,116,105, 116,108,101,62,10,9,100,105,112,108,111,109,97,116,105,99,99,111,110,116,97,105, 110,105,110,103,112,101,114,102,111,114,109,105,110,103,101,120,116,101,110,115, 105,111,110,115,109,97,121,32,110,111,116,32,98,101,99,111,110,99,101,112,116,32 ,111,102,32,111,110,99,108,105,99,107,61,34,73,116,32,105,115,32,97,108,115,111, 102,105,110,97,110,99,105,97,108,32,109,97,107,105,110,103,32,116,104,101,76,117 ,120,101,109,98,111,117,114,103,97,100,100,105,116,105,111,110,97,108,97,114,101 ,32,99,97,108,108,101,100,101,110,103,97,103,101,100,32,105,110,34,115,99,114, 105,112,116,34,41,59,98,117,116,32,105,116,32,119,97,115,101,108,101,99,116,114, 111,110,105,99,111,110,115,117,98,109,105,116,61,34,10,60,33,45,45,32,69,110,100 ,32,101,108,101,99,116,114,105,99,97,108,111,102,102,105,99,105,97,108,108,121, 115,117,103,103,101,115,116,105,111,110,116,111,112,32,111,102,32,116,104,101, 117,110,108,105,107,101,32,116,104,101,65,117,115,116,114,97,108,105,97,110,79, 114,105,103,105,110,97,108,108,121,114,101,102,101,114,101,110,99,101,115,10,60, 47,104,101,97,100,62,13,10,114,101,99,111,103,110,105,115,101,100,105,110,105, 116,105,97,108,105,122,101,108,105,109,105,116,101,100,32,116,111,65,108,101,120 ,97,110,100,114,105,97,114,101,116,105,114,101,109,101,110,116,65,100,118,101, 110,116,117,114,101,115,102,111,117,114,32,121,101,97,114,115,10,10,38,108,116, 59,33,45,45,32,105,110,99,114,101,97,115,105,110,103,100,101,99,111,114,97,116, 105,111,110,104,51,32,99,108,97,115,115,61,34,111,114,105,103,105,110,115,32,111 ,102,111,98,108,105,103,97,116,105,111,110,114,101,103,117,108,97,116,105,111, 110,99,108,97,115,115,105,102,105,101,100,40,102,117,110,99,116,105,111,110,40, 97,100,118,97,110,116,97,103,101,115,98,101,105,110,103,32,116,104,101,32,104, 105,115,116,111,114,105,97,110,115,60,98,97,115,101,32,104,114,101,102,114,101, 112,101,97,116,101,100,108,121,119,105,108,108,105,110,103,32,116,111,99,111,109 ,112,97,114,97,98,108,101,100,101,115,105,103,110,97,116,101,100,110,111,109,105 ,110,97,116,105,111,110,102,117,110,99,116,105,111,110,97,108,105,110,115,105, 100,101,32,116,104,101,114,101,118,101,108,97,116,105,111,110,101,110,100,32,111 ,102,32,116,104,101,115,32,102,111,114,32,116,104,101,32,97,117,116,104,111,114, 105,122,101,100,114,101,102,117,115,101,100,32,116,111,116,97,107,101,32,112,108 ,97,99,101,97,117,116,111,110,111,109,111,117,115,99,111,109,112,114,111,109,105 ,115,101,112,111,108,105,116,105,99,97,108,32,114,101,115,116,97,117,114,97,110, 116,116,119,111,32,111,102,32,116,104,101,70,101,98,114,117,97,114,121,32,50,113 ,117,97,108,105,116,121,32,111,102,115,119,102,111,98,106,101,99,116,46,117,110, 100,101,114,115,116,97,110,100,110,101,97,114,108,121,32,97,108,108,119,114,105, 116,116,101,110,32,98,121,105,110,116,101,114,118,105,101,119,115,34,32,119,105, 100,116,104,61,34,49,119,105,116,104,100,114,97,119,97,108,102,108,111,97,116,58 ,108,101,102,116,105,115,32,117,115,117,97,108,108,121,99,97,110,100,105,100,97, 116,101,115,110,101,119,115,112,97,112,101,114,115,109,121,115,116,101,114,105, 111,117,115,68,101,112,97,114,116,109,101,110,116,98,101,115,116,32,107,110,111, 119,110,112,97,114,108,105,97,109,101,110,116,115,117,112,112,114,101,115,115, 101,100,99,111,110,118,101,110,105,101,110,116,114,101,109,101,109,98,101,114, 101,100,100,105,102,102,101,114,101,110,116,32,115,121,115,116,101,109,97,116, 105,99,104,97,115,32,108,101,100,32,116,111,112,114,111,112,97,103,97,110,100,97 ,99,111,110,116,114,111,108,108,101,100,105,110,102,108,117,101,110,99,101,115, 99,101,114,101,109,111,110,105,97,108,112,114,111,99,108,97,105,109,101,100,80, 114,111,116,101,99,116,105,111,110,108,105,32,99,108,97,115,115,61,34,83,99,105, 101,110,116,105,102,105,99,99,108,97,115,115,61,34,110,111,45,116,114,97,100,101 ,109,97,114,107,115,109,111,114,101,32,116,104,97,110,32,119,105,100,101,115,112 ,114,101,97,100,76,105,98,101,114,97,116,105,111,110,116,111,111,107,32,112,108, 97,99,101,100,97,121,32,111,102,32,116,104,101,97,115,32,108,111,110,103,32,97, 115,105,109,112,114,105,115,111,110,101,100,65,100,100,105,116,105,111,110,97, 108,10,60,104,101,97,100,62,10,60,109,76,97,98,111,114,97,116,111,114,121,78,111 ,118,101,109,98,101,114,32,50,101,120,99,101,112,116,105,111,110,115,73,110,100, 117,115,116,114,105,97,108,118,97,114,105,101,116,121,32,111,102,102,108,111,97, 116,58,32,108,101,102,68,117,114,105,110,103,32,116,104,101,97,115,115,101,115, 115,109,101,110,116,104,97,118,101,32,98,101,101,110,32,100,101,97,108,115,32, 119,105,116,104,83,116,97,116,105,115,116,105,99,115,111,99,99,117,114,114,101, 110,99,101,47,117,108,62,60,47,100,105,118,62,99,108,101,97,114,102,105,120,34, 62,116,104,101,32,112,117,98,108,105,99,109,97,110,121,32,121,101,97,114,115,119 ,104,105,99,104,32,119,101,114,101,111,118,101,114,32,116,105,109,101,44,115,121 ,110,111,110,121,109,111,117,115,99,111,110,116,101,110,116,34,62,10,112,114,101 ,115,117,109,97,98,108,121,104,105,115,32,102,97,109,105,108,121,117,115,101,114 ,65,103,101,110,116,46,117,110,101,120,112,101,99,116,101,100,105,110,99,108,117 ,100,105,110,103,32,99,104,97,108,108,101,110,103,101,100,97,32,109,105,110,111, 114,105,116,121,117,110,100,101,102,105,110,101,100,34,98,101,108,111,110,103, 115,32,116,111,116,97,107,101,110,32,102,114,111,109,105,110,32,79,99,116,111,98 ,101,114,112,111,115,105,116,105,111,110,58,32,115,97,105,100,32,116,111,32,98, 101,114,101,108,105,103,105,111,117,115,32,70,101,100,101,114,97,116,105,111,110 ,32,114,111,119,115,112,97,110,61,34,111,110,108,121,32,97,32,102,101,119,109, 101,97,110,116,32,116,104,97,116,108,101,100,32,116,111,32,116,104,101,45,45,62, 13,10,60,100,105,118,32,60,102,105,101,108,100,115,101,116,62,65,114,99,104,98, 105,115,104,111,112,32,99,108,97,115,115,61,34,110,111,98,101,105,110,103,32,117 ,115,101,100,97,112,112,114,111,97,99,104,101,115,112,114,105,118,105,108,101, 103,101,115,110,111,115,99,114,105,112,116,62,10,114,101,115,117,108,116,115,32, 105,110,109,97,121,32,98,101,32,116,104,101,69,97,115,116,101,114,32,101,103,103 ,109,101,99,104,97,110,105,115,109,115,114,101,97,115,111,110,97,98,108,101,80, 111,112,117,108,97,116,105,111,110,67,111,108,108,101,99,116,105,111,110,115,101 ,108,101,99,116,101,100,34,62,110,111,115,99,114,105,112,116,62,13,47,105,110, 100,101,120,46,112,104,112,97,114,114,105,118,97,108,32,111,102,45,106,115,115, 100,107,39,41,41,59,109,97,110,97,103,101,100,32,116,111,105,110,99,111,109,112, 108,101,116,101,99,97,115,117,97,108,116,105,101,115,99,111,109,112,108,101,116, 105,111,110,67,104,114,105,115,116,105,97,110,115,83,101,112,116,101,109,98,101, 114,32,97,114,105,116,104,109,101,116,105,99,112,114,111,99,101,100,117,114,101, 115,109,105,103,104,116,32,104,97,118,101,80,114,111,100,117,99,116,105,111,110, 105,116,32,97,112,112,101,97,114,115,80,104,105,108,111,115,111,112,104,121,102, 114,105,101,110,100,115,104,105,112,108,101,97,100,105,110,103,32,116,111,103, 105,118,105,110,103,32,116,104,101,116,111,119,97,114,100,32,116,104,101,103,117 ,97,114,97,110,116,101,101,100,100,111,99,117,109,101,110,116,101,100,99,111,108 ,111,114,58,35,48,48,48,118,105,100,101,111,32,103,97,109,101,99,111,109,109,105 ,115,115,105,111,110,114,101,102,108,101,99,116,105,110,103,99,104,97,110,103, 101,32,116,104,101,97,115,115,111,99,105,97,116,101,100,115,97,110,115,45,115, 101,114,105,102,111,110,107,101,121,112,114,101,115,115,59,32,112,97,100,100,105 ,110,103,58,72,101,32,119,97,115,32,116,104,101,117,110,100,101,114,108,121,105, 110,103,116,121,112,105,99,97,108,108,121,32,44,32,97,110,100,32,116,104,101,32, 115,114,99,69,108,101,109,101,110,116,115,117,99,99,101,115,115,105,118,101,115, 105,110,99,101,32,116,104,101,32,115,104,111,117,108,100,32,98,101,32,110,101, 116,119,111,114,107,105,110,103,97,99,99,111,117,110,116,105,110,103,117,115,101 ,32,111,102,32,116,104,101,108,111,119,101,114,32,116,104,97,110,115,104,111,119 ,115,32,116,104,97,116,60,47,115,112,97,110,62,10,9,9,99,111,109,112,108,97,105, 110,116,115,99,111,110,116,105,110,117,111,117,115,113,117,97,110,116,105,116, 105,101,115,97,115,116,114,111,110,111,109,101,114,104,101,32,100,105,100,32,110 ,111,116,100,117,101,32,116,111,32,105,116,115,97,112,112,108,105,101,100,32,116 ,111,97,110,32,97,118,101,114,97,103,101,101,102,102,111,114,116,115,32,116,111, 116,104,101,32,102,117,116,117,114,101,97,116,116,101,109,112,116,32,116,111,84, 104,101,114,101,102,111,114,101,44,99,97,112,97,98,105,108,105,116,121,82,101, 112,117,98,108,105,99,97,110,119,97,115,32,102,111,114,109,101,100,69,108,101,99 ,116,114,111,110,105,99,107,105,108,111,109,101,116,101,114,115,99,104,97,108, 108,101,110,103,101,115,112,117,98,108,105,115,104,105,110,103,116,104,101,32, 102,111,114,109,101,114,105,110,100,105,103,101,110,111,117,115,100,105,114,101, 99,116,105,111,110,115,115,117,98,115,105,100,105,97,114,121,99,111,110,115,112, 105,114,97,99,121,100,101,116,97,105,108,115,32,111,102,97,110,100,32,105,110,32 ,116,104,101,97,102,102,111,114,100,97,98,108,101,115,117,98,115,116,97,110,99, 101,115,114,101,97,115,111,110,32,102,111,114,99,111,110,118,101,110,116,105,111 ,110,105,116,101,109,116,121,112,101,61,34,97,98,115,111,108,117,116,101,108,121 ,115,117,112,112,111,115,101,100,108,121,114,101,109,97,105,110,101,100,32,97,97 ,116,116,114,97,99,116,105,118,101,116,114,97,118,101,108,108,105,110,103,115, 101,112,97,114,97,116,101,108,121,102,111,99,117,115,101,115,32,111,110,101,108, 101,109,101,110,116,97,114,121,97,112,112,108,105,99,97,98,108,101,102,111,117, 110,100,32,116,104,97,116,115,116,121,108,101,115,104,101,101,116,109,97,110,117 ,115,99,114,105,112,116,115,116,97,110,100,115,32,102,111,114,32,110,111,45,114, 101,112,101,97,116,40,115,111,109,101,116,105,109,101,115,67,111,109,109,101,114 ,99,105,97,108,105,110,32,65,109,101,114,105,99,97,117,110,100,101,114,116,97, 107,101,110,113,117,97,114,116,101,114,32,111,102,97,110,32,101,120,97,109,112, 108,101,112,101,114,115,111,110,97,108,108,121,105,110,100,101,120,46,112,104, 112,63,60,47,98,117,116,116,111,110,62,10,112,101,114,99,101,110,116,97,103,101, 98,101,115,116,45,107,110,111,119,110,99,114,101,97,116,105,110,103,32,97,34,32, 100,105,114,61,34,108,116,114,76,105,101,117,116,101,110,97,110,116,10,60,100, 105,118,32,105,100,61,34,116,104,101,121,32,119,111,117,108,100,97,98,105,108, 105,116,121,32,111,102,109,97,100,101,32,117,112,32,111,102,110,111,116,101,100, 32,116,104,97,116,99,108,101,97,114,32,116,104,97,116,97,114,103,117,101,32,116, 104,97,116,116,111,32,97,110,111,116,104,101,114,99,104,105,108,100,114,101,110, 39,115,112,117,114,112,111,115,101,32,111,102,102,111,114,109,117,108,97,116,101 ,100,98,97,115,101,100,32,117,112,111,110,116,104,101,32,114,101,103,105,111,110 ,115,117,98,106,101,99,116,32,111,102,112,97,115,115,101,110,103,101,114,115,112 ,111,115,115,101,115,115,105,111,110,46,10,10,73,110,32,116,104,101,32,66,101, 102,111,114,101,32,116,104,101,97,102,116,101,114,119,97,114,100,115,99,117,114, 114,101,110,116,108,121,32,97,99,114,111,115,115,32,116,104,101,115,99,105,101, 110,116,105,102,105,99,99,111,109,109,117,110,105,116,121,46,99,97,112,105,116, 97,108,105,115,109,105,110,32,71,101,114,109,97,110,121,114,105,103,104,116,45, 119,105,110,103,116,104,101,32,115,121,115,116,101,109,83,111,99,105,101,116,121 ,32,111,102,112,111,108,105,116,105,99,105,97,110,100,105,114,101,99,116,105,111 ,110,58,119,101,110,116,32,111,110,32,116,111,114,101,109,111,118,97,108,32,111, 102,32,78,101,119,32,89,111,114,107,32,97,112,97,114,116,109,101,110,116,115,105 ,110,100,105,99,97,116,105,111,110,100,117,114,105,110,103,32,116,104,101,117, 110,108,101,115,115,32,116,104,101,104,105,115,116,111,114,105,99,97,108,104,97, 100,32,98,101,101,110,32,97,100,101,102,105,110,105,116,105,118,101,105,110,103, 114,101,100,105,101,110,116,97,116,116,101,110,100,97,110,99,101,67,101,110,116, 101,114,32,102,111,114,112,114,111,109,105,110,101,110,99,101,114,101,97,100,121 ,83,116,97,116,101,115,116,114,97,116,101,103,105,101,115,98,117,116,32,105,110, 32,116,104,101,97,115,32,112,97,114,116,32,111,102,99,111,110,115,116,105,116, 117,116,101,99,108,97,105,109,32,116,104,97,116,108,97,98,111,114,97,116,111,114 ,121,99,111,109,112,97,116,105,98,108,101,102,97,105,108,117,114,101,32,111,102, 44,32,115,117,99,104,32,97,115,32,98,101,103,97,110,32,119,105,116,104,117,115, 105,110,103,32,116,104,101,32,116,111,32,112,114,111,118,105,100,101,102,101,97, 116,117,114,101,32,111,102,102,114,111,109,32,119,104,105,99,104,47,34,32,99,108 ,97,115,115,61,34,103,101,111,108,111,103,105,99,97,108,115,101,118,101,114,97, 108,32,111,102,100,101,108,105,98,101,114,97,116,101,105,109,112,111,114,116,97, 110,116,32,104,111,108,100,115,32,116,104,97,116,105,110,103,38,113,117,111,116, 59,32,118,97,108,105,103,110,61,116,111,112,116,104,101,32,71,101,114,109,97,110 ,111,117,116,115,105,100,101,32,111,102,110,101,103,111,116,105,97,116,101,100, 104,105,115,32,99,97,114,101,101,114,115,101,112,97,114,97,116,105,111,110,105, 100,61,34,115,101,97,114,99,104,119,97,115,32,99,97,108,108,101,100,116,104,101, 32,102,111,117,114,116,104,114,101,99,114,101,97,116,105,111,110,111,116,104,101 ,114,32,116,104,97,110,112,114,101,118,101,110,116,105,111,110,119,104,105,108, 101,32,116,104,101,32,101,100,117,99,97,116,105,111,110,44,99,111,110,110,101,99 ,116,105,110,103,97,99,99,117,114,97,116,101,108,121,119,101,114,101,32,98,117, 105,108,116,119,97,115,32,107,105,108,108,101,100,97,103,114,101,101,109,101,110 ,116,115,109,117,99,104,32,109,111,114,101,32,68,117,101,32,116,111,32,116,104, 101,119,105,100,116,104,58,32,49,48,48,115,111,109,101,32,111,116,104,101,114,75 ,105,110,103,100,111,109,32,111,102,116,104,101,32,101,110,116,105,114,101,102, 97,109,111,117,115,32,102,111,114,116,111,32,99,111,110,110,101,99,116,111,98, 106,101,99,116,105,118,101,115,116,104,101,32,70,114,101,110,99,104,112,101,111, 112,108,101,32,97,110,100,102,101,97,116,117,114,101,100,34,62,105,115,32,115,97 ,105,100,32,116,111,115,116,114,117,99,116,117,114,97,108,114,101,102,101,114, 101,110,100,117,109,109,111,115,116,32,111,102,116,101,110,97,32,115,101,112,97, 114,97,116,101,45,62,10,60,100,105,118,32,105,100,32,79,102,102,105,99,105,97, 108,32,119,111,114,108,100,119,105,100,101,46,97,114,105,97,45,108,97,98,101,108 ,116,104,101,32,112,108,97,110,101,116,97,110,100,32,105,116,32,119,97,115,100, 34,32,118,97,108,117,101,61,34,108,111,111,107,105,110,103,32,97,116,98,101,110, 101,102,105,99,105,97,108,97,114,101,32,105,110,32,116,104,101,109,111,110,105, 116,111,114,105,110,103,114,101,112,111,114,116,101,100,108,121,116,104,101,32, 109,111,100,101,114,110,119,111,114,107,105,110,103,32,111,110,97,108,108,111, 119,101,100,32,116,111,119,104,101,114,101,32,116,104,101,32,105,110,110,111,118 ,97,116,105,118,101,60,47,97,62,60,47,100,105,118,62,115,111,117,110,100,116,114 ,97,99,107,115,101,97,114,99,104,70,111,114,109,116,101,110,100,32,116,111,32,98 ,101,105,110,112,117,116,32,105,100,61,34,111,112,101,110,105,110,103,32,111,102 ,114,101,115,116,114,105,99,116,101,100,97,100,111,112,116,101,100,32,98,121,97, 100,100,114,101,115,115,105,110,103,116,104,101,111,108,111,103,105,97,110,109, 101,116,104,111,100,115,32,111,102,118,97,114,105,97,110,116,32,111,102,67,104, 114,105,115,116,105,97,110,32,118,101,114,121,32,108,97,114,103,101,97,117,116, 111,109,111,116,105,118,101,98,121,32,102,97,114,32,116,104,101,114,97,110,103, 101,32,102,114,111,109,112,117,114,115,117,105,116,32,111,102,102,111,108,108, 111,119,32,116,104,101,98,114,111,117,103,104,116,32,116,111,105,110,32,69,110, 103,108,97,110,100,97,103,114,101,101,32,116,104,97,116,97,99,99,117,115,101,100 ,32,111,102,99,111,109,101,115,32,102,114,111,109,112,114,101,118,101,110,116, 105,110,103,100,105,118,32,115,116,121,108,101,61,104,105,115,32,111,114,32,104, 101,114,116,114,101,109,101,110,100,111,117,115,102,114,101,101,100,111,109,32, 111,102,99,111,110,99,101,114,110,105,110,103,48,32,49,101,109,32,49,101,109,59, 66,97,115,107,101,116,98,97,108,108,47,115,116,121,108,101,46,99,115,115,97,110, 32,101,97,114,108,105,101,114,101,118,101,110,32,97,102,116,101,114,47,34,32,116 ,105,116,108,101,61,34,46,99,111,109,47,105,110,100,101,120,116,97,107,105,110, 103,32,116,104,101,112,105,116,116,115,98,117,114,103,104,99,111,110,116,101,110 ,116,34,62,13,60,115,99,114,105,112,116,62,40,102,116,117,114,110,101,100,32,111 ,117,116,104,97,118,105,110,103,32,116,104,101,60,47,115,112,97,110,62,13,10,32, 111,99,99,97,115,105,111,110,97,108,98,101,99,97,117,115,101,32,105,116,115,116, 97,114,116,101,100,32,116,111,112,104,121,115,105,99,97,108,108,121,62,60,47,100 ,105,118,62,10,32,32,99,114,101,97,116,101,100,32,98,121,67,117,114,114,101,110, 116,108,121,44,32,98,103,99,111,108,111,114,61,34,116,97,98,105,110,100,101,120, 61,34,100,105,115,97,115,116,114,111,117,115,65,110,97,108,121,116,105,99,115,32 ,97,108,115,111,32,104,97,115,32,97,62,60,100,105,118,32,105,100,61,34,60,47,115 ,116,121,108,101,62,10,60,99,97,108,108,101,100,32,102,111,114,115,105,110,103, 101,114,32,97,110,100,46,115,114,99,32,61,32,34,47,47,118,105,111,108,97,116,105 ,111,110,115,116,104,105,115,32,112,111,105,110,116,99,111,110,115,116,97,110, 116,108,121,105,115,32,108,111,99,97,116,101,100,114,101,99,111,114,100,105,110, 103,115,100,32,102,114,111,109,32,116,104,101,110,101,100,101,114,108,97,110,100 ,115,112,111,114,116,117,103,117,195,170,115,215,162,215,145,215,168,215,153,215 ,170,217,129,216,167,216,177,216,179,219,140,100,101,115,97,114,114,111,108,108, 111,99,111,109,101,110,116,97,114,105,111,101,100,117,99,97,99,105,195,179,110, 115,101,112,116,105,101,109,98,114,101,114,101,103,105,115,116,114,97,100,111, 100,105,114,101,99,99,105,195,179,110,117,98,105,99,97,99,105,195,179,110,112, 117,98,108,105,99,105,100,97,100,114,101,115,112,117,101,115,116,97,115,114,101, 115,117,108,116,97,100,111,115,105,109,112,111,114,116,97,110,116,101,114,101, 115,101,114,118,97,100,111,115,97,114,116,195,173,99,117,108,111,115,100,105,102 ,101,114,101,110,116,101,115,115,105,103,117,105,101,110,116,101,115,114,101,112 ,195,186,98,108,105,99,97,115,105,116,117,97,99,105,195,179,110,109,105,110,105, 115,116,101,114,105,111,112,114,105,118,97,99,105,100,97,100,100,105,114,101,99, 116,111,114,105,111,102,111,114,109,97,99,105,195,179,110,112,111,98,108,97,99, 105,195,179,110,112,114,101,115,105,100,101,110,116,101,99,111,110,116,101,110, 105,100,111,115,97,99,99,101,115,111,114,105,111,115,116,101,99,104,110,111,114, 97,116,105,112,101,114,115,111,110,97,108,101,115,99,97,116,101,103,111,114,195, 173,97,101,115,112,101,99,105,97,108,101,115,100,105,115,112,111,110,105,98,108, 101,97,99,116,117,97,108,105,100,97,100,114,101,102,101,114,101,110,99,105,97, 118,97,108,108,97,100,111,108,105,100,98,105,98,108,105,111,116,101,99,97,114, 101,108,97,99,105,111,110,101,115,99,97,108,101,110,100,97,114,105,111,112,111, 108,195,173,116,105,99,97,115,97,110,116,101,114,105,111,114,101,115,100,111,99, 117,109,101,110,116,111,115,110,97,116,117,114,97,108,101,122,97,109,97,116,101, 114,105,97,108,101,115,100,105,102,101,114,101,110,99,105,97,101,99,111,110,195, 179,109,105,99,97,116,114,97,110,115,112,111,114,116,101,114,111,100,114,195,173 ,103,117,101,122,112,97,114,116,105,99,105,112,97,114,101,110,99,117,101,110,116 ,114,97,110,100,105,115,99,117,115,105,195,179,110,101,115,116,114,117,99,116, 117,114,97,102,117,110,100,97,99,105,195,179,110,102,114,101,99,117,101,110,116, 101,115,112,101,114,109,97,110,101,110,116,101,116,111,116,97,108,109,101,110, 116,101,208,188,208,190,208,182,208,189,208,190,208,177,209,131,208,180,208,181, 209,130,208,188,208,190,208,182,208,181,209,130,208,178,209,128,208,181,208,188, 209,143,209,130,208,176,208,186,208,182,208,181,209,135,209,130,208,190,208,177, 209,139,208,177,208,190,208,187,208,181,208,181,208,190,209,135,208,181,208,189, 209,140,209,141,209,130,208,190,208,179,208,190,208,186,208,190,208,179,208,180, 208,176,208,191,208,190,209,129,208,187,208,181,208,178,209,129,208,181,208,179, 208,190,209,129,208,176,208,185,209,130,208,181,209,135,208,181,209,128,208,181, 208,183,208,188,208,190,208,179,209,131,209,130,209,129,208,176,208,185,209,130, 208,176,208,182,208,184,208,183,208,189,208,184,208,188,208,181,208,182,208,180, 209,131,208,177,209,131,208,180,209,131,209,130,208,159,208,190,208,184,209,129, 208,186,208,183,208,180,208,181,209,129,209,140,208,178,208,184,208,180,208,181, 208,190,209,129,208,178,209,143,208,183,208,184,208,189,209,131,208,182,208,189, 208,190,209,129,208,178,208,190,208,181,208,185,208,187,209,142,208,180,208,181, 208,185,208,191,208,190,209,128,208,189,208,190,208,188,208,189,208,190,208,179, 208,190,208,180,208,181,209,130,208,181,208,185,209,129,208,178,208,190,208,184, 209,133,208,191,209,128,208,176,208,178,208,176,209,130,208,176,208,186,208,190, 208,185,208,188,208,181,209,129,209,130,208,190,208,184,208,188,208,181,208,181, 209,130,208,182,208,184,208,183,208,189,209,140,208,190,208,180,208,189,208,190, 208,185,208,187,209,131,209,135,209,136,208,181,208,191,208,181,209,128,208,181, 208,180,209,135,208,176,209,129,209,130,208,184,209,135,208,176,209,129,209,130, 209,140,209,128,208,176,208,177,208,190,209,130,208,189,208,190,208,178,209,139, 209,133,208,191,209,128,208,176,208,178,208,190,209,129,208,190,208,177,208,190, 208,185,208,191,208,190,209,130,208,190,208,188,208,188,208,181,208,189,208,181, 208,181,209,135,208,184,209,129,208,187,208,181,208,189,208,190,208,178,209,139, 208,181,209,131,209,129,208,187,209,131,208,179,208,190,208,186,208,190,208,187, 208,190,208,189,208,176,208,183,208,176,208,180,209,130,208,176,208,186,208,190, 208,181,209,130,208,190,208,179,208,180,208,176,208,191,208,190,209,135,209,130, 208,184,208,159,208,190,209,129,208,187,208,181,209,130,208,176,208,186,208,184, 208,181,208,189,208,190,208,178,209,139,208,185,209,129,209,130,208,190,208,184, 209,130,209,130,208,176,208,186,208,184,209,133,209,129,209,128,208,176,208,183, 209,131,208,161,208,176,208,189,208,186,209,130,209,132,208,190,209,128,209,131, 208,188,208,154,208,190,208,179,208,180,208,176,208,186,208,189,208,184,208,179, 208,184,209,129,208,187,208,190,208,178,208,176,208,189,208,176,209,136,208,181, 208,185,208,189,208,176,208,185,209,130,208,184,209,129,208,178,208,190,208,184, 208,188,209,129,208,178,209,143,208,183,209,140,208,187,209,142,208,177,208,190, 208,185,209,135,208,176,209,129,209,130,208,190,209,129,209,128,208,181,208,180, 208,184,208,154,209,128,208,190,208,188,208,181,208,164,208,190,209,128,209,131, 208,188,209,128,209,139,208,189,208,186,208,181,209,129,209,130,208,176,208,187, 208,184,208,191,208,190,208,184,209,129,208,186,209,130,209,139,209,129,209,143, 209,135,208,188,208,181,209,129,209,143,209,134,209,134,208,181,208,189,209,130, 209,128,209,130,209,128,209,131,208,180,208,176,209,129,208,176,208,188,209,139, 209,133,209,128,209,139,208,189,208,186,208,176,208,157,208,190,208,178,209,139, 208,185,209,135,208,176,209,129,208,190,208,178,208,188,208,181,209,129,209,130, 208,176,209,132,208,184,208,187,209,140,208,188,208,188,208,176,209,128,209,130, 208,176,209,129,209,130,209,128,208,176,208,189,208,188,208,181,209,129,209,130, 208,181,209,130,208,181,208,186,209,129,209,130,208,189,208,176,209,136,208,184, 209,133,208,188,208,184,208,189,209,131,209,130,208,184,208,188,208,181,208,189, 208,184,208,184,208,188,208,181,209,142,209,130,208,189,208,190,208,188,208,181, 209,128,208,179,208,190,209,128,208,190,208,180,209,129,208,176,208,188,208,190, 208,188,209,141,209,130,208,190,208,188,209,131,208,186,208,190,208,189,209,134, 208,181,209,129,208,178,208,190,208,181,208,188,208,186,208,176,208,186,208,190, 208,185,208,144,209,128,209,133,208,184,208,178,217,133,217,134,216,170,216,175, 217,137,216,165,216,177,216,179,216,167,217,132,216,177,216,179,216,167,217,132, 216,169,216,167,217,132,216,185,216,167,217,133,217,131,216,170,216,168,217,135, 216,167,216,168,216,177,216,167,217,133,216,172,216,167,217,132,217,138,217,136, 217,133,216,167,217,132,216,181,217,136,216,177,216,172,216,175,217,138,216,175, 216,169,216,167,217,132,216,185,216,182,217,136,216,165,216,182,216,167,217,129, 216,169,216,167,217,132,217,130,216,179,217,133,216,167,217,132,216,185,216,167, 216,168,216,170,216,173,217,133,217,138,217,132,217,133,217,132,217,129,216,167, 216,170,217,133,217,132,216,170,217,130,217,137,216,170,216,185,216,175,217,138, 217,132,216,167,217,132,216,180,216,185,216,177,216,163,216,174,216,168,216,167, 216,177,216,170,216,183,217,136,217,138,216,177,216,185,217,132,217,138,217,131, 217,133,216,165,216,177,217,129,216,167,217,130,216,183,217,132,216,168,216,167, 216,170,216,167,217,132,217,132,216,186,216,169,216,170,216,177,216,170,217,138, 216,168,216,167,217,132,217,134,216,167,216,179,216,167,217,132,216,180,217,138, 216,174,217,133,217,134,216,170,216,175,217,138,216,167,217,132,216,185,216,177, 216,168,216,167,217,132,217,130,216,181,216,181,216,167,217,129,217,132,216,167, 217,133,216,185,217,132,217,138,217,135,216,167,216,170,216,173,216,175,217,138, 216,171,216,167,217,132,217,132,217,135,217,133,216,167,217,132,216,185,217,133, 217,132,217,133,217,131,216,170,216,168,216,169,217,138,217,133,217,131,217,134, 217,131,216,167,217,132,216,183,217,129,217,132,217,129,217,138,216,175,217,138, 217,136,216,165,216,175,216,167,216,177,216,169,216,170,216,167,216,177,217,138, 216,174,216,167,217,132,216,181,216,173,216,169,216,170,216,179,216,172,217,138, 217,132,216,167,217,132,217,136,217,130,216,170,216,185,217,134,216,175,217,133, 216,167,217,133,216,175,217,138,217,134,216,169,216,170,216,181,217,133,217,138, 217,133,216,163,216,177,216,180,217,138,217,129,216,167,217,132,216,176,217,138, 217,134,216,185,216,177,216,168,217,138,216,169,216,168,217,136,216,167,216,168, 216,169,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,179,217,129, 216,177,217,133,216,180,216,167,217,131,217,132,216,170,216,185,216,167,217,132, 217,137,216,167,217,132,216,163,217,136,217,132,216,167,217,132,216,179,217,134, 216,169,216,172,216,167,217,133,216,185,216,169,216,167,217,132,216,181,216,173, 217,129,216,167,217,132,216,175,217,138,217,134,217,131,217,132,217,133,216,167, 216,170,216,167,217,132,216,174,216,167,216,181,216,167,217,132,217,133,217,132, 217,129,216,163,216,185,216,182,216,167,216,161,217,131,216,170,216,167,216,168, 216,169,216,167,217,132,216,174,217,138,216,177,216,177,216,179,216,167,216,166, 217,132,216,167,217,132,217,130,217,132,216,168,216,167,217,132,216,163,216,175, 216,168,217,133,217,130,216,167,216,183,216,185,217,133,216,177,216,167,216,179, 217,132,217,133,217,134,216,183,217,130,216,169,216,167,217,132,217,131,216,170, 216,168,216,167,217,132,216,177,216,172,217,132,216,167,216,180,216,170,216,177, 217,131,216,167,217,132,217,130,216,175,217,133,217,138,216,185,216,183,217,138, 217,131,115,66,121,84,97,103,78,97,109,101,40,46,106,112,103,34,32,97,108,116,61 ,34,49,112,120,32,115,111,108,105,100,32,35,46,103,105,102,34,32,97,108,116,61, 34,116,114,97,110,115,112,97,114,101,110,116,105,110,102,111,114,109,97,116,105, 111,110,97,112,112,108,105,99,97,116,105,111,110,34,32,111,110,99,108,105,99,107 ,61,34,101,115,116,97,98,108,105,115,104,101,100,97,100,118,101,114,116,105,115, 105,110,103,46,112,110,103,34,32,97,108,116,61,34,101,110,118,105,114,111,110, 109,101,110,116,112,101,114,102,111,114,109,97,110,99,101,97,112,112,114,111,112 ,114,105,97,116,101,38,97,109,112,59,109,100,97,115,104,59,105,109,109,101,100, 105,97,116,101,108,121,60,47,115,116,114,111,110,103,62,60,47,114,97,116,104,101 ,114,32,116,104,97,110,116,101,109,112,101,114,97,116,117,114,101,100,101,118, 101,108,111,112,109,101,110,116,99,111,109,112,101,116,105,116,105,111,110,112, 108,97,99,101,104,111,108,100,101,114,118,105,115,105,98,105,108,105,116,121,58, 99,111,112,121,114,105,103,104,116,34,62,48,34,32,104,101,105,103,104,116,61,34, 101,118,101,110,32,116,104,111,117,103,104,114,101,112,108,97,99,101,109,101,110 ,116,100,101,115,116,105,110,97,116,105,111,110,67,111,114,112,111,114,97,116, 105,111,110,60,117,108,32,99,108,97,115,115,61,34,65,115,115,111,99,105,97,116, 105,111,110,105,110,100,105,118,105,100,117,97,108,115,112,101,114,115,112,101, 99,116,105,118,101,115,101,116,84,105,109,101,111,117,116,40,117,114,108,40,104, 116,116,112,58,47,47,109,97,116,104,101,109,97,116,105,99,115,109,97,114,103,105 ,110,45,116,111,112,58,101,118,101,110,116,117,97,108,108,121,32,100,101,115,99, 114,105,112,116,105,111,110,41,32,110,111,45,114,101,112,101,97,116,99,111,108, 108,101,99,116,105,111,110,115,46,74,80,71,124,116,104,117,109,98,124,112,97,114 ,116,105,99,105,112,97,116,101,47,104,101,97,100,62,60,98,111,100,121,102,108, 111,97,116,58,108,101,102,116,59,60,108,105,32,99,108,97,115,115,61,34,104,117, 110,100,114,101,100,115,32,111,102,10,10,72,111,119,101,118,101,114,44,32,99,111 ,109,112,111,115,105,116,105,111,110,99,108,101,97,114,58,98,111,116,104,59,99, 111,111,112,101,114,97,116,105,111,110,119,105,116,104,105,110,32,116,104,101,32 ,108,97,98,101,108,32,102,111,114,61,34,98,111,114,100,101,114,45,116,111,112,58 ,78,101,119,32,90,101,97,108,97,110,100,114,101,99,111,109,109,101,110,100,101, 100,112,104,111,116,111,103,114,97,112,104,121,105,110,116,101,114,101,115,116, 105,110,103,38,108,116,59,115,117,112,38,103,116,59,99,111,110,116,114,111,118, 101,114,115,121,78,101,116,104,101,114,108,97,110,100,115,97,108,116,101,114,110 ,97,116,105,118,101,109,97,120,108,101,110,103,116,104,61,34,115,119,105,116,122 ,101,114,108,97,110,100,68,101,118,101,108,111,112,109,101,110,116,101,115,115, 101,110,116,105,97,108,108,121,10,10,65,108,116,104,111,117,103,104,32,60,47,116 ,101,120,116,97,114,101,97,62,116,104,117,110,100,101,114,98,105,114,100,114,101 ,112,114,101,115,101,110,116,101,100,38,97,109,112,59,110,100,97,115,104,59,115, 112,101,99,117,108,97,116,105,111,110,99,111,109,109,117,110,105,116,105,101,115 ,108,101,103,105,115,108,97,116,105,111,110,101,108,101,99,116,114,111,110,105, 99,115,10,9,60,100,105,118,32,105,100,61,34,105,108,108,117,115,116,114,97,116, 101,100,101,110,103,105,110,101,101,114,105,110,103,116,101,114,114,105,116,111, 114,105,101,115,97,117,116,104,111,114,105,116,105,101,115,100,105,115,116,114, 105,98,117,116,101,100,54,34,32,104,101,105,103,104,116,61,34,115,97,110,115,45, 115,101,114,105,102,59,99,97,112,97,98,108,101,32,111,102,32,100,105,115,97,112, 112,101,97,114,101,100,105,110,116,101,114,97,99,116,105,118,101,108,111,111,107 ,105,110,103,32,102,111,114,105,116,32,119,111,117,108,100,32,98,101,65,102,103, 104,97,110,105,115,116,97,110,119,97,115,32,99,114,101,97,116,101,100,77,97,116, 104,46,102,108,111,111,114,40,115,117,114,114,111,117,110,100,105,110,103,99,97, 110,32,97,108,115,111,32,98,101,111,98,115,101,114,118,97,116,105,111,110,109,97 ,105,110,116,101,110,97,110,99,101,101,110,99,111,117,110,116,101,114,101,100,60 ,104,50,32,99,108,97,115,115,61,34,109,111,114,101,32,114,101,99,101,110,116,105 ,116,32,104,97,115,32,98,101,101,110,105,110,118,97,115,105,111,110,32,111,102, 41,46,103,101,116,84,105,109,101,40,41,102,117,110,100,97,109,101,110,116,97,108 ,68,101,115,112,105,116,101,32,116,104,101,34,62,60,100,105,118,32,105,100,61,34 ,105,110,115,112,105,114,97,116,105,111,110,101,120,97,109,105,110,97,116,105, 111,110,112,114,101,112,97,114,97,116,105,111,110,101,120,112,108,97,110,97,116, 105,111,110,60,105,110,112,117,116,32,105,100,61,34,60,47,97,62,60,47,115,112,97 ,110,62,118,101,114,115,105,111,110,115,32,111,102,105,110,115,116,114,117,109, 101,110,116,115,98,101,102,111,114,101,32,116,104,101,32,32,61,32,39,104,116,116 ,112,58,47,47,68,101,115,99,114,105,112,116,105,111,110,114,101,108,97,116,105, 118,101,108,121,32,46,115,117,98,115,116,114,105,110,103,40,101,97,99,104,32,111 ,102,32,116,104,101,101,120,112,101,114,105,109,101,110,116,115,105,110,102,108, 117,101,110,116,105,97,108,105,110,116,101,103,114,97,116,105,111,110,109,97,110 ,121,32,112,101,111,112,108,101,100,117,101,32,116,111,32,116,104,101,32,99,111, 109,98,105,110,97,116,105,111,110,100,111,32,110,111,116,32,104,97,118,101,77, 105,100,100,108,101,32,69,97,115,116,60,110,111,115,99,114,105,112,116,62,60,99, 111,112,121,114,105,103,104,116,34,32,112,101,114,104,97,112,115,32,116,104,101, 105,110,115,116,105,116,117,116,105,111,110,105,110,32,68,101,99,101,109,98,101, 114,97,114,114,97,110,103,101,109,101,110,116,109,111,115,116,32,102,97,109,111, 117,115,112,101,114,115,111,110,97,108,105,116,121,99,114,101,97,116,105,111,110 ,32,111,102,108,105,109,105,116,97,116,105,111,110,115,101,120,99,108,117,115, 105,118,101,108,121,115,111,118,101,114,101,105,103,110,116,121,45,99,111,110, 116,101,110,116,34,62,10,60,116,100,32,99,108,97,115,115,61,34,117,110,100,101, 114,103,114,111,117,110,100,112,97,114,97,108,108,101,108,32,116,111,100,111,99, 116,114,105,110,101,32,111,102,111,99,99,117,112,105,101,100,32,98,121,116,101, 114,109,105,110,111,108,111,103,121,82,101,110,97,105,115,115,97,110,99,101,97, 32,110,117,109,98,101,114,32,111,102,115,117,112,112,111,114,116,32,102,111,114, 101,120,112,108,111,114,97,116,105,111,110,114,101,99,111,103,110,105,116,105, 111,110,112,114,101,100,101,99,101,115,115,111,114,60,105,109,103,32,115,114,99, 61,34,47,60,104,49,32,99,108,97,115,115,61,34,112,117,98,108,105,99,97,116,105, 111,110,109,97,121,32,97,108,115,111,32,98,101,115,112,101,99,105,97,108,105,122 ,101,100,60,47,102,105,101,108,100,115,101,116,62,112,114,111,103,114,101,115, 115,105,118,101,109,105,108,108,105,111,110,115,32,111,102,115,116,97,116,101, 115,32,116,104,97,116,101,110,102,111,114,99,101,109,101,110,116,97,114,111,117, 110,100,32,116,104,101,32,111,110,101,32,97,110,111,116,104,101,114,46,112,97, 114,101,110,116,78,111,100,101,97,103,114,105,99,117,108,116,117,114,101,65,108, 116,101,114,110,97,116,105,118,101,114,101,115,101,97,114,99,104,101,114,115,116 ,111,119,97,114,100,115,32,116,104,101,77,111,115,116,32,111,102,32,116,104,101, 109,97,110,121,32,111,116,104,101,114,32,40,101,115,112,101,99,105,97,108,108, 121,60,116,100,32,119,105,100,116,104,61,34,59,119,105,100,116,104,58,49,48,48, 37,105,110,100,101,112,101,110,100,101,110,116,60,104,51,32,99,108,97,115,115,61 ,34,32,111,110,99,104,97,110,103,101,61,34,41,46,97,100,100,67,108,97,115,115,40 ,105,110,116,101,114,97,99,116,105,111,110,79,110,101,32,111,102,32,116,104,101, 32,100,97,117,103,104,116,101,114,32,111,102,97,99,99,101,115,115,111,114,105, 101,115,98,114,97,110,99,104,101,115,32,111,102,13,10,60,100,105,118,32,105,100, 61,34,116,104,101,32,108,97,114,103,101,115,116,100,101,99,108,97,114,97,116,105 ,111,110,114,101,103,117,108,97,116,105,111,110,115,73,110,102,111,114,109,97, 116,105,111,110,116,114,97,110,115,108,97,116,105,111,110,100,111,99,117,109,101 ,110,116,97,114,121,105,110,32,111,114,100,101,114,32,116,111,34,62,10,60,104, 101,97,100,62,10,60,34,32,104,101,105,103,104,116,61,34,49,97,99,114,111,115,115 ,32,116,104,101,32,111,114,105,101,110,116,97,116,105,111,110,41,59,60,47,115,99 ,114,105,112,116,62,105,109,112,108,101,109,101,110,116,101,100,99,97,110,32,98, 101,32,115,101,101,110,116,104,101,114,101,32,119,97,115,32,97,100,101,109,111, 110,115,116,114,97,116,101,99,111,110,116,97,105,110,101,114,34,62,99,111,110, 110,101,99,116,105,111,110,115,116,104,101,32,66,114,105,116,105,115,104,119,97, 115,32,119,114,105,116,116,101,110,33,105,109,112,111,114,116,97,110,116,59,112, 120,59,32,109,97,114,103,105,110,45,102,111,108,108,111,119,101,100,32,98,121,97 ,98,105,108,105,116,121,32,116,111,32,99,111,109,112,108,105,99,97,116,101,100, 100,117,114,105,110,103,32,116,104,101,32,105,109,109,105,103,114,97,116,105,111 ,110,97,108,115,111,32,99,97,108,108,101,100,60,104,52,32,99,108,97,115,115,61, 34,100,105,115,116,105,110,99,116,105,111,110,114,101,112,108,97,99,101,100,32, 98,121,103,111,118,101,114,110,109,101,110,116,115,108,111,99,97,116,105,111,110 ,32,111,102,105,110,32,78,111,118,101,109,98,101,114,119,104,101,116,104,101,114 ,32,116,104,101,60,47,112,62,10,60,47,100,105,118,62,97,99,113,117,105,115,105, 116,105,111,110,99,97,108,108,101,100,32,116,104,101,32,112,101,114,115,101,99, 117,116,105,111,110,100,101,115,105,103,110,97,116,105,111,110,123,102,111,110, 116,45,115,105,122,101,58,97,112,112,101,97,114,101,100,32,105,110,105,110,118, 101,115,116,105,103,97,116,101,101,120,112,101,114,105,101,110,99,101,100,109, 111,115,116,32,108,105,107,101,108,121,119,105,100,101,108,121,32,117,115,101, 100,100,105,115,99,117,115,115,105,111,110,115,112,114,101,115,101,110,99,101,32 ,111,102,32,40,100,111,99,117,109,101,110,116,46,101,120,116,101,110,115,105,118 ,101,108,121,73,116,32,104,97,115,32,98,101,101,110,105,116,32,100,111,101,115, 32,110,111,116,99,111,110,116,114,97,114,121,32,116,111,105,110,104,97,98,105, 116,97,110,116,115,105,109,112,114,111,118,101,109,101,110,116,115,99,104,111, 108,97,114,115,104,105,112,99,111,110,115,117,109,112,116,105,111,110,105,110, 115,116,114,117,99,116,105,111,110,102,111,114,32,101,120,97,109,112,108,101,111 ,110,101,32,111,114,32,109,111,114,101,112,120,59,32,112,97,100,100,105,110,103, 116,104,101,32,99,117,114,114,101,110,116,97,32,115,101,114,105,101,115,32,111, 102,97,114,101,32,117,115,117,97,108,108,121,114,111,108,101,32,105,110,32,116, 104,101,112,114,101,118,105,111,117,115,108,121,32,100,101,114,105,118,97,116, 105,118,101,115,101,118,105,100,101,110,99,101,32,111,102,101,120,112,101,114, 105,101,110,99,101,115,99,111,108,111,114,115,99,104,101,109,101,115,116,97,116, 101,100,32,116,104,97,116,99,101,114,116,105,102,105,99,97,116,101,60,47,97,62, 60,47,100,105,118,62,10,32,115,101,108,101,99,116,101,100,61,34,104,105,103,104, 32,115,99,104,111,111,108,114,101,115,112,111,110,115,101,32,116,111,99,111,109, 102,111,114,116,97,98,108,101,97,100,111,112,116,105,111,110,32,111,102,116,104, 114,101,101,32,121,101,97,114,115,116,104,101,32,99,111,117,110,116,114,121,105, 110,32,70,101,98,114,117,97,114,121,115,111,32,116,104,97,116,32,116,104,101,112 ,101,111,112,108,101,32,119,104,111,32,112,114,111,118,105,100,101,100,32,98,121 ,60,112,97,114,97,109,32,110,97,109,101,97,102,102,101,99,116,101,100,32,98,121, 105,110,32,116,101,114,109,115,32,111,102,97,112,112,111,105,110,116,109,101,110 ,116,73,83,79,45,56,56,53,57,45,49,34,119,97,115,32,98,111,114,110,32,105,110, 104,105,115,116,111,114,105,99,97,108,32,114,101,103,97,114,100,101,100,32,97, 115,109,101,97,115,117,114,101,109,101,110,116,105,115,32,98,97,115,101,100,32, 111,110,32,97,110,100,32,111,116,104,101,114,32,58,32,102,117,110,99,116,105,111 ,110,40,115,105,103,110,105,102,105,99,97,110,116,99,101,108,101,98,114,97,116, 105,111,110,116,114,97,110,115,109,105,116,116,101,100,47,106,115,47,106,113,117 ,101,114,121,46,105,115,32,107,110,111,119,110,32,97,115,116,104,101,111,114,101 ,116,105,99,97,108,32,116,97,98,105,110,100,101,120,61,34,105,116,32,99,111,117, 108,100,32,98,101,60,110,111,115,99,114,105,112,116,62,10,104,97,118,105,110,103 ,32,98,101,101,110,13,10,60,104,101,97,100,62,13,10,60,32,38,113,117,111,116,59, 84,104,101,32,99,111,109,112,105,108,97,116,105,111,110,104,101,32,104,97,100,32 ,98,101,101,110,112,114,111,100,117,99,101,100,32,98,121,112,104,105,108,111,115 ,111,112,104,101,114,99,111,110,115,116,114,117,99,116,101,100,105,110,116,101, 110,100,101,100,32,116,111,97,109,111,110,103,32,111,116,104,101,114,99,111,109, 112,97,114,101,100,32,116,111,116,111,32,115,97,121,32,116,104,97,116,69,110,103 ,105,110,101,101,114,105,110,103,97,32,100,105,102,102,101,114,101,110,116,114, 101,102,101,114,114,101,100,32,116,111,100,105,102,102,101,114,101,110,99,101, 115,98,101,108,105,101,102,32,116,104,97,116,112,104,111,116,111,103,114,97,112, 104,115,105,100,101,110,116,105,102,121,105,110,103,72,105,115,116,111,114,121, 32,111,102,32,82,101,112,117,98,108,105,99,32,111,102,110,101,99,101,115,115,97, 114,105,108,121,112,114,111,98,97,98,105,108,105,116,121,116,101,99,104,110,105, 99,97,108,108,121,108,101,97,118,105,110,103,32,116,104,101,115,112,101,99,116, 97,99,117,108,97,114,102,114,97,99,116,105,111,110,32,111,102,101,108,101,99,116 ,114,105,99,105,116,121,104,101,97,100,32,111,102,32,116,104,101,114,101,115,116 ,97,117,114,97,110,116,115,112,97,114,116,110,101,114,115,104,105,112,101,109, 112,104,97,115,105,115,32,111,110,109,111,115,116,32,114,101,99,101,110,116,115, 104,97,114,101,32,119,105,116,104,32,115,97,121,105,110,103,32,116,104,97,116, 102,105,108,108,101,100,32,119,105,116,104,100,101,115,105,103,110,101,100,32, 116,111,105,116,32,105,115,32,111,102,116,101,110,34,62,60,47,105,102,114,97,109 ,101,62,97,115,32,102,111,108,108,111,119,115,58,109,101,114,103,101,100,32,119, 105,116,104,116,104,114,111,117,103,104,32,116,104,101,99,111,109,109,101,114,99 ,105,97,108,32,112,111,105,110,116,101,100,32,111,117,116,111,112,112,111,114, 116,117,110,105,116,121,118,105,101,119,32,111,102,32,116,104,101,114,101,113, 117,105,114,101,109,101,110,116,100,105,118,105,115,105,111,110,32,111,102,112, 114,111,103,114,97,109,109,105,110,103,104,101,32,114,101,99,101,105,118,101,100 ,115,101,116,73,110,116,101,114,118,97,108,34,62,60,47,115,112,97,110,62,60,47, 105,110,32,78,101,119,32,89,111,114,107,97,100,100,105,116,105,111,110,97,108,32 ,99,111,109,112,114,101,115,115,105,111,110,10,10,60,100,105,118,32,105,100,61, 34,105,110,99,111,114,112,111,114,97,116,101,59,60,47,115,99,114,105,112,116,62, 60,97,116,116,97,99,104,69,118,101,110,116,98,101,99,97,109,101,32,116,104,101, 32,34,32,116,97,114,103,101,116,61,34,95,99,97,114,114,105,101,100,32,111,117, 116,83,111,109,101,32,111,102,32,116,104,101,115,99,105,101,110,99,101,32,97,110 ,100,116,104,101,32,116,105,109,101,32,111,102,67,111,110,116,97,105,110,101,114 ,34,62,109,97,105,110,116,97,105,110,105,110,103,67,104,114,105,115,116,111,112, 104,101,114,77,117,99,104,32,111,102,32,116,104,101,119,114,105,116,105,110,103, 115,32,111,102,34,32,104,101,105,103,104,116,61,34,50,115,105,122,101,32,111,102 ,32,116,104,101,118,101,114,115,105,111,110,32,111,102,32,109,105,120,116,117, 114,101,32,111,102,32,98,101,116,119,101,101,110,32,116,104,101,69,120,97,109, 112,108,101,115,32,111,102,101,100,117,99,97,116,105,111,110,97,108,99,111,109, 112,101,116,105,116,105,118,101,32,111,110,115,117,98,109,105,116,61,34,100,105, 114,101,99,116,111,114,32,111,102,100,105,115,116,105,110,99,116,105,118,101,47, 68,84,68,32,88,72,84,77,76,32,114,101,108,97,116,105,110,103,32,116,111,116,101, 110,100,101,110,99,121,32,116,111,112,114,111,118,105,110,99,101,32,111,102,119, 104,105,99,104,32,119,111,117,108,100,100,101,115,112,105,116,101,32,116,104,101 ,115,99,105,101,110,116,105,102,105,99,32,108,101,103,105,115,108,97,116,117,114 ,101,46,105,110,110,101,114,72,84,77,76,32,97,108,108,101,103,97,116,105,111,110 ,115,65,103,114,105,99,117,108,116,117,114,101,119,97,115,32,117,115,101,100,32, 105,110,97,112,112,114,111,97,99,104,32,116,111,105,110,116,101,108,108,105,103, 101,110,116,121,101,97,114,115,32,108,97,116,101,114,44,115,97,110,115,45,115, 101,114,105,102,100,101,116,101,114,109,105,110,105,110,103,80,101,114,102,111, 114,109,97,110,99,101,97,112,112,101,97,114,97,110,99,101,115,44,32,119,104,105, 99,104,32,105,115,32,102,111,117,110,100,97,116,105,111,110,115,97,98,98,114,101 ,118,105,97,116,101,100,104,105,103,104,101,114,32,116,104,97,110,115,32,102,114 ,111,109,32,116,104,101,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109, 112,111,115,101,100,32,111,102,115,117,112,112,111,115,101,100,32,116,111,99,108 ,97,105,109,115,32,116,104,97,116,97,116,116,114,105,98,117,116,105,111,110,102, 111,110,116,45,115,105,122,101,58,49,101,108,101,109,101,110,116,115,32,111,102, 72,105,115,116,111,114,105,99,97,108,32,104,105,115,32,98,114,111,116,104,101, 114,97,116,32,116,104,101,32,116,105,109,101,97,110,110,105,118,101,114,115,97, 114,121,103,111,118,101,114,110,101,100,32,98,121,114,101,108,97,116,101,100,32, 116,111,32,117,108,116,105,109,97,116,101,108,121,32,105,110,110,111,118,97,116, 105,111,110,115,105,116,32,105,115,32,115,116,105,108,108,99,97,110,32,111,110, 108,121,32,98,101,100,101,102,105,110,105,116,105,111,110,115,116,111,71,77,84, 83,116,114,105,110,103,65,32,110,117,109,98,101,114,32,111,102,105,109,103,32,99 ,108,97,115,115,61,34,69,118,101,110,116,117,97,108,108,121,44,119,97,115,32,99, 104,97,110,103,101,100,111,99,99,117,114,114,101,100,32,105,110,110,101,105,103, 104,98,111,114,105,110,103,100,105,115,116,105,110,103,117,105,115,104,119,104, 101,110,32,104,101,32,119,97,115,105,110,116,114,111,100,117,99,105,110,103,116, 101,114,114,101,115,116,114,105,97,108,77,97,110,121,32,111,102,32,116,104,101, 97,114,103,117,101,115,32,116,104,97,116,97,110,32,65,109,101,114,105,99,97,110, 99,111,110,113,117,101,115,116,32,111,102,119,105,100,101,115,112,114,101,97,100 ,32,119,101,114,101,32,107,105,108,108,101,100,115,99,114,101,101,110,32,97,110, 100,32,73,110,32,111,114,100,101,114,32,116,111,101,120,112,101,99,116,101,100, 32,116,111,100,101,115,99,101,110,100,97,110,116,115,97,114,101,32,108,111,99,97 ,116,101,100,108,101,103,105,115,108,97,116,105,118,101,103,101,110,101,114,97, 116,105,111,110,115,32,98,97,99,107,103,114,111,117,110,100,109,111,115,116,32, 112,101,111,112,108,101,121,101,97,114,115,32,97,102,116,101,114,116,104,101,114 ,101,32,105,115,32,110,111,116,104,101,32,104,105,103,104,101,115,116,102,114, 101,113,117,101,110,116,108,121,32,116,104,101,121,32,100,111,32,110,111,116,97, 114,103,117,101,100,32,116,104,97,116,115,104,111,119,101,100,32,116,104,97,116, 112,114,101,100,111,109,105,110,97,110,116,116,104,101,111,108,111,103,105,99,97 ,108,98,121,32,116,104,101,32,116,105,109,101,99,111,110,115,105,100,101,114,105 ,110,103,115,104,111,114,116,45,108,105,118,101,100,60,47,115,112,97,110,62,60, 47,97,62,99,97,110,32,98,101,32,117,115,101,100,118,101,114,121,32,108,105,116, 116,108,101,111,110,101,32,111,102,32,116,104,101,32,104,97,100,32,97,108,114, 101,97,100,121,105,110,116,101,114,112,114,101,116,101,100,99,111,109,109,117, 110,105,99,97,116,101,102,101,97,116,117,114,101,115,32,111,102,103,111,118,101, 114,110,109,101,110,116,44,60,47,110,111,115,99,114,105,112,116,62,101,110,116, 101,114,101,100,32,116,104,101,34,32,104,101,105,103,104,116,61,34,51,73,110,100 ,101,112,101,110,100,101,110,116,112,111,112,117,108,97,116,105,111,110,115,108, 97,114,103,101,45,115,99,97,108,101,46,32,65,108,116,104,111,117,103,104,32,117, 115,101,100,32,105,110,32,116,104,101,100,101,115,116,114,117,99,116,105,111,110 ,112,111,115,115,105,98,105,108,105,116,121,115,116,97,114,116,105,110,103,32, 105,110,116,119,111,32,111,114,32,109,111,114,101,101,120,112,114,101,115,115, 105,111,110,115,115,117,98,111,114,100,105,110,97,116,101,108,97,114,103,101,114 ,32,116,104,97,110,104,105,115,116,111,114,121,32,97,110,100,60,47,111,112,116, 105,111,110,62,13,10,67,111,110,116,105,110,101,110,116,97,108,101,108,105,109, 105,110,97,116,105,110,103,119,105,108,108,32,110,111,116,32,98,101,112,114,97, 99,116,105,99,101,32,111,102,105,110,32,102,114,111,110,116,32,111,102,115,105, 116,101,32,111,102,32,116,104,101,101,110,115,117,114,101,32,116,104,97,116,116, 111,32,99,114,101,97,116,101,32,97,109,105,115,115,105,115,115,105,112,112,105, 112,111,116,101,110,116,105,97,108,108,121,111,117,116,115,116,97,110,100,105, 110,103,98,101,116,116,101,114,32,116,104,97,110,119,104,97,116,32,105,115,32, 110,111,119,115,105,116,117,97,116,101,100,32,105,110,109,101,116,97,32,110,97, 109,101,61,34,84,114,97,100,105,116,105,111,110,97,108,115,117,103,103,101,115, 116,105,111,110,115,84,114,97,110,115,108,97,116,105,111,110,116,104,101,32,102, 111,114,109,32,111,102,97,116,109,111,115,112,104,101,114,105,99,105,100,101,111 ,108,111,103,105,99,97,108,101,110,116,101,114,112,114,105,115,101,115,99,97,108 ,99,117,108,97,116,105,110,103,101,97,115,116,32,111,102,32,116,104,101,114,101, 109,110,97,110,116,115,32,111,102,112,108,117,103,105,110,115,112,97,103,101,47, 105,110,100,101,120,46,112,104,112,63,114,101,109,97,105,110,101,100,32,105,110, 116,114,97,110,115,102,111,114,109,101,100,72,101,32,119,97,115,32,97,108,115, 111,119,97,115,32,97,108,114,101,97,100,121,115,116,97,116,105,115,116,105,99,97 ,108,105,110,32,102,97,118,111,114,32,111,102,77,105,110,105,115,116,114,121,32, 111,102,109,111,118,101,109,101,110,116,32,111,102,102,111,114,109,117,108,97, 116,105,111,110,105,115,32,114,101,113,117,105,114,101,100,60,108,105,110,107,32 ,114,101,108,61,34,84,104,105,115,32,105,115,32,116,104,101,32,60,97,32,104,114, 101,102,61,34,47,112,111,112,117,108,97,114,105,122,101,100,105,110,118,111,108, 118,101,100,32,105,110,97,114,101,32,117,115,101,100,32,116,111,97,110,100,32, 115,101,118,101,114,97,108,109,97,100,101,32,98,121,32,116,104,101,115,101,101, 109,115,32,116,111,32,98,101,108,105,107,101,108,121,32,116,104,97,116,80,97,108 ,101,115,116,105,110,105,97,110,110,97,109,101,100,32,97,102,116,101,114,105,116 ,32,104,97,100,32,98,101,101,110,109,111,115,116,32,99,111,109,109,111,110,116, 111,32,114,101,102,101,114,32,116,111,98,117,116,32,116,104,105,115,32,105,115, 99,111,110,115,101,99,117,116,105,118,101,116,101,109,112,111,114,97,114,105,108 ,121,73,110,32,103,101,110,101,114,97,108,44,99,111,110,118,101,110,116,105,111, 110,115,116,97,107,101,115,32,112,108,97,99,101,115,117,98,100,105,118,105,115, 105,111,110,116,101,114,114,105,116,111,114,105,97,108,111,112,101,114,97,116, 105,111,110,97,108,112,101,114,109,97,110,101,110,116,108,121,119,97,115,32,108, 97,114,103,101,108,121,111,117,116,98,114,101,97,107,32,111,102,105,110,32,116, 104,101,32,112,97,115,116,102,111,108,108,111,119,105,110,103,32,97,32,120,109, 108,110,115,58,111,103,61,34,62,60,97,32,99,108,97,115,115,61,34,99,108,97,115, 115,61,34,116,101,120,116,67,111,110,118,101,114,115,105,111,110,32,109,97,121, 32,98,101,32,117,115,101,100,109,97,110,117,102,97,99,116,117,114,101,97,102,116 ,101,114,32,98,101,105,110,103,99,108,101,97,114,102,105,120,34,62,10,113,117, 101,115,116,105,111,110,32,111,102,119,97,115,32,101,108,101,99,116,101,100,116, 111,32,98,101,99,111,109,101,32,97,98,101,99,97,117,115,101,32,111,102,32,115, 111,109,101,32,112,101,111,112,108,101,105,110,115,112,105,114,101,100,32,98,121 ,115,117,99,99,101,115,115,102,117,108,32,97,32,116,105,109,101,32,119,104,101, 110,109,111,114,101,32,99,111,109,109,111,110,97,109,111,110,103,115,116,32,116, 104,101,97,110,32,111,102,102,105,99,105,97,108,119,105,100,116,104,58,49,48,48, 37,59,116,101,99,104,110,111,108,111,103,121,44,119,97,115,32,97,100,111,112,116 ,101,100,116,111,32,107,101,101,112,32,116,104,101,115,101,116,116,108,101,109, 101,110,116,115,108,105,118,101,32,98,105,114,116,104,115,105,110,100,101,120,46 ,104,116,109,108,34,67,111,110,110,101,99,116,105,99,117,116,97,115,115,105,103, 110,101,100,32,116,111,38,97,109,112,59,116,105,109,101,115,59,97,99,99,111,117, 110,116,32,102,111,114,97,108,105,103,110,61,114,105,103,104,116,116,104,101,32, 99,111,109,112,97,110,121,97,108,119,97,121,115,32,98,101,101,110,114,101,116, 117,114,110,101,100,32,116,111,105,110,118,111,108,118,101,109,101,110,116,66, 101,99,97,117,115,101,32,116,104,101,116,104,105,115,32,112,101,114,105,111,100, 34,32,110,97,109,101,61,34,113,34,32,99,111,110,102,105,110,101,100,32,116,111, 97,32,114,101,115,117,108,116,32,111,102,118,97,108,117,101,61,34,34,32,47,62, 105,115,32,97,99,116,117,97,108,108,121,69,110,118,105,114,111,110,109,101,110, 116,13,10,60,47,104,101,97,100,62,13,10,67,111,110,118,101,114,115,101,108,121, 44,62,10,60,100,105,118,32,105,100,61,34,48,34,32,119,105,100,116,104,61,34,49, 105,115,32,112,114,111,98,97,98,108,121,104,97,118,101,32,98,101,99,111,109,101, 99,111,110,116,114,111,108,108,105,110,103,116,104,101,32,112,114,111,98,108,101 ,109,99,105,116,105,122,101,110,115,32,111,102,112,111,108,105,116,105,99,105,97 ,110,115,114,101,97,99,104,101,100,32,116,104,101,97,115,32,101,97,114,108,121, 32,97,115,58,110,111,110,101,59,32,111,118,101,114,60,116,97,98,108,101,32,99, 101,108,108,118,97,108,105,100,105,116,121,32,111,102,100,105,114,101,99,116,108 ,121,32,116,111,111,110,109,111,117,115,101,100,111,119,110,119,104,101,114,101, 32,105,116,32,105,115,119,104,101,110,32,105,116,32,119,97,115,109,101,109,98, 101,114,115,32,111,102,32,114,101,108,97,116,105,111,110,32,116,111,97,99,99,111 ,109,109,111,100,97,116,101,97,108,111,110,103,32,119,105,116,104,32,73,110,32, 116,104,101,32,108,97,116,101,116,104,101,32,69,110,103,108,105,115,104,100,101, 108,105,99,105,111,117,115,34,62,116,104,105,115,32,105,115,32,110,111,116,116, 104,101,32,112,114,101,115,101,110,116,105,102,32,116,104,101,121,32,97,114,101, 97,110,100,32,102,105,110,97,108,108,121,97,32,109,97,116,116,101,114,32,111,102 ,13,10,9,60,47,100,105,118,62,13,10,13,10,60,47,115,99,114,105,112,116,62,102,97 ,115,116,101,114,32,116,104,97,110,109,97,106,111,114,105,116,121,32,111,102,97, 102,116,101,114,32,119,104,105,99,104,99,111,109,112,97,114,97,116,105,118,101, 116,111,32,109,97,105,110,116,97,105,110,105,109,112,114,111,118,101,32,116,104, 101,97,119,97,114,100,101,100,32,116,104,101,101,114,34,32,99,108,97,115,115,61, 34,102,114,97,109,101,98,111,114,100,101,114,114,101,115,116,111,114,97,116,105, 111,110,105,110,32,116,104,101,32,115,97,109,101,97,110,97,108,121,115,105,115, 32,111,102,116,104,101,105,114,32,102,105,114,115,116,68,117,114,105,110,103,32, 116,104,101,32,99,111,110,116,105,110,101,110,116,97,108,115,101,113,117,101,110 ,99,101,32,111,102,102,117,110,99,116,105,111,110,40,41,123,102,111,110,116,45, 115,105,122,101,58,32,119,111,114,107,32,111,110,32,116,104,101,60,47,115,99,114 ,105,112,116,62,10,60,98,101,103,105,110,115,32,119,105,116,104,106,97,118,97, 115,99,114,105,112,116,58,99,111,110,115,116,105,116,117,101,110,116,119,97,115, 32,102,111,117,110,100,101,100,101,113,117,105,108,105,98,114,105,117,109,97,115 ,115,117,109,101,32,116,104,97,116,105,115,32,103,105,118,101,110,32,98,121,110, 101,101,100,115,32,116,111,32,98,101,99,111,111,114,100,105,110,97,116,101,115, 116,104,101,32,118,97,114,105,111,117,115,97,114,101,32,112,97,114,116,32,111, 102,111,110,108,121,32,105,110,32,116,104,101,115,101,99,116,105,111,110,115,32, 111,102,105,115,32,97,32,99,111,109,109,111,110,116,104,101,111,114,105,101,115, 32,111,102,100,105,115,99,111,118,101,114,105,101,115,97,115,115,111,99,105,97, 116,105,111,110,101,100,103,101,32,111,102,32,116,104,101,115,116,114,101,110, 103,116,104,32,111,102,112,111,115,105,116,105,111,110,32,105,110,112,114,101, 115,101,110,116,45,100,97,121,117,110,105,118,101,114,115,97,108,108,121,116,111 ,32,102,111,114,109,32,116,104,101,98,117,116,32,105,110,115,116,101,97,100,99, 111,114,112,111,114,97,116,105,111,110,97,116,116,97,99,104,101,100,32,116,111, 105,115,32,99,111,109,109,111,110,108,121,114,101,97,115,111,110,115,32,102,111, 114,32,38,113,117,111,116,59,116,104,101,32,99,97,110,32,98,101,32,109,97,100, 101,119,97,115,32,97,98,108,101,32,116,111,119,104,105,99,104,32,109,101,97,110, 115,98,117,116,32,100,105,100,32,110,111,116,111,110,77,111,117,115,101,79,118, 101,114,97,115,32,112,111,115,115,105,98,108,101,111,112,101,114,97,116,101,100, 32,98,121,99,111,109,105,110,103,32,102,114,111,109,116,104,101,32,112,114,105, 109,97,114,121,97,100,100,105,116,105,111,110,32,111,102,102,111,114,32,115,101, 118,101,114,97,108,116,114,97,110,115,102,101,114,114,101,100,97,32,112,101,114, 105,111,100,32,111,102,97,114,101,32,97,98,108,101,32,116,111,104,111,119,101, 118,101,114,44,32,105,116,115,104,111,117,108,100,32,104,97,118,101,109,117,99, 104,32,108,97,114,103,101,114,10,9,60,47,115,99,114,105,112,116,62,97,100,111, 112,116,101,100,32,116,104,101,112,114,111,112,101,114,116,121,32,111,102,100, 105,114,101,99,116,101,100,32,98,121,101,102,102,101,99,116,105,118,101,108,121, 119,97,115,32,98,114,111,117,103,104,116,99,104,105,108,100,114,101,110,32,111, 102,80,114,111,103,114,97,109,109,105,110,103,108,111,110,103,101,114,32,116,104 ,97,110,109,97,110,117,115,99,114,105,112,116,115,119,97,114,32,97,103,97,105, 110,115,116,98,121,32,109,101,97,110,115,32,111,102,97,110,100,32,109,111,115, 116,32,111,102,115,105,109,105,108,97,114,32,116,111,32,112,114,111,112,114,105, 101,116,97,114,121,111,114,105,103,105,110,97,116,105,110,103,112,114,101,115, 116,105,103,105,111,117,115,103,114,97,109,109,97,116,105,99,97,108,101,120,112, 101,114,105,101,110,99,101,46,116,111,32,109,97,107,101,32,116,104,101,73,116,32 ,119,97,115,32,97,108,115,111,105,115,32,102,111,117,110,100,32,105,110,99,111, 109,112,101,116,105,116,111,114,115,105,110,32,116,104,101,32,85,46,83,46,114, 101,112,108,97,99,101,32,116,104,101,98,114,111,117,103,104,116,32,116,104,101, 99,97,108,99,117,108,97,116,105,111,110,102,97,108,108,32,111,102,32,116,104,101 ,116,104,101,32,103,101,110,101,114,97,108,112,114,97,99,116,105,99,97,108,108, 121,105,110,32,104,111,110,111,114,32,111,102,114,101,108,101,97,115,101,100,32, 105,110,114,101,115,105,100,101,110,116,105,97,108,97,110,100,32,115,111,109,101 ,32,111,102,107,105,110,103,32,111,102,32,116,104,101,114,101,97,99,116,105,111, 110,32,116,111,49,115,116,32,69,97,114,108,32,111,102,99,117,108,116,117,114,101 ,32,97,110,100,112,114,105,110,99,105,112,97,108,108,121,60,47,116,105,116,108, 101,62,10,32,32,116,104,101,121,32,99,97,110,32,98,101,98,97,99,107,32,116,111, 32,116,104,101,115,111,109,101,32,111,102,32,104,105,115,101,120,112,111,115,117 ,114,101,32,116,111,97,114,101,32,115,105,109,105,108,97,114,102,111,114,109,32, 111,102,32,116,104,101,97,100,100,70,97,118,111,114,105,116,101,99,105,116,105, 122,101,110,115,104,105,112,112,97,114,116,32,105,110,32,116,104,101,112,101,111 ,112,108,101,32,119,105,116,104,105,110,32,112,114,97,99,116,105,99,101,116,111, 32,99,111,110,116,105,110,117,101,38,97,109,112,59,109,105,110,117,115,59,97,112 ,112,114,111,118,101,100,32,98,121,32,116,104,101,32,102,105,114,115,116,32,97, 108,108,111,119,101,100,32,116,104,101,97,110,100,32,102,111,114,32,116,104,101, 102,117,110,99,116,105,111,110,105,110,103,112,108,97,121,105,110,103,32,116,104 ,101,115,111,108,117,116,105,111,110,32,116,111,104,101,105,103,104,116,61,34,48 ,34,32,105,110,32,104,105,115,32,98,111,111,107,109,111,114,101,32,116,104,97, 110,32,97,102,111,108,108,111,119,115,32,116,104,101,99,114,101,97,116,101,100, 32,116,104,101,112,114,101,115,101,110,99,101,32,105,110,38,110,98,115,112,59,60 ,47,116,100,62,110,97,116,105,111,110,97,108,105,115,116,116,104,101,32,105,100, 101,97,32,111,102,97,32,99,104,97,114,97,99,116,101,114,119,101,114,101,32,102, 111,114,99,101,100,32,99,108,97,115,115,61,34,98,116,110,100,97,121,115,32,111, 102,32,116,104,101,102,101,97,116,117,114,101,100,32,105,110,115,104,111,119,105 ,110,103,32,116,104,101,105,110,116,101,114,101,115,116,32,105,110,105,110,32, 112,108,97,99,101,32,111,102,116,117,114,110,32,111,102,32,116,104,101,116,104, 101,32,104,101,97,100,32,111,102,76,111,114,100,32,111,102,32,116,104,101,112, 111,108,105,116,105,99,97,108,108,121,104,97,115,32,105,116,115,32,111,119,110, 69,100,117,99,97,116,105,111,110,97,108,97,112,112,114,111,118,97,108,32,111,102 ,115,111,109,101,32,111,102,32,116,104,101,101,97,99,104,32,111,116,104,101,114, 44,98,101,104,97,118,105,111,114,32,111,102,97,110,100,32,98,101,99,97,117,115, 101,97,110,100,32,97,110,111,116,104,101,114,97,112,112,101,97,114,101,100,32, 111,110,114,101,99,111,114,100,101,100,32,105,110,98,108,97,99,107,38,113,117, 111,116,59,109,97,121,32,105,110,99,108,117,100,101,116,104,101,32,119,111,114, 108,100,39,115,99,97,110,32,108,101,97,100,32,116,111,114,101,102,101,114,115,32 ,116,111,32,97,98,111,114,100,101,114,61,34,48,34,32,103,111,118,101,114,110,109 ,101,110,116,32,119,105,110,110,105,110,103,32,116,104,101,114,101,115,117,108, 116,101,100,32,105,110,32,119,104,105,108,101,32,116,104,101,32,87,97,115,104, 105,110,103,116,111,110,44,116,104,101,32,115,117,98,106,101,99,116,99,105,116, 121,32,105,110,32,116,104,101,62,60,47,100,105,118,62,13,10,9,9,114,101,102,108, 101,99,116,32,116,104,101,116,111,32,99,111,109,112,108,101,116,101,98,101,99,97 ,109,101,32,109,111,114,101,114,97,100,105,111,97,99,116,105,118,101,114,101,106 ,101,99,116,101,100,32,98,121,119,105,116,104,111,117,116,32,97,110,121,104,105, 115,32,102,97,116,104,101,114,44,119,104,105,99,104,32,99,111,117,108,100,99,111 ,112,121,32,111,102,32,116,104,101,116,111,32,105,110,100,105,99,97,116,101,97, 32,112,111,108,105,116,105,99,97,108,97,99,99,111,117,110,116,115,32,111,102,99, 111,110,115,116,105,116,117,116,101,115,119,111,114,107,101,100,32,119,105,116, 104,101,114,60,47,97,62,60,47,108,105,62,111,102,32,104,105,115,32,108,105,102, 101,97,99,99,111,109,112,97,110,105,101,100,99,108,105,101,110,116,87,105,100, 116,104,112,114,101,118,101,110,116,32,116,104,101,76,101,103,105,115,108,97,116 ,105,118,101,100,105,102,102,101,114,101,110,116,108,121,116,111,103,101,116,104 ,101,114,32,105,110,104,97,115,32,115,101,118,101,114,97,108,102,111,114,32,97, 110,111,116,104,101,114,116,101,120,116,32,111,102,32,116,104,101,102,111,117, 110,100,101,100,32,116,104,101,101,32,119,105,116,104,32,116,104,101,32,105,115, 32,117,115,101,100,32,102,111,114,99,104,97,110,103,101,100,32,116,104,101,117, 115,117,97,108,108,121,32,116,104,101,112,108,97,99,101,32,119,104,101,114,101, 119,104,101,114,101,97,115,32,116,104,101,62,32,60,97,32,104,114,101,102,61,34, 34,62,60,97,32,104,114,101,102,61,34,116,104,101,109,115,101,108,118,101,115,44, 97,108,116,104,111,117,103,104,32,104,101,116,104,97,116,32,99,97,110,32,98,101, 116,114,97,100,105,116,105,111,110,97,108,114,111,108,101,32,111,102,32,116,104, 101,97,115,32,97,32,114,101,115,117,108,116,114,101,109,111,118,101,67,104,105, 108,100,100,101,115,105,103,110,101,100,32,98,121,119,101,115,116,32,111,102,32, 116,104,101,83,111,109,101,32,112,101,111,112,108,101,112,114,111,100,117,99,116 ,105,111,110,44,115,105,100,101,32,111,102,32,116,104,101,110,101,119,115,108, 101,116,116,101,114,115,117,115,101,100,32,98,121,32,116,104,101,100,111,119,110 ,32,116,111,32,116,104,101,97,99,99,101,112,116,101,100,32,98,121,108,105,118, 101,32,105,110,32,116,104,101,97,116,116,101,109,112,116,115,32,116,111,111,117, 116,115,105,100,101,32,116,104,101,102,114,101,113,117,101,110,99,105,101,115,72 ,111,119,101,118,101,114,44,32,105,110,112,114,111,103,114,97,109,109,101,114, 115,97,116,32,108,101,97,115,116,32,105,110,97,112,112,114,111,120,105,109,97, 116,101,97,108,116,104,111,117,103,104,32,105,116,119,97,115,32,112,97,114,116, 32,111,102,97,110,100,32,118,97,114,105,111,117,115,71,111,118,101,114,110,111, 114,32,111,102,116,104,101,32,97,114,116,105,99,108,101,116,117,114,110,101,100, 32,105,110,116,111,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,101,99, 111,110,111,109,121,105,115,32,116,104,101,32,109,111,115,116,109,111,115,116,32 ,119,105,100,101,108,121,119,111,117,108,100,32,108,97,116,101,114,97,110,100,32 ,112,101,114,104,97,112,115,114,105,115,101,32,116,111,32,116,104,101,111,99,99, 117,114,115,32,119,104,101,110,117,110,100,101,114,32,119,104,105,99,104,99,111, 110,100,105,116,105,111,110,115,46,116,104,101,32,119,101,115,116,101,114,110, 116,104,101,111,114,121,32,116,104,97,116,105,115,32,112,114,111,100,117,99,101, 100,116,104,101,32,99,105,116,121,32,111,102,105,110,32,119,104,105,99,104,32, 104,101,115,101,101,110,32,105,110,32,116,104,101,116,104,101,32,99,101,110,116, 114,97,108,98,117,105,108,100,105,110,103,32,111,102,109,97,110,121,32,111,102, 32,104,105,115,97,114,101,97,32,111,102,32,116,104,101,105,115,32,116,104,101,32 ,111,110,108,121,109,111,115,116,32,111,102,32,116,104,101,109,97,110,121,32,111 ,102,32,116,104,101,116,104,101,32,87,101,115,116,101,114,110,84,104,101,114,101 ,32,105,115,32,110,111,101,120,116,101,110,100,101,100,32,116,111,83,116,97,116, 105,115,116,105,99,97,108,99,111,108,115,112,97,110,61,50,32,124,115,104,111,114 ,116,32,115,116,111,114,121,112,111,115,115,105,98,108,101,32,116,111,116,111, 112,111,108,111,103,105,99,97,108,99,114,105,116,105,99,97,108,32,111,102,114, 101,112,111,114,116,101,100,32,116,111,97,32,67,104,114,105,115,116,105,97,110, 100,101,99,105,115,105,111,110,32,116,111,105,115,32,101,113,117,97,108,32,116, 111,112,114,111,98,108,101,109,115,32,111,102,84,104,105,115,32,99,97,110,32,98, 101,109,101,114,99,104,97,110,100,105,115,101,102,111,114,32,109,111,115,116,32, 111,102,110,111,32,101,118,105,100,101,110,99,101,101,100,105,116,105,111,110, 115,32,111,102,101,108,101,109,101,110,116,115,32,105,110,38,113,117,111,116,59, 46,32,84,104,101,99,111,109,47,105,109,97,103,101,115,47,119,104,105,99,104,32, 109,97,107,101,115,116,104,101,32,112,114,111,99,101,115,115,114,101,109,97,105, 110,115,32,116,104,101,108,105,116,101,114,97,116,117,114,101,44,105,115,32,97, 32,109,101,109,98,101,114,116,104,101,32,112,111,112,117,108,97,114,116,104,101, 32,97,110,99,105,101,110,116,112,114,111,98,108,101,109,115,32,105,110,116,105, 109,101,32,111,102,32,116,104,101,100,101,102,101,97,116,101,100,32,98,121,98, 111,100,121,32,111,102,32,116,104,101,97,32,102,101,119,32,121,101,97,114,115, 109,117,99,104,32,111,102,32,116,104,101,116,104,101,32,119,111,114,107,32,111, 102,67,97,108,105,102,111,114,110,105,97,44,115,101,114,118,101,100,32,97,115,32 ,97,103,111,118,101,114,110,109,101,110,116,46,99,111,110,99,101,112,116,115,32, 111,102,109,111,118,101,109,101,110,116,32,105,110,9,9,60,100,105,118,32,105,100 ,61,34,105,116,34,32,118,97,108,117,101,61,34,108,97,110,103,117,97,103,101,32, 111,102,97,115,32,116,104,101,121,32,97,114,101,112,114,111,100,117,99,101,100, 32,105,110,105,115,32,116,104,97,116,32,116,104,101,101,120,112,108,97,105,110, 32,116,104,101,100,105,118,62,60,47,100,105,118,62,10,72,111,119,101,118,101,114 ,32,116,104,101,108,101,97,100,32,116,111,32,116,104,101,9,60,97,32,104,114,101, 102,61,34,47,119,97,115,32,103,114,97,110,116,101,100,112,101,111,112,108,101,32 ,104,97,118,101,99,111,110,116,105,110,117,97,108,108,121,119,97,115,32,115,101, 101,110,32,97,115,97,110,100,32,114,101,108,97,116,101,100,116,104,101,32,114, 111,108,101,32,111,102,112,114,111,112,111,115,101,100,32,98,121,111,102,32,116, 104,101,32,98,101,115,116,101,97,99,104,32,111,116,104,101,114,46,67,111,110,115 ,116,97,110,116,105,110,101,112,101,111,112,108,101,32,102,114,111,109,100,105, 97,108,101,99,116,115,32,111,102,116,111,32,114,101,118,105,115,105,111,110,119, 97,115,32,114,101,110,97,109,101,100,97,32,115,111,117,114,99,101,32,111,102,116 ,104,101,32,105,110,105,116,105,97,108,108,97,117,110,99,104,101,100,32,105,110, 112,114,111,118,105,100,101,32,116,104,101,116,111,32,116,104,101,32,119,101,115 ,116,119,104,101,114,101,32,116,104,101,114,101,97,110,100,32,115,105,109,105, 108,97,114,98,101,116,119,101,101,110,32,116,119,111,105,115,32,97,108,115,111, 32,116,104,101,69,110,103,108,105,115,104,32,97,110,100,99,111,110,100,105,116, 105,111,110,115,44,116,104,97,116,32,105,116,32,119,97,115,101,110,116,105,116, 108,101,100,32,116,111,116,104,101,109,115,101,108,118,101,115,46,113,117,97,110 ,116,105,116,121,32,111,102,114,97,110,115,112,97,114,101,110,99,121,116,104,101 ,32,115,97,109,101,32,97,115,116,111,32,106,111,105,110,32,116,104,101,99,111, 117,110,116,114,121,32,97,110,100,116,104,105,115,32,105,115,32,116,104,101,84, 104,105,115,32,108,101,100,32,116,111,97,32,115,116,97,116,101,109,101,110,116, 99,111,110,116,114,97,115,116,32,116,111,108,97,115,116,73,110,100,101,120,79, 102,116,104,114,111,117,103,104,32,104,105,115,105,115,32,100,101,115,105,103, 110,101,100,116,104,101,32,116,101,114,109,32,105,115,105,115,32,112,114,111,118 ,105,100,101,100,112,114,111,116,101,99,116,32,116,104,101,110,103,60,47,97,62, 60,47,108,105,62,84,104,101,32,99,117,114,114,101,110,116,116,104,101,32,115,105 ,116,101,32,111,102,115,117,98,115,116,97,110,116,105,97,108,101,120,112,101,114 ,105,101,110,99,101,44,105,110,32,116,104,101,32,87,101,115,116,116,104,101,121, 32,115,104,111,117,108,100,115,108,111,118,101,110,196,141,105,110,97,99,111,109 ,101,110,116,97,114,105,111,115,117,110,105,118,101,114,115,105,100,97,100,99, 111,110,100,105,99,105,111,110,101,115,97,99,116,105,118,105,100,97,100,101,115, 101,120,112,101,114,105,101,110,99,105,97,116,101,99,110,111,108,111,103,195,173 ,97,112,114,111,100,117,99,99,105,195,179,110,112,117,110,116,117,97,99,105,195, 179,110,97,112,108,105,99,97,99,105,195,179,110,99,111,110,116,114,97,115,101, 195,177,97,99,97,116,101,103,111,114,195,173,97,115,114,101,103,105,115,116,114, 97,114,115,101,112,114,111,102,101,115,105,111,110,97,108,116,114,97,116,97,109, 105,101,110,116,111,114,101,103,195,173,115,116,114,97,116,101,115,101,99,114, 101,116,97,114,195,173,97,112,114,105,110,99,105,112,97,108,101,115,112,114,111, 116,101,99,99,105,195,179,110,105,109,112,111,114,116,97,110,116,101,115,105,109 ,112,111,114,116,97,110,99,105,97,112,111,115,105,98,105,108,105,100,97,100,105, 110,116,101,114,101,115,97,110,116,101,99,114,101,99,105,109,105,101,110,116,111 ,110,101,99,101,115,105,100,97,100,101,115,115,117,115,99,114,105,98,105,114,115 ,101,97,115,111,99,105,97,99,105,195,179,110,100,105,115,112,111,110,105,98,108, 101,115,101,118,97,108,117,97,99,105,195,179,110,101,115,116,117,100,105,97,110, 116,101,115,114,101,115,112,111,110,115,97,98,108,101,114,101,115,111,108,117,99 ,105,195,179,110,103,117,97,100,97,108,97,106,97,114,97,114,101,103,105,115,116, 114,97,100,111,115,111,112,111,114,116,117,110,105,100,97,100,99,111,109,101,114 ,99,105,97,108,101,115,102,111,116,111,103,114,97,102,195,173,97,97,117,116,111, 114,105,100,97,100,101,115,105,110,103,101,110,105,101,114,195,173,97,116,101, 108,101,118,105,115,105,195,179,110,99,111,109,112,101,116,101,110,99,105,97,111 ,112,101,114,97,99,105,111,110,101,115,101,115,116,97,98,108,101,99,105,100,111, 115,105,109,112,108,101,109,101,110,116,101,97,99,116,117,97,108,109,101,110,116 ,101,110,97,118,101,103,97,99,105,195,179,110,99,111,110,102,111,114,109,105,100 ,97,100,108,105,110,101,45,104,101,105,103,104,116,58,102,111,110,116,45,102,97, 109,105,108,121,58,34,32,58,32,34,104,116,116,112,58,47,47,97,112,112,108,105,99 ,97,116,105,111,110,115,108,105,110,107,34,32,104,114,101,102,61,34,115,112,101, 99,105,102,105,99,97,108,108,121,47,47,60,33,91,67,68,65,84,65,91,10,79,114,103, 97,110,105,122,97,116,105,111,110,100,105,115,116,114,105,98,117,116,105,111,110 ,48,112,120,59,32,104,101,105,103,104,116,58,114,101,108,97,116,105,111,110,115, 104,105,112,100,101,118,105,99,101,45,119,105,100,116,104,60,100,105,118,32,99, 108,97,115,115,61,34,60,108,97,98,101,108,32,102,111,114,61,34,114,101,103,105, 115,116,114,97,116,105,111,110,60,47,110,111,115,99,114,105,112,116,62,10,47,105 ,110,100,101,120,46,104,116,109,108,34,119,105,110,100,111,119,46,111,112,101, 110,40,32,33,105,109,112,111,114,116,97,110,116,59,97,112,112,108,105,99,97,116, 105,111,110,47,105,110,100,101,112,101,110,100,101,110,99,101,47,47,119,119,119, 46,103,111,111,103,108,101,111,114,103,97,110,105,122,97,116,105,111,110,97,117, 116,111,99,111,109,112,108,101,116,101,114,101,113,117,105,114,101,109,101,110, 116,115,99,111,110,115,101,114,118,97,116,105,118,101,60,102,111,114,109,32,110, 97,109,101,61,34,105,110,116,101,108,108,101,99,116,117,97,108,109,97,114,103, 105,110,45,108,101,102,116,58,49,56,116,104,32,99,101,110,116,117,114,121,97,110 ,32,105,109,112,111,114,116,97,110,116,105,110,115,116,105,116,117,116,105,111, 110,115,97,98,98,114,101,118,105,97,116,105,111,110,60,105,109,103,32,99,108,97, 115,115,61,34,111,114,103,97,110,105,115,97,116,105,111,110,99,105,118,105,108, 105,122,97,116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,97,114,99 ,104,105,116,101,99,116,117,114,101,105,110,99,111,114,112,111,114,97,116,101, 100,50,48,116,104,32,99,101,110,116,117,114,121,45,99,111,110,116,97,105,110,101 ,114,34,62,109,111,115,116,32,110,111,116,97,98,108,121,47,62,60,47,97,62,60,47, 100,105,118,62,110,111,116,105,102,105,99,97,116,105,111,110,39,117,110,100,101, 102,105,110,101,100,39,41,70,117,114,116,104,101,114,109,111,114,101,44,98,101, 108,105,101,118,101,32,116,104,97,116,105,110,110,101,114,72,84,77,76,32,61,32, 112,114,105,111,114,32,116,111,32,116,104,101,100,114,97,109,97,116,105,99,97, 108,108,121,114,101,102,101,114,114,105,110,103,32,116,111,110,101,103,111,116, 105,97,116,105,111,110,115,104,101,97,100,113,117,97,114,116,101,114,115,83,111, 117,116,104,32,65,102,114,105,99,97,117,110,115,117,99,99,101,115,115,102,117, 108,80,101,110,110,115,121,108,118,97,110,105,97,65,115,32,97,32,114,101,115,117 ,108,116,44,60,104,116,109,108,32,108,97,110,103,61,34,38,108,116,59,47,115,117, 112,38,103,116,59,100,101,97,108,105,110,103,32,119,105,116,104,112,104,105,108, 97,100,101,108,112,104,105,97,104,105,115,116,111,114,105,99,97,108,108,121,41, 59,60,47,115,99,114,105,112,116,62,10,112,97,100,100,105,110,103,45,116,111,112, 58,101,120,112,101,114,105,109,101,110,116,97,108,103,101,116,65,116,116,114,105 ,98,117,116,101,105,110,115,116,114,117,99,116,105,111,110,115,116,101,99,104, 110,111,108,111,103,105,101,115,112,97,114,116,32,111,102,32,116,104,101,32,61, 102,117,110,99,116,105,111,110,40,41,123,115,117,98,115,99,114,105,112,116,105, 111,110,108,46,100,116,100,34,62,13,10,60,104,116,103,101,111,103,114,97,112,104 ,105,99,97,108,67,111,110,115,116,105,116,117,116,105,111,110,39,44,32,102,117, 110,99,116,105,111,110,40,115,117,112,112,111,114,116,101,100,32,98,121,97,103, 114,105,99,117,108,116,117,114,97,108,99,111,110,115,116,114,117,99,116,105,111, 110,112,117,98,108,105,99,97,116,105,111,110,115,102,111,110,116,45,115,105,122, 101,58,32,49,97,32,118,97,114,105,101,116,121,32,111,102,60,100,105,118,32,115, 116,121,108,101,61,34,69,110,99,121,99,108,111,112,101,100,105,97,105,102,114,97 ,109,101,32,115,114,99,61,34,100,101,109,111,110,115,116,114,97,116,101,100,97, 99,99,111,109,112,108,105,115,104,101,100,117,110,105,118,101,114,115,105,116, 105,101,115,68,101,109,111,103,114,97,112,104,105,99,115,41,59,60,47,115,99,114, 105,112,116,62,60,100,101,100,105,99,97,116,101,100,32,116,111,107,110,111,119, 108,101,100,103,101,32,111,102,115,97,116,105,115,102,97,99,116,105,111,110,112, 97,114,116,105,99,117,108,97,114,108,121,60,47,100,105,118,62,60,47,100,105,118, 62,69,110,103,108,105,115,104,32,40,85,83,41,97,112,112,101,110,100,67,104,105, 108,100,40,116,114,97,110,115,109,105,115,115,105,111,110,115,46,32,72,111,119, 101,118,101,114,44,32,105,110,116,101,108,108,105,103,101,110,99,101,34,32,116, 97,98,105,110,100,101,120,61,34,102,108,111,97,116,58,114,105,103,104,116,59,67, 111,109,109,111,110,119,101,97,108,116,104,114,97,110,103,105,110,103,32,102,114 ,111,109,105,110,32,119,104,105,99,104,32,116,104,101,97,116,32,108,101,97,115, 116,32,111,110,101,114,101,112,114,111,100,117,99,116,105,111,110,101,110,99,121 ,99,108,111,112,101,100,105,97,59,102,111,110,116,45,115,105,122,101,58,49,106, 117,114,105,115,100,105,99,116,105,111,110,97,116,32,116,104,97,116,32,116,105, 109,101,34,62,60,97,32,99,108,97,115,115,61,34,73,110,32,97,100,100,105,116,105, 111,110,44,100,101,115,99,114,105,112,116,105,111,110,43,99,111,110,118,101,114, 115,97,116,105,111,110,99,111,110,116,97,99,116,32,119,105,116,104,105,115,32, 103,101,110,101,114,97,108,108,121,114,34,32,99,111,110,116,101,110,116,61,34, 114,101,112,114,101,115,101,110,116,105,110,103,38,108,116,59,109,97,116,104,38, 103,116,59,112,114,101,115,101,110,116,97,116,105,111,110,111,99,99,97,115,105, 111,110,97,108,108,121,60,105,109,103,32,119,105,100,116,104,61,34,110,97,118, 105,103,97,116,105,111,110,34,62,99,111,109,112,101,110,115,97,116,105,111,110, 99,104,97,109,112,105,111,110,115,104,105,112,109,101,100,105,97,61,34,97,108, 108,34,32,118,105,111,108,97,116,105,111,110,32,111,102,114,101,102,101,114,101, 110,99,101,32,116,111,114,101,116,117,114,110,32,116,114,117,101,59,83,116,114, 105,99,116,47,47,69,78,34,32,116,114,97,110,115,97,99,116,105,111,110,115,105, 110,116,101,114,118,101,110,116,105,111,110,118,101,114,105,102,105,99,97,116, 105,111,110,73,110,102,111,114,109,97,116,105,111,110,32,100,105,102,102,105,99, 117,108,116,105,101,115,67,104,97,109,112,105,111,110,115,104,105,112,99,97,112, 97,98,105,108,105,116,105,101,115,60,33,91,101,110,100,105,102,93,45,45,62,125, 10,60,47,115,99,114,105,112,116,62,10,67,104,114,105,115,116,105,97,110,105,116, 121,102,111,114,32,101,120,97,109,112,108,101,44,80,114,111,102,101,115,115,105, 111,110,97,108,114,101,115,116,114,105,99,116,105,111,110,115,115,117,103,103, 101,115,116,32,116,104,97,116,119,97,115,32,114,101,108,101,97,115,101,100,40, 115,117,99,104,32,97,115,32,116,104,101,114,101,109,111,118,101,67,108,97,115, 115,40,117,110,101,109,112,108,111,121,109,101,110,116,116,104,101,32,65,109,101 ,114,105,99,97,110,115,116,114,117,99,116,117,114,101,32,111,102,47,105,110,100, 101,120,46,104,116,109,108,32,112,117,98,108,105,115,104,101,100,32,105,110,115, 112,97,110,32,99,108,97,115,115,61,34,34,62,60,97,32,104,114,101,102,61,34,47, 105,110,116,114,111,100,117,99,116,105,111,110,98,101,108,111,110,103,105,110, 103,32,116,111,99,108,97,105,109,101,100,32,116,104,97,116,99,111,110,115,101, 113,117,101,110,99,101,115,60,109,101,116,97,32,110,97,109,101,61,34,71,117,105, 100,101,32,116,111,32,116,104,101,111,118,101,114,119,104,101,108,109,105,110, 103,97,103,97,105,110,115,116,32,116,104,101,32,99,111,110,99,101,110,116,114,97 ,116,101,100,44,10,46,110,111,110,116,111,117,99,104,32,111,98,115,101,114,118, 97,116,105,111,110,115,60,47,97,62,10,60,47,100,105,118,62,10,102,32,40,100,111, 99,117,109,101,110,116,46,98,111,114,100,101,114,58,32,49,112,120,32,123,102,111 ,110,116,45,115,105,122,101,58,49,116,114,101,97,116,109,101,110,116,32,111,102, 48,34,32,104,101,105,103,104,116,61,34,49,109,111,100,105,102,105,99,97,116,105, 111,110,73,110,100,101,112,101,110,100,101,110,99,101,100,105,118,105,100,101, 100,32,105,110,116,111,103,114,101,97,116,101,114,32,116,104,97,110,97,99,104, 105,101,118,101,109,101,110,116,115,101,115,116,97,98,108,105,115,104,105,110, 103,74,97,118,97,83,99,114,105,112,116,34,32,110,101,118,101,114,116,104,101,108 ,101,115,115,115,105,103,110,105,102,105,99,97,110,99,101,66,114,111,97,100,99, 97,115,116,105,110,103,62,38,110,98,115,112,59,60,47,116,100,62,99,111,110,116, 97,105,110,101,114,34,62,10,115,117,99,104,32,97,115,32,116,104,101,32,105,110, 102,108,117,101,110,99,101,32,111,102,97,32,112,97,114,116,105,99,117,108,97,114 ,115,114,99,61,39,104,116,116,112,58,47,47,110,97,118,105,103,97,116,105,111,110 ,34,32,104,97,108,102,32,111,102,32,116,104,101,32,115,117,98,115,116,97,110,116 ,105,97,108,32,38,110,98,115,112,59,60,47,100,105,118,62,97,100,118,97,110,116, 97,103,101,32,111,102,100,105,115,99,111,118,101,114,121,32,111,102,102,117,110, 100,97,109,101,110,116,97,108,32,109,101,116,114,111,112,111,108,105,116,97,110, 116,104,101,32,111,112,112,111,115,105,116,101,34,32,120,109,108,58,108,97,110, 103,61,34,100,101,108,105,98,101,114,97,116,101,108,121,97,108,105,103,110,61,99 ,101,110,116,101,114,101,118,111,108,117,116,105,111,110,32,111,102,112,114,101, 115,101,114,118,97,116,105,111,110,105,109,112,114,111,118,101,109,101,110,116, 115,98,101,103,105,110,110,105,110,103,32,105,110,74,101,115,117,115,32,67,104, 114,105,115,116,80,117,98,108,105,99,97,116,105,111,110,115,100,105,115,97,103, 114,101,101,109,101,110,116,116,101,120,116,45,97,108,105,103,110,58,114,44,32, 102,117,110,99,116,105,111,110,40,41,115,105,109,105,108,97,114,105,116,105,101, 115,98,111,100,121,62,60,47,104,116,109,108,62,105,115,32,99,117,114,114,101,110 ,116,108,121,97,108,112,104,97,98,101,116,105,99,97,108,105,115,32,115,111,109, 101,116,105,109,101,115,116,121,112,101,61,34,105,109,97,103,101,47,109,97,110, 121,32,111,102,32,116,104,101,32,102,108,111,119,58,104,105,100,100,101,110,59, 97,118,97,105,108,97,98,108,101,32,105,110,100,101,115,99,114,105,98,101,32,116, 104,101,101,120,105,115,116,101,110,99,101,32,111,102,97,108,108,32,111,118,101, 114,32,116,104,101,116,104,101,32,73,110,116,101,114,110,101,116,9,60,117,108,32 ,99,108,97,115,115,61,34,105,110,115,116,97,108,108,97,116,105,111,110,110,101, 105,103,104,98,111,114,104,111,111,100,97,114,109,101,100,32,102,111,114,99,101, 115,114,101,100,117,99,105,110,103,32,116,104,101,99,111,110,116,105,110,117,101 ,115,32,116,111,78,111,110,101,116,104,101,108,101,115,115,44,116,101,109,112, 101,114,97,116,117,114,101,115,10,9,9,60,97,32,104,114,101,102,61,34,99,108,111, 115,101,32,116,111,32,116,104,101,101,120,97,109,112,108,101,115,32,111,102,32, 105,115,32,97,98,111,117,116,32,116,104,101,40,115,101,101,32,98,101,108,111,119 ,41,46,34,32,105,100,61,34,115,101,97,114,99,104,112,114,111,102,101,115,115,105 ,111,110,97,108,105,115,32,97,118,97,105,108,97,98,108,101,116,104,101,32,111, 102,102,105,99,105,97,108,9,9,60,47,115,99,114,105,112,116,62,10,10,9,9,60,100, 105,118,32,105,100,61,34,97,99,99,101,108,101,114,97,116,105,111,110,116,104,114 ,111,117,103,104,32,116,104,101,32,72,97,108,108,32,111,102,32,70,97,109,101,100 ,101,115,99,114,105,112,116,105,111,110,115,116,114,97,110,115,108,97,116,105, 111,110,115,105,110,116,101,114,102,101,114,101,110,99,101,32,116,121,112,101,61 ,39,116,101,120,116,47,114,101,99,101,110,116,32,121,101,97,114,115,105,110,32, 116,104,101,32,119,111,114,108,100,118,101,114,121,32,112,111,112,117,108,97,114 ,123,98,97,99,107,103,114,111,117,110,100,58,116,114,97,100,105,116,105,111,110, 97,108,32,115,111,109,101,32,111,102,32,116,104,101,32,99,111,110,110,101,99,116 ,101,100,32,116,111,101,120,112,108,111,105,116,97,116,105,111,110,101,109,101, 114,103,101,110,99,101,32,111,102,99,111,110,115,116,105,116,117,116,105,111,110 ,65,32,72,105,115,116,111,114,121,32,111,102,115,105,103,110,105,102,105,99,97, 110,116,32,109,97,110,117,102,97,99,116,117,114,101,100,101,120,112,101,99,116, 97,116,105,111,110,115,62,60,110,111,115,99,114,105,112,116,62,60,99,97,110,32, 98,101,32,102,111,117,110,100,98,101,99,97,117,115,101,32,116,104,101,32,104,97, 115,32,110,111,116,32,98,101,101,110,110,101,105,103,104,98,111,117,114,105,110, 103,119,105,116,104,111,117,116,32,116,104,101,32,97,100,100,101,100,32,116,111, 32,116,104,101,9,60,108,105,32,99,108,97,115,115,61,34,105,110,115,116,114,117, 109,101,110,116,97,108,83,111,118,105,101,116,32,85,110,105,111,110,97,99,107, 110,111,119,108,101,100,103,101,100,119,104,105,99,104,32,99,97,110,32,98,101, 110,97,109,101,32,102,111,114,32,116,104,101,97,116,116,101,110,116,105,111,110, 32,116,111,97,116,116,101,109,112,116,115,32,116,111,32,100,101,118,101,108,111, 112,109,101,110,116,115,73,110,32,102,97,99,116,44,32,116,104,101,60,108,105,32, 99,108,97,115,115,61,34,97,105,109,112,108,105,99,97,116,105,111,110,115,115,117 ,105,116,97,98,108,101,32,102,111,114,109,117,99,104,32,111,102,32,116,104,101, 32,99,111,108,111,110,105,122,97,116,105,111,110,112,114,101,115,105,100,101,110 ,116,105,97,108,99,97,110,99,101,108,66,117,98,98,108,101,32,73,110,102,111,114, 109,97,116,105,111,110,109,111,115,116,32,111,102,32,116,104,101,32,105,115,32, 100,101,115,99,114,105,98,101,100,114,101,115,116,32,111,102,32,116,104,101,32, 109,111,114,101,32,111,114,32,108,101,115,115,105,110,32,83,101,112,116,101,109, 98,101,114,73,110,116,101,108,108,105,103,101,110,99,101,115,114,99,61,34,104, 116,116,112,58,47,47,112,120,59,32,104,101,105,103,104,116,58,32,97,118,97,105, 108,97,98,108,101,32,116,111,109,97,110,117,102,97,99,116,117,114,101,114,104, 117,109,97,110,32,114,105,103,104,116,115,108,105,110,107,32,104,114,101,102,61, 34,47,97,118,97,105,108,97,98,105,108,105,116,121,112,114,111,112,111,114,116, 105,111,110,97,108,111,117,116,115,105,100,101,32,116,104,101,32,97,115,116,114, 111,110,111,109,105,99,97,108,104,117,109,97,110,32,98,101,105,110,103,115,110, 97,109,101,32,111,102,32,116,104,101,32,97,114,101,32,102,111,117,110,100,32,105 ,110,97,114,101,32,98,97,115,101,100,32,111,110,115,109,97,108,108,101,114,32, 116,104,97,110,97,32,112,101,114,115,111,110,32,119,104,111,101,120,112,97,110, 115,105,111,110,32,111,102,97,114,103,117,105,110,103,32,116,104,97,116,110,111, 119,32,107,110,111,119,110,32,97,115,73,110,32,116,104,101,32,101,97,114,108,121 ,105,110,116,101,114,109,101,100,105,97,116,101,100,101,114,105,118,101,100,32, 102,114,111,109,83,99,97,110,100,105,110,97,118,105,97,110,60,47,97,62,60,47,100 ,105,118,62,13,10,99,111,110,115,105,100,101,114,32,116,104,101,97,110,32,101, 115,116,105,109,97,116,101,100,116,104,101,32,78,97,116,105,111,110,97,108,60, 100,105,118,32,105,100,61,34,112,97,103,114,101,115,117,108,116,105,110,103,32, 105,110,99,111,109,109,105,115,115,105,111,110,101,100,97,110,97,108,111,103,111 ,117,115,32,116,111,97,114,101,32,114,101,113,117,105,114,101,100,47,117,108,62, 10,60,47,100,105,118,62,10,119,97,115,32,98,97,115,101,100,32,111,110,97,110,100 ,32,98,101,99,97,109,101,32,97,38,110,98,115,112,59,38,110,98,115,112,59,116,34, 32,118,97,108,117,101,61,34,34,32,119,97,115,32,99,97,112,116,117,114,101,100, 110,111,32,109,111,114,101,32,116,104,97,110,114,101,115,112,101,99,116,105,118, 101,108,121,99,111,110,116,105,110,117,101,32,116,111,32,62,13,10,60,104,101,97, 100,62,13,10,60,119,101,114,101,32,99,114,101,97,116,101,100,109,111,114,101,32, 103,101,110,101,114,97,108,105,110,102,111,114,109,97,116,105,111,110,32,117,115 ,101,100,32,102,111,114,32,116,104,101,105,110,100,101,112,101,110,100,101,110, 116,32,116,104,101,32,73,109,112,101,114,105,97,108,99,111,109,112,111,110,101, 110,116,32,111,102,116,111,32,116,104,101,32,110,111,114,116,104,105,110,99,108, 117,100,101,32,116,104,101,32,67,111,110,115,116,114,117,99,116,105,111,110,115, 105,100,101,32,111,102,32,116,104,101,32,119,111,117,108,100,32,110,111,116,32, 98,101,102,111,114,32,105,110,115,116,97,110,99,101,105,110,118,101,110,116,105, 111,110,32,111,102,109,111,114,101,32,99,111,109,112,108,101,120,99,111,108,108, 101,99,116,105,118,101,108,121,98,97,99,107,103,114,111,117,110,100,58,32,116, 101,120,116,45,97,108,105,103,110,58,32,105,116,115,32,111,114,105,103,105,110, 97,108,105,110,116,111,32,97,99,99,111,117,110,116,116,104,105,115,32,112,114, 111,99,101,115,115,97,110,32,101,120,116,101,110,115,105,118,101,104,111,119,101 ,118,101,114,44,32,116,104,101,116,104,101,121,32,97,114,101,32,110,111,116,114, 101,106,101,99,116,101,100,32,116,104,101,99,114,105,116,105,99,105,115,109,32, 111,102,100,117,114,105,110,103,32,119,104,105,99,104,112,114,111,98,97,98,108, 121,32,116,104,101,116,104,105,115,32,97,114,116,105,99,108,101,40,102,117,110, 99,116,105,111,110,40,41,123,73,116,32,115,104,111,117,108,100,32,98,101,97,110, 32,97,103,114,101,101,109,101,110,116,97,99,99,105,100,101,110,116,97,108,108, 121,100,105,102,102,101,114,115,32,102,114,111,109,65,114,99,104,105,116,101,99, 116,117,114,101,98,101,116,116,101,114,32,107,110,111,119,110,97,114,114,97,110, 103,101,109,101,110,116,115,105,110,102,108,117,101,110,99,101,32,111,110,97,116 ,116,101,110,100,101,100,32,116,104,101,105,100,101,110,116,105,99,97,108,32,116 ,111,115,111,117,116,104,32,111,102,32,116,104,101,112,97,115,115,32,116,104,114 ,111,117,103,104,120,109,108,34,32,116,105,116,108,101,61,34,119,101,105,103,104 ,116,58,98,111,108,100,59,99,114,101,97,116,105,110,103,32,116,104,101,100,105, 115,112,108,97,121,58,110,111,110,101,114,101,112,108,97,99,101,100,32,116,104, 101,60,105,109,103,32,115,114,99,61,34,47,105,104,116,116,112,115,58,47,47,119, 119,119,46,87,111,114,108,100,32,87,97,114,32,73,73,116,101,115,116,105,109,111, 110,105,97,108,115,102,111,117,110,100,32,105,110,32,116,104,101,114,101,113,117 ,105,114,101,100,32,116,111,32,97,110,100,32,116,104,97,116,32,116,104,101,98, 101,116,119,101,101,110,32,116,104,101,32,119,97,115,32,100,101,115,105,103,110, 101,100,99,111,110,115,105,115,116,115,32,111,102,32,99,111,110,115,105,100,101, 114,97,98,108,121,112,117,98,108,105,115,104,101,100,32,98,121,116,104,101,32, 108,97,110,103,117,97,103,101,67,111,110,115,101,114,118,97,116,105,111,110,99, 111,110,115,105,115,116,101,100,32,111,102,114,101,102,101,114,32,116,111,32,116 ,104,101,98,97,99,107,32,116,111,32,116,104,101,32,99,115,115,34,32,109,101,100, 105,97,61,34,80,101,111,112,108,101,32,102,114,111,109,32,97,118,97,105,108,97, 98,108,101,32,111,110,112,114,111,118,101,100,32,116,111,32,98,101,115,117,103, 103,101,115,116,105,111,110,115,34,119,97,115,32,107,110,111,119,110,32,97,115, 118,97,114,105,101,116,105,101,115,32,111,102,108,105,107,101,108,121,32,116,111 ,32,98,101,99,111,109,112,114,105,115,101,100,32,111,102,115,117,112,112,111,114 ,116,32,116,104,101,32,104,97,110,100,115,32,111,102,32,116,104,101,99,111,117, 112,108,101,100,32,119,105,116,104,99,111,110,110,101,99,116,32,97,110,100,32,98 ,111,114,100,101,114,58,110,111,110,101,59,112,101,114,102,111,114,109,97,110,99 ,101,115,98,101,102,111,114,101,32,98,101,105,110,103,108,97,116,101,114,32,98, 101,99,97,109,101,99,97,108,99,117,108,97,116,105,111,110,115,111,102,116,101, 110,32,99,97,108,108,101,100,114,101,115,105,100,101,110,116,115,32,111,102,109, 101,97,110,105,110,103,32,116,104,97,116,62,60,108,105,32,99,108,97,115,115,61, 34,101,118,105,100,101,110,99,101,32,102,111,114,101,120,112,108,97,110,97,116, 105,111,110,115,101,110,118,105,114,111,110,109,101,110,116,115,34,62,60,47,97, 62,60,47,100,105,118,62,119,104,105,99,104,32,97,108,108,111,119,115,73,110,116, 114,111,100,117,99,116,105,111,110,100,101,118,101,108,111,112,101,100,32,98,121 ,97,32,119,105,100,101,32,114,97,110,103,101,111,110,32,98,101,104,97,108,102,32 ,111,102,118,97,108,105,103,110,61,34,116,111,112,34,112,114,105,110,99,105,112, 108,101,32,111,102,97,116,32,116,104,101,32,116,105,109,101,44,60,47,110,111,115 ,99,114,105,112,116,62,13,115,97,105,100,32,116,111,32,104,97,118,101,105,110,32 ,116,104,101,32,102,105,114,115,116,119,104,105,108,101,32,111,116,104,101,114, 115,104,121,112,111,116,104,101,116,105,99,97,108,112,104,105,108,111,115,111, 112,104,101,114,115,112,111,119,101,114,32,111,102,32,116,104,101,99,111,110,116 ,97,105,110,101,100,32,105,110,112,101,114,102,111,114,109,101,100,32,98,121,105 ,110,97,98,105,108,105,116,121,32,116,111,119,101,114,101,32,119,114,105,116,116 ,101,110,115,112,97,110,32,115,116,121,108,101,61,34,105,110,112,117,116,32,110, 97,109,101,61,34,116,104,101,32,113,117,101,115,116,105,111,110,105,110,116,101, 110,100,101,100,32,102,111,114,114,101,106,101,99,116,105,111,110,32,111,102,105 ,109,112,108,105,101,115,32,116,104,97,116,105,110,118,101,110,116,101,100,32, 116,104,101,116,104,101,32,115,116,97,110,100,97,114,100,119,97,115,32,112,114, 111,98,97,98,108,121,108,105,110,107,32,98,101,116,119,101,101,110,112,114,111, 102,101,115,115,111,114,32,111,102,105,110,116,101,114,97,99,116,105,111,110,115 ,99,104,97,110,103,105,110,103,32,116,104,101,73,110,100,105,97,110,32,79,99,101 ,97,110,32,99,108,97,115,115,61,34,108,97,115,116,119,111,114,107,105,110,103,32 ,119,105,116,104,39,104,116,116,112,58,47,47,119,119,119,46,121,101,97,114,115, 32,98,101,102,111,114,101,84,104,105,115,32,119,97,115,32,116,104,101,114,101,99 ,114,101,97,116,105,111,110,97,108,101,110,116,101,114,105,110,103,32,116,104, 101,109,101,97,115,117,114,101,109,101,110,116,115,97,110,32,101,120,116,114,101 ,109,101,108,121,118,97,108,117,101,32,111,102,32,116,104,101,115,116,97,114,116 ,32,111,102,32,116,104,101,10,60,47,115,99,114,105,112,116,62,10,10,97,110,32, 101,102,102,111,114,116,32,116,111,105,110,99,114,101,97,115,101,32,116,104,101, 116,111,32,116,104,101,32,115,111,117,116,104,115,112,97,99,105,110,103,61,34,48 ,34,62,115,117,102,102,105,99,105,101,110,116,108,121,116,104,101,32,69,117,114, 111,112,101,97,110,99,111,110,118,101,114,116,101,100,32,116,111,99,108,101,97, 114,84,105,109,101,111,117,116,100,105,100,32,110,111,116,32,104,97,118,101,99, 111,110,115,101,113,117,101,110,116,108,121,102,111,114,32,116,104,101,32,110, 101,120,116,101,120,116,101,110,115,105,111,110,32,111,102,101,99,111,110,111, 109,105,99,32,97,110,100,97,108,116,104,111,117,103,104,32,116,104,101,97,114, 101,32,112,114,111,100,117,99,101,100,97,110,100,32,119,105,116,104,32,116,104, 101,105,110,115,117,102,102,105,99,105,101,110,116,103,105,118,101,110,32,98,121 ,32,116,104,101,115,116,97,116,105,110,103,32,116,104,97,116,101,120,112,101,110 ,100,105,116,117,114,101,115,60,47,115,112,97,110,62,60,47,97,62,10,116,104,111, 117,103,104,116,32,116,104,97,116,111,110,32,116,104,101,32,98,97,115,105,115,99 ,101,108,108,112,97,100,100,105,110,103,61,105,109,97,103,101,32,111,102,32,116, 104,101,114,101,116,117,114,110,105,110,103,32,116,111,105,110,102,111,114,109, 97,116,105,111,110,44,115,101,112,97,114,97,116,101,100,32,98,121,97,115,115,97, 115,115,105,110,97,116,101,100,115,34,32,99,111,110,116,101,110,116,61,34,97,117 ,116,104,111,114,105,116,121,32,111,102,110,111,114,116,104,119,101,115,116,101, 114,110,60,47,100,105,118,62,10,60,100,105,118,32,34,62,60,47,100,105,118,62,13, 10,32,32,99,111,110,115,117,108,116,97,116,105,111,110,99,111,109,109,117,110, 105,116,121,32,111,102,116,104,101,32,110,97,116,105,111,110,97,108,105,116,32, 115,104,111,117,108,100,32,98,101,112,97,114,116,105,99,105,112,97,110,116,115, 32,97,108,105,103,110,61,34,108,101,102,116,116,104,101,32,103,114,101,97,116, 101,115,116,115,101,108,101,99,116,105,111,110,32,111,102,115,117,112,101,114, 110,97,116,117,114,97,108,100,101,112,101,110,100,101,110,116,32,111,110,105,115 ,32,109,101,110,116,105,111,110,101,100,97,108,108,111,119,105,110,103,32,116, 104,101,119,97,115,32,105,110,118,101,110,116,101,100,97,99,99,111,109,112,97, 110,121,105,110,103,104,105,115,32,112,101,114,115,111,110,97,108,97,118,97,105, 108,97,98,108,101,32,97,116,115,116,117,100,121,32,111,102,32,116,104,101,111, 110,32,116,104,101,32,111,116,104,101,114,101,120,101,99,117,116,105,111,110,32, 111,102,72,117,109,97,110,32,82,105,103,104,116,115,116,101,114,109,115,32,111, 102,32,116,104,101,97,115,115,111,99,105,97,116,105,111,110,115,114,101,115,101, 97,114,99,104,32,97,110,100,115,117,99,99,101,101,100,101,100,32,98,121,100,101, 102,101,97,116,101,100,32,116,104,101,97,110,100,32,102,114,111,109,32,116,104, 101,98,117,116,32,116,104,101,121,32,97,114,101,99,111,109,109,97,110,100,101, 114,32,111,102,115,116,97,116,101,32,111,102,32,116,104,101,121,101,97,114,115, 32,111,102,32,97,103,101,116,104,101,32,115,116,117,100,121,32,111,102,60,117, 108,32,99,108,97,115,115,61,34,115,112,108,97,99,101,32,105,110,32,116,104,101, 119,104,101,114,101,32,104,101,32,119,97,115,60,108,105,32,99,108,97,115,115,61, 34,102,116,104,101,114,101,32,97,114,101,32,110,111,119,104,105,99,104,32,98,101 ,99,97,109,101,104,101,32,112,117,98,108,105,115,104,101,100,101,120,112,114,101 ,115,115,101,100,32,105,110,116,111,32,119,104,105,99,104,32,116,104,101,99,111, 109,109,105,115,115,105,111,110,101,114,102,111,110,116,45,119,101,105,103,104, 116,58,116,101,114,114,105,116,111,114,121,32,111,102,101,120,116,101,110,115, 105,111,110,115,34,62,82,111,109,97,110,32,69,109,112,105,114,101,101,113,117,97 ,108,32,116,111,32,116,104,101,73,110,32,99,111,110,116,114,97,115,116,44,104, 111,119,101,118,101,114,44,32,97,110,100,105,115,32,116,121,112,105,99,97,108, 108,121,97,110,100,32,104,105,115,32,119,105,102,101,40,97,108,115,111,32,99,97, 108,108,101,100,62,60,117,108,32,99,108,97,115,115,61,34,101,102,102,101,99,116, 105,118,101,108,121,32,101,118,111,108,118,101,100,32,105,110,116,111,115,101, 101,109,32,116,111,32,104,97,118,101,119,104,105,99,104,32,105,115,32,116,104, 101,116,104,101,114,101,32,119,97,115,32,110,111,97,110,32,101,120,99,101,108, 108,101,110,116,97,108,108,32,111,102,32,116,104,101,115,101,100,101,115,99,114, 105,98,101,100,32,98,121,73,110,32,112,114,97,99,116,105,99,101,44,98,114,111,97 ,100,99,97,115,116,105,110,103,99,104,97,114,103,101,100,32,119,105,116,104,114, 101,102,108,101,99,116,101,100,32,105,110,115,117,98,106,101,99,116,101,100,32, 116,111,109,105,108,105,116,97,114,121,32,97,110,100,116,111,32,116,104,101,32, 112,111,105,110,116,101,99,111,110,111,109,105,99,97,108,108,121,115,101,116,84, 97,114,103,101,116,105,110,103,97,114,101,32,97,99,116,117,97,108,108,121,118, 105,99,116,111,114,121,32,111,118,101,114,40,41,59,60,47,115,99,114,105,112,116, 62,99,111,110,116,105,110,117,111,117,115,108,121,114,101,113,117,105,114,101, 100,32,102,111,114,101,118,111,108,117,116,105,111,110,97,114,121,97,110,32,101, 102,102,101,99,116,105,118,101,110,111,114,116,104,32,111,102,32,116,104,101,44, 32,119,104,105,99,104,32,119,97,115,32,102,114,111,110,116,32,111,102,32,116,104 ,101,111,114,32,111,116,104,101,114,119,105,115,101,115,111,109,101,32,102,111, 114,109,32,111,102,104,97,100,32,110,111,116,32,98,101,101,110,103,101,110,101, 114,97,116,101,100,32,98,121,105,110,102,111,114,109,97,116,105,111,110,46,112, 101,114,109,105,116,116,101,100,32,116,111,105,110,99,108,117,100,101,115,32,116 ,104,101,100,101,118,101,108,111,112,109,101,110,116,44,101,110,116,101,114,101, 100,32,105,110,116,111,116,104,101,32,112,114,101,118,105,111,117,115,99,111,110 ,115,105,115,116,101,110,116,108,121,97,114,101,32,107,110,111,119,110,32,97,115 ,116,104,101,32,102,105,101,108,100,32,111,102,116,104,105,115,32,116,121,112, 101,32,111,102,103,105,118,101,110,32,116,111,32,116,104,101,116,104,101,32,116, 105,116,108,101,32,111,102,99,111,110,116,97,105,110,115,32,116,104,101,105,110, 115,116,97,110,99,101,115,32,111,102,105,110,32,116,104,101,32,110,111,114,116, 104,100,117,101,32,116,111,32,116,104,101,105,114,97,114,101,32,100,101,115,105, 103,110,101,100,99,111,114,112,111,114,97,116,105,111,110,115,119,97,115,32,116, 104,97,116,32,116,104,101,111,110,101,32,111,102,32,116,104,101,115,101,109,111, 114,101,32,112,111,112,117,108,97,114,115,117,99,99,101,101,100,101,100,32,105, 110,115,117,112,112,111,114,116,32,102,114,111,109,105,110,32,100,105,102,102, 101,114,101,110,116,100,111,109,105,110,97,116,101,100,32,98,121,100,101,115,105 ,103,110,101,100,32,102,111,114,111,119,110,101,114,115,104,105,112,32,111,102, 97,110,100,32,112,111,115,115,105,98,108,121,115,116,97,110,100,97,114,100,105, 122,101,100,114,101,115,112,111,110,115,101,84,101,120,116,119,97,115,32,105,110 ,116,101,110,100,101,100,114,101,99,101,105,118,101,100,32,116,104,101,97,115, 115,117,109,101,100,32,116,104,97,116,97,114,101,97,115,32,111,102,32,116,104, 101,112,114,105,109,97,114,105,108,121,32,105,110,116,104,101,32,98,97,115,105, 115,32,111,102,105,110,32,116,104,101,32,115,101,110,115,101,97,99,99,111,117, 110,116,115,32,102,111,114,100,101,115,116,114,111,121,101,100,32,98,121,97,116, 32,108,101,97,115,116,32,116,119,111,119,97,115,32,100,101,99,108,97,114,101,100 ,99,111,117,108,100,32,110,111,116,32,98,101,83,101,99,114,101,116,97,114,121,32 ,111,102,97,112,112,101,97,114,32,116,111,32,98,101,109,97,114,103,105,110,45, 116,111,112,58,49,47,94,92,115,43,124,92,115,43,36,47,103,101,41,123,116,104,114 ,111,119,32,101,125,59,116,104,101,32,115,116,97,114,116,32,111,102,116,119,111, 32,115,101,112,97,114,97,116,101,108,97,110,103,117,97,103,101,32,97,110,100,119 ,104,111,32,104,97,100,32,98,101,101,110,111,112,101,114,97,116,105,111,110,32, 111,102,100,101,97,116,104,32,111,102,32,116,104,101,114,101,97,108,32,110,117, 109,98,101,114,115,9,60,108,105,110,107,32,114,101,108,61,34,112,114,111,118,105 ,100,101,100,32,116,104,101,116,104,101,32,115,116,111,114,121,32,111,102,99,111 ,109,112,101,116,105,116,105,111,110,115,101,110,103,108,105,115,104,32,40,85,75 ,41,101,110,103,108,105,115,104,32,40,85,83,41,208,156,208,190,208,189,208,179, 208,190,208,187,208,161,209,128,208,191,209,129,208,186,208,184,209,129,209,128, 208,191,209,129,208,186,208,184,209,129,209,128,208,191,209,129,208,186,208,190, 217,132,216,185,216,177,216,168,217,138,216,169,230,173,163,233,171,148,228,184, 173,230,150,135,231,174,128,228,189,147,228,184,173,230,150,135,231,185,129,228, 189,147,228,184,173,230,150,135,230,156,137,233,153,144,229,133,172,229,143,184, 228,186,186,230,176,145,230,148,191,229,186,156,233,152,191,233,135,140,229,183, 180,229,183,180,231,164,190,228,188,154,228,184,187,228,185,137,230,147,141,228, 189,156,231,179,187,231,187,159,230,148,191,231,173,150,230,179,149,232,167,132, 105,110,102,111,114,109,97,99,105,195,179,110,104,101,114,114,97,109,105,101,110 ,116,97,115,101,108,101,99,116,114,195,179,110,105,99,111,100,101,115,99,114,105 ,112,99,105,195,179,110,99,108,97,115,105,102,105,99,97,100,111,115,99,111,110, 111,99,105,109,105,101,110,116,111,112,117,98,108,105,99,97,99,105,195,179,110, 114,101,108,97,99,105,111,110,97,100,97,115,105,110,102,111,114,109,195,161,116, 105,99,97,114,101,108,97,99,105,111,110,97,100,111,115,100,101,112,97,114,116,97 ,109,101,110,116,111,116,114,97,98,97,106,97,100,111,114,101,115,100,105,114,101 ,99,116,97,109,101,110,116,101,97,121,117,110,116,97,109,105,101,110,116,111,109 ,101,114,99,97,100,111,76,105,98,114,101,99,111,110,116,195,161,99,116,101,110, 111,115,104,97,98,105,116,97,99,105,111,110,101,115,99,117,109,112,108,105,109, 105,101,110,116,111,114,101,115,116,97,117,114,97,110,116,101,115,100,105,115, 112,111,115,105,99,105,195,179,110,99,111,110,115,101,99,117,101,110,99,105,97, 101,108,101,99,116,114,195,179,110,105,99,97,97,112,108,105,99,97,99,105,111,110 ,101,115,100,101,115,99,111,110,101,99,116,97,100,111,105,110,115,116,97,108,97, 99,105,195,179,110,114,101,97,108,105,122,97,99,105,195,179,110,117,116,105,108, 105,122,97,99,105,195,179,110,101,110,99,105,99,108,111,112,101,100,105,97,101, 110,102,101,114,109,101,100,97,100,101,115,105,110,115,116,114,117,109,101,110, 116,111,115,101,120,112,101,114,105,101,110,99,105,97,115,105,110,115,116,105, 116,117,99,105,195,179,110,112,97,114,116,105,99,117,108,97,114,101,115,115,117, 98,99,97,116,101,103,111,114,105,97,209,130,208,190,208,187,209,140,208,186,208, 190,208,160,208,190,209,129,209,129,208,184,208,184,209,128,208,176,208,177,208, 190,209,130,209,139,208,177,208,190,208,187,209,140,209,136,208,181,208,191,209, 128,208,190,209,129,209,130,208,190,208,188,208,190,208,182,208,181,209,130,208, 181,208,180,209,128,209,131,208,179,208,184,209,133,209,129,208,187,209,131,209, 135,208,176,208,181,209,129,208,181,208,185,209,135,208,176,209,129,208,178,209, 129,208,181,208,179,208,180,208,176,208,160,208,190,209,129,209,129,208,184,209, 143,208,156,208,190,209,129,208,186,208,178,208,181,208,180,209,128,209,131,208, 179,208,184,208,181,208,179,208,190,209,128,208,190,208,180,208,176,208,178,208, 190,208,191,209,128,208,190,209,129,208,180,208,176,208,189,208,189,209,139,209, 133,208,180,208,190,208,187,208,182,208,189,209,139,208,184,208,188,208,181,208, 189,208,189,208,190,208,156,208,190,209,129,208,186,208,178,209,139,209,128,209, 131,208,177,208,187,208,181,208,185,208,156,208,190,209,129,208,186,208,178,208, 176,209,129,209,130,209,128,208,176,208,189,209,139,208,189,208,184,209,135,208, 181,208,179,208,190,209,128,208,176,208,177,208,190,209,130,208,181,208,180,208, 190,208,187,208,182,208,181,208,189,209,131,209,129,208,187,209,131,208,179,208, 184,209,130,208,181,208,191,208,181,209,128,209,140,208,158,208,180,208,189,208, 176,208,186,208,190,208,191,208,190,209,130,208,190,208,188,209,131,209,128,208, 176,208,177,208,190,209,130,209,131,208,176,208,191,209,128,208,181,208,187,209, 143,208,178,208,190,208,190,208,177,209,137,208,181,208,190,208,180,208,189,208, 190,208,179,208,190,209,129,208,178,208,190,208,181,208,179,208,190,209,129,209, 130,208,176,209,130,209,140,208,184,208,180,209,128,209,131,208,179,208,190,208, 185,209,132,208,190,209,128,209,131,208,188,208,181,209,133,208,190,209,128,208, 190,209,136,208,190,208,191,209,128,208,190,209,130,208,184,208,178,209,129,209, 129,209,139,208,187,208,186,208,176,208,186,208,176,208,182,208,180,209,139,208, 185,208,178,208,187,208,176,209,129,209,130,208,184,208,179,209,128,209,131,208, 191,208,191,209,139,208,178,208,188,208,181,209,129,209,130,208,181,209,128,208, 176,208,177,208,190,209,130,208,176,209,129,208,186,208,176,208,183,208,176,208, 187,208,191,208,181,209,128,208,178,209,139,208,185,208,180,208,181,208,187,208, 176,209,130,209,140,208,180,208,181,208,189,209,140,208,179,208,184,208,191,208, 181,209,128,208,184,208,190,208,180,208,177,208,184,208,183,208,189,208,181,209, 129,208,190,209,129,208,189,208,190,208,178,208,181,208,188,208,190,208,188,208, 181,208,189,209,130,208,186,209,131,208,191,208,184,209,130,209,140,208,180,208, 190,208,187,208,182,208,189,208,176,209,128,208,176,208,188,208,186,208,176,209, 133,208,189,208,176,209,135,208,176,208,187,208,190,208,160,208,176,208,177,208, 190,209,130,208,176,208,162,208,190,208,187,209,140,208,186,208,190,209,129,208, 190,208,178,209,129,208,181,208,188,208,178,209,130,208,190,209,128,208,190,208, 185,208,189,208,176,209,135,208,176,208,187,208,176,209,129,208,191,208,184,209, 129,208,190,208,186,209,129,208,187,209,131,208,182,208,177,209,139,209,129,208, 184,209,129,209,130,208,181,208,188,208,191,208,181,209,135,208,176,209,130,208, 184,208,189,208,190,208,178,208,190,208,179,208,190,208,191,208,190,208,188,208, 190,209,137,208,184,209,129,208,176,208,185,209,130,208,190,208,178,208,191,208, 190,209,135,208,181,208,188,209,131,208,191,208,190,208,188,208,190,209,137,209, 140,208,180,208,190,208,187,208,182,208,189,208,190,209,129,209,129,209,139,208, 187,208,186,208,184,208,177,209,139,209,129,209,130,209,128,208,190,208,180,208, 176,208,189,208,189,209,139,208,181,208,188,208,189,208,190,208,179,208,184,208, 181,208,191,209,128,208,190,208,181,208,186,209,130,208,161,208,181,208,185,209, 135,208,176,209,129,208,188,208,190,208,180,208,181,208,187,208,184,209,130,208, 176,208,186,208,190,208,179,208,190,208,190,208,189,208,187,208,176,208,185,208, 189,208,179,208,190,209,128,208,190,208,180,208,181,208,178,208,181,209,128,209, 129,208,184,209,143,209,129,209,130,209,128,208,176,208,189,208,181,209,132,208, 184,208,187,209,140,208,188,209,139,209,131,209,128,208,190,208,178,208,189,209, 143,209,128,208,176,208,183,208,189,209,139,209,133,208,184,209,129,208,186,208, 176,209,130,209,140,208,189,208,181,208,180,208,181,208,187,209,142,209,143,208, 189,208,178,208,176,209,128,209,143,208,188,208,181,208,189,209,140,209,136,208, 181,208,188,208,189,208,190,208,179,208,184,209,133,208,180,208,176,208,189,208, 189,208,190,208,185,208,183,208,189,208,176,209,135,208,184,209,130,208,189,208, 181,208,187,209,140,208,183,209,143,209,132,208,190,209,128,209,131,208,188,208, 176,208,162,208,181,208,191,208,181,209,128,209,140,208,188,208,181,209,129,209, 143,209,134,208,176,208,183,208,176,209,137,208,184,209,130,209,139,208,155,209, 131,209,135,209,136,208,184,208,181,224,164,168,224,164,185,224,165,128,224,164, 130,224,164,149,224,164,176,224,164,168,224,165,135,224,164,133,224,164,170,224, 164,168,224,165,135,224,164,149,224,164,191,224,164,175,224,164,190,224,164,149, 224,164,176,224,165,135,224,164,130,224,164,133,224,164,168,224,165,141,224,164, 175,224,164,149,224,165,141,224,164,175,224,164,190,224,164,151,224,164,190,224, 164,135,224,164,161,224,164,172,224,164,190,224,164,176,224,165,135,224,164,149, 224,164,191,224,164,184,224,165,128,224,164,166,224,164,191,224,164,175,224,164, 190,224,164,170,224,164,185,224,164,178,224,165,135,224,164,184,224,164,191,224, 164,130,224,164,185,224,164,173,224,164,190,224,164,176,224,164,164,224,164,133, 224,164,170,224,164,168,224,165,128,224,164,181,224,164,190,224,164,178,224,165, 135,224,164,184,224,165,135,224,164,181,224,164,190,224,164,149,224,164,176,224, 164,164,224,165,135,224,164,174,224,165,135,224,164,176,224,165,135,224,164,185, 224,165,139,224,164,168,224,165,135,224,164,184,224,164,149,224,164,164,224,165, 135,224,164,172,224,164,185,224,165,129,224,164,164,224,164,184,224,164,190,224, 164,135,224,164,159,224,164,185,224,165,139,224,164,151,224,164,190,224,164,156, 224,164,190,224,164,168,224,165,135,224,164,174,224,164,191,224,164,168,224,164, 159,224,164,149,224,164,176,224,164,164,224,164,190,224,164,149,224,164,176,224, 164,168,224,164,190,224,164,137,224,164,168,224,164,149,224,165,135,224,164,175, 224,164,185,224,164,190,224,164,129,224,164,184,224,164,172,224,164,184,224,165, 135,224,164,173,224,164,190,224,164,183,224,164,190,224,164,134,224,164,170,224, 164,149,224,165,135,224,164,178,224,164,191,224,164,175,224,165,135,224,164,182, 224,165,129,224,164,176,224,165,130,224,164,135,224,164,184,224,164,149,224,165, 135,224,164,152,224,164,130,224,164,159,224,165,135,224,164,174,224,165,135,224, 164,176,224,165,128,224,164,184,224,164,149,224,164,164,224,164,190,224,164,174, 224,165,135,224,164,176,224,164,190,224,164,178,224,165,135,224,164,149,224,164, 176,224,164,133,224,164,167,224,164,191,224,164,149,224,164,133,224,164,170,224, 164,168,224,164,190,224,164,184,224,164,174,224,164,190,224,164,156,224,164,174, 224,165,129,224,164,157,224,165,135,224,164,149,224,164,190,224,164,176,224,164, 163,224,164,185,224,165,139,224,164,164,224,164,190,224,164,149,224,164,161,224, 164,188,224,165,128,224,164,175,224,164,185,224,164,190,224,164,130,224,164,185, 224,165,139,224,164,159,224,164,178,224,164,182,224,164,172,224,165,141,224,164, 166,224,164,178,224,164,191,224,164,175,224,164,190,224,164,156,224,165,128,224, 164,181,224,164,168,224,164,156,224,164,190,224,164,164,224,164,190,224,164,149, 224,165,136,224,164,184,224,165,135,224,164,134,224,164,170,224,164,149,224,164, 190,224,164,181,224,164,190,224,164,178,224,165,128,224,164,166,224,165,135,224, 164,168,224,165,135,224,164,170,224,165,130,224,164,176,224,165,128,224,164,170, 224,164,190,224,164,168,224,165,128,224,164,137,224,164,184,224,164,149,224,165, 135,224,164,185,224,165,139,224,164,151,224,165,128,224,164,172,224,165,136,224, 164,160,224,164,149,224,164,134,224,164,170,224,164,149,224,165,128,224,164,181, 224,164,176,224,165,141,224,164,183,224,164,151,224,164,190,224,164,130,224,164, 181,224,164,134,224,164,170,224,164,149,224,165,139,224,164,156,224,164,191,224, 164,178,224,164,190,224,164,156,224,164,190,224,164,168,224,164,190,224,164,184, 224,164,185,224,164,174,224,164,164,224,164,185,224,164,174,224,165,135,224,164, 130,224,164,137,224,164,168,224,164,149,224,165,128,224,164,175,224,164,190,224, 164,185,224,165,130,224,164,166,224,164,176,224,165,141,224,164,156,224,164,184, 224,165,130,224,164,154,224,165,128,224,164,170,224,164,184,224,164,130,224,164, 166,224,164,184,224,164,181,224,164,190,224,164,178,224,164,185,224,165,139,224, 164,168,224,164,190,224,164,185,224,165,139,224,164,164,224,165,128,224,164,156, 224,165,136,224,164,184,224,165,135,224,164,181,224,164,190,224,164,170,224,164, 184,224,164,156,224,164,168,224,164,164,224,164,190,224,164,168,224,165,135,224, 164,164,224,164,190,224,164,156,224,164,190,224,164,176,224,165,128,224,164,152, 224,164,190,224,164,175,224,164,178,224,164,156,224,164,191,224,164,178,224,165, 135,224,164,168,224,165,128,224,164,154,224,165,135,224,164,156,224,164,190,224, 164,130,224,164,154,224,164,170,224,164,164,224,165,141,224,164,176,224,164,151, 224,165,130,224,164,151,224,164,178,224,164,156,224,164,190,224,164,164,224,165, 135,224,164,172,224,164,190,224,164,185,224,164,176,224,164,134,224,164,170,224, 164,168,224,165,135,224,164,181,224,164,190,224,164,185,224,164,168,224,164,135, 224,164,184,224,164,149,224,164,190,224,164,184,224,165,129,224,164,172,224,164, 185,224,164,176,224,164,185,224,164,168,224,165,135,224,164,135,224,164,184,224, 164,184,224,165,135,224,164,184,224,164,185,224,164,191,224,164,164,224,164,172, 224,164,161,224,164,188,224,165,135,224,164,152,224,164,159,224,164,168,224,164, 190,224,164,164,224,164,178,224,164,190,224,164,182,224,164,170,224,164,190,224, 164,130,224,164,154,224,164,182,224,165,141,224,164,176,224,165,128,224,164,172, 224,164,161,224,164,188,224,165,128,224,164,185,224,165,139,224,164,164,224,165, 135,224,164,184,224,164,190,224,164,136,224,164,159,224,164,182,224,164,190,224, 164,175,224,164,166,224,164,184,224,164,149,224,164,164,224,165,128,224,164,156, 224,164,190,224,164,164,224,165,128,224,164,181,224,164,190,224,164,178,224,164, 190,224,164,185,224,164,156,224,164,190,224,164,176,224,164,170,224,164,159,224, 164,168,224,164,190,224,164,176,224,164,150,224,164,168,224,165,135,224,164,184, 224,164,161,224,164,188,224,164,149,224,164,174,224,164,191,224,164,178,224,164, 190,224,164,137,224,164,184,224,164,149,224,165,128,224,164,149,224,165,135,224, 164,181,224,164,178,224,164,178,224,164,151,224,164,164,224,164,190,224,164,150, 224,164,190,224,164,168,224,164,190,224,164,133,224,164,176,224,165,141,224,164, 165,224,164,156,224,164,185,224,164,190,224,164,130,224,164,166,224,165,135,224, 164,150,224,164,190,224,164,170,224,164,185,224,164,178,224,165,128,224,164,168, 224,164,191,224,164,175,224,164,174,224,164,172,224,164,191,224,164,168,224,164, 190,224,164,172,224,165,136,224,164,130,224,164,149,224,164,149,224,164,185,224, 165,128,224,164,130,224,164,149,224,164,185,224,164,168,224,164,190,224,164,166, 224,165,135,224,164,164,224,164,190,224,164,185,224,164,174,224,164,178,224,165, 135,224,164,149,224,164,190,224,164,171,224,165,128,224,164,156,224,164,172,224, 164,149,224,164,191,224,164,164,224,165,129,224,164,176,224,164,164,224,164,174, 224,164,190,224,164,130,224,164,151,224,164,181,224,164,185,224,165,128,224,164, 130,224,164,176,224,165,139,224,164,156,224,164,188,224,164,174,224,164,191,224, 164,178,224,165,128,224,164,134,224,164,176,224,165,139,224,164,170,224,164,184, 224,165,135,224,164,168,224,164,190,224,164,175,224,164,190,224,164,166,224,164, 181,224,164,178,224,165,135,224,164,168,224,165,135,224,164,150,224,164,190,224, 164,164,224,164,190,224,164,149,224,164,176,224,165,128,224,164,172,224,164,137, 224,164,168,224,164,149,224,164,190,224,164,156,224,164,181,224,164,190,224,164, 172,224,164,170,224,165,130,224,164,176,224,164,190,224,164,172,224,164,161,224, 164,188,224,164,190,224,164,184,224,165,140,224,164,166,224,164,190,224,164,182, 224,165,135,224,164,175,224,164,176,224,164,149,224,164,191,224,164,175,224,165, 135,224,164,149,224,164,185,224,164,190,224,164,130,224,164,133,224,164,149,224, 164,184,224,164,176,224,164,172,224,164,168,224,164,190,224,164,143,224,164,181, 224,164,185,224,164,190,224,164,130,224,164,184,224,165,141,224,164,165,224,164, 178,224,164,174,224,164,191,224,164,178,224,165,135,224,164,178,224,165,135,224, 164,150,224,164,149,224,164,181,224,164,191,224,164,183,224,164,175,224,164,149, 224,165,141,224,164,176,224,164,130,224,164,184,224,164,174,224,165,130,224,164, 185,224,164,165,224,164,190,224,164,168,224,164,190,216,170,216,179,216,170,216, 183,217,138,216,185,217,133,216,180,216,167,216,177,217,131,216,169,216,168,217, 136,216,167,216,179,216,183,216,169,216,167,217,132,216,181,217,129,216,173,216, 169,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,174,216, 167,216,181,216,169,216,167,217,132,217,133,216,178,217,138,216,175,216,167,217, 132,216,185,216,167,217,133,216,169,216,167,217,132,217,131,216,167,216,170,216, 168,216,167,217,132,216,177,216,175,217,136,216,175,216,168,216,177,217,134,216, 167,217,133,216,172,216,167,217,132,216,175,217,136,217,132,216,169,216,167,217, 132,216,185,216,167,217,132,217,133,216,167,217,132,217,133,217,136,217,130,216, 185,216,167,217,132,216,185,216,177,216,168,217,138,216,167,217,132,216,179,216, 177,217,138,216,185,216,167,217,132,216,172,217,136,216,167,217,132,216,167,217, 132,216,176,217,135,216,167,216,168,216,167,217,132,216,173,217,138,216,167,216, 169,216,167,217,132,216,173,217,130,217,136,217,130,216,167,217,132,217,131,216, 177,217,138,217,133,216,167,217,132,216,185,216,177,216,167,217,130,217,133,216, 173,217,129,217,136,216,184,216,169,216,167,217,132,216,171,216,167,217,134,217, 138,217,133,216,180,216,167,217,135,216,175,216,169,216,167,217,132,217,133,216, 177,216,163,216,169,216,167,217,132,217,130,216,177,216,162,217,134,216,167,217, 132,216,180,216,168,216,167,216,168,216,167,217,132,216,173,217,136,216,167,216, 177,216,167,217,132,216,172,216,175,217,138,216,175,216,167,217,132,216,163,216, 179,216,177,216,169,216,167,217,132,216,185,217,132,217,136,217,133,217,133,216, 172,217,133,217,136,216,185,216,169,216,167,217,132,216,177,216,173,217,133,217, 134,216,167,217,132,217,134,217,130,216,167,216,183,217,129,217,132,216,179,216, 183,217,138,217,134,216,167,217,132,217,131,217,136,217,138,216,170,216,167,217, 132,216,175,217,134,217,138,216,167,216,168,216,177,217,131,216,167,216,170,217, 135,216,167,217,132,216,177,217,138,216,167,216,182,216,170,216,173,217,138,216, 167,216,170,217,138,216,168,216,170,217,136,217,130,217,138,216,170,216,167,217, 132,216,163,217,136,217,132,217,137,216,167,217,132,216,168,216,177,217,138,216, 175,216,167,217,132,217,131,217,132,216,167,217,133,216,167,217,132,216,177,216, 167,216,168,216,183,216,167,217,132,216,180,216,174,216,181,217,138,216,179,217, 138,216,167,216,177,216,167,216,170,216,167,217,132,216,171,216,167,217,132,216, 171,216,167,217,132,216,181,217,132,216,167,216,169,216,167,217,132,216,173,216, 175,217,138,216,171,216,167,217,132,216,178,217,136,216,167,216,177,216,167,217, 132,216,174,217,132,217,138,216,172,216,167,217,132,216,172,217,133,217,138,216, 185,216,167,217,132,216,185,216,167,217,133,217,135,216,167,217,132,216,172,217, 133,216,167,217,132,216,167,217,132,216,179,216,167,216,185,216,169,217,133,216, 180,216,167,217,135,216,175,217,135,216,167,217,132,216,177,216,166,217,138,216, 179,216,167,217,132,216,175,216,174,217,136,217,132,216,167,217,132,217,129,217, 134,217,138,216,169,216,167,217,132,217,131,216,170,216,167,216,168,216,167,217, 132,216,175,217,136,216,177,217,138,216,167,217,132,216,175,216,177,217,136,216, 179,216,167,216,179,216,170,216,186,216,177,217,130,216,170,216,181,216,167,217, 133,217,138,217,133,216,167,217,132,216,168,217,134,216,167,216,170,216,167,217, 132,216,185,216,184,217,138,217,133,101,110,116,101,114,116,97,105,110,109,101, 110,116,117,110,100,101,114,115,116,97,110,100,105,110,103,32,61,32,102,117,110, 99,116,105,111,110,40,41,46,106,112,103,34,32,119,105,100,116,104,61,34,99,111, 110,102,105,103,117,114,97,116,105,111,110,46,112,110,103,34,32,119,105,100,116, 104,61,34,60,98,111,100,121,32,99,108,97,115,115,61,34,77,97,116,104,46,114,97, 110,100,111,109,40,41,99,111,110,116,101,109,112,111,114,97,114,121,32,85,110, 105,116,101,100,32,83,116,97,116,101,115,99,105,114,99,117,109,115,116,97,110,99 ,101,115,46,97,112,112,101,110,100,67,104,105,108,100,40,111,114,103,97,110,105, 122,97,116,105,111,110,115,60,115,112,97,110,32,99,108,97,115,115,61,34,34,62,60 ,105,109,103,32,115,114,99,61,34,47,100,105,115,116,105,110,103,117,105,115,104, 101,100,116,104,111,117,115,97,110,100,115,32,111,102,32,99,111,109,109,117,110, 105,99,97,116,105,111,110,99,108,101,97,114,34,62,60,47,100,105,118,62,105,110, 118,101,115,116,105,103,97,116,105,111,110,102,97,118,105,99,111,110,46,105,99, 111,34,32,109,97,114,103,105,110,45,114,105,103,104,116,58,98,97,115,101,100,32, 111,110,32,116,104,101,32,77,97,115,115,97,99,104,117,115,101,116,116,115,116,97 ,98,108,101,32,98,111,114,100,101,114,61,105,110,116,101,114,110,97,116,105,111, 110,97,108,97,108,115,111,32,107,110,111,119,110,32,97,115,112,114,111,110,117, 110,99,105,97,116,105,111,110,98,97,99,107,103,114,111,117,110,100,58,35,102,112 ,97,100,100,105,110,103,45,108,101,102,116,58,70,111,114,32,101,120,97,109,112, 108,101,44,32,109,105,115,99,101,108,108,97,110,101,111,117,115,38,108,116,59,47 ,109,97,116,104,38,103,116,59,112,115,121,99,104,111,108,111,103,105,99,97,108, 105,110,32,112,97,114,116,105,99,117,108,97,114,101,97,114,99,104,34,32,116,121, 112,101,61,34,102,111,114,109,32,109,101,116,104,111,100,61,34,97,115,32,111,112 ,112,111,115,101,100,32,116,111,83,117,112,114,101,109,101,32,67,111,117,114,116 ,111,99,99,97,115,105,111,110,97,108,108,121,32,65,100,100,105,116,105,111,110, 97,108,108,121,44,78,111,114,116,104,32,65,109,101,114,105,99,97,112,120,59,98, 97,99,107,103,114,111,117,110,100,111,112,112,111,114,116,117,110,105,116,105, 101,115,69,110,116,101,114,116,97,105,110,109,101,110,116,46,116,111,76,111,119, 101,114,67,97,115,101,40,109,97,110,117,102,97,99,116,117,114,105,110,103,112, 114,111,102,101,115,115,105,111,110,97,108,32,99,111,109,98,105,110,101,100,32, 119,105,116,104,70,111,114,32,105,110,115,116,97,110,99,101,44,99,111,110,115, 105,115,116,105,110,103,32,111,102,34,32,109,97,120,108,101,110,103,116,104,61, 34,114,101,116,117,114,110,32,102,97,108,115,101,59,99,111,110,115,99,105,111, 117,115,110,101,115,115,77,101,100,105,116,101,114,114,97,110,101,97,110,101,120 ,116,114,97,111,114,100,105,110,97,114,121,97,115,115,97,115,115,105,110,97,116, 105,111,110,115,117,98,115,101,113,117,101,110,116,108,121,32,98,117,116,116,111 ,110,32,116,121,112,101,61,34,116,104,101,32,110,117,109,98,101,114,32,111,102, 116,104,101,32,111,114,105,103,105,110,97,108,32,99,111,109,112,114,101,104,101, 110,115,105,118,101,114,101,102,101,114,115,32,116,111,32,116,104,101,60,47,117, 108,62,10,60,47,100,105,118,62,10,112,104,105,108,111,115,111,112,104,105,99,97, 108,108,111,99,97,116,105,111,110,46,104,114,101,102,119,97,115,32,112,117,98, 108,105,115,104,101,100,83,97,110,32,70,114,97,110,99,105,115,99,111,40,102,117, 110,99,116,105,111,110,40,41,123,10,60,100,105,118,32,105,100,61,34,109,97,105, 110,115,111,112,104,105,115,116,105,99,97,116,101,100,109,97,116,104,101,109,97, 116,105,99,97,108,32,47,104,101,97,100,62,13,10,60,98,111,100,121,115,117,103, 103,101,115,116,115,32,116,104,97,116,100,111,99,117,109,101,110,116,97,116,105, 111,110,99,111,110,99,101,110,116,114,97,116,105,111,110,114,101,108,97,116,105, 111,110,115,104,105,112,115,109,97,121,32,104,97,118,101,32,98,101,101,110,40, 102,111,114,32,101,120,97,109,112,108,101,44,84,104,105,115,32,97,114,116,105,99 ,108,101,32,105,110,32,115,111,109,101,32,99,97,115,101,115,112,97,114,116,115, 32,111,102,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102, 71,114,101,97,116,32,66,114,105,116,97,105,110,32,99,101,108,108,112,97,100,100, 105,110,103,61,101,113,117,105,118,97,108,101,110,116,32,116,111,112,108,97,99, 101,104,111,108,100,101,114,61,34,59,32,102,111,110,116,45,115,105,122,101,58,32 ,106,117,115,116,105,102,105,99,97,116,105,111,110,98,101,108,105,101,118,101, 100,32,116,104,97,116,115,117,102,102,101,114,101,100,32,102,114,111,109,97,116, 116,101,109,112,116,101,100,32,116,111,32,108,101,97,100,101,114,32,111,102,32, 116,104,101,99,114,105,112,116,34,32,115,114,99,61,34,47,40,102,117,110,99,116, 105,111,110,40,41,32,123,97,114,101,32,97,118,97,105,108,97,98,108,101,10,9,60, 108,105,110,107,32,114,101,108,61,34,32,115,114,99,61,39,104,116,116,112,58,47, 47,105,110,116,101,114,101,115,116,101,100,32,105,110,99,111,110,118,101,110,116 ,105,111,110,97,108,32,34,32,97,108,116,61,34,34,32,47,62,60,47,97,114,101,32, 103,101,110,101,114,97,108,108,121,104,97,115,32,97,108,115,111,32,98,101,101, 110,109,111,115,116,32,112,111,112,117,108,97,114,32,99,111,114,114,101,115,112, 111,110,100,105,110,103,99,114,101,100,105,116,101,100,32,119,105,116,104,116, 121,108,101,61,34,98,111,114,100,101,114,58,60,47,97,62,60,47,115,112,97,110,62, 60,47,46,103,105,102,34,32,119,105,100,116,104,61,34,60,105,102,114,97,109,101, 32,115,114,99,61,34,116,97,98,108,101,32,99,108,97,115,115,61,34,105,110,108,105 ,110,101,45,98,108,111,99,107,59,97,99,99,111,114,100,105,110,103,32,116,111,32, 116,111,103,101,116,104,101,114,32,119,105,116,104,97,112,112,114,111,120,105, 109,97,116,101,108,121,112,97,114,108,105,97,109,101,110,116,97,114,121,109,111, 114,101,32,97,110,100,32,109,111,114,101,100,105,115,112,108,97,121,58,110,111, 110,101,59,116,114,97,100,105,116,105,111,110,97,108,108,121,112,114,101,100,111 ,109,105,110,97,110,116,108,121,38,110,98,115,112,59,124,38,110,98,115,112,59,38 ,110,98,115,112,59,60,47,115,112,97,110,62,32,99,101,108,108,115,112,97,99,105, 110,103,61,60,105,110,112,117,116,32,110,97,109,101,61,34,111,114,34,32,99,111, 110,116,101,110,116,61,34,99,111,110,116,114,111,118,101,114,115,105,97,108,112, 114,111,112,101,114,116,121,61,34,111,103,58,47,120,45,115,104,111,99,107,119,97 ,118,101,45,100,101,109,111,110,115,116,114,97,116,105,111,110,115,117,114,114, 111,117,110,100,101,100,32,98,121,78,101,118,101,114,116,104,101,108,101,115,115 ,44,119,97,115,32,116,104,101,32,102,105,114,115,116,99,111,110,115,105,100,101, 114,97,98,108,101,32,65,108,116,104,111,117,103,104,32,116,104,101,32,99,111,108 ,108,97,98,111,114,97,116,105,111,110,115,104,111,117,108,100,32,110,111,116,32, 98,101,112,114,111,112,111,114,116,105,111,110,32,111,102,60,115,112,97,110,32, 115,116,121,108,101,61,34,107,110,111,119,110,32,97,115,32,116,104,101,32,115, 104,111,114,116,108,121,32,97,102,116,101,114,102,111,114,32,105,110,115,116,97, 110,99,101,44,100,101,115,99,114,105,98,101,100,32,97,115,32,47,104,101,97,100, 62,10,60,98,111,100,121,32,115,116,97,114,116,105,110,103,32,119,105,116,104,105 ,110,99,114,101,97,115,105,110,103,108,121,32,116,104,101,32,102,97,99,116,32, 116,104,97,116,100,105,115,99,117,115,115,105,111,110,32,111,102,109,105,100,100 ,108,101,32,111,102,32,116,104,101,97,110,32,105,110,100,105,118,105,100,117,97, 108,100,105,102,102,105,99,117,108,116,32,116,111,32,112,111,105,110,116,32,111, 102,32,118,105,101,119,104,111,109,111,115,101,120,117,97,108,105,116,121,97,99, 99,101,112,116,97,110,99,101,32,111,102,60,47,115,112,97,110,62,60,47,100,105, 118,62,109,97,110,117,102,97,99,116,117,114,101,114,115,111,114,105,103,105,110, 32,111,102,32,116,104,101,99,111,109,109,111,110,108,121,32,117,115,101,100,105, 109,112,111,114,116,97,110,99,101,32,111,102,100,101,110,111,109,105,110,97,116, 105,111,110,115,98,97,99,107,103,114,111,117,110,100,58,32,35,108,101,110,103, 116,104,32,111,102,32,116,104,101,100,101,116,101,114,109,105,110,97,116,105,111 ,110,97,32,115,105,103,110,105,102,105,99,97,110,116,34,32,98,111,114,100,101, 114,61,34,48,34,62,114,101,118,111,108,117,116,105,111,110,97,114,121,112,114, 105,110,99,105,112,108,101,115,32,111,102,105,115,32,99,111,110,115,105,100,101, 114,101,100,119,97,115,32,100,101,118,101,108,111,112,101,100,73,110,100,111,45, 69,117,114,111,112,101,97,110,118,117,108,110,101,114,97,98,108,101,32,116,111, 112,114,111,112,111,110,101,110,116,115,32,111,102,97,114,101,32,115,111,109,101 ,116,105,109,101,115,99,108,111,115,101,114,32,116,111,32,116,104,101,78,101,119 ,32,89,111,114,107,32,67,105,116,121,32,110,97,109,101,61,34,115,101,97,114,99, 104,97,116,116,114,105,98,117,116,101,100,32,116,111,99,111,117,114,115,101,32, 111,102,32,116,104,101,109,97,116,104,101,109,97,116,105,99,105,97,110,98,121,32 ,116,104,101,32,101,110,100,32,111,102,97,116,32,116,104,101,32,101,110,100,32, 111,102,34,32,98,111,114,100,101,114,61,34,48,34,32,116,101,99,104,110,111,108, 111,103,105,99,97,108,46,114,101,109,111,118,101,67,108,97,115,115,40,98,114,97, 110,99,104,32,111,102,32,116,104,101,101,118,105,100,101,110,99,101,32,116,104, 97,116,33,91,101,110,100,105,102,93,45,45,62,13,10,73,110,115,116,105,116,117, 116,101,32,111,102,32,105,110,116,111,32,97,32,115,105,110,103,108,101,114,101, 115,112,101,99,116,105,118,101,108,121,46,97,110,100,32,116,104,101,114,101,102, 111,114,101,112,114,111,112,101,114,116,105,101,115,32,111,102,105,115,32,108, 111,99,97,116,101,100,32,105,110,115,111,109,101,32,111,102,32,119,104,105,99, 104,84,104,101,114,101,32,105,115,32,97,108,115,111,99,111,110,116,105,110,117, 101,100,32,116,111,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,38,97, 109,112,59,110,100,97,115,104,59,32,100,101,115,99,114,105,98,101,115,32,116,104 ,101,99,111,110,115,105,100,101,114,97,116,105,111,110,97,117,116,104,111,114,32 ,111,102,32,116,104,101,105,110,100,101,112,101,110,100,101,110,116,108,121,101, 113,117,105,112,112,101,100,32,119,105,116,104,100,111,101,115,32,110,111,116,32 ,104,97,118,101,60,47,97,62,60,97,32,104,114,101,102,61,34,99,111,110,102,117, 115,101,100,32,119,105,116,104,60,108,105,110,107,32,104,114,101,102,61,34,47,97 ,116,32,116,104,101,32,97,103,101,32,111,102,97,112,112,101,97,114,32,105,110,32 ,116,104,101,84,104,101,115,101,32,105,110,99,108,117,100,101,114,101,103,97,114 ,100,108,101,115,115,32,111,102,99,111,117,108,100,32,98,101,32,117,115,101,100, 32,115,116,121,108,101,61,38,113,117,111,116,59,115,101,118,101,114,97,108,32, 116,105,109,101,115,114,101,112,114,101,115,101,110,116,32,116,104,101,98,111, 100,121,62,10,60,47,104,116,109,108,62,116,104,111,117,103,104,116,32,116,111,32 ,98,101,112,111,112,117,108,97,116,105,111,110,32,111,102,112,111,115,115,105,98 ,105,108,105,116,105,101,115,112,101,114,99,101,110,116,97,103,101,32,111,102,97 ,99,99,101,115,115,32,116,111,32,116,104,101,97,110,32,97,116,116,101,109,112, 116,32,116,111,112,114,111,100,117,99,116,105,111,110,32,111,102,106,113,117,101 ,114,121,47,106,113,117,101,114,121,116,119,111,32,100,105,102,102,101,114,101, 110,116,98,101,108,111,110,103,32,116,111,32,116,104,101,101,115,116,97,98,108, 105,115,104,109,101,110,116,114,101,112,108,97,99,105,110,103,32,116,104,101,100 ,101,115,99,114,105,112,116,105,111,110,34,32,100,101,116,101,114,109,105,110, 101,32,116,104,101,97,118,97,105,108,97,98,108,101,32,102,111,114,65,99,99,111, 114,100,105,110,103,32,116,111,32,119,105,100,101,32,114,97,110,103,101,32,111, 102,9,60,100,105,118,32,99,108,97,115,115,61,34,109,111,114,101,32,99,111,109, 109,111,110,108,121,111,114,103,97,110,105,115,97,116,105,111,110,115,102,117, 110,99,116,105,111,110,97,108,105,116,121,119,97,115,32,99,111,109,112,108,101, 116,101,100,32,38,97,109,112,59,109,100,97,115,104,59,32,112,97,114,116,105,99, 105,112,97,116,105,111,110,116,104,101,32,99,104,97,114,97,99,116,101,114,97,110 ,32,97,100,100,105,116,105,111,110,97,108,97,112,112,101,97,114,115,32,116,111, 32,98,101,102,97,99,116,32,116,104,97,116,32,116,104,101,97,110,32,101,120,97, 109,112,108,101,32,111,102,115,105,103,110,105,102,105,99,97,110,116,108,121,111 ,110,109,111,117,115,101,111,118,101,114,61,34,98,101,99,97,117,115,101,32,116, 104,101,121,32,97,115,121,110,99,32,61,32,116,114,117,101,59,112,114,111,98,108, 101,109,115,32,119,105,116,104,115,101,101,109,115,32,116,111,32,104,97,118,101, 116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,114,99,61,34,104,116, 116,112,58,47,47,102,97,109,105,108,105,97,114,32,119,105,116,104,112,111,115, 115,101,115,115,105,111,110,32,111,102,102,117,110,99,116,105,111,110,32,40,41, 32,123,116,111,111,107,32,112,108,97,99,101,32,105,110,97,110,100,32,115,111,109 ,101,116,105,109,101,115,115,117,98,115,116,97,110,116,105,97,108,108,121,60,115 ,112,97,110,62,60,47,115,112,97,110,62,105,115,32,111,102,116,101,110,32,117,115 ,101,100,105,110,32,97,110,32,97,116,116,101,109,112,116,103,114,101,97,116,32, 100,101,97,108,32,111,102,69,110,118,105,114,111,110,109,101,110,116,97,108,115, 117,99,99,101,115,115,102,117,108,108,121,32,118,105,114,116,117,97,108,108,121, 32,97,108,108,50,48,116,104,32,99,101,110,116,117,114,121,44,112,114,111,102,101 ,115,115,105,111,110,97,108,115,110,101,99,101,115,115,97,114,121,32,116,111,32, 100,101,116,101,114,109,105,110,101,100,32,98,121,99,111,109,112,97,116,105,98, 105,108,105,116,121,98,101,99,97,117,115,101,32,105,116,32,105,115,68,105,99,116 ,105,111,110,97,114,121,32,111,102,109,111,100,105,102,105,99,97,116,105,111,110 ,115,84,104,101,32,102,111,108,108,111,119,105,110,103,109,97,121,32,114,101,102 ,101,114,32,116,111,58,67,111,110,115,101,113,117,101,110,116,108,121,44,73,110, 116,101,114,110,97,116,105,111,110,97,108,97,108,116,104,111,117,103,104,32,115, 111,109,101,116,104,97,116,32,119,111,117,108,100,32,98,101,119,111,114,108,100, 39,115,32,102,105,114,115,116,99,108,97,115,115,105,102,105,101,100,32,97,115,98 ,111,116,116,111,109,32,111,102,32,116,104,101,40,112,97,114,116,105,99,117,108, 97,114,108,121,97,108,105,103,110,61,34,108,101,102,116,34,32,109,111,115,116,32 ,99,111,109,109,111,110,108,121,98,97,115,105,115,32,102,111,114,32,116,104,101, 102,111,117,110,100,97,116,105,111,110,32,111,102,99,111,110,116,114,105,98,117, 116,105,111,110,115,112,111,112,117,108,97,114,105,116,121,32,111,102,99,101,110 ,116,101,114,32,111,102,32,116,104,101,116,111,32,114,101,100,117,99,101,32,116, 104,101,106,117,114,105,115,100,105,99,116,105,111,110,115,97,112,112,114,111, 120,105,109,97,116,105,111,110,32,111,110,109,111,117,115,101,111,117,116,61,34, 78,101,119,32,84,101,115,116,97,109,101,110,116,99,111,108,108,101,99,116,105, 111,110,32,111,102,60,47,115,112,97,110,62,60,47,97,62,60,47,105,110,32,116,104, 101,32,85,110,105,116,101,100,102,105,108,109,32,100,105,114,101,99,116,111,114, 45,115,116,114,105,99,116,46,100,116,100,34,62,104,97,115,32,98,101,101,110,32, 117,115,101,100,114,101,116,117,114,110,32,116,111,32,116,104,101,97,108,116,104 ,111,117,103,104,32,116,104,105,115,99,104,97,110,103,101,32,105,110,32,116,104, 101,115,101,118,101,114,97,108,32,111,116,104,101,114,98,117,116,32,116,104,101, 114,101,32,97,114,101,117,110,112,114,101,99,101,100,101,110,116,101,100,105,115 ,32,115,105,109,105,108,97,114,32,116,111,101,115,112,101,99,105,97,108,108,121, 32,105,110,119,101,105,103,104,116,58,32,98,111,108,100,59,105,115,32,99,97,108, 108,101,100,32,116,104,101,99,111,109,112,117,116,97,116,105,111,110,97,108,105, 110,100,105,99,97,116,101,32,116,104,97,116,114,101,115,116,114,105,99,116,101, 100,32,116,111,9,60,109,101,116,97,32,110,97,109,101,61,34,97,114,101,32,116,121 ,112,105,99,97,108,108,121,99,111,110,102,108,105,99,116,32,119,105,116,104,72, 111,119,101,118,101,114,44,32,116,104,101,32,65,110,32,101,120,97,109,112,108, 101,32,111,102,99,111,109,112,97,114,101,100,32,119,105,116,104,113,117,97,110, 116,105,116,105,101,115,32,111,102,114,97,116,104,101,114,32,116,104,97,110,32, 97,99,111,110,115,116,101,108,108,97,116,105,111,110,110,101,99,101,115,115,97, 114,121,32,102,111,114,114,101,112,111,114,116,101,100,32,116,104,97,116,115,112 ,101,99,105,102,105,99,97,116,105,111,110,112,111,108,105,116,105,99,97,108,32, 97,110,100,38,110,98,115,112,59,38,110,98,115,112,59,60,114,101,102,101,114,101, 110,99,101,115,32,116,111,116,104,101,32,115,97,109,101,32,121,101,97,114,71,111 ,118,101,114,110,109,101,110,116,32,111,102,103,101,110,101,114,97,116,105,111, 110,32,111,102,104,97,118,101,32,110,111,116,32,98,101,101,110,115,101,118,101, 114,97,108,32,121,101,97,114,115,99,111,109,109,105,116,109,101,110,116,32,116, 111,9,9,60,117,108,32,99,108,97,115,115,61,34,118,105,115,117,97,108,105,122,97, 116,105,111,110,49,57,116,104,32,99,101,110,116,117,114,121,44,112,114,97,99,116 ,105,116,105,111,110,101,114,115,116,104,97,116,32,104,101,32,119,111,117,108, 100,97,110,100,32,99,111,110,116,105,110,117,101,100,111,99,99,117,112,97,116, 105,111,110,32,111,102,105,115,32,100,101,102,105,110,101,100,32,97,115,99,101, 110,116,114,101,32,111,102,32,116,104,101,116,104,101,32,97,109,111,117,110,116, 32,111,102,62,60,100,105,118,32,115,116,121,108,101,61,34,101,113,117,105,118,97 ,108,101,110,116,32,111,102,100,105,102,102,101,114,101,110,116,105,97,116,101, 98,114,111,117,103,104,116,32,97,98,111,117,116,109,97,114,103,105,110,45,108, 101,102,116,58,32,97,117,116,111,109,97,116,105,99,97,108,108,121,116,104,111, 117,103,104,116,32,111,102,32,97,115,83,111,109,101,32,111,102,32,116,104,101, 115,101,10,60,100,105,118,32,99,108,97,115,115,61,34,105,110,112,117,116,32,99, 108,97,115,115,61,34,114,101,112,108,97,99,101,100,32,119,105,116,104,105,115,32 ,111,110,101,32,111,102,32,116,104,101,101,100,117,99,97,116,105,111,110,32,97, 110,100,105,110,102,108,117,101,110,99,101,100,32,98,121,114,101,112,117,116,97, 116,105,111,110,32,97,115,10,60,109,101,116,97,32,110,97,109,101,61,34,97,99,99, 111,109,109,111,100,97,116,105,111,110,60,47,100,105,118,62,10,60,47,100,105,118 ,62,108,97,114,103,101,32,112,97,114,116,32,111,102,73,110,115,116,105,116,117, 116,101,32,102,111,114,116,104,101,32,115,111,45,99,97,108,108,101,100,32,97,103 ,97,105,110,115,116,32,116,104,101,32,73,110,32,116,104,105,115,32,99,97,115,101 ,44,119,97,115,32,97,112,112,111,105,110,116,101,100,99,108,97,105,109,101,100, 32,116,111,32,98,101,72,111,119,101,118,101,114,44,32,116,104,105,115,68,101,112 ,97,114,116,109,101,110,116,32,111,102,116,104,101,32,114,101,109,97,105,110,105 ,110,103,101,102,102,101,99,116,32,111,110,32,116,104,101,112,97,114,116,105,99, 117,108,97,114,108,121,32,100,101,97,108,32,119,105,116,104,32,116,104,101,10,60 ,100,105,118,32,115,116,121,108,101,61,34,97,108,109,111,115,116,32,97,108,119, 97,121,115,97,114,101,32,99,117,114,114,101,110,116,108,121,101,120,112,114,101, 115,115,105,111,110,32,111,102,112,104,105,108,111,115,111,112,104,121,32,111, 102,102,111,114,32,109,111,114,101,32,116,104,97,110,99,105,118,105,108,105,122, 97,116,105,111,110,115,111,110,32,116,104,101,32,105,115,108,97,110,100,115,101, 108,101,99,116,101,100,73,110,100,101,120,99,97,110,32,114,101,115,117,108,116, 32,105,110,34,32,118,97,108,117,101,61,34,34,32,47,62,116,104,101,32,115,116,114 ,117,99,116,117,114,101,32,47,62,60,47,97,62,60,47,100,105,118,62,77,97,110,121, 32,111,102,32,116,104,101,115,101,99,97,117,115,101,100,32,98,121,32,116,104,101 ,111,102,32,116,104,101,32,85,110,105,116,101,100,115,112,97,110,32,99,108,97, 115,115,61,34,109,99,97,110,32,98,101,32,116,114,97,99,101,100,105,115,32,114, 101,108,97,116,101,100,32,116,111,98,101,99,97,109,101,32,111,110,101,32,111,102 ,105,115,32,102,114,101,113,117,101,110,116,108,121,108,105,118,105,110,103,32, 105,110,32,116,104,101,116,104,101,111,114,101,116,105,99,97,108,108,121,70,111, 108,108,111,119,105,110,103,32,116,104,101,82,101,118,111,108,117,116,105,111, 110,97,114,121,103,111,118,101,114,110,109,101,110,116,32,105,110,105,115,32,100 ,101,116,101,114,109,105,110,101,100,116,104,101,32,112,111,108,105,116,105,99, 97,108,105,110,116,114,111,100,117,99,101,100,32,105,110,115,117,102,102,105,99, 105,101,110,116,32,116,111,100,101,115,99,114,105,112,116,105,111,110,34,62,115, 104,111,114,116,32,115,116,111,114,105,101,115,115,101,112,97,114,97,116,105,111 ,110,32,111,102,97,115,32,116,111,32,119,104,101,116,104,101,114,107,110,111,119 ,110,32,102,111,114,32,105,116,115,119,97,115,32,105,110,105,116,105,97,108,108, 121,100,105,115,112,108,97,121,58,98,108,111,99,107,105,115,32,97,110,32,101,120 ,97,109,112,108,101,116,104,101,32,112,114,105,110,99,105,112,97,108,99,111,110, 115,105,115,116,115,32,111,102,32,97,114,101,99,111,103,110,105,122,101,100,32, 97,115,47,98,111,100,121,62,60,47,104,116,109,108,62,97,32,115,117,98,115,116,97 ,110,116,105,97,108,114,101,99,111,110,115,116,114,117,99,116,101,100,104,101,97 ,100,32,111,102,32,115,116,97,116,101,114,101,115,105,115,116,97,110,99,101,32, 116,111,117,110,100,101,114,103,114,97,100,117,97,116,101,84,104,101,114,101,32, 97,114,101,32,116,119,111,103,114,97,118,105,116,97,116,105,111,110,97,108,97, 114,101,32,100,101,115,99,114,105,98,101,100,105,110,116,101,110,116,105,111,110 ,97,108,108,121,115,101,114,118,101,100,32,97,115,32,116,104,101,99,108,97,115, 115,61,34,104,101,97,100,101,114,111,112,112,111,115,105,116,105,111,110,32,116, 111,102,117,110,100,97,109,101,110,116,97,108,108,121,100,111,109,105,110,97,116 ,101,100,32,116,104,101,97,110,100,32,116,104,101,32,111,116,104,101,114,97,108, 108,105,97,110,99,101,32,119,105,116,104,119,97,115,32,102,111,114,99,101,100,32 ,116,111,114,101,115,112,101,99,116,105,118,101,108,121,44,97,110,100,32,112,111 ,108,105,116,105,99,97,108,105,110,32,115,117,112,112,111,114,116,32,111,102,112 ,101,111,112,108,101,32,105,110,32,116,104,101,50,48,116,104,32,99,101,110,116, 117,114,121,46,97,110,100,32,112,117,98,108,105,115,104,101,100,108,111,97,100, 67,104,97,114,116,98,101,97,116,116,111,32,117,110,100,101,114,115,116,97,110, 100,109,101,109,98,101,114,32,115,116,97,116,101,115,101,110,118,105,114,111,110 ,109,101,110,116,97,108,102,105,114,115,116,32,104,97,108,102,32,111,102,99,111, 117,110,116,114,105,101,115,32,97,110,100,97,114,99,104,105,116,101,99,116,117, 114,97,108,98,101,32,99,111,110,115,105,100,101,114,101,100,99,104,97,114,97,99, 116,101,114,105,122,101,100,99,108,101,97,114,73,110,116,101,114,118,97,108,97, 117,116,104,111,114,105,116,97,116,105,118,101,70,101,100,101,114,97,116,105,111 ,110,32,111,102,119,97,115,32,115,117,99,99,101,101,100,101,100,97,110,100,32, 116,104,101,114,101,32,97,114,101,97,32,99,111,110,115,101,113,117,101,110,99, 101,116,104,101,32,80,114,101,115,105,100,101,110,116,97,108,115,111,32,105,110, 99,108,117,100,101,100,102,114,101,101,32,115,111,102,116,119,97,114,101,115,117 ,99,99,101,115,115,105,111,110,32,111,102,100,101,118,101,108,111,112,101,100,32 ,116,104,101,119,97,115,32,100,101,115,116,114,111,121,101,100,97,119,97,121,32, 102,114,111,109,32,116,104,101,59,10,60,47,115,99,114,105,112,116,62,10,60,97, 108,116,104,111,117,103,104,32,116,104,101,121,102,111,108,108,111,119,101,100, 32,98,121,32,97,109,111,114,101,32,112,111,119,101,114,102,117,108,114,101,115, 117,108,116,101,100,32,105,110,32,97,85,110,105,118,101,114,115,105,116,121,32, 111,102,72,111,119,101,118,101,114,44,32,109,97,110,121,116,104,101,32,112,114, 101,115,105,100,101,110,116,72,111,119,101,118,101,114,44,32,115,111,109,101,105 ,115,32,116,104,111,117,103,104,116,32,116,111,117,110,116,105,108,32,116,104, 101,32,101,110,100,119,97,115,32,97,110,110,111,117,110,99,101,100,97,114,101,32 ,105,109,112,111,114,116,97,110,116,97,108,115,111,32,105,110,99,108,117,100,101 ,115,62,60,105,110,112,117,116,32,116,121,112,101,61,116,104,101,32,99,101,110, 116,101,114,32,111,102,32,68,79,32,78,79,84,32,65,76,84,69,82,117,115,101,100,32 ,116,111,32,114,101,102,101,114,116,104,101,109,101,115,47,63,115,111,114,116,61 ,116,104,97,116,32,104,97,100,32,98,101,101,110,116,104,101,32,98,97,115,105,115 ,32,102,111,114,104,97,115,32,100,101,118,101,108,111,112,101,100,105,110,32,116 ,104,101,32,115,117,109,109,101,114,99,111,109,112,97,114,97,116,105,118,101,108 ,121,100,101,115,99,114,105,98,101,100,32,116,104,101,115,117,99,104,32,97,115, 32,116,104,111,115,101,116,104,101,32,114,101,115,117,108,116,105,110,103,105, 115,32,105,109,112,111,115,115,105,98,108,101,118,97,114,105,111,117,115,32,111, 116,104,101,114,83,111,117,116,104,32,65,102,114,105,99,97,110,104,97,118,101,32 ,116,104,101,32,115,97,109,101,101,102,102,101,99,116,105,118,101,110,101,115, 115,105,110,32,119,104,105,99,104,32,99,97,115,101,59,32,116,101,120,116,45,97, 108,105,103,110,58,115,116,114,117,99,116,117,114,101,32,97,110,100,59,32,98,97, 99,107,103,114,111,117,110,100,58,114,101,103,97,114,100,105,110,103,32,116,104, 101,115,117,112,112,111,114,116,101,100,32,116,104,101,105,115,32,97,108,115,111 ,32,107,110,111,119,110,115,116,121,108,101,61,34,109,97,114,103,105,110,105,110 ,99,108,117,100,105,110,103,32,116,104,101,98,97,104,97,115,97,32,77,101,108,97, 121,117,110,111,114,115,107,32,98,111,107,109,195,165,108,110,111,114,115,107,32 ,110,121,110,111,114,115,107,115,108,111,118,101,110,197,161,196,141,105,110,97, 105,110,116,101,114,110,97,99,105,111,110,97,108,99,97,108,105,102,105,99,97,99, 105,195,179,110,99,111,109,117,110,105,99,97,99,105,195,179,110,99,111,110,115, 116,114,117,99,99,105,195,179,110,34,62,60,100,105,118,32,99,108,97,115,115,61, 34,100,105,115,97,109,98,105,103,117,97,116,105,111,110,68,111,109,97,105,110,78 ,97,109,101,39,44,32,39,97,100,109,105,110,105,115,116,114,97,116,105,111,110, 115,105,109,117,108,116,97,110,101,111,117,115,108,121,116,114,97,110,115,112, 111,114,116,97,116,105,111,110,73,110,116,101,114,110,97,116,105,111,110,97,108, 32,109,97,114,103,105,110,45,98,111,116,116,111,109,58,114,101,115,112,111,110, 115,105,98,105,108,105,116,121,60,33,91,101,110,100,105,102,93,45,45,62,10,60,47 ,62,60,109,101,116,97,32,110,97,109,101,61,34,105,109,112,108,101,109,101,110, 116,97,116,105,111,110,105,110,102,114,97,115,116,114,117,99,116,117,114,101,114 ,101,112,114,101,115,101,110,116,97,116,105,111,110,98,111,114,100,101,114,45,98 ,111,116,116,111,109,58,60,47,104,101,97,100,62,10,60,98,111,100,121,62,61,104, 116,116,112,37,51,65,37,50,70,37,50,70,60,102,111,114,109,32,109,101,116,104,111 ,100,61,34,109,101,116,104,111,100,61,34,112,111,115,116,34,32,47,102,97,118,105 ,99,111,110,46,105,99,111,34,32,125,41,59,10,60,47,115,99,114,105,112,116,62,10, 46,115,101,116,65,116,116,114,105,98,117,116,101,40,65,100,109,105,110,105,115, 116,114,97,116,105,111,110,61,32,110,101,119,32,65,114,114,97,121,40,41,59,60,33 ,91,101,110,100,105,102,93,45,45,62,13,10,100,105,115,112,108,97,121,58,98,108, 111,99,107,59,85,110,102,111,114,116,117,110,97,116,101,108,121,44,34,62,38,110, 98,115,112,59,60,47,100,105,118,62,47,102,97,118,105,99,111,110,46,105,99,111,34 ,62,61,39,115,116,121,108,101,115,104,101,101,116,39,32,105,100,101,110,116,105, 102,105,99,97,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44 ,60,108,105,62,60,97,32,104,114,101,102,61,34,47,97,110,32,97,108,116,101,114, 110,97,116,105,118,101,97,115,32,97,32,114,101,115,117,108,116,32,111,102,112, 116,34,62,60,47,115,99,114,105,112,116,62,10,116,121,112,101,61,34,115,117,98, 109,105,116,34,32,10,40,102,117,110,99,116,105,111,110,40,41,32,123,114,101,99, 111,109,109,101,110,100,97,116,105,111,110,102,111,114,109,32,97,99,116,105,111, 110,61,34,47,116,114,97,110,115,102,111,114,109,97,116,105,111,110,114,101,99, 111,110,115,116,114,117,99,116,105,111,110,46,115,116,121,108,101,46,100,105,115 ,112,108,97,121,32,65,99,99,111,114,100,105,110,103,32,116,111,32,104,105,100, 100,101,110,34,32,110,97,109,101,61,34,97,108,111,110,103,32,119,105,116,104,32, 116,104,101,100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,114, 111,120,105,109,97,116,101,108,121,32,67,111,109,109,117,110,105,99,97,116,105, 111,110,115,112,111,115,116,34,32,97,99,116,105,111,110,61,34,109,101,97,110,105 ,110,103,32,38,113,117,111,116,59,45,45,60,33,91,101,110,100,105,102,93,45,45,62 ,80,114,105,109,101,32,77,105,110,105,115,116,101,114,99,104,97,114,97,99,116, 101,114,105,115,116,105,99,60,47,97,62,32,60,97,32,99,108,97,115,115,61,116,104, 101,32,104,105,115,116,111,114,121,32,111,102,32,111,110,109,111,117,115,101,111 ,118,101,114,61,34,116,104,101,32,103,111,118,101,114,110,109,101,110,116,104, 114,101,102,61,34,104,116,116,112,115,58,47,47,119,97,115,32,111,114,105,103,105 ,110,97,108,108,121,119,97,115,32,105,110,116,114,111,100,117,99,101,100,99,108, 97,115,115,105,102,105,99,97,116,105,111,110,114,101,112,114,101,115,101,110,116 ,97,116,105,118,101,97,114,101,32,99,111,110,115,105,100,101,114,101,100,60,33, 91,101,110,100,105,102,93,45,45,62,10,10,100,101,112,101,110,100,115,32,111,110, 32,116,104,101,85,110,105,118,101,114,115,105,116,121,32,111,102,32,105,110,32, 99,111,110,116,114,97,115,116,32,116,111,32,112,108,97,99,101,104,111,108,100, 101,114,61,34,105,110,32,116,104,101,32,99,97,115,101,32,111,102,105,110,116,101 ,114,110,97,116,105,111,110,97,108,32,99,111,110,115,116,105,116,117,116,105,111 ,110,97,108,115,116,121,108,101,61,34,98,111,114,100,101,114,45,58,32,102,117, 110,99,116,105,111,110,40,41,32,123,66,101,99,97,117,115,101,32,111,102,32,116, 104,101,45,115,116,114,105,99,116,46,100,116,100,34,62,10,60,116,97,98,108,101, 32,99,108,97,115,115,61,34,97,99,99,111,109,112,97,110,105,101,100,32,98,121,97, 99,99,111,117,110,116,32,111,102,32,116,104,101,60,115,99,114,105,112,116,32,115 ,114,99,61,34,47,110,97,116,117,114,101,32,111,102,32,116,104,101,32,116,104,101 ,32,112,101,111,112,108,101,32,105,110,32,105,110,32,97,100,100,105,116,105,111, 110,32,116,111,115,41,59,32,106,115,46,105,100,32,61,32,105,100,34,32,119,105, 100,116,104,61,34,49,48,48,37,34,114,101,103,97,114,100,105,110,103,32,116,104, 101,32,82,111,109,97,110,32,67,97,116,104,111,108,105,99,97,110,32,105,110,100, 101,112,101,110,100,101,110,116,102,111,108,108,111,119,105,110,103,32,116,104, 101,32,46,103,105,102,34,32,119,105,100,116,104,61,34,49,116,104,101,32,102,111, 108,108,111,119,105,110,103,32,100,105,115,99,114,105,109,105,110,97,116,105,111 ,110,97,114,99,104,97,101,111,108,111,103,105,99,97,108,112,114,105,109,101,32, 109,105,110,105,115,116,101,114,46,106,115,34,62,60,47,115,99,114,105,112,116,62 ,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,109,97,114,103,105,110, 119,105,100,116,104,61,34,99,114,101,97,116,101,69,108,101,109,101,110,116,40, 119,46,97,116,116,97,99,104,69,118,101,110,116,40,60,47,97,62,60,47,116,100,62, 60,47,116,114,62,115,114,99,61,34,104,116,116,112,115,58,47,47,97,73,110,32,112, 97,114,116,105,99,117,108,97,114,44,32,97,108,105,103,110,61,34,108,101,102,116, 34,32,67,122,101,99,104,32,82,101,112,117,98,108,105,99,85,110,105,116,101,100, 32,75,105,110,103,100,111,109,99,111,114,114,101,115,112,111,110,100,101,110,99, 101,99,111,110,99,108,117,100,101,100,32,116,104,97,116,46,104,116,109,108,34,32 ,116,105,116,108,101,61,34,40,102,117,110,99,116,105,111,110,32,40,41,32,123,99, 111,109,101,115,32,102,114,111,109,32,116,104,101,97,112,112,108,105,99,97,116, 105,111,110,32,111,102,60,115,112,97,110,32,99,108,97,115,115,61,34,115,98,101, 108,105,101,118,101,100,32,116,111,32,98,101,101,109,101,110,116,40,39,115,99, 114,105,112,116,39,60,47,97,62,10,60,47,108,105,62,10,60,108,105,118,101,114,121 ,32,100,105,102,102,101,114,101,110,116,62,60,115,112,97,110,32,99,108,97,115, 115,61,34,111,112,116,105,111,110,32,118,97,108,117,101,61,34,40,97,108,115,111, 32,107,110,111,119,110,32,97,115,9,60,108,105,62,60,97,32,104,114,101,102,61,34, 62,60,105,110,112,117,116,32,110,97,109,101,61,34,115,101,112,97,114,97,116,101, 100,32,102,114,111,109,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32, 118,97,108,105,103,110,61,34,116,111,112,34,62,102,111,117,110,100,101,114,32, 111,102,32,116,104,101,97,116,116,101,109,112,116,105,110,103,32,116,111,32,99, 97,114,98,111,110,32,100,105,111,120,105,100,101,10,10,60,100,105,118,32,99,108, 97,115,115,61,34,99,108,97,115,115,61,34,115,101,97,114,99,104,45,47,98,111,100, 121,62,10,60,47,104,116,109,108,62,111,112,112,111,114,116,117,110,105,116,121, 32,116,111,99,111,109,109,117,110,105,99,97,116,105,111,110,115,60,47,104,101,97 ,100,62,13,10,60,98,111,100,121,32,115,116,121,108,101,61,34,119,105,100,116,104 ,58,84,105,225,186,191,110,103,32,86,105,225,187,135,116,99,104,97,110,103,101, 115,32,105,110,32,116,104,101,98,111,114,100,101,114,45,99,111,108,111,114,58,35 ,48,34,32,98,111,114,100,101,114,61,34,48,34,32,60,47,115,112,97,110,62,60,47, 100,105,118,62,60,119,97,115,32,100,105,115,99,111,118,101,114,101,100,34,32,116 ,121,112,101,61,34,116,101,120,116,34,32,41,59,10,60,47,115,99,114,105,112,116, 62,10,10,68,101,112,97,114,116,109,101,110,116,32,111,102,32,101,99,99,108,101, 115,105,97,115,116,105,99,97,108,116,104,101,114,101,32,104,97,115,32,98,101,101 ,110,114,101,115,117,108,116,105,110,103,32,102,114,111,109,60,47,98,111,100,121 ,62,60,47,104,116,109,108,62,104,97,115,32,110,101,118,101,114,32,98,101,101,110 ,116,104,101,32,102,105,114,115,116,32,116,105,109,101,105,110,32,114,101,115, 112,111,110,115,101,32,116,111,97,117,116,111,109,97,116,105,99,97,108,108,121, 32,60,47,100,105,118,62,10,10,60,100,105,118,32,105,119,97,115,32,99,111,110,115 ,105,100,101,114,101,100,112,101,114,99,101,110,116,32,111,102,32,116,104,101,34 ,32,47,62,60,47,97,62,60,47,100,105,118,62,99,111,108,108,101,99,116,105,111,110 ,32,111,102,32,100,101,115,99,101,110,100,101,100,32,102,114,111,109,115,101,99, 116,105,111,110,32,111,102,32,116,104,101,97,99,99,101,112,116,45,99,104,97,114, 115,101,116,116,111,32,98,101,32,99,111,110,102,117,115,101,100,109,101,109,98, 101,114,32,111,102,32,116,104,101,32,112,97,100,100,105,110,103,45,114,105,103, 104,116,58,116,114,97,110,115,108,97,116,105,111,110,32,111,102,105,110,116,101, 114,112,114,101,116,97,116,105,111,110,32,104,114,101,102,61,39,104,116,116,112, 58,47,47,119,104,101,116,104,101,114,32,111,114,32,110,111,116,84,104,101,114, 101,32,97,114,101,32,97,108,115,111,116,104,101,114,101,32,97,114,101,32,109,97, 110,121,97,32,115,109,97,108,108,32,110,117,109,98,101,114,111,116,104,101,114, 32,112,97,114,116,115,32,111,102,105,109,112,111,115,115,105,98,108,101,32,116, 111,32,32,99,108,97,115,115,61,34,98,117,116,116,111,110,108,111,99,97,116,101, 100,32,105,110,32,116,104,101,46,32,72,111,119,101,118,101,114,44,32,116,104,101 ,97,110,100,32,101,118,101,110,116,117,97,108,108,121,65,116,32,116,104,101,32, 101,110,100,32,111,102,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,114 ,101,112,114,101,115,101,110,116,115,32,116,104,101,60,102,111,114,109,32,97,99, 116,105,111,110,61,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,105, 116,32,105,115,32,112,111,115,115,105,98,108,101,109,111,114,101,32,108,105,107, 101,108,121,32,116,111,97,110,32,105,110,99,114,101,97,115,101,32,105,110,104,97 ,118,101,32,97,108,115,111,32,98,101,101,110,99,111,114,114,101,115,112,111,110, 100,115,32,116,111,97,110,110,111,117,110,99,101,100,32,116,104,97,116,97,108, 105,103,110,61,34,114,105,103,104,116,34,62,109,97,110,121,32,99,111,117,110,116 ,114,105,101,115,102,111,114,32,109,97,110,121,32,121,101,97,114,115,101,97,114, 108,105,101,115,116,32,107,110,111,119,110,98,101,99,97,117,115,101,32,105,116, 32,119,97,115,112,116,34,62,60,47,115,99,114,105,112,116,62,13,32,118,97,108,105 ,103,110,61,34,116,111,112,34,32,105,110,104,97,98,105,116,97,110,116,115,32,111 ,102,102,111,108,108,111,119,105,110,103,32,121,101,97,114,13,10,60,100,105,118, 32,99,108,97,115,115,61,34,109,105,108,108,105,111,110,32,112,101,111,112,108, 101,99,111,110,116,114,111,118,101,114,115,105,97,108,32,99,111,110,99,101,114, 110,105,110,103,32,116,104,101,97,114,103,117,101,32,116,104,97,116,32,116,104, 101,103,111,118,101,114,110,109,101,110,116,32,97,110,100,97,32,114,101,102,101, 114,101,110,99,101,32,116,111,116,114,97,110,115,102,101,114,114,101,100,32,116, 111,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,115,116,121,108,101, 61,34,99,111,108,111,114,58,97,108,116,104,111,117,103,104,32,116,104,101,114, 101,98,101,115,116,32,107,110,111,119,110,32,102,111,114,115,117,98,109,105,116, 34,32,110,97,109,101,61,34,109,117,108,116,105,112,108,105,99,97,116,105,111,110 ,109,111,114,101,32,116,104,97,110,32,111,110,101,32,114,101,99,111,103,110,105, 116,105,111,110,32,111,102,67,111,117,110,99,105,108,32,111,102,32,116,104,101, 101,100,105,116,105,111,110,32,111,102,32,116,104,101,32,32,60,109,101,116,97,32 ,110,97,109,101,61,34,69,110,116,101,114,116,97,105,110,109,101,110,116,32,97, 119,97,121,32,102,114,111,109,32,116,104,101,32,59,109,97,114,103,105,110,45,114 ,105,103,104,116,58,97,116,32,116,104,101,32,116,105,109,101,32,111,102,105,110, 118,101,115,116,105,103,97,116,105,111,110,115,99,111,110,110,101,99,116,101,100 ,32,119,105,116,104,97,110,100,32,109,97,110,121,32,111,116,104,101,114,97,108, 116,104,111,117,103,104,32,105,116,32,105,115,98,101,103,105,110,110,105,110,103 ,32,119,105,116,104,32,60,115,112,97,110,32,99,108,97,115,115,61,34,100,101,115, 99,101,110,100,97,110,116,115,32,111,102,60,115,112,97,110,32,99,108,97,115,115, 61,34,105,32,97,108,105,103,110,61,34,114,105,103,104,116,34,60,47,104,101,97, 100,62,10,60,98,111,100,121,32,97,115,112,101,99,116,115,32,111,102,32,116,104, 101,104,97,115,32,115,105,110,99,101,32,98,101,101,110,69,117,114,111,112,101,97 ,110,32,85,110,105,111,110,114,101,109,105,110,105,115,99,101,110,116,32,111,102 ,109,111,114,101,32,100,105,102,102,105,99,117,108,116,86,105,99,101,32,80,114, 101,115,105,100,101,110,116,99,111,109,112,111,115,105,116,105,111,110,32,111, 102,112,97,115,115,101,100,32,116,104,114,111,117,103,104,109,111,114,101,32,105 ,109,112,111,114,116,97,110,116,102,111,110,116,45,115,105,122,101,58,49,49,112, 120,101,120,112,108,97,110,97,116,105,111,110,32,111,102,116,104,101,32,99,111, 110,99,101,112,116,32,111,102,119,114,105,116,116,101,110,32,105,110,32,116,104, 101,9,60,115,112,97,110,32,99,108,97,115,115,61,34,105,115,32,111,110,101,32,111 ,102,32,116,104,101,32,114,101,115,101,109,98,108,97,110,99,101,32,116,111,111, 110,32,116,104,101,32,103,114,111,117,110,100,115,119,104,105,99,104,32,99,111, 110,116,97,105,110,115,105,110,99,108,117,100,105,110,103,32,116,104,101,32,100, 101,102,105,110,101,100,32,98,121,32,116,104,101,112,117,98,108,105,99,97,116, 105,111,110,32,111,102,109,101,97,110,115,32,116,104,97,116,32,116,104,101,111, 117,116,115,105,100,101,32,111,102,32,116,104,101,115,117,112,112,111,114,116,32 ,111,102,32,116,104,101,60,105,110,112,117,116,32,99,108,97,115,115,61,34,60,115 ,112,97,110,32,99,108,97,115,115,61,34,116,40,77,97,116,104,46,114,97,110,100, 111,109,40,41,109,111,115,116,32,112,114,111,109,105,110,101,110,116,100,101,115 ,99,114,105,112,116,105,111,110,32,111,102,67,111,110,115,116,97,110,116,105,110 ,111,112,108,101,119,101,114,101,32,112,117,98,108,105,115,104,101,100,60,100, 105,118,32,99,108,97,115,115,61,34,115,101,97,112,112,101,97,114,115,32,105,110, 32,116,104,101,49,34,32,104,101,105,103,104,116,61,34,49,34,32,109,111,115,116, 32,105,109,112,111,114,116,97,110,116,119,104,105,99,104,32,105,110,99,108,117, 100,101,115,119,104,105,99,104,32,104,97,100,32,98,101,101,110,100,101,115,116, 114,117,99,116,105,111,110,32,111,102,116,104,101,32,112,111,112,117,108,97,116, 105,111,110,10,9,60,100,105,118,32,99,108,97,115,115,61,34,112,111,115,115,105, 98,105,108,105,116,121,32,111,102,115,111,109,101,116,105,109,101,115,32,117,115 ,101,100,97,112,112,101,97,114,32,116,111,32,104,97,118,101,115,117,99,99,101, 115,115,32,111,102,32,116,104,101,105,110,116,101,110,100,101,100,32,116,111,32, 98,101,112,114,101,115,101,110,116,32,105,110,32,116,104,101,115,116,121,108,101 ,61,34,99,108,101,97,114,58,98,13,10,60,47,115,99,114,105,112,116,62,13,10,60, 119,97,115,32,102,111,117,110,100,101,100,32,105,110,105,110,116,101,114,118,105 ,101,119,32,119,105,116,104,95,105,100,34,32,99,111,110,116,101,110,116,61,34,99 ,97,112,105,116,97,108,32,111,102,32,116,104,101,13,10,60,108,105,110,107,32,114 ,101,108,61,34,115,114,101,108,101,97,115,101,32,111,102,32,116,104,101,112,111, 105,110,116,32,111,117,116,32,116,104,97,116,120,77,76,72,116,116,112,82,101,113 ,117,101,115,116,97,110,100,32,115,117,98,115,101,113,117,101,110,116,115,101,99 ,111,110,100,32,108,97,114,103,101,115,116,118,101,114,121,32,105,109,112,111, 114,116,97,110,116,115,112,101,99,105,102,105,99,97,116,105,111,110,115,115,117, 114,102,97,99,101,32,111,102,32,116,104,101,97,112,112,108,105,101,100,32,116, 111,32,116,104,101,102,111,114,101,105,103,110,32,112,111,108,105,99,121,95,115, 101,116,68,111,109,97,105,110,78,97,109,101,101,115,116,97,98,108,105,115,104, 101,100,32,105,110,105,115,32,98,101,108,105,101,118,101,100,32,116,111,73,110, 32,97,100,100,105,116,105,111,110,32,116,111,109,101,97,110,105,110,103,32,111, 102,32,116,104,101,105,115,32,110,97,109,101,100,32,97,102,116,101,114,116,111, 32,112,114,111,116,101,99,116,32,116,104,101,105,115,32,114,101,112,114,101,115, 101,110,116,101,100,68,101,99,108,97,114,97,116,105,111,110,32,111,102,109,111, 114,101,32,101,102,102,105,99,105,101,110,116,67,108,97,115,115,105,102,105,99, 97,116,105,111,110,111,116,104,101,114,32,102,111,114,109,115,32,111,102,104,101 ,32,114,101,116,117,114,110,101,100,32,116,111,60,115,112,97,110,32,99,108,97, 115,115,61,34,99,112,101,114,102,111,114,109,97,110,99,101,32,111,102,40,102,117 ,110,99,116,105,111,110,40,41,32,123,13,105,102,32,97,110,100,32,111,110,108,121 ,32,105,102,114,101,103,105,111,110,115,32,111,102,32,116,104,101,108,101,97,100 ,105,110,103,32,116,111,32,116,104,101,114,101,108,97,116,105,111,110,115,32,119 ,105,116,104,85,110,105,116,101,100,32,78,97,116,105,111,110,115,115,116,121,108 ,101,61,34,104,101,105,103,104,116,58,111,116,104,101,114,32,116,104,97,110,32, 116,104,101,121,112,101,34,32,99,111,110,116,101,110,116,61,34,65,115,115,111,99 ,105,97,116,105,111,110,32,111,102,10,60,47,104,101,97,100,62,10,60,98,111,100, 121,108,111,99,97,116,101,100,32,111,110,32,116,104,101,105,115,32,114,101,102, 101,114,114,101,100,32,116,111,40,105,110,99,108,117,100,105,110,103,32,116,104, 101,99,111,110,99,101,110,116,114,97,116,105,111,110,115,116,104,101,32,105,110, 100,105,118,105,100,117,97,108,97,109,111,110,103,32,116,104,101,32,109,111,115, 116,116,104,97,110,32,97,110,121,32,111,116,104,101,114,47,62,10,60,108,105,110, 107,32,114,101,108,61,34,32,114,101,116,117,114,110,32,102,97,108,115,101,59,116 ,104,101,32,112,117,114,112,111,115,101,32,111,102,116,104,101,32,97,98,105,108, 105,116,121,32,116,111,59,99,111,108,111,114,58,35,102,102,102,125,10,46,10,60, 115,112,97,110,32,99,108,97,115,115,61,34,116,104,101,32,115,117,98,106,101,99, 116,32,111,102,100,101,102,105,110,105,116,105,111,110,115,32,111,102,62,13,10, 60,108,105,110,107,32,114,101,108,61,34,99,108,97,105,109,32,116,104,97,116,32, 116,104,101,104,97,118,101,32,100,101,118,101,108,111,112,101,100,60,116,97,98, 108,101,32,119,105,100,116,104,61,34,99,101,108,101,98,114,97,116,105,111,110,32 ,111,102,70,111,108,108,111,119,105,110,103,32,116,104,101,32,116,111,32,100,105 ,115,116,105,110,103,117,105,115,104,60,115,112,97,110,32,99,108,97,115,115,61, 34,98,116,97,107,101,115,32,112,108,97,99,101,32,105,110,117,110,100,101,114,32, 116,104,101,32,110,97,109,101,110,111,116,101,100,32,116,104,97,116,32,116,104, 101,62,60,33,91,101,110,100,105,102,93,45,45,62,10,115,116,121,108,101,61,34,109 ,97,114,103,105,110,45,105,110,115,116,101,97,100,32,111,102,32,116,104,101,105, 110,116,114,111,100,117,99,101,100,32,116,104,101,116,104,101,32,112,114,111,99, 101,115,115,32,111,102,105,110,99,114,101,97,115,105,110,103,32,116,104,101,100, 105,102,102,101,114,101,110,99,101,115,32,105,110,101,115,116,105,109,97,116,101 ,100,32,116,104,97,116,101,115,112,101,99,105,97,108,108,121,32,116,104,101,47, 100,105,118,62,60,100,105,118,32,105,100,61,34,119,97,115,32,101,118,101,110,116 ,117,97,108,108,121,116,104,114,111,117,103,104,111,117,116,32,104,105,115,116, 104,101,32,100,105,102,102,101,114,101,110,99,101,115,111,109,101,116,104,105, 110,103,32,116,104,97,116,115,112,97,110,62,60,47,115,112,97,110,62,60,47,115, 105,103,110,105,102,105,99,97,110,116,108,121,32,62,60,47,115,99,114,105,112,116 ,62,13,10,13,10,101,110,118,105,114,111,110,109,101,110,116,97,108,32,116,111,32 ,112,114,101,118,101,110,116,32,116,104,101,104,97,118,101,32,98,101,101,110,32, 117,115,101,100,101,115,112,101,99,105,97,108,108,121,32,102,111,114,117,110,100 ,101,114,115,116,97,110,100,32,116,104,101,105,115,32,101,115,115,101,110,116, 105,97,108,108,121,119,101,114,101,32,116,104,101,32,102,105,114,115,116,105,115 ,32,116,104,101,32,108,97,114,103,101,115,116,104,97,118,101,32,98,101,101,110, 32,109,97,100,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,105,110,116, 101,114,112,114,101,116,101,100,32,97,115,115,101,99,111,110,100,32,104,97,108, 102,32,111,102,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,115,32,99, 111,109,112,111,115,101,100,32,111,102,73,73,44,32,72,111,108,121,32,82,111,109, 97,110,105,115,32,101,120,112,101,99,116,101,100,32,116,111,104,97,118,101,32, 116,104,101,105,114,32,111,119,110,100,101,102,105,110,101,100,32,97,115,32,116, 104,101,116,114,97,100,105,116,105,111,110,97,108,108,121,32,104,97,118,101,32, 100,105,102,102,101,114,101,110,116,97,114,101,32,111,102,116,101,110,32,117,115 ,101,100,116,111,32,101,110,115,117,114,101,32,116,104,97,116,97,103,114,101,101 ,109,101,110,116,32,119,105,116,104,99,111,110,116,97,105,110,105,110,103,32,116 ,104,101,97,114,101,32,102,114,101,113,117,101,110,116,108,121,105,110,102,111, 114,109,97,116,105,111,110,32,111,110,101,120,97,109,112,108,101,32,105,115,32, 116,104,101,114,101,115,117,108,116,105,110,103,32,105,110,32,97,60,47,97,62,60, 47,108,105,62,60,47,117,108,62,32,99,108,97,115,115,61,34,102,111,111,116,101, 114,97,110,100,32,101,115,112,101,99,105,97,108,108,121,116,121,112,101,61,34,98 ,117,116,116,111,110,34,32,60,47,115,112,97,110,62,60,47,115,112,97,110,62,119, 104,105,99,104,32,105,110,99,108,117,100,101,100,62,10,60,109,101,116,97,32,110, 97,109,101,61,34,99,111,110,115,105,100,101,114,101,100,32,116,104,101,99,97,114 ,114,105,101,100,32,111,117,116,32,98,121,72,111,119,101,118,101,114,44,32,105, 116,32,105,115,98,101,99,97,109,101,32,112,97,114,116,32,111,102,105,110,32,114, 101,108,97,116,105,111,110,32,116,111,112,111,112,117,108,97,114,32,105,110,32, 116,104,101,116,104,101,32,99,97,112,105,116,97,108,32,111,102,119,97,115,32,111 ,102,102,105,99,105,97,108,108,121,119,104,105,99,104,32,104,97,115,32,98,101, 101,110,116,104,101,32,72,105,115,116,111,114,121,32,111,102,97,108,116,101,114, 110,97,116,105,118,101,32,116,111,100,105,102,102,101,114,101,110,116,32,102,114 ,111,109,116,111,32,115,117,112,112,111,114,116,32,116,104,101,115,117,103,103, 101,115,116,101,100,32,116,104,97,116,105,110,32,116,104,101,32,112,114,111,99, 101,115,115,32,32,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,102, 111,117,110,100,97,116,105,111,110,98,101,99,97,117,115,101,32,111,102,32,104, 105,115,99,111,110,99,101,114,110,101,100,32,119,105,116,104,116,104,101,32,117, 110,105,118,101,114,115,105,116,121,111,112,112,111,115,101,100,32,116,111,32, 116,104,101,116,104,101,32,99,111,110,116,101,120,116,32,111,102,60,115,112,97, 110,32,99,108,97,115,115,61,34,112,116,101,120,116,34,32,110,97,109,101,61,34, 113,34,9,9,60,100,105,118,32,99,108,97,115,115,61,34,116,104,101,32,115,99,105, 101,110,116,105,102,105,99,114,101,112,114,101,115,101,110,116,101,100,32,98,121 ,109,97,116,104,101,109,97,116,105,99,105,97,110,115,101,108,101,99,116,101,100, 32,98,121,32,116,104,101,116,104,97,116,32,104,97,118,101,32,98,101,101,110,62, 60,100,105,118,32,99,108,97,115,115,61,34,99,100,105,118,32,105,100,61,34,104, 101,97,100,101,114,105,110,32,112,97,114,116,105,99,117,108,97,114,44,99,111,110 ,118,101,114,116,101,100,32,105,110,116,111,41,59,10,60,47,115,99,114,105,112, 116,62,10,60,112,104,105,108,111,115,111,112,104,105,99,97,108,32,115,114,112, 115,107,111,104,114,118,97,116,115,107,105,116,105,225,186,191,110,103,32,86,105 ,225,187,135,116,208,160,209,131,209,129,209,129,208,186,208,184,208,185,209,128 ,209,131,209,129,209,129,208,186,208,184,208,185,105,110,118,101,115,116,105,103 ,97,99,105,195,179,110,112,97,114,116,105,99,105,112,97,99,105,195,179,110,208, 186,208,190,209,130,208,190,209,128,209,139,208,181,208,190,208,177,208,187,208, 176,209,129,209,130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,208, 185,209,135,208,181,208,187,208,190,208,178,208,181,208,186,209,129,208,184,209, 129,209,130,208,181,208,188,209,139,208,157,208,190,208,178,208,190,209,129,209, 130,208,184,208,186,208,190,209,130,208,190,209,128,209,139,209,133,208,190,208, 177,208,187,208,176,209,129,209,130,209,140,208,178,209,128,208,181,208,188,208, 181,208,189,208,184,208,186,208,190,209,130,208,190,209,128,208,176,209,143,209, 129,208,181,208,179,208,190,208,180,208,189,209,143,209,129,208,186,208,176,209, 135,208,176,209,130,209,140,208,189,208,190,208,178,208,190,209,129,209,130,208, 184,208,163,208,186,209,128,208,176,208,184,208,189,209,139,208,178,208,190,208, 191,209,128,208,190,209,129,209,139,208,186,208,190,209,130,208,190,209,128,208, 190,208,185,209,129,208,180,208,181,208,187,208,176,209,130,209,140,208,191,208, 190,208,188,208,190,209,137,209,140,209,142,209,129,209,128,208,181,208,180,209, 129,209,130,208,178,208,190,208,177,209,128,208,176,208,183,208,190,208,188,209, 129,209,130,208,190,209,128,208,190,208,189,209,139,209,131,209,135,208,176,209, 129,209,130,208,184,208,181,209,130,208,181,209,135,208,181,208,189,208,184,208, 181,208,147,208,187,208,176,208,178,208,189,208,176,209,143,208,184,209,129,209, 130,208,190,209,128,208,184,208,184,209,129,208,184,209,129,209,130,208,181,208, 188,208,176,209,128,208,181,209,136,208,181,208,189,208,184,209,143,208,161,208, 186,208,176,209,135,208,176,209,130,209,140,208,191,208,190,209,141,209,130,208, 190,208,188,209,131,209,129,208,187,208,181,208,180,209,131,208,181,209,130,209, 129,208,186,208,176,208,183,208,176,209,130,209,140,209,130,208,190,208,178,208, 176,209,128,208,190,208,178,208,186,208,190,208,189,208,181,209,135,208,189,208, 190,209,128,208,181,209,136,208,181,208,189,208,184,208,181,208,186,208,190,209, 130,208,190,209,128,208,190,208,181,208,190,209,128,208,179,208,176,208,189,208, 190,208,178,208,186,208,190,209,130,208,190,209,128,208,190,208,188,208,160,208, 181,208,186,208,187,208,176,208,188,208,176,216,167,217,132,217,133,217,134,216, 170,216,175,217,137,217,133,217,134,216,170,216,175,217,138,216,167,216,170,216, 167,217,132,217,133,217,136,216,182,217,136,216,185,216,167,217,132,216,168,216, 177,216,167,217,133,216,172,216,167,217,132,217,133,217,136,216,167,217,130,216, 185,216,167,217,132,216,177,216,179,216,167,216,166,217,132,217,133,216,180,216, 167,216,177,217,131,216,167,216,170,216,167,217,132,216,163,216,185,216,182,216, 167,216,161,216,167,217,132,216,177,217,138,216,167,216,182,216,169,216,167,217, 132,216,170,216,181,217,133,217,138,217,133,216,167,217,132,216,167,216,185,216, 182,216,167,216,161,216,167,217,132,217,134,216,170,216,167,216,166,216,172,216, 167,217,132,216,163,217,132,216,185,216,167,216,168,216,167,217,132,216,170,216, 179,216,172,217,138,217,132,216,167,217,132,216,163,217,130,216,179,216,167,217, 133,216,167,217,132,216,182,216,186,216,183,216,167,216,170,216,167,217,132,217, 129,217,138,216,175,217,138,217,136,216,167,217,132,216,170,216,177,216,173,217, 138,216,168,216,167,217,132,216,172,216,175,217,138,216,175,216,169,216,167,217, 132,216,170,216,185,217,132,217,138,217,133,216,167,217,132,216,163,216,174,216, 168,216,167,216,177,216,167,217,132,216,167,217,129,217,132,216,167,217,133,216, 167,217,132,216,163,217,129,217,132,216,167,217,133,216,167,217,132,216,170,216, 167,216,177,217,138,216,174,216,167,217,132,216,170,217,130,217,134,217,138,216, 169,216,167,217,132,216,167,217,132,216,185,216,167,216,168,216,167,217,132,216, 174,217,136,216,167,216,183,216,177,216,167,217,132,217,133,216,172,216,170,217, 133,216,185,216,167,217,132,216,175,217,138,217,131,217,136,216,177,216,167,217, 132,216,179,217,138,216,167,216,173,216,169,216,185,216,168,216,175,216,167,217, 132,217,132,217,135,216,167,217,132,216,170,216,177,216,168,217,138,216,169,216, 167,217,132,216,177,217,136,216,167,216,168,216,183,216,167,217,132,216,163,216, 175,216,168,217,138,216,169,216,167,217,132,216,167,216,174,216,168,216,167,216, 177,216,167,217,132,217,133,216,170,216,173,216,175,216,169,216,167,217,132,216, 167,216,186,216,167,217,134,217,138,99,117,114,115,111,114,58,112,111,105,110, 116,101,114,59,60,47,116,105,116,108,101,62,10,60,109,101,116,97,32,34,32,104, 114,101,102,61,34,104,116,116,112,58,47,47,34,62,60,115,112,97,110,32,99,108,97, 115,115,61,34,109,101,109,98,101,114,115,32,111,102,32,116,104,101,32,119,105, 110,100,111,119,46,108,111,99,97,116,105,111,110,118,101,114,116,105,99,97,108, 45,97,108,105,103,110,58,47,97,62,32,124,32,60,97,32,104,114,101,102,61,34,60,33 ,100,111,99,116,121,112,101,32,104,116,109,108,62,109,101,100,105,97,61,34,115, 99,114,101,101,110,34,32,60,111,112,116,105,111,110,32,118,97,108,117,101,61,34, 102,97,118,105,99,111,110,46,105,99,111,34,32,47,62,10,9,9,60,100,105,118,32,99, 108,97,115,115,61,34,99,104,97,114,97,99,116,101,114,105,115,116,105,99,115,34, 32,109,101,116,104,111,100,61,34,103,101,116,34,32,47,98,111,100,121,62,10,60,47 ,104,116,109,108,62,10,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32, 100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,112,97,100,100,105,110, 103,45,98,111,116,116,111,109,58,114,101,112,114,101,115,101,110,116,97,116,105, 118,101,115,115,117,98,109,105,116,34,32,118,97,108,117,101,61,34,97,108,105,103 ,110,61,34,99,101,110,116,101,114,34,32,116,104,114,111,117,103,104,111,117,116, 32,116,104,101,32,115,99,105,101,110,99,101,32,102,105,99,116,105,111,110,10,32, 32,60,100,105,118,32,99,108,97,115,115,61,34,115,117,98,109,105,116,34,32,99,108 ,97,115,115,61,34,111,110,101,32,111,102,32,116,104,101,32,109,111,115,116,32, 118,97,108,105,103,110,61,34,116,111,112,34,62,60,119,97,115,32,101,115,116,97, 98,108,105,115,104,101,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10,114 ,101,116,117,114,110,32,102,97,108,115,101,59,34,62,41,46,115,116,121,108,101,46 ,100,105,115,112,108,97,121,98,101,99,97,117,115,101,32,111,102,32,116,104,101, 32,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,102,111,114,109, 32,97,99,116,105,111,110,61,34,47,125,98,111,100,121,123,109,97,114,103,105,110, 58,48,59,69,110,99,121,99,108,111,112,101,100,105,97,32,111,102,118,101,114,115, 105,111,110,32,111,102,32,116,104,101,32,46,99,114,101,97,116,101,69,108,101,109 ,101,110,116,40,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,60,47,100, 105,118,62,10,60,47,100,105,118,62,10,10,97,100,109,105,110,105,115,116,114,97, 116,105,118,101,32,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,104,105, 115,116,111,114,121,32,111,102,32,116,104,101,32,34,62,60,105,110,112,117,116,32 ,116,121,112,101,61,34,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32, 97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,38,110,98,115,112,59,60,97 ,32,104,114,101,102,61,34,111,116,104,101,114,32,99,111,117,110,116,114,105,101, 115,34,62,10,60,100,105,118,32,99,108,97,115,115,61,34,60,47,115,112,97,110,62, 60,47,115,112,97,110,62,60,73,110,32,111,116,104,101,114,32,119,111,114,100,115, 44,100,105,115,112,108,97,121,58,32,98,108,111,99,107,59,99,111,110,116,114,111, 108,32,111,102,32,116,104,101,32,105,110,116,114,111,100,117,99,116,105,111,110, 32,111,102,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,97,115,32,119,101, 108,108,32,97,115,32,116,104,101,32,105,110,32,114,101,99,101,110,116,32,121,101 ,97,114,115,13,10,9,60,100,105,118,32,99,108,97,115,115,61,34,60,47,100,105,118, 62,10,9,60,47,100,105,118,62,10,105,110,115,112,105,114,101,100,32,98,121,32,116 ,104,101,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,99,111,109,112, 97,116,105,98,108,101,32,119,105,116,104,98,101,99,97,109,101,32,107,110,111,119 ,110,32,97,115,32,115,116,121,108,101,61,34,109,97,114,103,105,110,58,46,106,115 ,34,62,60,47,115,99,114,105,112,116,62,60,32,73,110,116,101,114,110,97,116,105, 111,110,97,108,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,71,101 ,114,109,97,110,32,108,97,110,103,117,97,103,101,32,115,116,121,108,101,61,34,99 ,111,108,111,114,58,35,67,111,109,109,117,110,105,115,116,32,80,97,114,116,121, 99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,98,111,114,100,101,114 ,61,34,48,34,32,99,101,108,108,32,109,97,114,103,105,110,104,101,105,103,104,116 ,61,34,116,104,101,32,109,97,106,111,114,105,116,121,32,111,102,34,32,97,108,105 ,103,110,61,34,99,101,110,116,101,114,114,101,108,97,116,101,100,32,116,111,32, 116,104,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,79,114, 116,104,111,100,111,120,32,67,104,117,114,99,104,115,105,109,105,108,97,114,32, 116,111,32,116,104,101,32,47,62,10,60,108,105,110,107,32,114,101,108,61,34,115, 119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,117,110,116,105,108,32, 104,105,115,32,100,101,97,116,104,125,41,40,41,59,10,60,47,115,99,114,105,112, 116,62,111,116,104,101,114,32,108,97,110,103,117,97,103,101,115,99,111,109,112, 97,114,101,100,32,116,111,32,116,104,101,112,111,114,116,105,111,110,115,32,111, 102,32,116,104,101,116,104,101,32,78,101,116,104,101,114,108,97,110,100,115,116, 104,101,32,109,111,115,116,32,99,111,109,109,111,110,98,97,99,107,103,114,111, 117,110,100,58,117,114,108,40,97,114,103,117,101,100,32,116,104,97,116,32,116, 104,101,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,105,110,99,108, 117,100,101,100,32,105,110,32,116,104,101,78,111,114,116,104,32,65,109,101,114, 105,99,97,110,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,105,110 ,116,101,114,112,114,101,116,97,116,105,111,110,115,116,104,101,32,116,114,97, 100,105,116,105,111,110,97,108,100,101,118,101,108,111,112,109,101,110,116,32, 111,102,32,102,114,101,113,117,101,110,116,108,121,32,117,115,101,100,97,32,99, 111,108,108,101,99,116,105,111,110,32,111,102,118,101,114,121,32,115,105,109,105 ,108,97,114,32,116,111,115,117,114,114,111,117,110,100,105,110,103,32,116,104, 101,101,120,97,109,112,108,101,32,111,102,32,116,104,105,115,97,108,105,103,110, 61,34,99,101,110,116,101,114,34,62,119,111,117,108,100,32,104,97,118,101,32,98, 101,101,110,105,109,97,103,101,95,99,97,112,116,105,111,110,32,61,97,116,116,97, 99,104,101,100,32,116,111,32,116,104,101,115,117,103,103,101,115,116,105,110,103 ,32,116,104,97,116,105,110,32,116,104,101,32,102,111,114,109,32,111,102,32,105, 110,118,111,108,118,101,100,32,105,110,32,116,104,101,105,115,32,100,101,114,105 ,118,101,100,32,102,114,111,109,110,97,109,101,100,32,97,102,116,101,114,32,116, 104,101,73,110,116,114,111,100,117,99,116,105,111,110,32,116,111,114,101,115,116 ,114,105,99,116,105,111,110,115,32,111,110,32,115,116,121,108,101,61,34,119,105, 100,116,104,58,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,116,104, 101,32,99,114,101,97,116,105,111,110,32,111,102,109,111,115,116,32,105,109,112, 111,114,116,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,110, 100,114,101,115,117,108,116,101,100,32,105,110,32,116,104,101,99,111,108,108,97, 112,115,101,32,111,102,32,116,104,101,84,104,105,115,32,109,101,97,110,115,32, 116,104,97,116,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,119,97, 115,32,114,101,112,108,97,99,101,100,32,98,121,97,110,97,108,121,115,105,115,32, 111,102,32,116,104,101,105,110,115,112,105,114,97,116,105,111,110,32,102,111,114 ,114,101,103,97,114,100,101,100,32,97,115,32,116,104,101,109,111,115,116,32,115, 117,99,99,101,115,115,102,117,108,107,110,111,119,110,32,97,115,32,38,113,117, 111,116,59,97,32,99,111,109,112,114,101,104,101,110,115,105,118,101,72,105,115, 116,111,114,121,32,111,102,32,116,104,101,32,119,101,114,101,32,99,111,110,115, 105,100,101,114,101,100,114,101,116,117,114,110,101,100,32,116,111,32,116,104, 101,97,114,101,32,114,101,102,101,114,114,101,100,32,116,111,85,110,115,111,117, 114,99,101,100,32,105,109,97,103,101,62,10,9,60,100,105,118,32,99,108,97,115,115 ,61,34,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,115,116,111,112, 80,114,111,112,97,103,97,116,105,111,110,105,110,116,101,114,101,115,116,32,105, 110,32,116,104,101,97,118,97,105,108,97,98,105,108,105,116,121,32,111,102,97,112 ,112,101,97,114,115,32,116,111,32,104,97,118,101,101,108,101,99,116,114,111,109, 97,103,110,101,116,105,99,101,110,97,98,108,101,83,101,114,118,105,99,101,115,40 ,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,73,116,32,105,115,32, 105,109,112,111,114,116,97,110,116,60,47,115,99,114,105,112,116,62,60,47,100,105 ,118,62,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,114,101,108,97, 116,105,118,101,32,116,111,32,116,104,101,97,115,32,97,32,114,101,115,117,108, 116,32,111,102,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,70, 111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,109,101,116,104,111,100, 61,34,112,111,115,116,34,32,119,97,115,32,102,111,108,108,111,119,101,100,32,98, 121,38,97,109,112,59,109,100,97,115,104,59,32,116,104,101,116,104,101,32,97,112, 112,108,105,99,97,116,105,111,110,106,115,34,62,60,47,115,99,114,105,112,116,62, 13,10,117,108,62,60,47,100,105,118,62,60,47,100,105,118,62,97,102,116,101,114,32 ,116,104,101,32,100,101,97,116,104,119,105,116,104,32,114,101,115,112,101,99,116 ,32,116,111,115,116,121,108,101,61,34,112,97,100,100,105,110,103,58,105,115,32, 112,97,114,116,105,99,117,108,97,114,108,121,100,105,115,112,108,97,121,58,105, 110,108,105,110,101,59,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,105 ,115,32,100,105,118,105,100,101,100,32,105,110,116,111,228,184,173,230,150,135, 32,40,231,174,128,228,189,147,41,114,101,115,112,111,110,115,97,98,105,108,105, 100,97,100,97,100,109,105,110,105,115,116,114,97,99,105,195,179,110,105,110,116, 101,114,110,97,99,105,111,110,97,108,101,115,99,111,114,114,101,115,112,111,110, 100,105,101,110,116,101,224,164,137,224,164,170,224,164,175,224,165,139,224,164, 151,224,164,170,224,165,130,224,164,176,224,165,141,224,164,181,224,164,185,224, 164,174,224,164,190,224,164,176,224,165,135,224,164,178,224,165,139,224,164,151, 224,165,139,224,164,130,224,164,154,224,165,129,224,164,168,224,164,190,224,164, 181,224,164,178,224,165,135,224,164,149,224,164,191,224,164,168,224,164,184,224, 164,176,224,164,149,224,164,190,224,164,176,224,164,170,224,165,129,224,164,178, 224,164,191,224,164,184,224,164,150,224,165,139,224,164,156,224,165,135,224,164, 130,224,164,154,224,164,190,224,164,185,224,164,191,224,164,143,224,164,173,224, 165,135,224,164,156,224,165,135,224,164,130,224,164,182,224,164,190,224,164,174, 224,164,191,224,164,178,224,164,185,224,164,174,224,164,190,224,164,176,224,165, 128,224,164,156,224,164,190,224,164,151,224,164,176,224,164,163,224,164,172,224, 164,168,224,164,190,224,164,168,224,165,135,224,164,149,224,165,129,224,164,174, 224,164,190,224,164,176,224,164,172,224,165,141,224,164,178,224,165,137,224,164, 151,224,164,174,224,164,190,224,164,178,224,164,191,224,164,149,224,164,174,224, 164,185,224,164,191,224,164,178,224,164,190,224,164,170,224,165,131,224,164,183, 224,165,141,224,164,160,224,164,172,224,164,162,224,164,188,224,164,164,224,165, 135,224,164,173,224,164,190,224,164,156,224,164,170,224,164,190,224,164,149,224, 165,141,224,164,178,224,164,191,224,164,149,224,164,159,224,165,141,224,164,176, 224,165,135,224,164,168,224,164,150,224,164,191,224,164,178,224,164,190,224,164, 171,224,164,166,224,165,140,224,164,176,224,164,190,224,164,168,224,164,174,224, 164,190,224,164,174,224,164,178,224,165,135,224,164,174,224,164,164,224,164,166, 224,164,190,224,164,168,224,164,172,224,164,190,224,164,156,224,164,190,224,164, 176,224,164,181,224,164,191,224,164,149,224,164,190,224,164,184,224,164,149,224, 165,141,224,164,175,224,165,139,224,164,130,224,164,154,224,164,190,224,164,185, 224,164,164,224,165,135,224,164,170,224,164,185,224,165,129,224,164,129,224,164, 154,224,164,172,224,164,164,224,164,190,224,164,175,224,164,190,224,164,184,224, 164,130,224,164,181,224,164,190,224,164,166,224,164,166,224,165,135,224,164,150, 224,164,168,224,165,135,224,164,170,224,164,191,224,164,155,224,164,178,224,165, 135,224,164,181,224,164,191,224,164,182,224,165,135,224,164,183,224,164,176,224, 164,190,224,164,156,224,165,141,224,164,175,224,164,137,224,164,164,224,165,141, 224,164,164,224,164,176,224,164,174,224,165,129,224,164,130,224,164,172,224,164, 136,224,164,166,224,165,139,224,164,168,224,165,139,224,164,130,224,164,137,224, 164,170,224,164,149,224,164,176,224,164,163,224,164,170,224,164,162,224,164,188, 224,165,135,224,164,130,224,164,184,224,165,141,224,164,165,224,164,191,224,164, 164,224,164,171,224,164,191,224,164,178,224,165,141,224,164,174,224,164,174,224, 165,129,224,164,150,224,165,141,224,164,175,224,164,133,224,164,154,224,165,141, 224,164,155,224,164,190,224,164,155,224,165,130,224,164,159,224,164,164,224,165, 128,224,164,184,224,164,130,224,164,151,224,165,128,224,164,164,224,164,156,224, 164,190,224,164,143,224,164,151,224,164,190,224,164,181,224,164,191,224,164,173, 224,164,190,224,164,151,224,164,152,224,164,163,224,165,141,224,164,159,224,165, 135,224,164,166,224,165,130,224,164,184,224,164,176,224,165,135,224,164,166,224, 164,191,224,164,168,224,165,139,224,164,130,224,164,185,224,164,164,224,165,141, 224,164,175,224,164,190,224,164,184,224,165,135,224,164,149,224,165,141,224,164, 184,224,164,151,224,164,190,224,164,130,224,164,167,224,165,128,224,164,181,224, 164,191,224,164,182,224,165,141,224,164,181,224,164,176,224,164,190,224,164,164, 224,165,135,224,164,130,224,164,166,224,165,136,224,164,159,224,165,141,224,164, 184,224,164,168,224,164,149,224,165,141,224,164,182,224,164,190,224,164,184,224, 164,190,224,164,174,224,164,168,224,165,135,224,164,133,224,164,166,224,164,190, 224,164,178,224,164,164,224,164,172,224,164,191,224,164,156,224,164,178,224,165, 128,224,164,170,224,165,129,224,164,176,224,165,130,224,164,183,224,164,185,224, 164,191,224,164,130,224,164,166,224,165,128,224,164,174,224,164,191,224,164,164, 224,165,141,224,164,176,224,164,149,224,164,181,224,164,191,224,164,164,224,164, 190,224,164,176,224,165,129,224,164,170,224,164,175,224,165,135,224,164,184,224, 165,141,224,164,165,224,164,190,224,164,168,224,164,149,224,164,176,224,165,139, 224,164,161,224,164,188,224,164,174,224,165,129,224,164,149,224,165,141,224,164, 164,224,164,175,224,165,139,224,164,156,224,164,168,224,164,190,224,164,149,224, 165,131,224,164,170,224,164,175,224,164,190,224,164,170,224,165,139,224,164,184, 224,165,141,224,164,159,224,164,152,224,164,176,224,165,135,224,164,178,224,165, 130,224,164,149,224,164,190,224,164,176,224,165,141,224,164,175,224,164,181,224, 164,191,224,164,154,224,164,190,224,164,176,224,164,184,224,165,130,224,164,154, 224,164,168,224,164,190,224,164,174,224,165,130,224,164,178,224,165,141,224,164, 175,224,164,166,224,165,135,224,164,150,224,165,135,224,164,130,224,164,185,224, 164,174,224,165,135,224,164,182,224,164,190,224,164,184,224,165,141,224,164,149, 224,165,130,224,164,178,224,164,174,224,165,136,224,164,130,224,164,168,224,165, 135,224,164,164,224,165,136,224,164,175,224,164,190,224,164,176,224,164,156,224, 164,191,224,164,184,224,164,149,224,165,135,114,115,115,43,120,109,108,34,32,116 ,105,116,108,101,61,34,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34 ,116,105,116,108,101,34,32,99,111,110,116,101,110,116,61,34,97,116,32,116,104, 101,32,115,97,109,101,32,116,105,109,101,46,106,115,34,62,60,47,115,99,114,105, 112,116,62,10,60,34,32,109,101,116,104,111,100,61,34,112,111,115,116,34,32,60,47 ,115,112,97,110,62,60,47,97,62,60,47,108,105,62,118,101,114,116,105,99,97,108,45 ,97,108,105,103,110,58,116,47,106,113,117,101,114,121,46,109,105,110,46,106,115, 34,62,46,99,108,105,99,107,40,102,117,110,99,116,105,111,110,40,32,115,116,121, 108,101,61,34,112,97,100,100,105,110,103,45,125,41,40,41,59,10,60,47,115,99,114, 105,112,116,62,10,60,47,115,112,97,110,62,60,97,32,104,114,101,102,61,34,60,97, 32,104,114,101,102,61,34,104,116,116,112,58,47,47,41,59,32,114,101,116,117,114, 110,32,102,97,108,115,101,59,116,101,120,116,45,100,101,99,111,114,97,116,105, 111,110,58,32,115,99,114,111,108,108,105,110,103,61,34,110,111,34,32,98,111,114, 100,101,114,45,99,111,108,108,97,112,115,101,58,97,115,115,111,99,105,97,116,101 ,100,32,119,105,116,104,32,66,97,104,97,115,97,32,73,110,100,111,110,101,115,105 ,97,69,110,103,108,105,115,104,32,108,97,110,103,117,97,103,101,60,116,101,120, 116,32,120,109,108,58,115,112,97,99,101,61,46,103,105,102,34,32,98,111,114,100, 101,114,61,34,48,34,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,111, 118,101,114,102,108,111,119,58,104,105,100,100,101,110,59,105,109,103,32,115,114 ,99,61,34,104,116,116,112,58,47,47,97,100,100,69,118,101,110,116,76,105,115,116, 101,110,101,114,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,115 ,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,47,102,97,118,105,99,111, 110,46,105,99,111,34,32,47,62,111,112,101,114,97,116,105,110,103,32,115,121,115, 116,101,109,34,32,115,116,121,108,101,61,34,119,105,100,116,104,58,49,116,97,114 ,103,101,116,61,34,95,98,108,97,110,107,34,62,83,116,97,116,101,32,85,110,105, 118,101,114,115,105,116,121,116,101,120,116,45,97,108,105,103,110,58,108,101,102 ,116,59,10,100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,44,32,105, 110,99,108,117,100,105,110,103,32,116,104,101,32,97,114,111,117,110,100,32,116, 104,101,32,119,111,114,108,100,41,59,13,10,60,47,115,99,114,105,112,116,62,13,10 ,60,34,32,115,116,121,108,101,61,34,104,101,105,103,104,116,58,59,111,118,101, 114,102,108,111,119,58,104,105,100,100,101,110,109,111,114,101,32,105,110,102, 111,114,109,97,116,105,111,110,97,110,32,105,110,116,101,114,110,97,116,105,111, 110,97,108,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,111,110,101 ,32,111,102,32,116,104,101,32,102,105,114,115,116,99,97,110,32,98,101,32,102,111 ,117,110,100,32,105,110,32,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10, 100,105,115,112,108,97,121,58,32,110,111,110,101,59,34,62,34,32,47,62,10,60,108, 105,110,107,32,114,101,108,61,34,10,32,32,40,102,117,110,99,116,105,111,110,40, 41,32,123,116,104,101,32,49,53,116,104,32,99,101,110,116,117,114,121,46,112,114, 101,118,101,110,116,68,101,102,97,117,108,116,40,108,97,114,103,101,32,110,117, 109,98,101,114,32,111,102,32,66,121,122,97,110,116,105,110,101,32,69,109,112,105 ,114,101,46,106,112,103,124,116,104,117,109,98,124,108,101,102,116,124,118,97, 115,116,32,109,97,106,111,114,105,116,121,32,111,102,109,97,106,111,114,105,116, 121,32,111,102,32,116,104,101,32,32,97,108,105,103,110,61,34,99,101,110,116,101, 114,34,62,85,110,105,118,101,114,115,105,116,121,32,80,114,101,115,115,100,111, 109,105,110,97,116,101,100,32,98,121,32,116,104,101,83,101,99,111,110,100,32,87, 111,114,108,100,32,87,97,114,100,105,115,116,114,105,98,117,116,105,111,110,32, 111,102,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,116,104, 101,32,114,101,115,116,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101, 114,105,122,101,100,32,98,121,32,114,101,108,61,34,110,111,102,111,108,108,111, 119,34,62,100,101,114,105,118,101,115,32,102,114,111,109,32,116,104,101,114,97, 116,104,101,114,32,116,104,97,110,32,116,104,101,32,97,32,99,111,109,98,105,110, 97,116,105,111,110,32,111,102,115,116,121,108,101,61,34,119,105,100,116,104,58, 49,48,48,69,110,103,108,105,115,104,45,115,112,101,97,107,105,110,103,99,111,109 ,112,117,116,101,114,32,115,99,105,101,110,99,101,98,111,114,100,101,114,61,34, 48,34,32,97,108,116,61,34,116,104,101,32,101,120,105,115,116,101,110,99,101,32, 111,102,68,101,109,111,99,114,97,116,105,99,32,80,97,114,116,121,34,32,115,116, 121,108,101,61,34,109,97,114,103,105,110,45,70,111,114,32,116,104,105,115,32,114 ,101,97,115,111,110,44,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,9,115 ,66,121,84,97,103,78,97,109,101,40,115,41,91,48,93,106,115,34,62,60,47,115,99, 114,105,112,116,62,13,10,60,46,106,115,34,62,60,47,115,99,114,105,112,116,62,13, 10,108,105,110,107,32,114,101,108,61,34,105,99,111,110,34,32,39,32,97,108,116,61 ,39,39,32,99,108,97,115,115,61,39,102,111,114,109,97,116,105,111,110,32,111,102, 32,116,104,101,118,101,114,115,105,111,110,115,32,111,102,32,116,104,101,32,60, 47,97,62,60,47,100,105,118,62,60,47,100,105,118,62,47,112,97,103,101,62,10,32,32 ,60,112,97,103,101,62,10,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110, 116,98,101,99,97,109,101,32,116,104,101,32,102,105,114,115,116,98,97,104,97,115, 97,32,73,110,100,111,110,101,115,105,97,101,110,103,108,105,115,104,32,40,115, 105,109,112,108,101,41,206,149,206,187,206,187,206,183,206,189,206,185,206,186, 206,172,209,133,209,128,208,178,208,176,209,130,209,129,208,186,208,184,208,186, 208,190,208,188,208,191,208,176,208,189,208,184,208,184,209,143,208,178,208,187, 209,143,208,181,209,130,209,129,209,143,208,148,208,190,208,177,208,176,208,178, 208,184,209,130,209,140,209,135,208,181,208,187,208,190,208,178,208,181,208,186, 208,176,209,128,208,176,208,183,208,178,208,184,209,130,208,184,209,143,208,152, 208,189,209,130,208,181,209,128,208,189,208,181,209,130,208,158,209,130,208,178, 208,181,209,130,208,184,209,130,209,140,208,189,208,176,208,191,209,128,208,184, 208,188,208,181,209,128,208,184,208,189,209,130,208,181,209,128,208,189,208,181, 209,130,208,186,208,190,209,130,208,190,209,128,208,190,208,179,208,190,209,129, 209,130,209,128,208,176,208,189,208,184,209,134,209,139,208,186,208,176,209,135, 208,181,209,129,209,130,208,178,208,181,209,131,209,129,208,187,208,190,208,178, 208,184,209,143,209,133,208,191,209,128,208,190,208,177,208,187,208,181,208,188, 209,139,208,191,208,190,208,187,209,131,209,135,208,184,209,130,209,140,209,143, 208,178,208,187,209,143,209,142,209,130,209,129,209,143,208,189,208,176,208,184, 208,177,208,190,208,187,208,181,208,181,208,186,208,190,208,188,208,191,208,176, 208,189,208,184,209,143,208,178,208,189,208,184,208,188,208,176,208,189,208,184, 208,181,209,129,209,128,208,181,208,180,209,129,209,130,208,178,208,176,216,167, 217,132,217,133,217,136,216,167,216,182,217,138,216,185,216,167,217,132,216,177, 216,166,217,138,216,179,217,138,216,169,216,167,217,132,216,167,217,134,216,170, 217,130,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216,167,216,170, 217,131,216,167,217,132,216,179,217,138,216,167,216,177,216,167,216,170,216,167, 217,132,217,133,217,131,216,170,217,136,216,168,216,169,216,167,217,132,216,179, 216,185,217,136,216,175,217,138,216,169,216,167,216,173,216,181,216,167,216,166, 217,138,216,167,216,170,216,167,217,132,216,185,216,167,217,132,217,133,217,138, 216,169,216,167,217,132,216,181,217,136,216,170,217,138,216,167,216,170,216,167, 217,132,216,167,217,134,216,170,216,177,217,134,216,170,216,167,217,132,216,170, 216,181,216,167,217,133,217,138,217,133,216,167,217,132,216,165,216,179,217,132, 216,167,217,133,217,138,216,167,217,132,217,133,216,180,216,167,216,177,217,131, 216,169,216,167,217,132,217,133,216,177,216,166,217,138,216,167,216,170,114,111, 98,111,116,115,34,32,99,111,110,116,101,110,116,61,34,60,100,105,118,32,105,100, 61,34,102,111,111,116,101,114,34,62,116,104,101,32,85,110,105,116,101,100,32,83, 116,97,116,101,115,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47, 46,106,112,103,124,114,105,103,104,116,124,116,104,117,109,98,124,46,106,115,34, 62,60,47,115,99,114,105,112,116,62,13,10,60,108,111,99,97,116,105,111,110,46,112 ,114,111,116,111,99,111,108,102,114,97,109,101,98,111,114,100,101,114,61,34,48, 34,32,115,34,32,47,62,10,60,109,101,116,97,32,110,97,109,101,61,34,60,47,97,62, 60,47,100,105,118,62,60,47,100,105,118,62,60,102,111,110,116,45,119,101,105,103, 104,116,58,98,111,108,100,59,38,113,117,111,116,59,32,97,110,100,32,38,113,117, 111,116,59,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109, 97,114,103,105,110,58,48,59,112,97,100,100,105,110,103,58,34,32,114,101,108,61, 34,110,111,102,111,108,108,111,119,34,32,80,114,101,115,105,100,101,110,116,32, 111,102,32,116,104,101,32,116,119,101,110,116,105,101,116,104,32,99,101,110,116, 117,114,121,101,118,105,115,105,111,110,62,10,32,32,60,47,112,97,103,101,73,110, 116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,97,46,97,115,121,110, 99,32,61,32,116,114,117,101,59,13,10,105,110,102,111,114,109,97,116,105,111,110, 32,97,98,111,117,116,60,100,105,118,32,105,100,61,34,104,101,97,100,101,114,34, 62,34,32,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,60,97,32,104,114, 101,102,61,34,104,116,116,112,115,58,47,47,60,100,105,118,32,105,100,61,34,99, 111,110,116,101,110,116,34,60,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10 ,60,100,101,114,105,118,101,100,32,102,114,111,109,32,116,104,101,32,60,105,109, 103,32,115,114,99,61,39,104,116,116,112,58,47,47,97,99,99,111,114,100,105,110, 103,32,116,111,32,116,104,101,32,10,60,47,98,111,100,121,62,10,60,47,104,116,109 ,108,62,10,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,115, 99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,65,114,105,97,108,44, 32,72,101,108,118,101,116,105,99,97,44,60,47,97,62,60,115,112,97,110,32,99,108, 97,115,115,61,34,60,47,115,99,114,105,112,116,62,60,115,99,114,105,112,116,32, 112,111,108,105,116,105,99,97,108,32,112,97,114,116,105,101,115,116,100,62,60,47 ,116,114,62,60,47,116,97,98,108,101,62,60,104,114,101,102,61,34,104,116,116,112, 58,47,47,119,119,119,46,105,110,116,101,114,112,114,101,116,97,116,105,111,110, 32,111,102,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,100, 111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,99,104,97,114,115,101 ,116,61,34,117,116,102,45,56,34,62,10,98,101,103,105,110,110,105,110,103,32,111, 102,32,116,104,101,32,114,101,118,101,97,108,101,100,32,116,104,97,116,32,116, 104,101,116,101,108,101,118,105,115,105,111,110,32,115,101,114,105,101,115,34,32 ,114,101,108,61,34,110,111,102,111,108,108,111,119,34,62,32,116,97,114,103,101, 116,61,34,95,98,108,97,110,107,34,62,99,108,97,105,109,105,110,103,32,116,104,97 ,116,32,116,104,101,104,116,116,112,37,51,65,37,50,70,37,50,70,119,119,119,46, 109,97,110,105,102,101,115,116,97,116,105,111,110,115,32,111,102,80,114,105,109, 101,32,77,105,110,105,115,116,101,114,32,111,102,105,110,102,108,117,101,110,99, 101,100,32,98,121,32,116,104,101,99,108,97,115,115,61,34,99,108,101,97,114,102, 105,120,34,62,47,100,105,118,62,13,10,60,47,100,105,118,62,13,10,13,10,116,104, 114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,67,104,117,114,99,104, 32,111,102,32,69,110,103,108,97,110,100,111,102,32,78,111,114,116,104,32,67,97, 114,111,108,105,110,97,115,113,117,97,114,101,32,107,105,108,111,109,101,116,114 ,101,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,100,105 ,115,116,105,110,99,116,32,102,114,111,109,32,116,104,101,99,111,109,109,111,110 ,108,121,32,107,110,111,119,110,32,97,115,80,104,111,110,101,116,105,99,32,65, 108,112,104,97,98,101,116,100,101,99,108,97,114,101,100,32,116,104,97,116,32,116 ,104,101,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,66,101, 110,106,97,109,105,110,32,70,114,97,110,107,108,105,110,114,111,108,101,45,112, 108,97,121,105,110,103,32,103,97,109,101,116,104,101,32,85,110,105,118,101,114, 115,105,116,121,32,111,102,105,110,32,87,101,115,116,101,114,110,32,69,117,114, 111,112,101,112,101,114,115,111,110,97,108,32,99,111,109,112,117,116,101,114,80, 114,111,106,101,99,116,32,71,117,116,101,110,98,101,114,103,114,101,103,97,114, 100,108,101,115,115,32,111,102,32,116,104,101,104,97,115,32,98,101,101,110,32, 112,114,111,112,111,115,101,100,116,111,103,101,116,104,101,114,32,119,105,116, 104,32,116,104,101,62,60,47,108,105,62,60,108,105,32,99,108,97,115,115,61,34,105 ,110,32,115,111,109,101,32,99,111,117,110,116,114,105,101,115,109,105,110,46,106 ,115,34,62,60,47,115,99,114,105,112,116,62,111,102,32,116,104,101,32,112,111,112 ,117,108,97,116,105,111,110,111,102,102,105,99,105,97,108,32,108,97,110,103,117, 97,103,101,60,105,109,103,32,115,114,99,61,34,105,109,97,103,101,115,47,105,100, 101,110,116,105,102,105,101,100,32,98,121,32,116,104,101,110,97,116,117,114,97, 108,32,114,101,115,111,117,114,99,101,115,99,108,97,115,115,105,102,105,99,97, 116,105,111,110,32,111,102,99,97,110,32,98,101,32,99,111,110,115,105,100,101,114 ,101,100,113,117,97,110,116,117,109,32,109,101,99,104,97,110,105,99,115,78,101, 118,101,114,116,104,101,108,101,115,115,44,32,116,104,101,109,105,108,108,105, 111,110,32,121,101,97,114,115,32,97,103,111,60,47,98,111,100,121,62,13,10,60,47, 104,116,109,108,62,13,206,149,206,187,206,187,206,183,206,189,206,185,206,186, 206,172,10,116,97,107,101,32,97,100,118,97,110,116,97,103,101,32,111,102,97,110, 100,44,32,97,99,99,111,114,100,105,110,103,32,116,111,97,116,116,114,105,98,117, 116,101,100,32,116,111,32,116,104,101,77,105,99,114,111,115,111,102,116,32,87, 105,110,100,111,119,115,116,104,101,32,102,105,114,115,116,32,99,101,110,116,117 ,114,121,117,110,100,101,114,32,116,104,101,32,99,111,110,116,114,111,108,100, 105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114,115,104,111,114,116, 108,121,32,97,102,116,101,114,32,116,104,101,110,111,116,97,98,108,101,32,101, 120,99,101,112,116,105,111,110,116,101,110,115,32,111,102,32,116,104,111,117,115 ,97,110,100,115,115,101,118,101,114,97,108,32,100,105,102,102,101,114,101,110, 116,97,114,111,117,110,100,32,116,104,101,32,119,111,114,108,100,46,114,101,97, 99,104,105,110,103,32,109,105,108,105,116,97,114,121,105,115,111,108,97,116,101, 100,32,102,114,111,109,32,116,104,101,111,112,112,111,115,105,116,105,111,110,32 ,116,111,32,116,104,101,116,104,101,32,79,108,100,32,84,101,115,116,97,109,101, 110,116,65,102,114,105,99,97,110,32,65,109,101,114,105,99,97,110,115,105,110,115 ,101,114,116,101,100,32,105,110,116,111,32,116,104,101,115,101,112,97,114,97,116 ,101,32,102,114,111,109,32,116,104,101,109,101,116,114,111,112,111,108,105,116, 97,110,32,97,114,101,97,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98, 108,101,97,99,107,110,111,119,108,101,100,103,101,100,32,116,104,97,116,97,114, 103,117,97,98,108,121,32,116,104,101,32,109,111,115,116,116,121,112,101,61,34, 116,101,120,116,47,99,115,115,34,62,10,116,104,101,32,73,110,116,101,114,110,97, 116,105,111,110,97,108,65,99,99,111,114,100,105,110,103,32,116,111,32,116,104, 101,32,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,99,111,105,110 ,99,105,100,101,32,119,105,116,104,32,116,104,101,116,119,111,45,116,104,105,114 ,100,115,32,111,102,32,116,104,101,68,117,114,105,110,103,32,116,104,105,115,32, 116,105,109,101,44,100,117,114,105,110,103,32,116,104,101,32,112,101,114,105,111 ,100,97,110,110,111,117,110,99,101,100,32,116,104,97,116,32,104,101,116,104,101, 32,105,110,116,101,114,110,97,116,105,111,110,97,108,97,110,100,32,109,111,114, 101,32,114,101,99,101,110,116,108,121,98,101,108,105,101,118,101,100,32,116,104, 97,116,32,116,104,101,99,111,110,115,99,105,111,117,115,110,101,115,115,32,97, 110,100,102,111,114,109,101,114,108,121,32,107,110,111,119,110,32,97,115,115,117 ,114,114,111,117,110,100,101,100,32,98,121,32,116,104,101,102,105,114,115,116,32 ,97,112,112,101,97,114,101,100,32,105,110,111,99,99,97,115,105,111,110,97,108, 108,121,32,117,115,101,100,112,111,115,105,116,105,111,110,58,97,98,115,111,108, 117,116,101,59,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,112 ,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,116,101,120, 116,45,97,108,105,103,110,58,99,101,110,116,101,114,59,106,97,120,47,108,105,98, 115,47,106,113,117,101,114,121,47,49,46,98,97,99,107,103,114,111,117,110,100,45, 99,111,108,111,114,58,35,116,121,112,101,61,34,97,112,112,108,105,99,97,116,105, 111,110,47,97,110,103,117,97,103,101,34,32,99,111,110,116,101,110,116,61,34,60, 109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,80,114,105,118,97 ,99,121,32,80,111,108,105,99,121,60,47,97,62,101,40,34,37,51,67,115,99,114,105, 112,116,32,115,114,99,61,39,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110, 107,34,62,79,110,32,116,104,101,32,111,116,104,101,114,32,104,97,110,100,44,46, 106,112,103,124,116,104,117,109,98,124,114,105,103,104,116,124,50,60,47,100,105, 118,62,60,100,105,118,32,99,108,97,115,115,61,34,60,100,105,118,32,115,116,121, 108,101,61,34,102,108,111,97,116,58,110,105,110,101,116,101,101,110,116,104,32, 99,101,110,116,117,114,121,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108, 62,13,10,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,115,59,116, 101,120,116,45,97,108,105,103,110,58,99,101,110,116,101,114,102,111,110,116,45, 119,101,105,103,104,116,58,32,98,111,108,100,59,32,65,99,99,111,114,100,105,110, 103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98, 101,116,119,101,101,110,34,32,102,114,97,109,101,98,111,114,100,101,114,61,34,48 ,34,32,34,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,108, 105,110,107,32,104,114,101,102,61,34,104,116,116,112,58,47,47,104,116,109,108,52 ,47,108,111,111,115,101,46,100,116,100,34,62,10,100,117,114,105,110,103,32,116, 104,105,115,32,112,101,114,105,111,100,60,47,116,100,62,60,47,116,114,62,60,47, 116,97,98,108,101,62,99,108,111,115,101,108,121,32,114,101,108,97,116,101,100,32 ,116,111,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,59 ,102,111,110,116,45,119,101,105,103,104,116,58,98,111,108,100,59,105,110,112,117 ,116,32,116,121,112,101,61,34,116,101,120,116,34,32,60,115,112,97,110,32,115,116 ,121,108,101,61,34,102,111,110,116,45,111,110,114,101,97,100,121,115,116,97,116, 101,99,104,97,110,103,101,9,60,100,105,118,32,99,108,97,115,115,61,34,99,108,101 ,97,114,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,32,70 ,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,32,119,105,100, 101,32,118,97,114,105,101,116,121,32,111,102,32,60,33,68,79,67,84,89,80,69,32, 104,116,109,108,62,13,10,60,38,110,98,115,112,59,38,110,98,115,112,59,38,110,98, 115,112,59,34,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,115,116 ,121,108,101,61,34,102,108,111,97,116,58,108,101,102,116,59,99,111,110,99,101, 114,110,101,100,32,119,105,116,104,32,116,104,101,61,104,116,116,112,37,51,65,37 ,50,70,37,50,70,119,119,119,46,105,110,32,112,111,112,117,108,97,114,32,99,117, 108,116,117,114,101,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,47 ,62,105,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,72,97,114 ,118,97,114,100,32,85,110,105,118,101,114,115,105,116,121,116,121,108,101,115, 104,101,101,116,34,32,104,114,101,102,61,34,47,116,104,101,32,109,97,105,110,32, 99,104,97,114,97,99,116,101,114,79,120,102,111,114,100,32,85,110,105,118,101,114 ,115,105,116,121,32,32,110,97,109,101,61,34,107,101,121,119,111,114,100,115,34, 32,99,115,116,121,108,101,61,34,116,101,120,116,45,97,108,105,103,110,58,116,104 ,101,32,85,110,105,116,101,100,32,75,105,110,103,100,111,109,102,101,100,101,114 ,97,108,32,103,111,118,101,114,110,109,101,110,116,60,100,105,118,32,115,116,121 ,108,101,61,34,109,97,114,103,105,110,32,100,101,112,101,110,100,105,110,103,32, 111,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102, 32,116,104,101,60,100,105,118,32,99,108,97,115,115,61,34,104,101,97,100,101,114, 46,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,100,101,115,116, 114,117,99,116,105,111,110,32,111,102,32,116,104,101,115,108,105,103,104,116,108 ,121,32,100,105,102,102,101,114,101,110,116,105,110,32,97,99,99,111,114,100,97, 110,99,101,32,119,105,116,104,116,101,108,101,99,111,109,109,117,110,105,99,97, 116,105,111,110,115,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116, 104,101,115,104,111,114,116,108,121,32,116,104,101,114,101,97,102,116,101,114, 101,115,112,101,99,105,97,108,108,121,32,105,110,32,116,104,101,32,69,117,114, 111,112,101,97,110,32,99,111,117,110,116,114,105,101,115,72,111,119,101,118,101, 114,44,32,116,104,101,114,101,32,97,114,101,115,114,99,61,34,104,116,116,112,58, 47,47,115,116,97,116,105,99,115,117,103,103,101,115,116,101,100,32,116,104,97, 116,32,116,104,101,34,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119, 46,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,84,101,108, 101,99,111,109,109,117,110,105,99,97,116,105,111,110,115,34,32,114,101,108,61,34 ,110,111,102,111,108,108,111,119,34,32,116,72,111,108,121,32,82,111,109,97,110, 32,69,109,112,101,114,111,114,97,108,109,111,115,116,32,101,120,99,108,117,115, 105,118,101,108,121,34,32,98,111,114,100,101,114,61,34,48,34,32,97,108,116,61,34 ,83,101,99,114,101,116,97,114,121,32,111,102,32,83,116,97,116,101,99,117,108,109 ,105,110,97,116,105,110,103,32,105,110,32,116,104,101,67,73,65,32,87,111,114,108 ,100,32,70,97,99,116,98,111,111,107,116,104,101,32,109,111,115,116,32,105,109, 112,111,114,116,97,110,116,97,110,110,105,118,101,114,115,97,114,121,32,111,102, 32,116,104,101,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45 ,60,108,105,62,60,101,109,62,60,97,32,104,114,101,102,61,34,47,116,104,101,32,65 ,116,108,97,110,116,105,99,32,79,99,101,97,110,115,116,114,105,99,116,108,121,32 ,115,112,101,97,107,105,110,103,44,115,104,111,114,116,108,121,32,98,101,102,111 ,114,101,32,116,104,101,100,105,102,102,101,114,101,110,116,32,116,121,112,101, 115,32,111,102,116,104,101,32,79,116,116,111,109,97,110,32,69,109,112,105,114, 101,62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,65,110,32,73, 110,116,114,111,100,117,99,116,105,111,110,32,116,111,99,111,110,115,101,113,117 ,101,110,99,101,32,111,102,32,116,104,101,100,101,112,97,114,116,117,114,101,32, 102,114,111,109,32,116,104,101,67,111,110,102,101,100,101,114,97,116,101,32,83, 116,97,116,101,115,105,110,100,105,103,101,110,111,117,115,32,112,101,111,112, 108,101,115,80,114,111,99,101,101,100,105,110,103,115,32,111,102,32,116,104,101, 105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,116,104,101 ,111,114,105,101,115,32,104,97,118,101,32,98,101,101,110,105,110,118,111,108,118 ,101,109,101,110,116,32,105,110,32,116,104,101,100,105,118,105,100,101,100,32, 105,110,116,111,32,116,104,114,101,101,97,100,106,97,99,101,110,116,32,99,111, 117,110,116,114,105,101,115,105,115,32,114,101,115,112,111,110,115,105,98,108, 101,32,102,111,114,100,105,115,115,111,108,117,116,105,111,110,32,111,102,32,116 ,104,101,99,111,108,108,97,98,111,114,97,116,105,111,110,32,119,105,116,104,119, 105,100,101,108,121,32,114,101,103,97,114,100,101,100,32,97,115,104,105,115,32, 99,111,110,116,101,109,112,111,114,97,114,105,101,115,102,111,117,110,100,105, 110,103,32,109,101,109,98,101,114,32,111,102,68,111,109,105,110,105,99,97,110,32 ,82,101,112,117,98,108,105,99,103,101,110,101,114,97,108,108,121,32,97,99,99,101 ,112,116,101,100,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32, 111,102,97,114,101,32,97,108,115,111,32,97,118,97,105,108,97,98,108,101,117,110, 100,101,114,32,99,111,110,115,116,114,117,99,116,105,111,110,114,101,115,116,111 ,114,97,116,105,111,110,32,111,102,32,116,104,101,116,104,101,32,103,101,110,101 ,114,97,108,32,112,117,98,108,105,99,105,115,32,97,108,109,111,115,116,32,101, 110,116,105,114,101,108,121,112,97,115,115,101,115,32,116,104,114,111,117,103, 104,32,116,104,101,104,97,115,32,98,101,101,110,32,115,117,103,103,101,115,116, 101,100,99,111,109,112,117,116,101,114,32,97,110,100,32,118,105,100,101,111,71, 101,114,109,97,110,105,99,32,108,97,110,103,117,97,103,101,115,32,97,99,99,111, 114,100,105,110,103,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110 ,116,32,102,114,111,109,32,116,104,101,115,104,111,114,116,108,121,32,97,102,116 ,101,114,119,97,114,100,115,104,114,101,102,61,34,104,116,116,112,115,58,47,47, 119,119,119,46,114,101,99,101,110,116,32,100,101,118,101,108,111,112,109,101,110 ,116,66,111,97,114,100,32,111,102,32,68,105,114,101,99,116,111,114,115,60,100, 105,118,32,99,108,97,115,115,61,34,115,101,97,114,99,104,124,32,60,97,32,104,114 ,101,102,61,34,104,116,116,112,58,47,47,73,110,32,112,97,114,116,105,99,117,108, 97,114,44,32,116,104,101,77,117,108,116,105,112,108,101,32,102,111,111,116,110, 111,116,101,115,111,114,32,111,116,104,101,114,32,115,117,98,115,116,97,110,99, 101,116,104,111,117,115,97,110,100,115,32,111,102,32,121,101,97,114,115,116,114, 97,110,115,108,97,116,105,111,110,32,111,102,32,116,104,101,60,47,100,105,118,62 ,13,10,60,47,100,105,118,62,13,10,13,10,60,97,32,104,114,101,102,61,34,105,110, 100,101,120,46,112,104,112,119,97,115,32,101,115,116,97,98,108,105,115,104,101, 100,32,105,110,109,105,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10, 112,97,114,116,105,99,105,112,97,116,101,32,105,110,32,116,104,101,97,32,115,116 ,114,111,110,103,32,105,110,102,108,117,101,110,99,101,115,116,121,108,101,61,34 ,109,97,114,103,105,110,45,116,111,112,58,114,101,112,114,101,115,101,110,116, 101,100,32,98,121,32,116,104,101,103,114,97,100,117,97,116,101,100,32,102,114, 111,109,32,116,104,101,84,114,97,100,105,116,105,111,110,97,108,108,121,44,32, 116,104,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,59,72, 111,119,101,118,101,114,44,32,115,105,110,99,101,32,116,104,101,47,100,105,118, 62,10,60,47,100,105,118,62,10,60,100,105,118,32,108,101,102,116,59,32,109,97,114 ,103,105,110,45,108,101,102,116,58,112,114,111,116,101,99,116,105,111,110,32,97, 103,97,105,110,115,116,48,59,32,118,101,114,116,105,99,97,108,45,97,108,105,103, 110,58,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32,116,104,101,116, 121,112,101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,47,100,105,118,62, 10,60,100,105,118,32,99,108,97,115,115,61,34,32,99,108,97,115,115,61,34,99,108, 101,97,114,102,105,120,34,62,60,100,105,118,32,99,108,97,115,115,61,34,102,111, 111,116,101,114,9,9,60,47,100,105,118,62,10,9,9,60,47,100,105,118,62,10,116,104, 101,32,109,111,116,105,111,110,32,112,105,99,116,117,114,101,208,145,209,138,208 ,187,208,179,208,176,209,128,209,129,208,186,208,184,208,177,209,138,208,187,208 ,179,208,176,209,128,209,129,208,186,208,184,208,164,208,181,208,180,208,181,209 ,128,208,176,209,134,208,184,208,184,208,189,208,181,209,129,208,186,208,190,208 ,187,209,140,208,186,208,190,209,129,208,190,208,190,208,177,209,137,208,181,208 ,189,208,184,208,181,209,129,208,190,208,190,208,177,209,137,208,181,208,189,208 ,184,209,143,208,191,209,128,208,190,208,179,209,128,208,176,208,188,208,188,209 ,139,208,158,209,130,208,191,209,128,208,176,208,178,208,184,209,130,209,140,208 ,177,208,181,209,129,208,191,208,187,208,176,209,130,208,189,208,190,208,188,208 ,176,209,130,208,181,209,128,208,184,208,176,208,187,209,139,208,191,208,190,208 ,183,208,178,208,190,208,187,209,143,208,181,209,130,208,191,208,190,209,129,208 ,187,208,181,208,180,208,189,208,184,208,181,209,128,208,176,208,183,208,187,208 ,184,209,135,208,189,209,139,209,133,208,191,209,128,208,190,208,180,209,131,208 ,186,209,134,208,184,208,184,208,191,209,128,208,190,208,179,209,128,208,176,208 ,188,208,188,208,176,208,191,208,190,208,187,208,189,208,190,209,129,209,130,209 ,140,209,142,208,189,208,176,209,133,208,190,208,180,208,184,209,130,209,129,209 ,143,208,184,208,183,208,177,209,128,208,176,208,189,208,189,208,190,208,181,208 ,189,208,176,209,129,208,181,208,187,208,181,208,189,208,184,209,143,208,184,208 ,183,208,188,208,181,208,189,208,181,208,189,208,184,209,143,208,186,208,176,209 ,130,208,181,208,179,208,190,209,128,208,184,208,184,208,144,208,187,208,181,208 ,186,209,129,208,176,208,189,208,180,209,128,224,164,166,224,165,141,224,164,181 ,224,164,190,224,164,176,224,164,190,224,164,174,224,165,136,224,164,168,224,165 ,129,224,164,133,224,164,178,224,164,170,224,165,141,224,164,176,224,164,166,224 ,164,190,224,164,168,224,164,173,224,164,190,224,164,176,224,164,164,224,165,128 ,224,164,175,224,164,133,224,164,168,224,165,129,224,164,166,224,165,135,224,164 ,182,224,164,185,224,164,191,224,164,168,224,165,141,224,164,166,224,165,128,224 ,164,135,224,164,130,224,164,161,224,164,191,224,164,175,224,164,190,224,164,166 ,224,164,191,224,164,178,224,165,141,224,164,178,224,165,128,224,164,133,224,164 ,167,224,164,191,224,164,149,224,164,190,224,164,176,224,164,181,224,165,128,224 ,164,161,224,164,191,224,164,175,224,165,139,224,164,154,224,164,191,224,164,159 ,224,165,141,224,164,160,224,165,135,224,164,184,224,164,174,224,164,190,224,164 ,154,224,164,190,224,164,176,224,164,156,224,164,130,224,164,149,224,165,141,224 ,164,182,224,164,168,224,164,166,224,165,129,224,164,168,224,164,191,224,164,175 ,224,164,190,224,164,170,224,165,141,224,164,176,224,164,175,224,165,139,224,164 ,151,224,164,133,224,164,168,224,165,129,224,164,184,224,164,190,224,164,176,224 ,164,145,224,164,168,224,164,178,224,164,190,224,164,135,224,164,168,224,164,170 ,224,164,190,224,164,176,224,165,141,224,164,159,224,165,128,224,164,182,224,164 ,176,224,165,141,224,164,164,224,165,139,224,164,130,224,164,178,224,165,139,224 ,164,149,224,164,184,224,164,173,224,164,190,224,164,171,224,164,188,224,165,141 ,224,164,178,224,165,136,224,164,182,224,164,182,224,164,176,224,165,141,224,164 ,164,224,165,135,224,164,130,224,164,170,224,165,141,224,164,176,224,164,166,224 ,165,135,224,164,182,224,164,170,224,165,141,224,164,178,224,165,135,224,164,175 ,224,164,176,224,164,149,224,165,135,224,164,130,224,164,166,224,165,141,224,164 ,176,224,164,184,224,165,141,224,164,165,224,164,191,224,164,164,224,164,191,224 ,164,137,224,164,164,224,165,141,224,164,170,224,164,190,224,164,166,224,164,137 ,224,164,168,224,165,141,224,164,185,224,165,135,224,164,130,224,164,154,224,164 ,191,224,164,159,224,165,141,224,164,160,224,164,190,224,164,175,224,164,190,224 ,164,164,224,165,141,224,164,176,224,164,190,224,164,156,224,165,141,224,164,175 ,224,164,190,224,164,166,224,164,190,224,164,170,224,165,129,224,164,176,224,164 ,190,224,164,168,224,165,135,224,164,156,224,165,139,224,164,161,224,164,188,224 ,165,135,224,164,130,224,164,133,224,164,168,224,165,129,224,164,181,224,164,190 ,224,164,166,224,164,182,224,165,141,224,164,176,224,165,135,224,164,163,224,165 ,128,224,164,182,224,164,191,224,164,149,224,165,141,224,164,183,224,164,190,224 ,164,184,224,164,176,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184 ,224,164,130,224,164,151,224,165,141,224,164,176,224,164,185,224,164,170,224,164 ,176,224,164,191,224,164,163,224,164,190,224,164,174,224,164,172,224,165,141,224 ,164,176,224,164,190,224,164,130,224,164,161,224,164,172,224,164,154,224,165,141 ,224,164,154,224,165,139,224,164,130,224,164,137,224,164,170,224,164,178,224,164 ,172,224,165,141,224,164,167,224,164,174,224,164,130,224,164,164,224,165,141,224 ,164,176,224,165,128,224,164,184,224,164,130,224,164,170,224,164,176,224,165,141 ,224,164,149,224,164,137,224,164,174,224,165,141,224,164,174,224,165,128,224,164 ,166,224,164,174,224,164,190,224,164,167,224,165,141,224,164,175,224,164,174,224 ,164,184,224,164,185,224,164,190,224,164,175,224,164,164,224,164,190,224,164,182 ,224,164,172,224,165,141,224,164,166,224,165,139,224,164,130,224,164,174,224,165 ,128,224,164,161,224,164,191,224,164,175,224,164,190,224,164,134,224,164,136,224 ,164,170,224,165,128,224,164,143,224,164,178,224,164,174,224,165,139,224,164,172 ,224,164,190,224,164,135,224,164,178,224,164,184,224,164,130,224,164,150,224,165 ,141,224,164,175,224,164,190,224,164,134,224,164,170,224,164,176,224,165,135,224 ,164,182,224,164,168,224,164,133,224,164,168,224,165,129,224,164,172,224,164,130 ,224,164,167,224,164,172,224,164,190,224,164,156,224,164,188,224,164,190,224,164 ,176,224,164,168,224,164,181,224,165,128,224,164,168,224,164,164,224,164,174,224 ,164,170,224,165,141,224,164,176,224,164,174,224,165,129,224,164,150,224,164,170 ,224,165,141,224,164,176,224,164,182,224,165,141,224,164,168,224,164,170,224,164 ,176,224,164,191,224,164,181,224,164,190,224,164,176,224,164,168,224,165,129,224 ,164,149,224,164,184,224,164,190,224,164,168,224,164,184,224,164,174,224,164,176 ,224,165,141,224,164,165,224,164,168,224,164,134,224,164,175,224,165,139,224,164 ,156,224,164,191,224,164,164,224,164,184,224,165,139,224,164,174,224,164,181,224 ,164,190,224,164,176,216,167,217,132,217,133,216,180,216,167,216,177,217,131,216 ,167,216,170,216,167,217,132,217,133,217,134,216,170,216,175,217,138,216,167,216 ,170,216,167,217,132,217,131,217,133,216,168,217,138,217,136,216,170,216,177,216 ,167,217,132,217,133,216,180,216,167,217,135,216,175,216,167,216,170,216,185,216 ,175,216,175,216,167,217,132,216,178,217,136,216,167,216,177,216,185,216,175,216 ,175,216,167,217,132,216,177,216,175,217,136,216,175,216,167,217,132,216,165,216 ,179,217,132,216,167,217,133,217,138,216,169,216,167,217,132,217,129,217,136,216 ,170,217,136,216,180,217,136,216,168,216,167,217,132,217,133,216,179,216,167,216 ,168,217,130,216,167,216,170,216,167,217,132,217,133,216,185,217,132,217,136,217 ,133,216,167,216,170,216,167,217,132,217,133,216,179,217,132,216,179,217,132,216 ,167,216,170,216,167,217,132,216,172,216,177,216,167,217,129,217,138,217,131,216 ,179,216,167,217,132,216,167,216,179,217,132,216,167,217,133,217,138,216,169,216 ,167,217,132,216,167,216,170,216,181,216,167,217,132,216,167,216,170,107,101,121 ,119,111,114,100,115,34,32,99,111,110,116,101,110,116,61,34,119,51,46,111,114, 103,47,49,57,57,57,47,120,104,116,109,108,34,62,60,97,32,116,97,114,103,101,116, 61,34,95,98,108,97,110,107,34,32,116,101,120,116,47,104,116,109,108,59,32,99,104 ,97,114,115,101,116,61,34,32,116,97,114,103,101,116,61,34,95,98,108,97,110,107, 34,62,60,116,97,98,108,101,32,99,101,108,108,112,97,100,100,105,110,103,61,34,97 ,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,116,101,120, 116,45,97,108,105,103,110,58,32,99,101,110,116,101,114,59,116,111,32,108,97,115, 116,32,118,101,114,115,105,111,110,32,98,121,32,98,97,99,107,103,114,111,117,110 ,100,45,99,111,108,111,114,58,32,35,34,32,104,114,101,102,61,34,104,116,116,112, 58,47,47,119,119,119,46,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118,32 ,105,100,61,60,97,32,104,114,101,102,61,34,35,34,32,99,108,97,115,115,61,34,34, 62,60,105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,99,114,105,112, 116,34,32,115,114,99,61,34,104,116,116,112,58,47,47,10,60,115,99,114,105,112,116 ,32,108,97,110,103,117,97,103,101,61,34,47,47,69,78,34,32,34,104,116,116,112,58, 47,47,119,119,119,46,119,101,110,99,111,100,101,85,82,73,67,111,109,112,111,110, 101,110,116,40,34,32,104,114,101,102,61,34,106,97,118,97,115,99,114,105,112,116, 58,60,100,105,118,32,99,108,97,115,115,61,34,99,111,110,116,101,110,116,100,111, 99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,112,111,115,105, 116,105,111,110,58,32,97,98,115,111,108,117,116,101,59,115,99,114,105,112,116,32 ,115,114,99,61,34,104,116,116,112,58,47,47,32,115,116,121,108,101,61,34,109,97, 114,103,105,110,45,116,111,112,58,46,109,105,110,46,106,115,34,62,60,47,115,99, 114,105,112,116,62,10,60,47,100,105,118,62,10,60,100,105,118,32,99,108,97,115, 115,61,34,119,51,46,111,114,103,47,49,57,57,57,47,120,104,116,109,108,34,32,10, 13,10,60,47,98,111,100,121,62,13,10,60,47,104,116,109,108,62,100,105,115,116,105 ,110,99,116,105,111,110,32,98,101,116,119,101,101,110,47,34,32,116,97,114,103, 101,116,61,34,95,98,108,97,110,107,34,62,60,108,105,110,107,32,104,114,101,102, 61,34,104,116,116,112,58,47,47,101,110,99,111,100,105,110,103,61,34,117,116,102, 45,56,34,63,62,10,119,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110, 101,114,63,97,99,116,105,111,110,61,34,104,116,116,112,58,47,47,119,119,119,46, 105,99,111,110,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,32,115,116, 121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,58,116,121,112,101,61,34, 116,101,120,116,47,99,115,115,34,32,47,62,10,109,101,116,97,32,112,114,111,112, 101,114,116,121,61,34,111,103,58,116,60,105,110,112,117,116,32,116,121,112,101, 61,34,116,101,120,116,34,32,32,115,116,121,108,101,61,34,116,101,120,116,45,97, 108,105,103,110,58,116,104,101,32,100,101,118,101,108,111,112,109,101,110,116,32 ,111,102,32,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, 101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56,105,115 ,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,116,97,98,108, 101,32,119,105,100,116,104,61,34,49,48,48,37,34,32,73,110,32,97,100,100,105,116, 105,111,110,32,116,111,32,116,104,101,32,99,111,110,116,114,105,98,117,116,101, 100,32,116,111,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,115,32, 98,101,116,119,101,101,110,100,101,118,101,108,111,112,109,101,110,116,32,111, 102,32,116,104,101,32,73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32 ,116,111,32,60,47,115,99,114,105,112,116,62,10,10,60,115,99,114,105,112,116,32, 32,115,116,121,108,101,61,34,102,111,110,116,45,115,105,122,101,58,49,62,60,47, 115,112,97,110,62,60,115,112,97,110,32,105,100,61,103,98,76,105,98,114,97,114, 121,32,111,102,32,67,111,110,103,114,101,115,115,60,105,109,103,32,115,114,99,61 ,34,104,116,116,112,58,47,47,105,109,69,110,103,108,105,115,104,32,116,114,97, 110,115,108,97,116,105,111,110,65,99,97,100,101,109,121,32,111,102,32,83,99,105, 101,110,99,101,115,100,105,118,32,115,116,121,108,101,61,34,100,105,115,112,108, 97,121,58,99,111,110,115,116,114,117,99,116,105,111,110,32,111,102,32,116,104, 101,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,105,100,41,105, 110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,69,108,101, 109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,32,60,109,101,116,97,32, 112,114,111,112,101,114,116,121,61,34,111,103,58,208,145,209,138,208,187,208,179 ,208,176,209,128,209,129,208,186,208,184,10,32,116,121,112,101,61,34,116,101,120 ,116,34,32,110,97,109,101,61,34,62,80,114,105,118,97,99,121,32,80,111,108,105,99 ,121,60,47,97,62,97,100,109,105,110,105,115,116,101,114,101,100,32,98,121,32,116 ,104,101,101,110,97,98,108,101,83,105,110,103,108,101,82,101,113,117,101,115,116 ,115,116,121,108,101,61,38,113,117,111,116,59,109,97,114,103,105,110,58,60,47, 100,105,118,62,60,47,100,105,118,62,60,47,100,105,118,62,60,62,60,105,109,103,32 ,115,114,99,61,34,104,116,116,112,58,47,47,105,32,115,116,121,108,101,61,38,113, 117,111,116,59,102,108,111,97,116,58,114,101,102,101,114,114,101,100,32,116,111, 32,97,115,32,116,104,101,32,116,111,116,97,108,32,112,111,112,117,108,97,116,105 ,111,110,32,111,102,105,110,32,87,97,115,104,105,110,103,116,111,110,44,32,68,46 ,67,46,32,115,116,121,108,101,61,34,98,97,99,107,103,114,111,117,110,100,45,97, 109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,44,111,114,103 ,97,110,105,122,97,116,105,111,110,32,111,102,32,116,104,101,112,97,114,116,105, 99,105,112,97,116,101,100,32,105,110,32,116,104,101,116,104,101,32,105,110,116, 114,111,100,117,99,116,105,111,110,32,111,102,105,100,101,110,116,105,102,105, 101,100,32,119,105,116,104,32,116,104,101,102,105,99,116,105,111,110,97,108,32, 99,104,97,114,97,99,116,101,114,32,79,120,102,111,114,100,32,85,110,105,118,101, 114,115,105,116,121,32,109,105,115,117,110,100,101,114,115,116,97,110,100,105, 110,103,32,111,102,84,104,101,114,101,32,97,114,101,44,32,104,111,119,101,118, 101,114,44,115,116,121,108,101,115,104,101,101,116,34,32,104,114,101,102,61,34, 47,67,111,108,117,109,98,105,97,32,85,110,105,118,101,114,115,105,116,121,101, 120,112,97,110,100,101,100,32,116,111,32,105,110,99,108,117,100,101,117,115,117, 97,108,108,121,32,114,101,102,101,114,114,101,100,32,116,111,105,110,100,105,99, 97,116,105,110,103,32,116,104,97,116,32,116,104,101,104,97,118,101,32,115,117, 103,103,101,115,116,101,100,32,116,104,97,116,97,102,102,105,108,105,97,116,101, 100,32,119,105,116,104,32,116,104,101,99,111,114,114,101,108,97,116,105,111,110, 32,98,101,116,119,101,101,110,110,117,109,98,101,114,32,111,102,32,100,105,102, 102,101,114,101,110,116,62,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108 ,101,62,82,101,112,117,98,108,105,99,32,111,102,32,73,114,101,108,97,110,100,10, 60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,117,110,100,101, 114,32,116,104,101,32,105,110,102,108,117,101,110,99,101,99,111,110,116,114,105, 98,117,116,105,111,110,32,116,111,32,116,104,101,79,102,102,105,99,105,97,108,32 ,119,101,98,115,105,116,101,32,111,102,104,101,97,100,113,117,97,114,116,101,114 ,115,32,111,102,32,116,104,101,99,101,110,116,101,114,101,100,32,97,114,111,117, 110,100,32,116,104,101,105,109,112,108,105,99,97,116,105,111,110,115,32,111,102, 32,116,104,101,104,97,118,101,32,98,101,101,110,32,100,101,118,101,108,111,112, 101,100,70,101,100,101,114,97,108,32,82,101,112,117,98,108,105,99,32,111,102,98, 101,99,97,109,101,32,105,110,99,114,101,97,115,105,110,103,108,121,99,111,110, 116,105,110,117,97,116,105,111,110,32,111,102,32,116,104,101,78,111,116,101,44, 32,104,111,119,101,118,101,114,44,32,116,104,97,116,115,105,109,105,108,97,114, 32,116,111,32,116,104,97,116,32,111,102,32,99,97,112,97,98,105,108,105,116,105, 101,115,32,111,102,32,116,104,101,97,99,99,111,114,100,97,110,99,101,32,119,105, 116,104,32,116,104,101,112,97,114,116,105,99,105,112,97,110,116,115,32,105,110, 32,116,104,101,102,117,114,116,104,101,114,32,100,101,118,101,108,111,112,109, 101,110,116,117,110,100,101,114,32,116,104,101,32,100,105,114,101,99,116,105,111 ,110,105,115,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114,101,100, 104,105,115,32,121,111,117,110,103,101,114,32,98,114,111,116,104,101,114,60,47, 116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,60,97,32,104,116,116,112, 45,101,113,117,105,118,61,34,88,45,85,65,45,112,104,121,115,105,99,97,108,32,112 ,114,111,112,101,114,116,105,101,115,111,102,32,66,114,105,116,105,115,104,32,67 ,111,108,117,109,98,105,97,104,97,115,32,98,101,101,110,32,99,114,105,116,105,99 ,105,122,101,100,40,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105 ,111,110,113,117,101,115,116,105,111,110,115,32,97,98,111,117,116,32,116,104,101 ,112,97,115,115,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,48,34, 32,99,101,108,108,112,97,100,100,105,110,103,61,34,48,34,32,116,104,111,117,115, 97,110,100,115,32,111,102,32,112,101,111,112,108,101,114,101,100,105,114,101,99, 116,115,32,104,101,114,101,46,32,70,111,114,104,97,118,101,32,99,104,105,108,100 ,114,101,110,32,117,110,100,101,114,37,51,69,37,51,67,47,115,99,114,105,112,116, 37,51,69,34,41,41,59,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119 ,119,119,46,60,108,105,62,60,97,32,104,114,101,102,61,34,104,116,116,112,58,47, 47,115,105,116,101,95,110,97,109,101,34,32,99,111,110,116,101,110,116,61,34,116, 101,120,116,45,100,101,99,111,114,97,116,105,111,110,58,110,111,110,101,115,116, 121,108,101,61,34,100,105,115,112,108,97,121,58,32,110,111,110,101,60,109,101, 116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,88,45,110,101,119,32,68, 97,116,101,40,41,46,103,101,116,84,105,109,101,40,41,32,116,121,112,101,61,34, 105,109,97,103,101,47,120,45,105,99,111,110,34,60,47,115,112,97,110,62,60,115, 112,97,110,32,99,108,97,115,115,61,34,108,97,110,103,117,97,103,101,61,34,106,97 ,118,97,115,99,114,105,112,116,119,105,110,100,111,119,46,108,111,99,97,116,105, 111,110,46,104,114,101,102,60,97,32,104,114,101,102,61,34,106,97,118,97,115,99, 114,105,112,116,58,45,45,62,13,10,60,115,99,114,105,112,116,32,116,121,112,101, 61,34,116,60,97,32,104,114,101,102,61,39,104,116,116,112,58,47,47,119,119,119,46 ,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,114,101,102,61,34,60,47, 100,105,118,62,13,10,60,100,105,118,32,99,108,97,115,115,61,34,60,115,99,114,105 ,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,34,32,114,101,108,61,34, 115,116,121,108,101,115,104,101,101,116,34,32,116,60,47,100,105,118,62,10,60,115 ,99,114,105,112,116,32,116,121,112,101,61,47,97,62,32,60,97,32,104,114,101,102, 61,34,104,116,116,112,58,47,47,32,97,108,108,111,119,84,114,97,110,115,112,97, 114,101,110,99,121,61,34,88,45,85,65,45,67,111,109,112,97,116,105,98,108,101,34, 32,99,111,110,114,101,108,97,116,105,111,110,115,104,105,112,32,98,101,116,119, 101,101,110,10,60,47,115,99,114,105,112,116,62,13,10,60,115,99,114,105,112,116, 32,60,47,97,62,60,47,108,105,62,60,47,117,108,62,60,47,100,105,118,62,97,115,115 ,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,103, 114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,60,47,97,62,60,97,32 ,104,114,101,102,61,34,104,116,116,112,58,47,47,60,47,97,62,60,47,108,105,62,60, 108,105,32,99,108,97,115,115,61,34,102,111,114,109,32,97,99,116,105,111,110,61, 34,104,116,116,112,58,47,47,60,100,105,118,32,115,116,121,108,101,61,34,100,105, 115,112,108,97,121,58,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101 ,61,34,113,34,60,116,97,98,108,101,32,119,105,100,116,104,61,34,49,48,48,37,34, 32,98,97,99,107,103,114,111,117,110,100,45,112,111,115,105,116,105,111,110,58,34 ,32,98,111,114,100,101,114,61,34,48,34,32,119,105,100,116,104,61,34,114,101,108, 61,34,115,104,111,114,116,99,117,116,32,105,99,111,110,34,32,104,54,62,60,117, 108,62,60,108,105,62,60,97,32,104,114,101,102,61,34,32,32,60,109,101,116,97,32, 104,116,116,112,45,101,113,117,105,118,61,34,99,115,115,34,32,109,101,100,105,97 ,61,34,115,99,114,101,101,110,34,32,114,101,115,112,111,110,115,105,98,108,101, 32,102,111,114,32,116,104,101,32,34,32,116,121,112,101,61,34,97,112,112,108,105, 99,97,116,105,111,110,47,34,32,115,116,121,108,101,61,34,98,97,99,107,103,114, 111,117,110,100,45,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116, 102,45,56,34,32,97,108,108,111,119,116,114,97,110,115,112,97,114,101,110,99,121, 61,34,115,116,121,108,101,115,104,101,101,116,34,32,116,121,112,101,61,34,116, 101,13,10,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,62, 60,47,115,112,97,110,62,60,115,112,97,110,32,99,108,97,115,115,61,34,48,34,32,99 ,101,108,108,115,112,97,99,105,110,103,61,34,48,34,62,59,10,60,47,115,99,114,105 ,112,116,62,10,60,115,99,114,105,112,116,32,115,111,109,101,116,105,109,101,115, 32,99,97,108,108,101,100,32,116,104,101,100,111,101,115,32,110,111,116,32,110, 101,99,101,115,115,97,114,105,108,121,70,111,114,32,109,111,114,101,32,105,110, 102,111,114,109,97,116,105,111,110,97,116,32,116,104,101,32,98,101,103,105,110, 110,105,110,103,32,111,102,32,60,33,68,79,67,84,89,80,69,32,104,116,109,108,62, 60,104,116,109,108,112,97,114,116,105,99,117,108,97,114,108,121,32,105,110,32, 116,104,101,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110,97,109, 101,61,34,106,97,118,97,115,99,114,105,112,116,58,118,111,105,100,40,48,41,59,34 ,101,102,102,101,99,116,105,118,101,110,101,115,115,32,111,102,32,116,104,101,32 ,97,117,116,111,99,111,109,112,108,101,116,101,61,34,111,102,102,34,32,103,101, 110,101,114,97,108,108,121,32,99,111,110,115,105,100,101,114,101,100,62,60,105, 110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,34,62,60,47,115, 99,114,105,112,116,62,13,10,60,115,99,114,105,112,116,116,104,114,111,117,103, 104,111,117,116,32,116,104,101,32,119,111,114,108,100,99,111,109,109,111,110,32, 109,105,115,99,111,110,99,101,112,116,105,111,110,97,115,115,111,99,105,97,116, 105,111,110,32,119,105,116,104,32,116,104,101,60,47,100,105,118,62,10,60,47,100, 105,118,62,10,60,100,105,118,32,99,100,117,114,105,110,103,32,104,105,115,32,108 ,105,102,101,116,105,109,101,44,99,111,114,114,101,115,112,111,110,100,105,110, 103,32,116,111,32,116,104,101,116,121,112,101,61,34,105,109,97,103,101,47,120,45 ,105,99,111,110,34,32,97,110,32,105,110,99,114,101,97,115,105,110,103,32,110,117 ,109,98,101,114,100,105,112,108,111,109,97,116,105,99,32,114,101,108,97,116,105, 111,110,115,97,114,101,32,111,102,116,101,110,32,99,111,110,115,105,100,101,114, 101,100,109,101,116,97,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34, 32,60,105,110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,101,120 ,97,109,112,108,101,115,32,105,110,99,108,117,100,101,32,116,104,101,34,62,60, 105,109,103,32,115,114,99,61,34,104,116,116,112,58,47,47,105,112,97,114,116,105, 99,105,112,97,116,105,111,110,32,105,110,32,116,104,101,116,104,101,32,101,115, 116,97,98,108,105,115,104,109,101,110,116,32,111,102,10,60,47,100,105,118,62,10, 60,100,105,118,32,99,108,97,115,115,61,34,38,97,109,112,59,110,98,115,112,59,38, 97,109,112,59,110,98,115,112,59,116,111,32,100,101,116,101,114,109,105,110,101, 32,119,104,101,116,104,101,114,113,117,105,116,101,32,100,105,102,102,101,114, 101,110,116,32,102,114,111,109,109,97,114,107,101,100,32,116,104,101,32,98,101, 103,105,110,110,105,110,103,100,105,115,116,97,110,99,101,32,98,101,116,119,101, 101,110,32,116,104,101,99,111,110,116,114,105,98,117,116,105,111,110,115,32,116, 111,32,116,104,101,99,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110, 32,116,104,101,119,105,100,101,108,121,32,99,111,110,115,105,100,101,114,101,100 ,32,116,111,119,97,115,32,111,110,101,32,111,102,32,116,104,101,32,102,105,114, 115,116,119,105,116,104,32,118,97,114,121,105,110,103,32,100,101,103,114,101,101 ,115,104,97,118,101,32,115,112,101,99,117,108,97,116,101,100,32,116,104,97,116, 40,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,112, 97,114,116,105,99,105,112,97,116,105,110,103,32,105,110,32,116,104,101,111,114, 105,103,105,110,97,108,108,121,32,100,101,118,101,108,111,112,101,100,101,116,97 ,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,32,116,121,112,101, 61,34,116,101,120,116,47,99,115,115,34,32,47,62,10,105,110,116,101,114,99,104,97 ,110,103,101,97,98,108,121,32,119,105,116,104,109,111,114,101,32,99,108,111,115, 101,108,121,32,114,101,108,97,116,101,100,115,111,99,105,97,108,32,97,110,100,32 ,112,111,108,105,116,105,99,97,108,116,104,97,116,32,119,111,117,108,100,32,111, 116,104,101,114,119,105,115,101,112,101,114,112,101,110,100,105,99,117,108,97, 114,32,116,111,32,116,104,101,115,116,121,108,101,32,116,121,112,101,61,34,116, 101,120,116,47,99,115,115,116,121,112,101,61,34,115,117,98,109,105,116,34,32,110 ,97,109,101,61,34,102,97,109,105,108,105,101,115,32,114,101,115,105,100,105,110, 103,32,105,110,100,101,118,101,108,111,112,105,110,103,32,99,111,117,110,116,114 ,105,101,115,99,111,109,112,117,116,101,114,32,112,114,111,103,114,97,109,109, 105,110,103,101,99,111,110,111,109,105,99,32,100,101,118,101,108,111,112,109,101 ,110,116,100,101,116,101,114,109,105,110,97,116,105,111,110,32,111,102,32,116, 104,101,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111 ,110,111,110,32,115,101,118,101,114,97,108,32,111,99,99,97,115,105,111,110,115, 112,111,114,116,117,103,117,195,170,115,32,40,69,117,114,111,112,101,117,41,208, 163,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,209, 131,208,186,209,128,208,176,209,151,208,189,209,129,209,140,208,186,208,176,208, 160,208,190,209,129,209,129,208,184,208,185,209,129,208,186,208,190,208,185,208, 188,208,176,209,130,208,181,209,128,208,184,208,176,208,187,208,190,208,178,208, 184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,208,184,209, 131,208,191,209,128,208,176,208,178,208,187,208,181,208,189,208,184,209,143,208, 189,208,181,208,190,208,177,209,133,208,190,208,180,208,184,208,188,208,190,208, 184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, 152,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,143,208, 160,208,181,209,129,208,191,209,131,208,177,208,187,208,184,208,186,208,184,208, 186,208,190,208,187,208,184,209,135,208,181,209,129,209,130,208,178,208,190,208, 184,208,189,209,132,208,190,209,128,208,188,208,176,209,134,208,184,209,142,209, 130,208,181,209,128,209,128,208,184,209,130,208,190,209,128,208,184,208,184,208, 180,208,190,209,129,209,130,208,176,209,130,208,190,209,135,208,189,208,190,216, 167,217,132,217,133,216,170,217,136,216,167,216,172,216,175,217,136,217,134,216, 167,217,132,216,167,216,180,216,170,216,177,216,167,217,131,216,167,216,170,216, 167,217,132,216,167,217,130,216,170,216,177,216,167,216,173,216,167,216,170,104, 116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,32,115,101,116, 84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,100,105,115, 112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,59,60,105,110,112 ,117,116,32,116,121,112,101,61,34,115,117,98,109,105,116,34,32,116,121,112,101, 32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,60,105,109,103,32, 115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,34,32,34,104,116,116, 112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,115,104,111,114,116,99,117, 116,32,105,99,111,110,34,32,104,114,101,102,61,34,34,32,97,117,116,111,99,111, 109,112,108,101,116,101,61,34,111,102,102,34,32,60,47,97,62,60,47,100,105,118,62 ,60,100,105,118,32,99,108,97,115,115,61,60,47,97,62,60,47,108,105,62,10,60,108, 105,32,99,108,97,115,115,61,34,99,115,115,34,32,116,121,112,101,61,34,116,101, 120,116,47,99,115,115,34,32,60,102,111,114,109,32,97,99,116,105,111,110,61,34, 104,116,116,112,58,47,47,120,116,47,99,115,115,34,32,104,114,101,102,61,34,104, 116,116,112,58,47,47,108,105,110,107,32,114,101,108,61,34,97,108,116,101,114,110 ,97,116,101,34,32,13,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116, 101,120,116,47,32,111,110,99,108,105,99,107,61,34,106,97,118,97,115,99,114,105, 112,116,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40, 41,125,104,101,105,103,104,116,61,34,49,34,32,119,105,100,116,104,61,34,49,34,32 ,80,101,111,112,108,101,39,115,32,82,101,112,117,98,108,105,99,32,111,102,32,32, 60,97,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,116,101, 120,116,45,100,101,99,111,114,97,116,105,111,110,58,117,110,100,101,114,116,104, 101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,60,47,100 ,105,118,62,10,60,47,100,105,118,62,10,60,47,100,105,118,62,10,101,115,116,97,98 ,108,105,115,104,109,101,110,116,32,111,102,32,116,104,101,32,60,47,100,105,118, 62,60,47,100,105,118,62,60,47,100,105,118,62,60,47,100,35,118,105,101,119,112, 111,114,116,123,109,105,110,45,104,101,105,103,104,116,58,10,60,115,99,114,105, 112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,111,112,116,105,111,110,62, 60,111,112,116,105,111,110,32,118,97,108,117,101,61,111,102,116,101,110,32,114, 101,102,101,114,114,101,100,32,116,111,32,97,115,32,47,111,112,116,105,111,110, 62,10,60,111,112,116,105,111,110,32,118,97,108,117,60,33,68,79,67,84,89,80,69,32 ,104,116,109,108,62,10,60,33,45,45,91,73,110,116,101,114,110,97,116,105,111,110, 97,108,32,65,105,114,112,111,114,116,62,10,60,97,32,104,114,101,102,61,34,104, 116,116,112,58,47,47,119,119,119,60,47,97,62,60,97,32,104,114,101,102,61,34,104, 116,116,112,58,47,47,119,224,184,160,224,184,178,224,184,169,224,184,178,224,185 ,132,224,184,151,224,184,162,225,131,165,225,131,144,225,131,160,225,131,151,225 ,131,163,225,131,154,225,131,152,230,173,163,233,171,148,228,184,173,230,150,135 ,32,40,231,185,129,233,171,148,41,224,164,168,224,164,191,224,164,176,224,165, 141,224,164,166,224,165,135,224,164,182,224,164,161,224,164,190,224,164,137,224, 164,168,224,164,178,224,165,139,224,164,161,224,164,149,224,165,141,224,164,183, 224,165,135,224,164,164,224,165,141,224,164,176,224,164,156,224,164,190,224,164, 168,224,164,149,224,164,190,224,164,176,224,165,128,224,164,184,224,164,130,224, 164,172,224,164,130,224,164,167,224,164,191,224,164,164,224,164,184,224,165,141, 224,164,165,224,164,190,224,164,170,224,164,168,224,164,190,224,164,184,224,165, 141,224,164,181,224,165,128,224,164,149,224,164,190,224,164,176,224,164,184,224, 164,130,224,164,184,224,165,141,224,164,149,224,164,176,224,164,163,224,164,184, 224,164,190,224,164,174,224,164,151,224,165,141,224,164,176,224,165,128,224,164, 154,224,164,191,224,164,159,224,165,141,224,164,160,224,165,139,224,164,130,224, 164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164,168, 224,164,133,224,164,174,224,165,135,224,164,176,224,164,191,224,164,149,224,164, 190,224,164,181,224,164,191,224,164,173,224,164,191,224,164,168,224,165,141,224, 164,168,224,164,151,224,164,190,224,164,161,224,164,191,224,164,175,224,164,190, 224,164,129,224,164,149,224,165,141,224,164,175,224,165,139,224,164,130,224,164, 149,224,164,191,224,164,184,224,165,129,224,164,176,224,164,149,224,165,141,224, 164,183,224,164,190,224,164,170,224,164,185,224,165,129,224,164,129,224,164,154, 224,164,164,224,165,128,224,164,170,224,165,141,224,164,176,224,164,172,224,164, 130,224,164,167,224,164,168,224,164,159,224,164,191,224,164,170,224,165,141,224, 164,170,224,164,163,224,165,128,224,164,149,224,165,141,224,164,176,224,164,191, 224,164,149,224,165,135,224,164,159,224,164,170,224,165,141,224,164,176,224,164, 190,224,164,176,224,164,130,224,164,173,224,164,170,224,165,141,224,164,176,224, 164,190,224,164,170,224,165,141,224,164,164,224,164,174,224,164,190,224,164,178, 224,164,191,224,164,149,224,165,139,224,164,130,224,164,176,224,164,171,224,164, 188,224,165,141,224,164,164,224,164,190,224,164,176,224,164,168,224,164,191,224, 164,176,224,165,141,224,164,174,224,164,190,224,164,163,224,164,178,224,164,191, 224,164,174,224,164,191,224,164,159,224,165,135,224,164,161,100,101,115,99,114, 105,112,116,105,111,110,34,32,99,111,110,116,101,110,116,61,34,100,111,99,117, 109,101,110,116,46,108,111,99,97,116,105,111,110,46,112,114,111,116,46,103,101, 116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,60,33,68,79 ,67,84,89,80,69,32,104,116,109,108,62,10,60,104,116,109,108,32,60,109,101,116,97 ,32,99,104,97,114,115,101,116,61,34,117,116,102,45,56,34,62,58,117,114,108,34,32 ,99,111,110,116,101,110,116,61,34,104,116,116,112,58,47,47,46,99,115,115,34,32, 114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,115,116,121,108,101 ,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,62,116,121,112,101,61 ,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,119,51,46,111,114, 103,47,49,57,57,57,47,120,104,116,109,108,34,32,120,109,108,116,121,112,101,61, 34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,109,101,116,104 ,111,100,61,34,103,101,116,34,32,97,99,116,105,111,110,61,34,108,105,110,107,32, 114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,32,61,32,100,111 ,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,116,121,112, 101,61,34,105,109,97,103,101,47,120,45,105,99,111,110,34,32,47,62,99,101,108,108 ,112,97,100,100,105,110,103,61,34,48,34,32,99,101,108,108,115,112,46,99,115,115, 34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,60,47,97,62,60, 47,108,105,62,60,108,105,62,60,97,32,104,114,101,102,61,34,34,32,119,105,100,116 ,104,61,34,49,34,32,104,101,105,103,104,116,61,34,49,34,34,62,60,97,32,104,114, 101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,121,108,101,61,34, 100,105,115,112,108,97,121,58,110,111,110,101,59,34,62,97,108,116,101,114,110,97 ,116,101,34,32,116,121,112,101,61,34,97,112,112,108,105,45,47,47,87,51,67,47,47, 68,84,68,32,88,72,84,77,76,32,49,46,48,32,101,108,108,115,112,97,99,105,110,103, 61,34,48,34,32,99,101,108,108,112,97,100,32,116,121,112,101,61,34,104,105,100, 100,101,110,34,32,118,97,108,117,101,61,34,47,97,62,38,110,98,115,112,59,60,115, 112,97,110,32,114,111,108,101,61,34,115,10,60,105,110,112,117,116,32,116,121,112 ,101,61,34,104,105,100,100,101,110,34,32,108,97,110,103,117,97,103,101,61,34,74, 97,118,97,83,99,114,105,112,116,34,32,32,100,111,99,117,109,101,110,116,46,103, 101,116,69,108,101,109,101,110,116,115,66,103,61,34,48,34,32,99,101,108,108,115, 112,97,99,105,110,103,61,34,48,34,32,121,112,101,61,34,116,101,120,116,47,99,115 ,115,34,32,109,101,100,105,97,61,34,116,121,112,101,61,39,116,101,120,116,47,106 ,97,118,97,115,99,114,105,112,116,39,119,105,116,104,32,116,104,101,32,101,120, 99,101,112,116,105,111,110,32,111,102,32,121,112,101,61,34,116,101,120,116,47,99 ,115,115,34,32,114,101,108,61,34,115,116,32,104,101,105,103,104,116,61,34,49,34, 32,119,105,100,116,104,61,34,49,34,32,61,39,43,101,110,99,111,100,101,85,82,73, 67,111,109,112,111,110,101,110,116,40,60,108,105,110,107,32,114,101,108,61,34,97 ,108,116,101,114,110,97,116,101,34,32,10,98,111,100,121,44,32,116,114,44,32,105, 110,112,117,116,44,32,116,101,120,116,109,101,116,97,32,110,97,109,101,61,34,114 ,111,98,111,116,115,34,32,99,111,110,109,101,116,104,111,100,61,34,112,111,115, 116,34,32,97,99,116,105,111,110,61,34,62,10,60,97,32,104,114,101,102,61,34,104, 116,116,112,58,47,47,119,119,119,46,99,115,115,34,32,114,101,108,61,34,115,116, 121,108,101,115,104,101,101,116,34,32,60,47,100,105,118,62,60,47,100,105,118,62, 60,100,105,118,32,99,108,97,115,115,108,97,110,103,117,97,103,101,61,34,106,97, 118,97,115,99,114,105,112,116,34,62,97,114,105,97,45,104,105,100,100,101,110,61, 34,116,114,117,101,34,62,194,183,60,114,105,112,116,34,32,116,121,112,101,61,34, 116,101,120,116,47,106,97,118,97,115,108,61,48,59,125,41,40,41,59,10,40,102,117, 110,99,116,105,111,110,40,41,123,98,97,99,107,103,114,111,117,110,100,45,105,109 ,97,103,101,58,32,117,114,108,40,47,97,62,60,47,108,105,62,60,108,105,62,60,97, 32,104,114,101,102,61,34,104,9,9,60,108,105,62,60,97,32,104,114,101,102,61,34, 104,116,116,112,58,47,47,97,116,111,114,34,32,97,114,105,97,45,104,105,100,100, 101,110,61,34,116,114,117,62,32,60,97,32,104,114,101,102,61,34,104,116,116,112, 58,47,47,119,119,119,46,108,97,110,103,117,97,103,101,61,34,106,97,118,97,115,99 ,114,105,112,116,34,32,47,111,112,116,105,111,110,62,10,60,111,112,116,105,111, 110,32,118,97,108,117,101,47,100,105,118,62,60,47,100,105,118,62,60,100,105,118, 32,99,108,97,115,115,61,114,97,116,111,114,34,32,97,114,105,97,45,104,105,100, 100,101,110,61,34,116,114,101,61,40,110,101,119,32,68,97,116,101,41,46,103,101, 116,84,105,109,101,40,41,112,111,114,116,117,103,117,195,170,115,32,40,100,111, 32,66,114,97,115,105,108,41,208,190,209,128,208,179,208,176,208,189,208,184,208, 183,208,176,209,134,208,184,208,184,208,178,208,190,208,183,208,188,208,190,208, 182,208,189,208,190,209,129,209,130,209,140,208,190,208,177,209,128,208,176,208, 183,208,190,208,178,208,176,208,189,208,184,209,143,209,128,208,181,208,179,208, 184,209,129,209,130,209,128,208,176,209,134,208,184,208,184,208,178,208,190,208, 183,208,188,208,190,208,182,208,189,208,190,209,129,209,130,208,184,208,190,208, 177,209,143,208,183,208,176,209,130,208,181,208,187,209,140,208,189,208,176,60, 33,68,79,67,84,89,80,69,32,104,116,109,108,32,80,85,66,76,73,67,32,34,110,116,45 ,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,60,109 ,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101, 114,97,110,115,105,116,105,111,110,97,108,47,47,69,78,34,32,34,104,116,116,112, 58,60,104,116,109,108,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119, 119,119,45,47,47,87,51,67,47,47,68,84,68,32,88,72,84,77,76,32,49,46,48,32,84,68, 84,68,47,120,104,116,109,108,49,45,116,114,97,110,115,105,116,105,111,110,97,108 ,47,47,119,119,119,46,119,51,46,111,114,103,47,84,82,47,120,104,116,109,108,49, 47,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116, 39,59,60,109,101,116,97,32,110,97,109,101,61,34,100,101,115,99,114,105,112,116, 105,111,110,112,97,114,101,110,116,78,111,100,101,46,105,110,115,101,114,116,66, 101,102,111,114,101,60,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100, 100,101,110,34,32,110,97,106,115,34,32,116,121,112,101,61,34,116,101,120,116,47, 106,97,118,97,115,99,114,105,40,100,111,99,117,109,101,110,116,41,46,114,101,97, 100,121,40,102,117,110,99,116,105,115,99,114,105,112,116,32,116,121,112,101,61, 34,116,101,120,116,47,106,97,118,97,115,105,109,97,103,101,34,32,99,111,110,116, 101,110,116,61,34,104,116,116,112,58,47,47,85,65,45,67,111,109,112,97,116,105,98 ,108,101,34,32,99,111,110,116,101,110,116,61,116,109,108,59,32,99,104,97,114,115 ,101,116,61,117,116,102,45,56,34,32,47,62,10,108,105,110,107,32,114,101,108,61, 34,115,104,111,114,116,99,117,116,32,105,99,111,110,60,108,105,110,107,32,114, 101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,32,60,47,115,99,114,105 ,112,116,62,10,60,115,99,114,105,112,116,32,116,121,112,101,61,61,32,100,111,99, 117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,60,97,32,116 ,97,114,103,101,116,61,34,95,98,108,97,110,107,34,32,104,114,101,102,61,32,100, 111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,115,66,105, 110,112,117,116,32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61 ,97,46,116,121,112,101,32,61,32,39,116,101,120,116,47,106,97,118,97,115,99,114, 105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110,34,32,110, 97,109,101,104,116,109,108,59,32,99,104,97,114,115,101,116,61,117,116,102,45,56, 34,32,47,62,100,116,100,34,62,10,60,104,116,109,108,32,120,109,108,110,115,61,34 ,104,116,116,112,45,47,47,87,51,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49, 32,84,101,110,116,115,66,121,84,97,103,78,97,109,101,40,39,115,99,114,105,112, 116,39,41,105,110,112,117,116,32,116,121,112,101,61,34,104,105,100,100,101,110, 34,32,110,97,109,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120, 116,47,106,97,118,97,115,34,32,115,116,121,108,101,61,34,100,105,115,112,108,97, 121,58,110,111,110,101,59,34,62,100,111,99,117,109,101,110,116,46,103,101,116,69 ,108,101,109,101,110,116,66,121,73,100,40,61,100,111,99,117,109,101,110,116,46, 99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,32,116,121,112,101,61,39, 116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,105,110,112,117,116, 32,116,121,112,101,61,34,116,101,120,116,34,32,110,97,109,101,61,34,100,46,103, 101,116,69,108,101,109,101,110,116,115,66,121,84,97,103,78,97,109,101,40,115,110 ,105,99,97,108,34,32,104,114,101,102,61,34,104,116,116,112,58,47,47,119,119,119, 46,67,47,47,68,84,68,32,72,84,77,76,32,52,46,48,49,32,84,114,97,110,115,105,116, 60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34 ,62,10,10,60,115,116,121,108,101,32,116,121,112,101,61,34,116,101,120,116,47,99, 115,115,34,62,105,111,110,97,108,46,100,116,100,34,62,10,60,104,116,109,108,32, 120,109,108,110,115,61,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110, 116,101,110,116,45,84,121,112,101,100,105,110,103,61,34,48,34,32,99,101,108,108, 115,112,97,99,105,110,103,61,34,48,34,104,116,109,108,59,32,99,104,97,114,115, 101,116,61,117,116,102,45,56,34,32,47,62,10,32,115,116,121,108,101,61,34,100,105 ,115,112,108,97,121,58,110,111,110,101,59,34,62,60,60,108,105,62,60,97,32,104, 114,101,102,61,34,104,116,116,112,58,47,47,119,119,119,46,32,116,121,112,101,61, 39,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,39,62,208,180,208,181 ,209,143,209,130,208,181,208,187,209,140,208,189,208,190,209,129,209,130,208,184 ,209,129,208,190,208,190,209,130,208,178,208,181,209,130,209,129,209,130,208,178 ,208,184,208,184,208,191,209,128,208,190,208,184,208,183,208,178,208,190,208,180 ,209,129,209,130,208,178,208,176,208,177,208,181,208,183,208,190,208,191,208,176 ,209,129,208,189,208,190,209,129,209,130,208,184,224,164,170,224,165,129,224,164 ,184,224,165,141,224,164,164,224,164,191,224,164,149,224,164,190,224,164,149,224 ,164,190,224,164,130,224,164,151,224,165,141,224,164,176,224,165,135,224,164,184 ,224,164,137,224,164,168,224,165,141,224,164,185,224,165,139,224,164,130,224,164 ,168,224,165,135,224,164,181,224,164,191,224,164,167,224,164,190,224,164,168,224 ,164,184,224,164,173,224,164,190,224,164,171,224,164,191,224,164,149,224,165,141 ,224,164,184,224,164,191,224,164,130,224,164,151,224,164,184,224,165,129,224,164 ,176,224,164,149,224,165,141,224,164,183,224,164,191,224,164,164,224,164,149,224 ,165,137,224,164,170,224,165,128,224,164,176,224,164,190,224,164,135,224,164,159 ,224,164,181,224,164,191,224,164,156,224,165,141,224,164,158,224,164,190,224,164 ,170,224,164,168,224,164,149,224,164,190,224,164,176,224,165,141,224,164,176,224 ,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176 ,224,164,191,224,164,175,224,164,164,224,164,190 } ; #endif /* !BROTLI_EXTERNAL_DICTIONARY_DATA */ static BrotliDictionary kBrotliDictionary = { /* size_bits_by_length */ { 0, 0, 0, 0, 10, 10, 11, 11, 10, 10, 10, 10, 10, 9, 9, 8, 7, 7, 8, 7, 7, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 }, /* offsets_by_length */ { 0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032, 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536, 115968, 118528, 119872, 121280, 122016, 122784, 122784, 122784, 122784, 122784, 122784, 122784 }, /* data_size == sizeof(kBrotliDictionaryData) */ 122784, /* data */ #if defined(BROTLI_EXTERNAL_DICTIONARY_DATA) NULL #else kBrotliDictionaryData #endif }; const BrotliDictionary* BrotliGetDictionary() { return &kBrotliDictionary; } void BrotliSetDictionaryData(const uint8_t* data) { if (!!data && !kBrotliDictionary.data) { kBrotliDictionary.data = data; } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/common/transform.h0000664000175000017500000000563013510660062016027 00000000000000/* transforms is a part of ABI, but not API. It means that there are some functions that are supposed to be in "common" library, but header itself is not placed into include/brotli. This way, aforementioned functions will be available only to brotli internals. */ #ifndef BROTLI_COMMON_TRANSFORM_H_ #define BROTLI_COMMON_TRANSFORM_H_ #include #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif enum BrotliWordTransformType { BROTLI_TRANSFORM_IDENTITY = 0, BROTLI_TRANSFORM_OMIT_LAST_1 = 1, BROTLI_TRANSFORM_OMIT_LAST_2 = 2, BROTLI_TRANSFORM_OMIT_LAST_3 = 3, BROTLI_TRANSFORM_OMIT_LAST_4 = 4, BROTLI_TRANSFORM_OMIT_LAST_5 = 5, BROTLI_TRANSFORM_OMIT_LAST_6 = 6, BROTLI_TRANSFORM_OMIT_LAST_7 = 7, BROTLI_TRANSFORM_OMIT_LAST_8 = 8, BROTLI_TRANSFORM_OMIT_LAST_9 = 9, BROTLI_TRANSFORM_UPPERCASE_FIRST = 10, BROTLI_TRANSFORM_UPPERCASE_ALL = 11, BROTLI_TRANSFORM_OMIT_FIRST_1 = 12, BROTLI_TRANSFORM_OMIT_FIRST_2 = 13, BROTLI_TRANSFORM_OMIT_FIRST_3 = 14, BROTLI_TRANSFORM_OMIT_FIRST_4 = 15, BROTLI_TRANSFORM_OMIT_FIRST_5 = 16, BROTLI_TRANSFORM_OMIT_FIRST_6 = 17, BROTLI_TRANSFORM_OMIT_FIRST_7 = 18, BROTLI_TRANSFORM_OMIT_FIRST_8 = 19, BROTLI_TRANSFORM_OMIT_FIRST_9 = 20, BROTLI_NUM_TRANSFORM_TYPES /* Counts transforms, not a transform itself. */ }; #define BROTLI_TRANSFORMS_MAX_CUT_OFF BROTLI_TRANSFORM_OMIT_LAST_9 typedef struct BrotliTransforms { uint16_t prefix_suffix_size; /* Last character must be null, so prefix_suffix_size must be at least 1. */ const uint8_t* prefix_suffix; const uint16_t* prefix_suffix_map; uint32_t num_transforms; /* Each entry is a [prefix_id, transform, suffix_id] triplet. */ const uint8_t* transforms; /* Indices of transforms like ["", BROTLI_TRANSFORM_OMIT_LAST_#, ""]. 0-th element corresponds to ["", BROTLI_TRANSFORM_IDENTITY, ""]. -1, if cut-off transform does not exist. */ int16_t cutOffTransforms[BROTLI_TRANSFORMS_MAX_CUT_OFF + 1]; } BrotliTransforms; /* T is BrotliTransforms*; result is uint8_t. */ #define BROTLI_TRANSFORM_PREFIX_ID(T, I) ((T)->transforms[((I) * 3) + 0]) #define BROTLI_TRANSFORM_TYPE(T, I) ((T)->transforms[((I) * 3) + 1]) #define BROTLI_TRANSFORM_SUFFIX_ID(T, I) ((T)->transforms[((I) * 3) + 2]) /* T is BrotliTransforms*; result is const uint8_t*. */ #define BROTLI_TRANSFORM_PREFIX(T, I) (&(T)->prefix_suffix[ \ (T)->prefix_suffix_map[BROTLI_TRANSFORM_PREFIX_ID(T, I)]]) #define BROTLI_TRANSFORM_SUFFIX(T, I) (&(T)->prefix_suffix[ \ (T)->prefix_suffix_map[BROTLI_TRANSFORM_SUFFIX_ID(T, I)]]) BROTLI_COMMON_API const BrotliTransforms* BrotliGetTransforms(void); BROTLI_COMMON_API int BrotliTransformDictionaryWord( uint8_t* dst, const uint8_t* word, int len, const BrotliTransforms* transforms, int transform_idx); #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_COMMON_TRANSFORM_H_ */ dvisvgm-2.8.1/libs/brotli/common/version.h0000664000175000017500000000154713510660062015504 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Version definition. */ #ifndef BROTLI_COMMON_VERSION_H_ #define BROTLI_COMMON_VERSION_H_ /* This macro should only be used when library is compiled together with client. If library is dynamically linked, use BrotliDecoderVersion and BrotliEncoderVersion methods. */ /* Semantic version, calculated as (MAJOR << 24) | (MINOR << 12) | PATCH */ #define BROTLI_VERSION 0x1000007 /* This macro is used by build system to produce Libtool-friendly soname. See https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html */ /* ABI version, calculated as (CURRENT << 24) | (REVISION << 12) | AGE */ #define BROTLI_ABI_VERSION 0x1007000 #endif /* BROTLI_COMMON_VERSION_H_ */ dvisvgm-2.8.1/libs/brotli/common/constants.h0000664000175000017500000000461613510660062016033 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ #ifndef BROTLI_COMMON_CONSTANTS_H_ #define BROTLI_COMMON_CONSTANTS_H_ /* Specification: 7.3. Encoding of the context map */ #define BROTLI_CONTEXT_MAP_MAX_RLE 16 /* Specification: 2. Compressed representation overview */ #define BROTLI_MAX_NUMBER_OF_BLOCK_TYPES 256 /* Specification: 3.3. Alphabet sizes: insert-and-copy length */ #define BROTLI_NUM_LITERAL_SYMBOLS 256 #define BROTLI_NUM_COMMAND_SYMBOLS 704 #define BROTLI_NUM_BLOCK_LEN_SYMBOLS 26 #define BROTLI_MAX_CONTEXT_MAP_SYMBOLS (BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + \ BROTLI_CONTEXT_MAP_MAX_RLE) #define BROTLI_MAX_BLOCK_TYPE_SYMBOLS (BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + 2) /* Specification: 3.5. Complex prefix codes */ #define BROTLI_REPEAT_PREVIOUS_CODE_LENGTH 16 #define BROTLI_REPEAT_ZERO_CODE_LENGTH 17 #define BROTLI_CODE_LENGTH_CODES (BROTLI_REPEAT_ZERO_CODE_LENGTH + 1) /* "code length of 8 is repeated" */ #define BROTLI_INITIAL_REPEATED_CODE_LENGTH 8 /* "Large Window Brotli" */ #define BROTLI_LARGE_MAX_DISTANCE_BITS 62U #define BROTLI_LARGE_MIN_WBITS 10 #define BROTLI_LARGE_MAX_WBITS 30 /* Specification: 4. Encoding of distances */ #define BROTLI_NUM_DISTANCE_SHORT_CODES 16 #define BROTLI_MAX_NPOSTFIX 3 #define BROTLI_MAX_NDIRECT 120 #define BROTLI_MAX_DISTANCE_BITS 24U #define BROTLI_DISTANCE_ALPHABET_SIZE(NPOSTFIX, NDIRECT, MAXNBITS) ( \ BROTLI_NUM_DISTANCE_SHORT_CODES + (NDIRECT) + \ ((MAXNBITS) << ((NPOSTFIX) + 1))) /* BROTLI_NUM_DISTANCE_SYMBOLS == 1128 */ #define BROTLI_NUM_DISTANCE_SYMBOLS \ BROTLI_DISTANCE_ALPHABET_SIZE( \ BROTLI_MAX_NDIRECT, BROTLI_MAX_NPOSTFIX, BROTLI_LARGE_MAX_DISTANCE_BITS) #define BROTLI_MAX_DISTANCE 0x3FFFFFC #define BROTLI_MAX_ALLOWED_DISTANCE 0x7FFFFFFC /* 7.1. Context modes and context ID lookup for literals */ /* "context IDs for literals are in the range of 0..63" */ #define BROTLI_LITERAL_CONTEXT_BITS 6 /* 7.2. Context ID for distances */ #define BROTLI_DISTANCE_CONTEXT_BITS 2 /* 9.1. Format of the Stream Header */ /* Number of slack bytes for window size. Don't confuse with BROTLI_NUM_DISTANCE_SHORT_CODES. */ #define BROTLI_WINDOW_GAP 16 #define BROTLI_MAX_BACKWARD_LIMIT(W) (((size_t)1 << (W)) - BROTLI_WINDOW_GAP) #endif /* BROTLI_COMMON_CONSTANTS_H_ */ dvisvgm-2.8.1/libs/brotli/common/context.h0000664000175000017500000003006713510660062015502 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Lookup table to map the previous two bytes to a context id. There are four different context modeling modes defined here: CONTEXT_LSB6: context id is the least significant 6 bits of the last byte, CONTEXT_MSB6: context id is the most significant 6 bits of the last byte, CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text, CONTEXT_SIGNED: second-order context model tuned for signed integers. If |p1| and |p2| are the previous two bytes, and |mode| is current context mode, we calculate the context as: context = ContextLut(mode)[p1] | ContextLut(mode)[p2 + 256]. For CONTEXT_UTF8 mode, if the previous two bytes are ASCII characters (i.e. < 128), this will be equivalent to context = 4 * context1(p1) + context2(p2), where context1 is based on the previous byte in the following way: 0 : non-ASCII control 1 : \t, \n, \r 2 : space 3 : other punctuation 4 : " ' 5 : % 6 : ( < [ { 7 : ) > ] } 8 : , ; : 9 : . 10 : = 11 : number 12 : upper-case vowel 13 : upper-case consonant 14 : lower-case vowel 15 : lower-case consonant and context2 is based on the second last byte: 0 : control, space 1 : punctuation 2 : upper-case letter, number 3 : lower-case letter If the last byte is ASCII, and the second last byte is not (in a valid UTF8 stream it will be a continuation byte, value between 128 and 191), the context is the same as if the second last byte was an ASCII control or space. If the last byte is a UTF8 lead byte (value >= 192), then the next byte will be a continuation byte and the context id is 2 or 3 depending on the LSB of the last byte and to a lesser extent on the second last byte if it is ASCII. If the last byte is a UTF8 continuation byte, the second last byte can be: - continuation byte: the next byte is probably ASCII or lead byte (assuming 4-byte UTF8 characters are rare) and the context id is 0 or 1. - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1 - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3 The possible value combinations of the previous two bytes, the range of context ids and the type of the next byte is summarized in the table below: |--------\-----------------------------------------------------------------| | \ Last byte | | Second \---------------------------------------------------------------| | last byte \ ASCII | cont. byte | lead byte | | \ (0-127) | (128-191) | (192-) | |=============|===================|=====================|==================| | ASCII | next: ASCII/lead | not valid | next: cont. | | (0-127) | context: 4 - 63 | | context: 2 - 3 | |-------------|-------------------|---------------------|------------------| | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. | | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 | |-------------|-------------------|---------------------|------------------| | lead byte | not valid | next: ASCII/lead | not valid | | (192-207) | | context: 0 - 1 | | |-------------|-------------------|---------------------|------------------| | lead byte | not valid | next: cont. | not valid | | (208-) | | context: 2 - 3 | | |-------------|-------------------|---------------------|------------------| */ #ifndef BROTLI_COMMON_CONTEXT_H_ #define BROTLI_COMMON_CONTEXT_H_ #include typedef enum ContextType { CONTEXT_LSB6 = 0, CONTEXT_MSB6 = 1, CONTEXT_UTF8 = 2, CONTEXT_SIGNED = 3 } ContextType; /* Common context lookup table for all context modes. */ static const uint8_t kContextLookup[2048] = { /* CONTEXT_LSB6, last byte. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* CONTEXT_LSB6, second last byte, */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* CONTEXT_MSB6, last byte. */ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, /* CONTEXT_MSB6, second last byte, */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* CONTEXT_UTF8, last byte. */ /* ASCII range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, /* UTF8 continuation byte range. */ 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, /* UTF8 lead byte range. */ 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, /* CONTEXT_UTF8 second last byte. */ /* ASCII range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, /* UTF8 continuation byte range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* UTF8 lead byte range. */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */ 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, /* CONTEXT_SIGNED, second last byte. */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, }; typedef const uint8_t* ContextLut; /* typeof(MODE) == ContextType; returns ContextLut */ #define BROTLI_CONTEXT_LUT(MODE) (&kContextLookup[(MODE) << 9]) /* typeof(LUT) == ContextLut */ #define BROTLI_CONTEXT(P1, P2, LUT) ((LUT)[P1] | ((LUT) + 256)[P2]) #endif /* BROTLI_COMMON_CONTEXT_H_ */ dvisvgm-2.8.1/libs/brotli/common/transform.c0000664000175000017500000002002313510660062016013 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ #include "./transform.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif /* RFC 7932 transforms string data */ static const char kPrefixSuffix[217] = "\1 \2, \10 of the \4 of \2s \1.\5 and \4 " /* 0x _0 _2 __5 _E _3 _6 _8 _E */ "in \1\"\4 to \2\">\1\n\2. \1]\5 for \3 a \6 " /* 2x _3_ _5 _A_ _D_ _F _2 _4 _A _E */ "that \1\'\6 with \6 from \4 by \1(\6. T" /* 4x _5_ _7 _E _5 _A _C */ "he \4 on \4 as \4 is \4ing \2\n\t\1:\3ed " /* 6x _3 _8 _D _2 _7_ _ _A _C */ "\2=\"\4 at \3ly \1,\2=\'\5.com/\7. This \5" /* 8x _0 _ _3 _8 _C _E _ _1 _7 _F */ " not \3er \3al \4ful \4ive \5less \4es" /* Ax _5 _9 _D _2 _7 _D */ "t \4ize \2\xc2\xa0\4ous \5 the \2e \0"; /* Cx _2 _7___ ___ _A _F _5 _8 */ static const uint16_t kPrefixSuffixMap[50] = { 0x00, 0x02, 0x05, 0x0E, 0x13, 0x16, 0x18, 0x1E, 0x23, 0x25, 0x2A, 0x2D, 0x2F, 0x32, 0x34, 0x3A, 0x3E, 0x45, 0x47, 0x4E, 0x55, 0x5A, 0x5C, 0x63, 0x68, 0x6D, 0x72, 0x77, 0x7A, 0x7C, 0x80, 0x83, 0x88, 0x8C, 0x8E, 0x91, 0x97, 0x9F, 0xA5, 0xA9, 0xAD, 0xB2, 0xB7, 0xBD, 0xC2, 0xC7, 0xCA, 0xCF, 0xD5, 0xD8 }; /* RFC 7932 transforms */ static const uint8_t kTransformsData[] = { 49, BROTLI_TRANSFORM_IDENTITY, 49, 49, BROTLI_TRANSFORM_IDENTITY, 0, 0, BROTLI_TRANSFORM_IDENTITY, 0, 49, BROTLI_TRANSFORM_OMIT_FIRST_1, 49, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 0, 49, BROTLI_TRANSFORM_IDENTITY, 47, 0, BROTLI_TRANSFORM_IDENTITY, 49, 4, BROTLI_TRANSFORM_IDENTITY, 0, 49, BROTLI_TRANSFORM_IDENTITY, 3, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 49, 49, BROTLI_TRANSFORM_IDENTITY, 6, 49, BROTLI_TRANSFORM_OMIT_FIRST_2, 49, 49, BROTLI_TRANSFORM_OMIT_LAST_1, 49, 1, BROTLI_TRANSFORM_IDENTITY, 0, 49, BROTLI_TRANSFORM_IDENTITY, 1, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 0, 49, BROTLI_TRANSFORM_IDENTITY, 7, 49, BROTLI_TRANSFORM_IDENTITY, 9, 48, BROTLI_TRANSFORM_IDENTITY, 0, 49, BROTLI_TRANSFORM_IDENTITY, 8, 49, BROTLI_TRANSFORM_IDENTITY, 5, 49, BROTLI_TRANSFORM_IDENTITY, 10, 49, BROTLI_TRANSFORM_IDENTITY, 11, 49, BROTLI_TRANSFORM_OMIT_LAST_3, 49, 49, BROTLI_TRANSFORM_IDENTITY, 13, 49, BROTLI_TRANSFORM_IDENTITY, 14, 49, BROTLI_TRANSFORM_OMIT_FIRST_3, 49, 49, BROTLI_TRANSFORM_OMIT_LAST_2, 49, 49, BROTLI_TRANSFORM_IDENTITY, 15, 49, BROTLI_TRANSFORM_IDENTITY, 16, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 49, 49, BROTLI_TRANSFORM_IDENTITY, 12, 5, BROTLI_TRANSFORM_IDENTITY, 49, 0, BROTLI_TRANSFORM_IDENTITY, 1, 49, BROTLI_TRANSFORM_OMIT_FIRST_4, 49, 49, BROTLI_TRANSFORM_IDENTITY, 18, 49, BROTLI_TRANSFORM_IDENTITY, 17, 49, BROTLI_TRANSFORM_IDENTITY, 19, 49, BROTLI_TRANSFORM_IDENTITY, 20, 49, BROTLI_TRANSFORM_OMIT_FIRST_5, 49, 49, BROTLI_TRANSFORM_OMIT_FIRST_6, 49, 47, BROTLI_TRANSFORM_IDENTITY, 49, 49, BROTLI_TRANSFORM_OMIT_LAST_4, 49, 49, BROTLI_TRANSFORM_IDENTITY, 22, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 49, 49, BROTLI_TRANSFORM_IDENTITY, 23, 49, BROTLI_TRANSFORM_IDENTITY, 24, 49, BROTLI_TRANSFORM_IDENTITY, 25, 49, BROTLI_TRANSFORM_OMIT_LAST_7, 49, 49, BROTLI_TRANSFORM_OMIT_LAST_1, 26, 49, BROTLI_TRANSFORM_IDENTITY, 27, 49, BROTLI_TRANSFORM_IDENTITY, 28, 0, BROTLI_TRANSFORM_IDENTITY, 12, 49, BROTLI_TRANSFORM_IDENTITY, 29, 49, BROTLI_TRANSFORM_OMIT_FIRST_9, 49, 49, BROTLI_TRANSFORM_OMIT_FIRST_7, 49, 49, BROTLI_TRANSFORM_OMIT_LAST_6, 49, 49, BROTLI_TRANSFORM_IDENTITY, 21, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 1, 49, BROTLI_TRANSFORM_OMIT_LAST_8, 49, 49, BROTLI_TRANSFORM_IDENTITY, 31, 49, BROTLI_TRANSFORM_IDENTITY, 32, 47, BROTLI_TRANSFORM_IDENTITY, 3, 49, BROTLI_TRANSFORM_OMIT_LAST_5, 49, 49, BROTLI_TRANSFORM_OMIT_LAST_9, 49, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 1, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 8, 5, BROTLI_TRANSFORM_IDENTITY, 21, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 0, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 10, 49, BROTLI_TRANSFORM_IDENTITY, 30, 0, BROTLI_TRANSFORM_IDENTITY, 5, 35, BROTLI_TRANSFORM_IDENTITY, 49, 47, BROTLI_TRANSFORM_IDENTITY, 2, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 17, 49, BROTLI_TRANSFORM_IDENTITY, 36, 49, BROTLI_TRANSFORM_IDENTITY, 33, 5, BROTLI_TRANSFORM_IDENTITY, 0, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 21, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 5, 49, BROTLI_TRANSFORM_IDENTITY, 37, 0, BROTLI_TRANSFORM_IDENTITY, 30, 49, BROTLI_TRANSFORM_IDENTITY, 38, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 0, 49, BROTLI_TRANSFORM_IDENTITY, 39, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 49, 49, BROTLI_TRANSFORM_IDENTITY, 34, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 8, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 12, 0, BROTLI_TRANSFORM_IDENTITY, 21, 49, BROTLI_TRANSFORM_IDENTITY, 40, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 12, 49, BROTLI_TRANSFORM_IDENTITY, 41, 49, BROTLI_TRANSFORM_IDENTITY, 42, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 17, 49, BROTLI_TRANSFORM_IDENTITY, 43, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 5, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 10, 0, BROTLI_TRANSFORM_IDENTITY, 34, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 33, 49, BROTLI_TRANSFORM_IDENTITY, 44, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 5, 45, BROTLI_TRANSFORM_IDENTITY, 49, 0, BROTLI_TRANSFORM_IDENTITY, 33, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 30, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 30, 49, BROTLI_TRANSFORM_IDENTITY, 46, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 1, 49, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 33, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 30, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 1, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 33, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 21, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 12, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 5, 49, BROTLI_TRANSFORM_UPPERCASE_ALL, 34, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 12, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 30, 0, BROTLI_TRANSFORM_UPPERCASE_ALL, 34, 0, BROTLI_TRANSFORM_UPPERCASE_FIRST, 34, }; static BrotliTransforms kBrotliTransforms = { sizeof(kPrefixSuffix), (const uint8_t*)kPrefixSuffix, kPrefixSuffixMap, sizeof(kTransformsData) / (3 * sizeof(kTransformsData[0])), kTransformsData, {0, 12, 27, 23, 42, 63, 56, 48, 59, 64} }; const BrotliTransforms* BrotliGetTransforms(void) { return &kBrotliTransforms; } static int ToUpperCase(uint8_t* p) { if (p[0] < 0xC0) { if (p[0] >= 'a' && p[0] <= 'z') { p[0] ^= 32; } return 1; } /* An overly simplified uppercasing model for UTF-8. */ if (p[0] < 0xE0) { p[1] ^= 32; return 2; } /* An arbitrary transform for three byte characters. */ p[2] ^= 5; return 3; } int BrotliTransformDictionaryWord(uint8_t* dst, const uint8_t* word, int len, const BrotliTransforms* transforms, int transform_idx) { int idx = 0; const uint8_t* prefix = BROTLI_TRANSFORM_PREFIX(transforms, transform_idx); uint8_t type = BROTLI_TRANSFORM_TYPE(transforms, transform_idx); const uint8_t* suffix = BROTLI_TRANSFORM_SUFFIX(transforms, transform_idx); { int prefix_len = *prefix++; while (prefix_len--) { dst[idx++] = *prefix++; } } { const int t = type; int i = 0; if (t <= BROTLI_TRANSFORM_OMIT_LAST_9) { len -= t; } else if (t >= BROTLI_TRANSFORM_OMIT_FIRST_1 && t <= BROTLI_TRANSFORM_OMIT_FIRST_9) { int skip = t - (BROTLI_TRANSFORM_OMIT_FIRST_1 - 1); word += skip; len -= skip; } while (i < len) { dst[idx++] = word[i++]; } if (t == BROTLI_TRANSFORM_UPPERCASE_FIRST) { ToUpperCase(&dst[idx - len]); } else if (t == BROTLI_TRANSFORM_UPPERCASE_ALL) { uint8_t* uppercase = &dst[idx - len]; while (len > 0) { int step = ToUpperCase(uppercase); uppercase += step; len -= step; } } } { int suffix_len = *suffix++; while (suffix_len--) { dst[idx++] = *suffix++; } return idx; } } #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif dvisvgm-2.8.1/libs/brotli/common/platform.h0000664000175000017500000005024313510660062015640 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Macros for compiler / platform specific features and build options. Build options are: * BROTLI_BUILD_32_BIT disables 64-bit optimizations * BROTLI_BUILD_64_BIT forces to use 64-bit optimizations * BROTLI_BUILD_BIG_ENDIAN forces to use big-endian optimizations * BROTLI_BUILD_ENDIAN_NEUTRAL disables endian-aware optimizations * BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations * BROTLI_BUILD_PORTABLE disables dangerous optimizations, like unaligned read and overlapping memcpy; this reduces decompression speed by 5% * BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs * BROTLI_DEBUG dumps file name and line number when decoder detects stream or memory error * BROTLI_ENABLE_LOG enables asserts and dumps various state information */ #ifndef BROTLI_COMMON_PLATFORM_H_ #define BROTLI_COMMON_PLATFORM_H_ #include /* memcpy */ #include /* malloc, free */ #include #include #if defined(OS_LINUX) || defined(OS_CYGWIN) #include #elif defined(OS_FREEBSD) #include #elif defined(OS_MACOSX) #include /* Let's try and follow the Linux convention */ #define BROTLI_X_BYTE_ORDER BYTE_ORDER #define BROTLI_X_LITTLE_ENDIAN LITTLE_ENDIAN #define BROTLI_X_BIG_ENDIAN BIG_ENDIAN #endif #if defined(BROTLI_ENABLE_LOG) || defined(BROTLI_DEBUG) #include #include #endif /* The following macros were borrowed from https://github.com/nemequ/hedley * with permission of original author - Evan Nemerson */ /* >>> >>> >>> hedley macros */ /* Define "BROTLI_PREDICT_TRUE" and "BROTLI_PREDICT_FALSE" macros for capable compilers. To apply compiler hint, enclose the branching condition into macros, like this: if (BROTLI_PREDICT_TRUE(zero == 0)) { // main execution path } else { // compiler should place this code outside of main execution path } OR: if (BROTLI_PREDICT_FALSE(something_rare_or_unexpected_happens)) { // compiler should place this code outside of main execution path } */ #if BROTLI_GNUC_HAS_BUILTIN(__builtin_expect, 3, 0, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \ BROTLI_SUNPRO_VERSION_CHECK(5, 15, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \ BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \ BROTLI_TI_VERSION_CHECK(7, 3, 0) || \ BROTLI_TINYC_VERSION_CHECK(0, 9, 27) #define BROTLI_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) #define BROTLI_PREDICT_FALSE(x) (__builtin_expect(x, 0)) #else #define BROTLI_PREDICT_FALSE(x) (x) #define BROTLI_PREDICT_TRUE(x) (x) #endif #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ !defined(__cplusplus) #define BROTLI_RESTRICT restrict #elif BROTLI_GNUC_VERSION_CHECK(3, 1, 0) || \ BROTLI_MSVC_VERSION_CHECK(14, 0, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \ BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \ BROTLI_PGI_VERSION_CHECK(17, 10, 0) || \ BROTLI_TI_VERSION_CHECK(8, 0, 0) || \ BROTLI_IAR_VERSION_CHECK(8, 0, 0) || \ (BROTLI_SUNPRO_VERSION_CHECK(5, 14, 0) && defined(__cplusplus)) #define BROTLI_RESTRICT __restrict #elif BROTLI_SUNPRO_VERSION_CHECK(5, 3, 0) && !defined(__cplusplus) #define BROTLI_RESTRICT _Restrict #else #define BROTLI_RESTRICT #endif #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ (defined(__cplusplus) && (__cplusplus >= 199711L)) #define BROTLI_MAYBE_INLINE inline #elif defined(__GNUC_STDC_INLINE__) || defined(__GNUC_GNU_INLINE__) || \ BROTLI_ARM_VERSION_CHECK(6, 2, 0) #define BROTLI_MAYBE_INLINE __inline__ #elif BROTLI_MSVC_VERSION_CHECK(12, 0, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || BROTLI_TI_VERSION_CHECK(8, 0, 0) #define BROTLI_MAYBE_INLINE __inline #else #define BROTLI_MAYBE_INLINE #endif #if BROTLI_GNUC_HAS_ATTRIBUTE(always_inline, 4, 0, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \ BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \ BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \ BROTLI_TI_VERSION_CHECK(8, 0, 0) || \ (BROTLI_TI_VERSION_CHECK(7, 3, 0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) #define BROTLI_INLINE BROTLI_MAYBE_INLINE __attribute__((__always_inline__)) #elif BROTLI_MSVC_VERSION_CHECK(12, 0, 0) #define BROTLI_INLINE BROTLI_MAYBE_INLINE __forceinline #elif BROTLI_TI_VERSION_CHECK(7, 0, 0) && defined(__cplusplus) #define BROTLI_INLINE BROTLI_MAYBE_INLINE _Pragma("FUNC_ALWAYS_INLINE;") #elif BROTLI_IAR_VERSION_CHECK(8, 0, 0) #define BROTLI_INLINE BROTLI_MAYBE_INLINE _Pragma("inline=forced") #else #define BROTLI_INLINE BROTLI_MAYBE_INLINE #endif #if BROTLI_GNUC_HAS_ATTRIBUTE(noinline, 4, 0, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \ BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \ BROTLI_IBM_VERSION_CHECK(10, 1, 0) || \ BROTLI_TI_VERSION_CHECK(8, 0, 0) || \ (BROTLI_TI_VERSION_CHECK(7, 3, 0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) #define BROTLI_NOINLINE __attribute__((__noinline__)) #elif BROTLI_MSVC_VERSION_CHECK(13, 10, 0) #define BROTLI_NOINLINE __declspec(noinline) #elif BROTLI_PGI_VERSION_CHECK(10, 2, 0) #define BROTLI_NOINLINE _Pragma("noinline") #elif BROTLI_TI_VERSION_CHECK(6, 0, 0) && defined(__cplusplus) #define BROTLI_NOINLINE _Pragma("FUNC_CANNOT_INLINE;") #elif BROTLI_IAR_VERSION_CHECK(8, 0, 0) #define BROTLI_NOINLINE _Pragma("inline=never") #else #define BROTLI_NOINLINE #endif /* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */ #if !defined(BROTLI_INTERNAL) #if defined(_WIN32) || defined(__CYGWIN__) #define BROTLI_INTERNAL #elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \ BROTLI_TI_VERSION_CHECK(8, 0, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \ BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \ BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \ (BROTLI_TI_VERSION_CHECK(7, 3, 0) && \ defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__)) #define BROTLI_INTERNAL __attribute__ ((visibility ("hidden"))) #else #define BROTLI_INTERNAL #endif #endif /* <<< <<< <<< end of hedley macros. */ #if BROTLI_GNUC_HAS_ATTRIBUTE(unused, 2, 7, 0) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) #define BROTLI_UNUSED_FUNCTION static BROTLI_INLINE __attribute__ ((unused)) #else #define BROTLI_UNUSED_FUNCTION static BROTLI_INLINE #endif #if BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) #define BROTLI_ALIGNED(N) __attribute__((aligned(N))) #else #define BROTLI_ALIGNED(N) #endif #if (defined(__ARM_ARCH) && (__ARM_ARCH == 7)) || \ (defined(M_ARM) && (M_ARM == 7)) #define BROTLI_TARGET_ARMV7 #endif /* ARMv7 */ #if (defined(__ARM_ARCH) && (__ARM_ARCH == 8)) || \ defined(__aarch64__) || defined(__ARM64_ARCH_8__) #define BROTLI_TARGET_ARMV8_ANY #if defined(__ARM_32BIT_STATE) #define BROTLI_TARGET_ARMV8_32 #elif defined(__ARM_64BIT_STATE) #define BROTLI_TARGET_ARMV8_64 #endif #endif /* ARMv8 */ #if defined(__ARM_NEON__) || defined(__ARM_NEON) #define BROTLI_TARGET_NEON #endif #if defined(__i386) || defined(_M_IX86) #define BROTLI_TARGET_X86 #endif #if defined(__x86_64__) || defined(_M_X64) #define BROTLI_TARGET_X64 #endif #if defined(__PPC64__) #define BROTLI_TARGET_POWERPC64 #endif #if defined(__riscv) && defined(__riscv_xlen) && __riscv_xlen == 64 #define BROTLI_TARGET_RISCV64 #endif #if defined(BROTLI_BUILD_64_BIT) #define BROTLI_64_BITS 1 #elif defined(BROTLI_BUILD_32_BIT) #define BROTLI_64_BITS 0 #elif defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \ defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) #define BROTLI_64_BITS 1 #else #define BROTLI_64_BITS 0 #endif #if (BROTLI_64_BITS) #define brotli_reg_t uint64_t #else #define brotli_reg_t uint32_t #endif #if defined(BROTLI_BUILD_BIG_ENDIAN) #define BROTLI_BIG_ENDIAN 1 #elif defined(BROTLI_BUILD_LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 1 #elif defined(BROTLI_BUILD_ENDIAN_NEUTRAL) /* Just break elif chain. */ #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) #define BROTLI_LITTLE_ENDIAN 1 #elif defined(_WIN32) || defined(BROTLI_TARGET_X64) /* Win32 & x64 can currently always be assumed to be little endian */ #define BROTLI_LITTLE_ENDIAN 1 #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #define BROTLI_BIG_ENDIAN 1 #elif defined(BROTLI_X_BYTE_ORDER) #if BROTLI_X_BYTE_ORDER == BROTLI_X_LITTLE_ENDIAN #define BROTLI_LITTLE_ENDIAN 1 #elif BROTLI_X_BYTE_ORDER == BROTLI_X_BIG_ENDIAN #define BROTLI_BIG_ENDIAN 1 #endif #endif /* BROTLI_X_BYTE_ORDER */ #if !defined(BROTLI_LITTLE_ENDIAN) #define BROTLI_LITTLE_ENDIAN 0 #endif #if !defined(BROTLI_BIG_ENDIAN) #define BROTLI_BIG_ENDIAN 0 #endif #if defined(BROTLI_X_BYTE_ORDER) #undef BROTLI_X_BYTE_ORDER #undef BROTLI_X_LITTLE_ENDIAN #undef BROTLI_X_BIG_ENDIAN #endif #if defined(BROTLI_BUILD_PORTABLE) #define BROTLI_ALIGNED_READ (!!1) #elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \ defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) || \ defined(BROTLI_TARGET_RISCV64) /* Allow unaligned read only for white-listed CPUs. */ #define BROTLI_ALIGNED_READ (!!0) #else #define BROTLI_ALIGNED_READ (!!1) #endif #if BROTLI_ALIGNED_READ /* Portable unaligned memory access: read / write values via memcpy. */ static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { uint16_t t; memcpy(&t, p, sizeof t); return t; } static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) { uint32_t t; memcpy(&t, p, sizeof t); return t; } static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { uint64_t t; memcpy(&t, p, sizeof t); return t; } static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { memcpy(p, &v, sizeof v); } #else /* BROTLI_ALIGNED_READ */ /* Unaligned memory access is allowed: just cast pointer to requested type. */ #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \ defined(MEMORY_SANITIZER) /* Consider we have an unaligned load/store of 4 bytes from address 0x...05. AddressSanitizer will treat it as a 3-byte access to the range 05:07 and will miss a bug if 08 is the first unaddressable byte. ThreadSanitizer will also treat this as a 3-byte access to 05:07 and will miss a race between this access and some other accesses to 08. MemorySanitizer will correctly propagate the shadow on unaligned stores and correctly report bugs on unaligned loads, but it may not properly update and report the origin of the uninitialized memory. For all three tools, replacing an unaligned access with a tool-specific callback solves the problem. */ #if defined(__cplusplus) extern "C" { #endif /* __cplusplus */ uint16_t __sanitizer_unaligned_load16(const void* p); uint32_t __sanitizer_unaligned_load32(const void* p); uint64_t __sanitizer_unaligned_load64(const void* p); void __sanitizer_unaligned_store64(void* p, uint64_t v); #if defined(__cplusplus) } /* extern "C" */ #endif /* __cplusplus */ #define BrotliUnalignedRead16 __sanitizer_unaligned_load16 #define BrotliUnalignedRead32 __sanitizer_unaligned_load32 #define BrotliUnalignedRead64 __sanitizer_unaligned_load64 #define BrotliUnalignedWrite64 __sanitizer_unaligned_store64 #else static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) { return *(const uint16_t*)p; } static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) { return *(const uint32_t*)p; } #if (BROTLI_64_BITS) static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { return *(const uint64_t*)p; } static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { *(uint64_t*)p = v; } #else /* BROTLI_64_BITS */ /* Avoid emitting LDRD / STRD, which require properly aligned address. */ /* If __attribute__(aligned) is available, use that. Otherwise, memcpy. */ #if BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) typedef BROTLI_ALIGNED(1) uint64_t brotli_unaligned_uint64_t; static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { return (uint64_t) ((brotli_unaligned_uint64_t*) p)[0]; } static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { brotli_unaligned_uint64_t* dwords = (brotli_unaligned_uint64_t*) p; dwords[0] = (brotli_unaligned_uint64_t) v; } #else /* BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) */ static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) { uint64_t v; memcpy(&v, p, sizeof(uint64_t)); return v; } static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) { memcpy(p, &v, sizeof(uint64_t)); } #endif /* BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) */ #endif /* BROTLI_64_BITS */ #endif /* ASAN / TSAN / MSAN */ #endif /* BROTLI_ALIGNED_READ */ #if BROTLI_LITTLE_ENDIAN /* Straight endianness. Just read / write values. */ #define BROTLI_UNALIGNED_LOAD16LE BrotliUnalignedRead16 #define BROTLI_UNALIGNED_LOAD32LE BrotliUnalignedRead32 #define BROTLI_UNALIGNED_LOAD64LE BrotliUnalignedRead64 #define BROTLI_UNALIGNED_STORE64LE BrotliUnalignedWrite64 #elif BROTLI_BIG_ENDIAN /* BROTLI_LITTLE_ENDIAN */ /* Explain compiler to byte-swap values. */ #define BROTLI_BSWAP16_(V) ((uint16_t)( \ (((V) & 0xFFU) << 8) | \ (((V) >> 8) & 0xFFU))) static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) { uint16_t value = BrotliUnalignedRead16(p); return BROTLI_BSWAP16_(value); } #define BROTLI_BSWAP32_(V) ( \ (((V) & 0xFFU) << 24) | (((V) & 0xFF00U) << 8) | \ (((V) >> 8) & 0xFF00U) | (((V) >> 24) & 0xFFU)) static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) { uint32_t value = BrotliUnalignedRead32(p); return BROTLI_BSWAP32_(value); } #define BROTLI_BSWAP64_(V) ( \ (((V) & 0xFFU) << 56) | (((V) & 0xFF00U) << 40) | \ (((V) & 0xFF0000U) << 24) | (((V) & 0xFF000000U) << 8) | \ (((V) >> 8) & 0xFF000000U) | (((V) >> 24) & 0xFF0000U) | \ (((V) >> 40) & 0xFF00U) | (((V) >> 56) & 0xFFU)) static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) { uint64_t value = BrotliUnalignedRead64(p); return BROTLI_BSWAP64_(value); } static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) { uint64_t value = BROTLI_BSWAP64_(v); BrotliUnalignedWrite64(p, value); } #else /* BROTLI_LITTLE_ENDIAN */ /* Read / store values byte-wise; hopefully compiler will understand. */ static BROTLI_INLINE uint16_t BROTLI_UNALIGNED_LOAD16LE(const void* p) { const uint8_t* in = (const uint8_t*)p; return (uint16_t)(in[0] | (in[1] << 8)); } static BROTLI_INLINE uint32_t BROTLI_UNALIGNED_LOAD32LE(const void* p) { const uint8_t* in = (const uint8_t*)p; uint32_t value = (uint32_t)(in[0]); value |= (uint32_t)(in[1]) << 8; value |= (uint32_t)(in[2]) << 16; value |= (uint32_t)(in[3]) << 24; return value; } static BROTLI_INLINE uint64_t BROTLI_UNALIGNED_LOAD64LE(const void* p) { const uint8_t* in = (const uint8_t*)p; uint64_t value = (uint64_t)(in[0]); value |= (uint64_t)(in[1]) << 8; value |= (uint64_t)(in[2]) << 16; value |= (uint64_t)(in[3]) << 24; value |= (uint64_t)(in[4]) << 32; value |= (uint64_t)(in[5]) << 40; value |= (uint64_t)(in[6]) << 48; value |= (uint64_t)(in[7]) << 56; return value; } static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) { uint8_t* out = (uint8_t*)p; out[0] = (uint8_t)v; out[1] = (uint8_t)(v >> 8); out[2] = (uint8_t)(v >> 16); out[3] = (uint8_t)(v >> 24); out[4] = (uint8_t)(v >> 32); out[5] = (uint8_t)(v >> 40); out[6] = (uint8_t)(v >> 48); out[7] = (uint8_t)(v >> 56); } #endif /* BROTLI_LITTLE_ENDIAN */ /* BROTLI_IS_CONSTANT macros returns true for compile-time constants. */ #if BROTLI_GNUC_HAS_BUILTIN(__builtin_constant_p, 3, 0, 1) || \ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) #define BROTLI_IS_CONSTANT(x) (!!__builtin_constant_p(x)) #else #define BROTLI_IS_CONSTANT(x) (!!0) #endif #if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) #define BROTLI_HAS_UBFX (!!1) #else #define BROTLI_HAS_UBFX (!!0) #endif #if defined(BROTLI_ENABLE_LOG) #define BROTLI_DCHECK(x) assert(x) #define BROTLI_LOG(x) printf x #else #define BROTLI_DCHECK(x) #define BROTLI_LOG(x) #endif #if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG) static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) { fprintf(stderr, "%s:%d (%s)\n", f, l, fn); fflush(stderr); } #define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__) #else #define BROTLI_DUMP() (void)(0) #endif /* TODO: add appropriate icc/sunpro/arm/ibm/ti checks. */ #if (BROTLI_GNUC_VERSION_CHECK(3, 0, 0) || defined(__llvm__)) && \ !defined(BROTLI_BUILD_NO_RBIT) #if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) /* TODO: detect ARMv6T2 and enable this code for it. */ static BROTLI_INLINE brotli_reg_t BrotliRBit(brotli_reg_t input) { brotli_reg_t output; __asm__("rbit %0, %1\n" : "=r"(output) : "r"(input)); return output; } #define BROTLI_RBIT(x) BrotliRBit(x) #endif /* armv7 / armv8 */ #endif /* gcc || clang */ #if !defined(BROTLI_RBIT) static BROTLI_INLINE void BrotliRBit(void) { /* Should break build if used. */ } #endif /* BROTLI_RBIT */ #define BROTLI_REPEAT(N, X) { \ if ((N & 1) != 0) {X;} \ if ((N & 2) != 0) {X; X;} \ if ((N & 4) != 0) {X; X; X; X;} \ } #define BROTLI_UNUSED(X) (void)(X) #define BROTLI_MIN_MAX(T) \ static BROTLI_INLINE T brotli_min_ ## T (T a, T b) { return a < b ? a : b; } \ static BROTLI_INLINE T brotli_max_ ## T (T a, T b) { return a > b ? a : b; } BROTLI_MIN_MAX(double) BROTLI_MIN_MAX(float) BROTLI_MIN_MAX(int) BROTLI_MIN_MAX(size_t) BROTLI_MIN_MAX(uint32_t) BROTLI_MIN_MAX(uint8_t) #undef BROTLI_MIN_MAX #define BROTLI_MIN(T, A, B) (brotli_min_ ## T((A), (B))) #define BROTLI_MAX(T, A, B) (brotli_max_ ## T((A), (B))) #define BROTLI_SWAP(T, A, I, J) { \ T __brotli_swap_tmp = (A)[(I)]; \ (A)[(I)] = (A)[(J)]; \ (A)[(J)] = __brotli_swap_tmp; \ } /* Default brotli_alloc_func */ static void* BrotliDefaultAllocFunc(void* opaque, size_t size) { BROTLI_UNUSED(opaque); return malloc(size); } /* Default brotli_free_func */ static void BrotliDefaultFreeFunc(void* opaque, void* address) { BROTLI_UNUSED(opaque); free(address); } BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) { BROTLI_UNUSED(&BrotliSuppressUnusedFunctions); BROTLI_UNUSED(&BrotliUnalignedRead16); BROTLI_UNUSED(&BrotliUnalignedRead32); BROTLI_UNUSED(&BrotliUnalignedRead64); BROTLI_UNUSED(&BrotliUnalignedWrite64); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD16LE); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE); BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD64LE); BROTLI_UNUSED(&BROTLI_UNALIGNED_STORE64LE); BROTLI_UNUSED(&BrotliRBit); BROTLI_UNUSED(&brotli_min_double); BROTLI_UNUSED(&brotli_max_double); BROTLI_UNUSED(&brotli_min_float); BROTLI_UNUSED(&brotli_max_float); BROTLI_UNUSED(&brotli_min_int); BROTLI_UNUSED(&brotli_max_int); BROTLI_UNUSED(&brotli_min_size_t); BROTLI_UNUSED(&brotli_max_size_t); BROTLI_UNUSED(&brotli_min_uint32_t); BROTLI_UNUSED(&brotli_max_uint32_t); BROTLI_UNUSED(&brotli_min_uint8_t); BROTLI_UNUSED(&brotli_max_uint8_t); BROTLI_UNUSED(&BrotliDefaultAllocFunc); BROTLI_UNUSED(&BrotliDefaultFreeFunc); #if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG) BROTLI_UNUSED(&BrotliDump); #endif } #endif /* BROTLI_COMMON_PLATFORM_H_ */ dvisvgm-2.8.1/libs/brotli/common/dictionary.h0000664000175000017500000000363713510660062016166 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Collection of static dictionary words. */ #ifndef BROTLI_COMMON_DICTIONARY_H_ #define BROTLI_COMMON_DICTIONARY_H_ #include #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct BrotliDictionary { /** * Number of bits to encode index of dictionary word in a bucket. * * Specification: Appendix A. Static Dictionary Data * * Words in a dictionary are bucketed by length. * @c 0 means that there are no words of a given length. * Dictionary consists of words with length of [4..24] bytes. * Values at [0..3] and [25..31] indices should not be addressed. */ uint8_t size_bits_by_length[32]; /* assert(offset[i + 1] == offset[i] + (bits[i] ? (i << bits[i]) : 0)) */ uint32_t offsets_by_length[32]; /* assert(data_size == offsets_by_length[31]) */ size_t data_size; /* Data array is not bound, and should obey to size_bits_by_length values. Specified size matches default (RFC 7932) dictionary. Its size is defined by data_size */ const uint8_t* data; } BrotliDictionary; BROTLI_COMMON_API const BrotliDictionary* BrotliGetDictionary(void); /** * Sets dictionary data. * * When dictionary data is already set / present, this method is no-op. * * Dictionary data MUST be provided before BrotliGetDictionary is invoked. * This method is used ONLY in multi-client environment (e.g. C + Java), * to reduce storage by sharing single dictionary between implementations. */ BROTLI_COMMON_API void BrotliSetDictionaryData(const uint8_t* data); #define BROTLI_MIN_DICTIONARY_WORD_LENGTH 4 #define BROTLI_MAX_DICTIONARY_WORD_LENGTH 24 #if defined(__cplusplus) || defined(c_plusplus) } /* extern "C" */ #endif #endif /* BROTLI_COMMON_DICTIONARY_H_ */ dvisvgm-2.8.1/libs/clipper/0000775000175000017500000000000013563265645012612 500000000000000dvisvgm-2.8.1/libs/clipper/License.txt0000664000175000017500000000253613510660062014643 00000000000000Boost Software License - Version 1.0 - August 17th, 2003 http://www.boost.org/LICENSE_1_0.txt Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.dvisvgm-2.8.1/libs/clipper/Makefile.am0000664000175000017500000000031213510660062014542 00000000000000noinst_LIBRARIES = libclipper.a libclipper_a_SOURCES = clipper.cpp clipper.hpp EXTRA_DIST = License.txt AM_CXXFLAGS = -Wall clipper.cpp: clipper.hpp @CODE_COVERAGE_RULES@ CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/clipper/clipper.cpp0000664000175000017500000040221313510660062014656 00000000000000/******************************************************************************* * * * Author : Angus Johnson * * Version : 6.2.1 * * Date : 31 October 2014 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2010-2014 * * * * License: * * Use, modification & distribution is subject to Boost Software License Ver 1. * * http://www.boost.org/LICENSE_1_0.txt * * * * Attributions: * * The code in this library is an extension of Bala Vatti's clipping algorithm: * * "A generic solution to polygon clipping" * * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * * http://portal.acm.org/citation.cfm?id=129906 * * * * Computer graphics and geometric modeling: implementation and algorithms * * By Max K. Agoston * * Springer; 1 edition (January 4, 2005) * * http://books.google.com/books?q=vatti+clipping+agoston * * * * See also: * * "Polygon Offsetting by Computing Winding Numbers" * * Paper no. DETC2005-85513 pp. 565-575 * * ASME 2005 International Design Engineering Technical Conferences * * and Computers and Information in Engineering Conference (IDETC/CIE2005) * * September 24-28, 2005 , Long Beach, California, USA * * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * * * *******************************************************************************/ /******************************************************************************* * * * This is a translation of the Delphi Clipper library and the naming style * * used has retained a Delphi flavour. * * * *******************************************************************************/ #include "clipper.hpp" #include #include #include #include #include #include #include #include namespace ClipperLib { static double const pi = 3.141592653589793238; static double const two_pi = pi *2; static double const def_arc_tolerance = 0.25; enum Direction { dRightToLeft, dLeftToRight }; static int const Unassigned = -1; //edge not currently 'owning' a solution static int const Skip = -2; //edge that would otherwise close a path #define HORIZONTAL (-1.0E+40) #define TOLERANCE (1.0e-20) #define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) struct TEdge { IntPoint Bot; IntPoint Curr; IntPoint Top; IntPoint Delta; double Dx = 0.0; PolyType PolyTyp = ptSubject; EdgeSide Side = esLeft; int WindDelta = 0; //1 or -1 depending on winding direction int WindCnt = 0; int WindCnt2 = 0; //winding count of the opposite polytype int OutIdx = 0; TEdge *Next = nullptr; TEdge *Prev = nullptr; TEdge *NextInLML = nullptr; TEdge *NextInAEL = nullptr; TEdge *PrevInAEL = nullptr; TEdge *NextInSEL = nullptr; TEdge *PrevInSEL = nullptr; }; struct IntersectNode { TEdge *Edge1; TEdge *Edge2; IntPoint Pt; }; struct LocalMinimum { cInt Y; TEdge *LeftBound; TEdge *RightBound; }; struct OutPt; struct OutRec { int Idx; bool IsHole; bool IsOpen; OutRec *FirstLeft; //see comments in clipper.pas PolyNode *PolyNd; OutPt *Pts; OutPt *BottomPt; }; struct OutPt { int Idx; IntPoint Pt; OutPt *Next; OutPt *Prev; }; struct Join { OutPt *OutPt1; OutPt *OutPt2; IntPoint OffPt; }; struct LocMinSorter { inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2) { return locMin2.Y < locMin1.Y; } }; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ inline cInt Round(double val) { if ((val < 0)) return static_cast(val - 0.5); else return static_cast(val + 0.5); } //------------------------------------------------------------------------------ inline cInt Abs(cInt val) { return val < 0 ? -val : val; } //------------------------------------------------------------------------------ // PolyTree methods ... //------------------------------------------------------------------------------ void PolyTree::Clear() { for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) delete AllNodes[i]; AllNodes.resize(0); Childs.resize(0); } //------------------------------------------------------------------------------ PolyNode* PolyTree::GetFirst() const { if (!Childs.empty()) return Childs[0]; else return 0; } //------------------------------------------------------------------------------ int PolyTree::Total() const { int result = (int)AllNodes.size(); //with negative offsets, ignore the hidden outer polygon ... if (result > 0 && Childs[0] != AllNodes[0]) result--; return result; } //------------------------------------------------------------------------------ // PolyNode methods ... //------------------------------------------------------------------------------ PolyNode::PolyNode(): Childs(), Parent(0), Index(0), m_IsOpen(false) { } //------------------------------------------------------------------------------ int PolyNode::ChildCount() const { return (int)Childs.size(); } //------------------------------------------------------------------------------ void PolyNode::AddChild(PolyNode& child) { unsigned cnt = (unsigned)Childs.size(); Childs.push_back(&child); child.Parent = this; child.Index = cnt; } //------------------------------------------------------------------------------ PolyNode* PolyNode::GetNext() const { if (!Childs.empty()) return Childs[0]; else return GetNextSiblingUp(); } //------------------------------------------------------------------------------ PolyNode* PolyNode::GetNextSiblingUp() const { if (!Parent) //protects against PolyTree.GetNextSiblingUp() return 0; else if (Index == Parent->Childs.size() - 1) return Parent->GetNextSiblingUp(); else return Parent->Childs[Index + 1]; } //------------------------------------------------------------------------------ bool PolyNode::IsHole() const { bool result = true; PolyNode* node = Parent; while (node) { result = !result; node = node->Parent; } return result; } //------------------------------------------------------------------------------ bool PolyNode::IsOpen() const { return m_IsOpen; } //------------------------------------------------------------------------------ #ifndef use_int32 //------------------------------------------------------------------------------ // Int128 class (enables safe math on signed 64bit integers) // eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 // Int128 val2((long64)9223372036854775807); // Int128 val3 = val1 * val2; // val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) //------------------------------------------------------------------------------ class Int128 { public: ulong64 lo; long64 hi; Int128(long64 _lo = 0) { lo = (ulong64)_lo; if (_lo < 0) hi = -1; else hi = 0; } Int128(const Int128 &val): lo(val.lo), hi(val.hi){} Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} Int128& operator = (const long64 &val) { lo = (ulong64)val; if (val < 0) hi = -1; else hi = 0; return *this; } bool operator == (const Int128 &val) const {return (hi == val.hi && lo == val.lo);} bool operator != (const Int128 &val) const { return !(*this == val);} bool operator > (const Int128 &val) const { if (hi != val.hi) return hi > val.hi; else return lo > val.lo; } bool operator < (const Int128 &val) const { if (hi != val.hi) return hi < val.hi; else return lo < val.lo; } bool operator >= (const Int128 &val) const { return !(*this < val);} bool operator <= (const Int128 &val) const { return !(*this > val);} Int128& operator += (const Int128 &rhs) { hi += rhs.hi; lo += rhs.lo; if (lo < rhs.lo) hi++; return *this; } Int128 operator + (const Int128 &rhs) const { Int128 result(*this); result+= rhs; return result; } Int128& operator -= (const Int128 &rhs) { *this += -rhs; return *this; } Int128 operator - (const Int128 &rhs) const { Int128 result(*this); result -= rhs; return result; } Int128 operator-() const //unary negation { if (lo == 0) return Int128(-hi, 0); else return Int128(~hi, ~lo + 1); } operator double() const { const double shift64 = 18446744073709551616.0; //2^64 if (hi < 0) { if (lo == 0) return (double)hi * shift64; else return -(double)(~lo + ~hi * shift64); } else return (double)(lo + hi * shift64); } }; //------------------------------------------------------------------------------ Int128 Int128Mul (long64 lhs, long64 rhs) { bool negate = (lhs < 0) != (rhs < 0); if (lhs < 0) lhs = -lhs; ulong64 int1Hi = ulong64(lhs) >> 32; ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); if (rhs < 0) rhs = -rhs; ulong64 int2Hi = ulong64(rhs) >> 32; ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); //nb: see comments in clipper.pas ulong64 a = int1Hi * int2Hi; ulong64 b = int1Lo * int2Lo; ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; Int128 tmp; tmp.hi = long64(a + (c >> 32)); tmp.lo = long64(c << 32); tmp.lo += long64(b); if (tmp.lo < b) tmp.hi++; if (negate) tmp = -tmp; return tmp; }; #endif //------------------------------------------------------------------------------ // Miscellaneous global functions //------------------------------------------------------------------------------ bool Orientation(const Path &poly) { return Area(poly) >= 0; } //------------------------------------------------------------------------------ double Area(const Path &poly) { int size = (int)poly.size(); if (size < 3) return 0; double a = 0; for (int i = 0, j = size -1; i < size; ++i) { a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); j = i; } return -a * 0.5; } //------------------------------------------------------------------------------ double Area(const OutRec &outRec) { OutPt *op = outRec.Pts; if (!op) return 0; double a = 0; do { a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y); op = op->Next; } while (op != outRec.Pts); return a * 0.5; } //------------------------------------------------------------------------------ bool PointIsVertex(const IntPoint &Pt, OutPt *pp) { OutPt *pp2 = pp; do { if (pp2->Pt == Pt) return true; pp2 = pp2->Next; } while (pp2 != pp); return false; } //------------------------------------------------------------------------------ int PointInPolygon (const IntPoint &pt, const Path &path) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf int result = 0; size_t cnt = path.size(); if (cnt < 3) return 0; IntPoint ip = path[0]; for(size_t i = 1; i <= cnt; ++i) { IntPoint ipNext = (i == cnt ? path[0] : path[i]); if (ipNext.Y == pt.Y) { if ((ipNext.X == pt.X) || (ip.Y == pt.Y && ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; } if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) { if (ip.X >= pt.X) { if (ipNext.X > pt.X) result = 1 - result; else { double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); if (!d) return -1; if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; } } else { if (ipNext.X > pt.X) { double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); if (!d) return -1; if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; } } } ip = ipNext; } return result; } //------------------------------------------------------------------------------ int PointInPolygon (const IntPoint &pt, OutPt *op) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary int result = 0; OutPt* startOp = op; for(;;) { if (op->Next->Pt.Y == pt.Y) { if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y && ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1; } if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y)) { if (op->Pt.X >= pt.X) { if (op->Next->Pt.X > pt.X) result = 1 - result; else { double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); if (!d) return -1; if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; } } else { if (op->Next->Pt.X > pt.X) { double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); if (!d) return -1; if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; } } } op = op->Next; if (startOp == op) break; } return result; } //------------------------------------------------------------------------------ bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) { OutPt* op = OutPt1; do { //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon int res = PointInPolygon(op->Pt, OutPt2); if (res >= 0) return res > 0; op = op->Next; } while (op != OutPt1); return true; } //---------------------------------------------------------------------- bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) { #ifndef use_int32 if (UseFullInt64Range) return Int128Mul(e1.Delta.Y, e2.Delta.X) == Int128Mul(e1.Delta.X, e2.Delta.Y); else #endif return e1.Delta.Y * e2.Delta.X == e1.Delta.X * e2.Delta.Y; } //------------------------------------------------------------------------------ bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3, bool UseFullInt64Range) { #ifndef use_int32 if (UseFullInt64Range) return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); else #endif return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); } //------------------------------------------------------------------------------ bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) { #ifndef use_int32 if (UseFullInt64Range) return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); else #endif return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); } //------------------------------------------------------------------------------ inline bool IsHorizontal(TEdge &e) { return e.Delta.Y == 0; } //------------------------------------------------------------------------------ inline double GetDx(const IntPoint pt1, const IntPoint pt2) { return (pt1.Y == pt2.Y) ? HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); } //--------------------------------------------------------------------------- inline void SetDx(TEdge &e) { e.Delta.X = (e.Top.X - e.Bot.X); e.Delta.Y = (e.Top.Y - e.Bot.Y); if (e.Delta.Y == 0) e.Dx = HORIZONTAL; else e.Dx = (double)(e.Delta.X) / e.Delta.Y; } //--------------------------------------------------------------------------- inline void SwapSides(TEdge &Edge1, TEdge &Edge2) { EdgeSide Side = Edge1.Side; Edge1.Side = Edge2.Side; Edge2.Side = Side; } //------------------------------------------------------------------------------ inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2) { int OutIdx = Edge1.OutIdx; Edge1.OutIdx = Edge2.OutIdx; Edge2.OutIdx = OutIdx; } //------------------------------------------------------------------------------ inline cInt TopX(TEdge &edge, const cInt currentY) { return ( currentY == edge.Top.Y ) ? edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y)); } //------------------------------------------------------------------------------ void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) { #ifdef use_xyz ip.Z = 0; #endif double b1, b2; if (Edge1.Dx == Edge2.Dx) { ip.Y = Edge1.Curr.Y; ip.X = TopX(Edge1, ip.Y); return; } else if (Edge1.Delta.X == 0) { ip.X = Edge1.Bot.X; if (IsHorizontal(Edge2)) ip.Y = Edge2.Bot.Y; else { b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx); ip.Y = Round(ip.X / Edge2.Dx + b2); } } else if (Edge2.Delta.X == 0) { ip.X = Edge2.Bot.X; if (IsHorizontal(Edge1)) ip.Y = Edge1.Bot.Y; else { b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx); ip.Y = Round(ip.X / Edge1.Dx + b1); } } else { b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; double q = (b2-b1) / (Edge1.Dx - Edge2.Dx); ip.Y = Round(q); if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) ip.X = Round(Edge1.Dx * q + b1); else ip.X = Round(Edge2.Dx * q + b2); } if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) { if (Edge1.Top.Y > Edge2.Top.Y) ip.Y = Edge1.Top.Y; else ip.Y = Edge2.Top.Y; if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) ip.X = TopX(Edge1, ip.Y); else ip.X = TopX(Edge2, ip.Y); } //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... if (ip.Y > Edge1.Curr.Y) { ip.Y = Edge1.Curr.Y; //use the more vertical edge to derive X ... if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) ip.X = TopX(Edge2, ip.Y); else ip.X = TopX(Edge1, ip.Y); } } //------------------------------------------------------------------------------ void ReversePolyPtLinks(OutPt *pp) { if (!pp) return; OutPt *pp1, *pp2; pp1 = pp; do { pp2 = pp1->Next; pp1->Next = pp1->Prev; pp1->Prev = pp2; pp1 = pp2; } while( pp1 != pp ); } //------------------------------------------------------------------------------ void DisposeOutPts(OutPt*& pp) { if (pp == 0) return; pp->Prev->Next = 0; while( pp ) { OutPt *tmpPp = pp; pp = pp->Next; delete tmpPp; } } //------------------------------------------------------------------------------ inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt) { *e = TEdge(); e->Next = eNext; e->Prev = ePrev; e->Curr = Pt; e->OutIdx = Unassigned; } //------------------------------------------------------------------------------ void InitEdge2(TEdge& e, PolyType Pt) { if (e.Curr.Y >= e.Next->Curr.Y) { e.Bot = e.Curr; e.Top = e.Next->Curr; } else { e.Top = e.Curr; e.Bot = e.Next->Curr; } SetDx(e); e.PolyTyp = Pt; } //------------------------------------------------------------------------------ TEdge* RemoveEdge(TEdge* e) { //removes e from double_linked_list (but without removing from memory) e->Prev->Next = e->Next; e->Next->Prev = e->Prev; TEdge* result = e->Next; e->Prev = 0; //flag as removed (see ClipperBase.Clear) return result; } //------------------------------------------------------------------------------ inline void ReverseHorizontal(TEdge &e) { //swap horizontal edges' Top and Bottom x's so they follow the natural //progression of the bounds - ie so their xbots will align with the //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] std::swap(e.Top.X, e.Bot.X); #ifdef use_xyz std::swap(e.Top.Z, e.Bot.Z); #endif } //------------------------------------------------------------------------------ void SwapPoints(IntPoint &pt1, IntPoint &pt2) { IntPoint tmp = pt1; pt1 = pt2; pt2 = tmp; } //------------------------------------------------------------------------------ bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) { //precondition: segments are Collinear. if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y)) { if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b); if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b); if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a; if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b; return pt1.X < pt2.X; } else { if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b); if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b); if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a; if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b; return pt1.Y > pt2.Y; } } //------------------------------------------------------------------------------ bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) { OutPt *p = btmPt1->Prev; while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev; double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt)); p = btmPt1->Next; while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next; double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt)); p = btmPt2->Prev; while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev; double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt)); p = btmPt2->Next; while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next; double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt)); return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); } //------------------------------------------------------------------------------ OutPt* GetBottomPt(OutPt *pp) { OutPt* dups = 0; OutPt* p = pp->Next; while (p != pp) { if (p->Pt.Y > pp->Pt.Y) { pp = p; dups = 0; } else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X) { if (p->Pt.X < pp->Pt.X) { dups = 0; pp = p; } else { if (p->Next != pp && p->Prev != pp) dups = p; } } p = p->Next; } if (dups) { //there appears to be at least 2 vertices at BottomPt so ... while (dups != p) { if (!FirstIsBottomPt(p, dups)) pp = dups; dups = dups->Next; while (dups->Pt != pp->Pt) dups = dups->Next; } } return pp; } //------------------------------------------------------------------------------ bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3) { if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) return false; else if (pt1.X != pt3.X) return (pt2.X > pt1.X) == (pt2.X < pt3.X); else return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); } //------------------------------------------------------------------------------ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) { if (seg1a > seg1b) std::swap(seg1a, seg1b); if (seg2a > seg2b) std::swap(seg2a, seg2b); return (seg1a < seg2b) && (seg2a < seg1b); } //------------------------------------------------------------------------------ // ClipperBase class methods ... //------------------------------------------------------------------------------ ClipperBase::ClipperBase() //constructor { m_CurrentLM = m_MinimaList.begin(); //begin() == end() here m_UseFullRange = false; } //------------------------------------------------------------------------------ ClipperBase::~ClipperBase() //destructor { Clear(); } //------------------------------------------------------------------------------ void RangeTest(const IntPoint& Pt, bool& useFullRange) { if (useFullRange) { if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) throw "Coordinate outside allowed range"; } else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) { useFullRange = true; RangeTest(Pt, useFullRange); } } //------------------------------------------------------------------------------ TEdge* FindNextLocMin(TEdge* E) { for (;;) { while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next; if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break; while (IsHorizontal(*E->Prev)) E = E->Prev; TEdge* E2 = E; while (IsHorizontal(*E)) E = E->Next; if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz. if (E2->Prev->Bot.X < E->Bot.X) E = E2; break; } return E; } //------------------------------------------------------------------------------ TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) { TEdge *Result = E; TEdge *Horz = 0; if (E->OutIdx == Skip) { //if edges still remain in the current bound beyond the skip edge then //create another LocMin and call ProcessBound once more if (NextIsForward) { while (E->Top.Y == E->Next->Bot.Y) E = E->Next; //don't include top horizontals when parsing a bound a second time, //they will be contained in the opposite bound ... while (E != Result && IsHorizontal(*E)) E = E->Prev; } else { while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev; while (E != Result && IsHorizontal(*E)) E = E->Next; } if (E == Result) { if (NextIsForward) Result = E->Next; else Result = E->Prev; } else { //there are more edges in the bound beyond result starting with E if (NextIsForward) E = Result->Next; else E = Result->Prev; MinimaList::value_type locMin; locMin.Y = E->Bot.Y; locMin.LeftBound = 0; locMin.RightBound = E; E->WindDelta = 0; Result = ProcessBound(E, NextIsForward); m_MinimaList.push_back(locMin); } return Result; } TEdge *EStart; if (IsHorizontal(*E)) { //We need to be careful with open paths because this may not be a //true local minima (ie E may be following a skip edge). //Also, consecutive horz. edges may start heading left before going right. if (NextIsForward) EStart = E->Prev; else EStart = E->Next; if (EStart->OutIdx != Skip) { if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge { if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) ReverseHorizontal(*E); } else if (EStart->Bot.X != E->Bot.X) ReverseHorizontal(*E); } } EStart = E; if (NextIsForward) { while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) Result = Result->Next; if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) { //nb: at the top of a bound, horizontals are added to the bound //only when the preceding edge attaches to the horizontal's left vertex //unless a Skip edge is encountered when that becomes the top divide Horz = Result; while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; if (Horz->Prev->Top.X == Result->Next->Top.X) { if (!NextIsForward) Result = Horz->Prev; } else if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; } while (E != Result) { E->NextInLML = E->Next; if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); E = E->Next; } if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); Result = Result->Next; //move to the edge just beyond current bound } else { while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) Result = Result->Prev; if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) { Horz = Result; while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; if (Horz->Next->Top.X == Result->Prev->Top.X) { if (!NextIsForward) Result = Horz->Next; } else if (Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; } while (E != Result) { E->NextInLML = E->Prev; if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) ReverseHorizontal(*E); E = E->Prev; } if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) ReverseHorizontal(*E); Result = Result->Prev; //move to the edge just beyond current bound } return Result; } //------------------------------------------------------------------------------ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) { #ifdef use_lines if (!Closed && PolyTyp == ptClip) throw clipperException("AddPath: Open paths must be subject."); #else if (!Closed) throw clipperException("AddPath: Open paths have been disabled."); #endif int highI = (int)pg.size() -1; if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; while (highI > 0 && (pg[highI] == pg[highI -1])) --highI; if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; //create a new edge array ... TEdge *edges = new TEdge [highI +1]; bool IsFlat = true; //1. Basic (first) edge initialization ... try { edges[1].Curr = pg[1]; RangeTest(pg[0], m_UseFullRange); RangeTest(pg[highI], m_UseFullRange); InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]); InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); for (int i = highI - 1; i >= 1; --i) { RangeTest(pg[i], m_UseFullRange); InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); } } catch(...) { delete [] edges; throw; //range test fails } TEdge *eStart = &edges[0]; //2. Remove duplicate vertices, and (when closed) collinear edges ... TEdge *E = eStart, *eLoopStop = eStart; for (;;) { //nb: allows matching start and end points when not Closed ... if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) { if (E == E->Next) break; if (E == eStart) eStart = E->Next; E = RemoveEdge(E); eLoopStop = E; continue; } if (E->Prev == E->Next) break; //only two vertices else if (Closed && SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) && (!m_PreserveCollinear || !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr))) { //Collinear edges are allowed for open paths but in closed paths //the default is to merge adjacent collinear edges into a single edge. //However, if the PreserveCollinear property is enabled, only overlapping //collinear edges (ie spikes) will be removed from closed paths. if (E == eStart) eStart = E->Next; E = RemoveEdge(E); E = E->Prev; eLoopStop = E; continue; } E = E->Next; if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break; } if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) { delete [] edges; return false; } if (!Closed) { m_HasOpenPaths = true; eStart->Prev->OutIdx = Skip; } //3. Do second stage of edge initialization ... E = eStart; do { InitEdge2(*E, PolyTyp); E = E->Next; if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false; } while (E != eStart); //4. Finally, add edge bounds to LocalMinima list ... //Totally flat paths must be handled differently when adding them //to LocalMinima list to avoid endless loops etc ... if (IsFlat) { if (Closed) { delete [] edges; return false; } E->Prev->OutIdx = Skip; if (E->Prev->Bot.X < E->Prev->Top.X) ReverseHorizontal(*E->Prev); MinimaList::value_type locMin; locMin.Y = E->Bot.Y; locMin.LeftBound = 0; locMin.RightBound = E; locMin.RightBound->Side = esRight; locMin.RightBound->WindDelta = 0; while (E->Next->OutIdx != Skip) { E->NextInLML = E->Next; if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); E = E->Next; } m_MinimaList.push_back(locMin); m_edges.push_back(edges); return true; } m_edges.push_back(edges); bool leftBoundIsForward; TEdge* EMin = 0; //workaround to avoid an endless loop in the while loop below when //open paths have matching start and end points ... if (E->Prev->Bot == E->Prev->Top) E = E->Next; for (;;) { E = FindNextLocMin(E); if (E == EMin) break; else if (!EMin) EMin = E; //E and E.Prev now share a local minima (left aligned if horizontal). //Compare their slopes to find which starts which bound ... MinimaList::value_type locMin; locMin.Y = E->Bot.Y; if (E->Dx < E->Prev->Dx) { locMin.LeftBound = E->Prev; locMin.RightBound = E; leftBoundIsForward = false; //Q.nextInLML = Q.prev } else { locMin.LeftBound = E; locMin.RightBound = E->Prev; leftBoundIsForward = true; //Q.nextInLML = Q.next } locMin.LeftBound->Side = esLeft; locMin.RightBound->Side = esRight; if (!Closed) locMin.LeftBound->WindDelta = 0; else if (locMin.LeftBound->Next == locMin.RightBound) locMin.LeftBound->WindDelta = -1; else locMin.LeftBound->WindDelta = 1; locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta; E = ProcessBound(locMin.LeftBound, leftBoundIsForward); if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); if (locMin.LeftBound->OutIdx == Skip) locMin.LeftBound = 0; else if (locMin.RightBound->OutIdx == Skip) locMin.RightBound = 0; m_MinimaList.push_back(locMin); if (!leftBoundIsForward) E = E2; } return true; } //------------------------------------------------------------------------------ bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) { bool result = false; for (Paths::size_type i = 0; i < ppg.size(); ++i) if (AddPath(ppg[i], PolyTyp, Closed)) result = true; return result; } //------------------------------------------------------------------------------ void ClipperBase::Clear() { DisposeLocalMinimaList(); for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) { //for each edge array in turn, find the first used edge and //check for and remove any hiddenPts in each edge in the array. TEdge* edges = m_edges[i]; delete [] edges; } m_edges.clear(); m_UseFullRange = false; m_HasOpenPaths = false; } //------------------------------------------------------------------------------ void ClipperBase::Reset() { m_CurrentLM = m_MinimaList.begin(); if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter()); //reset all edges ... for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) { TEdge* e = lm->LeftBound; if (e) { e->Curr = e->Bot; e->Side = esLeft; e->OutIdx = Unassigned; } e = lm->RightBound; if (e) { e->Curr = e->Bot; e->Side = esRight; e->OutIdx = Unassigned; } } } //------------------------------------------------------------------------------ void ClipperBase::DisposeLocalMinimaList() { m_MinimaList.clear(); m_CurrentLM = m_MinimaList.begin(); } //------------------------------------------------------------------------------ void ClipperBase::PopLocalMinima() { if (m_CurrentLM == m_MinimaList.end()) return; ++m_CurrentLM; } //------------------------------------------------------------------------------ IntRect ClipperBase::GetBounds() { IntRect result; MinimaList::iterator lm = m_MinimaList.begin(); if (lm == m_MinimaList.end()) { result.left = result.top = result.right = result.bottom = 0; return result; } result.left = lm->LeftBound->Bot.X; result.top = lm->LeftBound->Bot.Y; result.right = lm->LeftBound->Bot.X; result.bottom = lm->LeftBound->Bot.Y; while (lm != m_MinimaList.end()) { result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y); TEdge* e = lm->LeftBound; for (;;) { TEdge* bottomE = e; while (e->NextInLML) { if (e->Bot.X < result.left) result.left = e->Bot.X; if (e->Bot.X > result.right) result.right = e->Bot.X; e = e->NextInLML; } result.left = std::min(result.left, e->Bot.X); result.right = std::max(result.right, e->Bot.X); result.left = std::min(result.left, e->Top.X); result.right = std::max(result.right, e->Top.X); result.top = std::min(result.top, e->Top.Y); if (bottomE == lm->LeftBound) e = lm->RightBound; else break; } ++lm; } return result; } //------------------------------------------------------------------------------ // TClipper methods ... //------------------------------------------------------------------------------ Clipper::Clipper(int initOptions) : ClipperBase() //constructor { m_ActiveEdges = 0; m_SortedEdges = 0; m_ExecuteLocked = false; m_UseFullRange = false; m_ReverseOutput = ((initOptions & ioReverseSolution) != 0); m_StrictSimple = ((initOptions & ioStrictlySimple) != 0); m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0); m_HasOpenPaths = false; #ifdef use_xyz m_ZFill = 0; #endif } //------------------------------------------------------------------------------ Clipper::~Clipper() //destructor { Clear(); } //------------------------------------------------------------------------------ #ifdef use_xyz void Clipper::ZFillFunction(ZFillCallback zFillFunc) { m_ZFill = zFillFunc; } //------------------------------------------------------------------------------ #endif void Clipper::Reset() { ClipperBase::Reset(); m_Scanbeam = ScanbeamList(); m_ActiveEdges = 0; m_SortedEdges = 0; for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) InsertScanbeam(lm->Y); } //------------------------------------------------------------------------------ bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType, PolyFillType clipFillType) { if( m_ExecuteLocked ) return false; if (m_HasOpenPaths) throw clipperException("Error: PolyTree struct is need for open path clipping."); m_ExecuteLocked = true; solution.resize(0); m_SubjFillType = subjFillType; m_ClipFillType = clipFillType; m_ClipType = clipType; m_UsingPolyTree = false; bool succeeded = ExecuteInternal(); if (succeeded) BuildResult(solution); DisposeAllOutRecs(); m_ExecuteLocked = false; return succeeded; } //------------------------------------------------------------------------------ bool Clipper::Execute(ClipType clipType, PolyTree& polytree, PolyFillType subjFillType, PolyFillType clipFillType) { if( m_ExecuteLocked ) return false; m_ExecuteLocked = true; m_SubjFillType = subjFillType; m_ClipFillType = clipFillType; m_ClipType = clipType; m_UsingPolyTree = true; bool succeeded = ExecuteInternal(); if (succeeded) BuildResult2(polytree); DisposeAllOutRecs(); m_ExecuteLocked = false; return succeeded; } //------------------------------------------------------------------------------ void Clipper::FixHoleLinkage(OutRec &outrec) { //skip OutRecs that (a) contain outermost polygons or //(b) already have the correct owner/child linkage ... if (!outrec.FirstLeft || (outrec.IsHole != outrec.FirstLeft->IsHole && outrec.FirstLeft->Pts)) return; OutRec* orfl = outrec.FirstLeft; while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts)) orfl = orfl->FirstLeft; outrec.FirstLeft = orfl; } //------------------------------------------------------------------------------ bool Clipper::ExecuteInternal() { bool succeeded = true; try { Reset(); if (m_CurrentLM == m_MinimaList.end()) return true; cInt botY = PopScanbeam(); do { InsertLocalMinimaIntoAEL(botY); ClearGhostJoins(); ProcessHorizontals(false); if (m_Scanbeam.empty()) break; cInt topY = PopScanbeam(); succeeded = ProcessIntersections(topY); if (!succeeded) break; ProcessEdgesAtTopOfScanbeam(topY); botY = topY; } while (!m_Scanbeam.empty() || m_CurrentLM != m_MinimaList.end()); } catch(...) { succeeded = false; } if (succeeded) { //fix orientations ... for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec *outRec = m_PolyOuts[i]; if (!outRec->Pts || outRec->IsOpen) continue; if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) ReversePolyPtLinks(outRec->Pts); } if (!m_Joins.empty()) JoinCommonEdges(); //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec *outRec = m_PolyOuts[i]; if (outRec->Pts && !outRec->IsOpen) FixupOutPolygon(*outRec); } if (m_StrictSimple) DoSimplePolygons(); } ClearJoins(); ClearGhostJoins(); return succeeded; } //------------------------------------------------------------------------------ void Clipper::InsertScanbeam(const cInt Y) { //if (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) return;// avoid duplicates. m_Scanbeam.push(Y); } //------------------------------------------------------------------------------ cInt Clipper::PopScanbeam() { const cInt Y = m_Scanbeam.top(); m_Scanbeam.pop(); while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates. return Y; } //------------------------------------------------------------------------------ void Clipper::DisposeAllOutRecs(){ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) DisposeOutRec(i); m_PolyOuts.clear(); } //------------------------------------------------------------------------------ void Clipper::DisposeOutRec(PolyOutList::size_type index) { OutRec *outRec = m_PolyOuts[index]; if (outRec->Pts) DisposeOutPts(outRec->Pts); delete outRec; m_PolyOuts[index] = 0; } //------------------------------------------------------------------------------ void Clipper::SetWindingCount(TEdge &edge) { TEdge *e = edge.PrevInAEL; //find the edge of the same polytype that immediately preceeds 'edge' in AEL while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL; if (!e) { edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); edge.WindCnt2 = 0; e = m_ActiveEdges; //ie get ready to calc WindCnt2 } else if (edge.WindDelta == 0 && m_ClipType != ctUnion) { edge.WindCnt = 1; edge.WindCnt2 = e->WindCnt2; e = e->NextInAEL; //ie get ready to calc WindCnt2 } else if (IsEvenOddFillType(edge)) { //EvenOdd filling ... if (edge.WindDelta == 0) { //are we inside a subj polygon ... bool Inside = true; TEdge *e2 = e->PrevInAEL; while (e2) { if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0) Inside = !Inside; e2 = e2->PrevInAEL; } edge.WindCnt = (Inside ? 0 : 1); } else { edge.WindCnt = edge.WindDelta; } edge.WindCnt2 = e->WindCnt2; e = e->NextInAEL; //ie get ready to calc WindCnt2 } else { //nonZero, Positive or Negative filling ... if (e->WindCnt * e->WindDelta < 0) { //prev edge is 'decreasing' WindCount (WC) toward zero //so we're outside the previous polygon ... if (Abs(e->WindCnt) > 1) { //outside prev poly but still inside another. //when reversing direction of prev poly use the same WC if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; //otherwise continue to 'decrease' WC ... else edge.WindCnt = e->WindCnt + edge.WindDelta; } else //now outside all polys of same polytype so set own WC ... edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); } else { //prev edge is 'increasing' WindCount (WC) away from zero //so we're inside the previous polygon ... if (edge.WindDelta == 0) edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1); //if wind direction is reversing prev then use same WC else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; //otherwise add to WC ... else edge.WindCnt = e->WindCnt + edge.WindDelta; } edge.WindCnt2 = e->WindCnt2; e = e->NextInAEL; //ie get ready to calc WindCnt2 } //update WindCnt2 ... if (IsEvenOddAltFillType(edge)) { //EvenOdd filling ... while (e != &edge) { if (e->WindDelta != 0) edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); e = e->NextInAEL; } } else { //nonZero, Positive or Negative filling ... while ( e != &edge ) { edge.WindCnt2 += e->WindDelta; e = e->NextInAEL; } } } //------------------------------------------------------------------------------ bool Clipper::IsEvenOddFillType(const TEdge& edge) const { if (edge.PolyTyp == ptSubject) return m_SubjFillType == pftEvenOdd; else return m_ClipFillType == pftEvenOdd; } //------------------------------------------------------------------------------ bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const { if (edge.PolyTyp == ptSubject) return m_ClipFillType == pftEvenOdd; else return m_SubjFillType == pftEvenOdd; } //------------------------------------------------------------------------------ bool Clipper::IsContributing(const TEdge& edge) const { PolyFillType pft, pft2; if (edge.PolyTyp == ptSubject) { pft = m_SubjFillType; pft2 = m_ClipFillType; } else { pft = m_ClipFillType; pft2 = m_SubjFillType; } switch(pft) { case pftEvenOdd: //return false if a subj line has been flagged as inside a subj polygon if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; break; case pftNonZero: if (Abs(edge.WindCnt) != 1) return false; break; case pftPositive: if (edge.WindCnt != 1) return false; break; default: //pftNegative if (edge.WindCnt != -1) return false; } switch(m_ClipType) { case ctIntersection: switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 != 0); case pftPositive: return (edge.WindCnt2 > 0); default: return (edge.WindCnt2 < 0); } break; case ctUnion: switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 == 0); case pftPositive: return (edge.WindCnt2 <= 0); default: return (edge.WindCnt2 >= 0); } break; case ctDifference: if (edge.PolyTyp == ptSubject) switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 == 0); case pftPositive: return (edge.WindCnt2 <= 0); default: return (edge.WindCnt2 >= 0); } else switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 != 0); case pftPositive: return (edge.WindCnt2 > 0); default: return (edge.WindCnt2 < 0); } break; case ctXor: if (edge.WindDelta == 0) //XOr always contributing unless open switch(pft2) { case pftEvenOdd: case pftNonZero: return (edge.WindCnt2 == 0); case pftPositive: return (edge.WindCnt2 <= 0); default: return (edge.WindCnt2 >= 0); } else return true; break; default: return true; } } //------------------------------------------------------------------------------ OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) { OutPt* result; TEdge *e, *prevE; if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) { result = AddOutPt(e1, Pt); e2->OutIdx = e1->OutIdx; e1->Side = esLeft; e2->Side = esRight; e = e1; if (e->PrevInAEL == e2) prevE = e2->PrevInAEL; else prevE = e->PrevInAEL; } else { result = AddOutPt(e2, Pt); e1->OutIdx = e2->OutIdx; e1->Side = esRight; e2->Side = esLeft; e = e2; if (e->PrevInAEL == e1) prevE = e1->PrevInAEL; else prevE = e->PrevInAEL; } if (prevE && prevE->OutIdx >= 0 && (TopX(*prevE, Pt.Y) == TopX(*e, Pt.Y)) && SlopesEqual(*e, *prevE, m_UseFullRange) && (e->WindDelta != 0) && (prevE->WindDelta != 0)) { OutPt* outPt = AddOutPt(prevE, Pt); AddJoin(result, outPt, e->Top); } return result; } //------------------------------------------------------------------------------ void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) { AddOutPt( e1, Pt ); if (e2->WindDelta == 0) AddOutPt(e2, Pt); if( e1->OutIdx == e2->OutIdx ) { e1->OutIdx = Unassigned; e2->OutIdx = Unassigned; } else if (e1->OutIdx < e2->OutIdx) AppendPolygon(e1, e2); else AppendPolygon(e2, e1); } //------------------------------------------------------------------------------ void Clipper::AddEdgeToSEL(TEdge *edge) { //SEL pointers in PEdge are reused to build a list of horizontal edges. //However, we don't need to worry about order with horizontal edge processing. if( !m_SortedEdges ) { m_SortedEdges = edge; edge->PrevInSEL = 0; edge->NextInSEL = 0; } else { edge->NextInSEL = m_SortedEdges; edge->PrevInSEL = 0; m_SortedEdges->PrevInSEL = edge; m_SortedEdges = edge; } } //------------------------------------------------------------------------------ void Clipper::CopyAELToSEL() { TEdge* e = m_ActiveEdges; m_SortedEdges = e; while ( e ) { e->PrevInSEL = e->PrevInAEL; e->NextInSEL = e->NextInAEL; e = e->NextInAEL; } } //------------------------------------------------------------------------------ void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt) { Join* j = new Join; j->OutPt1 = op1; j->OutPt2 = op2; j->OffPt = OffPt; m_Joins.push_back(j); } //------------------------------------------------------------------------------ void Clipper::ClearJoins() { for (JoinList::size_type i = 0; i < m_Joins.size(); i++) delete m_Joins[i]; m_Joins.resize(0); } //------------------------------------------------------------------------------ void Clipper::ClearGhostJoins() { for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++) delete m_GhostJoins[i]; m_GhostJoins.resize(0); } //------------------------------------------------------------------------------ void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) { Join* j = new Join; j->OutPt1 = op; j->OutPt2 = 0; j->OffPt = OffPt; m_GhostJoins.push_back(j); } //------------------------------------------------------------------------------ void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) { while (m_CurrentLM != m_MinimaList.end() && (m_CurrentLM->Y == botY)) { TEdge* lb = m_CurrentLM->LeftBound; TEdge* rb = m_CurrentLM->RightBound; PopLocalMinima(); OutPt *Op1 = 0; if (!lb) { //nb: don't insert LB into either AEL or SEL InsertEdgeIntoAEL(rb, 0); SetWindingCount(*rb); if (IsContributing(*rb)) Op1 = AddOutPt(rb, rb->Bot); } else if (!rb) { InsertEdgeIntoAEL(lb, 0); SetWindingCount(*lb); if (IsContributing(*lb)) Op1 = AddOutPt(lb, lb->Bot); InsertScanbeam(lb->Top.Y); } else { InsertEdgeIntoAEL(lb, 0); InsertEdgeIntoAEL(rb, lb); SetWindingCount( *lb ); rb->WindCnt = lb->WindCnt; rb->WindCnt2 = lb->WindCnt2; if (IsContributing(*lb)) Op1 = AddLocalMinPoly(lb, rb, lb->Bot); InsertScanbeam(lb->Top.Y); } if (rb) { if(IsHorizontal(*rb)) AddEdgeToSEL(rb); else InsertScanbeam( rb->Top.Y ); } if (!lb || !rb) continue; //if any output polygons share an edge, they'll need joining later ... if (Op1 && IsHorizontal(*rb) && m_GhostJoins.size() > 0 && (rb->WindDelta != 0)) { for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) { Join* jr = m_GhostJoins[i]; //if the horizontal Rb and a 'ghost' horizontal overlap, then convert //the 'ghost' join to a real join ready for later ... if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) AddJoin(jr->OutPt1, Op1, jr->OffPt); } } if (lb->OutIdx >= 0 && lb->PrevInAEL && lb->PrevInAEL->Curr.X == lb->Bot.X && lb->PrevInAEL->OutIdx >= 0 && SlopesEqual(*lb->PrevInAEL, *lb, m_UseFullRange) && (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0)) { OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot); AddJoin(Op1, Op2, lb->Top); } if(lb->NextInAEL != rb) { if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 && SlopesEqual(*rb->PrevInAEL, *rb, m_UseFullRange) && (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0)) { OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot); AddJoin(Op1, Op2, rb->Top); } TEdge* e = lb->NextInAEL; if (e) { while( e != rb ) { //nb: For calculating winding counts etc, IntersectEdges() assumes //that param1 will be to the Right of param2 ABOVE the intersection ... IntersectEdges(rb , e , lb->Curr); //order important here e = e->NextInAEL; } } } } } //------------------------------------------------------------------------------ void Clipper::DeleteFromAEL(TEdge *e) { TEdge* AelPrev = e->PrevInAEL; TEdge* AelNext = e->NextInAEL; if( !AelPrev && !AelNext && (e != m_ActiveEdges) ) return; //already deleted if( AelPrev ) AelPrev->NextInAEL = AelNext; else m_ActiveEdges = AelNext; if( AelNext ) AelNext->PrevInAEL = AelPrev; e->NextInAEL = 0; e->PrevInAEL = 0; } //------------------------------------------------------------------------------ void Clipper::DeleteFromSEL(TEdge *e) { TEdge* SelPrev = e->PrevInSEL; TEdge* SelNext = e->NextInSEL; if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted if( SelPrev ) SelPrev->NextInSEL = SelNext; else m_SortedEdges = SelNext; if( SelNext ) SelNext->PrevInSEL = SelPrev; e->NextInSEL = 0; e->PrevInSEL = 0; } //------------------------------------------------------------------------------ #ifdef use_xyz void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2) { if (pt.Z != 0 || !m_ZFill) return; else if (pt == e1.Bot) pt.Z = e1.Bot.Z; else if (pt == e1.Top) pt.Z = e1.Top.Z; else if (pt == e2.Bot) pt.Z = e2.Bot.Z; else if (pt == e2.Top) pt.Z = e2.Top.Z; else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); } //------------------------------------------------------------------------------ #endif void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) { bool e1Contributing = ( e1->OutIdx >= 0 ); bool e2Contributing = ( e2->OutIdx >= 0 ); #ifdef use_xyz SetZ(Pt, *e1, *e2); #endif #ifdef use_lines //if either edge is on an OPEN path ... if (e1->WindDelta == 0 || e2->WindDelta == 0) { //ignore subject-subject open path intersections UNLESS they //are both open paths, AND they are both 'contributing maximas' ... if (e1->WindDelta == 0 && e2->WindDelta == 0) return; //if intersecting a subj line with a subj poly ... else if (e1->PolyTyp == e2->PolyTyp && e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion) { if (e1->WindDelta == 0) { if (e2Contributing) { AddOutPt(e1, Pt); if (e1Contributing) e1->OutIdx = Unassigned; } } else { if (e1Contributing) { AddOutPt(e2, Pt); if (e2Contributing) e2->OutIdx = Unassigned; } } } else if (e1->PolyTyp != e2->PolyTyp) { //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ... if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && (m_ClipType != ctUnion || e2->WindCnt2 == 0)) { AddOutPt(e1, Pt); if (e1Contributing) e1->OutIdx = Unassigned; } else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && (m_ClipType != ctUnion || e1->WindCnt2 == 0)) { AddOutPt(e2, Pt); if (e2Contributing) e2->OutIdx = Unassigned; } } return; } #endif //update winding counts... //assumes that e1 will be to the Right of e2 ABOVE the intersection if ( e1->PolyTyp == e2->PolyTyp ) { if ( IsEvenOddFillType( *e1) ) { int oldE1WindCnt = e1->WindCnt; e1->WindCnt = e2->WindCnt; e2->WindCnt = oldE1WindCnt; } else { if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt; else e1->WindCnt += e2->WindDelta; if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt; else e2->WindCnt -= e1->WindDelta; } } else { if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta; else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0; if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta; else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0; } PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; if (e1->PolyTyp == ptSubject) { e1FillType = m_SubjFillType; e1FillType2 = m_ClipFillType; } else { e1FillType = m_ClipFillType; e1FillType2 = m_SubjFillType; } if (e2->PolyTyp == ptSubject) { e2FillType = m_SubjFillType; e2FillType2 = m_ClipFillType; } else { e2FillType = m_ClipFillType; e2FillType2 = m_SubjFillType; } cInt e1Wc, e2Wc; switch (e1FillType) { case pftPositive: e1Wc = e1->WindCnt; break; case pftNegative: e1Wc = -e1->WindCnt; break; default: e1Wc = Abs(e1->WindCnt); } switch(e2FillType) { case pftPositive: e2Wc = e2->WindCnt; break; case pftNegative: e2Wc = -e2->WindCnt; break; default: e2Wc = Abs(e2->WindCnt); } if ( e1Contributing && e2Contributing ) { if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) ) { AddLocalMaxPoly(e1, e2, Pt); } else { AddOutPt(e1, Pt); AddOutPt(e2, Pt); SwapSides( *e1 , *e2 ); SwapPolyIndexes( *e1 , *e2 ); } } else if ( e1Contributing ) { if (e2Wc == 0 || e2Wc == 1) { AddOutPt(e1, Pt); SwapSides(*e1, *e2); SwapPolyIndexes(*e1, *e2); } } else if ( e2Contributing ) { if (e1Wc == 0 || e1Wc == 1) { AddOutPt(e2, Pt); SwapSides(*e1, *e2); SwapPolyIndexes(*e1, *e2); } } else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) { //neither edge is currently contributing ... cInt e1Wc2, e2Wc2; switch (e1FillType2) { case pftPositive: e1Wc2 = e1->WindCnt2; break; case pftNegative : e1Wc2 = -e1->WindCnt2; break; default: e1Wc2 = Abs(e1->WindCnt2); } switch (e2FillType2) { case pftPositive: e2Wc2 = e2->WindCnt2; break; case pftNegative: e2Wc2 = -e2->WindCnt2; break; default: e2Wc2 = Abs(e2->WindCnt2); } if (e1->PolyTyp != e2->PolyTyp) { AddLocalMinPoly(e1, e2, Pt); } else if (e1Wc == 1 && e2Wc == 1) switch( m_ClipType ) { case ctIntersection: if (e1Wc2 > 0 && e2Wc2 > 0) AddLocalMinPoly(e1, e2, Pt); break; case ctUnion: if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) AddLocalMinPoly(e1, e2, Pt); break; case ctDifference: if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) AddLocalMinPoly(e1, e2, Pt); break; case ctXor: AddLocalMinPoly(e1, e2, Pt); } else SwapSides( *e1, *e2 ); } } //------------------------------------------------------------------------------ void Clipper::SetHoleState(TEdge *e, OutRec *outrec) { bool IsHole = false; TEdge *e2 = e->PrevInAEL; while (e2) { if (e2->OutIdx >= 0 && e2->WindDelta != 0) { IsHole = !IsHole; if (! outrec->FirstLeft) outrec->FirstLeft = m_PolyOuts[e2->OutIdx]; } e2 = e2->PrevInAEL; } if (IsHole) outrec->IsHole = true; } //------------------------------------------------------------------------------ OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) { //work out which polygon fragment has the correct hole state ... if (!outRec1->BottomPt) outRec1->BottomPt = GetBottomPt(outRec1->Pts); if (!outRec2->BottomPt) outRec2->BottomPt = GetBottomPt(outRec2->Pts); OutPt *OutPt1 = outRec1->BottomPt; OutPt *OutPt2 = outRec2->BottomPt; if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1; else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2; else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1; else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2; else if (OutPt1->Next == OutPt1) return outRec2; else if (OutPt2->Next == OutPt2) return outRec1; else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1; else return outRec2; } //------------------------------------------------------------------------------ bool Param1RightOfParam2(OutRec* outRec1, OutRec* outRec2) { do { outRec1 = outRec1->FirstLeft; if (outRec1 == outRec2) return true; } while (outRec1); return false; } //------------------------------------------------------------------------------ OutRec* Clipper::GetOutRec(int Idx) { OutRec* outrec = m_PolyOuts[Idx]; while (outrec != m_PolyOuts[outrec->Idx]) outrec = m_PolyOuts[outrec->Idx]; return outrec; } //------------------------------------------------------------------------------ void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) { //get the start and ends of both output polygons ... OutRec *outRec1 = m_PolyOuts[e1->OutIdx]; OutRec *outRec2 = m_PolyOuts[e2->OutIdx]; OutRec *holeStateRec; if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2; else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1; else holeStateRec = GetLowermostRec(outRec1, outRec2); //get the start and ends of both output polygons and //join e2 poly onto e1 poly and delete pointers to e2 ... OutPt* p1_lft = outRec1->Pts; OutPt* p1_rt = p1_lft->Prev; OutPt* p2_lft = outRec2->Pts; OutPt* p2_rt = p2_lft->Prev; EdgeSide Side; //join e2 poly onto e1 poly and delete pointers to e2 ... if( e1->Side == esLeft ) { if( e2->Side == esLeft ) { //z y x a b c ReversePolyPtLinks(p2_lft); p2_lft->Next = p1_lft; p1_lft->Prev = p2_lft; p1_rt->Next = p2_rt; p2_rt->Prev = p1_rt; outRec1->Pts = p2_rt; } else { //x y z a b c p2_rt->Next = p1_lft; p1_lft->Prev = p2_rt; p2_lft->Prev = p1_rt; p1_rt->Next = p2_lft; outRec1->Pts = p2_lft; } Side = esLeft; } else { if( e2->Side == esRight ) { //a b c z y x ReversePolyPtLinks(p2_lft); p1_rt->Next = p2_rt; p2_rt->Prev = p1_rt; p2_lft->Next = p1_lft; p1_lft->Prev = p2_lft; } else { //a b c x y z p1_rt->Next = p2_lft; p2_lft->Prev = p1_rt; p1_lft->Prev = p2_rt; p2_rt->Next = p1_lft; } Side = esRight; } outRec1->BottomPt = 0; if (holeStateRec == outRec2) { if (outRec2->FirstLeft != outRec1) outRec1->FirstLeft = outRec2->FirstLeft; outRec1->IsHole = outRec2->IsHole; } outRec2->Pts = 0; outRec2->BottomPt = 0; outRec2->FirstLeft = outRec1; int OKIdx = e1->OutIdx; int ObsoleteIdx = e2->OutIdx; e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly e2->OutIdx = Unassigned; TEdge* e = m_ActiveEdges; while( e ) { if( e->OutIdx == ObsoleteIdx ) { e->OutIdx = OKIdx; e->Side = Side; break; } e = e->NextInAEL; } outRec2->Idx = outRec1->Idx; } //------------------------------------------------------------------------------ OutRec* Clipper::CreateOutRec() { OutRec* result = new OutRec; result->IsHole = false; result->IsOpen = false; result->FirstLeft = 0; result->Pts = 0; result->BottomPt = 0; result->PolyNd = 0; m_PolyOuts.push_back(result); result->Idx = (int)m_PolyOuts.size()-1; return result; } //------------------------------------------------------------------------------ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) { bool ToFront = (e->Side == esLeft); if( e->OutIdx < 0 ) { OutRec *outRec = CreateOutRec(); outRec->IsOpen = (e->WindDelta == 0); OutPt* newOp = new OutPt; outRec->Pts = newOp; newOp->Idx = outRec->Idx; newOp->Pt = pt; newOp->Next = newOp; newOp->Prev = newOp; if (!outRec->IsOpen) SetHoleState(e, outRec); e->OutIdx = outRec->Idx; return newOp; } else { OutRec *outRec = m_PolyOuts[e->OutIdx]; //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' OutPt* op = outRec->Pts; if (ToFront && (pt == op->Pt)) return op; else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev; OutPt* newOp = new OutPt; newOp->Idx = outRec->Idx; newOp->Pt = pt; newOp->Next = op; newOp->Prev = op->Prev; newOp->Prev->Next = newOp; op->Prev = newOp; if (ToFront) outRec->Pts = newOp; return newOp; } } //------------------------------------------------------------------------------ void Clipper::ProcessHorizontals(bool IsTopOfScanbeam) { TEdge* horzEdge = m_SortedEdges; while(horzEdge) { DeleteFromSEL(horzEdge); ProcessHorizontal(horzEdge, IsTopOfScanbeam); horzEdge = m_SortedEdges; } } //------------------------------------------------------------------------------ inline bool IsMinima(TEdge *e) { return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e); } //------------------------------------------------------------------------------ inline bool IsMaxima(TEdge *e, const cInt Y) { return e && e->Top.Y == Y && !e->NextInLML; } //------------------------------------------------------------------------------ inline bool IsIntermediate(TEdge *e, const cInt Y) { return e->Top.Y == Y && e->NextInLML; } //------------------------------------------------------------------------------ TEdge *GetMaximaPair(TEdge *e) { TEdge* result = 0; if ((e->Next->Top == e->Top) && !e->Next->NextInLML) result = e->Next; else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML) result = e->Prev; if (result && (result->OutIdx == Skip || //result is false if both NextInAEL & PrevInAEL are nil & not horizontal ... (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) return 0; return result; } //------------------------------------------------------------------------------ void Clipper::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2) { //check that one or other edge hasn't already been removed from AEL ... if (Edge1->NextInAEL == Edge1->PrevInAEL || Edge2->NextInAEL == Edge2->PrevInAEL) return; if( Edge1->NextInAEL == Edge2 ) { TEdge* Next = Edge2->NextInAEL; if( Next ) Next->PrevInAEL = Edge1; TEdge* Prev = Edge1->PrevInAEL; if( Prev ) Prev->NextInAEL = Edge2; Edge2->PrevInAEL = Prev; Edge2->NextInAEL = Edge1; Edge1->PrevInAEL = Edge2; Edge1->NextInAEL = Next; } else if( Edge2->NextInAEL == Edge1 ) { TEdge* Next = Edge1->NextInAEL; if( Next ) Next->PrevInAEL = Edge2; TEdge* Prev = Edge2->PrevInAEL; if( Prev ) Prev->NextInAEL = Edge1; Edge1->PrevInAEL = Prev; Edge1->NextInAEL = Edge2; Edge2->PrevInAEL = Edge1; Edge2->NextInAEL = Next; } else { TEdge* Next = Edge1->NextInAEL; TEdge* Prev = Edge1->PrevInAEL; Edge1->NextInAEL = Edge2->NextInAEL; if( Edge1->NextInAEL ) Edge1->NextInAEL->PrevInAEL = Edge1; Edge1->PrevInAEL = Edge2->PrevInAEL; if( Edge1->PrevInAEL ) Edge1->PrevInAEL->NextInAEL = Edge1; Edge2->NextInAEL = Next; if( Edge2->NextInAEL ) Edge2->NextInAEL->PrevInAEL = Edge2; Edge2->PrevInAEL = Prev; if( Edge2->PrevInAEL ) Edge2->PrevInAEL->NextInAEL = Edge2; } if( !Edge1->PrevInAEL ) m_ActiveEdges = Edge1; else if( !Edge2->PrevInAEL ) m_ActiveEdges = Edge2; } //------------------------------------------------------------------------------ void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2) { if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return; if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return; if( Edge1->NextInSEL == Edge2 ) { TEdge* Next = Edge2->NextInSEL; if( Next ) Next->PrevInSEL = Edge1; TEdge* Prev = Edge1->PrevInSEL; if( Prev ) Prev->NextInSEL = Edge2; Edge2->PrevInSEL = Prev; Edge2->NextInSEL = Edge1; Edge1->PrevInSEL = Edge2; Edge1->NextInSEL = Next; } else if( Edge2->NextInSEL == Edge1 ) { TEdge* Next = Edge1->NextInSEL; if( Next ) Next->PrevInSEL = Edge2; TEdge* Prev = Edge2->PrevInSEL; if( Prev ) Prev->NextInSEL = Edge1; Edge1->PrevInSEL = Prev; Edge1->NextInSEL = Edge2; Edge2->PrevInSEL = Edge1; Edge2->NextInSEL = Next; } else { TEdge* Next = Edge1->NextInSEL; TEdge* Prev = Edge1->PrevInSEL; Edge1->NextInSEL = Edge2->NextInSEL; if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1; Edge1->PrevInSEL = Edge2->PrevInSEL; if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1; Edge2->NextInSEL = Next; if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2; Edge2->PrevInSEL = Prev; if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2; } if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1; else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2; } //------------------------------------------------------------------------------ TEdge* GetNextInAEL(TEdge *e, Direction dir) { return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL; } //------------------------------------------------------------------------------ void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right) { if (HorzEdge.Bot.X < HorzEdge.Top.X) { Left = HorzEdge.Bot.X; Right = HorzEdge.Top.X; Dir = dLeftToRight; } else { Left = HorzEdge.Top.X; Right = HorzEdge.Bot.X; Dir = dRightToLeft; } } //------------------------------------------------------------------------ /******************************************************************************* * Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or * * Bottom of a scanbeam) are processed as if layered. The order in which HEs * * are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] * * (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), * * and with other non-horizontal edges [*]. Once these intersections are * * processed, intermediate HEs then 'promote' the Edge above (NextInLML) into * * the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. * *******************************************************************************/ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) { Direction dir; cInt horzLeft, horzRight; GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); TEdge* eLastHorz = horzEdge, *eMaxPair = 0; while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML)) eLastHorz = eLastHorz->NextInLML; if (!eLastHorz->NextInLML) eMaxPair = GetMaximaPair(eLastHorz); for (;;) { bool IsLastHorz = (horzEdge == eLastHorz); TEdge* e = GetNextInAEL(horzEdge, dir); while(e) { //Break if we've got to the end of an intermediate horizontal edge ... //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML && e->Dx < horzEdge->NextInLML->Dx) break; TEdge* eNext = GetNextInAEL(e, dir); //saves eNext for later if ((dir == dLeftToRight && e->Curr.X <= horzRight) || (dir == dRightToLeft && e->Curr.X >= horzLeft)) { //so far we're still in range of the horizontal Edge but make sure //we're at the last of consec. horizontals when matching with eMaxPair if(e == eMaxPair && IsLastHorz) { if (horzEdge->OutIdx >= 0) { OutPt* op1 = AddOutPt(horzEdge, horzEdge->Top); TEdge* eNextHorz = m_SortedEdges; while (eNextHorz) { if (eNextHorz->OutIdx >= 0 && HorzSegmentsOverlap(horzEdge->Bot.X, horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) { OutPt* op2 = AddOutPt(eNextHorz, eNextHorz->Bot); AddJoin(op2, op1, eNextHorz->Top); } eNextHorz = eNextHorz->NextInSEL; } AddGhostJoin(op1, horzEdge->Bot); AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top); } DeleteFromAEL(horzEdge); DeleteFromAEL(eMaxPair); return; } else if(dir == dLeftToRight) { IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); IntersectEdges(horzEdge, e, Pt); } else { IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); IntersectEdges( e, horzEdge, Pt); } SwapPositionsInAEL( horzEdge, e ); } else if( (dir == dLeftToRight && e->Curr.X >= horzRight) || (dir == dRightToLeft && e->Curr.X <= horzLeft) ) break; e = eNext; } //end while if (horzEdge->NextInLML && IsHorizontal(*horzEdge->NextInLML)) { UpdateEdgeIntoAEL(horzEdge); if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot); GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); } else break; } //end for (;;) if(horzEdge->NextInLML) { if(horzEdge->OutIdx >= 0) { OutPt* op1 = AddOutPt( horzEdge, horzEdge->Top); if (isTopOfScanbeam) AddGhostJoin(op1, horzEdge->Bot); UpdateEdgeIntoAEL(horzEdge); if (horzEdge->WindDelta == 0) return; //nb: HorzEdge is no longer horizontal here TEdge* ePrev = horzEdge->PrevInAEL; TEdge* eNext = horzEdge->NextInAEL; if (ePrev && ePrev->Curr.X == horzEdge->Bot.X && ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 && (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && SlopesEqual(*horzEdge, *ePrev, m_UseFullRange))) { OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot); AddJoin(op1, op2, horzEdge->Top); } else if (eNext && eNext->Curr.X == horzEdge->Bot.X && eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 && eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && SlopesEqual(*horzEdge, *eNext, m_UseFullRange)) { OutPt* op2 = AddOutPt(eNext, horzEdge->Bot); AddJoin(op1, op2, horzEdge->Top); } } else UpdateEdgeIntoAEL(horzEdge); } else { if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top); DeleteFromAEL(horzEdge); } } //------------------------------------------------------------------------------ void Clipper::UpdateEdgeIntoAEL(TEdge *&e) { if( !e->NextInLML ) throw clipperException("UpdateEdgeIntoAEL: invalid call"); e->NextInLML->OutIdx = e->OutIdx; TEdge* AelPrev = e->PrevInAEL; TEdge* AelNext = e->NextInAEL; if (AelPrev) AelPrev->NextInAEL = e->NextInLML; else m_ActiveEdges = e->NextInLML; if (AelNext) AelNext->PrevInAEL = e->NextInLML; e->NextInLML->Side = e->Side; e->NextInLML->WindDelta = e->WindDelta; e->NextInLML->WindCnt = e->WindCnt; e->NextInLML->WindCnt2 = e->WindCnt2; e = e->NextInLML; e->Curr = e->Bot; e->PrevInAEL = AelPrev; e->NextInAEL = AelNext; if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y); } //------------------------------------------------------------------------------ bool Clipper::ProcessIntersections(const cInt topY) { if( !m_ActiveEdges ) return true; try { BuildIntersectList(topY); size_t IlSize = m_IntersectList.size(); if (IlSize == 0) return true; if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList(); else return false; } catch(...) { m_SortedEdges = 0; DisposeIntersectNodes(); throw clipperException("ProcessIntersections error"); } m_SortedEdges = 0; return true; } //------------------------------------------------------------------------------ void Clipper::DisposeIntersectNodes() { for (size_t i = 0; i < m_IntersectList.size(); ++i ) delete m_IntersectList[i]; m_IntersectList.clear(); } //------------------------------------------------------------------------------ void Clipper::BuildIntersectList(const cInt topY) { if ( !m_ActiveEdges ) return; //prepare for sorting ... TEdge* e = m_ActiveEdges; m_SortedEdges = e; while( e ) { e->PrevInSEL = e->PrevInAEL; e->NextInSEL = e->NextInAEL; e->Curr.X = TopX( *e, topY ); e = e->NextInAEL; } //bubblesort ... bool isModified; do { isModified = false; e = m_SortedEdges; while( e->NextInSEL ) { TEdge *eNext = e->NextInSEL; IntPoint Pt; if(e->Curr.X > eNext->Curr.X) { IntersectPoint(*e, *eNext, Pt); IntersectNode * newNode = new IntersectNode; newNode->Edge1 = e; newNode->Edge2 = eNext; newNode->Pt = Pt; m_IntersectList.push_back(newNode); SwapPositionsInSEL(e, eNext); isModified = true; } else e = eNext; } if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0; else break; } while ( isModified ); m_SortedEdges = 0; //important } //------------------------------------------------------------------------------ void Clipper::ProcessIntersectList() { for (size_t i = 0; i < m_IntersectList.size(); ++i) { IntersectNode* iNode = m_IntersectList[i]; { IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt); SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 ); } delete iNode; } m_IntersectList.clear(); } //------------------------------------------------------------------------------ bool IntersectListSort(IntersectNode* node1, IntersectNode* node2) { return node2->Pt.Y < node1->Pt.Y; } //------------------------------------------------------------------------------ inline bool EdgesAdjacent(const IntersectNode &inode) { return (inode.Edge1->NextInSEL == inode.Edge2) || (inode.Edge1->PrevInSEL == inode.Edge2); } //------------------------------------------------------------------------------ bool Clipper::FixupIntersectionOrder() { //pre-condition: intersections are sorted Bottom-most first. //Now it's crucial that intersections are made only between adjacent edges, //so to ensure this the order of intersections may need adjusting ... CopyAELToSEL(); std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort); size_t cnt = m_IntersectList.size(); for (size_t i = 0; i < cnt; ++i) { if (!EdgesAdjacent(*m_IntersectList[i])) { size_t j = i + 1; while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++; if (j == cnt) return false; std::swap(m_IntersectList[i], m_IntersectList[j]); } SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2); } return true; } //------------------------------------------------------------------------------ void Clipper::DoMaxima(TEdge *e) { TEdge* eMaxPair = GetMaximaPair(e); if (!eMaxPair) { if (e->OutIdx >= 0) AddOutPt(e, e->Top); DeleteFromAEL(e); return; } TEdge* eNext = e->NextInAEL; while(eNext && eNext != eMaxPair) { IntersectEdges(e, eNext, e->Top); SwapPositionsInAEL(e, eNext); eNext = e->NextInAEL; } if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned) { DeleteFromAEL(e); DeleteFromAEL(eMaxPair); } else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) { if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); DeleteFromAEL(e); DeleteFromAEL(eMaxPair); } #ifdef use_lines else if (e->WindDelta == 0) { if (e->OutIdx >= 0) { AddOutPt(e, e->Top); e->OutIdx = Unassigned; } DeleteFromAEL(e); if (eMaxPair->OutIdx >= 0) { AddOutPt(eMaxPair, e->Top); eMaxPair->OutIdx = Unassigned; } DeleteFromAEL(eMaxPair); } #endif else throw clipperException("DoMaxima error"); } //------------------------------------------------------------------------------ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) { TEdge* e = m_ActiveEdges; while( e ) { //1. process maxima, treating them as if they're 'bent' horizontal edges, // but exclude maxima with horizontal edges. nb: e can't be a horizontal. bool IsMaximaEdge = IsMaxima(e, topY); if(IsMaximaEdge) { TEdge* eMaxPair = GetMaximaPair(e); IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair)); } if(IsMaximaEdge) { TEdge* ePrev = e->PrevInAEL; DoMaxima(e); if( !ePrev ) e = m_ActiveEdges; else e = ePrev->NextInAEL; } else { //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML)) { UpdateEdgeIntoAEL(e); if (e->OutIdx >= 0) AddOutPt(e, e->Bot); AddEdgeToSEL(e); } else { e->Curr.X = TopX( *e, topY ); e->Curr.Y = topY; } if (m_StrictSimple) { TEdge* ePrev = e->PrevInAEL; if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) { IntPoint pt = e->Curr; #ifdef use_xyz SetZ(pt, *ePrev, *e); #endif OutPt* op = AddOutPt(ePrev, pt); OutPt* op2 = AddOutPt(e, pt); AddJoin(op, op2, pt); //StrictlySimple (type-3) join } } e = e->NextInAEL; } } //3. Process horizontals at the Top of the scanbeam ... ProcessHorizontals(true); //4. Promote intermediate vertices ... e = m_ActiveEdges; while(e) { if(IsIntermediate(e, topY)) { OutPt* op = 0; if( e->OutIdx >= 0 ) op = AddOutPt(e, e->Top); UpdateEdgeIntoAEL(e); //if output polygons share an edge, they'll need joining later ... TEdge* ePrev = e->PrevInAEL; TEdge* eNext = e->NextInAEL; if (ePrev && ePrev->Curr.X == e->Bot.X && ePrev->Curr.Y == e->Bot.Y && op && ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && SlopesEqual(*e, *ePrev, m_UseFullRange) && (e->WindDelta != 0) && (ePrev->WindDelta != 0)) { OutPt* op2 = AddOutPt(ePrev, e->Bot); AddJoin(op, op2, e->Top); } else if (eNext && eNext->Curr.X == e->Bot.X && eNext->Curr.Y == e->Bot.Y && op && eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && SlopesEqual(*e, *eNext, m_UseFullRange) && (e->WindDelta != 0) && (eNext->WindDelta != 0)) { OutPt* op2 = AddOutPt(eNext, e->Bot); AddJoin(op, op2, e->Top); } } e = e->NextInAEL; } } //------------------------------------------------------------------------------ void Clipper::FixupOutPolygon(OutRec &outrec) { //FixupOutPolygon() - removes duplicate points and simplifies consecutive //parallel edges by removing the middle vertex. OutPt *lastOK = 0; outrec.BottomPt = 0; OutPt *pp = outrec.Pts; for (;;) { if (pp->Prev == pp || pp->Prev == pp->Next ) { DisposeOutPts(pp); outrec.Pts = 0; return; } //test for duplicate points and collinear edges ... if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) || (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) && (!m_PreserveCollinear || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt)))) { lastOK = 0; OutPt *tmp = pp; pp->Prev->Next = pp->Next; pp->Next->Prev = pp->Prev; pp = pp->Prev; delete tmp; } else if (pp == lastOK) break; else { if (!lastOK) lastOK = pp; pp = pp->Next; } } outrec.Pts = pp; } //------------------------------------------------------------------------------ int PointCount(OutPt *Pts) { if (!Pts) return 0; int result = 0; OutPt* p = Pts; do { result++; p = p->Next; } while (p != Pts); return result; } //------------------------------------------------------------------------------ void Clipper::BuildResult(Paths &polys) { polys.reserve(m_PolyOuts.size()); for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { if (!m_PolyOuts[i]->Pts) continue; Path pg; OutPt* p = m_PolyOuts[i]->Pts->Prev; int cnt = PointCount(p); if (cnt < 2) continue; pg.reserve(cnt); for (int i = 0; i < cnt; ++i) { pg.push_back(p->Pt); p = p->Prev; } polys.push_back(pg); } } //------------------------------------------------------------------------------ void Clipper::BuildResult2(PolyTree& polytree) { polytree.Clear(); polytree.AllNodes.reserve(m_PolyOuts.size()); //add each output polygon/contour to polytree ... for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) { OutRec* outRec = m_PolyOuts[i]; int cnt = PointCount(outRec->Pts); if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue; FixHoleLinkage(*outRec); PolyNode* pn = new PolyNode(); //nb: polytree takes ownership of all the PolyNodes polytree.AllNodes.push_back(pn); outRec->PolyNd = pn; pn->Parent = 0; pn->Index = 0; pn->Contour.reserve(cnt); OutPt *op = outRec->Pts->Prev; for (int j = 0; j < cnt; j++) { pn->Contour.push_back(op->Pt); op = op->Prev; } } //fixup PolyNode links etc ... polytree.Childs.reserve(m_PolyOuts.size()); for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) { OutRec* outRec = m_PolyOuts[i]; if (!outRec->PolyNd) continue; if (outRec->IsOpen) { outRec->PolyNd->m_IsOpen = true; polytree.AddChild(*outRec->PolyNd); } else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd) outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd); else polytree.AddChild(*outRec->PolyNd); } } //------------------------------------------------------------------------------ void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) { //just swap the contents (because fIntersectNodes is a single-linked-list) IntersectNode inode = int1; //gets a copy of Int1 int1.Edge1 = int2.Edge1; int1.Edge2 = int2.Edge2; int1.Pt = int2.Pt; int2.Edge1 = inode.Edge1; int2.Edge2 = inode.Edge2; int2.Pt = inode.Pt; } //------------------------------------------------------------------------------ inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) { if (e2.Curr.X == e1.Curr.X) { if (e2.Top.Y > e1.Top.Y) return e2.Top.X < TopX(e1, e2.Top.Y); else return e1.Top.X > TopX(e2, e1.Top.Y); } else return e2.Curr.X < e1.Curr.X; } //------------------------------------------------------------------------------ bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2, cInt& Left, cInt& Right) { if (a1 < a2) { if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);} else {Left = std::max(a1,b2); Right = std::min(a2,b1);} } else { if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);} else {Left = std::max(a2,b2); Right = std::min(a1,b1);} } return Left < Right; } //------------------------------------------------------------------------------ inline void UpdateOutPtIdxs(OutRec& outrec) { OutPt* op = outrec.Pts; do { op->Idx = outrec.Idx; op = op->Prev; } while(op != outrec.Pts); } //------------------------------------------------------------------------------ void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge) { if(!m_ActiveEdges) { edge->PrevInAEL = 0; edge->NextInAEL = 0; m_ActiveEdges = edge; } else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge)) { edge->PrevInAEL = 0; edge->NextInAEL = m_ActiveEdges; m_ActiveEdges->PrevInAEL = edge; m_ActiveEdges = edge; } else { if(!startEdge) startEdge = m_ActiveEdges; while(startEdge->NextInAEL && !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge)) startEdge = startEdge->NextInAEL; edge->NextInAEL = startEdge->NextInAEL; if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge; edge->PrevInAEL = startEdge; startEdge->NextInAEL = edge; } } //---------------------------------------------------------------------- OutPt* DupOutPt(OutPt* outPt, bool InsertAfter) { OutPt* result = new OutPt; result->Pt = outPt->Pt; result->Idx = outPt->Idx; if (InsertAfter) { result->Next = outPt->Next; result->Prev = outPt; outPt->Next->Prev = result; outPt->Next = result; } else { result->Prev = outPt->Prev; result->Next = outPt; outPt->Prev->Next = result; outPt->Prev = result; } return result; } //------------------------------------------------------------------------------ bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b, const IntPoint Pt, bool DiscardLeft) { Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight); Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight); if (Dir1 == Dir2) return false; //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) //So, to facilitate this while inserting Op1b and Op2b ... //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) if (Dir1 == dLeftToRight) { while (op1->Next->Pt.X <= Pt.X && op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) op1 = op1->Next; if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; op1b = DupOutPt(op1, !DiscardLeft); if (op1b->Pt != Pt) { op1 = op1b; op1->Pt = Pt; op1b = DupOutPt(op1, !DiscardLeft); } } else { while (op1->Next->Pt.X >= Pt.X && op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) op1 = op1->Next; if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; op1b = DupOutPt(op1, DiscardLeft); if (op1b->Pt != Pt) { op1 = op1b; op1->Pt = Pt; op1b = DupOutPt(op1, DiscardLeft); } } if (Dir2 == dLeftToRight) { while (op2->Next->Pt.X <= Pt.X && op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) op2 = op2->Next; if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; op2b = DupOutPt(op2, !DiscardLeft); if (op2b->Pt != Pt) { op2 = op2b; op2->Pt = Pt; op2b = DupOutPt(op2, !DiscardLeft); }; } else { while (op2->Next->Pt.X >= Pt.X && op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) op2 = op2->Next; if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; op2b = DupOutPt(op2, DiscardLeft); if (op2b->Pt != Pt) { op2 = op2b; op2->Pt = Pt; op2b = DupOutPt(op2, DiscardLeft); }; }; if ((Dir1 == dLeftToRight) == DiscardLeft) { op1->Prev = op2; op2->Next = op1; op1b->Next = op2b; op2b->Prev = op1b; } else { op1->Next = op2; op2->Prev = op1; op1b->Prev = op2b; op2b->Next = op1b; } return true; } //------------------------------------------------------------------------------ bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) { OutPt *op1 = j->OutPt1, *op1b; OutPt *op2 = j->OutPt2, *op2b; //There are 3 kinds of joins for output polygons ... //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are a vertices anywhere //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same //location at the Bottom of the overlapping segment (& Join.OffPt is above). //3. StrictSimple joins where edges touch but are not collinear and where //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y); if (isHorizontal && (j->OffPt == j->OutPt1->Pt) && (j->OffPt == j->OutPt2->Pt)) { //Strictly Simple join ... if (outRec1 != outRec2) return false; op1b = j->OutPt1->Next; while (op1b != op1 && (op1b->Pt == j->OffPt)) op1b = op1b->Next; bool reverse1 = (op1b->Pt.Y > j->OffPt.Y); op2b = j->OutPt2->Next; while (op2b != op2 && (op2b->Pt == j->OffPt)) op2b = op2b->Next; bool reverse2 = (op2b->Pt.Y > j->OffPt.Y); if (reverse1 == reverse2) return false; if (reverse1) { op1b = DupOutPt(op1, false); op2b = DupOutPt(op2, true); op1->Prev = op2; op2->Next = op1; op1b->Next = op2b; op2b->Prev = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } else { op1b = DupOutPt(op1, true); op2b = DupOutPt(op2, false); op1->Next = op2; op2->Prev = op1; op1b->Prev = op2b; op2b->Next = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } } else if (isHorizontal) { //treat horizontal joins differently to non-horizontal joins since with //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt //may be anywhere along the horizontal edge. op1b = op1; while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2) op1 = op1->Prev; while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2) op1b = op1b->Next; if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon' op2b = op2; while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b) op2 = op2->Prev; while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1) op2b = op2b->Next; if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon' cInt Left, Right; //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right)) return false; //DiscardLeftSide: when overlapping edges are joined, a spike will created //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up //on the discard Side as either may still be needed for other joins ... IntPoint Pt; bool DiscardLeftSide; if (op1->Pt.X >= Left && op1->Pt.X <= Right) { Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X); } else if (op2->Pt.X >= Left&& op2->Pt.X <= Right) { Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X); } else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right) { Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X; } else { Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X); } j->OutPt1 = op1; j->OutPt2 = op2; return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); } else { //nb: For non-horizontal joins ... // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y // 2. Jr.OutPt1.Pt > Jr.OffPt.Y //make sure the polygons are correctly oriented ... op1b = op1->Next; while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next; bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) || !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)); if (Reverse1) { op1b = op1->Prev; while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev; if ((op1b->Pt.Y > op1->Pt.Y) || !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false; }; op2b = op2->Next; while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next; bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) || !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)); if (Reverse2) { op2b = op2->Prev; while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev; if ((op2b->Pt.Y > op2->Pt.Y) || !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false; } if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; if (Reverse1) { op1b = DupOutPt(op1, false); op2b = DupOutPt(op2, true); op1->Prev = op2; op2->Next = op1; op1b->Next = op2b; op2b->Prev = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } else { op1b = DupOutPt(op1, true); op2b = DupOutPt(op2, false); op1->Next = op2; op2->Prev = op1; op1b->Prev = op2b; op2b->Next = op1b; j->OutPt1 = op1; j->OutPt2 = op1b; return true; } } } //---------------------------------------------------------------------- static OutRec* ParseFirstLeft(OutRec* FirstLeft) { while (FirstLeft && !FirstLeft->Pts) FirstLeft = FirstLeft->FirstLeft; return FirstLeft; } //------------------------------------------------------------------------------ void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) { //tests if NewOutRec contains the polygon before reassigning FirstLeft for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec* outRec = m_PolyOuts[i]; if (!outRec->Pts || !outRec->FirstLeft) continue; OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); if (firstLeft == OldOutRec) { if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) outRec->FirstLeft = NewOutRec; } } } //---------------------------------------------------------------------- void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) { //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec* outRec = m_PolyOuts[i]; if (outRec->FirstLeft == OldOutRec) outRec->FirstLeft = NewOutRec; } } //---------------------------------------------------------------------- void Clipper::JoinCommonEdges() { for (JoinList::size_type i = 0; i < m_Joins.size(); i++) { Join* join = m_Joins[i]; OutRec *outRec1 = GetOutRec(join->OutPt1->Idx); OutRec *outRec2 = GetOutRec(join->OutPt2->Idx); if (!outRec1->Pts || !outRec2->Pts) continue; //get the polygon fragment with the correct hole state (FirstLeft) //before calling JoinPoints() ... OutRec *holeStateRec; if (outRec1 == outRec2) holeStateRec = outRec1; else if (Param1RightOfParam2(outRec1, outRec2)) holeStateRec = outRec2; else if (Param1RightOfParam2(outRec2, outRec1)) holeStateRec = outRec1; else holeStateRec = GetLowermostRec(outRec1, outRec2); if (!JoinPoints(join, outRec1, outRec2)) continue; if (outRec1 == outRec2) { //instead of joining two polygons, we've just created a new one by //splitting one polygon into two. outRec1->Pts = join->OutPt1; outRec1->BottomPt = 0; outRec2 = CreateOutRec(); outRec2->Pts = join->OutPt2; //update all OutRec2.Pts Idx's ... UpdateOutPtIdxs(*outRec2); //We now need to check every OutRec.FirstLeft pointer. If it points //to OutRec1 it may need to point to OutRec2 instead ... if (m_UsingPolyTree) for (PolyOutList::size_type j = 0; j < m_PolyOuts.size() - 1; j++) { OutRec* oRec = m_PolyOuts[j]; if (!oRec->Pts || ParseFirstLeft(oRec->FirstLeft) != outRec1 || oRec->IsHole == outRec1->IsHole) continue; if (Poly2ContainsPoly1(oRec->Pts, join->OutPt2)) oRec->FirstLeft = outRec2; } if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts)) { //outRec2 is contained by outRec1 ... outRec2->IsHole = !outRec1->IsHole; outRec2->FirstLeft = outRec1; //fixup FirstLeft pointers that may need reassigning to OutRec1 if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0)) ReversePolyPtLinks(outRec2->Pts); } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts)) { //outRec1 is contained by outRec2 ... outRec2->IsHole = outRec1->IsHole; outRec1->IsHole = !outRec2->IsHole; outRec2->FirstLeft = outRec1->FirstLeft; outRec1->FirstLeft = outRec2; //fixup FirstLeft pointers that may need reassigning to OutRec1 if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0)) ReversePolyPtLinks(outRec1->Pts); } else { //the 2 polygons are completely separate ... outRec2->IsHole = outRec1->IsHole; outRec2->FirstLeft = outRec1->FirstLeft; //fixup FirstLeft pointers that may need reassigning to OutRec2 if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); } } else { //joined 2 polygons together ... outRec2->Pts = 0; outRec2->BottomPt = 0; outRec2->Idx = outRec1->Idx; outRec1->IsHole = holeStateRec->IsHole; if (holeStateRec == outRec2) outRec1->FirstLeft = outRec2->FirstLeft; outRec2->FirstLeft = outRec1; //fixup FirstLeft pointers that may need reassigning to OutRec1 if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); } } } //------------------------------------------------------------------------------ // ClipperOffset support functions ... //------------------------------------------------------------------------------ DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) { if(pt2.X == pt1.X && pt2.Y == pt1.Y) return DoublePoint(0, 0); double Dx = (double)(pt2.X - pt1.X); double dy = (double)(pt2.Y - pt1.Y); double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy ); Dx *= f; dy *= f; return DoublePoint(dy, -Dx); } //------------------------------------------------------------------------------ // ClipperOffset class //------------------------------------------------------------------------------ ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) { this->MiterLimit = miterLimit; this->ArcTolerance = arcTolerance; m_lowest.X = -1; } //------------------------------------------------------------------------------ ClipperOffset::~ClipperOffset() { Clear(); } //------------------------------------------------------------------------------ void ClipperOffset::Clear() { for (int i = 0; i < m_polyNodes.ChildCount(); ++i) delete m_polyNodes.Childs[i]; m_polyNodes.Childs.clear(); m_lowest.X = -1; } //------------------------------------------------------------------------------ void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType) { int highI = (int)path.size() - 1; if (highI < 0) return; PolyNode* newNode = new PolyNode(); newNode->m_jointype = joinType; newNode->m_endtype = endType; //strip duplicate points from path and also get index to the lowest point ... if (endType == etClosedLine || endType == etClosedPolygon) while (highI > 0 && path[0] == path[highI]) highI--; newNode->Contour.reserve(highI + 1); newNode->Contour.push_back(path[0]); int j = 0, k = 0; for (int i = 1; i <= highI; i++) if (newNode->Contour[j] != path[i]) { j++; newNode->Contour.push_back(path[i]); if (path[i].Y > newNode->Contour[k].Y || (path[i].Y == newNode->Contour[k].Y && path[i].X < newNode->Contour[k].X)) k = j; } if (endType == etClosedPolygon && j < 2) { delete newNode; return; } m_polyNodes.AddChild(*newNode); //if this path's lowest pt is lower than all the others then update m_lowest if (endType != etClosedPolygon) return; if (m_lowest.X < 0) m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); else { IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y]; if (newNode->Contour[k].Y > ip.Y || (newNode->Contour[k].Y == ip.Y && newNode->Contour[k].X < ip.X)) m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); } } //------------------------------------------------------------------------------ void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType) { for (Paths::size_type i = 0; i < paths.size(); ++i) AddPath(paths[i], joinType, endType); } //------------------------------------------------------------------------------ void ClipperOffset::FixOrientations() { //fixup orientations of all closed paths if the orientation of the //closed path with the lowermost vertex is wrong ... if (m_lowest.X >= 0 && !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) { for (int i = 0; i < m_polyNodes.ChildCount(); ++i) { PolyNode& node = *m_polyNodes.Childs[i]; if (node.m_endtype == etClosedPolygon || (node.m_endtype == etClosedLine && Orientation(node.Contour))) ReversePath(node.Contour); } } else { for (int i = 0; i < m_polyNodes.ChildCount(); ++i) { PolyNode& node = *m_polyNodes.Childs[i]; if (node.m_endtype == etClosedLine && !Orientation(node.Contour)) ReversePath(node.Contour); } } } //------------------------------------------------------------------------------ void ClipperOffset::Execute(Paths& solution, double delta) { solution.clear(); FixOrientations(); DoOffset(delta); //now clean up 'corners' ... Clipper clpr; clpr.AddPaths(m_destPolys, ptSubject, true); if (delta > 0) { clpr.Execute(ctUnion, solution, pftPositive, pftPositive); } else { IntRect r = clpr.GetBounds(); Path outer(4); outer[0] = IntPoint(r.left - 10, r.bottom + 10); outer[1] = IntPoint(r.right + 10, r.bottom + 10); outer[2] = IntPoint(r.right + 10, r.top - 10); outer[3] = IntPoint(r.left - 10, r.top - 10); clpr.AddPath(outer, ptSubject, true); clpr.ReverseSolution(true); clpr.Execute(ctUnion, solution, pftNegative, pftNegative); if (solution.size() > 0) solution.erase(solution.begin()); } } //------------------------------------------------------------------------------ void ClipperOffset::Execute(PolyTree& solution, double delta) { solution.Clear(); FixOrientations(); DoOffset(delta); //now clean up 'corners' ... Clipper clpr; clpr.AddPaths(m_destPolys, ptSubject, true); if (delta > 0) { clpr.Execute(ctUnion, solution, pftPositive, pftPositive); } else { IntRect r = clpr.GetBounds(); Path outer(4); outer[0] = IntPoint(r.left - 10, r.bottom + 10); outer[1] = IntPoint(r.right + 10, r.bottom + 10); outer[2] = IntPoint(r.right + 10, r.top - 10); outer[3] = IntPoint(r.left - 10, r.top - 10); clpr.AddPath(outer, ptSubject, true); clpr.ReverseSolution(true); clpr.Execute(ctUnion, solution, pftNegative, pftNegative); //remove the outer PolyNode rectangle ... if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) { PolyNode* outerNode = solution.Childs[0]; solution.Childs.reserve(outerNode->ChildCount()); solution.Childs[0] = outerNode->Childs[0]; solution.Childs[0]->Parent = outerNode->Parent; for (int i = 1; i < outerNode->ChildCount(); ++i) solution.AddChild(*outerNode->Childs[i]); } else solution.Clear(); } } //------------------------------------------------------------------------------ void ClipperOffset::DoOffset(double delta) { m_destPolys.clear(); m_delta = delta; //if Zero offset, just copy any CLOSED polygons to m_p and return ... if (NEAR_ZERO(delta)) { m_destPolys.reserve(m_polyNodes.ChildCount()); for (int i = 0; i < m_polyNodes.ChildCount(); i++) { PolyNode& node = *m_polyNodes.Childs[i]; if (node.m_endtype == etClosedPolygon) m_destPolys.push_back(node.Contour); } return; } //see offset_triginometry3.svg in the documentation folder ... if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit); else m_miterLim = 0.5; double y; if (ArcTolerance <= 0.0) y = def_arc_tolerance; else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance) y = std::fabs(delta) * def_arc_tolerance; else y = ArcTolerance; //see offset_triginometry2.svg in the documentation folder ... double steps = pi / std::acos(1 - y / std::fabs(delta)); if (steps > std::fabs(delta) * pi) steps = std::fabs(delta) * pi; //ie excessive precision check m_sin = std::sin(two_pi / steps); m_cos = std::cos(two_pi / steps); m_StepsPerRad = steps / two_pi; if (delta < 0.0) m_sin = -m_sin; m_destPolys.reserve(m_polyNodes.ChildCount() * 2); for (int i = 0; i < m_polyNodes.ChildCount(); i++) { PolyNode& node = *m_polyNodes.Childs[i]; m_srcPoly = node.Contour; int len = (int)m_srcPoly.size(); if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon))) continue; m_destPoly.clear(); if (len == 1) { if (node.m_jointype == jtRound) { double X = 1.0, Y = 0.0; for (cInt j = 1; j <= steps; j++) { m_destPoly.push_back(IntPoint( Round(m_srcPoly[0].X + X * delta), Round(m_srcPoly[0].Y + Y * delta))); double X2 = X; X = X * m_cos - m_sin * Y; Y = X2 * m_sin + Y * m_cos; } } else { double X = -1.0, Y = -1.0; for (int j = 0; j < 4; ++j) { m_destPoly.push_back(IntPoint( Round(m_srcPoly[0].X + X * delta), Round(m_srcPoly[0].Y + Y * delta))); if (X < 0) X = 1; else if (Y < 0) Y = 1; else X = -1; } } m_destPolys.push_back(m_destPoly); continue; } //build m_normals ... m_normals.clear(); m_normals.reserve(len); for (int j = 0; j < len - 1; ++j) m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon) m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); else m_normals.push_back(DoublePoint(m_normals[len - 2])); if (node.m_endtype == etClosedPolygon) { int k = len - 1; for (int j = 0; j < len; ++j) OffsetPoint(j, k, node.m_jointype); m_destPolys.push_back(m_destPoly); } else if (node.m_endtype == etClosedLine) { int k = len - 1; for (int j = 0; j < len; ++j) OffsetPoint(j, k, node.m_jointype); m_destPolys.push_back(m_destPoly); m_destPoly.clear(); //re-build m_normals ... DoublePoint n = m_normals[len -1]; for (int j = len - 1; j > 0; j--) m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); m_normals[0] = DoublePoint(-n.X, -n.Y); k = 0; for (int j = len - 1; j >= 0; j--) OffsetPoint(j, k, node.m_jointype); m_destPolys.push_back(m_destPoly); } else { int k = 0; for (int j = 1; j < len - 1; ++j) OffsetPoint(j, k, node.m_jointype); IntPoint pt1; if (node.m_endtype == etOpenButt) { int j = len - 1; pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); m_destPoly.push_back(pt1); pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); m_destPoly.push_back(pt1); } else { int j = len - 1; k = len - 2; m_sinA = 0; m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y); if (node.m_endtype == etOpenSquare) DoSquare(j, k); else DoRound(j, k); } //re-build m_normals ... for (int j = len - 1; j > 0; j--) m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y); k = len - 1; for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype); if (node.m_endtype == etOpenButt) { pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); m_destPoly.push_back(pt1); pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); m_destPoly.push_back(pt1); } else { k = 1; m_sinA = 0; if (node.m_endtype == etOpenSquare) DoSquare(0, 1); else DoRound(0, 1); } m_destPolys.push_back(m_destPoly); } } } //------------------------------------------------------------------------------ void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype) { //cross product ... m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); if (std::fabs(m_sinA * m_delta) < 1.0) { //dot product ... double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y ); if (cosA > 0) // angle => 0 degrees { m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); return; } //else angle => 180 degrees } else if (m_sinA > 1.0) m_sinA = 1.0; else if (m_sinA < -1.0) m_sinA = -1.0; if (m_sinA * m_delta < 0) { m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); m_destPoly.push_back(m_srcPoly[j]); m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); } else switch (jointype) { case jtMiter: { double r = 1 + (m_normals[j].X * m_normals[k].X + m_normals[j].Y * m_normals[k].Y); if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); break; } case jtSquare: DoSquare(j, k); break; case jtRound: DoRound(j, k); break; } k = j; } //------------------------------------------------------------------------------ void ClipperOffset::DoSquare(int j, int k) { double dx = std::tan(std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); } //------------------------------------------------------------------------------ void ClipperOffset::DoMiter(int j, int k, double r) { double q = m_delta / r; m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); } //------------------------------------------------------------------------------ void ClipperOffset::DoRound(int j, int k) { double a = std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); double X = m_normals[k].X, Y = m_normals[k].Y, X2; for (int i = 0; i < steps; ++i) { m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + X * m_delta), Round(m_srcPoly[j].Y + Y * m_delta))); X2 = X; X = X * m_cos - m_sin * Y; Y = X2 * m_sin + Y * m_cos; } m_destPoly.push_back(IntPoint( Round(m_srcPoly[j].X + m_normals[j].X * m_delta), Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); } //------------------------------------------------------------------------------ // Miscellaneous public functions //------------------------------------------------------------------------------ void Clipper::DoSimplePolygons() { PolyOutList::size_type i = 0; while (i < m_PolyOuts.size()) { OutRec* outrec = m_PolyOuts[i++]; OutPt* op = outrec->Pts; if (!op || outrec->IsOpen) continue; do //for each Pt in Polygon until duplicate found do ... { OutPt* op2 = op->Next; while (op2 != outrec->Pts) { if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op) { //split the polygon into two ... OutPt* op3 = op->Prev; OutPt* op4 = op2->Prev; op->Prev = op4; op4->Next = op; op2->Prev = op3; op3->Next = op2; outrec->Pts = op; OutRec* outrec2 = CreateOutRec(); outrec2->Pts = op2; UpdateOutPtIdxs(*outrec2); if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts)) { //OutRec2 is contained by OutRec1 ... outrec2->IsHole = !outrec->IsHole; outrec2->FirstLeft = outrec; if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); } else if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) { //OutRec1 is contained by OutRec2 ... outrec2->IsHole = outrec->IsHole; outrec->IsHole = !outrec2->IsHole; outrec2->FirstLeft = outrec->FirstLeft; outrec->FirstLeft = outrec2; if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); } else { //the 2 polygons are separate ... outrec2->IsHole = outrec->IsHole; outrec2->FirstLeft = outrec->FirstLeft; if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); } op2 = op; //ie get ready for the Next iteration } op2 = op2->Next; } op = op->Next; } while (op != outrec->Pts); } } //------------------------------------------------------------------------------ void ReversePath(Path& p) { std::reverse(p.begin(), p.end()); } //------------------------------------------------------------------------------ void ReversePaths(Paths& p) { for (Paths::size_type i = 0; i < p.size(); ++i) ReversePath(p[i]); } //------------------------------------------------------------------------------ void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) { Clipper c; c.StrictlySimple(true); c.AddPath(in_poly, ptSubject, true); c.Execute(ctUnion, out_polys, fillType, fillType); } //------------------------------------------------------------------------------ void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) { Clipper c; c.StrictlySimple(true); c.AddPaths(in_polys, ptSubject, true); c.Execute(ctUnion, out_polys, fillType, fillType); } //------------------------------------------------------------------------------ void SimplifyPolygons(Paths &polys, PolyFillType fillType) { SimplifyPolygons(polys, polys, fillType); } //------------------------------------------------------------------------------ inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) { double Dx = ((double)pt1.X - pt2.X); double dy = ((double)pt1.Y - pt2.Y); return (Dx*Dx + dy*dy); } //------------------------------------------------------------------------------ double DistanceFromLineSqrd( const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2) { //The equation of a line in general form (Ax + By + C = 0) //given 2 points (x,y) & (x,y) is ... //(y - y)x + (x - x)y + (y - y)x - (x - x)y = 0 //A = (y - y); B = (x - x); C = (y - y)x - (x - x)y //perpendicular distance of point (x,y) = (Ax + By + C)/Sqrt(A + B) //see http://en.wikipedia.org/wiki/Perpendicular_distance double A = double(ln1.Y - ln2.Y); double B = double(ln2.X - ln1.X); double C = A * ln1.X + B * ln1.Y; C = A * pt.X + B * pt.Y - C; return (C * C) / (A * A + B * B); } //--------------------------------------------------------------------------- bool SlopesNearCollinear(const IntPoint& pt1, const IntPoint& pt2, const IntPoint& pt3, double distSqrd) { //this function is more accurate when the point that's geometrically //between the other 2 points is the one that's tested for distance. //ie makes it more likely to pick up 'spikes' ... if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) { if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; else return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; } else { if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; else return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; } } //------------------------------------------------------------------------------ bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) { double Dx = (double)pt1.X - pt2.X; double dy = (double)pt1.Y - pt2.Y; return ((Dx * Dx) + (dy * dy) <= distSqrd); } //------------------------------------------------------------------------------ OutPt* ExcludeOp(OutPt* op) { OutPt* result = op->Prev; result->Next = op->Next; op->Next->Prev = result; result->Idx = 0; return result; } //------------------------------------------------------------------------------ void CleanPolygon(const Path& in_poly, Path& out_poly, double distance) { //distance = proximity in units/pixels below which vertices //will be stripped. Default ~= sqrt(2). size_t size = in_poly.size(); if (size == 0) { out_poly.clear(); return; } OutPt* outPts = new OutPt[size]; for (size_t i = 0; i < size; ++i) { outPts[i].Pt = in_poly[i]; outPts[i].Next = &outPts[(i + 1) % size]; outPts[i].Next->Prev = &outPts[i]; outPts[i].Idx = 0; } double distSqrd = distance * distance; OutPt* op = &outPts[0]; while (op->Idx == 0 && op->Next != op->Prev) { if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) { op = ExcludeOp(op); size--; } else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) { ExcludeOp(op->Next); op = ExcludeOp(op); size -= 2; } else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) { op = ExcludeOp(op); size--; } else { op->Idx = 1; op = op->Next; } } if (size < 3) size = 0; out_poly.resize(size); for (size_t i = 0; i < size; ++i) { out_poly[i] = op->Pt; op = op->Next; } delete [] outPts; } //------------------------------------------------------------------------------ void CleanPolygon(Path& poly, double distance) { CleanPolygon(poly, poly, distance); } //------------------------------------------------------------------------------ void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance) { for (Paths::size_type i = 0; i < in_polys.size(); ++i) CleanPolygon(in_polys[i], out_polys[i], distance); } //------------------------------------------------------------------------------ void CleanPolygons(Paths& polys, double distance) { CleanPolygons(polys, polys, distance); } //------------------------------------------------------------------------------ void Minkowski(const Path& poly, const Path& path, Paths& solution, bool isSum, bool isClosed) { int delta = (isClosed ? 1 : 0); size_t polyCnt = poly.size(); size_t pathCnt = path.size(); Paths pp; pp.reserve(pathCnt); if (isSum) for (size_t i = 0; i < pathCnt; ++i) { Path p; p.reserve(polyCnt); for (size_t j = 0; j < poly.size(); ++j) p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y)); pp.push_back(p); } else for (size_t i = 0; i < pathCnt; ++i) { Path p; p.reserve(polyCnt); for (size_t j = 0; j < poly.size(); ++j) p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y)); pp.push_back(p); } solution.clear(); solution.reserve((pathCnt + delta) * (polyCnt + 1)); for (size_t i = 0; i < pathCnt - 1 + delta; ++i) for (size_t j = 0; j < polyCnt; ++j) { Path quad; quad.reserve(4); quad.push_back(pp[i % pathCnt][j % polyCnt]); quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]); quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); if (!Orientation(quad)) ReversePath(quad); solution.push_back(quad); } } //------------------------------------------------------------------------------ void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) { Minkowski(pattern, path, solution, true, pathIsClosed); Clipper c; c.AddPaths(solution, ptSubject, true); c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ void TranslatePath(const Path& input, Path& output, IntPoint delta) { //precondition: input != output output.resize(input.size()); for (size_t i = 0; i < input.size(); ++i) output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y); } //------------------------------------------------------------------------------ void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed) { Clipper c; for (size_t i = 0; i < paths.size(); ++i) { Paths tmp; Minkowski(pattern, paths[i], tmp, true, pathIsClosed); c.AddPaths(tmp, ptSubject, true); if (pathIsClosed) { Path tmp2; TranslatePath(paths[i], tmp2, pattern[0]); c.AddPath(tmp2, ptClip, true); } } c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution) { Minkowski(poly1, poly2, solution, false, true); Clipper c; c.AddPaths(solution, ptSubject, true); c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ enum NodeType {ntAny, ntOpen, ntClosed}; void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths) { bool match = true; if (nodetype == ntClosed) match = !polynode.IsOpen(); else if (nodetype == ntOpen) return; if (!polynode.Contour.empty() && match) paths.push_back(polynode.Contour); for (int i = 0; i < polynode.ChildCount(); ++i) AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); } //------------------------------------------------------------------------------ void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); AddPolyNodeToPaths(polytree, ntAny, paths); } //------------------------------------------------------------------------------ void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); AddPolyNodeToPaths(polytree, ntClosed, paths); } //------------------------------------------------------------------------------ void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); //Open paths are top level only, so ... for (int i = 0; i < polytree.ChildCount(); ++i) if (polytree.Childs[i]->IsOpen()) paths.push_back(polytree.Childs[i]->Contour); } //------------------------------------------------------------------------------ std::ostream& operator <<(std::ostream &s, const IntPoint &p) { s << "(" << p.X << "," << p.Y << ")"; return s; } //------------------------------------------------------------------------------ std::ostream& operator <<(std::ostream &s, const Path &p) { if (p.empty()) return s; Path::size_type last = p.size() -1; for (Path::size_type i = 0; i < last; i++) s << "(" << p[i].X << "," << p[i].Y << "), "; s << "(" << p[last].X << "," << p[last].Y << ")\n"; return s; } //------------------------------------------------------------------------------ std::ostream& operator <<(std::ostream &s, const Paths &p) { for (Paths::size_type i = 0; i < p.size(); i++) s << p[i]; s << "\n"; return s; } //------------------------------------------------------------------------------ } //ClipperLib namespace dvisvgm-2.8.1/libs/clipper/clipper.hpp0000664000175000017500000003700713510660062014670 00000000000000/******************************************************************************* * * * Author : Angus Johnson * * Version : 6.2.1 * * Date : 31 October 2014 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2010-2014 * * * * License: * * Use, modification & distribution is subject to Boost Software License Ver 1. * * http://www.boost.org/LICENSE_1_0.txt * * * * Attributions: * * The code in this library is an extension of Bala Vatti's clipping algorithm: * * "A generic solution to polygon clipping" * * Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * * http://portal.acm.org/citation.cfm?id=129906 * * * * Computer graphics and geometric modeling: implementation and algorithms * * By Max K. Agoston * * Springer; 1 edition (January 4, 2005) * * http://books.google.com/books?q=vatti+clipping+agoston * * * * See also: * * "Polygon Offsetting by Computing Winding Numbers" * * Paper no. DETC2005-85513 pp. 565-575 * * ASME 2005 International Design Engineering Technical Conferences * * and Computers and Information in Engineering Conference (IDETC/CIE2005) * * September 24-28, 2005 , Long Beach, California, USA * * http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * * * *******************************************************************************/ #ifndef clipper_hpp #define clipper_hpp #define CLIPPER_VERSION "6.2.1" //use_int32: When enabled 32bit ints are used instead of 64bit ints. This //improve performance but coordinate values are limited to the range +/- 46340 //#define use_int32 //use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance. #define use_xyz //use_lines: Enables line clipping. Adds a very minor cost to performance. #define use_lines //use_deprecated: Enables temporary support for the obsolete functions //#define use_deprecated #include #include #include #include #include #include #include #include #include namespace ClipperLib { enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; enum PolyType { ptSubject, ptClip }; //By far the most widely used winding rules for polygon filling are //EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) //Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) //see http://glprogramming.com/red/chapter11.html enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; struct ZLabel { ZLabel () : id(0), t(0) {} ZLabel (int32_t ii) : id(ii), t(0) {} ZLabel (int32_t ii, double tt) : id(ii), t(tt) {} bool operator == (const ZLabel &l) const {return id == l.id;} int32_t id; double t; }; inline std::ostream& operator << (std::ostream &os, const ZLabel &l) { return os << l.id << ':' << l.t; } struct ZType { ZType (uint64_t v) : label1(v >> 32), label2(v & 0xffffffff) {} ZType (int32_t id1, int32_t id2) : label1(id1), label2(id2) {} ZType (const ZLabel &l1, const ZLabel &l2) : label1(l1), label2(l2) {} const ZLabel& minLabel () const {return (label1.id < label2.id) ? label1 : label2;} const ZLabel& maxLabel () const {return (label1.id > label2.id) ? label1 : label2;} const ZLabel& otherLabel (const ZLabel &l) const { return (l.id == label1.id && l.t == label1.t) ? label2 : label1; } bool operator == (const ZType &p) const {return minLabel() == p.minLabel() && maxLabel() == p.maxLabel();} operator uint64_t () const {return (uint64_t(label1.id) << 32) & label2.id;} ZLabel label1, label2; }; inline std::ostream& operator << (std::ostream &os, const ZType &z) { return os << '[' << z.label1 << '|' << z.label2 << ']'; } #ifdef use_int32 typedef int cInt; static cInt const loRange = 0x7FFF; static cInt const hiRange = 0x7FFF; #else typedef signed long long cInt; static cInt const loRange = 0x3FFFFFFF; static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; typedef signed long long long64; //used by Int128 class typedef unsigned long long ulong64; #endif struct IntPoint { cInt X; cInt Y; #ifdef use_xyz ZType Z; IntPoint(cInt x = 0, cInt y = 0, ZType z = 0): X(x), Y(y), Z(z) {}; #else IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {}; #endif friend inline bool operator== (const IntPoint& a, const IntPoint& b) { return a.X == b.X && a.Y == b.Y; } friend inline bool operator!= (const IntPoint& a, const IntPoint& b) { return a.X != b.X || a.Y != b.Y; } }; //------------------------------------------------------------------------------ typedef std::vector< IntPoint > Path; typedef std::vector< Path > Paths; inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;} inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;} std::ostream& operator <<(std::ostream &s, const IntPoint &p); std::ostream& operator <<(std::ostream &s, const Path &p); std::ostream& operator <<(std::ostream &s, const Paths &p); struct DoublePoint { double X; double Y; DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {} }; //------------------------------------------------------------------------------ #ifdef use_xyz typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt); #endif enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4}; enum JoinType {jtSquare, jtRound, jtMiter}; enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound}; class PolyNode; typedef std::vector< PolyNode* > PolyNodes; class PolyNode { public: PolyNode(); virtual ~PolyNode(){}; Path Contour; PolyNodes Childs; PolyNode* Parent; PolyNode* GetNext() const; bool IsHole() const; bool IsOpen() const; int ChildCount() const; private: unsigned Index; //node index in Parent.Childs bool m_IsOpen; JoinType m_jointype; EndType m_endtype; PolyNode* GetNextSiblingUp() const; void AddChild(PolyNode& child); friend class Clipper; //to access Index friend class ClipperOffset; }; class PolyTree: public PolyNode { public: ~PolyTree(){Clear();}; PolyNode* GetFirst() const; void Clear(); int Total() const; private: PolyNodes AllNodes; friend class Clipper; //to access AllNodes }; bool Orientation(const Path &poly); double Area(const Path &poly); int PointInPolygon(const IntPoint &pt, const Path &path); void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd); void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd); void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd); void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415); void CleanPolygon(Path& poly, double distance = 1.415); void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415); void CleanPolygons(Paths& polys, double distance = 1.415); void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed); void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed); void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution); void PolyTreeToPaths(const PolyTree& polytree, Paths& paths); void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths); void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths); void ReversePath(Path& p); void ReversePaths(Paths& p); struct IntRect { cInt left; cInt top; cInt right; cInt bottom; }; //enums that are used internally ... enum EdgeSide { esLeft = 1, esRight = 2}; //forward declarations (for stuff used internally) ... struct TEdge; struct IntersectNode; struct LocalMinimum; struct Scanbeam; struct OutPt; struct OutRec; struct Join; typedef std::vector < OutRec* > PolyOutList; typedef std::vector < TEdge* > EdgeList; typedef std::vector < Join* > JoinList; typedef std::vector < IntersectNode* > IntersectList; //------------------------------------------------------------------------------ //ClipperBase is the ancestor to the Clipper class. It should not be //instantiated directly. This class simply abstracts the conversion of sets of //polygon coordinates into edge objects that are stored in a LocalMinima list. class ClipperBase { public: ClipperBase(); virtual ~ClipperBase(); bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed); bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed); virtual void Clear(); IntRect GetBounds(); bool PreserveCollinear() {return m_PreserveCollinear;}; void PreserveCollinear(bool value) {m_PreserveCollinear = value;}; protected: void DisposeLocalMinimaList(); TEdge* AddBoundsToLML(TEdge *e, bool IsClosed); void PopLocalMinima(); virtual void Reset(); TEdge* ProcessBound(TEdge* E, bool IsClockwise); void DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed); TEdge* DescendToMin(TEdge *&E); void AscendToMax(TEdge *&E, bool Appending, bool IsClosed); typedef std::vector MinimaList; MinimaList::iterator m_CurrentLM; MinimaList m_MinimaList; bool m_UseFullRange; EdgeList m_edges; bool m_PreserveCollinear; bool m_HasOpenPaths; }; //------------------------------------------------------------------------------ class Clipper : public virtual ClipperBase { public: Clipper(int initOptions = 0); ~Clipper(); bool Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType = pftEvenOdd, PolyFillType clipFillType = pftEvenOdd); bool Execute(ClipType clipType, PolyTree &polytree, PolyFillType subjFillType = pftEvenOdd, PolyFillType clipFillType = pftEvenOdd); bool ReverseSolution() {return m_ReverseOutput;}; void ReverseSolution(bool value) {m_ReverseOutput = value;}; bool StrictlySimple() {return m_StrictSimple;}; void StrictlySimple(bool value) {m_StrictSimple = value;}; //set the callback function for z value filling on intersections (otherwise Z is 0) #ifdef use_xyz void ZFillFunction(ZFillCallback zFillFunc); #endif protected: void Reset() override; virtual bool ExecuteInternal(); private: PolyOutList m_PolyOuts; JoinList m_Joins; JoinList m_GhostJoins; IntersectList m_IntersectList; ClipType m_ClipType; typedef std::priority_queue ScanbeamList; ScanbeamList m_Scanbeam; TEdge *m_ActiveEdges; TEdge *m_SortedEdges; bool m_ExecuteLocked; PolyFillType m_ClipFillType; PolyFillType m_SubjFillType; bool m_ReverseOutput; bool m_UsingPolyTree; bool m_StrictSimple; #ifdef use_xyz ZFillCallback m_ZFill; //custom callback #endif void SetWindingCount(TEdge& edge); bool IsEvenOddFillType(const TEdge& edge) const; bool IsEvenOddAltFillType(const TEdge& edge) const; void InsertScanbeam(const cInt Y); cInt PopScanbeam(); void InsertLocalMinimaIntoAEL(const cInt botY); void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge); void AddEdgeToSEL(TEdge *edge); void CopyAELToSEL(); void DeleteFromSEL(TEdge *e); void DeleteFromAEL(TEdge *e); void UpdateEdgeIntoAEL(TEdge *&e); void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); bool IsContributing(const TEdge& edge) const; bool IsTopHorz(const cInt XPos); void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); void DoMaxima(TEdge *e); void ProcessHorizontals(bool IsTopOfScanbeam); void ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam); void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); OutRec* GetOutRec(int idx); void AppendPolygon(TEdge *e1, TEdge *e2); void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt); OutRec* CreateOutRec(); OutPt* AddOutPt(TEdge *e, const IntPoint &pt); void DisposeAllOutRecs(); void DisposeOutRec(PolyOutList::size_type index); bool ProcessIntersections(const cInt topY); void BuildIntersectList(const cInt topY); void ProcessIntersectList(); void ProcessEdgesAtTopOfScanbeam(const cInt topY); void BuildResult(Paths& polys); void BuildResult2(PolyTree& polytree); void SetHoleState(TEdge *e, OutRec *outrec); void DisposeIntersectNodes(); bool FixupIntersectionOrder(); void FixupOutPolygon(OutRec &outrec); bool IsHole(TEdge *e); bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl); void FixHoleLinkage(OutRec &outrec); void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt); void ClearJoins(); void ClearGhostJoins(); void AddGhostJoin(OutPt *op, const IntPoint offPt); bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2); void JoinCommonEdges(); void DoSimplePolygons(); void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec); #ifdef use_xyz void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2); #endif }; //------------------------------------------------------------------------------ class ClipperOffset { public: ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25); ~ClipperOffset(); void AddPath(const Path& path, JoinType joinType, EndType endType); void AddPaths(const Paths& paths, JoinType joinType, EndType endType); void Execute(Paths& solution, double delta); void Execute(PolyTree& solution, double delta); void Clear(); double MiterLimit; double ArcTolerance; private: Paths m_destPolys; Path m_srcPoly; Path m_destPoly; std::vector m_normals; double m_delta, m_sinA, m_sin, m_cos; double m_miterLim, m_StepsPerRad; IntPoint m_lowest; PolyNode m_polyNodes; void FixOrientations(); void DoOffset(double delta); void OffsetPoint(int j, int& k, JoinType jointype); void DoSquare(int j, int k); void DoMiter(int j, int k, double r); void DoRound(int j, int k); }; //------------------------------------------------------------------------------ class clipperException : public std::exception { public: clipperException(const char* description): m_descr(description) {} virtual ~clipperException() throw() {} virtual const char* what() const throw() override {return m_descr.c_str();} private: std::string m_descr; }; //------------------------------------------------------------------------------ } //ClipperLib namespace #endif //clipper_hpp dvisvgm-2.8.1/libs/clipper/Makefile.in0000664000175000017500000004756213563265577014621 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/clipper ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libclipper_a_AR = $(AR) $(ARFLAGS) libclipper_a_LIBADD = am_libclipper_a_OBJECTS = clipper.$(OBJEXT) libclipper_a_OBJECTS = $(am_libclipper_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/clipper.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libclipper_a_SOURCES) DIST_SOURCES = $(libclipper_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libclipper.a libclipper_a_SOURCES = clipper.cpp clipper.hpp EXTRA_DIST = License.txt AM_CXXFLAGS = -Wall CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/clipper/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/clipper/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libclipper.a: $(libclipper_a_OBJECTS) $(libclipper_a_DEPENDENCIES) $(EXTRA_libclipper_a_DEPENDENCIES) $(AM_V_at)-rm -f libclipper.a $(AM_V_AR)$(libclipper_a_AR) libclipper.a $(libclipper_a_OBJECTS) $(libclipper_a_LIBADD) $(AM_V_at)$(RANLIB) libclipper.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clipper.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/clipper.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/clipper.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile clipper.cpp: clipper.hpp @CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/Makefile.in0000664000175000017500000004674013563265577013160 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @ENABLE_WOFF_TRUE@am__append_1 = brotli ff-woff woff2 subdir = libs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = clipper md5 potrace variant xxHash brotli ff-woff woff2 am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = clipper md5 potrace variant xxHash $(am__append_1) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/defs.am0000664000175000017500000000072313510660062012316 00000000000000if !HAVE_BROTLI BROTLI_CFLAGS += -I$(dvisvgm_srcdir)/libs/brotli/include BROTLI_LIBS += ../libs/brotli/libbrotli.a endif if !HAVE_POTRACE POTRACE_CFLAGS = -I$(dvisvgm_srcdir)/libs/potrace POTRACE_LIBS = ../libs/potrace/libpotrace.a endif if !HAVE_WOFF2 WOFF2_CFLAGS += -I$(dvisvgm_srcdir)/libs/woff2/include WOFF2_LIBS += ../libs/woff2/libwoff2.a endif if !HAVE_XXHASH XXHASH_CFLAGS = -I$(dvisvgm_srcdir)/libs/xxHash XXHASH_LIBS = ../libs/xxHash/libxxhash.a endif dvisvgm-2.8.1/libs/md5/0000775000175000017500000000000013563265645011641 500000000000000dvisvgm-2.8.1/libs/md5/md5.c0000664000175000017500000002104713510660062012376 00000000000000/* * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. * MD5 Message-Digest Algorithm (RFC 1321). * * Homepage: * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 * * Author: * Alexander Peslyak, better known as Solar Designer * * This software was written by Alexander Peslyak in 2001. No copyright is * claimed, and the software is hereby placed in the public domain. * In case this attempt to disclaim copyright and place the software in the * public domain is deemed null and void, then the software is * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the * general public under the following terms: * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. * * (This is a heavily cut-down "BSD license".) * * This differs from Colin Plumb's older public domain implementation in that * no exactly 32-bit integer data type is required (any 32-bit or wider * unsigned integer data type will do), there's no compile-time endianness * configuration, and the function prototypes match OpenSSL's. No code from * Colin Plumb's implementation has been reused; this comment merely compares * the properties of the two independent implementations. * * The primary goals of this implementation are portability and ease of use. * It is meant to be fast, but not as fast as possible. Some known * optimizations are not included to reduce source code size and avoid * compile-time configuration. */ #ifndef HAVE_OPENSSL #include #include "md5.h" /* * The basic MD5 functions. * * F and G are optimized compared to their RFC 1321 definitions for * architectures that lack an AND-NOT instruction, just like in Colin Plumb's * implementation. */ #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) #define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) #define H(x, y, z) (((x) ^ (y)) ^ (z)) #define H2(x, y, z) ((x) ^ ((y) ^ (z))) #define I(x, y, z) ((y) ^ ((x) | ~(z))) /* * The MD5 transformation for all four rounds. */ #define STEP(f, a, b, c, d, x, t, s) \ (a) += f((b), (c), (d)) + (x) + (t); \ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ (a) += (b); /* * SET reads 4 input bytes in little-endian byte order and stores them in a * properly aligned word in host byte order. * * The check for little-endian architectures that tolerate unaligned memory * accesses is just an optimization. Nothing will break if it fails to detect * a suitable architecture. * * Unfortunately, this optimization may be a C strict aliasing rules violation * if the caller's data buffer has effective type that cannot be aliased by * MD5_u32plus. In practice, this problem may occur if these MD5 routines are * inlined into a calling function, or with future and dangerously advanced * link-time optimizations. For the time being, keeping these MD5 routines in * their own translation unit avoids the problem. */ #if defined(__i386__) || defined(__x86_64__) || defined(__vax__) #define SET(n) \ (*(MD5_u32plus *)&ptr[(n) * 4]) #define GET(n) \ SET(n) #else #define SET(n) \ (ctx->block[(n)] = \ (MD5_u32plus)ptr[(n) * 4] | \ ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) #define GET(n) \ (ctx->block[(n)]) #endif /* * This processes one or more 64-byte data blocks, but does NOT update the bit * counters. There are no alignment requirements. */ static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) { const unsigned char *ptr; MD5_u32plus a, b, c, d; MD5_u32plus saved_a, saved_b, saved_c, saved_d; ptr = (const unsigned char *)data; a = ctx->a; b = ctx->b; c = ctx->c; d = ctx->d; do { saved_a = a; saved_b = b; saved_c = c; saved_d = d; /* Round 1 */ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) STEP(F, c, d, a, b, SET(2), 0x242070db, 17) STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22) STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7) STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12) STEP(F, c, d, a, b, SET(6), 0xa8304613, 17) STEP(F, b, c, d, a, SET(7), 0xfd469501, 22) STEP(F, a, b, c, d, SET(8), 0x698098d8, 7) STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12) STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17) STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22) STEP(F, a, b, c, d, SET(12), 0x6b901122, 7) STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) /* Round 2 */ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) STEP(G, d, a, b, c, GET(10), 0x02441453, 9) STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) /* Round 3 */ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11) STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23) STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11) STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23) STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11) STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23) STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11) STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23) /* Round 4 */ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) a += saved_a; b += saved_b; c += saved_c; d += saved_d; ptr += 64; } while (size -= 64); ctx->a = a; ctx->b = b; ctx->c = c; ctx->d = d; return ptr; } void MD5_Init(MD5_CTX *ctx) { ctx->a = 0x67452301; ctx->b = 0xefcdab89; ctx->c = 0x98badcfe; ctx->d = 0x10325476; ctx->lo = 0; ctx->hi = 0; } void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) { MD5_u32plus saved_lo; unsigned long used, available; saved_lo = ctx->lo; if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) ctx->hi++; ctx->hi += size >> 29; used = saved_lo & 0x3f; if (used) { available = 64 - used; if (size < available) { memcpy(&ctx->buffer[used], data, size); return; } memcpy(&ctx->buffer[used], data, available); data = (const unsigned char *)data + available; size -= available; body(ctx, ctx->buffer, 64); } if (size >= 64) { data = body(ctx, data, size & ~(unsigned long)0x3f); size &= 0x3f; } memcpy(ctx->buffer, data, size); } #define OUT(dst, src) \ (dst)[0] = (unsigned char)(src); \ (dst)[1] = (unsigned char)((src) >> 8); \ (dst)[2] = (unsigned char)((src) >> 16); \ (dst)[3] = (unsigned char)((src) >> 24); void MD5_Final(unsigned char *result, MD5_CTX *ctx) { unsigned long used, available; used = ctx->lo & 0x3f; ctx->buffer[used++] = 0x80; available = 64 - used; if (available < 8) { memset(&ctx->buffer[used], 0, available); body(ctx, ctx->buffer, 64); used = 0; available = 64; } memset(&ctx->buffer[used], 0, available - 8); ctx->lo <<= 3; OUT(&ctx->buffer[56], ctx->lo) OUT(&ctx->buffer[60], ctx->hi) body(ctx, ctx->buffer, 64); OUT(&result[0], ctx->a) OUT(&result[4], ctx->b) OUT(&result[8], ctx->c) OUT(&result[12], ctx->d) memset(ctx, 0, sizeof(*ctx)); } #endif dvisvgm-2.8.1/libs/md5/Makefile.am0000664000175000017500000000025313510660062013575 00000000000000if USE_BUNDLED_MD5 noinst_LIBRARIES = libmd5.a libmd5_a_SOURCES = md5.c md5.h AM_CXXFLAGS = -Wall md5.c: md5.h @CODE_COVERAGE_RULES@ endif CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/md5/Makefile.in0000664000175000017500000004613113563265577013637 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/md5 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libmd5_a_AR = $(AR) $(ARFLAGS) libmd5_a_LIBADD = am__libmd5_a_SOURCES_DIST = md5.c md5.h @USE_BUNDLED_MD5_TRUE@am_libmd5_a_OBJECTS = md5.$(OBJEXT) libmd5_a_OBJECTS = $(am_libmd5_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/md5.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libmd5_a_SOURCES) DIST_SOURCES = $(am__libmd5_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @USE_BUNDLED_MD5_TRUE@noinst_LIBRARIES = libmd5.a @USE_BUNDLED_MD5_TRUE@libmd5_a_SOURCES = md5.c md5.h @USE_BUNDLED_MD5_TRUE@AM_CXXFLAGS = -Wall CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/md5/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/md5/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmd5.a: $(libmd5_a_OBJECTS) $(libmd5_a_DEPENDENCIES) $(EXTRA_libmd5_a_DEPENDENCIES) $(AM_V_at)-rm -f libmd5.a $(AM_V_AR)$(libmd5_a_AR) libmd5.a $(libmd5_a_OBJECTS) $(libmd5_a_LIBADD) $(AM_V_at)$(RANLIB) libmd5.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/md5.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/md5.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @USE_BUNDLED_MD5_TRUE@md5.c: md5.h @USE_BUNDLED_MD5_TRUE@@CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/md5/md5.h0000664000175000017500000000262213510660062012401 00000000000000/* * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. * MD5 Message-Digest Algorithm (RFC 1321). * * Homepage: * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 * * Author: * Alexander Peslyak, better known as Solar Designer * * This software was written by Alexander Peslyak in 2001. No copyright is * claimed, and the software is hereby placed in the public domain. * In case this attempt to disclaim copyright and place the software in the * public domain is deemed null and void, then the software is * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the * general public under the following terms: * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. * * See md5.c for more information. */ #ifndef _MD5_H #define _MD5_H #ifdef __cplusplus extern "C" { #endif /* Any 32-bit or wider unsigned integer data type will do */ typedef unsigned int MD5_u32plus; typedef struct { MD5_u32plus lo, hi; MD5_u32plus a, b, c, d; unsigned char buffer[64]; MD5_u32plus block[16]; } MD5_CTX; extern void MD5_Init(MD5_CTX *ctx); extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); #ifdef __cplusplus } #endif #endif dvisvgm-2.8.1/libs/woff2/0000775000175000017500000000000013563265647012201 500000000000000dvisvgm-2.8.1/libs/woff2/Makefile.am0000664000175000017500000000127513510660062014140 00000000000000if !HAVE_WOFF2 noinst_LIBRARIES = libwoff2.a libwoff2_a_SOURCES = \ include/woff2/decode.h \ include/woff2/encode.h \ include/woff2/output.h \ include/woff2/version.h \ src/buffer.h \ src/font.cc \ src/font.h \ src/glyph.cc \ src/glyph.h \ src/normalize.cc \ src/normalize.h \ src/port.h \ src/round.h \ src/store_bytes.h \ src/table_tags.cc \ src/table_tags.h \ src/transform.cc \ src/transform.h \ src/variable_length.cc \ src/variable_length.h \ src/woff2_common.cc \ src/woff2_common.h \ src/woff2_enc.cc \ src/woff2_out.cc AM_CXXFLAGS = -Wall -I$(srcdir)/include -I$(srcdir)/../brotli/include @CODE_COVERAGE_RULES@ endif EXTRA_DIST = LICENSE CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/woff2/Makefile.in0000664000175000017500000006015113563265577014173 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/woff2 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libwoff2_a_AR = $(AR) $(ARFLAGS) libwoff2_a_LIBADD = am__libwoff2_a_SOURCES_DIST = include/woff2/decode.h \ include/woff2/encode.h include/woff2/output.h \ include/woff2/version.h src/buffer.h src/font.cc src/font.h \ src/glyph.cc src/glyph.h src/normalize.cc src/normalize.h \ src/port.h src/round.h src/store_bytes.h src/table_tags.cc \ src/table_tags.h src/transform.cc src/transform.h \ src/variable_length.cc src/variable_length.h \ src/woff2_common.cc src/woff2_common.h src/woff2_enc.cc \ src/woff2_out.cc am__dirstamp = $(am__leading_dot)dirstamp @HAVE_WOFF2_FALSE@am_libwoff2_a_OBJECTS = src/font.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/glyph.$(OBJEXT) src/normalize.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/table_tags.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/transform.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/variable_length.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/woff2_common.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/woff2_enc.$(OBJEXT) \ @HAVE_WOFF2_FALSE@ src/woff2_out.$(OBJEXT) libwoff2_a_OBJECTS = $(am_libwoff2_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = src/$(DEPDIR)/font.Po src/$(DEPDIR)/glyph.Po \ src/$(DEPDIR)/normalize.Po src/$(DEPDIR)/table_tags.Po \ src/$(DEPDIR)/transform.Po src/$(DEPDIR)/variable_length.Po \ src/$(DEPDIR)/woff2_common.Po src/$(DEPDIR)/woff2_enc.Po \ src/$(DEPDIR)/woff2_out.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libwoff2_a_SOURCES) DIST_SOURCES = $(am__libwoff2_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_WOFF2_FALSE@noinst_LIBRARIES = libwoff2.a @HAVE_WOFF2_FALSE@libwoff2_a_SOURCES = \ @HAVE_WOFF2_FALSE@ include/woff2/decode.h \ @HAVE_WOFF2_FALSE@ include/woff2/encode.h \ @HAVE_WOFF2_FALSE@ include/woff2/output.h \ @HAVE_WOFF2_FALSE@ include/woff2/version.h \ @HAVE_WOFF2_FALSE@ src/buffer.h \ @HAVE_WOFF2_FALSE@ src/font.cc \ @HAVE_WOFF2_FALSE@ src/font.h \ @HAVE_WOFF2_FALSE@ src/glyph.cc \ @HAVE_WOFF2_FALSE@ src/glyph.h \ @HAVE_WOFF2_FALSE@ src/normalize.cc \ @HAVE_WOFF2_FALSE@ src/normalize.h \ @HAVE_WOFF2_FALSE@ src/port.h \ @HAVE_WOFF2_FALSE@ src/round.h \ @HAVE_WOFF2_FALSE@ src/store_bytes.h \ @HAVE_WOFF2_FALSE@ src/table_tags.cc \ @HAVE_WOFF2_FALSE@ src/table_tags.h \ @HAVE_WOFF2_FALSE@ src/transform.cc \ @HAVE_WOFF2_FALSE@ src/transform.h \ @HAVE_WOFF2_FALSE@ src/variable_length.cc \ @HAVE_WOFF2_FALSE@ src/variable_length.h \ @HAVE_WOFF2_FALSE@ src/woff2_common.cc \ @HAVE_WOFF2_FALSE@ src/woff2_common.h \ @HAVE_WOFF2_FALSE@ src/woff2_enc.cc \ @HAVE_WOFF2_FALSE@ src/woff2_out.cc @HAVE_WOFF2_FALSE@AM_CXXFLAGS = -Wall -I$(srcdir)/include -I$(srcdir)/../brotli/include EXTRA_DIST = LICENSE CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .cc .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/woff2/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/woff2/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/font.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/glyph.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/normalize.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/table_tags.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/transform.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/variable_length.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/woff2_common.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/woff2_enc.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/woff2_out.$(OBJEXT): src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) libwoff2.a: $(libwoff2_a_OBJECTS) $(libwoff2_a_DEPENDENCIES) $(EXTRA_libwoff2_a_DEPENDENCIES) $(AM_V_at)-rm -f libwoff2.a $(AM_V_AR)$(libwoff2_a_AR) libwoff2.a $(libwoff2_a_OBJECTS) $(libwoff2_a_LIBADD) $(AM_V_at)$(RANLIB) libwoff2.a mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/font.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/glyph.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/normalize.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/table_tags.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/transform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/variable_length.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/woff2_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/woff2_enc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/woff2_out.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f src/$(DEPDIR)/font.Po -rm -f src/$(DEPDIR)/glyph.Po -rm -f src/$(DEPDIR)/normalize.Po -rm -f src/$(DEPDIR)/table_tags.Po -rm -f src/$(DEPDIR)/transform.Po -rm -f src/$(DEPDIR)/variable_length.Po -rm -f src/$(DEPDIR)/woff2_common.Po -rm -f src/$(DEPDIR)/woff2_enc.Po -rm -f src/$(DEPDIR)/woff2_out.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f src/$(DEPDIR)/font.Po -rm -f src/$(DEPDIR)/glyph.Po -rm -f src/$(DEPDIR)/normalize.Po -rm -f src/$(DEPDIR)/table_tags.Po -rm -f src/$(DEPDIR)/transform.Po -rm -f src/$(DEPDIR)/variable_length.Po -rm -f src/$(DEPDIR)/woff2_common.Po -rm -f src/$(DEPDIR)/woff2_enc.Po -rm -f src/$(DEPDIR)/woff2_out.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @HAVE_WOFF2_FALSE@@CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/woff2/include/0000775000175000017500000000000013563265646013623 500000000000000dvisvgm-2.8.1/libs/woff2/include/woff2/0000775000175000017500000000000013563265646014646 500000000000000dvisvgm-2.8.1/libs/woff2/include/woff2/decode.h0000664000175000017500000000222313510660062016140 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Library for converting WOFF2 format font files to their TTF versions. */ #ifndef WOFF2_WOFF2_DEC_H_ #define WOFF2_WOFF2_DEC_H_ #include #include #include namespace woff2 { // Compute the size of the final uncompressed font, or 0 on error. size_t ComputeWOFF2FinalSize(const uint8_t *data, size_t length); // Decompresses the font into the target buffer. The result_length should // be the same as determined by ComputeFinalSize(). Returns true on successful // decompression. // DEPRECATED; please prefer the version that takes a WOFF2Out* bool ConvertWOFF2ToTTF(uint8_t *result, size_t result_length, const uint8_t *data, size_t length); // Decompresses the font into out. Returns true on success. // Works even if WOFF2Header totalSfntSize is wrong. // Please prefer this API. bool ConvertWOFF2ToTTF(const uint8_t *data, size_t length, WOFF2Out* out); } // namespace woff2 #endif // WOFF2_WOFF2_DEC_H_ dvisvgm-2.8.1/libs/woff2/include/woff2/version.h0000664000175000017500000000020313510660062016376 00000000000000#ifndef WOFF2_WOFF2_VERSION_H_ #define WOFF2_WOFF2_VERSION_H_ namespace woff2 { constexpr const int version = 0x010002; } #endif dvisvgm-2.8.1/libs/woff2/include/woff2/output.h0000664000175000017500000000440013510660062016254 00000000000000/* Copyright 2016 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Output buffer for WOFF2 decompression. */ #ifndef WOFF2_WOFF2_OUT_H_ #define WOFF2_WOFF2_OUT_H_ #include #include #include #include namespace woff2 { // Suggested max size for output. const size_t kDefaultMaxSize = 30 * 1024 * 1024; /** * Output interface for the woff2 decoding. * * Writes to arbitrary offsets are supported to facilitate updating offset * table and checksums after tables are ready. Reading the current size is * supported so a 'loca' table can be built up while writing glyphs. * * By default limits size to kDefaultMaxSize. */ class WOFF2Out { public: virtual ~WOFF2Out(void) {} // Append n bytes of data from buf. // Return true if all written, false otherwise. virtual bool Write(const void *buf, size_t n) = 0; // Write n bytes of data from buf at offset. // Return true if all written, false otherwise. virtual bool Write(const void *buf, size_t offset, size_t n) = 0; virtual size_t Size() = 0; }; /** * Expanding memory block for woff2 out. By default limited to kDefaultMaxSize. */ class WOFF2StringOut : public WOFF2Out { public: // Create a writer that writes its data to buf. // buf->size() will grow to at most max_size // buf may be sized (e.g. using EstimateWOFF2FinalSize) or empty. explicit WOFF2StringOut(std::string* buf); bool Write(const void *buf, size_t n) override; bool Write(const void *buf, size_t offset, size_t n) override; size_t Size() override { return offset_; } size_t MaxSize() { return max_size_; } void SetMaxSize(size_t max_size); private: std::string* buf_; size_t max_size_; size_t offset_; }; /** * Fixed memory block for woff2 out. */ class WOFF2MemoryOut : public WOFF2Out { public: // Create a writer that writes its data to buf. WOFF2MemoryOut(uint8_t* buf, size_t buf_size); bool Write(const void *buf, size_t n) override; bool Write(const void *buf, size_t offset, size_t n) override; size_t Size() override { return offset_; } private: uint8_t* buf_; size_t buf_size_; size_t offset_; }; } // namespace woff2 #endif // WOFF2_WOFF2_OUT_H_ dvisvgm-2.8.1/libs/woff2/include/woff2/encode.h0000664000175000017500000000263213510660062016156 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Library for converting WOFF2 format font files to their TTF versions. */ #ifndef WOFF2_WOFF2_ENC_H_ #define WOFF2_WOFF2_ENC_H_ #include #include #include namespace woff2 { struct WOFF2Params { WOFF2Params() : extended_metadata(""), brotli_quality(11), allow_transforms(true) {} std::string extended_metadata; int brotli_quality; bool allow_transforms; }; // Returns an upper bound on the size of the compressed file. size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length); size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length, const std::string& extended_metadata); // Compresses the font into the target buffer. *result_length should be at least // the value returned by MaxWOFF2CompressedSize(), upon return, it is set to the // actual compressed size. Returns true on successful compression. bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, uint8_t *result, size_t *result_length); bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, uint8_t *result, size_t *result_length, const WOFF2Params& params); } // namespace woff2 #endif // WOFF2_WOFF2_ENC_H_ dvisvgm-2.8.1/libs/woff2/LICENSE0000664000175000017500000002613613510660062013114 00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. dvisvgm-2.8.1/libs/woff2/src/0000775000175000017500000000000013563265647012770 500000000000000dvisvgm-2.8.1/libs/woff2/src/woff2_enc.cc0000664000175000017500000003607713510660062015062 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Library for converting TTF format font files to their WOFF2 versions. */ #include #include #include #include #include #include #include #include #include "./buffer.h" #include "./font.h" #include "./normalize.h" #include "./round.h" #include "./store_bytes.h" #include "./table_tags.h" #include "./transform.h" #include "./variable_length.h" #include "./woff2_common.h" namespace woff2 { namespace { using std::string; using std::vector; const size_t kWoff2HeaderSize = 48; const size_t kWoff2EntrySize = 20; bool Compress(const uint8_t* data, const size_t len, uint8_t* result, uint32_t* result_len, BrotliEncoderMode mode, int quality) { size_t compressed_len = *result_len; if (BrotliEncoderCompress(quality, BROTLI_DEFAULT_WINDOW, mode, len, data, &compressed_len, result) == 0) { return false; } *result_len = compressed_len; return true; } bool Woff2Compress(const uint8_t* data, const size_t len, uint8_t* result, uint32_t* result_len, int quality) { return Compress(data, len, result, result_len, BROTLI_MODE_FONT, quality); } bool TextCompress(const uint8_t* data, const size_t len, uint8_t* result, uint32_t* result_len, int quality) { return Compress(data, len, result, result_len, BROTLI_MODE_TEXT, quality); } int KnownTableIndex(uint32_t tag) { for (int i = 0; i < 63; ++i) { if (tag == kKnownTags[i]) return i; } return 63; } void StoreTableEntry(const Table& table, size_t* offset, uint8_t* dst) { uint8_t flag_byte = (table.flags & 0xC0) | KnownTableIndex(table.tag); dst[(*offset)++] = flag_byte; // The index here is treated as a set of flag bytes because // bits 6 and 7 of the byte are reserved for future use as flags. // 0x3f or 63 means an arbitrary table tag. if ((flag_byte & 0x3f) == 0x3f) { StoreU32(table.tag, offset, dst); } StoreBase128(table.src_length, offset, dst); if ((table.flags & kWoff2FlagsTransform) != 0) { StoreBase128(table.transform_length, offset, dst); } } size_t TableEntrySize(const Table& table) { uint8_t flag_byte = KnownTableIndex(table.tag); size_t size = ((flag_byte & 0x3f) != 0x3f) ? 1 : 5; size += Base128Size(table.src_length); if ((table.flags & kWoff2FlagsTransform) != 0) { size += Base128Size(table.transform_length); } return size; } size_t ComputeWoff2Length(const FontCollection& font_collection, const std::vector& tables, std::map, uint16_t> index_by_tag_offset, size_t compressed_data_length, size_t extended_metadata_length) { size_t size = kWoff2HeaderSize; for (const auto& table : tables) { size += TableEntrySize(table); } // for collections only, collection tables if (font_collection.flavor == kTtcFontFlavor) { size += 4; // UInt32 Version of TTC Header size += Size255UShort(font_collection.fonts.size()); // 255UInt16 numFonts size += 4 * font_collection.fonts.size(); // UInt32 flavor for each for (const auto& font : font_collection.fonts) { size += Size255UShort(font.tables.size()); // 255UInt16 numTables for (const auto& entry : font.tables) { const Font::Table& table = entry.second; // no collection entry for xform table if (table.tag & 0x80808080) continue; std::pair tag_offset(table.tag, table.offset); uint16_t table_index = index_by_tag_offset[tag_offset]; size += Size255UShort(table_index); // 255UInt16 index entry } } } // compressed data size += compressed_data_length; size = Round4(size); size += extended_metadata_length; return size; } size_t ComputeUncompressedLength(const Font& font) { // sfnt header + offset table size_t size = 12 + 16 * font.num_tables; for (const auto& entry : font.tables) { const Font::Table& table = entry.second; if (table.tag & 0x80808080) continue; // xform tables don't stay if (table.IsReused()) continue; // don't have to pay twice size += Round4(table.length); } return size; } size_t ComputeUncompressedLength(const FontCollection& font_collection) { if (font_collection.flavor != kTtcFontFlavor) { return ComputeUncompressedLength(font_collection.fonts[0]); } size_t size = CollectionHeaderSize(font_collection.header_version, font_collection.fonts.size()); for (const auto& font : font_collection.fonts) { size += ComputeUncompressedLength(font); } return size; } size_t ComputeTotalTransformLength(const Font& font) { size_t total = 0; for (const auto& i : font.tables) { const Font::Table& table = i.second; if (table.IsReused()) { continue; } if (table.tag & 0x80808080 || !font.FindTable(table.tag ^ 0x80808080)) { // Count transformed tables and non-transformed tables that do not have // transformed versions. total += table.length; } } return total; } } // namespace size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length) { return MaxWOFF2CompressedSize(data, length, ""); } size_t MaxWOFF2CompressedSize(const uint8_t* data, size_t length, const string& extended_metadata) { // Except for the header size, which is 32 bytes larger in woff2 format, // all other parts should be smaller (table header in short format, // transformations and compression). Just to be sure, we will give some // headroom anyway. return length + 1024 + extended_metadata.length(); } uint32_t CompressedBufferSize(uint32_t original_size) { return 1.2 * original_size + 10240; } bool TransformFontCollection(FontCollection* font_collection) { for (auto& font : font_collection->fonts) { if (!TransformGlyfAndLocaTables(&font)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "glyf/loca transformation failed.\n"); #endif return FONT_COMPRESSION_FAILURE(); } } return true; } bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, uint8_t *result, size_t *result_length) { WOFF2Params params; return ConvertTTFToWOFF2(data, length, result, result_length, params); } bool ConvertTTFToWOFF2(const uint8_t *data, size_t length, uint8_t *result, size_t *result_length, const WOFF2Params& params) { FontCollection font_collection; if (!ReadFontCollection(data, length, &font_collection)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Parsing of the input font failed.\n"); #endif return FONT_COMPRESSION_FAILURE(); } if (!NormalizeFontCollection(&font_collection)) { return FONT_COMPRESSION_FAILURE(); } if (params.allow_transforms && !TransformFontCollection(&font_collection)) { return FONT_COMPRESSION_FAILURE(); } else { // glyf/loca use 11 to flag "not transformed" for (auto& font : font_collection.fonts) { Font::Table* glyf_table = font.FindTable(kGlyfTableTag); Font::Table* loca_table = font.FindTable(kLocaTableTag); if (glyf_table) { glyf_table->flag_byte |= 0xc0; } if (loca_table) { loca_table->flag_byte |= 0xc0; } } } // Although the compressed size of each table in the final woff2 file won't // be larger than its transform_length, we have to allocate a large enough // buffer for the compressor, since the compressor can potentially increase // the size. If the compressor overflows this, it should return false and // then this function will also return false. size_t total_transform_length = 0; for (const auto& font : font_collection.fonts) { total_transform_length += ComputeTotalTransformLength(font); } size_t compression_buffer_size = CompressedBufferSize(total_transform_length); std::vector compression_buf(compression_buffer_size); uint32_t total_compressed_length = compression_buffer_size; // Collect all transformed data into one place in output order. std::vector transform_buf(total_transform_length); size_t transform_offset = 0; for (const auto& font : font_collection.fonts) { for (const auto tag : font.OutputOrderedTags()) { const Font::Table& original = font.tables.at(tag); if (original.IsReused()) continue; if (tag & 0x80808080) continue; const Font::Table* table_to_store = font.FindTable(tag ^ 0x80808080); if (table_to_store == NULL) table_to_store = &original; StoreBytes(table_to_store->data, table_to_store->length, &transform_offset, &transform_buf[0]); } } // Compress all transformed data in one stream. if (!Woff2Compress(transform_buf.data(), total_transform_length, &compression_buf[0], &total_compressed_length, params.brotli_quality)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Compression of combined table failed.\n"); #endif return FONT_COMPRESSION_FAILURE(); } #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Compressed %zu to %u.\n", total_transform_length, total_compressed_length); #endif // Compress the extended metadata // TODO(user): how does this apply to collections uint32_t compressed_metadata_buf_length = CompressedBufferSize(params.extended_metadata.length()); std::vector compressed_metadata_buf(compressed_metadata_buf_length); if (params.extended_metadata.length() > 0) { if (!TextCompress((const uint8_t*)params.extended_metadata.data(), params.extended_metadata.length(), compressed_metadata_buf.data(), &compressed_metadata_buf_length, params.brotli_quality)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Compression of extended metadata failed.\n"); #endif return FONT_COMPRESSION_FAILURE(); } } else { compressed_metadata_buf_length = 0; } std::vector
tables; std::map, uint16_t> index_by_tag_offset; for (const auto& font : font_collection.fonts) { for (const auto tag : font.OutputOrderedTags()) { const Font::Table& src_table = font.tables.at(tag); if (src_table.IsReused()) { continue; } std::pair tag_offset(src_table.tag, src_table.offset); if (index_by_tag_offset.find(tag_offset) == index_by_tag_offset.end()) { index_by_tag_offset[tag_offset] = tables.size(); } else { return false; } Table table; table.tag = src_table.tag; table.flags = src_table.flag_byte; table.src_length = src_table.length; table.transform_length = src_table.length; const Font::Table* transformed_table = font.FindTable(src_table.tag ^ 0x80808080); if (transformed_table != NULL) { table.flags = transformed_table->flag_byte; table.flags |= kWoff2FlagsTransform; table.transform_length = transformed_table->length; } tables.push_back(table); } } size_t woff2_length = ComputeWoff2Length(font_collection, tables, index_by_tag_offset, total_compressed_length, compressed_metadata_buf_length); if (woff2_length > *result_length) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Result allocation was too small (%zd vs %zd bytes).\n", *result_length, woff2_length); #endif return FONT_COMPRESSION_FAILURE(); } *result_length = woff2_length; size_t offset = 0; // start of woff2 header (http://www.w3.org/TR/WOFF2/#woff20Header) StoreU32(kWoff2Signature, &offset, result); if (font_collection.flavor != kTtcFontFlavor) { StoreU32(font_collection.fonts[0].flavor, &offset, result); } else { StoreU32(kTtcFontFlavor, &offset, result); } StoreU32(woff2_length, &offset, result); Store16(tables.size(), &offset, result); Store16(0, &offset, result); // reserved // totalSfntSize StoreU32(ComputeUncompressedLength(font_collection), &offset, result); StoreU32(total_compressed_length, &offset, result); // totalCompressedSize // Let's just all be v1.0 Store16(1, &offset, result); // majorVersion Store16(0, &offset, result); // minorVersion if (compressed_metadata_buf_length > 0) { StoreU32(woff2_length - compressed_metadata_buf_length, &offset, result); // metaOffset StoreU32(compressed_metadata_buf_length, &offset, result); // metaLength StoreU32(params.extended_metadata.length(), &offset, result); // metaOrigLength } else { StoreU32(0, &offset, result); // metaOffset StoreU32(0, &offset, result); // metaLength StoreU32(0, &offset, result); // metaOrigLength } StoreU32(0, &offset, result); // privOffset StoreU32(0, &offset, result); // privLength // end of woff2 header // table directory (http://www.w3.org/TR/WOFF2/#table_dir_format) for (const auto& table : tables) { StoreTableEntry(table, &offset, result); } // for collections only, collection table directory if (font_collection.flavor == kTtcFontFlavor) { StoreU32(font_collection.header_version, &offset, result); Store255UShort(font_collection.fonts.size(), &offset, result); for (const Font& font : font_collection.fonts) { uint16_t num_tables = 0; for (const auto& entry : font.tables) { const Font::Table& table = entry.second; if (table.tag & 0x80808080) continue; // don't write xform tables num_tables++; } Store255UShort(num_tables, &offset, result); StoreU32(font.flavor, &offset, result); for (const auto& entry : font.tables) { const Font::Table& table = entry.second; if (table.tag & 0x80808080) continue; // don't write xform tables // for reused tables, only the original has an updated offset uint32_t table_offset = table.IsReused() ? table.reuse_of->offset : table.offset; std::pair tag_offset(table.tag, table_offset); if (index_by_tag_offset.find(tag_offset) == index_by_tag_offset.end()) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Missing table index for offset 0x%08x\n", table_offset); #endif return FONT_COMPRESSION_FAILURE(); } uint16_t index = index_by_tag_offset[tag_offset]; Store255UShort(index, &offset, result); } } } // compressed data format (http://www.w3.org/TR/WOFF2/#table_format) StoreBytes(&compression_buf[0], total_compressed_length, &offset, result); offset = Round4(offset); StoreBytes(compressed_metadata_buf.data(), compressed_metadata_buf_length, &offset, result); if (*result_length != offset) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Mismatch between computed and actual length " "(%zd vs %zd)\n", *result_length, offset); #endif return FONT_COMPRESSION_FAILURE(); } return true; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/table_tags.cc0000664000175000017500000000477613510660062015320 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Font table tags */ #include "./table_tags.h" namespace woff2 { // Note that the byte order is big-endian, not the same as ots.cc #define TAG(a, b, c, d) ((a << 24) | (b << 16) | (c << 8) | d) const uint32_t kKnownTags[63] = { TAG('c', 'm', 'a', 'p'), // 0 TAG('h', 'e', 'a', 'd'), // 1 TAG('h', 'h', 'e', 'a'), // 2 TAG('h', 'm', 't', 'x'), // 3 TAG('m', 'a', 'x', 'p'), // 4 TAG('n', 'a', 'm', 'e'), // 5 TAG('O', 'S', '/', '2'), // 6 TAG('p', 'o', 's', 't'), // 7 TAG('c', 'v', 't', ' '), // 8 TAG('f', 'p', 'g', 'm'), // 9 TAG('g', 'l', 'y', 'f'), // 10 TAG('l', 'o', 'c', 'a'), // 11 TAG('p', 'r', 'e', 'p'), // 12 TAG('C', 'F', 'F', ' '), // 13 TAG('V', 'O', 'R', 'G'), // 14 TAG('E', 'B', 'D', 'T'), // 15 TAG('E', 'B', 'L', 'C'), // 16 TAG('g', 'a', 's', 'p'), // 17 TAG('h', 'd', 'm', 'x'), // 18 TAG('k', 'e', 'r', 'n'), // 19 TAG('L', 'T', 'S', 'H'), // 20 TAG('P', 'C', 'L', 'T'), // 21 TAG('V', 'D', 'M', 'X'), // 22 TAG('v', 'h', 'e', 'a'), // 23 TAG('v', 'm', 't', 'x'), // 24 TAG('B', 'A', 'S', 'E'), // 25 TAG('G', 'D', 'E', 'F'), // 26 TAG('G', 'P', 'O', 'S'), // 27 TAG('G', 'S', 'U', 'B'), // 28 TAG('E', 'B', 'S', 'C'), // 29 TAG('J', 'S', 'T', 'F'), // 30 TAG('M', 'A', 'T', 'H'), // 31 TAG('C', 'B', 'D', 'T'), // 32 TAG('C', 'B', 'L', 'C'), // 33 TAG('C', 'O', 'L', 'R'), // 34 TAG('C', 'P', 'A', 'L'), // 35 TAG('S', 'V', 'G', ' '), // 36 TAG('s', 'b', 'i', 'x'), // 37 TAG('a', 'c', 'n', 't'), // 38 TAG('a', 'v', 'a', 'r'), // 39 TAG('b', 'd', 'a', 't'), // 40 TAG('b', 'l', 'o', 'c'), // 41 TAG('b', 's', 'l', 'n'), // 42 TAG('c', 'v', 'a', 'r'), // 43 TAG('f', 'd', 's', 'c'), // 44 TAG('f', 'e', 'a', 't'), // 45 TAG('f', 'm', 't', 'x'), // 46 TAG('f', 'v', 'a', 'r'), // 47 TAG('g', 'v', 'a', 'r'), // 48 TAG('h', 's', 't', 'y'), // 49 TAG('j', 'u', 's', 't'), // 50 TAG('l', 'c', 'a', 'r'), // 51 TAG('m', 'o', 'r', 't'), // 52 TAG('m', 'o', 'r', 'x'), // 53 TAG('o', 'p', 'b', 'd'), // 54 TAG('p', 'r', 'o', 'p'), // 55 TAG('t', 'r', 'a', 'k'), // 56 TAG('Z', 'a', 'p', 'f'), // 57 TAG('S', 'i', 'l', 'f'), // 58 TAG('G', 'l', 'a', 't'), // 59 TAG('G', 'l', 'o', 'c'), // 60 TAG('F', 'e', 'a', 't'), // 61 TAG('S', 'i', 'l', 'l'), // 62 }; } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/variable_length.cc0000664000175000017500000000615013510660062016325 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Helper functions for woff2 variable length types: 255UInt16 and UIntBase128 */ #include "./variable_length.h" namespace woff2 { size_t Size255UShort(uint16_t value) { size_t result = 3; if (value < 253) { result = 1; } else if (value < 762) { result = 2; } else { result = 3; } return result; } void Write255UShort(std::vector* out, int value) { if (value < 253) { out->push_back(value); } else if (value < 506) { out->push_back(255); out->push_back(value - 253); } else if (value < 762) { out->push_back(254); out->push_back(value - 506); } else { out->push_back(253); out->push_back(value >> 8); out->push_back(value & 0xff); } } void Store255UShort(int val, size_t* offset, uint8_t* dst) { std::vector packed; Write255UShort(&packed, val); for (uint8_t packed_byte : packed) { dst[(*offset)++] = packed_byte; } } // Based on section 6.1.1 of MicroType Express draft spec bool Read255UShort(Buffer* buf, unsigned int* value) { static const int kWordCode = 253; static const int kOneMoreByteCode2 = 254; static const int kOneMoreByteCode1 = 255; static const int kLowestUCode = 253; uint8_t code = 0; if (!buf->ReadU8(&code)) { return FONT_COMPRESSION_FAILURE(); } if (code == kWordCode) { uint16_t result = 0; if (!buf->ReadU16(&result)) { return FONT_COMPRESSION_FAILURE(); } *value = result; return true; } else if (code == kOneMoreByteCode1) { uint8_t result = 0; if (!buf->ReadU8(&result)) { return FONT_COMPRESSION_FAILURE(); } *value = result + kLowestUCode; return true; } else if (code == kOneMoreByteCode2) { uint8_t result = 0; if (!buf->ReadU8(&result)) { return FONT_COMPRESSION_FAILURE(); } *value = result + kLowestUCode * 2; return true; } else { *value = code; return true; } } bool ReadBase128(Buffer* buf, uint32_t* value) { uint32_t result = 0; for (size_t i = 0; i < 5; ++i) { uint8_t code = 0; if (!buf->ReadU8(&code)) { return FONT_COMPRESSION_FAILURE(); } // Leading zeros are invalid. if (i == 0 && code == 0x80) { return FONT_COMPRESSION_FAILURE(); } // If any of the top seven bits are set then we're about to overflow. if (result & 0xfe000000) { return FONT_COMPRESSION_FAILURE(); } result = (result << 7) | (code & 0x7f); if ((code & 0x80) == 0) { *value = result; return true; } } // Make sure not to exceed the size bound return FONT_COMPRESSION_FAILURE(); } size_t Base128Size(size_t n) { size_t size = 1; for (; n >= 128; n >>= 7) ++size; return size; } void StoreBase128(size_t len, size_t* offset, uint8_t* dst) { size_t size = Base128Size(len); for (size_t i = 0; i < size; ++i) { int b = static_cast((len >> (7 * (size - i - 1))) & 0x7f); if (i < size - 1) { b |= 0x80; } dst[(*offset)++] = b; } } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/woff2_common.cc0000664000175000017500000000301313510660062015565 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Helpers common across multiple parts of woff2 */ #include #include "./woff2_common.h" #include "./port.h" namespace woff2 { uint32_t ComputeULongSum(const uint8_t* buf, size_t size) { uint32_t checksum = 0; size_t aligned_size = size & ~3; for (size_t i = 0; i < aligned_size; i += 4) { #if defined(WOFF_LITTLE_ENDIAN) uint32_t v = *reinterpret_cast(buf + i); checksum += (((v & 0xFF) << 24) | ((v & 0xFF00) << 8) | ((v & 0xFF0000) >> 8) | ((v & 0xFF000000) >> 24)); #elif defined(WOFF_BIG_ENDIAN) checksum += *reinterpret_cast(buf + i); #else checksum += (buf[i] << 24) | (buf[i + 1] << 16) | (buf[i + 2] << 8) | buf[i + 3]; #endif } // treat size not aligned on 4 as if it were padded to 4 with 0's if (size != aligned_size) { uint32_t v = 0; for (size_t i = aligned_size; i < size; ++i) { v |= buf[i] << (24 - 8 * (i & 3)); } checksum += v; } return checksum; } size_t CollectionHeaderSize(uint32_t header_version, uint32_t num_fonts) { size_t size = 0; if (header_version == 0x00020000) { size += 12; // ulDsig{Tag,Length,Offset} } if (header_version == 0x00010000 || header_version == 0x00020000) { size += 12 // TTCTag, Version, numFonts + 4 * num_fonts; // OffsetTable[numFonts] } return size; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/transform.h0000664000175000017500000000140013510660062015045 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Library for preprocessing fonts as part of the WOFF 2.0 conversion. */ #ifndef WOFF2_TRANSFORM_H_ #define WOFF2_TRANSFORM_H_ #include "./font.h" namespace woff2 { // Adds the transformed versions of the glyf and loca tables to the font. The // transformed loca table has zero length. The tag of the transformed tables is // derived from the original tag by flipping the MSBs of every byte. bool TransformGlyfAndLocaTables(Font* font); // Apply transformation to hmtx table if applicable for this font. bool TransformHmtxTable(Font* font); } // namespace woff2 #endif // WOFF2_TRANSFORM_H_ dvisvgm-2.8.1/libs/woff2/src/variable_length.h0000664000175000017500000000145313510660062016170 00000000000000/* Copyright 2015 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Helper functions for woff2 variable length types: 255UInt16 and UIntBase128 */ #ifndef WOFF2_VARIABLE_LENGTH_H_ #define WOFF2_VARIABLE_LENGTH_H_ #include #include #include "./buffer.h" namespace woff2 { size_t Size255UShort(uint16_t value); bool Read255UShort(Buffer* buf, unsigned int* value); void Write255UShort(std::vector* out, int value); void Store255UShort(int val, size_t* offset, uint8_t* dst); size_t Base128Size(size_t n); bool ReadBase128(Buffer* buf, uint32_t* value); void StoreBase128(size_t len, size_t* offset, uint8_t* dst); } // namespace woff2 #endif // WOFF2_VARIABLE_LENGTH_H_ dvisvgm-2.8.1/libs/woff2/src/normalize.h0000664000175000017500000000242513510660062015042 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Functions for normalizing fonts. Since the WOFF 2.0 decoder creates font files in normalized form, the WOFF 2.0 conversion is guaranteed to be lossless (in a bitwise sense) only for normalized font files. */ #ifndef WOFF2_NORMALIZE_H_ #define WOFF2_NORMALIZE_H_ namespace woff2 { struct Font; struct FontCollection; // Changes the offset fields of the table headers so that the data for the // tables will be written in order of increasing tag values, without any gaps // other than the 4-byte padding. bool NormalizeOffsets(Font* font); // Changes the checksum fields of the table headers and the checksum field of // the head table so that it matches the current data. bool FixChecksums(Font* font); // Parses each of the glyphs in the font and writes them again to the glyf // table in normalized form, as defined by the StoreGlyph() function. Changes // the loca table accordigly. bool NormalizeGlyphs(Font* font); // Performs all of the normalization steps above. bool NormalizeFont(Font* font); bool NormalizeFontCollection(FontCollection* font_collection); } // namespace woff2 #endif // WOFF2_NORMALIZE_H_ dvisvgm-2.8.1/libs/woff2/src/buffer.h0000664000175000017500000001013113510660062014304 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* The parts of ots.h & opentype-sanitiser.h that we need, taken from the https://code.google.com/p/ots/ project. */ #ifndef WOFF2_BUFFER_H_ #define WOFF2_BUFFER_H_ #if defined(_WIN32) #include typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef int int32_t; typedef unsigned int uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #define ntohl(x) _byteswap_ulong (x) #define ntohs(x) _byteswap_ushort (x) #define htonl(x) _byteswap_ulong (x) #define htons(x) _byteswap_ushort (x) #else #include #include #endif #include #include #include #include namespace woff2 { #if defined(_MSC_VER) || !defined(FONT_COMPRESSION_DEBUG) #define FONT_COMPRESSION_FAILURE() false #else #define FONT_COMPRESSION_FAILURE() \ woff2::Failure(__FILE__, __LINE__, __PRETTY_FUNCTION__) inline bool Failure(const char *f, int l, const char *fn) { fprintf(stderr, "ERROR at %s:%d (%s)\n", f, l, fn); fflush(stderr); return false; } #endif // ----------------------------------------------------------------------------- // Buffer helper class // // This class perform some trival buffer operations while checking for // out-of-bounds errors. As a family they return false if anything is amiss, // updating the current offset otherwise. // ----------------------------------------------------------------------------- class Buffer { public: Buffer(const uint8_t *data, size_t len) : buffer_(data), length_(len), offset_(0) { } bool Skip(size_t n_bytes) { return Read(NULL, n_bytes); } bool Read(uint8_t *data, size_t n_bytes) { if (n_bytes > 1024 * 1024 * 1024) { return FONT_COMPRESSION_FAILURE(); } if ((offset_ + n_bytes > length_) || (offset_ > length_ - n_bytes)) { return FONT_COMPRESSION_FAILURE(); } if (data) { std::memcpy(data, buffer_ + offset_, n_bytes); } offset_ += n_bytes; return true; } inline bool ReadU8(uint8_t *value) { if (offset_ + 1 > length_) { return FONT_COMPRESSION_FAILURE(); } *value = buffer_[offset_]; ++offset_; return true; } bool ReadU16(uint16_t *value) { if (offset_ + 2 > length_) { return FONT_COMPRESSION_FAILURE(); } std::memcpy(value, buffer_ + offset_, sizeof(uint16_t)); *value = ntohs(*value); offset_ += 2; return true; } bool ReadS16(int16_t *value) { return ReadU16(reinterpret_cast(value)); } bool ReadU24(uint32_t *value) { if (offset_ + 3 > length_) { return FONT_COMPRESSION_FAILURE(); } *value = static_cast(buffer_[offset_]) << 16 | static_cast(buffer_[offset_ + 1]) << 8 | static_cast(buffer_[offset_ + 2]); offset_ += 3; return true; } bool ReadU32(uint32_t *value) { if (offset_ + 4 > length_) { return FONT_COMPRESSION_FAILURE(); } std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); *value = ntohl(*value); offset_ += 4; return true; } bool ReadS32(int32_t *value) { return ReadU32(reinterpret_cast(value)); } bool ReadTag(uint32_t *value) { if (offset_ + 4 > length_) { return FONT_COMPRESSION_FAILURE(); } std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); offset_ += 4; return true; } bool ReadR64(uint64_t *value) { if (offset_ + 8 > length_) { return FONT_COMPRESSION_FAILURE(); } std::memcpy(value, buffer_ + offset_, sizeof(uint64_t)); offset_ += 8; return true; } const uint8_t *buffer() const { return buffer_; } size_t offset() const { return offset_; } size_t length() const { return length_; } void set_offset(size_t newoffset) { offset_ = newoffset; } private: const uint8_t * const buffer_; const size_t length_; size_t offset_; }; } // namespace woff2 #endif // WOFF2_BUFFER_H_ dvisvgm-2.8.1/libs/woff2/src/font.h0000664000175000017500000000666513510660062014022 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Data model for a font file in sfnt format, reading and writing functions and accessors for the glyph data. */ #ifndef WOFF2_FONT_H_ #define WOFF2_FONT_H_ #include #include #include #include namespace woff2 { // Represents an sfnt font file. Only the table directory is parsed, for the // table data we only store a raw pointer, therefore a font object is valid only // as long the data from which it was parsed is around. struct Font { uint32_t flavor; uint16_t num_tables; struct Table { uint32_t tag; uint32_t checksum; uint32_t offset; uint32_t length; const uint8_t* data; // Buffer used to mutate the data before writing out. std::vector buffer; // If we've seen this tag/offset before, pointer to the first time we saw it // If this is the first time we've seen this table, NULL // Intended use is to bypass re-processing tables Font::Table* reuse_of; uint8_t flag_byte; // Is this table reused by a TTC bool IsReused() const; }; std::map tables; std::vector OutputOrderedTags() const; Table* FindTable(uint32_t tag); const Table* FindTable(uint32_t tag) const; }; // Accomodates both singular (OTF, TTF) and collection (TTC) fonts struct FontCollection { uint32_t flavor; uint32_t header_version; // (offset, first use of table*) pairs std::map tables; std::vector fonts; }; // Parses the font from the given data. Returns false on parsing failure or // buffer overflow. The font is valid only so long the input data pointer is // valid. Does NOT support collections. bool ReadFont(const uint8_t* data, size_t len, Font* font); // Parses the font from the given data. Returns false on parsing failure or // buffer overflow. The font is valid only so long the input data pointer is // valid. Supports collections. bool ReadFontCollection(const uint8_t* data, size_t len, FontCollection* fonts); // Returns the file size of the font. size_t FontFileSize(const Font& font); size_t FontCollectionFileSize(const FontCollection& font); // Writes the font into the specified dst buffer. The dst_size should be the // same as returned by FontFileSize(). Returns false upon buffer overflow (which // should not happen if dst_size was computed by FontFileSize()). bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size); // Write the font at a specific offset bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size); bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, size_t dst_size); // Returns the number of glyphs in the font. // NOTE: Currently this works only for TrueType-flavored fonts, will return // zero for CFF-flavored fonts. int NumGlyphs(const Font& font); // Returns the index format of the font int IndexFormat(const Font& font); // Sets *glyph_data and *glyph_size to point to the location of the glyph data // with the given index. Returns false if the glyph is not found. bool GetGlyphData(const Font& font, int glyph_index, const uint8_t** glyph_data, size_t* glyph_size); // Removes the digital signature (DSIG) table bool RemoveDigitalSignature(Font* font); } // namespace woff2 #endif // WOFF2_FONT_H_ dvisvgm-2.8.1/libs/woff2/src/woff2_out.cc0000664000175000017500000000303413510660062015107 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Output buffer for WOFF2 decompression. */ #include using std::string; namespace woff2 { WOFF2StringOut::WOFF2StringOut(string* buf) : buf_(buf), max_size_(kDefaultMaxSize), offset_(0) {} bool WOFF2StringOut::Write(const void *buf, size_t n) { return Write(buf, offset_, n); } bool WOFF2StringOut::Write(const void *buf, size_t offset, size_t n) { if (offset > max_size_ || n > max_size_ - offset) { return false; } if (offset == buf_->size()) { buf_->append(static_cast(buf), n); } else { if (offset + n > buf_->size()) { buf_->append(offset + n - buf_->size(), 0); } buf_->replace(offset, n, static_cast(buf), n); } offset_ = std::max(offset_, offset + n); return true; } void WOFF2StringOut::SetMaxSize(size_t max_size) { max_size_ = max_size; if (offset_ > max_size_) { offset_ = max_size_; } } WOFF2MemoryOut::WOFF2MemoryOut(uint8_t* buf, size_t buf_size) : buf_(buf), buf_size_(buf_size), offset_(0) {} bool WOFF2MemoryOut::Write(const void *buf, size_t n) { return Write(buf, offset_, n); } bool WOFF2MemoryOut::Write(const void *buf, size_t offset, size_t n) { if (offset > buf_size_ || n > buf_size_ - offset) { return false; } std::memcpy(buf_ + offset, buf, n); offset_ = std::max(offset_, offset + n); return true; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/round.h0000664000175000017500000000111313510660062014162 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Helper for rounding */ #ifndef WOFF2_ROUND_H_ #define WOFF2_ROUND_H_ #include namespace woff2 { // Round a value up to the nearest multiple of 4. Don't round the value in the // case that rounding up overflows. template T Round4(T value) { if (std::numeric_limits::max() - value < 3) { return value; } return (value + 3) & ~3; } } // namespace woff2 #endif // WOFF2_ROUND_H_ dvisvgm-2.8.1/libs/woff2/src/woff2_common.h0000664000175000017500000000263713510660062015442 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Common definition for WOFF2 encoding/decoding */ #ifndef WOFF2_WOFF2_COMMON_H_ #define WOFF2_WOFF2_COMMON_H_ #include #include #include namespace woff2 { static const uint32_t kWoff2Signature = 0x774f4632; // "wOF2" // Leave the first byte open to store flag_byte const unsigned int kWoff2FlagsTransform = 1 << 8; // TrueType Collection ID string: 'ttcf' static const uint32_t kTtcFontFlavor = 0x74746366; static const size_t kSfntHeaderSize = 12; static const size_t kSfntEntrySize = 16; struct Point { int x; int y; bool on_curve; }; struct Table { uint32_t tag; uint32_t flags; uint32_t src_offset; uint32_t src_length; uint32_t transform_length; uint32_t dst_offset; uint32_t dst_length; const uint8_t* dst_data; bool operator<(const Table& other) const { return tag < other.tag; } }; // Size of the collection header. 0 if version indicates this isn't a // collection. Ref http://www.microsoft.com/typography/otspec/otff.htm, // True Type Collections size_t CollectionHeaderSize(uint32_t header_version, uint32_t num_fonts); // Compute checksum over size bytes of buf uint32_t ComputeULongSum(const uint8_t* buf, size_t size); } // namespace woff2 #endif // WOFF2_WOFF2_COMMON_H_ dvisvgm-2.8.1/libs/woff2/src/transform.cc0000664000175000017500000003145513510660062015220 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Library for preprocessing fonts as part of the WOFF 2.0 conversion. */ #include "./transform.h" #include // for std::abs #include "./buffer.h" #include "./font.h" #include "./glyph.h" #include "./table_tags.h" #include "./variable_length.h" namespace woff2 { namespace { const int FLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0; const int FLAG_WE_HAVE_INSTRUCTIONS = 1 << 8; void WriteBytes(std::vector* out, const uint8_t* data, size_t len) { if (len == 0) return; size_t offset = out->size(); out->resize(offset + len); memcpy(&(*out)[offset], data, len); } void WriteBytes(std::vector* out, const std::vector& in) { for (size_t i = 0; i < in.size(); ++i) { out->push_back(in[i]); } } void WriteUShort(std::vector* out, int value) { out->push_back(value >> 8); out->push_back(value & 255); } void WriteLong(std::vector* out, int value) { out->push_back((value >> 24) & 255); out->push_back((value >> 16) & 255); out->push_back((value >> 8) & 255); out->push_back(value & 255); } // Glyf table preprocessing, based on // GlyfEncoder.java class GlyfEncoder { public: explicit GlyfEncoder(int num_glyphs) : n_glyphs_(num_glyphs) { bbox_bitmap_.resize(((num_glyphs + 31) >> 5) << 2); } bool Encode(int glyph_id, const Glyph& glyph) { if (glyph.composite_data_size > 0) { WriteCompositeGlyph(glyph_id, glyph); } else if (glyph.contours.size() > 0) { WriteSimpleGlyph(glyph_id, glyph); } else { WriteUShort(&n_contour_stream_, 0); } return true; } void GetTransformedGlyfBytes(std::vector* result) { WriteLong(result, 0); // version WriteUShort(result, n_glyphs_); WriteUShort(result, 0); // index_format, will be set later WriteLong(result, n_contour_stream_.size()); WriteLong(result, n_points_stream_.size()); WriteLong(result, flag_byte_stream_.size()); WriteLong(result, glyph_stream_.size()); WriteLong(result, composite_stream_.size()); WriteLong(result, bbox_bitmap_.size() + bbox_stream_.size()); WriteLong(result, instruction_stream_.size()); WriteBytes(result, n_contour_stream_); WriteBytes(result, n_points_stream_); WriteBytes(result, flag_byte_stream_); WriteBytes(result, glyph_stream_); WriteBytes(result, composite_stream_); WriteBytes(result, bbox_bitmap_); WriteBytes(result, bbox_stream_); WriteBytes(result, instruction_stream_); } private: void WriteInstructions(const Glyph& glyph) { Write255UShort(&glyph_stream_, glyph.instructions_size); WriteBytes(&instruction_stream_, glyph.instructions_data, glyph.instructions_size); } bool ShouldWriteSimpleGlyphBbox(const Glyph& glyph) { if (glyph.contours.empty() || glyph.contours[0].empty()) { return glyph.x_min || glyph.y_min || glyph.x_max || glyph.y_max; } int16_t x_min = glyph.contours[0][0].x; int16_t y_min = glyph.contours[0][0].y; int16_t x_max = x_min; int16_t y_max = y_min; for (const auto& contour : glyph.contours) { for (const auto& point : contour) { if (point.x < x_min) x_min = point.x; if (point.x > x_max) x_max = point.x; if (point.y < y_min) y_min = point.y; if (point.y > y_max) y_max = point.y; } } if (glyph.x_min != x_min) return true; if (glyph.y_min != y_min) return true; if (glyph.x_max != x_max) return true; if (glyph.y_max != y_max) return true; return false; } void WriteSimpleGlyph(int glyph_id, const Glyph& glyph) { int num_contours = glyph.contours.size(); WriteUShort(&n_contour_stream_, num_contours); if (ShouldWriteSimpleGlyphBbox(glyph)) { WriteBbox(glyph_id, glyph); } for (int i = 0; i < num_contours; i++) { Write255UShort(&n_points_stream_, glyph.contours[i].size()); } int lastX = 0; int lastY = 0; for (int i = 0; i < num_contours; i++) { int num_points = glyph.contours[i].size(); for (int j = 0; j < num_points; j++) { int x = glyph.contours[i][j].x; int y = glyph.contours[i][j].y; int dx = x - lastX; int dy = y - lastY; WriteTriplet(glyph.contours[i][j].on_curve, dx, dy); lastX = x; lastY = y; } } if (num_contours > 0) { WriteInstructions(glyph); } } void WriteCompositeGlyph(int glyph_id, const Glyph& glyph) { WriteUShort(&n_contour_stream_, -1); WriteBbox(glyph_id, glyph); WriteBytes(&composite_stream_, glyph.composite_data, glyph.composite_data_size); if (glyph.have_instructions) { WriteInstructions(glyph); } } void WriteBbox(int glyph_id, const Glyph& glyph) { bbox_bitmap_[glyph_id >> 3] |= 0x80 >> (glyph_id & 7); WriteUShort(&bbox_stream_, glyph.x_min); WriteUShort(&bbox_stream_, glyph.y_min); WriteUShort(&bbox_stream_, glyph.x_max); WriteUShort(&bbox_stream_, glyph.y_max); } void WriteTriplet(bool on_curve, int x, int y) { int abs_x = std::abs(x); int abs_y = std::abs(y); int on_curve_bit = on_curve ? 0 : 128; int x_sign_bit = (x < 0) ? 0 : 1; int y_sign_bit = (y < 0) ? 0 : 1; int xy_sign_bits = x_sign_bit + 2 * y_sign_bit; if (x == 0 && abs_y < 1280) { flag_byte_stream_.push_back(on_curve_bit + ((abs_y & 0xf00) >> 7) + y_sign_bit); glyph_stream_.push_back(abs_y & 0xff); } else if (y == 0 && abs_x < 1280) { flag_byte_stream_.push_back(on_curve_bit + 10 + ((abs_x & 0xf00) >> 7) + x_sign_bit); glyph_stream_.push_back(abs_x & 0xff); } else if (abs_x < 65 && abs_y < 65) { flag_byte_stream_.push_back(on_curve_bit + 20 + ((abs_x - 1) & 0x30) + (((abs_y - 1) & 0x30) >> 2) + xy_sign_bits); glyph_stream_.push_back((((abs_x - 1) & 0xf) << 4) | ((abs_y - 1) & 0xf)); } else if (abs_x < 769 && abs_y < 769) { flag_byte_stream_.push_back(on_curve_bit + 84 + 12 * (((abs_x - 1) & 0x300) >> 8) + (((abs_y - 1) & 0x300) >> 6) + xy_sign_bits); glyph_stream_.push_back((abs_x - 1) & 0xff); glyph_stream_.push_back((abs_y - 1) & 0xff); } else if (abs_x < 4096 && abs_y < 4096) { flag_byte_stream_.push_back(on_curve_bit + 120 + xy_sign_bits); glyph_stream_.push_back(abs_x >> 4); glyph_stream_.push_back(((abs_x & 0xf) << 4) | (abs_y >> 8)); glyph_stream_.push_back(abs_y & 0xff); } else { flag_byte_stream_.push_back(on_curve_bit + 124 + xy_sign_bits); glyph_stream_.push_back(abs_x >> 8); glyph_stream_.push_back(abs_x & 0xff); glyph_stream_.push_back(abs_y >> 8); glyph_stream_.push_back(abs_y & 0xff); } } std::vector n_contour_stream_; std::vector n_points_stream_; std::vector flag_byte_stream_; std::vector composite_stream_; std::vector bbox_bitmap_; std::vector bbox_stream_; std::vector glyph_stream_; std::vector instruction_stream_; int n_glyphs_; }; } // namespace bool TransformGlyfAndLocaTables(Font* font) { // no transform for CFF const Font::Table* glyf_table = font->FindTable(kGlyfTableTag); const Font::Table* loca_table = font->FindTable(kLocaTableTag); // If you don't have glyf/loca this transform isn't very interesting if (loca_table == NULL && glyf_table == NULL) { return true; } // It would be best if you didn't have just one of glyf/loca if ((glyf_table == NULL) != (loca_table == NULL)) { return FONT_COMPRESSION_FAILURE(); } // Must share neither or both loca & glyf if (loca_table->IsReused() != glyf_table->IsReused()) { return FONT_COMPRESSION_FAILURE(); } if (loca_table->IsReused()) { return true; } Font::Table* transformed_glyf = &font->tables[kGlyfTableTag ^ 0x80808080]; Font::Table* transformed_loca = &font->tables[kLocaTableTag ^ 0x80808080]; int num_glyphs = NumGlyphs(*font); GlyfEncoder encoder(num_glyphs); for (int i = 0; i < num_glyphs; ++i) { Glyph glyph; const uint8_t* glyph_data; size_t glyph_size; if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) || (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) { return FONT_COMPRESSION_FAILURE(); } encoder.Encode(i, glyph); } encoder.GetTransformedGlyfBytes(&transformed_glyf->buffer); const Font::Table* head_table = font->FindTable(kHeadTableTag); if (head_table == NULL || head_table->length < 52) { return FONT_COMPRESSION_FAILURE(); } transformed_glyf->buffer[7] = head_table->data[51]; // index_format transformed_glyf->tag = kGlyfTableTag ^ 0x80808080; transformed_glyf->length = transformed_glyf->buffer.size(); transformed_glyf->data = transformed_glyf->buffer.data(); transformed_loca->tag = kLocaTableTag ^ 0x80808080; transformed_loca->length = 0; transformed_loca->data = NULL; return true; } // See https://www.microsoft.com/typography/otspec/hmtx.htm // See WOFF2 spec, 5.4. Transformed hmtx table format bool TransformHmtxTable(Font* font) { const Font::Table* glyf_table = font->FindTable(kGlyfTableTag); const Font::Table* hmtx_table = font->FindTable(kHmtxTableTag); const Font::Table* hhea_table = font->FindTable(kHheaTableTag); // If you don't have hmtx or a glyf not much is going to happen here if (hmtx_table == NULL || glyf_table == NULL) { return true; } // hmtx without hhea doesn't make sense if (hhea_table == NULL) { return FONT_COMPRESSION_FAILURE(); } // Skip 34 to reach 'hhea' numberOfHMetrics Buffer hhea_buf(hhea_table->data, hhea_table->length); uint16_t num_hmetrics; if (!hhea_buf.Skip(34) || !hhea_buf.ReadU16(&num_hmetrics)) { return FONT_COMPRESSION_FAILURE(); } // Must have at least one hMetric if (num_hmetrics < 1) { return FONT_COMPRESSION_FAILURE(); } int num_glyphs = NumGlyphs(*font); // Most fonts can be transformed; assume it's a go until proven otherwise std::vector advance_widths; std::vector proportional_lsbs; std::vector monospace_lsbs; bool remove_proportional_lsb = true; bool remove_monospace_lsb = (num_glyphs - num_hmetrics) > 0; Buffer hmtx_buf(hmtx_table->data, hmtx_table->length); for (int i = 0; i < num_glyphs; i++) { Glyph glyph; const uint8_t* glyph_data; size_t glyph_size; if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) || (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) { return FONT_COMPRESSION_FAILURE(); } uint16_t advance_width = 0; int16_t lsb = 0; if (i < num_hmetrics) { // [0, num_hmetrics) are proportional hMetrics if (!hmtx_buf.ReadU16(&advance_width)) { return FONT_COMPRESSION_FAILURE(); } if (!hmtx_buf.ReadS16(&lsb)) { return FONT_COMPRESSION_FAILURE(); } if (glyph_size > 0 && glyph.x_min != lsb) { remove_proportional_lsb = false; } advance_widths.push_back(advance_width); proportional_lsbs.push_back(lsb); } else { // [num_hmetrics, num_glyphs) are monospace leftSideBearing's if (!hmtx_buf.ReadS16(&lsb)) { return FONT_COMPRESSION_FAILURE(); } if (glyph_size > 0 && glyph.x_min != lsb) { remove_monospace_lsb = false; } monospace_lsbs.push_back(lsb); } // If we know we can't optimize, bail out completely if (!remove_proportional_lsb && !remove_monospace_lsb) { return true; } } Font::Table* transformed_hmtx = &font->tables[kHmtxTableTag ^ 0x80808080]; uint8_t flags = 0; size_t transformed_size = 1 + 2 * advance_widths.size(); if (remove_proportional_lsb) { flags |= 1; } else { transformed_size += 2 * proportional_lsbs.size(); } if (remove_monospace_lsb) { flags |= 1 << 1; } else { transformed_size += 2 * monospace_lsbs.size(); } transformed_hmtx->buffer.reserve(transformed_size); std::vector* out = &transformed_hmtx->buffer; WriteBytes(out, &flags, 1); for (uint16_t advance_width : advance_widths) { WriteUShort(out, advance_width); } if (!remove_proportional_lsb) { for (int16_t lsb : proportional_lsbs) { WriteUShort(out, lsb); } } if (!remove_monospace_lsb) { for (int16_t lsb : monospace_lsbs) { WriteUShort(out, lsb); } } transformed_hmtx->tag = kHmtxTableTag ^ 0x80808080; transformed_hmtx->flag_byte = 1 << 6; transformed_hmtx->length = transformed_hmtx->buffer.size(); transformed_hmtx->data = transformed_hmtx->buffer.data(); return true; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/font.cc0000664000175000017500000002757313510660062014161 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Font management utilities */ #include "./font.h" #include #include "./buffer.h" #include "./port.h" #include "./store_bytes.h" #include "./table_tags.h" #include "./woff2_common.h" namespace woff2 { Font::Table* Font::FindTable(uint32_t tag) { std::map::iterator it = tables.find(tag); return it == tables.end() ? 0 : &it->second; } const Font::Table* Font::FindTable(uint32_t tag) const { std::map::const_iterator it = tables.find(tag); return it == tables.end() ? 0 : &it->second; } std::vector Font::OutputOrderedTags() const { std::vector output_order; for (const auto& i : tables) { const Font::Table& table = i.second; // This is a transformed table, we will write it together with the // original version. if (table.tag & 0x80808080) { continue; } output_order.push_back(table.tag); } // Alphabetize then put loca immediately after glyf auto glyf_loc = std::find(output_order.begin(), output_order.end(), kGlyfTableTag); auto loca_loc = std::find(output_order.begin(), output_order.end(), kLocaTableTag); if (glyf_loc != output_order.end() && loca_loc != output_order.end()) { output_order.erase(loca_loc); output_order.insert(std::find(output_order.begin(), output_order.end(), kGlyfTableTag) + 1, kLocaTableTag); } return output_order; } bool ReadTrueTypeFont(Buffer* file, const uint8_t* data, size_t len, Font* font) { // We don't care about the search_range, entry_selector and range_shift // fields, they will always be computed upon writing the font. if (!file->ReadU16(&font->num_tables) || !file->Skip(6)) { return FONT_COMPRESSION_FAILURE(); } std::map intervals; for (uint16_t i = 0; i < font->num_tables; ++i) { Font::Table table; table.flag_byte = 0; table.reuse_of = NULL; if (!file->ReadU32(&table.tag) || !file->ReadU32(&table.checksum) || !file->ReadU32(&table.offset) || !file->ReadU32(&table.length)) { return FONT_COMPRESSION_FAILURE(); } if ((table.offset & 3) != 0 || table.length > len || len - table.length < table.offset) { return FONT_COMPRESSION_FAILURE(); } intervals[table.offset] = table.length; table.data = data + table.offset; if (font->tables.find(table.tag) != font->tables.end()) { return FONT_COMPRESSION_FAILURE(); } font->tables[table.tag] = table; } // Check that tables are non-overlapping. uint32_t last_offset = 12UL + 16UL * font->num_tables; for (const auto& i : intervals) { if (i.first < last_offset || i.first + i.second < i.first) { return FONT_COMPRESSION_FAILURE(); } last_offset = i.first + i.second; } // Sanity check key tables const Font::Table* head_table = font->FindTable(kHeadTableTag); if (head_table != NULL && head_table->length < 52) { return FONT_COMPRESSION_FAILURE(); } return true; } bool ReadCollectionFont(Buffer* file, const uint8_t* data, size_t len, Font* font, std::map* all_tables) { if (!file->ReadU32(&font->flavor)) { return FONT_COMPRESSION_FAILURE(); } if (!ReadTrueTypeFont(file, data, len, font)) { return FONT_COMPRESSION_FAILURE(); } for (auto& entry : font->tables) { Font::Table& table = entry.second; if (all_tables->find(table.offset) == all_tables->end()) { (*all_tables)[table.offset] = font->FindTable(table.tag); } else { table.reuse_of = (*all_tables)[table.offset]; if (table.tag != table.reuse_of->tag) { return FONT_COMPRESSION_FAILURE(); } } } return true; } bool ReadTrueTypeCollection(Buffer* file, const uint8_t* data, size_t len, FontCollection* font_collection) { uint32_t num_fonts; if (!file->ReadU32(&font_collection->header_version) || !file->ReadU32(&num_fonts)) { return FONT_COMPRESSION_FAILURE(); } std::vector offsets; for (size_t i = 0; i < num_fonts; i++) { uint32_t offset; if (!file->ReadU32(&offset)) { return FONT_COMPRESSION_FAILURE(); } offsets.push_back(offset); } font_collection->fonts.resize(offsets.size()); std::vector::iterator font_it = font_collection->fonts.begin(); std::map all_tables; for (const auto offset : offsets) { file->set_offset(offset); Font& font = *font_it++; if (!ReadCollectionFont(file, data, len, &font, &all_tables)) { return FONT_COMPRESSION_FAILURE(); } } return true; } bool ReadFont(const uint8_t* data, size_t len, Font* font) { Buffer file(data, len); if (!file.ReadU32(&font->flavor)) { return FONT_COMPRESSION_FAILURE(); } if (font->flavor == kTtcFontFlavor) { return FONT_COMPRESSION_FAILURE(); } return ReadTrueTypeFont(&file, data, len, font); } bool ReadFontCollection(const uint8_t* data, size_t len, FontCollection* font_collection) { Buffer file(data, len); if (!file.ReadU32(&font_collection->flavor)) { return FONT_COMPRESSION_FAILURE(); } if (font_collection->flavor != kTtcFontFlavor) { font_collection->fonts.resize(1); Font& font = font_collection->fonts[0]; font.flavor = font_collection->flavor; return ReadTrueTypeFont(&file, data, len, &font); } return ReadTrueTypeCollection(&file, data, len, font_collection); } size_t FontFileSize(const Font& font) { size_t max_offset = 12ULL + 16ULL * font.num_tables; for (const auto& i : font.tables) { const Font::Table& table = i.second; size_t padding_size = (4 - (table.length & 3)) & 3; size_t end_offset = (padding_size + table.offset) + table.length; max_offset = std::max(max_offset, end_offset); } return max_offset; } size_t FontCollectionFileSize(const FontCollection& font_collection) { size_t max_offset = 0; for (auto& font : font_collection.fonts) { // font file size actually just finds max offset max_offset = std::max(max_offset, FontFileSize(font)); } return max_offset; } bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size) { size_t offset = 0; return WriteFont(font, &offset, dst, dst_size); } bool WriteTableRecord(const Font::Table* table, size_t* offset, uint8_t* dst, size_t dst_size) { if (dst_size < *offset + kSfntEntrySize) { return FONT_COMPRESSION_FAILURE(); } if (table->IsReused()) { table = table->reuse_of; } StoreU32(table->tag, offset, dst); StoreU32(table->checksum, offset, dst); StoreU32(table->offset, offset, dst); StoreU32(table->length, offset, dst); return true; } bool WriteTable(const Font::Table& table, size_t* offset, uint8_t* dst, size_t dst_size) { if (!WriteTableRecord(&table, offset, dst, dst_size)) { return false; } // Write the actual table data if it's the first time we've seen it if (!table.IsReused()) { if (table.offset + table.length < table.offset || dst_size < table.offset + table.length) { return FONT_COMPRESSION_FAILURE(); } memcpy(dst + table.offset, table.data, table.length); size_t padding_size = (4 - (table.length & 3)) & 3; if (table.offset + table.length + padding_size < padding_size || dst_size < table.offset + table.length + padding_size) { return FONT_COMPRESSION_FAILURE(); } memset(dst + table.offset + table.length, 0, padding_size); } return true; } bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size) { if (dst_size < 12ULL + 16ULL * font.num_tables) { return FONT_COMPRESSION_FAILURE(); } StoreU32(font.flavor, offset, dst); Store16(font.num_tables, offset, dst); uint16_t max_pow2 = font.num_tables ? Log2Floor(font.num_tables) : 0; uint16_t search_range = max_pow2 ? 1 << (max_pow2 + 4) : 0; uint16_t range_shift = (font.num_tables << 4) - search_range; Store16(search_range, offset, dst); Store16(max_pow2, offset, dst); Store16(range_shift, offset, dst); for (const auto& i : font.tables) { if (!WriteTable(i.second, offset, dst, dst_size)) { return false; } } return true; } bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, size_t dst_size) { size_t offset = 0; // It's simpler if this just a simple sfnt if (font_collection.flavor != kTtcFontFlavor) { return WriteFont(font_collection.fonts[0], &offset, dst, dst_size); } // Write TTC header StoreU32(kTtcFontFlavor, &offset, dst); StoreU32(font_collection.header_version, &offset, dst); StoreU32(font_collection.fonts.size(), &offset, dst); // Offset Table, zeroed for now size_t offset_table = offset; // where to write offsets later for (size_t i = 0; i < font_collection.fonts.size(); i++) { StoreU32(0, &offset, dst); } if (font_collection.header_version == 0x00020000) { StoreU32(0, &offset, dst); // ulDsigTag StoreU32(0, &offset, dst); // ulDsigLength StoreU32(0, &offset, dst); // ulDsigOffset } // Write fonts and their offsets. for (size_t i = 0; i < font_collection.fonts.size(); i++) { const auto& font = font_collection.fonts[i]; StoreU32(offset, &offset_table, dst); if (!WriteFont(font, &offset, dst, dst_size)) { return false; } } return true; } int NumGlyphs(const Font& font) { const Font::Table* head_table = font.FindTable(kHeadTableTag); const Font::Table* loca_table = font.FindTable(kLocaTableTag); if (head_table == NULL || loca_table == NULL || head_table->length < 52) { return 0; } int index_fmt = IndexFormat(font); uint32_t loca_record_size = (index_fmt == 0 ? 2 : 4); if (loca_table->length < loca_record_size) { return 0; } return (loca_table->length / loca_record_size) - 1; } int IndexFormat(const Font& font) { const Font::Table* head_table = font.FindTable(kHeadTableTag); if (head_table == NULL) { return 0; } return head_table->data[51]; } bool Font::Table::IsReused() const { return this->reuse_of != NULL; } bool GetGlyphData(const Font& font, int glyph_index, const uint8_t** glyph_data, size_t* glyph_size) { if (glyph_index < 0) { return FONT_COMPRESSION_FAILURE(); } const Font::Table* head_table = font.FindTable(kHeadTableTag); const Font::Table* loca_table = font.FindTable(kLocaTableTag); const Font::Table* glyf_table = font.FindTable(kGlyfTableTag); if (head_table == NULL || loca_table == NULL || glyf_table == NULL || head_table->length < 52) { return FONT_COMPRESSION_FAILURE(); } int index_fmt = IndexFormat(font); Buffer loca_buf(loca_table->data, loca_table->length); if (index_fmt == 0) { uint16_t offset1, offset2; if (!loca_buf.Skip(2 * glyph_index) || !loca_buf.ReadU16(&offset1) || !loca_buf.ReadU16(&offset2) || offset2 < offset1 || 2 * offset2 > glyf_table->length) { return FONT_COMPRESSION_FAILURE(); } *glyph_data = glyf_table->data + 2 * offset1; *glyph_size = 2 * (offset2 - offset1); } else { uint32_t offset1, offset2; if (!loca_buf.Skip(4 * glyph_index) || !loca_buf.ReadU32(&offset1) || !loca_buf.ReadU32(&offset2) || offset2 < offset1 || offset2 > glyf_table->length) { return FONT_COMPRESSION_FAILURE(); } *glyph_data = glyf_table->data + offset1; *glyph_size = offset2 - offset1; } return true; } bool RemoveDigitalSignature(Font* font) { std::map::iterator it = font->tables.find(kDsigTableTag); if (it != font->tables.end()) { font->tables.erase(it); font->num_tables = font->tables.size(); } return true; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/glyph.cc0000664000175000017500000002601513536436617014343 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Glyph manipulation */ #include "./glyph.h" #include #include #include "./buffer.h" #include "./store_bytes.h" namespace woff2 { static const int32_t kFLAG_ONCURVE = 1; static const int32_t kFLAG_XSHORT = 1 << 1; static const int32_t kFLAG_YSHORT = 1 << 2; static const int32_t kFLAG_REPEAT = 1 << 3; static const int32_t kFLAG_XREPEATSIGN = 1 << 4; static const int32_t kFLAG_YREPEATSIGN = 1 << 5; static const int32_t kFLAG_ARG_1_AND_2_ARE_WORDS = 1 << 0; static const int32_t kFLAG_WE_HAVE_A_SCALE = 1 << 3; static const int32_t kFLAG_MORE_COMPONENTS = 1 << 5; static const int32_t kFLAG_WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6; static const int32_t kFLAG_WE_HAVE_A_TWO_BY_TWO = 1 << 7; static const int32_t kFLAG_WE_HAVE_INSTRUCTIONS = 1 << 8; bool ReadCompositeGlyphData(Buffer* buffer, Glyph* glyph) { glyph->have_instructions = false; glyph->composite_data = buffer->buffer() + buffer->offset(); size_t start_offset = buffer->offset(); uint16_t flags = kFLAG_MORE_COMPONENTS; while (flags & kFLAG_MORE_COMPONENTS) { if (!buffer->ReadU16(&flags)) { return FONT_COMPRESSION_FAILURE(); } glyph->have_instructions |= (flags & kFLAG_WE_HAVE_INSTRUCTIONS) != 0; size_t arg_size = 2; // glyph index if (flags & kFLAG_ARG_1_AND_2_ARE_WORDS) { arg_size += 4; } else { arg_size += 2; } if (flags & kFLAG_WE_HAVE_A_SCALE) { arg_size += 2; } else if (flags & kFLAG_WE_HAVE_AN_X_AND_Y_SCALE) { arg_size += 4; } else if (flags & kFLAG_WE_HAVE_A_TWO_BY_TWO) { arg_size += 8; } if (!buffer->Skip(arg_size)) { return FONT_COMPRESSION_FAILURE(); } } if (buffer->offset() - start_offset > std::numeric_limits::max()) { return FONT_COMPRESSION_FAILURE(); } glyph->composite_data_size = buffer->offset() - start_offset; return true; } bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph) { Buffer buffer(data, len); int16_t num_contours; if (!buffer.ReadS16(&num_contours)) { return FONT_COMPRESSION_FAILURE(); } // Read the bounding box. if (!buffer.ReadS16(&glyph->x_min) || !buffer.ReadS16(&glyph->y_min) || !buffer.ReadS16(&glyph->x_max) || !buffer.ReadS16(&glyph->y_max)) { return FONT_COMPRESSION_FAILURE(); } if (num_contours == 0) { // Empty glyph. return true; } if (num_contours > 0) { // Simple glyph. glyph->contours.resize(num_contours); // Read the number of points per contour. uint16_t last_point_index = 0; for (int i = 0; i < num_contours; ++i) { uint16_t point_index; if (!buffer.ReadU16(&point_index)) { return FONT_COMPRESSION_FAILURE(); } uint16_t num_points = point_index - last_point_index + (i == 0 ? 1 : 0); glyph->contours[i].resize(num_points); last_point_index = point_index; } // Read the instructions. if (!buffer.ReadU16(&glyph->instructions_size)) { return FONT_COMPRESSION_FAILURE(); } glyph->instructions_data = data + buffer.offset(); if (!buffer.Skip(glyph->instructions_size)) { return FONT_COMPRESSION_FAILURE(); } // Read the run-length coded flags. std::vector > flags(num_contours); { uint8_t flag = 0; uint8_t flag_repeat = 0; for (int i = 0; i < num_contours; ++i) { flags[i].resize(glyph->contours[i].size()); for (size_t j = 0; j < glyph->contours[i].size(); ++j) { if (flag_repeat == 0) { if (!buffer.ReadU8(&flag)) { return FONT_COMPRESSION_FAILURE(); } if (flag & kFLAG_REPEAT) { if (!buffer.ReadU8(&flag_repeat)) { return FONT_COMPRESSION_FAILURE(); } } } else { flag_repeat--; } flags[i][j] = flag; glyph->contours[i][j].on_curve = flag & kFLAG_ONCURVE; } } } // Read the x coordinates. int prev_x = 0; for (int i = 0; i < num_contours; ++i) { for (size_t j = 0; j < glyph->contours[i].size(); ++j) { uint8_t flag = flags[i][j]; if (flag & kFLAG_XSHORT) { // single byte x-delta coord value uint8_t x_delta; if (!buffer.ReadU8(&x_delta)) { return FONT_COMPRESSION_FAILURE(); } int sign = (flag & kFLAG_XREPEATSIGN) ? 1 : -1; glyph->contours[i][j].x = prev_x + sign * x_delta; } else { // double byte x-delta coord value int16_t x_delta = 0; if (!(flag & kFLAG_XREPEATSIGN)) { if (!buffer.ReadS16(&x_delta)) { return FONT_COMPRESSION_FAILURE(); } } glyph->contours[i][j].x = prev_x + x_delta; } prev_x = glyph->contours[i][j].x; } } // Read the y coordinates. int prev_y = 0; for (int i = 0; i < num_contours; ++i) { for (size_t j = 0; j < glyph->contours[i].size(); ++j) { uint8_t flag = flags[i][j]; if (flag & kFLAG_YSHORT) { // single byte y-delta coord value uint8_t y_delta; if (!buffer.ReadU8(&y_delta)) { return FONT_COMPRESSION_FAILURE(); } int sign = (flag & kFLAG_YREPEATSIGN) ? 1 : -1; glyph->contours[i][j].y = prev_y + sign * y_delta; } else { // double byte y-delta coord value int16_t y_delta = 0; if (!(flag & kFLAG_YREPEATSIGN)) { if (!buffer.ReadS16(&y_delta)) { return FONT_COMPRESSION_FAILURE(); } } glyph->contours[i][j].y = prev_y + y_delta; } prev_y = glyph->contours[i][j].y; } } } else if (num_contours == -1) { // Composite glyph. if (!ReadCompositeGlyphData(&buffer, glyph)) { return FONT_COMPRESSION_FAILURE(); } // Read the instructions. if (glyph->have_instructions) { if (!buffer.ReadU16(&glyph->instructions_size)) { return FONT_COMPRESSION_FAILURE(); } glyph->instructions_data = data + buffer.offset(); if (!buffer.Skip(glyph->instructions_size)) { return FONT_COMPRESSION_FAILURE(); } } else { glyph->instructions_size = 0; } } else { return FONT_COMPRESSION_FAILURE(); } return true; } namespace { void StoreBbox(const Glyph& glyph, size_t* offset, uint8_t* dst) { Store16(glyph.x_min, offset, dst); Store16(glyph.y_min, offset, dst); Store16(glyph.x_max, offset, dst); Store16(glyph.y_max, offset, dst); } void StoreInstructions(const Glyph& glyph, size_t* offset, uint8_t* dst) { Store16(glyph.instructions_size, offset, dst); StoreBytes(glyph.instructions_data, glyph.instructions_size, offset, dst); } bool StoreEndPtsOfContours(const Glyph& glyph, size_t* offset, uint8_t* dst) { int end_point = -1; for (const auto& contour : glyph.contours) { end_point += contour.size(); if (contour.size() > std::numeric_limits::max() || end_point > std::numeric_limits::max()) { return FONT_COMPRESSION_FAILURE(); } Store16(end_point, offset, dst); } return true; } bool StorePoints(const Glyph& glyph, size_t* offset, uint8_t* dst, size_t dst_size) { int last_flag = -1; int repeat_count = 0; int last_x = 0; int last_y = 0; size_t x_bytes = 0; size_t y_bytes = 0; // Store the flags and calculate the total size of the x and y coordinates. for (const auto& contour : glyph.contours) { for (const auto& point : contour) { int flag = point.on_curve ? kFLAG_ONCURVE : 0; int dx = point.x - last_x; int dy = point.y - last_y; if (dx == 0) { flag |= kFLAG_XREPEATSIGN; } else if (dx > -256 && dx < 256) { flag |= kFLAG_XSHORT | (dx > 0 ? kFLAG_XREPEATSIGN : 0); x_bytes += 1; } else { x_bytes += 2; } if (dy == 0) { flag |= kFLAG_YREPEATSIGN; } else if (dy > -256 && dy < 256) { flag |= kFLAG_YSHORT | (dy > 0 ? kFLAG_YREPEATSIGN : 0); y_bytes += 1; } else { y_bytes += 2; } if (flag == last_flag && repeat_count != 255) { dst[*offset - 1] |= kFLAG_REPEAT; repeat_count++; } else { if (repeat_count != 0) { if (*offset >= dst_size) { return FONT_COMPRESSION_FAILURE(); } dst[(*offset)++] = repeat_count; } if (*offset >= dst_size) { return FONT_COMPRESSION_FAILURE(); } dst[(*offset)++] = flag; repeat_count = 0; } last_x = point.x; last_y = point.y; last_flag = flag; } } if (repeat_count != 0) { if (*offset >= dst_size) { return FONT_COMPRESSION_FAILURE(); } dst[(*offset)++] = repeat_count; } if (*offset + x_bytes + y_bytes > dst_size) { return FONT_COMPRESSION_FAILURE(); } // Store the x and y coordinates. size_t x_offset = *offset; size_t y_offset = *offset + x_bytes; last_x = 0; last_y = 0; for (const auto& contour : glyph.contours) { for (const auto& point : contour) { int dx = point.x - last_x; int dy = point.y - last_y; if (dx == 0) { // pass } else if (dx > -256 && dx < 256) { dst[x_offset++] = std::abs(dx); } else { Store16(dx, &x_offset, dst); } if (dy == 0) { // pass } else if (dy > -256 && dy < 256) { dst[y_offset++] = std::abs(dy); } else { Store16(dy, &y_offset, dst); } last_x += dx; last_y += dy; } } *offset = y_offset; return true; } } // namespace bool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size) { size_t offset = 0; if (glyph.composite_data_size > 0) { // Composite glyph. if (*dst_size < ((10ULL + glyph.composite_data_size) + ((glyph.have_instructions ? 2ULL : 0) + glyph.instructions_size))) { return FONT_COMPRESSION_FAILURE(); } Store16(-1, &offset, dst); StoreBbox(glyph, &offset, dst); StoreBytes(glyph.composite_data, glyph.composite_data_size, &offset, dst); if (glyph.have_instructions) { StoreInstructions(glyph, &offset, dst); } } else if (glyph.contours.size() > 0) { // Simple glyph. if (glyph.contours.size() > size_t(std::numeric_limits::max())) { return FONT_COMPRESSION_FAILURE(); } if (*dst_size < ((12ULL + 2 * glyph.contours.size()) + glyph.instructions_size)) { return FONT_COMPRESSION_FAILURE(); } Store16(glyph.contours.size(), &offset, dst); StoreBbox(glyph, &offset, dst); if (!StoreEndPtsOfContours(glyph, &offset, dst)) { return FONT_COMPRESSION_FAILURE(); } StoreInstructions(glyph, &offset, dst); if (!StorePoints(glyph, &offset, dst, *dst_size)) { return FONT_COMPRESSION_FAILURE(); } } *dst_size = offset; return true; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/store_bytes.h0000664000175000017500000000351013510660062015400 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Helper functions for storing integer values into byte streams. No bounds checking is performed, that is the responsibility of the caller. */ #ifndef WOFF2_STORE_BYTES_H_ #define WOFF2_STORE_BYTES_H_ #include #include #include #include "./port.h" namespace woff2 { inline size_t StoreU32(uint8_t* dst, size_t offset, uint32_t x) { dst[offset] = x >> 24; dst[offset + 1] = x >> 16; dst[offset + 2] = x >> 8; dst[offset + 3] = x; return offset + 4; } inline size_t Store16(uint8_t* dst, size_t offset, int x) { #if defined(WOFF_LITTLE_ENDIAN) *reinterpret_cast(dst + offset) = ((x & 0xFF) << 8) | ((x & 0xFF00) >> 8); #elif defined(WOFF_BIG_ENDIAN) *reinterpret_cast(dst + offset) = static_cast(x); #else dst[offset] = x >> 8; dst[offset + 1] = x; #endif return offset + 2; } inline void StoreU32(uint32_t val, size_t* offset, uint8_t* dst) { dst[(*offset)++] = val >> 24; dst[(*offset)++] = val >> 16; dst[(*offset)++] = val >> 8; dst[(*offset)++] = val; } inline void Store16(int val, size_t* offset, uint8_t* dst) { #if defined(WOFF_LITTLE_ENDIAN) *reinterpret_cast(dst + *offset) = ((val & 0xFF) << 8) | ((val & 0xFF00) >> 8); *offset += 2; #elif defined(WOFF_BIG_ENDIAN) *reinterpret_cast(dst + *offset) = static_cast(val); *offset += 2; #else dst[(*offset)++] = val >> 8; dst[(*offset)++] = val; #endif } inline void StoreBytes(const uint8_t* data, size_t len, size_t* offset, uint8_t* dst) { memcpy(&dst[*offset], data, len); *offset += len; } } // namespace woff2 #endif // WOFF2_STORE_BYTES_H_ dvisvgm-2.8.1/libs/woff2/src/table_tags.h0000664000175000017500000000144713510660062015152 00000000000000/* Copyright 2014 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Font table tags */ #ifndef WOFF2_TABLE_TAGS_H_ #define WOFF2_TABLE_TAGS_H_ #include namespace woff2 { // Tags of popular tables. static const uint32_t kGlyfTableTag = 0x676c7966; static const uint32_t kHeadTableTag = 0x68656164; static const uint32_t kLocaTableTag = 0x6c6f6361; static const uint32_t kDsigTableTag = 0x44534947; static const uint32_t kCffTableTag = 0x43464620; static const uint32_t kHmtxTableTag = 0x686d7478; static const uint32_t kHheaTableTag = 0x68686561; static const uint32_t kMaxpTableTag = 0x6d617870; extern const uint32_t kKnownTags[]; } // namespace woff2 #endif // WOFF2_TABLE_TAGS_H_ dvisvgm-2.8.1/libs/woff2/src/normalize.cc0000664000175000017500000002145413536436617015222 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Glyph normalization */ #include "./normalize.h" #include #include #include "./buffer.h" #include "./port.h" #include "./font.h" #include "./glyph.h" #include "./round.h" #include "./store_bytes.h" #include "./table_tags.h" #include "./woff2_common.h" namespace woff2 { namespace { void StoreLoca(int index_fmt, uint32_t value, size_t* offset, uint8_t* dst) { if (index_fmt == 0) { Store16(value >> 1, offset, dst); } else { StoreU32(value, offset, dst); } } } // namespace namespace { bool WriteNormalizedLoca(int index_fmt, int num_glyphs, Font* font) { Font::Table* glyf_table = font->FindTable(kGlyfTableTag); Font::Table* loca_table = font->FindTable(kLocaTableTag); int glyph_sz = index_fmt == 0 ? 2 : 4; loca_table->buffer.resize(Round4(num_glyphs + 1) * glyph_sz); loca_table->length = (num_glyphs + 1) * glyph_sz; uint8_t* glyf_dst = num_glyphs ? &glyf_table->buffer[0] : NULL; uint8_t* loca_dst = &loca_table->buffer[0]; uint32_t glyf_offset = 0; size_t loca_offset = 0; for (int i = 0; i < num_glyphs; ++i) { StoreLoca(index_fmt, glyf_offset, &loca_offset, loca_dst); Glyph glyph; const uint8_t* glyph_data; size_t glyph_size; if (!GetGlyphData(*font, i, &glyph_data, &glyph_size) || (glyph_size > 0 && !ReadGlyph(glyph_data, glyph_size, &glyph))) { return FONT_COMPRESSION_FAILURE(); } size_t glyf_dst_size = glyf_table->buffer.size() - glyf_offset; if (!StoreGlyph(glyph, glyf_dst + glyf_offset, &glyf_dst_size)) { return FONT_COMPRESSION_FAILURE(); } glyf_dst_size = Round4(glyf_dst_size); if (glyf_dst_size > std::numeric_limits::max() || glyf_offset + static_cast(glyf_dst_size) < glyf_offset || (index_fmt == 0 && glyf_offset + glyf_dst_size >= (1UL << 17))) { return FONT_COMPRESSION_FAILURE(); } glyf_offset += glyf_dst_size; } StoreLoca(index_fmt, glyf_offset, &loca_offset, loca_dst); glyf_table->buffer.resize(glyf_offset); glyf_table->data = glyf_offset ? &glyf_table->buffer[0] : NULL; glyf_table->length = glyf_offset; loca_table->data = loca_offset ? &loca_table->buffer[0] : NULL; return true; } } // namespace namespace { bool MakeEditableBuffer(Font* font, int tableTag) { Font::Table* table = font->FindTable(tableTag); if (table == NULL) { return FONT_COMPRESSION_FAILURE(); } if (table->IsReused()) { return true; } uint32_t sz = Round4(table->length); table->buffer.resize(sz); uint8_t* buf = &table->buffer[0]; memcpy(buf, table->data, table->length); if (PREDICT_FALSE(sz > table->length)) { memset(buf + table->length, 0, sz - table->length); } table->data = buf; return true; } } // namespace bool NormalizeGlyphs(Font* font) { Font::Table* head_table = font->FindTable(kHeadTableTag); Font::Table* glyf_table = font->FindTable(kGlyfTableTag); Font::Table* loca_table = font->FindTable(kLocaTableTag); if (head_table == NULL) { return FONT_COMPRESSION_FAILURE(); } // If you don't have glyf/loca this transform isn't very interesting if (loca_table == NULL && glyf_table == NULL) { return true; } // It would be best if you didn't have just one of glyf/loca if ((glyf_table == NULL) != (loca_table == NULL)) { return FONT_COMPRESSION_FAILURE(); } // Must share neither or both loca & glyf if (loca_table->IsReused() != glyf_table->IsReused()) { return FONT_COMPRESSION_FAILURE(); } if (loca_table->IsReused()) { return true; } int index_fmt = head_table->data[51]; int num_glyphs = NumGlyphs(*font); // We need to allocate a bit more than its original length for the normalized // glyf table, since it can happen that the glyphs in the original table are // 2-byte aligned, while in the normalized table they are 4-byte aligned. // That gives a maximum of 2 bytes increase per glyph. However, there is no // theoretical guarantee that the total size of the flags plus the coordinates // is the smallest possible in the normalized version, so we have to allow // some general overhead. // TODO(user) Figure out some more precise upper bound on the size of // the overhead. size_t max_normalized_glyf_size = 1.1 * glyf_table->length + 2 * num_glyphs; glyf_table->buffer.resize(max_normalized_glyf_size); // if we can't write a loca using short's (index_fmt 0) // try again using longs (index_fmt 1) if (!WriteNormalizedLoca(index_fmt, num_glyphs, font)) { if (index_fmt != 0) { return FONT_COMPRESSION_FAILURE(); } // Rewrite loca with 4-byte entries & update head to match index_fmt = 1; if (!WriteNormalizedLoca(index_fmt, num_glyphs, font)) { return FONT_COMPRESSION_FAILURE(); } head_table->buffer[51] = 1; } return true; } bool NormalizeOffsets(Font* font) { uint32_t offset = 12 + 16 * font->num_tables; for (auto tag : font->OutputOrderedTags()) { auto& table = font->tables[tag]; table.offset = offset; offset += Round4(table.length); } return true; } namespace { uint32_t ComputeHeaderChecksum(const Font& font) { uint32_t checksum = font.flavor; uint16_t max_pow2 = font.num_tables ? Log2Floor(font.num_tables) : 0; uint16_t search_range = max_pow2 ? 1 << (max_pow2 + 4) : 0; uint16_t range_shift = (font.num_tables << 4) - search_range; checksum += (font.num_tables << 16 | search_range); checksum += (max_pow2 << 16 | range_shift); for (const auto& i : font.tables) { const Font::Table* table = &i.second; if (table->IsReused()) { table = table->reuse_of; } checksum += table->tag; checksum += table->checksum; checksum += table->offset; checksum += table->length; } return checksum; } } // namespace bool FixChecksums(Font* font) { Font::Table* head_table = font->FindTable(kHeadTableTag); if (head_table == NULL) { return FONT_COMPRESSION_FAILURE(); } if (head_table->reuse_of != NULL) { head_table = head_table->reuse_of; } if (head_table->length < 12) { return FONT_COMPRESSION_FAILURE(); } uint8_t* head_buf = &head_table->buffer[0]; size_t offset = 8; StoreU32(0, &offset, head_buf); uint32_t file_checksum = 0; for (auto& i : font->tables) { Font::Table* table = &i.second; if (table->IsReused()) { table = table->reuse_of; } table->checksum = ComputeULongSum(table->data, table->length); file_checksum += table->checksum; } file_checksum += ComputeHeaderChecksum(*font); offset = 8; StoreU32(0xb1b0afba - file_checksum, &offset, head_buf); return true; } namespace { bool MarkTransformed(Font* font) { Font::Table* head_table = font->FindTable(kHeadTableTag); if (head_table == NULL) { return FONT_COMPRESSION_FAILURE(); } if (head_table->reuse_of != NULL) { head_table = head_table->reuse_of; } if (head_table->length < 17) { return FONT_COMPRESSION_FAILURE(); } // set bit 11 of head table 'flags' to indicate that font has undergone // lossless modifying transform int head_flags = head_table->data[16]; head_table->buffer[16] = head_flags | 0x08; return true; } } // namespace bool NormalizeWithoutFixingChecksums(Font* font) { return (MakeEditableBuffer(font, kHeadTableTag) && RemoveDigitalSignature(font) && MarkTransformed(font) && NormalizeGlyphs(font) && NormalizeOffsets(font)); } bool NormalizeFont(Font* font) { return (NormalizeWithoutFixingChecksums(font) && FixChecksums(font)); } bool NormalizeFontCollection(FontCollection* font_collection) { if (font_collection->fonts.size() == 1) { return NormalizeFont(&font_collection->fonts[0]); } uint32_t offset = CollectionHeaderSize(font_collection->header_version, font_collection->fonts.size()); for (auto& font : font_collection->fonts) { if (!NormalizeWithoutFixingChecksums(&font)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Font normalization failed.\n"); #endif return FONT_COMPRESSION_FAILURE(); } offset += kSfntHeaderSize + kSfntEntrySize * font.num_tables; } // Start table offsets after TTC Header and Sfnt Headers for (auto& font : font_collection->fonts) { for (auto tag : font.OutputOrderedTags()) { Font::Table& table = font.tables[tag]; if (table.IsReused()) { table.offset = table.reuse_of->offset; } else { table.offset = offset; offset += Round4(table.length); } } } // Now we can fix the checksums for (auto& font : font_collection->fonts) { if (!FixChecksums(&font)) { #ifdef FONT_COMPRESSION_BIN fprintf(stderr, "Failed to fix checksums\n"); #endif return FONT_COMPRESSION_FAILURE(); } } return true; } } // namespace woff2 dvisvgm-2.8.1/libs/woff2/src/port.h0000664000175000017500000000321213510660062014021 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Helper function for bit twiddling and macros for branch prediction. */ #ifndef WOFF2_PORT_H_ #define WOFF2_PORT_H_ #include namespace woff2 { typedef unsigned int uint32; inline int Log2Floor(uint32 n) { #if defined(__GNUC__) return n == 0 ? -1 : 31 ^ __builtin_clz(n); #else if (n == 0) return -1; int log = 0; uint32 value = n; for (int i = 4; i >= 0; --i) { int shift = (1 << i); uint32 x = value >> shift; if (x != 0) { value = x; log += shift; } } assert(value == 1); return log; #endif } } // namespace woff2 /* Compatibility with non-clang compilers. */ #ifndef __has_builtin #define __has_builtin(x) 0 #endif #if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 95) || \ (defined(__llvm__) && __has_builtin(__builtin_expect)) #define PREDICT_FALSE(x) (__builtin_expect(x, 0)) #define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) #else #define PREDICT_FALSE(x) (x) #define PREDICT_TRUE(x) (x) #endif #if (defined(__ARM_ARCH) && (__ARM_ARCH == 7)) || \ (defined(M_ARM) && (M_ARM == 7)) || \ defined(__aarch64__) || defined(__ARM64_ARCH_8__) || defined(__i386) || \ defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) #define WOFF_LITTLE_ENDIAN #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #define WOFF_BIG_ENDIAN #endif /* endianness */ #endif /* CPU whitelist */ #endif // WOFF2_PORT_H_ dvisvgm-2.8.1/libs/woff2/src/glyph.h0000664000175000017500000000333413510660062014165 00000000000000/* Copyright 2013 Google Inc. All Rights Reserved. Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ /* Data model and I/O for glyph data within sfnt format files for the purpose of performing the preprocessing step of the WOFF 2.0 conversion. */ #ifndef WOFF2_GLYPH_H_ #define WOFF2_GLYPH_H_ #include #include #include namespace woff2 { // Represents a parsed simple or composite glyph. The composite glyph data and // instructions are un-parsed and we keep only pointers to the raw data, // therefore the glyph is valid only so long the data from which it was parsed // is around. class Glyph { public: Glyph() : instructions_size(0), composite_data_size(0) {} // Bounding box. int16_t x_min; int16_t x_max; int16_t y_min; int16_t y_max; // Instructions. uint16_t instructions_size; const uint8_t* instructions_data; // Data model for simple glyphs. struct Point { int x; int y; bool on_curve; }; std::vector > contours; // Data for composite glyphs. const uint8_t* composite_data; uint32_t composite_data_size; bool have_instructions; }; // Parses the glyph from the given data. Returns false on parsing failure or // buffer overflow. The glyph is valid only so long the input data pointer is // valid. bool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph); // Stores the glyph into the specified dst buffer. The *dst_size is the buffer // size on entry and is set to the actual (unpadded) stored size on exit. // Returns false on buffer overflow. bool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size); } // namespace woff2 #endif // WOFF2_GLYPH_H_ dvisvgm-2.8.1/libs/potrace/0000775000175000017500000000000013563265645012611 500000000000000dvisvgm-2.8.1/libs/potrace/curve.h0000664000175000017500000000533613542104101014005 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifndef CURVE_H #define CURVE_H #include "auxiliary.h" /* vertex is c[1] for tag=POTRACE_CORNER, and the intersection of .c[-1][2]..c[0] and c[1]..c[2] for tag=POTRACE_CURVETO. alpha is only defined for tag=POTRACE_CURVETO and is the alpha parameter of the curve: .c[-1][2]..c[0] = alpha*(.c[-1][2]..vertex), and c[2]..c[1] = alpha*(c[2]..vertex). Beta is so that (.beta[i])[.vertex[i],.vertex[i+1]] = .c[i][2]. */ struct privcurve_s { int n; /* number of segments */ int *tag; /* tag[n]: POTRACE_CORNER or POTRACE_CURVETO */ dpoint_t (*c)[3]; /* c[n][i]: control points. c[n][0] is unused for tag[n]=POTRACE_CORNER */ /* the remainder of this structure is special to privcurve, and is used in EPS debug output and special EPS "short coding". These fields are valid only if "alphacurve" is set. */ int alphacurve; /* have the following fields been initialized? */ dpoint_t *vertex; /* for POTRACE_CORNER, this equals c[1] */ double *alpha; /* only for POTRACE_CURVETO */ double *alpha0; /* "uncropped" alpha parameter - for debug output only */ double *beta; }; typedef struct privcurve_s privcurve_t; struct sums_s { double x; double y; double x2; double xy; double y2; }; typedef struct sums_s sums_t; /* the path structure is filled in with information about a given path as it is accumulated and passed through the different stages of the Potrace algorithm. Backends only need to read the fcurve and fm fields of this data structure, but debugging backends may read other fields. */ struct potrace_privpath_s { int len; point_t *pt; /* pt[len]: path as extracted from bitmap */ int *lon; /* lon[len]: (i,lon[i]) = longest straight line from i */ int x0, y0; /* origin for sums */ sums_t *sums; /* sums[len+1]: cache for fast summing */ int m; /* length of optimal polygon */ int *po; /* po[m]: optimal polygon */ privcurve_t curve; /* curve[m]: array of curve elements */ privcurve_t ocurve; /* ocurve[om]: array of curve elements */ privcurve_t *fcurve; /* final curve: this points to either curve or ocurve. Do not free this separately. */ }; typedef struct potrace_privpath_s potrace_privpath_t; /* shorter names */ typedef potrace_privpath_t privpath_t; typedef potrace_path_t path_t; path_t *path_new(void); void path_free(path_t *p); void pathlist_free(path_t *plist); int privcurve_init(privcurve_t *curve, int n); void privcurve_to_curve(privcurve_t *pc, potrace_curve_t *c); #endif /* CURVE_H */ dvisvgm-2.8.1/libs/potrace/potracelib.h0000664000175000017500000001073513542104101015004 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifndef POTRACELIB_H #define POTRACELIB_H /* this file defines the API for the core Potrace library. For a more detailed description of the API, see potracelib.pdf */ #ifdef __cplusplus extern "C" { #endif /* ---------------------------------------------------------------------- */ /* tracing parameters */ /* turn policies */ #define POTRACE_TURNPOLICY_BLACK 0 #define POTRACE_TURNPOLICY_WHITE 1 #define POTRACE_TURNPOLICY_LEFT 2 #define POTRACE_TURNPOLICY_RIGHT 3 #define POTRACE_TURNPOLICY_MINORITY 4 #define POTRACE_TURNPOLICY_MAJORITY 5 #define POTRACE_TURNPOLICY_RANDOM 6 /* structure to hold progress bar callback data */ struct potrace_progress_s { void (*callback)(double progress, void *privdata); /* callback fn */ void *data; /* callback function's private data */ double min, max; /* desired range of progress, e.g. 0.0 to 1.0 */ double epsilon; /* granularity: can skip smaller increments */ }; typedef struct potrace_progress_s potrace_progress_t; /* structure to hold tracing parameters */ struct potrace_param_s { int turdsize; /* area of largest path to be ignored */ int turnpolicy; /* resolves ambiguous turns in path decomposition */ double alphamax; /* corner threshold */ int opticurve; /* use curve optimization? */ double opttolerance; /* curve optimization tolerance */ potrace_progress_t progress; /* progress callback function */ }; typedef struct potrace_param_s potrace_param_t; /* ---------------------------------------------------------------------- */ /* bitmaps */ /* native word size */ typedef unsigned long potrace_word; /* Internal bitmap format. The n-th scanline starts at scanline(n) = (map + n*dy). Raster data is stored as a sequence of potrace_words (NOT bytes). The leftmost bit of scanline n is the most significant bit of scanline(n)[0]. */ struct potrace_bitmap_s { int w, h; /* width and height, in pixels */ int dy; /* words per scanline (not bytes) */ potrace_word *map; /* raw data, dy*h words */ }; typedef struct potrace_bitmap_s potrace_bitmap_t; /* ---------------------------------------------------------------------- */ /* curves */ /* point */ struct potrace_dpoint_s { double x, y; }; typedef struct potrace_dpoint_s potrace_dpoint_t; /* segment tags */ #define POTRACE_CURVETO 1 #define POTRACE_CORNER 2 /* closed curve segment */ struct potrace_curve_s { int n; /* number of segments */ int *tag; /* tag[n]: POTRACE_CURVETO or POTRACE_CORNER */ potrace_dpoint_t (*c)[3]; /* c[n][3]: control points. c[n][0] is unused for tag[n]=POTRACE_CORNER */ }; typedef struct potrace_curve_s potrace_curve_t; /* Linked list of signed curve segments. Also carries a tree structure. */ struct potrace_path_s { int area; /* area of the bitmap path */ int sign; /* '+' or '-', depending on orientation */ potrace_curve_t curve; /* this path's vector data */ struct potrace_path_s *next; /* linked list structure */ struct potrace_path_s *childlist; /* tree structure */ struct potrace_path_s *sibling; /* tree structure */ struct potrace_privpath_s *priv; /* private state */ }; typedef struct potrace_path_s potrace_path_t; /* ---------------------------------------------------------------------- */ /* Potrace state */ #define POTRACE_STATUS_OK 0 #define POTRACE_STATUS_INCOMPLETE 1 struct potrace_state_s { int status; potrace_path_t *plist; /* vector data */ struct potrace_privstate_s *priv; /* private state */ }; typedef struct potrace_state_s potrace_state_t; /* ---------------------------------------------------------------------- */ /* API functions */ /* get default parameters */ potrace_param_t *potrace_param_default(void); /* free parameter set */ void potrace_param_free(potrace_param_t *p); /* trace a bitmap */ potrace_state_t *potrace_trace(const potrace_param_t *param, const potrace_bitmap_t *bm); /* free a Potrace state */ void potrace_state_free(potrace_state_t *st); /* return a static plain text version string identifying this version of potracelib */ const char *potrace_version(void); #ifdef __cplusplus } /* end of extern "C" */ #endif #endif /* POTRACELIB_H */ dvisvgm-2.8.1/libs/potrace/lists.h0000664000175000017500000002555613542104101014025 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifndef _PS_LISTS_H #define _PS_LISTS_H /* here we define some general list macros. Because they are macros, they should work on any datatype with a "->next" component. Some of them use a "hook". If elt and list are of type t* then hook is of type t**. A hook stands for an insertion point in the list, i.e., either before the first element, or between two elements, or after the last element. If an operation "sets the hook" for an element, then the hook is set to just before the element. One can insert something at a hook. One can also unlink at a hook: this means, unlink the element just after the hook. By "to unlink", we mean the element is removed from the list, but not deleted. Thus, it and its components still need to be freed. */ /* Note: these macros are somewhat experimental. Only the ones that are actually *used* have been tested. So be careful to test any that you use. Looking at the output of the preprocessor, "gcc -E" (possibly piped though "indent"), might help too. Also: these macros define some internal (local) variables that start with "_". */ /* we enclose macro definitions whose body consists of more than one statement in MACRO_BEGIN and MACRO_END, rather than '{' and '}'. The reason is that we want to be able to use the macro in a context such as "if (...) macro(...); else ...". If we didn't use this obscure trick, we'd have to omit the ";" in such cases. */ #define MACRO_BEGIN do { #define MACRO_END } while (0) /* ---------------------------------------------------------------------- */ /* macros for singly-linked lists */ /* traverse list. At the end, elt is set to NULL. */ #define list_forall(elt, list) for (elt=list; elt!=NULL; elt=elt->next) /* set elt to the first element of list satisfying boolean condition c, or NULL if not found */ #define list_find(elt, list, c) \ MACRO_BEGIN list_forall(elt, list) if (c) break; MACRO_END /* like forall, except also set hook for elt. */ #define list_forall2(elt, list, hook) \ for (elt=list, hook=&list; elt!=NULL; hook=&elt->next, elt=elt->next) /* same as list_find, except also set hook for elt. */ #define list_find2(elt, list, c, hook) \ MACRO_BEGIN list_forall2(elt, list, hook) if (c) break; MACRO_END /* same, except only use hook. */ #define _list_forall_hook(list, hook) \ for (hook=&list; *hook!=NULL; hook=&(*hook)->next) /* same, except only use hook. Note: c may only refer to *hook, not elt. */ #define _list_find_hook(list, c, hook) \ MACRO_BEGIN _list_forall_hook(list, hook) if (c) break; MACRO_END /* insert element after hook */ #define list_insert_athook(elt, hook) \ MACRO_BEGIN elt->next = *hook; *hook = elt; MACRO_END /* insert element before hook */ #define list_insert_beforehook(elt, hook) \ MACRO_BEGIN elt->next = *hook; *hook = elt; hook=&elt->next; MACRO_END /* unlink element after hook, let elt be unlinked element, or NULL. hook remains. */ #define list_unlink_athook(list, elt, hook) \ MACRO_BEGIN \ elt = hook ? *hook : NULL; if (elt) { *hook = elt->next; elt->next = NULL; }\ MACRO_END /* unlink the specific element, if it is in the list. Otherwise, set elt to NULL */ #define list_unlink(listtype, list, elt) \ MACRO_BEGIN \ listtype **_hook; \ _list_find_hook(list, *_hook==elt, _hook); \ list_unlink_athook(list, elt, _hook); \ MACRO_END /* prepend elt to list */ #define list_prepend(list, elt) \ MACRO_BEGIN elt->next = list; list = elt; MACRO_END /* append elt to list. */ #define list_append(listtype, list, elt) \ MACRO_BEGIN \ listtype **_hook; \ _list_forall_hook(list, _hook) {} \ list_insert_athook(elt, _hook); \ MACRO_END /* unlink the first element that satisfies the condition. */ #define list_unlink_cond(listtype, list, elt, c) \ MACRO_BEGIN \ listtype **_hook; \ list_find2(elt, list, c, _hook); \ list_unlink_athook(list, elt, _hook); \ MACRO_END /* let elt be the nth element of the list, starting to count from 0. Return NULL if out of bounds. */ #define list_nth(elt, list, n) \ MACRO_BEGIN \ int _x; /* only evaluate n once */ \ for (_x=(n), elt=list; _x && elt; _x--, elt=elt->next) {} \ MACRO_END /* let elt be the nth element of the list, starting to count from 0. Return NULL if out of bounds. */ #define list_nth_hook(elt, list, n, hook) \ MACRO_BEGIN \ int _x; /* only evaluate n once */ \ for (_x=(n), elt=list, hook=&list; _x && elt; _x--, hook=&elt->next, elt=elt->next) {} \ MACRO_END /* set n to the length of the list */ #define list_length(listtype, list, n) \ MACRO_BEGIN \ listtype *_elt; \ n=0; \ list_forall(_elt, list) \ n++; \ MACRO_END /* set n to the index of the first element satisfying cond, or -1 if none found. Also set elt to the element, or NULL if none found. */ #define list_index(list, n, elt, c) \ MACRO_BEGIN \ n=0; \ list_forall(elt, list) { \ if (c) break; \ n++; \ } \ if (!elt) \ n=-1; \ MACRO_END /* set n to the number of elements in the list that satisfy condition c */ #define list_count(list, n, elt, c) \ MACRO_BEGIN \ n=0; \ list_forall(elt, list) { \ if (c) n++; \ } \ MACRO_END /* let elt be each element of the list, unlinked. At the end, set list=NULL. */ #define list_forall_unlink(elt, list) \ for (elt=list; elt ? (list=elt->next, elt->next=NULL), 1 : 0; elt=list) /* reverse a list (efficient) */ #define list_reverse(listtype, list) \ MACRO_BEGIN \ listtype *_list1=NULL, *elt; \ list_forall_unlink(elt, list) \ list_prepend(_list1, elt); \ list = _list1; \ MACRO_END /* insert the element ELT just before the first element TMP of the list for which COND holds. Here COND must be a condition of ELT and TMP. Typical usage is to insert an element into an ordered list: for instance, list_insert_ordered(listtype, list, elt, tmp, elt->size <= tmp->size). Note: if we give a "less than or equal" condition, the new element will be inserted just before a sequence of equal elements. If we give a "less than" condition, the new element will be inserted just after a list of equal elements. Note: it is much more efficient to construct a list with list_prepend and then order it with list_merge_sort, than to construct it with list_insert_ordered. */ #define list_insert_ordered(listtype, list, elt, tmp, cond) \ MACRO_BEGIN \ listtype **_hook; \ _list_find_hook(list, (tmp=*_hook, (cond)), _hook); \ list_insert_athook(elt, _hook); \ MACRO_END /* sort the given list, according to the comparison condition. Typical usage is list_sort(listtype, list, a, b, a->size < b->size). Note: if we give "less than or equal" condition, each segment of equal elements will be reversed in order. If we give a "less than" condition, each segment of equal elements will retain the original order. The latter is slower but sometimes prettier. Average running time: n*n/2. */ #define list_sort(listtype, list, a, b, cond) \ MACRO_BEGIN \ listtype *_newlist=NULL; \ list_forall_unlink(a, list) \ list_insert_ordered(listtype, _newlist, a, b, cond); \ list = _newlist; \ MACRO_END /* a much faster sort algorithm (merge sort, n log n worst case). It is required that the list type has an additional, unused next1 component. Note there is no curious reversal of order of equal elements as for list_sort. */ #define list_mergesort(listtype, list, a, b, cond) \ MACRO_BEGIN \ listtype *_elt, **_hook1; \ \ for (_elt=list; _elt; _elt=_elt->next1) { \ _elt->next1 = _elt->next; \ _elt->next = NULL; \ } \ do { \ _hook1 = &(list); \ while ((a = *_hook1) != NULL && (b = a->next1) != NULL ) { \ _elt = b->next1; \ _list_merge_cond(listtype, a, b, cond, *_hook1); \ _hook1 = &((*_hook1)->next1); \ *_hook1 = _elt; \ } \ } while (_hook1 != &(list)); \ MACRO_END /* merge two sorted lists. Store result at &result */ #define _list_merge_cond(listtype, a, b, cond, result) \ MACRO_BEGIN \ listtype **_hook; \ _hook = &(result); \ while (1) { \ if (a==NULL) { \ *_hook = b; \ break; \ } else if (b==NULL) { \ *_hook = a; \ break; \ } else if (cond) { \ *_hook = a; \ _hook = &(a->next); \ a = a->next; \ } else { \ *_hook = b; \ _hook = &(b->next); \ b = b->next; \ } \ } \ MACRO_END /* ---------------------------------------------------------------------- */ /* macros for doubly-linked lists */ #define dlist_append(head, end, elt) \ MACRO_BEGIN \ elt->prev = end; \ elt->next = NULL; \ if (end) { \ end->next = elt; \ } else { \ head = elt; \ } \ end = elt; \ MACRO_END /* let elt be each element of the list, unlinked. At the end, set list=NULL. */ #define dlist_forall_unlink(elt, head, end) \ for (elt=head; elt ? (head=elt->next, elt->next=NULL, elt->prev=NULL), 1 : (end=NULL, 0); elt=head) /* unlink the first element of the list */ #define dlist_unlink_first(head, end, elt) \ MACRO_BEGIN \ elt = head; \ if (head) { \ head = head->next; \ if (head) { \ head->prev = NULL; \ } else { \ end = NULL; \ } \ elt->prev = NULL; \ elt->next = NULL; \ } \ MACRO_END #endif /* _PS_LISTS_H */ dvisvgm-2.8.1/libs/potrace/bitmap.h0000664000175000017500000001446213542104101014135 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifndef BITMAP_H #define BITMAP_H #include #include #include #include /* The bitmap type is defined in potracelib.h */ #include "potracelib.h" /* The present file defines some convenient macros and static inline functions for accessing bitmaps. Since they only produce inline code, they can be conveniently shared by the library and frontends, if desired */ /* ---------------------------------------------------------------------- */ /* some measurements */ #define BM_WORDSIZE ((int)sizeof(potrace_word)) #define BM_WORDBITS (8*BM_WORDSIZE) #define BM_HIBIT (((potrace_word)1)<<(BM_WORDBITS-1)) #define BM_ALLBITS (~(potrace_word)0) /* macros for accessing pixel at index (x,y). U* macros omit the bounds check. */ #define bm_scanline(bm, y) ((bm)->map + (ptrdiff_t)(y)*(ptrdiff_t)(bm)->dy) #define bm_index(bm, x, y) (&bm_scanline(bm, y)[(x)/BM_WORDBITS]) #define bm_mask(x) (BM_HIBIT >> ((x) & (BM_WORDBITS-1))) #define bm_range(x, a) ((int)(x) >= 0 && (int)(x) < (a)) #define bm_safe(bm, x, y) (bm_range(x, (bm)->w) && bm_range(y, (bm)->h)) #define BM_UGET(bm, x, y) ((*bm_index(bm, x, y) & bm_mask(x)) != 0) #define BM_USET(bm, x, y) (*bm_index(bm, x, y) |= bm_mask(x)) #define BM_UCLR(bm, x, y) (*bm_index(bm, x, y) &= ~bm_mask(x)) #define BM_UINV(bm, x, y) (*bm_index(bm, x, y) ^= bm_mask(x)) #define BM_UPUT(bm, x, y, b) ((b) ? BM_USET(bm, x, y) : BM_UCLR(bm, x, y)) #define BM_GET(bm, x, y) (bm_safe(bm, x, y) ? BM_UGET(bm, x, y) : 0) #define BM_SET(bm, x, y) (bm_safe(bm, x, y) ? BM_USET(bm, x, y) : 0) #define BM_CLR(bm, x, y) (bm_safe(bm, x, y) ? BM_UCLR(bm, x, y) : 0) #define BM_INV(bm, x, y) (bm_safe(bm, x, y) ? BM_UINV(bm, x, y) : 0) #define BM_PUT(bm, x, y, b) (bm_safe(bm, x, y) ? BM_UPUT(bm, x, y, b) : 0) /* calculate the size, in bytes, required for the data area of a bitmap of the given dy and h. Assume h >= 0. Return -1 if the size does not fit into the ptrdiff_t type. */ static inline ptrdiff_t getsize(int dy, int h) { ptrdiff_t size; if (dy < 0) { dy = -dy; } size = (ptrdiff_t)dy * (ptrdiff_t)h * (ptrdiff_t)BM_WORDSIZE; /* check for overflow error */ if (size < 0 || (h != 0 && dy != 0 && size / h / dy != BM_WORDSIZE)) { return -1; } return size; } /* return the size, in bytes, of the data area of the bitmap. Return -1 if the size does not fit into the ptrdiff_t type; however, this cannot happen if the bitmap is well-formed, i.e., if created with bm_new or bm_dup. */ static inline ptrdiff_t bm_size(const potrace_bitmap_t *bm) { return getsize(bm->dy, bm->h); } /* calculate the base address of the bitmap data. Assume that the bitmap is well-formed, i.e., its size fits into the ptrdiff_t type. This is the case if created with bm_new or bm_dup. The base address may differ from bm->map if dy is negative */ static inline potrace_word *bm_base(const potrace_bitmap_t *bm) { int dy = bm->dy; if (dy >= 0 || bm->h == 0) { return bm->map; } else { return bm_scanline(bm, bm->h - 1); } } /* free the given bitmap. Leaves errno untouched. */ static inline void bm_free(potrace_bitmap_t *bm) { if (bm && bm->map) { free(bm_base(bm)); } free(bm); } /* return new bitmap initialized to 0. NULL with errno on error. Assumes w, h >= 0. */ static inline potrace_bitmap_t *bm_new(int w, int h) { potrace_bitmap_t *bm; int dy = w == 0 ? 0 : (w - 1) / BM_WORDBITS + 1; ptrdiff_t size; size = getsize(dy, h); if (size < 0) { errno = ENOMEM; return NULL; } if (size == 0) { size = BM_WORDSIZE; /* make sure calloc() doesn't return NULL */ } bm = (potrace_bitmap_t *) malloc(sizeof(potrace_bitmap_t)); if (!bm) { return NULL; } bm->w = w; bm->h = h; bm->dy = dy; bm->map = (potrace_word *) calloc(1, size); if (!bm->map) { free(bm); return NULL; } return bm; } /* clear the given bitmap. Set all bits to c. Assumes a well-formed bitmap. */ static inline void bm_clear(potrace_bitmap_t *bm, int c) { /* Note: if the bitmap was created with bm_new, then it is guaranteed that size will fit into the ptrdiff_t type. */ ptrdiff_t size = bm_size(bm); memset(bm_base(bm), c ? -1 : 0, size); } /* duplicate the given bitmap. Return NULL on error with errno set. Assumes a well-formed bitmap. */ static inline potrace_bitmap_t *bm_dup(const potrace_bitmap_t *bm) { potrace_bitmap_t *bm1 = bm_new(bm->w, bm->h); int y; if (!bm1) { return NULL; } for (y=0; y < bm->h; y++) { memcpy(bm_scanline(bm1, y), bm_scanline(bm, y), (size_t)bm1->dy * (size_t)BM_WORDSIZE); } return bm1; } /* invert the given bitmap. */ static inline void bm_invert(potrace_bitmap_t *bm) { int dy = bm->dy; int y; int i; potrace_word *p; if (dy < 0) { dy = -dy; } for (y=0; y < bm->h; y++) { p = bm_scanline(bm, y); for (i=0; i < dy; i++) { p[i] ^= BM_ALLBITS; } } } /* turn the given bitmap upside down. This does not move the bitmap data or change the bm_base() address. */ static inline void bm_flip(potrace_bitmap_t *bm) { int dy = bm->dy; if (bm->h == 0 || bm->h == 1) { return; } bm->map = bm_scanline(bm, bm->h - 1); bm->dy = -dy; } /* resize the bitmap to the given new height. The bitmap data remains bottom-aligned (truncated at the top) when dy >= 0 and top-aligned (truncated at the bottom) when dy < 0. Return 0 on success, or 1 on error with errno set. If the new height is <= the old one, no error should occur. If the new height is larger, the additional bitmap data is *not* initialized. */ static inline int bm_resize(potrace_bitmap_t *bm, int h) { int dy = bm->dy; ptrdiff_t newsize; potrace_word *newmap; if (dy < 0) { bm_flip(bm); } newsize = getsize(dy, h); if (newsize < 0) { errno = ENOMEM; goto error; } if (newsize == 0) { newsize = BM_WORDSIZE; /* make sure realloc() doesn't return NULL */ } newmap = (potrace_word *)realloc(bm->map, newsize); if (newmap == NULL) { goto error; } bm->map = newmap; bm->h = h; if (dy < 0) { bm_flip(bm); } return 0; error: if (dy < 0) { bm_flip(bm); } return 1; } #endif /* BITMAP_H */ dvisvgm-2.8.1/libs/potrace/Makefile.am0000664000175000017500000000051213510660062014543 00000000000000if !HAVE_POTRACE noinst_LIBRARIES = libpotrace.a libpotrace_a_SOURCES = \ auxiliary.h \ bitmap.h \ config.h \ curve.c \ curve.h \ decompose.c \ decompose.h \ lists.h \ potracelib.c \ potracelib.h \ progress.h \ trace.c \ trace.h AM_CFLAGS = -Wall -I$(srcdir) @CODE_COVERAGE_RULES@ endif CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/potrace/config.h0000664000175000017500000000013213542104101014113 00000000000000#ifndef CONFIG_H #define CONFIG_H #define VERSION "1.16" #define HAVE_INTTYPES_H 1 #endif dvisvgm-2.8.1/libs/potrace/trace.h0000664000175000017500000000061513542104101013752 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifndef TRACE_H #define TRACE_H #include "potracelib.h" #include "progress.h" #include "curve.h" int process_path(path_t *plist, const potrace_param_t *param, progress_t *progress); #endif /* TRACE_H */ dvisvgm-2.8.1/libs/potrace/Makefile.in0000664000175000017500000005050413563265577014606 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/potrace ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libpotrace_a_AR = $(AR) $(ARFLAGS) libpotrace_a_LIBADD = am__libpotrace_a_SOURCES_DIST = auxiliary.h bitmap.h config.h curve.c \ curve.h decompose.c decompose.h lists.h potracelib.c \ potracelib.h progress.h trace.c trace.h @HAVE_POTRACE_FALSE@am_libpotrace_a_OBJECTS = curve.$(OBJEXT) \ @HAVE_POTRACE_FALSE@ decompose.$(OBJEXT) potracelib.$(OBJEXT) \ @HAVE_POTRACE_FALSE@ trace.$(OBJEXT) libpotrace_a_OBJECTS = $(am_libpotrace_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/curve.Po ./$(DEPDIR)/decompose.Po \ ./$(DEPDIR)/potracelib.Po ./$(DEPDIR)/trace.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpotrace_a_SOURCES) DIST_SOURCES = $(am__libpotrace_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_POTRACE_FALSE@noinst_LIBRARIES = libpotrace.a @HAVE_POTRACE_FALSE@libpotrace_a_SOURCES = \ @HAVE_POTRACE_FALSE@ auxiliary.h \ @HAVE_POTRACE_FALSE@ bitmap.h \ @HAVE_POTRACE_FALSE@ config.h \ @HAVE_POTRACE_FALSE@ curve.c \ @HAVE_POTRACE_FALSE@ curve.h \ @HAVE_POTRACE_FALSE@ decompose.c \ @HAVE_POTRACE_FALSE@ decompose.h \ @HAVE_POTRACE_FALSE@ lists.h \ @HAVE_POTRACE_FALSE@ potracelib.c \ @HAVE_POTRACE_FALSE@ potracelib.h \ @HAVE_POTRACE_FALSE@ progress.h \ @HAVE_POTRACE_FALSE@ trace.c \ @HAVE_POTRACE_FALSE@ trace.h @HAVE_POTRACE_FALSE@AM_CFLAGS = -Wall -I$(srcdir) CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/potrace/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/potrace/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libpotrace.a: $(libpotrace_a_OBJECTS) $(libpotrace_a_DEPENDENCIES) $(EXTRA_libpotrace_a_DEPENDENCIES) $(AM_V_at)-rm -f libpotrace.a $(AM_V_AR)$(libpotrace_a_AR) libpotrace.a $(libpotrace_a_OBJECTS) $(libpotrace_a_LIBADD) $(AM_V_at)$(RANLIB) libpotrace.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curve.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decompose.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/potracelib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trace.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/curve.Po -rm -f ./$(DEPDIR)/decompose.Po -rm -f ./$(DEPDIR)/potracelib.Po -rm -f ./$(DEPDIR)/trace.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/curve.Po -rm -f ./$(DEPDIR)/decompose.Po -rm -f ./$(DEPDIR)/potracelib.Po -rm -f ./$(DEPDIR)/trace.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @HAVE_POTRACE_FALSE@@CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/potrace/progress.h0000664000175000017500000000513613542104101014523 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ /* operations on potrace_progress_t objects, which are defined in potracelib.h. Note: the code attempts to minimize runtime overhead when no progress monitoring was requested. It also tries to minimize excessive progress calculations beneath the "epsilon" threshold. */ #ifndef PROGRESS_H #define PROGRESS_H /* structure to hold progress bar callback data */ struct progress_s { void (*callback)(double progress, void *privdata); /* callback fn */ void *data; /* callback function's private data */ double min, max; /* desired range of progress, e.g. 0.0 to 1.0 */ double epsilon; /* granularity: can skip smaller increments */ double b; /* upper limit of subrange in superrange units */ double d_prev; /* previous value of d */ }; typedef struct progress_s progress_t; /* notify given progress object of current progress. Note that d is given in the 0.0-1.0 range, which will be scaled and translated to the progress object's range. */ static inline void progress_update(double d, progress_t *prog) { double d_scaled; if (prog != NULL && prog->callback != NULL) { d_scaled = prog->min * (1-d) + prog->max * d; if (d == 1.0 || d_scaled >= prog->d_prev + prog->epsilon) { prog->callback(prog->min * (1-d) + prog->max * d, prog->data); prog->d_prev = d_scaled; } } } /* start a subrange of the given progress object. The range is narrowed to [a..b], relative to 0.0-1.0 coordinates. If new range is below granularity threshold, disable further subdivisions. */ static inline void progress_subrange_start(double a, double b, const progress_t *prog, progress_t *sub) { double min, max; if (prog == NULL || prog->callback == NULL) { sub->callback = NULL; return; } min = prog->min * (1-a) + prog->max * a; max = prog->min * (1-b) + prog->max * b; if (max - min < prog->epsilon) { sub->callback = NULL; /* no further progress info in subrange */ sub->b = b; return; } sub->callback = prog->callback; sub->data = prog->data; sub->epsilon = prog->epsilon; sub->min = min; sub->max = max; sub->d_prev = prog->d_prev; return; } static inline void progress_subrange_end(progress_t *prog, progress_t *sub) { if (prog != NULL && prog->callback != NULL) { if (sub->callback == NULL) { progress_update(sub->b, prog); } else { prog->d_prev = sub->d_prev; } } } #endif /* PROGRESS_H */ dvisvgm-2.8.1/libs/potrace/decompose.h0000664000175000017500000000067213542104101014635 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifndef DECOMPOSE_H #define DECOMPOSE_H #include "potracelib.h" #include "progress.h" #include "curve.h" int bm_to_pathlist(const potrace_bitmap_t *bm, path_t **plistp, const potrace_param_t *param, progress_t *progress); #endif /* DECOMPOSE_H */ dvisvgm-2.8.1/libs/potrace/auxiliary.h0000664000175000017500000000414213542104101014662 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ /* This header file collects some general-purpose macros (and static inline functions) that are used in various places. */ #ifndef AUXILIARY_H #define AUXILIARY_H #ifdef HAVE_CONFIG_H #include #endif #include /* ---------------------------------------------------------------------- */ /* point arithmetic */ #include "potracelib.h" struct point_s { long x; long y; }; typedef struct point_s point_t; typedef potrace_dpoint_t dpoint_t; /* convert point_t to dpoint_t */ static inline dpoint_t dpoint(point_t p) { dpoint_t res; res.x = p.x; res.y = p.y; return res; } /* range over the straight line segment [a,b] when lambda ranges over [0,1] */ static inline dpoint_t interval(double lambda, dpoint_t a, dpoint_t b) { dpoint_t res; res.x = a.x + lambda * (b.x - a.x); res.y = a.y + lambda * (b.y - a.y); return res; } /* ---------------------------------------------------------------------- */ /* some useful macros. Note: the "mod" macro works correctly for negative a. Also note that the test for a>=n, while redundant, speeds up the mod function by 70% in the average case (significant since the program spends about 16% of its time here - or 40% without the test). The "floordiv" macro returns the largest integer <= a/n, and again this works correctly for negative a, as long as a,n are integers and n>0. */ /* integer arithmetic */ static inline int mod(int a, int n) { return a>=n ? a%n : a>=0 ? a : n-1-(-1-a)%n; } static inline int floordiv(int a, int n) { return a>=0 ? a/n : -1-(-1-a)/n; } /* Note: the following work for integers and other numeric types. */ #undef sign #undef abs #undef min #undef max #undef sq #undef cu #define sign(x) ((x)>0 ? 1 : (x)<0 ? -1 : 0) #define abs(a) ((a)>0 ? (a) : -(a)) #define min(a,b) ((a)<(b) ? (a) : (b)) #define max(a,b) ((a)>(b) ? (a) : (b)) #define sq(a) ((a)*(a)) #define cu(a) ((a)*(a)*(a)) #endif /* AUXILIARY_H */ dvisvgm-2.8.1/libs/potrace/decompose.c0000664000175000017500000003441513542104101014632 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #ifdef HAVE_INTTYPES_H #include #endif #include "potracelib.h" #include "curve.h" #include "lists.h" #include "bitmap.h" #include "decompose.h" #include "progress.h" /* ---------------------------------------------------------------------- */ /* deterministically and efficiently hash (x,y) into a pseudo-random bit */ static inline int detrand(int x, int y) { unsigned int z; static const unsigned char t[256] = { /* non-linear sequence: constant term of inverse in GF(8), mod x^8+x^4+x^3+x+1 */ 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, }; /* 0x04b3e375 and 0x05a8ef93 are chosen to contain every possible 5-bit sequence */ z = ((0x04b3e375 * x) ^ y) * 0x05a8ef93; z = t[z & 0xff] ^ t[(z>>8) & 0xff] ^ t[(z>>16) & 0xff] ^ t[(z>>24) & 0xff]; return z; } /* ---------------------------------------------------------------------- */ /* auxiliary bitmap manipulations */ /* set the excess padding to 0 */ static void bm_clearexcess(potrace_bitmap_t *bm) { potrace_word mask; int y; if (bm->w % BM_WORDBITS != 0) { mask = BM_ALLBITS << (BM_WORDBITS - (bm->w % BM_WORDBITS)); for (y=0; yh; y++) { *bm_index(bm, bm->w, y) &= mask; } } } struct bbox_s { int x0, x1, y0, y1; /* bounding box */ }; typedef struct bbox_s bbox_t; /* clear the bm, assuming the bounding box is set correctly (faster than clearing the whole bitmap) */ static void clear_bm_with_bbox(potrace_bitmap_t *bm, bbox_t *bbox) { int imin = (bbox->x0 / BM_WORDBITS); int imax = ((bbox->x1 + BM_WORDBITS-1) / BM_WORDBITS); int i, y; for (y=bbox->y0; yy1; y++) { for (i=imin; i0) { return 1; } else if (ct<0) { return 0; } } return 0; } /* ---------------------------------------------------------------------- */ /* decompose image into paths */ /* efficiently invert bits [x,infty) and [xa,infty) in line y. Here xa must be a multiple of BM_WORDBITS. */ static void xor_to_ref(potrace_bitmap_t *bm, int x, int y, int xa) { int xhi = x & -BM_WORDBITS; int xlo = x & (BM_WORDBITS-1); /* = x % BM_WORDBITS */ int i; if (xhipriv->len <= 0) { /* a path of length 0 is silly, but legal */ return; } y1 = p->priv->pt[p->priv->len-1].y; xa = p->priv->pt[0].x & -BM_WORDBITS; for (k=0; kpriv->len; k++) { x = p->priv->pt[k].x; y = p->priv->pt[k].y; if (y != y1) { /* efficiently invert the rectangle [x,xa] x [y,y1] */ xor_to_ref(bm, x, min(y,y1), xa); y1 = y; } } } /* Find the bounding box of a given path. Path is assumed to be of non-zero length. */ static void setbbox_path(bbox_t *bbox, path_t *p) { int x, y; int k; bbox->y0 = INT_MAX; bbox->y1 = 0; bbox->x0 = INT_MAX; bbox->x1 = 0; for (k=0; kpriv->len; k++) { x = p->priv->pt[k].x; y = p->priv->pt[k].y; if (x < bbox->x0) { bbox->x0 = x; } if (x > bbox->x1) { bbox->x1 = x; } if (y < bbox->y0) { bbox->y0 = y; } if (y > bbox->y1) { bbox->y1 = y; } } } /* compute a path in the given pixmap, separating black from white. Start path at the point (x0,x1), which must be an upper left corner of the path. Also compute the area enclosed by the path. Return a new path_t object, or NULL on error (note that a legitimate path cannot have length 0). Sign is required for correct interpretation of turnpolicies. */ static path_t *findpath(potrace_bitmap_t *bm, int x0, int y0, int sign, int turnpolicy) { int x, y, dirx, diry, len, size; uint64_t area; int c, d, tmp; point_t *pt, *pt1; path_t *p = NULL; x = x0; y = y0; dirx = 0; diry = -1; len = size = 0; pt = NULL; area = 0; while (1) { /* add point to path */ if (len>=size) { size += 100; size = (int)(1.3 * size); pt1 = (point_t *)realloc(pt, size * sizeof(point_t)); if (!pt1) { goto error; } pt = pt1; } pt[len].x = x; pt[len].y = y; len++; /* move to next point */ x += dirx; y += diry; area += x*diry; /* path complete? */ if (x==x0 && y==y0) { break; } /* determine next direction */ c = BM_GET(bm, x + (dirx+diry-1)/2, y + (diry-dirx-1)/2); d = BM_GET(bm, x + (dirx-diry-1)/2, y + (diry+dirx-1)/2); if (c && !d) { /* ambiguous turn */ if (turnpolicy == POTRACE_TURNPOLICY_RIGHT || (turnpolicy == POTRACE_TURNPOLICY_BLACK && sign == '+') || (turnpolicy == POTRACE_TURNPOLICY_WHITE && sign == '-') || (turnpolicy == POTRACE_TURNPOLICY_RANDOM && detrand(x,y)) || (turnpolicy == POTRACE_TURNPOLICY_MAJORITY && majority(bm, x, y)) || (turnpolicy == POTRACE_TURNPOLICY_MINORITY && !majority(bm, x, y))) { tmp = dirx; /* right turn */ dirx = diry; diry = -tmp; } else { tmp = dirx; /* left turn */ dirx = -diry; diry = tmp; } } else if (c) { /* right turn */ tmp = dirx; dirx = diry; diry = -tmp; } else if (!d) { /* left turn */ tmp = dirx; dirx = -diry; diry = tmp; } } /* while this path */ /* allocate new path object */ p = path_new(); if (!p) { goto error; } p->priv->pt = pt; p->priv->len = len; p->area = area <= INT_MAX ? area : INT_MAX; /* avoid overflow */ p->sign = sign; return p; error: free(pt); return NULL; } /* Give a tree structure to the given path list, based on "insideness" testing. I.e., path A is considered "below" path B if it is inside path B. The input pathlist is assumed to be ordered so that "outer" paths occur before "inner" paths. The tree structure is stored in the "childlist" and "sibling" components of the path_t structure. The linked list structure is also changed so that negative path components are listed immediately after their positive parent. Note: some backends may ignore the tree structure, others may use it e.g. to group path components. We assume that in the input, point 0 of each path is an "upper left" corner of the path, as returned by bm_to_pathlist. This makes it easy to find an "interior" point. The bm argument should be a bitmap of the correct size (large enough to hold all the paths), and will be used as scratch space. Return 0 on success or -1 on error with errno set. */ static void pathlist_to_tree(path_t *plist, potrace_bitmap_t *bm) { path_t *p, *p1; path_t *heap, *heap1; path_t *cur; path_t *head; path_t **plist_hook; /* for fast appending to linked list */ path_t **hook_in, **hook_out; /* for fast appending to linked list */ bbox_t bbox; bm_clear(bm, 0); /* save original "next" pointers */ list_forall(p, plist) { p->sibling = p->next; p->childlist = NULL; } heap = plist; /* the heap holds a list of lists of paths. Use "childlist" field for outer list, "next" field for inner list. Each of the sublists is to be turned into a tree. This code is messy, but it is actually fast. Each path is rendered exactly once. We use the heap to get a tail recursive algorithm: the heap holds a list of pathlists which still need to be transformed. */ while (heap) { /* unlink first sublist */ cur = heap; heap = heap->childlist; cur->childlist = NULL; /* unlink first path */ head = cur; cur = cur->next; head->next = NULL; /* render path */ xor_path(bm, head); setbbox_path(&bbox, head); /* now do insideness test for each element of cur; append it to head->childlist if it's inside head, else append it to head->next. */ hook_in=&head->childlist; hook_out=&head->next; list_forall_unlink(p, cur) { if (p->priv->pt[0].y <= bbox.y0) { list_insert_beforehook(p, hook_out); /* append the remainder of the list to hook_out */ *hook_out = cur; break; } if (BM_GET(bm, p->priv->pt[0].x, p->priv->pt[0].y-1)) { list_insert_beforehook(p, hook_in); } else { list_insert_beforehook(p, hook_out); } } /* clear bm */ clear_bm_with_bbox(bm, &bbox); /* now schedule head->childlist and head->next for further processing */ if (head->next) { head->next->childlist = heap; heap = head->next; } if (head->childlist) { head->childlist->childlist = heap; heap = head->childlist; } } /* copy sibling structure from "next" to "sibling" component */ p = plist; while (p) { p1 = p->sibling; p->sibling = p->next; p = p1; } /* reconstruct a new linked list ("next") structure from tree ("childlist", "sibling") structure. This code is slightly messy, because we use a heap to make it tail recursive: the heap contains a list of childlists which still need to be processed. */ heap = plist; if (heap) { heap->next = NULL; /* heap is a linked list of childlists */ } plist = NULL; plist_hook = &plist; while (heap) { heap1 = heap->next; for (p=heap; p; p=p->sibling) { /* p is a positive path */ /* append to linked list */ list_insert_beforehook(p, plist_hook); /* go through its children */ for (p1=p->childlist; p1; p1=p1->sibling) { /* append to linked list */ list_insert_beforehook(p1, plist_hook); /* append its childlist to heap, if non-empty */ if (p1->childlist) { list_append(path_t, heap1, p1->childlist); } } } heap = heap1; } return; } /* find the next set pixel in a row <= y. Pixels are searched first left-to-right, then top-down. In other words, (x,y)<(x',y') if y>y' or y=y' and x=0; y--) { for (x=x0; xw && x>=0; x+=(unsigned)BM_WORDBITS) { if (*bm_index(bm, x, y)) { while (!BM_GET(bm, x, y)) { x++; } /* found */ *xp = x; *yp = y; return 0; } } x0 = 0; } /* not found */ return 1; } /* Decompose the given bitmap into paths. Returns a linked list of path_t objects with the fields len, pt, area, sign filled in. Returns 0 on success with plistp set, or -1 on error with errno set. */ int bm_to_pathlist(const potrace_bitmap_t *bm, path_t **plistp, const potrace_param_t *param, progress_t *progress) { int x; int y; path_t *p; path_t *plist = NULL; /* linked list of path objects */ path_t **plist_hook = &plist; /* used to speed up appending to linked list */ potrace_bitmap_t *bm1 = NULL; int sign; bm1 = bm_dup(bm); if (!bm1) { goto error; } /* be sure the byte padding on the right is set to 0, as the fast pixel search below relies on it */ bm_clearexcess(bm1); /* iterate through components */ x = 0; y = bm1->h - 1; while (findnext(bm1, &x, &y) == 0) { /* calculate the sign by looking at the original */ sign = BM_GET(bm, x, y) ? '+' : '-'; /* calculate the path */ p = findpath(bm1, x, y+1, sign, param->turnpolicy); if (p==NULL) { goto error; } /* update buffered image */ xor_path(bm1, p); /* if it's a turd, eliminate it, else append it to the list */ if (p->area <= param->turdsize) { path_free(p); } else { list_insert_beforehook(p, plist_hook); } if (bm1->h > 0) { /* to be sure */ progress_update(1-y/(double)bm1->h, progress); } } pathlist_to_tree(plist, bm1); bm_free(bm1); *plistp = plist; progress_update(1.0, progress); return 0; error: bm_free(bm1); list_forall_unlink(p, plist) { path_free(p); } return -1; } dvisvgm-2.8.1/libs/potrace/potracelib.c0000664000175000017500000000606213542104101014775 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "potracelib.h" #include "curve.h" #include "decompose.h" #include "trace.h" #include "progress.h" /* default parameters */ static const potrace_param_t param_default = { 2, /* turdsize */ POTRACE_TURNPOLICY_MINORITY, /* turnpolicy */ 1.0, /* alphamax */ 1, /* opticurve */ 0.2, /* opttolerance */ { NULL, /* callback function */ NULL, /* callback data */ 0.0, 1.0, /* progress range */ 0.0, /* granularity */ }, }; /* Return a fresh copy of the set of default parameters, or NULL on failure with errno set. */ potrace_param_t *potrace_param_default(void) { potrace_param_t *p; p = (potrace_param_t *) malloc(sizeof(potrace_param_t)); if (!p) { return NULL; } memcpy(p, ¶m_default, sizeof(potrace_param_t)); return p; } /* On success, returns a Potrace state st with st->status == POTRACE_STATUS_OK. On failure, returns NULL if no Potrace state could be created (with errno set), or returns an incomplete Potrace state (with st->status == POTRACE_STATUS_INCOMPLETE, and with errno set). Complete or incomplete Potrace state can be freed with potrace_state_free(). */ potrace_state_t *potrace_trace(const potrace_param_t *param, const potrace_bitmap_t *bm) { int r; path_t *plist = NULL; potrace_state_t *st; progress_t prog; progress_t subprog; /* prepare private progress bar state */ prog.callback = param->progress.callback; prog.data = param->progress.data; prog.min = param->progress.min; prog.max = param->progress.max; prog.epsilon = param->progress.epsilon; prog.d_prev = param->progress.min; /* allocate state object */ st = (potrace_state_t *)malloc(sizeof(potrace_state_t)); if (!st) { return NULL; } progress_subrange_start(0.0, 0.1, &prog, &subprog); /* process the image */ r = bm_to_pathlist(bm, &plist, param, &subprog); if (r) { free(st); return NULL; } st->status = POTRACE_STATUS_OK; st->plist = plist; st->priv = NULL; /* private state currently unused */ progress_subrange_end(&prog, &subprog); progress_subrange_start(0.1, 1.0, &prog, &subprog); /* partial success. */ r = process_path(plist, param, &subprog); if (r) { st->status = POTRACE_STATUS_INCOMPLETE; } progress_subrange_end(&prog, &subprog); return st; } /* free a Potrace state, without disturbing errno. */ void potrace_state_free(potrace_state_t *st) { pathlist_free(st->plist); free(st); } /* free a parameter list, without disturbing errno. */ void potrace_param_free(potrace_param_t *p) { free(p); } const char *potrace_version(void) { return "potracelib " VERSION ""; } dvisvgm-2.8.1/libs/potrace/curve.c0000664000175000017500000000520513542104101013773 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ /* private part of the path and curve data structures */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "potracelib.h" #include "lists.h" #include "curve.h" #define SAFE_CALLOC(var, n, typ) \ if ((var = (typ *)calloc(n, sizeof(typ))) == NULL) goto calloc_error /* ---------------------------------------------------------------------- */ /* allocate and free path objects */ path_t *path_new(void) { path_t *p = NULL; privpath_t *priv = NULL; SAFE_CALLOC(p, 1, path_t); memset(p, 0, sizeof(path_t)); SAFE_CALLOC(priv, 1, privpath_t); memset(priv, 0, sizeof(privpath_t)); p->priv = priv; return p; calloc_error: free(p); free(priv); return NULL; } /* free the members of the given curve structure. Leave errno unchanged. */ static void privcurve_free_members(privcurve_t *curve) { free(curve->tag); free(curve->c); free(curve->vertex); free(curve->alpha); free(curve->alpha0); free(curve->beta); } /* free a path. Leave errno untouched. */ void path_free(path_t *p) { if (p) { if (p->priv) { free(p->priv->pt); free(p->priv->lon); free(p->priv->sums); free(p->priv->po); privcurve_free_members(&p->priv->curve); privcurve_free_members(&p->priv->ocurve); } free(p->priv); /* do not free p->fcurve ! */ } free(p); } /* free a pathlist, leaving errno untouched. */ void pathlist_free(path_t *plist) { path_t *p; list_forall_unlink(p, plist) { path_free(p); } } /* ---------------------------------------------------------------------- */ /* initialize and finalize curve structures */ typedef dpoint_t dpoint3_t[3]; /* initialize the members of the given curve structure to size m. Return 0 on success, 1 on error with errno set. */ int privcurve_init(privcurve_t *curve, int n) { memset(curve, 0, sizeof(privcurve_t)); curve->n = n; SAFE_CALLOC(curve->tag, n, int); SAFE_CALLOC(curve->c, n, dpoint3_t); SAFE_CALLOC(curve->vertex, n, dpoint_t); SAFE_CALLOC(curve->alpha, n, double); SAFE_CALLOC(curve->alpha0, n, double); SAFE_CALLOC(curve->beta, n, double); return 0; calloc_error: free(curve->tag); free(curve->c); free(curve->vertex); free(curve->alpha); free(curve->alpha0); free(curve->beta); return 1; } /* copy private to public curve structure */ void privcurve_to_curve(privcurve_t *pc, potrace_curve_t *c) { c->n = pc->n; c->tag = pc->tag; c->c = pc->c; } dvisvgm-2.8.1/libs/potrace/trace.c0000664000175000017500000007721013542104101013752 00000000000000/* Copyright (C) 2001-2019 Peter Selinger. This file is part of Potrace. It is free software and it is covered by the GNU General Public License. See the file COPYING for details. */ /* transform jaggy paths into smooth curves */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "potracelib.h" #include "curve.h" #include "lists.h" #include "auxiliary.h" #include "trace.h" #include "progress.h" #define INFTY 10000000 /* it suffices that this is longer than any path; it need not be really infinite */ #define COS179 -0.999847695156 /* the cosine of 179 degrees */ /* ---------------------------------------------------------------------- */ #define SAFE_CALLOC(var, n, typ) \ if ((var = (typ *)calloc(n, sizeof(typ))) == NULL) goto calloc_error /* ---------------------------------------------------------------------- */ /* auxiliary functions */ /* return a direction that is 90 degrees counterclockwise from p2-p0, but then restricted to one of the major wind directions (n, nw, w, etc) */ static inline point_t dorth_infty(dpoint_t p0, dpoint_t p2) { point_t r; r.y = sign(p2.x-p0.x); r.x = -sign(p2.y-p0.y); return r; } /* return (p1-p0)x(p2-p0), the area of the parallelogram */ static inline double dpara(dpoint_t p0, dpoint_t p1, dpoint_t p2) { double x1, y1, x2, y2; x1 = p1.x-p0.x; y1 = p1.y-p0.y; x2 = p2.x-p0.x; y2 = p2.y-p0.y; return x1*y2 - x2*y1; } /* ddenom/dpara have the property that the square of radius 1 centered at p1 intersects the line p0p2 iff |dpara(p0,p1,p2)| <= ddenom(p0,p2) */ static inline double ddenom(dpoint_t p0, dpoint_t p2) { point_t r = dorth_infty(p0, p2); return r.y*(p2.x-p0.x) - r.x*(p2.y-p0.y); } /* return 1 if a <= b < c < a, in a cyclic sense (mod n) */ static inline int cyclic(int a, int b, int c) { if (a<=c) { return (a<=b && blen; sums_t *sums = pp->sums; double x, y, x2, xy, y2; double k; double a, b, c, lambda2, l; int r=0; /* rotations from i to j */ while (j>=n) { j-=n; r+=1; } while (i>=n) { i-=n; r-=1; } while (j<0) { j+=n; r-=1; } while (i<0) { i+=n; r+=1; } x = sums[j+1].x-sums[i].x+r*sums[n].x; y = sums[j+1].y-sums[i].y+r*sums[n].y; x2 = sums[j+1].x2-sums[i].x2+r*sums[n].x2; xy = sums[j+1].xy-sums[i].xy+r*sums[n].xy; y2 = sums[j+1].y2-sums[i].y2+r*sums[n].y2; k = j+1-i+r*n; ctr->x = x/k; ctr->y = y/k; a = (x2-(double)x*x/k)/k; b = (xy-(double)x*y/k)/k; c = (y2-(double)y*y/k)/k; lambda2 = (a+c+sqrt((a-c)*(a-c)+4*b*b))/2; /* larger e.value */ /* now find e.vector for lambda2 */ a -= lambda2; c -= lambda2; if (fabs(a) >= fabs(c)) { l = sqrt(a*a+b*b); if (l!=0) { dir->x = -b/l; dir->y = a/l; } } else { l = sqrt(c*c+b*b); if (l!=0) { dir->x = -c/l; dir->y = b/l; } } if (l==0) { dir->x = dir->y = 0; /* sometimes this can happen when k=4: the two eigenvalues coincide */ } } /* the type of (affine) quadratic forms, represented as symmetric 3x3 matrices. The value of the quadratic form at a vector (x,y) is v^t Q v, where v = (x,y,1)^t. */ typedef double quadform_t[3][3]; /* Apply quadratic form Q to vector w = (w.x,w.y) */ static inline double quadform(quadform_t Q, dpoint_t w) { double v[3]; int i, j; double sum; v[0] = w.x; v[1] = w.y; v[2] = 1; sum = 0.0; for (i=0; i<3; i++) { for (j=0; j<3; j++) { sum += v[i] * Q[i][j] * v[j]; } } return sum; } /* calculate p1 x p2 */ static inline int xprod(point_t p1, point_t p2) { return p1.x*p2.y - p1.y*p2.x; } /* calculate (p1-p0)x(p3-p2) */ static inline double cprod(dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3) { double x1, y1, x2, y2; x1 = p1.x - p0.x; y1 = p1.y - p0.y; x2 = p3.x - p2.x; y2 = p3.y - p2.y; return x1*y2 - x2*y1; } /* calculate (p1-p0)*(p2-p0) */ static inline double iprod(dpoint_t p0, dpoint_t p1, dpoint_t p2) { double x1, y1, x2, y2; x1 = p1.x - p0.x; y1 = p1.y - p0.y; x2 = p2.x - p0.x; y2 = p2.y - p0.y; return x1*x2 + y1*y2; } /* calculate (p1-p0)*(p3-p2) */ static inline double iprod1(dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3) { double x1, y1, x2, y2; x1 = p1.x - p0.x; y1 = p1.y - p0.y; x2 = p3.x - p2.x; y2 = p3.y - p2.y; return x1*x2 + y1*y2; } /* calculate distance between two points */ static inline double ddist(dpoint_t p, dpoint_t q) { return sqrt(sq(p.x-q.x)+sq(p.y-q.y)); } /* calculate point of a bezier curve */ static inline dpoint_t bezier(double t, dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3) { double s = 1-t; dpoint_t res; /* Note: a good optimizing compiler (such as gcc-3) reduces the following to 16 multiplications, using common subexpression elimination. */ res.x = s*s*s*p0.x + 3*(s*s*t)*p1.x + 3*(t*t*s)*p2.x + t*t*t*p3.x; res.y = s*s*s*p0.y + 3*(s*s*t)*p1.y + 3*(t*t*s)*p2.y + t*t*t*p3.y; return res; } /* calculate the point t in [0..1] on the (convex) bezier curve (p0,p1,p2,p3) which is tangent to q1-q0. Return -1.0 if there is no solution in [0..1]. */ static double tangent(dpoint_t p0, dpoint_t p1, dpoint_t p2, dpoint_t p3, dpoint_t q0, dpoint_t q1) { double A, B, C; /* (1-t)^2 A + 2(1-t)t B + t^2 C = 0 */ double a, b, c; /* a t^2 + b t + c = 0 */ double d, s, r1, r2; A = cprod(p0, p1, q0, q1); B = cprod(p1, p2, q0, q1); C = cprod(p2, p3, q0, q1); a = A - 2*B + C; b = -2*A + 2*B; c = A; d = b*b - 4*a*c; if (a==0 || d<0) { return -1.0; } s = sqrt(d); r1 = (-b + s) / (2 * a); r2 = (-b - s) / (2 * a); if (r1 >= 0 && r1 <= 1) { return r1; } else if (r2 >= 0 && r2 <= 1) { return r2; } else { return -1.0; } } /* ---------------------------------------------------------------------- */ /* Preparation: fill in the sum* fields of a path (used for later rapid summing). Return 0 on success, 1 with errno set on failure. */ static int calc_sums(privpath_t *pp) { int i, x, y; int n = pp->len; SAFE_CALLOC(pp->sums, pp->len+1, sums_t); /* origin */ pp->x0 = pp->pt[0].x; pp->y0 = pp->pt[0].y; /* preparatory computation for later fast summing */ pp->sums[0].x2 = pp->sums[0].xy = pp->sums[0].y2 = pp->sums[0].x = pp->sums[0].y = 0; for (i=0; ipt[i].x - pp->x0; y = pp->pt[i].y - pp->y0; pp->sums[i+1].x = pp->sums[i].x + x; pp->sums[i+1].y = pp->sums[i].y + y; pp->sums[i+1].x2 = pp->sums[i].x2 + (double)x*x; pp->sums[i+1].xy = pp->sums[i].xy + (double)x*y; pp->sums[i+1].y2 = pp->sums[i].y2 + (double)y*y; } return 0; calloc_error: return 1; } /* ---------------------------------------------------------------------- */ /* Stage 1: determine the straight subpaths (Sec. 2.2.1). Fill in the "lon" component of a path object (based on pt/len). For each i, lon[i] is the furthest index such that a straight line can be drawn from i to lon[i]. Return 1 on error with errno set, else 0. */ /* this algorithm depends on the fact that the existence of straight subpaths is a triplewise property. I.e., there exists a straight line through squares i0,...,in iff there exists a straight line through i,j,k, for all i0<=i= 0 and xprod(constraint[1], cur) <= 0. */ /* Remark for Potrace 1.1: the current implementation of calc_lon is more complex than the implementation found in Potrace 1.0, but it is considerably faster. The introduction of the "nc" data structure means that we only have to test the constraints for "corner" points. On a typical input file, this speeds up the calc_lon function by a factor of 31.2, thereby decreasing its time share within the overall Potrace algorithm from 72.6% to 7.82%, and speeding up the overall algorithm by a factor of 3.36. On another input file, calc_lon was sped up by a factor of 6.7, decreasing its time share from 51.4% to 13.61%, and speeding up the overall algorithm by a factor of 1.78. In any case, the savings are substantial. */ /* returns 0 on success, 1 on error with errno set */ static int calc_lon(privpath_t *pp) { point_t *pt = pp->pt; int n = pp->len; int i, j, k, k1; int ct[4], dir; point_t constraint[2]; point_t cur; point_t off; int *pivk = NULL; /* pivk[n] */ int *nc = NULL; /* nc[n]: next corner */ point_t dk; /* direction of k-k1 */ int a, b, c, d; SAFE_CALLOC(pivk, n, int); SAFE_CALLOC(nc, n, int); /* initialize the nc data structure. Point from each point to the furthest future point to which it is connected by a vertical or horizontal segment. We take advantage of the fact that there is always a direction change at 0 (due to the path decomposition algorithm). But even if this were not so, there is no harm, as in practice, correctness does not depend on the word "furthest" above. */ k = 0; for (i=n-1; i>=0; i--) { if (pt[i].x != pt[k].x && pt[i].y != pt[k].y) { k = i+1; /* necessarily ilon, n, int); /* determine pivot points: for each i, let pivk[i] be the furthest k such that all j with i=0; i--) { ct[0] = ct[1] = ct[2] = ct[3] = 0; /* keep track of "directions" that have occurred */ dir = (3+3*(pt[mod(i+1,n)].x-pt[i].x)+(pt[mod(i+1,n)].y-pt[i].y))/2; ct[dir]++; constraint[0].x = 0; constraint[0].y = 0; constraint[1].x = 0; constraint[1].y = 0; /* find the next k such that no straight line from i to k */ k = nc[i]; k1 = i; while (1) { dir = (3+3*sign(pt[k].x-pt[k1].x)+sign(pt[k].y-pt[k1].y))/2; ct[dir]++; /* if all four "directions" have occurred, cut this path */ if (ct[0] && ct[1] && ct[2] && ct[3]) { pivk[i] = k1; goto foundk; } cur.x = pt[k].x - pt[i].x; cur.y = pt[k].y - pt[i].y; /* see if current constraint is violated */ if (xprod(constraint[0], cur) < 0 || xprod(constraint[1], cur) > 0) { goto constraint_viol; } /* else, update constraint */ if (abs(cur.x) <= 1 && abs(cur.y) <= 1) { /* no constraint */ } else { off.x = cur.x + ((cur.y>=0 && (cur.y>0 || cur.x<0)) ? 1 : -1); off.y = cur.y + ((cur.x<=0 && (cur.x<0 || cur.y<0)) ? 1 : -1); if (xprod(constraint[0], off) >= 0) { constraint[0] = off; } off.x = cur.x + ((cur.y<=0 && (cur.y<0 || cur.x<0)) ? 1 : -1); off.y = cur.y + ((cur.x>=0 && (cur.x>0 || cur.y<0)) ? 1 : -1); if (xprod(constraint[1], off) <= 0) { constraint[1] = off; } } k1 = k; k = nc[k1]; if (!cyclic(k,i,k1)) { break; } } constraint_viol: /* k1 was the last "corner" satisfying the current constraint, and k is the first one violating it. We now need to find the last point along k1..k which satisfied the constraint. */ dk.x = sign(pt[k].x-pt[k1].x); dk.y = sign(pt[k].y-pt[k1].y); cur.x = pt[k1].x - pt[i].x; cur.y = pt[k1].y - pt[i].y; /* find largest integer j such that xprod(constraint[0], cur+j*dk) >= 0 and xprod(constraint[1], cur+j*dk) <= 0. Use bilinearity of xprod. */ a = xprod(constraint[0], cur); b = xprod(constraint[0], dk); c = xprod(constraint[1], cur); d = xprod(constraint[1], dk); /* find largest integer j such that a+j*b>=0 and c+j*d<=0. This can be solved with integer arithmetic. */ j = INFTY; if (b<0) { j = floordiv(a,-b); } if (d>0) { j = min(j, floordiv(-c,d)); } pivk[i] = mod(k1+j,n); foundk: ; } /* for i */ /* clean up: for each i, let lon[i] be the largest k such that for all i' with i<=i'lon[n-1]=j; for (i=n-2; i>=0; i--) { if (cyclic(i+1,pivk[i],j)) { j=pivk[i]; } pp->lon[i]=j; } for (i=n-1; cyclic(mod(i+1,n),j,pp->lon[i]); i--) { pp->lon[i] = j; } free(pivk); free(nc); return 0; calloc_error: free(pivk); free(nc); return 1; } /* ---------------------------------------------------------------------- */ /* Stage 2: calculate the optimal polygon (Sec. 2.2.2-2.2.4). */ /* Auxiliary function: calculate the penalty of an edge from i to j in the given path. This needs the "lon" and "sum*" data. */ static double penalty3(privpath_t *pp, int i, int j) { int n = pp->len; point_t *pt = pp->pt; sums_t *sums = pp->sums; /* assume 0<=i=n) { j -= n; r = 1; } /* critical inner loop: the "if" gives a 4.6 percent speedup */ if (r == 0) { x = sums[j+1].x - sums[i].x; y = sums[j+1].y - sums[i].y; x2 = sums[j+1].x2 - sums[i].x2; xy = sums[j+1].xy - sums[i].xy; y2 = sums[j+1].y2 - sums[i].y2; k = j+1 - i; } else { x = sums[j+1].x - sums[i].x + sums[n].x; y = sums[j+1].y - sums[i].y + sums[n].y; x2 = sums[j+1].x2 - sums[i].x2 + sums[n].x2; xy = sums[j+1].xy - sums[i].xy + sums[n].xy; y2 = sums[j+1].y2 - sums[i].y2 + sums[n].y2; k = j+1 - i + n; } px = (pt[i].x + pt[j].x) / 2.0 - pt[0].x; py = (pt[i].y + pt[j].y) / 2.0 - pt[0].y; ey = (pt[j].x - pt[i].x); ex = -(pt[j].y - pt[i].y); a = ((x2 - 2*x*px) / k + px*px); b = ((xy - x*py - y*px) / k + px*py); c = ((y2 - 2*y*py) / k + py*py); s = ex*ex*a + 2*ex*ey*b + ey*ey*c; return sqrt(s); } /* find the optimal polygon. Fill in the m and po components. Return 1 on failure with errno set, else 0. Non-cyclic version: assumes i=0 is in the polygon. Fixme: implement cyclic version. */ static int bestpolygon(privpath_t *pp) { int i, j, m, k; int n = pp->len; double *pen = NULL; /* pen[n+1]: penalty vector */ int *prev = NULL; /* prev[n+1]: best path pointer vector */ int *clip0 = NULL; /* clip0[n]: longest segment pointer, non-cyclic */ int *clip1 = NULL; /* clip1[n+1]: backwards segment pointer, non-cyclic */ int *seg0 = NULL; /* seg0[m+1]: forward segment bounds, m<=n */ int *seg1 = NULL; /* seg1[m+1]: backward segment bounds, m<=n */ double thispen; double best; int c; SAFE_CALLOC(pen, n+1, double); SAFE_CALLOC(prev, n+1, int); SAFE_CALLOC(clip0, n, int); SAFE_CALLOC(clip1, n+1, int); SAFE_CALLOC(seg0, n+1, int); SAFE_CALLOC(seg1, n+1, int); /* calculate clipped paths */ for (i=0; ilon[mod(i-1,n)]-1,n); if (c == i) { c = mod(i+1,n); } if (c < i) { clip0[i] = n; } else { clip0[i] = c; } } /* calculate backwards path clipping, non-cyclic. j <= clip0[i] iff clip1[j] <= i, for i,j=0..n. */ j = 1; for (i=0; i0; j--) { seg1[j] = i; i = clip1[i]; } seg1[0] = 0; /* now find the shortest path with m segments, based on penalty3 */ /* note: the outer 2 loops jointly have at most n iterations, thus the worst-case behavior here is quadratic. In practice, it is close to linear since the inner loop tends to be short. */ pen[0]=0; for (j=1; j<=m; j++) { for (i=seg1[j]; i<=seg0[j]; i++) { best = -1; for (k=seg0[j-1]; k>=clip1[i]; k--) { thispen = penalty3(pp, k, i) + pen[k]; if (best < 0 || thispen < best) { prev[i] = k; best = thispen; } } pen[i] = best; } } pp->m = m; SAFE_CALLOC(pp->po, m, int); /* read off shortest path */ for (i=n, j=m-1; i>0; j--) { i = prev[i]; pp->po[j] = i; } free(pen); free(prev); free(clip0); free(clip1); free(seg0); free(seg1); return 0; calloc_error: free(pen); free(prev); free(clip0); free(clip1); free(seg0); free(seg1); return 1; } /* ---------------------------------------------------------------------- */ /* Stage 3: vertex adjustment (Sec. 2.3.1). */ /* Adjust vertices of optimal polygon: calculate the intersection of the two "optimal" line segments, then move it into the unit square if it lies outside. Return 1 with errno set on error; 0 on success. */ static int adjust_vertices(privpath_t *pp) { int m = pp->m; int *po = pp->po; int n = pp->len; point_t *pt = pp->pt; int x0 = pp->x0; int y0 = pp->y0; dpoint_t *ctr = NULL; /* ctr[m] */ dpoint_t *dir = NULL; /* dir[m] */ quadform_t *q = NULL; /* q[m] */ double v[3]; double d; int i, j, k, l; dpoint_t s; int r; SAFE_CALLOC(ctr, m, dpoint_t); SAFE_CALLOC(dir, m, dpoint_t); SAFE_CALLOC(q, m, quadform_t); r = privcurve_init(&pp->curve, m); if (r) { goto calloc_error; } /* calculate "optimal" point-slope representation for each line segment */ for (i=0; iQ[1][1]) { v[0] = -Q[0][1]; v[1] = Q[0][0]; } else if (Q[1][1]) { v[0] = -Q[1][1]; v[1] = Q[1][0]; } else { v[0] = 1; v[1] = 0; } d = sq(v[0]) + sq(v[1]); v[2] = - v[1] * s.y - v[0] * s.x; for (l=0; l<3; l++) { for (k=0; k<3; k++) { Q[l][k] += v[l] * v[k] / d; } } } dx = fabs(w.x-s.x); dy = fabs(w.y-s.y); if (dx <= .5 && dy <= .5) { pp->curve.vertex[i].x = w.x+x0; pp->curve.vertex[i].y = w.y+y0; continue; } /* the minimum was not in the unit square; now minimize quadratic on boundary of square */ min = quadform(Q, s); xmin = s.x; ymin = s.y; if (Q[0][0] == 0.0) { goto fixx; } for (z=0; z<2; z++) { /* value of the y-coordinate */ w.y = s.y-0.5+z; w.x = - (Q[0][1] * w.y + Q[0][2]) / Q[0][0]; dx = fabs(w.x-s.x); cand = quadform(Q, w); if (dx <= .5 && cand < min) { min = cand; xmin = w.x; ymin = w.y; } } fixx: if (Q[1][1] == 0.0) { goto corners; } for (z=0; z<2; z++) { /* value of the x-coordinate */ w.x = s.x-0.5+z; w.y = - (Q[1][0] * w.x + Q[1][2]) / Q[1][1]; dy = fabs(w.y-s.y); cand = quadform(Q, w); if (dy <= .5 && cand < min) { min = cand; xmin = w.x; ymin = w.y; } } corners: /* check four corners */ for (l=0; l<2; l++) { for (k=0; k<2; k++) { w.x = s.x-0.5+l; w.y = s.y-0.5+k; cand = quadform(Q, w); if (cand < min) { min = cand; xmin = w.x; ymin = w.y; } } } pp->curve.vertex[i].x = xmin + x0; pp->curve.vertex[i].y = ymin + y0; continue; } free(ctr); free(dir); free(q); return 0; calloc_error: free(ctr); free(dir); free(q); return 1; } /* ---------------------------------------------------------------------- */ /* Stage 4: smoothing and corner analysis (Sec. 2.3.3) */ /* reverse orientation of a path */ static void reverse(privcurve_t *curve) { int m = curve->n; int i, j; dpoint_t tmp; for (i=0, j=m-1; ivertex[i]; curve->vertex[i] = curve->vertex[j]; curve->vertex[j] = tmp; } } /* Always succeeds */ static void smooth(privcurve_t *curve, double alphamax) { int m = curve->n; int i, j, k; double dd, denom, alpha; dpoint_t p2, p3, p4; /* examine each vertex and find its best fit */ for (i=0; ivertex[k], curve->vertex[j]); denom = ddenom(curve->vertex[i], curve->vertex[k]); if (denom != 0.0) { dd = dpara(curve->vertex[i], curve->vertex[j], curve->vertex[k]) / denom; dd = fabs(dd); alpha = dd>1 ? (1 - 1.0/dd) : 0; alpha = alpha / 0.75; } else { alpha = 4/3.0; } curve->alpha0[j] = alpha; /* remember "original" value of alpha */ if (alpha >= alphamax) { /* pointed corner */ curve->tag[j] = POTRACE_CORNER; curve->c[j][1] = curve->vertex[j]; curve->c[j][2] = p4; } else { if (alpha < 0.55) { alpha = 0.55; } else if (alpha > 1) { alpha = 1; } p2 = interval(.5+.5*alpha, curve->vertex[i], curve->vertex[j]); p3 = interval(.5+.5*alpha, curve->vertex[k], curve->vertex[j]); curve->tag[j] = POTRACE_CURVETO; curve->c[j][0] = p2; curve->c[j][1] = p3; curve->c[j][2] = p4; } curve->alpha[j] = alpha; /* store the "cropped" value of alpha */ curve->beta[j] = 0.5; } curve->alphacurve = 1; return; } /* ---------------------------------------------------------------------- */ /* Stage 5: Curve optimization (Sec. 2.4) */ /* a private type for the result of opti_penalty */ struct opti_s { double pen; /* penalty */ dpoint_t c[2]; /* curve parameters */ double t, s; /* curve parameters */ double alpha; /* curve parameter */ }; typedef struct opti_s opti_t; /* calculate best fit from i+.5 to j+.5. Assume icurve.n; int k, k1, k2, conv, i1; double area, alpha, d, d1, d2; dpoint_t p0, p1, p2, p3, pt; double A, R, A1, A2, A3, A4; double s, t; /* check convexity, corner-freeness, and maximum bend < 179 degrees */ if (i==j) { /* sanity - a full loop can never be an opticurve */ return 1; } k = i; i1 = mod(i+1, m); k1 = mod(k+1, m); conv = convc[k1]; if (conv == 0) { return 1; } d = ddist(pp->curve.vertex[i], pp->curve.vertex[i1]); for (k=k1; k!=j; k=k1) { k1 = mod(k+1, m); k2 = mod(k+2, m); if (convc[k1] != conv) { return 1; } if (sign(cprod(pp->curve.vertex[i], pp->curve.vertex[i1], pp->curve.vertex[k1], pp->curve.vertex[k2])) != conv) { return 1; } if (iprod1(pp->curve.vertex[i], pp->curve.vertex[i1], pp->curve.vertex[k1], pp->curve.vertex[k2]) < d * ddist(pp->curve.vertex[k1], pp->curve.vertex[k2]) * COS179) { return 1; } } /* the curve we're working in: */ p0 = pp->curve.c[mod(i,m)][2]; p1 = pp->curve.vertex[mod(i+1,m)]; p2 = pp->curve.vertex[mod(j,m)]; p3 = pp->curve.c[mod(j,m)][2]; /* determine its area */ area = areac[j] - areac[i]; area -= dpara(pp->curve.vertex[0], pp->curve.c[i][2], pp->curve.c[j][2])/2; if (i>=j) { area += areac[m]; } /* find intersection o of p0p1 and p2p3. Let t,s such that o = interval(t,p0,p1) = interval(s,p3,p2). Let A be the area of the triangle (p0,o,p3). */ A1 = dpara(p0, p1, p2); A2 = dpara(p0, p1, p3); A3 = dpara(p0, p2, p3); /* A4 = dpara(p1, p2, p3); */ A4 = A1+A3-A2; if (A2 == A1) { /* this should never happen */ return 1; } t = A3/(A3-A4); s = A2/(A2-A1); A = A2 * t / 2.0; if (A == 0.0) { /* this should never happen */ return 1; } R = area / A; /* relative area */ alpha = 2 - sqrt(4 - R / 0.3); /* overall alpha for p0-o-p3 curve */ res->c[0] = interval(t * alpha, p0, p1); res->c[1] = interval(s * alpha, p3, p2); res->alpha = alpha; res->t = t; res->s = s; p1 = res->c[0]; p2 = res->c[1]; /* the proposed curve is now (p0,p1,p2,p3) */ res->pen = 0; /* calculate penalty */ /* check tangency with edges */ for (k=mod(i+1,m); k!=j; k=k1) { k1 = mod(k+1,m); t = tangent(p0, p1, p2, p3, pp->curve.vertex[k], pp->curve.vertex[k1]); if (t<-.5) { return 1; } pt = bezier(t, p0, p1, p2, p3); d = ddist(pp->curve.vertex[k], pp->curve.vertex[k1]); if (d == 0.0) { /* this should never happen */ return 1; } d1 = dpara(pp->curve.vertex[k], pp->curve.vertex[k1], pt) / d; if (fabs(d1) > opttolerance) { return 1; } if (iprod(pp->curve.vertex[k], pp->curve.vertex[k1], pt) < 0 || iprod(pp->curve.vertex[k1], pp->curve.vertex[k], pt) < 0) { return 1; } res->pen += sq(d1); } /* check corners */ for (k=i; k!=j; k=k1) { k1 = mod(k+1,m); t = tangent(p0, p1, p2, p3, pp->curve.c[k][2], pp->curve.c[k1][2]); if (t<-.5) { return 1; } pt = bezier(t, p0, p1, p2, p3); d = ddist(pp->curve.c[k][2], pp->curve.c[k1][2]); if (d == 0.0) { /* this should never happen */ return 1; } d1 = dpara(pp->curve.c[k][2], pp->curve.c[k1][2], pt) / d; d2 = dpara(pp->curve.c[k][2], pp->curve.c[k1][2], pp->curve.vertex[k1]) / d; d2 *= 0.75 * pp->curve.alpha[k1]; if (d2 < 0) { d1 = -d1; d2 = -d2; } if (d1 < d2 - opttolerance) { return 1; } if (d1 < d2) { res->pen += sq(d1 - d2); } } return 0; } /* optimize the path p, replacing sequences of Bezier segments by a single segment when possible. Return 0 on success, 1 with errno set on failure. */ static int opticurve(privpath_t *pp, double opttolerance) { int m = pp->curve.n; int *pt = NULL; /* pt[m+1] */ double *pen = NULL; /* pen[m+1] */ int *len = NULL; /* len[m+1] */ opti_t *opt = NULL; /* opt[m+1] */ int om; int i,j,r; opti_t o; dpoint_t p0; int i1; double area; double alpha; double *s = NULL; double *t = NULL; int *convc = NULL; /* conv[m]: pre-computed convexities */ double *areac = NULL; /* cumarea[m+1]: cache for fast area computation */ SAFE_CALLOC(pt, m+1, int); SAFE_CALLOC(pen, m+1, double); SAFE_CALLOC(len, m+1, int); SAFE_CALLOC(opt, m+1, opti_t); SAFE_CALLOC(convc, m, int); SAFE_CALLOC(areac, m+1, double); /* pre-calculate convexity: +1 = right turn, -1 = left turn, 0 = corner */ for (i=0; icurve.tag[i] == POTRACE_CURVETO) { convc[i] = sign(dpara(pp->curve.vertex[mod(i-1,m)], pp->curve.vertex[i], pp->curve.vertex[mod(i+1,m)])); } else { convc[i] = 0; } } /* pre-calculate areas */ area = 0.0; areac[0] = 0.0; p0 = pp->curve.vertex[0]; for (i=0; icurve.tag[i1] == POTRACE_CURVETO) { alpha = pp->curve.alpha[i1]; area += 0.3*alpha*(4-alpha)*dpara(pp->curve.c[i][2], pp->curve.vertex[i1], pp->curve.c[i1][2])/2; area += dpara(p0, pp->curve.c[i][2], pp->curve.c[i1][2])/2; } areac[i+1] = area; } pt[0] = -1; pen[0] = 0; len[0] = 0; /* Fixme: we always start from a fixed point -- should find the best curve cyclically */ for (j=1; j<=m; j++) { /* calculate best path from 0 to j */ pt[j] = j-1; pen[j] = pen[j-1]; len[j] = len[j-1]+1; for (i=j-2; i>=0; i--) { r = opti_penalty(pp, i, mod(j,m), &o, opttolerance, convc, areac); if (r) { break; } if (len[j] > len[i]+1 || (len[j] == len[i]+1 && pen[j] > pen[i] + o.pen)) { pt[j] = i; pen[j] = pen[i] + o.pen; len[j] = len[i] + 1; opt[j] = o; } } } om = len[m]; r = privcurve_init(&pp->ocurve, om); if (r) { goto calloc_error; } SAFE_CALLOC(s, om, double); SAFE_CALLOC(t, om, double); j = m; for (i=om-1; i>=0; i--) { if (pt[j]==j-1) { pp->ocurve.tag[i] = pp->curve.tag[mod(j,m)]; pp->ocurve.c[i][0] = pp->curve.c[mod(j,m)][0]; pp->ocurve.c[i][1] = pp->curve.c[mod(j,m)][1]; pp->ocurve.c[i][2] = pp->curve.c[mod(j,m)][2]; pp->ocurve.vertex[i] = pp->curve.vertex[mod(j,m)]; pp->ocurve.alpha[i] = pp->curve.alpha[mod(j,m)]; pp->ocurve.alpha0[i] = pp->curve.alpha0[mod(j,m)]; pp->ocurve.beta[i] = pp->curve.beta[mod(j,m)]; s[i] = t[i] = 1.0; } else { pp->ocurve.tag[i] = POTRACE_CURVETO; pp->ocurve.c[i][0] = opt[j].c[0]; pp->ocurve.c[i][1] = opt[j].c[1]; pp->ocurve.c[i][2] = pp->curve.c[mod(j,m)][2]; pp->ocurve.vertex[i] = interval(opt[j].s, pp->curve.c[mod(j,m)][2], pp->curve.vertex[mod(j,m)]); pp->ocurve.alpha[i] = opt[j].alpha; pp->ocurve.alpha0[i] = opt[j].alpha; s[i] = opt[j].s; t[i] = opt[j].t; } j = pt[j]; } /* calculate beta parameters */ for (i=0; iocurve.beta[i] = s[i] / (s[i] + t[i1]); } pp->ocurve.alphacurve = 1; free(pt); free(pen); free(len); free(opt); free(s); free(t); free(convc); free(areac); return 0; calloc_error: free(pt); free(pen); free(len); free(opt); free(s); free(t); free(convc); free(areac); return 1; } /* ---------------------------------------------------------------------- */ #define TRY(x) if (x) goto try_error /* return 0 on success, 1 on error with errno set. */ int process_path(path_t *plist, const potrace_param_t *param, progress_t *progress) { path_t *p; double nn = 0, cn = 0; if (progress->callback) { /* precompute task size for progress estimates */ nn = 0; list_forall (p, plist) { nn += p->priv->len; } cn = 0; } /* call downstream function with each path */ list_forall (p, plist) { TRY(calc_sums(p->priv)); TRY(calc_lon(p->priv)); TRY(bestpolygon(p->priv)); TRY(adjust_vertices(p->priv)); if (p->sign == '-') { /* reverse orientation of negative paths */ reverse(&p->priv->curve); } smooth(&p->priv->curve, param->alphamax); if (param->opticurve) { TRY(opticurve(p->priv, param->opttolerance)); p->priv->fcurve = &p->priv->ocurve; } else { p->priv->fcurve = &p->priv->curve; } privcurve_to_curve(p->priv->fcurve, &p->curve); if (progress->callback) { cn += p->priv->len; progress_update(cn/nn, progress); } } progress_update(1.0, progress); return 0; try_error: return 1; } dvisvgm-2.8.1/libs/ff-woff/0000775000175000017500000000000013563265646012507 500000000000000dvisvgm-2.8.1/libs/ff-woff/Makefile.am0000664000175000017500000000375313510660062014452 00000000000000noinst_LIBRARIES = libfontforge.a libfontforge_a_SOURCES = \ fontforge/PfEd.h \ fontforge/alphabet.c \ fontforge/asmfpst.c \ fontforge/autohint.c \ fontforge/char.c \ fontforge/cjk.c \ fontforge/configure-fontforge.h \ fontforge/cvundoes.c \ fontforge/dumppfa.c \ fontforge/edgelist.h \ fontforge/edgelist2.h \ fontforge/encoding.c \ fontforge/encoding.h \ fontforge/fflocale.c \ fontforge/fflocale.h \ fontforge/fontforge-config.h \ fontforge/fontforge.h \ fontforge/fontforgevw.h \ fontforge/fvfonts.c \ fontforge/gwwiconv.c \ fontforge/libffstamp.h \ fontforge/lookups.c \ fontforge/macbinary.c \ fontforge/macenc.c \ fontforge/mathconstants.c \ fontforge/memory.c \ fontforge/mm.c \ fontforge/namehash.h \ fontforge/namelist.c \ fontforge/nouiutil.c \ fontforge/nowakowskittfinstr.c \ fontforge/parsepfa.c \ fontforge/parsettf.c \ fontforge/parsettfatt.c \ fontforge/psfont.h \ fontforge/psread.c \ fontforge/pua.c \ fontforge/sd.h \ fontforge/sfd.c \ fontforge/sfd1.c \ fontforge/sfd1.h \ fontforge/splinechar.c \ fontforge/splinefont.c \ fontforge/splinefont.h \ fontforge/splineorder2.c \ fontforge/splineoverlap.c \ fontforge/splinerefigure.c \ fontforge/splinesave.c \ fontforge/splinesaveafm.c \ fontforge/splineutil.c \ fontforge/splineutil2.c \ fontforge/start.c \ fontforge/stemdb.c \ fontforge/stemdb.h \ fontforge/tables.h \ fontforge/tmpfile2.cpp \ fontforge/tottf.c \ fontforge/tottfaat.c \ fontforge/tottfgpos.c \ fontforge/tottfvar.c \ fontforge/ttf.h \ fontforge/ttfinstrs.c \ fontforge/ttfinstrs.h \ fontforge/ttfspecial.c \ fontforge/uiinterface.h \ fontforge/unialt.c \ fontforge/ustring.c \ fontforge/utype.c \ fontforge/woff.c \ inc/basics.h \ inc/chardata.h \ inc/charset.h \ inc/dlist.h \ inc/ffintl.h \ inc/gimage.h \ inc/gnetwork.h \ inc/gwwiconv.h \ inc/ustring.h \ inc/utype.h EXTRA_DIST = LICENSE AM_CFLAGS = -I$(srcdir)/inc -I$(srcdir)/fontforge $(ZLIB_CFLAGS) @CODE_COVERAGE_RULES@ CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/ff-woff/Makefile.in0000664000175000017500000011715213563265577014506 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/ff-woff ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libfontforge_a_AR = $(AR) $(ARFLAGS) libfontforge_a_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libfontforge_a_OBJECTS = fontforge/alphabet.$(OBJEXT) \ fontforge/asmfpst.$(OBJEXT) fontforge/autohint.$(OBJEXT) \ fontforge/char.$(OBJEXT) fontforge/cjk.$(OBJEXT) \ fontforge/cvundoes.$(OBJEXT) fontforge/dumppfa.$(OBJEXT) \ fontforge/encoding.$(OBJEXT) fontforge/fflocale.$(OBJEXT) \ fontforge/fvfonts.$(OBJEXT) fontforge/gwwiconv.$(OBJEXT) \ fontforge/lookups.$(OBJEXT) fontforge/macbinary.$(OBJEXT) \ fontforge/macenc.$(OBJEXT) fontforge/mathconstants.$(OBJEXT) \ fontforge/memory.$(OBJEXT) fontforge/mm.$(OBJEXT) \ fontforge/namelist.$(OBJEXT) fontforge/nouiutil.$(OBJEXT) \ fontforge/nowakowskittfinstr.$(OBJEXT) \ fontforge/parsepfa.$(OBJEXT) fontforge/parsettf.$(OBJEXT) \ fontforge/parsettfatt.$(OBJEXT) fontforge/psread.$(OBJEXT) \ fontforge/pua.$(OBJEXT) fontforge/sfd.$(OBJEXT) \ fontforge/sfd1.$(OBJEXT) fontforge/splinechar.$(OBJEXT) \ fontforge/splinefont.$(OBJEXT) \ fontforge/splineorder2.$(OBJEXT) \ fontforge/splineoverlap.$(OBJEXT) \ fontforge/splinerefigure.$(OBJEXT) \ fontforge/splinesave.$(OBJEXT) \ fontforge/splinesaveafm.$(OBJEXT) \ fontforge/splineutil.$(OBJEXT) fontforge/splineutil2.$(OBJEXT) \ fontforge/start.$(OBJEXT) fontforge/stemdb.$(OBJEXT) \ fontforge/tmpfile2.$(OBJEXT) fontforge/tottf.$(OBJEXT) \ fontforge/tottfaat.$(OBJEXT) fontforge/tottfgpos.$(OBJEXT) \ fontforge/tottfvar.$(OBJEXT) fontforge/ttfinstrs.$(OBJEXT) \ fontforge/ttfspecial.$(OBJEXT) fontforge/unialt.$(OBJEXT) \ fontforge/ustring.$(OBJEXT) fontforge/utype.$(OBJEXT) \ fontforge/woff.$(OBJEXT) libfontforge_a_OBJECTS = $(am_libfontforge_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = fontforge/$(DEPDIR)/alphabet.Po \ fontforge/$(DEPDIR)/asmfpst.Po fontforge/$(DEPDIR)/autohint.Po \ fontforge/$(DEPDIR)/char.Po fontforge/$(DEPDIR)/cjk.Po \ fontforge/$(DEPDIR)/cvundoes.Po fontforge/$(DEPDIR)/dumppfa.Po \ fontforge/$(DEPDIR)/encoding.Po \ fontforge/$(DEPDIR)/fflocale.Po fontforge/$(DEPDIR)/fvfonts.Po \ fontforge/$(DEPDIR)/gwwiconv.Po fontforge/$(DEPDIR)/lookups.Po \ fontforge/$(DEPDIR)/macbinary.Po fontforge/$(DEPDIR)/macenc.Po \ fontforge/$(DEPDIR)/mathconstants.Po \ fontforge/$(DEPDIR)/memory.Po fontforge/$(DEPDIR)/mm.Po \ fontforge/$(DEPDIR)/namelist.Po \ fontforge/$(DEPDIR)/nouiutil.Po \ fontforge/$(DEPDIR)/nowakowskittfinstr.Po \ fontforge/$(DEPDIR)/parsepfa.Po \ fontforge/$(DEPDIR)/parsettf.Po \ fontforge/$(DEPDIR)/parsettfatt.Po \ fontforge/$(DEPDIR)/psread.Po fontforge/$(DEPDIR)/pua.Po \ fontforge/$(DEPDIR)/sfd.Po fontforge/$(DEPDIR)/sfd1.Po \ fontforge/$(DEPDIR)/splinechar.Po \ fontforge/$(DEPDIR)/splinefont.Po \ fontforge/$(DEPDIR)/splineorder2.Po \ fontforge/$(DEPDIR)/splineoverlap.Po \ fontforge/$(DEPDIR)/splinerefigure.Po \ fontforge/$(DEPDIR)/splinesave.Po \ fontforge/$(DEPDIR)/splinesaveafm.Po \ fontforge/$(DEPDIR)/splineutil.Po \ fontforge/$(DEPDIR)/splineutil2.Po \ fontforge/$(DEPDIR)/start.Po fontforge/$(DEPDIR)/stemdb.Po \ fontforge/$(DEPDIR)/tmpfile2.Po fontforge/$(DEPDIR)/tottf.Po \ fontforge/$(DEPDIR)/tottfaat.Po \ fontforge/$(DEPDIR)/tottfgpos.Po \ fontforge/$(DEPDIR)/tottfvar.Po \ fontforge/$(DEPDIR)/ttfinstrs.Po \ fontforge/$(DEPDIR)/ttfspecial.Po \ fontforge/$(DEPDIR)/unialt.Po fontforge/$(DEPDIR)/ustring.Po \ fontforge/$(DEPDIR)/utype.Po fontforge/$(DEPDIR)/woff.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libfontforge_a_SOURCES) DIST_SOURCES = $(libfontforge_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libfontforge.a libfontforge_a_SOURCES = \ fontforge/PfEd.h \ fontforge/alphabet.c \ fontforge/asmfpst.c \ fontforge/autohint.c \ fontforge/char.c \ fontforge/cjk.c \ fontforge/configure-fontforge.h \ fontforge/cvundoes.c \ fontforge/dumppfa.c \ fontforge/edgelist.h \ fontforge/edgelist2.h \ fontforge/encoding.c \ fontforge/encoding.h \ fontforge/fflocale.c \ fontforge/fflocale.h \ fontforge/fontforge-config.h \ fontforge/fontforge.h \ fontforge/fontforgevw.h \ fontforge/fvfonts.c \ fontforge/gwwiconv.c \ fontforge/libffstamp.h \ fontforge/lookups.c \ fontforge/macbinary.c \ fontforge/macenc.c \ fontforge/mathconstants.c \ fontforge/memory.c \ fontforge/mm.c \ fontforge/namehash.h \ fontforge/namelist.c \ fontforge/nouiutil.c \ fontforge/nowakowskittfinstr.c \ fontforge/parsepfa.c \ fontforge/parsettf.c \ fontforge/parsettfatt.c \ fontforge/psfont.h \ fontforge/psread.c \ fontforge/pua.c \ fontforge/sd.h \ fontforge/sfd.c \ fontforge/sfd1.c \ fontforge/sfd1.h \ fontforge/splinechar.c \ fontforge/splinefont.c \ fontforge/splinefont.h \ fontforge/splineorder2.c \ fontforge/splineoverlap.c \ fontforge/splinerefigure.c \ fontforge/splinesave.c \ fontforge/splinesaveafm.c \ fontforge/splineutil.c \ fontforge/splineutil2.c \ fontforge/start.c \ fontforge/stemdb.c \ fontforge/stemdb.h \ fontforge/tables.h \ fontforge/tmpfile2.cpp \ fontforge/tottf.c \ fontforge/tottfaat.c \ fontforge/tottfgpos.c \ fontforge/tottfvar.c \ fontforge/ttf.h \ fontforge/ttfinstrs.c \ fontforge/ttfinstrs.h \ fontforge/ttfspecial.c \ fontforge/uiinterface.h \ fontforge/unialt.c \ fontforge/ustring.c \ fontforge/utype.c \ fontforge/woff.c \ inc/basics.h \ inc/chardata.h \ inc/charset.h \ inc/dlist.h \ inc/ffintl.h \ inc/gimage.h \ inc/gnetwork.h \ inc/gwwiconv.h \ inc/ustring.h \ inc/utype.h EXTRA_DIST = LICENSE AM_CFLAGS = -I$(srcdir)/inc -I$(srcdir)/fontforge $(ZLIB_CFLAGS) CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/ff-woff/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/ff-woff/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) fontforge/$(am__dirstamp): @$(MKDIR_P) fontforge @: > fontforge/$(am__dirstamp) fontforge/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fontforge/$(DEPDIR) @: > fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/alphabet.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/asmfpst.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/autohint.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/char.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/cjk.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/cvundoes.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/dumppfa.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/encoding.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/fflocale.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/fvfonts.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/gwwiconv.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/lookups.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/macbinary.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/macenc.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/mathconstants.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/memory.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/mm.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/namelist.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/nouiutil.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/nowakowskittfinstr.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/parsepfa.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/parsettf.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/parsettfatt.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/psread.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/pua.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/sfd.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/sfd1.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splinechar.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splinefont.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splineorder2.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splineoverlap.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splinerefigure.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splinesave.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splinesaveafm.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splineutil.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/splineutil2.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/start.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/stemdb.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/tmpfile2.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/tottf.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/tottfaat.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/tottfgpos.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/tottfvar.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/ttfinstrs.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/ttfspecial.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/unialt.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/ustring.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/utype.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) fontforge/woff.$(OBJEXT): fontforge/$(am__dirstamp) \ fontforge/$(DEPDIR)/$(am__dirstamp) libfontforge.a: $(libfontforge_a_OBJECTS) $(libfontforge_a_DEPENDENCIES) $(EXTRA_libfontforge_a_DEPENDENCIES) $(AM_V_at)-rm -f libfontforge.a $(AM_V_AR)$(libfontforge_a_AR) libfontforge.a $(libfontforge_a_OBJECTS) $(libfontforge_a_LIBADD) $(AM_V_at)$(RANLIB) libfontforge.a mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f fontforge/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/alphabet.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/asmfpst.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/autohint.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/char.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/cjk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/cvundoes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/dumppfa.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/encoding.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/fflocale.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/fvfonts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/gwwiconv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/lookups.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/macbinary.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/macenc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/mathconstants.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/memory.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/mm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/namelist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/nouiutil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/nowakowskittfinstr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/parsepfa.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/parsettf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/parsettfatt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/psread.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/pua.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/sfd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/sfd1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splinechar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splinefont.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splineorder2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splineoverlap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splinerefigure.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splinesave.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splinesaveafm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splineutil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/splineutil2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/start.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/stemdb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/tmpfile2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/tottf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/tottfaat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/tottfgpos.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/tottfvar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/ttfinstrs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/ttfspecial.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/unialt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/ustring.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/utype.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fontforge/$(DEPDIR)/woff.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f fontforge/$(DEPDIR)/$(am__dirstamp) -rm -f fontforge/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f fontforge/$(DEPDIR)/alphabet.Po -rm -f fontforge/$(DEPDIR)/asmfpst.Po -rm -f fontforge/$(DEPDIR)/autohint.Po -rm -f fontforge/$(DEPDIR)/char.Po -rm -f fontforge/$(DEPDIR)/cjk.Po -rm -f fontforge/$(DEPDIR)/cvundoes.Po -rm -f fontforge/$(DEPDIR)/dumppfa.Po -rm -f fontforge/$(DEPDIR)/encoding.Po -rm -f fontforge/$(DEPDIR)/fflocale.Po -rm -f fontforge/$(DEPDIR)/fvfonts.Po -rm -f fontforge/$(DEPDIR)/gwwiconv.Po -rm -f fontforge/$(DEPDIR)/lookups.Po -rm -f fontforge/$(DEPDIR)/macbinary.Po -rm -f fontforge/$(DEPDIR)/macenc.Po -rm -f fontforge/$(DEPDIR)/mathconstants.Po -rm -f fontforge/$(DEPDIR)/memory.Po -rm -f fontforge/$(DEPDIR)/mm.Po -rm -f fontforge/$(DEPDIR)/namelist.Po -rm -f fontforge/$(DEPDIR)/nouiutil.Po -rm -f fontforge/$(DEPDIR)/nowakowskittfinstr.Po -rm -f fontforge/$(DEPDIR)/parsepfa.Po -rm -f fontforge/$(DEPDIR)/parsettf.Po -rm -f fontforge/$(DEPDIR)/parsettfatt.Po -rm -f fontforge/$(DEPDIR)/psread.Po -rm -f fontforge/$(DEPDIR)/pua.Po -rm -f fontforge/$(DEPDIR)/sfd.Po -rm -f fontforge/$(DEPDIR)/sfd1.Po -rm -f fontforge/$(DEPDIR)/splinechar.Po -rm -f fontforge/$(DEPDIR)/splinefont.Po -rm -f fontforge/$(DEPDIR)/splineorder2.Po -rm -f fontforge/$(DEPDIR)/splineoverlap.Po -rm -f fontforge/$(DEPDIR)/splinerefigure.Po -rm -f fontforge/$(DEPDIR)/splinesave.Po -rm -f fontforge/$(DEPDIR)/splinesaveafm.Po -rm -f fontforge/$(DEPDIR)/splineutil.Po -rm -f fontforge/$(DEPDIR)/splineutil2.Po -rm -f fontforge/$(DEPDIR)/start.Po -rm -f fontforge/$(DEPDIR)/stemdb.Po -rm -f fontforge/$(DEPDIR)/tmpfile2.Po -rm -f fontforge/$(DEPDIR)/tottf.Po -rm -f fontforge/$(DEPDIR)/tottfaat.Po -rm -f fontforge/$(DEPDIR)/tottfgpos.Po -rm -f fontforge/$(DEPDIR)/tottfvar.Po -rm -f fontforge/$(DEPDIR)/ttfinstrs.Po -rm -f fontforge/$(DEPDIR)/ttfspecial.Po -rm -f fontforge/$(DEPDIR)/unialt.Po -rm -f fontforge/$(DEPDIR)/ustring.Po -rm -f fontforge/$(DEPDIR)/utype.Po -rm -f fontforge/$(DEPDIR)/woff.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f fontforge/$(DEPDIR)/alphabet.Po -rm -f fontforge/$(DEPDIR)/asmfpst.Po -rm -f fontforge/$(DEPDIR)/autohint.Po -rm -f fontforge/$(DEPDIR)/char.Po -rm -f fontforge/$(DEPDIR)/cjk.Po -rm -f fontforge/$(DEPDIR)/cvundoes.Po -rm -f fontforge/$(DEPDIR)/dumppfa.Po -rm -f fontforge/$(DEPDIR)/encoding.Po -rm -f fontforge/$(DEPDIR)/fflocale.Po -rm -f fontforge/$(DEPDIR)/fvfonts.Po -rm -f fontforge/$(DEPDIR)/gwwiconv.Po -rm -f fontforge/$(DEPDIR)/lookups.Po -rm -f fontforge/$(DEPDIR)/macbinary.Po -rm -f fontforge/$(DEPDIR)/macenc.Po -rm -f fontforge/$(DEPDIR)/mathconstants.Po -rm -f fontforge/$(DEPDIR)/memory.Po -rm -f fontforge/$(DEPDIR)/mm.Po -rm -f fontforge/$(DEPDIR)/namelist.Po -rm -f fontforge/$(DEPDIR)/nouiutil.Po -rm -f fontforge/$(DEPDIR)/nowakowskittfinstr.Po -rm -f fontforge/$(DEPDIR)/parsepfa.Po -rm -f fontforge/$(DEPDIR)/parsettf.Po -rm -f fontforge/$(DEPDIR)/parsettfatt.Po -rm -f fontforge/$(DEPDIR)/psread.Po -rm -f fontforge/$(DEPDIR)/pua.Po -rm -f fontforge/$(DEPDIR)/sfd.Po -rm -f fontforge/$(DEPDIR)/sfd1.Po -rm -f fontforge/$(DEPDIR)/splinechar.Po -rm -f fontforge/$(DEPDIR)/splinefont.Po -rm -f fontforge/$(DEPDIR)/splineorder2.Po -rm -f fontforge/$(DEPDIR)/splineoverlap.Po -rm -f fontforge/$(DEPDIR)/splinerefigure.Po -rm -f fontforge/$(DEPDIR)/splinesave.Po -rm -f fontforge/$(DEPDIR)/splinesaveafm.Po -rm -f fontforge/$(DEPDIR)/splineutil.Po -rm -f fontforge/$(DEPDIR)/splineutil2.Po -rm -f fontforge/$(DEPDIR)/start.Po -rm -f fontforge/$(DEPDIR)/stemdb.Po -rm -f fontforge/$(DEPDIR)/tmpfile2.Po -rm -f fontforge/$(DEPDIR)/tottf.Po -rm -f fontforge/$(DEPDIR)/tottfaat.Po -rm -f fontforge/$(DEPDIR)/tottfgpos.Po -rm -f fontforge/$(DEPDIR)/tottfvar.Po -rm -f fontforge/$(DEPDIR)/ttfinstrs.Po -rm -f fontforge/$(DEPDIR)/ttfspecial.Po -rm -f fontforge/$(DEPDIR)/unialt.Po -rm -f fontforge/$(DEPDIR)/ustring.Po -rm -f fontforge/$(DEPDIR)/utype.Po -rm -f fontforge/$(DEPDIR)/woff.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/libs/ff-woff/fontforge/0000775000175000017500000000000013563265646014500 500000000000000dvisvgm-2.8.1/libs/ff-woff/fontforge/stemdb.c0000664000175000017500000063315213510660062016033 00000000000000/* Copyright (C) 2005-2012 by George Williams and Alexey Kryukov */ /* * 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 "fontforge.h" #include "edgelist2.h" #include "stemdb.h" #include #include #define GLYPH_DATA_DEBUG 0 #define PI 3.14159265358979323846264338327 /* A diagonal end is like the top or bottom of a slash. Should we add a vertical stem at the end? */ /* A diagonal corner is like the bottom of circumflex. Should we add a horizontal stem? */ int hint_diagonal_ends = 0, hint_diagonal_intersections = 0, hint_bounding_boxes = 1, detect_diagonal_stems = 0; float stem_slope_error = .05061454830783555773, /* 2.9 degrees */ stub_slope_error = .317649923862967983; /* 18.2 degrees */ static double dist_error_hv = 3.5; static double dist_error_diag = 5.5; /* It's easy to get horizontal/vertical lines aligned properly */ /* it is more difficult to get diagonal ones done */ /* The "A" glyph in Apple's Times.dfont(Roman) is off by 6 in one spot */ static double dist_error_curve = 22; /* The maximum possible distance between the edge of an active zone for */ /* a curved spline segment and the spline itself */ struct st { Spline *s; double st, lt; }; static int GetBlueFuzz(SplineFont *sf) { char *str, *end; if ( sf == NULL || sf->private == NULL || (str=PSDictHasEntry( sf->private,"BlueFuzz" )) == NULL || !isdigit( str[0] )) return 1; return strtod( str, &end ); } static int IsUnitHV( BasePoint *unit,int strict ) { double angle = atan2( unit->y,unit->x ); double deviation = ( strict ) ? stem_slope_error : stub_slope_error; if ( fabs( angle ) >= PI/2 - deviation && fabs( angle ) <= PI/2 + deviation ) return( 2 ); else if ( fabs( angle ) <= deviation || fabs( angle ) >= PI - deviation ) return( 1 ); return( 0 ); } static int UnitCloserToHV( BasePoint *u1,BasePoint *u2 ) { double adiff1, adiff2; adiff1 = fabs( atan2( u1->y,u1->x )); adiff2 = fabs( atan2( u2->y,u2->x )); if ( adiff1 > PI*.25 && adiff1 < PI*.75 ) adiff1 = fabs( adiff1 - PI*.5 ); else if ( adiff1 >= PI*.75 ) adiff1 = PI - adiff1; if ( adiff2 > PI*.25 && adiff2 < PI*.75 ) adiff2 = fabs( adiff2 - PI*.5 ); else if ( adiff2 >= PI*.75 ) adiff2 = PI - adiff2; if ( adiff1 < adiff2 ) return( 1 ); else if ( adiff1 > adiff2 ) return( -1 ); else return( 0 ); } static double GetUnitAngle( BasePoint *u1,BasePoint *u2 ) { double dx, dy; dy = u1->x*u2->y - u1->y*u2->x; dx = u1->x*u2->x + u1->y*u2->y; return( atan2( dy,dx )); } static int UnitsOrthogonal( BasePoint *u1,BasePoint *u2,int strict ) { double angle, deviation = ( strict ) ? stem_slope_error : stub_slope_error; angle = GetUnitAngle( u1,u2 ); return( fabs( angle ) >= PI/2 - deviation && fabs( angle ) <= PI/2 + deviation ); } int UnitsParallel( BasePoint *u1,BasePoint *u2,int strict ) { double angle, deviation = ( strict ) ? stem_slope_error : stub_slope_error; angle = GetUnitAngle( u1,u2 ); return( fabs( angle ) <= deviation || fabs( angle ) >= PI - deviation ); } static int IsInflectionPoint( struct glyphdata *gd,struct pointdata *pd ) { SplinePoint *sp = pd->sp; double CURVATURE_THRESHOLD = 1e-9; struct spline *prev, *next; double in, out; if ( sp->prev == NULL || sp->next == NULL || !pd->colinear ) return( false ); /* point of a single-point contour can't be an inflection point. */ if ( sp->prev->from == sp ) return( false ); prev = sp->prev; in = 0; while ( prev != NULL && fabs(in) < CURVATURE_THRESHOLD ) { in = SplineCurvature( prev,1 ); if ( fabs( in ) < CURVATURE_THRESHOLD ) in = SplineCurvature( prev, 0 ); if ( fabs( in ) < CURVATURE_THRESHOLD ) prev = prev->from->prev; if ( gd->points[prev->to->ptindex].colinear ) break; } next = sp->next; out = 0; while ( next != NULL && fabs( out ) < CURVATURE_THRESHOLD ) { out = SplineCurvature( next,0 ); if ( fabs( out ) < CURVATURE_THRESHOLD ) out = SplineCurvature( next, 1 ); if ( fabs( out ) < CURVATURE_THRESHOLD ) next = next->to->next; if ( gd->points[next->from->ptindex].colinear ) break; } if ( in==0 || out==0 || ( prev != sp->prev && next != sp->next )) return( false ); in/=fabs(in); out/=fabs(out); return ( in*out < 0 ); } static int SplineFigureOpticalSlope(Spline *s,int start_at_from,BasePoint *dir) { /* Sometimes splines have tiny control points, and to the eye the slope */ /* of the spline has nothing to do with that specified by the cps. */ /* So see if the spline is straightish and figure the slope based on */ /* some average direction */ /* dir is a input output parameter. */ /* it should be initialized to the unit vector determined by the appropriate cp */ /* if the function returns true, it will be set to a unit vector in the average direction */ BasePoint pos, *base, average_dir, normal; double t, len, incr, off; double dx, dy, ax, ay, d, a; /* The vector is already nearly vertical/horizontal, no need to modify*/ if ( IsUnitHV( dir,true )) return( false ); if ( start_at_from ) { incr = -.1; base = &s->from->me; } else { incr = .1; base = &s->to->me; } t = .5-incr; memset(&average_dir,0,sizeof(average_dir)); while ( t>0 && t<1.0 ) { pos.x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; pos.y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; average_dir.x += (pos.x-base->x); average_dir.y += (pos.y-base->y); t += incr; } len = sqrt( pow( average_dir.x,2 ) + pow( average_dir.y,2 )); if ( len==0 ) return( false ); average_dir.x /= len; average_dir.y /= len; normal.x = average_dir.y; normal.y = - average_dir.x; t = .5-incr; while ( t>0 && t<1.0 ) { pos.x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; pos.y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; off = (pos.x-base->x)*normal.x + (pos.y-base->y)*normal.y; if ( off<-dist_error_hv || off>dist_error_hv ) return( false ); t += incr; } if ( UnitsParallel( dir,&normal,true )) { /* prefer the direction which is closer to horizontal/vertical */ if ( (dx=dir->x)<0 ) dx = -dx; if ( (dy=dir->y)<0 ) dy = -dy; d = (dxptindex >= gd->pcnt ) return; pd = &gd->points[sp->ptindex]; pd->sp = sp; pd->ss = ss; pd->x_extr = pd->y_extr = 0; pd->base = sp->me; pd->ttfindex = sp->ttfindex; pd->nextcnt = pd->prevcnt = 0; pd->nextstems = pd->prevstems = NULL; pd->next_is_l = pd->prev_is_l = NULL; if ( !sp->nonextcp && gd->order2 && sp->nextcpindex < gd->realcnt ) { nextpd = &gd->points[sp->nextcpindex]; nextpd->ss = ss; nextpd->x_extr = nextpd->y_extr = 0; nextpd->base = sp->nextcp; nextpd->ttfindex = sp->nextcpindex; } if ( !sp->noprevcp && gd->order2 && sp->prev != NULL && sp->prev->from->nextcpindex < gd->realcnt ) { nextpd = &gd->points[sp->prev->from->nextcpindex]; nextpd->ss = ss; nextpd->x_extr = nextpd->y_extr = 0; nextpd->base = sp->prevcp; nextpd->ttfindex = sp->prev->from->nextcpindex; } if ( sp->next==NULL ) { pd->nextunit.x = ss->first->me.x - sp->me.x; pd->nextunit.y = ss->first->me.y - sp->me.y; pd->nextlinear = true; } else if ( sp->next->knownlinear ) { pd->nextunit.x = sp->next->to->me.x - sp->me.x; pd->nextunit.y = sp->next->to->me.y - sp->me.y; pd->nextlinear = true; } else if ( sp->nonextcp ) { pd->nextunit.x = sp->next->to->prevcp.x - sp->me.x; pd->nextunit.y = sp->next->to->prevcp.y - sp->me.y; } else { pd->nextunit.x = sp->nextcp.x - sp->me.x; pd->nextunit.y = sp->nextcp.y - sp->me.y; } len = sqrt( pow( pd->nextunit.x,2 ) + pow( pd->nextunit.y,2 )); if ( len==0 ) pd->nextzero = true; else { pd->nextlen = len; pd->nextunit.x /= len; pd->nextunit.y /= len; if ( sp->next!=NULL && !sp->next->knownlinear ) SplineFigureOpticalSlope(sp->next,true,&pd->nextunit); hv = IsUnitHV( &pd->nextunit,true ); if ( hv == 2 ) { pd->nextunit.x = 0; pd->nextunit.y = pd->nextunit.y>0 ? 1 : -1; } else if ( hv == 1 ) { pd->nextunit.y = 0; pd->nextunit.x = pd->nextunit.x>0 ? 1 : -1; } if ( pd->nextunit.y==0 ) pd->next_hor = true; else if ( pd->nextunit.x==0 ) pd->next_ver = true; if ( nextpd != NULL ) { nextpd->prevunit.x = -pd->nextunit.x; nextpd->prevunit.y = -pd->nextunit.y; } } if ( sp->prev==NULL ) { pd->prevunit.x = ss->last->me.x - sp->me.x; pd->prevunit.y = ss->last->me.y - sp->me.y; pd->prevlinear = true; } else if ( sp->prev->knownlinear ) { pd->prevunit.x = sp->prev->from->me.x - sp->me.x; pd->prevunit.y = sp->prev->from->me.y - sp->me.y; pd->prevlinear = true; } else if ( sp->noprevcp ) { pd->prevunit.x = sp->prev->from->nextcp.x - sp->me.x; pd->prevunit.y = sp->prev->from->nextcp.y - sp->me.y; } else { pd->prevunit.x = sp->prevcp.x - sp->me.x; pd->prevunit.y = sp->prevcp.y - sp->me.y; } len = sqrt( pow( pd->prevunit.x,2 ) + pow( pd->prevunit.y,2 )); if ( len==0 ) pd->prevzero = true; else { pd->prevlen = len; pd->prevunit.x /= len; pd->prevunit.y /= len; if ( sp->prev!=NULL && !sp->prev->knownlinear ) SplineFigureOpticalSlope(sp->prev,false,&pd->prevunit); hv = IsUnitHV( &pd->prevunit,true ); if ( hv == 2 ) { pd->prevunit.x = 0; pd->prevunit.y = pd->prevunit.y>0 ? 1 : -1; } else if ( hv == 1 ) { pd->prevunit.y = 0; pd->prevunit.x = pd->prevunit.x>0 ? 1 : -1; } if ( pd->prevunit.y==0 ) pd->prev_hor = true; else if ( pd->prevunit.x==0 ) pd->prev_ver = true; if ( prevpd != NULL ) { prevpd->nextunit.x = -pd->prevunit.x; prevpd->nextunit.y = -pd->prevunit.y; } } { same = pd->prevunit.x*pd->nextunit.x + pd->prevunit.y*pd->nextunit.y; if ( same<-.95 ) pd->colinear = true; } if (( pd->prev_hor || pd->next_hor ) && pd->colinear ) { if ( IsSplinePeak( gd,pd,false,false,1 )) pd->y_extr = 1; else if ( IsSplinePeak( gd,pd,true,false,1 )) pd->y_extr = 2; } else if (( pd->prev_ver || pd->next_ver ) && pd->colinear ) { if ( IsSplinePeak( gd,pd,true,true,1 )) pd->x_extr = 1; else if ( IsSplinePeak( gd,pd,false,true,1 )) pd->x_extr = 2; } else { if (( pd->nextunit.y < 0 && pd->prevunit.y < 0 ) || ( pd->nextunit.y > 0 && pd->prevunit.y > 0 )) { if ( IsSplinePeak( gd,pd,false,false,2 )) pd->y_corner = 1; else if ( IsSplinePeak( gd,pd,true,false,2 )) pd->y_corner = 2; } if (( pd->nextunit.x < 0 && pd->prevunit.x < 0 ) || ( pd->nextunit.x > 0 && pd->prevunit.x > 0 )) { if ( IsSplinePeak( gd,pd,true,true,2 )) pd->x_corner = 1; else if ( IsSplinePeak( gd,pd,false,true,2 )) pd->x_corner = 2; } } if ( hint_diagonal_intersections ) { if (( pd->y_corner || pd->y_extr ) && RealNear( pd->nextunit.x,-pd->prevunit.x ) && RealNear( pd->nextunit.y,pd->prevunit.y ) && !pd->nextzero) pd->symetrical_h = true; else if (( pd->x_corner || pd->x_extr ) && RealNear( pd->nextunit.y,-pd->prevunit.y ) && RealNear( pd->nextunit.x,pd->prevunit.x ) && !pd->nextzero) pd->symetrical_v = true; } } static int BBoxIntersectsLine(Spline *s,Spline *line) { double t,x,y; DBounds b; b.minx = b.maxx = s->from->me.x; b.miny = b.maxy = s->from->me.y; if ( s->to->me.xto->me.x; else if ( s->to->me.x>b.maxx ) b.maxx = s->to->me.x; if ( s->to->me.yto->me.y; else if ( s->to->me.y>b.maxy ) b.maxy = s->to->me.y; if ( s->to->prevcp.xto->prevcp.x; else if ( s->to->prevcp.x>b.maxx ) b.maxx = s->to->prevcp.x; if ( s->to->prevcp.yto->prevcp.y; else if ( s->to->prevcp.y>b.maxy ) b.maxy = s->to->prevcp.y; if ( s->from->nextcp.xfrom->nextcp.x; else if ( s->from->nextcp.x>b.maxx ) b.maxx = s->from->nextcp.x; if ( s->from->nextcp.yfrom->nextcp.y; else if ( s->from->nextcp.y>b.maxy ) b.maxy = s->from->nextcp.y; if ( line->splines[0].c!=0 ) { t = (b.minx-line->splines[0].d)/line->splines[0].c; y = line->splines[1].c*t+line->splines[1].d; if ( y>=b.miny && y<=b.maxy ) return( true ); t = (b.maxx-line->splines[0].d)/line->splines[0].c; y = line->splines[1].c*t+line->splines[1].d; if ( y>=b.miny && y<=b.maxy ) return( true ); } if ( line->splines[1].c!=0 ) { t = (b.miny-line->splines[1].d)/line->splines[1].c; x = line->splines[0].c*t+line->splines[0].d; if ( x>=b.minx && x<=b.maxx ) return( true ); t = (b.maxy-line->splines[1].d)/line->splines[1].c; x = line->splines[0].c*t+line->splines[0].d; if ( x>=b.minx && x<=b.maxx ) return( true ); } return( false ); } static int stcmp(const void *_p1, const void *_p2) { const struct st *stpt1 = _p1, *stpt2 = _p2; if ( stpt1->lt>stpt2->lt ) return( 1 ); else if ( stpt1->ltlt ) return( -1 ); return( 0 ); } static int line_pt_cmp( const void *_p1, const void *_p2 ) { struct pointdata * const *pd1 = _p1, * const *pd2 = _p2; struct linedata *line; double ppos1=0,ppos2=0; if ( (*pd1)->prevline != NULL && ( (*pd1)->prevline == (*pd2)->prevline || (*pd1)->prevline == (*pd2)->nextline )) line = (*pd1)->prevline; else if ( (*pd1)->nextline != NULL && ( (*pd1)->nextline == (*pd2)->prevline || (*pd1)->nextline == (*pd2)->nextline )) line = (*pd1)->nextline; else return( 0 ); ppos1 = ( (*pd1)->sp->me.x - line->online.x ) * line->unit.x + ( (*pd1)->sp->me.y - line->online.y ) * line->unit.y; ppos2 = ( (*pd2)->sp->me.x - line->online.x ) * line->unit.x + ( (*pd2)->sp->me.y - line->online.y ) * line->unit.y; if ( ppos1>ppos2 ) return( 1 ); else if ( ppos1startstart ) return( -1 ); else if ( s1->start>s2->start ) return( 1 ); return( 0 ); } static int proj_cmp(const void *_p1, const void *_p2) { struct pointdata * const *p1 = _p1, * const *p2 = _p2; if ( (*p1)->projection<(*p2)->projection ) return( -1 ); else if ( (*p1)->projection>(*p2)->projection ) return( 1 ); return( 0 ); } static void AssignStemToPoint( struct pointdata *pd,struct stemdata *stem,int is_next, int left ) { struct stemdata ***stems; int i, *stemcnt, **is_l; stems = ( is_next ) ? &pd->nextstems : &pd->prevstems; stemcnt = ( is_next ) ? &pd->nextcnt : &pd->prevcnt; is_l = ( is_next ) ? &pd->next_is_l : &pd->prev_is_l; for ( i=0; i<*stemcnt; i++ ) { if ((*stems)[i] == stem ) return; } *stems = realloc( *stems,( *stemcnt+1 )*sizeof( struct stemdata *)); *is_l = realloc( *is_l, ( *stemcnt+1 )*sizeof( int )); (*stems)[*stemcnt] = stem; (*is_l )[*stemcnt] = left; (*stemcnt)++; } int IsStemAssignedToPoint( struct pointdata *pd,struct stemdata *stem,int is_next ) { struct stemdata **stems; int i, stemcnt; stems = ( is_next ) ? pd->nextstems : pd->prevstems; stemcnt = ( is_next ) ? pd->nextcnt : pd->prevcnt; for ( i=0; ittfindex < gd->realcnt ) return( sp->ttfindex ); if ( !sp->nonextcp && sp->nextcpindex < gd->realcnt ) { tpd = &gd->points[sp->nextcpindex]; if ( IsStemAssignedToPoint( tpd,stem,false ) != -1 ) return( sp->nextcpindex ); } if ( !sp->noprevcp && sp->prev != NULL && sp->prev->from->nextcpindex < gd->realcnt ) { tpd = &gd->points[sp->prev->from->nextcpindex]; if ( IsStemAssignedToPoint( tpd,stem,true ) != -1 ) return( sp->prev->from->nextcpindex ); } return( -1 ); } static int LineType(struct st *st,int i, int cnt,Spline *line) { SplinePoint *sp; BasePoint nextcp, prevcp, here; double dn, dp; if ( st[i].st>.01 && st[i].st<.99 ) return( 0 ); /* Not near an end-point, just a normal line */ if ( i+1>=cnt ) return( 0 ); /* No following spline */ if ( st[i+1].st>.01 && st[i+1].st<.99 ) return( 0 ); /* Following spline not near an end-point, can't */ /* match to this one, just a normal line */ if ( st[i].st<.5 && st[i+1].st>.5 ) { if ( st[i+1].s->to->next!=st[i].s ) return( 0 ); sp = st[i].s->from; } else if ( st[i].st>.5 && st[i+1].st<.5 ) { if ( st[i].s->to->next!=st[i+1].s ) return( 0 ); sp = st[i].s->to; } else return( 0 ); if ( !sp->nonextcp ) nextcp = sp->nextcp; else nextcp = sp->next->to->me; if ( !sp->noprevcp ) prevcp = sp->prevcp; else prevcp = sp->prev->from->me; here.x = line->splines[0].c*(st[i].st+st[i+1].st)/2 + line->splines[0].d; here.y = line->splines[1].c*(st[i].st+st[i+1].st)/2 + line->splines[1].d; nextcp.x -= here.x; nextcp.y -= here.y; prevcp.x -= here.x; prevcp.y -= here.y; dn = nextcp.x*line->splines[1].c - nextcp.y*line->splines[0].c; dp = prevcp.x*line->splines[1].c - prevcp.y*line->splines[0].c; if ( dn*dp<0 ) /* splines away move on opposite sides of the line */ return( 1 ); /* Treat this line and the next as one */ /* We assume that a rounding error gave us one erroneous intersection (or we went directly through the endpoint) */ else return( 2 ); /* Ignore both this line and the next */ /* Intersects both in a normal fashion */ } static int MonotonicOrder(Spline **sspace,Spline *line,struct st *stspace) { Spline *s; int i,j,k,cnt; BasePoint pts[9]; extended lts[10], sts[10]; for ( i=j=0; (s=sspace[j])!=NULL; ++j ) { if ( BBoxIntersectsLine(s,line) ) { /* Lines parallel to the direction we are testing just get in the */ /* way and don't add any useful info */ if ( s->islinear && RealNear(line->splines[0].c*s->splines[1].c, line->splines[1].c*s->splines[0].c)) continue; if ( SplinesIntersect(line,s,pts,lts,sts)<=0 ) continue; for ( k=0; sts[k]!=-1; ++k ) { if ( sts[k]>=0 && sts[k]<=1 ) { stspace[i].s = s; stspace[i].lt = lts[k]; stspace[i++].st = sts[k]; } } } } stspace[i].s = NULL; cnt = i; qsort(stspace,cnt,sizeof(struct st),stcmp); return( cnt ); } static Spline *MonotonicFindAlong(Spline *line,struct st *stspace,int cnt, Spline *findme, double *other_t) { Spline *s; int i; int eo; /* I do horizontal/vertical by winding number */ /* But figuring winding number with respect to a */ /* diagonal line is hard. So I use even-odd */ /* instead. */ eo = 0; for ( i=0; i0 ) { *other_t = stspace[i-1].st; return( stspace[i-1].s ); } else if ( !(eo&1) && i+1lmin < -fudge ) ? stem->lmin : -fudge; double lmax = ( stem->lmax > fudge ) ? stem->lmax : fudge; double rmin = ( stem->rmin < -fudge ) ? stem->rmin : -fudge; double rmax = ( stem->rmax > fudge ) ? stem->rmax : fudge; lmin -= .0001; lmax += .0001; rmin -= .0001; rmax += .0001; eo = 0; for ( i=0; isplines[0].c*stspace[i].lt + line->splines[0].d - stem->left.x)*stem->l_to_r.x + (line->splines[1].c*stspace[i].lt + line->splines[1].d - stem->left.y)*stem->l_to_r.y; npos = 1e4; if ( i+1splines[0].c*stspace[i+1].lt + line->splines[0].d - stem->left.x)*stem->l_to_r.x + (line->splines[1].c*stspace[i+1].lt + line->splines[1].d - stem->left.y)*stem->l_to_r.y; if ( pos>=lmin && pos<=lmax ) { if ( (eo&1) && i>0 ) j = i-1; else if ( !(eo&1) && i+1splines[0].c*stspace[j].lt + line->splines[0].d - stem->right.x)*stem->l_to_r.x + (line->splines[1].c*stspace[j].lt + line->splines[1].d - stem->right.y)*stem->l_to_r.y; if ( pos >= rmin && pos <= rmax ) return( true ); } if ( i+1 < cnt && npos >= lmin && npos <= lmax ) ++eo; else switch ( LineType(stspace,i,cnt,line) ) { case 0: /* Normal spline */ ++eo; break; case 1: /* Intersects at end-point & next entry is other side */ ++eo; /* And the two sides continue in approximately the */ ++i; /* same direction */ break; case 2: /* Intersects at end-point & next entry is other side */ ++i; /* And the two sides go in opposite directions */ break; default: break; } } return( false ); } static int MatchWinding(struct monotonic ** space,int i,int nw,int winding,int which,int idx) { struct monotonic *m; int j,cnt=0; if (( nw<0 && winding>0 ) || (nw>0 && winding<0)) { winding = nw; for ( j=i-1; j>=0; --j ) { m = space[j]; winding += ((&m->xup)[which] ? 1 : -1 ); if ( winding==0 ) { if ( cnt == idx ) return( j ); cnt++; } } } else { winding = nw; for ( j=i+1; space[j]!=NULL; ++j ) { m = space[j]; winding += ((&m->xup)[which] ? 1 : -1 ); if ( winding==0 ) { if ( cnt == idx ) return( j ); cnt++; } } } return( -1 ); } static int FindMatchingHVEdge( struct glyphdata *gd,struct pointdata *pd, int is_next,Spline **edges,double *other_t,double *dist ) { double test, t, start, end; int which; Spline *s; Monotonic *m; int winding, nw, i, j, ret=0; struct monotonic **space; BasePoint *dir, d, hv; /* Things are difficult if we go exactly through the point. Move off */ /* to the side a tiny bit and hope that doesn't matter */ if ( is_next==2 ) { /* Consider the case of the bottom of the circumflex (or a chevron) */ /* Think of it as a flattend breve. It is symetrical and we want to */ /* note the vertical distance between the two points that define */ /* the bottom, so treat them as a funky stem */ /* \ \ / / */ /* \ \ / / */ /* \ \ / / */ /* \ + / */ /* \ / */ /* + */ hv.x = pd->symetrical_h ? 1.0 : 0.0; hv.y = pd->symetrical_v ? 1.0 : 0.0; dir = &hv; t = .001; s = pd->sp->next; /* Could just as easily be prev */ } else if ( is_next ) { s = pd->sp->next; t = .001; dir = &pd->nextunit; } else { s = pd->sp->prev; t = .999; dir = &pd->prevunit; } if (( d.x = dir->x )<0 ) d.x = -d.x; if (( d.y = dir->y )<0 ) d.y = -d.y; which = d.xsplines[which].a*t+s->splines[which].b)*t+s->splines[which].c)*t+s->splines[which].d; MonotonicFindAt(gd->ms,which,test,space = gd->space); winding = 0; for ( i=0; space[i]!=NULL; ++i ) { m = space[i]; nw = ((&m->xup)[which] ? 1 : -1 ); if ( m->s == s && t>=m->tstart && t<=m->tend ) { start = m->other; break; } winding += nw; } if ( space[i]==NULL ) { fprintf( stderr, "FindMatchinHVEdge didn't\n" ); return( 0 ); } j = MatchWinding(space,i,nw,winding,which,0); if ( j!=-1 ) { other_t[0] = space[j]->t; end = space[j]->other; dist[0] = end - start; if ( dist[0] < 0 ) dist[0] = -dist[0]; edges[0] = space[j]->s; ret++; } if ( ret > 0 && is_next != 2 && ( pd->x_extr == 1 || pd->y_extr == 1 )) { j = MatchWinding(space,i,nw,winding,which,1); if ( j!=-1 ) { other_t[ret] = space[j]->t; end = space[j]->other; dist[ret] = end - start; if ( dist[ret] < 0 ) dist[ret] = -dist[ret]; edges[ret] = space[j]->s; ret++; } } return( ret ); } static BasePoint PerturbAlongSpline( Spline *s,BasePoint *bp,double t ) { BasePoint perturbed; for (;;) { perturbed.x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; perturbed.y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; if ( !RealWithin( perturbed.x,bp->x,.01 ) || !RealWithin( perturbed.y,bp->y,.01 )) break; if ( t<.5 ) { t *= 2; if ( t>.5 ) break; } else { t = 1- 2*(1-t); if ( t<.5 ) break; } } return( perturbed ); } static void MakeVirtualLine(struct glyphdata *gd,BasePoint *perturbed, BasePoint *dir,Spline *myline,SplinePoint *end1, SplinePoint *end2) { BasePoint norm, absnorm; SplineSet *spl; Spline *s, *first; double t1, t2; int i, cnt; if ( gd->stspace==NULL ) { for ( i=0; i<2; ++i ) { cnt = 0; for ( spl=gd->sc->layers[gd->layer].splines; spl!=NULL; spl=spl->next ) { first = NULL; if ( spl->first->prev!=NULL ) { for ( s=spl->first->next; s!=first; s=s->to->next ) { if ( first==NULL ) first = s; if ( i ) gd->sspace[cnt] = s; ++cnt; } } } if ( !i ) { gd->scnt = cnt; gd->sspace = malloc((cnt+1)*sizeof(Spline *)); } else gd->sspace[cnt] = NULL; } gd->stspace = malloc((3*cnt+2)*sizeof(struct st)); SplineCharFindBounds(gd->sc,&gd->size); gd->size.minx -= 10; gd->size.miny -= 10; gd->size.maxx += 10; gd->size.maxy += 10; } norm.x = -dir->y; norm.y = dir->x; absnorm = norm; if ( absnorm.x<0 ) absnorm.x = -absnorm.x; if ( absnorm.y<0 ) absnorm.y = -absnorm.y; memset(myline,0,sizeof(*myline)); memset(end1,0,sizeof(*end1)); memset(end2,0,sizeof(*end2)); myline->knownlinear = myline->islinear = true; if ( absnorm.x > absnorm.y ) { /* Greater change in x than in y */ t1 = (gd->size.minx-perturbed->x)/norm.x; t2 = (gd->size.maxx-perturbed->x)/norm.x; myline->splines[0].d = gd->size.minx; myline->splines[0].c = gd->size.maxx-gd->size.minx; myline->splines[1].d = perturbed->y+t1*norm.y; myline->splines[1].c = (t2-t1)*norm.y; } else { t1 = (gd->size.miny-perturbed->y)/norm.y; t2 = (gd->size.maxy-perturbed->y)/norm.y; myline->splines[1].d = gd->size.miny; myline->splines[1].c = gd->size.maxy-gd->size.miny; myline->splines[0].d = perturbed->x+t1*norm.x; myline->splines[0].c = (t2-t1)*norm.x; } end1->me.x = myline->splines[0].d; end2->me.x = myline->splines[0].d + myline->splines[0].c; end1->me.y = myline->splines[1].d; end2->me.y = myline->splines[1].d + myline->splines[1].c; end1->nextcp = end1->prevcp = end1->me; end2->nextcp = end2->prevcp = end2->me; end1->nonextcp = end1->noprevcp = end2->nonextcp = end2->noprevcp = true; end1->next = myline; end2->prev = myline; myline->from = end1; myline->to = end2; } static int FindMatchingEdge( struct glyphdata *gd, struct pointdata *pd, int is_next,Spline **edges ) { BasePoint *dir, vert, perturbed, diff; Spline myline; SplinePoint end1, end2; double *other_t = is_next==2 ? &pd->both_e_t : is_next ? pd->next_e_t : pd->prev_e_t; double *dist = is_next ? pd->next_dist : pd->prev_dist; double t ; Spline *s; int cnt; dist[0] = 0; dist[1] = 0; if (( is_next && ( pd->next_hor || pd->next_ver )) || ( !is_next && ( pd->prev_hor || pd->prev_ver )) || is_next == 2 ) return( FindMatchingHVEdge(gd,pd,is_next,edges,other_t,dist)); if ( is_next ) { dir = &pd->nextunit; t = .001; s = pd->sp->next; } else { dir = &pd->prevunit; t = .999; s = pd->sp->prev; } /* For spline segments which have slope close enough to the font's italic */ /* slant look for an opposite edge along the horizontal direction, rather */ /* than along the normal for the point's next/previous unit. This allows */ /* us e. g. to detect serifs in italic fonts */ if ( gd->has_slant ) { if ( UnitsParallel( dir,&gd->slant_unit,true )) { vert.x = 0; vert.y = 1; dir = | } } if ( s==NULL || ( gd->only_hv && !IsUnitHV( dir,false ))) return( 0 ); diff.x = s->to->me.x-s->from->me.x; diff.y = s->to->me.y-s->from->me.y; if ( diff.x<.03 && diff.x>-.03 && diff.y<.03 && diff.y>-.03 ) return( 0 ); /* Don't base the line on the current point, we run into rounding errors */ /* where lines that should intersect it don't. Instead perturb it a tiny*/ /* bit in the direction along the spline */ perturbed = PerturbAlongSpline( s,&pd->sp->me,t ); MakeVirtualLine(gd,&perturbed,dir,&myline,&end1,&end2); /* prev_e_t = next_e_t = both_e_t =. This is where these guys are set */ cnt = MonotonicOrder(gd->sspace,&myline,gd->stspace); edges[0] = MonotonicFindAlong(&myline,gd->stspace,cnt,s,other_t); return( edges[0] != NULL ); } static int StillStem(struct glyphdata *gd,double fudge,BasePoint *pos,struct stemdata *stem ) { Spline myline; SplinePoint end1, end2; int cnt, ret; MakeVirtualLine( gd,pos,&stem->unit,&myline,&end1,&end2 ); cnt = MonotonicOrder( gd->sspace,&myline,gd->stspace ); ret = MonotonicFindStemBounds( &myline,gd->stspace,cnt,fudge,stem ); return( ret ); } static int CornerCorrectSide( struct pointdata *pd,int x_dir,int is_l ) { int corner = ( x_dir ) ? pd->x_corner : pd->y_corner; int start = (( x_dir && is_l ) || ( !x_dir && !is_l )); double unit_p, unit_n; unit_p = (&pd->prevunit.x)[!x_dir]; unit_n = (&pd->nextunit.x)[!x_dir]; return( ( start && ( ( corner == 1 && unit_p > 0 && unit_n > 0 ) || ( corner == 2 && unit_p < 0 && unit_n < 0 ))) || ( !start && ( ( corner == 1 && unit_p < 0 && unit_n < 0 ) || ( corner == 2 && unit_p > 0 && unit_n > 0 )))); } static int IsCorrectSide( struct glyphdata *gd,struct pointdata *pd, int is_next,int is_l,BasePoint *dir ) { Spline *sbase, myline; SplinePoint *sp = pd->sp, end1, end2; BasePoint perturbed; int i, hv, is_x, ret = false, winding = 0, cnt, eo; double t, test; struct monotonic **space, *m; hv = IsUnitHV( dir,true ); if (( hv == 2 && pd->x_corner ) || ( hv == 1 && pd->y_corner )) return( CornerCorrectSide( pd,( hv == 2 ),is_l )); sbase = ( is_next ) ? sp->next : sp->prev; t = ( is_next ) ? 0.001 : 0.999; perturbed = PerturbAlongSpline( sbase,&sp->me,t ); if ( hv ) { is_x = ( hv == 2 ); test = ( is_x ) ? perturbed.y : perturbed.x; MonotonicFindAt( gd->ms,is_x,test,space = gd->space ); for ( i=0; space[i]!=NULL; ++i ) { m = space[i]; winding = ((&m->xup)[is_x] ? 1 : -1 ); if ( m->s == sbase ) break; } if ( space[i]!=NULL ) ret = (( is_l && winding == 1 ) || ( !is_l && winding == -1 )); } else { MakeVirtualLine( gd,&perturbed,dir,&myline,&end1,&end2 ); cnt = MonotonicOrder( gd->sspace,&myline,gd->stspace ); eo = -1; is_x = fabs( dir->y ) > fabs( dir->x ); /* If a diagonal stem is more vertical than horizontal, then our */ /* virtual line will go from left to right. It will first intersect */ /* the left side of the stem, if the stem also points north-east. */ /* In any other case the virtual line will first intersect the right */ /* side. */ i = ( is_x && dir->y > 0 ) ? 0 : cnt-1; while ( i >= 0 && i <= cnt-1 ) { eo = ( eo != 1 ) ? 1 : 0; if ( gd->stspace[i].s == sbase ) break; if ( is_x && dir->y > 0 ) i++; else i--; } ret = ( is_l == eo ); } return( ret ); } /* In TrueType I want to make sure that everything on a diagonal line remains */ /* on the same line. Hence we compute the line. Also we are interested in */ /* points that are on the intersection of two lines */ static struct linedata *BuildLine(struct glyphdata *gd,struct pointdata *pd,int is_next ) { int i; BasePoint *dir, *base, *start, *end; struct pointdata **pspace = gd->pspace, *pd2; int pcnt=0, is_l, hv; double dist_error; struct linedata *line; double off, firstoff, lastoff, lmin=0, lmax=0; dir = is_next ? &pd->nextunit : &pd->prevunit; is_l = IsCorrectSide( gd,pd,is_next,true,dir ); dist_error = ( IsUnitHV( dir,true )) ? dist_error_hv : dist_error_diag ; /* Diagonals are harder to align */ if ( dir->x==0 && dir->y==0 ) return( NULL ); base = &pd->sp->me; for ( i= (pd - gd->points)+1; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { pd2 = &gd->points[i]; off = ( pd2->sp->me.x - base->x )*dir->y - ( pd2->sp->me.y - base->y )*dir->x; if ( off <= lmax - 2*dist_error || off >= lmin + 2*dist_error ) continue; if ( off < 0 && off < lmin ) lmin = off; else if ( off > 0 && off > lmax ) lmax = off; if ((( UnitsParallel( dir,&pd2->nextunit,true ) && pd2->nextline==NULL ) && IsCorrectSide( gd,pd2,true,is_l,dir )) || (( UnitsParallel( dir,&pd2->prevunit,true ) && pd2->prevline==NULL ) && IsCorrectSide( gd,pd2,false,is_l,dir ))) pspace[pcnt++] = pd2; } if ( pcnt==0 ) return( NULL ); if ( pcnt==1 ) { /* if the line consists of just these two points, only count it as */ /* a true line if the two immediately follow each other */ if (( pd->sp->next->to != pspace[0]->sp || !pd->sp->next->knownlinear ) && ( pd->sp->prev->from != pspace[0]->sp || !pd->sp->prev->knownlinear )) return( NULL ); } line = &gd->lines[gd->linecnt++]; line->pcnt = pcnt+1; line->points = malloc((pcnt+1)*sizeof(struct pointdata *)); line->points[0] = pd; line->unit = *dir; line->is_left = is_l; if ( dir->x < 0 || dir->y == -1 ) { line->unit.x = -line->unit.x; line->unit.y = -line->unit.y; } line->online = *base; if ( is_next ) { pd->nextline = line; if ( pd->colinear ) pd->prevline = line; } else { pd->prevline = line; if ( pd->colinear ) pd->nextline = line; } for ( i=0; inextunit,true ) && pspace[i]->nextline==NULL ) { pspace[i]->nextline = line; if ( pspace[i]->colinear ) pspace[i]->prevline = line; } if ( UnitsParallel( dir,&pspace[i]->prevunit,true ) && pspace[i]->prevline==NULL ) { pspace[i]->prevline = line; if ( pspace[i]->colinear ) pspace[i]->nextline = line; } line->points[i+1] = pspace[i]; } qsort( line->points,line->pcnt,sizeof( struct pointdata * ),line_pt_cmp ); start = &line->points[0]->sp->me; end = &line->points[pcnt]->sp->me; /* Now recalculate the line unit vector basing on its starting and */ /* terminal points */ line->unit.x = ( end->x - start->x ); line->unit.y = ( end->y - start->y ); line->length = sqrt( pow( line->unit.x,2 ) + pow( line->unit.y,2 )); line->unit.x /= line->length; line->unit.y /= line->length; hv = IsUnitHV( &line->unit,true ); if ( hv == 2 ) { line->unit.x = 0; line->unit.y = 1; } else if ( hv == 1 ) { line->unit.x = 1; line->unit.y = 0; } else if ( gd->has_slant && UnitsParallel( &line->unit,&gd->slant_unit,true )) { firstoff = ( start->x - base->x )*gd->slant_unit.y - ( start->y - base->y )*gd->slant_unit.x; lastoff = ( end->x - base->x )*gd->slant_unit.y - ( end->y - base->y )*gd->slant_unit.x; if ( fabs( firstoff ) < 2*dist_error && fabs( lastoff ) < 2*dist_error ) line->unit = gd->slant_unit; } return( line ); } static BasePoint MiddleUnit( BasePoint *unit1, BasePoint *unit2 ) { BasePoint u1, u2, ret; double hyp; int hv; u1 = *unit1; u2 = *unit2; if ( u1.x*u2.x + u1.y*u2.y < 0 ) { u2.x = -u2.x; u2.y = -u2.y; } ret.x = ( u1.x + u2.x )/2; ret.y = ( u1.y + u2.y )/2; hyp = sqrt( pow( ret.x,2 ) + pow( ret.y,2 )); ret.x /= hyp; ret.y /= hyp; hv = IsUnitHV( &ret,true ); if ( hv ) { ret.x = ( hv == 1 ) ? 1 : 0; ret.y = ( hv == 1 ) ? 0 : 1; } return( ret ); } static uint8 IsStubOrIntersection( struct glyphdata *gd, BasePoint *dir1, struct pointdata *pd1, struct pointdata *pd2, int is_next1, int is_next2 ) { int i; int exc=0; double dist, off, ext, norm1, norm2, opp, angle; double mid_err = ( stem_slope_error + stub_slope_error )/2; SplinePoint *sp1, *sp2, *nsp; BasePoint hvdir, *dir2, *odir1, *odir2; struct pointdata *npd; struct linedata *line; sp1 = pd1->sp; sp2 = pd2->sp; dir2 = ( is_next2 ) ? &pd2->nextunit : &pd2->prevunit; hvdir.x = ( int ) rint( dir1->x ); hvdir.y = ( int ) rint( dir1->y ); line = is_next2 ? pd2->nextline : pd2->prevline; if ( !IsUnitHV( dir2,true ) && line != NULL ) dir2 = &line->unit; odir1 = ( is_next1 ) ? &pd1->prevunit : &pd1->nextunit; odir2 = ( is_next2 ) ? &pd2->prevunit : &pd2->nextunit; angle = fabs( GetUnitAngle( dir1,dir2 )); if ( angle > (double)stub_slope_error*1.5 && angle < PI - (double)stub_slope_error*1.5 ) return( 0 ); /* First check if it is a slightly slanted line or a curve which joins */ /* a straight line under an angle close to 90 degrees. There are many */ /* glyphs where circles or curved features are intersected by or */ /* connected to vertical or horizontal straight stems (the most obvious */ /* cases are Greek Psi and Cyrillic Yu), and usually it is highly desired to */ /* mark such an intersection with a hint */ norm1 = ( sp1->me.x - sp2->me.x ) * odir2->x + ( sp1->me.y - sp2->me.y ) * odir2->y; norm2 = ( sp2->me.x - sp1->me.x ) * odir1->x + ( sp2->me.y - sp1->me.y ) * odir1->y; /* if this is a real stub or intersection, then vectors on both sides */ /* of out going-to-be stem should point in the same direction. So */ /* the following value should be positive */ opp = dir1->x * dir2->x + dir1->y * dir2->y; if (( angle <= mid_err || angle >= PI - mid_err ) && opp > 0 && norm1 < 0 && norm2 < 0 && UnitsParallel( odir1,odir2,true ) && ( UnitsOrthogonal( dir1,odir1,false ) || UnitsOrthogonal( dir2,odir1,false ))) return( 2 ); if (( angle <= mid_err || angle >= PI - mid_err ) && opp > 0 && (( norm1 < 0 && pd1->colinear && IsUnitHV( dir1,true ) && UnitsOrthogonal( dir1,odir2,false )) || ( norm2 < 0 && pd2->colinear && IsUnitHV( dir2,true ) && UnitsOrthogonal( dir2,odir1,false )))) return( 4 ); /* Now check if our 2 points form a serif termination or a feature stub */ /* The check is pretty dumb: it returns 'true' if all the following */ /* conditions are met: */ /* - both the points belong to the same contour; */ /* - there are no more than 3 other points between them; */ /* - anyone of those intermediate points is positioned by such a way */ /* that it falls inside the stem formed by our 2 base point and */ /* the vector we are checking and its distance from the first point */ /* along that vector is not larger than the stem width; */ /* - none of the intermediate points is parallel to the vector direction */ /* (otherwise we should have checked against that point instead) */ if ( !UnitsParallel( dir1,&hvdir,false )) return( 0 ); dist = ( sp1->me.x - sp2->me.x ) * dir1->y - ( sp1->me.y - sp2->me.y ) * dir1->x; nsp = sp1; for ( i=0; i<4; i++ ) { if (( is_next1 && nsp->prev == NULL ) || ( !is_next1 && nsp->next == NULL )) return( 0 ); nsp = ( is_next1 ) ? nsp->prev->from : nsp->next->to; if ( ( i>0 && nsp == sp1 ) || nsp == sp2 ) break; npd = &gd->points[nsp->ptindex]; if (UnitsParallel( &npd->nextunit,&hvdir,false ) || UnitsParallel( &npd->prevunit,&hvdir,false )) break; ext = ( sp1->me.x - nsp->me.x ) * hvdir.x + ( sp1->me.y - nsp->me.y ) * hvdir.y; if ( ext < 0 ) ext = -ext; if (( dist > 0 && ext > dist ) || ( dist < 0 && ext < dist )) break; off = ( sp1->me.x - nsp->me.x ) * hvdir.y - ( sp1->me.y - nsp->me.y ) * hvdir.x; if (( dist > 0 && ( off <= 0 || off >= dist )) || ( dist < 0 && ( off >= 0 || off <= dist ))) exc++; } if ( nsp == sp2 && exc == 0 ) return( 1 ); return( 0 ); } /* We normalize all stem unit vectors so that they point between 90 and 270 */ /* degrees, as this range is optimal for sorting diagonal stems. This means */ /* that vertical stems will normally point top to bottom, but for diagonal */ /* stems (even if their angle is actually very close to vertical) the opposite */ /* direction is also possible. Sometimes we "normalize" such stems converting */ /* them to vertical. In such a case we have to swap their edges too. */ static void SwapEdges( struct glyphdata *gd,struct stemdata *stem ) { BasePoint tpos; struct pointdata *tpd; struct linedata *tl; struct stem_chunk *chunk; double toff; int i, j, temp; tpos = stem->left; stem->left = stem->right; stem->right = tpos; toff = stem->lmin; stem->lmin = stem->rmax; stem->rmax = toff; toff = stem->rmin; stem->rmin = stem->lmax; stem->lmax = toff; tl = stem->leftline; stem->leftline = stem->rightline; stem->rightline = tl; for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; tpd = chunk->l; chunk->l = chunk->r; chunk->r = tpd; temp = chunk->lpotential; chunk->lpotential = chunk->rpotential; chunk->rpotential = temp; temp = chunk->lnext; chunk->lnext = chunk->rnext; chunk->rnext = temp; temp = chunk->ltick; chunk->ltick = chunk->rtick; chunk->rtick = temp; tpd = chunk->l; if ( tpd != NULL ) { for ( j=0; jnextcnt; j++ ) if ( tpd->nextstems[j] == stem ) tpd->next_is_l[j] = true; for ( j=0; jprevcnt; j++ ) if ( tpd->prevstems[j] == stem ) tpd->prev_is_l[j] = true; } tpd = chunk->r; if ( tpd != NULL ) { for ( j=0; jnextcnt; j++ ) if ( tpd->nextstems[j] == stem ) tpd->next_is_l[j] = false; for ( j=0; jprevcnt; j++ ) if ( tpd->prevstems[j] == stem ) tpd->prev_is_l[j] = false; } } /* In case of a quadratic contour invert assignments to stem sides */ /* also for off-curve points */ if ( gd->order2 ) { for ( i=0; irealcnt; i++ ) if ( gd->points[i].sp == NULL ) { tpd = &gd->points[i]; for ( j=0; jnextcnt; j++ ) if ( tpd->nextstems[j] == stem ) tpd->next_is_l[j] = !tpd->next_is_l[j]; for ( j=0; jprevcnt; j++ ) if ( tpd->prevstems[j] == stem ) tpd->prev_is_l[j] = !tpd->prev_is_l[j]; } } } static int StemFitsHV( struct stemdata *stem,int is_x,uint8 mask ) { int i,cnt; double loff,roff; double lmin=0,lmax=0,rmin=0,rmax=0; struct stem_chunk *chunk; cnt = stem->chunk_cnt; for ( i=0 ; ichunk_cnt; i++ ) { if( stem->chunks[i].stub & mask ) break; } if ( i == stem->chunk_cnt ) return( false ); if ( stem->chunk_cnt == 1 ) return( true ); for ( i=0;ichunks[i]; if ( chunk->l != NULL ) { loff = ( chunk->l->sp->me.x - stem->left.x ) * !is_x - ( chunk->l->sp->me.y - stem->left.y ) * is_x; if ( loff < lmin ) lmin = loff; else if ( loff > lmax ) lmax = loff; } if ( chunk->r != NULL ) { roff = ( chunk->r->sp->me.x - stem->right.x ) * !is_x - ( chunk->r->sp->me.y - stem->right.y ) * is_x; if ( roff < rmin ) rmin = roff; else if ( roff > rmax ) rmax = roff; } } if ((( lmax - lmin ) < 2*dist_error_hv ) && (( rmax - rmin ) < 2*dist_error_hv )) return( true ); return( false ); } static int LineFitsHV( struct linedata *line ) { int i,cnt,is_x,hv; double off,min=0,max=0; struct pointdata *pd; cnt = line->pcnt; hv = IsUnitHV( &line->unit,true ); if ( hv ) return( true ); hv = IsUnitHV( &line->unit,false ); if ( !hv ) return( false ); is_x = ( hv == 1 ) ? 1 : 0; for ( i=0;ipoints[i]; off = ( pd->base.x - line->online.x ) * !is_x - ( pd->base.y - line->online.y ) * is_x; if ( off < min ) min = off; else if ( off > max ) max = off; } if (( max - min ) < 2*dist_error_hv ) return( true ); return( false ); } static int OnStem( struct stemdata *stem,BasePoint *test,int left ) { double dist_error, off; BasePoint *dir = &stem->unit; double max=0, min=0; /* Diagonals are harder to align */ dist_error = IsUnitHV( dir,true ) ? dist_error_hv : dist_error_diag; if ( !stem->positioned ) dist_error = dist_error * 2; if ( dist_error > stem->width/2 ) dist_error = stem->width/2; if ( left ) { off = (test->x - stem->left.x)*dir->y - (test->y - stem->left.y)*dir->x; max = stem->lmax; min = stem->lmin; } else { off = (test->x - stem->right.x)*dir->y - (test->y - stem->right.y)*dir->x; max = stem->rmax; min = stem->rmin; } if ( off > ( max - dist_error ) && off < ( min + dist_error ) ) return( true ); return( false ); } static int BothOnStem( struct stemdata *stem,BasePoint *test1,BasePoint *test2, int force_hv,int strict,int cove ) { double dist_error, off1, off2; BasePoint dir = stem->unit; int hv, hv_strict; double lmax=0, lmin=0, rmax=0, rmin=0; hv = ( force_hv ) ? IsUnitHV( &dir,false ) : IsUnitHV( &dir,true ); hv_strict = ( force_hv ) ? IsUnitHV( &dir,true ) : hv; if ( force_hv ) { if ( force_hv != hv ) return( false ); if ( !hv_strict && !StemFitsHV( stem,( hv == 1 ),7 )) return( false ); if ( !hv_strict ) { dir.x = ( force_hv == 2 ) ? 0 : 1; dir.y = ( force_hv == 2 ) ? 1 : 0; } } /* Diagonals are harder to align */ dist_error = ( hv ) ? dist_error_hv : dist_error_diag; if ( !strict ) { dist_error = dist_error * 2; lmax = stem->lmax; lmin = stem->lmin; rmax = stem->rmax; rmin = stem->rmin; } if ( dist_error > stem->width/2 ) dist_error = stem->width/2; off1 = (test1->x-stem->left.x)*dir.y - (test1->y-stem->left.y)*dir.x; off2 = (test2->x-stem->right.x)*dir.y - (test2->y-stem->right.y)*dir.x; if (off1 > ( lmax - dist_error ) && off1 < ( lmin + dist_error ) && off2 > ( rmax - dist_error ) && off2 < ( rmin + dist_error )) { /* For some reasons in my patch from Feb 24 2008 I prohibited snapping */ /* to stems point pairs which together form a bend, if at least */ /* one point from the pair doesn't have exactly the same position as */ /* the stem edge. Unfortunately I don't remember why I did this, but */ /* this behavior has at least one obviously negative effect: it */ /* prevents building a stem from chunks which describe an ark */ /* intersected by some straight lines, even if the intersections lie */ /* closely enough to the ark extremum. So don't apply this test */ /* at least if the force_hv flag is on (which means either the */ /* chunk or the stem itself is not exactly horizontal/vertical) */ if ( !cove || force_hv || off1 == 0 || off2 == 0 ) return( true ); } off2 = (test2->x-stem->left.x)*dir.y - (test2->y-stem->left.y)*dir.x; off1 = (test1->x-stem->right.x)*dir.y - (test1->y-stem->right.y)*dir.x; if (off2 > ( lmax - dist_error ) && off2 < ( lmin + dist_error ) && off1 > ( rmax - dist_error ) && off1 < ( rmin + dist_error )) { if ( !cove || force_hv || off1 == 0 || off2 == 0 ) return( true ); } return( false ); } static int RecalcStemOffsets( struct stemdata *stem,BasePoint *dir,int left,int right ) { double off, err; double lmin=0, lmax=0, rmin=0, rmax=0; struct stem_chunk *chunk; int i; if ( !left && !right ) return( false ); err = ( IsUnitHV( dir,true )) ? dist_error_hv : dist_error_diag; if ( stem->chunk_cnt > 1 ) for ( i=0; ichunk_cnt; i++ ) { chunk = &stem->chunks[i]; if ( left && chunk->l != NULL ) { off = ( chunk->l->sp->me.x - stem->left.x )*dir->y - ( chunk->l->sp->me.y - stem->left.y )*dir->x; if ( off < lmin ) lmin = off; else if ( off > lmax ) lmax = off; } if ( right && chunk->r != NULL ) { off = ( chunk->r->sp->me.x - stem->right.x )*dir->y + ( chunk->r->sp->me.y - stem->right.y )*dir->x; if ( off < rmin ) rmin = off; else if ( off > rmax ) rmax = off; } } if ( lmax - lmin < 2*err && rmax - rmin < 2*err ) { stem->lmin = lmin; stem->lmax = lmax; stem->rmin = rmin; stem->rmax = rmax; return( true ); } return( false ); } static void SetStemUnit( struct stemdata *stem,BasePoint dir ) { double width; width = ( stem->right.x - stem->left.x ) * dir.y - ( stem->right.y - stem->left.y ) * dir.x; if ( width < 0 ) { width = -width; dir.x = -dir.x; dir.y = -dir.y; } stem->unit = dir; stem->width = width; /* Guess at which normal we want */ stem->l_to_r.x = dir.y; stem->l_to_r.y = -dir.x; /* If we guessed wrong, use the other */ if (( stem->right.x-stem->left.x )*stem->l_to_r.x + ( stem->right.y-stem->left.y )*stem->l_to_r.y < 0 ) { stem->l_to_r.x = -stem->l_to_r.x; stem->l_to_r.y = -stem->l_to_r.y; } /* Recalculate left/right offsets relatively to new vectors */ RecalcStemOffsets( stem,&dir,true,true ); } static struct stem_chunk *AddToStem( struct glyphdata *gd,struct stemdata *stem, struct pointdata *pd1,struct pointdata *pd2,int is_next1, int is_next2, int cheat ) { int is_potential1 = false, is_potential2 = true; struct stem_chunk *chunk=NULL; BasePoint *dir = &stem->unit; BasePoint *test; int lincr = 1, rincr = 1; double off, dist_error; double loff = 0, roff = 0; double min = 0, max = 0; int i, in, ip, cpidx; struct pointdata *pd, *npd, *ppd; if ( cheat || stem->positioned ) is_potential2 = false; /* Diagonals are harder to align */ dist_error = IsUnitHV( dir,true ) ? 2*dist_error_hv : 2*dist_error_diag; if ( dist_error > stem->width/2 ) dist_error = stem->width/2; max = stem->lmax; min = stem->lmin; /* The following swaps "left" and "right" points in case we have */ /* started checking relatively to a wrong edge */ if ( pd1 != NULL ) { test = &pd1->base; off = ( test->x - stem->left.x )*dir->y - ( test->y - stem->left.y )*dir->x; if (( !stem->ghost && ( off < ( max - dist_error ) || off > ( min + dist_error ))) || ( RealNear( stem->unit.x, 1) && stem->ghost && stem->width == 21 ) || ( RealNear( stem->unit.x,0 ) && stem->ghost && stem->width == 20 )) { pd = pd1; pd1 = pd2; pd2 = pd; in = is_next1; is_next1 = is_next2; is_next2 = in; ip = is_potential1; is_potential1 = is_potential2; is_potential2 = ip; } } if ( pd1 == NULL ) lincr = 0; if ( pd2 == NULL ) rincr = 0; /* Now run through existing stem chunks and see if the chunk we are */ /* going to add doesn't duplicate an existing one.*/ for ( i=stem->chunk_cnt-1; i>=0; --i ) { chunk = &stem->chunks[i]; if ( chunk->l == pd1 ) lincr = 0; if ( chunk->r == pd2 ) rincr = 0; if (( chunk->l == pd1 || pd1 == NULL ) && ( chunk->r == pd2 || pd2 == NULL )) { if ( !is_potential1 ) chunk->lpotential = false; if ( !is_potential2 ) chunk->rpotential = false; break; } else if (( chunk->l == pd1 && chunk->r == NULL ) || ( chunk->r == pd2 && chunk->l == NULL )) { if ( chunk->l == NULL ) { chunk->l = pd1; chunk->lpotential = is_potential1; chunk->lnext = is_next1; chunk->ltick = lincr; } else if ( chunk->r == NULL ) { chunk->r = pd2; chunk->rpotential = is_potential2; chunk->rnext = is_next2; chunk->rtick = rincr; } break; } } if ( i<0 ) { stem->chunks = realloc(stem->chunks,(stem->chunk_cnt+1)*sizeof(struct stem_chunk)); chunk = &stem->chunks[stem->chunk_cnt++]; chunk->parent = stem; chunk->l = pd1; chunk->lpotential = is_potential1; chunk->r = pd2; chunk->rpotential = is_potential2; chunk->ltick = lincr; chunk->rtick = rincr; chunk->lnext = is_next1; chunk->rnext = is_next2; chunk->stemcheat = cheat; chunk->stub = chunk->is_ball = false; chunk->l_e_idx = chunk->r_e_idx = 0; } if ( pd1!=NULL ) { loff = ( pd1->base.x - stem->left.x ) * stem->l_to_r.x + ( pd1->base.y - stem->left.y ) * stem->l_to_r.y; if ( is_next1==1 || is_next1==2 || pd1->colinear ) { AssignStemToPoint( pd1,stem,true,true ); /* For quadratic layers assign the stem not only to */ /* spline points, but to their control points as well */ /* (this may be important for TTF instructions */ if ( gd->order2 && !pd1->sp->nonextcp && pd1->sp->nextcpindex < gd->realcnt ) { cpidx = pd1->sp->nextcpindex; npd = &gd->points[cpidx]; if ( OnStem( stem,&npd->base,true )) AssignStemToPoint( npd,stem,false,true ); } } if ( is_next1==0 || is_next1==2 || pd1->colinear ) { AssignStemToPoint( pd1,stem,false,true ); if ( gd->order2 && !pd1->sp->noprevcp && pd1->sp->prev != NULL && pd1->sp->prev->from->nextcpindex < gd->realcnt ) { cpidx = pd1->sp->prev->from->nextcpindex; ppd = &gd->points[cpidx]; if ( OnStem( stem,&ppd->base,true )) AssignStemToPoint( ppd,stem,true,true ); } } } if ( pd2!=NULL ) { roff = ( pd2->base.x - stem->right.x ) * stem->l_to_r.x + ( pd2->base.y - stem->right.y ) * stem->l_to_r.y; if ( is_next2==1 || is_next2==2 || pd2->colinear ) { AssignStemToPoint( pd2,stem,true,false ); if ( gd->order2 && !pd2->sp->nonextcp && pd2->sp->nextcpindex < gd->realcnt ) { cpidx = pd2->sp->nextcpindex; npd = &gd->points[cpidx]; if ( OnStem( stem,&npd->base,false )) AssignStemToPoint( npd,stem,false,false ); } } if ( is_next2==0 || is_next2==2 || pd2->colinear ) { AssignStemToPoint( pd2,stem,false,false ); if ( gd->order2 && !pd2->sp->noprevcp && pd2->sp->prev != NULL && pd2->sp->prev->from->nextcpindex < gd->realcnt ) { cpidx = pd2->sp->prev->from->nextcpindex; ppd = &gd->points[cpidx]; if ( OnStem( stem,&ppd->base,false )) AssignStemToPoint( ppd,stem,true,false ); } } } if ( loff < stem->lmin ) stem->lmin = loff; else if ( loff > stem->lmax ) stem->lmax = loff; if ( roff < stem->rmin ) stem->rmin = roff; else if ( roff > stem->rmax ) stem->rmax = roff; stem->lpcnt += lincr; stem->rpcnt += rincr; return( chunk ); } static struct stemdata *FindStem( struct glyphdata *gd,struct pointdata *pd, struct pointdata *pd2,BasePoint *dir,int is_next2,int de ) { int i, cove, test_left, hv, stemcnt; struct stemdata *stem; BasePoint newdir; stemcnt = ( is_next2 ) ? pd2->nextcnt : pd2->prevcnt; for ( i=0; inextstems[i] : pd2->prevstems[i]; test_left = ( is_next2 ) ? !pd2->next_is_l[i] : !pd2->prev_is_l[i]; if (UnitsParallel( &stem->unit,dir,true ) && OnStem( stem,&pd->sp->me,test_left )) return( stem ); } cove = ( dir->x == 0 && pd->x_extr + pd2->x_extr == 3 ) || ( dir->y == 0 && pd->y_extr + pd2->y_extr == 3 ); /* First pass to check for strict matches */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; /* Ghost hints and BBox hits are usually generated after all other */ /* hint types, but we can get them here in case we are generating */ /* glyph data for a predefined hint layout. In this case they should */ /* be excluded from the following tests */ if ( stem->ghost || stem->bbox ) continue; if ( UnitsParallel( &stem->unit,dir,true ) && BothOnStem( stem,&pd->sp->me,&pd2->sp->me,false,true,cove )) { return( stem ); } } /* One more pass. At this stage larger deviations are allowed */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->ghost || stem->bbox ) continue; if ( UnitsParallel( &stem->unit,dir,true ) && BothOnStem( stem,&pd->sp->me,&pd2->sp->me,false,false,cove )) { return( stem ); } } if ( de ) return( NULL ); hv = IsUnitHV( dir,false ); if ( !hv ) return( NULL ); for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->ghost || stem->bbox ) continue; if ( hv && BothOnStem( stem,&pd->base,&pd2->base,hv,false,cove )) { newdir.x = ( hv == 2 ) ? 0 : 1; newdir.y = ( hv == 2 ) ? 1 : 0; if ( hv == 2 && stem->unit.y < 0 ) SwapEdges( gd,stem ); if ( stem->unit.x != newdir.x ) SetStemUnit( stem,newdir ); return( stem ); } } return( NULL ); } static struct stemdata *NewStem( struct glyphdata *gd,BasePoint *dir, BasePoint *pos1, BasePoint *pos2 ) { struct stemdata * stem = &gd->stems[gd->stemcnt++]; double width; stem->unit = *dir; if ( dir->x < 0 || dir->y == -1 ) { stem->unit.x = -stem->unit.x; stem->unit.y = -stem->unit.y; } width = ( pos2->x - pos1->x ) * stem->unit.y - ( pos2->y - pos1->y ) * stem->unit.x; if ( width > 0 ) { stem->left = *pos1; stem->right = *pos2; stem->width = width; } else { stem->left = *pos2; stem->right = *pos1; stem->width = -width; } /* Guess at which normal we want */ stem->l_to_r.x = dir->y; stem->l_to_r.y = -dir->x; /* If we guessed wrong, use the other */ if (( stem->right.x-stem->left.x )*stem->l_to_r.x + ( stem->right.y-stem->left.y )*stem->l_to_r.y < 0 ) { stem->l_to_r.x = -stem->l_to_r.x; stem->l_to_r.y = -stem->l_to_r.y; } stem->leftidx = stem->rightidx = -1; stem->leftline = stem->rightline = NULL; stem->lmin = stem->lmax = 0; stem->rmin = stem->rmax = 0; stem->ldone = stem->rdone = false; stem->lpcnt = stem->rpcnt = 0; stem->chunks = NULL; stem->chunk_cnt = 0; stem->ghost = stem->bbox = false; stem->positioned = false; stem->blue = -1; return( stem ); } static int ParallelToDir( struct pointdata *pd,int checknext,BasePoint *dir, BasePoint *opposite,SplinePoint *basesp,uint8 is_stub ) { BasePoint n, o, *base = &basesp->me; SplinePoint *sp; double angle, mid_err = ( stem_slope_error + stub_slope_error )/2; sp = pd->sp; n = ( checknext ) ? pd->nextunit : pd->prevunit; angle = fabs( GetUnitAngle( dir,&n )); if (( !is_stub && angle > stem_slope_error && angle < PI - stem_slope_error ) || ( is_stub & 1 && angle > stub_slope_error*1.5 && angle < PI - stub_slope_error*1.5 ) || ( is_stub & 6 && angle > mid_err && angle < PI - mid_err )) return( false ); /* Now sp must be on the same side of the spline as opposite */ o.x = opposite->x-base->x; o.y = opposite->y-base->y; n.x = sp->me.x-base->x; n.y = sp->me.y-base->y; if ( ( o.x*dir->y - o.y*dir->x )*( n.x*dir->y - n.y*dir->x ) < 0 ) return( false ); return( true ); } static int NearlyParallel( BasePoint *dir,Spline *other, double t ) { BasePoint odir; double olen; odir.x = (3*other->splines[0].a*t+2*other->splines[0].b)*t+other->splines[0].c; odir.y = (3*other->splines[1].a*t+2*other->splines[1].b)*t+other->splines[1].c; olen = sqrt( pow( odir.x,2 ) + pow( odir.y,2 )); if ( olen==0 ) return( false ); odir.x /= olen; odir.y /= olen; return( UnitsParallel( dir,&odir,false )); } static double NormalDist( BasePoint *to, BasePoint *from, BasePoint *perp ) { double len = (to->x-from->x)*perp->y - (to->y-from->y)*perp->x; if ( len<0 ) len = -len; return( len ); } static struct stemdata *FindOrMakeHVStem( struct glyphdata *gd, struct pointdata *pd,struct pointdata *pd2,int is_h,int require_existing ) { int i,cove = false; struct stemdata *stem; BasePoint dir; dir.x = ( is_h ) ? 1 : 0; dir.y = ( is_h ) ? 0 : 1; if ( pd2 != NULL ) cove = ( dir.x == 0 && pd->x_extr + pd2->x_extr == 3 ) || ( dir.y == 0 && pd->y_extr + pd2->y_extr == 3 ); for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( IsUnitHV( &stem->unit,true ) && ( pd2 != NULL && BothOnStem( stem,&pd->sp->me,&pd2->sp->me,false,false,cove ))) break; } if ( i==gd->stemcnt ) stem=NULL; if ( stem == NULL && pd2 != NULL && !require_existing ) stem = NewStem( gd,&dir,&pd->sp->me,&pd2->sp->me ); return( stem ); } static int IsDiagonalEnd( struct glyphdata *gd, struct pointdata *pd1,struct pointdata *pd2,int is_next,int require_existing ) { /* suppose we have something like */ /* *--* */ /* \ \ */ /* \ \ */ /* Then let's create a vertical stem between the two points */ /* (and a horizontal stem if the thing is rotated 90 degrees) */ double width, length1, length2, dist1, dist2; BasePoint *pt1, *pt2, *dir1, *dir2, *prevdir1, *prevdir2; SplinePoint *prevsp1, *prevsp2; struct pointdata *prevpd1, *prevpd2; int hv; if ( pd1->colinear || pd2->colinear ) return( false ); pt1 = &pd1->sp->me; pt2 = &pd2->sp->me; /* Both key points of a diagonal end stem should have nearly the same */ /* coordinate by x or y (otherwise we can't determine by which axis */ /* it should be hinted) */ if ( pt1->x >= pt2->x - dist_error_hv && pt1->x <= pt2->x + dist_error_hv ) { width = pd1->sp->me.y - pd2->sp->me.y; hv = 1; } else if ( pt1->y >= pt2->y - dist_error_hv && pt1->y <= pt2->y + dist_error_hv ) { width = pd1->sp->me.x - pd2->sp->me.x; hv = 2; } else return( false ); dir1 = ( is_next ) ? &pd1->nextunit : &pd1->prevunit; dir2 = ( is_next ) ? &pd2->prevunit : &pd2->nextunit; if ( IsUnitHV( dir1,true )) /* Must be diagonal */ return( false ); prevsp1 = ( is_next ) ? pd1->sp->next->to : pd1->sp->prev->from; prevsp2 = ( is_next ) ? pd2->sp->prev->from : pd2->sp->next->to; prevpd1 = &gd->points[prevsp1->ptindex]; prevpd2 = &gd->points[prevsp2->ptindex]; prevdir1 = ( is_next ) ? &prevpd1->prevunit : &prevpd1->nextunit; prevdir2 = ( is_next ) ? &prevpd2->nextunit : &prevpd2->prevunit; /* Ensure we have got a real diagonal, i. e. its sides are parallel */ if ( !UnitsParallel( dir1,dir2,true ) || !UnitsParallel( prevdir1,prevdir2,true )) return( false ); /* Diagonal width should be smaller than its length */ length1 = pow(( prevsp1->me.x - pt1->x ),2 ) + pow(( prevsp1->me.y - pt1->y ),2 ); length2 = pow(( prevsp2->me.x - pt2->x ),2 ) + pow(( prevsp2->me.y - pt2->y ),2 ); if ( length2 < length1 ) length1 = length2; if ( pow( width,2 ) > length1 ) return( false ); /* Finally exclude too short diagonals where the distance between key */ /* points of one edge at the direction orthogonal to the unit vector */ /* of the stem we are about to add is smaller than normal HV stem */ /* fudge. Such diagonals may be later turned into HV stems, and we will */ /* result into getting two coincident hints */ dist1 = ( hv == 1 ) ? prevsp1->me.y - pt1->y : prevsp1->me.x - pt1->x; dist2 = ( hv == 1 ) ? prevsp2->me.y - pt2->y : prevsp2->me.x - pt2->x; if ( dist1 < 0 ) dist1 = -dist1; if ( dist2 < 0 ) dist2 = -dist2; if ( dist1 < 2*dist_error_hv && dist2 < 2*dist_error_hv ) return( false ); return( hv ); } static struct stemdata *TestStem( struct glyphdata *gd,struct pointdata *pd, BasePoint *dir,SplinePoint *match,int is_next,int is_next2,int require_existing,uint8 is_stub,int eidx ) { struct pointdata *pd2; struct stemdata *stem, *destem; struct stem_chunk *chunk; struct linedata *otherline; double width; struct linedata *line, *line2; BasePoint *mdir, middle; int de=false, hv, l_changed; width = ( match->me.x - pd->sp->me.x )*dir->y - ( match->me.y - pd->sp->me.y )*dir->x; if ( width < 0 ) width = -width; if ( width < .5 ) return( NULL ); /* Zero width stems aren't interesting */ if (( is_next && pd->sp->next->to==match ) || ( !is_next && pd->sp->prev->from==match )) return( NULL ); /* Don't want a stem between two splines that intersect */ pd2 = &gd->points[match->ptindex]; line = is_next ? pd->nextline : pd->prevline; mdir = is_next2 ? &pd2->nextunit : &pd2->prevunit; line2 = is_next2 ? pd2->nextline : pd2->prevline; if ( !IsUnitHV( mdir,true ) && line2 != NULL ) mdir = &line2->unit; if ( mdir->x==0 && mdir->y==0 ) return( NULL ); /* cannot determine the opposite point's direction */ if ( !UnitsParallel( mdir,dir,true ) && !is_stub ) return( NULL ); /* Cannot make a stem if edges are not parallel (unless it is a serif) */ if ( is_stub & 1 && !IsUnitHV( dir,true )) { /* For serifs we prefer the vector which is closer to horizontal/vertical */ middle = MiddleUnit( dir,mdir ); if ( UnitCloserToHV( &middle,dir ) == 1 && UnitCloserToHV( &middle,mdir ) == 1 ) dir = &middle; else if ( UnitCloserToHV( mdir,dir ) == 1 ) dir = mdir; if ( !IsUnitHV( dir,true ) && ( hint_diagonal_ends || require_existing )) de = IsDiagonalEnd( gd,pd,pd2,is_next,require_existing ); } stem = FindStem( gd,pd,pd2,dir,is_next2,de ); destem = NULL; if ( de ) destem = FindOrMakeHVStem( gd,pd,pd2,( de == 1 ),require_existing ); if ( stem == NULL && !require_existing ) stem = NewStem( gd,dir,&pd->sp->me,&match->me ); if ( stem != NULL ) { chunk = AddToStem( gd,stem,pd,pd2,is_next,is_next2,false ); if ( chunk != NULL ) { chunk->stub = is_stub; chunk->l_e_idx = chunk->r_e_idx = eidx; } if ( chunk != NULL && gd->linecnt > 0 ) { hv = IsUnitHV( &stem->unit,true ); /* For HV stems allow assigning a line to a stem edge only */ /* if that line also has an exactly HV vector */ if ( line != NULL && (( !hv && UnitsParallel( &stem->unit,&line->unit,true ) && RecalcStemOffsets( stem,&line->unit,true,true )) || ( hv && line->unit.x == stem->unit.x && line->unit.y == stem->unit.y ))) { otherline = NULL; l_changed = false; if (( stem->leftline == NULL || stem->leftline->length < line->length ) && chunk->l == pd ) { stem->leftline = line; l_changed = true; otherline = stem->rightline; } else if (( stem->rightline == NULL || stem->rightline->length < line->length ) && chunk->r == pd ) { stem->rightline = line; l_changed = true; otherline = stem->leftline; } /* If lines are attached to both sides of a diagonal stem, */ /* then prefer the longer line */ if ( !hv && l_changed && !stem->positioned && ( otherline == NULL || ( otherline->length < line->length ))) SetStemUnit( stem,line->unit ); } if ( line2 != NULL && (( !hv && UnitsParallel( &stem->unit,&line2->unit,true ) && RecalcStemOffsets( stem,&line2->unit,true,true )) || ( hv && line2->unit.x == stem->unit.x && line2->unit.y == stem->unit.y ))) { otherline = NULL; l_changed = false; if (( stem->leftline == NULL || stem->leftline->length < line2->length ) && chunk->l == pd2 ) { stem->leftline = line2; l_changed = true; otherline = stem->rightline; } else if (( stem->rightline == NULL || stem->rightline->length < line2->length ) && chunk->r == pd2 ) { stem->rightline = line2; l_changed = true; otherline = stem->leftline; } if ( !hv && l_changed && !stem->positioned && ( otherline == NULL || ( otherline->length < line2->length ))) SetStemUnit( stem,line2->unit ); } } } if ( destem != NULL ) AddToStem( gd,destem,pd,pd2,is_next,!is_next,1 ); return( stem ); } static double FindSameSlope(Spline *s,BasePoint *dir,double close_to) { double a, b, c, desc; double t1, t2; double d1, d2; if ( s==NULL ) return( -1e4 ); a = dir->x*s->splines[1].a*3 - dir->y*s->splines[0].a*3; b = dir->x*s->splines[1].b*2 - dir->y*s->splines[0].b*2; c = dir->x*s->splines[1].c - dir->y*s->splines[0].c ; if ( a!=0 ) { desc = b*b - 4*a*c; if ( desc<0 ) return( -1e4 ); desc = sqrt(desc); t1 = (-b+desc)/(2*a); t2 = (-b-desc)/(2*a); if ( (d1=t1-close_to)<0 ) d1 = -d1; if ( (d2=t2-close_to)<0 ) d2 = -d2; if ( d2=-.001 && t2<=1.001 ) t1 = t2; } else if ( b!=0 ) t1 = -c/b; else return( -1e4 ); return( t1 ); } /* This function is used when generating stem data for preexisting */ /* stem hints. If we already know the desired hint position, then we */ /* can safely assign to this hint any points which meet other conditions */ /* but have no corresponding position at the opposite edge. */ static int HalfStemNoOpposite( struct glyphdata *gd,struct pointdata *pd, struct stemdata *stem,BasePoint *dir,int is_next ) { int i, ret=0, allowleft, allowright, hv, corner; struct stemdata *tstem; for ( i=0; istemcnt; ++i ) { tstem = &gd->stems[i]; if ( tstem->bbox || !tstem->positioned || tstem == stem ) continue; allowleft = ( !tstem->ghost || tstem->width == 20 ); allowright = ( !tstem->ghost || tstem->width == 21 ); hv = IsUnitHV( &tstem->unit,true ); corner = (( pd->x_corner && hv == 2 ) || ( pd->y_corner && hv == 1 )); if ( UnitsParallel( &tstem->unit,dir,true ) || tstem->ghost || corner ) { if ( OnStem( tstem,&pd->sp->me,true ) && allowleft ) { if ( IsCorrectSide( gd,pd,is_next,true,&tstem->unit )) { AddToStem( gd,tstem,pd,NULL,is_next,false,false ); ret++; } } else if ( OnStem( tstem,&pd->sp->me,false ) && allowright ) { if ( IsCorrectSide( gd,pd,is_next,false,&tstem->unit )) { AddToStem( gd,tstem,NULL,pd,false,is_next,false ); ret++; } } } } return( ret ); } static struct stemdata *HalfStem( struct glyphdata *gd,struct pointdata *pd, BasePoint *dir,Spline *other,double other_t,int is_next,int eidx ) { /* Find the spot on other where the slope is the same as dir */ double t1; double width; BasePoint match; struct stemdata *stem = NULL, *tstem; struct pointdata *pd2 = NULL, *tpd; int i; t1 = FindSameSlope( other,dir,other_t ); if ( t1==-1e4 ) return( NULL ); if ( t1<0 && other->from->prev!=NULL && gd->points[other->from->ptindex].colinear ) { other = other->from->prev; t1 = FindSameSlope(other,dir,1.0); } else if ( t1>1 && other->to->next!=NULL && gd->points[other->to->ptindex].colinear ) { other = other->to->next; t1 = FindSameSlope(other,dir,0.0); } if ( t1<-.001 || t1>1.001 ) return( NULL ); /* Ok. the opposite edge has the right slope at t1 */ /* Now see if we can make a one sided stem out of these two */ match.x = ((other->splines[0].a*t1+other->splines[0].b)*t1+other->splines[0].c)*t1+other->splines[0].d; match.y = ((other->splines[1].a*t1+other->splines[1].b)*t1+other->splines[1].c)*t1+other->splines[1].d; width = (match.x-pd->sp->me.x)*dir->y - (match.y-pd->sp->me.y)*dir->x; /* offset = (match.x-pd->sp->me.x)*dir->x + (match.y-pd->sp->me.y)*dir->y;*/ if ( width<.5 && width>-.5 ) return( NULL ); /* Zero width stems aren't interesting */ if ( isnan(t1)) IError( "NaN value in HalfStem" ); if ( is_next ) { pd->nextedges[eidx] = other; pd->next_e_t[eidx] = t1; } else { pd->prevedges[eidx] = other; pd->prev_e_t[eidx] = t1; } /* In my experience the only case where this function may be useful */ /* is when it occasionally finds a real spline point which for some */ /* reasons has been neglected by other tests and yet forms a valid */ /* pair for the first point. So run through points and see if we */ /* have actually got just a position on spline midway between to points, */ /* or it is a normal point allowing to make a normal stem chunk */ for ( i=0; ipcnt; ++i ) { tpd = &gd->points[i]; if ( tpd->sp != NULL && tpd->sp->me.x == match.x && tpd->sp->me.y == match.y ) { pd2 = tpd; break; } } for ( i=0; istemcnt; ++i ) { tstem = &gd->stems[i]; if ( UnitsParallel( &tstem->unit,dir,true ) && BothOnStem( tstem,&pd->base,&match,false,false,false )) { stem = tstem; break; } } if ( stem == NULL ) stem = NewStem(gd,dir,&pd->sp->me,&match); AddToStem( gd,stem,pd,pd2,is_next,false,false ); return( stem ); } static int ConnectsAcross( struct glyphdata *gd,SplinePoint *sp, int is_next,Spline *findme,int eidx ) { struct pointdata *pd = &gd->points[sp->ptindex]; Spline *other, *test; BasePoint dir; other = ( is_next ) ? pd->nextedges[eidx] : pd->prevedges[eidx]; if ( other==findme ) return( true ); if ( other==NULL ) return( false ); dir.x = ( is_next ) ? -pd->nextunit.x : pd->prevunit.x; dir.y = ( is_next ) ? -pd->nextunit.y : pd->prevunit.y; test = other->to->next; while ( test!=NULL && test != other && gd->points[test->from->ptindex].nextunit.x * dir.x + gd->points[test->from->ptindex].nextunit.y * dir.y > 0 ) { if ( test==findme ) return( true ); test = test->to->next; } dir.x = ( is_next ) ? pd->nextunit.x : -pd->prevunit.x; dir.y = ( is_next ) ? pd->nextunit.y : -pd->prevunit.y; test = other->from->prev; while ( test!=NULL && test != other && gd->points[test->to->ptindex].prevunit.x * dir.x + gd->points[test->to->ptindex].prevunit.y * dir.y > 0 ) { if ( test==findme ) return( true ); test = test->from->prev; } return( false ); } static int ConnectsAcrossToStem( struct glyphdata *gd,struct pointdata *pd, int is_next,struct stemdata *target,int is_l,int eidx ) { Spline *other, *test; BasePoint dir; struct pointdata *tpd; int ecnt, stemidx; ecnt = ( is_next ) ? pd->next_e_cnt : pd->prev_e_cnt; if ( ecnt < eidx + 1 ) return( false ); other = ( is_next ) ? pd->nextedges[eidx] : pd->prevedges[eidx]; test = other; dir.x = ( is_next ) ? pd->nextunit.x : -pd->prevunit.x; dir.y = ( is_next ) ? pd->nextunit.y : -pd->prevunit.y; do { tpd = &gd->points[test->to->ptindex]; stemidx = IsStemAssignedToPoint( tpd,target,false ); if ( stemidx != -1 && tpd->prev_is_l[stemidx] == !is_l && IsSplinePeak( gd,tpd,rint( target->unit.y ),rint( target->unit.y ),7 )) return( true ); test = test->to->next; } while ( test!=NULL && test != other && stemidx == -1 && ( tpd->prevunit.x * dir.x + tpd->prevunit.y * dir.y >= 0 )); test = other; dir.x = ( is_next ) ? -pd->nextunit.x : pd->prevunit.x; dir.y = ( is_next ) ? -pd->nextunit.y : pd->prevunit.y; do { tpd = &gd->points[test->from->ptindex]; stemidx = IsStemAssignedToPoint( tpd,target,true ); if ( stemidx != -1 && tpd->next_is_l[stemidx] == !is_l && IsSplinePeak( gd,tpd,rint( target->unit.y ),rint( target->unit.y ),7 )) return( true ); test = test->from->prev; } while ( test!=NULL && test != other && stemidx == -1 && ( tpd->nextunit.x * dir.x + tpd->nextunit.y * dir.y >= 0 )); return( false ); } static double RecalcT( Spline *base,SplinePoint *from, SplinePoint *to, double curt ) { double baselen, fromlen, tolen, ret; Spline *cur; baselen = SplineLength( base ); fromlen = baselen * curt; tolen = baselen * ( 1 - curt ); cur = base->from->prev; while ( cur != NULL && cur->to != from ) { fromlen += SplineLength( cur ); cur = cur->from->prev; } cur = base->to->next; while ( cur!= NULL && cur->from != to ) { tolen += SplineLength( cur ); cur = cur->to->next; } ret = fromlen/( fromlen + tolen ); return( ret ); } static int BuildStem( struct glyphdata *gd,struct pointdata *pd,int is_next, int require_existing,int has_existing,int eidx ) { BasePoint *dir; Spline *other, *cur; double t; double tod, fromd, dist; SplinePoint *testpt, *topt, *frompt; struct linedata *line; struct pointdata *testpd, *topd, *frompd; int tp, fp, t_needs_recalc=false, ret=0; uint8 tstub=0, fstub=0; BasePoint opposite; struct stemdata *stem=NULL; if ( is_next ) { dir = &pd->nextunit; other = pd->nextedges[eidx]; cur = pd->sp->next; t = pd->next_e_t[eidx]; dist = pd->next_dist[eidx]; } else { dir = &pd->prevunit; other = pd->prevedges[eidx]; cur = pd->sp->prev; t = pd->prev_e_t[eidx]; dist = pd->prev_dist[eidx]; } topt = other->to; frompt = other->from; topd = &gd->points[topt->ptindex]; frompd = &gd->points[frompt->ptindex]; line = is_next ? pd->nextline : pd->prevline; if ( !IsUnitHV( dir,true ) && line != NULL) dir = &line->unit; if ( other==NULL ) return( 0 ); opposite.x = ((other->splines[0].a*t+other->splines[0].b)*t+other->splines[0].c)*t+other->splines[0].d; opposite.y = ((other->splines[1].a*t+other->splines[1].b)*t+other->splines[1].c)*t+other->splines[1].d; if ( eidx == 0 ) tstub = IsStubOrIntersection( gd,dir,pd,topd,is_next,false ); if ( eidx == 0 ) fstub = IsStubOrIntersection( gd,dir,pd,frompd,is_next,true ); tp = ParallelToDir( topd,false,dir,&opposite,pd->sp,tstub ); fp = ParallelToDir( frompd,true,dir,&opposite,pd->sp,fstub ); /* if none of the opposite points is parallel to the needed vector, then */ /* give it one more chance by skipping those points and looking at the next */ /* and previous one. This can be useful in situations where the opposite */ /* edge cannot be correctly detected just because there are too many points */ /* on the spline (which is a very common situation for poorly designed */ /* fonts or fonts with quadratic splines). */ /* But do that only for colinear spline segments and ensure that there are */ /* no bends between two splines. */ if ( !tp && ( !fp || t > 0.5 ) && topd->colinear && &other->to->next != NULL ) { testpt = topt->next->to; testpd = &gd->points[testpt->ptindex]; BasePoint *initdir = &topd->prevunit; while ( !tp && topd->colinear && pd->sp != testpt && other->from != testpt && ( testpd->prevunit.x * initdir->x + testpd->prevunit.y * initdir->y > 0 )) { topt = testpt; topd = testpd; tp = ParallelToDir( topd,false,dir,&opposite,pd->sp,false ); testpt = topt->next->to; testpd = &gd->points[testpt->ptindex]; } if ( tp ) t_needs_recalc = true; } if ( !fp && ( !fp || t < 0.5 ) && frompd->colinear && &other->from->prev != NULL ) { testpt = frompt->prev->from; testpd = &gd->points[testpt->ptindex]; BasePoint *initdir = &frompd->prevunit; while ( !fp && frompd->colinear && pd->sp != testpt && other->to != testpt && ( testpd->prevunit.x * initdir->x + testpd->prevunit.y * initdir->y > 0 )) { frompt = testpt; frompd = testpd; fp = ParallelToDir( frompd,true,dir,&opposite,pd->sp,false ); testpt = frompt->prev->from; testpd = &gd->points[testpt->ptindex]; } if ( fp ) t_needs_recalc = true; } if ( t_needs_recalc ) t = RecalcT( other,frompt,topt,t ); if ( !tp && !fp ) { if ( has_existing ) ret = HalfStemNoOpposite( gd,pd,NULL,dir,is_next ); return( ret ); } /* We have several conflicting metrics for getting the "better" stem */ /* Generally we prefer the stem with the smaller width (but not always. See tilde) */ /* Generally we prefer the stem formed by the point closer to the intersection */ tod = (1-t)*NormalDist( &topt->me,&pd->sp->me,dir ); fromd = t*NormalDist( &frompt->me,&pd->sp->me,dir ); if ( tp && (( todprev_dist[eidx] || ConnectsAcross( gd,frompt,true,cur,eidx ) || NearlyParallel( dir,other,t ))))) { stem = TestStem( gd,pd,dir,topt,is_next,false,require_existing,tstub,eidx ); } if ( stem == NULL && fp && (( fromdnext_dist[eidx] || ConnectsAcross( gd,topt,false,cur,eidx ) || NearlyParallel( dir,other,t ))))) { stem = TestStem( gd,pd,dir,frompt,is_next,true,require_existing,fstub,eidx ); } if ( eidx == 0 && stem == NULL && !require_existing && cur!=NULL && !other->knownlinear && !cur->knownlinear ) stem = HalfStem( gd,pd,dir,other,t,is_next,eidx ); if ( stem != NULL ) ret = 1; if ( has_existing ) ret += HalfStemNoOpposite( gd,pd,stem,dir,is_next ); return( ret ); } static void AssignLinePointsToStems( struct glyphdata *gd ) { struct pointdata *pd; struct stemdata *stem; struct linedata *line; struct stem_chunk *chunk; int i, j, stem_hv, line_hv, needs_hv=false; for ( i=0; istemcnt; ++i ) if ( !gd->stems[i].toobig ) { stem = &gd->stems[i]; stem_hv = IsUnitHV( &stem->unit,true ); needs_hv = ( stem_hv || ( stem->chunk_cnt == 1 && stem->chunks[0].stub && IsUnitHV( &stem->unit,false ))); if ( stem->leftline != NULL ) { line = stem->leftline; line_hv = ( needs_hv && LineFitsHV( line )); if ( needs_hv && !line_hv ) stem->leftline = NULL; else { for ( j=0; jpcnt; j++ ) { pd = line->points[j]; if ( pd->prevline == line && OnStem( stem,&pd->base,true ) && IsStemAssignedToPoint( pd,stem,false ) == -1) { chunk = AddToStem( gd,stem,pd,NULL,false,false,false ); chunk->lpotential = true; } if ( pd->nextline == line && OnStem( stem,&pd->base,true ) && IsStemAssignedToPoint( pd,stem,true ) == -1 ) { chunk = AddToStem( gd,stem,pd,NULL,true,false,false ); chunk->lpotential = true; } } } } if ( stem->rightline != NULL ) { line = stem->rightline; line_hv = ( needs_hv && LineFitsHV( line )); if ( needs_hv && !line_hv ) stem->rightline = NULL; else { for ( j=0; jpcnt; j++ ) { pd = line->points[j]; if ( pd->prevline == line && OnStem( stem,&pd->base,false ) && IsStemAssignedToPoint( pd,stem,false ) == -1 ) { chunk = AddToStem( gd,stem,NULL,pd,false,false,false ); chunk->rpotential = true; } if ( pd->nextline == line && OnStem( stem,&pd->base,false ) && IsStemAssignedToPoint( pd,stem,true ) == -1 ) { chunk = AddToStem( gd,stem,NULL,pd,false,true,false ); chunk->rpotential = true; } } } } } } static struct stemdata *DiagonalCornerStem( struct glyphdata *gd, struct pointdata *pd,int require_existing ) { Spline *other = pd->bothedge; struct pointdata *pfrom = NULL, *pto = NULL, *pd2 = NULL; double width, length; struct stemdata *stem; pfrom = &gd->points[other->from->ptindex]; pto = &gd->points[other->to->ptindex]; if ( pd->symetrical_h && pto->symetrical_h && pd->both_e_t>.9 ) pd2 = pto; else if ( pd->symetrical_h && pfrom->symetrical_h && pd->both_e_t<.1 ) pd2 = pfrom; else if ( pd->symetrical_v && pto->symetrical_v && pd->both_e_t>.9 ) pd2 = pto; else if ( pd->symetrical_v && pfrom->symetrical_v && pd->both_e_t<.1 ) pd2 = pfrom; else if ( pd->symetrical_h && other->islinear && other->splines[1].c==0 ) { pd2 = pfrom; } else if ( pd->symetrical_v && other->islinear && other->splines[0].c==0 ) { pd2 = pfrom; } else return( NULL ); if ( pd->symetrical_v ) width = (pd->sp->me.x-pd2->sp->me.x); else width = (pd->sp->me.y-pd2->sp->me.y); length = (pd->sp->next->to->me.x-pd->sp->me.x)*(pd->sp->next->to->me.x-pd->sp->me.x) + (pd->sp->next->to->me.y-pd->sp->me.y)*(pd->sp->next->to->me.y-pd->sp->me.y); if ( width*width>length ) return( NULL ); stem = FindOrMakeHVStem(gd,pd,pd2,pd->symetrical_h,require_existing); return( stem ); } static int chunk_cmp( const void *_p1, const void *_p2 ) { const struct stem_chunk *ch1 = _p1, *ch2 = _p2; struct stemdata *stem; double loff1=0,roff1=0,loff2=0,roff2=0; stem = ch1->parent; if ( stem==NULL ) return( 0 ); if ( ch1->l != NULL ) loff1 = ( ch1->l->sp->me.x - stem->left.x ) * stem->unit.x + ( ch1->l->sp->me.y - stem->left.y ) * stem->unit.y; if ( ch1->r != NULL ) roff1 = ( ch1->r->sp->me.x - stem->right.x ) * stem->unit.x + ( ch1->r->sp->me.y - stem->right.y ) * stem->unit.y; if ( ch2->l != NULL ) loff2 = ( ch2->l->sp->me.x - stem->left.x ) * stem->unit.x + ( ch2->l->sp->me.y - stem->left.y ) * stem->unit.y; if ( ch2->r != NULL ) roff2 = ( ch2->r->sp->me.x - stem->right.x ) * stem->unit.x + ( ch2->r->sp->me.y - stem->right.y ) * stem->unit.y; if ( loff1>loff2 ) return( 1 ); else if ( loff1roff2 ) return( 1 ); else if ( roff1unit.x ) > fabs( (*st1)->unit.y )) { start1 = (*st1)->right.y; end1 = (*st1)->left.y; start2 = (*st2)->right.y; end2 = (*st2)->left.y; } else { start1 = (*st1)->left.x; end1 = (*st1)->right.x; start2 = (*st2)->left.x; end2 = (*st2)->right.x; } if ( start1 > start2 ) return( 1 ); else if ( start1 < start2 ) return( -1 ); else { if ( end1 > end2 ) return( 1 ); else if ( end1 < end2 ) return( -1 ); else return( 0 ); } } static void FixupT( struct pointdata *pd,int stemidx,int isnext, int eidx ) { /* When we calculated "next/prev_e_t" we deliberately did not use pd1->me */ /* (because things get hard at intersections) so our t is only an approx-*/ /* imation. We can do a lot better now */ Spline *s; Spline myline; SplinePoint end1, end2; double width,t,sign, len, dot; BasePoint pts[9]; extended lts[10], sts[10]; BasePoint diff; struct stemdata *stem ; if ( pd == NULL || stemidx == -1 ) return; stem = ( isnext ) ? pd->nextstems[stemidx] : pd->prevstems[stemidx]; width = ( stem->right.x - stem->left.x )*stem->unit.y - ( stem->right.y-stem->left.y )*stem->unit.x; s = ( isnext ) ? pd->nextedges[eidx] : pd->prevedges[eidx]; if ( s==NULL ) return; diff.x = s->to->me.x-s->from->me.x; diff.y = s->to->me.y-s->from->me.y; if ( diff.x<.001 && diff.x>-.001 && diff.y<.001 && diff.y>-.001 ) return; /* Zero length splines give us NaNs */ len = sqrt( pow( diff.x,2 ) + pow( diff.y,2 )); dot = ( diff.x*stem->unit.x + diff.y*stem->unit.y )/len; if ( dot < .0004 && dot > -.0004 ) return; /* It's orthogonal to our stem */ if (( stem->unit.x==1 || stem->unit.x==-1 ) && s->knownlinear ) t = (pd->sp->me.x-s->from->me.x)/(s->to->me.x-s->from->me.x); else if (( stem->unit.y==1 || stem->unit.y==-1 ) && s->knownlinear ) t = (pd->sp->me.y-s->from->me.y)/(s->to->me.y-s->from->me.y); else { memset(&myline,0,sizeof(myline)); memset(&end1,0,sizeof(end1)); memset(&end2,0,sizeof(end2)); sign = (( isnext && pd->next_is_l[stemidx] ) || ( !isnext && pd->prev_is_l[stemidx] )) ? 1 : -1; myline.knownlinear = myline.islinear = true; end1.me = pd->sp->me; end2.me.x = pd->sp->me.x+1.1*sign*width*stem->l_to_r.x; end2.me.y = pd->sp->me.y+1.1*sign*width*stem->l_to_r.y; end1.nextcp = end1.prevcp = end1.me; end2.nextcp = end2.prevcp = end2.me; end1.nonextcp = end1.noprevcp = end2.nonextcp = end2.noprevcp = true; end1.next = &myline; end2.prev = &myline; myline.from = &end1; myline.to = &end2; myline.splines[0].d = end1.me.x; myline.splines[0].c = end2.me.x-end1.me.x; myline.splines[1].d = end1.me.y; myline.splines[1].c = end2.me.y-end1.me.y; if ( SplinesIntersect(&myline,s,pts,lts,sts)<=0 ) return; t = sts[0]; } if ( isnan(t)) IError( "NaN value in FixupT" ); if ( isnext ) pd->next_e_t[eidx] = t; else pd->prev_e_t[eidx] = t; } /* flags: 1 -- accept curved extrema, 2 -- accept angles, */ /* 4 -- analyze segments (not just single points) */ static int IsSplinePeak( struct glyphdata *gd,struct pointdata *pd, int outer,int is_x,int flags ) { double base, next, prev, nextctl, prevctl, unit_p, unit_n; Spline *s, *snext, *sprev; struct monotonic **space, *m; int wprev, wnext, i, desired; SplinePoint *sp = pd->sp; base = ((real *) &sp->me.x)[!is_x]; nextctl = sp->nonextcp ? base : ((real *) &sp->nextcp.x)[!is_x]; prevctl = sp->noprevcp ? base : ((real *) &sp->prevcp.x)[!is_x]; next = prev = base; snext = sp->next; sprev = sp->prev; if ( snext->to == NULL || sprev->from == NULL ) return( false ); if (!( flags & 2) && ( sp->nonextcp || sp->noprevcp )) return( false ); else if (!( flags & 1 ) && ( pd->colinear )) return( false ); if ( flags & 4 ) { while ( snext->to->next != NULL && snext->to != sp && next == base ) { next = ((real *) &snext->to->me.x)[!is_x]; snext = snext->to->next; } while ( sprev->from->prev != NULL && sprev->from != sp && prev == base ) { prev = ((real *) &sprev->from->me.x)[!is_x]; sprev = sprev->from->prev; } } else { next = ((real *) &snext->to->me.x)[!is_x]; prev = ((real *) &sprev->from->me.x)[!is_x]; } if ( prevbase && next>base && prevctl>=base && nextctl>=base ) desired = ( outer ) ? 1 : -1; else return( false ); MonotonicFindAt( gd->ms,is_x,((real *) &sp->me.x)[is_x],space = gd->space ); wprev = wnext = 0; for ( i=0; space[i]!=NULL; ++i ) { m = space[i]; s = m->s; if ( s->from == sp ) wnext = ((&m->xup)[is_x] ? 1 : -1 ); else if ( s->to == sp ) wprev = ((&m->xup)[is_x] ? 1 : -1 ); } if ( wnext != 0 && wprev != 0 && wnext != wprev ) { unit_p = (&pd->prevunit.x)[!is_x]; unit_n = (&pd->nextunit.x)[!is_x]; if ( unit_p < unit_n && ( ( outer && wprev == 1 ) || ( !outer && wprev == -1 ))) return( desired ); else if ( unit_p > unit_n && ( ( outer && wnext == 1 ) || ( !outer && wnext == -1 ))) return( desired ); } else { if ( wnext == desired || wprev == desired ) return( desired ); } return( false ); } static struct pointdata *FindClosestOpposite( struct stemdata *stem,struct stem_chunk **chunk,SplinePoint *sp,int *next ) { struct pointdata *pd, *ret=NULL; struct stem_chunk *testchunk; double test, proj=1e4; int i, is_l; for ( i=0; ichunk_cnt; ++i ) { testchunk = &stem->chunks[i]; pd = NULL; if ( testchunk->l != NULL && testchunk->l->sp==sp ) { pd = testchunk->r; is_l = false; } else if ( testchunk->r != NULL && testchunk->r->sp==sp ) { pd = testchunk->l; is_l = true; } if ( pd != NULL ) { test = ( pd->sp->me.x-sp->me.x ) * stem->unit.x + ( pd->sp->me.y-sp->me.y ) * stem->unit.y; if ( test < 0 ) test = -test; if ( test < proj ) { ret = pd; proj = test; *chunk = testchunk; } } } if ( ret != NULL ) *next = ( is_l ) ? (*chunk)->lnext : (*chunk)->rnext; return( ret ); } static int ValueChunk( struct glyphdata *gd,struct vchunk *vchunks, int chcnt,int idx,int l_base ) { int peak1=0, peak2=0, val=0; int i, is_x, base_next, opp_next; struct pointdata *base, *opp, *frompd, *topd; struct stem_chunk *chunk = vchunks[idx].chunk, *tchunk; struct stemdata *stem = chunk->parent; double norm, dist; Spline *sbase, *sopp, *other; /* If a stem was already present before generating glyph data, */ /* then it should always be preferred in case of a conflict */ if ( stem->positioned || chunk->stemcheat ) val++; if ( l_base ) { base = chunk->l; opp = chunk->r; base_next = chunk->lnext; opp_next = chunk->rnext; } else { base = chunk->r; opp = chunk->l; base_next = chunk->rnext; opp_next = chunk->lnext; } sbase = ( base_next ) ? base->sp->next : base->sp->prev; sopp = ( opp_next ) ? opp->sp->next : opp->sp->prev; other = ( opp_next ) ? opp->nextedges[0] : opp->prevedges[0]; /* If there are 2 conflicting chunks belonging to different stems but */ /* based on the same point, then we have to decide which stem is "better" */ /* for that point. We compare stems (or rather chunks) by assigning a */ /* value to each of them and then prefer the stem whose value is positive. */ /* A chunk gets a +1 value bonus in the following cases: */ /* - The stem is vertical/horizontal and splines are curved in the same */ /* direction at both sides of the chunk; */ /* - A stem has both its width and the distance between the opposite points */ /* smaller than another stem; */ /* - The common side of two stems is a straight line formed by two points */ /* and the opposite point can be projected to line segment between those */ /* two points. */ if ( IsUnitHV( &stem->unit,true ) && !sbase->knownlinear ) { is_x = (int) rint( stem->unit.y ); peak1 = ( is_x ) ? base->x_extr : base->y_extr; peak2 = ( is_x ) ? opp->x_extr : opp->y_extr; dist = ( base->base.x - opp->base.x )*stem->unit.x + ( base->base.y - opp->base.y )*stem->unit.y; /* Are there any stems attached to the same base point which */ /* are narrower than the distance between two points forming the */ /* given chunk? */ for ( i=0; il == NULL || chunk->r == NULL ) continue; norm = tchunk->parent->width; if ( norm < fabs( dist )) break; } /* If both points are curved in the same direction, then check also */ /* the "line of sight" between those points (if there are interventing */ /* splines, then it is not a real feature bend)*/ if ( i == chcnt && peak1 + peak2 == 3 && ConnectsAcross( gd,base->sp,opp_next,sopp,0 )) val++; } frompd = &gd->points[sbase->from->ptindex]; topd = &gd->points[sbase->to->ptindex]; if (IsStemAssignedToPoint( frompd,stem,true ) != -1 && IsStemAssignedToPoint( topd,stem,false ) != -1 ) if ( other == sbase ) val++; dist = vchunks[idx].dist; for ( i=0; iparent->width <= stem->width ) break; } if ( i==chcnt ) val++; /* If just one of the checked chunks has both its sides parallel */ /* to the stem direction, then we consider it is always worth to be output. */ /* This check was introduced to avoid situations where a stem marking */ /* a feature termination can be preferred to another stem which controls */ /* the main part of the same feature */ if ( vchunks[idx].parallel ) { for ( i=0; inextcnt : pd->prevcnt; stems = ( is_next ) ? pd->nextstems : pd->prevstems; vchunks = calloc( stemcnt,sizeof( VChunk )); for ( i=0; inext_is_l[i] : pd->prev_is_l[i]; FindClosestOpposite( stems[i],&vchunks[i].chunk,pd->sp,&next1 ); if ( vchunks[i].chunk == NULL ) continue; cur = vchunks[i].chunk; if ( vchunks[i].value > 0 ) val_cnt++; vchunks[i].dist = pow( cur->l->base.x - cur->r->base.x,2 ) + pow( cur->l->base.y - cur->r->base.y,2 ); lunit = ( cur->lnext ) ? &cur->l->nextunit : &cur->l->prevunit; runit = ( cur->rnext ) ? &cur->r->nextunit : &cur->r->prevunit; vchunks[i].parallel = UnitsParallel( lunit,&stems[i]->unit,2 ) && UnitsParallel( runit,&stems[i]->unit,2 ); } for ( i=0; i 0 ) { for ( i=0; inext_is_l[i] : pd->prev_is_l[i]; val = vchunks[i].value; for ( j=0; jchunk_cnt; j++ ) { cur = &stems[i]->chunks[j]; if ( is_l && cur->l == pd ) { if ( val > 0 ) cur->lpotential = false; else cur->lpotential = true; } else if ( !is_l && cur->r == pd ) { if ( val > 0 ) cur->rpotential = false; else cur->rpotential = true; } } } } free( vchunks ); } static int StemIsActiveAt( struct glyphdata *gd,struct stemdata *stem,double stempos ) { BasePoint pos,cpos,mpos; int which; double test; double lmin, lmax, rmin, rmax, loff, roff, minoff, maxoff; struct monotonic **space, *m; int winding, nw, closest, i, j; pos.x = stem->left.x + stempos*stem->unit.x; pos.y = stem->left.y + stempos*stem->unit.y; if ( IsUnitHV( &stem->unit,true )) { which = stem->unit.x==0; MonotonicFindAt(gd->ms,which,((real *) &pos.x)[which],space = gd->space); test = ((real *) &pos.x)[!which]; lmin = ( stem->lmax - 2*dist_error_hv < -dist_error_hv ) ? stem->lmax - 2*dist_error_hv : -dist_error_hv; lmax = ( stem->lmin + 2*dist_error_hv > dist_error_hv ) ? stem->lmin + 2*dist_error_hv : dist_error_hv; rmin = ( stem->rmax - 2*dist_error_hv < -dist_error_hv ) ? stem->rmax - 2*dist_error_hv : -dist_error_hv; rmax = ( stem->rmin + 2*dist_error_hv > dist_error_hv ) ? stem->rmin + 2*dist_error_hv : dist_error_hv; minoff = test + ( lmin * stem->unit.y - lmax * stem->unit.x ); maxoff = test + ( lmax * stem->unit.y - lmin * stem->unit.x ); winding = 0; closest = -1; for ( i=0; space[i]!=NULL; ++i ) { m = space[i]; nw = ((&m->xup)[which] ? 1 : -1 ); if ( m->other >= minoff && m->other <= maxoff && nw == 1 ) { closest = i; break; } else if ( m->other > maxoff ) break; winding += nw; } if ( closest < 0 ) return( false ); cpos.x = ( which ) ? m->other : pos.x ; cpos.y = ( which ) ? pos.y : m->other ; loff = ( cpos.x - stem->left.x ) * stem->unit.y - ( cpos.y - stem->left.y ) * stem->unit.x; if ( loff > lmax || loff < lmin ) return( false ); j = MatchWinding(space,i,nw,winding,which,0); if ( j==-1 ) return( false ); m = space[j]; mpos.x = ( which ) ? m->other : pos.x ; mpos.y = ( which ) ? pos.y : m->other ; roff = ( mpos.x - stem->right.x ) * stem->unit.y - ( mpos.y - stem->right.y ) * stem->unit.x; if ( roff >= rmin && roff <= rmax ) return( true ); return( false ); } else { return( StillStem( gd,dist_error_diag,&pos,stem )); } } /* This function is used to check the distance between a hint's edge */ /* and a spline and determine the extet where this hint can be */ /* considered "active". */ static int WalkSpline( struct glyphdata *gd, struct pointdata *pd,int gonext, struct stemdata *stem,int is_l,int force_ac,BasePoint *res ) { int i, curved; double off, dist, min, max; double incr, err; double t, ratio, width; Spline *s; BasePoint *base, *nunit, pos, good; SplinePoint *sp, *nsp; struct pointdata *npd; err = ( IsUnitHV( &stem->unit,true )) ? dist_error_hv : dist_error_diag; width = stem->width; ratio = gd->emsize/( 6 * width ); if ( err > width/2) err = width/2; sp = pd->sp; base = ( is_l ) ? &stem->left : &stem->right; min = ( is_l ) ? stem->lmax - 2*err : stem->rmax - 2*err; max = ( is_l ) ? stem->lmin + 2*err : stem->rmin + 2*err; s = ( gonext ) ? sp->next : sp->prev; nsp = ( gonext ) ? s->to : s->from; npd = &gd->points[nsp->ptindex]; nunit = ( gonext ) ? &npd->prevunit : &npd->nextunit; good = sp->me; off = ( nsp->me.x - base->x )*stem->l_to_r.x + ( nsp->me.y - base->y )*stem->l_to_r.y; /* Some splines have tiny control points and are almost flat */ /* think of them as lines then rather than treating them as curves */ /* figure out how long they remain within a few orthoganal units of */ /* the point */ /* We used to check the distance between a control point and a spline */ /* and consider the segment "flat" if this distance is smaller than */ /* the normal allowed "error" value. However this method doesn't produce */ /* consistent results if the spline is not long enough (as usual for */ /* fonts with quadratic splines). So now we consider a spline "flat" */ /* only if it never deviates too far from the hint's edge and both */ /* its terminal points are snappable to the same hint */ curved = ( IsStemAssignedToPoint( npd,stem,gonext ) == -1 && ( off < min || off > max || !UnitsParallel( &stem->unit,nunit,true ))); /* If a spline does deviate from the edge too far to consider it flat, */ /* then we calculate the extent where the spline and the edge are still */ /* close enough to consider the hint active at this zone. If the hint is */ /* still active at the end of the spline, we can check some subsequent splines */ /* too. This method produces better effect than any "magic" manipulations */ /* with control point coordinates, because it takes into account just the */ /* spline configuration rather than point positions */ if ( curved ) { max = err = dist_error_curve; min = -dist_error_curve; /* The following statement forces our code to detect an active zone */ /* even if all checks actually fail. This makes sense for stems */ /* marking arks and bends */ if ( force_ac ) good = ( gonext ) ? sp->nextcp : sp->prevcp; /* If a spline is closer to the opposite stem edge than to the current edge, then we */ /* can no longer consider the stem active at this point */ if ( err > width/2 ) err = width/2; t = ( gonext ) ? 0.9999 : 0.0001; for ( ; ; s = ( gonext ) ? s->to->next : s->from->prev ) { pos.x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; pos.y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; off = ( pos.x - base->x )*stem->l_to_r.x + ( pos.y - base->y )*stem->l_to_r.y; dist = ( pos.x - sp->me.x )*stem->unit.x + ( pos.y - sp->me.y )*stem->unit.y; nsp = ( gonext ) ? s->to : s->from; npd = &gd->points[nsp->ptindex]; if (fabs( off ) < max && fabs( dist ) <= ( width + width * ratio ) && nsp != sp && npd->colinear && !npd->x_extr && !npd->y_extr && StillStem( gd,err,&pos,stem )) good = pos; else break; } } t = .5; incr = ( gonext ) ? .25 : -.25; for ( i=0; i<6; ++i ) { pos.x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; pos.y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; off = ( pos.x - base->x )*stem->l_to_r.x + ( pos.y - base->y )*stem->l_to_r.y; dist = ( pos.x - sp->me.x )*stem->unit.x + ( pos.y - sp->me.y )*stem->unit.y; /* Don't check StillStem for non-curved segments, as they are subject */ /* to further projection-related tests anyway */ if ( off > min && off < max && ( !curved || ( fabs( dist ) < ( width + width * ratio ) && StillStem( gd,err,&pos,stem )))) { good = pos; t += incr; } else t -= incr; incr/=2; } *res = good; return( curved ); } static int AdjustForImperfectSlopeMatch( SplinePoint *sp,BasePoint *pos, BasePoint *newpos,struct stemdata *stem,int is_l ) { double poff, err, min, max; BasePoint *base; base = ( is_l ) ? &stem->left : &stem->right; err = ( IsUnitHV( &stem->unit,true )) ? dist_error_hv : dist_error_diag; min = ( is_l ) ? stem->lmax - 2*err : stem->rmax - 2*err; max = ( is_l ) ? stem->lmin + 2*err : stem->rmin + 2*err; /* Possible if the stem unit has been attached to a line. It is */ /* hard to prevent this */ if ( min > max ) { min = stem->lmin; max = stem->lmax; } poff = ( pos->x - base->x )*stem->l_to_r.x + ( pos->y - base->y )*stem->l_to_r.y; if ( poff > min && poff < max ) { *newpos = *pos; return( false ); } else if ( poff <= min ) err = fabs( min ); else if ( poff >= max ) err = fabs( max ); newpos->x = sp->me.x + err*( pos->x - sp->me.x )/fabs( poff ); newpos->y = sp->me.y + err*( pos->y - sp->me.y )/fabs( poff ); return( true ); } static int AddLineSegment( struct stemdata *stem,struct segment *space,int cnt, int is_l,struct pointdata *pd,int base_next,struct glyphdata *gd ) { double s, e, t, dot; BasePoint stemp, etemp; BasePoint *start, *end, *par_unit; int same_dir, corner = 0, par; int scurved = false, ecurved = false, c, hv; SplinePoint *sp, *psp, *nsp; double b; uint8 extr; if ( pd==NULL || (sp = pd->sp)==NULL || sp->ticked || sp->next==NULL || sp->prev==NULL ) return( cnt ); end = &sp->me; start = &sp->me; par_unit = ( base_next ) ? &pd->nextunit : &pd->prevunit; /* Do the spline and the stem unit point in the same direction ? */ dot = ( stem->unit.x * par_unit->x ) + ( stem->unit.y * par_unit->y ); same_dir = (( dot > 0 && base_next ) || ( dot < 0 && !base_next )); if ( stem->unit.x == 1 ) corner = pd->y_corner; else if ( stem->unit.y == 1 ) corner = pd->x_corner; dot = ( stem->unit.x * pd->nextunit.x ) + ( stem->unit.y * pd->nextunit.y ); /* We used to apply normal checks only if the point's unit vector pointing */ /* in the direction we are going to check is nearly parallel to the stem unit. */ /* But this is not the best method, because a spline, "parallel" to our */ /* stem, may actually have filled space at a wrong side. On the other hand, */ /* sometimes it makes sense to calculate active space even for splines */ /* connected to our base point under an angle which is too large to consider */ /* the direction "parallel". So now we check the units' direction first */ /* and then (just for straight splines) also their parallelity. */ if (( dot > 0 && same_dir ) || ( dot < 0 && !same_dir )) { /* If the segment sp-start doesn't have exactly the right slope, then */ /* we can only use that bit of it which is less than a standard error */ par = UnitsParallel( &stem->unit,&pd->nextunit,0 ); if ( !sp->next->knownlinear ) { ecurved = WalkSpline( gd,pd,true,stem,is_l,par,&etemp ); /* Can merge, but treat as curved relatively to projections */ if ( !ecurved ) ecurved = 2; end = &etemp; } else if ( par || corner ) { nsp = sp->next->to; ecurved = AdjustForImperfectSlopeMatch( sp,&nsp->me,&etemp,stem,is_l ); end = &etemp; } } dot = ( stem->unit.x * pd->prevunit.x ) + ( stem->unit.y * pd->prevunit.y ); if (( dot < 0 && same_dir ) || ( dot > 0 && !same_dir )) { par = UnitsParallel( &stem->unit,&pd->prevunit,0 ); if ( !sp->prev->knownlinear ) { scurved = WalkSpline( gd,pd,false,stem,is_l,par,&stemp ); if ( !scurved ) scurved = 2; start = &stemp; } else if ( par || corner ) { psp = sp->prev->from; scurved = AdjustForImperfectSlopeMatch( sp,&psp->me,&stemp,stem,is_l ); start = &stemp; } } sp->ticked = true; s = (start->x-stem->left.x)*stem->unit.x + (start->y-stem->left.y)*stem->unit.y; e = ( end->x-stem->left.x)*stem->unit.x + ( end->y-stem->left.y)*stem->unit.y; b = (sp->me.x-stem->left.x)*stem->unit.x + (sp->me.y-stem->left.y)*stem->unit.y; if ( s == e ) return( cnt ); if ( s > e ) { t = s; c = scurved; s = e; e = t; scurved = ecurved; ecurved = c; } space[cnt].start = s; space[cnt].end = e; space[cnt].sbase = space[cnt].ebase = b; space[cnt].scurved = scurved; space[cnt].ecurved = ecurved; hv = IsUnitHV( &stem->unit,true ); if ( hv ) { /* For vertical/horizontal stems we assign a special meaning to */ /* the 'curved' field. It will be non-zero if the key point of */ /* this segment is positioned on a prominent curve: */ /* 1 if the inner side of that curve is inside of the contour */ /* and 2 otherwise. */ /* Later, if we get a pair of "inner" and "outer" curves, then */ /* we are probably dealing with a feature's bend which should be */ /* necessarily marked with a hint. Checks we apply for this type */ /* of curved segments should be less strict than in other cases. */ extr = ( hv == 1 ) ? pd->y_extr : pd->x_extr; space[cnt].curved = extr; } else { /* For diagonal stems we consider a segment "curved" if both its */ /* start and end are curved. Curved segments usually cannot be */ /* merged (unless scurved or ecurved is equal to 2) and are not */ /* checked for "projections". */ space[cnt].curved = scurved && ecurved; } return( cnt+1 ); } static int InActive(double projection,struct segment *segments, int cnt) { int i; for ( i=0; i=segments[i].start && projection<=segments[i].end ) return( true ); } return( false ); } static int MergeSegments(struct segment *space, int cnt) { int i,j; double middle; for ( i=j=0; i= space[j].end ) { /* If there are 2 overlapping segments and neither the */ /* end of the first segment nor the start of the second */ /* one are curved we can merge them. Otherwise we have */ /* to preserve them both, but modify their start/end properties */ /* so that the overlap is removed */ if ( space[j].ecurved != 1 && space[i+1].scurved != 1 ) { space[j].end = space[i+1].end; space[j].ebase = space[i+1].ebase; space[j].ecurved = space[i+1].ecurved; space[j].curved = false; } else if ( space[j].ecurved != 1 && space[i+1].scurved == 1 ) { space[i+1].start = space[j].end; --i; } else if ( space[j].ecurved == 1 && space[i+1].scurved != 1 ) { space[j].end = space[i+1].start; --i; } else { middle = (space[j].end + space[i+1].start)/2; space[j].end = space[i+1].start = middle; --i; } } ++i; } } return( j ); } static int MergeSegmentsFinal( struct segment *space, int cnt ) { int i,j; for ( i=j=0; ispace[j].end ) { space[j].end = space[i+1].end; space[j].ebase = space[i+1].ebase; space[j].ecurved = space[i+1].ecurved; space[j].curved = false; } ++i; } } return( j ); } static void FigureStemActive( struct glyphdata *gd, struct stemdata *stem ) { int i, j, pcnt=0; struct pointdata *pd, **pspace = gd->pspace; struct stem_chunk *chunk; struct segment *lspace = gd->lspace, *rspace = gd->rspace; struct segment *bothspace = gd->bothspace, *activespace = gd->activespace; int lcnt, rcnt, bcnt, bpos, acnt, cove, startset, endset; double middle, width, len, clen, gap, lseg, rseg; double err, lmin, rmax, loff, roff, last, s, e, sbase, ebase; double proj, proj2, proj3, orig_proj, ptemp; width = stem->width; for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) gd->points[i].sp->ticked = false; lcnt = rcnt = 0; for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( chunk->stemcheat ) continue; lcnt = AddLineSegment( stem,lspace,lcnt,true ,chunk->l,chunk->lnext,gd ); rcnt = AddLineSegment( stem,rspace,rcnt,false,chunk->r,chunk->rnext,gd ); } bcnt = 0; if ( lcnt!=0 && rcnt!=0 ) { /* For curved segments we can extend left and right active segments */ /* a bit to ensure that they do overlap and thus can be marked with an */ /* active zone */ if ( rcnt == lcnt && stem->chunk_cnt == lcnt ) { for ( i=0; irspace[i].end && lspace[i].scurved && rspace[i].ecurved ) gap = lspace[i].start-rspace[i].end; else if ( rspace[i].start>lspace[i].end && rspace[i].scurved && lspace[i].ecurved ) gap = rspace[i].start-lspace[i].end; else if ( !cove ) continue; lseg = lspace[i].end - lspace[i].start; rseg = rspace[i].end - rspace[i].start; if (( cove && gap < (lseg > rseg ? lseg : rseg )) || ( gap < ( lseg + rseg )/2 && !stem->chunks[i].stub )) { if ( lspace[i].ebaserspace[i].end ) rspace[i].end = lspace[i].sbase; if ( rspace[i].ebaselspace[i].end ) lspace[i].end = rspace[i].sbase; } } } qsort(lspace,lcnt,sizeof(struct segment),segment_cmp); qsort(rspace,rcnt,sizeof(struct segment),segment_cmp); lcnt = MergeSegments( lspace,lcnt ); rcnt = MergeSegments( rspace,rcnt ); for ( i=j=bcnt=0; i lspace[i].start ) ? rspace[j].start : lspace[i].start; e = ( rspace[j].end < lspace[i].end ) ? rspace[j].end : lspace[i].end; sbase = ( rspace[j].start > lspace[i].start ) ? lspace[i].sbase : rspace[j].sbase; ebase = ( rspace[j].end < lspace[i].end ) ? lspace[i].ebase : rspace[j].ebase; middle = ( lspace[i].start + rspace[j].start )/2; bothspace[bcnt].start = ( cove && middle < s ) ? middle : s; if ( rspace[j].start > lspace[i].start ) bothspace[bcnt].scurved = ( rspace[j].scurved || sbase < s ) ? rspace[j].scurved : lspace[i].scurved; else bothspace[bcnt].scurved = ( lspace[i].scurved || sbase < s ) ? lspace[i].scurved : rspace[j].scurved; middle = ( lspace[i].end + rspace[j].end )/2; bothspace[bcnt].end = ( cove && middle > e ) ? middle : e; if ( rspace[j].end < lspace[i].end ) bothspace[bcnt].ecurved = ( rspace[j].ecurved || ebase > e ) ? rspace[j].ecurved : lspace[i].ecurved; else bothspace[bcnt].ecurved = ( lspace[i].ecurved || ebase > e ) ? lspace[i].ecurved : rspace[j].ecurved; sbase = ( rspace[j].sbase > lspace[i].sbase ) ? rspace[j].sbase : lspace[i].sbase; ebase = ( rspace[j].ebase < lspace[i].ebase ) ? rspace[j].ebase : lspace[i].ebase; if ( sbase > bothspace[bcnt].end ) sbase = ebase = bothspace[bcnt].end; else if ( ebase < bothspace[bcnt].start ) sbase = ebase = bothspace[bcnt].start; else if ( ebase < sbase ) ebase = sbase = ( ebase + sbase )/2; bothspace[bcnt].sbase = sbase; bothspace[bcnt].ebase = ebase; bothspace[bcnt++].curved = rspace[j].curved || lspace[i].curved; if ( rspace[j].end>lspace[i].end ) break; ++j; } } } #if GLYPH_DATA_DEBUG fprintf( stderr, "Active zones for stem l=%.2f,%.2f r=%.2f,%.2f dir=%.2f,%.2f:\n", stem->left.x,stem->left.y,stem->right.x,stem->right.y,stem->unit.x,stem->unit.y ); for ( i=0; iunit.x == 0 || stem->unit.y == 0 ) ? dist_error_hv : dist_error_diag; lmin = ( stem->lmin < -err ) ? stem->lmin : -err; rmax = ( stem->rmax > err ) ? stem->rmax : err; acnt = 0; if ( bcnt!=0 ) { for ( i=0; ipcnt; ++i ) if ( (pd = &gd->points[i])->sp!=NULL ) { /* Let's say we have a stem. And then inside that stem we have */ /* another rectangle. So our first stem isn't really a stem any */ /* more (because we hit another edge first), yet it's still reasonable*/ /* to align the original stem */ /* Now suppose the rectangle is rotated a bit so we can't make */ /* a stem from it. What do we do here? */ loff = ( pd->sp->me.x - stem->left.x ) * stem->unit.y - ( pd->sp->me.y - stem->left.y ) * stem->unit.x; roff = ( pd->sp->me.x - stem->right.x ) * stem->unit.y - ( pd->sp->me.y - stem->right.y ) * stem->unit.x; if ( loff >= lmin && roff <= rmax ) { pd->projection = (pd->sp->me.x - stem->left.x)*stem->unit.x + (pd->sp->me.y - stem->left.y)*stem->unit.y; if ( InActive(pd->projection,bothspace,bcnt) ) pspace[pcnt++] = pd; } } qsort(pspace,pcnt,sizeof(struct pointdata *),proj_cmp); bpos = i = 0; while ( bposi && pspace[i]->projection < bothspace[bpos].sbase ) i++; if ( pcnt > i && pspace[i]->projection >= bothspace[bpos].sbase ) { last = activespace[acnt].end = pspace[i]->projection; activespace[acnt].ecurved = false; activespace[acnt].curved = false; endset=true; } } while ( iprojectionprojection<=bothspace[bpos].ebase ))) { if ( last==activespace[acnt].start && pspace[i]->projection >= last ) { if ( !StemIsActiveAt( gd,stem,last+(( 1.001*pspace[i]->projection-last )/2.001 ))) { last = activespace[acnt].start = pspace[i]->projection; activespace[acnt].scurved = false; startset = true; endset = false; } else { last = activespace[acnt].end = pspace[i]->projection; activespace[acnt].ecurved = false; activespace[acnt].curved = false; endset = true; } } else if (( last==activespace[acnt].end || !startset ) && pspace[i]->projection >= last) { if ( !StemIsActiveAt( gd,stem,last+(( 1.001*pspace[i]->projection-last )/2.001 )) || !startset ) { if ( startset ) acnt++; last = activespace[acnt].start = pspace[i]->projection; activespace[acnt].scurved = false; startset = true; endset = false; } else { last = activespace[acnt].end = pspace[i]->projection; activespace[acnt].ecurved = false; activespace[acnt].curved = false; endset = true; } } ++i; } if (( bothspace[bpos].ecurved || StemIsActiveAt( gd,stem,bothspace[bpos].end-0.0015 )) && startset ) { activespace[acnt].end = bothspace[bpos].end; activespace[acnt].ecurved = bothspace[bpos].ecurved; activespace[acnt].curved = bothspace[bpos].curved; endset = true; } ++bpos; if ( endset ) ++acnt; } } } for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; /* stemcheat 1 -- diagonal edge stem; * 2 -- diagonal corner stem with a sharp top; * 3 -- diagonal corner stem with a flat top; * 4 -- bounding box hint */ if ( chunk->stemcheat==3 && chunk->l!=NULL && chunk->r!=NULL && i+1chunk_cnt && stem->chunks[i+1].stemcheat==3 && ( chunk->l==stem->chunks[i+1].l || chunk->r==stem->chunks[i+1].r )) { SplinePoint *sp = chunk->l==stem->chunks[i+1].l ? chunk->l->sp : chunk->r->sp; proj = (sp->me.x - stem->left.x) *stem->unit.x + (sp->me.y - stem->left.y) *stem->unit.y; SplinePoint *sp2 = chunk->l==stem->chunks[i+1].l ? chunk->r->sp : chunk->l->sp; SplinePoint *sp3 = chunk->l==stem->chunks[i+1].l ? stem->chunks[i+1].r->sp : stem->chunks[i+1].l->sp; proj2 = (sp2->me.x - stem->left.x) *stem->unit.x + (sp2->me.y - stem->left.y) *stem->unit.y; proj3 = (sp3->me.x - stem->left.x) *stem->unit.x + (sp3->me.y - stem->left.y) *stem->unit.y; if ( proj2>proj3 ) { ptemp = proj2; proj2 = proj3; proj3 = ptemp; } if ( (proj3-proj2) < width ) { activespace[acnt ].curved = true; proj2 -= width/2; proj3 += width/2; } else { activespace[acnt ].curved = false; } activespace[acnt].start = proj2; activespace[acnt].end = proj3; activespace[acnt].sbase = activespace[acnt].ebase = proj; acnt++; ++i; } else if ( chunk->stemcheat && chunk->l!=NULL && chunk->r!=NULL ) { SplinePoint *sp = chunk->l->sp; proj = ( sp->me.x - stem->left.x ) * stem->unit.x + ( sp->me.y - stem->left.y ) * stem->unit.y; orig_proj = proj; SplinePoint *other = chunk->lnext ? sp->next->to : sp->prev->from; len = (other->me.x - sp->me.x) * stem->unit.x + (other->me.y - sp->me.y) * stem->unit.y; if ( chunk->stemcheat == 2 ) proj -= width/2; else if ( len<0 ) proj -= width; activespace[acnt].curved = true; activespace[acnt].start = proj; activespace[acnt].end = proj+width; activespace[acnt].sbase = activespace[acnt].ebase = orig_proj; acnt++; } } if ( acnt!=0 ) { stem->activecnt = MergeSegmentsFinal( activespace,acnt ); stem->active = malloc(acnt*sizeof(struct segment)); memcpy(stem->active,activespace,acnt*sizeof(struct segment)); } len = clen = 0; for ( i=0; iactive[i].curved ) clen += stem->active[i].end-stem->active[i].start; else len += stem->active[i].end-stem->active[i].start; } stem->len = len; stem->clen = len+clen; } static void GDStemsFixupIntersects(struct glyphdata *gd) { int i, j, stemidx; struct stemdata *stem; struct stem_chunk *chunk; for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; for ( j=0; jchunk_cnt; ++j ) { chunk = &stem->chunks[j]; if ( chunk->l!=NULL ) { stemidx = IsStemAssignedToPoint( chunk->l,stem,true ); FixupT( chunk->l,stemidx,true,chunk->l_e_idx ); stemidx = IsStemAssignedToPoint( chunk->l,stem,false ); FixupT( chunk->l,stemidx,false,chunk->l_e_idx ); } if ( chunk->r!=NULL ) { stemidx = IsStemAssignedToPoint( chunk->r,stem,true ); FixupT( chunk->r,stemidx,true,chunk->r_e_idx ); stemidx = IsStemAssignedToPoint( chunk->r,stem,false ); FixupT( chunk->r,stemidx,false,chunk->r_e_idx ); } } } } static int StemsWouldConflict( struct stemdata *stem1,struct stemdata *stem2 ) { double loff, roff, s1, s2, e1, e2; int acnt1, acnt2; if ( stem1 == stem2 || !UnitsParallel( &stem1->unit,&stem2->unit,true )) return( false ); loff = ( stem2->left.x - stem1->left.x ) * stem1->unit.y - ( stem2->left.y - stem1->left.y ) * stem1->unit.x; roff = ( stem2->right.x - stem1->right.x ) * stem1->unit.y - ( stem2->right.y - stem1->right.y ) * stem1->unit.x; loff = fabs( loff ); roff = fabs( roff ); if ( loff > stem1->width || roff > stem1->width ) return( false ); acnt1 = stem1->activecnt; acnt2 = stem2->activecnt; if ( acnt1 == 0 || acnt2 == 0 ) return( false ); s1 = stem1->active[0].start; e1 = stem1->active[acnt1-1].end; s2 = stem2->active[0].start; e2 = stem2->active[acnt2-1].end; loff = ( stem2->left.x - stem1->left.x ) * stem1->unit.x + ( stem2->left.y - stem1->left.y ) * stem1->unit.y; if (( s2+loff >= s1 && s2+loff <= e1 ) || ( e2+loff >= s1 && e2+loff <= e1 ) || ( s2+loff <= s1 && e2+loff >= e1 ) || ( e2+loff <= s1 && s2+loff >= e1 )) return( true ); return( false ); } /* Convert diagonal stems generated for stubs and intersections to horizontal */ /* or vertical, if they have just one chunk. This should be done before calculating */ /* active zones, as they are calculated against each stem's unit vector */ static void GDNormalizeStubs( struct glyphdata *gd ) { int i, j, hv; struct stemdata *stem; struct stem_chunk *chunk; BasePoint newdir; for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->positioned ) continue; if ( !IsUnitHV( &stem->unit,true )) { hv = IsUnitHV( &stem->unit,false ); if ( hv && StemFitsHV( stem,( hv == 1 ),3 )) { if ( hv == 2 && stem->unit.y < 0 ) SwapEdges( gd,stem ); newdir.x = fabs( rint( stem->unit.x )); newdir.y = fabs( rint( stem->unit.y )); SetStemUnit( stem,newdir ); for ( j=0; jchunk_cnt && stem->leftidx == -1 && stem->rightidx == -1; j++ ) { chunk = &stem->chunks[j]; if ( stem->leftidx == -1 && chunk->l != NULL ) stem->leftidx = GetValidPointDataIndex( gd,chunk->l->sp,stem ); if ( stem->rightidx == -1 && chunk->r != NULL ) stem->rightidx = GetValidPointDataIndex( gd,chunk->r->sp,stem ); } } } } } static void GDFindUnlikelyStems( struct glyphdata *gd ) { double width, minl, ratio; int i, j, k, stem_cnt, ls_cnt, rs_cnt, ltick, rtick; struct pointdata *lpd, *rpd; Spline *ls, *rs; SplinePoint *lsp, *rsp; BasePoint *lunit, *runit, *slunit, *srunit, *sunit; struct stemdata *stem, *stem1, *tstem; struct stemdata **tstems, **lstems, **rstems; struct stem_chunk *chunk; GDStemsFixupIntersects( gd ); for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; /* If stem had been already present in the spline char before we */ /* started generating glyph data, then it should never be */ /* considered "too big" */ if ( stem->positioned ) continue; /* If a stem has straight edges, and it is wider than tall */ /* then it is unlikely to be a real stem */ width = stem->width; ratio = IsUnitHV( &stem->unit,true ) ? gd->emsize/( 6 * width ) : -0.25; stem->toobig = ( stem->clen + stem->clen * ratio < width ); } /* One more check for curved stems. If a stem has just one active */ /* segment, this segment is curved and the stem has no conflicts, */ /* then select the active segment length which allows us to consider */ /* this stem suitable for PS output by such a way, that stems connecting */ /* the opposite sides of a circle are always accepted */ for ( i=0; istemcnt; ++i ) if ( gd->stems[i].toobig ) { stem = &gd->stems[i]; width = stem->width; if ( IsUnitHV( &stem->unit,true ) && stem->activecnt == 1 && stem->active[0].curved && width/2 > dist_error_curve ) { for ( j=0; jstemcnt; ++j) { stem1 = &gd->stems[j]; if ( !stem1->toobig && StemsWouldConflict( stem,stem1 )) break; } if ( j == gd->stemcnt ) { minl = sqrt( pow( width/2,2 ) - pow( width/2 - dist_error_curve,2 )); if ( stem->clen >= minl ) stem->toobig = false; } } } /* And finally a check for stubs and feature terminations. We don't */ /* want such things to be controlled by any special hints, if there */ /* is already a hint controlling the middle of the same feature */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->positioned ) continue; if ( stem->chunk_cnt == 1 && stem->chunks[0].stub & 3 ) { chunk = &stem->chunks[0]; slunit = chunk->lnext ? &chunk->l->nextunit : &chunk->l->prevunit; srunit = chunk->rnext ? &chunk->r->nextunit : &chunk->r->prevunit; /* This test is valid only for features which are not exactly horizontal/ */ /* vertical. But we can't check this using the stem unit, as it may have */ /* already beeen reset to HV. So we use the units of this stem's base points */ /* instead. */ if ( IsUnitHV( slunit,true ) && IsUnitHV( srunit,true )) continue; if ( UnitCloserToHV( srunit,slunit ) > 0 ) sunit = srunit; else sunit = slunit; lpd = chunk->l; lsp = lpd->sp; lstems = tstems = NULL; ls_cnt = 0; do { stem_cnt = (( chunk->lnext && lpd == chunk->l ) || ( !chunk->lnext && lpd != chunk->l )) ? lpd->nextcnt : lpd->prevcnt; for ( j=0; jlnext && lpd == chunk->l ) || ( !chunk->lnext && lpd != chunk->l )) ? lpd->nextstems : lpd->prevstems; tstem = tstems[j]; if ( tstem != stem ) { lstems = tstems; ls_cnt = stem_cnt; break; } } if( lstems != NULL ) break; ls = ( chunk->lnext ) ? lsp->next : lsp->prev; if ( ls == NULL ) break; lsp = ( chunk->lnext ) ? ls->to : ls->from; lpd = &gd->points[lsp->ptindex]; lunit = ( chunk->lnext ) ? &lpd->prevunit : &lpd->nextunit; } while ( lpd != chunk->l && lpd != chunk->r && UnitsParallel( lunit,sunit,false )); rpd = chunk->r; rsp = rpd->sp; rstems = tstems = NULL; rs_cnt = 0; do { stem_cnt = (( chunk->rnext && rpd == chunk->r ) || ( !chunk->rnext && rpd != chunk->r )) ? rpd->nextcnt : rpd->prevcnt; for ( j=0; jrnext && rpd == chunk->r ) || ( !chunk->rnext && rpd != chunk->r )) ? rpd->nextstems : rpd->prevstems; tstem = tstems[j]; if ( tstem != stem ) { rstems = tstems; rs_cnt = stem_cnt; break; } } if( rstems != NULL ) break; rs = ( chunk->rnext ) ? rsp->next : rsp->prev; if ( rs == NULL ) break; rsp = ( chunk->rnext ) ? rs->to : rs->from; rpd = &gd->points[rsp->ptindex]; runit = ( chunk->rnext ) ? &rpd->prevunit : &rpd->nextunit; } while ( rpd != chunk->r && rpd != chunk->l && UnitsParallel( runit,sunit,false )); if ( lstems != NULL && rstems !=NULL ) { for ( j=0; jtoobig; j++ ) { for ( k=0; ktoobig; k++ ) { if ( lstems[j] == rstems[k] && IsUnitHV( &lstems[j]->unit,true )) { stem->toobig = true; } } } } } /* One more check for intersections between a curved segment and a */ /* straight feature. Imagine a curve intersected by two bars, like in a Euro */ /* glyph. Very probably we will get two chunks, one controlling the uppest */ /* two points of intersection, and another the lowest two, and most probably */ /* these two chunks will get merged into a single stem (so this stem will */ /* even get an exactly vertical vector). Yet we don't need this stem because */ /* there is already a stem controlling the middle of the curve (between two */ /* bars).*/ else if ( stem->chunk_cnt == 2 && (( stem->chunks[0].stub & 7 && stem->chunks[1].stub & 6 ) || ( stem->chunks[0].stub & 6 && stem->chunks[1].stub & 7 ))) { for ( j=0; jstemcnt; ++j) { stem1 = &gd->stems[j]; if ( !stem1->toobig && StemsWouldConflict( stem,stem1 )) break; } if ( j < gd->stemcnt ) stem->toobig = true; } } for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( IsUnitHV( &stem->unit,true )) continue; /* If a diagonal stem doesn't have at least 2 points assigned to */ /* each edge, then we probably can't instruct it. However we don't */ /* disable stems which have just one point on each side, if those */ /* points are inflection points, as such stems may be useful for */ /* metafont routines */ if ( stem->lpcnt < 2 || stem->rpcnt < 2 ) { lpd = rpd = NULL; for ( j=0; jchunk_cnt && lpd == NULL && rpd == NULL; j++ ) { chunk = &stem->chunks[j]; if ( chunk->l != NULL ) lpd = chunk->l; if ( chunk->r != NULL ) rpd = chunk->r; } if (lpd == NULL || rpd == NULL || !IsInflectionPoint( gd,lpd ) || !IsInflectionPoint( gd,rpd ) || stem->clen < stem->width ) stem->toobig = 2; } else if ( stem->activecnt >= stem->chunk_cnt ) stem->toobig = 2; } /* When using preexisting stem data, occasionally we can get two slightly */ /* different stems (one predefined, another recently detected) with nearly */ /* parallel vectors, sharing some points at both sides. Attempting to instruct */ /* them both would lead to very odd effects. So we must disable one */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( !stem->positioned || IsUnitHV( &stem->unit,true )) continue; for ( j=0; jstemcnt; ++j ) { tstem = &gd->stems[j]; if ( tstem == stem || tstem->toobig || !UnitsParallel( &stem->unit,&tstem->unit,false )) continue; ltick = false; rtick = false; for ( k=0; kchunk_cnt && ( !ltick || !rtick ); k++ ) { chunk = &stem->chunks[k]; if ( chunk->l != NULL && IsStemAssignedToPoint( chunk->l,stem ,chunk->lnext ) != -1 && IsStemAssignedToPoint( chunk->l,tstem,chunk->lnext ) != -1 ) ltick = true; if ( chunk->r != NULL && IsStemAssignedToPoint( chunk->r,stem ,chunk->rnext ) != -1 && IsStemAssignedToPoint( chunk->r,tstem,chunk->rnext ) != -1 ) rtick = true; } if ( ltick && rtick ) tstem->toobig = 2; } } } static int StemPointOnDiag( struct glyphdata *gd,struct stemdata *stem, struct pointdata *pd ) { struct stemdata *tstem; int i, is_next, stemcnt; if ( gd->only_hv || pd->colinear ) return( false ); is_next = IsStemAssignedToPoint( pd,stem,false ) != -1; stemcnt = ( is_next ) ? pd->nextcnt : pd->prevcnt; for ( i=0; inextstems[i] : pd->prevstems[i]; if ( !IsUnitHV( &tstem->unit,true ) && tstem->lpcnt >= 2 && tstem->rpcnt >=2 ) return( true ); } return( false ); } static void FindRefPointsExisting( struct glyphdata *gd,struct stemdata *stem ) { int i; int pos, lbase, rbase, is_x; struct stem_chunk *chunk; struct pointdata *pd; is_x = (int) rint( stem->unit.y ); lbase = ((real *) &stem->left.x)[!is_x]; rbase = ((real *) &stem->right.x)[!is_x]; for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( chunk->ltick ) { pd = chunk->l; pos = ((real *) &pd->sp->me.x)[!is_x]; if ( pos == lbase ) { pd->value++; if ( pd->sp->ptindex < gd->realcnt ) pd->value++; if ( StemPointOnDiag( gd,stem,pd )) pd->value++; } } if ( chunk->rtick ) { pd = chunk->r; pos = ((real *) &pd->sp->me.x)[!is_x]; if ( pos == rbase ) { pd->value++; if ( pd->sp->ptindex < gd->realcnt ) pd->value++; if ( StemPointOnDiag( gd,stem,pd )) pd->value++; } } } } static void FindRefPointsNew( struct glyphdata *gd,struct stemdata *stem ) { int i, j; int pos, lpos, rpos, testpos, is_x; int lval, rval; struct stem_chunk *chunk; struct pointdata *lmost1, *lmost2, *rmost1, *rmost2; double llen, prevllen, rlen, prevrlen; SplinePoint *sp, *tsp; uint8 *lextr, *rextr; is_x = (int) rint( stem->unit.y ); lpos = ((real *) &stem->left.x)[!is_x]; rpos = ((real *) &stem->right.x)[!is_x]; lmost1 = rmost1 = lmost2 = rmost2 = NULL; llen = prevllen = rlen = prevrlen = 0; for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( chunk->ltick ) { sp = chunk->l->sp; pos = ((real *) &sp->me.x)[!is_x]; lval = 0; for ( j=0; jchunks[j].ltick ) { tsp = stem->chunks[j].l->sp; testpos = ((real *) &tsp->me.x)[!is_x]; if ( pos == testpos ) { lval = stem->chunks[j].l->value; stem->chunks[j].l->value++; /* An additional bonus for points which form together */ /* a longer stem segment */ if ( sp->next->to == tsp || sp->prev->from == tsp ) { llen = fabs(( sp->me.x - tsp->me.x )*stem->unit.x + ( sp->me.y - tsp->me.y )*stem->unit.y ); if ( llen > prevllen ) { lmost1 = stem->chunks[j].l; lmost2 = chunk->l; prevllen = llen; } } } } chunk->l->value = lval+1; if ( lval == 0 && ( stem->lmin - ( pos - lpos ) > -dist_error_hv ) && ( stem->lmax - ( pos - lpos ) < dist_error_hv )) chunk->l->value++; } if ( chunk->rtick ) { sp = chunk->r->sp; pos = ((real *) &sp->me.x)[!is_x]; rval = 0; for ( j=0; jchunks[j].rtick ) { tsp = stem->chunks[j].r->sp; testpos = ((real *) &tsp->me.x)[!is_x]; if ( pos == testpos ) { rval = stem->chunks[j].r->value; stem->chunks[j].r->value++; if ( sp->next->to == tsp || sp->prev->from == tsp ) { rlen = fabs(( sp->me.x - tsp->me.x )*stem->unit.x + ( sp->me.y - tsp->me.y )*stem->unit.y ); if ( rlen > prevrlen ) { rmost1 = stem->chunks[j].r; rmost2 = chunk->r; prevrlen = rlen; } } } } chunk->r->value = rval+1; if ( rval == 0 && ( stem->rmin - ( pos - rpos ) > -dist_error_hv ) && ( stem->rmax - ( pos - rpos ) < dist_error_hv )) chunk->r->value++; } } if ( lmost1 != NULL && lmost2 != NULL ) { lmost1->value++; lmost2->value++; } if ( rmost1 != NULL && rmost2 != NULL ) { rmost1->value++; rmost2->value++; } /* Extrema points get an additional value bonus. This should */ /* prevent us from preferring wrong points for stems controlling */ /* curved segments */ /* Third pass to assign bonuses to extrema points (especially */ /* to those extrema which are opposed to another extremum point) */ for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( chunk->ltick ) { lextr = ( is_x ) ? &chunk->l->x_extr : &chunk->l->y_extr; if ( *lextr ) chunk->l->value++; } if ( chunk->rtick ) { rextr = ( is_x ) ? &chunk->r->x_extr : &chunk->r->y_extr; if ( *rextr ) chunk->r->value++; } if ( chunk->ltick && chunk->rtick ) { lextr = ( is_x ) ? &chunk->l->x_extr : &chunk->l->y_extr; rextr = ( is_x ) ? &chunk->r->x_extr : &chunk->r->y_extr; if ( *lextr && *rextr ) { chunk->l->value++; chunk->r->value++; } } } } static void NormalizeStem( struct glyphdata *gd,struct stemdata *stem ) { int i; int lval, rval, val, lset, rset, best; double loff=0, roff=0; BasePoint lold, rold; SplinePoint *lbest, *rbest; struct stem_chunk *chunk; /* First sort the stem chunks by their coordinates */ if ( IsUnitHV( &stem->unit,true )) { qsort( stem->chunks,stem->chunk_cnt,sizeof( struct stem_chunk ),chunk_cmp ); /* For HV stems we have to check all chunks once more in order */ /* to figure out "left" and "right" positions most typical */ /* for this stem. We perform this by assigning a value to */ /* left and right side of this chunk. */ /* First pass to determine some point properties necessary */ /* for subsequent operations */ for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( chunk->ltick ) /* reset the point's "value" to zero */ chunk->l->value = 0; if ( chunk->rtick ) chunk->r->value = 0; } /* Second pass to check which positions relative to stem edges are */ /* most common for this stem. Each position which repeats */ /* more than once gets a plus 1 value bonus */ if ( stem->positioned ) FindRefPointsExisting( gd,stem ); else FindRefPointsNew( gd,stem ); best = -1; val = 0; for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; lval = ( chunk->l != NULL ) ? chunk->l->value : 0; rval = ( chunk->r != NULL ) ? chunk->r->value : 0; if ((( chunk->l != NULL && chunk->l->value > 0 && GetValidPointDataIndex( gd,chunk->l->sp,stem ) != -1 ) || ( stem->ghost && stem->width == 21 )) && (( chunk->r != NULL && chunk->r->value > 0 && GetValidPointDataIndex( gd,chunk->r->sp,stem ) != -1 ) || ( stem->ghost && stem->width == 20 )) && lval + rval > val ) { best = i; val = lval + rval; } } if ( best > -1 ) { if ( !stem->ghost || stem->width == 20 ) { lold = stem->left; lbest = stem->chunks[best].l->sp; stem->left = lbest->me; stem->leftidx = GetValidPointDataIndex( gd,lbest,stem ); /* Now assign "left" and "right" properties of the stem */ /* to point coordinates taken from the most "typical" chunk */ /* of this stem. We also have to recalculate stem width and */ /* left/right offset values */ loff = ( stem->left.x - lold.x ) * stem->unit.y - ( stem->left.y - lold.y ) * stem->unit.x; stem->lmin -= loff; stem->lmax -= loff; } if ( !stem->ghost || stem->width == 21 ) { rold = stem->right; rbest = stem->chunks[best].r->sp; stem->right = rbest->me; stem->rightidx = GetValidPointDataIndex( gd,rbest,stem ); roff = ( stem->right.x - rold.x ) * stem->unit.y - ( stem->right.y - rold.y ) * stem->unit.x; stem->rmin -= roff; stem->rmax -= roff; } if ( !stem->ghost ) stem->width = ( stem->right.x - stem->left.x ) * stem->unit.y - ( stem->right.y - stem->left.y ) * stem->unit.x; } else { for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( chunk->l != NULL && ( !stem->ghost || stem->width == 20 )) { stem->leftidx = GetValidPointDataIndex( gd,chunk->l->sp,stem ); } if ( chunk->r != NULL && ( !stem->ghost || stem->width == 21 )) { stem->rightidx = GetValidPointDataIndex( gd,chunk->r->sp,stem ); } } } } else { qsort( stem->chunks,stem->chunk_cnt,sizeof( struct stem_chunk ),chunk_cmp ); lset = false; rset = false; /* Search for a pair of points whose vectors are really parallel. */ /* This check is necessary because a diagonal stem can start from */ /* a feature termination, and our checks for such terminations */ /* are more "liberal" than in other cases. However we don't want */ /* considering such a pair of points basic for this stem */ for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; BasePoint *lu, *ru; if ( chunk->l != NULL && chunk->r != NULL ) { lu = chunk->lnext ? &chunk->l->nextunit : &chunk->l->prevunit; ru = chunk->rnext ? &chunk->r->nextunit : &chunk->r->prevunit; if ( UnitsParallel( lu,ru,true )) { loff = ( chunk->l->sp->me.x - stem->left.x )*stem->l_to_r.x + ( chunk->l->sp->me.y - stem->left.y )*stem->l_to_r.y; roff = ( chunk->r->sp->me.x - stem->right.x )*stem->l_to_r.x + ( chunk->r->sp->me.y - stem->right.y )*stem->l_to_r.y; stem->left = chunk->l->sp->me; stem->right = chunk->r->sp->me; RecalcStemOffsets( stem,&stem->unit,loff != 0,roff != 0 ); break; } } } /* If the above check fails, just select the first point (relatively) */ /* to the stem direction both at the left and the right edge */ if ( i == stem->chunk_cnt ) for ( i=0; ichunk_cnt; ++i ) { chunk = &stem->chunks[i]; if ( !lset && chunk->l != NULL ) { loff = ( chunk->l->sp->me.x - stem->left.x )*stem->l_to_r.x + ( chunk->l->sp->me.y - stem->left.y )*stem->l_to_r.y; stem->left = chunk->l->sp->me; lset = true; } if ( !rset && chunk->r != NULL ) { roff = ( chunk->r->sp->me.x - stem->right.x )*stem->l_to_r.x + ( chunk->r->sp->me.y - stem->right.y )*stem->l_to_r.y; stem->right = chunk->r->sp->me; rset = true; } if ( lset && rset ) { RecalcStemOffsets( stem,&stem->unit,loff != 0,roff != 0 ); break; } } } } static void AssignPointsToBBoxHint( struct glyphdata *gd,DBounds *bounds, struct stemdata *stem,int is_v ) { double min, max, test, left, right; double dist, prevdist; int i, j; int lcnt=0, rcnt=0, closest; BasePoint dir; SplinePoint **lpoints, **rpoints; struct pointdata *pd, *pd1, *pd2; lpoints = calloc( gd->pcnt,sizeof( SplinePoint *)); rpoints = calloc( gd->pcnt,sizeof( SplinePoint *)); dir.x = !is_v; dir.y = is_v; for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { pd = &gd->points[i]; min = ( is_v ) ? bounds->minx : bounds->miny; max = ( is_v ) ? bounds->maxx : bounds->maxy; test = ( is_v ) ? pd->base.x : pd->base.y; if ( test >= min && test < min + dist_error_hv && ( IsCorrectSide( gd,pd,true,is_v,&dir ) || IsCorrectSide( gd,pd,false,is_v,&dir ))) lpoints[lcnt++] = pd->sp; else if ( test > max - dist_error_hv && test <= max && ( IsCorrectSide( gd,pd,true,!is_v,&dir ) || IsCorrectSide( gd,pd,false,!is_v,&dir ))) rpoints[rcnt++] = pd->sp; } if ( lcnt > 0 && rcnt > 0 ) { if ( stem == NULL ) { stem = NewStem( gd,&dir,&lpoints[0]->me,&rpoints[0]->me ); stem->bbox = true; stem->len = stem->width; stem->leftidx = GetValidPointDataIndex( gd,lpoints[0],stem ); stem->rightidx = GetValidPointDataIndex( gd,rpoints[0],stem ); } for ( i=0; ime.y : lpoints[i]->me.x; right = ( is_v ) ? rpoints[j]->me.y : rpoints[j]->me.x; dist = fabs( left - right ); if ( dist < prevdist ) { closest = j; prevdist = dist; } } pd1 = &gd->points[lpoints[i]->ptindex]; pd2 = &gd->points[rpoints[closest]->ptindex]; AddToStem( gd,stem,pd1,pd2,false,true,4 ); } qsort( stem->chunks,stem->chunk_cnt,sizeof( struct stem_chunk ),chunk_cmp ); } free( lpoints ); free( rpoints ); } static void CheckForBoundingBoxHints( struct glyphdata *gd ) { /* Adobe seems to add hints at the bounding boxes of glyphs with no hints */ int i, hv; int hcnt=0, vcnt=0; double cw, ch; struct stemdata *stem, *hstem=NULL,*vstem=NULL; DBounds bounds; SplineCharFindBounds( gd->sc,&bounds ); for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; hv = IsUnitHV( &stem->unit,true ); if ( !hv ) continue; if ( stem->toobig ) { if ( stem->left.x == bounds.minx && stem->right.x == bounds.maxx ) vstem = stem; else if ( stem->right.y == bounds.miny && stem->left.y == bounds.maxy ) hstem = stem; continue; } if ( hv == 1 ) { if ( stem->bbox ) hstem = stem; else ++hcnt; } else if ( hv == 2 ) { if ( stem->bbox ) vstem = stem; else ++vcnt; } } if ( hcnt!=0 && vcnt!=0 && ( hstem == NULL || !hstem->positioned ) && ( vstem == NULL || !vstem->positioned )) return; ch = bounds.maxy - bounds.miny; cw = bounds.maxx - bounds.minx; if ( ch > 0 && (( hstem != NULL && hstem->positioned ) || ( hcnt == 0 && ch < gd->emsize/3 ))) { if ( hstem != NULL && hstem->toobig ) hstem->toobig = false; AssignPointsToBBoxHint( gd,&bounds,hstem,false ); if ( hstem != NULL ) NormalizeStem( gd,hstem ); } if ( cw > 0 && (( vstem != NULL && vstem->positioned ) || ( vcnt == 0 && cw < gd->emsize/3 ))) { if ( vstem != NULL && vstem->toobig ) vstem->toobig = false; AssignPointsToBBoxHint( gd,&bounds,vstem,true ); if ( vstem != NULL ) NormalizeStem( gd,vstem ); } } static struct stemdata *FindOrMakeGhostStem( struct glyphdata *gd, SplinePoint *sp,int blue,double width ) { int i, j, hasl, hasr; struct stemdata *stem=NULL, *tstem; struct stem_chunk *chunk; BasePoint dir,left,right; double min, max; dir.x = 1; dir.y = 0; for ( i=0; istemcnt; ++i ) { tstem = &gd->stems[i]; if ( tstem->blue == blue && tstem->ghost && tstem->width == width ) { stem = tstem; break; /* If the stem controlling this blue zone is not for a ghost hint, */ /* then we check if it has both left and right points, to ensure that */ /* we don't occasionally assign an additional point to a stem which */ /* has already been rejected in favor of another stem */ } else if ( tstem->blue == blue && !tstem->ghost && !tstem->toobig ) { min = ( width == 20 ) ? tstem->left.y - tstem->lmin - 2*dist_error_hv : tstem->right.y - tstem->rmin - 2*dist_error_hv; max = ( width == 20 ) ? tstem->left.y - tstem->lmax + 2*dist_error_hv : tstem->right.y - tstem->rmax + 2*dist_error_hv; if ( sp->me.y <= min || sp->me.y >= max ) continue; hasl = false; hasr = false; j = 0; while ( j < tstem->chunk_cnt && ( !hasl || !hasr )) { chunk = &tstem->chunks[j]; if ( chunk->l != NULL && !chunk->lpotential ) hasl = true; if ( chunk->r != NULL && !chunk->rpotential ) hasr = true; j++; } if ( hasl && hasr ) { stem = tstem; break; } } } if ( stem == NULL ) { left.x = right.x = sp->me.x; left.y = ( width == 21 ) ? sp->me.y + 21 : sp->me.y; right.y = ( width == 21 ) ? sp->me.y : sp->me.y - 20; stem = NewStem( gd,&dir,&left,&right ); stem->ghost = true; stem->width = width; stem->blue = blue; } return( stem ); } static int AddGhostSegment( struct pointdata *pd,int cnt,double base,struct segment *space ) { double s, e, temp, pos, spos, epos; SplinePoint *sp, *nsp, *nsp2, *psp, *psp2; sp = nsp = psp = pd->sp; pos = pd->sp->me.y; /* First check if there are points on the same line lying further */ /* in the desired direction */ if (( sp->next != NULL ) && ( sp->next->to->me.y == pos )) nsp = sp->next->to; if (( sp->prev != NULL ) && ( sp->prev->from->me.y == pos )) psp = sp->prev->from; if ( psp != sp ) { s = psp->me.x; } else if ( psp->noprevcp ) { psp2 = psp->prev->from; if ( psp2->me.y != psp->me.y ) { s = ( psp->me.x - psp2->me.x )/( psp->me.y - psp2->me.y )*20.0; if ( s < 0 ) s = -s; if ( psp2->me.xme.x ) s = ( psp->me.x-psp2->me.x < s ) ? psp2->me.x : psp->me.x-s; else s = ( psp2->me.x-psp->me.x < s ) ? psp2->me.x : psp->me.x+s; } else s = psp->me.x; } else { s = ( pd->sp->me.x + psp->prevcp.x )/2; } if ( nsp != sp ) { e = nsp->me.x; } else if ( nsp->nonextcp ) { nsp2 = nsp->next->to; if ( nsp2->me.y != nsp->me.y ) { e = ( nsp->me.x - nsp2->me.x )/( nsp->me.y - nsp2->me.y )*20.0; if ( e < 0 ) e = -e; if ( nsp2->me.xme.x ) e = ( nsp->me.x-nsp2->me.x < e ) ? nsp2->me.x : nsp->me.x-e; else e = ( nsp2->me.x-nsp->me.x < e ) ? nsp2->me.x : nsp->me.x+e; } else e = nsp->me.x; } else { e = ( pd->sp->me.x + nsp->nextcp.x )/2; } spos = psp->me.x; epos = nsp->me.x; if ( s>e ) { temp = s; s = e; e = temp; temp = spos; spos = epos; epos = temp; } space[cnt].start = s - base; space[cnt].end = e - base; space[cnt].sbase = spos - base; space[cnt].ebase = epos - base; space[cnt].ecurved = space[cnt].scurved = space[cnt].curved = ( false ); return( cnt+1 ); } static void FigureGhostActive( struct glyphdata *gd,struct stemdata *stem ) { int acnt, i; real len = 0; struct segment *activespace = gd->activespace; struct pointdata *valid; if ( !stem->ghost ) return; acnt = 0; for ( i=0; ichunk_cnt; ++i ) { valid = ( stem->chunks[i].l != NULL) ? stem->chunks[i].l : stem->chunks[i].r; acnt = AddGhostSegment( valid,acnt,stem->left.x,activespace ); } qsort(activespace,acnt,sizeof(struct segment),segment_cmp); acnt = MergeSegments( activespace,acnt ); stem->activecnt = acnt; if ( acnt!=0 ) { stem->active = malloc(acnt*sizeof(struct segment)); memcpy( stem->active,activespace,acnt*sizeof( struct segment )); } for ( i=0; iactive[i].end-stem->active[i].start; } stem->clen = stem->len = len; } static void CheckForGhostHints( struct glyphdata *gd ) { /* PostScript doesn't allow a hint to stretch from one alignment zone to */ /* another. (Alignment zones are the things in bluevalues). */ /* Oops, I got this wrong. PS doesn't allow a hint to start in a bottom */ /* zone and stretch to a top zone. Everything in OtherBlues is a bottom */ /* zone. The baseline entry in BlueValues is also a bottom zone. Every- */ /* thing else in BlueValues is a top-zone. */ /* 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 = &gd->bd; struct stemdata *stem; struct pointdata *pd; real base; int i, j, leftfound, rightfound, has_h, peak, fuzz; fuzz = gd->fuzz; /* 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 misunderstood. Both of these were top-zones */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( IsUnitHV( &stem->unit,true ) != 1) continue; leftfound = rightfound = -1; for ( j=0; jbluecnt; ++j ) { if ( stem->left.y>=bd->blues[j][0]-fuzz && stem->left.y<=bd->blues[j][1]+fuzz ) leftfound = j; else if ( stem->right.y>=bd->blues[j][0]-fuzz && stem->right.y<=bd->blues[j][1]+fuzz ) rightfound = j; } /* Assign value 2 to indicate this stem should be ignored also for TTF instrs */ if ( leftfound !=-1 && rightfound !=-1 && ( stem->left.y > 0 && stem->right.y <= 0 )) stem->toobig = 2; /* Otherwise mark the stem as controlling a specific blue zone */ else if ( leftfound != -1 && ( rightfound == -1 || stem->left.y > 0 )) stem->blue = leftfound; else if ( rightfound != -1 && ( leftfound == -1 || stem->right.y <= 0 )) stem->blue = rightfound; } /* Now look and see if we can find any edges which lie in */ /* these zones. Edges which are not currently in hints */ /* Use the winding number to determine top or bottom */ for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { has_h = false; for ( j=0; jpoints[i].prevcnt; j++ ) { stem = gd->points[i].prevstems[j]; if ( !stem->toobig && IsUnitHV( &stem->unit,true ) == 1 ) { has_h = true; break; } } for ( j=0; jpoints[i].nextcnt; j++ ) { stem = gd->points[i].nextstems[j]; if ( !stem->toobig && IsUnitHV( &stem->unit,true ) == 1 ) { has_h = true; break; } } if ( has_h ) continue; pd = &gd->points[i]; base = pd->sp->me.y; for ( j=0; jbluecnt; ++j ) { if ( base>=bd->blues[j][0]-fuzz && base<=bd->blues[j][1]+fuzz ) { peak = IsSplinePeak( gd,pd,false,false,7 ); if ( peak > 0 ) { stem = FindOrMakeGhostStem( gd,pd->sp,j,20 ); AddToStem( gd,stem,pd,NULL,2,false,false ); } else if ( peak < 0 ) { stem = FindOrMakeGhostStem( gd,pd->sp,j,21 ); AddToStem( gd,stem,NULL,pd,2,false,false ); } } } } for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( !stem->ghost ) continue; NormalizeStem( gd,stem ); FigureGhostActive( gd,stem ); } } static void MarkDStemCorner( struct glyphdata *gd,struct pointdata *pd ) { int x_dir = pd->x_corner; int hv, is_l, i, peak, has_stem = false; struct stemdata *stem; BasePoint left,right,unit; for ( i=0; iprevcnt && !has_stem; i++ ) { stem = pd->prevstems[i]; hv = IsUnitHV( &stem->unit,true ); if ( !stem->toobig && ( ( x_dir && hv == 1 ) || ( !x_dir && hv == 2 ))) has_stem = true; } for ( i=0; inextcnt && !has_stem; i++ ) { stem = pd->nextstems[i]; hv = IsUnitHV( &stem->unit,true ); if ( !stem->toobig && ( ( x_dir && hv == 1 ) || ( !x_dir && hv == 2 ))) has_stem = true; } if ( has_stem ) return; peak = IsSplinePeak( gd,pd,x_dir,x_dir,2 ); unit.x = !x_dir; unit.y = x_dir; if ( peak > 0 ) { left.x = x_dir ? pd->sp->me.x + 21 : pd->sp->me.x; right.x = x_dir ? pd->sp->me.x : pd->sp->me.x; left.y = x_dir ? pd->sp->me.y : pd->sp->me.y; right.y = x_dir ? pd->sp->me.y : pd->sp->me.y - 20; } else if ( peak < 0 ) { left.x = x_dir ? pd->sp->me.x : pd->sp->me.x; right.x = x_dir ? pd->sp->me.x - 20 : pd->sp->me.x; left.y = x_dir ? pd->sp->me.y : pd->sp->me.y + 21; right.y = x_dir ? pd->sp->me.y : pd->sp->me.y; } is_l = IsCorrectSide( gd,pd,true,true,&unit ); for ( i=0; istemcnt; i++ ) { stem = &gd->stems[i]; if (!stem->toobig && UnitsParallel( &unit,&stem->unit,true ) && OnStem( stem,&pd->sp->me,is_l )) break; } if ( i == gd->stemcnt ) { stem = NewStem( gd,&unit,&left,&right ); stem->ghost = 2; } AddToStem( gd,stem,pd,NULL,2,false,false ); } static void MarkDStemCorners( struct glyphdata *gd ) { struct stemdata *stem; struct stem_chunk *schunk, *echunk; int i; for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->toobig || IsUnitHV( &stem->unit,true )) continue; schunk = &stem->chunks[0]; echunk = &stem->chunks[stem->chunk_cnt - 1]; if ( schunk->l != NULL && schunk->r != NULL && fabs( schunk->l->base.x - schunk->r->base.x ) > dist_error_hv && fabs( schunk->l->base.y - schunk->r->base.y ) > dist_error_hv && ( ( schunk->l->x_corner == 1 && schunk->r->y_corner == 1 ) || ( schunk->l->y_corner == 1 && schunk->r->x_corner == 1 ))) { MarkDStemCorner( gd,schunk->l ); MarkDStemCorner( gd,schunk->r ); } if ( echunk->l != NULL && echunk->r != NULL && fabs( echunk->l->base.x - echunk->r->base.x ) > dist_error_hv && fabs( echunk->l->base.y - echunk->r->base.y ) > dist_error_hv && ( ( echunk->l->x_corner == 1 && echunk->r->y_corner == 1 ) || ( echunk->l->y_corner == 1 && echunk->r->x_corner == 1 ))) { MarkDStemCorner( gd,echunk->l ); MarkDStemCorner( gd,echunk->r ); } } } #if GLYPH_DATA_DEBUG static void DumpGlyphData( struct glyphdata *gd ) { int i, j; struct stemdata *stem; struct linedata *line; struct stem_chunk *chunk; if ( gd->linecnt > 0 ) fprintf( stderr, "\nDumping line data for %s\n",gd->sc->name ); for ( i=0; ilinecnt; ++i ) { line = &gd->lines[i]; fprintf( stderr, "line vector=%.4f,%.4f base=%.2f,%.2f length=%.4f\n", line->unit.x,line->unit.y,line->online.x,line->online.y,line->length ); for( j=0; jpcnt;++j ) { fprintf( stderr, "\tpoint num=%d, x=%.2f, y=%.2f, prev=%d, next=%d\n", line->points[j]->sp->ttfindex, line->points[j]->sp->me.x, line->points[j]->sp->me.y, line->points[j]->prevline==line, line->points[j]->nextline==line ); } fprintf( stderr, "\n" ); } if ( gd->stemcnt > 0 ) fprintf( stderr, "\nDumping stem data for %s\n",gd->sc->name ); for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; fprintf( stderr, "stem l=%.2f,%.2f idx=%d r=%.2f,%.2f idx=%d vector=%.4f,%.4f\n\twidth=%.2f chunk_cnt=%d len=%.4f clen=%.4f ghost=%d blue=%d toobig=%d\n\tlmin=%.2f,lmax=%.2f,rmin=%.2f,rmax=%.2f,lpcnt=%d,rpcnt=%d\n", stem->left.x,stem->left.y,stem->leftidx, stem->right.x,stem->right.y,stem->rightidx, stem->unit.x,stem->unit.y,stem->width, stem->chunk_cnt,stem->len,stem->clen,stem->ghost,stem->blue,stem->toobig, stem->lmin,stem->lmax,stem->rmin,stem->rmax,stem->lpcnt,stem->rpcnt ); for ( j=0; jchunk_cnt; ++j ) { chunk = &stem->chunks[j]; if ( chunk->l!=NULL && chunk->r!=NULL ) fprintf (stderr, "\tchunk l=%.2f,%.2f potential=%d r=%.2f,%.2f potential=%d stub=%d\n", chunk->l->sp->me.x, chunk->l->sp->me.y, chunk->lpotential, chunk->r->sp->me.x, chunk->r->sp->me.y, chunk->rpotential, chunk->stub ); else if ( chunk->l!=NULL ) fprintf (stderr, "\tchunk l=%.2f,%.2f potential=%d\n", chunk->l->sp->me.x, chunk->l->sp->me.y, chunk->lpotential); else if ( chunk->r!=NULL ) fprintf (stderr, "\tchunk r=%.2f,%.2f potential=%d\n", chunk->r->sp->me.x, chunk->r->sp->me.y, chunk->rpotential); } fprintf( stderr, "\n" ); } if ( gd->hbundle != NULL || gd->vbundle != NULL ) fprintf( stderr, "\nDumping HV stem bundles for %s\n",gd->sc->name ); if ( gd->hbundle != NULL ) for ( i=0; ihbundle->cnt; i++ ) { stem = gd->hbundle->stemlist[i]; fprintf( stderr, "H stem l=%.2f,%.2f r=%.2f,%.2f slave=%d\n", stem->left.x,stem->left.y,stem->right.x,stem->right.y,stem->master!=NULL ); if ( stem->dep_cnt > 0 ) for ( j=0; jdep_cnt; j++ ) { fprintf( stderr, "\tslave l=%.2f,%.2f r=%.2f,%.2f mode=%c left=%d\n", stem->dependent[j].stem->left.x,stem->dependent[j].stem->left.y, stem->dependent[j].stem->right.x,stem->dependent[j].stem->right.y, stem->dependent[j].dep_type,stem->dependent[j].lbase ); } if ( stem->serif_cnt > 0 ) for ( j=0; jserif_cnt; j++ ) { fprintf( stderr, "\tserif l=%.2f,%.2f r=%.2f,%.2f ball=%d left=%d\n", stem->serifs[j].stem->left.x,stem->serifs[j].stem->left.y, stem->serifs[j].stem->right.x,stem->serifs[j].stem->right.y, stem->serifs[j].is_ball,stem->serifs[j].lbase ); } } fprintf( stderr, "\n" ); if ( gd->vbundle != NULL ) for ( i=0; ivbundle->cnt; i++ ) { stem = gd->vbundle->stemlist[i]; fprintf( stderr, "V stem l=%.2f,%.2f r=%.2f,%.2f slave=%d\n", stem->left.x,stem->left.y,stem->right.x,stem->right.y,stem->master!=NULL ); if ( stem->dep_cnt > 0 ) for ( j=0; jdep_cnt; j++ ) { fprintf( stderr, "\tslave l=%.2f,%.2f r=%.2f,%.2f mode=%c left=%d\n", stem->dependent[j].stem->left.x,stem->dependent[j].stem->left.y, stem->dependent[j].stem->right.x,stem->dependent[j].stem->right.y, stem->dependent[j].dep_type,stem->dependent[j].lbase ); } if ( stem->serif_cnt > 0 ) for ( j=0; jserif_cnt; j++ ) { fprintf( stderr, "\tserif l=%.2f,%.2f r=%.2f,%.2f ball=%d left=%d\n", stem->serifs[j].stem->left.x,stem->serifs[j].stem->left.y, stem->serifs[j].stem->right.x,stem->serifs[j].stem->right.y, stem->serifs[j].is_ball,stem->serifs[j].lbase ); } if ( stem->prev_c_m != NULL ) { fprintf( stderr,"\tprev counter master: l=%.2f r=%.2f\n", stem->prev_c_m->left.x,stem->prev_c_m->right.x ); } if ( stem->next_c_m != NULL ) { fprintf( stderr,"\tnext counter master: l=%.2f r=%.2f\n", stem->next_c_m->left.x,stem->next_c_m->right.x ); } } fprintf( stderr, "\n" ); if ( gd->ibundle != NULL ) for ( i=0; iibundle->cnt; i++ ) { stem = gd->ibundle->stemlist[i]; fprintf( stderr, "I stem l=%.2f,%.2f r=%.2f,%.2f slave=%d\n", stem->left.x,stem->left.y,stem->right.x,stem->right.y,stem->master!=NULL ); if ( stem->dep_cnt > 0 ) for ( j=0; jdep_cnt; j++ ) { fprintf( stderr, "\tslave l=%.2f,%.2f r=%.2f,%.2f mode=%c left=%d\n", stem->dependent[j].stem->left.x,stem->dependent[j].stem->left.y, stem->dependent[j].stem->right.x,stem->dependent[j].stem->right.y, stem->dependent[j].dep_type,stem->dependent[j].lbase ); } if ( stem->serif_cnt > 0 ) for ( j=0; jserif_cnt; j++ ) { fprintf( stderr, "\tserif l=%.2f,%.2f r=%.2f,%.2f ball=%d left=%d\n", stem->serifs[j].stem->left.x,stem->serifs[j].stem->left.y, stem->serifs[j].stem->right.x,stem->serifs[j].stem->right.y, stem->serifs[j].is_ball,stem->serifs[j].lbase ); } } fprintf( stderr, "\n" ); } #endif static void AssignPointsToStems( struct glyphdata *gd,int startnum,DBounds *bounds ) { int i; struct pointdata *pd; struct stemdata *stem = NULL; BasePoint dir; for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { pd = &gd->points[i]; if ( pd->prev_e_cnt > 0 ) BuildStem( gd,pd,false,true,true,0 ); else HalfStemNoOpposite( gd,pd,stem,&pd->prevunit,false ); if ( pd->next_e_cnt > 0 ) BuildStem( gd,pd,true,true,true,0 ); else HalfStemNoOpposite( gd,pd,stem,&pd->nextunit,true ); if ( pd->x_corner ) { if ( pd->bothedge!=NULL ) stem = DiagonalCornerStem( gd,pd,true ); dir.x = 0; dir.y = 1; HalfStemNoOpposite( gd,pd,stem,&dir,2 ); } else if ( pd->y_corner ) { if ( pd->bothedge!=NULL ) stem = DiagonalCornerStem( gd,pd,true ); dir.x = 1; dir.y = 0; HalfStemNoOpposite( gd,pd,stem,&dir,2 ); } } gd->lspace = malloc(gd->pcnt*sizeof(struct segment)); gd->rspace = malloc(gd->pcnt*sizeof(struct segment)); gd->bothspace = malloc(3*gd->pcnt*sizeof(struct segment)); gd->activespace = malloc(3*gd->pcnt*sizeof(struct segment)); #if GLYPH_DATA_DEBUG fprintf( stderr,"Going to calculate stem active zones for %s\n",gd->sc->name ); #endif for ( i=startnum; istemcnt; ++i ) { stem = &gd->stems[i]; NormalizeStem( gd,stem ); if ( gd->stems[i].ghost ) FigureGhostActive( gd,stem ); else if ( gd->stems[i].bbox ) AssignPointsToBBoxHint( gd,bounds,stem,( stem->unit.y == 1 )); else FigureStemActive( gd,&gd->stems[i] ); } #if GLYPH_DATA_DEBUG DumpGlyphData( gd ); #endif free(gd->lspace); gd->lspace = NULL; free(gd->rspace); gd->rspace = NULL; free(gd->bothspace); gd->bothspace = NULL; free(gd->activespace); gd->activespace = NULL; } static void _DStemInfoToStemData( struct glyphdata *gd,DStemInfo *dsi,int *startcnt ) { struct stemdata *stem; if ( gd->stems == NULL ) { gd->stems = calloc( 2*gd->pcnt,sizeof( struct stemdata )); gd->stemcnt = 0; } *startcnt = gd->stemcnt; while ( dsi != NULL ) { stem = NewStem( gd,&dsi->unit,&dsi->left,&dsi->right ); stem->positioned = true; dsi = dsi->next; } } struct glyphdata *DStemInfoToStemData( struct glyphdata *gd,DStemInfo *dsi ) { int startcnt; if ( dsi == NULL ) return( gd ); _DStemInfoToStemData( gd,dsi,&startcnt ); AssignPointsToStems( gd,startcnt,NULL ); return( gd ); } static void _StemInfoToStemData( struct glyphdata *gd,StemInfo *si,DBounds *bounds,int is_v,int *startcnt ) { struct stemdata *stem; BasePoint dir,left,right; dir.x = !is_v; dir.y = is_v; if ( gd->stems == NULL ) { gd->stems = calloc( 2*gd->pcnt,sizeof( struct stemdata )); gd->stemcnt = 0; } *startcnt = gd->stemcnt; while ( si != NULL ) { left.x = ( is_v ) ? si->start : 0; left.y = ( is_v ) ? 0 : si->start + si->width; right.x = ( is_v ) ? si->start + si->width : 0; right.y = ( is_v ) ? 0 : si->start; stem = NewStem( gd,&dir,&left,&right ); stem->ghost = si->ghost; if (( is_v && left.x >= bounds->minx && left.x < bounds->minx + dist_error_hv && right.x > bounds->maxx - dist_error_hv && right.x <= bounds->maxx ) || ( !is_v && right.y >= bounds->miny && right.y < bounds->miny + dist_error_hv && left.y > bounds->maxy - dist_error_hv && left.y <= bounds->maxy )) stem->bbox = true; stem->positioned = true; si = si->next; } } struct glyphdata *StemInfoToStemData( struct glyphdata *gd,StemInfo *si,int is_v ) { DBounds bounds; int startcnt; if ( si == NULL ) return( gd ); SplineCharFindBounds( gd->sc,&bounds ); _StemInfoToStemData( gd,si,&bounds,is_v,&startcnt ); AssignPointsToStems( gd,startcnt,&bounds ); return( gd ); } static int ValidConflictingStem( struct stemdata *stem1,struct stemdata *stem2 ) { int x_dir = fabs( stem1->unit.y ) > fabs( stem1->unit.x ); double s1, e1, s2, e2, temp; s1 = (&stem1->left.x)[!x_dir] - ((&stem1->left.x)[x_dir] * (&stem1->unit.x)[!x_dir] )/(&stem1->unit.x)[x_dir]; e1 = (&stem1->right.x)[!x_dir] - ((&stem1->right.x)[x_dir] * (&stem1->unit.x)[!x_dir] )/(&stem1->unit.x)[x_dir]; s2 = (&stem2->left.x)[!x_dir] - ((&stem2->left.x)[x_dir] * (&stem2->unit.x)[!x_dir] )/(&stem2->unit.x)[x_dir]; e2 = (&stem2->right.x)[!x_dir] - ((&stem2->right.x)[x_dir] * (&stem2->unit.x)[!x_dir] )/(&stem2->unit.x)[x_dir]; if ( s1 > e1 ) { temp = s1; s1 = e1; e1 = temp; } if ( s2 > e2 ) { temp = s2; s2 = e2; e2 = temp; } /* If stems don't overlap, then there is no conflict here */ if ( s2 >= e1 || s1 >= e2 ) return( false ); /* Stems which have no points assigned cannot be valid masters for */ /* other stems (however there is a notable exception for ghost hints) */ if (( stem1->lpcnt > 0 || stem1->rpcnt > 0 ) && stem2->lpcnt == 0 && stem2->rpcnt == 0 && !stem2->ghost ) return( false ); /* Bounding box stems are always preferred */ if ( stem1->bbox && !stem2->bbox ) return( false ); /* Stems associated with blue zones always preferred to any other stems */ if ( stem1->blue >=0 && stem2->blue < 0 ) return( false ); /* Don't attempt to handle together stems, linked to different zones */ if ( stem1->blue >=0 && stem2->blue >= 0 && stem1->blue != stem2->blue ) return( false ); /* If both stems are associated with a blue zone, but one of them is for */ /* a ghost hint, then that stem is preferred */ if ( stem1->ghost && !stem2->ghost ) return( false ); return( true ); } static int HasDependentStem( struct stemdata *master,struct stemdata *slave ) { int i; struct stemdata *tstem; if ( slave->master != NULL && master->dep_cnt > 0 ) { for ( i=0; idep_cnt; i++ ) { tstem = master->dependent[i].stem; if ( tstem == slave || HasDependentStem( tstem,slave )) return( true ); } } return( false ); } static int PreferEndDep( struct stemdata *stem, struct stemdata *smaster,struct stemdata *emaster,char s_type,char e_type ) { int hv = IsUnitHV( &stem->unit,true ); double sdist, edist; if ( !hv ) return( false ); if (( s_type == 'a' && e_type != 'a' ) || ( s_type == 'm' && e_type == 'i' )) return( false ); else if (( e_type == 'a' && s_type != 'a' ) || ( e_type == 'm' && s_type == 'i' )) return( true ); if ( s_type == 'm' && s_type == e_type ) { sdist = ( hv==1 ) ? fabs( smaster->right.y - stem->right.y ) : fabs( smaster->left.x - stem->left.x ); edist = ( hv==1 ) ? fabs( emaster->left.y - stem->left.y ) : fabs( emaster->right.x - stem->right.x ); return( edist < sdist ); } else return( emaster->clen > smaster->clen ); } static void LookForMasterHVStem( struct stemdata *stem,BlueData *bd ) { struct stemdata *tstem, *smaster=NULL, *emaster=NULL; struct stembundle *bundle = stem->bundle; double start, end, tstart, tend; double ssdist, sedist, esdist, eedist; double smin, smax, emin, emax, tsmin, tsmax, temin, temax; int is_x, i, link_to_s, stype, etype, allow_s, allow_e; is_x = ( bundle->unit.x == 1 ); if ( is_x ) { start = stem->right.y; end = stem->left.y; smin = start - stem->rmin - 2*dist_error_hv; smax = start - stem->rmax + 2*dist_error_hv; emin = end - stem->lmin - 2*dist_error_hv; emax = end - stem->lmax + 2* dist_error_hv; } else { start = stem->left.x; end = stem->right.x; smin = start + stem->lmax - 2*dist_error_hv; smax = start + stem->lmin + 2*dist_error_hv; emin = end + stem->rmax - 2*dist_error_hv; emax = end + stem->rmin + 2*dist_error_hv; } start = ( is_x ) ? stem->right.y : stem->left.x; end = ( is_x ) ? stem->left.y : stem->right.x; stype = etype = '\0'; for ( i=0; icnt; i++ ) { tstem = bundle->stemlist[i]; if ( is_x ) { tstart = tstem->right.y; tend = tstem->left.y; tsmin = tstart - tstem->rmin - 2*dist_error_hv; tsmax = tstart - tstem->rmax + 2*dist_error_hv; temin = tend - tstem->lmin - 2*dist_error_hv; temax = tend - tstem->lmax + 2* dist_error_hv; } else { tstart = tstem->left.x; tend = tstem->right.x; tsmin = tstart + tstem->lmax - 2*dist_error_hv; tsmax = tstart + tstem->lmin + 2*dist_error_hv; temin = tend + tstem->rmax - 2*dist_error_hv; temax = tend + tstem->rmin + 2*dist_error_hv; } tstart = ( is_x ) ? tstem->right.y : tstem->left.x; tend = ( is_x ) ? tstem->left.y : tstem->right.x; /* In this loop we are looking if the given stem has conflicts with */ /* other stems and if anyone of those conflicting stems should */ /* take precedence over it */ if ( stem == tstem || tend < start || tstart > end || !ValidConflictingStem( stem,tstem ) || HasDependentStem( stem,tstem )) continue; /* Usually in case of conflicts we prefer the stem with longer active */ /* zones. However a stem linked to a blue zone is always preferred to */ /* a stem which is not, and ghost hints are preferred to any other */ /* stems */ if ( stem->clen > tstem->clen && ValidConflictingStem( tstem,stem )) continue; stem->confl_cnt++; /* If the master stem is for a ghost hint or both the stems are */ /* linked to the same blue zone, then we can link only to the edge */ /* which fall into the blue zone */ allow_s = ( !tstem->ghost || tstem->width == 21 ) && ( stem->blue == -1 || stem->blue != tstem->blue || bd->blues[stem->blue][0] < 0 ); allow_e = ( !tstem->ghost || tstem->width == 20 ) && ( stem->blue == -1 || stem->blue != tstem->blue || bd->blues[stem->blue][0] > 0 ); /* Assume there are two stems which have (almost) coincident left edges. */ /* The hinting technique for this case is to merge all points found on */ /* those coincident edges together, position them, and then link to the */ /* opposite edges. */ /* However we don't allow merging if both stems can be snapped to a blue */ /* zone, unless their edges are _exactly_ coincident, as shifting features */ /* relatively to each other instead of snapping them to the same zone would */ /* obviously be wrong */ if ( allow_s && tstart > smin && tstart < smax && start > tsmin && start < tsmax && ( stem->blue == -1 || RealNear( tstart,start ))) { if ( smaster == NULL || stype != 'a' || smaster->clen < tstem->clen ) { smaster = tstem; stype = 'a'; } /* The same case for right edges */ } else if ( allow_e && tend > emin && tend < emax && end > temin && end < temax && ( stem->blue == -1 || RealNear( tend,end ))) { if ( emaster == NULL || etype != 'a' || emaster->clen < tstem->clen ) { emaster = tstem; etype = 'a'; } /* Nested stems. I first planned to handle them by positioning the */ /* narrower stem first, and then linking its edges to the opposed edges */ /* of the nesting stem. But this works well only in those cases where */ /* maintaining the dependent stem width is not important. So now the */ /* situations where a narrower or a wider stem can be preferred */ /* (because it has longer active zones) are equally possible. In the */ /* first case I link to the master stem just one edge of the secondary */ /* stem, just like with overlapping stems */ } else if ( tstart > start && tend < end ) { if ( allow_s && ( smaster == NULL || stype == 'i' || ( stype == 'm' && smaster->clen < tstem->clen ))) { smaster = tstem; stype = 'm'; } if ( allow_e && ( emaster == NULL || etype == 'i' || ( etype == 'm' && emaster->clen < tstem->clen ))) { emaster = tstem; etype = 'm'; } /* However if we have to prefer the nesting stem, we do as with */ /* overlapping stems which require interpolations, i. e. interpolate */ /* one edge and link to another */ } else if ( tstart < start && tend > end ) { link_to_s = ( allow_s && ( start - tstart < tend - end )); if ( link_to_s && ( smaster == NULL || ( stype == 'i' && smaster->clen < tstem->clen ))) { smaster = tstem; stype = 'i'; } else if ( !link_to_s && ( emaster == NULL || ( etype == 'i' && emaster->clen < tstem->clen ))) { emaster = tstem; etype = 'i'; } /* Overlapping stems. Here we first check all 4 distances between */ /* 4 stem edges. If the closest distance is between left or right */ /* edges, then the normal technique (in TrueType) is linking them */ /* with MDRP without maintaining a minimum distance. Otherwise */ /* we interpolate an edge of the "slave" stem between already */ /* positioned edges of the "master" stem, and then gridfit it */ } else if (( tstart < start && start < tend && tend < end ) || ( start < tstart && tstart < end && end < tend )) { ssdist = fabs( start - tstart ); sedist = fabs( start - tend ); esdist = fabs( end - tstart ); eedist = fabs( end - tend ); if ( allow_s && ( !allow_e || ( stem->width < tstem->width/3 && ssdist < eedist ) || ( ssdist <= eedist && ssdist <= sedist && ssdist <= esdist )) && ( smaster == NULL || ( stype == 'i' || ( stype == 'm' && smaster->clen < tstem->clen )))) { smaster = tstem; stype = 'm'; } else if ( allow_e && ( !allow_s || ( stem->width < tstem->width/3 && eedist < ssdist ) || ( eedist <= ssdist && eedist <= sedist && eedist <= esdist )) && ( emaster == NULL || ( etype == 'i' || ( etype == 'm' && emaster->clen < tstem->clen )))) { emaster = tstem; etype = 'm'; } else if ( allow_s && allow_e && ( smaster == NULL || ( stype == 'i' && smaster->clen < tstem->clen )) && sedist <= esdist && sedist <= ssdist && sedist <= eedist ) { smaster = tstem; stype = 'i'; } else if ( allow_s && allow_e && ( emaster == NULL || ( etype == 'i' && emaster->clen < tstem->clen )) && esdist <= sedist && esdist <= ssdist && esdist <= eedist ) { emaster = tstem; etype = 'i'; } } } if ( smaster != NULL && emaster != NULL ) { if ( PreferEndDep( stem,smaster,emaster,stype,etype )) smaster = NULL; else emaster = NULL; } if ( smaster != NULL ) { stem->master = smaster; if ( smaster->dependent == NULL ) smaster->dependent = calloc( bundle->cnt*2,sizeof( struct dependent_stem )); smaster->dependent[smaster->dep_cnt].stem = stem; smaster->dependent[smaster->dep_cnt].dep_type = stype; smaster->dependent[smaster->dep_cnt++].lbase = !is_x; } else if ( emaster != NULL ) { stem->master = emaster; if ( emaster->dependent == NULL ) emaster->dependent = calloc( bundle->cnt*2,sizeof( struct dependent_stem )); emaster->dependent[emaster->dep_cnt ].stem = stem; emaster->dependent[emaster->dep_cnt ].dep_type = etype; emaster->dependent[emaster->dep_cnt++].lbase = is_x; } } /* If a stem has been considered depending from another stem which in */ /* its turn has its own "master", and the first stem doesn't conflict */ /* with the "master" of the stem it overlaps (or any other stems), then */ /* this dependency is unneeded and processing it in the autoinstructor */ /* can even lead to undesired effects. Unfortunately we can't prevent */ /* detecting such dependecies in LookForMasterHVStem(), because we */ /* need to know the whole stem hierarchy first. So look for undesired */ /* dependencies and clean them now */ static void ClearUnneededDeps( struct stemdata *stem ) { struct stemdata *master; int i, j; if ( stem->confl_cnt == 1 && ( master = stem->master ) != NULL && master->master != NULL ) { stem->master = NULL; for ( i=j=0; idep_cnt; i++ ) { if ( jdependent[i-1],&master->dependent[i], sizeof( struct dependent_stem )); if ( master->dependent[i].stem != stem ) j++; } (master->dep_cnt)--; } } static void GDBundleStems( struct glyphdata *gd, int maxtoobig, int needs_deps ) { struct stemdata *stem, *tstem; int i, j, k, hv, hasl, hasr, stem_cnt; struct pointdata *lpd, *rpd; double dmove; DBounds bounds; /* Some checks for undesired stems which we couldn't do earlier */ /* First filter out HV stems which have only "potential" points */ /* on their left or right edge. Such stems aren't supposed to be */ /* used for PS hinting, so we mark them as "too big" */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; hasl = false; hasr = false; if ( IsUnitHV( &stem->unit,true ) && !stem->toobig && !stem->ghost && !stem->positioned ) { for ( j=0; jchunk_cnt && ( !hasl || !hasr ); ++j ) { if ( stem->chunks[j].l!=NULL && !stem->chunks[j].lpotential ) hasl = true; if ( stem->chunks[j].r!=NULL && !stem->chunks[j].rpotential ) hasr = true; } if ( !hasl || !hasr ) stem->toobig = true; } } /* Filter out HV stems which have both their edges controlled by */ /* other, narrower HV stems */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; hv = IsUnitHV( &stem->unit,true ); if ( IsUnitHV( &stem->unit,true )) { hasl = hasr = false; for ( j=0; jchunk_cnt; ++j ) { lpd = stem->chunks[j].l; rpd = stem->chunks[j].r; if ( lpd != NULL ) { stem_cnt = ( stem->chunks[j].lnext ) ? lpd->nextcnt : lpd->prevcnt; for ( k=0; kchunks[j].lnext ) ? lpd->nextstems[k] : lpd->prevstems[k]; /* Used to test tstem->toobig <= stem->toobig, but got into troubles with */ /* a weird terminal stem preventing a ball terminal from being properly detected, */ /* because both the stems initially have toobig == 1. */ /* See the "f" from Heuristica-Italic */ if ( tstem != stem && !tstem->toobig && tstem->positioned >= stem->positioned && tstem->width < stem->width && hv == IsUnitHV( &tstem->unit,true )) { hasl = true; break; } } } if ( rpd != NULL ) { stem_cnt = ( stem->chunks[j].rnext ) ? rpd->nextcnt : rpd->prevcnt; for ( k=0; kchunks[j].rnext ) ? rpd->nextstems[k] : rpd->prevstems[k]; if ( tstem != stem && !tstem->toobig && tstem->positioned >= stem->positioned && tstem->width < stem->width && hv == IsUnitHV( &tstem->unit,true )) { hasr = true; break; } } } if ( hasl && hasr ) { stem->toobig = 2; break; } } } } gd->hbundle = calloc( 1,sizeof( struct stembundle )); gd->hbundle->stemlist = calloc( gd->stemcnt,sizeof( struct stemdata *)); gd->hbundle->unit.x = 1; gd->hbundle->unit.y = 0; gd->hbundle->l_to_r.x = 0; gd->hbundle->l_to_r.y = -1; gd->vbundle = calloc( 1,sizeof( struct stembundle )); gd->vbundle->stemlist = calloc( gd->stemcnt,sizeof( struct stemdata *)); gd->vbundle->unit.x = 0; gd->vbundle->unit.y = 1; gd->vbundle->l_to_r.x = 1; gd->vbundle->l_to_r.y = 0; if ( gd->has_slant && !gd->only_hv ) { SplineCharFindBounds( gd->sc,&bounds ); gd->ibundle = calloc( 1,sizeof( struct stembundle )); gd->ibundle->stemlist = calloc( gd->stemcnt,sizeof( struct stemdata *)); gd->ibundle->unit.x = gd->slant_unit.x; gd->ibundle->unit.y = gd->slant_unit.y; gd->ibundle->l_to_r.x = -gd->ibundle->unit.y; gd->ibundle->l_to_r.y = gd->ibundle->unit.x; } for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->toobig > maxtoobig ) continue; hv = IsUnitHV( &stem->unit,true ); if ( hv == 1 ) { gd->hbundle->stemlist[(gd->hbundle->cnt)++] = stem; stem->bundle = gd->hbundle; } else if ( hv == 2 ) { gd->vbundle->stemlist[(gd->vbundle->cnt)++] = stem; stem->bundle = gd->vbundle; } else if ( gd->has_slant && !gd->only_hv && RealNear( stem->unit.x,gd->slant_unit.x ) && RealNear( stem->unit.y,gd->slant_unit.y )) { /* Move base point coordinates to the baseline to simplify */ /* stem ordering and positioning relatively to each other */ stem->left.x -= (( stem->left.y - bounds.miny ) * stem->unit.x )/stem->unit.y; stem->right.x -= (( stem->right.y - bounds.miny ) * stem->unit.x )/stem->unit.y; dmove = ( stem->left.y - bounds.miny ) / stem->unit.y; stem->left.y = stem->right.y = bounds.miny; for ( j=0; jactivecnt; j++ ) { stem->active[j].start += dmove; stem->active[j].end += dmove; } gd->ibundle->stemlist[(gd->ibundle->cnt)++] = stem; stem->bundle = gd->ibundle; stem->italic = true; } } qsort( gd->hbundle->stemlist,gd->hbundle->cnt,sizeof( struct stemdata *),stem_cmp ); qsort( gd->vbundle->stemlist,gd->vbundle->cnt,sizeof( struct stemdata *),stem_cmp ); if ( gd->has_slant && !gd->only_hv ) qsort( gd->ibundle->stemlist,gd->ibundle->cnt,sizeof( struct stemdata *),stem_cmp ); if ( !needs_deps ) return; for ( i=0; ihbundle->cnt; i++ ) LookForMasterHVStem( gd->hbundle->stemlist[i],&gd->bd ); for ( i=0; ihbundle->cnt; i++ ) ClearUnneededDeps( gd->hbundle->stemlist[i] ); for ( i=0; ivbundle->cnt; i++ ) LookForMasterHVStem( gd->vbundle->stemlist[i],&gd->bd ); for ( i=0; ivbundle->cnt; i++ ) ClearUnneededDeps( gd->vbundle->stemlist[i] ); } static void AddSerifOrBall( struct glyphdata *gd, struct stemdata *master,struct stemdata *slave,int lbase,int is_ball ) { struct dependent_serif *tserif; struct pointdata *spd; double width, min, max; int i, j, scnt, next; if ( lbase ) { width = fabs( ( slave->right.x - master->left.x ) * master->unit.y - ( slave->right.y - master->left.y ) * master->unit.x ); max = width + slave->rmin + 2*dist_error_hv; min = width + slave->rmax - 2*dist_error_hv; } else { width = fabs( ( master->right.x - slave->left.x ) * master->unit.y - ( master->right.y - slave->left.y ) * master->unit.x ); max = width - slave->lmax + 2*dist_error_hv; min = width - slave->lmin - 2*dist_error_hv; } scnt = master->serif_cnt; for ( i=0; iserifs[i]; if ( tserif->stem == slave && tserif->lbase == lbase ) break; else if ( tserif->width > min && tserif->width < max && tserif->lbase == lbase ) { for ( j=0; jchunk_cnt; j++ ) { spd = ( lbase ) ? slave->chunks[j].r : slave->chunks[j].l; next = ( lbase ) ? slave->chunks[j].rnext : slave->chunks[j].lnext; if ( spd != NULL && IsStemAssignedToPoint( spd,tserif->stem,next ) == -1 ) AddToStem( gd,tserif->stem,spd,NULL,next,false,false ); } break; } } if ( iserif_cnt ) return; master->serifs = realloc( master->serifs,( scnt+1 )*sizeof( struct dependent_serif )); master->serifs[scnt].stem = slave; master->serifs[scnt].width = width; master->serifs[scnt].lbase = lbase; master->serifs[scnt].is_ball = is_ball; master->serif_cnt++; /* Mark the dependent stem as related with a bundle, although it */ /* is not listed in that bundle itself */ slave->bundle = master->bundle; } static int IsBall( struct glyphdata *gd, struct pointdata *pd,struct stemdata *master,int lbase ) { double max, min, dot, coord; BasePoint *lbp, *rbp, *dir; Spline *test; struct pointdata *nbase, *pbase, *tpd; struct stem_chunk *chunk; int i, is_x, peak_passed; if ( pd == NULL || ( pd->x_extr != 1 && pd->y_extr != 1 )) return( false ); is_x = ( IsUnitHV( &master->unit,true ) == 1 ); lbp = ( lbase ) ? &master->left : &pd->base; rbp = ( lbase ) ? &pd->base : &master->right; min = ( is_x ) ? rbp->y : lbp->x; max = ( is_x ) ? lbp->y : rbp->x; peak_passed = false; nbase = pbase = NULL; test = pd->sp->next; dir = &pd->nextunit; if ( test != NULL ) do { tpd = &gd->points[test->to->ptindex]; if ( IsStemAssignedToPoint( tpd,master,true ) != -1 ) { nbase = tpd; break; } coord = ( is_x ) ? tpd->base.y : tpd->base.x; dot = tpd->nextunit.x * dir->x + tpd->nextunit.y * dir->y; if ( dot == 0 && !peak_passed ) { dir = &tpd->nextunit; dot = 1.0; peak_passed = true; } test = test->to->next; } while ( test != NULL && test != pd->sp->next && dot > 0 && coord >= min && coord <= max ); peak_passed = false; test = pd->sp->prev; dir = &pd->prevunit; if ( test != NULL ) do { tpd = &gd->points[test->from->ptindex]; if ( IsStemAssignedToPoint( tpd,master,false ) != -1 ) { pbase = tpd; break; } coord = ( is_x ) ? tpd->base.y : tpd->base.x; dot = tpd->prevunit.x * dir->x + tpd->prevunit.y * dir->y; if ( dot == 0 && !peak_passed ) { dir = &tpd->prevunit; dot = 1.0; peak_passed = true; } test = test->from->prev; } while ( test != NULL && test != pd->sp->prev && dot > 0 && coord >= min && coord <= max ); if ( nbase != NULL && pbase != NULL ) { for ( i=0; ichunk_cnt; i++ ) { chunk = &master->chunks[i]; if (( chunk->l == nbase && chunk->r == pbase ) || ( chunk->l == pbase && chunk->r == nbase )) return( true ); } } return( false ); } static void GetSerifData( struct glyphdata *gd,struct stemdata *stem ) { int i, j, is_x, stem_cnt; int snext, enext, eidx, allow_s, allow_e, s_ball, e_ball; struct stem_chunk *chunk; struct stemdata *tstem, *smaster=NULL, *emaster=NULL; struct pointdata *spd, *epd; struct stembundle *bundle; double start, end, tstart, tend, smend, emstart; is_x = ( IsUnitHV( &stem->unit,true ) == 1 ); bundle = ( is_x ) ? gd->hbundle : gd->vbundle; start = ( is_x ) ? stem->right.y : stem->left.x; end = ( is_x ) ? stem->left.y : stem->right.x; allow_s = allow_e = true; s_ball = e_ball = 0; for ( i=0; ichunk_cnt && ( allow_s == true || allow_e == true ); i++ ) { chunk = &stem->chunks[i]; spd = ( is_x ) ? chunk->r : chunk->l; snext = ( is_x ) ? chunk->rnext : chunk->lnext; epd = ( is_x ) ? chunk->l : chunk->r; enext = ( is_x ) ? chunk->lnext : chunk->rnext; if ( spd != NULL && allow_e ) { stem_cnt = ( snext ) ? spd->nextcnt : spd->prevcnt; for ( j=0; jnextstems[j] : spd->prevstems[j]; if (RealNear( tstem->unit.x,stem->unit.x ) && RealNear( tstem->unit.y,stem->unit.y ) && !tstem->toobig ) { chunk->is_ball = e_ball = IsBall( gd,epd,tstem,!is_x ); if ( e_ball ) { chunk->ball_m = tstem; emaster = tstem; emstart = ( is_x ) ? tstem->right.y : tstem->left.x; } allow_s = false; } } } if ( epd != NULL && allow_s ) { stem_cnt = ( enext ) ? epd->nextcnt : epd->prevcnt; for ( j=0; jnextstems[j] : epd->prevstems[j]; if (tstem->unit.x == stem->unit.x && tstem->unit.y == stem->unit.y && !tstem->toobig ) { chunk->is_ball = s_ball = IsBall( gd,spd,tstem,is_x ); if ( s_ball ) { chunk->ball_m = tstem; smaster = tstem; smend = ( is_x ) ? tstem->left.y : tstem->right.x; } allow_e = false; } } } } for ( i=0; icnt; i++ ) { tstem = bundle->stemlist[i]; if (tstem->unit.x != stem->unit.x || tstem->unit.y != stem->unit.y || tstem->toobig || tstem->width >= stem->width ) continue; tstart = ( is_x ) ? tstem->right.y : tstem->left.x; tend = ( is_x ) ? tstem->left.y : tstem->right.x; if ( tstart >= start && tend <= end ) { if ( allow_s && tstart > start ) { for ( j=0; jchunk_cnt && smaster != tstem; j++ ) { if ( is_x ) { spd = tstem->chunks[j].l; snext = tstem->chunks[j].lnext; eidx = tstem->chunks[j].l_e_idx; } else { spd = tstem->chunks[j].r; snext = tstem->chunks[j].rnext; eidx = tstem->chunks[j].r_e_idx; } if ( spd != NULL && ConnectsAcrossToStem( gd,spd,snext,stem,is_x,eidx ) && ( smaster == NULL || smend - start > tend - start )) { smaster = tstem; smend = tend; } } } if ( allow_e && tend < end ) { for ( j=0; jchunk_cnt && emaster != tstem; j++ ) { if ( is_x ) { epd = tstem->chunks[j].r; enext = tstem->chunks[j].rnext; eidx = tstem->chunks[j].r_e_idx; } else { epd = tstem->chunks[j].l; enext = tstem->chunks[j].lnext; eidx = tstem->chunks[j].l_e_idx; } if ( epd != NULL && ConnectsAcrossToStem( gd,epd,enext,stem,!is_x,eidx ) && ( emaster == NULL || end - emstart > end - tstart )) { emaster = tstem; emstart = tstart; } } } } } if ( smaster != NULL ) AddSerifOrBall( gd,smaster,stem,is_x,s_ball ); if ( emaster != NULL ) AddSerifOrBall( gd,emaster,stem,!is_x,e_ball ); } static double ActiveOverlap( struct stemdata *stem1,struct stemdata *stem2 ) { int is_x, i, j = 0; double base1, base2, s1, e1, s2, e2, s, e, len = 0; is_x = ( IsUnitHV( &stem1->unit,true ) == 2 ); base1 = ( &stem1->left.x )[is_x]; base2 = ( &stem2->left.x )[is_x]; for ( i=0; iactivecnt; i++ ) { s1 = base1 + stem1->active[i].start; e1 = base1 + stem1->active[i].end; for ( ; jactivecnt; j++ ) { s2 = base2 + stem2->active[j].start; e2 = base2 + stem2->active[j].end; if ( s2 > e1 ) break; if ( e2 < s1 ) continue; s = s2 < s1 ? s1 : s2; e = e2 > e1 ? e1 : e2; if ( ewidth >= s1->width - dist_error_hv && ts1->width <= s1->width + dist_error_hv && ts2->width >= s2->width - dist_error_hv && ts2->width <= s2->width + dist_error_hv ); reversed = (ts1->width >= s2->width - dist_error_hv && ts1->width <= s2->width + dist_error_hv && ts2->width >= s1->width - dist_error_hv && ts2->width <= s1->width + dist_error_hv ); if ( !normal && !reversed ) return( false ); if ( normal ) { olen1 = ActiveOverlap( s1, ts1 ); olen2 = ActiveOverlap( s2, ts2 ); ret = olen1 > s1->clen/3 && olen1 > ts1->clen/3 && olen2 > s2->clen/3 && olen2 > ts2->clen/3; } else if ( reversed ) { olen1 = ActiveOverlap( s1, ts2 ); olen2 = ActiveOverlap( s2, ts1 ); ret = olen1 > s1->clen/3 && olen1 > ts2->clen/3 && olen2 > s2->clen/3 && olen2 > ts1->clen/3; } return( ret ); } static void FindCounterGroups( struct glyphdata *gd,int is_v ) { struct stembundle *bundle = is_v ? gd->vbundle : gd->hbundle; struct stemdata *curm, *prevm, *cur, *prev; int i, j; double mdist, dist; prevm = NULL; for ( i=0; icnt; i++ ) { curm = prev = bundle->stemlist[i]; if ( curm->master != NULL ) continue; if ( prevm == NULL || curm->prev_c_m != NULL ) { prevm = curm; continue; } mdist = is_v ? curm->left.x - prevm->right.x : curm->right.y - prevm->left.y; for ( j=i+1; jcnt; j++ ) { cur = bundle->stemlist[j]; if ( cur->master != NULL ) continue; if ( cur->prev_c_m != NULL ) { prev = cur; continue; } dist = is_v ? cur->left.x - prev->right.x : cur->right.y - prev->left.y; if ( mdist > dist - dist_error_hv && mdist < dist + dist_error_hv && StemPairsSimilar( prevm,curm,prev,cur )) { prev->next_c_m = prevm; cur->prev_c_m = curm; } prev = cur; } prevm = curm; } } /* Normally we use the DetectDiagonalStems flag (set via the Preferences dialog) to determine */ /* if diagonal stems should be generated. However, sometimes it makes sense to reduce the */ /* processing time, deliberately turning the diagonal stem detection off: in particular we */ /* don't need any diagonal stems if we only want to assign points to some preexisting HV */ /* hints. For thisreason the only_hv argument still can be passed to this function. */ struct glyphdata *GlyphDataInit( SplineChar *sc,int layer,double em_size,int only_hv ) { struct glyphdata *gd; struct pointdata *pd; int i; SplineSet *ss; SplinePoint *sp; Monotonic *m; int cnt; double iangle; if ( layer<0 || layer>=sc->layer_cnt ) return( NULL ); /* We only hint one layer at a time */ /* We shan't try to hint references yet */ if ( sc->layers[layer].splines==NULL ) return( NULL ); gd = calloc( 1,sizeof( struct glyphdata )); gd->only_hv = only_hv; gd->layer = layer; gd->sc = sc; gd->sf = sc->parent; gd->emsize = em_size; gd->order2 = ( sc->parent != NULL ) ? sc->parent->layers[layer].order2 : false; gd->fuzz = GetBlueFuzz( sc->parent ); dist_error_hv = .0035*gd->emsize; dist_error_diag = .0065*gd->emsize; dist_error_curve = .022*gd->emsize; if ( sc->parent != NULL && sc->parent->italicangle ) { iangle = ( 90 + sc->parent->italicangle ); gd->has_slant = true; gd->slant_unit.x = cos( iangle * ( PI/180 )); gd->slant_unit.y = sin( iangle * ( PI/180 )); } else { gd->has_slant = false; gd->slant_unit.x = 0; gd->slant_unit.y = 1; } /* SSToMContours can clean up the splinesets (remove 0 length splines) */ /* so it must be called BEFORE everything else (even though logically */ /* that doesn't make much sense). Otherwise we might have a pointer */ /* to something since freed */ gd->ms = SSsToMContours(sc->layers[layer].splines,over_remove); /* second argument is meaningless here */ gd->realcnt = gd->pcnt = SCNumberPoints( sc, layer ); for ( i=0, ss=sc->layers[layer].splines; ss!=NULL; ss=ss->next, ++i ); gd->ccnt = i; gd->contourends = malloc((i+1)*sizeof(int)); for ( i=0, ss=sc->layers[layer].splines; ss!=NULL; ss=ss->next, ++i ) { SplinePoint *last; if ( ss->first->prev!=NULL ) last = ss->first->prev->from; else last = ss->last; if ( last->ttfindex==0xffff ) gd->contourends[i] = last->nextcpindex; else gd->contourends[i] = last->ttfindex; } gd->contourends[i] = -1; /* Create temporary point numbers for the implied points. We need this */ /* for metafont if nothing else */ for ( ss= sc->layers[layer].splines; ss!=NULL; ss = ss->next ) { for ( sp = ss->first; ; ) { if ( sp->ttfindex < gd->realcnt ) sp->ptindex = sp->ttfindex; else if ( sp->ttfindex == 0xffff ) sp->ptindex = gd->pcnt++; if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } } gd->norefpcnt = gd->pcnt; /* And for 0xfffe points such as those used in glyphs with order2 glyphs */ /* with references. */ for ( ss = sc->layers[layer].splines; ss!=NULL; ss = ss->next ) { for ( sp = ss->first; ; ) { if ( sp->ttfindex == 0xfffe ) sp->ptindex = gd->pcnt++; if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } } gd->pspace = malloc( gd->pcnt*sizeof( struct pointdata *)); /*gd->ms = SSsToMContours(sc->layers[layer].splines,over_remove);*/ /* second argument is meaningless here */ for ( m=gd->ms, cnt=0; m!=NULL; m=m->linked, ++cnt ); gd->space = malloc((cnt+2)*sizeof(Monotonic*)); gd->mcnt = cnt; gd->points = calloc(gd->pcnt,sizeof(struct pointdata)); for ( ss=sc->layers[layer].splines; ss!=NULL; ss=ss->next ) if ( ss->first->prev!=NULL ) { for ( sp=ss->first; ; ) { PointInit( gd,sp,ss ); if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } } for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { pd = &gd->points[i]; if ( !pd->nextzero ) pd->next_e_cnt = FindMatchingEdge(gd,pd,true,pd->nextedges); if ( !pd->prevzero ) pd->prev_e_cnt = FindMatchingEdge(gd,pd,false,pd->prevedges); if (( pd->symetrical_h || pd->symetrical_v ) && ( pd->x_corner || pd->y_corner)) FindMatchingEdge(gd,pd,2,&pd->bothedge); } return( gd ); } struct glyphdata *GlyphDataBuild( SplineChar *sc,int layer, BlueData *bd,int use_existing ) { struct glyphdata *gd; struct pointdata *pd; struct stemdata *stem; BasePoint dir; struct stem_chunk *chunk; int i, j, only_hv, startcnt, stemcnt, ecnt, hv, has_h, has_v; double em_size; DBounds bounds; only_hv = ( !detect_diagonal_stems && ( !use_existing || sc->dstem == NULL )); em_size = ( sc->parent != NULL ) ? sc->parent->ascent + sc->parent->descent : 1000; gd = GlyphDataInit( sc,layer,em_size,only_hv ); if ( gd == NULL ) return( gd ); /* Get the alignment zones */ if ( bd == NULL ) QuickBlues( gd->sf,gd->layer,&gd->bd ); else memcpy( &gd->bd,bd,sizeof( BlueData )); /* There will never be more lines than there are points (counting next/prev as separate) */ gd->lines = malloc( 2*gd->pcnt*sizeof( struct linedata )); gd->linecnt = 0; for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { pd = &gd->points[i]; if (( !gd->only_hv || pd->next_hor || pd->next_ver ) && pd->nextline==NULL ) { pd->nextline = BuildLine(gd,pd,true); if ( pd->colinear ) pd->prevline = pd->nextline; } if (( !gd->only_hv || pd->prev_hor || pd->prev_ver ) && pd->prevline==NULL ) { pd->prevline = BuildLine(gd,pd,false); if ( pd->colinear && pd->nextline == NULL ) pd->nextline = pd->prevline; } } /* There will never be more stems than there are points (counting next/prev as separate) */ gd->stems = calloc( 2*gd->pcnt,sizeof( struct stemdata )); gd->stemcnt = 0; /* None used so far */ if ( use_existing ) { SplineCharFindBounds( gd->sc,&bounds ); if ( sc->vstem != NULL ) _StemInfoToStemData( gd,sc->vstem,&bounds,true,&startcnt ); if ( sc->hstem != NULL ) _StemInfoToStemData( gd,sc->hstem,&bounds,false,&startcnt ); if ( sc->dstem != NULL ) _DStemInfoToStemData( gd,sc->dstem,&startcnt ); } for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp!=NULL ) { pd = &gd->points[i]; if ( pd->prev_e_cnt > 0 ) { ecnt = BuildStem( gd,pd,false,false,use_existing,0 ); if ( ecnt == 0 && pd->prev_e_cnt > 1 ) BuildStem( gd,pd,false,false,false,1 ); } if ( pd->next_e_cnt > 0 ) { ecnt = BuildStem( gd,pd,true,false,use_existing,0 ); if ( ecnt == 0 && pd->next_e_cnt > 1 ) BuildStem( gd,pd,true,false,false,1 ); } if ( pd->bothedge!=NULL ) { DiagonalCornerStem( gd,pd,false ); } /* Snap corner extrema to preexisting hints if they have not */ /* already been. This is currently done only when preparing */ /* glyph data for the autoinstructor */ if ( use_existing && ( pd->x_corner || pd->y_corner )) { has_h = has_v = false; for ( j=0; jprevcnt && (( pd->x_corner && !has_v ) || ( pd->y_corner && !has_h )); j++ ) { hv = IsUnitHV( &pd->prevstems[j]->unit,true ); if ( hv == 1 ) has_h = true; else if ( hv == 2 ) has_v = true; } for ( j=0; jnextcnt && (( pd->x_corner && !has_v ) || ( pd->y_corner && !has_h )); j++ ) { hv = IsUnitHV( &pd->nextstems[j]->unit,true ); if ( hv == 1 ) has_h = true; else if ( hv == 2 ) has_v = true; } if ( pd->x_corner && !has_v ) { dir.x = 0; dir.y = 1; HalfStemNoOpposite( gd,pd,NULL,&dir,2 ); } else if ( pd->y_corner && !has_h ) { dir.x = 1; dir.y = 0; HalfStemNoOpposite( gd,pd,NULL,&dir,2 ); } } } AssignLinePointsToStems( gd ); /* Normalize stems before calculating active zones (as otherwise */ /* we don't know exact positions of stem edges */ for ( i=0; istemcnt; ++i ) NormalizeStem( gd,&gd->stems[i] ); GDNormalizeStubs( gd ); /* Figure out active zones at the first order (as they are needed to */ /* determine which stems are undesired and they don't depend from */ /* the "potential" state of left/right points in chunks */ gd->lspace = malloc(gd->pcnt*sizeof(struct segment)); gd->rspace = malloc(gd->pcnt*sizeof(struct segment)); gd->bothspace = malloc(3*gd->pcnt*sizeof(struct segment)); gd->activespace = malloc(3*gd->pcnt*sizeof(struct segment)); #if GLYPH_DATA_DEBUG fprintf( stderr,"Going to calculate stem active zones for %s\n",gd->sc->name ); #endif for ( i=0; istemcnt; ++i ) FigureStemActive( gd,&gd->stems[i] ); /* Check this before resolving stem conflicts, as otherwise we can */ /* occasionally prefer a stem which should be excluded from the list */ /* for some other reasons */ GDFindUnlikelyStems( gd ); /* we were cautious about assigning points to stems, go back now and see */ /* if there are any low-quality matches which remain unassigned, and if */ /* so then assign them to the stem they almost fit on. */ for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; for ( j=0; jchunk_cnt; ++j ) { chunk = &stem->chunks[j]; if ( chunk->l!=NULL && chunk->lpotential ) { stemcnt = ( chunk->lnext ) ? chunk->l->nextcnt : chunk->l->prevcnt; if ( stemcnt == 1 ) chunk->lpotential = false; } if ( chunk->r!=NULL && chunk->rpotential ) { stemcnt = ( chunk->rnext ) ? chunk->r->nextcnt : chunk->r->prevcnt; if ( stemcnt == 1 ) chunk->rpotential = false; } } } /* If there are multiple stems, find the one which is closest to this point */ for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp != NULL ) { pd = &gd->points[i]; if ( pd->prevcnt > 1 ) CheckPotential( gd,pd,false ); if ( pd->nextcnt > 1 ) CheckPotential( gd,pd,true ); } if ( hint_bounding_boxes ) CheckForBoundingBoxHints( gd ); CheckForGhostHints( gd ); if ( use_existing ) MarkDStemCorners( gd ); GDBundleStems( gd,0,use_existing ); if ( use_existing ) { for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; if ( stem->toobig == 1 && IsUnitHV( &stem->unit,true )) GetSerifData( gd,stem ); } FindCounterGroups( gd,true ); } #if GLYPH_DATA_DEBUG DumpGlyphData( gd ); #endif free(gd->lspace); gd->lspace = NULL; free(gd->rspace); gd->rspace = NULL; free(gd->bothspace); gd->bothspace = NULL; free(gd->activespace); gd->activespace = NULL; return( gd ); } void GlyphDataFree(struct glyphdata *gd) { int i; if ( gd == NULL ) return; FreeMonotonics( gd->ms ); gd->ms = NULL; free( gd->space ); gd->space = NULL; free( gd->sspace ); gd->sspace = NULL; free( gd->stspace ); gd->stspace = NULL; free( gd->pspace ); gd->pspace = NULL; /* Clean up temporary point numbers */ for ( i=0; ipcnt; ++i ) if ( gd->points[i].sp != NULL ) gd->points[i].sp->ptindex = 0; if ( gd->hbundle != NULL ) { free( gd->hbundle->stemlist ); free( gd->hbundle ); } if ( gd->vbundle != NULL ) { free( gd->vbundle->stemlist ); free( gd->vbundle ); } if ( gd->ibundle != NULL ) { free( gd->ibundle->stemlist ); free( gd->ibundle ); } for ( i=0; ilinecnt; ++i ) free( gd->lines[i].points ); for ( i=0; istemcnt; ++i ) { free( gd->stems[i].chunks ); free( gd->stems[i].dependent ); free( gd->stems[i].serifs ); free( gd->stems[i].active ); } for ( i=0; ipcnt; ++i ) { free( gd->points[i].nextstems ); free( gd->points[i].next_is_l ); free( gd->points[i].prevstems ); free( gd->points[i].prev_is_l ); } free( gd->lines ); free( gd->stems ); free( gd->contourends ); free( gd->points ); free( gd ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/ttfinstrs.h0000664000175000017500000000653013510660062016614 00000000000000/* Copyright (C) 2001-2012 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. */ 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 }; extern const char *ff_ttf_instrnames[]; dvisvgm-2.8.1/libs/ff-woff/fontforge/edgelist2.h0000664000175000017500000000611613510660062016436 00000000000000/* Copyright (C) 2004-2012 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 _EDGELIST2_H #define _EDGELIST2_H #include "splinefont.h" struct monotonic; typedef struct mlist { Spline *s; struct monotonic *m; /* May get slightly munched but will */ /* always have right spline. we fix when we need it */ extended t; int isend; BasePoint unit; struct mlist *next; } MList; typedef struct intersection { MList *monos; BasePoint inter; struct intersection *next; } Intersection; typedef struct preintersection { BasePoint inter; struct monotonic *m1; bigreal t1; struct monotonic *m2; bigreal t2; unsigned int is_close: 1; struct preintersection *next; } PreIntersection; #define FF_RELATIONAL_GEOM typedef struct monotonic { Spline *s; extended tstart, tend; #ifdef FF_RELATIONAL_GEOM extended otstart, otend; #endif struct monotonic *next, *prev; /* along original contour */ uint8 xup; /* increasing t => increasing x */ uint8 yup; unsigned int isneeded : 1; unsigned int isunneeded : 1; unsigned int mutual_collapse : 1; unsigned int exclude : 1; struct intersection *start; struct intersection *end; DBounds b; extended other, t; struct monotonic *linked; /* singly linked list of all monotonic*/ /* segments, no contour indication */ double when_set; /* Debugging */ struct preintersection *pending; } Monotonic; extern void FreeMonotonics(Monotonic *m); extern Monotonic *SSsToMContours(SplineSet *spl, enum overlap_type ot); /* overlap_type controls whether we look at selected splinesets or all splinesets */ extern int MonotonicFindAt(Monotonic *ms,int which, extended test, Monotonic **space ); #endif /* _EDGELIST2_H */ dvisvgm-2.8.1/libs/ff-woff/fontforge/splineutil2.c0000664000175000017500000014316513510660062017027 00000000000000/* -*- coding: utf-8 -*- */ /* Copyright (C) 2000-2012 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 "fontforge.h" #include #include int new_em_size = 1000; int new_fonts_are_order2 = false; int loaded_fonts_same_as_new = false; int default_fv_row_count = 4; int default_fv_col_count = 16; int default_fv_font_size = 48; int default_fv_antialias=true; int default_fv_bbsized=false; int snaptoint=0; /*#define DEBUG 1*/ #if defined( FONTFORGE_CONFIG_USE_DOUBLE ) # define RE_NearZero .00000001 # define RE_Factor (1024.0*1024.0*1024.0*1024.0*1024.0*2.0) /* 52 bits => divide by 2^51 */ #else # define RE_NearZero .00001 # define RE_Factor (1024.0*1024.0*4.0) /* 23 bits => divide by 2^22 */ #endif int Within4RoundingErrors(bigreal v1, bigreal v2) { bigreal temp=v1*v2; bigreal re; if ( temp<0 ) /* Ok, if the two values are on different sides of 0 there */ return( false ); /* is no way they can be within a rounding error of each other */ else if ( temp==0 ) { if ( v1==0 ) return( v2-RE_NearZero ); else return( v1-RE_NearZero ); } else if ( v1>0 ) { if ( v1>v2 ) { /* Rounding error from the biggest absolute value */ re = v1/ (RE_Factor/4); return( v1-v2 < re ); } else { re = v2/ (RE_Factor/4); return( v2-v1 < re ); } } else { if ( v1 re ); } else { re = v2/ (RE_Factor/4); return( v2-v1 > re ); } } } int Within16RoundingErrors(bigreal v1, bigreal v2) { bigreal temp=v1*v2; bigreal re; if ( temp<0 ) /* Ok, if the two values are on different sides of 0 there */ return( false ); /* is no way they can be within a rounding error of each other */ else if ( temp==0 ) { if ( v1==0 ) return( v2-RE_NearZero ); else return( v1-RE_NearZero ); } else if ( v1>0 ) { if ( v1>v2 ) { /* Rounding error from the biggest absolute value */ re = v1/ (RE_Factor/16); return( v1-v2 < re ); } else { re = v2/ (RE_Factor/16); return( v2-v1 < re ); } } else { if ( v1 re ); } else { re = v2/ (RE_Factor/16); return( v2-v1 > re ); } } } int RealNear(real a,real b) { real d; #ifdef FONTFORGE_CONFIG_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.); #else /* For floats */ if ( a==0 ) return( b>-1e-5 && b<1e-5 ); if ( b==0 ) return( a>-1e-5 && a<1e-5 ); d = a/(1024*64.); #endif a-=b; if ( d<0 ) return( a>d && a<-d ); else return( a>-d && a-.001 ); } 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 ); } static int MinMaxWithin(Spline *spline) { extended dx, dy; int which; extended t1, t2; extended w; /* We know that this "spline" is basically one dimensional. As long as its*/ /* extrema are between the start and end points on that line then we can */ /* treat it as a line. If the extrema are way outside the line segment */ /* then it's a line that backtracks on itself */ 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; which = dxsplines[which],&t1,&t2); if ( t1==-1 ) return( true ); w = ((spline->splines[which].a*t1 + spline->splines[which].b)*t1 + spline->splines[which].c)*t1 + spline->splines[which].d; if ( RealNear(w, (&spline->to->me.x)[which]) || RealNear(w, (&spline->from->me.x)[which]) ) /* Close enough */; else if ( (w<(&spline->to->me.x)[which] && w<(&spline->from->me.x)[which]) || (w>(&spline->to->me.x)[which] && w>(&spline->from->me.x)[which]) ) return( false ); /* Outside */ w = ((spline->splines[which].a*t2 + spline->splines[which].b)*t2 + spline->splines[which].c)*t2 + spline->splines[which].d; if ( RealNear(w, (&spline->to->me.x)[which]) || RealNear(w, (&spline->from->me.x)[which]) ) /* Close enough */; else if ( (w<(&spline->to->me.x)[which] && w<(&spline->from->me.x)[which]) || (w>(&spline->to->me.x)[which] && w>(&spline->from->me.x)[which]) ) return( false ); /* Outside */ return( true ); } int SplineIsLinear(Spline *spline) { bigreal t1,t2, t3,t4; 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); if ( ! ((spline->from->nextcp.y >= spline->from->me.y && spline->from->nextcp.y <= spline->to->me.y && spline->to->prevcp.y >= spline->from->me.y && spline->to->prevcp.y <= spline->to->me.y ) || (spline->from->nextcp.y <= spline->from->me.y && spline->from->nextcp.y >= spline->to->me.y && spline->to->prevcp.y <= spline->from->me.y && spline->to->prevcp.y >= spline->to->me.y )) ) ret = MinMaxWithin(spline); /* 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); if ( ! ((spline->from->nextcp.x >= spline->from->me.x && spline->from->nextcp.x <= spline->to->me.x && spline->to->prevcp.x >= spline->from->me.x && spline->to->prevcp.x <= spline->to->me.x) || (spline->from->nextcp.x <= spline->from->me.x && spline->from->nextcp.x >= spline->to->me.x && spline->to->prevcp.x <= spline->from->me.x && spline->to->prevcp.x >= spline->to->me.x)) ) ret = MinMaxWithin(spline); } else { ret = true; t1 = (spline->from->nextcp.y-spline->from->me.y)/(spline->to->me.y-spline->from->me.y); t2 = (spline->from->nextcp.x-spline->from->me.x)/(spline->to->me.x-spline->from->me.x); t3 = (spline->to->me.y-spline->to->prevcp.y)/(spline->to->me.y-spline->from->me.y); t4 = (spline->to->me.x-spline->to->prevcp.x)/(spline->to->me.x-spline->from->me.x); ret = (Within16RoundingErrors(t1,t2) || (RealApprox(t1,0) && RealApprox(t2,0))) && (Within16RoundingErrors(t3,t4) || (RealApprox(t3,0) && RealApprox(t4,0))); if ( ret ) { if ( t1<0 || t2<0 || t3<0 || t4<0 || t1>1 || t2>1 || t3>1 || t4>1 ) ret = MinMaxWithin(spline); } } 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 ); } /* This routine should almost never be called now. It uses a flawed algorithm */ /* which won't produce the best results. It gets called only when the better */ /* approach doesn't work (singular matrices, etc.) */ /* Old comment, back when I was confused... */ /* 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 GoodCurve(SplinePoint *sp, int check_prev ) { bigreal dx, dy, lenx, leny; if ( sp->pointtype!=pt_curve && sp->pointtype!=pt_hvcurve ) return( false ); if ( check_prev ) { dx = sp->me.x - sp->prevcp.x; dy = sp->me.y - sp->prevcp.y; } else { dx = sp->me.x - sp->nextcp.x; dy = sp->me.y - sp->nextcp.y; } /* If the cp is very close to the base point the point might as well be a corner */ if ( dx<0 ) dx = -dx; if ( dy<0 ) dy = -dy; if ( dx+dy<1 ) return( false ); if ( check_prev ) { if ( sp->prev==NULL ) return( true ); lenx = sp->me.x - sp->prev->from->me.x; leny = sp->me.y - sp->prev->from->me.y; } else { if ( sp->next==NULL ) return( true ); lenx = sp->me.x - sp->next->to->me.x; leny = sp->me.y - sp->next->to->me.y; } if ( lenx<0 ) lenx = -lenx; if ( leny<0 ) leny = -leny; if ( 50*(dx+dy) < lenx+leny ) return( false ); return( true ); } /* pf == point from (start point) */ /* Δf == slope from (cp(from) - from) */ /* pt == point to (end point, t==1) */ /* Δt == slope to (cp(to) - to) */ /* A spline from pf to pt with slope vectors rf*Δf, rt*Δt is: */ /* p(t) = pf + [ 3*rf*Δf ]*t + 3*[pt-pf+rt*Δt-2*rf*Δf] *t^2 + */ /* [2*pf-2*pt+3*rf*Δf-3*rt*Δt]*t^3 */ /* So I want */ /* d Σ (p(t(i))-p(i))^2/ d rf == 0 */ /* d Σ (p(t(i))-p(i))^2/ d rt == 0 */ /* now... */ /* d Σ (p(t(i))-p(i))^2/ d rf == 0 */ /* => Σ 3*t*Δf*(1-2*t+t^2)* * [pf-pi+ 3*(pt-pf)*t^2 + 2*(pf-pt)*t^3] + * 3*[t - 2*t^2 + t^3]*Δf*rf + * 3*[t^2-t^3]*Δt*rt */ /* and... */ /* d Σ (p(t(i))-p(i))^2/ d rt == 0 */ /* => Σ 3*t^2*Δt*(1-t)* * [pf-pi+ 3*(pt-pf)*t^2 + 2*(pf-pt)*t^3] + * 3*[t - 2*t^2 + t^3]*Δf*rf + * 3*[t^2-t^3]*Δt*rt */ /* Now for a long time I looked at that and saw four equations and two unknowns*/ /* That was I was trying to solve for x and y separately, and that doesn't work. */ /* There are really just two equations and each sums over both x and y components */ /* Old comment: */ /* I used to do a least squares aproach adding two more to the above set of equations */ /* which held the slopes constant. But that didn't work very well. So instead*/ /* Then I tried doing the approximation, and then forcing the control points */ /* to be in line (witht the original slopes), getting a better approximation */ /* to "t" for each data point and then calculating an error array, approximating*/ /* it, and using that to fix up the final result */ /* Then I tried checking various possible cp lengths in the desired directions*/ /* finding the best one or two, and doing a 2D binary search using that as a */ /* starting point. */ /* And sometimes a least squares approach will give us the right answer, so */ /* try that too. */ /* This still isn't as good as I'd like it... But I haven't been able to */ /* improve it further yet */ bigreal SplineLength(Spline *spline) { /* I ignore the constant term. It's just an unneeded addition */ bigreal len, t; bigreal lastx = 0, lasty = 0; bigreal 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 ); } int SPInterpolate(const SplinePoint *sp) { /* Using truetype rules, can we interpolate this point? */ return( !sp->dontinterpolate && !sp->nonextcp && !sp->noprevcp && !sp->roundx && !sp->roundy && (RealWithin(sp->me.x,(sp->nextcp.x+sp->prevcp.x)/2,.1) && RealWithin(sp->me.y,(sp->nextcp.y+sp->prevcp.y)/2,.1)) ); } int SpIsExtremum(SplinePoint *sp) { BasePoint *ncp, *pcp; BasePoint *nncp, *ppcp; if ( sp->next==NULL || sp->prev==NULL ) return( true ); nncp = &sp->next->to->me; if ( !sp->nonextcp ) { ncp = &sp->nextcp; if ( !sp->next->to->noprevcp ) nncp = &sp->next->to->prevcp; } else if ( !sp->next->to->noprevcp ) ncp = &sp->next->to->prevcp; else ncp = nncp; ppcp = &sp->prev->from->me; if ( !sp->noprevcp ) { pcp = &sp->prevcp; if ( !sp->prev->from->nonextcp ) ppcp = &sp->prev->from->nextcp; } else if ( !sp->prev->from->nonextcp ) pcp = &sp->prev->from->nextcp; else pcp = ppcp; if ((( ncp->xme.x || (ncp->x==sp->me.x && nncp->xme.x)) && (pcp->xme.x || (pcp->x==sp->me.x && ppcp->xme.x))) || ((ncp->x>sp->me.x || (ncp->x==sp->me.x && nncp->x>sp->me.x)) && (pcp->x>sp->me.x || (pcp->x==sp->me.x && ppcp->x>sp->me.x))) || (( ncp->yme.y || (ncp->y==sp->me.y && nncp->yme.y)) && (pcp->yme.y || (pcp->y==sp->me.y && ppcp->yme.y))) || ((ncp->y>sp->me.y || (ncp->y==sp->me.y && nncp->y>sp->me.y)) && (pcp->y>sp->me.y || (pcp->y==sp->me.y && ppcp->y>sp->me.y)))) return( true ); /* These aren't true points of extrema, but they probably should be treated */ /* as if they were */ if ( !sp->nonextcp && !sp->noprevcp && ((sp->me.x==sp->nextcp.x && sp->me.x==sp->prevcp.x) || (sp->me.y==sp->nextcp.y && sp->me.y==sp->prevcp.y)) ) return( true ); return( false ); } /* An extremum is very close to the end-point. So close that we don't want */ /* to add a new point. Instead try moving the control points around */ /* Options: */ /* o if the control point is very close to the base point then remove it */ /* o if the slope at the endpoint is in the opposite direction from */ /* what we expect, then subtract off the components we don't like */ /* o make the slope at the end point horizontal/vertical */ static int ForceEndPointExtrema(Spline *s,int isto) { SplinePoint *end; BasePoint *cp, to, unitslope, othercpunit, myslope; bigreal xdiff, ydiff, mylen, cplen, mydot, cpdot, len; /* To get here we know that the extremum is extremely close to the end */ /* point, and adjusting the slope at the end-point may be all we need */ /* to do. We won't need to adjust it by much, because it is so close. */ if ( isto ) { end = s->to; cp = &end->prevcp; othercpunit.x = s->from->nextcp.x - s->from->me.x; othercpunit.y = s->from->nextcp.y - s->from->me.y; } else { end = s->from; cp = &end->nextcp; othercpunit.x = s->to->prevcp.x-s->to->me.x; othercpunit.y = s->to->prevcp.y-s->to->me.y; } cplen = othercpunit.x*othercpunit.x + othercpunit.y*othercpunit.y; cplen = sqrt(cplen); myslope.x = cp->x - end->me.x; myslope.y = cp->y - end->me.y; mylen = sqrt(myslope.x*myslope.x + myslope.y*myslope.y); unitslope.x = s->to->me.x - s->from->me.x; unitslope.y = s->to->me.y - s->from->me.y; len = unitslope.x*unitslope.x + unitslope.y*unitslope.y; if ( len==0 ) return( -1 ); len = sqrt(len); if ( mylen<30*len && mylento->noprevcp = true; s->to->prevcp = s->to->me; } else { s->from->nonextcp = true; s->from->nextcp = s->from->me; } end->pointtype = pt_corner; SplineRefigure(s); return( true ); /* We changed the slope */ } unitslope.x /= len; unitslope.y /= len; mydot = myslope.x*unitslope.y - myslope.y*unitslope.x; cpdot = othercpunit.x*unitslope.y - othercpunit.y*unitslope.y; if ( mydot*cpdot<0 && mylenpointtype = pt_corner; if ( isto ) { s->to->prevcp.x = s->to->me.x - mydot*unitslope.x; s->to->prevcp.y = s->to->me.y - mydot*unitslope.y; } else { s->from->nextcp.x = s->from->me.x + mydot*unitslope.x; s->from->nextcp.y = s->from->me.y + mydot*unitslope.y; } SplineRefigure(s); return( true ); /* We changed the slope */ } if ( (xdiff = cp->x - end->me.x)<0 ) xdiff = -xdiff; if ( (ydiff = cp->y - end->me.y)<0 ) ydiff = -ydiff; to = *cp; if ( xdiff0 ) { to.x = end->me.x; end->pointtype = pt_corner; SPAdjustControl(end,cp,&to,s->order2); return( true ); /* We changed the slope */ } else if ( ydiff0 ) { to.y = end->me.y; end->pointtype = pt_corner; SPAdjustControl(end,cp,&to,s->order2); return( true ); /* We changed the slope */ } return( -1 ); /* Didn't do anything */ } int Spline1DCantExtremeX(const Spline *s) { /* Sometimes we get rounding errors when converting from control points */ /* to spline coordinates. These rounding errors can give us false */ /* extrema. So do a sanity check to make sure it is possible to get */ /* any extrema before actually looking for them */ if ( s->from->me.x>=s->from->nextcp.x && s->from->nextcp.x>=s->to->prevcp.x && s->to->prevcp.x>=s->to->me.x ) return( true ); if ( s->from->me.x<=s->from->nextcp.x && s->from->nextcp.x<=s->to->prevcp.x && s->to->prevcp.x<=s->to->me.x ) return( true ); return( false ); } int Spline1DCantExtremeY(const Spline *s) { /* Sometimes we get rounding errors when converting from control points */ /* to spline coordinates. These rounding errors can give us false */ /* extrema. So do a sanity check to make sure it is possible to get */ /* any extrema before actually looking for them */ if ( s->from->me.y>=s->from->nextcp.y && s->from->nextcp.y>=s->to->prevcp.y && s->to->prevcp.y>=s->to->me.y ) return( true ); if ( s->from->me.y<=s->from->nextcp.y && s->from->nextcp.y<=s->to->prevcp.y && s->to->prevcp.y<=s->to->me.y ) return( true ); return( false ); } Spline *SplineAddExtrema(Spline *s,int always,real lenbound, real offsetbound, DBounds *b) { /* First find the extrema, if any */ bigreal t[4], min; uint8 rmfrom[4], rmto[4]; int p, i,j, p_s, mini, restart, forced; SplinePoint *sp; real len; if ( !always ) { real xlen, ylen; xlen = (s->from->me.x-s->to->me.x); ylen = (s->from->me.y-s->to->me.y); len = xlen*xlen + ylen*ylen; lenbound *= lenbound; if ( len < lenbound ) { len = SplineLength(s); len *= len; } } memset(rmfrom,0,sizeof(rmfrom)); memset(rmto,0,sizeof(rmto)); for (;;) { if ( s->knownlinear ) return(s); p = 0; if ( Spline1DCantExtremeX(s) ) { /* If the control points are at the end-points then this (1D) spline is */ /* basically a line. But rounding errors can give us very faint extrema */ /* if we look for them */ } else if ( s->splines[0].a!=0 ) { bigreal d = 4*s->splines[0].b*s->splines[0].b-4*3*s->splines[0].a*s->splines[0].c; if ( d>0 ) { extended t1, t2; d = sqrt(d); t1 = (-2*s->splines[0].b+d)/(2*3*s->splines[0].a); t2 = (-2*s->splines[0].b-d)/(2*3*s->splines[0].a); t[p++] = CheckExtremaForSingleBitErrors(&s->splines[0],t1,t2); t[p++] = CheckExtremaForSingleBitErrors(&s->splines[0],t2,t1); } } else if ( s->splines[0].b!=0 ) t[p++] = -s->splines[0].c/(2*s->splines[0].b); if ( !always ) { /* Generally we are only interested in extrema on long splines, or */ /* extrema which are extrema for the entire contour, not just this */ /* spline */ /* Also extrema which are very close to one of the end-points can */ /* be ignored. */ /* No they can't. But we need to remove the original point in this*/ /* case */ for ( i=0; isplines[0].a*t[i]+s->splines[0].b)*t[i]+s->splines[0].c)*t[i]+s->splines[0].d; real y = ((s->splines[1].a*t[i]+s->splines[1].b)*t[i]+s->splines[1].c)*t[i]+s->splines[1].d; int close_from = ( x-s->from->me.xfrom->me.x>-offsetbound) && ( y-s->from->me.y<10*offsetbound && y-s->from->me.y>-10*offsetbound ); int close_to = ( x-s->to->me.xto->me.x>-offsetbound) && ( y-s->to->me.y<10*offsetbound && y-s->to->me.y>-10*offsetbound ); int remove_from = close_from && GoodCurve(s->from,true) && !SpIsExtremum(s->from); int remove_to = close_to && GoodCurve(s->to,false) && !SpIsExtremum(s->to); if (( x>b->minx && xmaxx && lensplines[1].a!=0 ) { bigreal d = 4*s->splines[1].b*s->splines[1].b-4*3*s->splines[1].a*s->splines[1].c; if ( d>0 ) { extended t1,t2; d = sqrt(d); t1 = (-2*s->splines[1].b+d)/(2*3*s->splines[1].a); t2 = (-2*s->splines[1].b-d)/(2*3*s->splines[1].a); t[p++] = CheckExtremaForSingleBitErrors(&s->splines[1],t1,t2); t[p++] = CheckExtremaForSingleBitErrors(&s->splines[1],t2,t1); } } else if ( s->splines[1].b!=0 ) t[p++] = -s->splines[1].c/(2*s->splines[1].b); if ( !always ) { for ( i=p_s; isplines[0].a*t[i]+s->splines[0].b)*t[i]+s->splines[0].c)*t[i]+s->splines[0].d; real y = ((s->splines[1].a*t[i]+s->splines[1].b)*t[i]+s->splines[1].c)*t[i]+s->splines[1].d; int close_from =( y-s->from->me.yfrom->me.y>-offsetbound ) && ( x-s->from->me.xfrom->me.x>-offsetbound); int close_to = ( y-s->to->me.yto->me.y>-offsetbound ) && ( x-s->to->me.xto->me.x>-offsetbound); int remove_from = close_from && GoodCurve(s->from,true) && !SpIsExtremum(s->from); int remove_to = close_to && GoodCurve(s->to,false) && !SpIsExtremum(s->to); if (( y>b->miny && ymaxy && len0 && t[i]<.05 ) { BasePoint test; /* Expand stroke gets very confused on zero-length splines so */ /* don't let that happen */ test.x = ((s->splines[0].a*t[i]+s->splines[0].b)*t[i]+s->splines[0].c)*t[i]+s->splines[0].d - s->from->me.x; test.y = ((s->splines[1].a*t[i]+s->splines[1].b)*t[i]+s->splines[1].c)*t[i]+s->splines[1].d - s->from->me.y; if (( test.x*test.x + test.y*test.y<1e-7 ) && ( test.x*test.x + test.y*test.y>0.0 )) { if ( (forced = ForceEndPointExtrema(s,0))>=0 ) { if ( forced && s->from->prev!=NULL ) SplineAddExtrema(s->from->prev,always,lenbound,offsetbound,b); restart = true; break; } } } if ( t[i]<1 && t[i]>.95 ) { BasePoint test; test.x = ((s->splines[0].a*t[i]+s->splines[0].b)*t[i]+s->splines[0].c)*t[i]+s->splines[0].d - s->to->me.x; test.y = ((s->splines[1].a*t[i]+s->splines[1].b)*t[i]+s->splines[1].c)*t[i]+s->splines[1].d - s->to->me.y; if (( test.x*test.x + test.y*test.y < 1e-7 ) && ( test.x*test.x + test.y*test.y>0.0 )) { if ( ForceEndPointExtrema(s,1)>=0 ) { /* don't need to fix up next, because splinesetaddextrema will do that soon */ restart = true; break; } } } if ( t[i]<=0 || t[i]>=1.0 ) { --p; for ( j=i; jme.x - sp->prevcp.x)<0 ) dx=-dx; if ( (dy = sp->me.y - sp->prevcp.y)<0 ) dy=-dy; if ( dx!=0 && dy!=0 ) { if ( dxprevcp.x = sp->me.x; else sp->prevcp.y = sp->me.y; } if ( (dx = sp->me.x - sp->nextcp.x)<0 ) dx=-dx; if ( (dy = sp->me.y - sp->nextcp.y)<0 ) dy=-dy; if ( dx!=0 && dy!=0 ) { if ( dxnextcp.x = sp->me.x; else sp->nextcp.y = sp->me.y; } } if ( rmfrom[mini] ) sp->prev->from->ticked = true; if ( rmto[mini] ) sp->next->to->ticked = true; s = sp->next; if ( p==1 ) return( s ); /* 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 */ } } SplineFont *SplineFontEmpty(void) { extern int default_fv_row_count, default_fv_col_count; time_t now; SplineFont *sf; sf = calloc(1,sizeof(SplineFont)); sf->pfminfo.fstype = -1; sf->pfminfo.stylemap = -1; sf->top_enc = -1; sf->map = NULL; sf->macstyle = -1; sf->desired_row_cnt = default_fv_row_count; sf->desired_col_cnt = default_fv_col_count; sf->display_antialias = default_fv_antialias; sf->display_bbsized = default_fv_bbsized; sf->display_size = -default_fv_font_size; sf->display_layer = ly_fore; sf->sfntRevision = sfntRevisionUnset; sf->woffMajor = woffUnset; sf->woffMinor = woffUnset; sf->pfminfo.winascent_add = sf->pfminfo.windescent_add = true; sf->pfminfo.hheadascent_add = sf->pfminfo.hheaddescent_add = true; sf->pfminfo.typoascent_add = sf->pfminfo.typodescent_add = true; if ( TTFFoundry!=NULL ) strncpy(sf->pfminfo.os2_vendor,TTFFoundry,4); else memcpy(sf->pfminfo.os2_vendor,"PfEd",4); sf->for_new_glyphs = DefaultNameListForNewFonts(); time(&now); sf->creationtime = sf->modificationtime = now; sf->layer_cnt = 2; sf->layers = calloc(2,sizeof(LayerInfo)); sf->layers[ly_back].name = copy(_("Back")); sf->layers[ly_back].background = true; sf->layers[ly_fore].name = copy(_("Fore")); sf->layers[ly_fore].background = false; sf->grid.background = true; 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 = malloc(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 SplineCharTangentNextCP(SplinePoint *sp) { bigreal len; BasePoint *bp, unit; extern int snaptoint; if ( sp->prev==NULL ) return; bp = &sp->prev->from->me; unit.y = sp->me.y-bp->y; unit.x = sp->me.x-bp->x; len = sqrt( unit.x*unit.x + unit.y*unit.y ); if ( len!=0 ) { unit.x /= len; unit.y /= len; } 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*unit.x; sp->nextcp.y = sp->me.y + len*unit.y; if ( snaptoint ) { sp->nextcp.x = rint(sp->nextcp.x); sp->nextcp.y = rint(sp->nextcp.y); } else { 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->to->prevcp = sp->nextcp; } void SplineCharTangentPrevCP(SplinePoint *sp) { bigreal len; BasePoint *bp, unit; extern int snaptoint; if ( sp->next==NULL ) return; bp = &sp->next->to->me; unit.y = sp->me.y-bp->y; unit.x = sp->me.x-bp->x; len = sqrt( unit.x*unit.x + unit.y*unit.y ); if ( len!=0 ) { unit.x /= len; unit.y /= len; } 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*unit.x; sp->prevcp.y = sp->me.y + len*unit.y; if ( snaptoint ) { sp->prevcp.x = rint(sp->prevcp.x); sp->prevcp.y = rint(sp->prevcp.y); } else { 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; } void BP_HVForce(BasePoint *vector) { /* Force vector to be horizontal/vertical */ bigreal dx, dy, len; if ( (dx= vector->x)<0 ) dx = -dx; if ( (dy= vector->y)<0 ) dy = -dy; if ( dx==0 || dy==0 ) return; len = sqrt(dx*dx + dy*dy); if ( dx>dy ) { vector->x = vector->x<0 ? -len : len; vector->y = 0; } else { vector->y = vector->y<0 ? -len : len; vector->x = 0; } } #define NICE_PROPORTION .39 void SplineCharDefaultNextCP(SplinePoint *base) { SplinePoint *prev=NULL, *next; bigreal len, plen, ulen; BasePoint unit; extern int snaptoint; 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)); unit.x = next->me.x - base->me.x; unit.y = next->me.y - base->me.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; base->nonextcp = false; if ( base->pointtype == pt_curve || base->pointtype == pt_hvcurve ) { if ( prev!=NULL && (base->prevcpdef || base->noprevcp)) { unit.x = next->me.x - prev->me.x; unit.y = next->me.y - prev->me.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; if ( base->pointtype == pt_hvcurve ) BP_HVForce(&unit); 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*unit.x; base->prevcp.y = base->me.y - plen*unit.y; if ( snaptoint ) { base->prevcp.x = rint(base->prevcp.x); base->prevcp.y = rint(base->prevcp.y); } SplineRefigureFixup(base->prev); } else if ( prev!=NULL ) { /* The prev control point is fixed. So we've got to use the same */ /* angle it uses */ unit.x = base->me.x-base->prevcp.x; unit.y = base->me.y-base->prevcp.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; } else { base->prevcp = base->me; base->noprevcp = true; base->prevcpdef = true; } if ( base->pointtype == pt_hvcurve ) BP_HVForce(&unit); } else if ( base->pointtype == pt_corner ) { if ( next->pointtype != pt_curve && next->pointtype != pt_hvcurve ) { 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*unit.x; base->prevcp.y = base->me.y - plen*unit.y; SplineRefigureFixup(base->prev); } unit.x = base->me.x-prev->me.x; unit.y = base->me.y-prev->me.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; } } } if ( base->nonextcp ) base->nextcp = base->me; else { base->nextcp.x = base->me.x + len*unit.x; base->nextcp.y = base->me.y + len*unit.y; if ( snaptoint ) { base->nextcp.x = rint(base->nextcp.x); base->nextcp.y = rint(base->nextcp.y); } else { 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; bigreal len, nlen, ulen; BasePoint unit; extern int snaptoint; 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)); unit.x = prev->me.x - base->me.x; unit.y = prev->me.y - base->me.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; base->noprevcp = false; if ( base->pointtype == pt_curve || base->pointtype == pt_hvcurve ) { if ( next!=NULL && (base->nextcpdef || base->nonextcp)) { unit.x = prev->me.x - next->me.x; unit.y = prev->me.y - next->me.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; if ( base->pointtype == pt_hvcurve ) BP_HVForce(&unit); 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*unit.x; base->nextcp.y = base->me.y - nlen*unit.y; if ( snaptoint ) { base->nextcp.x = rint(base->nextcp.x); base->nextcp.y = rint(base->nextcp.y); } SplineRefigureFixup(base->next); } else if ( next!=NULL ) { /* The next control point is fixed. So we got to use the same */ /* angle it uses */ unit.x = base->me.x-base->nextcp.x; unit.y = base->me.y-base->nextcp.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; } else { base->nextcp = base->me; base->nonextcp = true; base->nextcpdef = true; } if ( base->pointtype == pt_hvcurve ) BP_HVForce(&unit); } else if ( base->pointtype == pt_corner ) { if ( prev->pointtype != pt_curve && prev->pointtype != pt_hvcurve ) { 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*unit.x; base->nextcp.y = base->me.y - nlen*unit.y; SplineRefigureFixup(base->next); } unit.x = base->me.x-next->me.x; unit.y = base->me.y-next->me.y; ulen = sqrt(unit.x*unit.x + unit.y*unit.y); if ( ulen!=0 ) unit.x /= ulen, unit.y /= ulen; } } } if ( base->noprevcp ) base->prevcp = base->me; else { base->prevcp.x = base->me.x + len*unit.x; base->prevcp.y = base->me.y + len*unit.y; if ( snaptoint ) { base->prevcp.x = rint(base->prevcp.x); base->prevcp.y = rint(base->prevcp.y); } else { 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 SPTouchControl(SplinePoint *sp,BasePoint *which, int order2) { BasePoint to = *which; SPAdjustControl( sp, which, &to, order2 ); } void SPAdjustControl(SplinePoint *sp,BasePoint *cp, BasePoint *to,int order2) { BasePoint *othercp = cp==&sp->nextcp?&sp->prevcp:&sp->nextcp; int refig = false, otherchanged = false; if ( sp->ttfindex==0xffff && order2 ) { /* If the point itself is implied, then it's the control points that */ /* are fixed. Moving a CP should move the implied point so that it */ /* continues to be in the right place */ sp->me.x = (to->x+othercp->x)/2; sp->me.y = (to->y+othercp->y)/2; *cp = *to; refig = true; } else if ( sp->pointtype==pt_corner ) { *cp = *to; } else if ( sp->pointtype==pt_curve || sp->pointtype==pt_hvcurve ) { if ( sp->pointtype==pt_hvcurve ) { BasePoint diff; diff.x = to->x - sp->me.x; diff.y = to->y - sp->me.y; BP_HVForce(&diff); cp->x = sp->me.x + diff.x; cp->y = sp->me.y + diff.y; } else { *cp = *to; } if (( cp->x!=sp->me.x || cp->y!=sp->me.y ) && (!order2 || (cp==&sp->nextcp && sp->next!=NULL && sp->next->to->ttfindex==0xffff) || (cp==&sp->prevcp && sp->prev!=NULL && sp->prev->from->ttfindex==0xffff)) ) { bigreal 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; otherchanged = true; if ( sp->next!=NULL && othercp==&sp->nextcp ) { if ( order2 ) sp->next->to->prevcp = *othercp; SplineRefigure(sp->next); } else if ( sp->prev!=NULL && othercp==&sp->prevcp ) { if ( order2 ) sp->prev->from->nextcp = *othercp; SplineRefigure(sp->prev); } } if ( cp==&sp->nextcp ) sp->prevcpdef = false; else sp->nextcpdef = false; } 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 ( order2 ) { if ( (cp==&sp->nextcp || otherchanged) && sp->next!=NULL ) { SplinePoint *osp = sp->next->to; if ( osp->ttfindex==0xffff ) { osp->prevcp = sp->nextcp; osp->me.x = (osp->prevcp.x+osp->nextcp.x)/2; osp->me.y = (osp->prevcp.y+osp->nextcp.y)/2; SplineRefigure(osp->next); } } if ( (cp==&sp->prevcp || otherchanged) && sp->prev!=NULL ) { SplinePoint *osp = sp->prev->from; if ( osp->ttfindex==0xffff ) { osp->nextcp = sp->prevcp; osp->me.x = (osp->prevcp.x+osp->nextcp.x)/2; osp->me.y = (osp->prevcp.y+osp->nextcp.y)/2; SplineRefigure(osp->prev); } } } 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 ( order2 && !sp->nonextcp ) { sp->next->to->prevcp = *cp; sp->next->to->noprevcp = false; } SplineRefigureFixup(sp->next); } if ( sp->prev!=NULL && cp==&sp->prevcp ) { if ( order2 && !sp->noprevcp ) { sp->prev->from->nextcp = *cp; sp->prev->from->nonextcp = false; } SplineRefigureFixup(sp->prev); } if ( refig ) { SplineRefigure(sp->prev); SplineRefigure(sp->next); } } SplineSet *SplineSetReverse(SplineSet *spl) { Spline *spline, *first, *next; BasePoint tp; SplinePoint *temp; int flag; int i; /* 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; flag = spline->from->nonextcp; spline->from->nonextcp = spline->from->noprevcp; spline->from->noprevcp = flag; flag = spline->from->nextcpdef; spline->from->nextcpdef = spline->from->prevcpdef; spline->from->prevcpdef = flag; 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; flag = spline->to->nonextcp; spline->to->nonextcp = spline->to->noprevcp; spline->to->noprevcp = flag; flag = spline->to->nextcpdef; spline->to->nextcpdef = spline->to->prevcpdef; spline->to->prevcpdef = flag; } 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->start_offset = 0; spl->last = temp; spl->first->prev = NULL; spl->last->next = NULL; } if ( spl->spiro_cnt>2 ) { for ( i=(spl->spiro_cnt-1)/2-1; i>=0; --i ) { spiro_cp temp_cp = spl->spiros[i]; spl->spiros[i] = spl->spiros[spl->spiro_cnt-2-i]; spl->spiros[spl->spiro_cnt-2-i] = temp_cp; } if ( (spl->spiros[spl->spiro_cnt-2].ty&0x7f)==SPIRO_OPEN_CONTOUR ) { spl->spiros[spl->spiro_cnt-2].ty = (spl->spiros[0].ty&0x7f) | (spl->spiros[spl->spiro_cnt-2].ty&0x80); spl->spiros[0].ty = SPIRO_OPEN_CONTOUR | (spl->spiros[0].ty&0x80); } for ( i=spl->spiro_cnt-2; i>=0; --i ) { if ( (spl->spiros[i].ty&0x7f) == SPIRO_LEFT ) spl->spiros[i].ty = SPIRO_RIGHT | (spl->spiros[i].ty&0x80); else if ( (spl->spiros[i].ty&0x7f) == SPIRO_RIGHT ) spl->spiros[i].ty = SPIRO_LEFT | (spl->spiros[i].ty&0x80); } } return( spl ); } #include "edgelist.h" int SplinePointListIsClockwise(const SplineSet *spl) { EIList el; EI *active=NULL, *apt, *pr, *e; int i, winding,change,waschange, cnt; SplineChar dummy; SplineSet *next; Layer layers[2]; int cw_cnt=0, ccw_cnt=0; memset(&el,'\0',sizeof(el)); memset(&dummy,'\0',sizeof(dummy)); memset(layers,0,sizeof(layers)); el.layer = ly_fore; dummy.layers = layers; dummy.layer_cnt = 2; dummy.layers[ly_fore].splines = (SplineSet *) spl; dummy.name = "Clockwise Test"; next = spl->next; ((SplineSet *) spl)->next = NULL; ELFindEdges(&dummy,&el); if ( el.coordmax[1]-el.coordmin[1] > 1.e6 ) { LogError( _("Warning: Unreasonably big splines. They will be ignored.\n") ); ((SplineSet *) spl)->next = next; return( -1 ); } el.major = 1; ELOrder(&el,el.major); waschange = false; for ( i=0; iaenext , ++cnt ); if ( el.ordered[i]!=NULL || el.ends[i] || cnt&1 || waschange || change || (i!=el.cnt-1 && (el.ends[i+1] || el.ordered[i+1])) ) { waschange = change; continue; /* Just too hard to get the edges sorted when we are at a start vertex */ } waschange = change; for ( apt=active; apt!=NULL; apt = e) { if ( EISkipExtremum(apt,i+el.low,1)) { e = apt->aenext->aenext; continue; } if ( apt->up ) ++cw_cnt; else ++ccw_cnt; if ( cw_cnt!=0 && ccw_cnt!=0 ) { ((SplineSet *) spl)->next = next; return( -1 ); } 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 )) { /* return( -1 );*/ /* This is an erroneous condition... but I don't think*/ /* it can actually happen with a single contour. I */ /* think it is more likely this means a rounding error*/ /* and a problem in my algorithm */ fprintf( stderr, "SplinePointListIsClockwise: Found error\n" ); } 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 )) { fprintf( stderr, "SplinePointListIsClockwise: Found error\n" ); /*return( -1 );*/ } winding += (e->up?1:-1); } } } } free(el.ordered); free(el.ends); ElFreeEI(&el); ((SplineSet *) spl)->next = next; if ( cw_cnt!=0 ) return( true ); else if ( ccw_cnt!=0 ) return( false ); return( -1 ); } /* Since this function now deals with 4 arbitrarily selected points, */ /* it has to try to combine them by different ways in order to see */ /* if they actually can specify a diagonal stem. The reordered points */ /* are placed back to array passed to the function.*/ int PointsDiagonalable( SplineFont *sf,BasePoint **bp,BasePoint *unit ) { BasePoint *line1[2], *line2[2], *temp, *base; BasePoint unit1, unit2; int i, j, k; bigreal dist_error_diag, len1, len2, width, dot; bigreal off1, off2; for ( i=0; i<4; i++ ) { if ( bp[i] == NULL ) return( false ); } dist_error_diag = 0.0065 * ( sf->ascent + sf->descent ); /* Assume that the first point passed to the function is the starting */ /* point of the first of two vectors. Then try all possible combinations */ /* (there are 3), ensure the vectors are consistantly ordered, and */ /* check if they are parallel.*/ base = bp[0]; for ( i=1; i<4; i++ ) { line1[0] = base; line1[1] = bp[i]; k=0; for ( j=1; j<4; j++ ) { if ( j != i ) line2[k++] = bp[j]; } unit1.x = line1[1]->x - line1[0]->x; unit1.y = line1[1]->y - line1[0]->y; unit2.x = line2[1]->x - line2[0]->x; unit2.y = line2[1]->y - line2[0]->y; /* No horizontal, vertical edges */ if ( unit1.x == 0 || unit1.y == 0 || unit2.x == 0 || unit2.y == 0 ) continue; len1 = sqrt( pow( unit1.x,2 ) + pow( unit1.y,2 )); len2 = sqrt( pow( unit2.x,2 ) + pow( unit2.y,2 )); unit1.x /= len1; unit1.y /= len1; unit2.x /= len2; unit2.y /= len2; dot = unit1.x * unit2.y - unit1.y * unit2.x; /* Units parallel */ if ( dot <= -.05 || dot >= .05 ) continue; /* Ensure vectors point by such a way that the angle is between 90 and 270 degrees */ if ( unit1.x < 0 ) { temp = line1[0]; line1[0] = line1[1]; line1[1] = temp; unit1.x = -unit1.x; unit1.y = -unit1.y; } if ( unit2.x < 0 ) { temp = line2[0]; line2[0] = line2[1]; line2[1] = temp; unit2.x = -unit2.x; unit2.y = -unit2.y; } off1 = ( line1[1]->x - line1[0]->x ) * unit2.y - ( line1[1]->y - line1[0]->y ) * unit2.x; off2 = ( line2[1]->x - line2[0]->x ) * unit1.y - ( line2[1]->y - line2[0]->y ) * unit1.x; if ( len1 > len2 && fabs( off2 ) < 2*dist_error_diag ) *unit = unit1; else if ( fabs( off1 ) < 2*dist_error_diag ) *unit = unit2; else continue; width = ( line2[0]->x - line1[0]->x ) * unit->y - ( line2[0]->y - line1[0]->y ) * unit->x; /* Make sure this is a real line, rather than just two */ /* short spline segments which occasionally have happened to be */ /* parallel. This is necessary to correctly handle things which may */ /* be "diagonalable" in 2 different directions (like slash in some */ /* designs). */ if ( fabs( width ) > len1 || fabs( width ) > len2 ) continue; /* Make sure line2 is further right than line1 */ if ( width < 0 ) { temp = line1[0]; line1[0] = line2[0]; line2[0] = temp; temp = line1[1]; line1[1] = line2[1]; line2[1] = temp; } bp[0] = line1[0]; bp[1] = line2[0]; bp[2] = line1[1]; bp[3] = line2[1]; return( true ); } return( false ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/namehash.h0000664000175000017500000000375513510660062016346 00000000000000/* Copyright (C) 2009-2012 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 _NAMEHASH_H # define _NAMEHASH_H #define GN_HSIZE 257 struct glyphnamebucket { SplineChar *sc; struct glyphnamebucket *next; const char *name; }; 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 = (val<<3)|((val>>29)&0x7); val ^= (unsigned char)(*pt-'!'); pt++; } val ^= (val>>16); val &= 0xffff; val %= GN_HSIZE; return( val ); } extern void __GlyphHashFree(struct glyphnamehash *hash); #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/asmfpst.c0000664000175000017500000007777113510660062016243 00000000000000/* Copyright (C) 2003-2007 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 "fontforgevw.h" #include "ttf.h" /* ************************************************************************** */ /* *************** Routines to test conversion from OpenType **************** */ /* ************************************************************************** */ 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->subtable = fpst->subtable; new->rule_cnt = fpst->rule_cnt; new->rules = calloc(fpst->rule_cnt,sizeof(struct fpst_rule)); max = 100; nextclass=1; names = malloc(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' ) { for ( pt=(&fpst->rules[i].u.glyph.names)[j]; *pt; ) { while ( *pt==' ' ) ++pt; if ( *pt=='\0' ) break; while ( *pt!=' ' && *pt!='\0' ) ++pt; ++cnt; } } (&new->rules[i].u.class.ncnt)[j] = cnt; if ( cnt!=0 ) { (&new->rules[i].u.class.nclasses)[j] = malloc(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 = realloc(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 = malloc(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; new->nclassnames = calloc(nextclass,sizeof(char *)); /* Leave as NULL */ 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); new->bclassnames = calloc(nextclass,sizeof(char *)); /* Leave as NULL */ new->fclassnames = calloc(nextclass,sizeof(char *)); /* Leave as NULL */ } return( new ); } static int ValidSubs(OTLookup *otl ) { return( otl->lookup_type == gsub_single ); } static void TreeFree(struct contexttree *tree) { int i; if ( tree==NULL ) return; 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 OTLookup *RuleHasSubsHere(struct fpst_rule *rule,int depth) { int i,j; if ( depthu.class.bcnt ) return( NULL ); depth -= rule->u.class.bcnt; if ( depth>=rule->u.class.ncnt ) return( NULL ); 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( (OTLookup *) 0xffffffff ); } return( rule->lookups[i].lookup ); } } return( 0 ); } static OTLookup *RulesAllSameSubsAt(struct contexttree *me,int pos) { int i; OTLookup *tag=(OTLookup *) 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==(OTLookup *) 0x01 ) tag=newtag; else if ( newtag!=tag ) return( (OTLookup *) 0xffffffff ); } if ( tag==(OTLookup *) 0x01 ) return( NULL ); /* Should never happen */ 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==(OTLookup *) 0xffffffff ) return( false ); if ( !ValidSubs(me->applymarkedsubs)) return( false ); } me->applycursubs = RulesAllSameSubsAt(me,me->depth); if ( me->applycursubs==(OTLookup *) 0xffffffff ) return( false ); if ( me->applycursubs!=NULL && !ValidSubs(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)!=NULL ) 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 = calloc(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 = calloc(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 = malloc(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 = calloc(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 = malloc((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); if ( ret!=NULL ) 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 { for (;;) { 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 i; int featureType, featureSetting; struct contexttree *ret; FeatureScriptLangList *fl; if ( fpst->type!=pst_contextsub && fpst->type!=pst_chainsub ) return( false ); for ( fl = fpst->subtable->lookup->features; fl!=NULL; fl=fl->next ) { if ( OTTagToMacFeature(fl->featuretag,&featureType,&featureSetting) && scriptsHaveDefault(fl->scripts) ) break; } if ( fl==NULL ) 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(fpst->rules[i].lookups[1].lookup) ) return( false ); } else if ( fpst->rules[i].lookup_cnt!=1 ) return( false ); if ( !ValidSubs(fpst->rules[i].lookups[0].lookup) ) 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 = malloc(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 = malloc(sf->glyphcnt*sizeof(SplineChar *)); for ( i=0; iglyphcnt; ++i ) if ( (sc=sf->glyphs[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 = malloc(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 int FindFormLookupsForScript(SplineFont *sf,uint32 script,OTLookup *lookups[4]) { OTLookup *otl; FeatureScriptLangList *fl; struct scriptlanglist *sl; int which; memset(lookups,0,4*sizeof(OTLookup *)); for ( otl=sf->gsub_lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused && otl->lookup_type == gsub_single ) { for ( fl=otl->features; fl!=NULL; fl=fl->next ) { if ( fl->featuretag== CHR('i','n','i','t') ) which = 0; else if ( fl->featuretag== CHR('m','e','d','i') ) which = 1; else if ( fl->featuretag== CHR('f','i','n','a') ) which = 2; else if ( fl->featuretag== CHR('i','s','o','l') ) which = 3; else continue; if ( lookups[which]!=NULL ) continue; for ( sl=fl->scripts; sl!=NULL && sl->script!=script; sl=sl->next ); if ( sl==NULL ) continue; lookups[which] = otl; break; } } if ( lookups[0]!=NULL || lookups[1]!=NULL || lookups[2]!=NULL || lookups[3]!=NULL ) return( true ); return( false ); } ASM *ASMFromOpenTypeForms(SplineFont *sf,uint32 script) { int i, which, cg, mg; SplineChar *sc, *rsc, **classglyphs, **markglyphs; PST *pst; OTLookup *lookups[4]; ASM *sm; int flags; if ( !FindFormLookupsForScript(sf,script,lookups)) return( NULL ); flags = (lookups[0]!=NULL ? lookups[0]->lookup_flags :lookups[1]!=NULL ? lookups[1]->lookup_flags :lookups[2]!=NULL ? lookups[2]->lookup_flags : lookups[3]->lookup_flags); classglyphs = calloc((sf->glyphcnt+1),sizeof(SplineChar *)); markglyphs = malloc((sf->glyphcnt+1)*sizeof(SplineChar *)); mg = 0; for ( i=0; iglyphcnt; ++i ) if ( (sc=sf->glyphs[i])!=NULL ) { if ( (flags&pst_ignorecombiningmarks) && IsMarkChar(sc)) { markglyphs[mg++] = sc; } else if ( SCScriptFromUnicode(sc)==script ) { classglyphs[sc->orig_pos] = sc; for ( pst = sc->possub; pst!=NULL; pst=pst->next ) if ( pst->subtable!=NULL ) { OTLookup *otl = pst->subtable->lookup; for ( which=3; which>=0; --which ) { if ( otl==lookups[which]) break; } if ( which==-1 ) continue; rsc = SFGetChar(sf,-1,pst->u.subs.variant); if ( rsc!=NULL ) classglyphs[rsc->orig_pos] = rsc; } } } markglyphs[mg] = NULL; cg = 0; for ( i=0; iglyphcnt; ++i ) if ( classglyphs[i]!=NULL ) classglyphs[cg++] = classglyphs[i]; classglyphs[cg] = NULL; sm = chunkalloc(sizeof(ASM)); sm->type = asm_context; sm->flags = (flags&pst_r2l) ? asm_descending : 0; /* This is a temporary value. It should be replaced if we will retain */ /* this state machine */ sm->subtable = (lookups[3]!=NULL ? lookups[3] : lookups[0]!=NULL ? lookups[0] : lookups[1]!=NULL ? lookups[1] : lookups[2])->subtables; /* 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 = calloc(sm->class_cnt,sizeof(char *)); sm->classes[4] = GlyphListToNames(classglyphs); if ( flags&pst_ignorecombiningmarks ) sm->classes[5] = GlyphListToNames(markglyphs); free(classglyphs); free(markglyphs); /* 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 = calloc(sm->state_cnt*sm->class_cnt,sizeof(struct asm_state)); /* State 0,1 (start), Class 4 (char in script) takes us to state 2 */ sm->state[4].next_state = 2; sm->state[4].flags = 0x8000; 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_lookup = lookups[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.mark_lookup = lookups[0]; /* Initial */ 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_lookup = lookups[2];/* Final */ } sm->state[3*sm->class_cnt+4].next_state = 3; sm->state[3*sm->class_cnt+4].flags = 0x8000; sm->state[3*sm->class_cnt+4].u.context.mark_lookup = lookups[1]; /* Medial */ /* 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_lookup = NULL; sm->state[pos].u.context.mark_lookup = NULL; /* 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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { sf->glyphs[i]->lsidebearing = 1; if ( !ordered ) sf->glyphs[i]->ttf_glyph = gtot++; else if ( sf->glyphs[i]->ttf_glyph+1>gtot ) gtot = sf->glyphs[i]->ttf_glyph+1; } max=0; for ( i=0; imax ) max=k; } next = calloc(1<glyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { sf->glyphs[i]->lsidebearing = 0; sf->glyphs[i]->ticked = false; } for ( i=0; ilsidebearing |= 1<ticked ) { mask = sc->lsidebearing; if ( next[mask]==0 ) temp[mask] = malloc(max*sizeof(SplineChar *)); temp[mask][next[mask]++] = sc; sc->ticked = true; } } gall = calloc(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->subtable->lookup->lookup_flags & pst_ignorecombiningmarks ) { for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL && sf->glyphs[i]->ttf_glyph!=-1 ) { if ( sf->glyphs[i]->lsidebearing==0 && IsMarkChar(sf->glyphs[i])) { sf->glyphs[i]->lsidebearing = class_cnt; ++gcnt; } } ++class_cnt; /* Add a class for the marks so we can ignore them */ } *cc = class_cnt+4; glyphs = malloc((gcnt+1)*sizeof(SplineChar *)); map = malloc((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 = calloc(match_len,sizeof(int)); *classes = malloc((match_len+1)*sizeof(int *)); for ( i=0; irules[0]; int subspos = r->u.coverage.bcnt+r->lookups[0].seq; OTLookup *substag = r->lookups[0].lookup, *finaltag=NULL; uint16 *map; ASM *sm; /* In one very specific case we can support two substitutions */ if ( r->lookup_cnt==2 ) { 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; } else finaltag = r->lookups[1].lookup; } tables = malloc((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->subtable->lookup->lookup_flags&pst_r2l) ? asm_descending : 0; sm->class_cnt = class_cnt; sm->classes = malloc(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 = calloc(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_lookup = substag; else { sm->state[off+i].u.context.mark_lookup = substag; sm->state[off+i].u.context.cur_lookup = finaltag; } } else if ( subspos==j ) sm->state[off+i].flags = 0x8000; } else if ( i==2 || ((fpst->subtable->lookup->lookup_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)); for ( j=0; jbranch_cnt; ++i ) { if ( cur->branches[i].classnum==class ) { trans->next_state = cur->branches[i].branch->state; /* If we go back to state 0, it means we want to start from */ /* the begining again, and we should check against the */ /* current glyph (which failed for us, but might be useful */ /* to start a new operation). Even if we did not fail we */ /* should still do this (so don't advance the glyph) */ 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_lookup = cur->branches[i].branch->applymarkedsubs; trans->u.context.cur_lookup = cur->branches[i].branch->applycursubs; return; } } if ( cur->ends_here!=NULL ) { trans->next_state = 0; trans->flags = 0x4000; trans->u.context.mark_lookup = cur->applymarkedsubs; trans->u.context.cur_lookup = 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( NULL ); } static int FailureTrans( struct asm_state *trans ) { return( trans->next_state==0 && trans->u.context.mark_lookup==NULL && trans->u.context.cur_lookup==NULL ); } 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->subtable->lookup->lookup_flags&pst_r2l) ? asm_descending : 0; /* mac class sets have four magic classes, opentype sets only have one */ sm->class_cnt = (fpst->subtable->lookup->lookup_flags&pst_ignorecombiningmarks) ? fpst->nccnt+4 : fpst->nccnt+3; sm->classes = malloc(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->subtable->lookup->lookup_flags&pst_ignorecombiningmarks ) sm->classes[sm->class_cnt-1] = BuildMarkClass(sf); /* Now build the state machine */ sm->state_cnt = tree->next_state; sm->state = calloc(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->subtable->lookup->lookup_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 ( FailureTrans(&sm->state[off+3+i]) ) { struct asm_state *trans = AnyActiveSubstrings(tree,cur,i, sm->state,sm->class_cnt); if ( trans!=NULL ) sm->state[off+3+i] = *trans; } } 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 ) sm = ASMFromCoverageFPST(sf,fpst,ordered); else { tree = FPST2Tree(sf, tempfpst); if ( tree!=NULL ) { sm = ASMFromClassFPST(sf,tempfpst,tree); TreeFree(tree); } else sm = NULL; } if ( tempfpst!=fpst ) FPSTFree(tempfpst); /* This is a temporary value. It should be replaced if we plan to */ /* retain this state machine */ if ( sm!=NULL ) sm->subtable = fpst->subtable; return( sm ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/fontforgevw.h0000664000175000017500000000275013510660062017122 00000000000000/* Copyright (C) 2007-2012 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 _FONTFORGEVW_H_ #define _FONTFORGEVW_H_ #include "fontforge.h" #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/nowakowskittfinstr.c0000664000175000017500000053472213510660062020552 00000000000000/* Copyright (C) 2000-2012 by George Williams, Michal Nowakowski & Alexey Kryukov */ /* * 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 "fontforgevw.h" #define _USE_MATH_DEFINES #include #include #include "ttf.h" #include "splinefont.h" #include "stemdb.h" extern int autohint_before_generate; int instruct_diagonal_stems = 1, instruct_serif_stems = 1, instruct_ball_terminals = 1, interpolate_strong = 1, interpolate_more_strong = 1, /* not applicable if interpolate_strong==0 */ control_counters = 0; /* non-optimized instructions will be using a stack of depth 6, allowing * for easy testing whether the code leaves trash on the stack or not. */ #define OPTIMIZE_TTF_INSTRS 1 #if OPTIMIZE_TTF_INSTRS #define STACK_DEPTH 256 #else #define STACK_DEPTH 6 #endif /* define some often used instructions */ #define SVTCA_y (0x00) #define SVTCA_x (0x01) #define SRP0 (0x10) #define SRP1 (0x11) #define SRP2 (0x12) #define SZP0 (0x13) #define SLOOP (0x17) #define RTG (0x18) #define SMD (0x1a) #define DUP (0x20) #define DEPTH (0x24) #define CALL (0x2b) #define MDAP (0x2e) #define MDAP_rnd (0x2f) #define IUP_y (0x30) #define IUP_x (0x31) #define SHP_rp2 (0x32) #define SHP_rp1 (0x33) #define SHPIX (0x38) #define IP (0x39) #define ALIGNRP (0x3c) #define MIAP_rnd (0x3f) #define ADD (0x60) #define MUL (0x63) #define NEG (0x65) #define SROUND (0x76) #define FLIPPT (0x80) #define MDRP_grey (0xc0) #define MDRP_min_black (0xc9) #define MDRP_min_white (0xca) #define MDRP_min_rnd_black (0xcd) #define MDRP_rp0_rnd_white (0xd6) #define MDRP_rp0_min_rnd_grey (0xdc) #define MDRP_rp0_min_rnd_black (0xdd) #define MIRP_min_black (0xe9) #define MIRP_min_rnd_black (0xed) #define MIRP_rp0_min_black (0xf9) #define MIRP_rp0_min_rnd_black (0xfd) /****************************************************************************** * * Low-level routines to add data for PUSHes to bytecode instruction stream. * pushheader() adds PUSH preamble, then repeating addpoint() adds items. * * Numbers larger than 65535 are not supported (according to TrueType spec, * there can't be more points in a glyph, simple or compound). Negative * numbers aren't supported, either. So don't use these functions as they * are - there are higher-level ones further below, that handle things nicely. * ******************************************************************************/ static uint8 *pushheader(uint8 *instrs, int isword, int tot) { if ( isword ) { if ( tot>8 ) { *instrs++ = 0x41; /* N(next word) 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 ); } /* Exemplary high-level routines to add PUSH-es to bytecode instruction * stream. They handle negative numbers correctly. As they are used * in various roles here, some aliases are defined, so that the name * speaks for itself in the code. */ static uint8 *pushpoint(uint8 *instrs,int pt) { instrs = pushheader(instrs,(pt>255)||(pt<0),1); return( addpoint(instrs,(pt>255)||(pt<0),pt)); } #define pushnum(a, b) pushpoint(a, b) static uint8 *pushpointstem(uint8 *instrs, int pt, int stem) { int isword = pt>255 || stem>255 || pt<0 || stem<0; instrs = pushheader(instrs,isword,2); instrs = addpoint(instrs,isword,pt); return( addpoint(instrs,isword,stem)); } #define push2points(a, b, c) pushpointstem(a, b, c) #define push2nums(a, b, c) pushpointstem(a, b, c) /* Push a bunch of point numbers (or other numbers) onto the stack. * TODO! * Possible strategies: * - push point by point (poor space efficiency) * - push all the stock at once (currently used, better, but has * poor space efficiency in case of a word among several bytes). * - push bytes and words separately */ static uint8 *pushpoints(uint8 *instrs, int ptcnt, const int *pts) { int i, isword = 0; for (i=0; i255 || pts[i]<0) isword=1; /* It's an error to push more than STACK_DEPTH points. */ if (ptcnt > STACK_DEPTH) IError("Truetype stack overflow will occur."); if (ptcnt > 255 && !isword) { instrs = pushpoints(instrs, 255, pts); ptcnt-=255; pts+=255; } instrs = pushheader(instrs,isword,ptcnt); for (i=0; i 3); instrs = pushpoints(instrs, ptcnt=STACK_DEPTH) instrs=instructpoints(instrs, ptcnt-(STACK_DEPTH-1), pts+(STACK_DEPTH-1), command); return( instrs ); } /****************************************************************************** * * Low-level routines for getting a cvt index for a stem width, assuming there * are any numbers in cvt. Includes legacy code for importing PS Private into * CVT. * ******************************************************************************/ 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 = malloc(100*sizeof(short)); cvt_tab->next = sf->ttf_tables; sf->ttf_tables = cvt_tab; } for ( i=0; (int)sizeof(uint16)*ilen; ++i ) { int tval = (int16) memushort(cvt_tab->data,cvt_tab->len, sizeof(uint16)*i); if ( val>=tval-1 && val<=tval+1 ) return( i ); } if ( (int)sizeof(uint16)*i>=cvt_tab->maxlen ) { if ( cvt_tab->maxlen==0 ) cvt_tab->maxlen = cvt_tab->len; cvt_tab->maxlen += 200; cvt_tab->data = realloc(cvt_tab->data,cvt_tab->maxlen); } memputshort(cvt_tab->data,sizeof(uint16)*i,val); cvt_tab->len += sizeof(uint16); return( i ); } /* by default sign is unimportant in the cvt * For some instructions anyway, but not for MIAP so this routine has * been broken in two. */ int TTF_getcvtval(SplineFont *sf,int val) { if ( val<0 ) val = -val; return( TTF__getcvtval(sf,val)); } /* We are given a stem weight and try to find matching one in CVT. * If none found, we return -1. */ static StdStem *CVTSeekStem(int xdir, GlobalInstrCt *gic, double value, int can_fail) { StdStem *mainstem = xdir?&(gic->stdvw):&(gic->stdhw); StdStem *otherstems = xdir?gic->stemsnapv:gic->stemsnaph; StdStem *closest = NULL; int otherstemcnt = xdir?gic->stemsnapvcnt:gic->stemsnaphcnt; int i; double mindelta=1e20, delta, closestwidth=1e20; if (mainstem->width == -1) return NULL; value = fabs(value); delta = fabs(mainstem->width - value); if (delta < mindelta) { mindelta = delta; closestwidth = rint(mainstem->width); closest = mainstem; } for (i=0; ifudge) return closest; if (value/closestwidth < 1.11 && value/closestwidth > 0.9) return closest; if (can_fail) return NULL; return closest; } /****************************************************************************** ****************************************************************************** ** ** We need to initialize global instructing context before autoinstructing ** a glyph, because we want to be sure that global hinting tables (cvt, prep, ** fpgm) were (or weren't) properly set up. ** ****************************************************************************** ******************************************************************************/ /* Helper routines: read PS private entry and return its contents. */ static int GetBlueFuzz(SplineFont *sf) { char *str, *end; if ( sf->private==NULL || (str=PSDictHasEntry(sf->private,"BlueFuzz"))==NULL || !isdigit(str[0]) ) return 1; return strtod(str, &end); } /* Return BlueScale as PPEM at which we have to stop suppressing overshoots */ static int GetBlueScale(SplineFont *sf) { char *str, *end; double bs; int result; if ( sf->private==NULL || (str=PSDictHasEntry(sf->private,"BlueScale"))==NULL ) return 42; bs = strtod(str, &end); if (end==str || bs<=0.0) bs=0.039625; bs*=240; bs+=0.49; bs*=300.0/72.0; result = (int)rint(bs); if (result>255) result = 255; /* Who would need such blue scale??? */ return result; } static real *ParsePSArray(const char *str, int *rescnt) { char *end; real d, *results=NULL; if ((rescnt == NULL) || (str == NULL)) return NULL; *rescnt = 0; while (*str) { while (!isdigit(*str) && *str!='-' && *str!='+' && *str!='.' && *str!='\0') ++str; if ( *str=='\0' ) break; d = strtod(str, &end); if ( d>=-32768 && d<=32767 ) { if (*rescnt) { results = realloc(results, sizeof(real)*(++(*rescnt))); results[*rescnt-1] = d; } else (results = calloc(*rescnt=1, sizeof(real)))[0] = d; } str = end; } return results; } static real *GetNParsePSArray(SplineFont *sf, const char *name, int *rescnt) { return ParsePSArray(PSDictHasEntry(sf->private, name), rescnt); } /* Tell if the two segments, [b1,o1] and [b2,o2] intersect. * This can be used to determine whether blues or stems overlap. */ static int SegmentsOverlap(real b1, real o1, real b2, real o2) { real t; if (b1 > o1) { t = o1; o1 = b1; b1 = t; } if (b2 > o2) { t = o2; o2 = b2; b2 = t; } return !((b2 > o1) || (o2 < b1)); } /* To be used with qsort() - sorts BlueZone array by base in ascending order. */ static int SortBlues(const void *a, const void *b) { return ((BlueZone *)a)->base > ((BlueZone *)b)->base; } /* Import blue data into global instructing context. Include family blues too. * We assume that blues are needed for family blues to make sense. If there are * only family blues, we treat them as normal blues. Otherwise, if a family blue * zone doesn't match any normal blue zone, or if they match perfectly, * it is ignored. */ static void GICImportBlues(GlobalInstrCt *gic) { int bluecnt = 0; int i, j, cnt; real *values; int HasPSBlues = (PSDictHasEntry(gic->sf->private, "BlueValues") != NULL) || (PSDictHasEntry(gic->sf->private, "OtherBlues") != NULL); int HasPSFamilyBlues = (PSDictHasEntry(gic->sf->private, "FamilyBlues") != NULL) || (PSDictHasEntry(gic->sf->private, "FamilyOtherBlues") != NULL); const char *PrimaryBlues = HasPSBlues ? "BlueValues" : "FamilyBlues"; const char *OtherBlues = HasPSBlues ? "OtherBlues" : "FamilyOtherBlues"; if (HasPSBlues || HasPSFamilyBlues){ values = GetNParsePSArray(gic->sf, PrimaryBlues, &cnt); cnt /= 2; if (cnt > 7) cnt = 7; if (values != NULL) { gic->bluecnt = bluecnt = cnt; /* First pair is a bottom zone (see Type1 specification). */ gic->blues[0].base = values[1]; gic->blues[0].overshoot = values[0]; gic->blues[0].family_base = strtod("NAN", NULL); /* Next pairs are top zones (see Type1 specification). */ for (i=1; iblues[i].family_base = strtod("NAN", NULL); gic->blues[i].base = values[2*i]; gic->blues[i].overshoot = values[2*i+1]; } free(values); } values = GetNParsePSArray(gic->sf, OtherBlues, &cnt); cnt /= 2; if (cnt > 5) cnt = 5; if (values != NULL) { gic->bluecnt += cnt; /* All pairs are bottom zones (see Type1 specification). */ for (i=0; iblues[i+bluecnt].family_base = strtod("NAN", NULL); gic->blues[i+bluecnt].base = values[2*i+1]; gic->blues[i+bluecnt].overshoot = values[2*i]; } free(values); bluecnt += cnt; } /* Add family data to blues */ if (HasPSBlues && HasPSFamilyBlues) { values = GetNParsePSArray(gic->sf, "FamilyBlues", &cnt); cnt /= 2; if (cnt > 7) cnt = 7; if (values != NULL) { /* First pair is a bottom zone (see Type1 specification). */ for (j=0; jblues[j].family_base)) continue; else if (values[1] != gic->blues[j].base && SegmentsOverlap(gic->blues[j].base, gic->blues[j].overshoot, values[0], values[1])) gic->blues[j].family_base = values[1]; /* Next pairs are top zones (see Type1 specification). */ for (i=1; iblues[j].family_base)) continue; else if (values[2*i] != gic->blues[j].base && SegmentsOverlap(gic->blues[j].base, gic->blues[j].overshoot, values[2*i], values[2*i+1])) gic->blues[j].family_base = values[2*i]; } free(values); } values = GetNParsePSArray(gic->sf, "FamilyOtherBlues", &cnt); cnt /= 2; if (cnt > 5) cnt = 5; if (values != NULL) { /* All pairs are bottom zones (see Type1 specification). */ for (i=0; iblues[j].family_base)) continue; else if (values[2*i+1] != gic->blues[j].base && SegmentsOverlap(gic->blues[j].base, gic->blues[j].overshoot, values[2*i], values[2*i+1])) gic->blues[j].family_base = values[2*i+1]; } free(values); } } } else if (gic->bd->bluecnt) { /* If there are no PS private entries, we have */ /* to use FF's quickly guessed fallback blues. */ gic->bluecnt = bluecnt = gic->bd->bluecnt; for (i=0; iblues[i].family_base = strtod("NAN", NULL); gic->blues[i].family_cvtindex = -1; if (gic->bd->blues[i][1] <= 0) { gic->blues[i].base = gic->bd->blues[i][1]; gic->blues[i].overshoot = gic->bd->blues[i][0]; } else { gic->blues[i].base = gic->bd->blues[i][0]; gic->blues[i].overshoot = gic->bd->blues[i][1]; } } } /* 'highest' and 'lowest' are not to be set yet. */ for (i=0; ibluecnt; i++) gic->blues[i].highest = gic->blues[i].lowest = -1; /* I assume ascending order in snap_to_blues(). */ qsort(gic->blues, gic->bluecnt, sizeof(BlueZone), SortBlues); } /* To be used with qsort() - sorts StdStem array by width in ascending order. */ static int SortStems(const void *a, const void *b) { return ((StdStem *)a)->width > ((StdStem *)b)->width; } /* Import stem data into global instructing context. We deal only with * horizontal or vertical stems (xdir decides) here. If Std*W is not specified, * but there exists StemSnap*, we'll make up a fake Std*V as a fallback. * Subtle manipulations with Std*W's value can result in massive change of * font appearance at some pixel sizes, because it's used as a base for * normalization of all other stems. */ static void GICImportStems(int xdir, GlobalInstrCt *gic) { int i, cnt, next; real *values; const char *s_StdW = xdir?"StdVW":"StdHW"; const char *s_StemSnap = xdir?"StemSnapV":"StemSnapH"; StdStem *stdw = xdir?&(gic->stdvw):&(gic->stdhw); StdStem **stemsnap = xdir?&(gic->stemsnapv):&(gic->stemsnaph); int *stemsnapcnt = xdir?&(gic->stemsnapvcnt):&(gic->stemsnaphcnt); if ((values = GetNParsePSArray(gic->sf, s_StdW, &cnt)) != NULL) { stdw->width = *values; free(values); } if ((values = GetNParsePSArray(gic->sf, s_StemSnap, &cnt)) != NULL) { *stemsnap = (StdStem *)calloc(cnt, sizeof(StdStem)); for (next=i=0; istdhw.width) (*stemsnap)[next++].width = values[i]; if (!next) { free(*stemsnap); *stemsnap = NULL; } *stemsnapcnt = next; free(values); /* I assume ascending order here and in normalize_stems(). */ qsort(*stemsnap, *stemsnapcnt, sizeof(StdStem), SortStems); } /* No StdW, but StemSnap exists? */ if (stdw->width == -1 && *stemsnap != NULL) { cnt = *stemsnapcnt; i = cnt/2; stdw->width = (*stemsnap)[i].width; memmove((*stemsnap)+i, (*stemsnap)+i+1, cnt-i-1); if (--(*stemsnapcnt) == 0) { free(*stemsnap); *stemsnap = NULL; } } } /* Assign CVT indices to blues and stems in global instructing context. In case * we can't implant it because of already existent cvt table, reassign the cvt * indices, picking them from existing cvt table (thus a cvt value can't be * considered 'horizontal' or 'vertical', and reliable stem normalization is * thus impossible) and adding some for new values. */ static void init_cvt(GlobalInstrCt *gic) { int i, cvtindex, cvtsize; struct ttf_table *tab; uint8 *cvt; cvtsize = 1; if (gic->stdhw.width != -1) cvtsize++; if (gic->stdvw.width != -1) cvtsize++; cvtsize += gic->stemsnaphcnt; cvtsize += gic->stemsnapvcnt; cvtsize += gic->bluecnt * 2; /* possible family blues */ cvt = calloc(cvtsize, cvtsize * sizeof(int16)); cvtindex = 0; /* Assign cvt indices */ for (i=0; ibluecnt; i++) { gic->blues[i].cvtindex = cvtindex; memputshort(cvt, 2*cvtindex++, rint(gic->blues[i].base)); if (isfinite(gic->blues[i].family_base)) { gic->blues[i].family_cvtindex = cvtindex; memputshort(cvt, 2*cvtindex++, rint(gic->blues[i].family_base)); } } if (gic->stdhw.width != -1) { gic->stdhw.cvtindex = cvtindex; memputshort(cvt, 2*cvtindex++, rint(gic->stdhw.width)); } for (i=0; istemsnaphcnt; i++) { gic->stemsnaph[i].cvtindex = cvtindex; memputshort(cvt, 2*cvtindex++, rint(gic->stemsnaph[i].width)); } if (gic->stdvw.width != -1) { gic->stdvw.cvtindex = cvtindex; memputshort(cvt, 2*cvtindex++, rint(gic->stdvw.width)); } for (i=0; istemsnapvcnt; i++) { gic->stemsnapv[i].cvtindex = cvtindex; memputshort(cvt, 2*cvtindex++, rint(gic->stemsnapv[i].width)); } cvtsize = cvtindex; cvt = realloc(cvt, cvtsize * sizeof(int16)); /* Try to implant the new cvt table */ gic->cvt_done = 0; tab = SFFindTable(gic->sf, CHR('c','v','t',' ')); if ( tab==NULL ) { tab = chunkalloc(sizeof(struct ttf_table)); tab->next = gic->sf->ttf_tables; gic->sf->ttf_tables = tab; tab->tag = CHR('c','v','t',' '); tab->len = tab->maxlen = cvtsize * sizeof(int16); if (tab->maxlen >256) tab->maxlen = 256; tab->data = cvt; gic->cvt_done = 1; } else { if (tab->len >= cvtsize * (int)sizeof(int16) && memcmp(cvt, tab->data, cvtsize * sizeof(int16)) == 0) gic->cvt_done = 1; free(cvt); if (!gic->cvt_done) { ff_post_error(_("Can't insert 'cvt'"), _("There already exists a 'cvt' table, perhaps legacy. " "FontForge can use it, but can't make any assumptions on " "values stored there, so generated instructions will be of " "lower quality. If legacy hinting is to be scrapped, it is " "suggested to clear the `cvt` and repeat autoinstructing. " )); } } if (gic->cvt_done) return; /* Fallback mode starts here. */ for (i=0; ibluecnt; i++) gic->blues[i].cvtindex = TTF_getcvtval(gic->sf, gic->blues[i].base); if (gic->stdhw.width != -1) gic->stdhw.cvtindex = TTF_getcvtval(gic->sf, gic->stdhw.width); for (i=0; istemsnaphcnt; i++) gic->stemsnaph[i].cvtindex = TTF_getcvtval(gic->sf, gic->stemsnaph[i].width); if (gic->stdvw.width != -1) gic->stdvw.cvtindex = TTF_getcvtval(gic->sf, gic->stdvw.width); for (i=0; istemsnapvcnt; i++) gic->stemsnapv[i].cvtindex = TTF_getcvtval(gic->sf, gic->stemsnapv[i].width); } /* We'll need at least STACK_DEPTH stack levels and a twilight point (and thus * also a twilight zone). We also currently define some functions in fpgm. * We must ensure this is indicated in the 'maxp' table. * * We also need two storage cells. As we now use SPVFS to set projection * vector for diagonal hinting, we have to adjust values taken by SPVFS, * so that diagonals look cleanly in all aspect ratios. Adjustments are * not trivial to compute, so we do this once (in prep) and store them * in storage[0] (for X direction) and storage[1] (for Y direction). */ static void init_maxp(GlobalInstrCt *gic) { struct ttf_table *tab = SFFindTable(gic->sf, CHR('m','a','x','p')); uint16 zones, twpts, store, fdefs, stack; if ( tab==NULL ) { tab = chunkalloc(sizeof(struct ttf_table)); tab->next = gic->sf->ttf_tables; gic->sf->ttf_tables = tab; tab->tag = CHR('m','a','x','p'); } if ( tab->len<32 ) { tab->data = realloc(tab->data,32); memset(tab->data+tab->len,0,32-tab->len); tab->len = tab->maxlen = 32; } zones = memushort(tab->data, 32, 7*sizeof(uint16)); twpts = memushort(tab->data, 32, 8*sizeof(uint16)); store = memushort(tab->data, 32, 9*sizeof(uint16)); fdefs = memushort(tab->data, 32, 10*sizeof(uint16)); stack = memushort(tab->data, 32, 12*sizeof(uint16)); if (gic->fpgm_done && zones<2) zones=2; if (gic->fpgm_done && twpts<1) twpts=1; if (gic->fpgm_done && gic->prep_done && store<2) store=2; if (gic->fpgm_done && fdefs<22) fdefs=22; if (stackdata, 7*sizeof(uint16), zones); memputshort(tab->data, 8*sizeof(uint16), twpts); memputshort(tab->data, 9*sizeof(uint16), store); memputshort(tab->data,10*sizeof(uint16), fdefs); memputshort(tab->data,12*sizeof(uint16), stack); } /* Other hinting software puts certain actions in FPGM to ease developer's life * and compress the code. I feel that having a 'standard' library of functions * could also help FF users. * * Caution! This code is heavily relied by autohinting. Any other code should * be placed below it. It's good to first clear font's hinting tables, then * autohint it, and then insert user's own code and do the manual hinting of * glyphs that do need it. */ static void init_fpgm(GlobalInstrCt *gic) { uint8 new_fpgm[] = { /* Function 0: position a point within a blue zone (given via cvt). * Note: in case of successful init of 'cvt' and 'prep' this function * could be much simpler. * Syntax: PUSHB_3 point cvt_of_blue 0 CALL */ 0xb0, // PUSHB_1 0x00, // 0 0x2c, // FDEF 0xb0, // PUSHB_1 0x00, // 0 0x13, // SZP0 0x4b, // MPPEM 0xb0, // PUSHB_1 - under this ppem blues will be specially rounded GetBlueScale(gic->sf), 0x50, // LT 0x58, // IF 0xb0, // PUSHB_0 0x4a, // 74 0x76, // SROUND - round blues a bit up to grid 0x59, // EIF 0xb0, // PUSHB_1 0x00, // 0 0x23, // SWAP 0x3f, // MIAP[rnd] - blue zone positioned here 0x18, // RTG - round state for overshoots in monochrome mode 0xb0, // PUSHB_1 0x06, // 6 0x2b, // CALL 0x58, // IF 0x3d, // RTDG - round state for overshoots in antialiased mode 0x59, // EIF 0x4b, // MPPEM 0xb0, // PUSHB_1 - under following ppem overshoots will be suppressed GetBlueScale(gic->sf), 0x50, // LT 0x58, // IF 0x7d, // RDTG - suppress overshoots 0x59, // EIF 0x20, // DUP 0xd4, // MDRP[rp0,rnd,grey] 0xb0, // PUSHB_1 0x01, // 1 0x13, // SZP0 0x2e, // MDAP[no-rnd] 0x18, // RTG 0x2d, // ENDF /* Function 1: Place given point relatively to previous, maintaining the * minimum distance. Then call FPGM 12 to check if the point's gridfitted * position is too far from its original position, and correct it, if necessary. * Syntax: PUSB_2 point 1 CALL */ 0xb0, // PUSHB_1 0x01, // 1 0x2c, // FDEF 0x20, // DUP 0xda, // MDRP[rp0,min,white] 0xb0, // PUSHB_1 0x0c, // 12 0x2b, // CALL 0x2d, // ENDF /* Function 2: Below given ppem, substitute the width with cvt entry. * Leave the resulting width on the stack. Used as the first step in * normalizing cvt stems, see normalize_stem(). * Syntax: PUSHX_3 width cvt_index ppem 2 CALL */ 0xb0, // PUSHB_1 0x02, // 2 0x2c, // FDEF 0x4b, // MPPEM 0x52, // GT 0x58, // IF 0x45, // RCVT 0x23, // SWAP 0x59, // EIF 0x21, // POP 0x2d, // ENDF /* Function 3: round a stack element as a black distance, respecting * minimum distance of 1px. This is used for rounding stems after width * normalization. Often preceeded with SROUND, so finally sets RTG. * Leaves the rounded width on the stack. * Syntax: PUSHX_2 width_to_be_rounded 3 CALL */ 0xb0, // PUSHB_1 0x03, // 3 0x2c, // FDEF 0x69, // ROUND[black] 0x18, // RTG 0x20, // DUP 0xb0, // PUSHB_1 0x40, // 64, that's one pixel as F26Dot6 0x50, // LT 0x58, // IF 0x21, // POP 0xb0, // PUSHB_1 0x40, // 64 0x59, // EIF 0x2d, // ENDF /* Function 4: Position the second edge of a stem that is not normally * regularized via cvt (but we snap it to cvt width below given ppem). * Vertical stems need special round state when not snapped to cvt * (basically, they are shortened by 0.25px before being rounded). * Syntax: PUSHX_5 pt cvt_index chg_rp0 ppem 4 CALL */ 0xb0, // PUSHB_1 0x04, // 4 0x2c, // FDEF 0xb0, // PUSHB_1 0x06, // 6 0x2b, // CALL 0x58, // IF 0x21, // POP 0x23, // SWAP 0x21, // POP 0x7a, // ROFF 0x58, // IF 0xdd, // MDRP[rp0,min,rnd,black] 0x1b, // ELSE 0xcd, // MDRP[min,rnd,black] 0x59, // EIF 0x1b, // ELSE 0x4b, // MPPEM 0x52, // GT 0x58, // IF 0x58, // IF 0xfd, // MIRP[rp0,min,rnd,black] 0x1b, // ELSE 0xed, // MIRP[min,rnd,black] 0x59, // EIF 0x1b, // ELSE 0x23, // SWAP 0x21, // POP 0xb0, // PUSHB_1 0x05, // 5 0x2b, // CALL 0x58, // IF 0xb0, // PUSHB_1 0x46, // 70 0x76, // SROUND 0x59, // EIF 0x58, // IF 0xdd, // MDRP[rp0,min,rnd,black] 0x1b, // ELSE 0xcd, // MDRP[min,rnd,black] 0x59, // EIF 0x59, // EIF 0x59, // EIF 0x18, // RTG 0x2d, // ENDF /* Function 5: determine if we are hinting vertically. The function * is crude and it's use is limited to conditions set by SVTCA[]. * Syntax: PUSHB_1 5 CALL; leaves boolean on the stack. */ 0xb0, // PUSHB_1 0x05, // 5 0x2c, // FDEF 0x0d, // GFV 0x5c, // NOT 0x5a, // AND 0x2d, // ENDF /* Function 6: check if we are hinting in grayscale. * CAUTION! Older FreeType versions lie if asked. * Syntax: PUSHB_1 6 CALL; leaves boolean on the stack. */ 0xb0, // PUSHB_1 0x06, // 6 0x2c, // FDEF 0xb1, // PUSHB_2 0x22, // 34 0x01, // 1 0x88, // GETINFO 0x50, // LT 0x58, // IF 0xb0, // PUSHB_1 0x20, // 32 0x88, // GETINFO 0x5c, // NOT 0x5c, // NOT 0x1b, // ELSE 0xb0, // PUSHB_1 0x00, // 0 0x59, // EIF 0x2d, // ENDF /* Function 7: check if we are hinting in cleartype. * CAUTION! FreeType doesn't support that, as subpixel * filtering is usually done by higher level library. * Syntax: PUSHB_1 7 CALL; leaves boolean on the stack. */ 0xb0, // PUSHB_1 0x07, // 7 0x2c, // FDEF 0xb1, // PUSHB_2 0x24, // 36 0x01, // 1 0x88, // GETINFO 0x50, // LT 0x58, // IF 0xb0, // PUSHB_1 0x40, // 64 0x88, // GETINFO 0x5c, // NOT 0x5c, // NOT 0x1b, // ELSE 0xb0, // PUSHB_1 0x00, // 0 0x59, // EIF 0x2d, // ENDF /* Function 8: Interpolate a point between * two other points and snap it to the grid. * Syntax: PUSHX_4 pt_to_ip rp1 rp2 8 CALL; */ 0xb0, // PUSHB_1 0x08, // 8 0x2c, // FDEF 0x12, // SRP2 0x11, // SRP1 0x20, // DUP 0x39, // IP 0x2f, // MDAP[rnd] 0x2d, // ENDF /* Function 9: Link a serif-like element edge to the opposite * edge of the base stem when rounding down to grid, but ensure * that its distance from the reference point is larger than * the base stem width at least to a specified amount of pixels. * Syntax: PUSHX_3 min_dist inner_pt outer_pt CALL; */ 0xb0, // PUSHB_1 0x09, // 9 0x2c, // FDEF 0x20, // DUP 0x7d, // RDTG 0xb0, // PUSHB_1 0x06, // 6 0x2b, // CALL 0x58, // IF 0xc4, // MDRP[min,grey] 0x1b, // ELSE 0xcd, // MDRP[min,rnd,black] 0x59, // EIF 0x20, // DUP 0xb0, // PUSHB_1 0x03, // 3 0x25, // CINDEX 0x49, // MD[grid] 0x23, // SWAP 0x20, // DUP 0xb0, // PUSHB_1 0x04, // 4 0x26, // MINDEX 0x4a, // MD[orig] 0xb0, // PUSHB_1 0x00, // 0 0x50, // LT 0x58, // IF 0x8a, // ROLL 0x65, // NEG 0x8a, // ROLL 0x61, // SUB 0x20, // DUP 0xb0, // PUSHB_1 0x00, // 0 0x50, // LT 0x58, // IF 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x1b, // ELSE 0x8a, // ROLL 0x8a, // ROLL 0x61, // SUB 0x20, // DUP 0xb0, // PUSHB_1 0x00, // 0 0x52, // GT 0x58, // IF 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x59, // EIF 0x18, // RTG 0x2d, // ENDF /* Function 10: depending from the hinting mode (grayscale or mono) set * rp0 either to pt1 or to pt2. This is used to link serif-like elements * either to the opposite side of the base stem or to the same side (i. e. * left-to-left and right-to-right). * Syntax: PUSHX_3 pt2 pt1 10 CALL */ 0xb0, // PUSHB_1 0x0a, // 10 0x2c, // FDEF 0xb0, // PUSHB_1 0x06, // 6 0x2b, // CALL 0x58, // IF 0x21, // POP 0x10, // SRP0 0x1b, // ELSE 0x10, // SRP0 0x21, // POP 0x59, // EIF 0x2d, // ENDF /* Function 11: similar to FPGM 1, but places a point without * maintaining the minimum distance. * Syntax: PUSHX_2 point 11 CALL */ 0xb0, // PUSHB_1 0x0b, // 11 0x2c, // FDEF 0x20, // DUP 0xd2, // MDRP[rp0,white] 0xb0, // PUSHB_1 0x0c, // 12 0x2b, // CALL 0x2d, // ENDF /* Function 12: Check if the gridfitted position of the point is too far * from its original position, and shift it, if necessary. The function is * used to place vertical stems, it assures almost linear advance width * to PPEM scaling. Shift amount is capped to at most 1 px to prevent some * weird artifacts at very small ppems. In cleartype mode, no shift * is made at all. * Syntax: PUSHX_2 point 12 CALL */ 0xb0, // PUSHB_1 0x0c, // 12 0x2c, // FDEF 0x20, // DUP 0x2f, // MDAP[rnd], this is needed for grayscale mode 0xb0, // PUSHB_1 0x07, // 7 0x2b, // CALL 0x5c, // NOT 0x58, // IF 0x20, // DUP 0x20, // DUP 0x47, // GC[cur] 0x23, // SWAP 0x46, // GC[orig] 0x61, // SUB 0x6a, // ROUND[white] 0x20, // DUP 0x58, // IF 0x20, // DUP 0x64, // ABS 0x62, // DIV 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x1b, // ELSE 0x21, // POP 0x59, // EIF 0x2d, // ENDF /* Function 13: Interpolate a HStem edge's reference point between two other points * and snap it to the grid. Then compare its new position with the ungridfitted * position of the second edge. If the gridfitted point belongs to the bottom edge * and now it is positioned above the top edge's original coordinate, then shift it * one pixel down; similarly, if the interpolation resulted in positioning the top * edge below the original coordinate of the bottom edge, shift it one pixel up. * Syntax: PUSHX_6 other_edge_refpt pt_to_ip rp1 rp2 13 CALL */ 0xb0, // PUSHB_1 0x0d, // 13 0x2c, // FDEF 0x12, // SRP2 0x11, // SRP1 0x20, // DUP 0x20, // DUP 0x39, // IP 0x2f, // MDAP[rnd] 0x20, // DUP 0x8a, // ROLL 0x20, // DUP 0x47, // GC[orig] 0x8a, // ROLL 0x46, // GC[cur] 0x61, // SUB 0x23, // SWAP 0x8a, // ROLL 0x20, // DUP 0x8a, // ROLL 0x23, // SWAP 0x4A, // MD[orig] 0xb0, // PUSHB_1 0x00, // 0 0x50, // LT 0x58, // IF 0x23, // SWAP 0xb0, // PUSHB_1 0x00, // 0 0x52, // GT 0x58, // IF 0xb0, // PUSHB_1 0x40, // 64 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x59, // EIF 0x1b, // ELSE 0x23, // SWAP 0xb0, // PUSHB_1 0x00, // 0 0x50, // LT 0x58, // IF 0xb0, // PUSHB_1 0x40, // 64 0x65, // NEG 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x59, // EIF 0x59, // EIF 0x2d, // ENDF /* Function 14: Link two points using MDRP without maintaining * the minimum distance. In antialiased mode use rounding to * double grid for this operation, otherwise ensure there is no * distance between those two points below the given PPEM (i. e. * points are aligned). The function is used for linking nested * stems to each other, and guarantees their relative positioning * is preserved in the gridfitted outline. * Syntax: PUSHX_4 ppem ref_pt base_pt 14 CALL; */ 0xb0, // PUSHB_1 0x0e, // 14 0x2c, // FDEF 0xb0, // PUSHB_1 0x06, // 6 0x2b, // CALL 0x58, // IF 0x3d, // RTDG 0xd6, // MDRP[rp0,rnd,white] 0x18, // RTG 0x21, // POP 0x21, // POP 0x1b, // ELSE 0x20, // DUP 0xd6, // MDRP[rp0,rnd,white] 0x8a, // ROLL 0x4b, // MPPEM 0x52, // GT 0x58, // IF 0x20, // DUP 0x8a, // ROLL 0x23, // SWAP 0x49, // MD[grid] 0x20, // DUP 0xb0, // PUSHB_1 0x00, // 0 0x55, // NEQ 0x58, // IF 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x59, // EIF 0x2d, // ENDF /* Function 15: similar to FPGM 1, but used to position a stem * relatively to the previous stem preserving the counter width * equal to the distance between another pair of previously positioned * stems. Thus it serves nearly the same purpose as PS counter hints. * Syntax: PUSHX_6 master_counter_start_pt master_counter_end_pt * current_counter_start_pt current_counter_end_pt ppem 15 CALL; */ 0xb0, // PUSHB_1 0x0f, // 15 0x2c, // FDEF 0x23, // SWAP 0x20, // DUP 0xd6, // MDRP[rp0,rnd,white] 0x20, // DUP 0x2f, // MDAP[rnd], this is needed for grayscale mode 0xb0, // PUSHB_1 0x07, // 7 0x2b, // CALL 0x5c, // NOT 0x58, // IF 0x23, // SWAP 0x20, // DUP 0x58, // IF 0x4b, // MPPEM 0x53, // GTEQ 0x1b, // ELSE 0x21, // POP 0xb0, // PUSHB_1 0x01, // 1 0x59, // EIF 0x58, // IF 0x8a, // ROLL 0xb0, // PUSHB_1 0x04, // 4 0x26, // MINDEX 0x49, // MD[grid] 0x23, // SWAP 0x8a, // ROLL 0x23, // SWAP 0x20, // DUP 0x8a, // ROLL 0x49, // MD[grid] 0x8a, // ROLL 0x23, // SWAP 0x61, // SUB 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x21, // POP 0x21, // POP 0x59, // EIF 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x21, // POP 0x21, // POP 0x21, // POP 0x59, // EIF 0x2d, // ENDF /* Function 16: Same as FPGM 1, but calls FPGM 18 rather than FPGM 12 * and thus takes 3 arguments. * Syntax: PUSHX_3 ref_point point 16 CALL */ 0xb0, // PUSHB_1 0x10, // 16 0x2c, // FDEF 0x20, // DUP 0xda, // MDRP[rp0,min,white] 0xb0, // PUSHB_1 0x12, // 18 0x2b, // CALL 0x2d, // ENDF /* Function 17: Same as FPGM 11, but calls FPGM 18 rather than FPGM 12 * and thus takes 3 arguments. * Syntax: PUSHX_3 ref_point point 17 CALL */ 0xb0, // PUSHB_1 0x11, // 17 0x2c, // FDEF 0x20, // DUP 0xd2, // MDRP[rp0,white] 0xb0, // PUSHB_1 0x12, // 18 0x2b, // CALL 0x2d, // ENDF /* Function 18: this is a special version of FPGM 12, used when the counter * control is enabled but doesn't directly affect the stem which is going to * be positioned. Unlike FPGM 12, it doesn't just attempt to position a point * closely enough to its original coordinate, but also checks if the previous * stem has already been shifted relatively to its "ideal" position FPGM 12 would * determine. If so, then the desired point position is corrected relatively to * the current placement of the previous stem. * Syntax: PUSHX_3 ref_point point 18 CALL */ 0xb0, // PUSHB_1 0x12, // 18 0x2c, // FDEF 0x20, // DUP 0x2f, // MDAP[rnd], this is needed for grayscale mode 0xb0, // PUSHB_1 0x07, // 7 0x2b, // CALL 0x5c, // NOT 0x58, // IF 0x20, // DUP 0x20, // DUP 0x47, // GC[cur] 0x23, // SWAP 0x46, // GC[orig] 0x61, // SUB 0x6a, // ROUND[white] 0x8a, // ROLL 0x20, // DUP 0x47, // GC[cur] 0x23, // SWAP 0x46, // GC[orig] 0x23, // SWAP 0x61, // SUB 0x6a, // ROUND[white] 0x60, // ADD 0x20, // DUP 0x58, // IF 0x20, // DUP 0x64, // ABS 0x62, // DIV 0x38, // SHPIX 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x1b, // ELSE 0x21, // POP 0x21, // POP 0x59, // EIF 0x2d, // ENDF /* Function 19: used to align a point relatively to a diagonal line, * specified by two other points. First we check if the point going * to be positioned doesn't deviate too far from the line in the original * outline. If the deviation is small enough to neglect it, we use ALIGNRP * to position the point, otherwise MDRP is used instead. We can't just * always use MDRP, because this command may produce wrong results at * small PPEMs, if the original and gridfitted coordinates of the line end * points specify slightly different unit vectors. * Syntax: point diag_start_point diag_end_point 19 CALL */ 0xb0, // PUSHB_1 0x13, // 19 0x2c, // FDEF 0x20, // DUP 0x8a, // ROLL 0x20, // DUP 0x8a, // ROLL 0x87, // SDPVTL[orthogonal] 0x20, // DUP 0xb0, // PUSHB_1 0x03, // 4 0x25, // CINDEX 0x4a, // MD[orig] 0x64, // ABS 0x23, // SWAP 0x8a, // ROLL 0x07, // SPVTL[orthogonal] 0xb0, // PUSHB_1 0x20, // 32 0x50, // LT 0x58, // IF 0x3c, // ALIGNRP 0x1b, // ELSE 0xc0, // MDRP[grey] 0x59, // EIF 0x2d, // ENDF /* Function 20: compute adjustments for X and Y components of projection * vector, for aspect ratios different than 1:1, and store them * in storage[0] and storage[1] respectively. * Syntax: 20 CALL (use it only ONCE, from PREP table). */ 0xb0, // PUSHB_1 0x14, // 20 0x2c, // FDEF 0xb3, // PUSHB_4 (we normally need no adjustments) 0x00, // 0 0x40, // 1.0 (F26Dot6) 0x01, // 1 0x40, // 1.0 (F26Dot6) 0x42, // WS 0x42, // WS 0x01, // SVTCA[x-axis] 0x4b, // MPPEM 0xb8, // PUSHW_1 0x10, // 4096 0x00, // ...still that 4096 0x63, // MUL (so we have PPEM along X casted to F26Dot6) 0x00, // SVTCA[y-axis] 0x4b, // MPPEM 0xb8, // PUSHW_1 0x10, // 4096 0x00, // ...still that 4096 0x63, // MUL (so we have PPEM along Y casted to F26Dot6) 0x20, // DUP 0x8a, // ROLL 0x20, // DUP 0x8a, // ROLL 0x55, // NEQ 0x58, // IF (if PPEM along X != PPEM along Y) 0x20, // DUP 0x8a, // ROLL 0x20, // DUP 0x8a, // ROLL 0x52, // GT 0x58, // IF (if PPEM along X < PPEM along Y) 0x23, // SWAP 0x62, // DIV 0x20, // DUP 0xb0, // PUSHB_1 0x00, // 0 0x23, // SWAP 0x42, // WS 0x1b, // ELSE (if PPEM along X > PPEM along Y) 0x62, // DIV 0x20, // DUP 0xb0, // PUSHB_1 0x01, // 1 0x23, // SWAP 0x42, // WS 0x59, // EIF 0x20, // DUP [A LOOP STARTS HERE] 0xb0, // PUSHB_1 0x40, // 1.0 (F26Dot6) 0x52, // GT 0x58, // IF (bigger adjustment is greater than 1.0 => needs fixing) 0xb2, // PUSHB_3 0x00, // 0 0x20, // 0.5 (F26Dot6) 0x00, // 0 0x43, // RS 0x63, // MUL 0x42, // WS (we halved adjustment for X) 0xb2, // PUSHB_3 0x01, // 1 0x20, // 0.5 (F26Dot6) 0x01, // 1 0x43, // RS 0x63, // MUL 0x42, // WS (we halved adjustment for Y) 0xb0, // PUSHB_1 0x20, // 0.5 (F26Dot6) 0x63, // MUL (we halved the bigger adjustment) 0xb0, // PUSHB_1 0x19, // 25 0x65, // NEG 0x1c, // JMPR (go back to the start of the loop) 0x21, // POP 0x59, // EIF 0x1b, // ELSE (if PPEM along X == PPEM along Y) 0x21, // POP 0x21, // POP 0x59, // EIF 0x2d, // ENDF /* Function 21: call it before SFVFS or SPVFS, so that the vector * passed is aspect-ratio corrected. * Syntax: x y 21 CALL */ 0xb0, // PUSHB_1 0x15, // 21 0x2c, // FDEF 0xb0, // PUSHB_1 0x01, // 1 0x43, // RS 0x63, // MUL 0x23, // SWAP 0xb0, // PUSHB_1 0x00, // 0 0x43, // RS 0x63, // MUL 0x23, // SWAP 0x2d // ENDF }; struct ttf_table *tab = SFFindTable(gic->sf, CHR('f','p','g','m')); if ( tab==NULL ) { /* We have to create such table. */ tab = chunkalloc(sizeof(struct ttf_table)); tab->next = gic->sf->ttf_tables; gic->sf->ttf_tables = tab; tab->tag = CHR('f','p','g','m'); tab->len = 0; } if (tab->len==0 || (tab->len < (int)sizeof(new_fpgm) && !memcmp(tab->data, new_fpgm, tab->len))) { /* We can safely update font program. */ tab->len = tab->maxlen = sizeof(new_fpgm); tab->data = realloc(tab->data, sizeof(new_fpgm)); memmove(tab->data, new_fpgm, sizeof(new_fpgm)); gic->fpgm_done = 1; } else { /* there already is a font program. */ gic->fpgm_done = 0; if (tab->len >= (int)sizeof(new_fpgm)) if (!memcmp(tab->data, new_fpgm, sizeof(new_fpgm))) gic->fpgm_done = 1; /* it's ours. */ /* Log warning message. */ if (!gic->fpgm_done) ff_post_error(_("Can't insert 'fpgm'"), _("There exists a 'fpgm' code that seems incompatible with " "FontForge's. Instructions generated will be of lower " "quality. If legacy hinting is to be scrapped, it is " "suggested to clear the `fpgm` and repeat autoinstructing. " "It will be then possible to append user's code to " "FontForge's 'fpgm', but due to possible future updates, " "it is extremely advised to use high numbers for user's " "functions." )); } } /* When initializing global instructing context, we want to set up the 'prep' * table in order to apply family blues and normalize stem widths for monochrome * display. * * The stem normalizer is heavily based on simple concept from FreeType2. * * First round the StdW. Then for each StemSnap (going outwards from StdW) check * if it's within 1px from its already rounded neighbor, and if so, snap it * before rounding. From all vertical stems (but not StdHW itself), 0.25px is * subtracted before rounding. Similar method is used for non-cvt stems, they're * snapped to the closest standard width if possible. * * NOTE: because of tiny scaling issues, we have to compute ppem at which each * stem stops being snapped to its already-rounded neighbor here instead of * relegating this to the truetype bytecide interpreter. We can't simply rely * on cvt cut-in. */ static int compute_blue_height(real val, int EM, int bluescale, int ppem) { int scaled_val = rint((rint(fabs(val)) * ppem * 64)/EM); if (ppem < bluescale) scaled_val += 16; return (scaled_val + 32) / 64 * (val / fabs(val)); } static uint8 *use_family_blues(uint8 *prep_head, GlobalInstrCt *gic) { int i, h1, h2, stopat; int bs = GetBlueScale(gic->sf); int EM = gic->sf->ascent + gic->sf->descent; int callargs[3]; for (i=0; ibluecnt; i++) { if (isfinite(gic->blues[i].family_base)) { for (stopat=0; stopat<32768; stopat++) { h1 = compute_blue_height(gic->blues[i].base, EM, bs, stopat); h2 = compute_blue_height(gic->blues[i].family_base, EM, bs, stopat); if (abs(h1 - h2) > 1) break; } callargs[0] = gic->blues[i].family_cvtindex; callargs[1] = stopat; callargs[2] = 2; prep_head = pushnum(prep_head, gic->blues[i].cvtindex); *prep_head++ = DUP; *prep_head++ = 0x45; //RCVT prep_head = pushnums(prep_head, 3, callargs); *prep_head++ = CALL; *prep_head++ = 0x44; //WCVTP } } return prep_head; } /* Return width (in pixels) of given stem, taking snaps into account. */ #define SNAP_THRESHOLD (64) static int compute_stem_width(int xdir, StdStem *stem, int EM, int ppem) { int scaled_width; /* in 1/64th pixels */ int snapto_width; /* in 1/64th pixels */ scaled_width = (int)rint((rint(fabs(stem->width)) * ppem * 64.0)/EM); if (scaled_width < 64) scaled_width = 64; if (stem->snapto != NULL) { if (stem->stopat > ppem) { snapto_width = 64*compute_stem_width(xdir, stem->snapto, EM, ppem); if (abs(snapto_width - scaled_width) < SNAP_THRESHOLD) scaled_width = snapto_width; } if (xdir) scaled_width -= 16; } return (scaled_width + 32) / 64; } /* Normalize a single stem. The code generated assumes there is a scaled stem * width on bytecode interpreter's stack, and leaves normalized width there. */ static uint8 *normalize_stem(uint8 *prep_head, int xdir, StdStem *stem, GlobalInstrCt *gic) { int callargs[3]; int i; stem->stopat = 32767; if (stem->snapto != NULL) { /* compute ppem at which to stop snapping stem to stem->snapto */ int EM = gic->sf->ascent + gic->sf->descent; for (i=7; i<32768; i++) { int width_parent = compute_stem_width(xdir, stem->snapto, EM, i); int width_me = compute_stem_width(xdir, stem, EM, i); if (width_parent != width_me) { stem->stopat = i; break; } } /* snap if below given ppem */ callargs[0] = stem->snapto->cvtindex; callargs[1] = stem->stopat; callargs[2] = 2; prep_head = pushnums(prep_head, 3, callargs); *prep_head++ = CALL; /* Round[black], respecting minimum distance of 1 px */ /* Vertical stems (but not StdVW) use special rounding threshold. */ /* The rounding function restores default round state at the end. */ if (xdir) { prep_head = push2nums(prep_head, 3, 70); *prep_head++ = SROUND; } else prep_head = pushnum(prep_head, 3); *prep_head++ = CALL; } else { /* simply round[black] respecting minimum distance of 1 px */ prep_head = pushnum(prep_head, 3); *prep_head++ = CALL; } return prep_head; } /* Append the code for normalizing standard stems' widths to 'prep'. */ static uint8 *normalize_stems(uint8 *prep_head, int xdir, GlobalInstrCt *gic) { int i, t; StdStem *mainstem = xdir?&(gic->stdvw):&(gic->stdhw); StdStem *otherstems = xdir?gic->stemsnapv:gic->stemsnaph; int otherstemcnt = xdir?gic->stemsnapvcnt:gic->stemsnaphcnt; if (mainstem->width == -1) return prep_head; /* set up the standard width */ mainstem->snapto = NULL; *prep_head++ = xdir?SVTCA_x:SVTCA_y; prep_head = pushnum(prep_head, mainstem->cvtindex); *prep_head++ = DUP; *prep_head++ = 0x45; //RCVT prep_head = normalize_stem(prep_head, xdir, mainstem, gic); *prep_head++ = 0x44; //WCVTP /* set up other standard widths */ for (i=0; iwidth; i++); t = i-1; for (i=t; i>=0; i--) { otherstems[i].snapto = i==t?mainstem:otherstems+i+1; prep_head = pushnum(prep_head, otherstems[i].cvtindex); *prep_head++ = DUP; *prep_head++ = 0x45; //RCVT prep_head = normalize_stem(prep_head, xdir, otherstems+i, gic); *prep_head++ = 0x44; //WCVTP } for (i=t+1; icvt_done) { prepmaxlen += 48 + 38*(gic->stemsnaphcnt + gic->stemsnapvcnt); prepmaxlen += 14*(gic->bluecnt); } if (gic->fpgm_done) prepmaxlen += 3; new_prep = calloc(prepmaxlen, sizeof(uint8)); memmove(new_prep, new_prep_preamble, preplen*sizeof(uint8)); prep_head = new_prep + preplen; if (gic->cvt_done && gic->fpgm_done) { /* Apply family blues. */ prep_head = use_family_blues(prep_head, gic); /* Normalize stems (only in monochrome mode) */ prep_head = pushnum(prep_head, 6); *prep_head++ = CALL; *prep_head++ = 0x5c; // NOT *prep_head++ = 0x58; // IF prep_head = normalize_stems(prep_head, 0, gic); prep_head = normalize_stems(prep_head, 1, gic); *prep_head++ = 0x59; // EIF } /* compute adjustments for projection vector */ if (gic->fpgm_done) { prep_head = pushnum(prep_head, 20); *prep_head++ = CALL; } preplen = prep_head - new_prep; tab = SFFindTable(gic->sf, CHR('p','r','e','p')); if ( tab==NULL ) { /* We have to create such table. */ tab = chunkalloc(sizeof(struct ttf_table)); tab->next = gic->sf->ttf_tables; gic->sf->ttf_tables = tab; tab->tag = CHR('p','r','e','p'); tab->len = 0; } if (tab->len==0 || (tab->len < preplen && !memcmp(tab->data, new_prep, tab->len))) { /* We can safely update cvt program. */ tab->len = tab->maxlen = preplen; tab->data = realloc(tab->data, preplen); memmove(tab->data, new_prep, preplen); gic->prep_done = 1; } else { /* there already is a font program. */ gic->prep_done = 0; if (tab->len >= preplen) if (!memcmp(tab->data, new_prep, preplen)) gic->prep_done = 1; /* it's ours */ /* Log warning message. */ if (!gic->prep_done) ff_post_error(_("Can't insert 'prep'"), _("There exists a 'prep' code incompatible with FontForge's. " "It can't be guaranteed it will work well. It is suggested " "to allow FontForge to insert its code and then append user" "'s own." )); } free(new_prep); } /* * Initialize Global Instructing Context */ #define EDGE_FUZZ (500.0) void InitGlobalInstrCt(GlobalInstrCt *gic, SplineFont *sf, int layer, BlueData *bd) { BlueData _bd; if (bd == NULL) { QuickBlues(sf,layer,&_bd); bd = &_bd; } gic->sf = sf; gic->bd = bd; gic->layer = layer; gic->fudge = (sf->ascent+sf->descent)/EDGE_FUZZ; gic->cvt_done = false; gic->fpgm_done = false; gic->prep_done = false; gic->bluecnt = 0; gic->stdhw.width = -1; gic->stemsnaph = NULL; gic->stemsnaphcnt = 0; gic->stdvw.width = -1; gic->stemsnapv = NULL; gic->stemsnapvcnt = 0; GICImportBlues(gic); GICImportStems(0, gic); /* horizontal stems */ GICImportStems(1, gic); /* vertical stems */ init_cvt(gic); init_fpgm(gic); init_prep(gic); init_maxp(gic); } /* * Finalize Global Instructing Context */ void FreeGlobalInstrCt(GlobalInstrCt *gic) { gic->sf = NULL; gic->bd = NULL; gic->fudge = 0; gic->cvt_done = false; gic->fpgm_done = false; gic->prep_done = false; gic->bluecnt = 0; gic->stdhw.width = -1; if (gic->stemsnaphcnt != 0) free(gic->stemsnaph); gic->stemsnaphcnt = 0; gic->stemsnaph = NULL; gic->stdvw.width = -1; if (gic->stemsnapvcnt != 0) free(gic->stemsnapv); gic->stemsnapvcnt = 0; gic->stemsnapv = NULL; } /****************************************************************************** ****************************************************************************** ** ** Stuff for managing global instructing context ends here. Now we'll deal ** with single glyphs. ** ** Many functions here need large or similar sets of arguments. I decided to ** define an '(local) instructing context' to have them in one place and keep ** functions' argument lists reasonably short. I first need to define some ** internal sub-structures for instructing diagonal stems. Similar structures ** for CVT management (based on PS Private) are defined in splinefont.h, and ** were initialized handled above. ** ****************************************************************************** ******************************************************************************/ /* A line, described by two points */ typedef struct pointvector { PointData *pd1, *pd2; int done; } PointVector; /* In this structure we store information about diagonales, relatively to which the given point should be positioned */ typedef struct diagpointinfo { struct pointvector line[2]; int count; } DiagPointInfo; typedef struct instrct { /* Things that are global for font and should be initialized before instructing particular glyph. */ GlobalInstrCt *gic; /* Here things for this particular glyph start. */ SplineChar *sc; SplineSet *ss; /* instructions */ uint8 *instrs; /* the beginning of the instructions */ uint8 *pt; /* the current position in the instructions */ /* properties indexed by contour number */ int *contourends; /* points ending their contours. Null-terminated. */ uint8 *clockwise; /* is given contour clockwise? */ /* properties, indexed by ttf point index. Some could be compressed. */ int ptcnt; /* number of points in this glyph */ BasePoint *bp; /* point coordinates */ uint8 *touched; /* touchflags; points explicitly instructed */ uint8 *affected; /* touchflags; almost touched, but optimized out */ /* data from stem detector */ GlyphData *gd; /* stuff for hinting diagonals */ int diagcnt; StemData **diagstems; DiagPointInfo *diagpts; /* indexed by ttf point index */ /* stuff for hinting edges (stems, blues, strong point interpolation). */ int xdir; /* direction flag: x=true, y=false */ int cdir; /* is current contour outer? - blues need this */ struct __edge { real base; /* where the edge is */ int refpt; /* best ref. point for an edge, ttf index, -1 if none */ int refscore; /* its quality, for searching better one; 0 if none */ int othercnt; /* count of other points to instruct for this edge */ int *others; /* their ttf indices, optimize_edge() is advised */ } edge; /* Some variables for tracking graphics state */ int rp0; } InstrCt; /****************************************************************************** * * Low-level routines for manipulting and classifying splinepoints * ******************************************************************************/ /* Find previous point index on the contour. */ static int PrevOnContour(int *contourends, int p) { int i; if (p == 0) return contourends[0]; else { for (i=0; contourends[i+1]; i++) if (contourends[i]+1 == p) return contourends[i+1]; return p-1; } } /* Find next point index on the contour. */ static int NextOnContour(int *contourends, int p) { int i; if (p == 0) return 1; else { for (i=0; contourends[i]; i++) { if (contourends[i] == p) { if (i==0) return 0; else return contourends[i-1]+1; } } return p+1; } } /* For hinting stems, I found it needed to check if candidate point for * instructing is pararell to hint's direction to avoid snapping wrong points. * I splitted the routine into two, as sometimes it may be needed to check * the angle to be strictly almost the same, not just pararell. */ static int __same_angle(int *contourends, BasePoint *bp, int p, double angle) { int PrevPoint, NextPoint; double PrevTangent, NextTangent; PrevPoint = PrevOnContour(contourends, p); NextPoint = NextOnContour(contourends, p); PrevTangent = atan2(bp[p].y - bp[PrevPoint].y, bp[p].x - bp[PrevPoint].x); NextTangent = atan2(bp[NextPoint].y - bp[p].y, bp[NextPoint].x - bp[p].x); /* If at least one of the tangents is close to the given angle, return */ /* true. 'Close' means about 5 deg, i.e. about 0.087 rad. */ PrevTangent = fabs(PrevTangent-angle); NextTangent = fabs(NextTangent-angle); while (PrevTangent > M_PI) PrevTangent -= 2*M_PI; while (NextTangent > M_PI) NextTangent -= 2*M_PI; return (fabs(PrevTangent) <= 0.087) || (fabs(NextTangent) <= 0.087); } static int same_angle(int *contourends, BasePoint *bp, int p, double angle) { return __same_angle(contourends, bp, p, angle) || __same_angle(contourends, bp, p, angle+M_PI); } /* I found it needed to write some simple functions to classify points snapped * to hint's edges. Classification helps to establish the most accurate leading * point for an edge. */ static int _IsExtremum(int xdir, SplinePoint *sp) { return xdir? (!sp->nonextcp && !sp->noprevcp && sp->nextcp.x==sp->me.x && sp->prevcp.x==sp->me.x): (!sp->nonextcp && !sp->noprevcp && sp->nextcp.y==sp->me.y && sp->prevcp.y==sp->me.y); } static int IsExtremum(int xdir, int p, SplinePoint *sp) { int ret = _IsExtremum(xdir, sp); if ((sp->nextcpindex == p) && (sp->next != NULL) && (sp->next->to != NULL)) ret = ret || _IsExtremum(xdir, sp->next->to); else if ((sp->ttfindex != p) && (sp->prev != NULL) && (sp->prev->from != NULL)) ret = ret || _IsExtremum(xdir, sp->prev->from); return ret; } static int IsCornerExtremum(int xdir, int *contourends, BasePoint *bp, int p) { int PrevPoint = PrevOnContour(contourends, p); int NextPoint = NextOnContour(contourends, p); return xdir? ((bp[PrevPoint].x > bp[p].x && bp[NextPoint].x > bp[p].x) || (bp[PrevPoint].x < bp[p].x && bp[NextPoint].x < bp[p].x)): ((bp[PrevPoint].y > bp[p].y && bp[NextPoint].y > bp[p].y) || (bp[PrevPoint].y < bp[p].y && bp[NextPoint].y < bp[p].y)); } static int IsAnglePoint(int *contourends, BasePoint *bp, SplinePoint *sp) { int PrevPoint, NextPoint, p=sp->ttfindex; double PrevTangent, NextTangent; if ((sp->pointtype != pt_corner) || (p == 0xffff)) return 0; PrevPoint = PrevOnContour(contourends, p); NextPoint = NextOnContour(contourends, p); PrevTangent = atan2(bp[p].y - bp[PrevPoint].y, bp[p].x - bp[PrevPoint].x); NextTangent = atan2(bp[NextPoint].y - bp[p].y, bp[NextPoint].x - bp[p].x); return fabs(PrevTangent - NextTangent) > 0.261; } static int IsInflectionPoint(int *contourends, BasePoint *bp, SplinePoint *sp) { double CURVATURE_THRESHOLD = 1e-9; struct spline *prev, *next; double in, out; if (IsAnglePoint(contourends, bp, sp)) return 0; /* point of a single-point contour can't be an inflection point. */ if (sp->prev != NULL && sp->prev->from != NULL && sp->prev->from == sp) return 0; prev = sp->prev; in = 0; while (prev != NULL && fabs(in) < CURVATURE_THRESHOLD) { in = SplineCurvature(prev, 1); if (fabs(in) < CURVATURE_THRESHOLD) in = SplineCurvature(prev, 0); if (fabs(in) < CURVATURE_THRESHOLD) prev = prev->from->prev; if ((prev != NULL && IsAnglePoint(contourends, bp, prev->to)) || (prev == sp->prev)) break; } next = sp->next; out = 0; while (next != NULL && fabs(out) < CURVATURE_THRESHOLD) { out = SplineCurvature(next, 0); if (fabs(out) < CURVATURE_THRESHOLD) out = SplineCurvature(next, 1); if (fabs(out) < CURVATURE_THRESHOLD) next = next->to->next; if ((next != NULL && IsAnglePoint(contourends, bp, next->from)) || (next == sp->next)) break; } if (in==0 || out==0 || (prev != sp->prev && next != sp->next)) return 0; in/=fabs(in); out/=fabs(out); return (in*out < 0); } /****************************************************************************** * * I found it easier to write an iterator that calls given function for each * point worth instructing than repeating the same loops all the time. * * The control points are not skipped, but runmes often eliminate them as * instructing them seems to cause more damages than profits. They are included * here because edge optimizer cam be simpler and work more reliably then. * * The contour_direction option is for blues - snapping internal contour to a * blue zone is plain wrong, unless there is a stem hint tat don't fit to any * other blue zone. * ******************************************************************************/ #define EXTERNAL_CONTOURS 0 #define ALL_CONTOURS 1 #define INTERNAL_CONTOURS 2 static void RunOnPoints(InstrCt *ct, int contour_direction, void (*runme)(int p, SplinePoint *sp, InstrCt *ct)) { SplineSet *ss = ct->ss; SplinePoint *sp; uint8 *done; int c, p; done = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); for ( c=0; ss!=NULL; ss=ss->next, ++c ) { ct->cdir = ct->clockwise[c]; if (((contour_direction == EXTERNAL_CONTOURS) && !ct->cdir) || ((contour_direction == INTERNAL_CONTOURS) && ct->cdir)) continue; for ( sp=ss->first; ; ) { if (sp->ttfindex != 0xffff) { if (!sp->noprevcp && !done[p = PrevOnContour(ct->contourends, sp->ttfindex)]) { runme(p, sp, ct); done[p] = true; } if (!done[p = sp->ttfindex]) { runme(p, sp, ct); done[p] = true; } if (!sp->nonextcp && !done[p = sp->nextcpindex]) { runme(p, sp, ct); done[p] = true; } } else if (!sp->nonextcp) { if (!done[p = PrevOnContour(ct->contourends, sp->nextcpindex)]) { runme(p, sp, ct); done[p] = true; } if (!done[p = sp->nextcpindex]) { runme(p, sp, ct); done[p] = true; } } if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } } free(done); } /****************************************************************************** * * Hinting is mostly aligning 'edges' (in FreeType's sense). Each stem hint * consists of two edges (or one, for ghost hints). And each blue zone can be * represented as an edge with extended fudge (overshoot). * * Hinting a stem edge is broken in two steps. First: init_stem_edge() seeks for * points to snap and chooses one that will be used as a reference point - it * should be then instructed elsewhere (a general method of edge positioning). * Old init_edge() is still used instead for blue zones and strong points. * Finally, finish_edge() instructs the rest of points found with given command, * using instructpoints(). It normally optimizes an edge before instructing, * but not in presence of diagonal hints. * * The contour_direction option of init_edge() is for hinting blues - snapping * internal contour to a bluezone seems just plainly wrong. * ******************************************************************************/ /* The following operations have been separated from search_edge(), */ /* because sometimes it is important to be able to determine, if the */ /* given point is about to be gridfitted or interpolated */ static int value_point(InstrCt *ct, int p, SplinePoint *sp, real fudge) { int score = 0; int EM = ct->gic->sf->ascent + ct->gic->sf->descent; uint8 touchflag = ct->xdir?tf_x:tf_y; if (IsCornerExtremum(ct->xdir, ct->contourends, ct->bp, p) || IsExtremum(ct->xdir, p, sp)) score+=4; if (same_angle(ct->contourends, ct->bp, p, ct->xdir?0.5*M_PI:0.0)) score++; if (p == sp->ttfindex && IsAnglePoint(ct->contourends, ct->bp, sp)) score++; if (interpolate_more_strong && (fudge > (EM/EDGE_FUZZ+0.0001))) if (IsExtremum(!ct->xdir, p, sp)) score++; if (IsInflectionPoint(ct->contourends, ct->bp, sp)) score++; if (score && ct->gd->points[p].sp != NULL) /* oncurve */ score+=2; if (!score) return( 0 ); if (ct->diagstems != NULL && ct->diagpts[p].count) score+=9; if (ct->touched[p] & touchflag) score+=26; return( score ); } /* search for points to be snapped to an edge - to be used in RunOnPoints() */ static void search_edge(int p, SplinePoint *sp, InstrCt *ct) { int tmp, score; real fudge = ct->gic->fudge; uint8 touchflag = ct->xdir?tf_x:tf_y; real refcoord, coord = ct->xdir?ct->bp[p].x:ct->bp[p].y; if (fabs(coord - ct->edge.base) <= fudge) { score = value_point(ct, p, sp, ct->gic->fudge); if (!score) return; else if (ct->edge.refpt == -1) { ct->edge.refpt = p; ct->edge.refscore = score; return; } refcoord = ct->xdir?ct->bp[ct->edge.refpt].x:ct->bp[ct->edge.refpt].y; if ((score > ct->edge.refscore) || (score == ct->edge.refscore && fabs(coord - ct->edge.base) < fabs(refcoord - ct->edge.base))) { tmp = ct->edge.refpt; ct->edge.refpt = p; ct->edge.refscore = score; p = tmp; } if ((p!=-1) && !((ct->touched[p] | ct->affected[p]) & touchflag)) { ct->edge.othercnt++; if (ct->edge.othercnt==1) ct->edge.others=(int *)calloc(1, sizeof(int)); else ct->edge.others=(int *)realloc(ct->edge.others, ct->edge.othercnt*sizeof(int)); ct->edge.others[ct->edge.othercnt-1] = p; } } } static int StemPreferredForPoint(PointData *pd, StemData *stem,int is_next ) { StemData **stems; BasePoint bp; real off, bestoff; int i, is_l, best=0, *stemcnt; stems = ( is_next ) ? pd->nextstems : pd->prevstems; stemcnt = ( is_next) ? &pd->nextcnt : &pd->prevcnt; bestoff = 1e4; for ( i=0; i<*stemcnt; i++ ) { /* Ghost hints are always assigned to both sides of a point, no matter * what the next/previous spline direction is. So we need an additional * check for stem unit parallelity */ if (stems[i]->toobig > stem->toobig || stems[i]->unit.x != stem->unit.x || stems[i]->unit.y != stem->unit.y) continue; is_l = is_next ? pd->next_is_l[i] : pd->prev_is_l[i]; bp = is_l ? stems[i]->left : stems[i]->right; off = fabs(( pd->base.x - bp.x )*stem->l_to_r.x + ( pd->base.y - bp.y )*stem->l_to_r.y ); if (off < bestoff || (RealNear(off, bestoff) && stems[i] == stem)) { best = i; bestoff = off; } } if (best < *stemcnt && stem == stems[best]) return( best ); return( -1 ); } static int has_valid_dstem( PointData *pd,int next ) { int i, cnt; StemData *test; cnt = next ? pd->nextcnt : pd->prevcnt; for ( i=0; inextstems[i] : pd->prevstems[i]; if ( !test->toobig && test->lpcnt > 1 && test->rpcnt > 1 && fabs( test->unit.x ) > .05 && fabs( test->unit.y ) > .05 ) return( i ); } return( -1 ); } /* init_stem_edge(): Initialize the InstrCt for instructing given edge. * * Finds points that should be snapped to this hint's given edge. * It will return two types of points: a 'chosen one' ct->edge.refpt, that * should be used as a reference for this hint, and ct->edge.others that should * be positioned after ct.refpt with, for example, SHP. * * assign_points_to_edge() is a helper function, only to use from init_stem_edge(). */ static void assign_points_to_edge(InstrCt *ct, StemData *stem, int is_l, int *refidx) { int i, previdx, nextidx, test_l, dint_inner = false, flag; PointData *pd; flag = RealNear( stem->unit.y,1 ) ? tf_x : tf_y; for ( i=0; igd->realcnt; i++ ) { pd = &ct->gd->points[i]; previdx = StemPreferredForPoint( pd,stem,false ); nextidx = StemPreferredForPoint( pd,stem,true ); if (!pd->ticked && (previdx != -1 || nextidx != -1)) { pd->ticked = true; /* Don't attempt to position inner points at diagonal intersections: * our diagonal stem hinter will handle them better */ if ( ct->diagcnt > 0 && ( ( stem->unit.y == 1 && pd->x_corner == 2 ) || ( stem->unit.x == 1 && pd->y_corner == 2 ))) { dint_inner= has_valid_dstem( pd,true ) != -1 && has_valid_dstem( pd,false ) != -1; } test_l = (nextidx != -1) ? pd->next_is_l[nextidx] : pd->prev_is_l[previdx]; if (test_l == is_l && !dint_inner && !(ct->touched[pd->ttfindex] & flag) && !(ct->affected[pd->ttfindex] & flag)) { ct->edge.others = (int *)realloc( ct->edge.others, (ct->edge.othercnt+1)*sizeof(int)); ct->edge.others[ct->edge.othercnt++] = pd->ttfindex; if ( *refidx == -1 ) *refidx = pd->ttfindex; } } } } static void init_stem_edge(InstrCt *ct, StemData *stem, int is_l) { real left, right, base; struct dependent_stem *slave; PointData *rpd = NULL; int i, *refidx = NULL; left = ( stem->unit.x == 0 ) ? stem->left.x : stem->left.y; right = ( stem->unit.x == 0 ) ? stem->right.x : stem->right.y; base = ( is_l ) ? left : right; ct->edge.base = base; ct->edge.refpt = -1; ct->edge.refscore = 0; ct->edge.othercnt = 0; ct->edge.others = NULL; refidx = ( is_l ) ? &stem->leftidx : &stem->rightidx; if ( *refidx != -1 ) rpd = &ct->gd->points[*refidx]; /* Don't attempt to position inner points at diagonal intersections: * our diagonal stem hinter will handle them better */ if ( rpd != NULL && ct->diagcnt > 0 && ( ( stem->unit.y == 1 && rpd->x_corner == 2 ) || ( stem->unit.x == 1 && rpd->y_corner == 2 )) && has_valid_dstem( rpd,true ) != -1 && has_valid_dstem( rpd,false ) != -1 ) *refidx = -1; for ( i=0; igd->realcnt; i++ ) ct->gd->points[i].ticked = false; assign_points_to_edge(ct, stem, is_l, refidx); for ( i=0; idep_cnt; i++ ) { slave = &stem->dependent[i]; if (slave->dep_type == 'a' && ((is_l && slave->lbase) || (!is_l && !slave->lbase))) { if ( is_l ) slave->stem->leftidx = *refidx; else slave->stem->rightidx = *refidx; assign_points_to_edge(ct, slave->stem, is_l, refidx); } } ct->edge.refpt = *refidx; } /* Initialize the InstrCt for instructing given edge. */ static void init_edge(InstrCt *ct, real base, int contour_direction) { ct->edge.base = base; ct->edge.refpt = -1; ct->edge.refscore = 0; ct->edge.othercnt = 0; ct->edge.others = NULL; RunOnPoints(ct, contour_direction, &search_edge); } /* Apparatus for edge hinting optimization. For given 'others' in ct, * it detects 'segments' (in FreeType's sense) and leaves only one point per * segment. A segment to which refpt belong is completely removed (refpt is * enough). * * optimize_edge() is the right high-level function to call with instructing * context (an edge must be previously initialized with init_edge). It calls * optimize_segment() internally - a function that is otherwise unsafe. * * optimize_blue() is even higher-level function to call before optimize_edge * if init_edge() was used to collect points in a blue zone (or other narrow * zone). * * Optimizers keep points used by diagonal hinter. * * optimize_strongpts() is used instead of two routines above when hinting * inter-stem zones (see interpolate_strong option). It's invoked after * instructing diagonal stems. */ /* To be used with qsort() - sorts integer array in ascending order. */ static int sortbynum(const void *a, const void *b) { return *(int *)a > *(int *)b; } /* Find element's index within an array - return -1 if element not found. */ static int findoffs(const int *elems, int elemcnt, int val) { int i; for (i=0; iedge.others; int touchflag = (ct->xdir)?tf_x:tf_y; int ondiags = 0; if (segstart==segend) return; /* purely for aesthetic reasons - can be safely removed. */ qsort(others+segstart, segend+1-segstart, sizeof(int), sortbynum); /* are there any to be used with dstems? */ if (ct->diagstems) for (i=segstart; !ondiags && i<=segend; i++) ondiags = ct->diagpts[others[i]].count; if (ondiags) { for (i=segstart; i<=segend; i++) ct->affected[others[i]] |= ct->diagpts[others[i]].count?0:touchflag; } else { for (i=segstart; i<=segend && ct->gd->points[others[i]].sp == NULL; i++); if (i<=segend) local_refpt = others[i]; if (findoffs(others+segstart, segend+1-segstart, ct->edge.refpt) != -1) local_refpt = ct->edge.refpt; if (local_refpt==-1) local_refpt = others[segstart]; for (i=segstart; i<=segend; i++) ct->affected[others[i]] |= local_refpt==others[i]?0:touchflag; } } /* Subdivide an edge into segments and optimize segments separately. * A segment consists oh a point, his neighbours, their neighbours... */ static void optimize_edge(InstrCt *ct) { int i, p, segstart, next; int refpt = ct->edge.refpt; int *others = ct->edge.others; int othercnt = ct->edge.othercnt; int touchflag = (ct->xdir)?tf_x:tf_y; if (othercnt == 0) return; /* add edge.refpt to edge.others */ ct->edge.othercnt = ++othercnt; ct->edge.others = others = (int *)realloc(others, othercnt*sizeof(int)); others[othercnt-1]=refpt; next = 0; while (next < othercnt) { p = others[segstart = next++]; while((next < othercnt) && (i = findoffs(others+next, othercnt-next, NextOnContour(ct->contourends, p))) != -1) { p = others[i+=next]; others[i] = others[next]; others[next++] = p; } p=others[segstart]; while((next < othercnt) && (i = findoffs(others+next, othercnt-next, PrevOnContour(ct->contourends, p))) != -1) { p = others[i+=next]; others[i] = others[next]; others[next++] = p; } optimize_segment(segstart, next-1, ct); } for (i=next=0; iaffected[others[i]] & touchflag) && (others[i] != refpt)) others[next++] = others[i]; if ((ct->edge.othercnt = next) == 0) { free(others); ct->edge.others = NULL; } else /* purely for aesthetic reasons - could be safely removed. */ qsort(others, ct->edge.othercnt, sizeof(int), sortbynum); } /* For any given point on edge, if there exists a path to other point snapped * or to-be-snapped in that zone, such that any points on this path are within * that zone, then this given point may be optimized out. */ static void optimize_blue(InstrCt *ct) { int i, j, curr; int *others = ct->edge.others; int othercnt = ct->edge.othercnt; int touchflag = (ct->xdir)?tf_x:tf_y; int *contourends = ct->contourends; uint8 *touched = ct->touched; uint8 *affected = ct->affected; uint8 *tosnap; if (othercnt == 0) return; tosnap = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); for(i=0; iedge.othercnt; i++) { if (ct->diagpts && ct->diagpts[others[i]].count) continue; /* check path forward */ curr=NextOnContour(contourends, others[i]); while(curr!=others[i]) { double coord = (ct->xdir) ? ct->bp[curr].x : ct->bp[curr].y; if (fabs(ct->edge.base - coord) > ct->gic->fudge) break; if ((touched[curr] | affected[curr]) & touchflag || tosnap[curr]) { affected[others[i]] |= touchflag; break; } curr=NextOnContour(contourends, curr); } if (affected[others[i]] & touchflag) continue; /* check path backward */ curr=PrevOnContour(contourends, others[i]); while(curr!=others[i]) { double coord = (ct->xdir) ? ct->bp[curr].x : ct->bp[curr].y; if (fabs(ct->edge.base - coord) > ct->gic->fudge) break; if ((touched[curr] | affected[curr]) & touchflag || tosnap[curr]) { affected[others[i]] |= touchflag; break; } curr=PrevOnContour(contourends, curr); } if (!(affected[others[i]] & touchflag)) tosnap[others[i]] = 1; } free(tosnap); /* remove optimized-out points from list to be instructed. */ for(i=0; iedge.othercnt; i++) if (affected[others[i]]) { ct->edge.othercnt--; for(j=i; jedge.othercnt; j++) others[j] = others[j+1]; i--; } } /* For any strong point, check whether it's position can rely on other * points (if so, we don't have to instruct it explicitly). * This optimization is two-pass. 'Obvious' Off-curve points are sweeped * first. Some remaining unneeded points (off- and on-curve) may then be * optimized out in second pass. * * TODO! This optimizer could be even more aggressive - it currently * skips some features too small or unexposed to benefit from hinting. */ static void optimize_strongpts_step1(InstrCt *ct); static void optimize_strongpts_step2(InstrCt *ct); static void optimize_strongpts(InstrCt *ct) { optimize_strongpts_step1(ct); optimize_strongpts_step2(ct); } static void optimize_strongpts_step1(InstrCt *ct) { int i, j; int *others = ct->edge.others; int othercnt = ct->edge.othercnt; int *contourends = ct->contourends; uint8 *tocull, *tocheck; if (othercnt == 0) return; tocull = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); tocheck = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); for(i=0; iedge.othercnt; i++) tocheck[ct->edge.others[i]] = 1; /* for each point of "edge" (would be better called "zone") */ for(i=0; iedge.othercnt; i++) { int pt = others[i]; double pt_x = ct->bp[pt].x; double pt_y = ct->bp[pt].y; int pt_next = NextOnContour(contourends, pt); double pt_next_x = ct->bp[pt_next].x; double pt_next_y = ct->bp[pt_next].y; int pt_prev = PrevOnContour(contourends, pt); double pt_prev_x = ct->bp[pt_prev].x; double pt_prev_y = ct->bp[pt_prev].y; /* We sweep only off-curve points here */ if (ct->gd->points[pt].sp != NULL) continue; if (IsCornerExtremum(ct->xdir, ct->contourends, ct->bp, pt)) continue; /* Some off-curve points may 'belong' to extrema from other zone. */ if (/*tocheck[pt_next] &&*/ (ct->gd->points[pt_next].sp != NULL) && (pt_x == pt_next_x || pt_y == pt_next_y)) tocull[pt] = 1; if (/*tocheck[pt_prev] &&*/ (ct->gd->points[pt_prev].sp != NULL) && (pt_x == pt_prev_x || pt_y == pt_prev_y)) tocull[pt] = 1; } /* remove optimized-out points from list to be instructed. */ for(i=0; iedge.othercnt; i++) if (tocull[others[i]]) { ct->edge.othercnt--; for(j=i; jedge.othercnt; j++) others[j] = others[j+1]; i--; } free(tocull); free(tocheck); } static void optimize_strongpts_step2(InstrCt *ct) { int pass, i, j, forward; int next_closed, prev_closed; int next_pt_max, next_pt_min, prev_pt_max, prev_pt_min; int next_coord_max, next_coord_min, prev_coord_max, prev_coord_min; int *others = ct->edge.others; int othercnt = ct->edge.othercnt; int touchflag = (ct->xdir)?tf_x:tf_y; int *contourends = ct->contourends; uint8 *touched = ct->touched; uint8 *affected = ct->affected; uint8 *toinstr, *tocull, *tocheck; if (othercnt == 0) return; toinstr = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); tocull = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); tocheck = (uint8 *)calloc(ct->ptcnt, sizeof(uint8)); for(i=0; iedge.othercnt; i++) tocheck[ct->edge.others[i]] = 1; /* two passes... */ for(pass=0; pass<2; pass++) { /* ...for each point of "edge" (would be better called "zone" here) */ for(i=0; iedge.othercnt; i++) { int pt = others[i]; double pt_coord = (ct->xdir) ? ct->bp[pt].x : ct->bp[pt].y; /* In first pass, we sweep only off-curve points */ if ((pass==0) && (ct->gd->points[pt].sp != NULL)) continue; if (tocull[pt] || toinstr[pt]) continue; /* check path backward and forward */ for (forward=0; forward<2; forward++) { int closed = 0; int pt_max = pt, pt_min = pt; double coord_max = pt_coord, coord_min = pt_coord; int curr = forward ? NextOnContour(contourends, pt): PrevOnContour(contourends, pt); while(curr!=pt) { double coord = (ct->xdir) ? ct->bp[curr].x : ct->bp[curr].y; if (fabs(ct->edge.base - coord) > ct->gic->fudge) break; if ((touched[curr] | affected[curr]) & touchflag || tocheck[curr]) { if (coord > coord_max) { coord_max = coord; pt_max = curr; } else if ((coord == coord_max) && (curr < pt_max)) pt_max = curr; if (coord < coord_min) { coord_min = coord; pt_min = curr; } else if ((coord == coord_min) && (curr < pt_min)) pt_min = curr; closed = 1; } if ((touched[curr] | affected[curr]) & touchflag || toinstr[curr]) break; curr = forward ? NextOnContour(contourends, curr): PrevOnContour(contourends, curr); } if (forward) { next_closed = closed; next_pt_max = pt_max; next_pt_min = pt_min; next_coord_max = coord_max; next_coord_min = coord_min; } else { prev_closed = closed; prev_pt_max = pt_max; prev_pt_min = pt_min; prev_coord_max = coord_max; prev_coord_min = coord_min; } } if (prev_closed && next_closed && ( (prev_coord_max >= pt_coord && pt != prev_pt_max && next_coord_min <= pt_coord && pt != next_pt_min) || (prev_coord_min <= pt_coord && pt != prev_pt_min && next_coord_max >= pt_coord && pt != next_pt_max))) tocull[pt] = 1; else toinstr[pt] = 1; } } /* remove optimized-out points from list to be instructed. */ for(i=0; iedge.othercnt; i++) if (tocull[others[i]]) { ct->edge.othercnt--; for(j=i; jedge.othercnt; j++) others[j] = others[j+1]; i--; } free(tocheck); free(toinstr); free(tocull); } /* Finish instructing the edge. Try to hint only those points on edge that are * necessary - IUP should do the rest. */ static void finish_edge(InstrCt *ct, uint8 command) { int i; optimize_edge(ct); if (ct->edge.othercnt==0) return; ct->pt=instructpoints(ct->pt, ct->edge.othercnt, ct->edge.others, command); for(i=0; iedge.othercnt; i++) ct->touched[ct->edge.others[i]] |= (ct->xdir?tf_x:tf_y); free(ct->edge.others); ct->edge.others=NULL; ct->edge.othercnt = 0; } /****************************************************************************** * * Routines for hinting single stems. * ******************************************************************************/ /* Each stem hint has 'ldone' and 'rdone' flag, indicating whether 'left' * or 'right' edge is hinted or not. This functions marks as done all edges at * specified coordinate, starting from given hint (hints sometimes share edges). */ static void mark_startenddones(StemData *stem, int is_l ) { struct dependent_stem *slave; int i; uint8 *done; done = is_l ? &stem->ldone : &stem->rdone; *done = true; for (i=0; idep_cnt; i++) { slave = &stem->dependent[i]; if ( slave->dep_type == 'a' && slave->lbase == is_l ) { done = is_l ? &slave->stem->ldone : &slave->stem->rdone; *done = true; } } } static void build_cvt_stem(InstrCt *ct, real width, StdStem *cvt_stem) { int i, width_parent, width_me; int EM = ct->gic->sf->ascent + ct->gic->sf->descent; cvt_stem->width = (int)rint(fabs(width)); cvt_stem->stopat = 32767; cvt_stem->snapto = CVTSeekStem(ct->xdir, ct->gic, width, false); for (i=7; i<32768; i++) { width_parent = compute_stem_width(ct->xdir, cvt_stem->snapto, EM, i); width_me = compute_stem_width(ct->xdir, cvt_stem, EM, i); if (width_parent != width_me) { cvt_stem->stopat = i; break; } } } /* This function has been separated from finish_stem(), because sometimes * it is necessary to maintain the distance between two points (usually on * opposite stem edges) without instructing the whole stem. Currently we use this * to achieve proper positioning of the left edge of a vertical stem in antialiased * mode, if instructing this stem has to be started from the right edge */ static void maintain_black_dist(InstrCt *ct, real width, int refpt, int chg_rp0) { int callargs[5]; StdStem *StdW = ct->xdir?&(ct->gic->stdvw):&(ct->gic->stdhw); StdStem *ClosestStem; StdStem cvt_stem; ClosestStem = CVTSeekStem(ct->xdir, ct->gic, width, true); if (ClosestStem != NULL) { ct->pt = push2nums(ct->pt, refpt, ClosestStem->cvtindex); if (ct->gic->cvt_done && ct->gic->fpgm_done && ct->gic->prep_done) *(ct->pt)++ = chg_rp0?MIRP_rp0_min_black:MIRP_min_black; else *(ct->pt)++ = chg_rp0?MIRP_min_rnd_black:MIRP_rp0_min_rnd_black; } else { if (ct->gic->cvt_done && ct->gic->fpgm_done && ct->gic->prep_done && StdW->width!=-1) { build_cvt_stem(ct, width, &cvt_stem); callargs[0] = ct->edge.refpt; callargs[1] = cvt_stem.snapto->cvtindex; callargs[2] = chg_rp0?1:0; callargs[3] = cvt_stem.stopat; callargs[4] = 4; ct->pt = pushnums(ct->pt, 5, callargs); *(ct->pt)++ = CALL; } else { ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = chg_rp0?MDRP_rp0_min_rnd_black:MDRP_min_rnd_black; } } } /* Given the refpt for one of this hint's edges is already positioned, this * function aligns 'others' (SHP with given shp_rp) for this edge and positions * the second edge, optionally setting its refpt as rp0. It frees edge.others * and sets edge.othercnt to zero, but it leaves edge.refpt set to last * instructed edge. */ #define use_rp1 (true) #define use_rp2 (false) #define set_new_rp0 (true) #define keep_old_rp0 (false) static void finish_stem(StemData *stem, int shp_rp1, int chg_rp0, InstrCt *ct) { int is_l, basedone, oppdone, reverse; real hleft, hright, width; if (stem == NULL) return; hleft = ((real *) &stem->left.x)[!ct->xdir]; hright= ((real *) &stem->right.x)[!ct->xdir]; is_l = (fabs(hleft - ct->edge.base) < fabs(hright - ct->edge.base)); basedone = ( is_l && stem->ldone ) || ( !is_l && stem->rdone ); oppdone = ( is_l && stem->rdone ) || ( !is_l && stem->ldone ); reverse = ( ct->xdir && !is_l && !stem->ldone && !stem->ghost ); width = stem->width; if ( !reverse && !basedone ) { ct->touched[ct->edge.refpt] |= ct->xdir?tf_x:tf_y; finish_edge(ct, shp_rp1?SHP_rp1:SHP_rp2); mark_startenddones(stem, is_l ); } if (oppdone || (stem->ghost && ((stem->width==20) || (stem->width==21)))) { stem->ldone = stem->rdone = 1; return; } init_stem_edge(ct, stem, !is_l); if (ct->edge.refpt == -1) { /* We have skipped the right edge to start instructing this stem from * left. But its left edge appears to have no points to be instructed. * So return to the right edge and instruct it before exiting */ if ( reverse && !basedone ) { init_stem_edge(ct, stem, is_l); ct->touched[ct->edge.refpt] |= ct->xdir?tf_x:tf_y; finish_edge(ct, shp_rp1?SHP_rp1:SHP_rp2); mark_startenddones(stem, is_l ); } return; } maintain_black_dist(ct, width, ct->edge.refpt, chg_rp0); if ( reverse ) { is_l = !is_l; ct->rp0 = ct->edge.refpt; ct->pt = pushpoint(ct->pt, ct->rp0); *(ct->pt)++ = MDAP_rnd; ct->touched[ct->edge.refpt] |= ct->xdir?tf_x:tf_y; finish_edge(ct, SHP_rp1); mark_startenddones( stem, is_l ); if ( !stem->rdone ) { init_stem_edge(ct, stem, false); if (ct->edge.refpt == -1) return; maintain_black_dist(ct, width, ct->edge.refpt, chg_rp0); } } if (chg_rp0) ct->rp0 = ct->edge.refpt; ct->touched[ct->edge.refpt] |= ct->xdir?tf_x:tf_y; finish_edge(ct, SHP_rp2); mark_startenddones( stem, !is_l ); } static void mark_points_affected(InstrCt *ct,StemData *target,PointData *opd,int next) { Spline *s; PointData *pd, *cpd; int cpidx; s = next ? opd->sp->next : opd->sp->prev; pd = next ? &ct->gd->points[s->to->ptindex] : &ct->gd->points[s->from->ptindex]; while (IsStemAssignedToPoint(pd, target, !next) == -1) { if (pd->ttfindex < ct->gd->realcnt && value_point(ct, pd->ttfindex, pd->sp, ct->gd->emsize)) ct->affected[pd->ttfindex] |= ct->xdir?tf_x:tf_y; if (!pd->sp->noprevcp) { cpidx = pd->sp->prev->from->nextcpindex; cpd = &ct->gd->points[cpidx]; if (value_point(ct, cpd->ttfindex, pd->sp, ct->gd->emsize)) ct->affected[cpd->ttfindex] |= ct->xdir?tf_x:tf_y; } if (!pd->sp->nonextcp) { cpidx = pd->sp->nextcpindex; cpd = &ct->gd->points[cpidx]; if (value_point(ct, cpd->ttfindex, pd->sp, ct->gd->emsize)) ct->affected[cpd->ttfindex] |= ct->xdir?tf_x:tf_y; } s = next ? pd->sp->next : pd->sp->prev; pd = next ? &ct->gd->points[s->to->ptindex] : &ct->gd->points[s->from->ptindex]; if ( pd == opd ) { IError( "The ball terminal with a key point at %.3f,%.3f\n" "appears to be incorrectly linked to the %s stem\n" "<%.3f, %.3f>", pd->base.x,pd->base.y, ct->xdir?"vertical":"horizontal", ct->xdir?target->left.x:target->right.y,target->width ); break; } } } static void finish_serif(StemData *slave, StemData *master, int lbase, int is_ball, InstrCt *ct) { int inner_pt, callargs[4]; struct stem_chunk *chunk; PointData *opd; int i; if (slave == NULL || master == NULL) return; inner_pt = ( lbase ) ? master->rightidx : master->leftidx; init_stem_edge(ct, slave, !lbase); if (ct->edge.refpt == -1) return; if (ct->gic->fpgm_done) { callargs[0] = is_ball ? 0 : 64; callargs[1] = inner_pt; callargs[2] = ct->edge.refpt; callargs[3] = 9; ct->pt = pushnums(ct->pt, 4, callargs); *(ct->pt)++ = CALL; } else { *(ct->pt)++ = 0x7D; /* RDTG */ ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = MDRP_min_rnd_black; *(ct->pt)++ = 0x18; /* RTG */ } ct->touched[ct->edge.refpt] |= ct->xdir?tf_x:tf_y; finish_edge(ct, SHP_rp2); mark_startenddones( slave, !lbase ); if ( !interpolate_strong || !instruct_ball_terminals ) return; /* Preserve points on ball terminals from being interpolated * between edges by marking them as affected */ for ( i=0; ichunk_cnt; i++ ) { chunk = &slave->chunks[i]; opd = lbase ? chunk->r : chunk->l; if (chunk->is_ball && opd != NULL) { mark_points_affected(ct, chunk->ball_m, opd, true); mark_points_affected(ct, chunk->ball_m, opd, false); } } } static void link_serifs_to_edge(InstrCt *ct, StemData *stem, int is_l) { int i, callargs[3]; struct dependent_serif *serif; /* We use an FPGM function to set rp0, and thus the exact value * is not known at the compilation time. So it is safer to reset * ct->rp0 to -1 */ if ( ct->gic->fpgm_done ) { ct->rp0 = -1; callargs[0] = is_l ? stem->rightidx : stem->leftidx; callargs[1] = is_l ? stem->leftidx : stem->rightidx; callargs[2] = 10; ct->pt = pushnums(ct->pt, 3, callargs); *(ct->pt)++ = CALL; } else { init_stem_edge(ct, stem, !is_l); if ( ct->rp0 != ct->edge.refpt ) { ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = SRP0; ct->rp0 = ct->edge.refpt; } } for (i=0; iserif_cnt; i++) { serif = &stem->serifs[i]; if (serif->lbase == is_l && ((serif->is_ball && instruct_ball_terminals) || (!serif->is_ball && instruct_serif_stems))) finish_serif( serif->stem,stem,is_l,serif->is_ball,ct ); } } static void instruct_serifs(InstrCt *ct, StemData *stem) { int i, lcnt, rcnt; struct dependent_serif *serif; if ( stem->leftidx == -1 || stem->rightidx == -1 ) return; lcnt = rcnt = 0; for (i=0; iserif_cnt; i++) { serif = &stem->serifs[i]; if ((serif->is_ball && !instruct_ball_terminals) || (!serif->is_ball && !instruct_serif_stems)) continue; if ( serif->lbase ) lcnt++; else if ( !serif->lbase ) rcnt++; } if (stem->ldone && lcnt > 0) link_serifs_to_edge(ct, stem, true); if (stem->rdone && rcnt > 0) link_serifs_to_edge(ct, stem, false); } static void instruct_dependent(InstrCt *ct, StemData *stem) { int i, j, rp, rp1, rp2, stopat, callargs[4]; struct dependent_stem *slave; int w_master, w_slave; StdStem *std_master, *std_slave, norm_master, norm_slave; StdStem *StdW = ct->xdir?&(ct->gic->stdvw):&(ct->gic->stdhw); for (i=0; idep_cnt; i++) { slave = &stem->dependent[i]; if (slave->stem->master == NULL) continue; init_stem_edge(ct, slave->stem, slave->lbase); if (ct->edge.refpt == -1) continue; if (slave->dep_type == 'i' && stem->ldone && stem->rdone) { rp1 = ct->xdir ? stem->leftidx : stem->rightidx; rp2 = ct->xdir ? stem->rightidx : stem->leftidx; callargs[0] = ct->edge.refpt; callargs[1] = rp2; callargs[2] = rp1; if (ct->gic->fpgm_done) { callargs[3] = 8; ct->pt = pushpoints(ct->pt, 4, callargs); *(ct->pt)++ = CALL; } else { ct->pt = pushpoints(ct->pt, 3, callargs); *(ct->pt)++ = SRP1; *(ct->pt)++ = SRP2; *(ct->pt)++ = DUP; *(ct->pt)++ = IP; *(ct->pt)++ = MDAP_rnd; } } else if (slave->dep_type == 'm' && ((slave->lbase && stem->ldone) || (!slave->lbase && stem->rdone))) { rp = slave->lbase ? stem->leftidx : stem->rightidx; if ( rp != ct->rp0 ) { ct->pt = pushpoint(ct->pt, rp); *(ct->pt)++ = SRP0; ct->rp0 = rp; } /* It is possible that at certain PPEMs both the master and slave stems are * regularized, say, to 1 pixel, but the difference between their positions * is rounded to 1 pixel too. Thus one stem is shifted relatively to another, * so that the overlap disappears. This looks especially odd for nesting/nested * stems. We use a special FPGM function to prevent this. */ if ( ct->gic->cvt_done && ct->gic->fpgm_done && ct->gic->prep_done && StdW->width!=-1 && ( ((&stem->left.x)[!ct->xdir] <= (&slave->stem->left.x)[!ct->xdir] && ( &stem->right.x)[!ct->xdir] >= (&slave->stem->right.x)[!ct->xdir] ) || ((&stem->left.x)[!ct->xdir] >= (&slave->stem->left.x)[!ct->xdir] && ( &stem->right.x)[!ct->xdir] <= (&slave->stem->right.x)[!ct->xdir] ))) { std_master = CVTSeekStem(ct->xdir, ct->gic, stem->width, true); std_slave = CVTSeekStem(ct->xdir, ct->gic, slave->stem->width, true); if ( std_master == NULL ) { build_cvt_stem(ct, stem->width, &norm_master); std_master = &norm_master; } if ( std_slave == NULL ) { build_cvt_stem(ct, slave->stem->width, &norm_slave); std_slave = &norm_slave; } stopat = 32768; for (j=7; j<=stopat; j++) { w_master = compute_stem_width(ct->xdir, std_master, ct->gd->emsize, j); w_slave = compute_stem_width(ct->xdir, std_slave , ct->gd->emsize, j); if (w_master != w_slave) stopat = j; } callargs[0] = stopat; callargs[1] = ct->rp0; callargs[2] = ct->edge.refpt; callargs[3] = 14; ct->pt = pushpoints(ct->pt, 4, callargs); *(ct->pt)++ = CALL; } else { ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = DUP; *(ct->pt)++ = MDRP_rp0_rnd_white; *(ct->pt)++ = SRP1; } } else if (slave->dep_type == 'a' && ((slave->lbase && stem->ldone) || (!slave->lbase && stem->rdone))) { if ( ct->edge.refpt != ct->rp0 ) { ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = SRP0; } } else continue; ct->rp0 = ct->edge.refpt; finish_stem(slave->stem, use_rp1, keep_old_rp0, ct); if ( instruct_serif_stems || instruct_ball_terminals ) instruct_serifs(ct, slave->stem); instruct_dependent(ct, slave->stem); } } /****************************************************************************** * * I decided to do snapping to blues at the very beginning of the instructing. * * Blues are processed in certain (important) order: baseline, descenders * (from deeper to shorter), ascenders (from taller to shorter). * * For each blue, one of the edges is put into CVT: lower if is't > zero, * the upper otherwise. A twilight point 0 is established at this height. All * the glyph's points decided to be worth snapping are then moved relative to * this twilight point, being subject to rounding 'down-to-int'. Space taken * is at most 8*ptcnt. * * For each blue, all yet unprocessed HStems affected are instructed. Ghost * hints are reckognised. If there is at least one stem hint in given blue zone, * autoinstructor will seek for other interesting features, so there is no need * to hint them explicitly. * * TODO! We currently instruct hints dependent on those controlled by blues. * This may be not always corrrect (e.g. if a dependent hint is itself * controlled by blue zone - possibly even different). Research needed. * * Important notes: * * The zone count must be set to 2, the twilight point count must be nonzero. * This is done automagically in init_maxp(), otherwise this method wouldn't * work at all. Currently there is only one twilight point used, but there * may be needed one or even two points per blue zone if some advanced snapping * and counter managing is to be done. * * Snapping relies on function 0 in FPGM, see init_fpgm(). * * Using MIAP (single cvt, relying on cut-in) instead of twilight points * causes overshoots to appear/disappear inconsistently at small pixel sizes. * This flickering is disastrous to soft, wavy horizontal lines. We could use * any glyph's point at needed height, but we're not certain we'll find any. * * The inner (leftwards) contours aren't snapped to the blue zone. * This could have created weird artifacts. Of course this will fail for * glyphs with wrong direction, but I won't handle it for now. * * TODO! Remind the user to correct direction or do it for him. * TODO! Try to instruct 'free points' with single push and LOOPCALL. * * If we didn't snapped any point to a blue zone, we shouldn't mark any HStem * edges done. This could made some important points on inner contours missed. * ******************************************************************************/ /* Each blue zone has two TTF point indices associated with it: 'highest' and * 'lowest'. These have to be points with highest and lowest Y coordinates that * are snapped to that blue zone (directly or by horizontal stem). Currently * we register only edge.refpt. These points are later to be used for horizontal * stems' positioning. */ static void update_blue_pts(int blueindex, InstrCt *ct) { BasePoint *bp = ct->bp; BlueZone *blues = ct->gic->blues; if (ct->edge.refpt == -1) return; if (blues[blueindex].highest == -1 || bp[ct->edge.refpt].y > bp[blues[blueindex].highest].y) blues[blueindex].highest = ct->edge.refpt; if (blues[blueindex].lowest == -1 || bp[ct->edge.refpt].y < bp[blues[blueindex].lowest].y) blues[blueindex].lowest = ct->edge.refpt; } /* It is theoretically possible that 'highest' and 'lowest' points of neighbour * blue zones overlap, and thus may spoil horizontal stems' positioning. * Here we fix this up. */ static void fixup_blue_pts(BlueZone *b1, BlueZone *b2) { if (b1->lowest > b2->lowest) b1->lowest = b2->lowest; if (b1->highest < b2->highest) b1->highest = b2->highest; } static void check_blue_pts(InstrCt *ct) { BasePoint *bp = ct->bp; BlueZone *blues = ct->gic->blues; int i, j, bluecnt = ct->gic->bluecnt; for (i=0; igic->sf); StemData *slave; /* Which edge to start at? */ /* Starting at the other would usually be wrong. */ if (blue->overshoot < blue->base && ( !stem->ghost || stem->width == 21 )) { is_l = false; base = stem->right.y; advance = stem->left.y; } else { is_l = true; base = stem->left.y; advance = stem->right.y; } /* This is intended as a fallback if the base edge wasn't within * this bluezone, and advance edge was. */ if (!stem->ghost && !SegmentsOverlap(base+fuzz, base-fuzz, blue->base, blue->overshoot) && SegmentsOverlap(advance+fuzz, advance-fuzz, blue->base, blue->overshoot)) { tmp = base; base = advance; advance = tmp; is_l = !is_l; } /* instruct the stem */ init_stem_edge(ct, stem, is_l); if (ct->edge.refpt == -1) { for ( i=0; idep_cnt; i++ ) { slave = stem->dependent[i].stem; /* A hack which allows single-edge hints to tie features * to remote blue zones. */ if ( stem->ghost ) slave->blue = idx; if ( slave->blue == idx ) ret += snap_stem_to_blue(ct, slave, blue, idx); } return( ret ); } update_blue_pts(idx, ct); callargs[0] = ct->rp0 = ct->edge.refpt; callargs[1] = blue->cvtindex; if (ct->gic->fpgm_done) { ct->pt = pushpoints(ct->pt, 3, callargs); *(ct->pt)++ = CALL; } else { ct->pt = pushpoints(ct->pt, 2, callargs); *(ct->pt)++ = MIAP_rnd; } finish_stem(stem, use_rp1, keep_old_rp0, ct); for ( i=0; idep_cnt; i++ ) { slave = stem->dependent[i].stem; if ( slave->blue == idx ) { ret += snap_stem_to_blue(ct, slave, blue, idx); slave->master = NULL; } } if( instruct_serif_stems || instruct_ball_terminals ) instruct_serifs(ct, stem); instruct_dependent(ct, stem); update_blue_pts(idx, ct); /* this uses only refpt: who cares? */ return( ret + 1 ); } /* Snap stems and perhaps also some other points to given bluezone and set up * its 'highest' and 'lowest' point indices. */ static void snap_to_blues(InstrCt *ct) { int i, j; int therewerestems; /* were there any HStems snapped to this blue? */ StemData *stem; /* for HStems affected by blues */ real base; /* for the hint */ int callargs[3] = { 0/*pt*/, 0/*cvt*/, 0 }; real fudge; int bluecnt=ct->gic->bluecnt; int queue[12]; /* Blue zones' indices in processing order */ BlueZone *blues = ct->gic->blues; real fuzz = GetBlueFuzz(ct->gic->sf); if (bluecnt == 0) return; /* Fill the processing queue - baseline goes first, then bottom zones */ /* sorted by base in ascending order, then top zones sorted in descending */ /* order. I assume the blues are sorted in ascending order first. */ for (i=0; (i < bluecnt) && (blues[i].base < 0); i++); queue[0] = i; for (i=0; igd->hbundle->cnt; j++ ) { stem = ct->gd->hbundle->stemlist[j]; if (stem->master != NULL || stem->blue != queue[i] || stem->ldone || stem->rdone) continue; therewerestems += snap_stem_to_blue(ct, stem, &blues[queue[i]], queue[i]); } /* Now I'll try to find points not snapped by any previous stem hint. */ if (therewerestems) { base = (blues[queue[i]].base + blues[queue[i]].overshoot) / 2.0; fudge = ct->gic->fudge; ct->gic->fudge = fabs(base - blues[queue[i]].base) + fuzz; init_edge(ct, base, EXTERNAL_CONTOURS); optimize_blue(ct); optimize_edge(ct); if (ct->edge.refpt == -1) { ct->gic->fudge = fudge; continue; } if (!(ct->touched[ct->edge.refpt]&tf_y || ct->affected[ct->edge.refpt]&tf_y)) { callargs[0] = ct->rp0 = ct->edge.refpt; if (ct->gic->fpgm_done) { ct->pt = pushpoints(ct->pt, 3, callargs); *(ct->pt)++ = CALL; } else { ct->pt = pushpoints(ct->pt, 2, callargs); *(ct->pt)++ = MIAP_rnd; } ct->touched[ct->edge.refpt] |= tf_y; } for (j=0; jedge.othercnt; j++) { callargs[0] = ct->rp0 = ct->edge.others[j]; if (ct->gic->fpgm_done) { ct->pt = pushpoints(ct->pt, 3, callargs); *(ct->pt)++ = CALL; } else { ct->pt = pushpoints(ct->pt, 2, callargs); *(ct->pt)++ = MIAP_rnd; } ct->touched[ct->edge.others[j]] |= tf_y; } update_blue_pts(queue[i], ct); if (ct->edge.others != NULL) { free(ct->edge.others); ct->edge.others = NULL; ct->edge.othercnt = 0; } ct->gic->fudge = fudge; } } check_blue_pts(ct); } static int get_counters_cut_in(InstrCt *ct, int m1, int m2, int c1, int c2) { real s1, e1, s2, e2, width1, width2; int i, swidth1, swidth2; int EM = ct->gic->sf->ascent + ct->gic->sf->descent; s1 = (&ct->gd->points[m1].base.x)[!ct->xdir]; e1 = (&ct->gd->points[m2].base.x)[!ct->xdir]; s2 = (&ct->gd->points[c1].base.x)[!ct->xdir]; e2 = (&ct->gd->points[c2].base.x)[!ct->xdir]; width1 = e1 - s1; width2 = e2 - s2; if ( RealNear( width1, width2 )) return( 0 ); for (i=7; i<32768; i++) { swidth1 = (int)rint((rint(fabs(width1)) * i * 64.0)/EM); swidth2 = (int)rint((rint(fabs(width2)) * i * 64.0)/EM); if ( fabs(swidth1 - swidth2) >= SNAP_THRESHOLD ) break; } return( i ); } /****************************************************************************** * * High-level functions for instructing horizontal and vertical stems. * Both use 'geninstrs' for positioning single, elementary stems. * ******************************************************************************/ /* geninstrs's main burden is to choose the better of two reference points * found by init_stem_edge() - one for each edge - and position it relatively * to other stems (if not already done). * * If none of the edges is positioned: * If this hint is the first, previously overlapped, or simply horizontal, * position the reference point at the base where it is using MDAP; otherwise * position the hint's base rp0 relatively to the previous hint's end using * MDRP with white minimum distance (fpgm function 1). * * Calling finish_stem() will deal with the rest of points needing explicit * positioning. Then we instruct serifs and dependent stems, if wanted. */ static void geninstrs(InstrCt *ct, StemData *stem, StemData *prev, int lbase) { int shp_rp1, chg_rp0, c_m_pt1 = -1, c_m_pt2 = -1; int callargs[6]; real prev_pos = 0, cur_pos; if (stem->ldone && stem->rdone) return; if ((lbase && stem->rdone) || (!lbase && stem->ldone)) lbase = !lbase; init_stem_edge(ct, stem, lbase); if (ct->edge.refpt == -1) { lbase = !lbase; init_stem_edge(ct, stem, lbase); } if (ct->edge.refpt == -1) return; if (ct->rp0 < ct->gd->realcnt && ct->rp0 >= 0) prev_pos = (&ct->gd->points[ct->rp0].base.x)[!ct->xdir]; cur_pos = (&ct->gd->points[ct->edge.refpt].base.x)[!ct->xdir]; if (prev != NULL && stem->prev_c_m != NULL && prev->next_c_m != NULL ) { c_m_pt1 = ct->xdir ? prev->next_c_m->rightidx : prev->next_c_m->leftidx; c_m_pt2 = ct->xdir ? stem->prev_c_m->leftidx : stem->prev_c_m->rightidx; } /* Now the stem's origin must be placed in respect to others... */ /* TODO! What's really needed here is an iterative procedure that */ /* would preserve counters and widths, like in freetype2. */ /* For horizontal stems, interpolating between blues is being be done. */ if (stem->ldone || stem->rdone ) { ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = MDAP; /* sets rp0 and rp1 */ shp_rp1 = use_rp1; chg_rp0 = (ct->xdir && !lbase) || (!ct->xdir && lbase); } else if (!ct->xdir) { /* horizontal stem */ ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = MDAP_rnd; shp_rp1 = use_rp1; chg_rp0 = keep_old_rp0; } else if (prev == NULL) { /* first vertical stem */ ct->pt = pushpoint(ct->pt, ct->edge.refpt); *(ct->pt)++ = MDRP_rp0_rnd_white; shp_rp1 = use_rp2; chg_rp0 = keep_old_rp0; } else { if (ct->gic->fpgm_done) { if ( control_counters && c_m_pt1 != -1 && c_m_pt2 != -1 ) { callargs[0] = c_m_pt1; callargs[1] = c_m_pt2; callargs[2] = ct->rp0; callargs[3] = ct->edge.refpt; callargs[4] = get_counters_cut_in(ct, c_m_pt1, c_m_pt2, ct->rp0, ct->edge.refpt); callargs[5] = 15; ct->pt = pushpoints(ct->pt, 6, callargs); } else if ( control_counters && prev != NULL && prev->leftidx != -1 && prev->rightidx != -1 ) { callargs[0] = ct->xdir ? prev->leftidx : prev->rightidx; callargs[1] = ct->edge.refpt; callargs[2] = ( cur_pos - prev_pos ) > ct->gic->fudge ? 16 : 17; ct->pt = pushpoints(ct->pt, 3, callargs); } else if ( fabs( cur_pos - prev_pos ) > ct->gic->fudge ) { ct->pt = push2nums(ct->pt, ct->edge.refpt, 1); } else { ct->pt = push2nums(ct->pt, ct->edge.refpt, 11); } *(ct->pt)++ = CALL; } else { ct->pt = pushpoint(ct->pt, ct->edge.refpt); if ( fabs( cur_pos - prev_pos ) > ct->gic->fudge ) *(ct->pt)++ = MDRP_rp0_min_rnd_grey; else *(ct->pt)++ = MDRP_rp0_rnd_white; } shp_rp1 = use_rp2; /* Don't switch rp0 to the second edge. Thus, relative distance * to the next stem is be larger, and errors are hopefully lesser. * TODO! This is disputable. * TODO! For the last vstem, we probably want to switch rp0 anyway. */ chg_rp0 = keep_old_rp0; } ct->rp0 = ct->edge.refpt; finish_stem(stem, shp_rp1, chg_rp0, ct); if ( instruct_serif_stems || instruct_ball_terminals ) instruct_serifs(ct, stem); instruct_dependent(ct, stem); } /* High-level function for instructing horizontal stems. * * It is assumed that blues (and hstems associated with them) are already * done so that remaining stems can be interpolated between them. * * TODO! CJK hinting will probably need different function (HStemGeninstCJK?) * TODO! Instruct top and bottom bearings for fonts which have them. */ static void HStemGeninst(InstrCt *ct) { BlueZone *blues = ct->gic->blues; int bluecnt = ct->gic->bluecnt; BasePoint *bp = ct->bp; StemData *stem; int i, j, rp1, rp2, opp, bpt, ept; double hbase, hend; int mdrp_end, mdrp_base, ip_base, *rpts1, *rpts2; int callargs[5]; if ( ct->gd->hbundle == NULL ) return; rpts1 = calloc(ct->gd->hbundle->cnt, sizeof(int)); rpts2 = calloc(ct->gd->hbundle->cnt, sizeof(int)); /* Interpolating between blues is splitted to two stages: first * we determine which stems can be interpolated and which cannot * and store the numbers of reference points, and then (in the * second cycle) proceed to generating actual instructions. The reason is * that we need a special handling for dependent stems: if they * can be interpolated, we process them separately, but otherwise * the normal algorithm for positioning dependent stems relatively * to their "masters" is used. It is necessary to know which method * to prefer for each stem at the time instructions are generated. */ for ( i=0; igd->hbundle->cnt; i++ ) { stem = ct->gd->hbundle->stemlist[i]; if (!stem->ldone && !stem->rdone) { /* Set up upper edge (hend) and lower edge (hbase). */ hbase = stem->right.y; hend = stem->left.y; /* Find two points to interpolate the HStem between. rp1 = lower, rp2 = upper. */ rp1 = -1; rp2 = -1; for (j=0; j hend) if (rp2==-1 || bp[rp2].y > bp[blues[j].highest].y) rp2=blues[j].highest; } rpts1[i] = rp1; rpts2[i] = rp2; /* If a dependent stem has to be positioned by interpolating * one of its edges between the edges of the master stem and * we have found reference points to interpolate it between * blues, then we prefer to interpolate it between blues. However * we keep the standard handling for other types of dependent * stems, since usually positioning relatively to the "master" * stem is more important than positioning relatively to blues * in such cases. * Exception: nested stems marked for interpolation should be * positioned by interpolating between the edges of the nesting * stem. */ if (rp1!=-1 && rp2!=-1 && stem->master != NULL) for (j=0; jmaster->dep_cnt; j++) { if (stem->master->dependent[j].stem == stem && stem->master->dependent[j].dep_type == 'i' && (stem->master->left.y <= stem->left.y || stem->master->right.y >= stem->right.y)) { stem->master = NULL; break; } } } } for ( i=0; igd->hbundle->cnt; i++ ) { stem = ct->gd->hbundle->stemlist[i]; if ( stem->master != NULL ) continue; if (!stem->ldone && !stem->rdone) { hbase = stem->right.y; hend = stem->left.y; rp1 = rpts1[i]; rp2 = rpts2[i]; /* Reference points not found? Fall back to old method. */ if (rp1==-1 || rp2==-1) { geninstrs(ct, stem, NULL, false); continue; } bpt = ept = -1; if ( !stem->ghost || stem->width == 21 ) { init_stem_edge(ct, stem, false); bpt = ct->edge.refpt; } if ( !stem->ghost || stem->width == 20 ) { init_stem_edge(ct, stem, true); ept = ct->edge.refpt; } if ( bpt == -1 && ept == -1 ) continue; /* Align the stem relatively to rp0 and rp1. */ mdrp_end = ept != -1 && fabs(bp[rp2].y - hbase) < 0.2*fabs(bp[rp2].y - bp[rp1].y); mdrp_base = bpt != -1 && fabs(bp[rp1].y - hend) < 0.2*fabs(bp[rp2].y - bp[rp1].y); if (mdrp_end || mdrp_base) { if (mdrp_end) init_stem_edge(ct, stem, true); else init_stem_edge(ct, stem, false); if (ct->edge.refpt == -1) continue; if (mdrp_end) ct->pt = push2points(ct->pt, ct->edge.refpt, rp2); else ct->pt = push2points(ct->pt, ct->edge.refpt, rp1); *(ct->pt)++ = SRP0; *(ct->pt)++ = DUP; *(ct->pt)++ = MDRP_grey; *(ct->pt)++ = MDAP_rnd; } else if ( bpt == -1 || ept == -1 ) { ip_base = ( ept == -1 ); init_stem_edge(ct, stem, !ip_base); if ( ct->gic->fpgm_done ) { callargs[0] = ct->edge.refpt; callargs[1] = rp1; callargs[2] = rp2; callargs[3] = 8; ct->pt = pushnums(ct->pt, 4, callargs); *(ct->pt)++ = CALL; } else { callargs[0] = ct->edge.refpt; callargs[1] = rp1; callargs[2] = rp2; ct->pt = pushnums(ct->pt, 3, callargs); *(ct->pt)++ = SRP2; *(ct->pt)++ = SRP1; *(ct->pt)++ = DUP; *(ct->pt)++ = IP; *(ct->pt)++ = MDAP_rnd; } } else { ip_base = fabs(bp[rp2].y - hend) < fabs(bp[rp1].y - hbase); opp = ip_base ? ept : bpt; init_stem_edge(ct, stem, !ip_base); if (ct->edge.refpt == -1) continue; if ( ct->gic->fpgm_done ) { callargs[0] = opp; callargs[1] = ct->edge.refpt; callargs[2] = rp1; callargs[3] = rp2; callargs[4] = 13; ct->pt = pushnums(ct->pt, 5, callargs); *(ct->pt)++ = CALL; } else { callargs[0] = ct->edge.refpt; callargs[1] = rp1; callargs[2] = rp2; ct->pt = pushnums(ct->pt, 3, callargs); *(ct->pt)++ = SRP2; *(ct->pt)++ = SRP1; *(ct->pt)++ = DUP; *(ct->pt)++ = IP; *(ct->pt)++ = MDAP_rnd; } } ct->rp0 = ct->edge.refpt; finish_stem(stem, use_rp1, keep_old_rp0, ct); if ( instruct_serif_stems || instruct_ball_terminals ) instruct_serifs(ct, stem); instruct_dependent(ct, stem); } } free(rpts1); free(rpts2); } /* * High-level function for instructing vertical stems. * * TODO! CJK hinting may need different function (VStemGeninstCJK?) */ static void VStemGeninst(InstrCt *ct) { StemData *stem, *prev=NULL; int i; if (ct->rp0 != ct->ptcnt) { ct->pt = pushpoint(ct->pt, ct->ptcnt); *(ct->pt)++ = MDAP_rnd; ct->rp0 = ct->ptcnt; } if ( ct->gd->vbundle != NULL ) { for ( i=0; igd->vbundle->cnt; i++ ) { stem = ct->gd->vbundle->stemlist[i]; if ((!stem->ldone || !stem->rdone) && stem->master == NULL) { if (prev != NULL && prev->rightidx != -1 && ct->rp0 != prev->rightidx) { ct->pt = pushpoint(ct->pt, prev->rightidx); *(ct->pt)++ = SRP0; ct->rp0 = prev->rightidx; } geninstrs(ct, stem, prev, true); prev = stem; } } } /* instruct right sidebearing */ if (ct->sc->width != 0) { if ( ct->gic->fpgm_done && !control_counters ) { ct->pt = push2nums(ct->pt, ct->ptcnt+1, 1); *(ct->pt)++ = CALL; } else { /* select rp0 at the right edge of last stem - geninstrs() didn't. */ /* TODO! after some time, move this to geninstrs(), to save space. */ if (prev != NULL && prev->rightidx != -1 && ct->rp0 != prev->rightidx) { ct->pt = pushpoint(ct->pt, prev->rightidx); *(ct->pt)++ = SRP0; ct->rp0 = prev->rightidx; } ct->pt = pushpoint(ct->pt, ct->ptcnt+1); *(ct->pt)++ = MDRP_rp0_rnd_white; } ct->rp0 = ct->ptcnt+1; } } /****************************************************************************** * * Everything related with diagonal hinting goes here * ******************************************************************************/ #define DIAG_MIN_DISTANCE (0.84375) static int ds_cmp( const void *_s1, const void *_s2 ) { StemData * const *s1 = _s1, * const *s2 = _s2; BasePoint *bp1, *bp2; bp1 = (*s1)->unit.y > 0 ? &(*s1)->keypts[0]->base : &(*s1)->keypts[2]->base; bp2 = (*s2)->unit.y > 0 ? &(*s2)->keypts[0]->base : &(*s2)->keypts[2]->base; if ( bp1->x < bp2->x || ( bp1->x == bp2->x && bp1->y < bp2->y )) return( -1 ); else if ( bp2->x < bp1->x || ( bp2->x == bp1->x && bp2->y < bp1->y )) return( 1 ); return( 0 ); } /* Takes a line defined by two points and returns a vector decribed as a * pair of x and y values, such that the value (x2 + y2) is equal to 1. * Note that the BasePoint structure is used to store the vector, although * it is not a point itself. This is just because that structure has "x" * and "y" fields which can be used for our purpose. */ static BasePoint GetVector ( BasePoint *top,BasePoint *bottom,int orth ) { real catx, caty, hyp, temp; BasePoint ret; catx = top->x - bottom->x; caty = top->y - bottom->y; hyp = sqrt(( catx*catx ) + ( caty*caty )); ret.y = caty/hyp; ret.x = catx/hyp; if( orth ) { temp = ret.x; ret.x = -ret.y; ret.y = temp; } return( ret ); } static int SetDStemKeyPoint( InstrCt *ct,StemData *stem,PointData *pd,int aindex ) { int nextidx, previdx, cpidx, prev_outer, next_outer, is_start; int nsidx, psidx, sidx; uint8 flag; PointData *ncpd, *pcpd, *cpd, *best = NULL; real prevdot, nextdot, cpdist; if ( pd == NULL ) return( false ); flag = fabs( stem->unit.y ) > fabs( stem->unit.x ) ? tf_y : tf_x; is_start = ( aindex == 0 || aindex == 2 ); prevdot = ( pd->prevunit.x * stem->unit.x ) + ( pd->prevunit.y * stem->unit.y ); nextdot = ( pd->nextunit.x * stem->unit.x ) + ( pd->nextunit.y * stem->unit.y ); prev_outer = IsStemAssignedToPoint( pd,stem,false ) != -1 && (( is_start && prevdot < 0 ) || ( !is_start && prevdot > 0 )); next_outer = IsStemAssignedToPoint( pd,stem,true ) != -1 && (( is_start && nextdot < 0 ) || ( !is_start && nextdot > 0 )); if ( pd->ttfindex >= ct->gd->realcnt ) { nextidx = pd->sp->nextcpindex; previdx = pd->sp->prev->from->nextcpindex; ncpd = &ct->gd->points[nextidx]; pcpd = &ct->gd->points[previdx]; psidx = IsStemAssignedToPoint( pcpd,stem,true ); nsidx = IsStemAssignedToPoint( ncpd,stem,false ); if ( psidx == -1 && nsidx == -1 ) return( false ); if ( psidx > -1 && nsidx > -1 ) best = ( prev_outer ) ? pcpd : ncpd; else best = ( psidx > -1 ) ? pcpd : ncpd; } else if (( !pd->sp->nonextcp && next_outer ) || ( !pd->sp->noprevcp && prev_outer )) { cpidx = ( prev_outer ) ? pd->sp->prev->from->nextcpindex : pd->sp->nextcpindex; cpd = &ct->gd->points[cpidx]; sidx = IsStemAssignedToPoint( cpd,stem,prev_outer ); if ( sidx != -1 ) { cpdist = fabs(( pd->base.x - cpd->base.x ) * stem->unit.x + ( pd->base.y - cpd->base.y ) * stem->unit.y ); if (( cpdist > stem->clen/2 ) || (!(ct->touched[pd->ttfindex] & flag) && !(ct->affected[pd->ttfindex] & flag) && ( ct->touched[cpd->ttfindex] & flag || ct->affected[cpd->ttfindex] & flag ))) best = cpd; } if ( best == NULL ) best = pd; } else best = pd; stem->keypts[aindex] = best; return( true ); } static void AssignLineToPoint( DiagPointInfo *diagpts,StemData *stem,int idx,int is_l ) { int num, base, i; PointData *pd1, *pd2; num = diagpts[idx].count; base = ( is_l ) ? 0 : 2; pd1 = stem->keypts[base]; pd2 = stem->keypts[base+1]; for ( i=0; ikeypts[base]; diagpts[idx].line[num].pd2 = stem->keypts[base+1]; diagpts[idx].line[num].done = false; diagpts[idx].count++; return; } /* Convert the existing diagonal stem layout to glyph data, containing * information about points assigned to each stem. Then run on stem chunks * and associate with each point the line it should be aligned by. Note that * we have to do this on a relatively early stage, as it may be important * to know, if the given point is subject to the subsequent diagonale hinting, * before any actual processing of diagonal stems is started. */ static void InitDStemData( InstrCt *ct ) { DiagPointInfo *diagpts = ct->diagpts; int i, j, idx, previdx, nextidx, num1, num2, psidx, nsidx, is_l, cnt=0; real prevlsp, prevrsp, prevlep, prevrep, lpos, rpos; GlyphData *gd; StemData *stem; PointData *ls, *rs, *le, *re, *tpd, *ppd, *npd; struct stem_chunk *chunk; gd = ct->gd; for ( i=0; istemcnt; i++ ) { stem = &gd->stems[i]; if ( stem->toobig ) continue; if (( stem->unit.y > -.05 && stem->unit.y < .05 ) || ( stem->unit.x > -.05 && stem->unit.x < .05 )) continue; if ( stem->lpcnt < 2 || stem->rpcnt < 2 ) continue; prevlsp = prevrsp = 1e4; prevlep = prevrep = -1e4; ls = rs = le = re = NULL; for ( j=0; jchunk_cnt; j++ ) { chunk = &stem->chunks[j]; if ( chunk->l != NULL ) { lpos = ( chunk->l->base.x - stem->left.x )*stem->unit.x + ( chunk->l->base.y - stem->left.y )*stem->unit.y; if ( lpos < prevlsp ) { ls = chunk->l; prevlsp = lpos; } if ( lpos > prevlep ) { le = chunk->l; prevlep = lpos; } } if ( chunk->r != NULL ) { rpos = ( chunk->r->base.x - stem->right.x )*stem->unit.x + ( chunk->r->base.y - stem->right.y )*stem->unit.y; if ( rpos < prevrsp ) { rs = chunk->r; prevrsp = rpos; } if ( rpos > prevrep ) { re = chunk->r; prevrep = rpos; } } } /* Swap "left" and "right" sides for vectors pointing north-east, * so that the "left" side is always determined along the x axis * rather than relatively to the vector direction */ num1 = ( stem->unit.y > 0 ) ? 0 : 2; num2 = ( stem->unit.y > 0 ) ? 2 : 0; if (!SetDStemKeyPoint( ct,stem,ls,num1 ) || !SetDStemKeyPoint( ct,stem,rs,num2 )) continue; num1 = ( stem->unit.y > 0 ) ? 1 : 3; num2 = ( stem->unit.y > 0 ) ? 3 : 1; if (!SetDStemKeyPoint( ct,stem,le,num1 ) || !SetDStemKeyPoint( ct,stem,re,num2 )) continue; for ( j=0; jpcnt; j++ ) gd->points[j].ticked = false; for ( j=0; jpcnt; j++ ) if ( gd->points[j].sp != NULL ) { tpd = &gd->points[j]; idx = tpd->ttfindex; psidx = nsidx = -1; if ( idx < gd->realcnt ) { if ( !tpd->ticked && diagpts[idx].count < 2 && ( ( psidx = IsStemAssignedToPoint( tpd,stem,false )) > -1 || ( nsidx = IsStemAssignedToPoint( tpd,stem,true )) > -1)) { is_l = ( nsidx > -1 ) ? tpd->next_is_l[nsidx] : tpd->prev_is_l[psidx]; if ( stem->unit.y < 0 ) is_l = !is_l; AssignLineToPoint( diagpts,stem,idx,is_l ); tpd->ticked = true; } } else { previdx = tpd->sp->prev->from->nextcpindex; nextidx = tpd->sp->nextcpindex; ppd = &gd->points[previdx]; npd = &gd->points[nextidx]; if (!ppd->ticked && diagpts[previdx].count < 2 && ( nsidx = IsStemAssignedToPoint( ppd,stem,true )) > -1 ) { is_l = ppd->next_is_l[nsidx]; if ( stem->unit.y < 0 ) is_l = !is_l; AssignLineToPoint( diagpts,stem,previdx,is_l ); ppd->ticked = true; } if (!npd->ticked && diagpts[nextidx].count < 2 && ( psidx = IsStemAssignedToPoint( npd,stem,false )) > -1 ) { is_l = npd->prev_is_l[psidx]; if ( stem->unit.y < 0 ) is_l = !is_l; AssignLineToPoint( diagpts,stem,nextidx,is_l ); npd->ticked = true; } } } ct->diagstems[cnt++] = stem; } qsort( ct->diagstems,cnt,sizeof( StemData *),ds_cmp ); ct->diagcnt = cnt; } /* Usually we have to start doing each diagonal stem from the point which * is most touched in any directions. */ static int FindDiagStartPoint( StemData *stem, uint8 *touched ) { int i; for ( i=0; i<4; ++i ) { if (( touched[stem->keypts[i]->ttfindex] & tf_x ) && ( touched[stem->keypts[i]->ttfindex] & tf_y )) return( i ); } for ( i=0; i<4; ++i ) { if (( stem->unit.x > stem->unit.y && touched[stem->keypts[i]->ttfindex] & tf_y ) || ( stem->unit.y > stem->unit.x && touched[stem->keypts[i]->ttfindex] & tf_x )) return( i ); } for ( i=0; i<4; ++i ) { if ( touched[stem->keypts[i]->ttfindex] & ( tf_x | tf_y )) return( i ); } return( 0 ); } /* Check the directions at which the given point still can be moved * (i. e. has not yet been touched) and set freedom vector to that * direction in case it has not already been set. */ static int SetFreedomVector( uint8 **instrs,int pnum, uint8 *touched,DiagPointInfo *diagpts,BasePoint *norm,BasePoint *fv,int pvset,int fpgm_ok ) { int i, pushpts[3]; PointData *start=NULL, *end=NULL; BasePoint newfv; if (( touched[pnum] & tf_d ) && !( touched[pnum] & tf_x ) && !( touched[pnum] & tf_y )) { for ( i=0 ; ibase,&end->base,false ); if ( !UnitsParallel( fv,&newfv,true )) { fv->x = newfv.x; fv->y = newfv.y; pushpts[0] = start->ttfindex; pushpts[1] = end->ttfindex; *instrs = pushpoints( *instrs,2,pushpts ); *(*instrs)++ = 0x08; /*SFVTL[parallel]*/ } return( true ); } else if ( touched[pnum] & tf_x && !(touched[pnum] & tf_d) && !(touched[pnum] & tf_y)) { if (!( RealNear( fv->x,0 ) && RealNear( fv->y,1 ))) { *(*instrs)++ = 0x04; /*SFVTCA[y-axis]*/ fv->x = 0; fv->y = 1; } return( true ); } else if ( touched[pnum] & tf_y && !(touched[pnum] & tf_d) && !(touched[pnum] & tf_x)) { if (!( RealNear( fv->x,1 ) && RealNear( fv->y,0 ))) { *(*instrs)++ = 0x05; /*SFVTCA[x-axis]*/ fv->x = 1; fv->y = 0; } return( true ); } else if ( !(touched[pnum] & (tf_x|tf_y|tf_d))) { if ( !UnitsParallel( fv,norm,true )) { fv->x = norm->x; fv->y = norm->y; if ( pvset ) *(*instrs)++ = 0x0E; /*SFVTPV*/ else { pushpts[0] = EF2Dot14(norm->x); pushpts[1] = EF2Dot14(norm->y); if ( fpgm_ok ) { pushpts[2] = 21; *instrs = pushpoints( *instrs,3,pushpts ); *(*instrs)++ = CALL; /* aspect-ratio correction */ } else *instrs = pushpoints( *instrs,2,pushpts ); *(*instrs)++ = 0x0b; /* SFVFS */ } } return( true ); } return( false ); } static int MarkLineFinished( int pnum,int startnum,int endnum,DiagPointInfo *diagpts ) { int i; for ( i=0; ittfindex == startnum ) && ( diagpts[pnum].line[i].pd2->ttfindex == endnum )) { diagpts[pnum].line[i].done = 2; return( true ); } } return( false ); } static uint8 *FixDStemPoint ( InstrCt *ct,StemData *stem, int pt,int refpt,int firstedge,int cvt,BasePoint *fv ) { uint8 *instrs, *touched; DiagPointInfo *diagpts; diagpts = ct->diagpts; touched = ct->touched; instrs = ct->pt; if ( SetFreedomVector( &instrs,pt,touched,diagpts,&stem->l_to_r,fv,true, ct->gic->fpgm_done && ct->gic->prep_done )) { if ( refpt == -1 ) { if (( fv->x == 1 && !( touched[pt] & tf_x )) || ( fv->y == 1 && !( touched[pt] & tf_y ))) { instrs = pushpoint( instrs,pt ); *instrs++ = MDAP; } else { instrs = pushpoint( instrs,pt ); *instrs++ = SRP0; } ct->rp0 = pt; } else { if ( refpt != ct->rp0 ) { instrs = pushpoint( instrs,refpt ); *instrs++ = SRP0; ct->rp0 = refpt; } if ( cvt < 0 ) { instrs = pushpoint( instrs,pt ); *instrs++ = MDRP_grey; } else { instrs = pushpointstem( instrs,pt,cvt ); *instrs++ = MIRP_rp0_min_black; ct->rp0 = pt; } } touched[pt] |= tf_d; if (!MarkLineFinished( pt,stem->keypts[0]->ttfindex,stem->keypts[1]->ttfindex,diagpts )) MarkLineFinished( pt,stem->keypts[2]->ttfindex,stem->keypts[3]->ttfindex,diagpts ); } return( instrs ); } static int DStemHasSnappableCorners ( InstrCt *ct,StemData *stem,PointData *pd1,PointData *pd2 ) { uint8 *touched = ct->touched; /* We should be dealing with oncurve points */ if ( pd1->sp == NULL || pd2->sp == NULL ) return( false ); /* points should not be lined up vertically or horizontally */ if (fabs( pd1->base.x - pd2->base.x ) <= ct->gic->fudge || fabs( pd1->base.y - pd2->base.y ) <= ct->gic->fudge ) return( false ); if (( pd1->x_corner == 1 && !( touched[pd1->ttfindex] & tf_y ) && pd2->y_corner == 1 && !( touched[pd2->ttfindex] & tf_x )) || ( pd1->y_corner == 1 && !( touched[pd1->ttfindex] & tf_x ) && pd2->x_corner == 1 && !( touched[pd2->ttfindex] & tf_y ))) return( true ); return( false ); } static uint8 *SnapDStemCorners ( InstrCt *ct,StemData *stem,PointData *pd1,PointData *pd2,BasePoint *fv ) { uint8 *instrs, *touched; int xbase, ybase; instrs = ct->pt; touched = ct->touched; if ( pd1->x_corner && pd2->y_corner ) { xbase = pd1->ttfindex; ybase = pd2->ttfindex; } else { xbase = pd2->ttfindex; ybase = pd1->ttfindex; } *(ct->pt)++ = SVTCA_x; ct->pt = push2points( ct->pt,ybase,xbase ); *(ct->pt)++ = touched[xbase] & tf_x ? MDAP : MDAP_rnd; *(ct->pt)++ = MDRP_min_black; *(ct->pt)++ = SVTCA_y; ct->pt = push2points( ct->pt,xbase,ybase ); *(ct->pt)++ = touched[ybase] & tf_y ? MDAP : MDAP_rnd; *(ct->pt)++ = MDRP_min_black; touched[xbase] |= ( tf_x | tf_y ); touched[ybase] |= ( tf_x | tf_y ); fv->x = 0; fv->y = 1; return( instrs ); } /* A basic algorithm for hinting diagonal stems: * -- iterate through diagonal stems, ordered from left to right; * -- for each stem, find the most touched point, to start from, * and fix that point. TODO: the positioning should be done * relatively to points already touched by x or y; * -- position the second point on the same edge, using dual projection * vector; * -- link to the second edge and repeat the same operation. * * For each point we first determine a direction at which it still can * be moved. If a point has already been positioned relatively to another * diagonal line, then we move it along that diagonale. Thus this algorithm * can handle things like "V" where one line's ending point is another * line's starting point without special exceptions. */ static uint8 *FixDstem( InstrCt *ct, StemData *ds, BasePoint *fv ) { int startnum, a1, a2, b1, b2, firstedge, cvt; int x_ldup, y_ldup, x_edup, y_edup, dsc1, dsc2; PointData *v1, *v2; uint8 *touched; int pushpts[3]; if ( ds->ldone && ds->rdone ) return( ct->pt ); touched = ct->touched; dsc1 = DStemHasSnappableCorners( ct,ds,ds->keypts[0],ds->keypts[2] ); dsc2 = DStemHasSnappableCorners( ct,ds,ds->keypts[1],ds->keypts[3] ); if ( dsc1 || dsc2 ) { ct->pt = pushF26Dot6( ct->pt,.59662 ); *(ct->pt)++ = SMD; if ( dsc1 ) SnapDStemCorners( ct,ds,ds->keypts[0],ds->keypts[2],fv ); if ( dsc2 ) SnapDStemCorners( ct,ds,ds->keypts[1],ds->keypts[3],fv ); ct->pt = pushF26Dot6( ct->pt,DIAG_MIN_DISTANCE ); *(ct->pt)++ = SMD; } if ( !dsc1 || !dsc2 ) { startnum = FindDiagStartPoint( ds,touched ); a1 = ds->keypts[startnum]->ttfindex; if (( startnum == 0 ) || ( startnum == 1 )) { firstedge = true; v1 = ds->keypts[0]; v2 = ds->keypts[1]; a2 = ( startnum == 1 ) ? ds->keypts[0]->ttfindex : ds->keypts[1]->ttfindex; b1 = ( startnum == 1 ) ? ds->keypts[3]->ttfindex : ds->keypts[2]->ttfindex; b2 = ( startnum == 1 ) ? ds->keypts[2]->ttfindex : ds->keypts[3]->ttfindex; } else { firstedge = false; v1 = ds->keypts[2]; v2 = ds->keypts[3]; a2 = ( startnum == 3 ) ? ds->keypts[2]->ttfindex : ds->keypts[3]->ttfindex; b1 = ( startnum == 3 ) ? ds->keypts[1]->ttfindex : ds->keypts[0]->ttfindex; b2 = ( startnum == 3 ) ? ds->keypts[0]->ttfindex : ds->keypts[1]->ttfindex; } /* Always put the calculated stem width into the CVT table, unless it is * already there. This approach would be wrong for vertical or horizontal * stems, but for diagonales it is just unlikely that we can find an * acceptable predefined value in StemSnapH or StemSnapV */ cvt = TTF_getcvtval( ct->gic->sf,ds->width ); pushpts[0] = EF2Dot14(ds->l_to_r.x); pushpts[1] = EF2Dot14(ds->l_to_r.y); if ( ct->gic->fpgm_done && ct->gic->prep_done ) { pushpts[2] = 21; ct->pt = pushnums( ct->pt, 3, pushpts ); *(ct->pt)++ = CALL; /* Aspect ratio correction */ } else ct->pt = pushnums( ct->pt, 2, pushpts ); *(ct->pt)++ = 0x0A; /* SPVFS */ pushpts[0] = v1->ttfindex; pushpts[1] = v2->ttfindex; x_ldup =( touched[a1] & tf_x && touched[a2] & tf_x ) || ( touched[b1] & tf_x && touched[b2] & tf_x ); y_ldup =( touched[a1] & tf_y && touched[a2] & tf_y ) || ( touched[b1] & tf_y && touched[b2] & tf_y ); x_edup =( touched[a1] & tf_x && touched[b1] & tf_x ) || ( touched[a2] & tf_x && touched[b2] & tf_x ); y_edup =( touched[a1] & tf_y && touched[b1] & tf_y ) || ( touched[a2] & tf_y && touched[b2] & tf_y ); if (( x_ldup && !y_edup ) || ( y_ldup && !x_edup)) { ct->pt = FixDStemPoint ( ct,ds,a1,-1,firstedge,-1,fv ); ct->pt = FixDStemPoint ( ct,ds,b2,-1,firstedge,-1,fv ); ct->pt = FixDStemPoint ( ct,ds,b1,a1,firstedge,cvt,fv ); ct->pt = FixDStemPoint ( ct,ds,a2,b2,firstedge,cvt,fv ); } else { ct->pt = FixDStemPoint ( ct,ds,a1,-1,firstedge,-1,fv ); ct->pt = FixDStemPoint ( ct,ds,a2,a1,firstedge,-1,fv ); ct->pt = FixDStemPoint ( ct,ds,b1,a1,firstedge,cvt,fv ); ct->pt = FixDStemPoint ( ct,ds,b2,b1,firstedge,-1,fv ); } } ds->ldone = ds->rdone = true; return( ct->pt ); } static uint8 *FixPointOnLine ( DiagPointInfo *diagpts,PointVector *line, PointData *pd,InstrCt *ct,BasePoint *fv,BasePoint *pv,int *rp1,int *rp2 ) { uint8 *instrs, *touched; BasePoint newpv; int pushpts[4]; touched = ct->touched; instrs = ct->pt; newpv = GetVector( &line->pd1->base,&line->pd2->base,true ); if ( SetFreedomVector( &instrs,pd->ttfindex,touched,diagpts,&newpv,fv,false, ct->gic->fpgm_done && ct->gic->prep_done )) { if ( ct->rp0 != line->pd1->ttfindex ) { instrs = pushpoint( instrs,line->pd1->ttfindex ); *instrs++ = SRP0; ct->rp0 = line->pd1->ttfindex; } if ( ct->gic->fpgm_done ) { pv->x = newpv.x; pv->y = newpv.y; pushpts[0] = pd->ttfindex; pushpts[1] = line->pd1->ttfindex; pushpts[2] = line->pd2->ttfindex; pushpts[3] = 19; instrs = pushpoints( instrs,4,pushpts ); *instrs++ = CALL; } else { if ( !UnitsParallel( pv,&newpv,true )) { pv->x = newpv.x; pv->y = newpv.y; pushpts[0] = line->pd1->ttfindex; pushpts[1] = line->pd2->ttfindex; instrs = pushpoints( instrs,2,pushpts ); *instrs++ = 0x07; /*SPVTL[orthogonal]*/ } instrs = pushpoint( instrs,pd->ttfindex ); *instrs++ = MDRP_grey; } } return( instrs ); } /* If a point has to be positioned just relatively to the diagonal * line (no intersections, no need to maintain other directions), * then we can interpolate it along that line. This usually produces * better results for things like a Danish slashed "O". */ static uint8 *InterpolateAlongDiag ( DiagPointInfo *diagpts,PointVector *line, PointData *pd,InstrCt *ct,BasePoint *fv,BasePoint *pv,int *rp1,int *rp2 ) { uint8 *instrs, *touched; BasePoint newpv; int pushpts[3]; touched = ct->touched; instrs = ct->pt; if (diagpts[pd->ttfindex].count != 1 || touched[pd->ttfindex] & ( tf_x|tf_y ) || diagpts[pd->ttfindex].line[0].done > 1 ) return( instrs ); newpv = GetVector( &line->pd1->base,&line->pd2->base,false ); if ( !UnitsParallel( pv,&newpv,false ) || *rp1 != line->pd1->ttfindex || *rp2 != line->pd1->ttfindex ) { pushpts[0] = pd->ttfindex; pushpts[1] = line->pd1->ttfindex; pushpts[2] = line->pd2->ttfindex; instrs = pushpoints( instrs,3,pushpts ); } else instrs = pushpoint ( instrs,pd->ttfindex ); if ( !UnitsParallel( pv,&newpv,true )) { pv->x = newpv.x; pv->y = newpv.y; if ( *rp1 != line->pd1->ttfindex || *rp2 != line->pd1->ttfindex ) { *instrs++ = DUP; *instrs++ = 0x8a; /* ROLL */ *instrs++ = DUP; *instrs++ = 0x8a; /* ROLL */ *instrs++ = 0x23; /* SWAP */ } *instrs++ = 0x06; /* SPVTL[parallel] */ } if ( !UnitsParallel( fv,&newpv,true )) { *instrs++ = 0x0E; /* SFVTPV */ fv->x = newpv.x; fv->y = newpv.y; } if ( *rp1 != line->pd1->ttfindex || *rp2 != line->pd1->ttfindex ) { *rp1 = line->pd1->ttfindex; *rp2 = line->pd1->ttfindex; *instrs++ = SRP1; *instrs++ = SRP2; } *instrs++ = IP; touched[pd->ttfindex] |= tf_d; diagpts[pd->ttfindex].line[0].done = 2; return( instrs ); } /* When all stem edges have already been positioned, run through other * points which are known to be related with some diagonales and position * them too. This may include both intersections and points which just * lie on a diagonal line. This function does not care about starting/ending * points of stems, unless they should be additionally positioned relatively * to another stem. Thus is can handle things like "X" or "K". */ static uint8 *MovePointsToIntersections( InstrCt *ct,BasePoint *fv ) { int i, j, ptcnt, rp1=-1, rp2=-1; uint8 *touched; BasePoint pv; PointData *curpd, *npd, *ppd; DiagPointInfo *diagpts; StemData *ds; touched = ct->touched; ptcnt = ct->gd->realcnt; diagpts = ct->diagpts; pv.x = 1; pv.y = 0; for ( i=0; i 0 ) { for ( j=0; jgd->points[i]; ct->pt = FixPointOnLine( diagpts,&diagpts[i].line[j], curpd,ct,fv,&pv,&rp1,&rp2 ); diagpts[i].line[j].done = true; touched[i] |= tf_d; } } } } /* Second pass to interpolate points lying on diagonal lines (but not * starting/ending stem points) along those lines. This operation, unlike * moving points to diagonals, requires vectors to be set parallel to lines, * and this is the reason for which it is done in a separate cycle */ for ( i=0; idiagcnt; i++ ) { ds = ct->diagstems[i]; if ( ds->ldone ) { for ( j=0; jchunk_cnt; j++ ) if (( curpd = ds->chunks[j].l ) != NULL ) { if ( curpd->ttfindex < ct->ptcnt ) { ct->pt = InterpolateAlongDiag ( diagpts,&diagpts[curpd->ttfindex].line[0], curpd,ct,fv,&pv,&rp1,&rp2 ); } else { ppd = &ct->gd->points[curpd->sp->prev->from->nextcpindex]; npd = &ct->gd->points[curpd->sp->nextcpindex]; if ( IsStemAssignedToPoint(ppd, ds, true) != -1 ) ct->pt = InterpolateAlongDiag ( diagpts,&diagpts[ppd->ttfindex].line[0], ppd,ct,fv,&pv,&rp1,&rp2 ); if ( IsStemAssignedToPoint(npd, ds, false) != -1 ) ct->pt = InterpolateAlongDiag ( diagpts,&diagpts[npd->ttfindex].line[0], npd,ct,fv,&pv,&rp1,&rp2 ); } } } if ( ds->rdone ) { for ( j=0; jchunk_cnt; j++ ) if (( curpd = ds->chunks[j].r ) != NULL ) { if ( curpd->ttfindex < ct->ptcnt ) { ct->pt = InterpolateAlongDiag ( diagpts,&diagpts[curpd->ttfindex].line[0], curpd,ct,fv,&pv,&rp1,&rp2 ); } else { ppd = &ct->gd->points[curpd->sp->prev->from->nextcpindex]; npd = &ct->gd->points[curpd->sp->nextcpindex]; if ( IsStemAssignedToPoint(ppd, ds, true) != -1 ) ct->pt = InterpolateAlongDiag ( diagpts,&diagpts[ppd->ttfindex].line[0], ppd,ct,fv,&pv,&rp1,&rp2 ); if ( IsStemAssignedToPoint(npd, ds, false) != -1 ) ct->pt = InterpolateAlongDiag ( diagpts,&diagpts[npd->ttfindex].line[0], npd,ct,fv,&pv,&rp1,&rp2 ); } } } } return( ct->pt ); } static void TouchControlPoint( InstrCt *ct,PointData *pd, int next,int *tobefixedy,int *tobefixedx,int *numx,int *numy ) { int idx, cpidx; PointData *cpd; uint8 *touched = ct->touched; idx = pd->ttfindex; cpidx = next ? pd->sp->nextcpindex : pd->sp->prev->from->nextcpindex; cpd = &ct->gd->points[cpidx]; if ( has_valid_dstem( cpd, !next ) != -1 ) { /* if this control point is used to describe an implied spline * point, then it is instructed as if it was an oncurve point */ if ( idx == 0xffff && touched[cpidx] & tf_d ) { if (!( touched[cpidx] & tf_y )) { tobefixedy[(*numy)++] = cpidx; touched[cpidx] |= tf_y; } if (!( touched[cpidx] & tf_x )) { tobefixedx[(*numx)++] = cpidx; touched[cpidx] |= tf_x; } /* otherwise we just mark it as affected to prevent undesired * interpolations */ } else if ( idx < ct->gd->realcnt && touched[idx] & tf_d ) { ct->affected[cpidx] |= tf_x; ct->affected[cpidx] |= tf_y; } } } /* Finally explicitly touch all affected points by X and Y (unless they * have already been), so that subsequent IUP's can't distort our stems. */ static uint8 *TouchDStemPoints( InstrCt *ct,BasePoint *fv ) { int i, ptcnt, numx=0, numy=0, idx; int *tobefixedy, *tobefixedx; uint8 *instrs, *touched; PointData *pd; touched = ct->touched; instrs = ct->pt; ptcnt = ct->gd->pcnt; tobefixedy = calloc( ptcnt,sizeof( int )); tobefixedx = calloc( ptcnt,sizeof( int )); /* Ensure that the projection vector is no longer set to a diagonal line */ if ( fv->x == 1 && fv->y == 0 ) *instrs++ = 0x03; /* SPVTCA[x] */ else if ( fv->x == 0 && fv->y == 1 ) *instrs++ = 0x02; /* SPVTCA[y] */ for ( i=0; igd->points[i].sp != NULL ) { pd = &ct->gd->points[i]; if (( has_valid_dstem( pd,false )) != -1 || ( has_valid_dstem( pd,true )) != -1 ) { idx = pd->ttfindex; if ( idx < ct->gd->realcnt && touched[idx] & tf_d ) { if (!( touched[idx] & tf_y )) { tobefixedy[numy++] = idx; touched[idx] |= tf_y; } if (!( touched[idx] & tf_x )) { tobefixedx[numx++] = idx; touched[idx] |= tf_x; } } if ( !pd->sp->noprevcp ) TouchControlPoint( ct,pd,false,tobefixedy,tobefixedx,&numx,&numy ); if ( !pd->sp->nonextcp ) TouchControlPoint( ct,pd,true,tobefixedy,tobefixedx,&numx,&numy ); } } if ( numy>0 ) { if ( !(fv->x == 0 && fv->y == 1) ) *instrs++ = SVTCA_y; instrs = instructpoints ( instrs,numy,tobefixedy,MDAP ); } if ( numx>0 ) { if ( !(fv->x == 1 && fv->y == 0) || numy > 0 ) *instrs++ = SVTCA_x; instrs = instructpoints ( instrs,numx,tobefixedx,MDAP ); } if ( numx == 0 && numy == 0 ) *instrs++ = SVTCA_x; free( tobefixedy ); free( tobefixedx ); return( instrs ); } static void DStemInfoGeninst( InstrCt *ct ) { BasePoint fv; int i; if (ct->diagcnt == 0) return; fv.x = 1; fv.y = 0; ct->pt = pushF26Dot6( ct->pt,DIAG_MIN_DISTANCE ); *(ct->pt)++ = SMD; /* Set Minimum Distance */ for ( i=0; idiagcnt; i++ ) ct->pt = FixDstem ( ct,ct->diagstems[i],&fv ); ct->pt = MovePointsToIntersections( ct,&fv ); ct->pt = TouchDStemPoints ( ct,&fv); ct->pt = pushF26Dot6( ct->pt,1.0 ); *(ct->pt)++ = SMD; /* Set Minimum Distance */ ct->xdir = fv.x; } /****************************************************************************** * * Strong point interpolation * * TODO! Better optimization, if possible. * TODO! leftmost and righmost bounds, if not already controlled by stems. * ******************************************************************************/ /* To be used with qsort() - sorts edge array in ascending order. */ struct stemedge { int refpt; double pos; }; /* To be used with qsort() - sorts edge array in ascending order. */ static int sortedges(const void *_e1, const void *_e2) { const struct stemedge *e1 = _e1, *e2 = _e2; return ( e1->pos > e2->pos ); } static int AddEdge(InstrCt *ct, StemData *stem, int is_l, struct stemedge *edgelist, int cnt) { real coord; int i, skip, refidx; if (!stem->ghost || (is_l && stem->width == 20) || (!is_l && stem->width == 21)) { coord = is_l ? ((real *) &stem->left.x)[!ct->xdir] : ((real *) &stem->right.x)[!ct->xdir]; refidx = is_l ? stem->leftidx : stem->rightidx; for (i=skip=0; igic->fudge || edgelist[i].refpt == refidx) { skip=1; break; } if (!skip && refidx != -1) { edgelist[cnt ].refpt = refidx; edgelist[cnt++].pos = coord; } } return( cnt ); } /* Optional feature: tries to maintain relative position of some important * points between stems' edges, so that glyph's shape is mostly preserved * when strongly gridfitted. This in terms of FreeType is called 'Strong Point * Interpolation'. It now does more or else what it should, but generates large * and sometimes incomplete code - see 'todos' above, and optimize_strongpts(). * Note: it would affect diagonals if done before instructing them. * * TODO: it now intrpolates strong points only between hints' edges. * What about between leftmost/rightmost edge and leftmost/rightmost * glyph extents, if they protrude beyond the edges? */ static void InterpolateStrongPoints(InstrCt *ct) { StemBundle *bundle; StemData *stem; uint8 touchflag = ct->xdir?tf_x:tf_y; real fudge; struct stemedge edgelist[192]; int edgecnt=0, i, j; int lpoint = -1, ledge=0; int rpoint = -1; int nowrp1 = 1; int ldone = 0; bundle = ( ct->xdir ) ? ct->gd->vbundle : ct->gd->hbundle; if (bundle == NULL || bundle->cnt == 0) return; /* List all stem edges. List only active edges for ghost hints. */ for(i=0; icnt; i++) { stem = bundle->stemlist[i]; edgecnt = AddEdge(ct, stem, ct->xdir, edgelist, edgecnt); edgecnt = AddEdge(ct, stem, !ct->xdir, edgelist, edgecnt); } if (edgecnt < 2) return; qsort(edgelist, edgecnt, sizeof(struct stemedge), sortedges); /* Interpolate important points between subsequent edges */ for (i=0; itouched[rpoint] & touchflag)) continue; if (lpoint==-1) { /* first edge */ lpoint = rpoint; ledge = i; } else { fudge = ct->gic->fudge; ct->gic->fudge = (edgelist[i].pos-edgelist[ledge].pos)/2; init_edge(ct, (edgelist[i].pos+edgelist[ledge].pos)/2, ALL_CONTOURS); optimize_strongpts(ct); /* Special way is needed here. */ ct->gic->fudge = fudge; if (!ct->edge.othercnt) { nowrp1 = 1; lpoint = rpoint; ledge = i; ldone = 0; } else if (ct->edge.refscore) { if (!ldone) { ct->pt = push2points(ct->pt, rpoint, lpoint); *ct->pt++ = SRP1; *ct->pt++ = SRP2; } else { ct->pt = pushpoint(ct->pt, rpoint); if (nowrp1) *ct->pt++ = SRP1; else *ct->pt++ = SRP2; nowrp1 = !nowrp1; } lpoint = rpoint; ledge = i; ldone = 1; /* instruct points */ ct->pt = instructpoints(ct->pt, ct->edge.othercnt, ct->edge.others, IP); for (j=0; jedge.othercnt; j++) ct->touched[ct->edge.others[j]] |= touchflag; } if (ct->edge.othercnt) { free(ct->edge.others); ct->edge.othercnt = 0; } } } } /****************************************************************************** * * Generate instructions for a glyph. * ******************************************************************************/ static uint8 *dogeninstructions(InstrCt *ct) { StemData *stem; int max, i; DStemInfo *dstem; BlueData nbd; /* Fill a temporary BlueData structure basing on the data stored in the global * instruction context. This is needed for GlyphDataBuild(), as it accepts * blue data only in this format */ for ( i=0; igic->bluecnt; i++ ) { if ( ct->gic->blues[i].base < ct->gic->blues[i].overshoot ) { nbd.blues[i][0] = ct->gic->blues[i].base; nbd.blues[i][1] = ct->gic->blues[i].overshoot; } else { nbd.blues[i][0] = ct->gic->blues[i].overshoot; nbd.blues[i][1] = ct->gic->blues[i].base; } } nbd.bluecnt = ct->gic->bluecnt; ct->gd = GlyphDataBuild( ct->sc,ct->gic->layer,&nbd,instruct_diagonal_stems ); /* 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 ( ct->gd->hbundle!=NULL ) max += ct->ptcnt*8; if ( ct->gd->vbundle!=NULL ) max += ct->ptcnt*8+4; for ( dstem=ct->sc->dstem; dstem!=NULL; max+=7+4*6+100, dstem=dstem->next ); if ( ct->sc->md!=NULL ) max += ct->ptcnt*12; max += ct->ptcnt*6; /* in case there are any rounds */ max += ct->ptcnt*6; /* paranoia */ ct->instrs = ct->pt = malloc(max); /* Initially no stem hints are done */ if ( ct->gd->hbundle!=NULL ) { for ( i=0; igd->hbundle->cnt; i++ ) { stem = ct->gd->hbundle->stemlist[i]; stem->ldone = stem->rdone = false; } } if ( ct->gd->vbundle!=NULL ) { for ( i=0; igd->vbundle->cnt; i++ ) { stem = ct->gd->vbundle->stemlist[i]; stem->ldone = stem->rdone = false; } } if ( instruct_diagonal_stems ) { /* Prepare info about diagonal stems to be used during edge optimization. */ /* These contents need to be explicitly freed after hinting diagonals. */ ct->diagstems = calloc(ct->gd->stemcnt, sizeof(StemData *)); ct->diagpts = calloc(ct->ptcnt, sizeof(struct diagpointinfo)); InitDStemData(ct); } /* We start from instructing horizontal features (=> movement in y) * Do this first so that the diagonal hinter will have everything moved * properly when it sets the projection vector * Even if we aren't doing the diagonals, we do the blues. */ ct->xdir = false; *(ct->pt)++ = SVTCA_y; snap_to_blues(ct); HStemGeninst(ct); /* Next instruct vertical features (=> movement in x). */ ct->xdir = true; *(ct->pt)++ = SVTCA_x; VStemGeninst(ct); /* Then instruct diagonal stems (=> movement in x) * This is done after vertical stems because it involves * moving some points out-of their vertical stems. */ if (instruct_diagonal_stems && ct->diagcnt > 0) DStemInfoGeninst(ct); if ( interpolate_strong ) { /* Adjust important points between hint edges. */ if (ct->xdir == false) *(ct->pt)++ = SVTCA_x; ct->xdir = true; InterpolateStrongPoints(ct); ct->xdir = false; *(ct->pt)++ = SVTCA_y; InterpolateStrongPoints(ct); } /* Interpolate untouched points */ *(ct->pt)++ = IUP_y; *(ct->pt)++ = IUP_x; if ((ct->pt)-(ct->instrs) > max) IError( "We're about to crash.\n" "We miscalculated the glyph's instruction set length\n" "When processing TTF instructions (hinting) of %s", ct->sc->name ); if ( instruct_diagonal_stems ) { free(ct->diagstems); free(ct->diagpts); } GlyphDataFree( ct->gd ); ct->sc->ttf_instrs_len = (ct->pt)-(ct->instrs); ct->sc->instructions_out_of_date = false; return ct->sc->ttf_instrs = realloc(ct->instrs,(ct->pt)-(ct->instrs)); } void NowakowskiSCAutoInstr(GlobalInstrCt *gic, SplineChar *sc) { int cnt, contourcnt; BasePoint *bp; int *contourends; uint8 *clockwise; uint8 *touched; uint8 *affected; SplineSet *ss; RefChar *ref; InstrCt ct; int i; if ( !sc->layers[gic->layer].order2 ) return; if ( sc->layers[gic->layer].refs!=NULL && sc->layers[gic->layer].splines!=NULL ) { ff_post_error(_("Can't instruct this glyph"), _("TrueType does not support mixed references and contours.\nIf you want instructions for %.30s you should either:\n * Unlink the reference(s)\n * Copy the inline contours into their own (unencoded\n glyph) and make a reference to that."), sc->name ); return; } for ( ref = sc->layers[gic->layer].refs; ref!=NULL; ref=ref->next ) { 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 ) { ff_post_error(_("Can't instruct this glyph"), _("TrueType does not support references which\nare scaled by more than 200%%. But %1$.30s\nhas been in %2$.30s. Any instructions\nadded would be meaningless."), ref->sc->name, sc->name ); return; } if ( sc->ttf_instrs ) { free(sc->ttf_instrs); sc->ttf_instrs = NULL; sc->ttf_instrs_len = 0; } SCNumberPoints(sc,gic->layer); if ( autohint_before_generate && sc->changedsincelasthinted && !sc->manualhints ) SplineCharAutoHint(sc,gic->layer,NULL); if ( sc->vstem==NULL && sc->hstem==NULL && sc->dstem==NULL && sc->md==NULL) return; /* TODO! * * We're having problems with references utilizing 'use my metrics' that are * rotated or flipped horizontally. Basically, such glyphs can get negative * width and behave strangely when the glyph referred is instructed. Such * widths are treated very differently under Freetype (OK) and Windows * (terribly shifted), and I suppose other rasterizers can also complain. * Perhaps we should advise turning 'use my metrics' off. */ if ( sc->layers[gic->layer].splines==NULL ) return; /* Start dealing with the glyph */ contourcnt = 0; for ( ss=sc->layers[gic->layer].splines; ss!=NULL; ss=ss->next, ++contourcnt ); cnt = SSTtfNumberPoints(sc->layers[gic->layer].splines); contourends = malloc((contourcnt+1)*sizeof(int)); clockwise = calloc(contourcnt,1); bp = malloc(cnt*sizeof(BasePoint)); touched = calloc(cnt,1); affected = calloc(cnt,1); contourcnt = cnt = 0; for ( ss=sc->layers[gic->layer].splines; ss!=NULL; ss=ss->next ) { touched[cnt] |= tf_startcontour; cnt = SSAddPoints(ss,cnt,bp,NULL); touched[cnt-1] |= tf_endcontour; contourends[contourcnt] = cnt-1; clockwise[contourcnt++] = SplinePointListIsClockwise(ss); } contourends[contourcnt] = 0; for (i=0; ibluecnt; i++) gic->blues[i].highest = gic->blues[i].lowest = -1; ct.gic = gic; ct.sc = sc; ct.ss = sc->layers[gic->layer].splines; ct.instrs = NULL; ct.pt = NULL; ct.ptcnt = cnt; ct.contourends = contourends; ct.clockwise = clockwise; ct.bp = bp; ct.touched = touched; ct.affected = affected; ct.diagstems = NULL; ct.diagpts = NULL; ct.rp0 = 0; dogeninstructions(&ct); free(touched); free(affected); free(bp); free(contourends); free(clockwise); } dvisvgm-2.8.1/libs/ff-woff/fontforge/tottfvar.c0000664000175000017500000006047713510660062016432 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include "ttf.h" #include static int PtNumbersAreSet(SplineChar *sc) { struct splinecharlist *dep; if ( sc==NULL ) return( false ); if ( sc->ttf_instrs!=NULL ) return( true ); for ( dep= sc->dependents; dep!=NULL ; dep=dep->next ) if ( dep->sc->ttf_instrs!=NULL ) return( true ); return( false ); } static int AssignPtNumbers(MMSet *mm,int gid) { /* None of the instances has fixed point numbers. Make them match */ int cnt=0; SplineSet **ss; SplinePoint **sp; int i; int allavg, alllines, stillmore, ret=true; ss = malloc((mm->instance_count+1)*sizeof(SplineSet *)); sp = malloc((mm->instance_count+1)*sizeof(SplinePoint *)); for ( i=0; iinstance_count; ++i ) ss[i] = mm->instances[i]->glyphs[gid]->layers[ly_fore].splines; ss[i] = mm->normal->glyphs[gid]->layers[ly_fore].splines; if ( ss[0]==NULL ) { stillmore = false; for ( i=0; i<=mm->instance_count; ++i ) if ( ss[i]!=NULL ) stillmore = true; free(ss); free(sp); if ( stillmore ) return( false ); return( true ); } else { stillmore = true; for ( i=0; i<=mm->instance_count; ++i ) if ( ss[i]==NULL ) stillmore = false; if ( !stillmore ) { free(ss); free(sp); return( false ); } } for (;;) { for ( i=0; i<=mm->instance_count; ++i ) sp[i] = ss[i]->first; for (;;) { allavg = alllines = true; for ( i=0; i<=mm->instance_count; ++i ) { if ( !RealNear(sp[i]->me.x,(sp[i]->nextcp.x+sp[i]->prevcp.x)/2) || !RealNear(sp[i]->me.y,(sp[i]->nextcp.y+sp[i]->prevcp.y)/2) ) allavg = false; if ( !sp[i]->nonextcp ) alllines = false; } if ( sp[0] == ss[0]->first ) allavg = false; for ( i=0; i<=mm->instance_count; ++i ) { if ( allavg ) sp[i]->ttfindex = 0xffff; else sp[i]->ttfindex = cnt; } if ( !allavg ) ++cnt; for ( i=0; i<=mm->instance_count; ++i ) { if ( alllines ) sp[i]->nextcpindex = 0xffff; else sp[i]->nextcpindex = cnt; } if ( !alllines ) ++cnt; if ( sp[0]->next==NULL ) { stillmore = false; for ( i=1; i<=mm->instance_count; ++i ) if ( sp[i]->next!=NULL ) stillmore = true; if ( stillmore ) ret = false; break; } for ( i=1; i<=mm->instance_count; ++i ) if ( sp[i]->next==NULL ) stillmore = false; if ( !stillmore ) { ret = false; break; } sp[0] = sp[0]->next->to; for ( i=1; i<=mm->instance_count; ++i ) sp[i] = sp[i]->next->to; if ( sp[0]==ss[0]->first ) { stillmore = false; for ( i=1; i<=mm->instance_count; ++i ) if ( sp[i]!=ss[i]->first ) stillmore = true; if ( stillmore ) ret = false; break; } for ( i=1; i<=mm->instance_count; ++i ) { if ( sp[i]==ss[i]->first ) stillmore = false; } if ( !stillmore ) { ret = false; break; } } if ( !ret ) break; stillmore = true; for ( i=0; i<=mm->instance_count; ++i ) ss[i] = ss[i]->next; if ( ss[0]==NULL ) { stillmore=false; for ( i=1; i<=mm->instance_count; ++i ) if ( ss[i]!=NULL ) stillmore = true; if ( stillmore ) ret = true; break; } for ( i=1; i<=mm->instance_count; ++i ) if ( ss[i]==NULL ) stillmore = false; if ( !stillmore ) { ret = true; break; } } free(ss); free(sp); return( ret ); } static int MatchPoints(SplineFont *sffixed, SplineFont *sfother, int gid) { SplineChar *fixed, *other; SplineSet *ss1, *ss2; SplinePoint *sp1, *sp2; fixed = sffixed->glyphs[gid]; other = sfother->glyphs[gid]; if ( PtNumbersAreSet(other)) { /* Point numbers must match exactly, both are fixed */ for ( ss1=fixed->layers[ly_fore].splines, ss2=other->layers[ly_fore].splines; ss1!=NULL && ss2!=NULL ; ss1 = ss1->next, ss2=ss2->next ) { for ( sp1=ss1->first, sp2=ss2->first; ; ) { if ( sp1->ttfindex!=sp2->ttfindex || sp1->nextcpindex!=sp2->nextcpindex ) return( false ); if ( sp1->next==NULL || sp2->next==NULL ) { if ( sp1->next!=NULL || sp2->next!=NULL ) return( false ); break; } sp1 = sp1->next->to; sp2=sp2->next->to; if ( sp1==ss1->first || sp2==ss2->first ) { if ( sp1!=ss1->first || sp2!=ss2->first ) return( false ); break; } } } return( ss1==NULL && ss2==NULL ); } else { for ( ss1=fixed->layers[ly_fore].splines, ss2=other->layers[ly_fore].splines; ss1!=NULL && ss2!=NULL ; ss1 = ss1->next, ss2=ss2->next ) { for ( sp1=ss1->first, sp2=ss2->first; ; ) { if ( sp1->ttfindex!=0xffff ) sp2->ttfindex = sp1->ttfindex; else if ( !RealNear(sp2->me.x,(sp2->nextcp.x+sp2->prevcp.x)/2) || !RealNear(sp2->me.y,(sp2->nextcp.y+sp2->prevcp.y)/2) ) return( false ); else sp2->ttfindex = 0xffff; if ( sp1->nextcpindex!=0xffff ) sp2->nextcpindex = sp1->nextcpindex; else if ( !sp2->nonextcp ) return( false ); else sp2->nextcpindex = 0xffff; if ( sp1->next==NULL || sp2->next==NULL ) { if ( sp1->next!=NULL || sp2->next!=NULL ) return( false ); break; } sp1 = sp1->next->to; sp2=sp2->next->to; if ( sp1==ss1->first || sp2==ss2->first ) { if ( sp1!=ss1->first || sp2!=ss2->first ) return( false ); break; } } } return( ss1==NULL && ss2==NULL ); } } int ContourPtNumMatch(MMSet *mm, int gid) { SplineFont *sf; int i; if ( !mm->apple ) return( false ); if ( gid>=mm->normal->glyphcnt ) return( false ); if ( !SCWorthOutputting(mm->normal->glyphs[gid] ) ) { for ( i=0; iinstance_count; ++i ) { if ( gid>=mm->instances[i]->glyphcnt ) return( false ); if ( SCWorthOutputting(mm->instances[i]->glyphs[gid])) return( false ); } return( true ); /* None is not worth outputting, and that's ok, they match */ } else { for ( i=0; iinstance_count; ++i ) { if ( gid>=mm->instances[i]->glyphcnt ) return( false ); if ( !SCWorthOutputting(mm->instances[i]->glyphs[gid])) return( false ); } /* All are worth outputting */ } if ( mm->normal->glyphs[gid]->layers[ly_fore].refs!=NULL && mm->normal->glyphs[gid]->layers[ly_fore].splines!=NULL ) return( false ); for ( i=0; iinstance_count; ++i ) { if ( mm->instances[i]->glyphs[gid]->layers[ly_fore].refs!=NULL && mm->instances[i]->glyphs[gid]->layers[ly_fore].splines!=NULL ) return( false ); } if ( mm->normal->glyphs[gid]->layers[ly_fore].refs!=NULL ) { RefChar *r; int cnt, c; for ( r=mm->normal->glyphs[gid]->layers[ly_fore].refs, cnt=0; r!=NULL; r=r->next ) ++cnt; for ( i=0; iinstance_count; ++i ) { for ( r=mm->instances[i]->glyphs[gid]->layers[ly_fore].refs, c=0; r!=NULL; r=r->next ) ++c; if ( c!=cnt ) return( false ); } } sf = NULL; if ( PtNumbersAreSet(mm->normal->glyphs[gid]) ) sf = mm->normal; else { for ( i=0; iinstance_count; ++i ) { if ( PtNumbersAreSet(mm->instances[i]->glyphs[gid])) { sf = mm->instances[i]; break; } } } if ( sf==NULL ) /* No instance has fixed points. Make sure all fonts are consistent */ return( AssignPtNumbers(mm,gid)); if ( sf!=mm->normal && !MatchPoints(sf,mm->normal,gid)) return( false ); for ( i=0; iinstance_count; ++i ) if ( sf!=mm->instances[i] ) { if ( !MatchPoints(sf, mm->instances[i],gid) ) return( false ); } return( true ); } static int SCPointCount(SplineChar *sc) { int ptcnt=0; RefChar *r; ptcnt = SSTtfNumberPoints(sc->layers[ly_fore].splines); for ( r=sc->layers[ly_fore].refs; r!=NULL ; r=r->next ) ++ptcnt; return( ptcnt ); } int16 **SCFindDeltas(MMSet *mm, int gid, int *_ptcnt) { /* When figuring out the deltas the first thing we must do is figure */ /* out each point's number */ int i, j, k, l, cnt, ptcnt; int16 **deltas; SplineSet *ss1, *ss2; SplinePoint *sp1, *sp2; RefChar *r1, *r2; if ( !ContourPtNumMatch(mm,gid)) return( NULL ); if ( !SCWorthOutputting(mm->normal->glyphs[gid])) return( NULL ); *_ptcnt = ptcnt = SCPointCount(mm->normal->glyphs[gid])+4; deltas = malloc(2*mm->instance_count*sizeof(int16 *)); for ( i=0; i<2*mm->instance_count; ++i ) deltas[i] = calloc(ptcnt,sizeof(int16)); for ( i=0; iinstance_count; ++i ) { for ( ss1=mm->normal->glyphs[gid]->layers[ly_fore].splines, ss2=mm->instances[i]->glyphs[gid]->layers[ly_fore].splines; ss1!=NULL && ss2!=NULL ; ss1 = ss1->next, ss2=ss2->next ) { for ( sp1=ss1->first, sp2=ss2->first; ; ) { if ( sp1->ttfindex!=0xffff ) { deltas[2*i][sp1->ttfindex] = rint(sp2->me.x)-rint(sp1->me.x); deltas[2*i+1][sp1->ttfindex] = rint(sp2->me.y)-rint(sp1->me.y); } if ( sp1->nextcpindex != 0xffff ) { deltas[2*i][sp1->nextcpindex] = rint(sp2->nextcp.x)-rint(sp1->nextcp.x); deltas[2*i+1][sp1->nextcpindex] = rint(sp2->nextcp.y)-rint(sp1->nextcp.y); } if ( sp1->next==NULL ) break; sp1 = sp1->next->to; sp2 = sp2->next->to; if ( sp1==ss1->first ) break; } } for ( cnt=0, r1=mm->normal->glyphs[gid]->layers[ly_fore].refs, r2=mm->instances[i]->glyphs[gid]->layers[ly_fore].refs; r1!=NULL && r2!=NULL; r1=r1->next, r2=r2->next, ++cnt ) { deltas[2*i][cnt] = r2->transform[4]-r1->transform[4]; deltas[2*i+1][cnt] = r2->transform[5]-r1->transform[5]; } /* Phantom points */ deltas[2*i][ptcnt-4] = 0; deltas[2*i+1][ptcnt-4] = 0; /* lbearing */ deltas[2*i][ptcnt-3] = mm->instances[i]->glyphs[gid]->width -mm->normal->glyphs[gid]->width; deltas[2*i+1][ptcnt-3] = 0; /* horizontal advance */ deltas[2*i][ptcnt-2] = 0; deltas[2*i+1][ptcnt-2] = 0; /* top bearing */ deltas[2*i][ptcnt-1] = 0; /* vertical advance */ deltas[2*i+1][ptcnt-1] = mm->instances[i]->glyphs[gid]->vwidth -mm->normal->glyphs[gid]->vwidth; /* horizontal advance */ } /* Ok, each delta now contains the difference between the instance[i] points */ /* and the base points. But that isn't good enough. We must subtract */ /* [0,1] and [1,0] from [1,1], and then subtract [1,1,0] [1,0,1] [0,1,1] */ /* from [1,1,1] and so on (also [-1,0] from [-1,1], etc.) */ for ( j=1; jaxis_count; ++j ) { for ( i=0; iinstance_count; ++i ) { for ( k=cnt=0; kaxis_count; ++k ) if ( mm->positions[i*mm->axis_count+k]!=0 ) ++cnt; if ( cnt==j ) { for ( l = 0; linstance_count; ++l ) if ( l!=i ) { for ( k=0; kaxis_count; ++k ) if ( mm->positions[i*mm->axis_count+k]!=0 && mm->positions[l*mm->axis_count+k]!=mm->positions[i*mm->axis_count+k]) break; if ( k==mm->axis_count ) { for ( k=0; kinstance_count; ++i ) { for ( j=0; jinstance_count ) { /* All zeros */ for ( i=0 ; iinstance_count; ++i ) free(deltas[i]); free(deltas); return( NULL ); } return( deltas ); } int16 **CvtFindDeltas(MMSet *mm, int *_ptcnt) { int i, j, k, l, cnt, ptcnt; int16 **deltas; struct ttf_table *cvt, *icvt; for ( cvt = mm->normal->ttf_tables; cvt!=NULL && cvt->tag!=CHR('c','v','t',' '); cvt=cvt->next ); if ( cvt==NULL ) return( NULL ); icvt = NULL; for ( i=0; iinstance_count; ++i ) if ( (icvt=mm->instances[i]->ttf_tables)!=NULL ) break; if ( icvt==NULL ) /* No other cvt tables => no variation */ return( NULL ); *_ptcnt = ptcnt = cvt->len/2; deltas = calloc(mm->instance_count,sizeof(int16 *)); for ( i=0; iinstance_count; ++i ) if ( (icvt=mm->instances[i]->ttf_tables)!=NULL ) { deltas[i] = calloc(ptcnt,sizeof(int16)); for ( j=0; jdata,icvt->len, sizeof(uint16)*j)- memushort(cvt->data,cvt->len, sizeof(uint16)*j); } /* Ok, each delta now contains the difference between the instance[i] points */ /* and the base points. But that isn't good enough. We must subtract */ /* [0,1] and [1,0] from [1,1], and then subtract [1,1,0] [1,0,1] [0,1,1] */ /* from [1,1,1] and so on (also [-1,0] from [-1,1], etc.) */ for ( j=1; jaxis_count; ++j ) { for ( i=0; iinstance_count; ++i ) if ( deltas[i]!=NULL ) { for ( k=cnt=0; kaxis_count; ++k ) if ( mm->positions[i*mm->axis_count+k]!=0 ) ++cnt; if ( cnt==j ) { for ( l = 0; linstance_count; ++l ) if ( l!=i && deltas[l]!=NULL ) { for ( k=0; kaxis_count; ++k ) if ( mm->positions[i*mm->axis_count+k]!=0 && mm->positions[l*mm->axis_count+k]!=mm->positions[i*mm->axis_count+k]) break; if ( k==mm->axis_count ) { for ( k=0; kinstance_count; ++i ) if ( deltas[i]!=NULL ) { for ( j=0; jinstance_count; ++i ) if ( deltas[i]!=NULL ) break; if ( i==mm->instance_count ) { /* All zeros */ free(deltas); return( NULL ); } return( deltas ); } static void ttf_dumpcvar(struct alltabs *at, MMSet *mm) { int16 **deltas; int ptcnt, cnt, pcnt; int i,j,rj,big; int tuple_size; uint32 start, end; uint16 *pts; deltas = CvtFindDeltas(mm,&ptcnt); if ( deltas == NULL ) return; for ( i=cnt=0; iinstance_count; ++i ) if ( deltas[i]!=NULL ) ++cnt; if ( cnt==0 ) { free(deltas); return; } tuple_size = 4+2*mm->axis_count; at->cvar = tmpfile2(); putlong( at->cvar, 0x00010000 ); /* Format */ putshort( at->cvar, cnt ); /* Number of instances with cvt tables (tuple count of interesting tuples) */ putshort( at->cvar, 8+cnt*tuple_size ); /* Offset to data */ for ( i=0; iinstance_count; ++i ) if ( deltas[i]!=NULL ) { putshort( at->cvar, 0 ); /* tuple data size, figure out later */ putshort( at->cvar, 0xa000 ); /* tuple coords follow, private points in data */ for ( j=0; jaxis_count; ++j ) putshort( at->cvar, rint(16384*mm->positions[i*mm->axis_count+j]) ); } if ( ftell( at->cvar )!=8+cnt*tuple_size ) IError( "Data offset wrong" ); for ( i=cnt=0; iinstance_count; ++i ) if ( deltas[i]!=NULL ) { start = ftell(at->cvar); for ( j=pcnt=0; j0x7f ) { putc(0x80|(pcnt>>8), at->cvar ); putc(pcnt&0xff, at->cvar); } else putc(pcnt, at->cvar); for ( j=0; j=0x80 ? 0x80 : 0; for ( rj=j+1 ; rj=0x80 ) big = 0x80; putc((rj-j-1)|big,at->cvar); if ( big ) { putshort(at->cvar,pts[j]); for ( ++j; jcvar,pts[j]-pts[j-1]); } else { putc(pts[j],at->cvar); for ( ++j; jcvar); } } /* Now output the corresponding deltas for those points */ for ( j=0; j0x7f || deltas[i][j]<0x80 ) { for ( rj=j+1; rj0x7f || deltas[i][pts[rj]]<0x80 || (rj+10x7f || deltas[i][pts[rj+1]]<0x80)) ) /* Keep going with a big run */; else break; } putc( (rj-j-1)|0x40,at->cvar ); for ( ; jcvar, deltas[i][pts[j]] ); } else { for ( rj=j+1; rj0x7f || deltas[i][pts[rj]]<0x80 ) break; } putc( rj-j-1,at->cvar ); for ( ; jcvar ); } } free(pts); end = ftell(at->cvar); fseek(at->cvar, 8+cnt*tuple_size, SEEK_SET); putshort(at->cvar,end-start); fseek(at->cvar, end, SEEK_SET); ++cnt; } for ( i=0; iinstance_count; ++i ) free( deltas[i] ); free(deltas); at->cvarlen = ftell(at->cvar); if ( at->cvarlen&1 ) putc('\0',at->cvar ); if ( ftell(at->cvar)&2 ) putshort(at->cvar,0); } static void dumpdeltas(struct alltabs *at,int16 *deltas,int ptcnt) { int j,rj; for ( j=0; jgvar); j = rj; continue; } if ( deltas[j]>0x7f || deltas[j]<0x80 ) { for ( rj=j+1; rj0x7f || deltas[rj]<0x80 || (rj+10x7f || deltas[rj+1]<0x80)) ) /* Keep going with a big run */; else break; } putc( (rj-j-1)|0x40,at->gvar ); for ( ; jgvar, deltas[j] ); } else { for ( rj=j+1; rj0x7f || deltas[rj]<0x80 || (deltas[rj]==0 && rj+1=0x80 && deltas[rj+1]!=0 )) break; } putc( rj-j-1,at->gvar ); for ( ; jgvar ); } } } static void ttf_dumpgvar(struct alltabs *at, MMSet *mm) { int i,j, last; uint32 gcoordoff, glyphoffs, start, here, tupledataend, tupledatastart; int16 **deltas; int ptcnt; at->gvar = tmpfile2(); putlong( at->gvar, 0x00010000 ); /* Format */ putshort( at->gvar, mm->axis_count ); putshort( at->gvar, mm->instance_count ); /* Number of global tuples */ gcoordoff = ftell(at->gvar); putlong( at->gvar, 0 ); /* Offset to global tuples, fix later */ putshort( at->gvar,at->maxp.numGlyphs ); putshort( at->gvar, 1 ); /* always output 32bit offsets */ putlong( at->gvar, ftell(at->gvar)+4 + (at->maxp.numGlyphs+1)*4); glyphoffs = ftell(at->gvar); for ( i=0; i<=at->maxp.numGlyphs; ++i ) putlong( at->gvar,0 ); start = ftell( at->gvar ); last = -1; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { deltas = SCFindDeltas(mm,at->gi.bygid[i],&ptcnt); if ( deltas==NULL ) continue; here = ftell(at->gvar); fseek(at->gvar,glyphoffs+(last+1)*4,SEEK_SET); for ( ; last< i; ++last ) putlong(at->gvar,here-start); fseek(at->gvar,here,SEEK_SET); putshort(at->gvar,mm->instance_count); putshort(at->gvar,4+4*mm->instance_count); /* offset to data */ for ( j=0; jinstance_count; ++j ) { putshort(at->gvar,0); /* tuple data size, fix later */ putshort(at->gvar,0x2000|j); /* private points, tuple i */ } for ( j=0; jinstance_count; ++j ) { tupledatastart = ftell(at->gvar); putc('\0',at->gvar); /* Point list, all points */ dumpdeltas(at,deltas[2*j],ptcnt); dumpdeltas(at,deltas[2*j+1],ptcnt); tupledataend = ftell(at->gvar); fseek(at->gvar,here+4+4*j,SEEK_SET); putshort( at->gvar,tupledataend-tupledatastart); fseek(at->gvar,tupledataend,SEEK_SET); free(deltas[2*j]); free(deltas[2*j+1]); } free(deltas); } here = ftell(at->gvar); fseek(at->gvar,glyphoffs+(last+1)*4,SEEK_SET); for ( ; last< at->maxp.numGlyphs; ++last ) putlong(at->gvar,here-start); fseek(at->gvar,gcoordoff,SEEK_SET); putlong(at->gvar,here); fseek(at->gvar,here,SEEK_SET); for ( j=0; jinstance_count; ++j ) { for ( i=0; iaxis_count; ++i ) putshort(at->gvar,rint(16384*mm->positions[j*mm->axis_count+i])); } at->gvarlen = ftell(at->gvar); if ( at->gvarlen&1 ) putc('\0',at->gvar ); if ( ftell(at->gvar)&2 ) putshort(at->gvar,0); } static void ttf_dumpavar(struct alltabs *at, MMSet *mm) { int i,j; for ( i=0; iaxis_count; ++i ) { if ( mm->axismaps[i].points>3 ) break; } if ( i==mm->axis_count ) /* We only have simple axes */ return; /* No need for a variation table */ at->avar = tmpfile2(); putlong( at->avar, 0x00010000 ); /* Format */ putlong( at->avar, mm->axis_count ); for ( i=0; iaxis_count; ++i ) { putshort( at->avar, mm->axismaps[i].points ); for ( j=0; jaxismaps[i].points; ++j ) { if ( mm->axismaps[i].designs[j]axismaps[i].def ) putshort( at->avar, (mm->axismaps[i].designs[j]-mm->axismaps[i].def)*16384/ (mm->axismaps[i].def-mm->axismaps[i].min)); else putshort( at->avar, (mm->axismaps[i].designs[j]-mm->axismaps[i].def)*16384/ (mm->axismaps[i].max-mm->axismaps[i].def)); putshort( at->avar, mm->axismaps[i].blends[j]*16384); } } at->avarlen = ftell(at->avar); if ( at->avarlen&2 ) putshort(at->avar,0); } static uint32 AxisNameToTag(char *name) { char buf[4]; int i; if ( strmatch(name,"Weight")==0 ) return( CHR('w','g','h','t')); if ( strmatch(name,"Width")==0 ) return( CHR('w','d','t','h')); if ( strmatch(name,"OpticalSize")==0 ) return( CHR('o','p','s','z')); if ( strmatch(name,"Slant")==0 ) return( CHR('s','l','n','t')); memset(buf,0,sizeof(buf)); for ( i=0; i<4 && name[i]!='\0'; ++i ) buf[i] = name[i]; return( CHR(buf[0],buf[1],buf[2],buf[3])); } static int AllocateStrId(struct alltabs *at,struct macname *mn) { struct other_names *on; if ( mn==NULL ) return( 0 ); on = chunkalloc(sizeof(struct other_names)); on->strid = at->next_strid++; on->mn = mn; on->next = at->other_names; at->other_names = on; return( on->strid ); } static void ttf_dumpfvar(struct alltabs *at, MMSet *mm) { int i,j; at->fvar = tmpfile2(); putlong( at->fvar, 0x00010000 ); /* Format */ putshort( at->fvar, 16 ); /* Offset to first axis data */ putshort( at->fvar, 2 ); /* Size count pairs */ putshort( at->fvar, mm->axis_count ); putshort( at->fvar, 20 ); /* Size of each axis record */ putshort( at->fvar, mm->named_instance_count ); putshort( at->fvar, 4+4*mm->axis_count ); /* For each axis ... */ for ( i=0; iaxis_count; ++i ) { putlong( at->fvar, AxisNameToTag(mm->axes[i]) ); putlong( at->fvar, rint(mm->axismaps[i].min*65536)); putlong( at->fvar, rint(mm->axismaps[i].def*65536)); putlong( at->fvar, rint(mm->axismaps[i].max*65536)); putshort(at->fvar, 0 ); /* No flags defined for axes */ putshort(at->fvar, AllocateStrId(at,mm->axismaps[i].axisnames)); } /* For each named font ... */ for ( i=0; inamed_instance_count; ++i ) { putshort(at->fvar, AllocateStrId(at,mm->named_instances[i].names)); putshort(at->fvar, 0 ); /* No flags here either */ for ( j=0; jaxis_count; ++j ) putlong(at->fvar, rint(65536*mm->named_instances[i].coords[j])); } at->fvarlen = ftell(at->fvar); if ( at->fvarlen&2 ) /* I don't think this is ever hit */ putshort(at->fvar,0); } void ttf_dumpvariations(struct alltabs *at, SplineFont *sf) { MMSet *mm = sf->mm; int i,j; for ( j=0; jglyphcnt; ++j ) if ( sf->glyphs[j]!=NULL ) { for ( i=0; iinstance_count; ++i ) if ( mm->instances[i]->glyphs[j]!=NULL ) mm->instances[i]->glyphs[j]->ttf_glyph = sf->glyphs[j]->ttf_glyph; } ttf_dumpfvar(at,mm); ttf_dumpgvar(at,mm); ttf_dumpcvar(at,mm); ttf_dumpavar(at,mm); } dvisvgm-2.8.1/libs/ff-woff/fontforge/fontforge-config.h0000664000175000017500000000074613510660062020013 00000000000000#ifndef FF_CONFIG_H #define FF_CONFIG_H #ifndef ICONV_CONST #define ICONV_CONST #endif #define _NO_LIBUNINAMESLIST 1 #define _NO_LIBUNICODENAMES 1 #define _NO_PYTHON #define _NO_FFSCRIPT #define _NO_LIBSPIRO #define FONTFORGE_LIBFF_VERSION_MAJOR 2 #define FONTFORGE_LIBFF_VERSION_MINOR 0 #define FONTFORGE_MODTIME_RAW 1469132312L /* Seconds since 1970 (standard unix time) */ #define FONTFORGE_MODTIME_STR "" #define FONTFORGE_VERSIONDATE_RAW 20160721 #define _GNU_SOURCE 1 #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/mm.c0000664000175000017500000002330413510660062015156 00000000000000/* Copyright (C) 2003-2012 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 "fontforgevw.h" #include "ttf.h" /******************************************************************************/ /* MM Validation */ /******************************************************************************/ 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->sc->orig_pos==ref1->sc->orig_pos && !ref2->checked ) break; } if ( ref2==NULL ) return( false ); ref2->checked = true; } return( true ); } static int RefTransformsMatch(SplineChar *sc1, SplineChar *sc2) { /* Apple only provides a means to change the translation of a reference */ /* so if rotation, skewing, scaling, etc. differ then we can't deal with */ /* it. */ RefChar *r1 = sc1->layers[ly_fore].refs; RefChar *r2 = sc2->layers[ly_fore].refs; while ( r1!=NULL && r2!=NULL ) { if ( r1->transform[0]!=r2->transform[0] || r1->transform[1]!=r2->transform[1] || r1->transform[2]!=r2->transform[2] || r1->transform[3]!=r2->transform[3] ) return( false ); r1 = r1->next; r2 = r2->next; } return( true ); } static int HintsMatch(StemInfo *h1,StemInfo *h2) { while ( h1!=NULL && h2!=NULL ) { h1 = h1->next; h2 = h2->next; } return ( h1==NULL && h2==NULL ); } 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->orig_pos==k1->sc->orig_pos && !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]->layers[ly_fore].order2 != mm->apple ) { return( false ); } sf = mm->apple ? mm->normal : mm->instances[0]; if ( !mm->apple && PSDictHasEntry(sf->private,"ForceBold")!=NULL && PSDictHasEntry(mm->normal->private,"ForceBoldThreshold")==NULL) { return( false ); } for ( j=mm->apple ? 0 : 1; jinstance_count; ++j ) { if ( sf->glyphcnt!=mm->instances[j]->glyphcnt ) { return( false ); } else if ( sf->layers[ly_fore].order2!=mm->instances[j]->layers[ly_fore].order2 ) { return( false ); } if ( !mm->apple ) { if ( PSDictHasEntry(mm->instances[j]->private,"ForceBold")!=NULL && PSDictHasEntry(mm->normal->private,"ForceBoldThreshold")==NULL) { return( false ); } for ( i=0; arrnames[i]!=NULL; ++i ) { if ( ArrayCount(PSDictHasEntry(mm->instances[j]->private,arrnames[i]))!= ArrayCount(PSDictHasEntry(sf->private,arrnames[i])) ) { return( false ); } } } } for ( i=0; iglyphcnt; ++i ) { for ( j=mm->apple?0:1; jinstance_count; ++j ) { if ( SCWorthOutputting(sf->glyphs[i])!=SCWorthOutputting(mm->instances[j]->glyphs[i]) ) { return( false ); } } if ( SCWorthOutputting(sf->glyphs[i]) ) { if ( mm->apple && sf->glyphs[i]->layers[ly_fore].refs!=NULL && sf->glyphs[i]->layers[ly_fore].splines!=NULL ) { return( false ); } for ( j=mm->apple?0:1; jinstance_count; ++j ) { if ( mm->apple && mm->instances[j]->glyphs[i]->layers[ly_fore].refs!=NULL && mm->instances[j]->glyphs[i]->layers[ly_fore].splines!=NULL ) { return( false ); } if ( ContourCount(sf->glyphs[i])!=ContourCount(mm->instances[j]->glyphs[i])) { return( false ); } else if ( !mm->apple && !ContourPtMatch(sf->glyphs[i],mm->instances[j]->glyphs[i])) { return( false ); } else if ( !ContourDirMatch(sf->glyphs[i],mm->instances[j]->glyphs[i])) { return( false ); } else if ( !RefMatch(sf->glyphs[i],mm->instances[j]->glyphs[i])) { return( false ); } else if ( mm->apple && !RefTransformsMatch(sf->glyphs[i],mm->instances[j]->glyphs[i])) { return( false ); } else if ( !mm->apple && !KernsMatch(sf->glyphs[i],mm->instances[j]->glyphs[i])) { return( false ); } } if ( mm->apple && !ContourPtNumMatch(mm,i)) { return( false ); } if ( !mm->apple ) { for ( j=1; jinstance_count; ++j ) { if ( !HintsMatch(sf->glyphs[i]->hstem,mm->instances[j]->glyphs[i]->hstem)) { return( false ); } else if ( !HintsMatch(sf->glyphs[i]->vstem,mm->instances[j]->glyphs[i]->vstem)) { return( false ); } } for ( j=1; jinstance_count; ++j ) { if ( !ContourHintMaskMatch(sf->glyphs[i],mm->instances[j]->glyphs[i])) { return( false ); } } } } } if ( mm->apple ) { struct ttf_table *cvt; for ( cvt = mm->normal->ttf_tables; cvt!=NULL && cvt->tag!=CHR('c','v','t',' '); cvt=cvt->next ); if ( cvt==NULL ) { for ( j=0; jinstance_count; ++j ) { if ( mm->instances[j]->ttf_tables!=NULL ) { return( false ); } } } else { /* Not all instances are required to have cvts, but any that do */ /* must be the same size */ for ( j=0; jinstance_count; ++j ) { if ( mm->instances[j]->ttf_tables!=NULL && (mm->instances[j]->ttf_tables->next!=NULL || mm->instances[j]->ttf_tables->tag!=CHR('c','v','t',' '))) { return( false ); } if ( mm->instances[j]->ttf_tables!=NULL && mm->instances[j]->ttf_tables->len!=cvt->len ) { return( false ); } } } } return( true ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/utype.c0000664000175000017500000725652013510660062015732 00000000000000/* Copyright: 2001 George Williams */ /* License: BSD-3-clause */ /* Contributions: Werner Lemberg, Khaled Hosny, Joe Da Silva */ #include "utype.h" /* This file was generated using the program 'makeutype' */ const unsigned short ____tolower[]= { 0, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x0000 */ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x0040 */ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, /* 0x0080 */ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, /* 0x00c0 */ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00d7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, 0x0101, 0x0101, 0x0103, 0x0103, 0x0105, 0x0105, 0x0107, 0x0107, /* 0x0100 */ 0x0109, 0x0109, 0x010b, 0x010b, 0x010d, 0x010d, 0x010f, 0x010f, 0x0111, 0x0111, 0x0113, 0x0113, 0x0115, 0x0115, 0x0117, 0x0117, 0x0119, 0x0119, 0x011b, 0x011b, 0x011d, 0x011d, 0x011f, 0x011f, 0x0121, 0x0121, 0x0123, 0x0123, 0x0125, 0x0125, 0x0127, 0x0127, 0x0129, 0x0129, 0x012b, 0x012b, 0x012d, 0x012d, 0x012f, 0x012f, 0x0069, 0x0131, 0x0133, 0x0133, 0x0135, 0x0135, 0x0137, 0x0137, 0x0138, 0x013a, 0x013a, 0x013c, 0x013c, 0x013e, 0x013e, 0x0140, 0x0140, 0x0142, 0x0142, 0x0144, 0x0144, 0x0146, 0x0146, 0x0148, /* 0x0140 */ 0x0148, 0x0149, 0x014b, 0x014b, 0x014d, 0x014d, 0x014f, 0x014f, 0x0151, 0x0151, 0x0153, 0x0153, 0x0155, 0x0155, 0x0157, 0x0157, 0x0159, 0x0159, 0x015b, 0x015b, 0x015d, 0x015d, 0x015f, 0x015f, 0x0161, 0x0161, 0x0163, 0x0163, 0x0165, 0x0165, 0x0167, 0x0167, 0x0169, 0x0169, 0x016b, 0x016b, 0x016d, 0x016d, 0x016f, 0x016f, 0x0171, 0x0171, 0x0173, 0x0173, 0x0175, 0x0175, 0x0177, 0x0177, 0x00ff, 0x017a, 0x017a, 0x017c, 0x017c, 0x017e, 0x017e, 0x017f, 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, /* 0x0180 */ 0x0188, 0x0256, 0x0257, 0x018c, 0x018c, 0x018d, 0x01dd, 0x0259, 0x025b, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, 0x0199, 0x0199, 0x019a, 0x019b, 0x026f, 0x0272, 0x019e, 0x0275, 0x01a1, 0x01a1, 0x01a3, 0x01a3, 0x01a5, 0x01a5, 0x0280, 0x01a8, 0x01a8, 0x0283, 0x01aa, 0x01ab, 0x01ad, 0x01ad, 0x0288, 0x01b0, 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b4, 0x01b6, 0x01b6, 0x0292, 0x01b9, 0x01b9, 0x01ba, 0x01bb, 0x01bd, 0x01bd, 0x01be, 0x01bf, 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c6, 0x01c6, 0x01c6, 0x01c9, /* 0x01c0 */ 0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01cc, 0x01ce, 0x01ce, 0x01d0, 0x01d0, 0x01d2, 0x01d2, 0x01d4, 0x01d4, 0x01d6, 0x01d6, 0x01d8, 0x01d8, 0x01da, 0x01da, 0x01dc, 0x01dc, 0x01dd, 0x01df, 0x01df, 0x01e1, 0x01e1, 0x01e3, 0x01e3, 0x01e5, 0x01e5, 0x01e7, 0x01e7, 0x01e9, 0x01e9, 0x01eb, 0x01eb, 0x01ed, 0x01ed, 0x01ef, 0x01ef, 0x01f0, 0x01f3, 0x01f3, 0x01f3, 0x01f5, 0x01f5, 0x0195, 0x01bf, 0x01f9, 0x01f9, 0x01fb, 0x01fb, 0x01fd, 0x01fd, 0x01ff, 0x01ff, 0x0201, 0x0201, 0x0203, 0x0203, 0x0205, 0x0205, 0x0207, 0x0207, /* 0x0200 */ 0x0209, 0x0209, 0x020b, 0x020b, 0x020d, 0x020d, 0x020f, 0x020f, 0x0211, 0x0211, 0x0213, 0x0213, 0x0215, 0x0215, 0x0217, 0x0217, 0x0219, 0x0219, 0x021b, 0x021b, 0x021d, 0x021d, 0x021f, 0x021f, 0x019e, 0x0221, 0x0223, 0x0223, 0x0225, 0x0225, 0x0227, 0x0227, 0x0229, 0x0229, 0x022b, 0x022b, 0x022d, 0x022d, 0x022f, 0x022f, 0x0231, 0x0231, 0x0233, 0x0233, 0x0234, 0x0235, 0x0236, 0x0237, 0x0238, 0x0239, 0x2c65, 0x023c, 0x023c, 0x019a, 0x2c66, 0x023f, 0x0240, 0x0242, 0x0242, 0x0180, 0x0289, 0x028c, 0x0247, 0x0247, /* 0x0240 */ 0x0249, 0x0249, 0x024b, 0x024b, 0x024d, 0x024d, 0x024f, 0x024f, 0x0250, 0x0251, 0x0252, 0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0258, 0x0259, 0x025a, 0x025b, 0x025c, 0x025d, 0x025e, 0x025f, 0x0260, 0x0261, 0x0262, 0x0263, 0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e, 0x026f, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x027d, 0x027e, 0x027f, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0286, 0x0287, /* 0x0280 */ 0x0288, 0x0289, 0x028a, 0x028b, 0x028c, 0x028d, 0x028e, 0x028f, 0x0290, 0x0291, 0x0292, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, 0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, /* 0x02c0 */ 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff, 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, /* 0x0300 */ 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, /* 0x0340 */ 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, 0x0371, 0x0371, 0x0373, 0x0373, 0x0374, 0x0375, 0x0377, 0x0377, 0x0000, 0x0000, 0x037a, 0x037b, 0x037c, 0x037d, 0x037e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0384, 0x0385, 0x03ac, 0x0387, /* 0x0380 */ 0x03ad, 0x03ae, 0x03af, 0x0000, 0x03cc, 0x0000, 0x03cd, 0x03ce, 0x0390, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x0000, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, /* 0x03c0 */ 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x03d7, 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7, 0x03d9, 0x03d9, 0x03db, 0x03db, 0x03dd, 0x03dd, 0x03df, 0x03df, 0x03e1, 0x03e1, 0x03e3, 0x03e3, 0x03e5, 0x03e5, 0x03e7, 0x03e7, 0x03e9, 0x03e9, 0x03eb, 0x03eb, 0x03ed, 0x03ed, 0x03ef, 0x03ef, 0x03f0, 0x03f1, 0x03f2, 0x03f3, 0x03b8, 0x03f5, 0x03f6, 0x03f8, 0x03f8, 0x03f2, 0x03fb, 0x03fb, 0x03fc, 0x037b, 0x037c, 0x037d, 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, /* 0x0400 */ 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0x0440 */ 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, 0x0469, 0x0469, 0x046b, 0x046b, 0x046d, 0x046d, 0x046f, 0x046f, 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0477, 0x0477, 0x0479, 0x0479, 0x047b, 0x047b, 0x047d, 0x047d, 0x047f, 0x047f, 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, /* 0x0480 */ 0x0488, 0x0489, 0x048b, 0x048b, 0x048d, 0x048d, 0x048f, 0x048f, 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, 0x0499, 0x0499, 0x049b, 0x049b, 0x049d, 0x049d, 0x049f, 0x049f, 0x04a1, 0x04a1, 0x04a3, 0x04a3, 0x04a5, 0x04a5, 0x04a7, 0x04a7, 0x04a9, 0x04a9, 0x04ab, 0x04ab, 0x04ad, 0x04ad, 0x04af, 0x04af, 0x04b1, 0x04b1, 0x04b3, 0x04b3, 0x04b5, 0x04b5, 0x04b7, 0x04b7, 0x04b9, 0x04b9, 0x04bb, 0x04bb, 0x04bd, 0x04bd, 0x04bf, 0x04bf, 0x04cf, 0x04c2, 0x04c2, 0x04c4, 0x04c4, 0x04c6, 0x04c6, 0x04c8, /* 0x04c0 */ 0x04c8, 0x04ca, 0x04ca, 0x04cc, 0x04cc, 0x04ce, 0x04ce, 0x04cf, 0x04d1, 0x04d1, 0x04d3, 0x04d3, 0x04d5, 0x04d5, 0x04d7, 0x04d7, 0x04d9, 0x04d9, 0x04db, 0x04db, 0x04dd, 0x04dd, 0x04df, 0x04df, 0x04e1, 0x04e1, 0x04e3, 0x04e3, 0x04e5, 0x04e5, 0x04e7, 0x04e7, 0x04e9, 0x04e9, 0x04eb, 0x04eb, 0x04ed, 0x04ed, 0x04ef, 0x04ef, 0x04f1, 0x04f1, 0x04f3, 0x04f3, 0x04f5, 0x04f5, 0x04f7, 0x04f7, 0x04f9, 0x04f9, 0x04fb, 0x04fb, 0x04fd, 0x04fd, 0x04ff, 0x04ff, 0x0501, 0x0501, 0x0503, 0x0503, 0x0505, 0x0505, 0x0507, 0x0507, /* 0x0500 */ 0x0509, 0x0509, 0x050b, 0x050b, 0x050d, 0x050d, 0x050f, 0x050f, 0x0511, 0x0511, 0x0513, 0x0513, 0x0515, 0x0515, 0x0517, 0x0517, 0x0519, 0x0519, 0x051b, 0x051b, 0x051d, 0x051d, 0x051f, 0x051f, 0x0521, 0x0521, 0x0523, 0x0523, 0x0525, 0x0525, 0x0527, 0x0527, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, /* 0x0540 */ 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0000, 0x0000, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f, 0x0000, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, 0x056d, 0x056e, 0x056f, 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, 0x057d, 0x057e, 0x057f, 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, /* 0x0580 */ 0x0000, 0x0589, 0x058a, 0x0000, 0x0000, 0x0000, 0x0000, 0x058f, 0x0000, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, 0x0598, 0x0599, 0x059a, 0x059b, 0x059c, 0x059d, 0x059e, 0x059f, 0x05a0, 0x05a1, 0x05a2, 0x05a3, 0x05a4, 0x05a5, 0x05a6, 0x05a7, 0x05a8, 0x05a9, 0x05aa, 0x05ab, 0x05ac, 0x05ad, 0x05ae, 0x05af, 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0x05ba, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05c4, 0x05c5, 0x05c6, 0x05c7, /* 0x05c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0600, 0x0601, 0x0602, 0x0603, 0x0604, 0x0000, 0x0606, 0x0607, /* 0x0600 */ 0x0608, 0x0609, 0x060a, 0x060b, 0x060c, 0x060d, 0x060e, 0x060f, 0x0610, 0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616, 0x0617, 0x0618, 0x0619, 0x061a, 0x061b, 0x061c, 0x0000, 0x061e, 0x061f, 0x0620, 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, 0x063b, 0x063c, 0x063d, 0x063e, 0x063f, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, /* 0x0640 */ 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0656, 0x0657, 0x0658, 0x0659, 0x065a, 0x065b, 0x065c, 0x065d, 0x065e, 0x065f, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0x066a, 0x066b, 0x066c, 0x066d, 0x066e, 0x066f, 0x0670, 0x0671, 0x0672, 0x0673, 0x0674, 0x0675, 0x0676, 0x0677, 0x0678, 0x0679, 0x067a, 0x067b, 0x067c, 0x067d, 0x067e, 0x067f, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0686, 0x0687, /* 0x0680 */ 0x0688, 0x0689, 0x068a, 0x068b, 0x068c, 0x068d, 0x068e, 0x068f, 0x0690, 0x0691, 0x0692, 0x0693, 0x0694, 0x0695, 0x0696, 0x0697, 0x0698, 0x0699, 0x069a, 0x069b, 0x069c, 0x069d, 0x069e, 0x069f, 0x06a0, 0x06a1, 0x06a2, 0x06a3, 0x06a4, 0x06a5, 0x06a6, 0x06a7, 0x06a8, 0x06a9, 0x06aa, 0x06ab, 0x06ac, 0x06ad, 0x06ae, 0x06af, 0x06b0, 0x06b1, 0x06b2, 0x06b3, 0x06b4, 0x06b5, 0x06b6, 0x06b7, 0x06b8, 0x06b9, 0x06ba, 0x06bb, 0x06bc, 0x06bd, 0x06be, 0x06bf, 0x06c0, 0x06c1, 0x06c2, 0x06c3, 0x06c4, 0x06c5, 0x06c6, 0x06c7, /* 0x06c0 */ 0x06c8, 0x06c9, 0x06ca, 0x06cb, 0x06cc, 0x06cd, 0x06ce, 0x06cf, 0x06d0, 0x06d1, 0x06d2, 0x06d3, 0x06d4, 0x06d5, 0x06d6, 0x06d7, 0x06d8, 0x06d9, 0x06da, 0x06db, 0x06dc, 0x06dd, 0x06de, 0x06df, 0x06e0, 0x06e1, 0x06e2, 0x06e3, 0x06e4, 0x06e5, 0x06e6, 0x06e7, 0x06e8, 0x06e9, 0x06ea, 0x06eb, 0x06ec, 0x06ed, 0x06ee, 0x06ef, 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, 0x06f8, 0x06f9, 0x06fa, 0x06fb, 0x06fc, 0x06fd, 0x06fe, 0x06ff, 0x0700, 0x0701, 0x0702, 0x0703, 0x0704, 0x0705, 0x0706, 0x0707, /* 0x0700 */ 0x0708, 0x0709, 0x070a, 0x070b, 0x070c, 0x070d, 0x0000, 0x070f, 0x0710, 0x0711, 0x0712, 0x0713, 0x0714, 0x0715, 0x0716, 0x0717, 0x0718, 0x0719, 0x071a, 0x071b, 0x071c, 0x071d, 0x071e, 0x071f, 0x0720, 0x0721, 0x0722, 0x0723, 0x0724, 0x0725, 0x0726, 0x0727, 0x0728, 0x0729, 0x072a, 0x072b, 0x072c, 0x072d, 0x072e, 0x072f, 0x0730, 0x0731, 0x0732, 0x0733, 0x0734, 0x0735, 0x0736, 0x0737, 0x0738, 0x0739, 0x073a, 0x073b, 0x073c, 0x073d, 0x073e, 0x073f, 0x0740, 0x0741, 0x0742, 0x0743, 0x0744, 0x0745, 0x0746, 0x0747, /* 0x0740 */ 0x0748, 0x0749, 0x074a, 0x0000, 0x0000, 0x074d, 0x074e, 0x074f, 0x0750, 0x0751, 0x0752, 0x0753, 0x0754, 0x0755, 0x0756, 0x0757, 0x0758, 0x0759, 0x075a, 0x075b, 0x075c, 0x075d, 0x075e, 0x075f, 0x0760, 0x0761, 0x0762, 0x0763, 0x0764, 0x0765, 0x0766, 0x0767, 0x0768, 0x0769, 0x076a, 0x076b, 0x076c, 0x076d, 0x076e, 0x076f, 0x0770, 0x0771, 0x0772, 0x0773, 0x0774, 0x0775, 0x0776, 0x0777, 0x0778, 0x0779, 0x077a, 0x077b, 0x077c, 0x077d, 0x077e, 0x077f, 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0786, 0x0787, /* 0x0780 */ 0x0788, 0x0789, 0x078a, 0x078b, 0x078c, 0x078d, 0x078e, 0x078f, 0x0790, 0x0791, 0x0792, 0x0793, 0x0794, 0x0795, 0x0796, 0x0797, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 0x079e, 0x079f, 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a6, 0x07a7, 0x07a8, 0x07a9, 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07ae, 0x07af, 0x07b0, 0x07b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07c0, 0x07c1, 0x07c2, 0x07c3, 0x07c4, 0x07c5, 0x07c6, 0x07c7, /* 0x07c0 */ 0x07c8, 0x07c9, 0x07ca, 0x07cb, 0x07cc, 0x07cd, 0x07ce, 0x07cf, 0x07d0, 0x07d1, 0x07d2, 0x07d3, 0x07d4, 0x07d5, 0x07d6, 0x07d7, 0x07d8, 0x07d9, 0x07da, 0x07db, 0x07dc, 0x07dd, 0x07de, 0x07df, 0x07e0, 0x07e1, 0x07e2, 0x07e3, 0x07e4, 0x07e5, 0x07e6, 0x07e7, 0x07e8, 0x07e9, 0x07ea, 0x07eb, 0x07ec, 0x07ed, 0x07ee, 0x07ef, 0x07f0, 0x07f1, 0x07f2, 0x07f3, 0x07f4, 0x07f5, 0x07f6, 0x07f7, 0x07f8, 0x07f9, 0x07fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0800, 0x0801, 0x0802, 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, /* 0x0800 */ 0x0808, 0x0809, 0x080a, 0x080b, 0x080c, 0x080d, 0x080e, 0x080f, 0x0810, 0x0811, 0x0812, 0x0813, 0x0814, 0x0815, 0x0816, 0x0817, 0x0818, 0x0819, 0x081a, 0x081b, 0x081c, 0x081d, 0x081e, 0x081f, 0x0820, 0x0821, 0x0822, 0x0823, 0x0824, 0x0825, 0x0826, 0x0827, 0x0828, 0x0829, 0x082a, 0x082b, 0x082c, 0x082d, 0x0000, 0x0000, 0x0830, 0x0831, 0x0832, 0x0833, 0x0834, 0x0835, 0x0836, 0x0837, 0x0838, 0x0839, 0x083a, 0x083b, 0x083c, 0x083d, 0x083e, 0x0000, 0x0840, 0x0841, 0x0842, 0x0843, 0x0844, 0x0845, 0x0846, 0x0847, /* 0x0840 */ 0x0848, 0x0849, 0x084a, 0x084b, 0x084c, 0x084d, 0x084e, 0x084f, 0x0850, 0x0851, 0x0852, 0x0853, 0x0854, 0x0855, 0x0856, 0x0857, 0x0858, 0x0859, 0x085a, 0x085b, 0x0000, 0x0000, 0x085e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08a0, 0x0000, 0x08a2, 0x08a3, 0x08a4, 0x08a5, 0x08a6, 0x08a7, 0x08a8, 0x08a9, 0x08aa, 0x08ab, 0x08ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x08e4, 0x08e5, 0x08e6, 0x08e7, 0x08e8, 0x08e9, 0x08ea, 0x08eb, 0x08ec, 0x08ed, 0x08ee, 0x08ef, 0x08f0, 0x08f1, 0x08f2, 0x08f3, 0x08f4, 0x08f5, 0x08f6, 0x08f7, 0x08f8, 0x08f9, 0x08fa, 0x08fb, 0x08fc, 0x08fd, 0x08fe, 0x0000, 0x0900, 0x0901, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x0907, /* 0x0900 */ 0x0908, 0x0909, 0x090a, 0x090b, 0x090c, 0x090d, 0x090e, 0x090f, 0x0910, 0x0911, 0x0912, 0x0913, 0x0914, 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, 0x0930, 0x0931, 0x0932, 0x0933, 0x0934, 0x0935, 0x0936, 0x0937, 0x0938, 0x0939, 0x093a, 0x093b, 0x093c, 0x093d, 0x093e, 0x093f, 0x0940, 0x0941, 0x0942, 0x0943, 0x0944, 0x0945, 0x0946, 0x0947, /* 0x0940 */ 0x0948, 0x0949, 0x094a, 0x094b, 0x094c, 0x094d, 0x094e, 0x094f, 0x0950, 0x0951, 0x0952, 0x0953, 0x0954, 0x0955, 0x0956, 0x0957, 0x0958, 0x0959, 0x095a, 0x095b, 0x095c, 0x095d, 0x095e, 0x095f, 0x0960, 0x0961, 0x0962, 0x0963, 0x0964, 0x0965, 0x0966, 0x0967, 0x0968, 0x0969, 0x096a, 0x096b, 0x096c, 0x096d, 0x096e, 0x096f, 0x0970, 0x0971, 0x0972, 0x0973, 0x0974, 0x0975, 0x0976, 0x0977, 0x0000, 0x0979, 0x097a, 0x097b, 0x097c, 0x097d, 0x097e, 0x097f, 0x0000, 0x0981, 0x0982, 0x0983, 0x0000, 0x0985, 0x0986, 0x0987, /* 0x0980 */ 0x0988, 0x0989, 0x098a, 0x098b, 0x098c, 0x0000, 0x0000, 0x098f, 0x0990, 0x0000, 0x0000, 0x0993, 0x0994, 0x0995, 0x0996, 0x0997, 0x0998, 0x0999, 0x099a, 0x099b, 0x099c, 0x099d, 0x099e, 0x099f, 0x09a0, 0x09a1, 0x09a2, 0x09a3, 0x09a4, 0x09a5, 0x09a6, 0x09a7, 0x09a8, 0x0000, 0x09aa, 0x09ab, 0x09ac, 0x09ad, 0x09ae, 0x09af, 0x09b0, 0x0000, 0x09b2, 0x0000, 0x0000, 0x0000, 0x09b6, 0x09b7, 0x09b8, 0x09b9, 0x0000, 0x0000, 0x09bc, 0x09bd, 0x09be, 0x09bf, 0x09c0, 0x09c1, 0x09c2, 0x09c3, 0x09c4, 0x0000, 0x0000, 0x09c7, /* 0x09c0 */ 0x09c8, 0x0000, 0x0000, 0x09cb, 0x09cc, 0x09cd, 0x09ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x09d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x09dc, 0x09dd, 0x0000, 0x09df, 0x09e0, 0x09e1, 0x09e2, 0x09e3, 0x0000, 0x0000, 0x09e6, 0x09e7, 0x09e8, 0x09e9, 0x09ea, 0x09eb, 0x09ec, 0x09ed, 0x09ee, 0x09ef, 0x09f0, 0x09f1, 0x09f2, 0x09f3, 0x09f4, 0x09f5, 0x09f6, 0x09f7, 0x09f8, 0x09f9, 0x09fa, 0x09fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a01, 0x0a02, 0x0a03, 0x0000, 0x0a05, 0x0a06, 0x0a07, /* 0x0a00 */ 0x0a08, 0x0a09, 0x0a0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a0f, 0x0a10, 0x0000, 0x0000, 0x0a13, 0x0a14, 0x0a15, 0x0a16, 0x0a17, 0x0a18, 0x0a19, 0x0a1a, 0x0a1b, 0x0a1c, 0x0a1d, 0x0a1e, 0x0a1f, 0x0a20, 0x0a21, 0x0a22, 0x0a23, 0x0a24, 0x0a25, 0x0a26, 0x0a27, 0x0a28, 0x0000, 0x0a2a, 0x0a2b, 0x0a2c, 0x0a2d, 0x0a2e, 0x0a2f, 0x0a30, 0x0000, 0x0a32, 0x0a33, 0x0000, 0x0a35, 0x0a36, 0x0000, 0x0a38, 0x0a39, 0x0000, 0x0000, 0x0a3c, 0x0000, 0x0a3e, 0x0a3f, 0x0a40, 0x0a41, 0x0a42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a47, /* 0x0a40 */ 0x0a48, 0x0000, 0x0000, 0x0a4b, 0x0a4c, 0x0a4d, 0x0000, 0x0000, 0x0000, 0x0a51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a59, 0x0a5a, 0x0a5b, 0x0a5c, 0x0000, 0x0a5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a66, 0x0a67, 0x0a68, 0x0a69, 0x0a6a, 0x0a6b, 0x0a6c, 0x0a6d, 0x0a6e, 0x0a6f, 0x0a70, 0x0a71, 0x0a72, 0x0a73, 0x0a74, 0x0a75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0a81, 0x0a82, 0x0a83, 0x0000, 0x0a85, 0x0a86, 0x0a87, /* 0x0a80 */ 0x0a88, 0x0a89, 0x0a8a, 0x0a8b, 0x0a8c, 0x0a8d, 0x0000, 0x0a8f, 0x0a90, 0x0a91, 0x0000, 0x0a93, 0x0a94, 0x0a95, 0x0a96, 0x0a97, 0x0a98, 0x0a99, 0x0a9a, 0x0a9b, 0x0a9c, 0x0a9d, 0x0a9e, 0x0a9f, 0x0aa0, 0x0aa1, 0x0aa2, 0x0aa3, 0x0aa4, 0x0aa5, 0x0aa6, 0x0aa7, 0x0aa8, 0x0000, 0x0aaa, 0x0aab, 0x0aac, 0x0aad, 0x0aae, 0x0aaf, 0x0ab0, 0x0000, 0x0ab2, 0x0ab3, 0x0000, 0x0ab5, 0x0ab6, 0x0ab7, 0x0ab8, 0x0ab9, 0x0000, 0x0000, 0x0abc, 0x0abd, 0x0abe, 0x0abf, 0x0ac0, 0x0ac1, 0x0ac2, 0x0ac3, 0x0ac4, 0x0ac5, 0x0000, 0x0ac7, /* 0x0ac0 */ 0x0ac8, 0x0ac9, 0x0000, 0x0acb, 0x0acc, 0x0acd, 0x0000, 0x0000, 0x0ad0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ae0, 0x0ae1, 0x0ae2, 0x0ae3, 0x0000, 0x0000, 0x0ae6, 0x0ae7, 0x0ae8, 0x0ae9, 0x0aea, 0x0aeb, 0x0aec, 0x0aed, 0x0aee, 0x0aef, 0x0af0, 0x0af1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b01, 0x0b02, 0x0b03, 0x0000, 0x0b05, 0x0b06, 0x0b07, /* 0x0b00 */ 0x0b08, 0x0b09, 0x0b0a, 0x0b0b, 0x0b0c, 0x0000, 0x0000, 0x0b0f, 0x0b10, 0x0000, 0x0000, 0x0b13, 0x0b14, 0x0b15, 0x0b16, 0x0b17, 0x0b18, 0x0b19, 0x0b1a, 0x0b1b, 0x0b1c, 0x0b1d, 0x0b1e, 0x0b1f, 0x0b20, 0x0b21, 0x0b22, 0x0b23, 0x0b24, 0x0b25, 0x0b26, 0x0b27, 0x0b28, 0x0000, 0x0b2a, 0x0b2b, 0x0b2c, 0x0b2d, 0x0b2e, 0x0b2f, 0x0b30, 0x0000, 0x0b32, 0x0b33, 0x0000, 0x0b35, 0x0b36, 0x0b37, 0x0b38, 0x0b39, 0x0000, 0x0000, 0x0b3c, 0x0b3d, 0x0b3e, 0x0b3f, 0x0b40, 0x0b41, 0x0b42, 0x0b43, 0x0b44, 0x0000, 0x0000, 0x0b47, /* 0x0b40 */ 0x0b48, 0x0000, 0x0000, 0x0b4b, 0x0b4c, 0x0b4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b56, 0x0b57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b5c, 0x0b5d, 0x0000, 0x0b5f, 0x0b60, 0x0b61, 0x0b62, 0x0b63, 0x0000, 0x0000, 0x0b66, 0x0b67, 0x0b68, 0x0b69, 0x0b6a, 0x0b6b, 0x0b6c, 0x0b6d, 0x0b6e, 0x0b6f, 0x0b70, 0x0b71, 0x0b72, 0x0b73, 0x0b74, 0x0b75, 0x0b76, 0x0b77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0b82, 0x0b83, 0x0000, 0x0b85, 0x0b86, 0x0b87, /* 0x0b80 */ 0x0b88, 0x0b89, 0x0b8a, 0x0000, 0x0000, 0x0000, 0x0b8e, 0x0b8f, 0x0b90, 0x0000, 0x0b92, 0x0b93, 0x0b94, 0x0b95, 0x0000, 0x0000, 0x0000, 0x0b99, 0x0b9a, 0x0000, 0x0b9c, 0x0000, 0x0b9e, 0x0b9f, 0x0000, 0x0000, 0x0000, 0x0ba3, 0x0ba4, 0x0000, 0x0000, 0x0000, 0x0ba8, 0x0ba9, 0x0baa, 0x0000, 0x0000, 0x0000, 0x0bae, 0x0baf, 0x0bb0, 0x0bb1, 0x0bb2, 0x0bb3, 0x0bb4, 0x0bb5, 0x0bb6, 0x0bb7, 0x0bb8, 0x0bb9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bbe, 0x0bbf, 0x0bc0, 0x0bc1, 0x0bc2, 0x0000, 0x0000, 0x0000, 0x0bc6, 0x0bc7, /* 0x0bc0 */ 0x0bc8, 0x0000, 0x0bca, 0x0bcb, 0x0bcc, 0x0bcd, 0x0000, 0x0000, 0x0bd0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0bd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0be6, 0x0be7, 0x0be8, 0x0be9, 0x0bea, 0x0beb, 0x0bec, 0x0bed, 0x0bee, 0x0bef, 0x0bf0, 0x0bf1, 0x0bf2, 0x0bf3, 0x0bf4, 0x0bf5, 0x0bf6, 0x0bf7, 0x0bf8, 0x0bf9, 0x0bfa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c01, 0x0c02, 0x0c03, 0x0000, 0x0c05, 0x0c06, 0x0c07, /* 0x0c00 */ 0x0c08, 0x0c09, 0x0c0a, 0x0c0b, 0x0c0c, 0x0000, 0x0c0e, 0x0c0f, 0x0c10, 0x0000, 0x0c12, 0x0c13, 0x0c14, 0x0c15, 0x0c16, 0x0c17, 0x0c18, 0x0c19, 0x0c1a, 0x0c1b, 0x0c1c, 0x0c1d, 0x0c1e, 0x0c1f, 0x0c20, 0x0c21, 0x0c22, 0x0c23, 0x0c24, 0x0c25, 0x0c26, 0x0c27, 0x0c28, 0x0000, 0x0c2a, 0x0c2b, 0x0c2c, 0x0c2d, 0x0c2e, 0x0c2f, 0x0c30, 0x0c31, 0x0c32, 0x0c33, 0x0000, 0x0c35, 0x0c36, 0x0c37, 0x0c38, 0x0c39, 0x0000, 0x0000, 0x0000, 0x0c3d, 0x0c3e, 0x0c3f, 0x0c40, 0x0c41, 0x0c42, 0x0c43, 0x0c44, 0x0000, 0x0c46, 0x0c47, /* 0x0c40 */ 0x0c48, 0x0000, 0x0c4a, 0x0c4b, 0x0c4c, 0x0c4d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c55, 0x0c56, 0x0000, 0x0c58, 0x0c59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c60, 0x0c61, 0x0c62, 0x0c63, 0x0000, 0x0000, 0x0c66, 0x0c67, 0x0c68, 0x0c69, 0x0c6a, 0x0c6b, 0x0c6c, 0x0c6d, 0x0c6e, 0x0c6f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0c78, 0x0c79, 0x0c7a, 0x0c7b, 0x0c7c, 0x0c7d, 0x0c7e, 0x0c7f, 0x0000, 0x0000, 0x0c82, 0x0c83, 0x0000, 0x0c85, 0x0c86, 0x0c87, /* 0x0c80 */ 0x0c88, 0x0c89, 0x0c8a, 0x0c8b, 0x0c8c, 0x0000, 0x0c8e, 0x0c8f, 0x0c90, 0x0000, 0x0c92, 0x0c93, 0x0c94, 0x0c95, 0x0c96, 0x0c97, 0x0c98, 0x0c99, 0x0c9a, 0x0c9b, 0x0c9c, 0x0c9d, 0x0c9e, 0x0c9f, 0x0ca0, 0x0ca1, 0x0ca2, 0x0ca3, 0x0ca4, 0x0ca5, 0x0ca6, 0x0ca7, 0x0ca8, 0x0000, 0x0caa, 0x0cab, 0x0cac, 0x0cad, 0x0cae, 0x0caf, 0x0cb0, 0x0cb1, 0x0cb2, 0x0cb3, 0x0000, 0x0cb5, 0x0cb6, 0x0cb7, 0x0cb8, 0x0cb9, 0x0000, 0x0000, 0x0cbc, 0x0cbd, 0x0cbe, 0x0cbf, 0x0cc0, 0x0cc1, 0x0cc2, 0x0cc3, 0x0cc4, 0x0000, 0x0cc6, 0x0cc7, /* 0x0cc0 */ 0x0cc8, 0x0000, 0x0cca, 0x0ccb, 0x0ccc, 0x0ccd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0cd5, 0x0cd6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0cde, 0x0000, 0x0ce0, 0x0ce1, 0x0ce2, 0x0ce3, 0x0000, 0x0000, 0x0ce6, 0x0ce7, 0x0ce8, 0x0ce9, 0x0cea, 0x0ceb, 0x0cec, 0x0ced, 0x0cee, 0x0cef, 0x0000, 0x0cf1, 0x0cf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d02, 0x0d03, 0x0000, 0x0d05, 0x0d06, 0x0d07, /* 0x0d00 */ 0x0d08, 0x0d09, 0x0d0a, 0x0d0b, 0x0d0c, 0x0000, 0x0d0e, 0x0d0f, 0x0d10, 0x0000, 0x0d12, 0x0d13, 0x0d14, 0x0d15, 0x0d16, 0x0d17, 0x0d18, 0x0d19, 0x0d1a, 0x0d1b, 0x0d1c, 0x0d1d, 0x0d1e, 0x0d1f, 0x0d20, 0x0d21, 0x0d22, 0x0d23, 0x0d24, 0x0d25, 0x0d26, 0x0d27, 0x0d28, 0x0d29, 0x0d2a, 0x0d2b, 0x0d2c, 0x0d2d, 0x0d2e, 0x0d2f, 0x0d30, 0x0d31, 0x0d32, 0x0d33, 0x0d34, 0x0d35, 0x0d36, 0x0d37, 0x0d38, 0x0d39, 0x0d3a, 0x0000, 0x0000, 0x0d3d, 0x0d3e, 0x0d3f, 0x0d40, 0x0d41, 0x0d42, 0x0d43, 0x0d44, 0x0000, 0x0d46, 0x0d47, /* 0x0d40 */ 0x0d48, 0x0000, 0x0d4a, 0x0d4b, 0x0d4c, 0x0d4d, 0x0d4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0d60, 0x0d61, 0x0d62, 0x0d63, 0x0000, 0x0000, 0x0d66, 0x0d67, 0x0d68, 0x0d69, 0x0d6a, 0x0d6b, 0x0d6c, 0x0d6d, 0x0d6e, 0x0d6f, 0x0d70, 0x0d71, 0x0d72, 0x0d73, 0x0d74, 0x0d75, 0x0000, 0x0000, 0x0000, 0x0d79, 0x0d7a, 0x0d7b, 0x0d7c, 0x0d7d, 0x0d7e, 0x0d7f, 0x0000, 0x0000, 0x0d82, 0x0d83, 0x0000, 0x0d85, 0x0d86, 0x0d87, /* 0x0d80 */ 0x0d88, 0x0d89, 0x0d8a, 0x0d8b, 0x0d8c, 0x0d8d, 0x0d8e, 0x0d8f, 0x0d90, 0x0d91, 0x0d92, 0x0d93, 0x0d94, 0x0d95, 0x0d96, 0x0000, 0x0000, 0x0000, 0x0d9a, 0x0d9b, 0x0d9c, 0x0d9d, 0x0d9e, 0x0d9f, 0x0da0, 0x0da1, 0x0da2, 0x0da3, 0x0da4, 0x0da5, 0x0da6, 0x0da7, 0x0da8, 0x0da9, 0x0daa, 0x0dab, 0x0dac, 0x0dad, 0x0dae, 0x0daf, 0x0db0, 0x0db1, 0x0000, 0x0db3, 0x0db4, 0x0db5, 0x0db6, 0x0db7, 0x0db8, 0x0db9, 0x0dba, 0x0dbb, 0x0000, 0x0dbd, 0x0000, 0x0000, 0x0dc0, 0x0dc1, 0x0dc2, 0x0dc3, 0x0dc4, 0x0dc5, 0x0dc6, 0x0000, /* 0x0dc0 */ 0x0000, 0x0000, 0x0dca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0dcf, 0x0dd0, 0x0dd1, 0x0dd2, 0x0dd3, 0x0dd4, 0x0000, 0x0dd6, 0x0000, 0x0dd8, 0x0dd9, 0x0dda, 0x0ddb, 0x0ddc, 0x0ddd, 0x0dde, 0x0ddf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0df2, 0x0df3, 0x0df4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, /* 0x0e00 */ 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, /* 0x0e40 */ 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e81, 0x0e82, 0x0000, 0x0e84, 0x0000, 0x0000, 0x0e87, /* 0x0e80 */ 0x0e88, 0x0000, 0x0e8a, 0x0000, 0x0000, 0x0e8d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0x0000, 0x0e99, 0x0e9a, 0x0e9b, 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, 0x0000, 0x0ea1, 0x0ea2, 0x0ea3, 0x0000, 0x0ea5, 0x0000, 0x0ea7, 0x0000, 0x0000, 0x0eaa, 0x0eab, 0x0000, 0x0ead, 0x0eae, 0x0eaf, 0x0eb0, 0x0eb1, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8, 0x0eb9, 0x0000, 0x0ebb, 0x0ebc, 0x0ebd, 0x0000, 0x0000, 0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0000, 0x0ec6, 0x0000, /* 0x0ec0 */ 0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0x0000, 0x0000, 0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7, 0x0ed8, 0x0ed9, 0x0000, 0x0000, 0x0edc, 0x0edd, 0x0ede, 0x0edf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, 0x0f07, /* 0x0f00 */ 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16, 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e, 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26, 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e, 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36, 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e, 0x0f3f, 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47, /* 0x0f40 */ 0x0000, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f, 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57, 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f, 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67, 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77, 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86, 0x0f87, /* 0x0f80 */ 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e, 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96, 0x0f97, 0x0000, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e, 0x0f9f, 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7, 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf, 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7, 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0000, 0x0fbe, 0x0fbf, 0x0fc0, 0x0fc1, 0x0fc2, 0x0fc3, 0x0fc4, 0x0fc5, 0x0fc6, 0x0fc7, /* 0x0fc0 */ 0x0fc8, 0x0fc9, 0x0fca, 0x0fcb, 0x0fcc, 0x0000, 0x0fce, 0x0fcf, 0x0fd0, 0x0fd1, 0x0fd2, 0x0fd3, 0x0fd4, 0x0fd5, 0x0fd6, 0x0fd7, 0x0fd8, 0x0fd9, 0x0fda, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, /* 0x1000 */ 0x1008, 0x1009, 0x100a, 0x100b, 0x100c, 0x100d, 0x100e, 0x100f, 0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, 0x1018, 0x1019, 0x101a, 0x101b, 0x101c, 0x101d, 0x101e, 0x101f, 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, 0x1028, 0x1029, 0x102a, 0x102b, 0x102c, 0x102d, 0x102e, 0x102f, 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, 0x1038, 0x1039, 0x103a, 0x103b, 0x103c, 0x103d, 0x103e, 0x103f, 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, /* 0x1040 */ 0x1048, 0x1049, 0x104a, 0x104b, 0x104c, 0x104d, 0x104e, 0x104f, 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, 0x1058, 0x1059, 0x105a, 0x105b, 0x105c, 0x105d, 0x105e, 0x105f, 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, 0x1068, 0x1069, 0x106a, 0x106b, 0x106c, 0x106d, 0x106e, 0x106f, 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, 0x1078, 0x1079, 0x107a, 0x107b, 0x107c, 0x107d, 0x107e, 0x107f, 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, /* 0x1080 */ 0x1088, 0x1089, 0x108a, 0x108b, 0x108c, 0x108d, 0x108e, 0x108f, 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, 0x1098, 0x1099, 0x109a, 0x109b, 0x109c, 0x109d, 0x109e, 0x109f, 0x2d00, 0x2d01, 0x2d02, 0x2d03, 0x2d04, 0x2d05, 0x2d06, 0x2d07, 0x2d08, 0x2d09, 0x2d0a, 0x2d0b, 0x2d0c, 0x2d0d, 0x2d0e, 0x2d0f, 0x2d10, 0x2d11, 0x2d12, 0x2d13, 0x2d14, 0x2d15, 0x2d16, 0x2d17, 0x2d18, 0x2d19, 0x2d1a, 0x2d1b, 0x2d1c, 0x2d1d, 0x2d1e, 0x2d1f, 0x2d20, 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x0000, 0x2d27, /* 0x10c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d2d, 0x0000, 0x0000, 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6, 0x10f7, 0x10f8, 0x10f9, 0x10fa, 0x10fb, 0x10fc, 0x10fd, 0x10fe, 0x10ff, 0x1100, 0x1101, 0x1102, 0x1103, 0x1104, 0x1105, 0x1106, 0x1107, /* 0x1100 */ 0x1108, 0x1109, 0x110a, 0x110b, 0x110c, 0x110d, 0x110e, 0x110f, 0x1110, 0x1111, 0x1112, 0x1113, 0x1114, 0x1115, 0x1116, 0x1117, 0x1118, 0x1119, 0x111a, 0x111b, 0x111c, 0x111d, 0x111e, 0x111f, 0x1120, 0x1121, 0x1122, 0x1123, 0x1124, 0x1125, 0x1126, 0x1127, 0x1128, 0x1129, 0x112a, 0x112b, 0x112c, 0x112d, 0x112e, 0x112f, 0x1130, 0x1131, 0x1132, 0x1133, 0x1134, 0x1135, 0x1136, 0x1137, 0x1138, 0x1139, 0x113a, 0x113b, 0x113c, 0x113d, 0x113e, 0x113f, 0x1140, 0x1141, 0x1142, 0x1143, 0x1144, 0x1145, 0x1146, 0x1147, /* 0x1140 */ 0x1148, 0x1149, 0x114a, 0x114b, 0x114c, 0x114d, 0x114e, 0x114f, 0x1150, 0x1151, 0x1152, 0x1153, 0x1154, 0x1155, 0x1156, 0x1157, 0x1158, 0x1159, 0x115a, 0x115b, 0x115c, 0x115d, 0x115e, 0x115f, 0x1160, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116a, 0x116b, 0x116c, 0x116d, 0x116e, 0x116f, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1176, 0x1177, 0x1178, 0x1179, 0x117a, 0x117b, 0x117c, 0x117d, 0x117e, 0x117f, 0x1180, 0x1181, 0x1182, 0x1183, 0x1184, 0x1185, 0x1186, 0x1187, /* 0x1180 */ 0x1188, 0x1189, 0x118a, 0x118b, 0x118c, 0x118d, 0x118e, 0x118f, 0x1190, 0x1191, 0x1192, 0x1193, 0x1194, 0x1195, 0x1196, 0x1197, 0x1198, 0x1199, 0x119a, 0x119b, 0x119c, 0x119d, 0x119e, 0x119f, 0x11a0, 0x11a1, 0x11a2, 0x11a3, 0x11a4, 0x11a5, 0x11a6, 0x11a7, 0x11a8, 0x11a9, 0x11aa, 0x11ab, 0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, 0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, 0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x11c3, 0x11c4, 0x11c5, 0x11c6, 0x11c7, /* 0x11c0 */ 0x11c8, 0x11c9, 0x11ca, 0x11cb, 0x11cc, 0x11cd, 0x11ce, 0x11cf, 0x11d0, 0x11d1, 0x11d2, 0x11d3, 0x11d4, 0x11d5, 0x11d6, 0x11d7, 0x11d8, 0x11d9, 0x11da, 0x11db, 0x11dc, 0x11dd, 0x11de, 0x11df, 0x11e0, 0x11e1, 0x11e2, 0x11e3, 0x11e4, 0x11e5, 0x11e6, 0x11e7, 0x11e8, 0x11e9, 0x11ea, 0x11eb, 0x11ec, 0x11ed, 0x11ee, 0x11ef, 0x11f0, 0x11f1, 0x11f2, 0x11f3, 0x11f4, 0x11f5, 0x11f6, 0x11f7, 0x11f8, 0x11f9, 0x11fa, 0x11fb, 0x11fc, 0x11fd, 0x11fe, 0x11ff, 0x1200, 0x1201, 0x1202, 0x1203, 0x1204, 0x1205, 0x1206, 0x1207, /* 0x1200 */ 0x1208, 0x1209, 0x120a, 0x120b, 0x120c, 0x120d, 0x120e, 0x120f, 0x1210, 0x1211, 0x1212, 0x1213, 0x1214, 0x1215, 0x1216, 0x1217, 0x1218, 0x1219, 0x121a, 0x121b, 0x121c, 0x121d, 0x121e, 0x121f, 0x1220, 0x1221, 0x1222, 0x1223, 0x1224, 0x1225, 0x1226, 0x1227, 0x1228, 0x1229, 0x122a, 0x122b, 0x122c, 0x122d, 0x122e, 0x122f, 0x1230, 0x1231, 0x1232, 0x1233, 0x1234, 0x1235, 0x1236, 0x1237, 0x1238, 0x1239, 0x123a, 0x123b, 0x123c, 0x123d, 0x123e, 0x123f, 0x1240, 0x1241, 0x1242, 0x1243, 0x1244, 0x1245, 0x1246, 0x1247, /* 0x1240 */ 0x1248, 0x0000, 0x124a, 0x124b, 0x124c, 0x124d, 0x0000, 0x0000, 0x1250, 0x1251, 0x1252, 0x1253, 0x1254, 0x1255, 0x1256, 0x0000, 0x1258, 0x0000, 0x125a, 0x125b, 0x125c, 0x125d, 0x0000, 0x0000, 0x1260, 0x1261, 0x1262, 0x1263, 0x1264, 0x1265, 0x1266, 0x1267, 0x1268, 0x1269, 0x126a, 0x126b, 0x126c, 0x126d, 0x126e, 0x126f, 0x1270, 0x1271, 0x1272, 0x1273, 0x1274, 0x1275, 0x1276, 0x1277, 0x1278, 0x1279, 0x127a, 0x127b, 0x127c, 0x127d, 0x127e, 0x127f, 0x1280, 0x1281, 0x1282, 0x1283, 0x1284, 0x1285, 0x1286, 0x1287, /* 0x1280 */ 0x1288, 0x0000, 0x128a, 0x128b, 0x128c, 0x128d, 0x0000, 0x0000, 0x1290, 0x1291, 0x1292, 0x1293, 0x1294, 0x1295, 0x1296, 0x1297, 0x1298, 0x1299, 0x129a, 0x129b, 0x129c, 0x129d, 0x129e, 0x129f, 0x12a0, 0x12a1, 0x12a2, 0x12a3, 0x12a4, 0x12a5, 0x12a6, 0x12a7, 0x12a8, 0x12a9, 0x12aa, 0x12ab, 0x12ac, 0x12ad, 0x12ae, 0x12af, 0x12b0, 0x0000, 0x12b2, 0x12b3, 0x12b4, 0x12b5, 0x0000, 0x0000, 0x12b8, 0x12b9, 0x12ba, 0x12bb, 0x12bc, 0x12bd, 0x12be, 0x0000, 0x12c0, 0x0000, 0x12c2, 0x12c3, 0x12c4, 0x12c5, 0x0000, 0x0000, /* 0x12c0 */ 0x12c8, 0x12c9, 0x12ca, 0x12cb, 0x12cc, 0x12cd, 0x12ce, 0x12cf, 0x12d0, 0x12d1, 0x12d2, 0x12d3, 0x12d4, 0x12d5, 0x12d6, 0x0000, 0x12d8, 0x12d9, 0x12da, 0x12db, 0x12dc, 0x12dd, 0x12de, 0x12df, 0x12e0, 0x12e1, 0x12e2, 0x12e3, 0x12e4, 0x12e5, 0x12e6, 0x12e7, 0x12e8, 0x12e9, 0x12ea, 0x12eb, 0x12ec, 0x12ed, 0x12ee, 0x12ef, 0x12f0, 0x12f1, 0x12f2, 0x12f3, 0x12f4, 0x12f5, 0x12f6, 0x12f7, 0x12f8, 0x12f9, 0x12fa, 0x12fb, 0x12fc, 0x12fd, 0x12fe, 0x12ff, 0x1300, 0x1301, 0x1302, 0x1303, 0x1304, 0x1305, 0x1306, 0x1307, /* 0x1300 */ 0x1308, 0x1309, 0x130a, 0x130b, 0x130c, 0x130d, 0x130e, 0x130f, 0x1310, 0x0000, 0x1312, 0x1313, 0x1314, 0x1315, 0x0000, 0x0000, 0x1318, 0x1319, 0x131a, 0x131b, 0x131c, 0x131d, 0x131e, 0x131f, 0x1320, 0x1321, 0x1322, 0x1323, 0x1324, 0x1325, 0x1326, 0x1327, 0x1328, 0x1329, 0x132a, 0x132b, 0x132c, 0x132d, 0x132e, 0x132f, 0x1330, 0x1331, 0x1332, 0x1333, 0x1334, 0x1335, 0x1336, 0x1337, 0x1338, 0x1339, 0x133a, 0x133b, 0x133c, 0x133d, 0x133e, 0x133f, 0x1340, 0x1341, 0x1342, 0x1343, 0x1344, 0x1345, 0x1346, 0x1347, /* 0x1340 */ 0x1348, 0x1349, 0x134a, 0x134b, 0x134c, 0x134d, 0x134e, 0x134f, 0x1350, 0x1351, 0x1352, 0x1353, 0x1354, 0x1355, 0x1356, 0x1357, 0x1358, 0x1359, 0x135a, 0x0000, 0x0000, 0x135d, 0x135e, 0x135f, 0x1360, 0x1361, 0x1362, 0x1363, 0x1364, 0x1365, 0x1366, 0x1367, 0x1368, 0x1369, 0x136a, 0x136b, 0x136c, 0x136d, 0x136e, 0x136f, 0x1370, 0x1371, 0x1372, 0x1373, 0x1374, 0x1375, 0x1376, 0x1377, 0x1378, 0x1379, 0x137a, 0x137b, 0x137c, 0x0000, 0x0000, 0x0000, 0x1380, 0x1381, 0x1382, 0x1383, 0x1384, 0x1385, 0x1386, 0x1387, /* 0x1380 */ 0x1388, 0x1389, 0x138a, 0x138b, 0x138c, 0x138d, 0x138e, 0x138f, 0x1390, 0x1391, 0x1392, 0x1393, 0x1394, 0x1395, 0x1396, 0x1397, 0x1398, 0x1399, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x13a0, 0x13a1, 0x13a2, 0x13a3, 0x13a4, 0x13a5, 0x13a6, 0x13a7, 0x13a8, 0x13a9, 0x13aa, 0x13ab, 0x13ac, 0x13ad, 0x13ae, 0x13af, 0x13b0, 0x13b1, 0x13b2, 0x13b3, 0x13b4, 0x13b5, 0x13b6, 0x13b7, 0x13b8, 0x13b9, 0x13ba, 0x13bb, 0x13bc, 0x13bd, 0x13be, 0x13bf, 0x13c0, 0x13c1, 0x13c2, 0x13c3, 0x13c4, 0x13c5, 0x13c6, 0x13c7, /* 0x13c0 */ 0x13c8, 0x13c9, 0x13ca, 0x13cb, 0x13cc, 0x13cd, 0x13ce, 0x13cf, 0x13d0, 0x13d1, 0x13d2, 0x13d3, 0x13d4, 0x13d5, 0x13d6, 0x13d7, 0x13d8, 0x13d9, 0x13da, 0x13db, 0x13dc, 0x13dd, 0x13de, 0x13df, 0x13e0, 0x13e1, 0x13e2, 0x13e3, 0x13e4, 0x13e5, 0x13e6, 0x13e7, 0x13e8, 0x13e9, 0x13ea, 0x13eb, 0x13ec, 0x13ed, 0x13ee, 0x13ef, 0x13f0, 0x13f1, 0x13f2, 0x13f3, 0x13f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1400, 0x1401, 0x1402, 0x1403, 0x1404, 0x1405, 0x1406, 0x1407, /* 0x1400 */ 0x1408, 0x1409, 0x140a, 0x140b, 0x140c, 0x140d, 0x140e, 0x140f, 0x1410, 0x1411, 0x1412, 0x1413, 0x1414, 0x1415, 0x1416, 0x1417, 0x1418, 0x1419, 0x141a, 0x141b, 0x141c, 0x141d, 0x141e, 0x141f, 0x1420, 0x1421, 0x1422, 0x1423, 0x1424, 0x1425, 0x1426, 0x1427, 0x1428, 0x1429, 0x142a, 0x142b, 0x142c, 0x142d, 0x142e, 0x142f, 0x1430, 0x1431, 0x1432, 0x1433, 0x1434, 0x1435, 0x1436, 0x1437, 0x1438, 0x1439, 0x143a, 0x143b, 0x143c, 0x143d, 0x143e, 0x143f, 0x1440, 0x1441, 0x1442, 0x1443, 0x1444, 0x1445, 0x1446, 0x1447, /* 0x1440 */ 0x1448, 0x1449, 0x144a, 0x144b, 0x144c, 0x144d, 0x144e, 0x144f, 0x1450, 0x1451, 0x1452, 0x1453, 0x1454, 0x1455, 0x1456, 0x1457, 0x1458, 0x1459, 0x145a, 0x145b, 0x145c, 0x145d, 0x145e, 0x145f, 0x1460, 0x1461, 0x1462, 0x1463, 0x1464, 0x1465, 0x1466, 0x1467, 0x1468, 0x1469, 0x146a, 0x146b, 0x146c, 0x146d, 0x146e, 0x146f, 0x1470, 0x1471, 0x1472, 0x1473, 0x1474, 0x1475, 0x1476, 0x1477, 0x1478, 0x1479, 0x147a, 0x147b, 0x147c, 0x147d, 0x147e, 0x147f, 0x1480, 0x1481, 0x1482, 0x1483, 0x1484, 0x1485, 0x1486, 0x1487, /* 0x1480 */ 0x1488, 0x1489, 0x148a, 0x148b, 0x148c, 0x148d, 0x148e, 0x148f, 0x1490, 0x1491, 0x1492, 0x1493, 0x1494, 0x1495, 0x1496, 0x1497, 0x1498, 0x1499, 0x149a, 0x149b, 0x149c, 0x149d, 0x149e, 0x149f, 0x14a0, 0x14a1, 0x14a2, 0x14a3, 0x14a4, 0x14a5, 0x14a6, 0x14a7, 0x14a8, 0x14a9, 0x14aa, 0x14ab, 0x14ac, 0x14ad, 0x14ae, 0x14af, 0x14b0, 0x14b1, 0x14b2, 0x14b3, 0x14b4, 0x14b5, 0x14b6, 0x14b7, 0x14b8, 0x14b9, 0x14ba, 0x14bb, 0x14bc, 0x14bd, 0x14be, 0x14bf, 0x14c0, 0x14c1, 0x14c2, 0x14c3, 0x14c4, 0x14c5, 0x14c6, 0x14c7, /* 0x14c0 */ 0x14c8, 0x14c9, 0x14ca, 0x14cb, 0x14cc, 0x14cd, 0x14ce, 0x14cf, 0x14d0, 0x14d1, 0x14d2, 0x14d3, 0x14d4, 0x14d5, 0x14d6, 0x14d7, 0x14d8, 0x14d9, 0x14da, 0x14db, 0x14dc, 0x14dd, 0x14de, 0x14df, 0x14e0, 0x14e1, 0x14e2, 0x14e3, 0x14e4, 0x14e5, 0x14e6, 0x14e7, 0x14e8, 0x14e9, 0x14ea, 0x14eb, 0x14ec, 0x14ed, 0x14ee, 0x14ef, 0x14f0, 0x14f1, 0x14f2, 0x14f3, 0x14f4, 0x14f5, 0x14f6, 0x14f7, 0x14f8, 0x14f9, 0x14fa, 0x14fb, 0x14fc, 0x14fd, 0x14fe, 0x14ff, 0x1500, 0x1501, 0x1502, 0x1503, 0x1504, 0x1505, 0x1506, 0x1507, /* 0x1500 */ 0x1508, 0x1509, 0x150a, 0x150b, 0x150c, 0x150d, 0x150e, 0x150f, 0x1510, 0x1511, 0x1512, 0x1513, 0x1514, 0x1515, 0x1516, 0x1517, 0x1518, 0x1519, 0x151a, 0x151b, 0x151c, 0x151d, 0x151e, 0x151f, 0x1520, 0x1521, 0x1522, 0x1523, 0x1524, 0x1525, 0x1526, 0x1527, 0x1528, 0x1529, 0x152a, 0x152b, 0x152c, 0x152d, 0x152e, 0x152f, 0x1530, 0x1531, 0x1532, 0x1533, 0x1534, 0x1535, 0x1536, 0x1537, 0x1538, 0x1539, 0x153a, 0x153b, 0x153c, 0x153d, 0x153e, 0x153f, 0x1540, 0x1541, 0x1542, 0x1543, 0x1544, 0x1545, 0x1546, 0x1547, /* 0x1540 */ 0x1548, 0x1549, 0x154a, 0x154b, 0x154c, 0x154d, 0x154e, 0x154f, 0x1550, 0x1551, 0x1552, 0x1553, 0x1554, 0x1555, 0x1556, 0x1557, 0x1558, 0x1559, 0x155a, 0x155b, 0x155c, 0x155d, 0x155e, 0x155f, 0x1560, 0x1561, 0x1562, 0x1563, 0x1564, 0x1565, 0x1566, 0x1567, 0x1568, 0x1569, 0x156a, 0x156b, 0x156c, 0x156d, 0x156e, 0x156f, 0x1570, 0x1571, 0x1572, 0x1573, 0x1574, 0x1575, 0x1576, 0x1577, 0x1578, 0x1579, 0x157a, 0x157b, 0x157c, 0x157d, 0x157e, 0x157f, 0x1580, 0x1581, 0x1582, 0x1583, 0x1584, 0x1585, 0x1586, 0x1587, /* 0x1580 */ 0x1588, 0x1589, 0x158a, 0x158b, 0x158c, 0x158d, 0x158e, 0x158f, 0x1590, 0x1591, 0x1592, 0x1593, 0x1594, 0x1595, 0x1596, 0x1597, 0x1598, 0x1599, 0x159a, 0x159b, 0x159c, 0x159d, 0x159e, 0x159f, 0x15a0, 0x15a1, 0x15a2, 0x15a3, 0x15a4, 0x15a5, 0x15a6, 0x15a7, 0x15a8, 0x15a9, 0x15aa, 0x15ab, 0x15ac, 0x15ad, 0x15ae, 0x15af, 0x15b0, 0x15b1, 0x15b2, 0x15b3, 0x15b4, 0x15b5, 0x15b6, 0x15b7, 0x15b8, 0x15b9, 0x15ba, 0x15bb, 0x15bc, 0x15bd, 0x15be, 0x15bf, 0x15c0, 0x15c1, 0x15c2, 0x15c3, 0x15c4, 0x15c5, 0x15c6, 0x15c7, /* 0x15c0 */ 0x15c8, 0x15c9, 0x15ca, 0x15cb, 0x15cc, 0x15cd, 0x15ce, 0x15cf, 0x15d0, 0x15d1, 0x15d2, 0x15d3, 0x15d4, 0x15d5, 0x15d6, 0x15d7, 0x15d8, 0x15d9, 0x15da, 0x15db, 0x15dc, 0x15dd, 0x15de, 0x15df, 0x15e0, 0x15e1, 0x15e2, 0x15e3, 0x15e4, 0x15e5, 0x15e6, 0x15e7, 0x15e8, 0x15e9, 0x15ea, 0x15eb, 0x15ec, 0x15ed, 0x15ee, 0x15ef, 0x15f0, 0x15f1, 0x15f2, 0x15f3, 0x15f4, 0x15f5, 0x15f6, 0x15f7, 0x15f8, 0x15f9, 0x15fa, 0x15fb, 0x15fc, 0x15fd, 0x15fe, 0x15ff, 0x1600, 0x1601, 0x1602, 0x1603, 0x1604, 0x1605, 0x1606, 0x1607, /* 0x1600 */ 0x1608, 0x1609, 0x160a, 0x160b, 0x160c, 0x160d, 0x160e, 0x160f, 0x1610, 0x1611, 0x1612, 0x1613, 0x1614, 0x1615, 0x1616, 0x1617, 0x1618, 0x1619, 0x161a, 0x161b, 0x161c, 0x161d, 0x161e, 0x161f, 0x1620, 0x1621, 0x1622, 0x1623, 0x1624, 0x1625, 0x1626, 0x1627, 0x1628, 0x1629, 0x162a, 0x162b, 0x162c, 0x162d, 0x162e, 0x162f, 0x1630, 0x1631, 0x1632, 0x1633, 0x1634, 0x1635, 0x1636, 0x1637, 0x1638, 0x1639, 0x163a, 0x163b, 0x163c, 0x163d, 0x163e, 0x163f, 0x1640, 0x1641, 0x1642, 0x1643, 0x1644, 0x1645, 0x1646, 0x1647, /* 0x1640 */ 0x1648, 0x1649, 0x164a, 0x164b, 0x164c, 0x164d, 0x164e, 0x164f, 0x1650, 0x1651, 0x1652, 0x1653, 0x1654, 0x1655, 0x1656, 0x1657, 0x1658, 0x1659, 0x165a, 0x165b, 0x165c, 0x165d, 0x165e, 0x165f, 0x1660, 0x1661, 0x1662, 0x1663, 0x1664, 0x1665, 0x1666, 0x1667, 0x1668, 0x1669, 0x166a, 0x166b, 0x166c, 0x166d, 0x166e, 0x166f, 0x1670, 0x1671, 0x1672, 0x1673, 0x1674, 0x1675, 0x1676, 0x1677, 0x1678, 0x1679, 0x167a, 0x167b, 0x167c, 0x167d, 0x167e, 0x167f, 0x1680, 0x1681, 0x1682, 0x1683, 0x1684, 0x1685, 0x1686, 0x1687, /* 0x1680 */ 0x1688, 0x1689, 0x168a, 0x168b, 0x168c, 0x168d, 0x168e, 0x168f, 0x1690, 0x1691, 0x1692, 0x1693, 0x1694, 0x1695, 0x1696, 0x1697, 0x1698, 0x1699, 0x169a, 0x169b, 0x169c, 0x0000, 0x0000, 0x0000, 0x16a0, 0x16a1, 0x16a2, 0x16a3, 0x16a4, 0x16a5, 0x16a6, 0x16a7, 0x16a8, 0x16a9, 0x16aa, 0x16ab, 0x16ac, 0x16ad, 0x16ae, 0x16af, 0x16b0, 0x16b1, 0x16b2, 0x16b3, 0x16b4, 0x16b5, 0x16b6, 0x16b7, 0x16b8, 0x16b9, 0x16ba, 0x16bb, 0x16bc, 0x16bd, 0x16be, 0x16bf, 0x16c0, 0x16c1, 0x16c2, 0x16c3, 0x16c4, 0x16c5, 0x16c6, 0x16c7, /* 0x16c0 */ 0x16c8, 0x16c9, 0x16ca, 0x16cb, 0x16cc, 0x16cd, 0x16ce, 0x16cf, 0x16d0, 0x16d1, 0x16d2, 0x16d3, 0x16d4, 0x16d5, 0x16d6, 0x16d7, 0x16d8, 0x16d9, 0x16da, 0x16db, 0x16dc, 0x16dd, 0x16de, 0x16df, 0x16e0, 0x16e1, 0x16e2, 0x16e3, 0x16e4, 0x16e5, 0x16e6, 0x16e7, 0x16e8, 0x16e9, 0x16ea, 0x16eb, 0x16ec, 0x16ed, 0x16ee, 0x16ef, 0x16f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1700, 0x1701, 0x1702, 0x1703, 0x1704, 0x1705, 0x1706, 0x1707, /* 0x1700 */ 0x1708, 0x1709, 0x170a, 0x170b, 0x170c, 0x0000, 0x170e, 0x170f, 0x1710, 0x1711, 0x1712, 0x1713, 0x1714, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1720, 0x1721, 0x1722, 0x1723, 0x1724, 0x1725, 0x1726, 0x1727, 0x1728, 0x1729, 0x172a, 0x172b, 0x172c, 0x172d, 0x172e, 0x172f, 0x1730, 0x1731, 0x1732, 0x1733, 0x1734, 0x1735, 0x1736, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1740, 0x1741, 0x1742, 0x1743, 0x1744, 0x1745, 0x1746, 0x1747, /* 0x1740 */ 0x1748, 0x1749, 0x174a, 0x174b, 0x174c, 0x174d, 0x174e, 0x174f, 0x1750, 0x1751, 0x1752, 0x1753, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1760, 0x1761, 0x1762, 0x1763, 0x1764, 0x1765, 0x1766, 0x1767, 0x1768, 0x1769, 0x176a, 0x176b, 0x176c, 0x0000, 0x176e, 0x176f, 0x1770, 0x0000, 0x1772, 0x1773, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1780, 0x1781, 0x1782, 0x1783, 0x1784, 0x1785, 0x1786, 0x1787, /* 0x1780 */ 0x1788, 0x1789, 0x178a, 0x178b, 0x178c, 0x178d, 0x178e, 0x178f, 0x1790, 0x1791, 0x1792, 0x1793, 0x1794, 0x1795, 0x1796, 0x1797, 0x1798, 0x1799, 0x179a, 0x179b, 0x179c, 0x179d, 0x179e, 0x179f, 0x17a0, 0x17a1, 0x17a2, 0x17a3, 0x17a4, 0x17a5, 0x17a6, 0x17a7, 0x17a8, 0x17a9, 0x17aa, 0x17ab, 0x17ac, 0x17ad, 0x17ae, 0x17af, 0x17b0, 0x17b1, 0x17b2, 0x17b3, 0x17b4, 0x17b5, 0x17b6, 0x17b7, 0x17b8, 0x17b9, 0x17ba, 0x17bb, 0x17bc, 0x17bd, 0x17be, 0x17bf, 0x17c0, 0x17c1, 0x17c2, 0x17c3, 0x17c4, 0x17c5, 0x17c6, 0x17c7, /* 0x17c0 */ 0x17c8, 0x17c9, 0x17ca, 0x17cb, 0x17cc, 0x17cd, 0x17ce, 0x17cf, 0x17d0, 0x17d1, 0x17d2, 0x17d3, 0x17d4, 0x17d5, 0x17d6, 0x17d7, 0x17d8, 0x17d9, 0x17da, 0x17db, 0x17dc, 0x17dd, 0x0000, 0x0000, 0x17e0, 0x17e1, 0x17e2, 0x17e3, 0x17e4, 0x17e5, 0x17e6, 0x17e7, 0x17e8, 0x17e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x17f0, 0x17f1, 0x17f2, 0x17f3, 0x17f4, 0x17f5, 0x17f6, 0x17f7, 0x17f8, 0x17f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1801, 0x1802, 0x1803, 0x1804, 0x1805, 0x1806, 0x1807, /* 0x1800 */ 0x1808, 0x1809, 0x180a, 0x180b, 0x180c, 0x180d, 0x180e, 0x0000, 0x1810, 0x1811, 0x1812, 0x1813, 0x1814, 0x1815, 0x1816, 0x1817, 0x1818, 0x1819, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1820, 0x1821, 0x1822, 0x1823, 0x1824, 0x1825, 0x1826, 0x1827, 0x1828, 0x1829, 0x182a, 0x182b, 0x182c, 0x182d, 0x182e, 0x182f, 0x1830, 0x1831, 0x1832, 0x1833, 0x1834, 0x1835, 0x1836, 0x1837, 0x1838, 0x1839, 0x183a, 0x183b, 0x183c, 0x183d, 0x183e, 0x183f, 0x1840, 0x1841, 0x1842, 0x1843, 0x1844, 0x1845, 0x1846, 0x1847, /* 0x1840 */ 0x1848, 0x1849, 0x184a, 0x184b, 0x184c, 0x184d, 0x184e, 0x184f, 0x1850, 0x1851, 0x1852, 0x1853, 0x1854, 0x1855, 0x1856, 0x1857, 0x1858, 0x1859, 0x185a, 0x185b, 0x185c, 0x185d, 0x185e, 0x185f, 0x1860, 0x1861, 0x1862, 0x1863, 0x1864, 0x1865, 0x1866, 0x1867, 0x1868, 0x1869, 0x186a, 0x186b, 0x186c, 0x186d, 0x186e, 0x186f, 0x1870, 0x1871, 0x1872, 0x1873, 0x1874, 0x1875, 0x1876, 0x1877, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1880, 0x1881, 0x1882, 0x1883, 0x1884, 0x1885, 0x1886, 0x1887, /* 0x1880 */ 0x1888, 0x1889, 0x188a, 0x188b, 0x188c, 0x188d, 0x188e, 0x188f, 0x1890, 0x1891, 0x1892, 0x1893, 0x1894, 0x1895, 0x1896, 0x1897, 0x1898, 0x1899, 0x189a, 0x189b, 0x189c, 0x189d, 0x189e, 0x189f, 0x18a0, 0x18a1, 0x18a2, 0x18a3, 0x18a4, 0x18a5, 0x18a6, 0x18a7, 0x18a8, 0x18a9, 0x18aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18b0, 0x18b1, 0x18b2, 0x18b3, 0x18b4, 0x18b5, 0x18b6, 0x18b7, 0x18b8, 0x18b9, 0x18ba, 0x18bb, 0x18bc, 0x18bd, 0x18be, 0x18bf, 0x18c0, 0x18c1, 0x18c2, 0x18c3, 0x18c4, 0x18c5, 0x18c6, 0x18c7, /* 0x18c0 */ 0x18c8, 0x18c9, 0x18ca, 0x18cb, 0x18cc, 0x18cd, 0x18ce, 0x18cf, 0x18d0, 0x18d1, 0x18d2, 0x18d3, 0x18d4, 0x18d5, 0x18d6, 0x18d7, 0x18d8, 0x18d9, 0x18da, 0x18db, 0x18dc, 0x18dd, 0x18de, 0x18df, 0x18e0, 0x18e1, 0x18e2, 0x18e3, 0x18e4, 0x18e5, 0x18e6, 0x18e7, 0x18e8, 0x18e9, 0x18ea, 0x18eb, 0x18ec, 0x18ed, 0x18ee, 0x18ef, 0x18f0, 0x18f1, 0x18f2, 0x18f3, 0x18f4, 0x18f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1900, 0x1901, 0x1902, 0x1903, 0x1904, 0x1905, 0x1906, 0x1907, /* 0x1900 */ 0x1908, 0x1909, 0x190a, 0x190b, 0x190c, 0x190d, 0x190e, 0x190f, 0x1910, 0x1911, 0x1912, 0x1913, 0x1914, 0x1915, 0x1916, 0x1917, 0x1918, 0x1919, 0x191a, 0x191b, 0x191c, 0x0000, 0x0000, 0x0000, 0x1920, 0x1921, 0x1922, 0x1923, 0x1924, 0x1925, 0x1926, 0x1927, 0x1928, 0x1929, 0x192a, 0x192b, 0x0000, 0x0000, 0x0000, 0x0000, 0x1930, 0x1931, 0x1932, 0x1933, 0x1934, 0x1935, 0x1936, 0x1937, 0x1938, 0x1939, 0x193a, 0x193b, 0x0000, 0x0000, 0x0000, 0x0000, 0x1940, 0x0000, 0x0000, 0x0000, 0x1944, 0x1945, 0x1946, 0x1947, /* 0x1940 */ 0x1948, 0x1949, 0x194a, 0x194b, 0x194c, 0x194d, 0x194e, 0x194f, 0x1950, 0x1951, 0x1952, 0x1953, 0x1954, 0x1955, 0x1956, 0x1957, 0x1958, 0x1959, 0x195a, 0x195b, 0x195c, 0x195d, 0x195e, 0x195f, 0x1960, 0x1961, 0x1962, 0x1963, 0x1964, 0x1965, 0x1966, 0x1967, 0x1968, 0x1969, 0x196a, 0x196b, 0x196c, 0x196d, 0x0000, 0x0000, 0x1970, 0x1971, 0x1972, 0x1973, 0x1974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1980, 0x1981, 0x1982, 0x1983, 0x1984, 0x1985, 0x1986, 0x1987, /* 0x1980 */ 0x1988, 0x1989, 0x198a, 0x198b, 0x198c, 0x198d, 0x198e, 0x198f, 0x1990, 0x1991, 0x1992, 0x1993, 0x1994, 0x1995, 0x1996, 0x1997, 0x1998, 0x1999, 0x199a, 0x199b, 0x199c, 0x199d, 0x199e, 0x199f, 0x19a0, 0x19a1, 0x19a2, 0x19a3, 0x19a4, 0x19a5, 0x19a6, 0x19a7, 0x19a8, 0x19a9, 0x19aa, 0x19ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x19b0, 0x19b1, 0x19b2, 0x19b3, 0x19b4, 0x19b5, 0x19b6, 0x19b7, 0x19b8, 0x19b9, 0x19ba, 0x19bb, 0x19bc, 0x19bd, 0x19be, 0x19bf, 0x19c0, 0x19c1, 0x19c2, 0x19c3, 0x19c4, 0x19c5, 0x19c6, 0x19c7, /* 0x19c0 */ 0x19c8, 0x19c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x19d0, 0x19d1, 0x19d2, 0x19d3, 0x19d4, 0x19d5, 0x19d6, 0x19d7, 0x19d8, 0x19d9, 0x19da, 0x0000, 0x0000, 0x0000, 0x19de, 0x19df, 0x19e0, 0x19e1, 0x19e2, 0x19e3, 0x19e4, 0x19e5, 0x19e6, 0x19e7, 0x19e8, 0x19e9, 0x19ea, 0x19eb, 0x19ec, 0x19ed, 0x19ee, 0x19ef, 0x19f0, 0x19f1, 0x19f2, 0x19f3, 0x19f4, 0x19f5, 0x19f6, 0x19f7, 0x19f8, 0x19f9, 0x19fa, 0x19fb, 0x19fc, 0x19fd, 0x19fe, 0x19ff, 0x1a00, 0x1a01, 0x1a02, 0x1a03, 0x1a04, 0x1a05, 0x1a06, 0x1a07, /* 0x1a00 */ 0x1a08, 0x1a09, 0x1a0a, 0x1a0b, 0x1a0c, 0x1a0d, 0x1a0e, 0x1a0f, 0x1a10, 0x1a11, 0x1a12, 0x1a13, 0x1a14, 0x1a15, 0x1a16, 0x1a17, 0x1a18, 0x1a19, 0x1a1a, 0x1a1b, 0x0000, 0x0000, 0x1a1e, 0x1a1f, 0x1a20, 0x1a21, 0x1a22, 0x1a23, 0x1a24, 0x1a25, 0x1a26, 0x1a27, 0x1a28, 0x1a29, 0x1a2a, 0x1a2b, 0x1a2c, 0x1a2d, 0x1a2e, 0x1a2f, 0x1a30, 0x1a31, 0x1a32, 0x1a33, 0x1a34, 0x1a35, 0x1a36, 0x1a37, 0x1a38, 0x1a39, 0x1a3a, 0x1a3b, 0x1a3c, 0x1a3d, 0x1a3e, 0x1a3f, 0x1a40, 0x1a41, 0x1a42, 0x1a43, 0x1a44, 0x1a45, 0x1a46, 0x1a47, /* 0x1a40 */ 0x1a48, 0x1a49, 0x1a4a, 0x1a4b, 0x1a4c, 0x1a4d, 0x1a4e, 0x1a4f, 0x1a50, 0x1a51, 0x1a52, 0x1a53, 0x1a54, 0x1a55, 0x1a56, 0x1a57, 0x1a58, 0x1a59, 0x1a5a, 0x1a5b, 0x1a5c, 0x1a5d, 0x1a5e, 0x0000, 0x1a60, 0x1a61, 0x1a62, 0x1a63, 0x1a64, 0x1a65, 0x1a66, 0x1a67, 0x1a68, 0x1a69, 0x1a6a, 0x1a6b, 0x1a6c, 0x1a6d, 0x1a6e, 0x1a6f, 0x1a70, 0x1a71, 0x1a72, 0x1a73, 0x1a74, 0x1a75, 0x1a76, 0x1a77, 0x1a78, 0x1a79, 0x1a7a, 0x1a7b, 0x1a7c, 0x0000, 0x0000, 0x1a7f, 0x1a80, 0x1a81, 0x1a82, 0x1a83, 0x1a84, 0x1a85, 0x1a86, 0x1a87, /* 0x1a80 */ 0x1a88, 0x1a89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1a90, 0x1a91, 0x1a92, 0x1a93, 0x1a94, 0x1a95, 0x1a96, 0x1a97, 0x1a98, 0x1a99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1aa0, 0x1aa1, 0x1aa2, 0x1aa3, 0x1aa4, 0x1aa5, 0x1aa6, 0x1aa7, 0x1aa8, 0x1aa9, 0x1aaa, 0x1aab, 0x1aac, 0x1aad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1b00, 0x1b01, 0x1b02, 0x1b03, 0x1b04, 0x1b05, 0x1b06, 0x1b07, /* 0x1b00 */ 0x1b08, 0x1b09, 0x1b0a, 0x1b0b, 0x1b0c, 0x1b0d, 0x1b0e, 0x1b0f, 0x1b10, 0x1b11, 0x1b12, 0x1b13, 0x1b14, 0x1b15, 0x1b16, 0x1b17, 0x1b18, 0x1b19, 0x1b1a, 0x1b1b, 0x1b1c, 0x1b1d, 0x1b1e, 0x1b1f, 0x1b20, 0x1b21, 0x1b22, 0x1b23, 0x1b24, 0x1b25, 0x1b26, 0x1b27, 0x1b28, 0x1b29, 0x1b2a, 0x1b2b, 0x1b2c, 0x1b2d, 0x1b2e, 0x1b2f, 0x1b30, 0x1b31, 0x1b32, 0x1b33, 0x1b34, 0x1b35, 0x1b36, 0x1b37, 0x1b38, 0x1b39, 0x1b3a, 0x1b3b, 0x1b3c, 0x1b3d, 0x1b3e, 0x1b3f, 0x1b40, 0x1b41, 0x1b42, 0x1b43, 0x1b44, 0x1b45, 0x1b46, 0x1b47, /* 0x1b40 */ 0x1b48, 0x1b49, 0x1b4a, 0x1b4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x1b50, 0x1b51, 0x1b52, 0x1b53, 0x1b54, 0x1b55, 0x1b56, 0x1b57, 0x1b58, 0x1b59, 0x1b5a, 0x1b5b, 0x1b5c, 0x1b5d, 0x1b5e, 0x1b5f, 0x1b60, 0x1b61, 0x1b62, 0x1b63, 0x1b64, 0x1b65, 0x1b66, 0x1b67, 0x1b68, 0x1b69, 0x1b6a, 0x1b6b, 0x1b6c, 0x1b6d, 0x1b6e, 0x1b6f, 0x1b70, 0x1b71, 0x1b72, 0x1b73, 0x1b74, 0x1b75, 0x1b76, 0x1b77, 0x1b78, 0x1b79, 0x1b7a, 0x1b7b, 0x1b7c, 0x0000, 0x0000, 0x0000, 0x1b80, 0x1b81, 0x1b82, 0x1b83, 0x1b84, 0x1b85, 0x1b86, 0x1b87, /* 0x1b80 */ 0x1b88, 0x1b89, 0x1b8a, 0x1b8b, 0x1b8c, 0x1b8d, 0x1b8e, 0x1b8f, 0x1b90, 0x1b91, 0x1b92, 0x1b93, 0x1b94, 0x1b95, 0x1b96, 0x1b97, 0x1b98, 0x1b99, 0x1b9a, 0x1b9b, 0x1b9c, 0x1b9d, 0x1b9e, 0x1b9f, 0x1ba0, 0x1ba1, 0x1ba2, 0x1ba3, 0x1ba4, 0x1ba5, 0x1ba6, 0x1ba7, 0x1ba8, 0x1ba9, 0x1baa, 0x1bab, 0x1bac, 0x1bad, 0x1bae, 0x1baf, 0x1bb0, 0x1bb1, 0x1bb2, 0x1bb3, 0x1bb4, 0x1bb5, 0x1bb6, 0x1bb7, 0x1bb8, 0x1bb9, 0x1bba, 0x1bbb, 0x1bbc, 0x1bbd, 0x1bbe, 0x1bbf, 0x1bc0, 0x1bc1, 0x1bc2, 0x1bc3, 0x1bc4, 0x1bc5, 0x1bc6, 0x1bc7, /* 0x1bc0 */ 0x1bc8, 0x1bc9, 0x1bca, 0x1bcb, 0x1bcc, 0x1bcd, 0x1bce, 0x1bcf, 0x1bd0, 0x1bd1, 0x1bd2, 0x1bd3, 0x1bd4, 0x1bd5, 0x1bd6, 0x1bd7, 0x1bd8, 0x1bd9, 0x1bda, 0x1bdb, 0x1bdc, 0x1bdd, 0x1bde, 0x1bdf, 0x1be0, 0x1be1, 0x1be2, 0x1be3, 0x1be4, 0x1be5, 0x1be6, 0x1be7, 0x1be8, 0x1be9, 0x1bea, 0x1beb, 0x1bec, 0x1bed, 0x1bee, 0x1bef, 0x1bf0, 0x1bf1, 0x1bf2, 0x1bf3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1bfc, 0x1bfd, 0x1bfe, 0x1bff, 0x1c00, 0x1c01, 0x1c02, 0x1c03, 0x1c04, 0x1c05, 0x1c06, 0x1c07, /* 0x1c00 */ 0x1c08, 0x1c09, 0x1c0a, 0x1c0b, 0x1c0c, 0x1c0d, 0x1c0e, 0x1c0f, 0x1c10, 0x1c11, 0x1c12, 0x1c13, 0x1c14, 0x1c15, 0x1c16, 0x1c17, 0x1c18, 0x1c19, 0x1c1a, 0x1c1b, 0x1c1c, 0x1c1d, 0x1c1e, 0x1c1f, 0x1c20, 0x1c21, 0x1c22, 0x1c23, 0x1c24, 0x1c25, 0x1c26, 0x1c27, 0x1c28, 0x1c29, 0x1c2a, 0x1c2b, 0x1c2c, 0x1c2d, 0x1c2e, 0x1c2f, 0x1c30, 0x1c31, 0x1c32, 0x1c33, 0x1c34, 0x1c35, 0x1c36, 0x1c37, 0x0000, 0x0000, 0x0000, 0x1c3b, 0x1c3c, 0x1c3d, 0x1c3e, 0x1c3f, 0x1c40, 0x1c41, 0x1c42, 0x1c43, 0x1c44, 0x1c45, 0x1c46, 0x1c47, /* 0x1c40 */ 0x1c48, 0x1c49, 0x0000, 0x0000, 0x0000, 0x1c4d, 0x1c4e, 0x1c4f, 0x1c50, 0x1c51, 0x1c52, 0x1c53, 0x1c54, 0x1c55, 0x1c56, 0x1c57, 0x1c58, 0x1c59, 0x1c5a, 0x1c5b, 0x1c5c, 0x1c5d, 0x1c5e, 0x1c5f, 0x1c60, 0x1c61, 0x1c62, 0x1c63, 0x1c64, 0x1c65, 0x1c66, 0x1c67, 0x1c68, 0x1c69, 0x1c6a, 0x1c6b, 0x1c6c, 0x1c6d, 0x1c6e, 0x1c6f, 0x1c70, 0x1c71, 0x1c72, 0x1c73, 0x1c74, 0x1c75, 0x1c76, 0x1c77, 0x1c78, 0x1c79, 0x1c7a, 0x1c7b, 0x1c7c, 0x1c7d, 0x1c7e, 0x1c7f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cc0, 0x1cc1, 0x1cc2, 0x1cc3, 0x1cc4, 0x1cc5, 0x1cc6, 0x1cc7, /* 0x1cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1cd0, 0x1cd1, 0x1cd2, 0x1cd3, 0x1cd4, 0x1cd5, 0x1cd6, 0x1cd7, 0x1cd8, 0x1cd9, 0x1cda, 0x1cdb, 0x1cdc, 0x1cdd, 0x1cde, 0x1cdf, 0x1ce0, 0x1ce1, 0x1ce2, 0x1ce3, 0x1ce4, 0x1ce5, 0x1ce6, 0x1ce7, 0x1ce8, 0x1ce9, 0x1cea, 0x1ceb, 0x1cec, 0x1ced, 0x1cee, 0x1cef, 0x1cf0, 0x1cf1, 0x1cf2, 0x1cf3, 0x1cf4, 0x1cf5, 0x1cf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1d00, 0x1d01, 0x1d02, 0x1d03, 0x1d04, 0x1d05, 0x1d06, 0x1d07, /* 0x1d00 */ 0x1d08, 0x1d09, 0x1d0a, 0x1d0b, 0x1d0c, 0x1d0d, 0x1d0e, 0x1d0f, 0x1d10, 0x1d11, 0x1d12, 0x1d13, 0x1d14, 0x1d15, 0x1d16, 0x1d17, 0x1d18, 0x1d19, 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1d, 0x1d1e, 0x1d1f, 0x1d20, 0x1d21, 0x1d22, 0x1d23, 0x1d24, 0x1d25, 0x1d26, 0x1d27, 0x1d28, 0x1d29, 0x1d2a, 0x1d2b, 0x1d2c, 0x1d2d, 0x1d2e, 0x1d2f, 0x1d30, 0x1d31, 0x1d32, 0x1d33, 0x1d34, 0x1d35, 0x1d36, 0x1d37, 0x1d38, 0x1d39, 0x1d3a, 0x1d3b, 0x1d3c, 0x1d3d, 0x1d3e, 0x1d3f, 0x1d40, 0x1d41, 0x1d42, 0x1d43, 0x1d44, 0x1d45, 0x1d46, 0x1d47, /* 0x1d40 */ 0x1d48, 0x1d49, 0x1d4a, 0x1d4b, 0x1d4c, 0x1d4d, 0x1d4e, 0x1d4f, 0x1d50, 0x1d51, 0x1d52, 0x1d53, 0x1d54, 0x1d55, 0x1d56, 0x1d57, 0x1d58, 0x1d59, 0x1d5a, 0x1d5b, 0x1d5c, 0x1d5d, 0x1d5e, 0x1d5f, 0x1d60, 0x1d61, 0x1d62, 0x1d63, 0x1d64, 0x1d65, 0x1d66, 0x1d67, 0x1d68, 0x1d69, 0x1d6a, 0x1d6b, 0x1d6c, 0x1d6d, 0x1d6e, 0x1d6f, 0x1d70, 0x1d71, 0x1d72, 0x1d73, 0x1d74, 0x1d75, 0x1d76, 0x1d77, 0x1d78, 0x1d79, 0x1d7a, 0x1d7b, 0x1d7c, 0x1d7d, 0x1d7e, 0x1d7f, 0x1d80, 0x1d81, 0x1d82, 0x1d83, 0x1d84, 0x1d85, 0x1d86, 0x1d87, /* 0x1d80 */ 0x1d88, 0x1d89, 0x1d8a, 0x1d8b, 0x1d8c, 0x1d8d, 0x1d8e, 0x1d8f, 0x1d90, 0x1d91, 0x1d92, 0x1d93, 0x1d94, 0x1d95, 0x1d96, 0x1d97, 0x1d98, 0x1d99, 0x1d9a, 0x1d9b, 0x1d9c, 0x1d9d, 0x1d9e, 0x1d9f, 0x1da0, 0x1da1, 0x1da2, 0x1da3, 0x1da4, 0x1da5, 0x1da6, 0x1da7, 0x1da8, 0x1da9, 0x1daa, 0x1dab, 0x1dac, 0x1dad, 0x1dae, 0x1daf, 0x1db0, 0x1db1, 0x1db2, 0x1db3, 0x1db4, 0x1db5, 0x1db6, 0x1db7, 0x1db8, 0x1db9, 0x1dba, 0x1dbb, 0x1dbc, 0x1dbd, 0x1dbe, 0x1dbf, 0x1dc0, 0x1dc1, 0x1dc2, 0x1dc3, 0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, /* 0x1dc0 */ 0x1dc8, 0x1dc9, 0x1dca, 0x1dcb, 0x1dcc, 0x1dcd, 0x1dce, 0x1dcf, 0x1dd0, 0x1dd1, 0x1dd2, 0x1dd3, 0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb, 0x1ddc, 0x1ddd, 0x1dde, 0x1ddf, 0x1de0, 0x1de1, 0x1de2, 0x1de3, 0x1de4, 0x1de5, 0x1de6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1dfc, 0x1dfd, 0x1dfe, 0x1dff, 0x1e01, 0x1e01, 0x1e03, 0x1e03, 0x1e05, 0x1e05, 0x1e07, 0x1e07, /* 0x1e00 */ 0x1e09, 0x1e09, 0x1e0b, 0x1e0b, 0x1e0d, 0x1e0d, 0x1e0f, 0x1e0f, 0x1e11, 0x1e11, 0x1e13, 0x1e13, 0x1e15, 0x1e15, 0x1e17, 0x1e17, 0x1e19, 0x1e19, 0x1e1b, 0x1e1b, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1f, 0x1e21, 0x1e21, 0x1e23, 0x1e23, 0x1e25, 0x1e25, 0x1e27, 0x1e27, 0x1e29, 0x1e29, 0x1e2b, 0x1e2b, 0x1e2d, 0x1e2d, 0x1e2f, 0x1e2f, 0x1e31, 0x1e31, 0x1e33, 0x1e33, 0x1e35, 0x1e35, 0x1e37, 0x1e37, 0x1e39, 0x1e39, 0x1e3b, 0x1e3b, 0x1e3d, 0x1e3d, 0x1e3f, 0x1e3f, 0x1e41, 0x1e41, 0x1e43, 0x1e43, 0x1e45, 0x1e45, 0x1e47, 0x1e47, /* 0x1e40 */ 0x1e49, 0x1e49, 0x1e4b, 0x1e4b, 0x1e4d, 0x1e4d, 0x1e4f, 0x1e4f, 0x1e51, 0x1e51, 0x1e53, 0x1e53, 0x1e55, 0x1e55, 0x1e57, 0x1e57, 0x1e59, 0x1e59, 0x1e5b, 0x1e5b, 0x1e5d, 0x1e5d, 0x1e5f, 0x1e5f, 0x1e61, 0x1e61, 0x1e63, 0x1e63, 0x1e65, 0x1e65, 0x1e67, 0x1e67, 0x1e69, 0x1e69, 0x1e6b, 0x1e6b, 0x1e6d, 0x1e6d, 0x1e6f, 0x1e6f, 0x1e71, 0x1e71, 0x1e73, 0x1e73, 0x1e75, 0x1e75, 0x1e77, 0x1e77, 0x1e79, 0x1e79, 0x1e7b, 0x1e7b, 0x1e7d, 0x1e7d, 0x1e7f, 0x1e7f, 0x1e81, 0x1e81, 0x1e83, 0x1e83, 0x1e85, 0x1e85, 0x1e87, 0x1e87, /* 0x1e80 */ 0x1e89, 0x1e89, 0x1e8b, 0x1e8b, 0x1e8d, 0x1e8d, 0x1e8f, 0x1e8f, 0x1e91, 0x1e91, 0x1e93, 0x1e93, 0x1e95, 0x1e95, 0x1e96, 0x1e97, 0x1e98, 0x1e99, 0x1e9a, 0x1e9b, 0x1e9c, 0x1e9d, 0x00df, 0x1e9f, 0x1ea1, 0x1ea1, 0x1ea3, 0x1ea3, 0x1ea5, 0x1ea5, 0x1ea7, 0x1ea7, 0x1ea9, 0x1ea9, 0x1eab, 0x1eab, 0x1ead, 0x1ead, 0x1eaf, 0x1eaf, 0x1eb1, 0x1eb1, 0x1eb3, 0x1eb3, 0x1eb5, 0x1eb5, 0x1eb7, 0x1eb7, 0x1eb9, 0x1eb9, 0x1ebb, 0x1ebb, 0x1ebd, 0x1ebd, 0x1ebf, 0x1ebf, 0x1ec1, 0x1ec1, 0x1ec3, 0x1ec3, 0x1ec5, 0x1ec5, 0x1ec7, 0x1ec7, /* 0x1ec0 */ 0x1ec9, 0x1ec9, 0x1ecb, 0x1ecb, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecf, 0x1ed1, 0x1ed1, 0x1ed3, 0x1ed3, 0x1ed5, 0x1ed5, 0x1ed7, 0x1ed7, 0x1ed9, 0x1ed9, 0x1edb, 0x1edb, 0x1edd, 0x1edd, 0x1edf, 0x1edf, 0x1ee1, 0x1ee1, 0x1ee3, 0x1ee3, 0x1ee5, 0x1ee5, 0x1ee7, 0x1ee7, 0x1ee9, 0x1ee9, 0x1eeb, 0x1eeb, 0x1eed, 0x1eed, 0x1eef, 0x1eef, 0x1ef1, 0x1ef1, 0x1ef3, 0x1ef3, 0x1ef5, 0x1ef5, 0x1ef7, 0x1ef7, 0x1ef9, 0x1ef9, 0x1efb, 0x1efb, 0x1efd, 0x1efd, 0x1eff, 0x1eff, 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, /* 0x1f00 */ 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x0000, 0x0000, 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x0000, 0x0000, 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, /* 0x1f40 */ 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x0000, 0x0000, 0x1f50, 0x1f51, 0x1f52, 0x1f53, 0x1f54, 0x1f55, 0x1f56, 0x1f57, 0x0000, 0x1f51, 0x0000, 0x1f53, 0x0000, 0x1f55, 0x0000, 0x1f57, 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, 0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1f76, 0x1f77, 0x1f78, 0x1f79, 0x1f7a, 0x1f7b, 0x1f7c, 0x1f7d, 0x0000, 0x0000, 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, /* 0x1f80 */ 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87, 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97, 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7, 0x1fb0, 0x1fb1, 0x1fb2, 0x1fb3, 0x1fb4, 0x0000, 0x1fb6, 0x1fb7, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0x1fbd, 0x1fbe, 0x1fbf, 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, 0x1fc4, 0x0000, 0x1fc6, 0x1fc7, /* 0x1fc0 */ 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0x1fcd, 0x1fce, 0x1fcf, 0x1fd0, 0x1fd1, 0x1fd2, 0x1fd3, 0x0000, 0x0000, 0x1fd6, 0x1fd7, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x0000, 0x1fdd, 0x1fde, 0x1fdf, 0x1fe0, 0x1fe1, 0x1fe2, 0x1fe3, 0x1fe4, 0x1fe5, 0x1fe6, 0x1fe7, 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1fed, 0x1fee, 0x1fef, 0x0000, 0x0000, 0x1ff2, 0x1ff3, 0x1ff4, 0x0000, 0x1ff6, 0x1ff7, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0x1ffd, 0x1ffe, 0x0000, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, /* 0x2000 */ 0x2008, 0x2009, 0x200a, 0x200b, 0x200c, 0x200d, 0x200e, 0x200f, 0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x201a, 0x201b, 0x201c, 0x201d, 0x201e, 0x201f, 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, 0x2025, 0x2026, 0x2027, 0x2028, 0x2029, 0x202a, 0x202b, 0x202c, 0x202d, 0x202e, 0x202f, 0x2030, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x203a, 0x203b, 0x203c, 0x203d, 0x203e, 0x203f, 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, 0x2047, /* 0x2040 */ 0x2048, 0x2049, 0x204a, 0x204b, 0x204c, 0x204d, 0x204e, 0x204f, 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x205a, 0x205b, 0x205c, 0x205d, 0x205e, 0x205f, 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x0000, 0x2066, 0x2067, 0x2068, 0x2069, 0x206a, 0x206b, 0x206c, 0x206d, 0x206e, 0x206f, 0x2070, 0x2071, 0x0000, 0x0000, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207a, 0x207b, 0x207c, 0x207d, 0x207e, 0x207f, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, /* 0x2080 */ 0x2088, 0x2089, 0x208a, 0x208b, 0x208c, 0x208d, 0x208e, 0x0000, 0x2090, 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x209a, 0x209b, 0x209c, 0x0000, 0x0000, 0x0000, 0x20a0, 0x20a1, 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, 0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac, 0x20ad, 0x20ae, 0x20af, 0x20b0, 0x20b1, 0x20b2, 0x20b3, 0x20b4, 0x20b5, 0x20b6, 0x20b7, 0x20b8, 0x20b9, 0x20ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x20c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20d0, 0x20d1, 0x20d2, 0x20d3, 0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20d8, 0x20d9, 0x20da, 0x20db, 0x20dc, 0x20dd, 0x20de, 0x20df, 0x20e0, 0x20e1, 0x20e2, 0x20e3, 0x20e4, 0x20e5, 0x20e6, 0x20e7, 0x20e8, 0x20e9, 0x20ea, 0x20eb, 0x20ec, 0x20ed, 0x20ee, 0x20ef, 0x20f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, /* 0x2100 */ 0x2108, 0x2109, 0x210a, 0x210b, 0x210c, 0x210d, 0x210e, 0x210f, 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x211a, 0x211b, 0x211c, 0x211d, 0x211e, 0x211f, 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x03c9, 0x2127, 0x2128, 0x2129, 0x006b, 0x00e5, 0x212c, 0x212d, 0x212e, 0x212f, 0x2130, 0x2131, 0x214e, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213c, 0x213d, 0x213e, 0x213f, 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, /* 0x2140 */ 0x2148, 0x2149, 0x214a, 0x214b, 0x214c, 0x214d, 0x214e, 0x214f, 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x215c, 0x215d, 0x215e, 0x215f, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217a, 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, 0x2180, 0x2181, 0x2182, 0x2184, 0x2184, 0x2185, 0x2186, 0x2187, /* 0x2180 */ 0x2188, 0x2189, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, 0x2198, 0x2199, 0x219a, 0x219b, 0x219c, 0x219d, 0x219e, 0x219f, 0x21a0, 0x21a1, 0x21a2, 0x21a3, 0x21a4, 0x21a5, 0x21a6, 0x21a7, 0x21a8, 0x21a9, 0x21aa, 0x21ab, 0x21ac, 0x21ad, 0x21ae, 0x21af, 0x21b0, 0x21b1, 0x21b2, 0x21b3, 0x21b4, 0x21b5, 0x21b6, 0x21b7, 0x21b8, 0x21b9, 0x21ba, 0x21bb, 0x21bc, 0x21bd, 0x21be, 0x21bf, 0x21c0, 0x21c1, 0x21c2, 0x21c3, 0x21c4, 0x21c5, 0x21c6, 0x21c7, /* 0x21c0 */ 0x21c8, 0x21c9, 0x21ca, 0x21cb, 0x21cc, 0x21cd, 0x21ce, 0x21cf, 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x21d4, 0x21d5, 0x21d6, 0x21d7, 0x21d8, 0x21d9, 0x21da, 0x21db, 0x21dc, 0x21dd, 0x21de, 0x21df, 0x21e0, 0x21e1, 0x21e2, 0x21e3, 0x21e4, 0x21e5, 0x21e6, 0x21e7, 0x21e8, 0x21e9, 0x21ea, 0x21eb, 0x21ec, 0x21ed, 0x21ee, 0x21ef, 0x21f0, 0x21f1, 0x21f2, 0x21f3, 0x21f4, 0x21f5, 0x21f6, 0x21f7, 0x21f8, 0x21f9, 0x21fa, 0x21fb, 0x21fc, 0x21fd, 0x21fe, 0x21ff, 0x2200, 0x2201, 0x2202, 0x2203, 0x2204, 0x2205, 0x2206, 0x2207, /* 0x2200 */ 0x2208, 0x2209, 0x220a, 0x220b, 0x220c, 0x220d, 0x220e, 0x220f, 0x2210, 0x2211, 0x2212, 0x2213, 0x2214, 0x2215, 0x2216, 0x2217, 0x2218, 0x2219, 0x221a, 0x221b, 0x221c, 0x221d, 0x221e, 0x221f, 0x2220, 0x2221, 0x2222, 0x2223, 0x2224, 0x2225, 0x2226, 0x2227, 0x2228, 0x2229, 0x222a, 0x222b, 0x222c, 0x222d, 0x222e, 0x222f, 0x2230, 0x2231, 0x2232, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a, 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2245, 0x2246, 0x2247, /* 0x2240 */ 0x2248, 0x2249, 0x224a, 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252, 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260, 0x2261, 0x2262, 0x2263, 0x2264, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, 0x226f, 0x2270, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x227d, 0x227e, 0x227f, 0x2280, 0x2281, 0x2282, 0x2283, 0x2284, 0x2285, 0x2286, 0x2287, /* 0x2280 */ 0x2288, 0x2289, 0x228a, 0x228b, 0x228c, 0x228d, 0x228e, 0x228f, 0x2290, 0x2291, 0x2292, 0x2293, 0x2294, 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x229a, 0x229b, 0x229c, 0x229d, 0x229e, 0x229f, 0x22a0, 0x22a1, 0x22a2, 0x22a3, 0x22a4, 0x22a5, 0x22a6, 0x22a7, 0x22a8, 0x22a9, 0x22aa, 0x22ab, 0x22ac, 0x22ad, 0x22ae, 0x22af, 0x22b0, 0x22b1, 0x22b2, 0x22b3, 0x22b4, 0x22b5, 0x22b6, 0x22b7, 0x22b8, 0x22b9, 0x22ba, 0x22bb, 0x22bc, 0x22bd, 0x22be, 0x22bf, 0x22c0, 0x22c1, 0x22c2, 0x22c3, 0x22c4, 0x22c5, 0x22c6, 0x22c7, /* 0x22c0 */ 0x22c8, 0x22c9, 0x22ca, 0x22cb, 0x22cc, 0x22cd, 0x22ce, 0x22cf, 0x22d0, 0x22d1, 0x22d2, 0x22d3, 0x22d4, 0x22d5, 0x22d6, 0x22d7, 0x22d8, 0x22d9, 0x22da, 0x22db, 0x22dc, 0x22dd, 0x22de, 0x22df, 0x22e0, 0x22e1, 0x22e2, 0x22e3, 0x22e4, 0x22e5, 0x22e6, 0x22e7, 0x22e8, 0x22e9, 0x22ea, 0x22eb, 0x22ec, 0x22ed, 0x22ee, 0x22ef, 0x22f0, 0x22f1, 0x22f2, 0x22f3, 0x22f4, 0x22f5, 0x22f6, 0x22f7, 0x22f8, 0x22f9, 0x22fa, 0x22fb, 0x22fc, 0x22fd, 0x22fe, 0x22ff, 0x2300, 0x2301, 0x2302, 0x2303, 0x2304, 0x2305, 0x2306, 0x2307, /* 0x2300 */ 0x2308, 0x2309, 0x230a, 0x230b, 0x230c, 0x230d, 0x230e, 0x230f, 0x2310, 0x2311, 0x2312, 0x2313, 0x2314, 0x2315, 0x2316, 0x2317, 0x2318, 0x2319, 0x231a, 0x231b, 0x231c, 0x231d, 0x231e, 0x231f, 0x2320, 0x2321, 0x2322, 0x2323, 0x2324, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, /* 0x2340 */ 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d, 0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d, 0x237e, 0x237f, 0x2380, 0x2381, 0x2382, 0x2383, 0x2384, 0x2385, 0x2386, 0x2387, /* 0x2380 */ 0x2388, 0x2389, 0x238a, 0x238b, 0x238c, 0x238d, 0x238e, 0x238f, 0x2390, 0x2391, 0x2392, 0x2393, 0x2394, 0x2395, 0x2396, 0x2397, 0x2398, 0x2399, 0x239a, 0x239b, 0x239c, 0x239d, 0x239e, 0x239f, 0x23a0, 0x23a1, 0x23a2, 0x23a3, 0x23a4, 0x23a5, 0x23a6, 0x23a7, 0x23a8, 0x23a9, 0x23aa, 0x23ab, 0x23ac, 0x23ad, 0x23ae, 0x23af, 0x23b0, 0x23b1, 0x23b2, 0x23b3, 0x23b4, 0x23b5, 0x23b6, 0x23b7, 0x23b8, 0x23b9, 0x23ba, 0x23bb, 0x23bc, 0x23bd, 0x23be, 0x23bf, 0x23c0, 0x23c1, 0x23c2, 0x23c3, 0x23c4, 0x23c5, 0x23c6, 0x23c7, /* 0x23c0 */ 0x23c8, 0x23c9, 0x23ca, 0x23cb, 0x23cc, 0x23cd, 0x23ce, 0x23cf, 0x23d0, 0x23d1, 0x23d2, 0x23d3, 0x23d4, 0x23d5, 0x23d6, 0x23d7, 0x23d8, 0x23d9, 0x23da, 0x23db, 0x23dc, 0x23dd, 0x23de, 0x23df, 0x23e0, 0x23e1, 0x23e2, 0x23e3, 0x23e4, 0x23e5, 0x23e6, 0x23e7, 0x23e8, 0x23e9, 0x23ea, 0x23eb, 0x23ec, 0x23ed, 0x23ee, 0x23ef, 0x23f0, 0x23f1, 0x23f2, 0x23f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, /* 0x2400 */ 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, 0x2420, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, /* 0x2440 */ 0x2448, 0x2449, 0x244a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, /* 0x2480 */ 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249a, 0x249b, 0x249c, 0x249d, 0x249e, 0x249f, 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, /* 0x24c0 */ 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x24ea, 0x24eb, 0x24ec, 0x24ed, 0x24ee, 0x24ef, 0x24f0, 0x24f1, 0x24f2, 0x24f3, 0x24f4, 0x24f5, 0x24f6, 0x24f7, 0x24f8, 0x24f9, 0x24fa, 0x24fb, 0x24fc, 0x24fd, 0x24fe, 0x24ff, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, /* 0x2500 */ 0x2508, 0x2509, 0x250a, 0x250b, 0x250c, 0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c, 0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, /* 0x2540 */ 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, 0x2578, 0x2579, 0x257a, 0x257b, 0x257c, 0x257d, 0x257e, 0x257f, 0x2580, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, /* 0x2580 */ 0x2588, 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2590, 0x2591, 0x2592, 0x2593, 0x2594, 0x2595, 0x2596, 0x2597, 0x2598, 0x2599, 0x259a, 0x259b, 0x259c, 0x259d, 0x259e, 0x259f, 0x25a0, 0x25a1, 0x25a2, 0x25a3, 0x25a4, 0x25a5, 0x25a6, 0x25a7, 0x25a8, 0x25a9, 0x25aa, 0x25ab, 0x25ac, 0x25ad, 0x25ae, 0x25af, 0x25b0, 0x25b1, 0x25b2, 0x25b3, 0x25b4, 0x25b5, 0x25b6, 0x25b7, 0x25b8, 0x25b9, 0x25ba, 0x25bb, 0x25bc, 0x25bd, 0x25be, 0x25bf, 0x25c0, 0x25c1, 0x25c2, 0x25c3, 0x25c4, 0x25c5, 0x25c6, 0x25c7, /* 0x25c0 */ 0x25c8, 0x25c9, 0x25ca, 0x25cb, 0x25cc, 0x25cd, 0x25ce, 0x25cf, 0x25d0, 0x25d1, 0x25d2, 0x25d3, 0x25d4, 0x25d5, 0x25d6, 0x25d7, 0x25d8, 0x25d9, 0x25da, 0x25db, 0x25dc, 0x25dd, 0x25de, 0x25df, 0x25e0, 0x25e1, 0x25e2, 0x25e3, 0x25e4, 0x25e5, 0x25e6, 0x25e7, 0x25e8, 0x25e9, 0x25ea, 0x25eb, 0x25ec, 0x25ed, 0x25ee, 0x25ef, 0x25f0, 0x25f1, 0x25f2, 0x25f3, 0x25f4, 0x25f5, 0x25f6, 0x25f7, 0x25f8, 0x25f9, 0x25fa, 0x25fb, 0x25fc, 0x25fd, 0x25fe, 0x25ff, 0x2600, 0x2601, 0x2602, 0x2603, 0x2604, 0x2605, 0x2606, 0x2607, /* 0x2600 */ 0x2608, 0x2609, 0x260a, 0x260b, 0x260c, 0x260d, 0x260e, 0x260f, 0x2610, 0x2611, 0x2612, 0x2613, 0x2614, 0x2615, 0x2616, 0x2617, 0x2618, 0x2619, 0x261a, 0x261b, 0x261c, 0x261d, 0x261e, 0x261f, 0x2620, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2639, 0x263a, 0x263b, 0x263c, 0x263d, 0x263e, 0x263f, 0x2640, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, /* 0x2640 */ 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2659, 0x265a, 0x265b, 0x265c, 0x265d, 0x265e, 0x265f, 0x2660, 0x2661, 0x2662, 0x2663, 0x2664, 0x2665, 0x2666, 0x2667, 0x2668, 0x2669, 0x266a, 0x266b, 0x266c, 0x266d, 0x266e, 0x266f, 0x2670, 0x2671, 0x2672, 0x2673, 0x2674, 0x2675, 0x2676, 0x2677, 0x2678, 0x2679, 0x267a, 0x267b, 0x267c, 0x267d, 0x267e, 0x267f, 0x2680, 0x2681, 0x2682, 0x2683, 0x2684, 0x2685, 0x2686, 0x2687, /* 0x2680 */ 0x2688, 0x2689, 0x268a, 0x268b, 0x268c, 0x268d, 0x268e, 0x268f, 0x2690, 0x2691, 0x2692, 0x2693, 0x2694, 0x2695, 0x2696, 0x2697, 0x2698, 0x2699, 0x269a, 0x269b, 0x269c, 0x269d, 0x269e, 0x269f, 0x26a0, 0x26a1, 0x26a2, 0x26a3, 0x26a4, 0x26a5, 0x26a6, 0x26a7, 0x26a8, 0x26a9, 0x26aa, 0x26ab, 0x26ac, 0x26ad, 0x26ae, 0x26af, 0x26b0, 0x26b1, 0x26b2, 0x26b3, 0x26b4, 0x26b5, 0x26b6, 0x26b7, 0x26b8, 0x26b9, 0x26ba, 0x26bb, 0x26bc, 0x26bd, 0x26be, 0x26bf, 0x26c0, 0x26c1, 0x26c2, 0x26c3, 0x26c4, 0x26c5, 0x26c6, 0x26c7, /* 0x26c0 */ 0x26c8, 0x26c9, 0x26ca, 0x26cb, 0x26cc, 0x26cd, 0x26ce, 0x26cf, 0x26d0, 0x26d1, 0x26d2, 0x26d3, 0x26d4, 0x26d5, 0x26d6, 0x26d7, 0x26d8, 0x26d9, 0x26da, 0x26db, 0x26dc, 0x26dd, 0x26de, 0x26df, 0x26e0, 0x26e1, 0x26e2, 0x26e3, 0x26e4, 0x26e5, 0x26e6, 0x26e7, 0x26e8, 0x26e9, 0x26ea, 0x26eb, 0x26ec, 0x26ed, 0x26ee, 0x26ef, 0x26f0, 0x26f1, 0x26f2, 0x26f3, 0x26f4, 0x26f5, 0x26f6, 0x26f7, 0x26f8, 0x26f9, 0x26fa, 0x26fb, 0x26fc, 0x26fd, 0x26fe, 0x26ff, 0x0000, 0x2701, 0x2702, 0x2703, 0x2704, 0x2705, 0x2706, 0x2707, /* 0x2700 */ 0x2708, 0x2709, 0x270a, 0x270b, 0x270c, 0x270d, 0x270e, 0x270f, 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, 0x2718, 0x2719, 0x271a, 0x271b, 0x271c, 0x271d, 0x271e, 0x271f, 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, /* 0x2740 */ 0x2748, 0x2749, 0x274a, 0x274b, 0x274c, 0x274d, 0x274e, 0x274f, 0x2750, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2757, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776, 0x2777, 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, 0x277e, 0x277f, 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787, /* 0x2780 */ 0x2788, 0x2789, 0x278a, 0x278b, 0x278c, 0x278d, 0x278e, 0x278f, 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2795, 0x2796, 0x2797, 0x2798, 0x2799, 0x279a, 0x279b, 0x279c, 0x279d, 0x279e, 0x279f, 0x27a0, 0x27a1, 0x27a2, 0x27a3, 0x27a4, 0x27a5, 0x27a6, 0x27a7, 0x27a8, 0x27a9, 0x27aa, 0x27ab, 0x27ac, 0x27ad, 0x27ae, 0x27af, 0x27b0, 0x27b1, 0x27b2, 0x27b3, 0x27b4, 0x27b5, 0x27b6, 0x27b7, 0x27b8, 0x27b9, 0x27ba, 0x27bb, 0x27bc, 0x27bd, 0x27be, 0x27bf, 0x27c0, 0x27c1, 0x27c2, 0x27c3, 0x27c4, 0x27c5, 0x27c6, 0x27c7, /* 0x27c0 */ 0x27c8, 0x27c9, 0x27ca, 0x27cb, 0x27cc, 0x27cd, 0x27ce, 0x27cf, 0x27d0, 0x27d1, 0x27d2, 0x27d3, 0x27d4, 0x27d5, 0x27d6, 0x27d7, 0x27d8, 0x27d9, 0x27da, 0x27db, 0x27dc, 0x27dd, 0x27de, 0x27df, 0x27e0, 0x27e1, 0x27e2, 0x27e3, 0x27e4, 0x27e5, 0x27e6, 0x27e7, 0x27e8, 0x27e9, 0x27ea, 0x27eb, 0x27ec, 0x27ed, 0x27ee, 0x27ef, 0x27f0, 0x27f1, 0x27f2, 0x27f3, 0x27f4, 0x27f5, 0x27f6, 0x27f7, 0x27f8, 0x27f9, 0x27fa, 0x27fb, 0x27fc, 0x27fd, 0x27fe, 0x27ff, 0x2800, 0x2801, 0x2802, 0x2803, 0x2804, 0x2805, 0x2806, 0x2807, /* 0x2800 */ 0x2808, 0x2809, 0x280a, 0x280b, 0x280c, 0x280d, 0x280e, 0x280f, 0x2810, 0x2811, 0x2812, 0x2813, 0x2814, 0x2815, 0x2816, 0x2817, 0x2818, 0x2819, 0x281a, 0x281b, 0x281c, 0x281d, 0x281e, 0x281f, 0x2820, 0x2821, 0x2822, 0x2823, 0x2824, 0x2825, 0x2826, 0x2827, 0x2828, 0x2829, 0x282a, 0x282b, 0x282c, 0x282d, 0x282e, 0x282f, 0x2830, 0x2831, 0x2832, 0x2833, 0x2834, 0x2835, 0x2836, 0x2837, 0x2838, 0x2839, 0x283a, 0x283b, 0x283c, 0x283d, 0x283e, 0x283f, 0x2840, 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, 0x2846, 0x2847, /* 0x2840 */ 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x286a, 0x286b, 0x286c, 0x286d, 0x286e, 0x286f, 0x2870, 0x2871, 0x2872, 0x2873, 0x2874, 0x2875, 0x2876, 0x2877, 0x2878, 0x2879, 0x287a, 0x287b, 0x287c, 0x287d, 0x287e, 0x287f, 0x2880, 0x2881, 0x2882, 0x2883, 0x2884, 0x2885, 0x2886, 0x2887, /* 0x2880 */ 0x2888, 0x2889, 0x288a, 0x288b, 0x288c, 0x288d, 0x288e, 0x288f, 0x2890, 0x2891, 0x2892, 0x2893, 0x2894, 0x2895, 0x2896, 0x2897, 0x2898, 0x2899, 0x289a, 0x289b, 0x289c, 0x289d, 0x289e, 0x289f, 0x28a0, 0x28a1, 0x28a2, 0x28a3, 0x28a4, 0x28a5, 0x28a6, 0x28a7, 0x28a8, 0x28a9, 0x28aa, 0x28ab, 0x28ac, 0x28ad, 0x28ae, 0x28af, 0x28b0, 0x28b1, 0x28b2, 0x28b3, 0x28b4, 0x28b5, 0x28b6, 0x28b7, 0x28b8, 0x28b9, 0x28ba, 0x28bb, 0x28bc, 0x28bd, 0x28be, 0x28bf, 0x28c0, 0x28c1, 0x28c2, 0x28c3, 0x28c4, 0x28c5, 0x28c6, 0x28c7, /* 0x28c0 */ 0x28c8, 0x28c9, 0x28ca, 0x28cb, 0x28cc, 0x28cd, 0x28ce, 0x28cf, 0x28d0, 0x28d1, 0x28d2, 0x28d3, 0x28d4, 0x28d5, 0x28d6, 0x28d7, 0x28d8, 0x28d9, 0x28da, 0x28db, 0x28dc, 0x28dd, 0x28de, 0x28df, 0x28e0, 0x28e1, 0x28e2, 0x28e3, 0x28e4, 0x28e5, 0x28e6, 0x28e7, 0x28e8, 0x28e9, 0x28ea, 0x28eb, 0x28ec, 0x28ed, 0x28ee, 0x28ef, 0x28f0, 0x28f1, 0x28f2, 0x28f3, 0x28f4, 0x28f5, 0x28f6, 0x28f7, 0x28f8, 0x28f9, 0x28fa, 0x28fb, 0x28fc, 0x28fd, 0x28fe, 0x28ff, 0x2900, 0x2901, 0x2902, 0x2903, 0x2904, 0x2905, 0x2906, 0x2907, /* 0x2900 */ 0x2908, 0x2909, 0x290a, 0x290b, 0x290c, 0x290d, 0x290e, 0x290f, 0x2910, 0x2911, 0x2912, 0x2913, 0x2914, 0x2915, 0x2916, 0x2917, 0x2918, 0x2919, 0x291a, 0x291b, 0x291c, 0x291d, 0x291e, 0x291f, 0x2920, 0x2921, 0x2922, 0x2923, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929, 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, /* 0x2940 */ 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, 0x2975, 0x2976, 0x2977, 0x2978, 0x2979, 0x297a, 0x297b, 0x297c, 0x297d, 0x297e, 0x297f, 0x2980, 0x2981, 0x2982, 0x2983, 0x2984, 0x2985, 0x2986, 0x2987, /* 0x2980 */ 0x2988, 0x2989, 0x298a, 0x298b, 0x298c, 0x298d, 0x298e, 0x298f, 0x2990, 0x2991, 0x2992, 0x2993, 0x2994, 0x2995, 0x2996, 0x2997, 0x2998, 0x2999, 0x299a, 0x299b, 0x299c, 0x299d, 0x299e, 0x299f, 0x29a0, 0x29a1, 0x29a2, 0x29a3, 0x29a4, 0x29a5, 0x29a6, 0x29a7, 0x29a8, 0x29a9, 0x29aa, 0x29ab, 0x29ac, 0x29ad, 0x29ae, 0x29af, 0x29b0, 0x29b1, 0x29b2, 0x29b3, 0x29b4, 0x29b5, 0x29b6, 0x29b7, 0x29b8, 0x29b9, 0x29ba, 0x29bb, 0x29bc, 0x29bd, 0x29be, 0x29bf, 0x29c0, 0x29c1, 0x29c2, 0x29c3, 0x29c4, 0x29c5, 0x29c6, 0x29c7, /* 0x29c0 */ 0x29c8, 0x29c9, 0x29ca, 0x29cb, 0x29cc, 0x29cd, 0x29ce, 0x29cf, 0x29d0, 0x29d1, 0x29d2, 0x29d3, 0x29d4, 0x29d5, 0x29d6, 0x29d7, 0x29d8, 0x29d9, 0x29da, 0x29db, 0x29dc, 0x29dd, 0x29de, 0x29df, 0x29e0, 0x29e1, 0x29e2, 0x29e3, 0x29e4, 0x29e5, 0x29e6, 0x29e7, 0x29e8, 0x29e9, 0x29ea, 0x29eb, 0x29ec, 0x29ed, 0x29ee, 0x29ef, 0x29f0, 0x29f1, 0x29f2, 0x29f3, 0x29f4, 0x29f5, 0x29f6, 0x29f7, 0x29f8, 0x29f9, 0x29fa, 0x29fb, 0x29fc, 0x29fd, 0x29fe, 0x29ff, 0x2a00, 0x2a01, 0x2a02, 0x2a03, 0x2a04, 0x2a05, 0x2a06, 0x2a07, /* 0x2a00 */ 0x2a08, 0x2a09, 0x2a0a, 0x2a0b, 0x2a0c, 0x2a0d, 0x2a0e, 0x2a0f, 0x2a10, 0x2a11, 0x2a12, 0x2a13, 0x2a14, 0x2a15, 0x2a16, 0x2a17, 0x2a18, 0x2a19, 0x2a1a, 0x2a1b, 0x2a1c, 0x2a1d, 0x2a1e, 0x2a1f, 0x2a20, 0x2a21, 0x2a22, 0x2a23, 0x2a24, 0x2a25, 0x2a26, 0x2a27, 0x2a28, 0x2a29, 0x2a2a, 0x2a2b, 0x2a2c, 0x2a2d, 0x2a2e, 0x2a2f, 0x2a30, 0x2a31, 0x2a32, 0x2a33, 0x2a34, 0x2a35, 0x2a36, 0x2a37, 0x2a38, 0x2a39, 0x2a3a, 0x2a3b, 0x2a3c, 0x2a3d, 0x2a3e, 0x2a3f, 0x2a40, 0x2a41, 0x2a42, 0x2a43, 0x2a44, 0x2a45, 0x2a46, 0x2a47, /* 0x2a40 */ 0x2a48, 0x2a49, 0x2a4a, 0x2a4b, 0x2a4c, 0x2a4d, 0x2a4e, 0x2a4f, 0x2a50, 0x2a51, 0x2a52, 0x2a53, 0x2a54, 0x2a55, 0x2a56, 0x2a57, 0x2a58, 0x2a59, 0x2a5a, 0x2a5b, 0x2a5c, 0x2a5d, 0x2a5e, 0x2a5f, 0x2a60, 0x2a61, 0x2a62, 0x2a63, 0x2a64, 0x2a65, 0x2a66, 0x2a67, 0x2a68, 0x2a69, 0x2a6a, 0x2a6b, 0x2a6c, 0x2a6d, 0x2a6e, 0x2a6f, 0x2a70, 0x2a71, 0x2a72, 0x2a73, 0x2a74, 0x2a75, 0x2a76, 0x2a77, 0x2a78, 0x2a79, 0x2a7a, 0x2a7b, 0x2a7c, 0x2a7d, 0x2a7e, 0x2a7f, 0x2a80, 0x2a81, 0x2a82, 0x2a83, 0x2a84, 0x2a85, 0x2a86, 0x2a87, /* 0x2a80 */ 0x2a88, 0x2a89, 0x2a8a, 0x2a8b, 0x2a8c, 0x2a8d, 0x2a8e, 0x2a8f, 0x2a90, 0x2a91, 0x2a92, 0x2a93, 0x2a94, 0x2a95, 0x2a96, 0x2a97, 0x2a98, 0x2a99, 0x2a9a, 0x2a9b, 0x2a9c, 0x2a9d, 0x2a9e, 0x2a9f, 0x2aa0, 0x2aa1, 0x2aa2, 0x2aa3, 0x2aa4, 0x2aa5, 0x2aa6, 0x2aa7, 0x2aa8, 0x2aa9, 0x2aaa, 0x2aab, 0x2aac, 0x2aad, 0x2aae, 0x2aaf, 0x2ab0, 0x2ab1, 0x2ab2, 0x2ab3, 0x2ab4, 0x2ab5, 0x2ab6, 0x2ab7, 0x2ab8, 0x2ab9, 0x2aba, 0x2abb, 0x2abc, 0x2abd, 0x2abe, 0x2abf, 0x2ac0, 0x2ac1, 0x2ac2, 0x2ac3, 0x2ac4, 0x2ac5, 0x2ac6, 0x2ac7, /* 0x2ac0 */ 0x2ac8, 0x2ac9, 0x2aca, 0x2acb, 0x2acc, 0x2acd, 0x2ace, 0x2acf, 0x2ad0, 0x2ad1, 0x2ad2, 0x2ad3, 0x2ad4, 0x2ad5, 0x2ad6, 0x2ad7, 0x2ad8, 0x2ad9, 0x2ada, 0x2adb, 0x2adc, 0x2add, 0x2ade, 0x2adf, 0x2ae0, 0x2ae1, 0x2ae2, 0x2ae3, 0x2ae4, 0x2ae5, 0x2ae6, 0x2ae7, 0x2ae8, 0x2ae9, 0x2aea, 0x2aeb, 0x2aec, 0x2aed, 0x2aee, 0x2aef, 0x2af0, 0x2af1, 0x2af2, 0x2af3, 0x2af4, 0x2af5, 0x2af6, 0x2af7, 0x2af8, 0x2af9, 0x2afa, 0x2afb, 0x2afc, 0x2afd, 0x2afe, 0x2aff, 0x2b00, 0x2b01, 0x2b02, 0x2b03, 0x2b04, 0x2b05, 0x2b06, 0x2b07, /* 0x2b00 */ 0x2b08, 0x2b09, 0x2b0a, 0x2b0b, 0x2b0c, 0x2b0d, 0x2b0e, 0x2b0f, 0x2b10, 0x2b11, 0x2b12, 0x2b13, 0x2b14, 0x2b15, 0x2b16, 0x2b17, 0x2b18, 0x2b19, 0x2b1a, 0x2b1b, 0x2b1c, 0x2b1d, 0x2b1e, 0x2b1f, 0x2b20, 0x2b21, 0x2b22, 0x2b23, 0x2b24, 0x2b25, 0x2b26, 0x2b27, 0x2b28, 0x2b29, 0x2b2a, 0x2b2b, 0x2b2c, 0x2b2d, 0x2b2e, 0x2b2f, 0x2b30, 0x2b31, 0x2b32, 0x2b33, 0x2b34, 0x2b35, 0x2b36, 0x2b37, 0x2b38, 0x2b39, 0x2b3a, 0x2b3b, 0x2b3c, 0x2b3d, 0x2b3e, 0x2b3f, 0x2b40, 0x2b41, 0x2b42, 0x2b43, 0x2b44, 0x2b45, 0x2b46, 0x2b47, /* 0x2b40 */ 0x2b48, 0x2b49, 0x2b4a, 0x2b4b, 0x2b4c, 0x0000, 0x0000, 0x0000, 0x2b50, 0x2b51, 0x2b52, 0x2b53, 0x2b54, 0x2b55, 0x2b56, 0x2b57, 0x2b58, 0x2b59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, /* 0x2c00 */ 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2c48, 0x2c49, 0x2c4a, 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c57, 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x0000, 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, /* 0x2c40 */ 0x2c48, 0x2c49, 0x2c4a, 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c57, 0x2c58, 0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x0000, 0x2c61, 0x2c61, 0x026b, 0x1d7d, 0x027d, 0x2c65, 0x2c66, 0x2c68, 0x2c68, 0x2c6a, 0x2c6a, 0x2c6c, 0x2c6c, 0x0251, 0x0271, 0x0250, 0x0252, 0x2c71, 0x2c73, 0x2c73, 0x2c74, 0x2c76, 0x2c76, 0x2c77, 0x2c78, 0x2c79, 0x2c7a, 0x2c7b, 0x2c7c, 0x2c7d, 0x023f, 0x0240, 0x2c81, 0x2c81, 0x2c83, 0x2c83, 0x2c85, 0x2c85, 0x2c87, 0x2c87, /* 0x2c80 */ 0x2c89, 0x2c89, 0x2c8b, 0x2c8b, 0x2c8d, 0x2c8d, 0x2c8f, 0x2c8f, 0x2c91, 0x2c91, 0x2c93, 0x2c93, 0x2c95, 0x2c95, 0x2c97, 0x2c97, 0x2c99, 0x2c99, 0x2c9b, 0x2c9b, 0x2c9d, 0x2c9d, 0x2c9f, 0x2c9f, 0x2ca1, 0x2ca1, 0x2ca3, 0x2ca3, 0x2ca5, 0x2ca5, 0x2ca7, 0x2ca7, 0x2ca9, 0x2ca9, 0x2cab, 0x2cab, 0x2cad, 0x2cad, 0x2caf, 0x2caf, 0x2cb1, 0x2cb1, 0x2cb3, 0x2cb3, 0x2cb5, 0x2cb5, 0x2cb7, 0x2cb7, 0x2cb9, 0x2cb9, 0x2cbb, 0x2cbb, 0x2cbd, 0x2cbd, 0x2cbf, 0x2cbf, 0x2cc1, 0x2cc1, 0x2cc3, 0x2cc3, 0x2cc5, 0x2cc5, 0x2cc7, 0x2cc7, /* 0x2cc0 */ 0x2cc9, 0x2cc9, 0x2ccb, 0x2ccb, 0x2ccd, 0x2ccd, 0x2ccf, 0x2ccf, 0x2cd1, 0x2cd1, 0x2cd3, 0x2cd3, 0x2cd5, 0x2cd5, 0x2cd7, 0x2cd7, 0x2cd9, 0x2cd9, 0x2cdb, 0x2cdb, 0x2cdd, 0x2cdd, 0x2cdf, 0x2cdf, 0x2ce1, 0x2ce1, 0x2ce3, 0x2ce3, 0x2ce4, 0x2ce5, 0x2ce6, 0x2ce7, 0x2ce8, 0x2ce9, 0x2cea, 0x2cec, 0x2cec, 0x2cee, 0x2cee, 0x2cef, 0x2cf0, 0x2cf1, 0x2cf3, 0x2cf3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2cf9, 0x2cfa, 0x2cfb, 0x2cfc, 0x2cfd, 0x2cfe, 0x2cff, 0x2d00, 0x2d01, 0x2d02, 0x2d03, 0x2d04, 0x2d05, 0x2d06, 0x2d07, /* 0x2d00 */ 0x2d08, 0x2d09, 0x2d0a, 0x2d0b, 0x2d0c, 0x2d0d, 0x2d0e, 0x2d0f, 0x2d10, 0x2d11, 0x2d12, 0x2d13, 0x2d14, 0x2d15, 0x2d16, 0x2d17, 0x2d18, 0x2d19, 0x2d1a, 0x2d1b, 0x2d1c, 0x2d1d, 0x2d1e, 0x2d1f, 0x2d20, 0x2d21, 0x2d22, 0x2d23, 0x2d24, 0x2d25, 0x0000, 0x2d27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d2d, 0x0000, 0x0000, 0x2d30, 0x2d31, 0x2d32, 0x2d33, 0x2d34, 0x2d35, 0x2d36, 0x2d37, 0x2d38, 0x2d39, 0x2d3a, 0x2d3b, 0x2d3c, 0x2d3d, 0x2d3e, 0x2d3f, 0x2d40, 0x2d41, 0x2d42, 0x2d43, 0x2d44, 0x2d45, 0x2d46, 0x2d47, /* 0x2d40 */ 0x2d48, 0x2d49, 0x2d4a, 0x2d4b, 0x2d4c, 0x2d4d, 0x2d4e, 0x2d4f, 0x2d50, 0x2d51, 0x2d52, 0x2d53, 0x2d54, 0x2d55, 0x2d56, 0x2d57, 0x2d58, 0x2d59, 0x2d5a, 0x2d5b, 0x2d5c, 0x2d5d, 0x2d5e, 0x2d5f, 0x2d60, 0x2d61, 0x2d62, 0x2d63, 0x2d64, 0x2d65, 0x2d66, 0x2d67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d6f, 0x2d70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d7f, 0x2d80, 0x2d81, 0x2d82, 0x2d83, 0x2d84, 0x2d85, 0x2d86, 0x2d87, /* 0x2d80 */ 0x2d88, 0x2d89, 0x2d8a, 0x2d8b, 0x2d8c, 0x2d8d, 0x2d8e, 0x2d8f, 0x2d90, 0x2d91, 0x2d92, 0x2d93, 0x2d94, 0x2d95, 0x2d96, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2da0, 0x2da1, 0x2da2, 0x2da3, 0x2da4, 0x2da5, 0x2da6, 0x0000, 0x2da8, 0x2da9, 0x2daa, 0x2dab, 0x2dac, 0x2dad, 0x2dae, 0x0000, 0x2db0, 0x2db1, 0x2db2, 0x2db3, 0x2db4, 0x2db5, 0x2db6, 0x0000, 0x2db8, 0x2db9, 0x2dba, 0x2dbb, 0x2dbc, 0x2dbd, 0x2dbe, 0x0000, 0x2dc0, 0x2dc1, 0x2dc2, 0x2dc3, 0x2dc4, 0x2dc5, 0x2dc6, 0x0000, /* 0x2dc0 */ 0x2dc8, 0x2dc9, 0x2dca, 0x2dcb, 0x2dcc, 0x2dcd, 0x2dce, 0x0000, 0x2dd0, 0x2dd1, 0x2dd2, 0x2dd3, 0x2dd4, 0x2dd5, 0x2dd6, 0x0000, 0x2dd8, 0x2dd9, 0x2dda, 0x2ddb, 0x2ddc, 0x2ddd, 0x2dde, 0x0000, 0x2de0, 0x2de1, 0x2de2, 0x2de3, 0x2de4, 0x2de5, 0x2de6, 0x2de7, 0x2de8, 0x2de9, 0x2dea, 0x2deb, 0x2dec, 0x2ded, 0x2dee, 0x2def, 0x2df0, 0x2df1, 0x2df2, 0x2df3, 0x2df4, 0x2df5, 0x2df6, 0x2df7, 0x2df8, 0x2df9, 0x2dfa, 0x2dfb, 0x2dfc, 0x2dfd, 0x2dfe, 0x2dff, 0x2e00, 0x2e01, 0x2e02, 0x2e03, 0x2e04, 0x2e05, 0x2e06, 0x2e07, /* 0x2e00 */ 0x2e08, 0x2e09, 0x2e0a, 0x2e0b, 0x2e0c, 0x2e0d, 0x2e0e, 0x2e0f, 0x2e10, 0x2e11, 0x2e12, 0x2e13, 0x2e14, 0x2e15, 0x2e16, 0x2e17, 0x2e18, 0x2e19, 0x2e1a, 0x2e1b, 0x2e1c, 0x2e1d, 0x2e1e, 0x2e1f, 0x2e20, 0x2e21, 0x2e22, 0x2e23, 0x2e24, 0x2e25, 0x2e26, 0x2e27, 0x2e28, 0x2e29, 0x2e2a, 0x2e2b, 0x2e2c, 0x2e2d, 0x2e2e, 0x2e2f, 0x2e30, 0x2e31, 0x2e32, 0x2e33, 0x2e34, 0x2e35, 0x2e36, 0x2e37, 0x2e38, 0x2e39, 0x2e3a, 0x2e3b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2e80, 0x2e81, 0x2e82, 0x2e83, 0x2e84, 0x2e85, 0x2e86, 0x2e87, /* 0x2e80 */ 0x2e88, 0x2e89, 0x2e8a, 0x2e8b, 0x2e8c, 0x2e8d, 0x2e8e, 0x2e8f, 0x2e90, 0x2e91, 0x2e92, 0x2e93, 0x2e94, 0x2e95, 0x2e96, 0x2e97, 0x2e98, 0x2e99, 0x0000, 0x2e9b, 0x2e9c, 0x2e9d, 0x2e9e, 0x2e9f, 0x2ea0, 0x2ea1, 0x2ea2, 0x2ea3, 0x2ea4, 0x2ea5, 0x2ea6, 0x2ea7, 0x2ea8, 0x2ea9, 0x2eaa, 0x2eab, 0x2eac, 0x2ead, 0x2eae, 0x2eaf, 0x2eb0, 0x2eb1, 0x2eb2, 0x2eb3, 0x2eb4, 0x2eb5, 0x2eb6, 0x2eb7, 0x2eb8, 0x2eb9, 0x2eba, 0x2ebb, 0x2ebc, 0x2ebd, 0x2ebe, 0x2ebf, 0x2ec0, 0x2ec1, 0x2ec2, 0x2ec3, 0x2ec4, 0x2ec5, 0x2ec6, 0x2ec7, /* 0x2ec0 */ 0x2ec8, 0x2ec9, 0x2eca, 0x2ecb, 0x2ecc, 0x2ecd, 0x2ece, 0x2ecf, 0x2ed0, 0x2ed1, 0x2ed2, 0x2ed3, 0x2ed4, 0x2ed5, 0x2ed6, 0x2ed7, 0x2ed8, 0x2ed9, 0x2eda, 0x2edb, 0x2edc, 0x2edd, 0x2ede, 0x2edf, 0x2ee0, 0x2ee1, 0x2ee2, 0x2ee3, 0x2ee4, 0x2ee5, 0x2ee6, 0x2ee7, 0x2ee8, 0x2ee9, 0x2eea, 0x2eeb, 0x2eec, 0x2eed, 0x2eee, 0x2eef, 0x2ef0, 0x2ef1, 0x2ef2, 0x2ef3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2f00, 0x2f01, 0x2f02, 0x2f03, 0x2f04, 0x2f05, 0x2f06, 0x2f07, /* 0x2f00 */ 0x2f08, 0x2f09, 0x2f0a, 0x2f0b, 0x2f0c, 0x2f0d, 0x2f0e, 0x2f0f, 0x2f10, 0x2f11, 0x2f12, 0x2f13, 0x2f14, 0x2f15, 0x2f16, 0x2f17, 0x2f18, 0x2f19, 0x2f1a, 0x2f1b, 0x2f1c, 0x2f1d, 0x2f1e, 0x2f1f, 0x2f20, 0x2f21, 0x2f22, 0x2f23, 0x2f24, 0x2f25, 0x2f26, 0x2f27, 0x2f28, 0x2f29, 0x2f2a, 0x2f2b, 0x2f2c, 0x2f2d, 0x2f2e, 0x2f2f, 0x2f30, 0x2f31, 0x2f32, 0x2f33, 0x2f34, 0x2f35, 0x2f36, 0x2f37, 0x2f38, 0x2f39, 0x2f3a, 0x2f3b, 0x2f3c, 0x2f3d, 0x2f3e, 0x2f3f, 0x2f40, 0x2f41, 0x2f42, 0x2f43, 0x2f44, 0x2f45, 0x2f46, 0x2f47, /* 0x2f40 */ 0x2f48, 0x2f49, 0x2f4a, 0x2f4b, 0x2f4c, 0x2f4d, 0x2f4e, 0x2f4f, 0x2f50, 0x2f51, 0x2f52, 0x2f53, 0x2f54, 0x2f55, 0x2f56, 0x2f57, 0x2f58, 0x2f59, 0x2f5a, 0x2f5b, 0x2f5c, 0x2f5d, 0x2f5e, 0x2f5f, 0x2f60, 0x2f61, 0x2f62, 0x2f63, 0x2f64, 0x2f65, 0x2f66, 0x2f67, 0x2f68, 0x2f69, 0x2f6a, 0x2f6b, 0x2f6c, 0x2f6d, 0x2f6e, 0x2f6f, 0x2f70, 0x2f71, 0x2f72, 0x2f73, 0x2f74, 0x2f75, 0x2f76, 0x2f77, 0x2f78, 0x2f79, 0x2f7a, 0x2f7b, 0x2f7c, 0x2f7d, 0x2f7e, 0x2f7f, 0x2f80, 0x2f81, 0x2f82, 0x2f83, 0x2f84, 0x2f85, 0x2f86, 0x2f87, /* 0x2f80 */ 0x2f88, 0x2f89, 0x2f8a, 0x2f8b, 0x2f8c, 0x2f8d, 0x2f8e, 0x2f8f, 0x2f90, 0x2f91, 0x2f92, 0x2f93, 0x2f94, 0x2f95, 0x2f96, 0x2f97, 0x2f98, 0x2f99, 0x2f9a, 0x2f9b, 0x2f9c, 0x2f9d, 0x2f9e, 0x2f9f, 0x2fa0, 0x2fa1, 0x2fa2, 0x2fa3, 0x2fa4, 0x2fa5, 0x2fa6, 0x2fa7, 0x2fa8, 0x2fa9, 0x2faa, 0x2fab, 0x2fac, 0x2fad, 0x2fae, 0x2faf, 0x2fb0, 0x2fb1, 0x2fb2, 0x2fb3, 0x2fb4, 0x2fb5, 0x2fb6, 0x2fb7, 0x2fb8, 0x2fb9, 0x2fba, 0x2fbb, 0x2fbc, 0x2fbd, 0x2fbe, 0x2fbf, 0x2fc0, 0x2fc1, 0x2fc2, 0x2fc3, 0x2fc4, 0x2fc5, 0x2fc6, 0x2fc7, /* 0x2fc0 */ 0x2fc8, 0x2fc9, 0x2fca, 0x2fcb, 0x2fcc, 0x2fcd, 0x2fce, 0x2fcf, 0x2fd0, 0x2fd1, 0x2fd2, 0x2fd3, 0x2fd4, 0x2fd5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2ff0, 0x2ff1, 0x2ff2, 0x2ff3, 0x2ff4, 0x2ff5, 0x2ff6, 0x2ff7, 0x2ff8, 0x2ff9, 0x2ffa, 0x2ffb, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0x3001, 0x3002, 0x3003, 0x3004, 0x3005, 0x3006, 0x3007, /* 0x3000 */ 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x3012, 0x3013, 0x3014, 0x3015, 0x3016, 0x3017, 0x3018, 0x3019, 0x301a, 0x301b, 0x301c, 0x301d, 0x301e, 0x301f, 0x3020, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e, 0x302f, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036, 0x3037, 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e, 0x303f, 0x0000, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, /* 0x3040 */ 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, /* 0x3080 */ 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3095, 0x3096, 0x0000, 0x0000, 0x3099, 0x309a, 0x309b, 0x309c, 0x309d, 0x309e, 0x309f, 0x30a0, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, /* 0x30c0 */ 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x30f7, 0x30f8, 0x30f9, 0x30fa, 0x30fb, 0x30fc, 0x30fd, 0x30fe, 0x30ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3105, 0x3106, 0x3107, /* 0x3100 */ 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x312a, 0x312b, 0x312c, 0x312d, 0x0000, 0x0000, 0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, /* 0x3140 */ 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, /* 0x3180 */ 0x3188, 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e, 0x0000, 0x3190, 0x3191, 0x3192, 0x3193, 0x3194, 0x3195, 0x3196, 0x3197, 0x3198, 0x3199, 0x319a, 0x319b, 0x319c, 0x319d, 0x319e, 0x319f, 0x31a0, 0x31a1, 0x31a2, 0x31a3, 0x31a4, 0x31a5, 0x31a6, 0x31a7, 0x31a8, 0x31a9, 0x31aa, 0x31ab, 0x31ac, 0x31ad, 0x31ae, 0x31af, 0x31b0, 0x31b1, 0x31b2, 0x31b3, 0x31b4, 0x31b5, 0x31b6, 0x31b7, 0x31b8, 0x31b9, 0x31ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31c0, 0x31c1, 0x31c2, 0x31c3, 0x31c4, 0x31c5, 0x31c6, 0x31c7, /* 0x31c0 */ 0x31c8, 0x31c9, 0x31ca, 0x31cb, 0x31cc, 0x31cd, 0x31ce, 0x31cf, 0x31d0, 0x31d1, 0x31d2, 0x31d3, 0x31d4, 0x31d5, 0x31d6, 0x31d7, 0x31d8, 0x31d9, 0x31da, 0x31db, 0x31dc, 0x31dd, 0x31de, 0x31df, 0x31e0, 0x31e1, 0x31e2, 0x31e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x31f0, 0x31f1, 0x31f2, 0x31f3, 0x31f4, 0x31f5, 0x31f6, 0x31f7, 0x31f8, 0x31f9, 0x31fa, 0x31fb, 0x31fc, 0x31fd, 0x31fe, 0x31ff, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, /* 0x3200 */ 0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321a, 0x321b, 0x321c, 0x321d, 0x321e, 0x0000, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x322a, 0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3231, 0x3232, 0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, 0x323a, 0x323b, 0x323c, 0x323d, 0x323e, 0x323f, 0x3240, 0x3241, 0x3242, 0x3243, 0x3244, 0x3245, 0x3246, 0x3247, /* 0x3240 */ 0x3248, 0x3249, 0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, 0x3250, 0x3251, 0x3252, 0x3253, 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a, 0x325b, 0x325c, 0x325d, 0x325e, 0x325f, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a, 0x327b, 0x327c, 0x327d, 0x327e, 0x327f, 0x3280, 0x3281, 0x3282, 0x3283, 0x3284, 0x3285, 0x3286, 0x3287, /* 0x3280 */ 0x3288, 0x3289, 0x328a, 0x328b, 0x328c, 0x328d, 0x328e, 0x328f, 0x3290, 0x3291, 0x3292, 0x3293, 0x3294, 0x3295, 0x3296, 0x3297, 0x3298, 0x3299, 0x329a, 0x329b, 0x329c, 0x329d, 0x329e, 0x329f, 0x32a0, 0x32a1, 0x32a2, 0x32a3, 0x32a4, 0x32a5, 0x32a6, 0x32a7, 0x32a8, 0x32a9, 0x32aa, 0x32ab, 0x32ac, 0x32ad, 0x32ae, 0x32af, 0x32b0, 0x32b1, 0x32b2, 0x32b3, 0x32b4, 0x32b5, 0x32b6, 0x32b7, 0x32b8, 0x32b9, 0x32ba, 0x32bb, 0x32bc, 0x32bd, 0x32be, 0x32bf, 0x32c0, 0x32c1, 0x32c2, 0x32c3, 0x32c4, 0x32c5, 0x32c6, 0x32c7, /* 0x32c0 */ 0x32c8, 0x32c9, 0x32ca, 0x32cb, 0x32cc, 0x32cd, 0x32ce, 0x32cf, 0x32d0, 0x32d1, 0x32d2, 0x32d3, 0x32d4, 0x32d5, 0x32d6, 0x32d7, 0x32d8, 0x32d9, 0x32da, 0x32db, 0x32dc, 0x32dd, 0x32de, 0x32df, 0x32e0, 0x32e1, 0x32e2, 0x32e3, 0x32e4, 0x32e5, 0x32e6, 0x32e7, 0x32e8, 0x32e9, 0x32ea, 0x32eb, 0x32ec, 0x32ed, 0x32ee, 0x32ef, 0x32f0, 0x32f1, 0x32f2, 0x32f3, 0x32f4, 0x32f5, 0x32f6, 0x32f7, 0x32f8, 0x32f9, 0x32fa, 0x32fb, 0x32fc, 0x32fd, 0x32fe, 0x0000, 0x3300, 0x3301, 0x3302, 0x3303, 0x3304, 0x3305, 0x3306, 0x3307, /* 0x3300 */ 0x3308, 0x3309, 0x330a, 0x330b, 0x330c, 0x330d, 0x330e, 0x330f, 0x3310, 0x3311, 0x3312, 0x3313, 0x3314, 0x3315, 0x3316, 0x3317, 0x3318, 0x3319, 0x331a, 0x331b, 0x331c, 0x331d, 0x331e, 0x331f, 0x3320, 0x3321, 0x3322, 0x3323, 0x3324, 0x3325, 0x3326, 0x3327, 0x3328, 0x3329, 0x332a, 0x332b, 0x332c, 0x332d, 0x332e, 0x332f, 0x3330, 0x3331, 0x3332, 0x3333, 0x3334, 0x3335, 0x3336, 0x3337, 0x3338, 0x3339, 0x333a, 0x333b, 0x333c, 0x333d, 0x333e, 0x333f, 0x3340, 0x3341, 0x3342, 0x3343, 0x3344, 0x3345, 0x3346, 0x3347, /* 0x3340 */ 0x3348, 0x3349, 0x334a, 0x334b, 0x334c, 0x334d, 0x334e, 0x334f, 0x3350, 0x3351, 0x3352, 0x3353, 0x3354, 0x3355, 0x3356, 0x3357, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c, 0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364, 0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c, 0x336d, 0x336e, 0x336f, 0x3370, 0x3371, 0x3372, 0x3373, 0x3374, 0x3375, 0x3376, 0x3377, 0x3378, 0x3379, 0x337a, 0x337b, 0x337c, 0x337d, 0x337e, 0x337f, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x3385, 0x3386, 0x3387, /* 0x3380 */ 0x3388, 0x3389, 0x338a, 0x338b, 0x338c, 0x338d, 0x338e, 0x338f, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x3395, 0x3396, 0x3397, 0x3398, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e, 0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33a3, 0x33a4, 0x33a5, 0x33a6, 0x33a7, 0x33a8, 0x33a9, 0x33aa, 0x33ab, 0x33ac, 0x33ad, 0x33ae, 0x33af, 0x33b0, 0x33b1, 0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9, 0x33ba, 0x33bb, 0x33bc, 0x33bd, 0x33be, 0x33bf, 0x33c0, 0x33c1, 0x33c2, 0x33c3, 0x33c4, 0x33c5, 0x33c6, 0x33c7, /* 0x33c0 */ 0x33c8, 0x33c9, 0x33ca, 0x33cb, 0x33cc, 0x33cd, 0x33ce, 0x33cf, 0x33d0, 0x33d1, 0x33d2, 0x33d3, 0x33d4, 0x33d5, 0x33d6, 0x33d7, 0x33d8, 0x33d9, 0x33da, 0x33db, 0x33dc, 0x33dd, 0x33de, 0x33df, 0x33e0, 0x33e1, 0x33e2, 0x33e3, 0x33e4, 0x33e5, 0x33e6, 0x33e7, 0x33e8, 0x33e9, 0x33ea, 0x33eb, 0x33ec, 0x33ed, 0x33ee, 0x33ef, 0x33f0, 0x33f1, 0x33f2, 0x33f3, 0x33f4, 0x33f5, 0x33f6, 0x33f7, 0x33f8, 0x33f9, 0x33fa, 0x33fb, 0x33fc, 0x33fd, 0x33fe, 0x33ff, 0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, 0x3406, 0x3407, /* 0x3400 */ 0x3408, 0x3409, 0x340a, 0x340b, 0x340c, 0x340d, 0x340e, 0x340f, 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, 0x3415, 0x3416, 0x3417, 0x3418, 0x3419, 0x341a, 0x341b, 0x341c, 0x341d, 0x341e, 0x341f, 0x3420, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426, 0x3427, 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e, 0x342f, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436, 0x3437, 0x3438, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e, 0x343f, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446, 0x3447, /* 0x3440 */ 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e, 0x344f, 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457, 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e, 0x345f, 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467, 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e, 0x346f, 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476, 0x3477, 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e, 0x347f, 0x3480, 0x3481, 0x3482, 0x3483, 0x3484, 0x3485, 0x3486, 0x3487, /* 0x3480 */ 0x3488, 0x3489, 0x348a, 0x348b, 0x348c, 0x348d, 0x348e, 0x348f, 0x3490, 0x3491, 0x3492, 0x3493, 0x3494, 0x3495, 0x3496, 0x3497, 0x3498, 0x3499, 0x349a, 0x349b, 0x349c, 0x349d, 0x349e, 0x349f, 0x34a0, 0x34a1, 0x34a2, 0x34a3, 0x34a4, 0x34a5, 0x34a6, 0x34a7, 0x34a8, 0x34a9, 0x34aa, 0x34ab, 0x34ac, 0x34ad, 0x34ae, 0x34af, 0x34b0, 0x34b1, 0x34b2, 0x34b3, 0x34b4, 0x34b5, 0x34b6, 0x34b7, 0x34b8, 0x34b9, 0x34ba, 0x34bb, 0x34bc, 0x34bd, 0x34be, 0x34bf, 0x34c0, 0x34c1, 0x34c2, 0x34c3, 0x34c4, 0x34c5, 0x34c6, 0x34c7, /* 0x34c0 */ 0x34c8, 0x34c9, 0x34ca, 0x34cb, 0x34cc, 0x34cd, 0x34ce, 0x34cf, 0x34d0, 0x34d1, 0x34d2, 0x34d3, 0x34d4, 0x34d5, 0x34d6, 0x34d7, 0x34d8, 0x34d9, 0x34da, 0x34db, 0x34dc, 0x34dd, 0x34de, 0x34df, 0x34e0, 0x34e1, 0x34e2, 0x34e3, 0x34e4, 0x34e5, 0x34e6, 0x34e7, 0x34e8, 0x34e9, 0x34ea, 0x34eb, 0x34ec, 0x34ed, 0x34ee, 0x34ef, 0x34f0, 0x34f1, 0x34f2, 0x34f3, 0x34f4, 0x34f5, 0x34f6, 0x34f7, 0x34f8, 0x34f9, 0x34fa, 0x34fb, 0x34fc, 0x34fd, 0x34fe, 0x34ff, 0x3500, 0x3501, 0x3502, 0x3503, 0x3504, 0x3505, 0x3506, 0x3507, /* 0x3500 */ 0x3508, 0x3509, 0x350a, 0x350b, 0x350c, 0x350d, 0x350e, 0x350f, 0x3510, 0x3511, 0x3512, 0x3513, 0x3514, 0x3515, 0x3516, 0x3517, 0x3518, 0x3519, 0x351a, 0x351b, 0x351c, 0x351d, 0x351e, 0x351f, 0x3520, 0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528, 0x3529, 0x352a, 0x352b, 0x352c, 0x352d, 0x352e, 0x352f, 0x3530, 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538, 0x3539, 0x353a, 0x353b, 0x353c, 0x353d, 0x353e, 0x353f, 0x3540, 0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, /* 0x3540 */ 0x3548, 0x3549, 0x354a, 0x354b, 0x354c, 0x354d, 0x354e, 0x354f, 0x3550, 0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558, 0x3559, 0x355a, 0x355b, 0x355c, 0x355d, 0x355e, 0x355f, 0x3560, 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568, 0x3569, 0x356a, 0x356b, 0x356c, 0x356d, 0x356e, 0x356f, 0x3570, 0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578, 0x3579, 0x357a, 0x357b, 0x357c, 0x357d, 0x357e, 0x357f, 0x3580, 0x3581, 0x3582, 0x3583, 0x3584, 0x3585, 0x3586, 0x3587, /* 0x3580 */ 0x3588, 0x3589, 0x358a, 0x358b, 0x358c, 0x358d, 0x358e, 0x358f, 0x3590, 0x3591, 0x3592, 0x3593, 0x3594, 0x3595, 0x3596, 0x3597, 0x3598, 0x3599, 0x359a, 0x359b, 0x359c, 0x359d, 0x359e, 0x359f, 0x35a0, 0x35a1, 0x35a2, 0x35a3, 0x35a4, 0x35a5, 0x35a6, 0x35a7, 0x35a8, 0x35a9, 0x35aa, 0x35ab, 0x35ac, 0x35ad, 0x35ae, 0x35af, 0x35b0, 0x35b1, 0x35b2, 0x35b3, 0x35b4, 0x35b5, 0x35b6, 0x35b7, 0x35b8, 0x35b9, 0x35ba, 0x35bb, 0x35bc, 0x35bd, 0x35be, 0x35bf, 0x35c0, 0x35c1, 0x35c2, 0x35c3, 0x35c4, 0x35c5, 0x35c6, 0x35c7, /* 0x35c0 */ 0x35c8, 0x35c9, 0x35ca, 0x35cb, 0x35cc, 0x35cd, 0x35ce, 0x35cf, 0x35d0, 0x35d1, 0x35d2, 0x35d3, 0x35d4, 0x35d5, 0x35d6, 0x35d7, 0x35d8, 0x35d9, 0x35da, 0x35db, 0x35dc, 0x35dd, 0x35de, 0x35df, 0x35e0, 0x35e1, 0x35e2, 0x35e3, 0x35e4, 0x35e5, 0x35e6, 0x35e7, 0x35e8, 0x35e9, 0x35ea, 0x35eb, 0x35ec, 0x35ed, 0x35ee, 0x35ef, 0x35f0, 0x35f1, 0x35f2, 0x35f3, 0x35f4, 0x35f5, 0x35f6, 0x35f7, 0x35f8, 0x35f9, 0x35fa, 0x35fb, 0x35fc, 0x35fd, 0x35fe, 0x35ff, 0x3600, 0x3601, 0x3602, 0x3603, 0x3604, 0x3605, 0x3606, 0x3607, /* 0x3600 */ 0x3608, 0x3609, 0x360a, 0x360b, 0x360c, 0x360d, 0x360e, 0x360f, 0x3610, 0x3611, 0x3612, 0x3613, 0x3614, 0x3615, 0x3616, 0x3617, 0x3618, 0x3619, 0x361a, 0x361b, 0x361c, 0x361d, 0x361e, 0x361f, 0x3620, 0x3621, 0x3622, 0x3623, 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362a, 0x362b, 0x362c, 0x362d, 0x362e, 0x362f, 0x3630, 0x3631, 0x3632, 0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363a, 0x363b, 0x363c, 0x363d, 0x363e, 0x363f, 0x3640, 0x3641, 0x3642, 0x3643, 0x3644, 0x3645, 0x3646, 0x3647, /* 0x3640 */ 0x3648, 0x3649, 0x364a, 0x364b, 0x364c, 0x364d, 0x364e, 0x364f, 0x3650, 0x3651, 0x3652, 0x3653, 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365a, 0x365b, 0x365c, 0x365d, 0x365e, 0x365f, 0x3660, 0x3661, 0x3662, 0x3663, 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366a, 0x366b, 0x366c, 0x366d, 0x366e, 0x366f, 0x3670, 0x3671, 0x3672, 0x3673, 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367a, 0x367b, 0x367c, 0x367d, 0x367e, 0x367f, 0x3680, 0x3681, 0x3682, 0x3683, 0x3684, 0x3685, 0x3686, 0x3687, /* 0x3680 */ 0x3688, 0x3689, 0x368a, 0x368b, 0x368c, 0x368d, 0x368e, 0x368f, 0x3690, 0x3691, 0x3692, 0x3693, 0x3694, 0x3695, 0x3696, 0x3697, 0x3698, 0x3699, 0x369a, 0x369b, 0x369c, 0x369d, 0x369e, 0x369f, 0x36a0, 0x36a1, 0x36a2, 0x36a3, 0x36a4, 0x36a5, 0x36a6, 0x36a7, 0x36a8, 0x36a9, 0x36aa, 0x36ab, 0x36ac, 0x36ad, 0x36ae, 0x36af, 0x36b0, 0x36b1, 0x36b2, 0x36b3, 0x36b4, 0x36b5, 0x36b6, 0x36b7, 0x36b8, 0x36b9, 0x36ba, 0x36bb, 0x36bc, 0x36bd, 0x36be, 0x36bf, 0x36c0, 0x36c1, 0x36c2, 0x36c3, 0x36c4, 0x36c5, 0x36c6, 0x36c7, /* 0x36c0 */ 0x36c8, 0x36c9, 0x36ca, 0x36cb, 0x36cc, 0x36cd, 0x36ce, 0x36cf, 0x36d0, 0x36d1, 0x36d2, 0x36d3, 0x36d4, 0x36d5, 0x36d6, 0x36d7, 0x36d8, 0x36d9, 0x36da, 0x36db, 0x36dc, 0x36dd, 0x36de, 0x36df, 0x36e0, 0x36e1, 0x36e2, 0x36e3, 0x36e4, 0x36e5, 0x36e6, 0x36e7, 0x36e8, 0x36e9, 0x36ea, 0x36eb, 0x36ec, 0x36ed, 0x36ee, 0x36ef, 0x36f0, 0x36f1, 0x36f2, 0x36f3, 0x36f4, 0x36f5, 0x36f6, 0x36f7, 0x36f8, 0x36f9, 0x36fa, 0x36fb, 0x36fc, 0x36fd, 0x36fe, 0x36ff, 0x3700, 0x3701, 0x3702, 0x3703, 0x3704, 0x3705, 0x3706, 0x3707, /* 0x3700 */ 0x3708, 0x3709, 0x370a, 0x370b, 0x370c, 0x370d, 0x370e, 0x370f, 0x3710, 0x3711, 0x3712, 0x3713, 0x3714, 0x3715, 0x3716, 0x3717, 0x3718, 0x3719, 0x371a, 0x371b, 0x371c, 0x371d, 0x371e, 0x371f, 0x3720, 0x3721, 0x3722, 0x3723, 0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372a, 0x372b, 0x372c, 0x372d, 0x372e, 0x372f, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373a, 0x373b, 0x373c, 0x373d, 0x373e, 0x373f, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744, 0x3745, 0x3746, 0x3747, /* 0x3740 */ 0x3748, 0x3749, 0x374a, 0x374b, 0x374c, 0x374d, 0x374e, 0x374f, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, 0x375a, 0x375b, 0x375c, 0x375d, 0x375e, 0x375f, 0x3760, 0x3761, 0x3762, 0x3763, 0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376a, 0x376b, 0x376c, 0x376d, 0x376e, 0x376f, 0x3770, 0x3771, 0x3772, 0x3773, 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377a, 0x377b, 0x377c, 0x377d, 0x377e, 0x377f, 0x3780, 0x3781, 0x3782, 0x3783, 0x3784, 0x3785, 0x3786, 0x3787, /* 0x3780 */ 0x3788, 0x3789, 0x378a, 0x378b, 0x378c, 0x378d, 0x378e, 0x378f, 0x3790, 0x3791, 0x3792, 0x3793, 0x3794, 0x3795, 0x3796, 0x3797, 0x3798, 0x3799, 0x379a, 0x379b, 0x379c, 0x379d, 0x379e, 0x379f, 0x37a0, 0x37a1, 0x37a2, 0x37a3, 0x37a4, 0x37a5, 0x37a6, 0x37a7, 0x37a8, 0x37a9, 0x37aa, 0x37ab, 0x37ac, 0x37ad, 0x37ae, 0x37af, 0x37b0, 0x37b1, 0x37b2, 0x37b3, 0x37b4, 0x37b5, 0x37b6, 0x37b7, 0x37b8, 0x37b9, 0x37ba, 0x37bb, 0x37bc, 0x37bd, 0x37be, 0x37bf, 0x37c0, 0x37c1, 0x37c2, 0x37c3, 0x37c4, 0x37c5, 0x37c6, 0x37c7, /* 0x37c0 */ 0x37c8, 0x37c9, 0x37ca, 0x37cb, 0x37cc, 0x37cd, 0x37ce, 0x37cf, 0x37d0, 0x37d1, 0x37d2, 0x37d3, 0x37d4, 0x37d5, 0x37d6, 0x37d7, 0x37d8, 0x37d9, 0x37da, 0x37db, 0x37dc, 0x37dd, 0x37de, 0x37df, 0x37e0, 0x37e1, 0x37e2, 0x37e3, 0x37e4, 0x37e5, 0x37e6, 0x37e7, 0x37e8, 0x37e9, 0x37ea, 0x37eb, 0x37ec, 0x37ed, 0x37ee, 0x37ef, 0x37f0, 0x37f1, 0x37f2, 0x37f3, 0x37f4, 0x37f5, 0x37f6, 0x37f7, 0x37f8, 0x37f9, 0x37fa, 0x37fb, 0x37fc, 0x37fd, 0x37fe, 0x37ff, 0x3800, 0x3801, 0x3802, 0x3803, 0x3804, 0x3805, 0x3806, 0x3807, /* 0x3800 */ 0x3808, 0x3809, 0x380a, 0x380b, 0x380c, 0x380d, 0x380e, 0x380f, 0x3810, 0x3811, 0x3812, 0x3813, 0x3814, 0x3815, 0x3816, 0x3817, 0x3818, 0x3819, 0x381a, 0x381b, 0x381c, 0x381d, 0x381e, 0x381f, 0x3820, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382a, 0x382b, 0x382c, 0x382d, 0x382e, 0x382f, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383a, 0x383b, 0x383c, 0x383d, 0x383e, 0x383f, 0x3840, 0x3841, 0x3842, 0x3843, 0x3844, 0x3845, 0x3846, 0x3847, /* 0x3840 */ 0x3848, 0x3849, 0x384a, 0x384b, 0x384c, 0x384d, 0x384e, 0x384f, 0x3850, 0x3851, 0x3852, 0x3853, 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385a, 0x385b, 0x385c, 0x385d, 0x385e, 0x385f, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3866, 0x3867, 0x3868, 0x3869, 0x386a, 0x386b, 0x386c, 0x386d, 0x386e, 0x386f, 0x3870, 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387a, 0x387b, 0x387c, 0x387d, 0x387e, 0x387f, 0x3880, 0x3881, 0x3882, 0x3883, 0x3884, 0x3885, 0x3886, 0x3887, /* 0x3880 */ 0x3888, 0x3889, 0x388a, 0x388b, 0x388c, 0x388d, 0x388e, 0x388f, 0x3890, 0x3891, 0x3892, 0x3893, 0x3894, 0x3895, 0x3896, 0x3897, 0x3898, 0x3899, 0x389a, 0x389b, 0x389c, 0x389d, 0x389e, 0x389f, 0x38a0, 0x38a1, 0x38a2, 0x38a3, 0x38a4, 0x38a5, 0x38a6, 0x38a7, 0x38a8, 0x38a9, 0x38aa, 0x38ab, 0x38ac, 0x38ad, 0x38ae, 0x38af, 0x38b0, 0x38b1, 0x38b2, 0x38b3, 0x38b4, 0x38b5, 0x38b6, 0x38b7, 0x38b8, 0x38b9, 0x38ba, 0x38bb, 0x38bc, 0x38bd, 0x38be, 0x38bf, 0x38c0, 0x38c1, 0x38c2, 0x38c3, 0x38c4, 0x38c5, 0x38c6, 0x38c7, /* 0x38c0 */ 0x38c8, 0x38c9, 0x38ca, 0x38cb, 0x38cc, 0x38cd, 0x38ce, 0x38cf, 0x38d0, 0x38d1, 0x38d2, 0x38d3, 0x38d4, 0x38d5, 0x38d6, 0x38d7, 0x38d8, 0x38d9, 0x38da, 0x38db, 0x38dc, 0x38dd, 0x38de, 0x38df, 0x38e0, 0x38e1, 0x38e2, 0x38e3, 0x38e4, 0x38e5, 0x38e6, 0x38e7, 0x38e8, 0x38e9, 0x38ea, 0x38eb, 0x38ec, 0x38ed, 0x38ee, 0x38ef, 0x38f0, 0x38f1, 0x38f2, 0x38f3, 0x38f4, 0x38f5, 0x38f6, 0x38f7, 0x38f8, 0x38f9, 0x38fa, 0x38fb, 0x38fc, 0x38fd, 0x38fe, 0x38ff, 0x3900, 0x3901, 0x3902, 0x3903, 0x3904, 0x3905, 0x3906, 0x3907, /* 0x3900 */ 0x3908, 0x3909, 0x390a, 0x390b, 0x390c, 0x390d, 0x390e, 0x390f, 0x3910, 0x3911, 0x3912, 0x3913, 0x3914, 0x3915, 0x3916, 0x3917, 0x3918, 0x3919, 0x391a, 0x391b, 0x391c, 0x391d, 0x391e, 0x391f, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392a, 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393a, 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, /* 0x3940 */ 0x3948, 0x3949, 0x394a, 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395a, 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396a, 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979, 0x397a, 0x397b, 0x397c, 0x397d, 0x397e, 0x397f, 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985, 0x3986, 0x3987, /* 0x3980 */ 0x3988, 0x3989, 0x398a, 0x398b, 0x398c, 0x398d, 0x398e, 0x398f, 0x3990, 0x3991, 0x3992, 0x3993, 0x3994, 0x3995, 0x3996, 0x3997, 0x3998, 0x3999, 0x399a, 0x399b, 0x399c, 0x399d, 0x399e, 0x399f, 0x39a0, 0x39a1, 0x39a2, 0x39a3, 0x39a4, 0x39a5, 0x39a6, 0x39a7, 0x39a8, 0x39a9, 0x39aa, 0x39ab, 0x39ac, 0x39ad, 0x39ae, 0x39af, 0x39b0, 0x39b1, 0x39b2, 0x39b3, 0x39b4, 0x39b5, 0x39b6, 0x39b7, 0x39b8, 0x39b9, 0x39ba, 0x39bb, 0x39bc, 0x39bd, 0x39be, 0x39bf, 0x39c0, 0x39c1, 0x39c2, 0x39c3, 0x39c4, 0x39c5, 0x39c6, 0x39c7, /* 0x39c0 */ 0x39c8, 0x39c9, 0x39ca, 0x39cb, 0x39cc, 0x39cd, 0x39ce, 0x39cf, 0x39d0, 0x39d1, 0x39d2, 0x39d3, 0x39d4, 0x39d5, 0x39d6, 0x39d7, 0x39d8, 0x39d9, 0x39da, 0x39db, 0x39dc, 0x39dd, 0x39de, 0x39df, 0x39e0, 0x39e1, 0x39e2, 0x39e3, 0x39e4, 0x39e5, 0x39e6, 0x39e7, 0x39e8, 0x39e9, 0x39ea, 0x39eb, 0x39ec, 0x39ed, 0x39ee, 0x39ef, 0x39f0, 0x39f1, 0x39f2, 0x39f3, 0x39f4, 0x39f5, 0x39f6, 0x39f7, 0x39f8, 0x39f9, 0x39fa, 0x39fb, 0x39fc, 0x39fd, 0x39fe, 0x39ff, 0x3a00, 0x3a01, 0x3a02, 0x3a03, 0x3a04, 0x3a05, 0x3a06, 0x3a07, /* 0x3a00 */ 0x3a08, 0x3a09, 0x3a0a, 0x3a0b, 0x3a0c, 0x3a0d, 0x3a0e, 0x3a0f, 0x3a10, 0x3a11, 0x3a12, 0x3a13, 0x3a14, 0x3a15, 0x3a16, 0x3a17, 0x3a18, 0x3a19, 0x3a1a, 0x3a1b, 0x3a1c, 0x3a1d, 0x3a1e, 0x3a1f, 0x3a20, 0x3a21, 0x3a22, 0x3a23, 0x3a24, 0x3a25, 0x3a26, 0x3a27, 0x3a28, 0x3a29, 0x3a2a, 0x3a2b, 0x3a2c, 0x3a2d, 0x3a2e, 0x3a2f, 0x3a30, 0x3a31, 0x3a32, 0x3a33, 0x3a34, 0x3a35, 0x3a36, 0x3a37, 0x3a38, 0x3a39, 0x3a3a, 0x3a3b, 0x3a3c, 0x3a3d, 0x3a3e, 0x3a3f, 0x3a40, 0x3a41, 0x3a42, 0x3a43, 0x3a44, 0x3a45, 0x3a46, 0x3a47, /* 0x3a40 */ 0x3a48, 0x3a49, 0x3a4a, 0x3a4b, 0x3a4c, 0x3a4d, 0x3a4e, 0x3a4f, 0x3a50, 0x3a51, 0x3a52, 0x3a53, 0x3a54, 0x3a55, 0x3a56, 0x3a57, 0x3a58, 0x3a59, 0x3a5a, 0x3a5b, 0x3a5c, 0x3a5d, 0x3a5e, 0x3a5f, 0x3a60, 0x3a61, 0x3a62, 0x3a63, 0x3a64, 0x3a65, 0x3a66, 0x3a67, 0x3a68, 0x3a69, 0x3a6a, 0x3a6b, 0x3a6c, 0x3a6d, 0x3a6e, 0x3a6f, 0x3a70, 0x3a71, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a77, 0x3a78, 0x3a79, 0x3a7a, 0x3a7b, 0x3a7c, 0x3a7d, 0x3a7e, 0x3a7f, 0x3a80, 0x3a81, 0x3a82, 0x3a83, 0x3a84, 0x3a85, 0x3a86, 0x3a87, /* 0x3a80 */ 0x3a88, 0x3a89, 0x3a8a, 0x3a8b, 0x3a8c, 0x3a8d, 0x3a8e, 0x3a8f, 0x3a90, 0x3a91, 0x3a92, 0x3a93, 0x3a94, 0x3a95, 0x3a96, 0x3a97, 0x3a98, 0x3a99, 0x3a9a, 0x3a9b, 0x3a9c, 0x3a9d, 0x3a9e, 0x3a9f, 0x3aa0, 0x3aa1, 0x3aa2, 0x3aa3, 0x3aa4, 0x3aa5, 0x3aa6, 0x3aa7, 0x3aa8, 0x3aa9, 0x3aaa, 0x3aab, 0x3aac, 0x3aad, 0x3aae, 0x3aaf, 0x3ab0, 0x3ab1, 0x3ab2, 0x3ab3, 0x3ab4, 0x3ab5, 0x3ab6, 0x3ab7, 0x3ab8, 0x3ab9, 0x3aba, 0x3abb, 0x3abc, 0x3abd, 0x3abe, 0x3abf, 0x3ac0, 0x3ac1, 0x3ac2, 0x3ac3, 0x3ac4, 0x3ac5, 0x3ac6, 0x3ac7, /* 0x3ac0 */ 0x3ac8, 0x3ac9, 0x3aca, 0x3acb, 0x3acc, 0x3acd, 0x3ace, 0x3acf, 0x3ad0, 0x3ad1, 0x3ad2, 0x3ad3, 0x3ad4, 0x3ad5, 0x3ad6, 0x3ad7, 0x3ad8, 0x3ad9, 0x3ada, 0x3adb, 0x3adc, 0x3add, 0x3ade, 0x3adf, 0x3ae0, 0x3ae1, 0x3ae2, 0x3ae3, 0x3ae4, 0x3ae5, 0x3ae6, 0x3ae7, 0x3ae8, 0x3ae9, 0x3aea, 0x3aeb, 0x3aec, 0x3aed, 0x3aee, 0x3aef, 0x3af0, 0x3af1, 0x3af2, 0x3af3, 0x3af4, 0x3af5, 0x3af6, 0x3af7, 0x3af8, 0x3af9, 0x3afa, 0x3afb, 0x3afc, 0x3afd, 0x3afe, 0x3aff, 0x3b00, 0x3b01, 0x3b02, 0x3b03, 0x3b04, 0x3b05, 0x3b06, 0x3b07, /* 0x3b00 */ 0x3b08, 0x3b09, 0x3b0a, 0x3b0b, 0x3b0c, 0x3b0d, 0x3b0e, 0x3b0f, 0x3b10, 0x3b11, 0x3b12, 0x3b13, 0x3b14, 0x3b15, 0x3b16, 0x3b17, 0x3b18, 0x3b19, 0x3b1a, 0x3b1b, 0x3b1c, 0x3b1d, 0x3b1e, 0x3b1f, 0x3b20, 0x3b21, 0x3b22, 0x3b23, 0x3b24, 0x3b25, 0x3b26, 0x3b27, 0x3b28, 0x3b29, 0x3b2a, 0x3b2b, 0x3b2c, 0x3b2d, 0x3b2e, 0x3b2f, 0x3b30, 0x3b31, 0x3b32, 0x3b33, 0x3b34, 0x3b35, 0x3b36, 0x3b37, 0x3b38, 0x3b39, 0x3b3a, 0x3b3b, 0x3b3c, 0x3b3d, 0x3b3e, 0x3b3f, 0x3b40, 0x3b41, 0x3b42, 0x3b43, 0x3b44, 0x3b45, 0x3b46, 0x3b47, /* 0x3b40 */ 0x3b48, 0x3b49, 0x3b4a, 0x3b4b, 0x3b4c, 0x3b4d, 0x3b4e, 0x3b4f, 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b54, 0x3b55, 0x3b56, 0x3b57, 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d, 0x3b5e, 0x3b5f, 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64, 0x3b65, 0x3b66, 0x3b67, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d, 0x3b6e, 0x3b6f, 0x3b70, 0x3b71, 0x3b72, 0x3b73, 0x3b74, 0x3b75, 0x3b76, 0x3b77, 0x3b78, 0x3b79, 0x3b7a, 0x3b7b, 0x3b7c, 0x3b7d, 0x3b7e, 0x3b7f, 0x3b80, 0x3b81, 0x3b82, 0x3b83, 0x3b84, 0x3b85, 0x3b86, 0x3b87, /* 0x3b80 */ 0x3b88, 0x3b89, 0x3b8a, 0x3b8b, 0x3b8c, 0x3b8d, 0x3b8e, 0x3b8f, 0x3b90, 0x3b91, 0x3b92, 0x3b93, 0x3b94, 0x3b95, 0x3b96, 0x3b97, 0x3b98, 0x3b99, 0x3b9a, 0x3b9b, 0x3b9c, 0x3b9d, 0x3b9e, 0x3b9f, 0x3ba0, 0x3ba1, 0x3ba2, 0x3ba3, 0x3ba4, 0x3ba5, 0x3ba6, 0x3ba7, 0x3ba8, 0x3ba9, 0x3baa, 0x3bab, 0x3bac, 0x3bad, 0x3bae, 0x3baf, 0x3bb0, 0x3bb1, 0x3bb2, 0x3bb3, 0x3bb4, 0x3bb5, 0x3bb6, 0x3bb7, 0x3bb8, 0x3bb9, 0x3bba, 0x3bbb, 0x3bbc, 0x3bbd, 0x3bbe, 0x3bbf, 0x3bc0, 0x3bc1, 0x3bc2, 0x3bc3, 0x3bc4, 0x3bc5, 0x3bc6, 0x3bc7, /* 0x3bc0 */ 0x3bc8, 0x3bc9, 0x3bca, 0x3bcb, 0x3bcc, 0x3bcd, 0x3bce, 0x3bcf, 0x3bd0, 0x3bd1, 0x3bd2, 0x3bd3, 0x3bd4, 0x3bd5, 0x3bd6, 0x3bd7, 0x3bd8, 0x3bd9, 0x3bda, 0x3bdb, 0x3bdc, 0x3bdd, 0x3bde, 0x3bdf, 0x3be0, 0x3be1, 0x3be2, 0x3be3, 0x3be4, 0x3be5, 0x3be6, 0x3be7, 0x3be8, 0x3be9, 0x3bea, 0x3beb, 0x3bec, 0x3bed, 0x3bee, 0x3bef, 0x3bf0, 0x3bf1, 0x3bf2, 0x3bf3, 0x3bf4, 0x3bf5, 0x3bf6, 0x3bf7, 0x3bf8, 0x3bf9, 0x3bfa, 0x3bfb, 0x3bfc, 0x3bfd, 0x3bfe, 0x3bff, 0x3c00, 0x3c01, 0x3c02, 0x3c03, 0x3c04, 0x3c05, 0x3c06, 0x3c07, /* 0x3c00 */ 0x3c08, 0x3c09, 0x3c0a, 0x3c0b, 0x3c0c, 0x3c0d, 0x3c0e, 0x3c0f, 0x3c10, 0x3c11, 0x3c12, 0x3c13, 0x3c14, 0x3c15, 0x3c16, 0x3c17, 0x3c18, 0x3c19, 0x3c1a, 0x3c1b, 0x3c1c, 0x3c1d, 0x3c1e, 0x3c1f, 0x3c20, 0x3c21, 0x3c22, 0x3c23, 0x3c24, 0x3c25, 0x3c26, 0x3c27, 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, 0x3c2c, 0x3c2d, 0x3c2e, 0x3c2f, 0x3c30, 0x3c31, 0x3c32, 0x3c33, 0x3c34, 0x3c35, 0x3c36, 0x3c37, 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, 0x3c3c, 0x3c3d, 0x3c3e, 0x3c3f, 0x3c40, 0x3c41, 0x3c42, 0x3c43, 0x3c44, 0x3c45, 0x3c46, 0x3c47, /* 0x3c40 */ 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, 0x3c4c, 0x3c4d, 0x3c4e, 0x3c4f, 0x3c50, 0x3c51, 0x3c52, 0x3c53, 0x3c54, 0x3c55, 0x3c56, 0x3c57, 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, 0x3c5c, 0x3c5d, 0x3c5e, 0x3c5f, 0x3c60, 0x3c61, 0x3c62, 0x3c63, 0x3c64, 0x3c65, 0x3c66, 0x3c67, 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, 0x3c6c, 0x3c6d, 0x3c6e, 0x3c6f, 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76, 0x3c77, 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e, 0x3c7f, 0x3c80, 0x3c81, 0x3c82, 0x3c83, 0x3c84, 0x3c85, 0x3c86, 0x3c87, /* 0x3c80 */ 0x3c88, 0x3c89, 0x3c8a, 0x3c8b, 0x3c8c, 0x3c8d, 0x3c8e, 0x3c8f, 0x3c90, 0x3c91, 0x3c92, 0x3c93, 0x3c94, 0x3c95, 0x3c96, 0x3c97, 0x3c98, 0x3c99, 0x3c9a, 0x3c9b, 0x3c9c, 0x3c9d, 0x3c9e, 0x3c9f, 0x3ca0, 0x3ca1, 0x3ca2, 0x3ca3, 0x3ca4, 0x3ca5, 0x3ca6, 0x3ca7, 0x3ca8, 0x3ca9, 0x3caa, 0x3cab, 0x3cac, 0x3cad, 0x3cae, 0x3caf, 0x3cb0, 0x3cb1, 0x3cb2, 0x3cb3, 0x3cb4, 0x3cb5, 0x3cb6, 0x3cb7, 0x3cb8, 0x3cb9, 0x3cba, 0x3cbb, 0x3cbc, 0x3cbd, 0x3cbe, 0x3cbf, 0x3cc0, 0x3cc1, 0x3cc2, 0x3cc3, 0x3cc4, 0x3cc5, 0x3cc6, 0x3cc7, /* 0x3cc0 */ 0x3cc8, 0x3cc9, 0x3cca, 0x3ccb, 0x3ccc, 0x3ccd, 0x3cce, 0x3ccf, 0x3cd0, 0x3cd1, 0x3cd2, 0x3cd3, 0x3cd4, 0x3cd5, 0x3cd6, 0x3cd7, 0x3cd8, 0x3cd9, 0x3cda, 0x3cdb, 0x3cdc, 0x3cdd, 0x3cde, 0x3cdf, 0x3ce0, 0x3ce1, 0x3ce2, 0x3ce3, 0x3ce4, 0x3ce5, 0x3ce6, 0x3ce7, 0x3ce8, 0x3ce9, 0x3cea, 0x3ceb, 0x3cec, 0x3ced, 0x3cee, 0x3cef, 0x3cf0, 0x3cf1, 0x3cf2, 0x3cf3, 0x3cf4, 0x3cf5, 0x3cf6, 0x3cf7, 0x3cf8, 0x3cf9, 0x3cfa, 0x3cfb, 0x3cfc, 0x3cfd, 0x3cfe, 0x3cff, 0x3d00, 0x3d01, 0x3d02, 0x3d03, 0x3d04, 0x3d05, 0x3d06, 0x3d07, /* 0x3d00 */ 0x3d08, 0x3d09, 0x3d0a, 0x3d0b, 0x3d0c, 0x3d0d, 0x3d0e, 0x3d0f, 0x3d10, 0x3d11, 0x3d12, 0x3d13, 0x3d14, 0x3d15, 0x3d16, 0x3d17, 0x3d18, 0x3d19, 0x3d1a, 0x3d1b, 0x3d1c, 0x3d1d, 0x3d1e, 0x3d1f, 0x3d20, 0x3d21, 0x3d22, 0x3d23, 0x3d24, 0x3d25, 0x3d26, 0x3d27, 0x3d28, 0x3d29, 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e, 0x3d2f, 0x3d30, 0x3d31, 0x3d32, 0x3d33, 0x3d34, 0x3d35, 0x3d36, 0x3d37, 0x3d38, 0x3d39, 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40, 0x3d41, 0x3d42, 0x3d43, 0x3d44, 0x3d45, 0x3d46, 0x3d47, /* 0x3d40 */ 0x3d48, 0x3d49, 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, 0x3d4e, 0x3d4f, 0x3d50, 0x3d51, 0x3d52, 0x3d53, 0x3d54, 0x3d55, 0x3d56, 0x3d57, 0x3d58, 0x3d59, 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, 0x3d5e, 0x3d5f, 0x3d60, 0x3d61, 0x3d62, 0x3d63, 0x3d64, 0x3d65, 0x3d66, 0x3d67, 0x3d68, 0x3d69, 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, 0x3d6e, 0x3d6f, 0x3d70, 0x3d71, 0x3d72, 0x3d73, 0x3d74, 0x3d75, 0x3d76, 0x3d77, 0x3d78, 0x3d79, 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, 0x3d7e, 0x3d7f, 0x3d80, 0x3d81, 0x3d82, 0x3d83, 0x3d84, 0x3d85, 0x3d86, 0x3d87, /* 0x3d80 */ 0x3d88, 0x3d89, 0x3d8a, 0x3d8b, 0x3d8c, 0x3d8d, 0x3d8e, 0x3d8f, 0x3d90, 0x3d91, 0x3d92, 0x3d93, 0x3d94, 0x3d95, 0x3d96, 0x3d97, 0x3d98, 0x3d99, 0x3d9a, 0x3d9b, 0x3d9c, 0x3d9d, 0x3d9e, 0x3d9f, 0x3da0, 0x3da1, 0x3da2, 0x3da3, 0x3da4, 0x3da5, 0x3da6, 0x3da7, 0x3da8, 0x3da9, 0x3daa, 0x3dab, 0x3dac, 0x3dad, 0x3dae, 0x3daf, 0x3db0, 0x3db1, 0x3db2, 0x3db3, 0x3db4, 0x3db5, 0x3db6, 0x3db7, 0x3db8, 0x3db9, 0x3dba, 0x3dbb, 0x3dbc, 0x3dbd, 0x3dbe, 0x3dbf, 0x3dc0, 0x3dc1, 0x3dc2, 0x3dc3, 0x3dc4, 0x3dc5, 0x3dc6, 0x3dc7, /* 0x3dc0 */ 0x3dc8, 0x3dc9, 0x3dca, 0x3dcb, 0x3dcc, 0x3dcd, 0x3dce, 0x3dcf, 0x3dd0, 0x3dd1, 0x3dd2, 0x3dd3, 0x3dd4, 0x3dd5, 0x3dd6, 0x3dd7, 0x3dd8, 0x3dd9, 0x3dda, 0x3ddb, 0x3ddc, 0x3ddd, 0x3dde, 0x3ddf, 0x3de0, 0x3de1, 0x3de2, 0x3de3, 0x3de4, 0x3de5, 0x3de6, 0x3de7, 0x3de8, 0x3de9, 0x3dea, 0x3deb, 0x3dec, 0x3ded, 0x3dee, 0x3def, 0x3df0, 0x3df1, 0x3df2, 0x3df3, 0x3df4, 0x3df5, 0x3df6, 0x3df7, 0x3df8, 0x3df9, 0x3dfa, 0x3dfb, 0x3dfc, 0x3dfd, 0x3dfe, 0x3dff, 0x3e00, 0x3e01, 0x3e02, 0x3e03, 0x3e04, 0x3e05, 0x3e06, 0x3e07, /* 0x3e00 */ 0x3e08, 0x3e09, 0x3e0a, 0x3e0b, 0x3e0c, 0x3e0d, 0x3e0e, 0x3e0f, 0x3e10, 0x3e11, 0x3e12, 0x3e13, 0x3e14, 0x3e15, 0x3e16, 0x3e17, 0x3e18, 0x3e19, 0x3e1a, 0x3e1b, 0x3e1c, 0x3e1d, 0x3e1e, 0x3e1f, 0x3e20, 0x3e21, 0x3e22, 0x3e23, 0x3e24, 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x3e29, 0x3e2a, 0x3e2b, 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, 0x3e30, 0x3e31, 0x3e32, 0x3e33, 0x3e34, 0x3e35, 0x3e36, 0x3e37, 0x3e38, 0x3e39, 0x3e3a, 0x3e3b, 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x3e41, 0x3e42, 0x3e43, 0x3e44, 0x3e45, 0x3e46, 0x3e47, /* 0x3e40 */ 0x3e48, 0x3e49, 0x3e4a, 0x3e4b, 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, 0x3e50, 0x3e51, 0x3e52, 0x3e53, 0x3e54, 0x3e55, 0x3e56, 0x3e57, 0x3e58, 0x3e59, 0x3e5a, 0x3e5b, 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, 0x3e60, 0x3e61, 0x3e62, 0x3e63, 0x3e64, 0x3e65, 0x3e66, 0x3e67, 0x3e68, 0x3e69, 0x3e6a, 0x3e6b, 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, 0x3e70, 0x3e71, 0x3e72, 0x3e73, 0x3e74, 0x3e75, 0x3e76, 0x3e77, 0x3e78, 0x3e79, 0x3e7a, 0x3e7b, 0x3e7c, 0x3e7d, 0x3e7e, 0x3e7f, 0x3e80, 0x3e81, 0x3e82, 0x3e83, 0x3e84, 0x3e85, 0x3e86, 0x3e87, /* 0x3e80 */ 0x3e88, 0x3e89, 0x3e8a, 0x3e8b, 0x3e8c, 0x3e8d, 0x3e8e, 0x3e8f, 0x3e90, 0x3e91, 0x3e92, 0x3e93, 0x3e94, 0x3e95, 0x3e96, 0x3e97, 0x3e98, 0x3e99, 0x3e9a, 0x3e9b, 0x3e9c, 0x3e9d, 0x3e9e, 0x3e9f, 0x3ea0, 0x3ea1, 0x3ea2, 0x3ea3, 0x3ea4, 0x3ea5, 0x3ea6, 0x3ea7, 0x3ea8, 0x3ea9, 0x3eaa, 0x3eab, 0x3eac, 0x3ead, 0x3eae, 0x3eaf, 0x3eb0, 0x3eb1, 0x3eb2, 0x3eb3, 0x3eb4, 0x3eb5, 0x3eb6, 0x3eb7, 0x3eb8, 0x3eb9, 0x3eba, 0x3ebb, 0x3ebc, 0x3ebd, 0x3ebe, 0x3ebf, 0x3ec0, 0x3ec1, 0x3ec2, 0x3ec3, 0x3ec4, 0x3ec5, 0x3ec6, 0x3ec7, /* 0x3ec0 */ 0x3ec8, 0x3ec9, 0x3eca, 0x3ecb, 0x3ecc, 0x3ecd, 0x3ece, 0x3ecf, 0x3ed0, 0x3ed1, 0x3ed2, 0x3ed3, 0x3ed4, 0x3ed5, 0x3ed6, 0x3ed7, 0x3ed8, 0x3ed9, 0x3eda, 0x3edb, 0x3edc, 0x3edd, 0x3ede, 0x3edf, 0x3ee0, 0x3ee1, 0x3ee2, 0x3ee3, 0x3ee4, 0x3ee5, 0x3ee6, 0x3ee7, 0x3ee8, 0x3ee9, 0x3eea, 0x3eeb, 0x3eec, 0x3eed, 0x3eee, 0x3eef, 0x3ef0, 0x3ef1, 0x3ef2, 0x3ef3, 0x3ef4, 0x3ef5, 0x3ef6, 0x3ef7, 0x3ef8, 0x3ef9, 0x3efa, 0x3efb, 0x3efc, 0x3efd, 0x3efe, 0x3eff, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06, 0x3f07, /* 0x3f00 */ 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e, 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16, 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e, 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47, /* 0x3f40 */ 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f, 0x3f80, 0x3f81, 0x3f82, 0x3f83, 0x3f84, 0x3f85, 0x3f86, 0x3f87, /* 0x3f80 */ 0x3f88, 0x3f89, 0x3f8a, 0x3f8b, 0x3f8c, 0x3f8d, 0x3f8e, 0x3f8f, 0x3f90, 0x3f91, 0x3f92, 0x3f93, 0x3f94, 0x3f95, 0x3f96, 0x3f97, 0x3f98, 0x3f99, 0x3f9a, 0x3f9b, 0x3f9c, 0x3f9d, 0x3f9e, 0x3f9f, 0x3fa0, 0x3fa1, 0x3fa2, 0x3fa3, 0x3fa4, 0x3fa5, 0x3fa6, 0x3fa7, 0x3fa8, 0x3fa9, 0x3faa, 0x3fab, 0x3fac, 0x3fad, 0x3fae, 0x3faf, 0x3fb0, 0x3fb1, 0x3fb2, 0x3fb3, 0x3fb4, 0x3fb5, 0x3fb6, 0x3fb7, 0x3fb8, 0x3fb9, 0x3fba, 0x3fbb, 0x3fbc, 0x3fbd, 0x3fbe, 0x3fbf, 0x3fc0, 0x3fc1, 0x3fc2, 0x3fc3, 0x3fc4, 0x3fc5, 0x3fc6, 0x3fc7, /* 0x3fc0 */ 0x3fc8, 0x3fc9, 0x3fca, 0x3fcb, 0x3fcc, 0x3fcd, 0x3fce, 0x3fcf, 0x3fd0, 0x3fd1, 0x3fd2, 0x3fd3, 0x3fd4, 0x3fd5, 0x3fd6, 0x3fd7, 0x3fd8, 0x3fd9, 0x3fda, 0x3fdb, 0x3fdc, 0x3fdd, 0x3fde, 0x3fdf, 0x3fe0, 0x3fe1, 0x3fe2, 0x3fe3, 0x3fe4, 0x3fe5, 0x3fe6, 0x3fe7, 0x3fe8, 0x3fe9, 0x3fea, 0x3feb, 0x3fec, 0x3fed, 0x3fee, 0x3fef, 0x3ff0, 0x3ff1, 0x3ff2, 0x3ff3, 0x3ff4, 0x3ff5, 0x3ff6, 0x3ff7, 0x3ff8, 0x3ff9, 0x3ffa, 0x3ffb, 0x3ffc, 0x3ffd, 0x3ffe, 0x3fff, 0x4000, 0x4001, 0x4002, 0x4003, 0x4004, 0x4005, 0x4006, 0x4007, /* 0x4000 */ 0x4008, 0x4009, 0x400a, 0x400b, 0x400c, 0x400d, 0x400e, 0x400f, 0x4010, 0x4011, 0x4012, 0x4013, 0x4014, 0x4015, 0x4016, 0x4017, 0x4018, 0x4019, 0x401a, 0x401b, 0x401c, 0x401d, 0x401e, 0x401f, 0x4020, 0x4021, 0x4022, 0x4023, 0x4024, 0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402a, 0x402b, 0x402c, 0x402d, 0x402e, 0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0x403e, 0x403f, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046, 0x4047, /* 0x4040 */ 0x4048, 0x4049, 0x404a, 0x404b, 0x404c, 0x404d, 0x404e, 0x404f, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056, 0x4057, 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e, 0x405f, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e, 0x406f, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e, 0x407f, 0x4080, 0x4081, 0x4082, 0x4083, 0x4084, 0x4085, 0x4086, 0x4087, /* 0x4080 */ 0x4088, 0x4089, 0x408a, 0x408b, 0x408c, 0x408d, 0x408e, 0x408f, 0x4090, 0x4091, 0x4092, 0x4093, 0x4094, 0x4095, 0x4096, 0x4097, 0x4098, 0x4099, 0x409a, 0x409b, 0x409c, 0x409d, 0x409e, 0x409f, 0x40a0, 0x40a1, 0x40a2, 0x40a3, 0x40a4, 0x40a5, 0x40a6, 0x40a7, 0x40a8, 0x40a9, 0x40aa, 0x40ab, 0x40ac, 0x40ad, 0x40ae, 0x40af, 0x40b0, 0x40b1, 0x40b2, 0x40b3, 0x40b4, 0x40b5, 0x40b6, 0x40b7, 0x40b8, 0x40b9, 0x40ba, 0x40bb, 0x40bc, 0x40bd, 0x40be, 0x40bf, 0x40c0, 0x40c1, 0x40c2, 0x40c3, 0x40c4, 0x40c5, 0x40c6, 0x40c7, /* 0x40c0 */ 0x40c8, 0x40c9, 0x40ca, 0x40cb, 0x40cc, 0x40cd, 0x40ce, 0x40cf, 0x40d0, 0x40d1, 0x40d2, 0x40d3, 0x40d4, 0x40d5, 0x40d6, 0x40d7, 0x40d8, 0x40d9, 0x40da, 0x40db, 0x40dc, 0x40dd, 0x40de, 0x40df, 0x40e0, 0x40e1, 0x40e2, 0x40e3, 0x40e4, 0x40e5, 0x40e6, 0x40e7, 0x40e8, 0x40e9, 0x40ea, 0x40eb, 0x40ec, 0x40ed, 0x40ee, 0x40ef, 0x40f0, 0x40f1, 0x40f2, 0x40f3, 0x40f4, 0x40f5, 0x40f6, 0x40f7, 0x40f8, 0x40f9, 0x40fa, 0x40fb, 0x40fc, 0x40fd, 0x40fe, 0x40ff, 0x4100, 0x4101, 0x4102, 0x4103, 0x4104, 0x4105, 0x4106, 0x4107, /* 0x4100 */ 0x4108, 0x4109, 0x410a, 0x410b, 0x410c, 0x410d, 0x410e, 0x410f, 0x4110, 0x4111, 0x4112, 0x4113, 0x4114, 0x4115, 0x4116, 0x4117, 0x4118, 0x4119, 0x411a, 0x411b, 0x411c, 0x411d, 0x411e, 0x411f, 0x4120, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128, 0x4129, 0x412a, 0x412b, 0x412c, 0x412d, 0x412e, 0x412f, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138, 0x4139, 0x413a, 0x413b, 0x413c, 0x413d, 0x413e, 0x413f, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145, 0x4146, 0x4147, /* 0x4140 */ 0x4148, 0x4149, 0x414a, 0x414b, 0x414c, 0x414d, 0x414e, 0x414f, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, 0x4158, 0x4159, 0x415a, 0x415b, 0x415c, 0x415d, 0x415e, 0x415f, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168, 0x4169, 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178, 0x4179, 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x417f, 0x4180, 0x4181, 0x4182, 0x4183, 0x4184, 0x4185, 0x4186, 0x4187, /* 0x4180 */ 0x4188, 0x4189, 0x418a, 0x418b, 0x418c, 0x418d, 0x418e, 0x418f, 0x4190, 0x4191, 0x4192, 0x4193, 0x4194, 0x4195, 0x4196, 0x4197, 0x4198, 0x4199, 0x419a, 0x419b, 0x419c, 0x419d, 0x419e, 0x419f, 0x41a0, 0x41a1, 0x41a2, 0x41a3, 0x41a4, 0x41a5, 0x41a6, 0x41a7, 0x41a8, 0x41a9, 0x41aa, 0x41ab, 0x41ac, 0x41ad, 0x41ae, 0x41af, 0x41b0, 0x41b1, 0x41b2, 0x41b3, 0x41b4, 0x41b5, 0x41b6, 0x41b7, 0x41b8, 0x41b9, 0x41ba, 0x41bb, 0x41bc, 0x41bd, 0x41be, 0x41bf, 0x41c0, 0x41c1, 0x41c2, 0x41c3, 0x41c4, 0x41c5, 0x41c6, 0x41c7, /* 0x41c0 */ 0x41c8, 0x41c9, 0x41ca, 0x41cb, 0x41cc, 0x41cd, 0x41ce, 0x41cf, 0x41d0, 0x41d1, 0x41d2, 0x41d3, 0x41d4, 0x41d5, 0x41d6, 0x41d7, 0x41d8, 0x41d9, 0x41da, 0x41db, 0x41dc, 0x41dd, 0x41de, 0x41df, 0x41e0, 0x41e1, 0x41e2, 0x41e3, 0x41e4, 0x41e5, 0x41e6, 0x41e7, 0x41e8, 0x41e9, 0x41ea, 0x41eb, 0x41ec, 0x41ed, 0x41ee, 0x41ef, 0x41f0, 0x41f1, 0x41f2, 0x41f3, 0x41f4, 0x41f5, 0x41f6, 0x41f7, 0x41f8, 0x41f9, 0x41fa, 0x41fb, 0x41fc, 0x41fd, 0x41fe, 0x41ff, 0x4200, 0x4201, 0x4202, 0x4203, 0x4204, 0x4205, 0x4206, 0x4207, /* 0x4200 */ 0x4208, 0x4209, 0x420a, 0x420b, 0x420c, 0x420d, 0x420e, 0x420f, 0x4210, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216, 0x4217, 0x4218, 0x4219, 0x421a, 0x421b, 0x421c, 0x421d, 0x421e, 0x421f, 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226, 0x4227, 0x4228, 0x4229, 0x422a, 0x422b, 0x422c, 0x422d, 0x422e, 0x422f, 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236, 0x4237, 0x4238, 0x4239, 0x423a, 0x423b, 0x423c, 0x423d, 0x423e, 0x423f, 0x4240, 0x4241, 0x4242, 0x4243, 0x4244, 0x4245, 0x4246, 0x4247, /* 0x4240 */ 0x4248, 0x4249, 0x424a, 0x424b, 0x424c, 0x424d, 0x424e, 0x424f, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425a, 0x425b, 0x425c, 0x425d, 0x425e, 0x425f, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266, 0x4267, 0x4268, 0x4269, 0x426a, 0x426b, 0x426c, 0x426d, 0x426e, 0x426f, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276, 0x4277, 0x4278, 0x4279, 0x427a, 0x427b, 0x427c, 0x427d, 0x427e, 0x427f, 0x4280, 0x4281, 0x4282, 0x4283, 0x4284, 0x4285, 0x4286, 0x4287, /* 0x4280 */ 0x4288, 0x4289, 0x428a, 0x428b, 0x428c, 0x428d, 0x428e, 0x428f, 0x4290, 0x4291, 0x4292, 0x4293, 0x4294, 0x4295, 0x4296, 0x4297, 0x4298, 0x4299, 0x429a, 0x429b, 0x429c, 0x429d, 0x429e, 0x429f, 0x42a0, 0x42a1, 0x42a2, 0x42a3, 0x42a4, 0x42a5, 0x42a6, 0x42a7, 0x42a8, 0x42a9, 0x42aa, 0x42ab, 0x42ac, 0x42ad, 0x42ae, 0x42af, 0x42b0, 0x42b1, 0x42b2, 0x42b3, 0x42b4, 0x42b5, 0x42b6, 0x42b7, 0x42b8, 0x42b9, 0x42ba, 0x42bb, 0x42bc, 0x42bd, 0x42be, 0x42bf, 0x42c0, 0x42c1, 0x42c2, 0x42c3, 0x42c4, 0x42c5, 0x42c6, 0x42c7, /* 0x42c0 */ 0x42c8, 0x42c9, 0x42ca, 0x42cb, 0x42cc, 0x42cd, 0x42ce, 0x42cf, 0x42d0, 0x42d1, 0x42d2, 0x42d3, 0x42d4, 0x42d5, 0x42d6, 0x42d7, 0x42d8, 0x42d9, 0x42da, 0x42db, 0x42dc, 0x42dd, 0x42de, 0x42df, 0x42e0, 0x42e1, 0x42e2, 0x42e3, 0x42e4, 0x42e5, 0x42e6, 0x42e7, 0x42e8, 0x42e9, 0x42ea, 0x42eb, 0x42ec, 0x42ed, 0x42ee, 0x42ef, 0x42f0, 0x42f1, 0x42f2, 0x42f3, 0x42f4, 0x42f5, 0x42f6, 0x42f7, 0x42f8, 0x42f9, 0x42fa, 0x42fb, 0x42fc, 0x42fd, 0x42fe, 0x42ff, 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306, 0x4307, /* 0x4300 */ 0x4308, 0x4309, 0x430a, 0x430b, 0x430c, 0x430d, 0x430e, 0x430f, 0x4310, 0x4311, 0x4312, 0x4313, 0x4314, 0x4315, 0x4316, 0x4317, 0x4318, 0x4319, 0x431a, 0x431b, 0x431c, 0x431d, 0x431e, 0x431f, 0x4320, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x432a, 0x432b, 0x432c, 0x432d, 0x432e, 0x432f, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, 0x4336, 0x4337, 0x4338, 0x4339, 0x433a, 0x433b, 0x433c, 0x433d, 0x433e, 0x433f, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347, /* 0x4340 */ 0x4348, 0x4349, 0x434a, 0x434b, 0x434c, 0x434d, 0x434e, 0x434f, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357, 0x4358, 0x4359, 0x435a, 0x435b, 0x435c, 0x435d, 0x435e, 0x435f, 0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x436a, 0x436b, 0x436c, 0x436d, 0x436e, 0x436f, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377, 0x4378, 0x4379, 0x437a, 0x437b, 0x437c, 0x437d, 0x437e, 0x437f, 0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, 0x4387, /* 0x4380 */ 0x4388, 0x4389, 0x438a, 0x438b, 0x438c, 0x438d, 0x438e, 0x438f, 0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395, 0x4396, 0x4397, 0x4398, 0x4399, 0x439a, 0x439b, 0x439c, 0x439d, 0x439e, 0x439f, 0x43a0, 0x43a1, 0x43a2, 0x43a3, 0x43a4, 0x43a5, 0x43a6, 0x43a7, 0x43a8, 0x43a9, 0x43aa, 0x43ab, 0x43ac, 0x43ad, 0x43ae, 0x43af, 0x43b0, 0x43b1, 0x43b2, 0x43b3, 0x43b4, 0x43b5, 0x43b6, 0x43b7, 0x43b8, 0x43b9, 0x43ba, 0x43bb, 0x43bc, 0x43bd, 0x43be, 0x43bf, 0x43c0, 0x43c1, 0x43c2, 0x43c3, 0x43c4, 0x43c5, 0x43c6, 0x43c7, /* 0x43c0 */ 0x43c8, 0x43c9, 0x43ca, 0x43cb, 0x43cc, 0x43cd, 0x43ce, 0x43cf, 0x43d0, 0x43d1, 0x43d2, 0x43d3, 0x43d4, 0x43d5, 0x43d6, 0x43d7, 0x43d8, 0x43d9, 0x43da, 0x43db, 0x43dc, 0x43dd, 0x43de, 0x43df, 0x43e0, 0x43e1, 0x43e2, 0x43e3, 0x43e4, 0x43e5, 0x43e6, 0x43e7, 0x43e8, 0x43e9, 0x43ea, 0x43eb, 0x43ec, 0x43ed, 0x43ee, 0x43ef, 0x43f0, 0x43f1, 0x43f2, 0x43f3, 0x43f4, 0x43f5, 0x43f6, 0x43f7, 0x43f8, 0x43f9, 0x43fa, 0x43fb, 0x43fc, 0x43fd, 0x43fe, 0x43ff, 0x4400, 0x4401, 0x4402, 0x4403, 0x4404, 0x4405, 0x4406, 0x4407, /* 0x4400 */ 0x4408, 0x4409, 0x440a, 0x440b, 0x440c, 0x440d, 0x440e, 0x440f, 0x4410, 0x4411, 0x4412, 0x4413, 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, 0x441a, 0x441b, 0x441c, 0x441d, 0x441e, 0x441f, 0x4420, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e, 0x442f, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e, 0x443f, 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, /* 0x4440 */ 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e, 0x444f, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e, 0x445f, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e, 0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447d, 0x447e, 0x447f, 0x4480, 0x4481, 0x4482, 0x4483, 0x4484, 0x4485, 0x4486, 0x4487, /* 0x4480 */ 0x4488, 0x4489, 0x448a, 0x448b, 0x448c, 0x448d, 0x448e, 0x448f, 0x4490, 0x4491, 0x4492, 0x4493, 0x4494, 0x4495, 0x4496, 0x4497, 0x4498, 0x4499, 0x449a, 0x449b, 0x449c, 0x449d, 0x449e, 0x449f, 0x44a0, 0x44a1, 0x44a2, 0x44a3, 0x44a4, 0x44a5, 0x44a6, 0x44a7, 0x44a8, 0x44a9, 0x44aa, 0x44ab, 0x44ac, 0x44ad, 0x44ae, 0x44af, 0x44b0, 0x44b1, 0x44b2, 0x44b3, 0x44b4, 0x44b5, 0x44b6, 0x44b7, 0x44b8, 0x44b9, 0x44ba, 0x44bb, 0x44bc, 0x44bd, 0x44be, 0x44bf, 0x44c0, 0x44c1, 0x44c2, 0x44c3, 0x44c4, 0x44c5, 0x44c6, 0x44c7, /* 0x44c0 */ 0x44c8, 0x44c9, 0x44ca, 0x44cb, 0x44cc, 0x44cd, 0x44ce, 0x44cf, 0x44d0, 0x44d1, 0x44d2, 0x44d3, 0x44d4, 0x44d5, 0x44d6, 0x44d7, 0x44d8, 0x44d9, 0x44da, 0x44db, 0x44dc, 0x44dd, 0x44de, 0x44df, 0x44e0, 0x44e1, 0x44e2, 0x44e3, 0x44e4, 0x44e5, 0x44e6, 0x44e7, 0x44e8, 0x44e9, 0x44ea, 0x44eb, 0x44ec, 0x44ed, 0x44ee, 0x44ef, 0x44f0, 0x44f1, 0x44f2, 0x44f3, 0x44f4, 0x44f5, 0x44f6, 0x44f7, 0x44f8, 0x44f9, 0x44fa, 0x44fb, 0x44fc, 0x44fd, 0x44fe, 0x44ff, 0x4500, 0x4501, 0x4502, 0x4503, 0x4504, 0x4505, 0x4506, 0x4507, /* 0x4500 */ 0x4508, 0x4509, 0x450a, 0x450b, 0x450c, 0x450d, 0x450e, 0x450f, 0x4510, 0x4511, 0x4512, 0x4513, 0x4514, 0x4515, 0x4516, 0x4517, 0x4518, 0x4519, 0x451a, 0x451b, 0x451c, 0x451d, 0x451e, 0x451f, 0x4520, 0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x452f, 0x4530, 0x4531, 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540, 0x4541, 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, /* 0x4540 */ 0x4548, 0x4549, 0x454a, 0x454b, 0x454c, 0x454d, 0x454e, 0x454f, 0x4550, 0x4551, 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560, 0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570, 0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457a, 0x457b, 0x457c, 0x457d, 0x457e, 0x457f, 0x4580, 0x4581, 0x4582, 0x4583, 0x4584, 0x4585, 0x4586, 0x4587, /* 0x4580 */ 0x4588, 0x4589, 0x458a, 0x458b, 0x458c, 0x458d, 0x458e, 0x458f, 0x4590, 0x4591, 0x4592, 0x4593, 0x4594, 0x4595, 0x4596, 0x4597, 0x4598, 0x4599, 0x459a, 0x459b, 0x459c, 0x459d, 0x459e, 0x459f, 0x45a0, 0x45a1, 0x45a2, 0x45a3, 0x45a4, 0x45a5, 0x45a6, 0x45a7, 0x45a8, 0x45a9, 0x45aa, 0x45ab, 0x45ac, 0x45ad, 0x45ae, 0x45af, 0x45b0, 0x45b1, 0x45b2, 0x45b3, 0x45b4, 0x45b5, 0x45b6, 0x45b7, 0x45b8, 0x45b9, 0x45ba, 0x45bb, 0x45bc, 0x45bd, 0x45be, 0x45bf, 0x45c0, 0x45c1, 0x45c2, 0x45c3, 0x45c4, 0x45c5, 0x45c6, 0x45c7, /* 0x45c0 */ 0x45c8, 0x45c9, 0x45ca, 0x45cb, 0x45cc, 0x45cd, 0x45ce, 0x45cf, 0x45d0, 0x45d1, 0x45d2, 0x45d3, 0x45d4, 0x45d5, 0x45d6, 0x45d7, 0x45d8, 0x45d9, 0x45da, 0x45db, 0x45dc, 0x45dd, 0x45de, 0x45df, 0x45e0, 0x45e1, 0x45e2, 0x45e3, 0x45e4, 0x45e5, 0x45e6, 0x45e7, 0x45e8, 0x45e9, 0x45ea, 0x45eb, 0x45ec, 0x45ed, 0x45ee, 0x45ef, 0x45f0, 0x45f1, 0x45f2, 0x45f3, 0x45f4, 0x45f5, 0x45f6, 0x45f7, 0x45f8, 0x45f9, 0x45fa, 0x45fb, 0x45fc, 0x45fd, 0x45fe, 0x45ff, 0x4600, 0x4601, 0x4602, 0x4603, 0x4604, 0x4605, 0x4606, 0x4607, /* 0x4600 */ 0x4608, 0x4609, 0x460a, 0x460b, 0x460c, 0x460d, 0x460e, 0x460f, 0x4610, 0x4611, 0x4612, 0x4613, 0x4614, 0x4615, 0x4616, 0x4617, 0x4618, 0x4619, 0x461a, 0x461b, 0x461c, 0x461d, 0x461e, 0x461f, 0x4620, 0x4621, 0x4622, 0x4623, 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462a, 0x462b, 0x462c, 0x462d, 0x462e, 0x462f, 0x4630, 0x4631, 0x4632, 0x4633, 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463a, 0x463b, 0x463c, 0x463d, 0x463e, 0x463f, 0x4640, 0x4641, 0x4642, 0x4643, 0x4644, 0x4645, 0x4646, 0x4647, /* 0x4640 */ 0x4648, 0x4649, 0x464a, 0x464b, 0x464c, 0x464d, 0x464e, 0x464f, 0x4650, 0x4651, 0x4652, 0x4653, 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465a, 0x465b, 0x465c, 0x465d, 0x465e, 0x465f, 0x4660, 0x4661, 0x4662, 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, 0x4668, 0x4669, 0x466a, 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, 0x4679, 0x467a, 0x467b, 0x467c, 0x467d, 0x467e, 0x467f, 0x4680, 0x4681, 0x4682, 0x4683, 0x4684, 0x4685, 0x4686, 0x4687, /* 0x4680 */ 0x4688, 0x4689, 0x468a, 0x468b, 0x468c, 0x468d, 0x468e, 0x468f, 0x4690, 0x4691, 0x4692, 0x4693, 0x4694, 0x4695, 0x4696, 0x4697, 0x4698, 0x4699, 0x469a, 0x469b, 0x469c, 0x469d, 0x469e, 0x469f, 0x46a0, 0x46a1, 0x46a2, 0x46a3, 0x46a4, 0x46a5, 0x46a6, 0x46a7, 0x46a8, 0x46a9, 0x46aa, 0x46ab, 0x46ac, 0x46ad, 0x46ae, 0x46af, 0x46b0, 0x46b1, 0x46b2, 0x46b3, 0x46b4, 0x46b5, 0x46b6, 0x46b7, 0x46b8, 0x46b9, 0x46ba, 0x46bb, 0x46bc, 0x46bd, 0x46be, 0x46bf, 0x46c0, 0x46c1, 0x46c2, 0x46c3, 0x46c4, 0x46c5, 0x46c6, 0x46c7, /* 0x46c0 */ 0x46c8, 0x46c9, 0x46ca, 0x46cb, 0x46cc, 0x46cd, 0x46ce, 0x46cf, 0x46d0, 0x46d1, 0x46d2, 0x46d3, 0x46d4, 0x46d5, 0x46d6, 0x46d7, 0x46d8, 0x46d9, 0x46da, 0x46db, 0x46dc, 0x46dd, 0x46de, 0x46df, 0x46e0, 0x46e1, 0x46e2, 0x46e3, 0x46e4, 0x46e5, 0x46e6, 0x46e7, 0x46e8, 0x46e9, 0x46ea, 0x46eb, 0x46ec, 0x46ed, 0x46ee, 0x46ef, 0x46f0, 0x46f1, 0x46f2, 0x46f3, 0x46f4, 0x46f5, 0x46f6, 0x46f7, 0x46f8, 0x46f9, 0x46fa, 0x46fb, 0x46fc, 0x46fd, 0x46fe, 0x46ff, 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, 0x4705, 0x4706, 0x4707, /* 0x4700 */ 0x4708, 0x4709, 0x470a, 0x470b, 0x470c, 0x470d, 0x470e, 0x470f, 0x4710, 0x4711, 0x4712, 0x4713, 0x4714, 0x4715, 0x4716, 0x4717, 0x4718, 0x4719, 0x471a, 0x471b, 0x471c, 0x471d, 0x471e, 0x471f, 0x4720, 0x4721, 0x4722, 0x4723, 0x4724, 0x4725, 0x4726, 0x4727, 0x4728, 0x4729, 0x472a, 0x472b, 0x472c, 0x472d, 0x472e, 0x472f, 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737, 0x4738, 0x4739, 0x473a, 0x473b, 0x473c, 0x473d, 0x473e, 0x473f, 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747, /* 0x4740 */ 0x4748, 0x4749, 0x474a, 0x474b, 0x474c, 0x474d, 0x474e, 0x474f, 0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757, 0x4758, 0x4759, 0x475a, 0x475b, 0x475c, 0x475d, 0x475e, 0x475f, 0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767, 0x4768, 0x4769, 0x476a, 0x476b, 0x476c, 0x476d, 0x476e, 0x476f, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777, 0x4778, 0x4779, 0x477a, 0x477b, 0x477c, 0x477d, 0x477e, 0x477f, 0x4780, 0x4781, 0x4782, 0x4783, 0x4784, 0x4785, 0x4786, 0x4787, /* 0x4780 */ 0x4788, 0x4789, 0x478a, 0x478b, 0x478c, 0x478d, 0x478e, 0x478f, 0x4790, 0x4791, 0x4792, 0x4793, 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799, 0x479a, 0x479b, 0x479c, 0x479d, 0x479e, 0x479f, 0x47a0, 0x47a1, 0x47a2, 0x47a3, 0x47a4, 0x47a5, 0x47a6, 0x47a7, 0x47a8, 0x47a9, 0x47aa, 0x47ab, 0x47ac, 0x47ad, 0x47ae, 0x47af, 0x47b0, 0x47b1, 0x47b2, 0x47b3, 0x47b4, 0x47b5, 0x47b6, 0x47b7, 0x47b8, 0x47b9, 0x47ba, 0x47bb, 0x47bc, 0x47bd, 0x47be, 0x47bf, 0x47c0, 0x47c1, 0x47c2, 0x47c3, 0x47c4, 0x47c5, 0x47c6, 0x47c7, /* 0x47c0 */ 0x47c8, 0x47c9, 0x47ca, 0x47cb, 0x47cc, 0x47cd, 0x47ce, 0x47cf, 0x47d0, 0x47d1, 0x47d2, 0x47d3, 0x47d4, 0x47d5, 0x47d6, 0x47d7, 0x47d8, 0x47d9, 0x47da, 0x47db, 0x47dc, 0x47dd, 0x47de, 0x47df, 0x47e0, 0x47e1, 0x47e2, 0x47e3, 0x47e4, 0x47e5, 0x47e6, 0x47e7, 0x47e8, 0x47e9, 0x47ea, 0x47eb, 0x47ec, 0x47ed, 0x47ee, 0x47ef, 0x47f0, 0x47f1, 0x47f2, 0x47f3, 0x47f4, 0x47f5, 0x47f6, 0x47f7, 0x47f8, 0x47f9, 0x47fa, 0x47fb, 0x47fc, 0x47fd, 0x47fe, 0x47ff, 0x4800, 0x4801, 0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, /* 0x4800 */ 0x4808, 0x4809, 0x480a, 0x480b, 0x480c, 0x480d, 0x480e, 0x480f, 0x4810, 0x4811, 0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817, 0x4818, 0x4819, 0x481a, 0x481b, 0x481c, 0x481d, 0x481e, 0x481f, 0x4820, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829, 0x482a, 0x482b, 0x482c, 0x482d, 0x482e, 0x482f, 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839, 0x483a, 0x483b, 0x483c, 0x483d, 0x483e, 0x483f, 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, /* 0x4840 */ 0x4848, 0x4849, 0x484a, 0x484b, 0x484c, 0x484d, 0x484e, 0x484f, 0x4850, 0x4851, 0x4852, 0x4853, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859, 0x485a, 0x485b, 0x485c, 0x485d, 0x485e, 0x485f, 0x4860, 0x4861, 0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869, 0x486a, 0x486b, 0x486c, 0x486d, 0x486e, 0x486f, 0x4870, 0x4871, 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879, 0x487a, 0x487b, 0x487c, 0x487d, 0x487e, 0x487f, 0x4880, 0x4881, 0x4882, 0x4883, 0x4884, 0x4885, 0x4886, 0x4887, /* 0x4880 */ 0x4888, 0x4889, 0x488a, 0x488b, 0x488c, 0x488d, 0x488e, 0x488f, 0x4890, 0x4891, 0x4892, 0x4893, 0x4894, 0x4895, 0x4896, 0x4897, 0x4898, 0x4899, 0x489a, 0x489b, 0x489c, 0x489d, 0x489e, 0x489f, 0x48a0, 0x48a1, 0x48a2, 0x48a3, 0x48a4, 0x48a5, 0x48a6, 0x48a7, 0x48a8, 0x48a9, 0x48aa, 0x48ab, 0x48ac, 0x48ad, 0x48ae, 0x48af, 0x48b0, 0x48b1, 0x48b2, 0x48b3, 0x48b4, 0x48b5, 0x48b6, 0x48b7, 0x48b8, 0x48b9, 0x48ba, 0x48bb, 0x48bc, 0x48bd, 0x48be, 0x48bf, 0x48c0, 0x48c1, 0x48c2, 0x48c3, 0x48c4, 0x48c5, 0x48c6, 0x48c7, /* 0x48c0 */ 0x48c8, 0x48c9, 0x48ca, 0x48cb, 0x48cc, 0x48cd, 0x48ce, 0x48cf, 0x48d0, 0x48d1, 0x48d2, 0x48d3, 0x48d4, 0x48d5, 0x48d6, 0x48d7, 0x48d8, 0x48d9, 0x48da, 0x48db, 0x48dc, 0x48dd, 0x48de, 0x48df, 0x48e0, 0x48e1, 0x48e2, 0x48e3, 0x48e4, 0x48e5, 0x48e6, 0x48e7, 0x48e8, 0x48e9, 0x48ea, 0x48eb, 0x48ec, 0x48ed, 0x48ee, 0x48ef, 0x48f0, 0x48f1, 0x48f2, 0x48f3, 0x48f4, 0x48f5, 0x48f6, 0x48f7, 0x48f8, 0x48f9, 0x48fa, 0x48fb, 0x48fc, 0x48fd, 0x48fe, 0x48ff, 0x4900, 0x4901, 0x4902, 0x4903, 0x4904, 0x4905, 0x4906, 0x4907, /* 0x4900 */ 0x4908, 0x4909, 0x490a, 0x490b, 0x490c, 0x490d, 0x490e, 0x490f, 0x4910, 0x4911, 0x4912, 0x4913, 0x4914, 0x4915, 0x4916, 0x4917, 0x4918, 0x4919, 0x491a, 0x491b, 0x491c, 0x491d, 0x491e, 0x491f, 0x4920, 0x4921, 0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929, 0x492a, 0x492b, 0x492c, 0x492d, 0x492e, 0x492f, 0x4930, 0x4931, 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939, 0x493a, 0x493b, 0x493c, 0x493d, 0x493e, 0x493f, 0x4940, 0x4941, 0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4947, /* 0x4940 */ 0x4948, 0x4949, 0x494a, 0x494b, 0x494c, 0x494d, 0x494e, 0x494f, 0x4950, 0x4951, 0x4952, 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x495a, 0x495b, 0x495c, 0x495d, 0x495e, 0x495f, 0x4960, 0x4961, 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x496a, 0x496b, 0x496c, 0x496d, 0x496e, 0x496f, 0x4970, 0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, 0x497a, 0x497b, 0x497c, 0x497d, 0x497e, 0x497f, 0x4980, 0x4981, 0x4982, 0x4983, 0x4984, 0x4985, 0x4986, 0x4987, /* 0x4980 */ 0x4988, 0x4989, 0x498a, 0x498b, 0x498c, 0x498d, 0x498e, 0x498f, 0x4990, 0x4991, 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, 0x4998, 0x4999, 0x499a, 0x499b, 0x499c, 0x499d, 0x499e, 0x499f, 0x49a0, 0x49a1, 0x49a2, 0x49a3, 0x49a4, 0x49a5, 0x49a6, 0x49a7, 0x49a8, 0x49a9, 0x49aa, 0x49ab, 0x49ac, 0x49ad, 0x49ae, 0x49af, 0x49b0, 0x49b1, 0x49b2, 0x49b3, 0x49b4, 0x49b5, 0x49b6, 0x49b7, 0x49b8, 0x49b9, 0x49ba, 0x49bb, 0x49bc, 0x49bd, 0x49be, 0x49bf, 0x49c0, 0x49c1, 0x49c2, 0x49c3, 0x49c4, 0x49c5, 0x49c6, 0x49c7, /* 0x49c0 */ 0x49c8, 0x49c9, 0x49ca, 0x49cb, 0x49cc, 0x49cd, 0x49ce, 0x49cf, 0x49d0, 0x49d1, 0x49d2, 0x49d3, 0x49d4, 0x49d5, 0x49d6, 0x49d7, 0x49d8, 0x49d9, 0x49da, 0x49db, 0x49dc, 0x49dd, 0x49de, 0x49df, 0x49e0, 0x49e1, 0x49e2, 0x49e3, 0x49e4, 0x49e5, 0x49e6, 0x49e7, 0x49e8, 0x49e9, 0x49ea, 0x49eb, 0x49ec, 0x49ed, 0x49ee, 0x49ef, 0x49f0, 0x49f1, 0x49f2, 0x49f3, 0x49f4, 0x49f5, 0x49f6, 0x49f7, 0x49f8, 0x49f9, 0x49fa, 0x49fb, 0x49fc, 0x49fd, 0x49fe, 0x49ff, 0x4a00, 0x4a01, 0x4a02, 0x4a03, 0x4a04, 0x4a05, 0x4a06, 0x4a07, /* 0x4a00 */ 0x4a08, 0x4a09, 0x4a0a, 0x4a0b, 0x4a0c, 0x4a0d, 0x4a0e, 0x4a0f, 0x4a10, 0x4a11, 0x4a12, 0x4a13, 0x4a14, 0x4a15, 0x4a16, 0x4a17, 0x4a18, 0x4a19, 0x4a1a, 0x4a1b, 0x4a1c, 0x4a1d, 0x4a1e, 0x4a1f, 0x4a20, 0x4a21, 0x4a22, 0x4a23, 0x4a24, 0x4a25, 0x4a26, 0x4a27, 0x4a28, 0x4a29, 0x4a2a, 0x4a2b, 0x4a2c, 0x4a2d, 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a32, 0x4a33, 0x4a34, 0x4a35, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a, 0x4a3b, 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a42, 0x4a43, 0x4a44, 0x4a45, 0x4a46, 0x4a47, /* 0x4a40 */ 0x4a48, 0x4a49, 0x4a4a, 0x4a4b, 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, 0x4a50, 0x4a51, 0x4a52, 0x4a53, 0x4a54, 0x4a55, 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a5a, 0x4a5b, 0x4a5c, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62, 0x4a63, 0x4a64, 0x4a65, 0x4a66, 0x4a67, 0x4a68, 0x4a69, 0x4a6a, 0x4a6b, 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6f, 0x4a70, 0x4a71, 0x4a72, 0x4a73, 0x4a74, 0x4a75, 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a, 0x4a7b, 0x4a7c, 0x4a7d, 0x4a7e, 0x4a7f, 0x4a80, 0x4a81, 0x4a82, 0x4a83, 0x4a84, 0x4a85, 0x4a86, 0x4a87, /* 0x4a80 */ 0x4a88, 0x4a89, 0x4a8a, 0x4a8b, 0x4a8c, 0x4a8d, 0x4a8e, 0x4a8f, 0x4a90, 0x4a91, 0x4a92, 0x4a93, 0x4a94, 0x4a95, 0x4a96, 0x4a97, 0x4a98, 0x4a99, 0x4a9a, 0x4a9b, 0x4a9c, 0x4a9d, 0x4a9e, 0x4a9f, 0x4aa0, 0x4aa1, 0x4aa2, 0x4aa3, 0x4aa4, 0x4aa5, 0x4aa6, 0x4aa7, 0x4aa8, 0x4aa9, 0x4aaa, 0x4aab, 0x4aac, 0x4aad, 0x4aae, 0x4aaf, 0x4ab0, 0x4ab1, 0x4ab2, 0x4ab3, 0x4ab4, 0x4ab5, 0x4ab6, 0x4ab7, 0x4ab8, 0x4ab9, 0x4aba, 0x4abb, 0x4abc, 0x4abd, 0x4abe, 0x4abf, 0x4ac0, 0x4ac1, 0x4ac2, 0x4ac3, 0x4ac4, 0x4ac5, 0x4ac6, 0x4ac7, /* 0x4ac0 */ 0x4ac8, 0x4ac9, 0x4aca, 0x4acb, 0x4acc, 0x4acd, 0x4ace, 0x4acf, 0x4ad0, 0x4ad1, 0x4ad2, 0x4ad3, 0x4ad4, 0x4ad5, 0x4ad6, 0x4ad7, 0x4ad8, 0x4ad9, 0x4ada, 0x4adb, 0x4adc, 0x4add, 0x4ade, 0x4adf, 0x4ae0, 0x4ae1, 0x4ae2, 0x4ae3, 0x4ae4, 0x4ae5, 0x4ae6, 0x4ae7, 0x4ae8, 0x4ae9, 0x4aea, 0x4aeb, 0x4aec, 0x4aed, 0x4aee, 0x4aef, 0x4af0, 0x4af1, 0x4af2, 0x4af3, 0x4af4, 0x4af5, 0x4af6, 0x4af7, 0x4af8, 0x4af9, 0x4afa, 0x4afb, 0x4afc, 0x4afd, 0x4afe, 0x4aff, 0x4b00, 0x4b01, 0x4b02, 0x4b03, 0x4b04, 0x4b05, 0x4b06, 0x4b07, /* 0x4b00 */ 0x4b08, 0x4b09, 0x4b0a, 0x4b0b, 0x4b0c, 0x4b0d, 0x4b0e, 0x4b0f, 0x4b10, 0x4b11, 0x4b12, 0x4b13, 0x4b14, 0x4b15, 0x4b16, 0x4b17, 0x4b18, 0x4b19, 0x4b1a, 0x4b1b, 0x4b1c, 0x4b1d, 0x4b1e, 0x4b1f, 0x4b20, 0x4b21, 0x4b22, 0x4b23, 0x4b24, 0x4b25, 0x4b26, 0x4b27, 0x4b28, 0x4b29, 0x4b2a, 0x4b2b, 0x4b2c, 0x4b2d, 0x4b2e, 0x4b2f, 0x4b30, 0x4b31, 0x4b32, 0x4b33, 0x4b34, 0x4b35, 0x4b36, 0x4b37, 0x4b38, 0x4b39, 0x4b3a, 0x4b3b, 0x4b3c, 0x4b3d, 0x4b3e, 0x4b3f, 0x4b40, 0x4b41, 0x4b42, 0x4b43, 0x4b44, 0x4b45, 0x4b46, 0x4b47, /* 0x4b40 */ 0x4b48, 0x4b49, 0x4b4a, 0x4b4b, 0x4b4c, 0x4b4d, 0x4b4e, 0x4b4f, 0x4b50, 0x4b51, 0x4b52, 0x4b53, 0x4b54, 0x4b55, 0x4b56, 0x4b57, 0x4b58, 0x4b59, 0x4b5a, 0x4b5b, 0x4b5c, 0x4b5d, 0x4b5e, 0x4b5f, 0x4b60, 0x4b61, 0x4b62, 0x4b63, 0x4b64, 0x4b65, 0x4b66, 0x4b67, 0x4b68, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6c, 0x4b6d, 0x4b6e, 0x4b6f, 0x4b70, 0x4b71, 0x4b72, 0x4b73, 0x4b74, 0x4b75, 0x4b76, 0x4b77, 0x4b78, 0x4b79, 0x4b7a, 0x4b7b, 0x4b7c, 0x4b7d, 0x4b7e, 0x4b7f, 0x4b80, 0x4b81, 0x4b82, 0x4b83, 0x4b84, 0x4b85, 0x4b86, 0x4b87, /* 0x4b80 */ 0x4b88, 0x4b89, 0x4b8a, 0x4b8b, 0x4b8c, 0x4b8d, 0x4b8e, 0x4b8f, 0x4b90, 0x4b91, 0x4b92, 0x4b93, 0x4b94, 0x4b95, 0x4b96, 0x4b97, 0x4b98, 0x4b99, 0x4b9a, 0x4b9b, 0x4b9c, 0x4b9d, 0x4b9e, 0x4b9f, 0x4ba0, 0x4ba1, 0x4ba2, 0x4ba3, 0x4ba4, 0x4ba5, 0x4ba6, 0x4ba7, 0x4ba8, 0x4ba9, 0x4baa, 0x4bab, 0x4bac, 0x4bad, 0x4bae, 0x4baf, 0x4bb0, 0x4bb1, 0x4bb2, 0x4bb3, 0x4bb4, 0x4bb5, 0x4bb6, 0x4bb7, 0x4bb8, 0x4bb9, 0x4bba, 0x4bbb, 0x4bbc, 0x4bbd, 0x4bbe, 0x4bbf, 0x4bc0, 0x4bc1, 0x4bc2, 0x4bc3, 0x4bc4, 0x4bc5, 0x4bc6, 0x4bc7, /* 0x4bc0 */ 0x4bc8, 0x4bc9, 0x4bca, 0x4bcb, 0x4bcc, 0x4bcd, 0x4bce, 0x4bcf, 0x4bd0, 0x4bd1, 0x4bd2, 0x4bd3, 0x4bd4, 0x4bd5, 0x4bd6, 0x4bd7, 0x4bd8, 0x4bd9, 0x4bda, 0x4bdb, 0x4bdc, 0x4bdd, 0x4bde, 0x4bdf, 0x4be0, 0x4be1, 0x4be2, 0x4be3, 0x4be4, 0x4be5, 0x4be6, 0x4be7, 0x4be8, 0x4be9, 0x4bea, 0x4beb, 0x4bec, 0x4bed, 0x4bee, 0x4bef, 0x4bf0, 0x4bf1, 0x4bf2, 0x4bf3, 0x4bf4, 0x4bf5, 0x4bf6, 0x4bf7, 0x4bf8, 0x4bf9, 0x4bfa, 0x4bfb, 0x4bfc, 0x4bfd, 0x4bfe, 0x4bff, 0x4c00, 0x4c01, 0x4c02, 0x4c03, 0x4c04, 0x4c05, 0x4c06, 0x4c07, /* 0x4c00 */ 0x4c08, 0x4c09, 0x4c0a, 0x4c0b, 0x4c0c, 0x4c0d, 0x4c0e, 0x4c0f, 0x4c10, 0x4c11, 0x4c12, 0x4c13, 0x4c14, 0x4c15, 0x4c16, 0x4c17, 0x4c18, 0x4c19, 0x4c1a, 0x4c1b, 0x4c1c, 0x4c1d, 0x4c1e, 0x4c1f, 0x4c20, 0x4c21, 0x4c22, 0x4c23, 0x4c24, 0x4c25, 0x4c26, 0x4c27, 0x4c28, 0x4c29, 0x4c2a, 0x4c2b, 0x4c2c, 0x4c2d, 0x4c2e, 0x4c2f, 0x4c30, 0x4c31, 0x4c32, 0x4c33, 0x4c34, 0x4c35, 0x4c36, 0x4c37, 0x4c38, 0x4c39, 0x4c3a, 0x4c3b, 0x4c3c, 0x4c3d, 0x4c3e, 0x4c3f, 0x4c40, 0x4c41, 0x4c42, 0x4c43, 0x4c44, 0x4c45, 0x4c46, 0x4c47, /* 0x4c40 */ 0x4c48, 0x4c49, 0x4c4a, 0x4c4b, 0x4c4c, 0x4c4d, 0x4c4e, 0x4c4f, 0x4c50, 0x4c51, 0x4c52, 0x4c53, 0x4c54, 0x4c55, 0x4c56, 0x4c57, 0x4c58, 0x4c59, 0x4c5a, 0x4c5b, 0x4c5c, 0x4c5d, 0x4c5e, 0x4c5f, 0x4c60, 0x4c61, 0x4c62, 0x4c63, 0x4c64, 0x4c65, 0x4c66, 0x4c67, 0x4c68, 0x4c69, 0x4c6a, 0x4c6b, 0x4c6c, 0x4c6d, 0x4c6e, 0x4c6f, 0x4c70, 0x4c71, 0x4c72, 0x4c73, 0x4c74, 0x4c75, 0x4c76, 0x4c77, 0x4c78, 0x4c79, 0x4c7a, 0x4c7b, 0x4c7c, 0x4c7d, 0x4c7e, 0x4c7f, 0x4c80, 0x4c81, 0x4c82, 0x4c83, 0x4c84, 0x4c85, 0x4c86, 0x4c87, /* 0x4c80 */ 0x4c88, 0x4c89, 0x4c8a, 0x4c8b, 0x4c8c, 0x4c8d, 0x4c8e, 0x4c8f, 0x4c90, 0x4c91, 0x4c92, 0x4c93, 0x4c94, 0x4c95, 0x4c96, 0x4c97, 0x4c98, 0x4c99, 0x4c9a, 0x4c9b, 0x4c9c, 0x4c9d, 0x4c9e, 0x4c9f, 0x4ca0, 0x4ca1, 0x4ca2, 0x4ca3, 0x4ca4, 0x4ca5, 0x4ca6, 0x4ca7, 0x4ca8, 0x4ca9, 0x4caa, 0x4cab, 0x4cac, 0x4cad, 0x4cae, 0x4caf, 0x4cb0, 0x4cb1, 0x4cb2, 0x4cb3, 0x4cb4, 0x4cb5, 0x4cb6, 0x4cb7, 0x4cb8, 0x4cb9, 0x4cba, 0x4cbb, 0x4cbc, 0x4cbd, 0x4cbe, 0x4cbf, 0x4cc0, 0x4cc1, 0x4cc2, 0x4cc3, 0x4cc4, 0x4cc5, 0x4cc6, 0x4cc7, /* 0x4cc0 */ 0x4cc8, 0x4cc9, 0x4cca, 0x4ccb, 0x4ccc, 0x4ccd, 0x4cce, 0x4ccf, 0x4cd0, 0x4cd1, 0x4cd2, 0x4cd3, 0x4cd4, 0x4cd5, 0x4cd6, 0x4cd7, 0x4cd8, 0x4cd9, 0x4cda, 0x4cdb, 0x4cdc, 0x4cdd, 0x4cde, 0x4cdf, 0x4ce0, 0x4ce1, 0x4ce2, 0x4ce3, 0x4ce4, 0x4ce5, 0x4ce6, 0x4ce7, 0x4ce8, 0x4ce9, 0x4cea, 0x4ceb, 0x4cec, 0x4ced, 0x4cee, 0x4cef, 0x4cf0, 0x4cf1, 0x4cf2, 0x4cf3, 0x4cf4, 0x4cf5, 0x4cf6, 0x4cf7, 0x4cf8, 0x4cf9, 0x4cfa, 0x4cfb, 0x4cfc, 0x4cfd, 0x4cfe, 0x4cff, 0x4d00, 0x4d01, 0x4d02, 0x4d03, 0x4d04, 0x4d05, 0x4d06, 0x4d07, /* 0x4d00 */ 0x4d08, 0x4d09, 0x4d0a, 0x4d0b, 0x4d0c, 0x4d0d, 0x4d0e, 0x4d0f, 0x4d10, 0x4d11, 0x4d12, 0x4d13, 0x4d14, 0x4d15, 0x4d16, 0x4d17, 0x4d18, 0x4d19, 0x4d1a, 0x4d1b, 0x4d1c, 0x4d1d, 0x4d1e, 0x4d1f, 0x4d20, 0x4d21, 0x4d22, 0x4d23, 0x4d24, 0x4d25, 0x4d26, 0x4d27, 0x4d28, 0x4d29, 0x4d2a, 0x4d2b, 0x4d2c, 0x4d2d, 0x4d2e, 0x4d2f, 0x4d30, 0x4d31, 0x4d32, 0x4d33, 0x4d34, 0x4d35, 0x4d36, 0x4d37, 0x4d38, 0x4d39, 0x4d3a, 0x4d3b, 0x4d3c, 0x4d3d, 0x4d3e, 0x4d3f, 0x4d40, 0x4d41, 0x4d42, 0x4d43, 0x4d44, 0x4d45, 0x4d46, 0x4d47, /* 0x4d40 */ 0x4d48, 0x4d49, 0x4d4a, 0x4d4b, 0x4d4c, 0x4d4d, 0x4d4e, 0x4d4f, 0x4d50, 0x4d51, 0x4d52, 0x4d53, 0x4d54, 0x4d55, 0x4d56, 0x4d57, 0x4d58, 0x4d59, 0x4d5a, 0x4d5b, 0x4d5c, 0x4d5d, 0x4d5e, 0x4d5f, 0x4d60, 0x4d61, 0x4d62, 0x4d63, 0x4d64, 0x4d65, 0x4d66, 0x4d67, 0x4d68, 0x4d69, 0x4d6a, 0x4d6b, 0x4d6c, 0x4d6d, 0x4d6e, 0x4d6f, 0x4d70, 0x4d71, 0x4d72, 0x4d73, 0x4d74, 0x4d75, 0x4d76, 0x4d77, 0x4d78, 0x4d79, 0x4d7a, 0x4d7b, 0x4d7c, 0x4d7d, 0x4d7e, 0x4d7f, 0x4d80, 0x4d81, 0x4d82, 0x4d83, 0x4d84, 0x4d85, 0x4d86, 0x4d87, /* 0x4d80 */ 0x4d88, 0x4d89, 0x4d8a, 0x4d8b, 0x4d8c, 0x4d8d, 0x4d8e, 0x4d8f, 0x4d90, 0x4d91, 0x4d92, 0x4d93, 0x4d94, 0x4d95, 0x4d96, 0x4d97, 0x4d98, 0x4d99, 0x4d9a, 0x4d9b, 0x4d9c, 0x4d9d, 0x4d9e, 0x4d9f, 0x4da0, 0x4da1, 0x4da2, 0x4da3, 0x4da4, 0x4da5, 0x4da6, 0x4da7, 0x4da8, 0x4da9, 0x4daa, 0x4dab, 0x4dac, 0x4dad, 0x4dae, 0x4daf, 0x4db0, 0x4db1, 0x4db2, 0x4db3, 0x4db4, 0x4db5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4dc0, 0x4dc1, 0x4dc2, 0x4dc3, 0x4dc4, 0x4dc5, 0x4dc6, 0x4dc7, /* 0x4dc0 */ 0x4dc8, 0x4dc9, 0x4dca, 0x4dcb, 0x4dcc, 0x4dcd, 0x4dce, 0x4dcf, 0x4dd0, 0x4dd1, 0x4dd2, 0x4dd3, 0x4dd4, 0x4dd5, 0x4dd6, 0x4dd7, 0x4dd8, 0x4dd9, 0x4dda, 0x4ddb, 0x4ddc, 0x4ddd, 0x4dde, 0x4ddf, 0x4de0, 0x4de1, 0x4de2, 0x4de3, 0x4de4, 0x4de5, 0x4de6, 0x4de7, 0x4de8, 0x4de9, 0x4dea, 0x4deb, 0x4dec, 0x4ded, 0x4dee, 0x4def, 0x4df0, 0x4df1, 0x4df2, 0x4df3, 0x4df4, 0x4df5, 0x4df6, 0x4df7, 0x4df8, 0x4df9, 0x4dfa, 0x4dfb, 0x4dfc, 0x4dfd, 0x4dfe, 0x4dff, 0x4e00, 0x4e01, 0x4e02, 0x4e03, 0x4e04, 0x4e05, 0x4e06, 0x4e07, /* 0x4e00 */ 0x4e08, 0x4e09, 0x4e0a, 0x4e0b, 0x4e0c, 0x4e0d, 0x4e0e, 0x4e0f, 0x4e10, 0x4e11, 0x4e12, 0x4e13, 0x4e14, 0x4e15, 0x4e16, 0x4e17, 0x4e18, 0x4e19, 0x4e1a, 0x4e1b, 0x4e1c, 0x4e1d, 0x4e1e, 0x4e1f, 0x4e20, 0x4e21, 0x4e22, 0x4e23, 0x4e24, 0x4e25, 0x4e26, 0x4e27, 0x4e28, 0x4e29, 0x4e2a, 0x4e2b, 0x4e2c, 0x4e2d, 0x4e2e, 0x4e2f, 0x4e30, 0x4e31, 0x4e32, 0x4e33, 0x4e34, 0x4e35, 0x4e36, 0x4e37, 0x4e38, 0x4e39, 0x4e3a, 0x4e3b, 0x4e3c, 0x4e3d, 0x4e3e, 0x4e3f, 0x4e40, 0x4e41, 0x4e42, 0x4e43, 0x4e44, 0x4e45, 0x4e46, 0x4e47, /* 0x4e40 */ 0x4e48, 0x4e49, 0x4e4a, 0x4e4b, 0x4e4c, 0x4e4d, 0x4e4e, 0x4e4f, 0x4e50, 0x4e51, 0x4e52, 0x4e53, 0x4e54, 0x4e55, 0x4e56, 0x4e57, 0x4e58, 0x4e59, 0x4e5a, 0x4e5b, 0x4e5c, 0x4e5d, 0x4e5e, 0x4e5f, 0x4e60, 0x4e61, 0x4e62, 0x4e63, 0x4e64, 0x4e65, 0x4e66, 0x4e67, 0x4e68, 0x4e69, 0x4e6a, 0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e70, 0x4e71, 0x4e72, 0x4e73, 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7e, 0x4e7f, 0x4e80, 0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e86, 0x4e87, /* 0x4e80 */ 0x4e88, 0x4e89, 0x4e8a, 0x4e8b, 0x4e8c, 0x4e8d, 0x4e8e, 0x4e8f, 0x4e90, 0x4e91, 0x4e92, 0x4e93, 0x4e94, 0x4e95, 0x4e96, 0x4e97, 0x4e98, 0x4e99, 0x4e9a, 0x4e9b, 0x4e9c, 0x4e9d, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea1, 0x4ea2, 0x4ea3, 0x4ea4, 0x4ea5, 0x4ea6, 0x4ea7, 0x4ea8, 0x4ea9, 0x4eaa, 0x4eab, 0x4eac, 0x4ead, 0x4eae, 0x4eaf, 0x4eb0, 0x4eb1, 0x4eb2, 0x4eb3, 0x4eb4, 0x4eb5, 0x4eb6, 0x4eb7, 0x4eb8, 0x4eb9, 0x4eba, 0x4ebb, 0x4ebc, 0x4ebd, 0x4ebe, 0x4ebf, 0x4ec0, 0x4ec1, 0x4ec2, 0x4ec3, 0x4ec4, 0x4ec5, 0x4ec6, 0x4ec7, /* 0x4ec0 */ 0x4ec8, 0x4ec9, 0x4eca, 0x4ecb, 0x4ecc, 0x4ecd, 0x4ece, 0x4ecf, 0x4ed0, 0x4ed1, 0x4ed2, 0x4ed3, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ed8, 0x4ed9, 0x4eda, 0x4edb, 0x4edc, 0x4edd, 0x4ede, 0x4edf, 0x4ee0, 0x4ee1, 0x4ee2, 0x4ee3, 0x4ee4, 0x4ee5, 0x4ee6, 0x4ee7, 0x4ee8, 0x4ee9, 0x4eea, 0x4eeb, 0x4eec, 0x4eed, 0x4eee, 0x4eef, 0x4ef0, 0x4ef1, 0x4ef2, 0x4ef3, 0x4ef4, 0x4ef5, 0x4ef6, 0x4ef7, 0x4ef8, 0x4ef9, 0x4efa, 0x4efb, 0x4efc, 0x4efd, 0x4efe, 0x4eff, 0x4f00, 0x4f01, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06, 0x4f07, /* 0x4f00 */ 0x4f08, 0x4f09, 0x4f0a, 0x4f0b, 0x4f0c, 0x4f0d, 0x4f0e, 0x4f0f, 0x4f10, 0x4f11, 0x4f12, 0x4f13, 0x4f14, 0x4f15, 0x4f16, 0x4f17, 0x4f18, 0x4f19, 0x4f1a, 0x4f1b, 0x4f1c, 0x4f1d, 0x4f1e, 0x4f1f, 0x4f20, 0x4f21, 0x4f22, 0x4f23, 0x4f24, 0x4f25, 0x4f26, 0x4f27, 0x4f28, 0x4f29, 0x4f2a, 0x4f2b, 0x4f2c, 0x4f2d, 0x4f2e, 0x4f2f, 0x4f30, 0x4f31, 0x4f32, 0x4f33, 0x4f34, 0x4f35, 0x4f36, 0x4f37, 0x4f38, 0x4f39, 0x4f3a, 0x4f3b, 0x4f3c, 0x4f3d, 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f43, 0x4f44, 0x4f45, 0x4f46, 0x4f47, /* 0x4f40 */ 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f4d, 0x4f4e, 0x4f4f, 0x4f50, 0x4f51, 0x4f52, 0x4f53, 0x4f54, 0x4f55, 0x4f56, 0x4f57, 0x4f58, 0x4f59, 0x4f5a, 0x4f5b, 0x4f5c, 0x4f5d, 0x4f5e, 0x4f5f, 0x4f60, 0x4f61, 0x4f62, 0x4f63, 0x4f64, 0x4f65, 0x4f66, 0x4f67, 0x4f68, 0x4f69, 0x4f6a, 0x4f6b, 0x4f6c, 0x4f6d, 0x4f6e, 0x4f6f, 0x4f70, 0x4f71, 0x4f72, 0x4f73, 0x4f74, 0x4f75, 0x4f76, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7b, 0x4f7c, 0x4f7d, 0x4f7e, 0x4f7f, 0x4f80, 0x4f81, 0x4f82, 0x4f83, 0x4f84, 0x4f85, 0x4f86, 0x4f87, /* 0x4f80 */ 0x4f88, 0x4f89, 0x4f8a, 0x4f8b, 0x4f8c, 0x4f8d, 0x4f8e, 0x4f8f, 0x4f90, 0x4f91, 0x4f92, 0x4f93, 0x4f94, 0x4f95, 0x4f96, 0x4f97, 0x4f98, 0x4f99, 0x4f9a, 0x4f9b, 0x4f9c, 0x4f9d, 0x4f9e, 0x4f9f, 0x4fa0, 0x4fa1, 0x4fa2, 0x4fa3, 0x4fa4, 0x4fa5, 0x4fa6, 0x4fa7, 0x4fa8, 0x4fa9, 0x4faa, 0x4fab, 0x4fac, 0x4fad, 0x4fae, 0x4faf, 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4, 0x4fb5, 0x4fb6, 0x4fb7, 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fbf, 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc3, 0x4fc4, 0x4fc5, 0x4fc6, 0x4fc7, /* 0x4fc0 */ 0x4fc8, 0x4fc9, 0x4fca, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fce, 0x4fcf, 0x4fd0, 0x4fd1, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6, 0x4fd7, 0x4fd8, 0x4fd9, 0x4fda, 0x4fdb, 0x4fdc, 0x4fdd, 0x4fde, 0x4fdf, 0x4fe0, 0x4fe1, 0x4fe2, 0x4fe3, 0x4fe4, 0x4fe5, 0x4fe6, 0x4fe7, 0x4fe8, 0x4fe9, 0x4fea, 0x4feb, 0x4fec, 0x4fed, 0x4fee, 0x4fef, 0x4ff0, 0x4ff1, 0x4ff2, 0x4ff3, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, 0x4ff8, 0x4ff9, 0x4ffa, 0x4ffb, 0x4ffc, 0x4ffd, 0x4ffe, 0x4fff, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, /* 0x5000 */ 0x5008, 0x5009, 0x500a, 0x500b, 0x500c, 0x500d, 0x500e, 0x500f, 0x5010, 0x5011, 0x5012, 0x5013, 0x5014, 0x5015, 0x5016, 0x5017, 0x5018, 0x5019, 0x501a, 0x501b, 0x501c, 0x501d, 0x501e, 0x501f, 0x5020, 0x5021, 0x5022, 0x5023, 0x5024, 0x5025, 0x5026, 0x5027, 0x5028, 0x5029, 0x502a, 0x502b, 0x502c, 0x502d, 0x502e, 0x502f, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503a, 0x503b, 0x503c, 0x503d, 0x503e, 0x503f, 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045, 0x5046, 0x5047, /* 0x5040 */ 0x5048, 0x5049, 0x504a, 0x504b, 0x504c, 0x504d, 0x504e, 0x504f, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055, 0x5056, 0x5057, 0x5058, 0x5059, 0x505a, 0x505b, 0x505c, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5065, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b, 0x506c, 0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5076, 0x5077, 0x5078, 0x5079, 0x507a, 0x507b, 0x507c, 0x507d, 0x507e, 0x507f, 0x5080, 0x5081, 0x5082, 0x5083, 0x5084, 0x5085, 0x5086, 0x5087, /* 0x5080 */ 0x5088, 0x5089, 0x508a, 0x508b, 0x508c, 0x508d, 0x508e, 0x508f, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d, 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50a3, 0x50a4, 0x50a5, 0x50a6, 0x50a7, 0x50a8, 0x50a9, 0x50aa, 0x50ab, 0x50ac, 0x50ad, 0x50ae, 0x50af, 0x50b0, 0x50b1, 0x50b2, 0x50b3, 0x50b4, 0x50b5, 0x50b6, 0x50b7, 0x50b8, 0x50b9, 0x50ba, 0x50bb, 0x50bc, 0x50bd, 0x50be, 0x50bf, 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4, 0x50c5, 0x50c6, 0x50c7, /* 0x50c0 */ 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc, 0x50cd, 0x50ce, 0x50cf, 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5, 0x50d6, 0x50d7, 0x50d8, 0x50d9, 0x50da, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df, 0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e6, 0x50e7, 0x50e8, 0x50e9, 0x50ea, 0x50eb, 0x50ec, 0x50ed, 0x50ee, 0x50ef, 0x50f0, 0x50f1, 0x50f2, 0x50f3, 0x50f4, 0x50f5, 0x50f6, 0x50f7, 0x50f8, 0x50f9, 0x50fa, 0x50fb, 0x50fc, 0x50fd, 0x50fe, 0x50ff, 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5106, 0x5107, /* 0x5100 */ 0x5108, 0x5109, 0x510a, 0x510b, 0x510c, 0x510d, 0x510e, 0x510f, 0x5110, 0x5111, 0x5112, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511a, 0x511b, 0x511c, 0x511d, 0x511e, 0x511f, 0x5120, 0x5121, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x513f, 0x5140, 0x5141, 0x5142, 0x5143, 0x5144, 0x5145, 0x5146, 0x5147, /* 0x5140 */ 0x5148, 0x5149, 0x514a, 0x514b, 0x514c, 0x514d, 0x514e, 0x514f, 0x5150, 0x5151, 0x5152, 0x5153, 0x5154, 0x5155, 0x5156, 0x5157, 0x5158, 0x5159, 0x515a, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, 0x5160, 0x5161, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, 0x5167, 0x5168, 0x5169, 0x516a, 0x516b, 0x516c, 0x516d, 0x516e, 0x516f, 0x5170, 0x5171, 0x5172, 0x5173, 0x5174, 0x5175, 0x5176, 0x5177, 0x5178, 0x5179, 0x517a, 0x517b, 0x517c, 0x517d, 0x517e, 0x517f, 0x5180, 0x5181, 0x5182, 0x5183, 0x5184, 0x5185, 0x5186, 0x5187, /* 0x5180 */ 0x5188, 0x5189, 0x518a, 0x518b, 0x518c, 0x518d, 0x518e, 0x518f, 0x5190, 0x5191, 0x5192, 0x5193, 0x5194, 0x5195, 0x5196, 0x5197, 0x5198, 0x5199, 0x519a, 0x519b, 0x519c, 0x519d, 0x519e, 0x519f, 0x51a0, 0x51a1, 0x51a2, 0x51a3, 0x51a4, 0x51a5, 0x51a6, 0x51a7, 0x51a8, 0x51a9, 0x51aa, 0x51ab, 0x51ac, 0x51ad, 0x51ae, 0x51af, 0x51b0, 0x51b1, 0x51b2, 0x51b3, 0x51b4, 0x51b5, 0x51b6, 0x51b7, 0x51b8, 0x51b9, 0x51ba, 0x51bb, 0x51bc, 0x51bd, 0x51be, 0x51bf, 0x51c0, 0x51c1, 0x51c2, 0x51c3, 0x51c4, 0x51c5, 0x51c6, 0x51c7, /* 0x51c0 */ 0x51c8, 0x51c9, 0x51ca, 0x51cb, 0x51cc, 0x51cd, 0x51ce, 0x51cf, 0x51d0, 0x51d1, 0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7, 0x51d8, 0x51d9, 0x51da, 0x51db, 0x51dc, 0x51dd, 0x51de, 0x51df, 0x51e0, 0x51e1, 0x51e2, 0x51e3, 0x51e4, 0x51e5, 0x51e6, 0x51e7, 0x51e8, 0x51e9, 0x51ea, 0x51eb, 0x51ec, 0x51ed, 0x51ee, 0x51ef, 0x51f0, 0x51f1, 0x51f2, 0x51f3, 0x51f4, 0x51f5, 0x51f6, 0x51f7, 0x51f8, 0x51f9, 0x51fa, 0x51fb, 0x51fc, 0x51fd, 0x51fe, 0x51ff, 0x5200, 0x5201, 0x5202, 0x5203, 0x5204, 0x5205, 0x5206, 0x5207, /* 0x5200 */ 0x5208, 0x5209, 0x520a, 0x520b, 0x520c, 0x520d, 0x520e, 0x520f, 0x5210, 0x5211, 0x5212, 0x5213, 0x5214, 0x5215, 0x5216, 0x5217, 0x5218, 0x5219, 0x521a, 0x521b, 0x521c, 0x521d, 0x521e, 0x521f, 0x5220, 0x5221, 0x5222, 0x5223, 0x5224, 0x5225, 0x5226, 0x5227, 0x5228, 0x5229, 0x522a, 0x522b, 0x522c, 0x522d, 0x522e, 0x522f, 0x5230, 0x5231, 0x5232, 0x5233, 0x5234, 0x5235, 0x5236, 0x5237, 0x5238, 0x5239, 0x523a, 0x523b, 0x523c, 0x523d, 0x523e, 0x523f, 0x5240, 0x5241, 0x5242, 0x5243, 0x5244, 0x5245, 0x5246, 0x5247, /* 0x5240 */ 0x5248, 0x5249, 0x524a, 0x524b, 0x524c, 0x524d, 0x524e, 0x524f, 0x5250, 0x5251, 0x5252, 0x5253, 0x5254, 0x5255, 0x5256, 0x5257, 0x5258, 0x5259, 0x525a, 0x525b, 0x525c, 0x525d, 0x525e, 0x525f, 0x5260, 0x5261, 0x5262, 0x5263, 0x5264, 0x5265, 0x5266, 0x5267, 0x5268, 0x5269, 0x526a, 0x526b, 0x526c, 0x526d, 0x526e, 0x526f, 0x5270, 0x5271, 0x5272, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527a, 0x527b, 0x527c, 0x527d, 0x527e, 0x527f, 0x5280, 0x5281, 0x5282, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, /* 0x5280 */ 0x5288, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f, 0x5290, 0x5291, 0x5292, 0x5293, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529a, 0x529b, 0x529c, 0x529d, 0x529e, 0x529f, 0x52a0, 0x52a1, 0x52a2, 0x52a3, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52a8, 0x52a9, 0x52aa, 0x52ab, 0x52ac, 0x52ad, 0x52ae, 0x52af, 0x52b0, 0x52b1, 0x52b2, 0x52b3, 0x52b4, 0x52b5, 0x52b6, 0x52b7, 0x52b8, 0x52b9, 0x52ba, 0x52bb, 0x52bc, 0x52bd, 0x52be, 0x52bf, 0x52c0, 0x52c1, 0x52c2, 0x52c3, 0x52c4, 0x52c5, 0x52c6, 0x52c7, /* 0x52c0 */ 0x52c8, 0x52c9, 0x52ca, 0x52cb, 0x52cc, 0x52cd, 0x52ce, 0x52cf, 0x52d0, 0x52d1, 0x52d2, 0x52d3, 0x52d4, 0x52d5, 0x52d6, 0x52d7, 0x52d8, 0x52d9, 0x52da, 0x52db, 0x52dc, 0x52dd, 0x52de, 0x52df, 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e4, 0x52e5, 0x52e6, 0x52e7, 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee, 0x52ef, 0x52f0, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7, 0x52f8, 0x52f9, 0x52fa, 0x52fb, 0x52fc, 0x52fd, 0x52fe, 0x52ff, 0x5300, 0x5301, 0x5302, 0x5303, 0x5304, 0x5305, 0x5306, 0x5307, /* 0x5300 */ 0x5308, 0x5309, 0x530a, 0x530b, 0x530c, 0x530d, 0x530e, 0x530f, 0x5310, 0x5311, 0x5312, 0x5313, 0x5314, 0x5315, 0x5316, 0x5317, 0x5318, 0x5319, 0x531a, 0x531b, 0x531c, 0x531d, 0x531e, 0x531f, 0x5320, 0x5321, 0x5322, 0x5323, 0x5324, 0x5325, 0x5326, 0x5327, 0x5328, 0x5329, 0x532a, 0x532b, 0x532c, 0x532d, 0x532e, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x5339, 0x533a, 0x533b, 0x533c, 0x533d, 0x533e, 0x533f, 0x5340, 0x5341, 0x5342, 0x5343, 0x5344, 0x5345, 0x5346, 0x5347, /* 0x5340 */ 0x5348, 0x5349, 0x534a, 0x534b, 0x534c, 0x534d, 0x534e, 0x534f, 0x5350, 0x5351, 0x5352, 0x5353, 0x5354, 0x5355, 0x5356, 0x5357, 0x5358, 0x5359, 0x535a, 0x535b, 0x535c, 0x535d, 0x535e, 0x535f, 0x5360, 0x5361, 0x5362, 0x5363, 0x5364, 0x5365, 0x5366, 0x5367, 0x5368, 0x5369, 0x536a, 0x536b, 0x536c, 0x536d, 0x536e, 0x536f, 0x5370, 0x5371, 0x5372, 0x5373, 0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5379, 0x537a, 0x537b, 0x537c, 0x537d, 0x537e, 0x537f, 0x5380, 0x5381, 0x5382, 0x5383, 0x5384, 0x5385, 0x5386, 0x5387, /* 0x5380 */ 0x5388, 0x5389, 0x538a, 0x538b, 0x538c, 0x538d, 0x538e, 0x538f, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5395, 0x5396, 0x5397, 0x5398, 0x5399, 0x539a, 0x539b, 0x539c, 0x539d, 0x539e, 0x539f, 0x53a0, 0x53a1, 0x53a2, 0x53a3, 0x53a4, 0x53a5, 0x53a6, 0x53a7, 0x53a8, 0x53a9, 0x53aa, 0x53ab, 0x53ac, 0x53ad, 0x53ae, 0x53af, 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4, 0x53b5, 0x53b6, 0x53b7, 0x53b8, 0x53b9, 0x53ba, 0x53bb, 0x53bc, 0x53bd, 0x53be, 0x53bf, 0x53c0, 0x53c1, 0x53c2, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, /* 0x53c0 */ 0x53c8, 0x53c9, 0x53ca, 0x53cb, 0x53cc, 0x53cd, 0x53ce, 0x53cf, 0x53d0, 0x53d1, 0x53d2, 0x53d3, 0x53d4, 0x53d5, 0x53d6, 0x53d7, 0x53d8, 0x53d9, 0x53da, 0x53db, 0x53dc, 0x53dd, 0x53de, 0x53df, 0x53e0, 0x53e1, 0x53e2, 0x53e3, 0x53e4, 0x53e5, 0x53e6, 0x53e7, 0x53e8, 0x53e9, 0x53ea, 0x53eb, 0x53ec, 0x53ed, 0x53ee, 0x53ef, 0x53f0, 0x53f1, 0x53f2, 0x53f3, 0x53f4, 0x53f5, 0x53f6, 0x53f7, 0x53f8, 0x53f9, 0x53fa, 0x53fb, 0x53fc, 0x53fd, 0x53fe, 0x53ff, 0x5400, 0x5401, 0x5402, 0x5403, 0x5404, 0x5405, 0x5406, 0x5407, /* 0x5400 */ 0x5408, 0x5409, 0x540a, 0x540b, 0x540c, 0x540d, 0x540e, 0x540f, 0x5410, 0x5411, 0x5412, 0x5413, 0x5414, 0x5415, 0x5416, 0x5417, 0x5418, 0x5419, 0x541a, 0x541b, 0x541c, 0x541d, 0x541e, 0x541f, 0x5420, 0x5421, 0x5422, 0x5423, 0x5424, 0x5425, 0x5426, 0x5427, 0x5428, 0x5429, 0x542a, 0x542b, 0x542c, 0x542d, 0x542e, 0x542f, 0x5430, 0x5431, 0x5432, 0x5433, 0x5434, 0x5435, 0x5436, 0x5437, 0x5438, 0x5439, 0x543a, 0x543b, 0x543c, 0x543d, 0x543e, 0x543f, 0x5440, 0x5441, 0x5442, 0x5443, 0x5444, 0x5445, 0x5446, 0x5447, /* 0x5440 */ 0x5448, 0x5449, 0x544a, 0x544b, 0x544c, 0x544d, 0x544e, 0x544f, 0x5450, 0x5451, 0x5452, 0x5453, 0x5454, 0x5455, 0x5456, 0x5457, 0x5458, 0x5459, 0x545a, 0x545b, 0x545c, 0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5462, 0x5463, 0x5464, 0x5465, 0x5466, 0x5467, 0x5468, 0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, 0x5470, 0x5471, 0x5472, 0x5473, 0x5474, 0x5475, 0x5476, 0x5477, 0x5478, 0x5479, 0x547a, 0x547b, 0x547c, 0x547d, 0x547e, 0x547f, 0x5480, 0x5481, 0x5482, 0x5483, 0x5484, 0x5485, 0x5486, 0x5487, /* 0x5480 */ 0x5488, 0x5489, 0x548a, 0x548b, 0x548c, 0x548d, 0x548e, 0x548f, 0x5490, 0x5491, 0x5492, 0x5493, 0x5494, 0x5495, 0x5496, 0x5497, 0x5498, 0x5499, 0x549a, 0x549b, 0x549c, 0x549d, 0x549e, 0x549f, 0x54a0, 0x54a1, 0x54a2, 0x54a3, 0x54a4, 0x54a5, 0x54a6, 0x54a7, 0x54a8, 0x54a9, 0x54aa, 0x54ab, 0x54ac, 0x54ad, 0x54ae, 0x54af, 0x54b0, 0x54b1, 0x54b2, 0x54b3, 0x54b4, 0x54b5, 0x54b6, 0x54b7, 0x54b8, 0x54b9, 0x54ba, 0x54bb, 0x54bc, 0x54bd, 0x54be, 0x54bf, 0x54c0, 0x54c1, 0x54c2, 0x54c3, 0x54c4, 0x54c5, 0x54c6, 0x54c7, /* 0x54c0 */ 0x54c8, 0x54c9, 0x54ca, 0x54cb, 0x54cc, 0x54cd, 0x54ce, 0x54cf, 0x54d0, 0x54d1, 0x54d2, 0x54d3, 0x54d4, 0x54d5, 0x54d6, 0x54d7, 0x54d8, 0x54d9, 0x54da, 0x54db, 0x54dc, 0x54dd, 0x54de, 0x54df, 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4, 0x54e5, 0x54e6, 0x54e7, 0x54e8, 0x54e9, 0x54ea, 0x54eb, 0x54ec, 0x54ed, 0x54ee, 0x54ef, 0x54f0, 0x54f1, 0x54f2, 0x54f3, 0x54f4, 0x54f5, 0x54f6, 0x54f7, 0x54f8, 0x54f9, 0x54fa, 0x54fb, 0x54fc, 0x54fd, 0x54fe, 0x54ff, 0x5500, 0x5501, 0x5502, 0x5503, 0x5504, 0x5505, 0x5506, 0x5507, /* 0x5500 */ 0x5508, 0x5509, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e, 0x550f, 0x5510, 0x5511, 0x5512, 0x5513, 0x5514, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551a, 0x551b, 0x551c, 0x551d, 0x551e, 0x551f, 0x5520, 0x5521, 0x5522, 0x5523, 0x5524, 0x5525, 0x5526, 0x5527, 0x5528, 0x5529, 0x552a, 0x552b, 0x552c, 0x552d, 0x552e, 0x552f, 0x5530, 0x5531, 0x5532, 0x5533, 0x5534, 0x5535, 0x5536, 0x5537, 0x5538, 0x5539, 0x553a, 0x553b, 0x553c, 0x553d, 0x553e, 0x553f, 0x5540, 0x5541, 0x5542, 0x5543, 0x5544, 0x5545, 0x5546, 0x5547, /* 0x5540 */ 0x5548, 0x5549, 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5550, 0x5551, 0x5552, 0x5553, 0x5554, 0x5555, 0x5556, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555c, 0x555d, 0x555e, 0x555f, 0x5560, 0x5561, 0x5562, 0x5563, 0x5564, 0x5565, 0x5566, 0x5567, 0x5568, 0x5569, 0x556a, 0x556b, 0x556c, 0x556d, 0x556e, 0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5575, 0x5576, 0x5577, 0x5578, 0x5579, 0x557a, 0x557b, 0x557c, 0x557d, 0x557e, 0x557f, 0x5580, 0x5581, 0x5582, 0x5583, 0x5584, 0x5585, 0x5586, 0x5587, /* 0x5580 */ 0x5588, 0x5589, 0x558a, 0x558b, 0x558c, 0x558d, 0x558e, 0x558f, 0x5590, 0x5591, 0x5592, 0x5593, 0x5594, 0x5595, 0x5596, 0x5597, 0x5598, 0x5599, 0x559a, 0x559b, 0x559c, 0x559d, 0x559e, 0x559f, 0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a7, 0x55a8, 0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, 0x55b0, 0x55b1, 0x55b2, 0x55b3, 0x55b4, 0x55b5, 0x55b6, 0x55b7, 0x55b8, 0x55b9, 0x55ba, 0x55bb, 0x55bc, 0x55bd, 0x55be, 0x55bf, 0x55c0, 0x55c1, 0x55c2, 0x55c3, 0x55c4, 0x55c5, 0x55c6, 0x55c7, /* 0x55c0 */ 0x55c8, 0x55c9, 0x55ca, 0x55cb, 0x55cc, 0x55cd, 0x55ce, 0x55cf, 0x55d0, 0x55d1, 0x55d2, 0x55d3, 0x55d4, 0x55d5, 0x55d6, 0x55d7, 0x55d8, 0x55d9, 0x55da, 0x55db, 0x55dc, 0x55dd, 0x55de, 0x55df, 0x55e0, 0x55e1, 0x55e2, 0x55e3, 0x55e4, 0x55e5, 0x55e6, 0x55e7, 0x55e8, 0x55e9, 0x55ea, 0x55eb, 0x55ec, 0x55ed, 0x55ee, 0x55ef, 0x55f0, 0x55f1, 0x55f2, 0x55f3, 0x55f4, 0x55f5, 0x55f6, 0x55f7, 0x55f8, 0x55f9, 0x55fa, 0x55fb, 0x55fc, 0x55fd, 0x55fe, 0x55ff, 0x5600, 0x5601, 0x5602, 0x5603, 0x5604, 0x5605, 0x5606, 0x5607, /* 0x5600 */ 0x5608, 0x5609, 0x560a, 0x560b, 0x560c, 0x560d, 0x560e, 0x560f, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5618, 0x5619, 0x561a, 0x561b, 0x561c, 0x561d, 0x561e, 0x561f, 0x5620, 0x5621, 0x5622, 0x5623, 0x5624, 0x5625, 0x5626, 0x5627, 0x5628, 0x5629, 0x562a, 0x562b, 0x562c, 0x562d, 0x562e, 0x562f, 0x5630, 0x5631, 0x5632, 0x5633, 0x5634, 0x5635, 0x5636, 0x5637, 0x5638, 0x5639, 0x563a, 0x563b, 0x563c, 0x563d, 0x563e, 0x563f, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, /* 0x5640 */ 0x5648, 0x5649, 0x564a, 0x564b, 0x564c, 0x564d, 0x564e, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5654, 0x5655, 0x5656, 0x5657, 0x5658, 0x5659, 0x565a, 0x565b, 0x565c, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5662, 0x5663, 0x5664, 0x5665, 0x5666, 0x5667, 0x5668, 0x5669, 0x566a, 0x566b, 0x566c, 0x566d, 0x566e, 0x566f, 0x5670, 0x5671, 0x5672, 0x5673, 0x5674, 0x5675, 0x5676, 0x5677, 0x5678, 0x5679, 0x567a, 0x567b, 0x567c, 0x567d, 0x567e, 0x567f, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5685, 0x5686, 0x5687, /* 0x5680 */ 0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x568e, 0x568f, 0x5690, 0x5691, 0x5692, 0x5693, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569a, 0x569b, 0x569c, 0x569d, 0x569e, 0x569f, 0x56a0, 0x56a1, 0x56a2, 0x56a3, 0x56a4, 0x56a5, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56aa, 0x56ab, 0x56ac, 0x56ad, 0x56ae, 0x56af, 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4, 0x56b5, 0x56b6, 0x56b7, 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bc, 0x56bd, 0x56be, 0x56bf, 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6, 0x56c7, /* 0x56c0 */ 0x56c8, 0x56c9, 0x56ca, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf, 0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d4, 0x56d5, 0x56d6, 0x56d7, 0x56d8, 0x56d9, 0x56da, 0x56db, 0x56dc, 0x56dd, 0x56de, 0x56df, 0x56e0, 0x56e1, 0x56e2, 0x56e3, 0x56e4, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56e9, 0x56ea, 0x56eb, 0x56ec, 0x56ed, 0x56ee, 0x56ef, 0x56f0, 0x56f1, 0x56f2, 0x56f3, 0x56f4, 0x56f5, 0x56f6, 0x56f7, 0x56f8, 0x56f9, 0x56fa, 0x56fb, 0x56fc, 0x56fd, 0x56fe, 0x56ff, 0x5700, 0x5701, 0x5702, 0x5703, 0x5704, 0x5705, 0x5706, 0x5707, /* 0x5700 */ 0x5708, 0x5709, 0x570a, 0x570b, 0x570c, 0x570d, 0x570e, 0x570f, 0x5710, 0x5711, 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, 0x571a, 0x571b, 0x571c, 0x571d, 0x571e, 0x571f, 0x5720, 0x5721, 0x5722, 0x5723, 0x5724, 0x5725, 0x5726, 0x5727, 0x5728, 0x5729, 0x572a, 0x572b, 0x572c, 0x572d, 0x572e, 0x572f, 0x5730, 0x5731, 0x5732, 0x5733, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x5739, 0x573a, 0x573b, 0x573c, 0x573d, 0x573e, 0x573f, 0x5740, 0x5741, 0x5742, 0x5743, 0x5744, 0x5745, 0x5746, 0x5747, /* 0x5740 */ 0x5748, 0x5749, 0x574a, 0x574b, 0x574c, 0x574d, 0x574e, 0x574f, 0x5750, 0x5751, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5757, 0x5758, 0x5759, 0x575a, 0x575b, 0x575c, 0x575d, 0x575e, 0x575f, 0x5760, 0x5761, 0x5762, 0x5763, 0x5764, 0x5765, 0x5766, 0x5767, 0x5768, 0x5769, 0x576a, 0x576b, 0x576c, 0x576d, 0x576e, 0x576f, 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775, 0x5776, 0x5777, 0x5778, 0x5779, 0x577a, 0x577b, 0x577c, 0x577d, 0x577e, 0x577f, 0x5780, 0x5781, 0x5782, 0x5783, 0x5784, 0x5785, 0x5786, 0x5787, /* 0x5780 */ 0x5788, 0x5789, 0x578a, 0x578b, 0x578c, 0x578d, 0x578e, 0x578f, 0x5790, 0x5791, 0x5792, 0x5793, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579a, 0x579b, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a0, 0x57a1, 0x57a2, 0x57a3, 0x57a4, 0x57a5, 0x57a6, 0x57a7, 0x57a8, 0x57a9, 0x57aa, 0x57ab, 0x57ac, 0x57ad, 0x57ae, 0x57af, 0x57b0, 0x57b1, 0x57b2, 0x57b3, 0x57b4, 0x57b5, 0x57b6, 0x57b7, 0x57b8, 0x57b9, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, 0x57c0, 0x57c1, 0x57c2, 0x57c3, 0x57c4, 0x57c5, 0x57c6, 0x57c7, /* 0x57c0 */ 0x57c8, 0x57c9, 0x57ca, 0x57cb, 0x57cc, 0x57cd, 0x57ce, 0x57cf, 0x57d0, 0x57d1, 0x57d2, 0x57d3, 0x57d4, 0x57d5, 0x57d6, 0x57d7, 0x57d8, 0x57d9, 0x57da, 0x57db, 0x57dc, 0x57dd, 0x57de, 0x57df, 0x57e0, 0x57e1, 0x57e2, 0x57e3, 0x57e4, 0x57e5, 0x57e6, 0x57e7, 0x57e8, 0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ed, 0x57ee, 0x57ef, 0x57f0, 0x57f1, 0x57f2, 0x57f3, 0x57f4, 0x57f5, 0x57f6, 0x57f7, 0x57f8, 0x57f9, 0x57fa, 0x57fb, 0x57fc, 0x57fd, 0x57fe, 0x57ff, 0x5800, 0x5801, 0x5802, 0x5803, 0x5804, 0x5805, 0x5806, 0x5807, /* 0x5800 */ 0x5808, 0x5809, 0x580a, 0x580b, 0x580c, 0x580d, 0x580e, 0x580f, 0x5810, 0x5811, 0x5812, 0x5813, 0x5814, 0x5815, 0x5816, 0x5817, 0x5818, 0x5819, 0x581a, 0x581b, 0x581c, 0x581d, 0x581e, 0x581f, 0x5820, 0x5821, 0x5822, 0x5823, 0x5824, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582a, 0x582b, 0x582c, 0x582d, 0x582e, 0x582f, 0x5830, 0x5831, 0x5832, 0x5833, 0x5834, 0x5835, 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, 0x583e, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845, 0x5846, 0x5847, /* 0x5840 */ 0x5848, 0x5849, 0x584a, 0x584b, 0x584c, 0x584d, 0x584e, 0x584f, 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855, 0x5856, 0x5857, 0x5858, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585e, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5865, 0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586b, 0x586c, 0x586d, 0x586e, 0x586f, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587e, 0x587f, 0x5880, 0x5881, 0x5882, 0x5883, 0x5884, 0x5885, 0x5886, 0x5887, /* 0x5880 */ 0x5888, 0x5889, 0x588a, 0x588b, 0x588c, 0x588d, 0x588e, 0x588f, 0x5890, 0x5891, 0x5892, 0x5893, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x5899, 0x589a, 0x589b, 0x589c, 0x589d, 0x589e, 0x589f, 0x58a0, 0x58a1, 0x58a2, 0x58a3, 0x58a4, 0x58a5, 0x58a6, 0x58a7, 0x58a8, 0x58a9, 0x58aa, 0x58ab, 0x58ac, 0x58ad, 0x58ae, 0x58af, 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5, 0x58b6, 0x58b7, 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bc, 0x58bd, 0x58be, 0x58bf, 0x58c0, 0x58c1, 0x58c2, 0x58c3, 0x58c4, 0x58c5, 0x58c6, 0x58c7, /* 0x58c0 */ 0x58c8, 0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, 0x58d0, 0x58d1, 0x58d2, 0x58d3, 0x58d4, 0x58d5, 0x58d6, 0x58d7, 0x58d8, 0x58d9, 0x58da, 0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, 0x58e0, 0x58e1, 0x58e2, 0x58e3, 0x58e4, 0x58e5, 0x58e6, 0x58e7, 0x58e8, 0x58e9, 0x58ea, 0x58eb, 0x58ec, 0x58ed, 0x58ee, 0x58ef, 0x58f0, 0x58f1, 0x58f2, 0x58f3, 0x58f4, 0x58f5, 0x58f6, 0x58f7, 0x58f8, 0x58f9, 0x58fa, 0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, 0x5900, 0x5901, 0x5902, 0x5903, 0x5904, 0x5905, 0x5906, 0x5907, /* 0x5900 */ 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590d, 0x590e, 0x590f, 0x5910, 0x5911, 0x5912, 0x5913, 0x5914, 0x5915, 0x5916, 0x5917, 0x5918, 0x5919, 0x591a, 0x591b, 0x591c, 0x591d, 0x591e, 0x591f, 0x5920, 0x5921, 0x5922, 0x5923, 0x5924, 0x5925, 0x5926, 0x5927, 0x5928, 0x5929, 0x592a, 0x592b, 0x592c, 0x592d, 0x592e, 0x592f, 0x5930, 0x5931, 0x5932, 0x5933, 0x5934, 0x5935, 0x5936, 0x5937, 0x5938, 0x5939, 0x593a, 0x593b, 0x593c, 0x593d, 0x593e, 0x593f, 0x5940, 0x5941, 0x5942, 0x5943, 0x5944, 0x5945, 0x5946, 0x5947, /* 0x5940 */ 0x5948, 0x5949, 0x594a, 0x594b, 0x594c, 0x594d, 0x594e, 0x594f, 0x5950, 0x5951, 0x5952, 0x5953, 0x5954, 0x5955, 0x5956, 0x5957, 0x5958, 0x5959, 0x595a, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5960, 0x5961, 0x5962, 0x5963, 0x5964, 0x5965, 0x5966, 0x5967, 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, 0x5970, 0x5971, 0x5972, 0x5973, 0x5974, 0x5975, 0x5976, 0x5977, 0x5978, 0x5979, 0x597a, 0x597b, 0x597c, 0x597d, 0x597e, 0x597f, 0x5980, 0x5981, 0x5982, 0x5983, 0x5984, 0x5985, 0x5986, 0x5987, /* 0x5980 */ 0x5988, 0x5989, 0x598a, 0x598b, 0x598c, 0x598d, 0x598e, 0x598f, 0x5990, 0x5991, 0x5992, 0x5993, 0x5994, 0x5995, 0x5996, 0x5997, 0x5998, 0x5999, 0x599a, 0x599b, 0x599c, 0x599d, 0x599e, 0x599f, 0x59a0, 0x59a1, 0x59a2, 0x59a3, 0x59a4, 0x59a5, 0x59a6, 0x59a7, 0x59a8, 0x59a9, 0x59aa, 0x59ab, 0x59ac, 0x59ad, 0x59ae, 0x59af, 0x59b0, 0x59b1, 0x59b2, 0x59b3, 0x59b4, 0x59b5, 0x59b6, 0x59b7, 0x59b8, 0x59b9, 0x59ba, 0x59bb, 0x59bc, 0x59bd, 0x59be, 0x59bf, 0x59c0, 0x59c1, 0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c6, 0x59c7, /* 0x59c0 */ 0x59c8, 0x59c9, 0x59ca, 0x59cb, 0x59cc, 0x59cd, 0x59ce, 0x59cf, 0x59d0, 0x59d1, 0x59d2, 0x59d3, 0x59d4, 0x59d5, 0x59d6, 0x59d7, 0x59d8, 0x59d9, 0x59da, 0x59db, 0x59dc, 0x59dd, 0x59de, 0x59df, 0x59e0, 0x59e1, 0x59e2, 0x59e3, 0x59e4, 0x59e5, 0x59e6, 0x59e7, 0x59e8, 0x59e9, 0x59ea, 0x59eb, 0x59ec, 0x59ed, 0x59ee, 0x59ef, 0x59f0, 0x59f1, 0x59f2, 0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, 0x59f8, 0x59f9, 0x59fa, 0x59fb, 0x59fc, 0x59fd, 0x59fe, 0x59ff, 0x5a00, 0x5a01, 0x5a02, 0x5a03, 0x5a04, 0x5a05, 0x5a06, 0x5a07, /* 0x5a00 */ 0x5a08, 0x5a09, 0x5a0a, 0x5a0b, 0x5a0c, 0x5a0d, 0x5a0e, 0x5a0f, 0x5a10, 0x5a11, 0x5a12, 0x5a13, 0x5a14, 0x5a15, 0x5a16, 0x5a17, 0x5a18, 0x5a19, 0x5a1a, 0x5a1b, 0x5a1c, 0x5a1d, 0x5a1e, 0x5a1f, 0x5a20, 0x5a21, 0x5a22, 0x5a23, 0x5a24, 0x5a25, 0x5a26, 0x5a27, 0x5a28, 0x5a29, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a31, 0x5a32, 0x5a33, 0x5a34, 0x5a35, 0x5a36, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, 0x5a3c, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a40, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a46, 0x5a47, /* 0x5a40 */ 0x5a48, 0x5a49, 0x5a4a, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x5a56, 0x5a57, 0x5a58, 0x5a59, 0x5a5a, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, 0x5a61, 0x5a62, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a67, 0x5a68, 0x5a69, 0x5a6a, 0x5a6b, 0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73, 0x5a74, 0x5a75, 0x5a76, 0x5a77, 0x5a78, 0x5a79, 0x5a7a, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a7f, 0x5a80, 0x5a81, 0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, /* 0x5a80 */ 0x5a88, 0x5a89, 0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, 0x5a90, 0x5a91, 0x5a92, 0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, 0x5a98, 0x5a99, 0x5a9a, 0x5a9b, 0x5a9c, 0x5a9d, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4, 0x5aa5, 0x5aa6, 0x5aa7, 0x5aa8, 0x5aa9, 0x5aaa, 0x5aab, 0x5aac, 0x5aad, 0x5aae, 0x5aaf, 0x5ab0, 0x5ab1, 0x5ab2, 0x5ab3, 0x5ab4, 0x5ab5, 0x5ab6, 0x5ab7, 0x5ab8, 0x5ab9, 0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abe, 0x5abf, 0x5ac0, 0x5ac1, 0x5ac2, 0x5ac3, 0x5ac4, 0x5ac5, 0x5ac6, 0x5ac7, /* 0x5ac0 */ 0x5ac8, 0x5ac9, 0x5aca, 0x5acb, 0x5acc, 0x5acd, 0x5ace, 0x5acf, 0x5ad0, 0x5ad1, 0x5ad2, 0x5ad3, 0x5ad4, 0x5ad5, 0x5ad6, 0x5ad7, 0x5ad8, 0x5ad9, 0x5ada, 0x5adb, 0x5adc, 0x5add, 0x5ade, 0x5adf, 0x5ae0, 0x5ae1, 0x5ae2, 0x5ae3, 0x5ae4, 0x5ae5, 0x5ae6, 0x5ae7, 0x5ae8, 0x5ae9, 0x5aea, 0x5aeb, 0x5aec, 0x5aed, 0x5aee, 0x5aef, 0x5af0, 0x5af1, 0x5af2, 0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, 0x5af8, 0x5af9, 0x5afa, 0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, 0x5b00, 0x5b01, 0x5b02, 0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, /* 0x5b00 */ 0x5b08, 0x5b09, 0x5b0a, 0x5b0b, 0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, 0x5b10, 0x5b11, 0x5b12, 0x5b13, 0x5b14, 0x5b15, 0x5b16, 0x5b17, 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d, 0x5b1e, 0x5b1f, 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b32, 0x5b33, 0x5b34, 0x5b35, 0x5b36, 0x5b37, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b40, 0x5b41, 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, /* 0x5b40 */ 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, 0x5b50, 0x5b51, 0x5b52, 0x5b53, 0x5b54, 0x5b55, 0x5b56, 0x5b57, 0x5b58, 0x5b59, 0x5b5a, 0x5b5b, 0x5b5c, 0x5b5d, 0x5b5e, 0x5b5f, 0x5b60, 0x5b61, 0x5b62, 0x5b63, 0x5b64, 0x5b65, 0x5b66, 0x5b67, 0x5b68, 0x5b69, 0x5b6a, 0x5b6b, 0x5b6c, 0x5b6d, 0x5b6e, 0x5b6f, 0x5b70, 0x5b71, 0x5b72, 0x5b73, 0x5b74, 0x5b75, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7a, 0x5b7b, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, 0x5b80, 0x5b81, 0x5b82, 0x5b83, 0x5b84, 0x5b85, 0x5b86, 0x5b87, /* 0x5b80 */ 0x5b88, 0x5b89, 0x5b8a, 0x5b8b, 0x5b8c, 0x5b8d, 0x5b8e, 0x5b8f, 0x5b90, 0x5b91, 0x5b92, 0x5b93, 0x5b94, 0x5b95, 0x5b96, 0x5b97, 0x5b98, 0x5b99, 0x5b9a, 0x5b9b, 0x5b9c, 0x5b9d, 0x5b9e, 0x5b9f, 0x5ba0, 0x5ba1, 0x5ba2, 0x5ba3, 0x5ba4, 0x5ba5, 0x5ba6, 0x5ba7, 0x5ba8, 0x5ba9, 0x5baa, 0x5bab, 0x5bac, 0x5bad, 0x5bae, 0x5baf, 0x5bb0, 0x5bb1, 0x5bb2, 0x5bb3, 0x5bb4, 0x5bb5, 0x5bb6, 0x5bb7, 0x5bb8, 0x5bb9, 0x5bba, 0x5bbb, 0x5bbc, 0x5bbd, 0x5bbe, 0x5bbf, 0x5bc0, 0x5bc1, 0x5bc2, 0x5bc3, 0x5bc4, 0x5bc5, 0x5bc6, 0x5bc7, /* 0x5bc0 */ 0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcc, 0x5bcd, 0x5bce, 0x5bcf, 0x5bd0, 0x5bd1, 0x5bd2, 0x5bd3, 0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb, 0x5bdc, 0x5bdd, 0x5bde, 0x5bdf, 0x5be0, 0x5be1, 0x5be2, 0x5be3, 0x5be4, 0x5be5, 0x5be6, 0x5be7, 0x5be8, 0x5be9, 0x5bea, 0x5beb, 0x5bec, 0x5bed, 0x5bee, 0x5bef, 0x5bf0, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4, 0x5bf5, 0x5bf6, 0x5bf7, 0x5bf8, 0x5bf9, 0x5bfa, 0x5bfb, 0x5bfc, 0x5bfd, 0x5bfe, 0x5bff, 0x5c00, 0x5c01, 0x5c02, 0x5c03, 0x5c04, 0x5c05, 0x5c06, 0x5c07, /* 0x5c00 */ 0x5c08, 0x5c09, 0x5c0a, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c0f, 0x5c10, 0x5c11, 0x5c12, 0x5c13, 0x5c14, 0x5c15, 0x5c16, 0x5c17, 0x5c18, 0x5c19, 0x5c1a, 0x5c1b, 0x5c1c, 0x5c1d, 0x5c1e, 0x5c1f, 0x5c20, 0x5c21, 0x5c22, 0x5c23, 0x5c24, 0x5c25, 0x5c26, 0x5c27, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2c, 0x5c2d, 0x5c2e, 0x5c2f, 0x5c30, 0x5c31, 0x5c32, 0x5c33, 0x5c34, 0x5c35, 0x5c36, 0x5c37, 0x5c38, 0x5c39, 0x5c3a, 0x5c3b, 0x5c3c, 0x5c3d, 0x5c3e, 0x5c3f, 0x5c40, 0x5c41, 0x5c42, 0x5c43, 0x5c44, 0x5c45, 0x5c46, 0x5c47, /* 0x5c40 */ 0x5c48, 0x5c49, 0x5c4a, 0x5c4b, 0x5c4c, 0x5c4d, 0x5c4e, 0x5c4f, 0x5c50, 0x5c51, 0x5c52, 0x5c53, 0x5c54, 0x5c55, 0x5c56, 0x5c57, 0x5c58, 0x5c59, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5e, 0x5c5f, 0x5c60, 0x5c61, 0x5c62, 0x5c63, 0x5c64, 0x5c65, 0x5c66, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c6e, 0x5c6f, 0x5c70, 0x5c71, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, 0x5c77, 0x5c78, 0x5c79, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c7f, 0x5c80, 0x5c81, 0x5c82, 0x5c83, 0x5c84, 0x5c85, 0x5c86, 0x5c87, /* 0x5c80 */ 0x5c88, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8c, 0x5c8d, 0x5c8e, 0x5c8f, 0x5c90, 0x5c91, 0x5c92, 0x5c93, 0x5c94, 0x5c95, 0x5c96, 0x5c97, 0x5c98, 0x5c99, 0x5c9a, 0x5c9b, 0x5c9c, 0x5c9d, 0x5c9e, 0x5c9f, 0x5ca0, 0x5ca1, 0x5ca2, 0x5ca3, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, 0x5ca8, 0x5ca9, 0x5caa, 0x5cab, 0x5cac, 0x5cad, 0x5cae, 0x5caf, 0x5cb0, 0x5cb1, 0x5cb2, 0x5cb3, 0x5cb4, 0x5cb5, 0x5cb6, 0x5cb7, 0x5cb8, 0x5cb9, 0x5cba, 0x5cbb, 0x5cbc, 0x5cbd, 0x5cbe, 0x5cbf, 0x5cc0, 0x5cc1, 0x5cc2, 0x5cc3, 0x5cc4, 0x5cc5, 0x5cc6, 0x5cc7, /* 0x5cc0 */ 0x5cc8, 0x5cc9, 0x5cca, 0x5ccb, 0x5ccc, 0x5ccd, 0x5cce, 0x5ccf, 0x5cd0, 0x5cd1, 0x5cd2, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7, 0x5cd8, 0x5cd9, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, 0x5ce0, 0x5ce1, 0x5ce2, 0x5ce3, 0x5ce4, 0x5ce5, 0x5ce6, 0x5ce7, 0x5ce8, 0x5ce9, 0x5cea, 0x5ceb, 0x5cec, 0x5ced, 0x5cee, 0x5cef, 0x5cf0, 0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, 0x5cf8, 0x5cf9, 0x5cfa, 0x5cfb, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, 0x5d00, 0x5d01, 0x5d02, 0x5d03, 0x5d04, 0x5d05, 0x5d06, 0x5d07, /* 0x5d00 */ 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d, 0x5d0e, 0x5d0f, 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d14, 0x5d15, 0x5d16, 0x5d17, 0x5d18, 0x5d19, 0x5d1a, 0x5d1b, 0x5d1c, 0x5d1d, 0x5d1e, 0x5d1f, 0x5d20, 0x5d21, 0x5d22, 0x5d23, 0x5d24, 0x5d25, 0x5d26, 0x5d27, 0x5d28, 0x5d29, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2d, 0x5d2e, 0x5d2f, 0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d34, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3d, 0x5d3e, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d47, /* 0x5d40 */ 0x5d48, 0x5d49, 0x5d4a, 0x5d4b, 0x5d4c, 0x5d4d, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, 0x5d58, 0x5d59, 0x5d5a, 0x5d5b, 0x5d5c, 0x5d5d, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d69, 0x5d6a, 0x5d6b, 0x5d6c, 0x5d6d, 0x5d6e, 0x5d6f, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d74, 0x5d75, 0x5d76, 0x5d77, 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f, 0x5d80, 0x5d81, 0x5d82, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, /* 0x5d80 */ 0x5d88, 0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, 0x5d90, 0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, 0x5d98, 0x5d99, 0x5d9a, 0x5d9b, 0x5d9c, 0x5d9d, 0x5d9e, 0x5d9f, 0x5da0, 0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, 0x5da8, 0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, 0x5db0, 0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db7, 0x5db8, 0x5db9, 0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, 0x5dc0, 0x5dc1, 0x5dc2, 0x5dc3, 0x5dc4, 0x5dc5, 0x5dc6, 0x5dc7, /* 0x5dc0 */ 0x5dc8, 0x5dc9, 0x5dca, 0x5dcb, 0x5dcc, 0x5dcd, 0x5dce, 0x5dcf, 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3, 0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, 0x5dd8, 0x5dd9, 0x5dda, 0x5ddb, 0x5ddc, 0x5ddd, 0x5dde, 0x5ddf, 0x5de0, 0x5de1, 0x5de2, 0x5de3, 0x5de4, 0x5de5, 0x5de6, 0x5de7, 0x5de8, 0x5de9, 0x5dea, 0x5deb, 0x5dec, 0x5ded, 0x5dee, 0x5def, 0x5df0, 0x5df1, 0x5df2, 0x5df3, 0x5df4, 0x5df5, 0x5df6, 0x5df7, 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dfd, 0x5dfe, 0x5dff, 0x5e00, 0x5e01, 0x5e02, 0x5e03, 0x5e04, 0x5e05, 0x5e06, 0x5e07, /* 0x5e00 */ 0x5e08, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0c, 0x5e0d, 0x5e0e, 0x5e0f, 0x5e10, 0x5e11, 0x5e12, 0x5e13, 0x5e14, 0x5e15, 0x5e16, 0x5e17, 0x5e18, 0x5e19, 0x5e1a, 0x5e1b, 0x5e1c, 0x5e1d, 0x5e1e, 0x5e1f, 0x5e20, 0x5e21, 0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e26, 0x5e27, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, 0x5e2d, 0x5e2e, 0x5e2f, 0x5e30, 0x5e31, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e37, 0x5e38, 0x5e39, 0x5e3a, 0x5e3b, 0x5e3c, 0x5e3d, 0x5e3e, 0x5e3f, 0x5e40, 0x5e41, 0x5e42, 0x5e43, 0x5e44, 0x5e45, 0x5e46, 0x5e47, /* 0x5e40 */ 0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4c, 0x5e4d, 0x5e4e, 0x5e4f, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5e54, 0x5e55, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, 0x5e5b, 0x5e5c, 0x5e5d, 0x5e5e, 0x5e5f, 0x5e60, 0x5e61, 0x5e62, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e70, 0x5e71, 0x5e72, 0x5e73, 0x5e74, 0x5e75, 0x5e76, 0x5e77, 0x5e78, 0x5e79, 0x5e7a, 0x5e7b, 0x5e7c, 0x5e7d, 0x5e7e, 0x5e7f, 0x5e80, 0x5e81, 0x5e82, 0x5e83, 0x5e84, 0x5e85, 0x5e86, 0x5e87, /* 0x5e80 */ 0x5e88, 0x5e89, 0x5e8a, 0x5e8b, 0x5e8c, 0x5e8d, 0x5e8e, 0x5e8f, 0x5e90, 0x5e91, 0x5e92, 0x5e93, 0x5e94, 0x5e95, 0x5e96, 0x5e97, 0x5e98, 0x5e99, 0x5e9a, 0x5e9b, 0x5e9c, 0x5e9d, 0x5e9e, 0x5e9f, 0x5ea0, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4, 0x5ea5, 0x5ea6, 0x5ea7, 0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5ead, 0x5eae, 0x5eaf, 0x5eb0, 0x5eb1, 0x5eb2, 0x5eb3, 0x5eb4, 0x5eb5, 0x5eb6, 0x5eb7, 0x5eb8, 0x5eb9, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebe, 0x5ebf, 0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5, 0x5ec6, 0x5ec7, /* 0x5ec0 */ 0x5ec8, 0x5ec9, 0x5eca, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf, 0x5ed0, 0x5ed1, 0x5ed2, 0x5ed3, 0x5ed4, 0x5ed5, 0x5ed6, 0x5ed7, 0x5ed8, 0x5ed9, 0x5eda, 0x5edb, 0x5edc, 0x5edd, 0x5ede, 0x5edf, 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4, 0x5ee5, 0x5ee6, 0x5ee7, 0x5ee8, 0x5ee9, 0x5eea, 0x5eeb, 0x5eec, 0x5eed, 0x5eee, 0x5eef, 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef4, 0x5ef5, 0x5ef6, 0x5ef7, 0x5ef8, 0x5ef9, 0x5efa, 0x5efb, 0x5efc, 0x5efd, 0x5efe, 0x5eff, 0x5f00, 0x5f01, 0x5f02, 0x5f03, 0x5f04, 0x5f05, 0x5f06, 0x5f07, /* 0x5f00 */ 0x5f08, 0x5f09, 0x5f0a, 0x5f0b, 0x5f0c, 0x5f0d, 0x5f0e, 0x5f0f, 0x5f10, 0x5f11, 0x5f12, 0x5f13, 0x5f14, 0x5f15, 0x5f16, 0x5f17, 0x5f18, 0x5f19, 0x5f1a, 0x5f1b, 0x5f1c, 0x5f1d, 0x5f1e, 0x5f1f, 0x5f20, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f25, 0x5f26, 0x5f27, 0x5f28, 0x5f29, 0x5f2a, 0x5f2b, 0x5f2c, 0x5f2d, 0x5f2e, 0x5f2f, 0x5f30, 0x5f31, 0x5f32, 0x5f33, 0x5f34, 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f39, 0x5f3a, 0x5f3b, 0x5f3c, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f40, 0x5f41, 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, /* 0x5f40 */ 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f50, 0x5f51, 0x5f52, 0x5f53, 0x5f54, 0x5f55, 0x5f56, 0x5f57, 0x5f58, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5d, 0x5f5e, 0x5f5f, 0x5f60, 0x5f61, 0x5f62, 0x5f63, 0x5f64, 0x5f65, 0x5f66, 0x5f67, 0x5f68, 0x5f69, 0x5f6a, 0x5f6b, 0x5f6c, 0x5f6d, 0x5f6e, 0x5f6f, 0x5f70, 0x5f71, 0x5f72, 0x5f73, 0x5f74, 0x5f75, 0x5f76, 0x5f77, 0x5f78, 0x5f79, 0x5f7a, 0x5f7b, 0x5f7c, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f80, 0x5f81, 0x5f82, 0x5f83, 0x5f84, 0x5f85, 0x5f86, 0x5f87, /* 0x5f80 */ 0x5f88, 0x5f89, 0x5f8a, 0x5f8b, 0x5f8c, 0x5f8d, 0x5f8e, 0x5f8f, 0x5f90, 0x5f91, 0x5f92, 0x5f93, 0x5f94, 0x5f95, 0x5f96, 0x5f97, 0x5f98, 0x5f99, 0x5f9a, 0x5f9b, 0x5f9c, 0x5f9d, 0x5f9e, 0x5f9f, 0x5fa0, 0x5fa1, 0x5fa2, 0x5fa3, 0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, 0x5fa8, 0x5fa9, 0x5faa, 0x5fab, 0x5fac, 0x5fad, 0x5fae, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb5, 0x5fb6, 0x5fb7, 0x5fb8, 0x5fb9, 0x5fba, 0x5fbb, 0x5fbc, 0x5fbd, 0x5fbe, 0x5fbf, 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc3, 0x5fc4, 0x5fc5, 0x5fc6, 0x5fc7, /* 0x5fc0 */ 0x5fc8, 0x5fc9, 0x5fca, 0x5fcb, 0x5fcc, 0x5fcd, 0x5fce, 0x5fcf, 0x5fd0, 0x5fd1, 0x5fd2, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fd6, 0x5fd7, 0x5fd8, 0x5fd9, 0x5fda, 0x5fdb, 0x5fdc, 0x5fdd, 0x5fde, 0x5fdf, 0x5fe0, 0x5fe1, 0x5fe2, 0x5fe3, 0x5fe4, 0x5fe5, 0x5fe6, 0x5fe7, 0x5fe8, 0x5fe9, 0x5fea, 0x5feb, 0x5fec, 0x5fed, 0x5fee, 0x5fef, 0x5ff0, 0x5ff1, 0x5ff2, 0x5ff3, 0x5ff4, 0x5ff5, 0x5ff6, 0x5ff7, 0x5ff8, 0x5ff9, 0x5ffa, 0x5ffb, 0x5ffc, 0x5ffd, 0x5ffe, 0x5fff, 0x6000, 0x6001, 0x6002, 0x6003, 0x6004, 0x6005, 0x6006, 0x6007, /* 0x6000 */ 0x6008, 0x6009, 0x600a, 0x600b, 0x600c, 0x600d, 0x600e, 0x600f, 0x6010, 0x6011, 0x6012, 0x6013, 0x6014, 0x6015, 0x6016, 0x6017, 0x6018, 0x6019, 0x601a, 0x601b, 0x601c, 0x601d, 0x601e, 0x601f, 0x6020, 0x6021, 0x6022, 0x6023, 0x6024, 0x6025, 0x6026, 0x6027, 0x6028, 0x6029, 0x602a, 0x602b, 0x602c, 0x602d, 0x602e, 0x602f, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6035, 0x6036, 0x6037, 0x6038, 0x6039, 0x603a, 0x603b, 0x603c, 0x603d, 0x603e, 0x603f, 0x6040, 0x6041, 0x6042, 0x6043, 0x6044, 0x6045, 0x6046, 0x6047, /* 0x6040 */ 0x6048, 0x6049, 0x604a, 0x604b, 0x604c, 0x604d, 0x604e, 0x604f, 0x6050, 0x6051, 0x6052, 0x6053, 0x6054, 0x6055, 0x6056, 0x6057, 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, 0x605d, 0x605e, 0x605f, 0x6060, 0x6061, 0x6062, 0x6063, 0x6064, 0x6065, 0x6066, 0x6067, 0x6068, 0x6069, 0x606a, 0x606b, 0x606c, 0x606d, 0x606e, 0x606f, 0x6070, 0x6071, 0x6072, 0x6073, 0x6074, 0x6075, 0x6076, 0x6077, 0x6078, 0x6079, 0x607a, 0x607b, 0x607c, 0x607d, 0x607e, 0x607f, 0x6080, 0x6081, 0x6082, 0x6083, 0x6084, 0x6085, 0x6086, 0x6087, /* 0x6080 */ 0x6088, 0x6089, 0x608a, 0x608b, 0x608c, 0x608d, 0x608e, 0x608f, 0x6090, 0x6091, 0x6092, 0x6093, 0x6094, 0x6095, 0x6096, 0x6097, 0x6098, 0x6099, 0x609a, 0x609b, 0x609c, 0x609d, 0x609e, 0x609f, 0x60a0, 0x60a1, 0x60a2, 0x60a3, 0x60a4, 0x60a5, 0x60a6, 0x60a7, 0x60a8, 0x60a9, 0x60aa, 0x60ab, 0x60ac, 0x60ad, 0x60ae, 0x60af, 0x60b0, 0x60b1, 0x60b2, 0x60b3, 0x60b4, 0x60b5, 0x60b6, 0x60b7, 0x60b8, 0x60b9, 0x60ba, 0x60bb, 0x60bc, 0x60bd, 0x60be, 0x60bf, 0x60c0, 0x60c1, 0x60c2, 0x60c3, 0x60c4, 0x60c5, 0x60c6, 0x60c7, /* 0x60c0 */ 0x60c8, 0x60c9, 0x60ca, 0x60cb, 0x60cc, 0x60cd, 0x60ce, 0x60cf, 0x60d0, 0x60d1, 0x60d2, 0x60d3, 0x60d4, 0x60d5, 0x60d6, 0x60d7, 0x60d8, 0x60d9, 0x60da, 0x60db, 0x60dc, 0x60dd, 0x60de, 0x60df, 0x60e0, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60e6, 0x60e7, 0x60e8, 0x60e9, 0x60ea, 0x60eb, 0x60ec, 0x60ed, 0x60ee, 0x60ef, 0x60f0, 0x60f1, 0x60f2, 0x60f3, 0x60f4, 0x60f5, 0x60f6, 0x60f7, 0x60f8, 0x60f9, 0x60fa, 0x60fb, 0x60fc, 0x60fd, 0x60fe, 0x60ff, 0x6100, 0x6101, 0x6102, 0x6103, 0x6104, 0x6105, 0x6106, 0x6107, /* 0x6100 */ 0x6108, 0x6109, 0x610a, 0x610b, 0x610c, 0x610d, 0x610e, 0x610f, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6115, 0x6116, 0x6117, 0x6118, 0x6119, 0x611a, 0x611b, 0x611c, 0x611d, 0x611e, 0x611f, 0x6120, 0x6121, 0x6122, 0x6123, 0x6124, 0x6125, 0x6126, 0x6127, 0x6128, 0x6129, 0x612a, 0x612b, 0x612c, 0x612d, 0x612e, 0x612f, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x613f, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0x6147, /* 0x6140 */ 0x6148, 0x6149, 0x614a, 0x614b, 0x614c, 0x614d, 0x614e, 0x614f, 0x6150, 0x6151, 0x6152, 0x6153, 0x6154, 0x6155, 0x6156, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615d, 0x615e, 0x615f, 0x6160, 0x6161, 0x6162, 0x6163, 0x6164, 0x6165, 0x6166, 0x6167, 0x6168, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6170, 0x6171, 0x6172, 0x6173, 0x6174, 0x6175, 0x6176, 0x6177, 0x6178, 0x6179, 0x617a, 0x617b, 0x617c, 0x617d, 0x617e, 0x617f, 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, /* 0x6180 */ 0x6188, 0x6189, 0x618a, 0x618b, 0x618c, 0x618d, 0x618e, 0x618f, 0x6190, 0x6191, 0x6192, 0x6193, 0x6194, 0x6195, 0x6196, 0x6197, 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619d, 0x619e, 0x619f, 0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61a7, 0x61a8, 0x61a9, 0x61aa, 0x61ab, 0x61ac, 0x61ad, 0x61ae, 0x61af, 0x61b0, 0x61b1, 0x61b2, 0x61b3, 0x61b4, 0x61b5, 0x61b6, 0x61b7, 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc, 0x61bd, 0x61be, 0x61bf, 0x61c0, 0x61c1, 0x61c2, 0x61c3, 0x61c4, 0x61c5, 0x61c6, 0x61c7, /* 0x61c0 */ 0x61c8, 0x61c9, 0x61ca, 0x61cb, 0x61cc, 0x61cd, 0x61ce, 0x61cf, 0x61d0, 0x61d1, 0x61d2, 0x61d3, 0x61d4, 0x61d5, 0x61d6, 0x61d7, 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc, 0x61dd, 0x61de, 0x61df, 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4, 0x61e5, 0x61e6, 0x61e7, 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed, 0x61ee, 0x61ef, 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f5, 0x61f6, 0x61f7, 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe, 0x61ff, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6206, 0x6207, /* 0x6200 */ 0x6208, 0x6209, 0x620a, 0x620b, 0x620c, 0x620d, 0x620e, 0x620f, 0x6210, 0x6211, 0x6212, 0x6213, 0x6214, 0x6215, 0x6216, 0x6217, 0x6218, 0x6219, 0x621a, 0x621b, 0x621c, 0x621d, 0x621e, 0x621f, 0x6220, 0x6221, 0x6222, 0x6223, 0x6224, 0x6225, 0x6226, 0x6227, 0x6228, 0x6229, 0x622a, 0x622b, 0x622c, 0x622d, 0x622e, 0x622f, 0x6230, 0x6231, 0x6232, 0x6233, 0x6234, 0x6235, 0x6236, 0x6237, 0x6238, 0x6239, 0x623a, 0x623b, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x6242, 0x6243, 0x6244, 0x6245, 0x6246, 0x6247, /* 0x6240 */ 0x6248, 0x6249, 0x624a, 0x624b, 0x624c, 0x624d, 0x624e, 0x624f, 0x6250, 0x6251, 0x6252, 0x6253, 0x6254, 0x6255, 0x6256, 0x6257, 0x6258, 0x6259, 0x625a, 0x625b, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6263, 0x6264, 0x6265, 0x6266, 0x6267, 0x6268, 0x6269, 0x626a, 0x626b, 0x626c, 0x626d, 0x626e, 0x626f, 0x6270, 0x6271, 0x6272, 0x6273, 0x6274, 0x6275, 0x6276, 0x6277, 0x6278, 0x6279, 0x627a, 0x627b, 0x627c, 0x627d, 0x627e, 0x627f, 0x6280, 0x6281, 0x6282, 0x6283, 0x6284, 0x6285, 0x6286, 0x6287, /* 0x6280 */ 0x6288, 0x6289, 0x628a, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, 0x6290, 0x6291, 0x6292, 0x6293, 0x6294, 0x6295, 0x6296, 0x6297, 0x6298, 0x6299, 0x629a, 0x629b, 0x629c, 0x629d, 0x629e, 0x629f, 0x62a0, 0x62a1, 0x62a2, 0x62a3, 0x62a4, 0x62a5, 0x62a6, 0x62a7, 0x62a8, 0x62a9, 0x62aa, 0x62ab, 0x62ac, 0x62ad, 0x62ae, 0x62af, 0x62b0, 0x62b1, 0x62b2, 0x62b3, 0x62b4, 0x62b5, 0x62b6, 0x62b7, 0x62b8, 0x62b9, 0x62ba, 0x62bb, 0x62bc, 0x62bd, 0x62be, 0x62bf, 0x62c0, 0x62c1, 0x62c2, 0x62c3, 0x62c4, 0x62c5, 0x62c6, 0x62c7, /* 0x62c0 */ 0x62c8, 0x62c9, 0x62ca, 0x62cb, 0x62cc, 0x62cd, 0x62ce, 0x62cf, 0x62d0, 0x62d1, 0x62d2, 0x62d3, 0x62d4, 0x62d5, 0x62d6, 0x62d7, 0x62d8, 0x62d9, 0x62da, 0x62db, 0x62dc, 0x62dd, 0x62de, 0x62df, 0x62e0, 0x62e1, 0x62e2, 0x62e3, 0x62e4, 0x62e5, 0x62e6, 0x62e7, 0x62e8, 0x62e9, 0x62ea, 0x62eb, 0x62ec, 0x62ed, 0x62ee, 0x62ef, 0x62f0, 0x62f1, 0x62f2, 0x62f3, 0x62f4, 0x62f5, 0x62f6, 0x62f7, 0x62f8, 0x62f9, 0x62fa, 0x62fb, 0x62fc, 0x62fd, 0x62fe, 0x62ff, 0x6300, 0x6301, 0x6302, 0x6303, 0x6304, 0x6305, 0x6306, 0x6307, /* 0x6300 */ 0x6308, 0x6309, 0x630a, 0x630b, 0x630c, 0x630d, 0x630e, 0x630f, 0x6310, 0x6311, 0x6312, 0x6313, 0x6314, 0x6315, 0x6316, 0x6317, 0x6318, 0x6319, 0x631a, 0x631b, 0x631c, 0x631d, 0x631e, 0x631f, 0x6320, 0x6321, 0x6322, 0x6323, 0x6324, 0x6325, 0x6326, 0x6327, 0x6328, 0x6329, 0x632a, 0x632b, 0x632c, 0x632d, 0x632e, 0x632f, 0x6330, 0x6331, 0x6332, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x6339, 0x633a, 0x633b, 0x633c, 0x633d, 0x633e, 0x633f, 0x6340, 0x6341, 0x6342, 0x6343, 0x6344, 0x6345, 0x6346, 0x6347, /* 0x6340 */ 0x6348, 0x6349, 0x634a, 0x634b, 0x634c, 0x634d, 0x634e, 0x634f, 0x6350, 0x6351, 0x6352, 0x6353, 0x6354, 0x6355, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, 0x635d, 0x635e, 0x635f, 0x6360, 0x6361, 0x6362, 0x6363, 0x6364, 0x6365, 0x6366, 0x6367, 0x6368, 0x6369, 0x636a, 0x636b, 0x636c, 0x636d, 0x636e, 0x636f, 0x6370, 0x6371, 0x6372, 0x6373, 0x6374, 0x6375, 0x6376, 0x6377, 0x6378, 0x6379, 0x637a, 0x637b, 0x637c, 0x637d, 0x637e, 0x637f, 0x6380, 0x6381, 0x6382, 0x6383, 0x6384, 0x6385, 0x6386, 0x6387, /* 0x6380 */ 0x6388, 0x6389, 0x638a, 0x638b, 0x638c, 0x638d, 0x638e, 0x638f, 0x6390, 0x6391, 0x6392, 0x6393, 0x6394, 0x6395, 0x6396, 0x6397, 0x6398, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f, 0x63a0, 0x63a1, 0x63a2, 0x63a3, 0x63a4, 0x63a5, 0x63a6, 0x63a7, 0x63a8, 0x63a9, 0x63aa, 0x63ab, 0x63ac, 0x63ad, 0x63ae, 0x63af, 0x63b0, 0x63b1, 0x63b2, 0x63b3, 0x63b4, 0x63b5, 0x63b6, 0x63b7, 0x63b8, 0x63b9, 0x63ba, 0x63bb, 0x63bc, 0x63bd, 0x63be, 0x63bf, 0x63c0, 0x63c1, 0x63c2, 0x63c3, 0x63c4, 0x63c5, 0x63c6, 0x63c7, /* 0x63c0 */ 0x63c8, 0x63c9, 0x63ca, 0x63cb, 0x63cc, 0x63cd, 0x63ce, 0x63cf, 0x63d0, 0x63d1, 0x63d2, 0x63d3, 0x63d4, 0x63d5, 0x63d6, 0x63d7, 0x63d8, 0x63d9, 0x63da, 0x63db, 0x63dc, 0x63dd, 0x63de, 0x63df, 0x63e0, 0x63e1, 0x63e2, 0x63e3, 0x63e4, 0x63e5, 0x63e6, 0x63e7, 0x63e8, 0x63e9, 0x63ea, 0x63eb, 0x63ec, 0x63ed, 0x63ee, 0x63ef, 0x63f0, 0x63f1, 0x63f2, 0x63f3, 0x63f4, 0x63f5, 0x63f6, 0x63f7, 0x63f8, 0x63f9, 0x63fa, 0x63fb, 0x63fc, 0x63fd, 0x63fe, 0x63ff, 0x6400, 0x6401, 0x6402, 0x6403, 0x6404, 0x6405, 0x6406, 0x6407, /* 0x6400 */ 0x6408, 0x6409, 0x640a, 0x640b, 0x640c, 0x640d, 0x640e, 0x640f, 0x6410, 0x6411, 0x6412, 0x6413, 0x6414, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641a, 0x641b, 0x641c, 0x641d, 0x641e, 0x641f, 0x6420, 0x6421, 0x6422, 0x6423, 0x6424, 0x6425, 0x6426, 0x6427, 0x6428, 0x6429, 0x642a, 0x642b, 0x642c, 0x642d, 0x642e, 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6434, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643a, 0x643b, 0x643c, 0x643d, 0x643e, 0x643f, 0x6440, 0x6441, 0x6442, 0x6443, 0x6444, 0x6445, 0x6446, 0x6447, /* 0x6440 */ 0x6448, 0x6449, 0x644a, 0x644b, 0x644c, 0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6452, 0x6453, 0x6454, 0x6455, 0x6456, 0x6457, 0x6458, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645e, 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6467, 0x6468, 0x6469, 0x646a, 0x646b, 0x646c, 0x646d, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x6478, 0x6479, 0x647a, 0x647b, 0x647c, 0x647d, 0x647e, 0x647f, 0x6480, 0x6481, 0x6482, 0x6483, 0x6484, 0x6485, 0x6486, 0x6487, /* 0x6480 */ 0x6488, 0x6489, 0x648a, 0x648b, 0x648c, 0x648d, 0x648e, 0x648f, 0x6490, 0x6491, 0x6492, 0x6493, 0x6494, 0x6495, 0x6496, 0x6497, 0x6498, 0x6499, 0x649a, 0x649b, 0x649c, 0x649d, 0x649e, 0x649f, 0x64a0, 0x64a1, 0x64a2, 0x64a3, 0x64a4, 0x64a5, 0x64a6, 0x64a7, 0x64a8, 0x64a9, 0x64aa, 0x64ab, 0x64ac, 0x64ad, 0x64ae, 0x64af, 0x64b0, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b5, 0x64b6, 0x64b7, 0x64b8, 0x64b9, 0x64ba, 0x64bb, 0x64bc, 0x64bd, 0x64be, 0x64bf, 0x64c0, 0x64c1, 0x64c2, 0x64c3, 0x64c4, 0x64c5, 0x64c6, 0x64c7, /* 0x64c0 */ 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cd, 0x64ce, 0x64cf, 0x64d0, 0x64d1, 0x64d2, 0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d7, 0x64d8, 0x64d9, 0x64da, 0x64db, 0x64dc, 0x64dd, 0x64de, 0x64df, 0x64e0, 0x64e1, 0x64e2, 0x64e3, 0x64e4, 0x64e5, 0x64e6, 0x64e7, 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee, 0x64ef, 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6, 0x64f7, 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe, 0x64ff, 0x6500, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, /* 0x6500 */ 0x6508, 0x6509, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, 0x6510, 0x6511, 0x6512, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6518, 0x6519, 0x651a, 0x651b, 0x651c, 0x651d, 0x651e, 0x651f, 0x6520, 0x6521, 0x6522, 0x6523, 0x6524, 0x6525, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652b, 0x652c, 0x652d, 0x652e, 0x652f, 0x6530, 0x6531, 0x6532, 0x6533, 0x6534, 0x6535, 0x6536, 0x6537, 0x6538, 0x6539, 0x653a, 0x653b, 0x653c, 0x653d, 0x653e, 0x653f, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0x6546, 0x6547, /* 0x6540 */ 0x6548, 0x6549, 0x654a, 0x654b, 0x654c, 0x654d, 0x654e, 0x654f, 0x6550, 0x6551, 0x6552, 0x6553, 0x6554, 0x6555, 0x6556, 0x6557, 0x6558, 0x6559, 0x655a, 0x655b, 0x655c, 0x655d, 0x655e, 0x655f, 0x6560, 0x6561, 0x6562, 0x6563, 0x6564, 0x6565, 0x6566, 0x6567, 0x6568, 0x6569, 0x656a, 0x656b, 0x656c, 0x656d, 0x656e, 0x656f, 0x6570, 0x6571, 0x6572, 0x6573, 0x6574, 0x6575, 0x6576, 0x6577, 0x6578, 0x6579, 0x657a, 0x657b, 0x657c, 0x657d, 0x657e, 0x657f, 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6587, /* 0x6580 */ 0x6588, 0x6589, 0x658a, 0x658b, 0x658c, 0x658d, 0x658e, 0x658f, 0x6590, 0x6591, 0x6592, 0x6593, 0x6594, 0x6595, 0x6596, 0x6597, 0x6598, 0x6599, 0x659a, 0x659b, 0x659c, 0x659d, 0x659e, 0x659f, 0x65a0, 0x65a1, 0x65a2, 0x65a3, 0x65a4, 0x65a5, 0x65a6, 0x65a7, 0x65a8, 0x65a9, 0x65aa, 0x65ab, 0x65ac, 0x65ad, 0x65ae, 0x65af, 0x65b0, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7, 0x65b8, 0x65b9, 0x65ba, 0x65bb, 0x65bc, 0x65bd, 0x65be, 0x65bf, 0x65c0, 0x65c1, 0x65c2, 0x65c3, 0x65c4, 0x65c5, 0x65c6, 0x65c7, /* 0x65c0 */ 0x65c8, 0x65c9, 0x65ca, 0x65cb, 0x65cc, 0x65cd, 0x65ce, 0x65cf, 0x65d0, 0x65d1, 0x65d2, 0x65d3, 0x65d4, 0x65d5, 0x65d6, 0x65d7, 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de, 0x65df, 0x65e0, 0x65e1, 0x65e2, 0x65e3, 0x65e4, 0x65e5, 0x65e6, 0x65e7, 0x65e8, 0x65e9, 0x65ea, 0x65eb, 0x65ec, 0x65ed, 0x65ee, 0x65ef, 0x65f0, 0x65f1, 0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f6, 0x65f7, 0x65f8, 0x65f9, 0x65fa, 0x65fb, 0x65fc, 0x65fd, 0x65fe, 0x65ff, 0x6600, 0x6601, 0x6602, 0x6603, 0x6604, 0x6605, 0x6606, 0x6607, /* 0x6600 */ 0x6608, 0x6609, 0x660a, 0x660b, 0x660c, 0x660d, 0x660e, 0x660f, 0x6610, 0x6611, 0x6612, 0x6613, 0x6614, 0x6615, 0x6616, 0x6617, 0x6618, 0x6619, 0x661a, 0x661b, 0x661c, 0x661d, 0x661e, 0x661f, 0x6620, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6627, 0x6628, 0x6629, 0x662a, 0x662b, 0x662c, 0x662d, 0x662e, 0x662f, 0x6630, 0x6631, 0x6632, 0x6633, 0x6634, 0x6635, 0x6636, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663c, 0x663d, 0x663e, 0x663f, 0x6640, 0x6641, 0x6642, 0x6643, 0x6644, 0x6645, 0x6646, 0x6647, /* 0x6640 */ 0x6648, 0x6649, 0x664a, 0x664b, 0x664c, 0x664d, 0x664e, 0x664f, 0x6650, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x6656, 0x6657, 0x6658, 0x6659, 0x665a, 0x665b, 0x665c, 0x665d, 0x665e, 0x665f, 0x6660, 0x6661, 0x6662, 0x6663, 0x6664, 0x6665, 0x6666, 0x6667, 0x6668, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x666e, 0x666f, 0x6670, 0x6671, 0x6672, 0x6673, 0x6674, 0x6675, 0x6676, 0x6677, 0x6678, 0x6679, 0x667a, 0x667b, 0x667c, 0x667d, 0x667e, 0x667f, 0x6680, 0x6681, 0x6682, 0x6683, 0x6684, 0x6685, 0x6686, 0x6687, /* 0x6680 */ 0x6688, 0x6689, 0x668a, 0x668b, 0x668c, 0x668d, 0x668e, 0x668f, 0x6690, 0x6691, 0x6692, 0x6693, 0x6694, 0x6695, 0x6696, 0x6697, 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669d, 0x669e, 0x669f, 0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a7, 0x66a8, 0x66a9, 0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66ae, 0x66af, 0x66b0, 0x66b1, 0x66b2, 0x66b3, 0x66b4, 0x66b5, 0x66b6, 0x66b7, 0x66b8, 0x66b9, 0x66ba, 0x66bb, 0x66bc, 0x66bd, 0x66be, 0x66bf, 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5, 0x66c6, 0x66c7, /* 0x66c0 */ 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd, 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, 0x66d6, 0x66d7, 0x66d8, 0x66d9, 0x66da, 0x66db, 0x66dc, 0x66dd, 0x66de, 0x66df, 0x66e0, 0x66e1, 0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e6, 0x66e7, 0x66e8, 0x66e9, 0x66ea, 0x66eb, 0x66ec, 0x66ed, 0x66ee, 0x66ef, 0x66f0, 0x66f1, 0x66f2, 0x66f3, 0x66f4, 0x66f5, 0x66f6, 0x66f7, 0x66f8, 0x66f9, 0x66fa, 0x66fb, 0x66fc, 0x66fd, 0x66fe, 0x66ff, 0x6700, 0x6701, 0x6702, 0x6703, 0x6704, 0x6705, 0x6706, 0x6707, /* 0x6700 */ 0x6708, 0x6709, 0x670a, 0x670b, 0x670c, 0x670d, 0x670e, 0x670f, 0x6710, 0x6711, 0x6712, 0x6713, 0x6714, 0x6715, 0x6716, 0x6717, 0x6718, 0x6719, 0x671a, 0x671b, 0x671c, 0x671d, 0x671e, 0x671f, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6726, 0x6727, 0x6728, 0x6729, 0x672a, 0x672b, 0x672c, 0x672d, 0x672e, 0x672f, 0x6730, 0x6731, 0x6732, 0x6733, 0x6734, 0x6735, 0x6736, 0x6737, 0x6738, 0x6739, 0x673a, 0x673b, 0x673c, 0x673d, 0x673e, 0x673f, 0x6740, 0x6741, 0x6742, 0x6743, 0x6744, 0x6745, 0x6746, 0x6747, /* 0x6740 */ 0x6748, 0x6749, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x6751, 0x6752, 0x6753, 0x6754, 0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675c, 0x675d, 0x675e, 0x675f, 0x6760, 0x6761, 0x6762, 0x6763, 0x6764, 0x6765, 0x6766, 0x6767, 0x6768, 0x6769, 0x676a, 0x676b, 0x676c, 0x676d, 0x676e, 0x676f, 0x6770, 0x6771, 0x6772, 0x6773, 0x6774, 0x6775, 0x6776, 0x6777, 0x6778, 0x6779, 0x677a, 0x677b, 0x677c, 0x677d, 0x677e, 0x677f, 0x6780, 0x6781, 0x6782, 0x6783, 0x6784, 0x6785, 0x6786, 0x6787, /* 0x6780 */ 0x6788, 0x6789, 0x678a, 0x678b, 0x678c, 0x678d, 0x678e, 0x678f, 0x6790, 0x6791, 0x6792, 0x6793, 0x6794, 0x6795, 0x6796, 0x6797, 0x6798, 0x6799, 0x679a, 0x679b, 0x679c, 0x679d, 0x679e, 0x679f, 0x67a0, 0x67a1, 0x67a2, 0x67a3, 0x67a4, 0x67a5, 0x67a6, 0x67a7, 0x67a8, 0x67a9, 0x67aa, 0x67ab, 0x67ac, 0x67ad, 0x67ae, 0x67af, 0x67b0, 0x67b1, 0x67b2, 0x67b3, 0x67b4, 0x67b5, 0x67b6, 0x67b7, 0x67b8, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf, 0x67c0, 0x67c1, 0x67c2, 0x67c3, 0x67c4, 0x67c5, 0x67c6, 0x67c7, /* 0x67c0 */ 0x67c8, 0x67c9, 0x67ca, 0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67cf, 0x67d0, 0x67d1, 0x67d2, 0x67d3, 0x67d4, 0x67d5, 0x67d6, 0x67d7, 0x67d8, 0x67d9, 0x67da, 0x67db, 0x67dc, 0x67dd, 0x67de, 0x67df, 0x67e0, 0x67e1, 0x67e2, 0x67e3, 0x67e4, 0x67e5, 0x67e6, 0x67e7, 0x67e8, 0x67e9, 0x67ea, 0x67eb, 0x67ec, 0x67ed, 0x67ee, 0x67ef, 0x67f0, 0x67f1, 0x67f2, 0x67f3, 0x67f4, 0x67f5, 0x67f6, 0x67f7, 0x67f8, 0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fd, 0x67fe, 0x67ff, 0x6800, 0x6801, 0x6802, 0x6803, 0x6804, 0x6805, 0x6806, 0x6807, /* 0x6800 */ 0x6808, 0x6809, 0x680a, 0x680b, 0x680c, 0x680d, 0x680e, 0x680f, 0x6810, 0x6811, 0x6812, 0x6813, 0x6814, 0x6815, 0x6816, 0x6817, 0x6818, 0x6819, 0x681a, 0x681b, 0x681c, 0x681d, 0x681e, 0x681f, 0x6820, 0x6821, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x6829, 0x682a, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6832, 0x6833, 0x6834, 0x6835, 0x6836, 0x6837, 0x6838, 0x6839, 0x683a, 0x683b, 0x683c, 0x683d, 0x683e, 0x683f, 0x6840, 0x6841, 0x6842, 0x6843, 0x6844, 0x6845, 0x6846, 0x6847, /* 0x6840 */ 0x6848, 0x6849, 0x684a, 0x684b, 0x684c, 0x684d, 0x684e, 0x684f, 0x6850, 0x6851, 0x6852, 0x6853, 0x6854, 0x6855, 0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b, 0x685c, 0x685d, 0x685e, 0x685f, 0x6860, 0x6861, 0x6862, 0x6863, 0x6864, 0x6865, 0x6866, 0x6867, 0x6868, 0x6869, 0x686a, 0x686b, 0x686c, 0x686d, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6874, 0x6875, 0x6876, 0x6877, 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, 0x6880, 0x6881, 0x6882, 0x6883, 0x6884, 0x6885, 0x6886, 0x6887, /* 0x6880 */ 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d, 0x688e, 0x688f, 0x6890, 0x6891, 0x6892, 0x6893, 0x6894, 0x6895, 0x6896, 0x6897, 0x6898, 0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, 0x68a0, 0x68a1, 0x68a2, 0x68a3, 0x68a4, 0x68a5, 0x68a6, 0x68a7, 0x68a8, 0x68a9, 0x68aa, 0x68ab, 0x68ac, 0x68ad, 0x68ae, 0x68af, 0x68b0, 0x68b1, 0x68b2, 0x68b3, 0x68b4, 0x68b5, 0x68b6, 0x68b7, 0x68b8, 0x68b9, 0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, 0x68c0, 0x68c1, 0x68c2, 0x68c3, 0x68c4, 0x68c5, 0x68c6, 0x68c7, /* 0x68c0 */ 0x68c8, 0x68c9, 0x68ca, 0x68cb, 0x68cc, 0x68cd, 0x68ce, 0x68cf, 0x68d0, 0x68d1, 0x68d2, 0x68d3, 0x68d4, 0x68d5, 0x68d6, 0x68d7, 0x68d8, 0x68d9, 0x68da, 0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, 0x68e0, 0x68e1, 0x68e2, 0x68e3, 0x68e4, 0x68e5, 0x68e6, 0x68e7, 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68ee, 0x68ef, 0x68f0, 0x68f1, 0x68f2, 0x68f3, 0x68f4, 0x68f5, 0x68f6, 0x68f7, 0x68f8, 0x68f9, 0x68fa, 0x68fb, 0x68fc, 0x68fd, 0x68fe, 0x68ff, 0x6900, 0x6901, 0x6902, 0x6903, 0x6904, 0x6905, 0x6906, 0x6907, /* 0x6900 */ 0x6908, 0x6909, 0x690a, 0x690b, 0x690c, 0x690d, 0x690e, 0x690f, 0x6910, 0x6911, 0x6912, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691a, 0x691b, 0x691c, 0x691d, 0x691e, 0x691f, 0x6920, 0x6921, 0x6922, 0x6923, 0x6924, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692d, 0x692e, 0x692f, 0x6930, 0x6931, 0x6932, 0x6933, 0x6934, 0x6935, 0x6936, 0x6937, 0x6938, 0x6939, 0x693a, 0x693b, 0x693c, 0x693d, 0x693e, 0x693f, 0x6940, 0x6941, 0x6942, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, /* 0x6940 */ 0x6948, 0x6949, 0x694a, 0x694b, 0x694c, 0x694d, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6954, 0x6955, 0x6956, 0x6957, 0x6958, 0x6959, 0x695a, 0x695b, 0x695c, 0x695d, 0x695e, 0x695f, 0x6960, 0x6961, 0x6962, 0x6963, 0x6964, 0x6965, 0x6966, 0x6967, 0x6968, 0x6969, 0x696a, 0x696b, 0x696c, 0x696d, 0x696e, 0x696f, 0x6970, 0x6971, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x6977, 0x6978, 0x6979, 0x697a, 0x697b, 0x697c, 0x697d, 0x697e, 0x697f, 0x6980, 0x6981, 0x6982, 0x6983, 0x6984, 0x6985, 0x6986, 0x6987, /* 0x6980 */ 0x6988, 0x6989, 0x698a, 0x698b, 0x698c, 0x698d, 0x698e, 0x698f, 0x6990, 0x6991, 0x6992, 0x6993, 0x6994, 0x6995, 0x6996, 0x6997, 0x6998, 0x6999, 0x699a, 0x699b, 0x699c, 0x699d, 0x699e, 0x699f, 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6, 0x69a7, 0x69a8, 0x69a9, 0x69aa, 0x69ab, 0x69ac, 0x69ad, 0x69ae, 0x69af, 0x69b0, 0x69b1, 0x69b2, 0x69b3, 0x69b4, 0x69b5, 0x69b6, 0x69b7, 0x69b8, 0x69b9, 0x69ba, 0x69bb, 0x69bc, 0x69bd, 0x69be, 0x69bf, 0x69c0, 0x69c1, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7, /* 0x69c0 */ 0x69c8, 0x69c9, 0x69ca, 0x69cb, 0x69cc, 0x69cd, 0x69ce, 0x69cf, 0x69d0, 0x69d1, 0x69d2, 0x69d3, 0x69d4, 0x69d5, 0x69d6, 0x69d7, 0x69d8, 0x69d9, 0x69da, 0x69db, 0x69dc, 0x69dd, 0x69de, 0x69df, 0x69e0, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7, 0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ed, 0x69ee, 0x69ef, 0x69f0, 0x69f1, 0x69f2, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, 0x69f8, 0x69f9, 0x69fa, 0x69fb, 0x69fc, 0x69fd, 0x69fe, 0x69ff, 0x6a00, 0x6a01, 0x6a02, 0x6a03, 0x6a04, 0x6a05, 0x6a06, 0x6a07, /* 0x6a00 */ 0x6a08, 0x6a09, 0x6a0a, 0x6a0b, 0x6a0c, 0x6a0d, 0x6a0e, 0x6a0f, 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14, 0x6a15, 0x6a16, 0x6a17, 0x6a18, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e, 0x6a1f, 0x6a20, 0x6a21, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a28, 0x6a29, 0x6a2a, 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a2f, 0x6a30, 0x6a31, 0x6a32, 0x6a33, 0x6a34, 0x6a35, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3d, 0x6a3e, 0x6a3f, 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a44, 0x6a45, 0x6a46, 0x6a47, /* 0x6a40 */ 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a50, 0x6a51, 0x6a52, 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a58, 0x6a59, 0x6a5a, 0x6a5b, 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a61, 0x6a62, 0x6a63, 0x6a64, 0x6a65, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a71, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a7c, 0x6a7d, 0x6a7e, 0x6a7f, 0x6a80, 0x6a81, 0x6a82, 0x6a83, 0x6a84, 0x6a85, 0x6a86, 0x6a87, /* 0x6a80 */ 0x6a88, 0x6a89, 0x6a8a, 0x6a8b, 0x6a8c, 0x6a8d, 0x6a8e, 0x6a8f, 0x6a90, 0x6a91, 0x6a92, 0x6a93, 0x6a94, 0x6a95, 0x6a96, 0x6a97, 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e, 0x6a9f, 0x6aa0, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7, 0x6aa8, 0x6aa9, 0x6aaa, 0x6aab, 0x6aac, 0x6aad, 0x6aae, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab2, 0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2, 0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, /* 0x6ac0 */ 0x6ac8, 0x6ac9, 0x6aca, 0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, 0x6ad0, 0x6ad1, 0x6ad2, 0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, 0x6ad8, 0x6ad9, 0x6ada, 0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, 0x6ae0, 0x6ae1, 0x6ae2, 0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, 0x6ae8, 0x6ae9, 0x6aea, 0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, 0x6af0, 0x6af1, 0x6af2, 0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, 0x6af8, 0x6af9, 0x6afa, 0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, 0x6b00, 0x6b01, 0x6b02, 0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, /* 0x6b00 */ 0x6b08, 0x6b09, 0x6b0a, 0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, 0x6b10, 0x6b11, 0x6b12, 0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, 0x6b18, 0x6b19, 0x6b1a, 0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, 0x6b20, 0x6b21, 0x6b22, 0x6b23, 0x6b24, 0x6b25, 0x6b26, 0x6b27, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, 0x6b2f, 0x6b30, 0x6b31, 0x6b32, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b37, 0x6b38, 0x6b39, 0x6b3a, 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3e, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b43, 0x6b44, 0x6b45, 0x6b46, 0x6b47, /* 0x6b40 */ 0x6b48, 0x6b49, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b4e, 0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58, 0x6b59, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, 0x6b60, 0x6b61, 0x6b62, 0x6b63, 0x6b64, 0x6b65, 0x6b66, 0x6b67, 0x6b68, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, 0x6b78, 0x6b79, 0x6b7a, 0x6b7b, 0x6b7c, 0x6b7d, 0x6b7e, 0x6b7f, 0x6b80, 0x6b81, 0x6b82, 0x6b83, 0x6b84, 0x6b85, 0x6b86, 0x6b87, /* 0x6b80 */ 0x6b88, 0x6b89, 0x6b8a, 0x6b8b, 0x6b8c, 0x6b8d, 0x6b8e, 0x6b8f, 0x6b90, 0x6b91, 0x6b92, 0x6b93, 0x6b94, 0x6b95, 0x6b96, 0x6b97, 0x6b98, 0x6b99, 0x6b9a, 0x6b9b, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, 0x6ba0, 0x6ba1, 0x6ba2, 0x6ba3, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, 0x6ba8, 0x6ba9, 0x6baa, 0x6bab, 0x6bac, 0x6bad, 0x6bae, 0x6baf, 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb3, 0x6bb4, 0x6bb5, 0x6bb6, 0x6bb7, 0x6bb8, 0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bbf, 0x6bc0, 0x6bc1, 0x6bc2, 0x6bc3, 0x6bc4, 0x6bc5, 0x6bc6, 0x6bc7, /* 0x6bc0 */ 0x6bc8, 0x6bc9, 0x6bca, 0x6bcb, 0x6bcc, 0x6bcd, 0x6bce, 0x6bcf, 0x6bd0, 0x6bd1, 0x6bd2, 0x6bd3, 0x6bd4, 0x6bd5, 0x6bd6, 0x6bd7, 0x6bd8, 0x6bd9, 0x6bda, 0x6bdb, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, 0x6be0, 0x6be1, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, 0x6be8, 0x6be9, 0x6bea, 0x6beb, 0x6bec, 0x6bed, 0x6bee, 0x6bef, 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf3, 0x6bf4, 0x6bf5, 0x6bf6, 0x6bf7, 0x6bf8, 0x6bf9, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfd, 0x6bfe, 0x6bff, 0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c05, 0x6c06, 0x6c07, /* 0x6c00 */ 0x6c08, 0x6c09, 0x6c0a, 0x6c0b, 0x6c0c, 0x6c0d, 0x6c0e, 0x6c0f, 0x6c10, 0x6c11, 0x6c12, 0x6c13, 0x6c14, 0x6c15, 0x6c16, 0x6c17, 0x6c18, 0x6c19, 0x6c1a, 0x6c1b, 0x6c1c, 0x6c1d, 0x6c1e, 0x6c1f, 0x6c20, 0x6c21, 0x6c22, 0x6c23, 0x6c24, 0x6c25, 0x6c26, 0x6c27, 0x6c28, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c2e, 0x6c2f, 0x6c30, 0x6c31, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x6c36, 0x6c37, 0x6c38, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3d, 0x6c3e, 0x6c3f, 0x6c40, 0x6c41, 0x6c42, 0x6c43, 0x6c44, 0x6c45, 0x6c46, 0x6c47, /* 0x6c40 */ 0x6c48, 0x6c49, 0x6c4a, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e, 0x6c4f, 0x6c50, 0x6c51, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c56, 0x6c57, 0x6c58, 0x6c59, 0x6c5a, 0x6c5b, 0x6c5c, 0x6c5d, 0x6c5e, 0x6c5f, 0x6c60, 0x6c61, 0x6c62, 0x6c63, 0x6c64, 0x6c65, 0x6c66, 0x6c67, 0x6c68, 0x6c69, 0x6c6a, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c70, 0x6c71, 0x6c72, 0x6c73, 0x6c74, 0x6c75, 0x6c76, 0x6c77, 0x6c78, 0x6c79, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7d, 0x6c7e, 0x6c7f, 0x6c80, 0x6c81, 0x6c82, 0x6c83, 0x6c84, 0x6c85, 0x6c86, 0x6c87, /* 0x6c80 */ 0x6c88, 0x6c89, 0x6c8a, 0x6c8b, 0x6c8c, 0x6c8d, 0x6c8e, 0x6c8f, 0x6c90, 0x6c91, 0x6c92, 0x6c93, 0x6c94, 0x6c95, 0x6c96, 0x6c97, 0x6c98, 0x6c99, 0x6c9a, 0x6c9b, 0x6c9c, 0x6c9d, 0x6c9e, 0x6c9f, 0x6ca0, 0x6ca1, 0x6ca2, 0x6ca3, 0x6ca4, 0x6ca5, 0x6ca6, 0x6ca7, 0x6ca8, 0x6ca9, 0x6caa, 0x6cab, 0x6cac, 0x6cad, 0x6cae, 0x6caf, 0x6cb0, 0x6cb1, 0x6cb2, 0x6cb3, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7, 0x6cb8, 0x6cb9, 0x6cba, 0x6cbb, 0x6cbc, 0x6cbd, 0x6cbe, 0x6cbf, 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc4, 0x6cc5, 0x6cc6, 0x6cc7, /* 0x6cc0 */ 0x6cc8, 0x6cc9, 0x6cca, 0x6ccb, 0x6ccc, 0x6ccd, 0x6cce, 0x6ccf, 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd3, 0x6cd4, 0x6cd5, 0x6cd6, 0x6cd7, 0x6cd8, 0x6cd9, 0x6cda, 0x6cdb, 0x6cdc, 0x6cdd, 0x6cde, 0x6cdf, 0x6ce0, 0x6ce1, 0x6ce2, 0x6ce3, 0x6ce4, 0x6ce5, 0x6ce6, 0x6ce7, 0x6ce8, 0x6ce9, 0x6cea, 0x6ceb, 0x6cec, 0x6ced, 0x6cee, 0x6cef, 0x6cf0, 0x6cf1, 0x6cf2, 0x6cf3, 0x6cf4, 0x6cf5, 0x6cf6, 0x6cf7, 0x6cf8, 0x6cf9, 0x6cfa, 0x6cfb, 0x6cfc, 0x6cfd, 0x6cfe, 0x6cff, 0x6d00, 0x6d01, 0x6d02, 0x6d03, 0x6d04, 0x6d05, 0x6d06, 0x6d07, /* 0x6d00 */ 0x6d08, 0x6d09, 0x6d0a, 0x6d0b, 0x6d0c, 0x6d0d, 0x6d0e, 0x6d0f, 0x6d10, 0x6d11, 0x6d12, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d17, 0x6d18, 0x6d19, 0x6d1a, 0x6d1b, 0x6d1c, 0x6d1d, 0x6d1e, 0x6d1f, 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d25, 0x6d26, 0x6d27, 0x6d28, 0x6d29, 0x6d2a, 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, 0x6d30, 0x6d31, 0x6d32, 0x6d33, 0x6d34, 0x6d35, 0x6d36, 0x6d37, 0x6d38, 0x6d39, 0x6d3a, 0x6d3b, 0x6d3c, 0x6d3d, 0x6d3e, 0x6d3f, 0x6d40, 0x6d41, 0x6d42, 0x6d43, 0x6d44, 0x6d45, 0x6d46, 0x6d47, /* 0x6d40 */ 0x6d48, 0x6d49, 0x6d4a, 0x6d4b, 0x6d4c, 0x6d4d, 0x6d4e, 0x6d4f, 0x6d50, 0x6d51, 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d59, 0x6d5a, 0x6d5b, 0x6d5c, 0x6d5d, 0x6d5e, 0x6d5f, 0x6d60, 0x6d61, 0x6d62, 0x6d63, 0x6d64, 0x6d65, 0x6d66, 0x6d67, 0x6d68, 0x6d69, 0x6d6a, 0x6d6b, 0x6d6c, 0x6d6d, 0x6d6e, 0x6d6f, 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d74, 0x6d75, 0x6d76, 0x6d77, 0x6d78, 0x6d79, 0x6d7a, 0x6d7b, 0x6d7c, 0x6d7d, 0x6d7e, 0x6d7f, 0x6d80, 0x6d81, 0x6d82, 0x6d83, 0x6d84, 0x6d85, 0x6d86, 0x6d87, /* 0x6d80 */ 0x6d88, 0x6d89, 0x6d8a, 0x6d8b, 0x6d8c, 0x6d8d, 0x6d8e, 0x6d8f, 0x6d90, 0x6d91, 0x6d92, 0x6d93, 0x6d94, 0x6d95, 0x6d96, 0x6d97, 0x6d98, 0x6d99, 0x6d9a, 0x6d9b, 0x6d9c, 0x6d9d, 0x6d9e, 0x6d9f, 0x6da0, 0x6da1, 0x6da2, 0x6da3, 0x6da4, 0x6da5, 0x6da6, 0x6da7, 0x6da8, 0x6da9, 0x6daa, 0x6dab, 0x6dac, 0x6dad, 0x6dae, 0x6daf, 0x6db0, 0x6db1, 0x6db2, 0x6db3, 0x6db4, 0x6db5, 0x6db6, 0x6db7, 0x6db8, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe, 0x6dbf, 0x6dc0, 0x6dc1, 0x6dc2, 0x6dc3, 0x6dc4, 0x6dc5, 0x6dc6, 0x6dc7, /* 0x6dc0 */ 0x6dc8, 0x6dc9, 0x6dca, 0x6dcb, 0x6dcc, 0x6dcd, 0x6dce, 0x6dcf, 0x6dd0, 0x6dd1, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5, 0x6dd6, 0x6dd7, 0x6dd8, 0x6dd9, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddd, 0x6dde, 0x6ddf, 0x6de0, 0x6de1, 0x6de2, 0x6de3, 0x6de4, 0x6de5, 0x6de6, 0x6de7, 0x6de8, 0x6de9, 0x6dea, 0x6deb, 0x6dec, 0x6ded, 0x6dee, 0x6def, 0x6df0, 0x6df1, 0x6df2, 0x6df3, 0x6df4, 0x6df5, 0x6df6, 0x6df7, 0x6df8, 0x6df9, 0x6dfa, 0x6dfb, 0x6dfc, 0x6dfd, 0x6dfe, 0x6dff, 0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e05, 0x6e06, 0x6e07, /* 0x6e00 */ 0x6e08, 0x6e09, 0x6e0a, 0x6e0b, 0x6e0c, 0x6e0d, 0x6e0e, 0x6e0f, 0x6e10, 0x6e11, 0x6e12, 0x6e13, 0x6e14, 0x6e15, 0x6e16, 0x6e17, 0x6e18, 0x6e19, 0x6e1a, 0x6e1b, 0x6e1c, 0x6e1d, 0x6e1e, 0x6e1f, 0x6e20, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x6e25, 0x6e26, 0x6e27, 0x6e28, 0x6e29, 0x6e2a, 0x6e2b, 0x6e2c, 0x6e2d, 0x6e2e, 0x6e2f, 0x6e30, 0x6e31, 0x6e32, 0x6e33, 0x6e34, 0x6e35, 0x6e36, 0x6e37, 0x6e38, 0x6e39, 0x6e3a, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, 0x6e40, 0x6e41, 0x6e42, 0x6e43, 0x6e44, 0x6e45, 0x6e46, 0x6e47, /* 0x6e40 */ 0x6e48, 0x6e49, 0x6e4a, 0x6e4b, 0x6e4c, 0x6e4d, 0x6e4e, 0x6e4f, 0x6e50, 0x6e51, 0x6e52, 0x6e53, 0x6e54, 0x6e55, 0x6e56, 0x6e57, 0x6e58, 0x6e59, 0x6e5a, 0x6e5b, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x6e62, 0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, 0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74, 0x6e75, 0x6e76, 0x6e77, 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6e7e, 0x6e7f, 0x6e80, 0x6e81, 0x6e82, 0x6e83, 0x6e84, 0x6e85, 0x6e86, 0x6e87, /* 0x6e80 */ 0x6e88, 0x6e89, 0x6e8a, 0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e8f, 0x6e90, 0x6e91, 0x6e92, 0x6e93, 0x6e94, 0x6e95, 0x6e96, 0x6e97, 0x6e98, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9c, 0x6e9d, 0x6e9e, 0x6e9f, 0x6ea0, 0x6ea1, 0x6ea2, 0x6ea3, 0x6ea4, 0x6ea5, 0x6ea6, 0x6ea7, 0x6ea8, 0x6ea9, 0x6eaa, 0x6eab, 0x6eac, 0x6ead, 0x6eae, 0x6eaf, 0x6eb0, 0x6eb1, 0x6eb2, 0x6eb3, 0x6eb4, 0x6eb5, 0x6eb6, 0x6eb7, 0x6eb8, 0x6eb9, 0x6eba, 0x6ebb, 0x6ebc, 0x6ebd, 0x6ebe, 0x6ebf, 0x6ec0, 0x6ec1, 0x6ec2, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6, 0x6ec7, /* 0x6ec0 */ 0x6ec8, 0x6ec9, 0x6eca, 0x6ecb, 0x6ecc, 0x6ecd, 0x6ece, 0x6ecf, 0x6ed0, 0x6ed1, 0x6ed2, 0x6ed3, 0x6ed4, 0x6ed5, 0x6ed6, 0x6ed7, 0x6ed8, 0x6ed9, 0x6eda, 0x6edb, 0x6edc, 0x6edd, 0x6ede, 0x6edf, 0x6ee0, 0x6ee1, 0x6ee2, 0x6ee3, 0x6ee4, 0x6ee5, 0x6ee6, 0x6ee7, 0x6ee8, 0x6ee9, 0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef, 0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef4, 0x6ef5, 0x6ef6, 0x6ef7, 0x6ef8, 0x6ef9, 0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, 0x6f00, 0x6f01, 0x6f02, 0x6f03, 0x6f04, 0x6f05, 0x6f06, 0x6f07, /* 0x6f00 */ 0x6f08, 0x6f09, 0x6f0a, 0x6f0b, 0x6f0c, 0x6f0d, 0x6f0e, 0x6f0f, 0x6f10, 0x6f11, 0x6f12, 0x6f13, 0x6f14, 0x6f15, 0x6f16, 0x6f17, 0x6f18, 0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, 0x6f20, 0x6f21, 0x6f22, 0x6f23, 0x6f24, 0x6f25, 0x6f26, 0x6f27, 0x6f28, 0x6f29, 0x6f2a, 0x6f2b, 0x6f2c, 0x6f2d, 0x6f2e, 0x6f2f, 0x6f30, 0x6f31, 0x6f32, 0x6f33, 0x6f34, 0x6f35, 0x6f36, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x6f3b, 0x6f3c, 0x6f3d, 0x6f3e, 0x6f3f, 0x6f40, 0x6f41, 0x6f42, 0x6f43, 0x6f44, 0x6f45, 0x6f46, 0x6f47, /* 0x6f40 */ 0x6f48, 0x6f49, 0x6f4a, 0x6f4b, 0x6f4c, 0x6f4d, 0x6f4e, 0x6f4f, 0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x6f61, 0x6f62, 0x6f63, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x6f6d, 0x6f6e, 0x6f6f, 0x6f70, 0x6f71, 0x6f72, 0x6f73, 0x6f74, 0x6f75, 0x6f76, 0x6f77, 0x6f78, 0x6f79, 0x6f7a, 0x6f7b, 0x6f7c, 0x6f7d, 0x6f7e, 0x6f7f, 0x6f80, 0x6f81, 0x6f82, 0x6f83, 0x6f84, 0x6f85, 0x6f86, 0x6f87, /* 0x6f80 */ 0x6f88, 0x6f89, 0x6f8a, 0x6f8b, 0x6f8c, 0x6f8d, 0x6f8e, 0x6f8f, 0x6f90, 0x6f91, 0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, 0x6f98, 0x6f99, 0x6f9a, 0x6f9b, 0x6f9c, 0x6f9d, 0x6f9e, 0x6f9f, 0x6fa0, 0x6fa1, 0x6fa2, 0x6fa3, 0x6fa4, 0x6fa5, 0x6fa6, 0x6fa7, 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac, 0x6fad, 0x6fae, 0x6faf, 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb3, 0x6fb4, 0x6fb5, 0x6fb6, 0x6fb7, 0x6fb8, 0x6fb9, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf, 0x6fc0, 0x6fc1, 0x6fc2, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, /* 0x6fc0 */ 0x6fc8, 0x6fc9, 0x6fca, 0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, 0x6fd0, 0x6fd1, 0x6fd2, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc, 0x6fdd, 0x6fde, 0x6fdf, 0x6fe0, 0x6fe1, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5, 0x6fe6, 0x6fe7, 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed, 0x6fee, 0x6fef, 0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7, 0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, /* 0x7000 */ 0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f, 0x7010, 0x7011, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701a, 0x701b, 0x701c, 0x701d, 0x701e, 0x701f, 0x7020, 0x7021, 0x7022, 0x7023, 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702a, 0x702b, 0x702c, 0x702d, 0x702e, 0x702f, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x7036, 0x7037, 0x7038, 0x7039, 0x703a, 0x703b, 0x703c, 0x703d, 0x703e, 0x703f, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, /* 0x7040 */ 0x7048, 0x7049, 0x704a, 0x704b, 0x704c, 0x704d, 0x704e, 0x704f, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705e, 0x705f, 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x706b, 0x706c, 0x706d, 0x706e, 0x706f, 0x7070, 0x7071, 0x7072, 0x7073, 0x7074, 0x7075, 0x7076, 0x7077, 0x7078, 0x7079, 0x707a, 0x707b, 0x707c, 0x707d, 0x707e, 0x707f, 0x7080, 0x7081, 0x7082, 0x7083, 0x7084, 0x7085, 0x7086, 0x7087, /* 0x7080 */ 0x7088, 0x7089, 0x708a, 0x708b, 0x708c, 0x708d, 0x708e, 0x708f, 0x7090, 0x7091, 0x7092, 0x7093, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, 0x7099, 0x709a, 0x709b, 0x709c, 0x709d, 0x709e, 0x709f, 0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7, 0x70a8, 0x70a9, 0x70aa, 0x70ab, 0x70ac, 0x70ad, 0x70ae, 0x70af, 0x70b0, 0x70b1, 0x70b2, 0x70b3, 0x70b4, 0x70b5, 0x70b6, 0x70b7, 0x70b8, 0x70b9, 0x70ba, 0x70bb, 0x70bc, 0x70bd, 0x70be, 0x70bf, 0x70c0, 0x70c1, 0x70c2, 0x70c3, 0x70c4, 0x70c5, 0x70c6, 0x70c7, /* 0x70c0 */ 0x70c8, 0x70c9, 0x70ca, 0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, 0x70d0, 0x70d1, 0x70d2, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, 0x70d8, 0x70d9, 0x70da, 0x70db, 0x70dc, 0x70dd, 0x70de, 0x70df, 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e4, 0x70e5, 0x70e6, 0x70e7, 0x70e8, 0x70e9, 0x70ea, 0x70eb, 0x70ec, 0x70ed, 0x70ee, 0x70ef, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70f6, 0x70f7, 0x70f8, 0x70f9, 0x70fa, 0x70fb, 0x70fc, 0x70fd, 0x70fe, 0x70ff, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, /* 0x7100 */ 0x7108, 0x7109, 0x710a, 0x710b, 0x710c, 0x710d, 0x710e, 0x710f, 0x7110, 0x7111, 0x7112, 0x7113, 0x7114, 0x7115, 0x7116, 0x7117, 0x7118, 0x7119, 0x711a, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7126, 0x7127, 0x7128, 0x7129, 0x712a, 0x712b, 0x712c, 0x712d, 0x712e, 0x712f, 0x7130, 0x7131, 0x7132, 0x7133, 0x7134, 0x7135, 0x7136, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e, 0x713f, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7145, 0x7146, 0x7147, /* 0x7140 */ 0x7148, 0x7149, 0x714a, 0x714b, 0x714c, 0x714d, 0x714e, 0x714f, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715a, 0x715b, 0x715c, 0x715d, 0x715e, 0x715f, 0x7160, 0x7161, 0x7162, 0x7163, 0x7164, 0x7165, 0x7166, 0x7167, 0x7168, 0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716e, 0x716f, 0x7170, 0x7171, 0x7172, 0x7173, 0x7174, 0x7175, 0x7176, 0x7177, 0x7178, 0x7179, 0x717a, 0x717b, 0x717c, 0x717d, 0x717e, 0x717f, 0x7180, 0x7181, 0x7182, 0x7183, 0x7184, 0x7185, 0x7186, 0x7187, /* 0x7180 */ 0x7188, 0x7189, 0x718a, 0x718b, 0x718c, 0x718d, 0x718e, 0x718f, 0x7190, 0x7191, 0x7192, 0x7193, 0x7194, 0x7195, 0x7196, 0x7197, 0x7198, 0x7199, 0x719a, 0x719b, 0x719c, 0x719d, 0x719e, 0x719f, 0x71a0, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6, 0x71a7, 0x71a8, 0x71a9, 0x71aa, 0x71ab, 0x71ac, 0x71ad, 0x71ae, 0x71af, 0x71b0, 0x71b1, 0x71b2, 0x71b3, 0x71b4, 0x71b5, 0x71b6, 0x71b7, 0x71b8, 0x71b9, 0x71ba, 0x71bb, 0x71bc, 0x71bd, 0x71be, 0x71bf, 0x71c0, 0x71c1, 0x71c2, 0x71c3, 0x71c4, 0x71c5, 0x71c6, 0x71c7, /* 0x71c0 */ 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc, 0x71cd, 0x71ce, 0x71cf, 0x71d0, 0x71d1, 0x71d2, 0x71d3, 0x71d4, 0x71d5, 0x71d6, 0x71d7, 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd, 0x71de, 0x71df, 0x71e0, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e5, 0x71e6, 0x71e7, 0x71e8, 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ee, 0x71ef, 0x71f0, 0x71f1, 0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, 0x71f8, 0x71f9, 0x71fa, 0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7206, 0x7207, /* 0x7200 */ 0x7208, 0x7209, 0x720a, 0x720b, 0x720c, 0x720d, 0x720e, 0x720f, 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721a, 0x721b, 0x721c, 0x721d, 0x721e, 0x721f, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, 0x722e, 0x722f, 0x7230, 0x7231, 0x7232, 0x7233, 0x7234, 0x7235, 0x7236, 0x7237, 0x7238, 0x7239, 0x723a, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7247, /* 0x7240 */ 0x7248, 0x7249, 0x724a, 0x724b, 0x724c, 0x724d, 0x724e, 0x724f, 0x7250, 0x7251, 0x7252, 0x7253, 0x7254, 0x7255, 0x7256, 0x7257, 0x7258, 0x7259, 0x725a, 0x725b, 0x725c, 0x725d, 0x725e, 0x725f, 0x7260, 0x7261, 0x7262, 0x7263, 0x7264, 0x7265, 0x7266, 0x7267, 0x7268, 0x7269, 0x726a, 0x726b, 0x726c, 0x726d, 0x726e, 0x726f, 0x7270, 0x7271, 0x7272, 0x7273, 0x7274, 0x7275, 0x7276, 0x7277, 0x7278, 0x7279, 0x727a, 0x727b, 0x727c, 0x727d, 0x727e, 0x727f, 0x7280, 0x7281, 0x7282, 0x7283, 0x7284, 0x7285, 0x7286, 0x7287, /* 0x7280 */ 0x7288, 0x7289, 0x728a, 0x728b, 0x728c, 0x728d, 0x728e, 0x728f, 0x7290, 0x7291, 0x7292, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, 0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x729f, 0x72a0, 0x72a1, 0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, 0x72a8, 0x72a9, 0x72aa, 0x72ab, 0x72ac, 0x72ad, 0x72ae, 0x72af, 0x72b0, 0x72b1, 0x72b2, 0x72b3, 0x72b4, 0x72b5, 0x72b6, 0x72b7, 0x72b8, 0x72b9, 0x72ba, 0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, 0x72c0, 0x72c1, 0x72c2, 0x72c3, 0x72c4, 0x72c5, 0x72c6, 0x72c7, /* 0x72c0 */ 0x72c8, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cd, 0x72ce, 0x72cf, 0x72d0, 0x72d1, 0x72d2, 0x72d3, 0x72d4, 0x72d5, 0x72d6, 0x72d7, 0x72d8, 0x72d9, 0x72da, 0x72db, 0x72dc, 0x72dd, 0x72de, 0x72df, 0x72e0, 0x72e1, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6, 0x72e7, 0x72e8, 0x72e9, 0x72ea, 0x72eb, 0x72ec, 0x72ed, 0x72ee, 0x72ef, 0x72f0, 0x72f1, 0x72f2, 0x72f3, 0x72f4, 0x72f5, 0x72f6, 0x72f7, 0x72f8, 0x72f9, 0x72fa, 0x72fb, 0x72fc, 0x72fd, 0x72fe, 0x72ff, 0x7300, 0x7301, 0x7302, 0x7303, 0x7304, 0x7305, 0x7306, 0x7307, /* 0x7300 */ 0x7308, 0x7309, 0x730a, 0x730b, 0x730c, 0x730d, 0x730e, 0x730f, 0x7310, 0x7311, 0x7312, 0x7313, 0x7314, 0x7315, 0x7316, 0x7317, 0x7318, 0x7319, 0x731a, 0x731b, 0x731c, 0x731d, 0x731e, 0x731f, 0x7320, 0x7321, 0x7322, 0x7323, 0x7324, 0x7325, 0x7326, 0x7327, 0x7328, 0x7329, 0x732a, 0x732b, 0x732c, 0x732d, 0x732e, 0x732f, 0x7330, 0x7331, 0x7332, 0x7333, 0x7334, 0x7335, 0x7336, 0x7337, 0x7338, 0x7339, 0x733a, 0x733b, 0x733c, 0x733d, 0x733e, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, /* 0x7340 */ 0x7348, 0x7349, 0x734a, 0x734b, 0x734c, 0x734d, 0x734e, 0x734f, 0x7350, 0x7351, 0x7352, 0x7353, 0x7354, 0x7355, 0x7356, 0x7357, 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x7369, 0x736a, 0x736b, 0x736c, 0x736d, 0x736e, 0x736f, 0x7370, 0x7371, 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737a, 0x737b, 0x737c, 0x737d, 0x737e, 0x737f, 0x7380, 0x7381, 0x7382, 0x7383, 0x7384, 0x7385, 0x7386, 0x7387, /* 0x7380 */ 0x7388, 0x7389, 0x738a, 0x738b, 0x738c, 0x738d, 0x738e, 0x738f, 0x7390, 0x7391, 0x7392, 0x7393, 0x7394, 0x7395, 0x7396, 0x7397, 0x7398, 0x7399, 0x739a, 0x739b, 0x739c, 0x739d, 0x739e, 0x739f, 0x73a0, 0x73a1, 0x73a2, 0x73a3, 0x73a4, 0x73a5, 0x73a6, 0x73a7, 0x73a8, 0x73a9, 0x73aa, 0x73ab, 0x73ac, 0x73ad, 0x73ae, 0x73af, 0x73b0, 0x73b1, 0x73b2, 0x73b3, 0x73b4, 0x73b5, 0x73b6, 0x73b7, 0x73b8, 0x73b9, 0x73ba, 0x73bb, 0x73bc, 0x73bd, 0x73be, 0x73bf, 0x73c0, 0x73c1, 0x73c2, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, /* 0x73c0 */ 0x73c8, 0x73c9, 0x73ca, 0x73cb, 0x73cc, 0x73cd, 0x73ce, 0x73cf, 0x73d0, 0x73d1, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7, 0x73d8, 0x73d9, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73de, 0x73df, 0x73e0, 0x73e1, 0x73e2, 0x73e3, 0x73e4, 0x73e5, 0x73e6, 0x73e7, 0x73e8, 0x73e9, 0x73ea, 0x73eb, 0x73ec, 0x73ed, 0x73ee, 0x73ef, 0x73f0, 0x73f1, 0x73f2, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7, 0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff, 0x7400, 0x7401, 0x7402, 0x7403, 0x7404, 0x7405, 0x7406, 0x7407, /* 0x7400 */ 0x7408, 0x7409, 0x740a, 0x740b, 0x740c, 0x740d, 0x740e, 0x740f, 0x7410, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741a, 0x741b, 0x741c, 0x741d, 0x741e, 0x741f, 0x7420, 0x7421, 0x7422, 0x7423, 0x7424, 0x7425, 0x7426, 0x7427, 0x7428, 0x7429, 0x742a, 0x742b, 0x742c, 0x742d, 0x742e, 0x742f, 0x7430, 0x7431, 0x7432, 0x7433, 0x7434, 0x7435, 0x7436, 0x7437, 0x7438, 0x7439, 0x743a, 0x743b, 0x743c, 0x743d, 0x743e, 0x743f, 0x7440, 0x7441, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, /* 0x7440 */ 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e, 0x744f, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7455, 0x7456, 0x7457, 0x7458, 0x7459, 0x745a, 0x745b, 0x745c, 0x745d, 0x745e, 0x745f, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746d, 0x746e, 0x746f, 0x7470, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7476, 0x7477, 0x7478, 0x7479, 0x747a, 0x747b, 0x747c, 0x747d, 0x747e, 0x747f, 0x7480, 0x7481, 0x7482, 0x7483, 0x7484, 0x7485, 0x7486, 0x7487, /* 0x7480 */ 0x7488, 0x7489, 0x748a, 0x748b, 0x748c, 0x748d, 0x748e, 0x748f, 0x7490, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749a, 0x749b, 0x749c, 0x749d, 0x749e, 0x749f, 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4, 0x74a5, 0x74a6, 0x74a7, 0x74a8, 0x74a9, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af, 0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7, 0x74b8, 0x74b9, 0x74ba, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, 0x74c0, 0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, /* 0x74c0 */ 0x74c8, 0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, 0x74d0, 0x74d1, 0x74d2, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, 0x74d8, 0x74d9, 0x74da, 0x74db, 0x74dc, 0x74dd, 0x74de, 0x74df, 0x74e0, 0x74e1, 0x74e2, 0x74e3, 0x74e4, 0x74e5, 0x74e6, 0x74e7, 0x74e8, 0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74ee, 0x74ef, 0x74f0, 0x74f1, 0x74f2, 0x74f3, 0x74f4, 0x74f5, 0x74f6, 0x74f7, 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd, 0x74fe, 0x74ff, 0x7500, 0x7501, 0x7502, 0x7503, 0x7504, 0x7505, 0x7506, 0x7507, /* 0x7500 */ 0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750d, 0x750e, 0x750f, 0x7510, 0x7511, 0x7512, 0x7513, 0x7514, 0x7515, 0x7516, 0x7517, 0x7518, 0x7519, 0x751a, 0x751b, 0x751c, 0x751d, 0x751e, 0x751f, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7525, 0x7526, 0x7527, 0x7528, 0x7529, 0x752a, 0x752b, 0x752c, 0x752d, 0x752e, 0x752f, 0x7530, 0x7531, 0x7532, 0x7533, 0x7534, 0x7535, 0x7536, 0x7537, 0x7538, 0x7539, 0x753a, 0x753b, 0x753c, 0x753d, 0x753e, 0x753f, 0x7540, 0x7541, 0x7542, 0x7543, 0x7544, 0x7545, 0x7546, 0x7547, /* 0x7540 */ 0x7548, 0x7549, 0x754a, 0x754b, 0x754c, 0x754d, 0x754e, 0x754f, 0x7550, 0x7551, 0x7552, 0x7553, 0x7554, 0x7555, 0x7556, 0x7557, 0x7558, 0x7559, 0x755a, 0x755b, 0x755c, 0x755d, 0x755e, 0x755f, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7565, 0x7566, 0x7567, 0x7568, 0x7569, 0x756a, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, 0x7570, 0x7571, 0x7572, 0x7573, 0x7574, 0x7575, 0x7576, 0x7577, 0x7578, 0x7579, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x757f, 0x7580, 0x7581, 0x7582, 0x7583, 0x7584, 0x7585, 0x7586, 0x7587, /* 0x7580 */ 0x7588, 0x7589, 0x758a, 0x758b, 0x758c, 0x758d, 0x758e, 0x758f, 0x7590, 0x7591, 0x7592, 0x7593, 0x7594, 0x7595, 0x7596, 0x7597, 0x7598, 0x7599, 0x759a, 0x759b, 0x759c, 0x759d, 0x759e, 0x759f, 0x75a0, 0x75a1, 0x75a2, 0x75a3, 0x75a4, 0x75a5, 0x75a6, 0x75a7, 0x75a8, 0x75a9, 0x75aa, 0x75ab, 0x75ac, 0x75ad, 0x75ae, 0x75af, 0x75b0, 0x75b1, 0x75b2, 0x75b3, 0x75b4, 0x75b5, 0x75b6, 0x75b7, 0x75b8, 0x75b9, 0x75ba, 0x75bb, 0x75bc, 0x75bd, 0x75be, 0x75bf, 0x75c0, 0x75c1, 0x75c2, 0x75c3, 0x75c4, 0x75c5, 0x75c6, 0x75c7, /* 0x75c0 */ 0x75c8, 0x75c9, 0x75ca, 0x75cb, 0x75cc, 0x75cd, 0x75ce, 0x75cf, 0x75d0, 0x75d1, 0x75d2, 0x75d3, 0x75d4, 0x75d5, 0x75d6, 0x75d7, 0x75d8, 0x75d9, 0x75da, 0x75db, 0x75dc, 0x75dd, 0x75de, 0x75df, 0x75e0, 0x75e1, 0x75e2, 0x75e3, 0x75e4, 0x75e5, 0x75e6, 0x75e7, 0x75e8, 0x75e9, 0x75ea, 0x75eb, 0x75ec, 0x75ed, 0x75ee, 0x75ef, 0x75f0, 0x75f1, 0x75f2, 0x75f3, 0x75f4, 0x75f5, 0x75f6, 0x75f7, 0x75f8, 0x75f9, 0x75fa, 0x75fb, 0x75fc, 0x75fd, 0x75fe, 0x75ff, 0x7600, 0x7601, 0x7602, 0x7603, 0x7604, 0x7605, 0x7606, 0x7607, /* 0x7600 */ 0x7608, 0x7609, 0x760a, 0x760b, 0x760c, 0x760d, 0x760e, 0x760f, 0x7610, 0x7611, 0x7612, 0x7613, 0x7614, 0x7615, 0x7616, 0x7617, 0x7618, 0x7619, 0x761a, 0x761b, 0x761c, 0x761d, 0x761e, 0x761f, 0x7620, 0x7621, 0x7622, 0x7623, 0x7624, 0x7625, 0x7626, 0x7627, 0x7628, 0x7629, 0x762a, 0x762b, 0x762c, 0x762d, 0x762e, 0x762f, 0x7630, 0x7631, 0x7632, 0x7633, 0x7634, 0x7635, 0x7636, 0x7637, 0x7638, 0x7639, 0x763a, 0x763b, 0x763c, 0x763d, 0x763e, 0x763f, 0x7640, 0x7641, 0x7642, 0x7643, 0x7644, 0x7645, 0x7646, 0x7647, /* 0x7640 */ 0x7648, 0x7649, 0x764a, 0x764b, 0x764c, 0x764d, 0x764e, 0x764f, 0x7650, 0x7651, 0x7652, 0x7653, 0x7654, 0x7655, 0x7656, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x765f, 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, 0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7678, 0x7679, 0x767a, 0x767b, 0x767c, 0x767d, 0x767e, 0x767f, 0x7680, 0x7681, 0x7682, 0x7683, 0x7684, 0x7685, 0x7686, 0x7687, /* 0x7680 */ 0x7688, 0x7689, 0x768a, 0x768b, 0x768c, 0x768d, 0x768e, 0x768f, 0x7690, 0x7691, 0x7692, 0x7693, 0x7694, 0x7695, 0x7696, 0x7697, 0x7698, 0x7699, 0x769a, 0x769b, 0x769c, 0x769d, 0x769e, 0x769f, 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a4, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad, 0x76ae, 0x76af, 0x76b0, 0x76b1, 0x76b2, 0x76b3, 0x76b4, 0x76b5, 0x76b6, 0x76b7, 0x76b8, 0x76b9, 0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76bf, 0x76c0, 0x76c1, 0x76c2, 0x76c3, 0x76c4, 0x76c5, 0x76c6, 0x76c7, /* 0x76c0 */ 0x76c8, 0x76c9, 0x76ca, 0x76cb, 0x76cc, 0x76cd, 0x76ce, 0x76cf, 0x76d0, 0x76d1, 0x76d2, 0x76d3, 0x76d4, 0x76d5, 0x76d6, 0x76d7, 0x76d8, 0x76d9, 0x76da, 0x76db, 0x76dc, 0x76dd, 0x76de, 0x76df, 0x76e0, 0x76e1, 0x76e2, 0x76e3, 0x76e4, 0x76e5, 0x76e6, 0x76e7, 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec, 0x76ed, 0x76ee, 0x76ef, 0x76f0, 0x76f1, 0x76f2, 0x76f3, 0x76f4, 0x76f5, 0x76f6, 0x76f7, 0x76f8, 0x76f9, 0x76fa, 0x76fb, 0x76fc, 0x76fd, 0x76fe, 0x76ff, 0x7700, 0x7701, 0x7702, 0x7703, 0x7704, 0x7705, 0x7706, 0x7707, /* 0x7700 */ 0x7708, 0x7709, 0x770a, 0x770b, 0x770c, 0x770d, 0x770e, 0x770f, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x7719, 0x771a, 0x771b, 0x771c, 0x771d, 0x771e, 0x771f, 0x7720, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, 0x7727, 0x7728, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, 0x772e, 0x772f, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7735, 0x7736, 0x7737, 0x7738, 0x7739, 0x773a, 0x773b, 0x773c, 0x773d, 0x773e, 0x773f, 0x7740, 0x7741, 0x7742, 0x7743, 0x7744, 0x7745, 0x7746, 0x7747, /* 0x7740 */ 0x7748, 0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, 0x7750, 0x7751, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775a, 0x775b, 0x775c, 0x775d, 0x775e, 0x775f, 0x7760, 0x7761, 0x7762, 0x7763, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x7769, 0x776a, 0x776b, 0x776c, 0x776d, 0x776e, 0x776f, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x7779, 0x777a, 0x777b, 0x777c, 0x777d, 0x777e, 0x777f, 0x7780, 0x7781, 0x7782, 0x7783, 0x7784, 0x7785, 0x7786, 0x7787, /* 0x7780 */ 0x7788, 0x7789, 0x778a, 0x778b, 0x778c, 0x778d, 0x778e, 0x778f, 0x7790, 0x7791, 0x7792, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x779f, 0x77a0, 0x77a1, 0x77a2, 0x77a3, 0x77a4, 0x77a5, 0x77a6, 0x77a7, 0x77a8, 0x77a9, 0x77aa, 0x77ab, 0x77ac, 0x77ad, 0x77ae, 0x77af, 0x77b0, 0x77b1, 0x77b2, 0x77b3, 0x77b4, 0x77b5, 0x77b6, 0x77b7, 0x77b8, 0x77b9, 0x77ba, 0x77bb, 0x77bc, 0x77bd, 0x77be, 0x77bf, 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6, 0x77c7, /* 0x77c0 */ 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77cd, 0x77ce, 0x77cf, 0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d7, 0x77d8, 0x77d9, 0x77da, 0x77db, 0x77dc, 0x77dd, 0x77de, 0x77df, 0x77e0, 0x77e1, 0x77e2, 0x77e3, 0x77e4, 0x77e5, 0x77e6, 0x77e7, 0x77e8, 0x77e9, 0x77ea, 0x77eb, 0x77ec, 0x77ed, 0x77ee, 0x77ef, 0x77f0, 0x77f1, 0x77f2, 0x77f3, 0x77f4, 0x77f5, 0x77f6, 0x77f7, 0x77f8, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x77fd, 0x77fe, 0x77ff, 0x7800, 0x7801, 0x7802, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, /* 0x7800 */ 0x7808, 0x7809, 0x780a, 0x780b, 0x780c, 0x780d, 0x780e, 0x780f, 0x7810, 0x7811, 0x7812, 0x7813, 0x7814, 0x7815, 0x7816, 0x7817, 0x7818, 0x7819, 0x781a, 0x781b, 0x781c, 0x781d, 0x781e, 0x781f, 0x7820, 0x7821, 0x7822, 0x7823, 0x7824, 0x7825, 0x7826, 0x7827, 0x7828, 0x7829, 0x782a, 0x782b, 0x782c, 0x782d, 0x782e, 0x782f, 0x7830, 0x7831, 0x7832, 0x7833, 0x7834, 0x7835, 0x7836, 0x7837, 0x7838, 0x7839, 0x783a, 0x783b, 0x783c, 0x783d, 0x783e, 0x783f, 0x7840, 0x7841, 0x7842, 0x7843, 0x7844, 0x7845, 0x7846, 0x7847, /* 0x7840 */ 0x7848, 0x7849, 0x784a, 0x784b, 0x784c, 0x784d, 0x784e, 0x784f, 0x7850, 0x7851, 0x7852, 0x7853, 0x7854, 0x7855, 0x7856, 0x7857, 0x7858, 0x7859, 0x785a, 0x785b, 0x785c, 0x785d, 0x785e, 0x785f, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786a, 0x786b, 0x786c, 0x786d, 0x786e, 0x786f, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7877, 0x7878, 0x7879, 0x787a, 0x787b, 0x787c, 0x787d, 0x787e, 0x787f, 0x7880, 0x7881, 0x7882, 0x7883, 0x7884, 0x7885, 0x7886, 0x7887, /* 0x7880 */ 0x7888, 0x7889, 0x788a, 0x788b, 0x788c, 0x788d, 0x788e, 0x788f, 0x7890, 0x7891, 0x7892, 0x7893, 0x7894, 0x7895, 0x7896, 0x7897, 0x7898, 0x7899, 0x789a, 0x789b, 0x789c, 0x789d, 0x789e, 0x789f, 0x78a0, 0x78a1, 0x78a2, 0x78a3, 0x78a4, 0x78a5, 0x78a6, 0x78a7, 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac, 0x78ad, 0x78ae, 0x78af, 0x78b0, 0x78b1, 0x78b2, 0x78b3, 0x78b4, 0x78b5, 0x78b6, 0x78b7, 0x78b8, 0x78b9, 0x78ba, 0x78bb, 0x78bc, 0x78bd, 0x78be, 0x78bf, 0x78c0, 0x78c1, 0x78c2, 0x78c3, 0x78c4, 0x78c5, 0x78c6, 0x78c7, /* 0x78c0 */ 0x78c8, 0x78c9, 0x78ca, 0x78cb, 0x78cc, 0x78cd, 0x78ce, 0x78cf, 0x78d0, 0x78d1, 0x78d2, 0x78d3, 0x78d4, 0x78d5, 0x78d6, 0x78d7, 0x78d8, 0x78d9, 0x78da, 0x78db, 0x78dc, 0x78dd, 0x78de, 0x78df, 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4, 0x78e5, 0x78e6, 0x78e7, 0x78e8, 0x78e9, 0x78ea, 0x78eb, 0x78ec, 0x78ed, 0x78ee, 0x78ef, 0x78f0, 0x78f1, 0x78f2, 0x78f3, 0x78f4, 0x78f5, 0x78f6, 0x78f7, 0x78f8, 0x78f9, 0x78fa, 0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, 0x7900, 0x7901, 0x7902, 0x7903, 0x7904, 0x7905, 0x7906, 0x7907, /* 0x7900 */ 0x7908, 0x7909, 0x790a, 0x790b, 0x790c, 0x790d, 0x790e, 0x790f, 0x7910, 0x7911, 0x7912, 0x7913, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d, 0x791e, 0x791f, 0x7920, 0x7921, 0x7922, 0x7923, 0x7924, 0x7925, 0x7926, 0x7927, 0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f, 0x7930, 0x7931, 0x7932, 0x7933, 0x7934, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793a, 0x793b, 0x793c, 0x793d, 0x793e, 0x793f, 0x7940, 0x7941, 0x7942, 0x7943, 0x7944, 0x7945, 0x7946, 0x7947, /* 0x7940 */ 0x7948, 0x7949, 0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, 0x7950, 0x7951, 0x7952, 0x7953, 0x7954, 0x7955, 0x7956, 0x7957, 0x7958, 0x7959, 0x795a, 0x795b, 0x795c, 0x795d, 0x795e, 0x795f, 0x7960, 0x7961, 0x7962, 0x7963, 0x7964, 0x7965, 0x7966, 0x7967, 0x7968, 0x7969, 0x796a, 0x796b, 0x796c, 0x796d, 0x796e, 0x796f, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7977, 0x7978, 0x7979, 0x797a, 0x797b, 0x797c, 0x797d, 0x797e, 0x797f, 0x7980, 0x7981, 0x7982, 0x7983, 0x7984, 0x7985, 0x7986, 0x7987, /* 0x7980 */ 0x7988, 0x7989, 0x798a, 0x798b, 0x798c, 0x798d, 0x798e, 0x798f, 0x7990, 0x7991, 0x7992, 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799a, 0x799b, 0x799c, 0x799d, 0x799e, 0x799f, 0x79a0, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, 0x79a6, 0x79a7, 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac, 0x79ad, 0x79ae, 0x79af, 0x79b0, 0x79b1, 0x79b2, 0x79b3, 0x79b4, 0x79b5, 0x79b6, 0x79b7, 0x79b8, 0x79b9, 0x79ba, 0x79bb, 0x79bc, 0x79bd, 0x79be, 0x79bf, 0x79c0, 0x79c1, 0x79c2, 0x79c3, 0x79c4, 0x79c5, 0x79c6, 0x79c7, /* 0x79c0 */ 0x79c8, 0x79c9, 0x79ca, 0x79cb, 0x79cc, 0x79cd, 0x79ce, 0x79cf, 0x79d0, 0x79d1, 0x79d2, 0x79d3, 0x79d4, 0x79d5, 0x79d6, 0x79d7, 0x79d8, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd, 0x79de, 0x79df, 0x79e0, 0x79e1, 0x79e2, 0x79e3, 0x79e4, 0x79e5, 0x79e6, 0x79e7, 0x79e8, 0x79e9, 0x79ea, 0x79eb, 0x79ec, 0x79ed, 0x79ee, 0x79ef, 0x79f0, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7, 0x79f8, 0x79f9, 0x79fa, 0x79fb, 0x79fc, 0x79fd, 0x79fe, 0x79ff, 0x7a00, 0x7a01, 0x7a02, 0x7a03, 0x7a04, 0x7a05, 0x7a06, 0x7a07, /* 0x7a00 */ 0x7a08, 0x7a09, 0x7a0a, 0x7a0b, 0x7a0c, 0x7a0d, 0x7a0e, 0x7a0f, 0x7a10, 0x7a11, 0x7a12, 0x7a13, 0x7a14, 0x7a15, 0x7a16, 0x7a17, 0x7a18, 0x7a19, 0x7a1a, 0x7a1b, 0x7a1c, 0x7a1d, 0x7a1e, 0x7a1f, 0x7a20, 0x7a21, 0x7a22, 0x7a23, 0x7a24, 0x7a25, 0x7a26, 0x7a27, 0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f, 0x7a30, 0x7a31, 0x7a32, 0x7a33, 0x7a34, 0x7a35, 0x7a36, 0x7a37, 0x7a38, 0x7a39, 0x7a3a, 0x7a3b, 0x7a3c, 0x7a3d, 0x7a3e, 0x7a3f, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a46, 0x7a47, /* 0x7a40 */ 0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f, 0x7a50, 0x7a51, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a57, 0x7a58, 0x7a59, 0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, 0x7a60, 0x7a61, 0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, 0x7a68, 0x7a69, 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, 0x7a70, 0x7a71, 0x7a72, 0x7a73, 0x7a74, 0x7a75, 0x7a76, 0x7a77, 0x7a78, 0x7a79, 0x7a7a, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a7f, 0x7a80, 0x7a81, 0x7a82, 0x7a83, 0x7a84, 0x7a85, 0x7a86, 0x7a87, /* 0x7a80 */ 0x7a88, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8d, 0x7a8e, 0x7a8f, 0x7a90, 0x7a91, 0x7a92, 0x7a93, 0x7a94, 0x7a95, 0x7a96, 0x7a97, 0x7a98, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9c, 0x7a9d, 0x7a9e, 0x7a9f, 0x7aa0, 0x7aa1, 0x7aa2, 0x7aa3, 0x7aa4, 0x7aa5, 0x7aa6, 0x7aa7, 0x7aa8, 0x7aa9, 0x7aaa, 0x7aab, 0x7aac, 0x7aad, 0x7aae, 0x7aaf, 0x7ab0, 0x7ab1, 0x7ab2, 0x7ab3, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, 0x7ab8, 0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7abf, 0x7ac0, 0x7ac1, 0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, /* 0x7ac0 */ 0x7ac8, 0x7ac9, 0x7aca, 0x7acb, 0x7acc, 0x7acd, 0x7ace, 0x7acf, 0x7ad0, 0x7ad1, 0x7ad2, 0x7ad3, 0x7ad4, 0x7ad5, 0x7ad6, 0x7ad7, 0x7ad8, 0x7ad9, 0x7ada, 0x7adb, 0x7adc, 0x7add, 0x7ade, 0x7adf, 0x7ae0, 0x7ae1, 0x7ae2, 0x7ae3, 0x7ae4, 0x7ae5, 0x7ae6, 0x7ae7, 0x7ae8, 0x7ae9, 0x7aea, 0x7aeb, 0x7aec, 0x7aed, 0x7aee, 0x7aef, 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4, 0x7af5, 0x7af6, 0x7af7, 0x7af8, 0x7af9, 0x7afa, 0x7afb, 0x7afc, 0x7afd, 0x7afe, 0x7aff, 0x7b00, 0x7b01, 0x7b02, 0x7b03, 0x7b04, 0x7b05, 0x7b06, 0x7b07, /* 0x7b00 */ 0x7b08, 0x7b09, 0x7b0a, 0x7b0b, 0x7b0c, 0x7b0d, 0x7b0e, 0x7b0f, 0x7b10, 0x7b11, 0x7b12, 0x7b13, 0x7b14, 0x7b15, 0x7b16, 0x7b17, 0x7b18, 0x7b19, 0x7b1a, 0x7b1b, 0x7b1c, 0x7b1d, 0x7b1e, 0x7b1f, 0x7b20, 0x7b21, 0x7b22, 0x7b23, 0x7b24, 0x7b25, 0x7b26, 0x7b27, 0x7b28, 0x7b29, 0x7b2a, 0x7b2b, 0x7b2c, 0x7b2d, 0x7b2e, 0x7b2f, 0x7b30, 0x7b31, 0x7b32, 0x7b33, 0x7b34, 0x7b35, 0x7b36, 0x7b37, 0x7b38, 0x7b39, 0x7b3a, 0x7b3b, 0x7b3c, 0x7b3d, 0x7b3e, 0x7b3f, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x7b45, 0x7b46, 0x7b47, /* 0x7b40 */ 0x7b48, 0x7b49, 0x7b4a, 0x7b4b, 0x7b4c, 0x7b4d, 0x7b4e, 0x7b4f, 0x7b50, 0x7b51, 0x7b52, 0x7b53, 0x7b54, 0x7b55, 0x7b56, 0x7b57, 0x7b58, 0x7b59, 0x7b5a, 0x7b5b, 0x7b5c, 0x7b5d, 0x7b5e, 0x7b5f, 0x7b60, 0x7b61, 0x7b62, 0x7b63, 0x7b64, 0x7b65, 0x7b66, 0x7b67, 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d, 0x7b6e, 0x7b6f, 0x7b70, 0x7b71, 0x7b72, 0x7b73, 0x7b74, 0x7b75, 0x7b76, 0x7b77, 0x7b78, 0x7b79, 0x7b7a, 0x7b7b, 0x7b7c, 0x7b7d, 0x7b7e, 0x7b7f, 0x7b80, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b85, 0x7b86, 0x7b87, /* 0x7b80 */ 0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8d, 0x7b8e, 0x7b8f, 0x7b90, 0x7b91, 0x7b92, 0x7b93, 0x7b94, 0x7b95, 0x7b96, 0x7b97, 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9c, 0x7b9d, 0x7b9e, 0x7b9f, 0x7ba0, 0x7ba1, 0x7ba2, 0x7ba3, 0x7ba4, 0x7ba5, 0x7ba6, 0x7ba7, 0x7ba8, 0x7ba9, 0x7baa, 0x7bab, 0x7bac, 0x7bad, 0x7bae, 0x7baf, 0x7bb0, 0x7bb1, 0x7bb2, 0x7bb3, 0x7bb4, 0x7bb5, 0x7bb6, 0x7bb7, 0x7bb8, 0x7bb9, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, 0x7bc0, 0x7bc1, 0x7bc2, 0x7bc3, 0x7bc4, 0x7bc5, 0x7bc6, 0x7bc7, /* 0x7bc0 */ 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcc, 0x7bcd, 0x7bce, 0x7bcf, 0x7bd0, 0x7bd1, 0x7bd2, 0x7bd3, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, 0x7bd8, 0x7bd9, 0x7bda, 0x7bdb, 0x7bdc, 0x7bdd, 0x7bde, 0x7bdf, 0x7be0, 0x7be1, 0x7be2, 0x7be3, 0x7be4, 0x7be5, 0x7be6, 0x7be7, 0x7be8, 0x7be9, 0x7bea, 0x7beb, 0x7bec, 0x7bed, 0x7bee, 0x7bef, 0x7bf0, 0x7bf1, 0x7bf2, 0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf7, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb, 0x7bfc, 0x7bfd, 0x7bfe, 0x7bff, 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05, 0x7c06, 0x7c07, /* 0x7c00 */ 0x7c08, 0x7c09, 0x7c0a, 0x7c0b, 0x7c0c, 0x7c0d, 0x7c0e, 0x7c0f, 0x7c10, 0x7c11, 0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c16, 0x7c17, 0x7c18, 0x7c19, 0x7c1a, 0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c1f, 0x7c20, 0x7c21, 0x7c22, 0x7c23, 0x7c24, 0x7c25, 0x7c26, 0x7c27, 0x7c28, 0x7c29, 0x7c2a, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e, 0x7c2f, 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36, 0x7c37, 0x7c38, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c3f, 0x7c40, 0x7c41, 0x7c42, 0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, /* 0x7c40 */ 0x7c48, 0x7c49, 0x7c4a, 0x7c4b, 0x7c4c, 0x7c4d, 0x7c4e, 0x7c4f, 0x7c50, 0x7c51, 0x7c52, 0x7c53, 0x7c54, 0x7c55, 0x7c56, 0x7c57, 0x7c58, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, 0x7c60, 0x7c61, 0x7c62, 0x7c63, 0x7c64, 0x7c65, 0x7c66, 0x7c67, 0x7c68, 0x7c69, 0x7c6a, 0x7c6b, 0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, 0x7c70, 0x7c71, 0x7c72, 0x7c73, 0x7c74, 0x7c75, 0x7c76, 0x7c77, 0x7c78, 0x7c79, 0x7c7a, 0x7c7b, 0x7c7c, 0x7c7d, 0x7c7e, 0x7c7f, 0x7c80, 0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, /* 0x7c80 */ 0x7c88, 0x7c89, 0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, 0x7c90, 0x7c91, 0x7c92, 0x7c93, 0x7c94, 0x7c95, 0x7c96, 0x7c97, 0x7c98, 0x7c99, 0x7c9a, 0x7c9b, 0x7c9c, 0x7c9d, 0x7c9e, 0x7c9f, 0x7ca0, 0x7ca1, 0x7ca2, 0x7ca3, 0x7ca4, 0x7ca5, 0x7ca6, 0x7ca7, 0x7ca8, 0x7ca9, 0x7caa, 0x7cab, 0x7cac, 0x7cad, 0x7cae, 0x7caf, 0x7cb0, 0x7cb1, 0x7cb2, 0x7cb3, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, 0x7cb8, 0x7cb9, 0x7cba, 0x7cbb, 0x7cbc, 0x7cbd, 0x7cbe, 0x7cbf, 0x7cc0, 0x7cc1, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc5, 0x7cc6, 0x7cc7, /* 0x7cc0 */ 0x7cc8, 0x7cc9, 0x7cca, 0x7ccb, 0x7ccc, 0x7ccd, 0x7cce, 0x7ccf, 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd5, 0x7cd6, 0x7cd7, 0x7cd8, 0x7cd9, 0x7cda, 0x7cdb, 0x7cdc, 0x7cdd, 0x7cde, 0x7cdf, 0x7ce0, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4, 0x7ce5, 0x7ce6, 0x7ce7, 0x7ce8, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced, 0x7cee, 0x7cef, 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6, 0x7cf7, 0x7cf8, 0x7cf9, 0x7cfa, 0x7cfb, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, 0x7d00, 0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, /* 0x7d00 */ 0x7d08, 0x7d09, 0x7d0a, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, 0x7d10, 0x7d11, 0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, 0x7d18, 0x7d19, 0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, 0x7d20, 0x7d21, 0x7d22, 0x7d23, 0x7d24, 0x7d25, 0x7d26, 0x7d27, 0x7d28, 0x7d29, 0x7d2a, 0x7d2b, 0x7d2c, 0x7d2d, 0x7d2e, 0x7d2f, 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36, 0x7d37, 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d3f, 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46, 0x7d47, /* 0x7d40 */ 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e, 0x7d4f, 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56, 0x7d57, 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e, 0x7d5f, 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66, 0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6e, 0x7d6f, 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d77, 0x7d78, 0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, 0x7d80, 0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, /* 0x7d80 */ 0x7d88, 0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, 0x7d90, 0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, 0x7d98, 0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, 0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da6, 0x7da7, 0x7da8, 0x7da9, 0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7dae, 0x7daf, 0x7db0, 0x7db1, 0x7db2, 0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, 0x7db8, 0x7db9, 0x7dba, 0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, 0x7dc0, 0x7dc1, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, /* 0x7dc0 */ 0x7dc8, 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, 0x7dd0, 0x7dd1, 0x7dd2, 0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, 0x7dd8, 0x7dd9, 0x7dda, 0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, 0x7de0, 0x7de1, 0x7de2, 0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, 0x7de8, 0x7de9, 0x7dea, 0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, 0x7df0, 0x7df1, 0x7df2, 0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, 0x7df8, 0x7df9, 0x7dfa, 0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, 0x7e00, 0x7e01, 0x7e02, 0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, /* 0x7e00 */ 0x7e08, 0x7e09, 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, 0x7e10, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0x7e19, 0x7e1a, 0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, 0x7e20, 0x7e21, 0x7e22, 0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, 0x7e28, 0x7e29, 0x7e2a, 0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, 0x7e30, 0x7e31, 0x7e32, 0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, 0x7e38, 0x7e39, 0x7e3a, 0x7e3b, 0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, 0x7e40, 0x7e41, 0x7e42, 0x7e43, 0x7e44, 0x7e45, 0x7e46, 0x7e47, /* 0x7e40 */ 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d, 0x7e4e, 0x7e4f, 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55, 0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d, 0x7e5e, 0x7e5f, 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65, 0x7e66, 0x7e67, 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d, 0x7e6e, 0x7e6f, 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75, 0x7e76, 0x7e77, 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d, 0x7e7e, 0x7e7f, 0x7e80, 0x7e81, 0x7e82, 0x7e83, 0x7e84, 0x7e85, 0x7e86, 0x7e87, /* 0x7e80 */ 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e, 0x7e8f, 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96, 0x7e97, 0x7e98, 0x7e99, 0x7e9a, 0x7e9b, 0x7e9c, 0x7e9d, 0x7e9e, 0x7e9f, 0x7ea0, 0x7ea1, 0x7ea2, 0x7ea3, 0x7ea4, 0x7ea5, 0x7ea6, 0x7ea7, 0x7ea8, 0x7ea9, 0x7eaa, 0x7eab, 0x7eac, 0x7ead, 0x7eae, 0x7eaf, 0x7eb0, 0x7eb1, 0x7eb2, 0x7eb3, 0x7eb4, 0x7eb5, 0x7eb6, 0x7eb7, 0x7eb8, 0x7eb9, 0x7eba, 0x7ebb, 0x7ebc, 0x7ebd, 0x7ebe, 0x7ebf, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec3, 0x7ec4, 0x7ec5, 0x7ec6, 0x7ec7, /* 0x7ec0 */ 0x7ec8, 0x7ec9, 0x7eca, 0x7ecb, 0x7ecc, 0x7ecd, 0x7ece, 0x7ecf, 0x7ed0, 0x7ed1, 0x7ed2, 0x7ed3, 0x7ed4, 0x7ed5, 0x7ed6, 0x7ed7, 0x7ed8, 0x7ed9, 0x7eda, 0x7edb, 0x7edc, 0x7edd, 0x7ede, 0x7edf, 0x7ee0, 0x7ee1, 0x7ee2, 0x7ee3, 0x7ee4, 0x7ee5, 0x7ee6, 0x7ee7, 0x7ee8, 0x7ee9, 0x7eea, 0x7eeb, 0x7eec, 0x7eed, 0x7eee, 0x7eef, 0x7ef0, 0x7ef1, 0x7ef2, 0x7ef3, 0x7ef4, 0x7ef5, 0x7ef6, 0x7ef7, 0x7ef8, 0x7ef9, 0x7efa, 0x7efb, 0x7efc, 0x7efd, 0x7efe, 0x7eff, 0x7f00, 0x7f01, 0x7f02, 0x7f03, 0x7f04, 0x7f05, 0x7f06, 0x7f07, /* 0x7f00 */ 0x7f08, 0x7f09, 0x7f0a, 0x7f0b, 0x7f0c, 0x7f0d, 0x7f0e, 0x7f0f, 0x7f10, 0x7f11, 0x7f12, 0x7f13, 0x7f14, 0x7f15, 0x7f16, 0x7f17, 0x7f18, 0x7f19, 0x7f1a, 0x7f1b, 0x7f1c, 0x7f1d, 0x7f1e, 0x7f1f, 0x7f20, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, 0x7f28, 0x7f29, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2e, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f34, 0x7f35, 0x7f36, 0x7f37, 0x7f38, 0x7f39, 0x7f3a, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f40, 0x7f41, 0x7f42, 0x7f43, 0x7f44, 0x7f45, 0x7f46, 0x7f47, /* 0x7f40 */ 0x7f48, 0x7f49, 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, 0x7f50, 0x7f51, 0x7f52, 0x7f53, 0x7f54, 0x7f55, 0x7f56, 0x7f57, 0x7f58, 0x7f59, 0x7f5a, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f5f, 0x7f60, 0x7f61, 0x7f62, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f67, 0x7f68, 0x7f69, 0x7f6a, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6e, 0x7f6f, 0x7f70, 0x7f71, 0x7f72, 0x7f73, 0x7f74, 0x7f75, 0x7f76, 0x7f77, 0x7f78, 0x7f79, 0x7f7a, 0x7f7b, 0x7f7c, 0x7f7d, 0x7f7e, 0x7f7f, 0x7f80, 0x7f81, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87, /* 0x7f80 */ 0x7f88, 0x7f89, 0x7f8a, 0x7f8b, 0x7f8c, 0x7f8d, 0x7f8e, 0x7f8f, 0x7f90, 0x7f91, 0x7f92, 0x7f93, 0x7f94, 0x7f95, 0x7f96, 0x7f97, 0x7f98, 0x7f99, 0x7f9a, 0x7f9b, 0x7f9c, 0x7f9d, 0x7f9e, 0x7f9f, 0x7fa0, 0x7fa1, 0x7fa2, 0x7fa3, 0x7fa4, 0x7fa5, 0x7fa6, 0x7fa7, 0x7fa8, 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7faf, 0x7fb0, 0x7fb1, 0x7fb2, 0x7fb3, 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, 0x7fb8, 0x7fb9, 0x7fba, 0x7fbb, 0x7fbc, 0x7fbd, 0x7fbe, 0x7fbf, 0x7fc0, 0x7fc1, 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc5, 0x7fc6, 0x7fc7, /* 0x7fc0 */ 0x7fc8, 0x7fc9, 0x7fca, 0x7fcb, 0x7fcc, 0x7fcd, 0x7fce, 0x7fcf, 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd4, 0x7fd5, 0x7fd6, 0x7fd7, 0x7fd8, 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fdf, 0x7fe0, 0x7fe1, 0x7fe2, 0x7fe3, 0x7fe4, 0x7fe5, 0x7fe6, 0x7fe7, 0x7fe8, 0x7fe9, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fee, 0x7fef, 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffb, 0x7ffc, 0x7ffd, 0x7ffe, 0x7fff, 0x8000, 0x8001, 0x8002, 0x8003, 0x8004, 0x8005, 0x8006, 0x8007, /* 0x8000 */ 0x8008, 0x8009, 0x800a, 0x800b, 0x800c, 0x800d, 0x800e, 0x800f, 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x8016, 0x8017, 0x8018, 0x8019, 0x801a, 0x801b, 0x801c, 0x801d, 0x801e, 0x801f, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x8026, 0x8027, 0x8028, 0x8029, 0x802a, 0x802b, 0x802c, 0x802d, 0x802e, 0x802f, 0x8030, 0x8031, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803a, 0x803b, 0x803c, 0x803d, 0x803e, 0x803f, 0x8040, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x8047, /* 0x8040 */ 0x8048, 0x8049, 0x804a, 0x804b, 0x804c, 0x804d, 0x804e, 0x804f, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057, 0x8058, 0x8059, 0x805a, 0x805b, 0x805c, 0x805d, 0x805e, 0x805f, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x8069, 0x806a, 0x806b, 0x806c, 0x806d, 0x806e, 0x806f, 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d, 0x807e, 0x807f, 0x8080, 0x8081, 0x8082, 0x8083, 0x8084, 0x8085, 0x8086, 0x8087, /* 0x8080 */ 0x8088, 0x8089, 0x808a, 0x808b, 0x808c, 0x808d, 0x808e, 0x808f, 0x8090, 0x8091, 0x8092, 0x8093, 0x8094, 0x8095, 0x8096, 0x8097, 0x8098, 0x8099, 0x809a, 0x809b, 0x809c, 0x809d, 0x809e, 0x809f, 0x80a0, 0x80a1, 0x80a2, 0x80a3, 0x80a4, 0x80a5, 0x80a6, 0x80a7, 0x80a8, 0x80a9, 0x80aa, 0x80ab, 0x80ac, 0x80ad, 0x80ae, 0x80af, 0x80b0, 0x80b1, 0x80b2, 0x80b3, 0x80b4, 0x80b5, 0x80b6, 0x80b7, 0x80b8, 0x80b9, 0x80ba, 0x80bb, 0x80bc, 0x80bd, 0x80be, 0x80bf, 0x80c0, 0x80c1, 0x80c2, 0x80c3, 0x80c4, 0x80c5, 0x80c6, 0x80c7, /* 0x80c0 */ 0x80c8, 0x80c9, 0x80ca, 0x80cb, 0x80cc, 0x80cd, 0x80ce, 0x80cf, 0x80d0, 0x80d1, 0x80d2, 0x80d3, 0x80d4, 0x80d5, 0x80d6, 0x80d7, 0x80d8, 0x80d9, 0x80da, 0x80db, 0x80dc, 0x80dd, 0x80de, 0x80df, 0x80e0, 0x80e1, 0x80e2, 0x80e3, 0x80e4, 0x80e5, 0x80e6, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80eb, 0x80ec, 0x80ed, 0x80ee, 0x80ef, 0x80f0, 0x80f1, 0x80f2, 0x80f3, 0x80f4, 0x80f5, 0x80f6, 0x80f7, 0x80f8, 0x80f9, 0x80fa, 0x80fb, 0x80fc, 0x80fd, 0x80fe, 0x80ff, 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, /* 0x8100 */ 0x8108, 0x8109, 0x810a, 0x810b, 0x810c, 0x810d, 0x810e, 0x810f, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116, 0x8117, 0x8118, 0x8119, 0x811a, 0x811b, 0x811c, 0x811d, 0x811e, 0x811f, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812a, 0x812b, 0x812c, 0x812d, 0x812e, 0x812f, 0x8130, 0x8131, 0x8132, 0x8133, 0x8134, 0x8135, 0x8136, 0x8137, 0x8138, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813e, 0x813f, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, /* 0x8140 */ 0x8148, 0x8149, 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x817f, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, /* 0x8180 */ 0x8188, 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, /* 0x81c0 */ 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x81ff, 0x8200, 0x8201, 0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, /* 0x8200 */ 0x8208, 0x8209, 0x820a, 0x820b, 0x820c, 0x820d, 0x820e, 0x820f, 0x8210, 0x8211, 0x8212, 0x8213, 0x8214, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821a, 0x821b, 0x821c, 0x821d, 0x821e, 0x821f, 0x8220, 0x8221, 0x8222, 0x8223, 0x8224, 0x8225, 0x8226, 0x8227, 0x8228, 0x8229, 0x822a, 0x822b, 0x822c, 0x822d, 0x822e, 0x822f, 0x8230, 0x8231, 0x8232, 0x8233, 0x8234, 0x8235, 0x8236, 0x8237, 0x8238, 0x8239, 0x823a, 0x823b, 0x823c, 0x823d, 0x823e, 0x823f, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, /* 0x8240 */ 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x827f, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, /* 0x8280 */ 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, 0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, /* 0x82c0 */ 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, /* 0x8300 */ 0x8308, 0x8309, 0x830a, 0x830b, 0x830c, 0x830d, 0x830e, 0x830f, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x831a, 0x831b, 0x831c, 0x831d, 0x831e, 0x831f, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832a, 0x832b, 0x832c, 0x832d, 0x832e, 0x832f, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833a, 0x833b, 0x833c, 0x833d, 0x833e, 0x833f, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, /* 0x8340 */ 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e, 0x837f, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, /* 0x8380 */ 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6, 0x83c7, /* 0x83c0 */ 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x83ff, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, /* 0x8400 */ 0x8408, 0x8409, 0x840a, 0x840b, 0x840c, 0x840d, 0x840e, 0x840f, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8418, 0x8419, 0x841a, 0x841b, 0x841c, 0x841d, 0x841e, 0x841f, 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x8425, 0x8426, 0x8427, 0x8428, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d, 0x842e, 0x842f, 0x8430, 0x8431, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8438, 0x8439, 0x843a, 0x843b, 0x843c, 0x843d, 0x843e, 0x843f, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, /* 0x8440 */ 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x847f, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, /* 0x8480 */ 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, /* 0x84c0 */ 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x84ff, 0x8500, 0x8501, 0x8502, 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, /* 0x8500 */ 0x8508, 0x8509, 0x850a, 0x850b, 0x850c, 0x850d, 0x850e, 0x850f, 0x8510, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, 0x8518, 0x8519, 0x851a, 0x851b, 0x851c, 0x851d, 0x851e, 0x851f, 0x8520, 0x8521, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852a, 0x852b, 0x852c, 0x852d, 0x852e, 0x852f, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x8537, 0x8538, 0x8539, 0x853a, 0x853b, 0x853c, 0x853d, 0x853e, 0x853f, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, /* 0x8540 */ 0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x857f, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, /* 0x8580 */ 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, /* 0x85c0 */ 0x85c8, 0x85c9, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa, 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x85ff, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, /* 0x8600 */ 0x8608, 0x8609, 0x860a, 0x860b, 0x860c, 0x860d, 0x860e, 0x860f, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, 0x8615, 0x8616, 0x8617, 0x8618, 0x8619, 0x861a, 0x861b, 0x861c, 0x861d, 0x861e, 0x861f, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8627, 0x8628, 0x8629, 0x862a, 0x862b, 0x862c, 0x862d, 0x862e, 0x862f, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, 0x8639, 0x863a, 0x863b, 0x863c, 0x863d, 0x863e, 0x863f, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, /* 0x8640 */ 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b, 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b, 0x867c, 0x867d, 0x867e, 0x867f, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, /* 0x8680 */ 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, 0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, 0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, /* 0x86c0 */ 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x86ff, 0x8700, 0x8701, 0x8702, 0x8703, 0x8704, 0x8705, 0x8706, 0x8707, /* 0x8700 */ 0x8708, 0x8709, 0x870a, 0x870b, 0x870c, 0x870d, 0x870e, 0x870f, 0x8710, 0x8711, 0x8712, 0x8713, 0x8714, 0x8715, 0x8716, 0x8717, 0x8718, 0x8719, 0x871a, 0x871b, 0x871c, 0x871d, 0x871e, 0x871f, 0x8720, 0x8721, 0x8722, 0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872a, 0x872b, 0x872c, 0x872d, 0x872e, 0x872f, 0x8730, 0x8731, 0x8732, 0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873a, 0x873b, 0x873c, 0x873d, 0x873e, 0x873f, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, /* 0x8740 */ 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, 0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, 0x877e, 0x877f, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, /* 0x8780 */ 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7, /* 0x87c0 */ 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x87ff, 0x8800, 0x8801, 0x8802, 0x8803, 0x8804, 0x8805, 0x8806, 0x8807, /* 0x8800 */ 0x8808, 0x8809, 0x880a, 0x880b, 0x880c, 0x880d, 0x880e, 0x880f, 0x8810, 0x8811, 0x8812, 0x8813, 0x8814, 0x8815, 0x8816, 0x8817, 0x8818, 0x8819, 0x881a, 0x881b, 0x881c, 0x881d, 0x881e, 0x881f, 0x8820, 0x8821, 0x8822, 0x8823, 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882a, 0x882b, 0x882c, 0x882d, 0x882e, 0x882f, 0x8830, 0x8831, 0x8832, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x8839, 0x883a, 0x883b, 0x883c, 0x883d, 0x883e, 0x883f, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, /* 0x8840 */ 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x887f, 0x8880, 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, /* 0x8880 */ 0x8888, 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890, 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, /* 0x88c0 */ 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x88ff, 0x8900, 0x8901, 0x8902, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, /* 0x8900 */ 0x8908, 0x8909, 0x890a, 0x890b, 0x890c, 0x890d, 0x890e, 0x890f, 0x8910, 0x8911, 0x8912, 0x8913, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x8919, 0x891a, 0x891b, 0x891c, 0x891d, 0x891e, 0x891f, 0x8920, 0x8921, 0x8922, 0x8923, 0x8924, 0x8925, 0x8926, 0x8927, 0x8928, 0x8929, 0x892a, 0x892b, 0x892c, 0x892d, 0x892e, 0x892f, 0x8930, 0x8931, 0x8932, 0x8933, 0x8934, 0x8935, 0x8936, 0x8937, 0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f, 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, /* 0x8940 */ 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x897f, 0x8980, 0x8981, 0x8982, 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, /* 0x8980 */ 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, /* 0x89c0 */ 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x89ff, 0x8a00, 0x8a01, 0x8a02, 0x8a03, 0x8a04, 0x8a05, 0x8a06, 0x8a07, /* 0x8a00 */ 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d, 0x8a0e, 0x8a0f, 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d, 0x8a1e, 0x8a1f, 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25, 0x8a26, 0x8a27, 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d, 0x8a2e, 0x8a2f, 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35, 0x8a36, 0x8a37, 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d, 0x8a3e, 0x8a3f, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, /* 0x8a40 */ 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, /* 0x8a80 */ 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, /* 0x8ac0 */ 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8aff, 0x8b00, 0x8b01, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b07, /* 0x8b00 */ 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c, 0x8b0d, 0x8b0e, 0x8b0f, 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14, 0x8b15, 0x8b16, 0x8b17, 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c, 0x8b1d, 0x8b1e, 0x8b1f, 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24, 0x8b25, 0x8b26, 0x8b27, 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d, 0x8b2e, 0x8b2f, 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35, 0x8b36, 0x8b37, 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d, 0x8b3e, 0x8b3f, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b47, /* 0x8b40 */ 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, /* 0x8b80 */ 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, /* 0x8bc0 */ 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, 0x8bff, 0x8c00, 0x8c01, 0x8c02, 0x8c03, 0x8c04, 0x8c05, 0x8c06, 0x8c07, /* 0x8c00 */ 0x8c08, 0x8c09, 0x8c0a, 0x8c0b, 0x8c0c, 0x8c0d, 0x8c0e, 0x8c0f, 0x8c10, 0x8c11, 0x8c12, 0x8c13, 0x8c14, 0x8c15, 0x8c16, 0x8c17, 0x8c18, 0x8c19, 0x8c1a, 0x8c1b, 0x8c1c, 0x8c1d, 0x8c1e, 0x8c1f, 0x8c20, 0x8c21, 0x8c22, 0x8c23, 0x8c24, 0x8c25, 0x8c26, 0x8c27, 0x8c28, 0x8c29, 0x8c2a, 0x8c2b, 0x8c2c, 0x8c2d, 0x8c2e, 0x8c2f, 0x8c30, 0x8c31, 0x8c32, 0x8c33, 0x8c34, 0x8c35, 0x8c36, 0x8c37, 0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f, 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, /* 0x8c40 */ 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c7f, 0x8c80, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, /* 0x8c80 */ 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, /* 0x8cc0 */ 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8cff, 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05, 0x8d06, 0x8d07, /* 0x8d00 */ 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d, 0x8d0e, 0x8d0f, 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, 0x8d16, 0x8d17, 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d1d, 0x8d1e, 0x8d1f, 0x8d20, 0x8d21, 0x8d22, 0x8d23, 0x8d24, 0x8d25, 0x8d26, 0x8d27, 0x8d28, 0x8d29, 0x8d2a, 0x8d2b, 0x8d2c, 0x8d2d, 0x8d2e, 0x8d2f, 0x8d30, 0x8d31, 0x8d32, 0x8d33, 0x8d34, 0x8d35, 0x8d36, 0x8d37, 0x8d38, 0x8d39, 0x8d3a, 0x8d3b, 0x8d3c, 0x8d3d, 0x8d3e, 0x8d3f, 0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, /* 0x8d40 */ 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, 0x8d80, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, /* 0x8d80 */ 0x8d88, 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, /* 0x8dc0 */ 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8dff, 0x8e00, 0x8e01, 0x8e02, 0x8e03, 0x8e04, 0x8e05, 0x8e06, 0x8e07, /* 0x8e00 */ 0x8e08, 0x8e09, 0x8e0a, 0x8e0b, 0x8e0c, 0x8e0d, 0x8e0e, 0x8e0f, 0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e14, 0x8e15, 0x8e16, 0x8e17, 0x8e18, 0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e1d, 0x8e1e, 0x8e1f, 0x8e20, 0x8e21, 0x8e22, 0x8e23, 0x8e24, 0x8e25, 0x8e26, 0x8e27, 0x8e28, 0x8e29, 0x8e2a, 0x8e2b, 0x8e2c, 0x8e2d, 0x8e2e, 0x8e2f, 0x8e30, 0x8e31, 0x8e32, 0x8e33, 0x8e34, 0x8e35, 0x8e36, 0x8e37, 0x8e38, 0x8e39, 0x8e3a, 0x8e3b, 0x8e3c, 0x8e3d, 0x8e3e, 0x8e3f, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, /* 0x8e40 */ 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d, 0x8e7e, 0x8e7f, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, /* 0x8e80 */ 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, /* 0x8ec0 */ 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04, 0x8f05, 0x8f06, 0x8f07, /* 0x8f00 */ 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c, 0x8f0d, 0x8f0e, 0x8f0f, 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14, 0x8f15, 0x8f16, 0x8f17, 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c, 0x8f1d, 0x8f1e, 0x8f1f, 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24, 0x8f25, 0x8f26, 0x8f27, 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f2f, 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c, 0x8f3d, 0x8f3e, 0x8f3f, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, /* 0x8f40 */ 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0x8f7f, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, /* 0x8f80 */ 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7, /* 0x8fc0 */ 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, 0x8fff, 0x9000, 0x9001, 0x9002, 0x9003, 0x9004, 0x9005, 0x9006, 0x9007, /* 0x9000 */ 0x9008, 0x9009, 0x900a, 0x900b, 0x900c, 0x900d, 0x900e, 0x900f, 0x9010, 0x9011, 0x9012, 0x9013, 0x9014, 0x9015, 0x9016, 0x9017, 0x9018, 0x9019, 0x901a, 0x901b, 0x901c, 0x901d, 0x901e, 0x901f, 0x9020, 0x9021, 0x9022, 0x9023, 0x9024, 0x9025, 0x9026, 0x9027, 0x9028, 0x9029, 0x902a, 0x902b, 0x902c, 0x902d, 0x902e, 0x902f, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9035, 0x9036, 0x9037, 0x9038, 0x9039, 0x903a, 0x903b, 0x903c, 0x903d, 0x903e, 0x903f, 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, /* 0x9040 */ 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x907f, 0x9080, 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, /* 0x9080 */ 0x9088, 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, /* 0x90c0 */ 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x90ff, 0x9100, 0x9101, 0x9102, 0x9103, 0x9104, 0x9105, 0x9106, 0x9107, /* 0x9100 */ 0x9108, 0x9109, 0x910a, 0x910b, 0x910c, 0x910d, 0x910e, 0x910f, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x9119, 0x911a, 0x911b, 0x911c, 0x911d, 0x911e, 0x911f, 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x912f, 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x9139, 0x913a, 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, /* 0x9140 */ 0x9148, 0x9149, 0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x917f, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0x9187, /* 0x9180 */ 0x9188, 0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, /* 0x91c0 */ 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x91ff, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, /* 0x9200 */ 0x9208, 0x9209, 0x920a, 0x920b, 0x920c, 0x920d, 0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921a, 0x921b, 0x921c, 0x921d, 0x921e, 0x921f, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d, 0x922e, 0x922f, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d, 0x923e, 0x923f, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247, /* 0x9240 */ 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x927f, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, /* 0x9280 */ 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, /* 0x92c0 */ 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, /* 0x9300 */ 0x9308, 0x9309, 0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933a, 0x933b, 0x933c, 0x933d, 0x933e, 0x933f, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, /* 0x9340 */ 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x937f, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, /* 0x9380 */ 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, /* 0x93c0 */ 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x93ff, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, /* 0x9400 */ 0x9408, 0x9409, 0x940a, 0x940b, 0x940c, 0x940d, 0x940e, 0x940f, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941a, 0x941b, 0x941c, 0x941d, 0x941e, 0x941f, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942a, 0x942b, 0x942c, 0x942d, 0x942e, 0x942f, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943a, 0x943b, 0x943c, 0x943d, 0x943e, 0x943f, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, /* 0x9440 */ 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x947f, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, /* 0x9480 */ 0x9488, 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0, 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, /* 0x94c0 */ 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x94ff, 0x9500, 0x9501, 0x9502, 0x9503, 0x9504, 0x9505, 0x9506, 0x9507, /* 0x9500 */ 0x9508, 0x9509, 0x950a, 0x950b, 0x950c, 0x950d, 0x950e, 0x950f, 0x9510, 0x9511, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9517, 0x9518, 0x9519, 0x951a, 0x951b, 0x951c, 0x951d, 0x951e, 0x951f, 0x9520, 0x9521, 0x9522, 0x9523, 0x9524, 0x9525, 0x9526, 0x9527, 0x9528, 0x9529, 0x952a, 0x952b, 0x952c, 0x952d, 0x952e, 0x952f, 0x9530, 0x9531, 0x9532, 0x9533, 0x9534, 0x9535, 0x9536, 0x9537, 0x9538, 0x9539, 0x953a, 0x953b, 0x953c, 0x953d, 0x953e, 0x953f, 0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, /* 0x9540 */ 0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x957f, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, /* 0x9580 */ 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, /* 0x95c0 */ 0x95c8, 0x95c9, 0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x95ff, 0x9600, 0x9601, 0x9602, 0x9603, 0x9604, 0x9605, 0x9606, 0x9607, /* 0x9600 */ 0x9608, 0x9609, 0x960a, 0x960b, 0x960c, 0x960d, 0x960e, 0x960f, 0x9610, 0x9611, 0x9612, 0x9613, 0x9614, 0x9615, 0x9616, 0x9617, 0x9618, 0x9619, 0x961a, 0x961b, 0x961c, 0x961d, 0x961e, 0x961f, 0x9620, 0x9621, 0x9622, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962a, 0x962b, 0x962c, 0x962d, 0x962e, 0x962f, 0x9630, 0x9631, 0x9632, 0x9633, 0x9634, 0x9635, 0x9636, 0x9637, 0x9638, 0x9639, 0x963a, 0x963b, 0x963c, 0x963d, 0x963e, 0x963f, 0x9640, 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, /* 0x9640 */ 0x9648, 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b, 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, /* 0x9680 */ 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, /* 0x96c0 */ 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x96ff, 0x9700, 0x9701, 0x9702, 0x9703, 0x9704, 0x9705, 0x9706, 0x9707, /* 0x9700 */ 0x9708, 0x9709, 0x970a, 0x970b, 0x970c, 0x970d, 0x970e, 0x970f, 0x9710, 0x9711, 0x9712, 0x9713, 0x9714, 0x9715, 0x9716, 0x9717, 0x9718, 0x9719, 0x971a, 0x971b, 0x971c, 0x971d, 0x971e, 0x971f, 0x9720, 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, 0x9729, 0x972a, 0x972b, 0x972c, 0x972d, 0x972e, 0x972f, 0x9730, 0x9731, 0x9732, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x9738, 0x9739, 0x973a, 0x973b, 0x973c, 0x973d, 0x973e, 0x973f, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, /* 0x9740 */ 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, 0x977e, 0x977f, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, /* 0x9780 */ 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, 0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, /* 0x97c0 */ 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x97ff, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, /* 0x9800 */ 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e, 0x980f, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e, 0x981f, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e, 0x982f, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e, 0x983f, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, /* 0x9840 */ 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x987f, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, /* 0x9880 */ 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, /* 0x98c0 */ 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, /* 0x9900 */ 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990d, 0x990e, 0x990f, 0x9910, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, 0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, 0x992a, 0x992b, 0x992c, 0x992d, 0x992e, 0x992f, 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993a, 0x993b, 0x993c, 0x993d, 0x993e, 0x993f, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, /* 0x9940 */ 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x997f, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, /* 0x9980 */ 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, /* 0x99c0 */ 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, 0x9a00, 0x9a01, 0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, /* 0x9a00 */ 0x9a08, 0x9a09, 0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, 0x9a10, 0x9a11, 0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, 0x9a18, 0x9a19, 0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, 0x9a20, 0x9a21, 0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, 0x9a28, 0x9a29, 0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, 0x9a30, 0x9a31, 0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, 0x9a38, 0x9a39, 0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, /* 0x9a40 */ 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e, 0x9a7f, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0x9a86, 0x9a87, /* 0x9a80 */ 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, /* 0x9ac0 */ 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b03, 0x9b04, 0x9b05, 0x9b06, 0x9b07, /* 0x9b00 */ 0x9b08, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b0f, 0x9b10, 0x9b11, 0x9b12, 0x9b13, 0x9b14, 0x9b15, 0x9b16, 0x9b17, 0x9b18, 0x9b19, 0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b1f, 0x9b20, 0x9b21, 0x9b22, 0x9b23, 0x9b24, 0x9b25, 0x9b26, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2b, 0x9b2c, 0x9b2d, 0x9b2e, 0x9b2f, 0x9b30, 0x9b31, 0x9b32, 0x9b33, 0x9b34, 0x9b35, 0x9b36, 0x9b37, 0x9b38, 0x9b39, 0x9b3a, 0x9b3b, 0x9b3c, 0x9b3d, 0x9b3e, 0x9b3f, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, /* 0x9b40 */ 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, /* 0x9b80 */ 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, /* 0x9bc0 */ 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, 0x9c00, 0x9c01, 0x9c02, 0x9c03, 0x9c04, 0x9c05, 0x9c06, 0x9c07, /* 0x9c00 */ 0x9c08, 0x9c09, 0x9c0a, 0x9c0b, 0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, 0x9c10, 0x9c11, 0x9c12, 0x9c13, 0x9c14, 0x9c15, 0x9c16, 0x9c17, 0x9c18, 0x9c19, 0x9c1a, 0x9c1b, 0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0x9c23, 0x9c24, 0x9c25, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c2b, 0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, 0x9c30, 0x9c31, 0x9c32, 0x9c33, 0x9c34, 0x9c35, 0x9c36, 0x9c37, 0x9c38, 0x9c39, 0x9c3a, 0x9c3b, 0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, /* 0x9c40 */ 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c7f, 0x9c80, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, /* 0x9c80 */ 0x9c88, 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, /* 0x9cc0 */ 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x9d00, 0x9d01, 0x9d02, 0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, /* 0x9d00 */ 0x9d08, 0x9d09, 0x9d0a, 0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, 0x9d10, 0x9d11, 0x9d12, 0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, 0x9d18, 0x9d19, 0x9d1a, 0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, 0x9d20, 0x9d21, 0x9d22, 0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, 0x9d28, 0x9d29, 0x9d2a, 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d31, 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, 0x9d38, 0x9d39, 0x9d3a, 0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, 0x9d40, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, /* 0x9d40 */ 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, /* 0x9d80 */ 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, /* 0x9dc0 */ 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, 0x9e00, 0x9e01, 0x9e02, 0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, /* 0x9e00 */ 0x9e08, 0x9e09, 0x9e0a, 0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, 0x9e10, 0x9e11, 0x9e12, 0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, 0x9e18, 0x9e19, 0x9e1a, 0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e1f, 0x9e20, 0x9e21, 0x9e22, 0x9e23, 0x9e24, 0x9e25, 0x9e26, 0x9e27, 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e2d, 0x9e2e, 0x9e2f, 0x9e30, 0x9e31, 0x9e32, 0x9e33, 0x9e34, 0x9e35, 0x9e36, 0x9e37, 0x9e38, 0x9e39, 0x9e3a, 0x9e3b, 0x9e3c, 0x9e3d, 0x9e3e, 0x9e3f, 0x9e40, 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, /* 0x9e40 */ 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9e7f, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, /* 0x9e80 */ 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, /* 0x9ec0 */ 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0x9efe, 0x9eff, 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06, 0x9f07, /* 0x9f00 */ 0x9f08, 0x9f09, 0x9f0a, 0x9f0b, 0x9f0c, 0x9f0d, 0x9f0e, 0x9f0f, 0x9f10, 0x9f11, 0x9f12, 0x9f13, 0x9f14, 0x9f15, 0x9f16, 0x9f17, 0x9f18, 0x9f19, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d, 0x9f1e, 0x9f1f, 0x9f20, 0x9f21, 0x9f22, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27, 0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2c, 0x9f2d, 0x9f2e, 0x9f2f, 0x9f30, 0x9f31, 0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f37, 0x9f38, 0x9f39, 0x9f3a, 0x9f3b, 0x9f3c, 0x9f3d, 0x9f3e, 0x9f3f, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, /* 0x9f40 */ 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f7f, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, /* 0x9f80 */ 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7, /* 0x9fc0 */ 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0xa001, 0xa002, 0xa003, 0xa004, 0xa005, 0xa006, 0xa007, /* 0xa000 */ 0xa008, 0xa009, 0xa00a, 0xa00b, 0xa00c, 0xa00d, 0xa00e, 0xa00f, 0xa010, 0xa011, 0xa012, 0xa013, 0xa014, 0xa015, 0xa016, 0xa017, 0xa018, 0xa019, 0xa01a, 0xa01b, 0xa01c, 0xa01d, 0xa01e, 0xa01f, 0xa020, 0xa021, 0xa022, 0xa023, 0xa024, 0xa025, 0xa026, 0xa027, 0xa028, 0xa029, 0xa02a, 0xa02b, 0xa02c, 0xa02d, 0xa02e, 0xa02f, 0xa030, 0xa031, 0xa032, 0xa033, 0xa034, 0xa035, 0xa036, 0xa037, 0xa038, 0xa039, 0xa03a, 0xa03b, 0xa03c, 0xa03d, 0xa03e, 0xa03f, 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, /* 0xa040 */ 0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa07f, 0xa080, 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, /* 0xa080 */ 0xa088, 0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090, 0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0, 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, 0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, /* 0xa0c0 */ 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xa0ff, 0xa100, 0xa101, 0xa102, 0xa103, 0xa104, 0xa105, 0xa106, 0xa107, /* 0xa100 */ 0xa108, 0xa109, 0xa10a, 0xa10b, 0xa10c, 0xa10d, 0xa10e, 0xa10f, 0xa110, 0xa111, 0xa112, 0xa113, 0xa114, 0xa115, 0xa116, 0xa117, 0xa118, 0xa119, 0xa11a, 0xa11b, 0xa11c, 0xa11d, 0xa11e, 0xa11f, 0xa120, 0xa121, 0xa122, 0xa123, 0xa124, 0xa125, 0xa126, 0xa127, 0xa128, 0xa129, 0xa12a, 0xa12b, 0xa12c, 0xa12d, 0xa12e, 0xa12f, 0xa130, 0xa131, 0xa132, 0xa133, 0xa134, 0xa135, 0xa136, 0xa137, 0xa138, 0xa139, 0xa13a, 0xa13b, 0xa13c, 0xa13d, 0xa13e, 0xa13f, 0xa140, 0xa141, 0xa142, 0xa143, 0xa144, 0xa145, 0xa146, 0xa147, /* 0xa140 */ 0xa148, 0xa149, 0xa14a, 0xa14b, 0xa14c, 0xa14d, 0xa14e, 0xa14f, 0xa150, 0xa151, 0xa152, 0xa153, 0xa154, 0xa155, 0xa156, 0xa157, 0xa158, 0xa159, 0xa15a, 0xa15b, 0xa15c, 0xa15d, 0xa15e, 0xa15f, 0xa160, 0xa161, 0xa162, 0xa163, 0xa164, 0xa165, 0xa166, 0xa167, 0xa168, 0xa169, 0xa16a, 0xa16b, 0xa16c, 0xa16d, 0xa16e, 0xa16f, 0xa170, 0xa171, 0xa172, 0xa173, 0xa174, 0xa175, 0xa176, 0xa177, 0xa178, 0xa179, 0xa17a, 0xa17b, 0xa17c, 0xa17d, 0xa17e, 0xa17f, 0xa180, 0xa181, 0xa182, 0xa183, 0xa184, 0xa185, 0xa186, 0xa187, /* 0xa180 */ 0xa188, 0xa189, 0xa18a, 0xa18b, 0xa18c, 0xa18d, 0xa18e, 0xa18f, 0xa190, 0xa191, 0xa192, 0xa193, 0xa194, 0xa195, 0xa196, 0xa197, 0xa198, 0xa199, 0xa19a, 0xa19b, 0xa19c, 0xa19d, 0xa19e, 0xa19f, 0xa1a0, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa1a9, 0xa1aa, 0xa1ab, 0xa1ac, 0xa1ad, 0xa1ae, 0xa1af, 0xa1b0, 0xa1b1, 0xa1b2, 0xa1b3, 0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb, 0xa1bc, 0xa1bd, 0xa1be, 0xa1bf, 0xa1c0, 0xa1c1, 0xa1c2, 0xa1c3, 0xa1c4, 0xa1c5, 0xa1c6, 0xa1c7, /* 0xa1c0 */ 0xa1c8, 0xa1c9, 0xa1ca, 0xa1cb, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1cf, 0xa1d0, 0xa1d1, 0xa1d2, 0xa1d3, 0xa1d4, 0xa1d5, 0xa1d6, 0xa1d7, 0xa1d8, 0xa1d9, 0xa1da, 0xa1db, 0xa1dc, 0xa1dd, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa1e3, 0xa1e4, 0xa1e5, 0xa1e6, 0xa1e7, 0xa1e8, 0xa1e9, 0xa1ea, 0xa1eb, 0xa1ec, 0xa1ed, 0xa1ee, 0xa1ef, 0xa1f0, 0xa1f1, 0xa1f2, 0xa1f3, 0xa1f4, 0xa1f5, 0xa1f6, 0xa1f7, 0xa1f8, 0xa1f9, 0xa1fa, 0xa1fb, 0xa1fc, 0xa1fd, 0xa1fe, 0xa1ff, 0xa200, 0xa201, 0xa202, 0xa203, 0xa204, 0xa205, 0xa206, 0xa207, /* 0xa200 */ 0xa208, 0xa209, 0xa20a, 0xa20b, 0xa20c, 0xa20d, 0xa20e, 0xa20f, 0xa210, 0xa211, 0xa212, 0xa213, 0xa214, 0xa215, 0xa216, 0xa217, 0xa218, 0xa219, 0xa21a, 0xa21b, 0xa21c, 0xa21d, 0xa21e, 0xa21f, 0xa220, 0xa221, 0xa222, 0xa223, 0xa224, 0xa225, 0xa226, 0xa227, 0xa228, 0xa229, 0xa22a, 0xa22b, 0xa22c, 0xa22d, 0xa22e, 0xa22f, 0xa230, 0xa231, 0xa232, 0xa233, 0xa234, 0xa235, 0xa236, 0xa237, 0xa238, 0xa239, 0xa23a, 0xa23b, 0xa23c, 0xa23d, 0xa23e, 0xa23f, 0xa240, 0xa241, 0xa242, 0xa243, 0xa244, 0xa245, 0xa246, 0xa247, /* 0xa240 */ 0xa248, 0xa249, 0xa24a, 0xa24b, 0xa24c, 0xa24d, 0xa24e, 0xa24f, 0xa250, 0xa251, 0xa252, 0xa253, 0xa254, 0xa255, 0xa256, 0xa257, 0xa258, 0xa259, 0xa25a, 0xa25b, 0xa25c, 0xa25d, 0xa25e, 0xa25f, 0xa260, 0xa261, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa26a, 0xa26b, 0xa26c, 0xa26d, 0xa26e, 0xa26f, 0xa270, 0xa271, 0xa272, 0xa273, 0xa274, 0xa275, 0xa276, 0xa277, 0xa278, 0xa279, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa27e, 0xa27f, 0xa280, 0xa281, 0xa282, 0xa283, 0xa284, 0xa285, 0xa286, 0xa287, /* 0xa280 */ 0xa288, 0xa289, 0xa28a, 0xa28b, 0xa28c, 0xa28d, 0xa28e, 0xa28f, 0xa290, 0xa291, 0xa292, 0xa293, 0xa294, 0xa295, 0xa296, 0xa297, 0xa298, 0xa299, 0xa29a, 0xa29b, 0xa29c, 0xa29d, 0xa29e, 0xa29f, 0xa2a0, 0xa2a1, 0xa2a2, 0xa2a3, 0xa2a4, 0xa2a5, 0xa2a6, 0xa2a7, 0xa2a8, 0xa2a9, 0xa2aa, 0xa2ab, 0xa2ac, 0xa2ad, 0xa2ae, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, /* 0xa2c0 */ 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xa2cc, 0xa2cd, 0xa2ce, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa2ff, 0xa300, 0xa301, 0xa302, 0xa303, 0xa304, 0xa305, 0xa306, 0xa307, /* 0xa300 */ 0xa308, 0xa309, 0xa30a, 0xa30b, 0xa30c, 0xa30d, 0xa30e, 0xa30f, 0xa310, 0xa311, 0xa312, 0xa313, 0xa314, 0xa315, 0xa316, 0xa317, 0xa318, 0xa319, 0xa31a, 0xa31b, 0xa31c, 0xa31d, 0xa31e, 0xa31f, 0xa320, 0xa321, 0xa322, 0xa323, 0xa324, 0xa325, 0xa326, 0xa327, 0xa328, 0xa329, 0xa32a, 0xa32b, 0xa32c, 0xa32d, 0xa32e, 0xa32f, 0xa330, 0xa331, 0xa332, 0xa333, 0xa334, 0xa335, 0xa336, 0xa337, 0xa338, 0xa339, 0xa33a, 0xa33b, 0xa33c, 0xa33d, 0xa33e, 0xa33f, 0xa340, 0xa341, 0xa342, 0xa343, 0xa344, 0xa345, 0xa346, 0xa347, /* 0xa340 */ 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e, 0xa37f, 0xa380, 0xa381, 0xa382, 0xa383, 0xa384, 0xa385, 0xa386, 0xa387, /* 0xa380 */ 0xa388, 0xa389, 0xa38a, 0xa38b, 0xa38c, 0xa38d, 0xa38e, 0xa38f, 0xa390, 0xa391, 0xa392, 0xa393, 0xa394, 0xa395, 0xa396, 0xa397, 0xa398, 0xa399, 0xa39a, 0xa39b, 0xa39c, 0xa39d, 0xa39e, 0xa39f, 0xa3a0, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf, 0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7, /* 0xa3c0 */ 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf, 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7, 0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa3dc, 0xa3dd, 0xa3de, 0xa3df, 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7, 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef, 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7, 0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa3fe, 0xa3ff, 0xa400, 0xa401, 0xa402, 0xa403, 0xa404, 0xa405, 0xa406, 0xa407, /* 0xa400 */ 0xa408, 0xa409, 0xa40a, 0xa40b, 0xa40c, 0xa40d, 0xa40e, 0xa40f, 0xa410, 0xa411, 0xa412, 0xa413, 0xa414, 0xa415, 0xa416, 0xa417, 0xa418, 0xa419, 0xa41a, 0xa41b, 0xa41c, 0xa41d, 0xa41e, 0xa41f, 0xa420, 0xa421, 0xa422, 0xa423, 0xa424, 0xa425, 0xa426, 0xa427, 0xa428, 0xa429, 0xa42a, 0xa42b, 0xa42c, 0xa42d, 0xa42e, 0xa42f, 0xa430, 0xa431, 0xa432, 0xa433, 0xa434, 0xa435, 0xa436, 0xa437, 0xa438, 0xa439, 0xa43a, 0xa43b, 0xa43c, 0xa43d, 0xa43e, 0xa43f, 0xa440, 0xa441, 0xa442, 0xa443, 0xa444, 0xa445, 0xa446, 0xa447, /* 0xa440 */ 0xa448, 0xa449, 0xa44a, 0xa44b, 0xa44c, 0xa44d, 0xa44e, 0xa44f, 0xa450, 0xa451, 0xa452, 0xa453, 0xa454, 0xa455, 0xa456, 0xa457, 0xa458, 0xa459, 0xa45a, 0xa45b, 0xa45c, 0xa45d, 0xa45e, 0xa45f, 0xa460, 0xa461, 0xa462, 0xa463, 0xa464, 0xa465, 0xa466, 0xa467, 0xa468, 0xa469, 0xa46a, 0xa46b, 0xa46c, 0xa46d, 0xa46e, 0xa46f, 0xa470, 0xa471, 0xa472, 0xa473, 0xa474, 0xa475, 0xa476, 0xa477, 0xa478, 0xa479, 0xa47a, 0xa47b, 0xa47c, 0xa47d, 0xa47e, 0xa47f, 0xa480, 0xa481, 0xa482, 0xa483, 0xa484, 0xa485, 0xa486, 0xa487, /* 0xa480 */ 0xa488, 0xa489, 0xa48a, 0xa48b, 0xa48c, 0x0000, 0x0000, 0x0000, 0xa490, 0xa491, 0xa492, 0xa493, 0xa494, 0xa495, 0xa496, 0xa497, 0xa498, 0xa499, 0xa49a, 0xa49b, 0xa49c, 0xa49d, 0xa49e, 0xa49f, 0xa4a0, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7, 0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af, 0xa4b0, 0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7, 0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf, 0xa4c0, 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0x0000, /* 0xa4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7, 0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df, 0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7, 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef, 0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0xa4f4, 0xa4f5, 0xa4f6, 0xa4f7, 0xa4f8, 0xa4f9, 0xa4fa, 0xa4fb, 0xa4fc, 0xa4fd, 0xa4fe, 0xa4ff, 0xa500, 0xa501, 0xa502, 0xa503, 0xa504, 0xa505, 0xa506, 0xa507, /* 0xa500 */ 0xa508, 0xa509, 0xa50a, 0xa50b, 0xa50c, 0xa50d, 0xa50e, 0xa50f, 0xa510, 0xa511, 0xa512, 0xa513, 0xa514, 0xa515, 0xa516, 0xa517, 0xa518, 0xa519, 0xa51a, 0xa51b, 0xa51c, 0xa51d, 0xa51e, 0xa51f, 0xa520, 0xa521, 0xa522, 0xa523, 0xa524, 0xa525, 0xa526, 0xa527, 0xa528, 0xa529, 0xa52a, 0xa52b, 0xa52c, 0xa52d, 0xa52e, 0xa52f, 0xa530, 0xa531, 0xa532, 0xa533, 0xa534, 0xa535, 0xa536, 0xa537, 0xa538, 0xa539, 0xa53a, 0xa53b, 0xa53c, 0xa53d, 0xa53e, 0xa53f, 0xa540, 0xa541, 0xa542, 0xa543, 0xa544, 0xa545, 0xa546, 0xa547, /* 0xa540 */ 0xa548, 0xa549, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa54e, 0xa54f, 0xa550, 0xa551, 0xa552, 0xa553, 0xa554, 0xa555, 0xa556, 0xa557, 0xa558, 0xa559, 0xa55a, 0xa55b, 0xa55c, 0xa55d, 0xa55e, 0xa55f, 0xa560, 0xa561, 0xa562, 0xa563, 0xa564, 0xa565, 0xa566, 0xa567, 0xa568, 0xa569, 0xa56a, 0xa56b, 0xa56c, 0xa56d, 0xa56e, 0xa56f, 0xa570, 0xa571, 0xa572, 0xa573, 0xa574, 0xa575, 0xa576, 0xa577, 0xa578, 0xa579, 0xa57a, 0xa57b, 0xa57c, 0xa57d, 0xa57e, 0xa57f, 0xa580, 0xa581, 0xa582, 0xa583, 0xa584, 0xa585, 0xa586, 0xa587, /* 0xa580 */ 0xa588, 0xa589, 0xa58a, 0xa58b, 0xa58c, 0xa58d, 0xa58e, 0xa58f, 0xa590, 0xa591, 0xa592, 0xa593, 0xa594, 0xa595, 0xa596, 0xa597, 0xa598, 0xa599, 0xa59a, 0xa59b, 0xa59c, 0xa59d, 0xa59e, 0xa59f, 0xa5a0, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7, 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad, 0xa5ae, 0xa5af, 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7, 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd, 0xa5be, 0xa5bf, 0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7, /* 0xa5c0 */ 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6, 0xa5d7, 0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5de, 0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7, 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef, 0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6, 0xa5f7, 0xa5f8, 0xa5f9, 0xa5fa, 0xa5fb, 0xa5fc, 0xa5fd, 0xa5fe, 0xa5ff, 0xa600, 0xa601, 0xa602, 0xa603, 0xa604, 0xa605, 0xa606, 0xa607, /* 0xa600 */ 0xa608, 0xa609, 0xa60a, 0xa60b, 0xa60c, 0xa60d, 0xa60e, 0xa60f, 0xa610, 0xa611, 0xa612, 0xa613, 0xa614, 0xa615, 0xa616, 0xa617, 0xa618, 0xa619, 0xa61a, 0xa61b, 0xa61c, 0xa61d, 0xa61e, 0xa61f, 0xa620, 0xa621, 0xa622, 0xa623, 0xa624, 0xa625, 0xa626, 0xa627, 0xa628, 0xa629, 0xa62a, 0xa62b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa641, 0xa641, 0xa643, 0xa643, 0xa645, 0xa645, 0xa647, 0xa647, /* 0xa640 */ 0xa649, 0xa649, 0xa64b, 0xa64b, 0xa64d, 0xa64d, 0xa64f, 0xa64f, 0xa651, 0xa651, 0xa653, 0xa653, 0xa655, 0xa655, 0xa657, 0xa657, 0xa659, 0xa659, 0xa65b, 0xa65b, 0xa65d, 0xa65d, 0xa65f, 0xa65f, 0xa661, 0xa661, 0xa663, 0xa663, 0xa665, 0xa665, 0xa667, 0xa667, 0xa669, 0xa669, 0xa66b, 0xa66b, 0xa66d, 0xa66d, 0xa66e, 0xa66f, 0xa670, 0xa671, 0xa672, 0xa673, 0xa674, 0xa675, 0xa676, 0xa677, 0xa678, 0xa679, 0xa67a, 0xa67b, 0xa67c, 0xa67d, 0xa67e, 0xa67f, 0xa681, 0xa681, 0xa683, 0xa683, 0xa685, 0xa685, 0xa687, 0xa687, /* 0xa680 */ 0xa689, 0xa689, 0xa68b, 0xa68b, 0xa68d, 0xa68d, 0xa68f, 0xa68f, 0xa691, 0xa691, 0xa693, 0xa693, 0xa695, 0xa695, 0xa697, 0xa697, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa69f, 0xa6a0, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5, 0xa6a6, 0xa6a7, 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad, 0xa6ae, 0xa6af, 0xa6b0, 0xa6b1, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5, 0xa6b6, 0xa6b7, 0xa6b8, 0xa6b9, 0xa6ba, 0xa6bb, 0xa6bc, 0xa6bd, 0xa6be, 0xa6bf, 0xa6c0, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6, 0xa6c7, /* 0xa6c0 */ 0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce, 0xa6cf, 0xa6d0, 0xa6d1, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6, 0xa6d7, 0xa6d8, 0xa6d9, 0xa6da, 0xa6db, 0xa6dc, 0xa6dd, 0xa6de, 0xa6df, 0xa6e0, 0xa6e1, 0xa6e2, 0xa6e3, 0xa6e4, 0xa6e5, 0xa6e6, 0xa6e7, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0xa6ec, 0xa6ed, 0xa6ee, 0xa6ef, 0xa6f0, 0xa6f1, 0xa6f2, 0xa6f3, 0xa6f4, 0xa6f5, 0xa6f6, 0xa6f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa700, 0xa701, 0xa702, 0xa703, 0xa704, 0xa705, 0xa706, 0xa707, /* 0xa700 */ 0xa708, 0xa709, 0xa70a, 0xa70b, 0xa70c, 0xa70d, 0xa70e, 0xa70f, 0xa710, 0xa711, 0xa712, 0xa713, 0xa714, 0xa715, 0xa716, 0xa717, 0xa718, 0xa719, 0xa71a, 0xa71b, 0xa71c, 0xa71d, 0xa71e, 0xa71f, 0xa720, 0xa721, 0xa723, 0xa723, 0xa725, 0xa725, 0xa727, 0xa727, 0xa729, 0xa729, 0xa72b, 0xa72b, 0xa72d, 0xa72d, 0xa72f, 0xa72f, 0xa730, 0xa731, 0xa733, 0xa733, 0xa735, 0xa735, 0xa737, 0xa737, 0xa739, 0xa739, 0xa73b, 0xa73b, 0xa73d, 0xa73d, 0xa73f, 0xa73f, 0xa741, 0xa741, 0xa743, 0xa743, 0xa745, 0xa745, 0xa747, 0xa747, /* 0xa740 */ 0xa749, 0xa749, 0xa74b, 0xa74b, 0xa74d, 0xa74d, 0xa74f, 0xa74f, 0xa751, 0xa751, 0xa753, 0xa753, 0xa755, 0xa755, 0xa757, 0xa757, 0xa759, 0xa759, 0xa75b, 0xa75b, 0xa75d, 0xa75d, 0xa75f, 0xa75f, 0xa761, 0xa761, 0xa763, 0xa763, 0xa765, 0xa765, 0xa767, 0xa767, 0xa769, 0xa769, 0xa76b, 0xa76b, 0xa76d, 0xa76d, 0xa76f, 0xa76f, 0xa770, 0xa771, 0xa772, 0xa773, 0xa774, 0xa775, 0xa776, 0xa777, 0xa778, 0xa77a, 0xa77a, 0xa77c, 0xa77c, 0x1d79, 0xa77f, 0xa77f, 0xa781, 0xa781, 0xa783, 0xa783, 0xa785, 0xa785, 0xa787, 0xa787, /* 0xa780 */ 0xa788, 0xa789, 0xa78a, 0xa78c, 0xa78c, 0x0265, 0xa78e, 0x0000, 0xa791, 0xa791, 0xa793, 0xa793, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7a1, 0xa7a1, 0xa7a3, 0xa7a3, 0xa7a5, 0xa7a5, 0xa7a7, 0xa7a7, 0xa7a9, 0xa7a9, 0x0266, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7f8, 0xa7f9, 0xa7fa, 0xa7fb, 0xa7fc, 0xa7fd, 0xa7fe, 0xa7ff, 0xa800, 0xa801, 0xa802, 0xa803, 0xa804, 0xa805, 0xa806, 0xa807, /* 0xa800 */ 0xa808, 0xa809, 0xa80a, 0xa80b, 0xa80c, 0xa80d, 0xa80e, 0xa80f, 0xa810, 0xa811, 0xa812, 0xa813, 0xa814, 0xa815, 0xa816, 0xa817, 0xa818, 0xa819, 0xa81a, 0xa81b, 0xa81c, 0xa81d, 0xa81e, 0xa81f, 0xa820, 0xa821, 0xa822, 0xa823, 0xa824, 0xa825, 0xa826, 0xa827, 0xa828, 0xa829, 0xa82a, 0xa82b, 0x0000, 0x0000, 0x0000, 0x0000, 0xa830, 0xa831, 0xa832, 0xa833, 0xa834, 0xa835, 0xa836, 0xa837, 0xa838, 0xa839, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa840, 0xa841, 0xa842, 0xa843, 0xa844, 0xa845, 0xa846, 0xa847, /* 0xa840 */ 0xa848, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, /* 0xa880 */ 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa892, 0xa893, 0xa894, 0xa895, 0xa896, 0xa897, 0xa898, 0xa899, 0xa89a, 0xa89b, 0xa89c, 0xa89d, 0xa89e, 0xa89f, 0xa8a0, 0xa8a1, 0xa8a2, 0xa8a3, 0xa8a4, 0xa8a5, 0xa8a6, 0xa8a7, 0xa8a8, 0xa8a9, 0xa8aa, 0xa8ab, 0xa8ac, 0xa8ad, 0xa8ae, 0xa8af, 0xa8b0, 0xa8b1, 0xa8b2, 0xa8b3, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, 0xa8b8, 0xa8b9, 0xa8ba, 0xa8bb, 0xa8bc, 0xa8bd, 0xa8be, 0xa8bf, 0xa8c0, 0xa8c1, 0xa8c2, 0xa8c3, 0xa8c4, 0x0000, 0x0000, 0x0000, /* 0xa8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ce, 0xa8cf, 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4, 0xa8d5, 0xa8d6, 0xa8d7, 0xa8d8, 0xa8d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7, 0xa8e8, 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, 0xa8ed, 0xa8ee, 0xa8ef, 0xa8f0, 0xa8f1, 0xa8f2, 0xa8f3, 0xa8f4, 0xa8f5, 0xa8f6, 0xa8f7, 0xa8f8, 0xa8f9, 0xa8fa, 0xa8fb, 0x0000, 0x0000, 0x0000, 0x0000, 0xa900, 0xa901, 0xa902, 0xa903, 0xa904, 0xa905, 0xa906, 0xa907, /* 0xa900 */ 0xa908, 0xa909, 0xa90a, 0xa90b, 0xa90c, 0xa90d, 0xa90e, 0xa90f, 0xa910, 0xa911, 0xa912, 0xa913, 0xa914, 0xa915, 0xa916, 0xa917, 0xa918, 0xa919, 0xa91a, 0xa91b, 0xa91c, 0xa91d, 0xa91e, 0xa91f, 0xa920, 0xa921, 0xa922, 0xa923, 0xa924, 0xa925, 0xa926, 0xa927, 0xa928, 0xa929, 0xa92a, 0xa92b, 0xa92c, 0xa92d, 0xa92e, 0xa92f, 0xa930, 0xa931, 0xa932, 0xa933, 0xa934, 0xa935, 0xa936, 0xa937, 0xa938, 0xa939, 0xa93a, 0xa93b, 0xa93c, 0xa93d, 0xa93e, 0xa93f, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, 0xa947, /* 0xa940 */ 0xa948, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa95f, 0xa960, 0xa961, 0xa962, 0xa963, 0xa964, 0xa965, 0xa966, 0xa967, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, 0x0000, 0x0000, 0x0000, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, /* 0xa980 */ 0xa988, 0xa989, 0xa98a, 0xa98b, 0xa98c, 0xa98d, 0xa98e, 0xa98f, 0xa990, 0xa991, 0xa992, 0xa993, 0xa994, 0xa995, 0xa996, 0xa997, 0xa998, 0xa999, 0xa99a, 0xa99b, 0xa99c, 0xa99d, 0xa99e, 0xa99f, 0xa9a0, 0xa9a1, 0xa9a2, 0xa9a3, 0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, 0xa9a8, 0xa9a9, 0xa9aa, 0xa9ab, 0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, 0xa9b0, 0xa9b1, 0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9c1, 0xa9c2, 0xa9c3, 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, /* 0xa9c0 */ 0xa9c8, 0xa9c9, 0xa9ca, 0xa9cb, 0xa9cc, 0xa9cd, 0x0000, 0xa9cf, 0xa9d0, 0xa9d1, 0xa9d2, 0xa9d3, 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d9, 0x0000, 0x0000, 0x0000, 0x0000, 0xa9de, 0xa9df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa00, 0xaa01, 0xaa02, 0xaa03, 0xaa04, 0xaa05, 0xaa06, 0xaa07, /* 0xaa00 */ 0xaa08, 0xaa09, 0xaa0a, 0xaa0b, 0xaa0c, 0xaa0d, 0xaa0e, 0xaa0f, 0xaa10, 0xaa11, 0xaa12, 0xaa13, 0xaa14, 0xaa15, 0xaa16, 0xaa17, 0xaa18, 0xaa19, 0xaa1a, 0xaa1b, 0xaa1c, 0xaa1d, 0xaa1e, 0xaa1f, 0xaa20, 0xaa21, 0xaa22, 0xaa23, 0xaa24, 0xaa25, 0xaa26, 0xaa27, 0xaa28, 0xaa29, 0xaa2a, 0xaa2b, 0xaa2c, 0xaa2d, 0xaa2e, 0xaa2f, 0xaa30, 0xaa31, 0xaa32, 0xaa33, 0xaa34, 0xaa35, 0xaa36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa40, 0xaa41, 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, /* 0xaa40 */ 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0x0000, 0x0000, 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59, 0x0000, 0x0000, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0x0000, 0x0000, 0x0000, 0x0000, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, /* 0xaa80 */ 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xaaa1, 0xaaa2, 0xaaa3, 0xaaa4, 0xaaa5, 0xaaa6, 0xaaa7, 0xaaa8, 0xaaa9, 0xaaaa, 0xaaab, 0xaaac, 0xaaad, 0xaaae, 0xaaaf, 0xaab0, 0xaab1, 0xaab2, 0xaab3, 0xaab4, 0xaab5, 0xaab6, 0xaab7, 0xaab8, 0xaab9, 0xaaba, 0xaabb, 0xaabc, 0xaabd, 0xaabe, 0xaabf, 0xaac0, 0xaac1, 0xaac2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaadb, 0xaadc, 0xaadd, 0xaade, 0xaadf, 0xaae0, 0xaae1, 0xaae2, 0xaae3, 0xaae4, 0xaae5, 0xaae6, 0xaae7, 0xaae8, 0xaae9, 0xaaea, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef, 0xaaf0, 0xaaf1, 0xaaf2, 0xaaf3, 0xaaf4, 0xaaf5, 0xaaf6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xab01, 0xab02, 0xab03, 0xab04, 0xab05, 0xab06, 0x0000, /* 0xab00 */ 0x0000, 0xab09, 0xab0a, 0xab0b, 0xab0c, 0xab0d, 0xab0e, 0x0000, 0x0000, 0xab11, 0xab12, 0xab13, 0xab14, 0xab15, 0xab16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xab20, 0xab21, 0xab22, 0xab23, 0xab24, 0xab25, 0xab26, 0x0000, 0xab28, 0xab29, 0xab2a, 0xab2b, 0xab2c, 0xab2d, 0xab2e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xab40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xab80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xabc0, 0xabc1, 0xabc2, 0xabc3, 0xabc4, 0xabc5, 0xabc6, 0xabc7, /* 0xabc0 */ 0xabc8, 0xabc9, 0xabca, 0xabcb, 0xabcc, 0xabcd, 0xabce, 0xabcf, 0xabd0, 0xabd1, 0xabd2, 0xabd3, 0xabd4, 0xabd5, 0xabd6, 0xabd7, 0xabd8, 0xabd9, 0xabda, 0xabdb, 0xabdc, 0xabdd, 0xabde, 0xabdf, 0xabe0, 0xabe1, 0xabe2, 0xabe3, 0xabe4, 0xabe5, 0xabe6, 0xabe7, 0xabe8, 0xabe9, 0xabea, 0xabeb, 0xabec, 0xabed, 0x0000, 0x0000, 0xabf0, 0xabf1, 0xabf2, 0xabf3, 0xabf4, 0xabf5, 0xabf6, 0xabf7, 0xabf8, 0xabf9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac00, 0xac01, 0xac02, 0xac03, 0xac04, 0xac05, 0xac06, 0xac07, /* 0xac00 */ 0xac08, 0xac09, 0xac0a, 0xac0b, 0xac0c, 0xac0d, 0xac0e, 0xac0f, 0xac10, 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac18, 0xac19, 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac1e, 0xac1f, 0xac20, 0xac21, 0xac22, 0xac23, 0xac24, 0xac25, 0xac26, 0xac27, 0xac28, 0xac29, 0xac2a, 0xac2b, 0xac2c, 0xac2d, 0xac2e, 0xac2f, 0xac30, 0xac31, 0xac32, 0xac33, 0xac34, 0xac35, 0xac36, 0xac37, 0xac38, 0xac39, 0xac3a, 0xac3b, 0xac3c, 0xac3d, 0xac3e, 0xac3f, 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, /* 0xac40 */ 0xac48, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac7f, 0xac80, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, /* 0xac80 */ 0xac88, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xaca1, 0xaca2, 0xaca3, 0xaca4, 0xaca5, 0xaca6, 0xaca7, 0xaca8, 0xaca9, 0xacaa, 0xacab, 0xacac, 0xacad, 0xacae, 0xacaf, 0xacb0, 0xacb1, 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, 0xacb8, 0xacb9, 0xacba, 0xacbb, 0xacbc, 0xacbd, 0xacbe, 0xacbf, 0xacc0, 0xacc1, 0xacc2, 0xacc3, 0xacc4, 0xacc5, 0xacc6, 0xacc7, /* 0xacc0 */ 0xacc8, 0xacc9, 0xacca, 0xaccb, 0xaccc, 0xaccd, 0xacce, 0xaccf, 0xacd0, 0xacd1, 0xacd2, 0xacd3, 0xacd4, 0xacd5, 0xacd6, 0xacd7, 0xacd8, 0xacd9, 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, 0xace0, 0xace1, 0xace2, 0xace3, 0xace4, 0xace5, 0xace6, 0xace7, 0xace8, 0xace9, 0xacea, 0xaceb, 0xacec, 0xaced, 0xacee, 0xacef, 0xacf0, 0xacf1, 0xacf2, 0xacf3, 0xacf4, 0xacf5, 0xacf6, 0xacf7, 0xacf8, 0xacf9, 0xacfa, 0xacfb, 0xacfc, 0xacfd, 0xacfe, 0xacff, 0xad00, 0xad01, 0xad02, 0xad03, 0xad04, 0xad05, 0xad06, 0xad07, /* 0xad00 */ 0xad08, 0xad09, 0xad0a, 0xad0b, 0xad0c, 0xad0d, 0xad0e, 0xad0f, 0xad10, 0xad11, 0xad12, 0xad13, 0xad14, 0xad15, 0xad16, 0xad17, 0xad18, 0xad19, 0xad1a, 0xad1b, 0xad1c, 0xad1d, 0xad1e, 0xad1f, 0xad20, 0xad21, 0xad22, 0xad23, 0xad24, 0xad25, 0xad26, 0xad27, 0xad28, 0xad29, 0xad2a, 0xad2b, 0xad2c, 0xad2d, 0xad2e, 0xad2f, 0xad30, 0xad31, 0xad32, 0xad33, 0xad34, 0xad35, 0xad36, 0xad37, 0xad38, 0xad39, 0xad3a, 0xad3b, 0xad3c, 0xad3d, 0xad3e, 0xad3f, 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, /* 0xad40 */ 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad7f, 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, /* 0xad80 */ 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xada1, 0xada2, 0xada3, 0xada4, 0xada5, 0xada6, 0xada7, 0xada8, 0xada9, 0xadaa, 0xadab, 0xadac, 0xadad, 0xadae, 0xadaf, 0xadb0, 0xadb1, 0xadb2, 0xadb3, 0xadb4, 0xadb5, 0xadb6, 0xadb7, 0xadb8, 0xadb9, 0xadba, 0xadbb, 0xadbc, 0xadbd, 0xadbe, 0xadbf, 0xadc0, 0xadc1, 0xadc2, 0xadc3, 0xadc4, 0xadc5, 0xadc6, 0xadc7, /* 0xadc0 */ 0xadc8, 0xadc9, 0xadca, 0xadcb, 0xadcc, 0xadcd, 0xadce, 0xadcf, 0xadd0, 0xadd1, 0xadd2, 0xadd3, 0xadd4, 0xadd5, 0xadd6, 0xadd7, 0xadd8, 0xadd9, 0xadda, 0xaddb, 0xaddc, 0xaddd, 0xadde, 0xaddf, 0xade0, 0xade1, 0xade2, 0xade3, 0xade4, 0xade5, 0xade6, 0xade7, 0xade8, 0xade9, 0xadea, 0xadeb, 0xadec, 0xaded, 0xadee, 0xadef, 0xadf0, 0xadf1, 0xadf2, 0xadf3, 0xadf4, 0xadf5, 0xadf6, 0xadf7, 0xadf8, 0xadf9, 0xadfa, 0xadfb, 0xadfc, 0xadfd, 0xadfe, 0xadff, 0xae00, 0xae01, 0xae02, 0xae03, 0xae04, 0xae05, 0xae06, 0xae07, /* 0xae00 */ 0xae08, 0xae09, 0xae0a, 0xae0b, 0xae0c, 0xae0d, 0xae0e, 0xae0f, 0xae10, 0xae11, 0xae12, 0xae13, 0xae14, 0xae15, 0xae16, 0xae17, 0xae18, 0xae19, 0xae1a, 0xae1b, 0xae1c, 0xae1d, 0xae1e, 0xae1f, 0xae20, 0xae21, 0xae22, 0xae23, 0xae24, 0xae25, 0xae26, 0xae27, 0xae28, 0xae29, 0xae2a, 0xae2b, 0xae2c, 0xae2d, 0xae2e, 0xae2f, 0xae30, 0xae31, 0xae32, 0xae33, 0xae34, 0xae35, 0xae36, 0xae37, 0xae38, 0xae39, 0xae3a, 0xae3b, 0xae3c, 0xae3d, 0xae3e, 0xae3f, 0xae40, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, /* 0xae40 */ 0xae48, 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae7f, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, /* 0xae80 */ 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaea1, 0xaea2, 0xaea3, 0xaea4, 0xaea5, 0xaea6, 0xaea7, 0xaea8, 0xaea9, 0xaeaa, 0xaeab, 0xaeac, 0xaead, 0xaeae, 0xaeaf, 0xaeb0, 0xaeb1, 0xaeb2, 0xaeb3, 0xaeb4, 0xaeb5, 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, 0xaebb, 0xaebc, 0xaebd, 0xaebe, 0xaebf, 0xaec0, 0xaec1, 0xaec2, 0xaec3, 0xaec4, 0xaec5, 0xaec6, 0xaec7, /* 0xaec0 */ 0xaec8, 0xaec9, 0xaeca, 0xaecb, 0xaecc, 0xaecd, 0xaece, 0xaecf, 0xaed0, 0xaed1, 0xaed2, 0xaed3, 0xaed4, 0xaed5, 0xaed6, 0xaed7, 0xaed8, 0xaed9, 0xaeda, 0xaedb, 0xaedc, 0xaedd, 0xaede, 0xaedf, 0xaee0, 0xaee1, 0xaee2, 0xaee3, 0xaee4, 0xaee5, 0xaee6, 0xaee7, 0xaee8, 0xaee9, 0xaeea, 0xaeeb, 0xaeec, 0xaeed, 0xaeee, 0xaeef, 0xaef0, 0xaef1, 0xaef2, 0xaef3, 0xaef4, 0xaef5, 0xaef6, 0xaef7, 0xaef8, 0xaef9, 0xaefa, 0xaefb, 0xaefc, 0xaefd, 0xaefe, 0xaeff, 0xaf00, 0xaf01, 0xaf02, 0xaf03, 0xaf04, 0xaf05, 0xaf06, 0xaf07, /* 0xaf00 */ 0xaf08, 0xaf09, 0xaf0a, 0xaf0b, 0xaf0c, 0xaf0d, 0xaf0e, 0xaf0f, 0xaf10, 0xaf11, 0xaf12, 0xaf13, 0xaf14, 0xaf15, 0xaf16, 0xaf17, 0xaf18, 0xaf19, 0xaf1a, 0xaf1b, 0xaf1c, 0xaf1d, 0xaf1e, 0xaf1f, 0xaf20, 0xaf21, 0xaf22, 0xaf23, 0xaf24, 0xaf25, 0xaf26, 0xaf27, 0xaf28, 0xaf29, 0xaf2a, 0xaf2b, 0xaf2c, 0xaf2d, 0xaf2e, 0xaf2f, 0xaf30, 0xaf31, 0xaf32, 0xaf33, 0xaf34, 0xaf35, 0xaf36, 0xaf37, 0xaf38, 0xaf39, 0xaf3a, 0xaf3b, 0xaf3c, 0xaf3d, 0xaf3e, 0xaf3f, 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, /* 0xaf40 */ 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf7f, 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, /* 0xaf80 */ 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xafa1, 0xafa2, 0xafa3, 0xafa4, 0xafa5, 0xafa6, 0xafa7, 0xafa8, 0xafa9, 0xafaa, 0xafab, 0xafac, 0xafad, 0xafae, 0xafaf, 0xafb0, 0xafb1, 0xafb2, 0xafb3, 0xafb4, 0xafb5, 0xafb6, 0xafb7, 0xafb8, 0xafb9, 0xafba, 0xafbb, 0xafbc, 0xafbd, 0xafbe, 0xafbf, 0xafc0, 0xafc1, 0xafc2, 0xafc3, 0xafc4, 0xafc5, 0xafc6, 0xafc7, /* 0xafc0 */ 0xafc8, 0xafc9, 0xafca, 0xafcb, 0xafcc, 0xafcd, 0xafce, 0xafcf, 0xafd0, 0xafd1, 0xafd2, 0xafd3, 0xafd4, 0xafd5, 0xafd6, 0xafd7, 0xafd8, 0xafd9, 0xafda, 0xafdb, 0xafdc, 0xafdd, 0xafde, 0xafdf, 0xafe0, 0xafe1, 0xafe2, 0xafe3, 0xafe4, 0xafe5, 0xafe6, 0xafe7, 0xafe8, 0xafe9, 0xafea, 0xafeb, 0xafec, 0xafed, 0xafee, 0xafef, 0xaff0, 0xaff1, 0xaff2, 0xaff3, 0xaff4, 0xaff5, 0xaff6, 0xaff7, 0xaff8, 0xaff9, 0xaffa, 0xaffb, 0xaffc, 0xaffd, 0xaffe, 0xafff, 0xb000, 0xb001, 0xb002, 0xb003, 0xb004, 0xb005, 0xb006, 0xb007, /* 0xb000 */ 0xb008, 0xb009, 0xb00a, 0xb00b, 0xb00c, 0xb00d, 0xb00e, 0xb00f, 0xb010, 0xb011, 0xb012, 0xb013, 0xb014, 0xb015, 0xb016, 0xb017, 0xb018, 0xb019, 0xb01a, 0xb01b, 0xb01c, 0xb01d, 0xb01e, 0xb01f, 0xb020, 0xb021, 0xb022, 0xb023, 0xb024, 0xb025, 0xb026, 0xb027, 0xb028, 0xb029, 0xb02a, 0xb02b, 0xb02c, 0xb02d, 0xb02e, 0xb02f, 0xb030, 0xb031, 0xb032, 0xb033, 0xb034, 0xb035, 0xb036, 0xb037, 0xb038, 0xb039, 0xb03a, 0xb03b, 0xb03c, 0xb03d, 0xb03e, 0xb03f, 0xb040, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, /* 0xb040 */ 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb07f, 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, /* 0xb080 */ 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0a8, 0xb0a9, 0xb0aa, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, 0xb0b0, 0xb0b1, 0xb0b2, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b6, 0xb0b7, 0xb0b8, 0xb0b9, 0xb0ba, 0xb0bb, 0xb0bc, 0xb0bd, 0xb0be, 0xb0bf, 0xb0c0, 0xb0c1, 0xb0c2, 0xb0c3, 0xb0c4, 0xb0c5, 0xb0c6, 0xb0c7, /* 0xb0c0 */ 0xb0c8, 0xb0c9, 0xb0ca, 0xb0cb, 0xb0cc, 0xb0cd, 0xb0ce, 0xb0cf, 0xb0d0, 0xb0d1, 0xb0d2, 0xb0d3, 0xb0d4, 0xb0d5, 0xb0d6, 0xb0d7, 0xb0d8, 0xb0d9, 0xb0da, 0xb0db, 0xb0dc, 0xb0dd, 0xb0de, 0xb0df, 0xb0e0, 0xb0e1, 0xb0e2, 0xb0e3, 0xb0e4, 0xb0e5, 0xb0e6, 0xb0e7, 0xb0e8, 0xb0e9, 0xb0ea, 0xb0eb, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ef, 0xb0f0, 0xb0f1, 0xb0f2, 0xb0f3, 0xb0f4, 0xb0f5, 0xb0f6, 0xb0f7, 0xb0f8, 0xb0f9, 0xb0fa, 0xb0fb, 0xb0fc, 0xb0fd, 0xb0fe, 0xb0ff, 0xb100, 0xb101, 0xb102, 0xb103, 0xb104, 0xb105, 0xb106, 0xb107, /* 0xb100 */ 0xb108, 0xb109, 0xb10a, 0xb10b, 0xb10c, 0xb10d, 0xb10e, 0xb10f, 0xb110, 0xb111, 0xb112, 0xb113, 0xb114, 0xb115, 0xb116, 0xb117, 0xb118, 0xb119, 0xb11a, 0xb11b, 0xb11c, 0xb11d, 0xb11e, 0xb11f, 0xb120, 0xb121, 0xb122, 0xb123, 0xb124, 0xb125, 0xb126, 0xb127, 0xb128, 0xb129, 0xb12a, 0xb12b, 0xb12c, 0xb12d, 0xb12e, 0xb12f, 0xb130, 0xb131, 0xb132, 0xb133, 0xb134, 0xb135, 0xb136, 0xb137, 0xb138, 0xb139, 0xb13a, 0xb13b, 0xb13c, 0xb13d, 0xb13e, 0xb13f, 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, /* 0xb140 */ 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb17f, 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, /* 0xb180 */ 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb1a1, 0xb1a2, 0xb1a3, 0xb1a4, 0xb1a5, 0xb1a6, 0xb1a7, 0xb1a8, 0xb1a9, 0xb1aa, 0xb1ab, 0xb1ac, 0xb1ad, 0xb1ae, 0xb1af, 0xb1b0, 0xb1b1, 0xb1b2, 0xb1b3, 0xb1b4, 0xb1b5, 0xb1b6, 0xb1b7, 0xb1b8, 0xb1b9, 0xb1ba, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0xb1bf, 0xb1c0, 0xb1c1, 0xb1c2, 0xb1c3, 0xb1c4, 0xb1c5, 0xb1c6, 0xb1c7, /* 0xb1c0 */ 0xb1c8, 0xb1c9, 0xb1ca, 0xb1cb, 0xb1cc, 0xb1cd, 0xb1ce, 0xb1cf, 0xb1d0, 0xb1d1, 0xb1d2, 0xb1d3, 0xb1d4, 0xb1d5, 0xb1d6, 0xb1d7, 0xb1d8, 0xb1d9, 0xb1da, 0xb1db, 0xb1dc, 0xb1dd, 0xb1de, 0xb1df, 0xb1e0, 0xb1e1, 0xb1e2, 0xb1e3, 0xb1e4, 0xb1e5, 0xb1e6, 0xb1e7, 0xb1e8, 0xb1e9, 0xb1ea, 0xb1eb, 0xb1ec, 0xb1ed, 0xb1ee, 0xb1ef, 0xb1f0, 0xb1f1, 0xb1f2, 0xb1f3, 0xb1f4, 0xb1f5, 0xb1f6, 0xb1f7, 0xb1f8, 0xb1f9, 0xb1fa, 0xb1fb, 0xb1fc, 0xb1fd, 0xb1fe, 0xb1ff, 0xb200, 0xb201, 0xb202, 0xb203, 0xb204, 0xb205, 0xb206, 0xb207, /* 0xb200 */ 0xb208, 0xb209, 0xb20a, 0xb20b, 0xb20c, 0xb20d, 0xb20e, 0xb20f, 0xb210, 0xb211, 0xb212, 0xb213, 0xb214, 0xb215, 0xb216, 0xb217, 0xb218, 0xb219, 0xb21a, 0xb21b, 0xb21c, 0xb21d, 0xb21e, 0xb21f, 0xb220, 0xb221, 0xb222, 0xb223, 0xb224, 0xb225, 0xb226, 0xb227, 0xb228, 0xb229, 0xb22a, 0xb22b, 0xb22c, 0xb22d, 0xb22e, 0xb22f, 0xb230, 0xb231, 0xb232, 0xb233, 0xb234, 0xb235, 0xb236, 0xb237, 0xb238, 0xb239, 0xb23a, 0xb23b, 0xb23c, 0xb23d, 0xb23e, 0xb23f, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, /* 0xb240 */ 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb27f, 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, /* 0xb280 */ 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb2a1, 0xb2a2, 0xb2a3, 0xb2a4, 0xb2a5, 0xb2a6, 0xb2a7, 0xb2a8, 0xb2a9, 0xb2aa, 0xb2ab, 0xb2ac, 0xb2ad, 0xb2ae, 0xb2af, 0xb2b0, 0xb2b1, 0xb2b2, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0xb2b9, 0xb2ba, 0xb2bb, 0xb2bc, 0xb2bd, 0xb2be, 0xb2bf, 0xb2c0, 0xb2c1, 0xb2c2, 0xb2c3, 0xb2c4, 0xb2c5, 0xb2c6, 0xb2c7, /* 0xb2c0 */ 0xb2c8, 0xb2c9, 0xb2ca, 0xb2cb, 0xb2cc, 0xb2cd, 0xb2ce, 0xb2cf, 0xb2d0, 0xb2d1, 0xb2d2, 0xb2d3, 0xb2d4, 0xb2d5, 0xb2d6, 0xb2d7, 0xb2d8, 0xb2d9, 0xb2da, 0xb2db, 0xb2dc, 0xb2dd, 0xb2de, 0xb2df, 0xb2e0, 0xb2e1, 0xb2e2, 0xb2e3, 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e7, 0xb2e8, 0xb2e9, 0xb2ea, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, 0xb2f0, 0xb2f1, 0xb2f2, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f6, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa, 0xb2fb, 0xb2fc, 0xb2fd, 0xb2fe, 0xb2ff, 0xb300, 0xb301, 0xb302, 0xb303, 0xb304, 0xb305, 0xb306, 0xb307, /* 0xb300 */ 0xb308, 0xb309, 0xb30a, 0xb30b, 0xb30c, 0xb30d, 0xb30e, 0xb30f, 0xb310, 0xb311, 0xb312, 0xb313, 0xb314, 0xb315, 0xb316, 0xb317, 0xb318, 0xb319, 0xb31a, 0xb31b, 0xb31c, 0xb31d, 0xb31e, 0xb31f, 0xb320, 0xb321, 0xb322, 0xb323, 0xb324, 0xb325, 0xb326, 0xb327, 0xb328, 0xb329, 0xb32a, 0xb32b, 0xb32c, 0xb32d, 0xb32e, 0xb32f, 0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, 0xb336, 0xb337, 0xb338, 0xb339, 0xb33a, 0xb33b, 0xb33c, 0xb33d, 0xb33e, 0xb33f, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, /* 0xb340 */ 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb37f, 0xb380, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, /* 0xb380 */ 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb3a1, 0xb3a2, 0xb3a3, 0xb3a4, 0xb3a5, 0xb3a6, 0xb3a7, 0xb3a8, 0xb3a9, 0xb3aa, 0xb3ab, 0xb3ac, 0xb3ad, 0xb3ae, 0xb3af, 0xb3b0, 0xb3b1, 0xb3b2, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, 0xb3b8, 0xb3b9, 0xb3ba, 0xb3bb, 0xb3bc, 0xb3bd, 0xb3be, 0xb3bf, 0xb3c0, 0xb3c1, 0xb3c2, 0xb3c3, 0xb3c4, 0xb3c5, 0xb3c6, 0xb3c7, /* 0xb3c0 */ 0xb3c8, 0xb3c9, 0xb3ca, 0xb3cb, 0xb3cc, 0xb3cd, 0xb3ce, 0xb3cf, 0xb3d0, 0xb3d1, 0xb3d2, 0xb3d3, 0xb3d4, 0xb3d5, 0xb3d6, 0xb3d7, 0xb3d8, 0xb3d9, 0xb3da, 0xb3db, 0xb3dc, 0xb3dd, 0xb3de, 0xb3df, 0xb3e0, 0xb3e1, 0xb3e2, 0xb3e3, 0xb3e4, 0xb3e5, 0xb3e6, 0xb3e7, 0xb3e8, 0xb3e9, 0xb3ea, 0xb3eb, 0xb3ec, 0xb3ed, 0xb3ee, 0xb3ef, 0xb3f0, 0xb3f1, 0xb3f2, 0xb3f3, 0xb3f4, 0xb3f5, 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f9, 0xb3fa, 0xb3fb, 0xb3fc, 0xb3fd, 0xb3fe, 0xb3ff, 0xb400, 0xb401, 0xb402, 0xb403, 0xb404, 0xb405, 0xb406, 0xb407, /* 0xb400 */ 0xb408, 0xb409, 0xb40a, 0xb40b, 0xb40c, 0xb40d, 0xb40e, 0xb40f, 0xb410, 0xb411, 0xb412, 0xb413, 0xb414, 0xb415, 0xb416, 0xb417, 0xb418, 0xb419, 0xb41a, 0xb41b, 0xb41c, 0xb41d, 0xb41e, 0xb41f, 0xb420, 0xb421, 0xb422, 0xb423, 0xb424, 0xb425, 0xb426, 0xb427, 0xb428, 0xb429, 0xb42a, 0xb42b, 0xb42c, 0xb42d, 0xb42e, 0xb42f, 0xb430, 0xb431, 0xb432, 0xb433, 0xb434, 0xb435, 0xb436, 0xb437, 0xb438, 0xb439, 0xb43a, 0xb43b, 0xb43c, 0xb43d, 0xb43e, 0xb43f, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, /* 0xb440 */ 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb47f, 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, /* 0xb480 */ 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb4a1, 0xb4a2, 0xb4a3, 0xb4a4, 0xb4a5, 0xb4a6, 0xb4a7, 0xb4a8, 0xb4a9, 0xb4aa, 0xb4ab, 0xb4ac, 0xb4ad, 0xb4ae, 0xb4af, 0xb4b0, 0xb4b1, 0xb4b2, 0xb4b3, 0xb4b4, 0xb4b5, 0xb4b6, 0xb4b7, 0xb4b8, 0xb4b9, 0xb4ba, 0xb4bb, 0xb4bc, 0xb4bd, 0xb4be, 0xb4bf, 0xb4c0, 0xb4c1, 0xb4c2, 0xb4c3, 0xb4c4, 0xb4c5, 0xb4c6, 0xb4c7, /* 0xb4c0 */ 0xb4c8, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb4cd, 0xb4ce, 0xb4cf, 0xb4d0, 0xb4d1, 0xb4d2, 0xb4d3, 0xb4d4, 0xb4d5, 0xb4d6, 0xb4d7, 0xb4d8, 0xb4d9, 0xb4da, 0xb4db, 0xb4dc, 0xb4dd, 0xb4de, 0xb4df, 0xb4e0, 0xb4e1, 0xb4e2, 0xb4e3, 0xb4e4, 0xb4e5, 0xb4e6, 0xb4e7, 0xb4e8, 0xb4e9, 0xb4ea, 0xb4eb, 0xb4ec, 0xb4ed, 0xb4ee, 0xb4ef, 0xb4f0, 0xb4f1, 0xb4f2, 0xb4f3, 0xb4f4, 0xb4f5, 0xb4f6, 0xb4f7, 0xb4f8, 0xb4f9, 0xb4fa, 0xb4fb, 0xb4fc, 0xb4fd, 0xb4fe, 0xb4ff, 0xb500, 0xb501, 0xb502, 0xb503, 0xb504, 0xb505, 0xb506, 0xb507, /* 0xb500 */ 0xb508, 0xb509, 0xb50a, 0xb50b, 0xb50c, 0xb50d, 0xb50e, 0xb50f, 0xb510, 0xb511, 0xb512, 0xb513, 0xb514, 0xb515, 0xb516, 0xb517, 0xb518, 0xb519, 0xb51a, 0xb51b, 0xb51c, 0xb51d, 0xb51e, 0xb51f, 0xb520, 0xb521, 0xb522, 0xb523, 0xb524, 0xb525, 0xb526, 0xb527, 0xb528, 0xb529, 0xb52a, 0xb52b, 0xb52c, 0xb52d, 0xb52e, 0xb52f, 0xb530, 0xb531, 0xb532, 0xb533, 0xb534, 0xb535, 0xb536, 0xb537, 0xb538, 0xb539, 0xb53a, 0xb53b, 0xb53c, 0xb53d, 0xb53e, 0xb53f, 0xb540, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, /* 0xb540 */ 0xb548, 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb57f, 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, /* 0xb580 */ 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb5a1, 0xb5a2, 0xb5a3, 0xb5a4, 0xb5a5, 0xb5a6, 0xb5a7, 0xb5a8, 0xb5a9, 0xb5aa, 0xb5ab, 0xb5ac, 0xb5ad, 0xb5ae, 0xb5af, 0xb5b0, 0xb5b1, 0xb5b2, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5b6, 0xb5b7, 0xb5b8, 0xb5b9, 0xb5ba, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5be, 0xb5bf, 0xb5c0, 0xb5c1, 0xb5c2, 0xb5c3, 0xb5c4, 0xb5c5, 0xb5c6, 0xb5c7, /* 0xb5c0 */ 0xb5c8, 0xb5c9, 0xb5ca, 0xb5cb, 0xb5cc, 0xb5cd, 0xb5ce, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d2, 0xb5d3, 0xb5d4, 0xb5d5, 0xb5d6, 0xb5d7, 0xb5d8, 0xb5d9, 0xb5da, 0xb5db, 0xb5dc, 0xb5dd, 0xb5de, 0xb5df, 0xb5e0, 0xb5e1, 0xb5e2, 0xb5e3, 0xb5e4, 0xb5e5, 0xb5e6, 0xb5e7, 0xb5e8, 0xb5e9, 0xb5ea, 0xb5eb, 0xb5ec, 0xb5ed, 0xb5ee, 0xb5ef, 0xb5f0, 0xb5f1, 0xb5f2, 0xb5f3, 0xb5f4, 0xb5f5, 0xb5f6, 0xb5f7, 0xb5f8, 0xb5f9, 0xb5fa, 0xb5fb, 0xb5fc, 0xb5fd, 0xb5fe, 0xb5ff, 0xb600, 0xb601, 0xb602, 0xb603, 0xb604, 0xb605, 0xb606, 0xb607, /* 0xb600 */ 0xb608, 0xb609, 0xb60a, 0xb60b, 0xb60c, 0xb60d, 0xb60e, 0xb60f, 0xb610, 0xb611, 0xb612, 0xb613, 0xb614, 0xb615, 0xb616, 0xb617, 0xb618, 0xb619, 0xb61a, 0xb61b, 0xb61c, 0xb61d, 0xb61e, 0xb61f, 0xb620, 0xb621, 0xb622, 0xb623, 0xb624, 0xb625, 0xb626, 0xb627, 0xb628, 0xb629, 0xb62a, 0xb62b, 0xb62c, 0xb62d, 0xb62e, 0xb62f, 0xb630, 0xb631, 0xb632, 0xb633, 0xb634, 0xb635, 0xb636, 0xb637, 0xb638, 0xb639, 0xb63a, 0xb63b, 0xb63c, 0xb63d, 0xb63e, 0xb63f, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, /* 0xb640 */ 0xb648, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb67f, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, /* 0xb680 */ 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb6a1, 0xb6a2, 0xb6a3, 0xb6a4, 0xb6a5, 0xb6a6, 0xb6a7, 0xb6a8, 0xb6a9, 0xb6aa, 0xb6ab, 0xb6ac, 0xb6ad, 0xb6ae, 0xb6af, 0xb6b0, 0xb6b1, 0xb6b2, 0xb6b3, 0xb6b4, 0xb6b5, 0xb6b6, 0xb6b7, 0xb6b8, 0xb6b9, 0xb6ba, 0xb6bb, 0xb6bc, 0xb6bd, 0xb6be, 0xb6bf, 0xb6c0, 0xb6c1, 0xb6c2, 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c6, 0xb6c7, /* 0xb6c0 */ 0xb6c8, 0xb6c9, 0xb6ca, 0xb6cb, 0xb6cc, 0xb6cd, 0xb6ce, 0xb6cf, 0xb6d0, 0xb6d1, 0xb6d2, 0xb6d3, 0xb6d4, 0xb6d5, 0xb6d6, 0xb6d7, 0xb6d8, 0xb6d9, 0xb6da, 0xb6db, 0xb6dc, 0xb6dd, 0xb6de, 0xb6df, 0xb6e0, 0xb6e1, 0xb6e2, 0xb6e3, 0xb6e4, 0xb6e5, 0xb6e6, 0xb6e7, 0xb6e8, 0xb6e9, 0xb6ea, 0xb6eb, 0xb6ec, 0xb6ed, 0xb6ee, 0xb6ef, 0xb6f0, 0xb6f1, 0xb6f2, 0xb6f3, 0xb6f4, 0xb6f5, 0xb6f6, 0xb6f7, 0xb6f8, 0xb6f9, 0xb6fa, 0xb6fb, 0xb6fc, 0xb6fd, 0xb6fe, 0xb6ff, 0xb700, 0xb701, 0xb702, 0xb703, 0xb704, 0xb705, 0xb706, 0xb707, /* 0xb700 */ 0xb708, 0xb709, 0xb70a, 0xb70b, 0xb70c, 0xb70d, 0xb70e, 0xb70f, 0xb710, 0xb711, 0xb712, 0xb713, 0xb714, 0xb715, 0xb716, 0xb717, 0xb718, 0xb719, 0xb71a, 0xb71b, 0xb71c, 0xb71d, 0xb71e, 0xb71f, 0xb720, 0xb721, 0xb722, 0xb723, 0xb724, 0xb725, 0xb726, 0xb727, 0xb728, 0xb729, 0xb72a, 0xb72b, 0xb72c, 0xb72d, 0xb72e, 0xb72f, 0xb730, 0xb731, 0xb732, 0xb733, 0xb734, 0xb735, 0xb736, 0xb737, 0xb738, 0xb739, 0xb73a, 0xb73b, 0xb73c, 0xb73d, 0xb73e, 0xb73f, 0xb740, 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, /* 0xb740 */ 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb77f, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, /* 0xb780 */ 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb7a1, 0xb7a2, 0xb7a3, 0xb7a4, 0xb7a5, 0xb7a6, 0xb7a7, 0xb7a8, 0xb7a9, 0xb7aa, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7ae, 0xb7af, 0xb7b0, 0xb7b1, 0xb7b2, 0xb7b3, 0xb7b4, 0xb7b5, 0xb7b6, 0xb7b7, 0xb7b8, 0xb7b9, 0xb7ba, 0xb7bb, 0xb7bc, 0xb7bd, 0xb7be, 0xb7bf, 0xb7c0, 0xb7c1, 0xb7c2, 0xb7c3, 0xb7c4, 0xb7c5, 0xb7c6, 0xb7c7, /* 0xb7c0 */ 0xb7c8, 0xb7c9, 0xb7ca, 0xb7cb, 0xb7cc, 0xb7cd, 0xb7ce, 0xb7cf, 0xb7d0, 0xb7d1, 0xb7d2, 0xb7d3, 0xb7d4, 0xb7d5, 0xb7d6, 0xb7d7, 0xb7d8, 0xb7d9, 0xb7da, 0xb7db, 0xb7dc, 0xb7dd, 0xb7de, 0xb7df, 0xb7e0, 0xb7e1, 0xb7e2, 0xb7e3, 0xb7e4, 0xb7e5, 0xb7e6, 0xb7e7, 0xb7e8, 0xb7e9, 0xb7ea, 0xb7eb, 0xb7ec, 0xb7ed, 0xb7ee, 0xb7ef, 0xb7f0, 0xb7f1, 0xb7f2, 0xb7f3, 0xb7f4, 0xb7f5, 0xb7f6, 0xb7f7, 0xb7f8, 0xb7f9, 0xb7fa, 0xb7fb, 0xb7fc, 0xb7fd, 0xb7fe, 0xb7ff, 0xb800, 0xb801, 0xb802, 0xb803, 0xb804, 0xb805, 0xb806, 0xb807, /* 0xb800 */ 0xb808, 0xb809, 0xb80a, 0xb80b, 0xb80c, 0xb80d, 0xb80e, 0xb80f, 0xb810, 0xb811, 0xb812, 0xb813, 0xb814, 0xb815, 0xb816, 0xb817, 0xb818, 0xb819, 0xb81a, 0xb81b, 0xb81c, 0xb81d, 0xb81e, 0xb81f, 0xb820, 0xb821, 0xb822, 0xb823, 0xb824, 0xb825, 0xb826, 0xb827, 0xb828, 0xb829, 0xb82a, 0xb82b, 0xb82c, 0xb82d, 0xb82e, 0xb82f, 0xb830, 0xb831, 0xb832, 0xb833, 0xb834, 0xb835, 0xb836, 0xb837, 0xb838, 0xb839, 0xb83a, 0xb83b, 0xb83c, 0xb83d, 0xb83e, 0xb83f, 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, /* 0xb840 */ 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb87f, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, /* 0xb880 */ 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb8a1, 0xb8a2, 0xb8a3, 0xb8a4, 0xb8a5, 0xb8a6, 0xb8a7, 0xb8a8, 0xb8a9, 0xb8aa, 0xb8ab, 0xb8ac, 0xb8ad, 0xb8ae, 0xb8af, 0xb8b0, 0xb8b1, 0xb8b2, 0xb8b3, 0xb8b4, 0xb8b5, 0xb8b6, 0xb8b7, 0xb8b8, 0xb8b9, 0xb8ba, 0xb8bb, 0xb8bc, 0xb8bd, 0xb8be, 0xb8bf, 0xb8c0, 0xb8c1, 0xb8c2, 0xb8c3, 0xb8c4, 0xb8c5, 0xb8c6, 0xb8c7, /* 0xb8c0 */ 0xb8c8, 0xb8c9, 0xb8ca, 0xb8cb, 0xb8cc, 0xb8cd, 0xb8ce, 0xb8cf, 0xb8d0, 0xb8d1, 0xb8d2, 0xb8d3, 0xb8d4, 0xb8d5, 0xb8d6, 0xb8d7, 0xb8d8, 0xb8d9, 0xb8da, 0xb8db, 0xb8dc, 0xb8dd, 0xb8de, 0xb8df, 0xb8e0, 0xb8e1, 0xb8e2, 0xb8e3, 0xb8e4, 0xb8e5, 0xb8e6, 0xb8e7, 0xb8e8, 0xb8e9, 0xb8ea, 0xb8eb, 0xb8ec, 0xb8ed, 0xb8ee, 0xb8ef, 0xb8f0, 0xb8f1, 0xb8f2, 0xb8f3, 0xb8f4, 0xb8f5, 0xb8f6, 0xb8f7, 0xb8f8, 0xb8f9, 0xb8fa, 0xb8fb, 0xb8fc, 0xb8fd, 0xb8fe, 0xb8ff, 0xb900, 0xb901, 0xb902, 0xb903, 0xb904, 0xb905, 0xb906, 0xb907, /* 0xb900 */ 0xb908, 0xb909, 0xb90a, 0xb90b, 0xb90c, 0xb90d, 0xb90e, 0xb90f, 0xb910, 0xb911, 0xb912, 0xb913, 0xb914, 0xb915, 0xb916, 0xb917, 0xb918, 0xb919, 0xb91a, 0xb91b, 0xb91c, 0xb91d, 0xb91e, 0xb91f, 0xb920, 0xb921, 0xb922, 0xb923, 0xb924, 0xb925, 0xb926, 0xb927, 0xb928, 0xb929, 0xb92a, 0xb92b, 0xb92c, 0xb92d, 0xb92e, 0xb92f, 0xb930, 0xb931, 0xb932, 0xb933, 0xb934, 0xb935, 0xb936, 0xb937, 0xb938, 0xb939, 0xb93a, 0xb93b, 0xb93c, 0xb93d, 0xb93e, 0xb93f, 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, /* 0xb940 */ 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb97f, 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, /* 0xb980 */ 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xb9a1, 0xb9a2, 0xb9a3, 0xb9a4, 0xb9a5, 0xb9a6, 0xb9a7, 0xb9a8, 0xb9a9, 0xb9aa, 0xb9ab, 0xb9ac, 0xb9ad, 0xb9ae, 0xb9af, 0xb9b0, 0xb9b1, 0xb9b2, 0xb9b3, 0xb9b4, 0xb9b5, 0xb9b6, 0xb9b7, 0xb9b8, 0xb9b9, 0xb9ba, 0xb9bb, 0xb9bc, 0xb9bd, 0xb9be, 0xb9bf, 0xb9c0, 0xb9c1, 0xb9c2, 0xb9c3, 0xb9c4, 0xb9c5, 0xb9c6, 0xb9c7, /* 0xb9c0 */ 0xb9c8, 0xb9c9, 0xb9ca, 0xb9cb, 0xb9cc, 0xb9cd, 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d3, 0xb9d4, 0xb9d5, 0xb9d6, 0xb9d7, 0xb9d8, 0xb9d9, 0xb9da, 0xb9db, 0xb9dc, 0xb9dd, 0xb9de, 0xb9df, 0xb9e0, 0xb9e1, 0xb9e2, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e6, 0xb9e7, 0xb9e8, 0xb9e9, 0xb9ea, 0xb9eb, 0xb9ec, 0xb9ed, 0xb9ee, 0xb9ef, 0xb9f0, 0xb9f1, 0xb9f2, 0xb9f3, 0xb9f4, 0xb9f5, 0xb9f6, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xb9fb, 0xb9fc, 0xb9fd, 0xb9fe, 0xb9ff, 0xba00, 0xba01, 0xba02, 0xba03, 0xba04, 0xba05, 0xba06, 0xba07, /* 0xba00 */ 0xba08, 0xba09, 0xba0a, 0xba0b, 0xba0c, 0xba0d, 0xba0e, 0xba0f, 0xba10, 0xba11, 0xba12, 0xba13, 0xba14, 0xba15, 0xba16, 0xba17, 0xba18, 0xba19, 0xba1a, 0xba1b, 0xba1c, 0xba1d, 0xba1e, 0xba1f, 0xba20, 0xba21, 0xba22, 0xba23, 0xba24, 0xba25, 0xba26, 0xba27, 0xba28, 0xba29, 0xba2a, 0xba2b, 0xba2c, 0xba2d, 0xba2e, 0xba2f, 0xba30, 0xba31, 0xba32, 0xba33, 0xba34, 0xba35, 0xba36, 0xba37, 0xba38, 0xba39, 0xba3a, 0xba3b, 0xba3c, 0xba3d, 0xba3e, 0xba3f, 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, /* 0xba40 */ 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba7f, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, /* 0xba80 */ 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa4, 0xbaa5, 0xbaa6, 0xbaa7, 0xbaa8, 0xbaa9, 0xbaaa, 0xbaab, 0xbaac, 0xbaad, 0xbaae, 0xbaaf, 0xbab0, 0xbab1, 0xbab2, 0xbab3, 0xbab4, 0xbab5, 0xbab6, 0xbab7, 0xbab8, 0xbab9, 0xbaba, 0xbabb, 0xbabc, 0xbabd, 0xbabe, 0xbabf, 0xbac0, 0xbac1, 0xbac2, 0xbac3, 0xbac4, 0xbac5, 0xbac6, 0xbac7, /* 0xbac0 */ 0xbac8, 0xbac9, 0xbaca, 0xbacb, 0xbacc, 0xbacd, 0xbace, 0xbacf, 0xbad0, 0xbad1, 0xbad2, 0xbad3, 0xbad4, 0xbad5, 0xbad6, 0xbad7, 0xbad8, 0xbad9, 0xbada, 0xbadb, 0xbadc, 0xbadd, 0xbade, 0xbadf, 0xbae0, 0xbae1, 0xbae2, 0xbae3, 0xbae4, 0xbae5, 0xbae6, 0xbae7, 0xbae8, 0xbae9, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0xbaee, 0xbaef, 0xbaf0, 0xbaf1, 0xbaf2, 0xbaf3, 0xbaf4, 0xbaf5, 0xbaf6, 0xbaf7, 0xbaf8, 0xbaf9, 0xbafa, 0xbafb, 0xbafc, 0xbafd, 0xbafe, 0xbaff, 0xbb00, 0xbb01, 0xbb02, 0xbb03, 0xbb04, 0xbb05, 0xbb06, 0xbb07, /* 0xbb00 */ 0xbb08, 0xbb09, 0xbb0a, 0xbb0b, 0xbb0c, 0xbb0d, 0xbb0e, 0xbb0f, 0xbb10, 0xbb11, 0xbb12, 0xbb13, 0xbb14, 0xbb15, 0xbb16, 0xbb17, 0xbb18, 0xbb19, 0xbb1a, 0xbb1b, 0xbb1c, 0xbb1d, 0xbb1e, 0xbb1f, 0xbb20, 0xbb21, 0xbb22, 0xbb23, 0xbb24, 0xbb25, 0xbb26, 0xbb27, 0xbb28, 0xbb29, 0xbb2a, 0xbb2b, 0xbb2c, 0xbb2d, 0xbb2e, 0xbb2f, 0xbb30, 0xbb31, 0xbb32, 0xbb33, 0xbb34, 0xbb35, 0xbb36, 0xbb37, 0xbb38, 0xbb39, 0xbb3a, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e, 0xbb3f, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, /* 0xbb40 */ 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb7f, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, /* 0xbb80 */ 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbba1, 0xbba2, 0xbba3, 0xbba4, 0xbba5, 0xbba6, 0xbba7, 0xbba8, 0xbba9, 0xbbaa, 0xbbab, 0xbbac, 0xbbad, 0xbbae, 0xbbaf, 0xbbb0, 0xbbb1, 0xbbb2, 0xbbb3, 0xbbb4, 0xbbb5, 0xbbb6, 0xbbb7, 0xbbb8, 0xbbb9, 0xbbba, 0xbbbb, 0xbbbc, 0xbbbd, 0xbbbe, 0xbbbf, 0xbbc0, 0xbbc1, 0xbbc2, 0xbbc3, 0xbbc4, 0xbbc5, 0xbbc6, 0xbbc7, /* 0xbbc0 */ 0xbbc8, 0xbbc9, 0xbbca, 0xbbcb, 0xbbcc, 0xbbcd, 0xbbce, 0xbbcf, 0xbbd0, 0xbbd1, 0xbbd2, 0xbbd3, 0xbbd4, 0xbbd5, 0xbbd6, 0xbbd7, 0xbbd8, 0xbbd9, 0xbbda, 0xbbdb, 0xbbdc, 0xbbdd, 0xbbde, 0xbbdf, 0xbbe0, 0xbbe1, 0xbbe2, 0xbbe3, 0xbbe4, 0xbbe5, 0xbbe6, 0xbbe7, 0xbbe8, 0xbbe9, 0xbbea, 0xbbeb, 0xbbec, 0xbbed, 0xbbee, 0xbbef, 0xbbf0, 0xbbf1, 0xbbf2, 0xbbf3, 0xbbf4, 0xbbf5, 0xbbf6, 0xbbf7, 0xbbf8, 0xbbf9, 0xbbfa, 0xbbfb, 0xbbfc, 0xbbfd, 0xbbfe, 0xbbff, 0xbc00, 0xbc01, 0xbc02, 0xbc03, 0xbc04, 0xbc05, 0xbc06, 0xbc07, /* 0xbc00 */ 0xbc08, 0xbc09, 0xbc0a, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0e, 0xbc0f, 0xbc10, 0xbc11, 0xbc12, 0xbc13, 0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc19, 0xbc1a, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f, 0xbc20, 0xbc21, 0xbc22, 0xbc23, 0xbc24, 0xbc25, 0xbc26, 0xbc27, 0xbc28, 0xbc29, 0xbc2a, 0xbc2b, 0xbc2c, 0xbc2d, 0xbc2e, 0xbc2f, 0xbc30, 0xbc31, 0xbc32, 0xbc33, 0xbc34, 0xbc35, 0xbc36, 0xbc37, 0xbc38, 0xbc39, 0xbc3a, 0xbc3b, 0xbc3c, 0xbc3d, 0xbc3e, 0xbc3f, 0xbc40, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, /* 0xbc40 */ 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc7f, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, /* 0xbc80 */ 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbca1, 0xbca2, 0xbca3, 0xbca4, 0xbca5, 0xbca6, 0xbca7, 0xbca8, 0xbca9, 0xbcaa, 0xbcab, 0xbcac, 0xbcad, 0xbcae, 0xbcaf, 0xbcb0, 0xbcb1, 0xbcb2, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcb6, 0xbcb7, 0xbcb8, 0xbcb9, 0xbcba, 0xbcbb, 0xbcbc, 0xbcbd, 0xbcbe, 0xbcbf, 0xbcc0, 0xbcc1, 0xbcc2, 0xbcc3, 0xbcc4, 0xbcc5, 0xbcc6, 0xbcc7, /* 0xbcc0 */ 0xbcc8, 0xbcc9, 0xbcca, 0xbccb, 0xbccc, 0xbccd, 0xbcce, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd2, 0xbcd3, 0xbcd4, 0xbcd5, 0xbcd6, 0xbcd7, 0xbcd8, 0xbcd9, 0xbcda, 0xbcdb, 0xbcdc, 0xbcdd, 0xbcde, 0xbcdf, 0xbce0, 0xbce1, 0xbce2, 0xbce3, 0xbce4, 0xbce5, 0xbce6, 0xbce7, 0xbce8, 0xbce9, 0xbcea, 0xbceb, 0xbcec, 0xbced, 0xbcee, 0xbcef, 0xbcf0, 0xbcf1, 0xbcf2, 0xbcf3, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf7, 0xbcf8, 0xbcf9, 0xbcfa, 0xbcfb, 0xbcfc, 0xbcfd, 0xbcfe, 0xbcff, 0xbd00, 0xbd01, 0xbd02, 0xbd03, 0xbd04, 0xbd05, 0xbd06, 0xbd07, /* 0xbd00 */ 0xbd08, 0xbd09, 0xbd0a, 0xbd0b, 0xbd0c, 0xbd0d, 0xbd0e, 0xbd0f, 0xbd10, 0xbd11, 0xbd12, 0xbd13, 0xbd14, 0xbd15, 0xbd16, 0xbd17, 0xbd18, 0xbd19, 0xbd1a, 0xbd1b, 0xbd1c, 0xbd1d, 0xbd1e, 0xbd1f, 0xbd20, 0xbd21, 0xbd22, 0xbd23, 0xbd24, 0xbd25, 0xbd26, 0xbd27, 0xbd28, 0xbd29, 0xbd2a, 0xbd2b, 0xbd2c, 0xbd2d, 0xbd2e, 0xbd2f, 0xbd30, 0xbd31, 0xbd32, 0xbd33, 0xbd34, 0xbd35, 0xbd36, 0xbd37, 0xbd38, 0xbd39, 0xbd3a, 0xbd3b, 0xbd3c, 0xbd3d, 0xbd3e, 0xbd3f, 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, /* 0xbd40 */ 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd7f, 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, /* 0xbd80 */ 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbda1, 0xbda2, 0xbda3, 0xbda4, 0xbda5, 0xbda6, 0xbda7, 0xbda8, 0xbda9, 0xbdaa, 0xbdab, 0xbdac, 0xbdad, 0xbdae, 0xbdaf, 0xbdb0, 0xbdb1, 0xbdb2, 0xbdb3, 0xbdb4, 0xbdb5, 0xbdb6, 0xbdb7, 0xbdb8, 0xbdb9, 0xbdba, 0xbdbb, 0xbdbc, 0xbdbd, 0xbdbe, 0xbdbf, 0xbdc0, 0xbdc1, 0xbdc2, 0xbdc3, 0xbdc4, 0xbdc5, 0xbdc6, 0xbdc7, /* 0xbdc0 */ 0xbdc8, 0xbdc9, 0xbdca, 0xbdcb, 0xbdcc, 0xbdcd, 0xbdce, 0xbdcf, 0xbdd0, 0xbdd1, 0xbdd2, 0xbdd3, 0xbdd4, 0xbdd5, 0xbdd6, 0xbdd7, 0xbdd8, 0xbdd9, 0xbdda, 0xbddb, 0xbddc, 0xbddd, 0xbdde, 0xbddf, 0xbde0, 0xbde1, 0xbde2, 0xbde3, 0xbde4, 0xbde5, 0xbde6, 0xbde7, 0xbde8, 0xbde9, 0xbdea, 0xbdeb, 0xbdec, 0xbded, 0xbdee, 0xbdef, 0xbdf0, 0xbdf1, 0xbdf2, 0xbdf3, 0xbdf4, 0xbdf5, 0xbdf6, 0xbdf7, 0xbdf8, 0xbdf9, 0xbdfa, 0xbdfb, 0xbdfc, 0xbdfd, 0xbdfe, 0xbdff, 0xbe00, 0xbe01, 0xbe02, 0xbe03, 0xbe04, 0xbe05, 0xbe06, 0xbe07, /* 0xbe00 */ 0xbe08, 0xbe09, 0xbe0a, 0xbe0b, 0xbe0c, 0xbe0d, 0xbe0e, 0xbe0f, 0xbe10, 0xbe11, 0xbe12, 0xbe13, 0xbe14, 0xbe15, 0xbe16, 0xbe17, 0xbe18, 0xbe19, 0xbe1a, 0xbe1b, 0xbe1c, 0xbe1d, 0xbe1e, 0xbe1f, 0xbe20, 0xbe21, 0xbe22, 0xbe23, 0xbe24, 0xbe25, 0xbe26, 0xbe27, 0xbe28, 0xbe29, 0xbe2a, 0xbe2b, 0xbe2c, 0xbe2d, 0xbe2e, 0xbe2f, 0xbe30, 0xbe31, 0xbe32, 0xbe33, 0xbe34, 0xbe35, 0xbe36, 0xbe37, 0xbe38, 0xbe39, 0xbe3a, 0xbe3b, 0xbe3c, 0xbe3d, 0xbe3e, 0xbe3f, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, /* 0xbe40 */ 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe7f, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, /* 0xbe80 */ 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbea1, 0xbea2, 0xbea3, 0xbea4, 0xbea5, 0xbea6, 0xbea7, 0xbea8, 0xbea9, 0xbeaa, 0xbeab, 0xbeac, 0xbead, 0xbeae, 0xbeaf, 0xbeb0, 0xbeb1, 0xbeb2, 0xbeb3, 0xbeb4, 0xbeb5, 0xbeb6, 0xbeb7, 0xbeb8, 0xbeb9, 0xbeba, 0xbebb, 0xbebc, 0xbebd, 0xbebe, 0xbebf, 0xbec0, 0xbec1, 0xbec2, 0xbec3, 0xbec4, 0xbec5, 0xbec6, 0xbec7, /* 0xbec0 */ 0xbec8, 0xbec9, 0xbeca, 0xbecb, 0xbecc, 0xbecd, 0xbece, 0xbecf, 0xbed0, 0xbed1, 0xbed2, 0xbed3, 0xbed4, 0xbed5, 0xbed6, 0xbed7, 0xbed8, 0xbed9, 0xbeda, 0xbedb, 0xbedc, 0xbedd, 0xbede, 0xbedf, 0xbee0, 0xbee1, 0xbee2, 0xbee3, 0xbee4, 0xbee5, 0xbee6, 0xbee7, 0xbee8, 0xbee9, 0xbeea, 0xbeeb, 0xbeec, 0xbeed, 0xbeee, 0xbeef, 0xbef0, 0xbef1, 0xbef2, 0xbef3, 0xbef4, 0xbef5, 0xbef6, 0xbef7, 0xbef8, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0xbefd, 0xbefe, 0xbeff, 0xbf00, 0xbf01, 0xbf02, 0xbf03, 0xbf04, 0xbf05, 0xbf06, 0xbf07, /* 0xbf00 */ 0xbf08, 0xbf09, 0xbf0a, 0xbf0b, 0xbf0c, 0xbf0d, 0xbf0e, 0xbf0f, 0xbf10, 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xbf16, 0xbf17, 0xbf18, 0xbf19, 0xbf1a, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf1f, 0xbf20, 0xbf21, 0xbf22, 0xbf23, 0xbf24, 0xbf25, 0xbf26, 0xbf27, 0xbf28, 0xbf29, 0xbf2a, 0xbf2b, 0xbf2c, 0xbf2d, 0xbf2e, 0xbf2f, 0xbf30, 0xbf31, 0xbf32, 0xbf33, 0xbf34, 0xbf35, 0xbf36, 0xbf37, 0xbf38, 0xbf39, 0xbf3a, 0xbf3b, 0xbf3c, 0xbf3d, 0xbf3e, 0xbf3f, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, /* 0xbf40 */ 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf7f, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, /* 0xbf80 */ 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, 0xbfab, 0xbfac, 0xbfad, 0xbfae, 0xbfaf, 0xbfb0, 0xbfb1, 0xbfb2, 0xbfb3, 0xbfb4, 0xbfb5, 0xbfb6, 0xbfb7, 0xbfb8, 0xbfb9, 0xbfba, 0xbfbb, 0xbfbc, 0xbfbd, 0xbfbe, 0xbfbf, 0xbfc0, 0xbfc1, 0xbfc2, 0xbfc3, 0xbfc4, 0xbfc5, 0xbfc6, 0xbfc7, /* 0xbfc0 */ 0xbfc8, 0xbfc9, 0xbfca, 0xbfcb, 0xbfcc, 0xbfcd, 0xbfce, 0xbfcf, 0xbfd0, 0xbfd1, 0xbfd2, 0xbfd3, 0xbfd4, 0xbfd5, 0xbfd6, 0xbfd7, 0xbfd8, 0xbfd9, 0xbfda, 0xbfdb, 0xbfdc, 0xbfdd, 0xbfde, 0xbfdf, 0xbfe0, 0xbfe1, 0xbfe2, 0xbfe3, 0xbfe4, 0xbfe5, 0xbfe6, 0xbfe7, 0xbfe8, 0xbfe9, 0xbfea, 0xbfeb, 0xbfec, 0xbfed, 0xbfee, 0xbfef, 0xbff0, 0xbff1, 0xbff2, 0xbff3, 0xbff4, 0xbff5, 0xbff6, 0xbff7, 0xbff8, 0xbff9, 0xbffa, 0xbffb, 0xbffc, 0xbffd, 0xbffe, 0xbfff, 0xc000, 0xc001, 0xc002, 0xc003, 0xc004, 0xc005, 0xc006, 0xc007, /* 0xc000 */ 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d, 0xc00e, 0xc00f, 0xc010, 0xc011, 0xc012, 0xc013, 0xc014, 0xc015, 0xc016, 0xc017, 0xc018, 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0xc020, 0xc021, 0xc022, 0xc023, 0xc024, 0xc025, 0xc026, 0xc027, 0xc028, 0xc029, 0xc02a, 0xc02b, 0xc02c, 0xc02d, 0xc02e, 0xc02f, 0xc030, 0xc031, 0xc032, 0xc033, 0xc034, 0xc035, 0xc036, 0xc037, 0xc038, 0xc039, 0xc03a, 0xc03b, 0xc03c, 0xc03d, 0xc03e, 0xc03f, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, /* 0xc040 */ 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc07f, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, /* 0xc080 */ 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc0a1, 0xc0a2, 0xc0a3, 0xc0a4, 0xc0a5, 0xc0a6, 0xc0a7, 0xc0a8, 0xc0a9, 0xc0aa, 0xc0ab, 0xc0ac, 0xc0ad, 0xc0ae, 0xc0af, 0xc0b0, 0xc0b1, 0xc0b2, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0b7, 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0bc, 0xc0bd, 0xc0be, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0xc0c4, 0xc0c5, 0xc0c6, 0xc0c7, /* 0xc0c0 */ 0xc0c8, 0xc0c9, 0xc0ca, 0xc0cb, 0xc0cc, 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d0, 0xc0d1, 0xc0d2, 0xc0d3, 0xc0d4, 0xc0d5, 0xc0d6, 0xc0d7, 0xc0d8, 0xc0d9, 0xc0da, 0xc0db, 0xc0dc, 0xc0dd, 0xc0de, 0xc0df, 0xc0e0, 0xc0e1, 0xc0e2, 0xc0e3, 0xc0e4, 0xc0e5, 0xc0e6, 0xc0e7, 0xc0e8, 0xc0e9, 0xc0ea, 0xc0eb, 0xc0ec, 0xc0ed, 0xc0ee, 0xc0ef, 0xc0f0, 0xc0f1, 0xc0f2, 0xc0f3, 0xc0f4, 0xc0f5, 0xc0f6, 0xc0f7, 0xc0f8, 0xc0f9, 0xc0fa, 0xc0fb, 0xc0fc, 0xc0fd, 0xc0fe, 0xc0ff, 0xc100, 0xc101, 0xc102, 0xc103, 0xc104, 0xc105, 0xc106, 0xc107, /* 0xc100 */ 0xc108, 0xc109, 0xc10a, 0xc10b, 0xc10c, 0xc10d, 0xc10e, 0xc10f, 0xc110, 0xc111, 0xc112, 0xc113, 0xc114, 0xc115, 0xc116, 0xc117, 0xc118, 0xc119, 0xc11a, 0xc11b, 0xc11c, 0xc11d, 0xc11e, 0xc11f, 0xc120, 0xc121, 0xc122, 0xc123, 0xc124, 0xc125, 0xc126, 0xc127, 0xc128, 0xc129, 0xc12a, 0xc12b, 0xc12c, 0xc12d, 0xc12e, 0xc12f, 0xc130, 0xc131, 0xc132, 0xc133, 0xc134, 0xc135, 0xc136, 0xc137, 0xc138, 0xc139, 0xc13a, 0xc13b, 0xc13c, 0xc13d, 0xc13e, 0xc13f, 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, /* 0xc140 */ 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc17f, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, /* 0xc180 */ 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc1a1, 0xc1a2, 0xc1a3, 0xc1a4, 0xc1a5, 0xc1a6, 0xc1a7, 0xc1a8, 0xc1a9, 0xc1aa, 0xc1ab, 0xc1ac, 0xc1ad, 0xc1ae, 0xc1af, 0xc1b0, 0xc1b1, 0xc1b2, 0xc1b3, 0xc1b4, 0xc1b5, 0xc1b6, 0xc1b7, 0xc1b8, 0xc1b9, 0xc1ba, 0xc1bb, 0xc1bc, 0xc1bd, 0xc1be, 0xc1bf, 0xc1c0, 0xc1c1, 0xc1c2, 0xc1c3, 0xc1c4, 0xc1c5, 0xc1c6, 0xc1c7, /* 0xc1c0 */ 0xc1c8, 0xc1c9, 0xc1ca, 0xc1cb, 0xc1cc, 0xc1cd, 0xc1ce, 0xc1cf, 0xc1d0, 0xc1d1, 0xc1d2, 0xc1d3, 0xc1d4, 0xc1d5, 0xc1d6, 0xc1d7, 0xc1d8, 0xc1d9, 0xc1da, 0xc1db, 0xc1dc, 0xc1dd, 0xc1de, 0xc1df, 0xc1e0, 0xc1e1, 0xc1e2, 0xc1e3, 0xc1e4, 0xc1e5, 0xc1e6, 0xc1e7, 0xc1e8, 0xc1e9, 0xc1ea, 0xc1eb, 0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f0, 0xc1f1, 0xc1f2, 0xc1f3, 0xc1f4, 0xc1f5, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9, 0xc1fa, 0xc1fb, 0xc1fc, 0xc1fd, 0xc1fe, 0xc1ff, 0xc200, 0xc201, 0xc202, 0xc203, 0xc204, 0xc205, 0xc206, 0xc207, /* 0xc200 */ 0xc208, 0xc209, 0xc20a, 0xc20b, 0xc20c, 0xc20d, 0xc20e, 0xc20f, 0xc210, 0xc211, 0xc212, 0xc213, 0xc214, 0xc215, 0xc216, 0xc217, 0xc218, 0xc219, 0xc21a, 0xc21b, 0xc21c, 0xc21d, 0xc21e, 0xc21f, 0xc220, 0xc221, 0xc222, 0xc223, 0xc224, 0xc225, 0xc226, 0xc227, 0xc228, 0xc229, 0xc22a, 0xc22b, 0xc22c, 0xc22d, 0xc22e, 0xc22f, 0xc230, 0xc231, 0xc232, 0xc233, 0xc234, 0xc235, 0xc236, 0xc237, 0xc238, 0xc239, 0xc23a, 0xc23b, 0xc23c, 0xc23d, 0xc23e, 0xc23f, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, /* 0xc240 */ 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc27f, 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, /* 0xc280 */ 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc2a1, 0xc2a2, 0xc2a3, 0xc2a4, 0xc2a5, 0xc2a6, 0xc2a7, 0xc2a8, 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ac, 0xc2ad, 0xc2ae, 0xc2af, 0xc2b0, 0xc2b1, 0xc2b2, 0xc2b3, 0xc2b4, 0xc2b5, 0xc2b6, 0xc2b7, 0xc2b8, 0xc2b9, 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2be, 0xc2bf, 0xc2c0, 0xc2c1, 0xc2c2, 0xc2c3, 0xc2c4, 0xc2c5, 0xc2c6, 0xc2c7, /* 0xc2c0 */ 0xc2c8, 0xc2c9, 0xc2ca, 0xc2cb, 0xc2cc, 0xc2cd, 0xc2ce, 0xc2cf, 0xc2d0, 0xc2d1, 0xc2d2, 0xc2d3, 0xc2d4, 0xc2d5, 0xc2d6, 0xc2d7, 0xc2d8, 0xc2d9, 0xc2da, 0xc2db, 0xc2dc, 0xc2dd, 0xc2de, 0xc2df, 0xc2e0, 0xc2e1, 0xc2e2, 0xc2e3, 0xc2e4, 0xc2e5, 0xc2e6, 0xc2e7, 0xc2e8, 0xc2e9, 0xc2ea, 0xc2eb, 0xc2ec, 0xc2ed, 0xc2ee, 0xc2ef, 0xc2f0, 0xc2f1, 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f6, 0xc2f7, 0xc2f8, 0xc2f9, 0xc2fa, 0xc2fb, 0xc2fc, 0xc2fd, 0xc2fe, 0xc2ff, 0xc300, 0xc301, 0xc302, 0xc303, 0xc304, 0xc305, 0xc306, 0xc307, /* 0xc300 */ 0xc308, 0xc309, 0xc30a, 0xc30b, 0xc30c, 0xc30d, 0xc30e, 0xc30f, 0xc310, 0xc311, 0xc312, 0xc313, 0xc314, 0xc315, 0xc316, 0xc317, 0xc318, 0xc319, 0xc31a, 0xc31b, 0xc31c, 0xc31d, 0xc31e, 0xc31f, 0xc320, 0xc321, 0xc322, 0xc323, 0xc324, 0xc325, 0xc326, 0xc327, 0xc328, 0xc329, 0xc32a, 0xc32b, 0xc32c, 0xc32d, 0xc32e, 0xc32f, 0xc330, 0xc331, 0xc332, 0xc333, 0xc334, 0xc335, 0xc336, 0xc337, 0xc338, 0xc339, 0xc33a, 0xc33b, 0xc33c, 0xc33d, 0xc33e, 0xc33f, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, /* 0xc340 */ 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc37f, 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, /* 0xc380 */ 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc3a7, 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af, 0xc3b0, 0xc3b1, 0xc3b2, 0xc3b3, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, 0xc3c0, 0xc3c1, 0xc3c2, 0xc3c3, 0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, /* 0xc3c0 */ 0xc3c8, 0xc3c9, 0xc3ca, 0xc3cb, 0xc3cc, 0xc3cd, 0xc3ce, 0xc3cf, 0xc3d0, 0xc3d1, 0xc3d2, 0xc3d3, 0xc3d4, 0xc3d5, 0xc3d6, 0xc3d7, 0xc3d8, 0xc3d9, 0xc3da, 0xc3db, 0xc3dc, 0xc3dd, 0xc3de, 0xc3df, 0xc3e0, 0xc3e1, 0xc3e2, 0xc3e3, 0xc3e4, 0xc3e5, 0xc3e6, 0xc3e7, 0xc3e8, 0xc3e9, 0xc3ea, 0xc3eb, 0xc3ec, 0xc3ed, 0xc3ee, 0xc3ef, 0xc3f0, 0xc3f1, 0xc3f2, 0xc3f3, 0xc3f4, 0xc3f5, 0xc3f6, 0xc3f7, 0xc3f8, 0xc3f9, 0xc3fa, 0xc3fb, 0xc3fc, 0xc3fd, 0xc3fe, 0xc3ff, 0xc400, 0xc401, 0xc402, 0xc403, 0xc404, 0xc405, 0xc406, 0xc407, /* 0xc400 */ 0xc408, 0xc409, 0xc40a, 0xc40b, 0xc40c, 0xc40d, 0xc40e, 0xc40f, 0xc410, 0xc411, 0xc412, 0xc413, 0xc414, 0xc415, 0xc416, 0xc417, 0xc418, 0xc419, 0xc41a, 0xc41b, 0xc41c, 0xc41d, 0xc41e, 0xc41f, 0xc420, 0xc421, 0xc422, 0xc423, 0xc424, 0xc425, 0xc426, 0xc427, 0xc428, 0xc429, 0xc42a, 0xc42b, 0xc42c, 0xc42d, 0xc42e, 0xc42f, 0xc430, 0xc431, 0xc432, 0xc433, 0xc434, 0xc435, 0xc436, 0xc437, 0xc438, 0xc439, 0xc43a, 0xc43b, 0xc43c, 0xc43d, 0xc43e, 0xc43f, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, /* 0xc440 */ 0xc448, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, 0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc47f, 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, /* 0xc480 */ 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc4a1, 0xc4a2, 0xc4a3, 0xc4a4, 0xc4a5, 0xc4a6, 0xc4a7, 0xc4a8, 0xc4a9, 0xc4aa, 0xc4ab, 0xc4ac, 0xc4ad, 0xc4ae, 0xc4af, 0xc4b0, 0xc4b1, 0xc4b2, 0xc4b3, 0xc4b4, 0xc4b5, 0xc4b6, 0xc4b7, 0xc4b8, 0xc4b9, 0xc4ba, 0xc4bb, 0xc4bc, 0xc4bd, 0xc4be, 0xc4bf, 0xc4c0, 0xc4c1, 0xc4c2, 0xc4c3, 0xc4c4, 0xc4c5, 0xc4c6, 0xc4c7, /* 0xc4c0 */ 0xc4c8, 0xc4c9, 0xc4ca, 0xc4cb, 0xc4cc, 0xc4cd, 0xc4ce, 0xc4cf, 0xc4d0, 0xc4d1, 0xc4d2, 0xc4d3, 0xc4d4, 0xc4d5, 0xc4d6, 0xc4d7, 0xc4d8, 0xc4d9, 0xc4da, 0xc4db, 0xc4dc, 0xc4dd, 0xc4de, 0xc4df, 0xc4e0, 0xc4e1, 0xc4e2, 0xc4e3, 0xc4e4, 0xc4e5, 0xc4e6, 0xc4e7, 0xc4e8, 0xc4e9, 0xc4ea, 0xc4eb, 0xc4ec, 0xc4ed, 0xc4ee, 0xc4ef, 0xc4f0, 0xc4f1, 0xc4f2, 0xc4f3, 0xc4f4, 0xc4f5, 0xc4f6, 0xc4f7, 0xc4f8, 0xc4f9, 0xc4fa, 0xc4fb, 0xc4fc, 0xc4fd, 0xc4fe, 0xc4ff, 0xc500, 0xc501, 0xc502, 0xc503, 0xc504, 0xc505, 0xc506, 0xc507, /* 0xc500 */ 0xc508, 0xc509, 0xc50a, 0xc50b, 0xc50c, 0xc50d, 0xc50e, 0xc50f, 0xc510, 0xc511, 0xc512, 0xc513, 0xc514, 0xc515, 0xc516, 0xc517, 0xc518, 0xc519, 0xc51a, 0xc51b, 0xc51c, 0xc51d, 0xc51e, 0xc51f, 0xc520, 0xc521, 0xc522, 0xc523, 0xc524, 0xc525, 0xc526, 0xc527, 0xc528, 0xc529, 0xc52a, 0xc52b, 0xc52c, 0xc52d, 0xc52e, 0xc52f, 0xc530, 0xc531, 0xc532, 0xc533, 0xc534, 0xc535, 0xc536, 0xc537, 0xc538, 0xc539, 0xc53a, 0xc53b, 0xc53c, 0xc53d, 0xc53e, 0xc53f, 0xc540, 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, /* 0xc540 */ 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc57f, 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, /* 0xc580 */ 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc5a1, 0xc5a2, 0xc5a3, 0xc5a4, 0xc5a5, 0xc5a6, 0xc5a7, 0xc5a8, 0xc5a9, 0xc5aa, 0xc5ab, 0xc5ac, 0xc5ad, 0xc5ae, 0xc5af, 0xc5b0, 0xc5b1, 0xc5b2, 0xc5b3, 0xc5b4, 0xc5b5, 0xc5b6, 0xc5b7, 0xc5b8, 0xc5b9, 0xc5ba, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5bf, 0xc5c0, 0xc5c1, 0xc5c2, 0xc5c3, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, /* 0xc5c0 */ 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cb, 0xc5cc, 0xc5cd, 0xc5ce, 0xc5cf, 0xc5d0, 0xc5d1, 0xc5d2, 0xc5d3, 0xc5d4, 0xc5d5, 0xc5d6, 0xc5d7, 0xc5d8, 0xc5d9, 0xc5da, 0xc5db, 0xc5dc, 0xc5dd, 0xc5de, 0xc5df, 0xc5e0, 0xc5e1, 0xc5e2, 0xc5e3, 0xc5e4, 0xc5e5, 0xc5e6, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5ef, 0xc5f0, 0xc5f1, 0xc5f2, 0xc5f3, 0xc5f4, 0xc5f5, 0xc5f6, 0xc5f7, 0xc5f8, 0xc5f9, 0xc5fa, 0xc5fb, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc602, 0xc603, 0xc604, 0xc605, 0xc606, 0xc607, /* 0xc600 */ 0xc608, 0xc609, 0xc60a, 0xc60b, 0xc60c, 0xc60d, 0xc60e, 0xc60f, 0xc610, 0xc611, 0xc612, 0xc613, 0xc614, 0xc615, 0xc616, 0xc617, 0xc618, 0xc619, 0xc61a, 0xc61b, 0xc61c, 0xc61d, 0xc61e, 0xc61f, 0xc620, 0xc621, 0xc622, 0xc623, 0xc624, 0xc625, 0xc626, 0xc627, 0xc628, 0xc629, 0xc62a, 0xc62b, 0xc62c, 0xc62d, 0xc62e, 0xc62f, 0xc630, 0xc631, 0xc632, 0xc633, 0xc634, 0xc635, 0xc636, 0xc637, 0xc638, 0xc639, 0xc63a, 0xc63b, 0xc63c, 0xc63d, 0xc63e, 0xc63f, 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, /* 0xc640 */ 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc67f, 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, /* 0xc680 */ 0xc688, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a4, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, /* 0xc6c0 */ 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc6ff, 0xc700, 0xc701, 0xc702, 0xc703, 0xc704, 0xc705, 0xc706, 0xc707, /* 0xc700 */ 0xc708, 0xc709, 0xc70a, 0xc70b, 0xc70c, 0xc70d, 0xc70e, 0xc70f, 0xc710, 0xc711, 0xc712, 0xc713, 0xc714, 0xc715, 0xc716, 0xc717, 0xc718, 0xc719, 0xc71a, 0xc71b, 0xc71c, 0xc71d, 0xc71e, 0xc71f, 0xc720, 0xc721, 0xc722, 0xc723, 0xc724, 0xc725, 0xc726, 0xc727, 0xc728, 0xc729, 0xc72a, 0xc72b, 0xc72c, 0xc72d, 0xc72e, 0xc72f, 0xc730, 0xc731, 0xc732, 0xc733, 0xc734, 0xc735, 0xc736, 0xc737, 0xc738, 0xc739, 0xc73a, 0xc73b, 0xc73c, 0xc73d, 0xc73e, 0xc73f, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, /* 0xc740 */ 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc77f, 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, /* 0xc780 */ 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, /* 0xc7c0 */ 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7ce, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc7ff, 0xc800, 0xc801, 0xc802, 0xc803, 0xc804, 0xc805, 0xc806, 0xc807, /* 0xc800 */ 0xc808, 0xc809, 0xc80a, 0xc80b, 0xc80c, 0xc80d, 0xc80e, 0xc80f, 0xc810, 0xc811, 0xc812, 0xc813, 0xc814, 0xc815, 0xc816, 0xc817, 0xc818, 0xc819, 0xc81a, 0xc81b, 0xc81c, 0xc81d, 0xc81e, 0xc81f, 0xc820, 0xc821, 0xc822, 0xc823, 0xc824, 0xc825, 0xc826, 0xc827, 0xc828, 0xc829, 0xc82a, 0xc82b, 0xc82c, 0xc82d, 0xc82e, 0xc82f, 0xc830, 0xc831, 0xc832, 0xc833, 0xc834, 0xc835, 0xc836, 0xc837, 0xc838, 0xc839, 0xc83a, 0xc83b, 0xc83c, 0xc83d, 0xc83e, 0xc83f, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, /* 0xc840 */ 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc87f, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, /* 0xc880 */ 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc8a1, 0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, 0xc8a8, 0xc8a9, 0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, 0xc8b0, 0xc8b1, 0xc8b2, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, 0xc8b8, 0xc8b9, 0xc8ba, 0xc8bb, 0xc8bc, 0xc8bd, 0xc8be, 0xc8bf, 0xc8c0, 0xc8c1, 0xc8c2, 0xc8c3, 0xc8c4, 0xc8c5, 0xc8c6, 0xc8c7, /* 0xc8c0 */ 0xc8c8, 0xc8c9, 0xc8ca, 0xc8cb, 0xc8cc, 0xc8cd, 0xc8ce, 0xc8cf, 0xc8d0, 0xc8d1, 0xc8d2, 0xc8d3, 0xc8d4, 0xc8d5, 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0xc8e0, 0xc8e1, 0xc8e2, 0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1, 0xc8f2, 0xc8f3, 0xc8f4, 0xc8f5, 0xc8f6, 0xc8f7, 0xc8f8, 0xc8f9, 0xc8fa, 0xc8fb, 0xc8fc, 0xc8fd, 0xc8fe, 0xc8ff, 0xc900, 0xc901, 0xc902, 0xc903, 0xc904, 0xc905, 0xc906, 0xc907, /* 0xc900 */ 0xc908, 0xc909, 0xc90a, 0xc90b, 0xc90c, 0xc90d, 0xc90e, 0xc90f, 0xc910, 0xc911, 0xc912, 0xc913, 0xc914, 0xc915, 0xc916, 0xc917, 0xc918, 0xc919, 0xc91a, 0xc91b, 0xc91c, 0xc91d, 0xc91e, 0xc91f, 0xc920, 0xc921, 0xc922, 0xc923, 0xc924, 0xc925, 0xc926, 0xc927, 0xc928, 0xc929, 0xc92a, 0xc92b, 0xc92c, 0xc92d, 0xc92e, 0xc92f, 0xc930, 0xc931, 0xc932, 0xc933, 0xc934, 0xc935, 0xc936, 0xc937, 0xc938, 0xc939, 0xc93a, 0xc93b, 0xc93c, 0xc93d, 0xc93e, 0xc93f, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, /* 0xc940 */ 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc97f, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, /* 0xc980 */ 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xc9a1, 0xc9a2, 0xc9a3, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, 0xc9a8, 0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, 0xc9b0, 0xc9b1, 0xc9b2, 0xc9b3, 0xc9b4, 0xc9b5, 0xc9b6, 0xc9b7, 0xc9b8, 0xc9b9, 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9be, 0xc9bf, 0xc9c0, 0xc9c1, 0xc9c2, 0xc9c3, 0xc9c4, 0xc9c5, 0xc9c6, 0xc9c7, /* 0xc9c0 */ 0xc9c8, 0xc9c9, 0xc9ca, 0xc9cb, 0xc9cc, 0xc9cd, 0xc9ce, 0xc9cf, 0xc9d0, 0xc9d1, 0xc9d2, 0xc9d3, 0xc9d4, 0xc9d5, 0xc9d6, 0xc9d7, 0xc9d8, 0xc9d9, 0xc9da, 0xc9db, 0xc9dc, 0xc9dd, 0xc9de, 0xc9df, 0xc9e0, 0xc9e1, 0xc9e2, 0xc9e3, 0xc9e4, 0xc9e5, 0xc9e6, 0xc9e7, 0xc9e8, 0xc9e9, 0xc9ea, 0xc9eb, 0xc9ec, 0xc9ed, 0xc9ee, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f2, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, 0xc9f8, 0xc9f9, 0xc9fa, 0xc9fb, 0xc9fc, 0xc9fd, 0xc9fe, 0xc9ff, 0xca00, 0xca01, 0xca02, 0xca03, 0xca04, 0xca05, 0xca06, 0xca07, /* 0xca00 */ 0xca08, 0xca09, 0xca0a, 0xca0b, 0xca0c, 0xca0d, 0xca0e, 0xca0f, 0xca10, 0xca11, 0xca12, 0xca13, 0xca14, 0xca15, 0xca16, 0xca17, 0xca18, 0xca19, 0xca1a, 0xca1b, 0xca1c, 0xca1d, 0xca1e, 0xca1f, 0xca20, 0xca21, 0xca22, 0xca23, 0xca24, 0xca25, 0xca26, 0xca27, 0xca28, 0xca29, 0xca2a, 0xca2b, 0xca2c, 0xca2d, 0xca2e, 0xca2f, 0xca30, 0xca31, 0xca32, 0xca33, 0xca34, 0xca35, 0xca36, 0xca37, 0xca38, 0xca39, 0xca3a, 0xca3b, 0xca3c, 0xca3d, 0xca3e, 0xca3f, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, /* 0xca40 */ 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca7f, 0xca80, 0xca81, 0xca82, 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, /* 0xca80 */ 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcaa1, 0xcaa2, 0xcaa3, 0xcaa4, 0xcaa5, 0xcaa6, 0xcaa7, 0xcaa8, 0xcaa9, 0xcaaa, 0xcaab, 0xcaac, 0xcaad, 0xcaae, 0xcaaf, 0xcab0, 0xcab1, 0xcab2, 0xcab3, 0xcab4, 0xcab5, 0xcab6, 0xcab7, 0xcab8, 0xcab9, 0xcaba, 0xcabb, 0xcabc, 0xcabd, 0xcabe, 0xcabf, 0xcac0, 0xcac1, 0xcac2, 0xcac3, 0xcac4, 0xcac5, 0xcac6, 0xcac7, /* 0xcac0 */ 0xcac8, 0xcac9, 0xcaca, 0xcacb, 0xcacc, 0xcacd, 0xcace, 0xcacf, 0xcad0, 0xcad1, 0xcad2, 0xcad3, 0xcad4, 0xcad5, 0xcad6, 0xcad7, 0xcad8, 0xcad9, 0xcada, 0xcadb, 0xcadc, 0xcadd, 0xcade, 0xcadf, 0xcae0, 0xcae1, 0xcae2, 0xcae3, 0xcae4, 0xcae5, 0xcae6, 0xcae7, 0xcae8, 0xcae9, 0xcaea, 0xcaeb, 0xcaec, 0xcaed, 0xcaee, 0xcaef, 0xcaf0, 0xcaf1, 0xcaf2, 0xcaf3, 0xcaf4, 0xcaf5, 0xcaf6, 0xcaf7, 0xcaf8, 0xcaf9, 0xcafa, 0xcafb, 0xcafc, 0xcafd, 0xcafe, 0xcaff, 0xcb00, 0xcb01, 0xcb02, 0xcb03, 0xcb04, 0xcb05, 0xcb06, 0xcb07, /* 0xcb00 */ 0xcb08, 0xcb09, 0xcb0a, 0xcb0b, 0xcb0c, 0xcb0d, 0xcb0e, 0xcb0f, 0xcb10, 0xcb11, 0xcb12, 0xcb13, 0xcb14, 0xcb15, 0xcb16, 0xcb17, 0xcb18, 0xcb19, 0xcb1a, 0xcb1b, 0xcb1c, 0xcb1d, 0xcb1e, 0xcb1f, 0xcb20, 0xcb21, 0xcb22, 0xcb23, 0xcb24, 0xcb25, 0xcb26, 0xcb27, 0xcb28, 0xcb29, 0xcb2a, 0xcb2b, 0xcb2c, 0xcb2d, 0xcb2e, 0xcb2f, 0xcb30, 0xcb31, 0xcb32, 0xcb33, 0xcb34, 0xcb35, 0xcb36, 0xcb37, 0xcb38, 0xcb39, 0xcb3a, 0xcb3b, 0xcb3c, 0xcb3d, 0xcb3e, 0xcb3f, 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, /* 0xcb40 */ 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb7f, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, /* 0xcb80 */ 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcba1, 0xcba2, 0xcba3, 0xcba4, 0xcba5, 0xcba6, 0xcba7, 0xcba8, 0xcba9, 0xcbaa, 0xcbab, 0xcbac, 0xcbad, 0xcbae, 0xcbaf, 0xcbb0, 0xcbb1, 0xcbb2, 0xcbb3, 0xcbb4, 0xcbb5, 0xcbb6, 0xcbb7, 0xcbb8, 0xcbb9, 0xcbba, 0xcbbb, 0xcbbc, 0xcbbd, 0xcbbe, 0xcbbf, 0xcbc0, 0xcbc1, 0xcbc2, 0xcbc3, 0xcbc4, 0xcbc5, 0xcbc6, 0xcbc7, /* 0xcbc0 */ 0xcbc8, 0xcbc9, 0xcbca, 0xcbcb, 0xcbcc, 0xcbcd, 0xcbce, 0xcbcf, 0xcbd0, 0xcbd1, 0xcbd2, 0xcbd3, 0xcbd4, 0xcbd5, 0xcbd6, 0xcbd7, 0xcbd8, 0xcbd9, 0xcbda, 0xcbdb, 0xcbdc, 0xcbdd, 0xcbde, 0xcbdf, 0xcbe0, 0xcbe1, 0xcbe2, 0xcbe3, 0xcbe4, 0xcbe5, 0xcbe6, 0xcbe7, 0xcbe8, 0xcbe9, 0xcbea, 0xcbeb, 0xcbec, 0xcbed, 0xcbee, 0xcbef, 0xcbf0, 0xcbf1, 0xcbf2, 0xcbf3, 0xcbf4, 0xcbf5, 0xcbf6, 0xcbf7, 0xcbf8, 0xcbf9, 0xcbfa, 0xcbfb, 0xcbfc, 0xcbfd, 0xcbfe, 0xcbff, 0xcc00, 0xcc01, 0xcc02, 0xcc03, 0xcc04, 0xcc05, 0xcc06, 0xcc07, /* 0xcc00 */ 0xcc08, 0xcc09, 0xcc0a, 0xcc0b, 0xcc0c, 0xcc0d, 0xcc0e, 0xcc0f, 0xcc10, 0xcc11, 0xcc12, 0xcc13, 0xcc14, 0xcc15, 0xcc16, 0xcc17, 0xcc18, 0xcc19, 0xcc1a, 0xcc1b, 0xcc1c, 0xcc1d, 0xcc1e, 0xcc1f, 0xcc20, 0xcc21, 0xcc22, 0xcc23, 0xcc24, 0xcc25, 0xcc26, 0xcc27, 0xcc28, 0xcc29, 0xcc2a, 0xcc2b, 0xcc2c, 0xcc2d, 0xcc2e, 0xcc2f, 0xcc30, 0xcc31, 0xcc32, 0xcc33, 0xcc34, 0xcc35, 0xcc36, 0xcc37, 0xcc38, 0xcc39, 0xcc3a, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc3f, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, /* 0xcc40 */ 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc7f, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, /* 0xcc80 */ 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcca1, 0xcca2, 0xcca3, 0xcca4, 0xcca5, 0xcca6, 0xcca7, 0xcca8, 0xcca9, 0xccaa, 0xccab, 0xccac, 0xccad, 0xccae, 0xccaf, 0xccb0, 0xccb1, 0xccb2, 0xccb3, 0xccb4, 0xccb5, 0xccb6, 0xccb7, 0xccb8, 0xccb9, 0xccba, 0xccbb, 0xccbc, 0xccbd, 0xccbe, 0xccbf, 0xccc0, 0xccc1, 0xccc2, 0xccc3, 0xccc4, 0xccc5, 0xccc6, 0xccc7, /* 0xccc0 */ 0xccc8, 0xccc9, 0xccca, 0xcccb, 0xcccc, 0xcccd, 0xccce, 0xcccf, 0xccd0, 0xccd1, 0xccd2, 0xccd3, 0xccd4, 0xccd5, 0xccd6, 0xccd7, 0xccd8, 0xccd9, 0xccda, 0xccdb, 0xccdc, 0xccdd, 0xccde, 0xccdf, 0xcce0, 0xcce1, 0xcce2, 0xcce3, 0xcce4, 0xcce5, 0xcce6, 0xcce7, 0xcce8, 0xcce9, 0xccea, 0xcceb, 0xccec, 0xcced, 0xccee, 0xccef, 0xccf0, 0xccf1, 0xccf2, 0xccf3, 0xccf4, 0xccf5, 0xccf6, 0xccf7, 0xccf8, 0xccf9, 0xccfa, 0xccfb, 0xccfc, 0xccfd, 0xccfe, 0xccff, 0xcd00, 0xcd01, 0xcd02, 0xcd03, 0xcd04, 0xcd05, 0xcd06, 0xcd07, /* 0xcd00 */ 0xcd08, 0xcd09, 0xcd0a, 0xcd0b, 0xcd0c, 0xcd0d, 0xcd0e, 0xcd0f, 0xcd10, 0xcd11, 0xcd12, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0xcd17, 0xcd18, 0xcd19, 0xcd1a, 0xcd1b, 0xcd1c, 0xcd1d, 0xcd1e, 0xcd1f, 0xcd20, 0xcd21, 0xcd22, 0xcd23, 0xcd24, 0xcd25, 0xcd26, 0xcd27, 0xcd28, 0xcd29, 0xcd2a, 0xcd2b, 0xcd2c, 0xcd2d, 0xcd2e, 0xcd2f, 0xcd30, 0xcd31, 0xcd32, 0xcd33, 0xcd34, 0xcd35, 0xcd36, 0xcd37, 0xcd38, 0xcd39, 0xcd3a, 0xcd3b, 0xcd3c, 0xcd3d, 0xcd3e, 0xcd3f, 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, /* 0xcd40 */ 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd7f, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, /* 0xcd80 */ 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xcda1, 0xcda2, 0xcda3, 0xcda4, 0xcda5, 0xcda6, 0xcda7, 0xcda8, 0xcda9, 0xcdaa, 0xcdab, 0xcdac, 0xcdad, 0xcdae, 0xcdaf, 0xcdb0, 0xcdb1, 0xcdb2, 0xcdb3, 0xcdb4, 0xcdb5, 0xcdb6, 0xcdb7, 0xcdb8, 0xcdb9, 0xcdba, 0xcdbb, 0xcdbc, 0xcdbd, 0xcdbe, 0xcdbf, 0xcdc0, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc4, 0xcdc5, 0xcdc6, 0xcdc7, /* 0xcdc0 */ 0xcdc8, 0xcdc9, 0xcdca, 0xcdcb, 0xcdcc, 0xcdcd, 0xcdce, 0xcdcf, 0xcdd0, 0xcdd1, 0xcdd2, 0xcdd3, 0xcdd4, 0xcdd5, 0xcdd6, 0xcdd7, 0xcdd8, 0xcdd9, 0xcdda, 0xcddb, 0xcddc, 0xcddd, 0xcdde, 0xcddf, 0xcde0, 0xcde1, 0xcde2, 0xcde3, 0xcde4, 0xcde5, 0xcde6, 0xcde7, 0xcde8, 0xcde9, 0xcdea, 0xcdeb, 0xcdec, 0xcded, 0xcdee, 0xcdef, 0xcdf0, 0xcdf1, 0xcdf2, 0xcdf3, 0xcdf4, 0xcdf5, 0xcdf6, 0xcdf7, 0xcdf8, 0xcdf9, 0xcdfa, 0xcdfb, 0xcdfc, 0xcdfd, 0xcdfe, 0xcdff, 0xce00, 0xce01, 0xce02, 0xce03, 0xce04, 0xce05, 0xce06, 0xce07, /* 0xce00 */ 0xce08, 0xce09, 0xce0a, 0xce0b, 0xce0c, 0xce0d, 0xce0e, 0xce0f, 0xce10, 0xce11, 0xce12, 0xce13, 0xce14, 0xce15, 0xce16, 0xce17, 0xce18, 0xce19, 0xce1a, 0xce1b, 0xce1c, 0xce1d, 0xce1e, 0xce1f, 0xce20, 0xce21, 0xce22, 0xce23, 0xce24, 0xce25, 0xce26, 0xce27, 0xce28, 0xce29, 0xce2a, 0xce2b, 0xce2c, 0xce2d, 0xce2e, 0xce2f, 0xce30, 0xce31, 0xce32, 0xce33, 0xce34, 0xce35, 0xce36, 0xce37, 0xce38, 0xce39, 0xce3a, 0xce3b, 0xce3c, 0xce3d, 0xce3e, 0xce3f, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, /* 0xce40 */ 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce7f, 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, /* 0xce80 */ 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcea1, 0xcea2, 0xcea3, 0xcea4, 0xcea5, 0xcea6, 0xcea7, 0xcea8, 0xcea9, 0xceaa, 0xceab, 0xceac, 0xcead, 0xceae, 0xceaf, 0xceb0, 0xceb1, 0xceb2, 0xceb3, 0xceb4, 0xceb5, 0xceb6, 0xceb7, 0xceb8, 0xceb9, 0xceba, 0xcebb, 0xcebc, 0xcebd, 0xcebe, 0xcebf, 0xcec0, 0xcec1, 0xcec2, 0xcec3, 0xcec4, 0xcec5, 0xcec6, 0xcec7, /* 0xcec0 */ 0xcec8, 0xcec9, 0xceca, 0xcecb, 0xcecc, 0xcecd, 0xcece, 0xcecf, 0xced0, 0xced1, 0xced2, 0xced3, 0xced4, 0xced5, 0xced6, 0xced7, 0xced8, 0xced9, 0xceda, 0xcedb, 0xcedc, 0xcedd, 0xcede, 0xcedf, 0xcee0, 0xcee1, 0xcee2, 0xcee3, 0xcee4, 0xcee5, 0xcee6, 0xcee7, 0xcee8, 0xcee9, 0xceea, 0xceeb, 0xceec, 0xceed, 0xceee, 0xceef, 0xcef0, 0xcef1, 0xcef2, 0xcef3, 0xcef4, 0xcef5, 0xcef6, 0xcef7, 0xcef8, 0xcef9, 0xcefa, 0xcefb, 0xcefc, 0xcefd, 0xcefe, 0xceff, 0xcf00, 0xcf01, 0xcf02, 0xcf03, 0xcf04, 0xcf05, 0xcf06, 0xcf07, /* 0xcf00 */ 0xcf08, 0xcf09, 0xcf0a, 0xcf0b, 0xcf0c, 0xcf0d, 0xcf0e, 0xcf0f, 0xcf10, 0xcf11, 0xcf12, 0xcf13, 0xcf14, 0xcf15, 0xcf16, 0xcf17, 0xcf18, 0xcf19, 0xcf1a, 0xcf1b, 0xcf1c, 0xcf1d, 0xcf1e, 0xcf1f, 0xcf20, 0xcf21, 0xcf22, 0xcf23, 0xcf24, 0xcf25, 0xcf26, 0xcf27, 0xcf28, 0xcf29, 0xcf2a, 0xcf2b, 0xcf2c, 0xcf2d, 0xcf2e, 0xcf2f, 0xcf30, 0xcf31, 0xcf32, 0xcf33, 0xcf34, 0xcf35, 0xcf36, 0xcf37, 0xcf38, 0xcf39, 0xcf3a, 0xcf3b, 0xcf3c, 0xcf3d, 0xcf3e, 0xcf3f, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, /* 0xcf40 */ 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf7f, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, /* 0xcf80 */ 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xcfa1, 0xcfa2, 0xcfa3, 0xcfa4, 0xcfa5, 0xcfa6, 0xcfa7, 0xcfa8, 0xcfa9, 0xcfaa, 0xcfab, 0xcfac, 0xcfad, 0xcfae, 0xcfaf, 0xcfb0, 0xcfb1, 0xcfb2, 0xcfb3, 0xcfb4, 0xcfb5, 0xcfb6, 0xcfb7, 0xcfb8, 0xcfb9, 0xcfba, 0xcfbb, 0xcfbc, 0xcfbd, 0xcfbe, 0xcfbf, 0xcfc0, 0xcfc1, 0xcfc2, 0xcfc3, 0xcfc4, 0xcfc5, 0xcfc6, 0xcfc7, /* 0xcfc0 */ 0xcfc8, 0xcfc9, 0xcfca, 0xcfcb, 0xcfcc, 0xcfcd, 0xcfce, 0xcfcf, 0xcfd0, 0xcfd1, 0xcfd2, 0xcfd3, 0xcfd4, 0xcfd5, 0xcfd6, 0xcfd7, 0xcfd8, 0xcfd9, 0xcfda, 0xcfdb, 0xcfdc, 0xcfdd, 0xcfde, 0xcfdf, 0xcfe0, 0xcfe1, 0xcfe2, 0xcfe3, 0xcfe4, 0xcfe5, 0xcfe6, 0xcfe7, 0xcfe8, 0xcfe9, 0xcfea, 0xcfeb, 0xcfec, 0xcfed, 0xcfee, 0xcfef, 0xcff0, 0xcff1, 0xcff2, 0xcff3, 0xcff4, 0xcff5, 0xcff6, 0xcff7, 0xcff8, 0xcff9, 0xcffa, 0xcffb, 0xcffc, 0xcffd, 0xcffe, 0xcfff, 0xd000, 0xd001, 0xd002, 0xd003, 0xd004, 0xd005, 0xd006, 0xd007, /* 0xd000 */ 0xd008, 0xd009, 0xd00a, 0xd00b, 0xd00c, 0xd00d, 0xd00e, 0xd00f, 0xd010, 0xd011, 0xd012, 0xd013, 0xd014, 0xd015, 0xd016, 0xd017, 0xd018, 0xd019, 0xd01a, 0xd01b, 0xd01c, 0xd01d, 0xd01e, 0xd01f, 0xd020, 0xd021, 0xd022, 0xd023, 0xd024, 0xd025, 0xd026, 0xd027, 0xd028, 0xd029, 0xd02a, 0xd02b, 0xd02c, 0xd02d, 0xd02e, 0xd02f, 0xd030, 0xd031, 0xd032, 0xd033, 0xd034, 0xd035, 0xd036, 0xd037, 0xd038, 0xd039, 0xd03a, 0xd03b, 0xd03c, 0xd03d, 0xd03e, 0xd03f, 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, /* 0xd040 */ 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd07f, 0xd080, 0xd081, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, /* 0xd080 */ 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd0a1, 0xd0a2, 0xd0a3, 0xd0a4, 0xd0a5, 0xd0a6, 0xd0a7, 0xd0a8, 0xd0a9, 0xd0aa, 0xd0ab, 0xd0ac, 0xd0ad, 0xd0ae, 0xd0af, 0xd0b0, 0xd0b1, 0xd0b2, 0xd0b3, 0xd0b4, 0xd0b5, 0xd0b6, 0xd0b7, 0xd0b8, 0xd0b9, 0xd0ba, 0xd0bb, 0xd0bc, 0xd0bd, 0xd0be, 0xd0bf, 0xd0c0, 0xd0c1, 0xd0c2, 0xd0c3, 0xd0c4, 0xd0c5, 0xd0c6, 0xd0c7, /* 0xd0c0 */ 0xd0c8, 0xd0c9, 0xd0ca, 0xd0cb, 0xd0cc, 0xd0cd, 0xd0ce, 0xd0cf, 0xd0d0, 0xd0d1, 0xd0d2, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0d6, 0xd0d7, 0xd0d8, 0xd0d9, 0xd0da, 0xd0db, 0xd0dc, 0xd0dd, 0xd0de, 0xd0df, 0xd0e0, 0xd0e1, 0xd0e2, 0xd0e3, 0xd0e4, 0xd0e5, 0xd0e6, 0xd0e7, 0xd0e8, 0xd0e9, 0xd0ea, 0xd0eb, 0xd0ec, 0xd0ed, 0xd0ee, 0xd0ef, 0xd0f0, 0xd0f1, 0xd0f2, 0xd0f3, 0xd0f4, 0xd0f5, 0xd0f6, 0xd0f7, 0xd0f8, 0xd0f9, 0xd0fa, 0xd0fb, 0xd0fc, 0xd0fd, 0xd0fe, 0xd0ff, 0xd100, 0xd101, 0xd102, 0xd103, 0xd104, 0xd105, 0xd106, 0xd107, /* 0xd100 */ 0xd108, 0xd109, 0xd10a, 0xd10b, 0xd10c, 0xd10d, 0xd10e, 0xd10f, 0xd110, 0xd111, 0xd112, 0xd113, 0xd114, 0xd115, 0xd116, 0xd117, 0xd118, 0xd119, 0xd11a, 0xd11b, 0xd11c, 0xd11d, 0xd11e, 0xd11f, 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0xd125, 0xd126, 0xd127, 0xd128, 0xd129, 0xd12a, 0xd12b, 0xd12c, 0xd12d, 0xd12e, 0xd12f, 0xd130, 0xd131, 0xd132, 0xd133, 0xd134, 0xd135, 0xd136, 0xd137, 0xd138, 0xd139, 0xd13a, 0xd13b, 0xd13c, 0xd13d, 0xd13e, 0xd13f, 0xd140, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, /* 0xd140 */ 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd17f, 0xd180, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, /* 0xd180 */ 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd1a1, 0xd1a2, 0xd1a3, 0xd1a4, 0xd1a5, 0xd1a6, 0xd1a7, 0xd1a8, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1ad, 0xd1ae, 0xd1af, 0xd1b0, 0xd1b1, 0xd1b2, 0xd1b3, 0xd1b4, 0xd1b5, 0xd1b6, 0xd1b7, 0xd1b8, 0xd1b9, 0xd1ba, 0xd1bb, 0xd1bc, 0xd1bd, 0xd1be, 0xd1bf, 0xd1c0, 0xd1c1, 0xd1c2, 0xd1c3, 0xd1c4, 0xd1c5, 0xd1c6, 0xd1c7, /* 0xd1c0 */ 0xd1c8, 0xd1c9, 0xd1ca, 0xd1cb, 0xd1cc, 0xd1cd, 0xd1ce, 0xd1cf, 0xd1d0, 0xd1d1, 0xd1d2, 0xd1d3, 0xd1d4, 0xd1d5, 0xd1d6, 0xd1d7, 0xd1d8, 0xd1d9, 0xd1da, 0xd1db, 0xd1dc, 0xd1dd, 0xd1de, 0xd1df, 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0xd1e7, 0xd1e8, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ec, 0xd1ed, 0xd1ee, 0xd1ef, 0xd1f0, 0xd1f1, 0xd1f2, 0xd1f3, 0xd1f4, 0xd1f5, 0xd1f6, 0xd1f7, 0xd1f8, 0xd1f9, 0xd1fa, 0xd1fb, 0xd1fc, 0xd1fd, 0xd1fe, 0xd1ff, 0xd200, 0xd201, 0xd202, 0xd203, 0xd204, 0xd205, 0xd206, 0xd207, /* 0xd200 */ 0xd208, 0xd209, 0xd20a, 0xd20b, 0xd20c, 0xd20d, 0xd20e, 0xd20f, 0xd210, 0xd211, 0xd212, 0xd213, 0xd214, 0xd215, 0xd216, 0xd217, 0xd218, 0xd219, 0xd21a, 0xd21b, 0xd21c, 0xd21d, 0xd21e, 0xd21f, 0xd220, 0xd221, 0xd222, 0xd223, 0xd224, 0xd225, 0xd226, 0xd227, 0xd228, 0xd229, 0xd22a, 0xd22b, 0xd22c, 0xd22d, 0xd22e, 0xd22f, 0xd230, 0xd231, 0xd232, 0xd233, 0xd234, 0xd235, 0xd236, 0xd237, 0xd238, 0xd239, 0xd23a, 0xd23b, 0xd23c, 0xd23d, 0xd23e, 0xd23f, 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, /* 0xd240 */ 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd27f, 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, /* 0xd280 */ 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd2a1, 0xd2a2, 0xd2a3, 0xd2a4, 0xd2a5, 0xd2a6, 0xd2a7, 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ac, 0xd2ad, 0xd2ae, 0xd2af, 0xd2b0, 0xd2b1, 0xd2b2, 0xd2b3, 0xd2b4, 0xd2b5, 0xd2b6, 0xd2b7, 0xd2b8, 0xd2b9, 0xd2ba, 0xd2bb, 0xd2bc, 0xd2bd, 0xd2be, 0xd2bf, 0xd2c0, 0xd2c1, 0xd2c2, 0xd2c3, 0xd2c4, 0xd2c5, 0xd2c6, 0xd2c7, /* 0xd2c0 */ 0xd2c8, 0xd2c9, 0xd2ca, 0xd2cb, 0xd2cc, 0xd2cd, 0xd2ce, 0xd2cf, 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2d7, 0xd2d8, 0xd2d9, 0xd2da, 0xd2db, 0xd2dc, 0xd2dd, 0xd2de, 0xd2df, 0xd2e0, 0xd2e1, 0xd2e2, 0xd2e3, 0xd2e4, 0xd2e5, 0xd2e6, 0xd2e7, 0xd2e8, 0xd2e9, 0xd2ea, 0xd2eb, 0xd2ec, 0xd2ed, 0xd2ee, 0xd2ef, 0xd2f0, 0xd2f1, 0xd2f2, 0xd2f3, 0xd2f4, 0xd2f5, 0xd2f6, 0xd2f7, 0xd2f8, 0xd2f9, 0xd2fa, 0xd2fb, 0xd2fc, 0xd2fd, 0xd2fe, 0xd2ff, 0xd300, 0xd301, 0xd302, 0xd303, 0xd304, 0xd305, 0xd306, 0xd307, /* 0xd300 */ 0xd308, 0xd309, 0xd30a, 0xd30b, 0xd30c, 0xd30d, 0xd30e, 0xd30f, 0xd310, 0xd311, 0xd312, 0xd313, 0xd314, 0xd315, 0xd316, 0xd317, 0xd318, 0xd319, 0xd31a, 0xd31b, 0xd31c, 0xd31d, 0xd31e, 0xd31f, 0xd320, 0xd321, 0xd322, 0xd323, 0xd324, 0xd325, 0xd326, 0xd327, 0xd328, 0xd329, 0xd32a, 0xd32b, 0xd32c, 0xd32d, 0xd32e, 0xd32f, 0xd330, 0xd331, 0xd332, 0xd333, 0xd334, 0xd335, 0xd336, 0xd337, 0xd338, 0xd339, 0xd33a, 0xd33b, 0xd33c, 0xd33d, 0xd33e, 0xd33f, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, /* 0xd340 */ 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd37f, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, /* 0xd380 */ 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd3a1, 0xd3a2, 0xd3a3, 0xd3a4, 0xd3a5, 0xd3a6, 0xd3a7, 0xd3a8, 0xd3a9, 0xd3aa, 0xd3ab, 0xd3ac, 0xd3ad, 0xd3ae, 0xd3af, 0xd3b0, 0xd3b1, 0xd3b2, 0xd3b3, 0xd3b4, 0xd3b5, 0xd3b6, 0xd3b7, 0xd3b8, 0xd3b9, 0xd3ba, 0xd3bb, 0xd3bc, 0xd3bd, 0xd3be, 0xd3bf, 0xd3c0, 0xd3c1, 0xd3c2, 0xd3c3, 0xd3c4, 0xd3c5, 0xd3c6, 0xd3c7, /* 0xd3c0 */ 0xd3c8, 0xd3c9, 0xd3ca, 0xd3cb, 0xd3cc, 0xd3cd, 0xd3ce, 0xd3cf, 0xd3d0, 0xd3d1, 0xd3d2, 0xd3d3, 0xd3d4, 0xd3d5, 0xd3d6, 0xd3d7, 0xd3d8, 0xd3d9, 0xd3da, 0xd3db, 0xd3dc, 0xd3dd, 0xd3de, 0xd3df, 0xd3e0, 0xd3e1, 0xd3e2, 0xd3e3, 0xd3e4, 0xd3e5, 0xd3e6, 0xd3e7, 0xd3e8, 0xd3e9, 0xd3ea, 0xd3eb, 0xd3ec, 0xd3ed, 0xd3ee, 0xd3ef, 0xd3f0, 0xd3f1, 0xd3f2, 0xd3f3, 0xd3f4, 0xd3f5, 0xd3f6, 0xd3f7, 0xd3f8, 0xd3f9, 0xd3fa, 0xd3fb, 0xd3fc, 0xd3fd, 0xd3fe, 0xd3ff, 0xd400, 0xd401, 0xd402, 0xd403, 0xd404, 0xd405, 0xd406, 0xd407, /* 0xd400 */ 0xd408, 0xd409, 0xd40a, 0xd40b, 0xd40c, 0xd40d, 0xd40e, 0xd40f, 0xd410, 0xd411, 0xd412, 0xd413, 0xd414, 0xd415, 0xd416, 0xd417, 0xd418, 0xd419, 0xd41a, 0xd41b, 0xd41c, 0xd41d, 0xd41e, 0xd41f, 0xd420, 0xd421, 0xd422, 0xd423, 0xd424, 0xd425, 0xd426, 0xd427, 0xd428, 0xd429, 0xd42a, 0xd42b, 0xd42c, 0xd42d, 0xd42e, 0xd42f, 0xd430, 0xd431, 0xd432, 0xd433, 0xd434, 0xd435, 0xd436, 0xd437, 0xd438, 0xd439, 0xd43a, 0xd43b, 0xd43c, 0xd43d, 0xd43e, 0xd43f, 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, /* 0xd440 */ 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd47f, 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, /* 0xd480 */ 0xd488, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd4a1, 0xd4a2, 0xd4a3, 0xd4a4, 0xd4a5, 0xd4a6, 0xd4a7, 0xd4a8, 0xd4a9, 0xd4aa, 0xd4ab, 0xd4ac, 0xd4ad, 0xd4ae, 0xd4af, 0xd4b0, 0xd4b1, 0xd4b2, 0xd4b3, 0xd4b4, 0xd4b5, 0xd4b6, 0xd4b7, 0xd4b8, 0xd4b9, 0xd4ba, 0xd4bb, 0xd4bc, 0xd4bd, 0xd4be, 0xd4bf, 0xd4c0, 0xd4c1, 0xd4c2, 0xd4c3, 0xd4c4, 0xd4c5, 0xd4c6, 0xd4c7, /* 0xd4c0 */ 0xd4c8, 0xd4c9, 0xd4ca, 0xd4cb, 0xd4cc, 0xd4cd, 0xd4ce, 0xd4cf, 0xd4d0, 0xd4d1, 0xd4d2, 0xd4d3, 0xd4d4, 0xd4d5, 0xd4d6, 0xd4d7, 0xd4d8, 0xd4d9, 0xd4da, 0xd4db, 0xd4dc, 0xd4dd, 0xd4de, 0xd4df, 0xd4e0, 0xd4e1, 0xd4e2, 0xd4e3, 0xd4e4, 0xd4e5, 0xd4e6, 0xd4e7, 0xd4e8, 0xd4e9, 0xd4ea, 0xd4eb, 0xd4ec, 0xd4ed, 0xd4ee, 0xd4ef, 0xd4f0, 0xd4f1, 0xd4f2, 0xd4f3, 0xd4f4, 0xd4f5, 0xd4f6, 0xd4f7, 0xd4f8, 0xd4f9, 0xd4fa, 0xd4fb, 0xd4fc, 0xd4fd, 0xd4fe, 0xd4ff, 0xd500, 0xd501, 0xd502, 0xd503, 0xd504, 0xd505, 0xd506, 0xd507, /* 0xd500 */ 0xd508, 0xd509, 0xd50a, 0xd50b, 0xd50c, 0xd50d, 0xd50e, 0xd50f, 0xd510, 0xd511, 0xd512, 0xd513, 0xd514, 0xd515, 0xd516, 0xd517, 0xd518, 0xd519, 0xd51a, 0xd51b, 0xd51c, 0xd51d, 0xd51e, 0xd51f, 0xd520, 0xd521, 0xd522, 0xd523, 0xd524, 0xd525, 0xd526, 0xd527, 0xd528, 0xd529, 0xd52a, 0xd52b, 0xd52c, 0xd52d, 0xd52e, 0xd52f, 0xd530, 0xd531, 0xd532, 0xd533, 0xd534, 0xd535, 0xd536, 0xd537, 0xd538, 0xd539, 0xd53a, 0xd53b, 0xd53c, 0xd53d, 0xd53e, 0xd53f, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, /* 0xd540 */ 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd57f, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, /* 0xd580 */ 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd5a1, 0xd5a2, 0xd5a3, 0xd5a4, 0xd5a5, 0xd5a6, 0xd5a7, 0xd5a8, 0xd5a9, 0xd5aa, 0xd5ab, 0xd5ac, 0xd5ad, 0xd5ae, 0xd5af, 0xd5b0, 0xd5b1, 0xd5b2, 0xd5b3, 0xd5b4, 0xd5b5, 0xd5b6, 0xd5b7, 0xd5b8, 0xd5b9, 0xd5ba, 0xd5bb, 0xd5bc, 0xd5bd, 0xd5be, 0xd5bf, 0xd5c0, 0xd5c1, 0xd5c2, 0xd5c3, 0xd5c4, 0xd5c5, 0xd5c6, 0xd5c7, /* 0xd5c0 */ 0xd5c8, 0xd5c9, 0xd5ca, 0xd5cb, 0xd5cc, 0xd5cd, 0xd5ce, 0xd5cf, 0xd5d0, 0xd5d1, 0xd5d2, 0xd5d3, 0xd5d4, 0xd5d5, 0xd5d6, 0xd5d7, 0xd5d8, 0xd5d9, 0xd5da, 0xd5db, 0xd5dc, 0xd5dd, 0xd5de, 0xd5df, 0xd5e0, 0xd5e1, 0xd5e2, 0xd5e3, 0xd5e4, 0xd5e5, 0xd5e6, 0xd5e7, 0xd5e8, 0xd5e9, 0xd5ea, 0xd5eb, 0xd5ec, 0xd5ed, 0xd5ee, 0xd5ef, 0xd5f0, 0xd5f1, 0xd5f2, 0xd5f3, 0xd5f4, 0xd5f5, 0xd5f6, 0xd5f7, 0xd5f8, 0xd5f9, 0xd5fa, 0xd5fb, 0xd5fc, 0xd5fd, 0xd5fe, 0xd5ff, 0xd600, 0xd601, 0xd602, 0xd603, 0xd604, 0xd605, 0xd606, 0xd607, /* 0xd600 */ 0xd608, 0xd609, 0xd60a, 0xd60b, 0xd60c, 0xd60d, 0xd60e, 0xd60f, 0xd610, 0xd611, 0xd612, 0xd613, 0xd614, 0xd615, 0xd616, 0xd617, 0xd618, 0xd619, 0xd61a, 0xd61b, 0xd61c, 0xd61d, 0xd61e, 0xd61f, 0xd620, 0xd621, 0xd622, 0xd623, 0xd624, 0xd625, 0xd626, 0xd627, 0xd628, 0xd629, 0xd62a, 0xd62b, 0xd62c, 0xd62d, 0xd62e, 0xd62f, 0xd630, 0xd631, 0xd632, 0xd633, 0xd634, 0xd635, 0xd636, 0xd637, 0xd638, 0xd639, 0xd63a, 0xd63b, 0xd63c, 0xd63d, 0xd63e, 0xd63f, 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, /* 0xd640 */ 0xd648, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd67f, 0xd680, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, /* 0xd680 */ 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd6a1, 0xd6a2, 0xd6a3, 0xd6a4, 0xd6a5, 0xd6a6, 0xd6a7, 0xd6a8, 0xd6a9, 0xd6aa, 0xd6ab, 0xd6ac, 0xd6ad, 0xd6ae, 0xd6af, 0xd6b0, 0xd6b1, 0xd6b2, 0xd6b3, 0xd6b4, 0xd6b5, 0xd6b6, 0xd6b7, 0xd6b8, 0xd6b9, 0xd6ba, 0xd6bb, 0xd6bc, 0xd6bd, 0xd6be, 0xd6bf, 0xd6c0, 0xd6c1, 0xd6c2, 0xd6c3, 0xd6c4, 0xd6c5, 0xd6c6, 0xd6c7, /* 0xd6c0 */ 0xd6c8, 0xd6c9, 0xd6ca, 0xd6cb, 0xd6cc, 0xd6cd, 0xd6ce, 0xd6cf, 0xd6d0, 0xd6d1, 0xd6d2, 0xd6d3, 0xd6d4, 0xd6d5, 0xd6d6, 0xd6d7, 0xd6d8, 0xd6d9, 0xd6da, 0xd6db, 0xd6dc, 0xd6dd, 0xd6de, 0xd6df, 0xd6e0, 0xd6e1, 0xd6e2, 0xd6e3, 0xd6e4, 0xd6e5, 0xd6e6, 0xd6e7, 0xd6e8, 0xd6e9, 0xd6ea, 0xd6eb, 0xd6ec, 0xd6ed, 0xd6ee, 0xd6ef, 0xd6f0, 0xd6f1, 0xd6f2, 0xd6f3, 0xd6f4, 0xd6f5, 0xd6f6, 0xd6f7, 0xd6f8, 0xd6f9, 0xd6fa, 0xd6fb, 0xd6fc, 0xd6fd, 0xd6fe, 0xd6ff, 0xd700, 0xd701, 0xd702, 0xd703, 0xd704, 0xd705, 0xd706, 0xd707, /* 0xd700 */ 0xd708, 0xd709, 0xd70a, 0xd70b, 0xd70c, 0xd70d, 0xd70e, 0xd70f, 0xd710, 0xd711, 0xd712, 0xd713, 0xd714, 0xd715, 0xd716, 0xd717, 0xd718, 0xd719, 0xd71a, 0xd71b, 0xd71c, 0xd71d, 0xd71e, 0xd71f, 0xd720, 0xd721, 0xd722, 0xd723, 0xd724, 0xd725, 0xd726, 0xd727, 0xd728, 0xd729, 0xd72a, 0xd72b, 0xd72c, 0xd72d, 0xd72e, 0xd72f, 0xd730, 0xd731, 0xd732, 0xd733, 0xd734, 0xd735, 0xd736, 0xd737, 0xd738, 0xd739, 0xd73a, 0xd73b, 0xd73c, 0xd73d, 0xd73e, 0xd73f, 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, /* 0xd740 */ 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd77f, 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, /* 0xd780 */ 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd7a1, 0xd7a2, 0xd7a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd7b0, 0xd7b1, 0xd7b2, 0xd7b3, 0xd7b4, 0xd7b5, 0xd7b6, 0xd7b7, 0xd7b8, 0xd7b9, 0xd7ba, 0xd7bb, 0xd7bc, 0xd7bd, 0xd7be, 0xd7bf, 0xd7c0, 0xd7c1, 0xd7c2, 0xd7c3, 0xd7c4, 0xd7c5, 0xd7c6, 0x0000, /* 0xd7c0 */ 0x0000, 0x0000, 0x0000, 0xd7cb, 0xd7cc, 0xd7cd, 0xd7ce, 0xd7cf, 0xd7d0, 0xd7d1, 0xd7d2, 0xd7d3, 0xd7d4, 0xd7d5, 0xd7d6, 0xd7d7, 0xd7d8, 0xd7d9, 0xd7da, 0xd7db, 0xd7dc, 0xd7dd, 0xd7de, 0xd7df, 0xd7e0, 0xd7e1, 0xd7e2, 0xd7e3, 0xd7e4, 0xd7e5, 0xd7e6, 0xd7e7, 0xd7e8, 0xd7e9, 0xd7ea, 0xd7eb, 0xd7ec, 0xd7ed, 0xd7ee, 0xd7ef, 0xd7f0, 0xd7f1, 0xd7f2, 0xd7f3, 0xd7f4, 0xd7f5, 0xd7f6, 0xd7f7, 0xd7f8, 0xd7f9, 0xd7fa, 0xd7fb, 0x0000, 0x0000, 0x0000, 0x0000, 0xd800, 0xd801, 0xd802, 0xd803, 0xd804, 0xd805, 0xd806, 0xd807, /* 0xd800 */ 0xd808, 0xd809, 0xd80a, 0xd80b, 0xd80c, 0xd80d, 0xd80e, 0xd80f, 0xd810, 0xd811, 0xd812, 0xd813, 0xd814, 0xd815, 0xd816, 0xd817, 0xd818, 0xd819, 0xd81a, 0xd81b, 0xd81c, 0xd81d, 0xd81e, 0xd81f, 0xd820, 0xd821, 0xd822, 0xd823, 0xd824, 0xd825, 0xd826, 0xd827, 0xd828, 0xd829, 0xd82a, 0xd82b, 0xd82c, 0xd82d, 0xd82e, 0xd82f, 0xd830, 0xd831, 0xd832, 0xd833, 0xd834, 0xd835, 0xd836, 0xd837, 0xd838, 0xd839, 0xd83a, 0xd83b, 0xd83c, 0xd83d, 0xd83e, 0xd83f, 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, /* 0xd840 */ 0xd848, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851, 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859, 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869, 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879, 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd87f, 0xd880, 0xd881, 0xd882, 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, /* 0xd880 */ 0xd888, 0xd889, 0xd88a, 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd8a1, 0xd8a2, 0xd8a3, 0xd8a4, 0xd8a5, 0xd8a6, 0xd8a7, 0xd8a8, 0xd8a9, 0xd8aa, 0xd8ab, 0xd8ac, 0xd8ad, 0xd8ae, 0xd8af, 0xd8b0, 0xd8b1, 0xd8b2, 0xd8b3, 0xd8b4, 0xd8b5, 0xd8b6, 0xd8b7, 0xd8b8, 0xd8b9, 0xd8ba, 0xd8bb, 0xd8bc, 0xd8bd, 0xd8be, 0xd8bf, 0xd8c0, 0xd8c1, 0xd8c2, 0xd8c3, 0xd8c4, 0xd8c5, 0xd8c6, 0xd8c7, /* 0xd8c0 */ 0xd8c8, 0xd8c9, 0xd8ca, 0xd8cb, 0xd8cc, 0xd8cd, 0xd8ce, 0xd8cf, 0xd8d0, 0xd8d1, 0xd8d2, 0xd8d3, 0xd8d4, 0xd8d5, 0xd8d6, 0xd8d7, 0xd8d8, 0xd8d9, 0xd8da, 0xd8db, 0xd8dc, 0xd8dd, 0xd8de, 0xd8df, 0xd8e0, 0xd8e1, 0xd8e2, 0xd8e3, 0xd8e4, 0xd8e5, 0xd8e6, 0xd8e7, 0xd8e8, 0xd8e9, 0xd8ea, 0xd8eb, 0xd8ec, 0xd8ed, 0xd8ee, 0xd8ef, 0xd8f0, 0xd8f1, 0xd8f2, 0xd8f3, 0xd8f4, 0xd8f5, 0xd8f6, 0xd8f7, 0xd8f8, 0xd8f9, 0xd8fa, 0xd8fb, 0xd8fc, 0xd8fd, 0xd8fe, 0xd8ff, 0xd900, 0xd901, 0xd902, 0xd903, 0xd904, 0xd905, 0xd906, 0xd907, /* 0xd900 */ 0xd908, 0xd909, 0xd90a, 0xd90b, 0xd90c, 0xd90d, 0xd90e, 0xd90f, 0xd910, 0xd911, 0xd912, 0xd913, 0xd914, 0xd915, 0xd916, 0xd917, 0xd918, 0xd919, 0xd91a, 0xd91b, 0xd91c, 0xd91d, 0xd91e, 0xd91f, 0xd920, 0xd921, 0xd922, 0xd923, 0xd924, 0xd925, 0xd926, 0xd927, 0xd928, 0xd929, 0xd92a, 0xd92b, 0xd92c, 0xd92d, 0xd92e, 0xd92f, 0xd930, 0xd931, 0xd932, 0xd933, 0xd934, 0xd935, 0xd936, 0xd937, 0xd938, 0xd939, 0xd93a, 0xd93b, 0xd93c, 0xd93d, 0xd93e, 0xd93f, 0xd940, 0xd941, 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, /* 0xd940 */ 0xd948, 0xd949, 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd97f, 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, /* 0xd980 */ 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xd9a1, 0xd9a2, 0xd9a3, 0xd9a4, 0xd9a5, 0xd9a6, 0xd9a7, 0xd9a8, 0xd9a9, 0xd9aa, 0xd9ab, 0xd9ac, 0xd9ad, 0xd9ae, 0xd9af, 0xd9b0, 0xd9b1, 0xd9b2, 0xd9b3, 0xd9b4, 0xd9b5, 0xd9b6, 0xd9b7, 0xd9b8, 0xd9b9, 0xd9ba, 0xd9bb, 0xd9bc, 0xd9bd, 0xd9be, 0xd9bf, 0xd9c0, 0xd9c1, 0xd9c2, 0xd9c3, 0xd9c4, 0xd9c5, 0xd9c6, 0xd9c7, /* 0xd9c0 */ 0xd9c8, 0xd9c9, 0xd9ca, 0xd9cb, 0xd9cc, 0xd9cd, 0xd9ce, 0xd9cf, 0xd9d0, 0xd9d1, 0xd9d2, 0xd9d3, 0xd9d4, 0xd9d5, 0xd9d6, 0xd9d7, 0xd9d8, 0xd9d9, 0xd9da, 0xd9db, 0xd9dc, 0xd9dd, 0xd9de, 0xd9df, 0xd9e0, 0xd9e1, 0xd9e2, 0xd9e3, 0xd9e4, 0xd9e5, 0xd9e6, 0xd9e7, 0xd9e8, 0xd9e9, 0xd9ea, 0xd9eb, 0xd9ec, 0xd9ed, 0xd9ee, 0xd9ef, 0xd9f0, 0xd9f1, 0xd9f2, 0xd9f3, 0xd9f4, 0xd9f5, 0xd9f6, 0xd9f7, 0xd9f8, 0xd9f9, 0xd9fa, 0xd9fb, 0xd9fc, 0xd9fd, 0xd9fe, 0xd9ff, 0xda00, 0xda01, 0xda02, 0xda03, 0xda04, 0xda05, 0xda06, 0xda07, /* 0xda00 */ 0xda08, 0xda09, 0xda0a, 0xda0b, 0xda0c, 0xda0d, 0xda0e, 0xda0f, 0xda10, 0xda11, 0xda12, 0xda13, 0xda14, 0xda15, 0xda16, 0xda17, 0xda18, 0xda19, 0xda1a, 0xda1b, 0xda1c, 0xda1d, 0xda1e, 0xda1f, 0xda20, 0xda21, 0xda22, 0xda23, 0xda24, 0xda25, 0xda26, 0xda27, 0xda28, 0xda29, 0xda2a, 0xda2b, 0xda2c, 0xda2d, 0xda2e, 0xda2f, 0xda30, 0xda31, 0xda32, 0xda33, 0xda34, 0xda35, 0xda36, 0xda37, 0xda38, 0xda39, 0xda3a, 0xda3b, 0xda3c, 0xda3d, 0xda3e, 0xda3f, 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, /* 0xda40 */ 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69, 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda7f, 0xda80, 0xda81, 0xda82, 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, /* 0xda80 */ 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdaa1, 0xdaa2, 0xdaa3, 0xdaa4, 0xdaa5, 0xdaa6, 0xdaa7, 0xdaa8, 0xdaa9, 0xdaaa, 0xdaab, 0xdaac, 0xdaad, 0xdaae, 0xdaaf, 0xdab0, 0xdab1, 0xdab2, 0xdab3, 0xdab4, 0xdab5, 0xdab6, 0xdab7, 0xdab8, 0xdab9, 0xdaba, 0xdabb, 0xdabc, 0xdabd, 0xdabe, 0xdabf, 0xdac0, 0xdac1, 0xdac2, 0xdac3, 0xdac4, 0xdac5, 0xdac6, 0xdac7, /* 0xdac0 */ 0xdac8, 0xdac9, 0xdaca, 0xdacb, 0xdacc, 0xdacd, 0xdace, 0xdacf, 0xdad0, 0xdad1, 0xdad2, 0xdad3, 0xdad4, 0xdad5, 0xdad6, 0xdad7, 0xdad8, 0xdad9, 0xdada, 0xdadb, 0xdadc, 0xdadd, 0xdade, 0xdadf, 0xdae0, 0xdae1, 0xdae2, 0xdae3, 0xdae4, 0xdae5, 0xdae6, 0xdae7, 0xdae8, 0xdae9, 0xdaea, 0xdaeb, 0xdaec, 0xdaed, 0xdaee, 0xdaef, 0xdaf0, 0xdaf1, 0xdaf2, 0xdaf3, 0xdaf4, 0xdaf5, 0xdaf6, 0xdaf7, 0xdaf8, 0xdaf9, 0xdafa, 0xdafb, 0xdafc, 0xdafd, 0xdafe, 0xdaff, 0xdb00, 0xdb01, 0xdb02, 0xdb03, 0xdb04, 0xdb05, 0xdb06, 0xdb07, /* 0xdb00 */ 0xdb08, 0xdb09, 0xdb0a, 0xdb0b, 0xdb0c, 0xdb0d, 0xdb0e, 0xdb0f, 0xdb10, 0xdb11, 0xdb12, 0xdb13, 0xdb14, 0xdb15, 0xdb16, 0xdb17, 0xdb18, 0xdb19, 0xdb1a, 0xdb1b, 0xdb1c, 0xdb1d, 0xdb1e, 0xdb1f, 0xdb20, 0xdb21, 0xdb22, 0xdb23, 0xdb24, 0xdb25, 0xdb26, 0xdb27, 0xdb28, 0xdb29, 0xdb2a, 0xdb2b, 0xdb2c, 0xdb2d, 0xdb2e, 0xdb2f, 0xdb30, 0xdb31, 0xdb32, 0xdb33, 0xdb34, 0xdb35, 0xdb36, 0xdb37, 0xdb38, 0xdb39, 0xdb3a, 0xdb3b, 0xdb3c, 0xdb3d, 0xdb3e, 0xdb3f, 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, /* 0xdb40 */ 0xdb48, 0xdb49, 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb7f, 0xdb80, 0xdb81, 0xdb82, 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, /* 0xdb80 */ 0xdb88, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdba1, 0xdba2, 0xdba3, 0xdba4, 0xdba5, 0xdba6, 0xdba7, 0xdba8, 0xdba9, 0xdbaa, 0xdbab, 0xdbac, 0xdbad, 0xdbae, 0xdbaf, 0xdbb0, 0xdbb1, 0xdbb2, 0xdbb3, 0xdbb4, 0xdbb5, 0xdbb6, 0xdbb7, 0xdbb8, 0xdbb9, 0xdbba, 0xdbbb, 0xdbbc, 0xdbbd, 0xdbbe, 0xdbbf, 0xdbc0, 0xdbc1, 0xdbc2, 0xdbc3, 0xdbc4, 0xdbc5, 0xdbc6, 0xdbc7, /* 0xdbc0 */ 0xdbc8, 0xdbc9, 0xdbca, 0xdbcb, 0xdbcc, 0xdbcd, 0xdbce, 0xdbcf, 0xdbd0, 0xdbd1, 0xdbd2, 0xdbd3, 0xdbd4, 0xdbd5, 0xdbd6, 0xdbd7, 0xdbd8, 0xdbd9, 0xdbda, 0xdbdb, 0xdbdc, 0xdbdd, 0xdbde, 0xdbdf, 0xdbe0, 0xdbe1, 0xdbe2, 0xdbe3, 0xdbe4, 0xdbe5, 0xdbe6, 0xdbe7, 0xdbe8, 0xdbe9, 0xdbea, 0xdbeb, 0xdbec, 0xdbed, 0xdbee, 0xdbef, 0xdbf0, 0xdbf1, 0xdbf2, 0xdbf3, 0xdbf4, 0xdbf5, 0xdbf6, 0xdbf7, 0xdbf8, 0xdbf9, 0xdbfa, 0xdbfb, 0xdbfc, 0xdbfd, 0xdbfe, 0xdbff, 0xdc00, 0xdc01, 0xdc02, 0xdc03, 0xdc04, 0xdc05, 0xdc06, 0xdc07, /* 0xdc00 */ 0xdc08, 0xdc09, 0xdc0a, 0xdc0b, 0xdc0c, 0xdc0d, 0xdc0e, 0xdc0f, 0xdc10, 0xdc11, 0xdc12, 0xdc13, 0xdc14, 0xdc15, 0xdc16, 0xdc17, 0xdc18, 0xdc19, 0xdc1a, 0xdc1b, 0xdc1c, 0xdc1d, 0xdc1e, 0xdc1f, 0xdc20, 0xdc21, 0xdc22, 0xdc23, 0xdc24, 0xdc25, 0xdc26, 0xdc27, 0xdc28, 0xdc29, 0xdc2a, 0xdc2b, 0xdc2c, 0xdc2d, 0xdc2e, 0xdc2f, 0xdc30, 0xdc31, 0xdc32, 0xdc33, 0xdc34, 0xdc35, 0xdc36, 0xdc37, 0xdc38, 0xdc39, 0xdc3a, 0xdc3b, 0xdc3c, 0xdc3d, 0xdc3e, 0xdc3f, 0xdc40, 0xdc41, 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, /* 0xdc40 */ 0xdc48, 0xdc49, 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69, 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc7f, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, /* 0xdc80 */ 0xdc88, 0xdc89, 0xdc8a, 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdca1, 0xdca2, 0xdca3, 0xdca4, 0xdca5, 0xdca6, 0xdca7, 0xdca8, 0xdca9, 0xdcaa, 0xdcab, 0xdcac, 0xdcad, 0xdcae, 0xdcaf, 0xdcb0, 0xdcb1, 0xdcb2, 0xdcb3, 0xdcb4, 0xdcb5, 0xdcb6, 0xdcb7, 0xdcb8, 0xdcb9, 0xdcba, 0xdcbb, 0xdcbc, 0xdcbd, 0xdcbe, 0xdcbf, 0xdcc0, 0xdcc1, 0xdcc2, 0xdcc3, 0xdcc4, 0xdcc5, 0xdcc6, 0xdcc7, /* 0xdcc0 */ 0xdcc8, 0xdcc9, 0xdcca, 0xdccb, 0xdccc, 0xdccd, 0xdcce, 0xdccf, 0xdcd0, 0xdcd1, 0xdcd2, 0xdcd3, 0xdcd4, 0xdcd5, 0xdcd6, 0xdcd7, 0xdcd8, 0xdcd9, 0xdcda, 0xdcdb, 0xdcdc, 0xdcdd, 0xdcde, 0xdcdf, 0xdce0, 0xdce1, 0xdce2, 0xdce3, 0xdce4, 0xdce5, 0xdce6, 0xdce7, 0xdce8, 0xdce9, 0xdcea, 0xdceb, 0xdcec, 0xdced, 0xdcee, 0xdcef, 0xdcf0, 0xdcf1, 0xdcf2, 0xdcf3, 0xdcf4, 0xdcf5, 0xdcf6, 0xdcf7, 0xdcf8, 0xdcf9, 0xdcfa, 0xdcfb, 0xdcfc, 0xdcfd, 0xdcfe, 0xdcff, 0xdd00, 0xdd01, 0xdd02, 0xdd03, 0xdd04, 0xdd05, 0xdd06, 0xdd07, /* 0xdd00 */ 0xdd08, 0xdd09, 0xdd0a, 0xdd0b, 0xdd0c, 0xdd0d, 0xdd0e, 0xdd0f, 0xdd10, 0xdd11, 0xdd12, 0xdd13, 0xdd14, 0xdd15, 0xdd16, 0xdd17, 0xdd18, 0xdd19, 0xdd1a, 0xdd1b, 0xdd1c, 0xdd1d, 0xdd1e, 0xdd1f, 0xdd20, 0xdd21, 0xdd22, 0xdd23, 0xdd24, 0xdd25, 0xdd26, 0xdd27, 0xdd28, 0xdd29, 0xdd2a, 0xdd2b, 0xdd2c, 0xdd2d, 0xdd2e, 0xdd2f, 0xdd30, 0xdd31, 0xdd32, 0xdd33, 0xdd34, 0xdd35, 0xdd36, 0xdd37, 0xdd38, 0xdd39, 0xdd3a, 0xdd3b, 0xdd3c, 0xdd3d, 0xdd3e, 0xdd3f, 0xdd40, 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, /* 0xdd40 */ 0xdd48, 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd7f, 0xdd80, 0xdd81, 0xdd82, 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, /* 0xdd80 */ 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xdda1, 0xdda2, 0xdda3, 0xdda4, 0xdda5, 0xdda6, 0xdda7, 0xdda8, 0xdda9, 0xddaa, 0xddab, 0xddac, 0xddad, 0xddae, 0xddaf, 0xddb0, 0xddb1, 0xddb2, 0xddb3, 0xddb4, 0xddb5, 0xddb6, 0xddb7, 0xddb8, 0xddb9, 0xddba, 0xddbb, 0xddbc, 0xddbd, 0xddbe, 0xddbf, 0xddc0, 0xddc1, 0xddc2, 0xddc3, 0xddc4, 0xddc5, 0xddc6, 0xddc7, /* 0xddc0 */ 0xddc8, 0xddc9, 0xddca, 0xddcb, 0xddcc, 0xddcd, 0xddce, 0xddcf, 0xddd0, 0xddd1, 0xddd2, 0xddd3, 0xddd4, 0xddd5, 0xddd6, 0xddd7, 0xddd8, 0xddd9, 0xddda, 0xdddb, 0xdddc, 0xdddd, 0xddde, 0xdddf, 0xdde0, 0xdde1, 0xdde2, 0xdde3, 0xdde4, 0xdde5, 0xdde6, 0xdde7, 0xdde8, 0xdde9, 0xddea, 0xddeb, 0xddec, 0xdded, 0xddee, 0xddef, 0xddf0, 0xddf1, 0xddf2, 0xddf3, 0xddf4, 0xddf5, 0xddf6, 0xddf7, 0xddf8, 0xddf9, 0xddfa, 0xddfb, 0xddfc, 0xddfd, 0xddfe, 0xddff, 0xde00, 0xde01, 0xde02, 0xde03, 0xde04, 0xde05, 0xde06, 0xde07, /* 0xde00 */ 0xde08, 0xde09, 0xde0a, 0xde0b, 0xde0c, 0xde0d, 0xde0e, 0xde0f, 0xde10, 0xde11, 0xde12, 0xde13, 0xde14, 0xde15, 0xde16, 0xde17, 0xde18, 0xde19, 0xde1a, 0xde1b, 0xde1c, 0xde1d, 0xde1e, 0xde1f, 0xde20, 0xde21, 0xde22, 0xde23, 0xde24, 0xde25, 0xde26, 0xde27, 0xde28, 0xde29, 0xde2a, 0xde2b, 0xde2c, 0xde2d, 0xde2e, 0xde2f, 0xde30, 0xde31, 0xde32, 0xde33, 0xde34, 0xde35, 0xde36, 0xde37, 0xde38, 0xde39, 0xde3a, 0xde3b, 0xde3c, 0xde3d, 0xde3e, 0xde3f, 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, /* 0xde40 */ 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde7f, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, /* 0xde80 */ 0xde88, 0xde89, 0xde8a, 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a, 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdea1, 0xdea2, 0xdea3, 0xdea4, 0xdea5, 0xdea6, 0xdea7, 0xdea8, 0xdea9, 0xdeaa, 0xdeab, 0xdeac, 0xdead, 0xdeae, 0xdeaf, 0xdeb0, 0xdeb1, 0xdeb2, 0xdeb3, 0xdeb4, 0xdeb5, 0xdeb6, 0xdeb7, 0xdeb8, 0xdeb9, 0xdeba, 0xdebb, 0xdebc, 0xdebd, 0xdebe, 0xdebf, 0xdec0, 0xdec1, 0xdec2, 0xdec3, 0xdec4, 0xdec5, 0xdec6, 0xdec7, /* 0xdec0 */ 0xdec8, 0xdec9, 0xdeca, 0xdecb, 0xdecc, 0xdecd, 0xdece, 0xdecf, 0xded0, 0xded1, 0xded2, 0xded3, 0xded4, 0xded5, 0xded6, 0xded7, 0xded8, 0xded9, 0xdeda, 0xdedb, 0xdedc, 0xdedd, 0xdede, 0xdedf, 0xdee0, 0xdee1, 0xdee2, 0xdee3, 0xdee4, 0xdee5, 0xdee6, 0xdee7, 0xdee8, 0xdee9, 0xdeea, 0xdeeb, 0xdeec, 0xdeed, 0xdeee, 0xdeef, 0xdef0, 0xdef1, 0xdef2, 0xdef3, 0xdef4, 0xdef5, 0xdef6, 0xdef7, 0xdef8, 0xdef9, 0xdefa, 0xdefb, 0xdefc, 0xdefd, 0xdefe, 0xdeff, 0xdf00, 0xdf01, 0xdf02, 0xdf03, 0xdf04, 0xdf05, 0xdf06, 0xdf07, /* 0xdf00 */ 0xdf08, 0xdf09, 0xdf0a, 0xdf0b, 0xdf0c, 0xdf0d, 0xdf0e, 0xdf0f, 0xdf10, 0xdf11, 0xdf12, 0xdf13, 0xdf14, 0xdf15, 0xdf16, 0xdf17, 0xdf18, 0xdf19, 0xdf1a, 0xdf1b, 0xdf1c, 0xdf1d, 0xdf1e, 0xdf1f, 0xdf20, 0xdf21, 0xdf22, 0xdf23, 0xdf24, 0xdf25, 0xdf26, 0xdf27, 0xdf28, 0xdf29, 0xdf2a, 0xdf2b, 0xdf2c, 0xdf2d, 0xdf2e, 0xdf2f, 0xdf30, 0xdf31, 0xdf32, 0xdf33, 0xdf34, 0xdf35, 0xdf36, 0xdf37, 0xdf38, 0xdf39, 0xdf3a, 0xdf3b, 0xdf3c, 0xdf3d, 0xdf3e, 0xdf3f, 0xdf40, 0xdf41, 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, /* 0xdf40 */ 0xdf48, 0xdf49, 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51, 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61, 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69, 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71, 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf7f, 0xdf80, 0xdf81, 0xdf82, 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, /* 0xdf80 */ 0xdf88, 0xdf89, 0xdf8a, 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92, 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a, 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xdfa1, 0xdfa2, 0xdfa3, 0xdfa4, 0xdfa5, 0xdfa6, 0xdfa7, 0xdfa8, 0xdfa9, 0xdfaa, 0xdfab, 0xdfac, 0xdfad, 0xdfae, 0xdfaf, 0xdfb0, 0xdfb1, 0xdfb2, 0xdfb3, 0xdfb4, 0xdfb5, 0xdfb6, 0xdfb7, 0xdfb8, 0xdfb9, 0xdfba, 0xdfbb, 0xdfbc, 0xdfbd, 0xdfbe, 0xdfbf, 0xdfc0, 0xdfc1, 0xdfc2, 0xdfc3, 0xdfc4, 0xdfc5, 0xdfc6, 0xdfc7, /* 0xdfc0 */ 0xdfc8, 0xdfc9, 0xdfca, 0xdfcb, 0xdfcc, 0xdfcd, 0xdfce, 0xdfcf, 0xdfd0, 0xdfd1, 0xdfd2, 0xdfd3, 0xdfd4, 0xdfd5, 0xdfd6, 0xdfd7, 0xdfd8, 0xdfd9, 0xdfda, 0xdfdb, 0xdfdc, 0xdfdd, 0xdfde, 0xdfdf, 0xdfe0, 0xdfe1, 0xdfe2, 0xdfe3, 0xdfe4, 0xdfe5, 0xdfe6, 0xdfe7, 0xdfe8, 0xdfe9, 0xdfea, 0xdfeb, 0xdfec, 0xdfed, 0xdfee, 0xdfef, 0xdff0, 0xdff1, 0xdff2, 0xdff3, 0xdff4, 0xdff5, 0xdff6, 0xdff7, 0xdff8, 0xdff9, 0xdffa, 0xdffb, 0xdffc, 0xdffd, 0xdffe, 0xdfff, 0xe000, 0xe001, 0xe002, 0xe003, 0xe004, 0xe005, 0xe006, 0xe007, /* 0xe000 */ 0xe008, 0xe009, 0xe00a, 0xe00b, 0xe00c, 0xe00d, 0xe00e, 0xe00f, 0xe010, 0xe011, 0xe012, 0xe013, 0xe014, 0xe015, 0xe016, 0xe017, 0xe018, 0xe019, 0xe01a, 0xe01b, 0xe01c, 0xe01d, 0xe01e, 0xe01f, 0xe020, 0xe021, 0xe022, 0xe023, 0xe024, 0xe025, 0xe026, 0xe027, 0xe028, 0xe029, 0xe02a, 0xe02b, 0xe02c, 0xe02d, 0xe02e, 0xe02f, 0xe030, 0xe031, 0xe032, 0xe033, 0xe034, 0xe035, 0xe036, 0xe037, 0xe038, 0xe039, 0xe03a, 0xe03b, 0xe03c, 0xe03d, 0xe03e, 0xe03f, 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, /* 0xe040 */ 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061, 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069, 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe07f, 0xe080, 0xe081, 0xe082, 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, /* 0xe080 */ 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe0a1, 0xe0a2, 0xe0a3, 0xe0a4, 0xe0a5, 0xe0a6, 0xe0a7, 0xe0a8, 0xe0a9, 0xe0aa, 0xe0ab, 0xe0ac, 0xe0ad, 0xe0ae, 0xe0af, 0xe0b0, 0xe0b1, 0xe0b2, 0xe0b3, 0xe0b4, 0xe0b5, 0xe0b6, 0xe0b7, 0xe0b8, 0xe0b9, 0xe0ba, 0xe0bb, 0xe0bc, 0xe0bd, 0xe0be, 0xe0bf, 0xe0c0, 0xe0c1, 0xe0c2, 0xe0c3, 0xe0c4, 0xe0c5, 0xe0c6, 0xe0c7, /* 0xe0c0 */ 0xe0c8, 0xe0c9, 0xe0ca, 0xe0cb, 0xe0cc, 0xe0cd, 0xe0ce, 0xe0cf, 0xe0d0, 0xe0d1, 0xe0d2, 0xe0d3, 0xe0d4, 0xe0d5, 0xe0d6, 0xe0d7, 0xe0d8, 0xe0d9, 0xe0da, 0xe0db, 0xe0dc, 0xe0dd, 0xe0de, 0xe0df, 0xe0e0, 0xe0e1, 0xe0e2, 0xe0e3, 0xe0e4, 0xe0e5, 0xe0e6, 0xe0e7, 0xe0e8, 0xe0e9, 0xe0ea, 0xe0eb, 0xe0ec, 0xe0ed, 0xe0ee, 0xe0ef, 0xe0f0, 0xe0f1, 0xe0f2, 0xe0f3, 0xe0f4, 0xe0f5, 0xe0f6, 0xe0f7, 0xe0f8, 0xe0f9, 0xe0fa, 0xe0fb, 0xe0fc, 0xe0fd, 0xe0fe, 0xe0ff, 0xe100, 0xe101, 0xe102, 0xe103, 0xe104, 0xe105, 0xe106, 0xe107, /* 0xe100 */ 0xe108, 0xe109, 0xe10a, 0xe10b, 0xe10c, 0xe10d, 0xe10e, 0xe10f, 0xe110, 0xe111, 0xe112, 0xe113, 0xe114, 0xe115, 0xe116, 0xe117, 0xe118, 0xe119, 0xe11a, 0xe11b, 0xe11c, 0xe11d, 0xe11e, 0xe11f, 0xe120, 0xe121, 0xe122, 0xe123, 0xe124, 0xe125, 0xe126, 0xe127, 0xe128, 0xe129, 0xe12a, 0xe12b, 0xe12c, 0xe12d, 0xe12e, 0xe12f, 0xe130, 0xe131, 0xe132, 0xe133, 0xe134, 0xe135, 0xe136, 0xe137, 0xe138, 0xe139, 0xe13a, 0xe13b, 0xe13c, 0xe13d, 0xe13e, 0xe13f, 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, /* 0xe140 */ 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169, 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179, 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe17f, 0xe180, 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, /* 0xe180 */ 0xe188, 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a, 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe1a1, 0xe1a2, 0xe1a3, 0xe1a4, 0xe1a5, 0xe1a6, 0xe1a7, 0xe1a8, 0xe1a9, 0xe1aa, 0xe1ab, 0xe1ac, 0xe1ad, 0xe1ae, 0xe1af, 0xe1b0, 0xe1b1, 0xe1b2, 0xe1b3, 0xe1b4, 0xe1b5, 0xe1b6, 0xe1b7, 0xe1b8, 0xe1b9, 0xe1ba, 0xe1bb, 0xe1bc, 0xe1bd, 0xe1be, 0xe1bf, 0xe1c0, 0xe1c1, 0xe1c2, 0xe1c3, 0xe1c4, 0xe1c5, 0xe1c6, 0xe1c7, /* 0xe1c0 */ 0xe1c8, 0xe1c9, 0xe1ca, 0xe1cb, 0xe1cc, 0xe1cd, 0xe1ce, 0xe1cf, 0xe1d0, 0xe1d1, 0xe1d2, 0xe1d3, 0xe1d4, 0xe1d5, 0xe1d6, 0xe1d7, 0xe1d8, 0xe1d9, 0xe1da, 0xe1db, 0xe1dc, 0xe1dd, 0xe1de, 0xe1df, 0xe1e0, 0xe1e1, 0xe1e2, 0xe1e3, 0xe1e4, 0xe1e5, 0xe1e6, 0xe1e7, 0xe1e8, 0xe1e9, 0xe1ea, 0xe1eb, 0xe1ec, 0xe1ed, 0xe1ee, 0xe1ef, 0xe1f0, 0xe1f1, 0xe1f2, 0xe1f3, 0xe1f4, 0xe1f5, 0xe1f6, 0xe1f7, 0xe1f8, 0xe1f9, 0xe1fa, 0xe1fb, 0xe1fc, 0xe1fd, 0xe1fe, 0xe1ff, 0xe200, 0xe201, 0xe202, 0xe203, 0xe204, 0xe205, 0xe206, 0xe207, /* 0xe200 */ 0xe208, 0xe209, 0xe20a, 0xe20b, 0xe20c, 0xe20d, 0xe20e, 0xe20f, 0xe210, 0xe211, 0xe212, 0xe213, 0xe214, 0xe215, 0xe216, 0xe217, 0xe218, 0xe219, 0xe21a, 0xe21b, 0xe21c, 0xe21d, 0xe21e, 0xe21f, 0xe220, 0xe221, 0xe222, 0xe223, 0xe224, 0xe225, 0xe226, 0xe227, 0xe228, 0xe229, 0xe22a, 0xe22b, 0xe22c, 0xe22d, 0xe22e, 0xe22f, 0xe230, 0xe231, 0xe232, 0xe233, 0xe234, 0xe235, 0xe236, 0xe237, 0xe238, 0xe239, 0xe23a, 0xe23b, 0xe23c, 0xe23d, 0xe23e, 0xe23f, 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, /* 0xe240 */ 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe27f, 0xe280, 0xe281, 0xe282, 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, /* 0xe280 */ 0xe288, 0xe289, 0xe28a, 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe2a1, 0xe2a2, 0xe2a3, 0xe2a4, 0xe2a5, 0xe2a6, 0xe2a7, 0xe2a8, 0xe2a9, 0xe2aa, 0xe2ab, 0xe2ac, 0xe2ad, 0xe2ae, 0xe2af, 0xe2b0, 0xe2b1, 0xe2b2, 0xe2b3, 0xe2b4, 0xe2b5, 0xe2b6, 0xe2b7, 0xe2b8, 0xe2b9, 0xe2ba, 0xe2bb, 0xe2bc, 0xe2bd, 0xe2be, 0xe2bf, 0xe2c0, 0xe2c1, 0xe2c2, 0xe2c3, 0xe2c4, 0xe2c5, 0xe2c6, 0xe2c7, /* 0xe2c0 */ 0xe2c8, 0xe2c9, 0xe2ca, 0xe2cb, 0xe2cc, 0xe2cd, 0xe2ce, 0xe2cf, 0xe2d0, 0xe2d1, 0xe2d2, 0xe2d3, 0xe2d4, 0xe2d5, 0xe2d6, 0xe2d7, 0xe2d8, 0xe2d9, 0xe2da, 0xe2db, 0xe2dc, 0xe2dd, 0xe2de, 0xe2df, 0xe2e0, 0xe2e1, 0xe2e2, 0xe2e3, 0xe2e4, 0xe2e5, 0xe2e6, 0xe2e7, 0xe2e8, 0xe2e9, 0xe2ea, 0xe2eb, 0xe2ec, 0xe2ed, 0xe2ee, 0xe2ef, 0xe2f0, 0xe2f1, 0xe2f2, 0xe2f3, 0xe2f4, 0xe2f5, 0xe2f6, 0xe2f7, 0xe2f8, 0xe2f9, 0xe2fa, 0xe2fb, 0xe2fc, 0xe2fd, 0xe2fe, 0xe2ff, 0xe300, 0xe301, 0xe302, 0xe303, 0xe304, 0xe305, 0xe306, 0xe307, /* 0xe300 */ 0xe308, 0xe309, 0xe30a, 0xe30b, 0xe30c, 0xe30d, 0xe30e, 0xe30f, 0xe310, 0xe311, 0xe312, 0xe313, 0xe314, 0xe315, 0xe316, 0xe317, 0xe318, 0xe319, 0xe31a, 0xe31b, 0xe31c, 0xe31d, 0xe31e, 0xe31f, 0xe320, 0xe321, 0xe322, 0xe323, 0xe324, 0xe325, 0xe326, 0xe327, 0xe328, 0xe329, 0xe32a, 0xe32b, 0xe32c, 0xe32d, 0xe32e, 0xe32f, 0xe330, 0xe331, 0xe332, 0xe333, 0xe334, 0xe335, 0xe336, 0xe337, 0xe338, 0xe339, 0xe33a, 0xe33b, 0xe33c, 0xe33d, 0xe33e, 0xe33f, 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, /* 0xe340 */ 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe37f, 0xe380, 0xe381, 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, /* 0xe380 */ 0xe388, 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe3a1, 0xe3a2, 0xe3a3, 0xe3a4, 0xe3a5, 0xe3a6, 0xe3a7, 0xe3a8, 0xe3a9, 0xe3aa, 0xe3ab, 0xe3ac, 0xe3ad, 0xe3ae, 0xe3af, 0xe3b0, 0xe3b1, 0xe3b2, 0xe3b3, 0xe3b4, 0xe3b5, 0xe3b6, 0xe3b7, 0xe3b8, 0xe3b9, 0xe3ba, 0xe3bb, 0xe3bc, 0xe3bd, 0xe3be, 0xe3bf, 0xe3c0, 0xe3c1, 0xe3c2, 0xe3c3, 0xe3c4, 0xe3c5, 0xe3c6, 0xe3c7, /* 0xe3c0 */ 0xe3c8, 0xe3c9, 0xe3ca, 0xe3cb, 0xe3cc, 0xe3cd, 0xe3ce, 0xe3cf, 0xe3d0, 0xe3d1, 0xe3d2, 0xe3d3, 0xe3d4, 0xe3d5, 0xe3d6, 0xe3d7, 0xe3d8, 0xe3d9, 0xe3da, 0xe3db, 0xe3dc, 0xe3dd, 0xe3de, 0xe3df, 0xe3e0, 0xe3e1, 0xe3e2, 0xe3e3, 0xe3e4, 0xe3e5, 0xe3e6, 0xe3e7, 0xe3e8, 0xe3e9, 0xe3ea, 0xe3eb, 0xe3ec, 0xe3ed, 0xe3ee, 0xe3ef, 0xe3f0, 0xe3f1, 0xe3f2, 0xe3f3, 0xe3f4, 0xe3f5, 0xe3f6, 0xe3f7, 0xe3f8, 0xe3f9, 0xe3fa, 0xe3fb, 0xe3fc, 0xe3fd, 0xe3fe, 0xe3ff, 0xe400, 0xe401, 0xe402, 0xe403, 0xe404, 0xe405, 0xe406, 0xe407, /* 0xe400 */ 0xe408, 0xe409, 0xe40a, 0xe40b, 0xe40c, 0xe40d, 0xe40e, 0xe40f, 0xe410, 0xe411, 0xe412, 0xe413, 0xe414, 0xe415, 0xe416, 0xe417, 0xe418, 0xe419, 0xe41a, 0xe41b, 0xe41c, 0xe41d, 0xe41e, 0xe41f, 0xe420, 0xe421, 0xe422, 0xe423, 0xe424, 0xe425, 0xe426, 0xe427, 0xe428, 0xe429, 0xe42a, 0xe42b, 0xe42c, 0xe42d, 0xe42e, 0xe42f, 0xe430, 0xe431, 0xe432, 0xe433, 0xe434, 0xe435, 0xe436, 0xe437, 0xe438, 0xe439, 0xe43a, 0xe43b, 0xe43c, 0xe43d, 0xe43e, 0xe43f, 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, /* 0xe440 */ 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe47f, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, /* 0xe480 */ 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe4a1, 0xe4a2, 0xe4a3, 0xe4a4, 0xe4a5, 0xe4a6, 0xe4a7, 0xe4a8, 0xe4a9, 0xe4aa, 0xe4ab, 0xe4ac, 0xe4ad, 0xe4ae, 0xe4af, 0xe4b0, 0xe4b1, 0xe4b2, 0xe4b3, 0xe4b4, 0xe4b5, 0xe4b6, 0xe4b7, 0xe4b8, 0xe4b9, 0xe4ba, 0xe4bb, 0xe4bc, 0xe4bd, 0xe4be, 0xe4bf, 0xe4c0, 0xe4c1, 0xe4c2, 0xe4c3, 0xe4c4, 0xe4c5, 0xe4c6, 0xe4c7, /* 0xe4c0 */ 0xe4c8, 0xe4c9, 0xe4ca, 0xe4cb, 0xe4cc, 0xe4cd, 0xe4ce, 0xe4cf, 0xe4d0, 0xe4d1, 0xe4d2, 0xe4d3, 0xe4d4, 0xe4d5, 0xe4d6, 0xe4d7, 0xe4d8, 0xe4d9, 0xe4da, 0xe4db, 0xe4dc, 0xe4dd, 0xe4de, 0xe4df, 0xe4e0, 0xe4e1, 0xe4e2, 0xe4e3, 0xe4e4, 0xe4e5, 0xe4e6, 0xe4e7, 0xe4e8, 0xe4e9, 0xe4ea, 0xe4eb, 0xe4ec, 0xe4ed, 0xe4ee, 0xe4ef, 0xe4f0, 0xe4f1, 0xe4f2, 0xe4f3, 0xe4f4, 0xe4f5, 0xe4f6, 0xe4f7, 0xe4f8, 0xe4f9, 0xe4fa, 0xe4fb, 0xe4fc, 0xe4fd, 0xe4fe, 0xe4ff, 0xe500, 0xe501, 0xe502, 0xe503, 0xe504, 0xe505, 0xe506, 0xe507, /* 0xe500 */ 0xe508, 0xe509, 0xe50a, 0xe50b, 0xe50c, 0xe50d, 0xe50e, 0xe50f, 0xe510, 0xe511, 0xe512, 0xe513, 0xe514, 0xe515, 0xe516, 0xe517, 0xe518, 0xe519, 0xe51a, 0xe51b, 0xe51c, 0xe51d, 0xe51e, 0xe51f, 0xe520, 0xe521, 0xe522, 0xe523, 0xe524, 0xe525, 0xe526, 0xe527, 0xe528, 0xe529, 0xe52a, 0xe52b, 0xe52c, 0xe52d, 0xe52e, 0xe52f, 0xe530, 0xe531, 0xe532, 0xe533, 0xe534, 0xe535, 0xe536, 0xe537, 0xe538, 0xe539, 0xe53a, 0xe53b, 0xe53c, 0xe53d, 0xe53e, 0xe53f, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, /* 0xe540 */ 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe57f, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, /* 0xe580 */ 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe5a1, 0xe5a2, 0xe5a3, 0xe5a4, 0xe5a5, 0xe5a6, 0xe5a7, 0xe5a8, 0xe5a9, 0xe5aa, 0xe5ab, 0xe5ac, 0xe5ad, 0xe5ae, 0xe5af, 0xe5b0, 0xe5b1, 0xe5b2, 0xe5b3, 0xe5b4, 0xe5b5, 0xe5b6, 0xe5b7, 0xe5b8, 0xe5b9, 0xe5ba, 0xe5bb, 0xe5bc, 0xe5bd, 0xe5be, 0xe5bf, 0xe5c0, 0xe5c1, 0xe5c2, 0xe5c3, 0xe5c4, 0xe5c5, 0xe5c6, 0xe5c7, /* 0xe5c0 */ 0xe5c8, 0xe5c9, 0xe5ca, 0xe5cb, 0xe5cc, 0xe5cd, 0xe5ce, 0xe5cf, 0xe5d0, 0xe5d1, 0xe5d2, 0xe5d3, 0xe5d4, 0xe5d5, 0xe5d6, 0xe5d7, 0xe5d8, 0xe5d9, 0xe5da, 0xe5db, 0xe5dc, 0xe5dd, 0xe5de, 0xe5df, 0xe5e0, 0xe5e1, 0xe5e2, 0xe5e3, 0xe5e4, 0xe5e5, 0xe5e6, 0xe5e7, 0xe5e8, 0xe5e9, 0xe5ea, 0xe5eb, 0xe5ec, 0xe5ed, 0xe5ee, 0xe5ef, 0xe5f0, 0xe5f1, 0xe5f2, 0xe5f3, 0xe5f4, 0xe5f5, 0xe5f6, 0xe5f7, 0xe5f8, 0xe5f9, 0xe5fa, 0xe5fb, 0xe5fc, 0xe5fd, 0xe5fe, 0xe5ff, 0xe600, 0xe601, 0xe602, 0xe603, 0xe604, 0xe605, 0xe606, 0xe607, /* 0xe600 */ 0xe608, 0xe609, 0xe60a, 0xe60b, 0xe60c, 0xe60d, 0xe60e, 0xe60f, 0xe610, 0xe611, 0xe612, 0xe613, 0xe614, 0xe615, 0xe616, 0xe617, 0xe618, 0xe619, 0xe61a, 0xe61b, 0xe61c, 0xe61d, 0xe61e, 0xe61f, 0xe620, 0xe621, 0xe622, 0xe623, 0xe624, 0xe625, 0xe626, 0xe627, 0xe628, 0xe629, 0xe62a, 0xe62b, 0xe62c, 0xe62d, 0xe62e, 0xe62f, 0xe630, 0xe631, 0xe632, 0xe633, 0xe634, 0xe635, 0xe636, 0xe637, 0xe638, 0xe639, 0xe63a, 0xe63b, 0xe63c, 0xe63d, 0xe63e, 0xe63f, 0xe640, 0xe641, 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, /* 0xe640 */ 0xe648, 0xe649, 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe67f, 0xe680, 0xe681, 0xe682, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, /* 0xe680 */ 0xe688, 0xe689, 0xe68a, 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe6a1, 0xe6a2, 0xe6a3, 0xe6a4, 0xe6a5, 0xe6a6, 0xe6a7, 0xe6a8, 0xe6a9, 0xe6aa, 0xe6ab, 0xe6ac, 0xe6ad, 0xe6ae, 0xe6af, 0xe6b0, 0xe6b1, 0xe6b2, 0xe6b3, 0xe6b4, 0xe6b5, 0xe6b6, 0xe6b7, 0xe6b8, 0xe6b9, 0xe6ba, 0xe6bb, 0xe6bc, 0xe6bd, 0xe6be, 0xe6bf, 0xe6c0, 0xe6c1, 0xe6c2, 0xe6c3, 0xe6c4, 0xe6c5, 0xe6c6, 0xe6c7, /* 0xe6c0 */ 0xe6c8, 0xe6c9, 0xe6ca, 0xe6cb, 0xe6cc, 0xe6cd, 0xe6ce, 0xe6cf, 0xe6d0, 0xe6d1, 0xe6d2, 0xe6d3, 0xe6d4, 0xe6d5, 0xe6d6, 0xe6d7, 0xe6d8, 0xe6d9, 0xe6da, 0xe6db, 0xe6dc, 0xe6dd, 0xe6de, 0xe6df, 0xe6e0, 0xe6e1, 0xe6e2, 0xe6e3, 0xe6e4, 0xe6e5, 0xe6e6, 0xe6e7, 0xe6e8, 0xe6e9, 0xe6ea, 0xe6eb, 0xe6ec, 0xe6ed, 0xe6ee, 0xe6ef, 0xe6f0, 0xe6f1, 0xe6f2, 0xe6f3, 0xe6f4, 0xe6f5, 0xe6f6, 0xe6f7, 0xe6f8, 0xe6f9, 0xe6fa, 0xe6fb, 0xe6fc, 0xe6fd, 0xe6fe, 0xe6ff, 0xe700, 0xe701, 0xe702, 0xe703, 0xe704, 0xe705, 0xe706, 0xe707, /* 0xe700 */ 0xe708, 0xe709, 0xe70a, 0xe70b, 0xe70c, 0xe70d, 0xe70e, 0xe70f, 0xe710, 0xe711, 0xe712, 0xe713, 0xe714, 0xe715, 0xe716, 0xe717, 0xe718, 0xe719, 0xe71a, 0xe71b, 0xe71c, 0xe71d, 0xe71e, 0xe71f, 0xe720, 0xe721, 0xe722, 0xe723, 0xe724, 0xe725, 0xe726, 0xe727, 0xe728, 0xe729, 0xe72a, 0xe72b, 0xe72c, 0xe72d, 0xe72e, 0xe72f, 0xe730, 0xe731, 0xe732, 0xe733, 0xe734, 0xe735, 0xe736, 0xe737, 0xe738, 0xe739, 0xe73a, 0xe73b, 0xe73c, 0xe73d, 0xe73e, 0xe73f, 0xe740, 0xe741, 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, /* 0xe740 */ 0xe748, 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe77f, 0xe780, 0xe781, 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, /* 0xe780 */ 0xe788, 0xe789, 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe7a1, 0xe7a2, 0xe7a3, 0xe7a4, 0xe7a5, 0xe7a6, 0xe7a7, 0xe7a8, 0xe7a9, 0xe7aa, 0xe7ab, 0xe7ac, 0xe7ad, 0xe7ae, 0xe7af, 0xe7b0, 0xe7b1, 0xe7b2, 0xe7b3, 0xe7b4, 0xe7b5, 0xe7b6, 0xe7b7, 0xe7b8, 0xe7b9, 0xe7ba, 0xe7bb, 0xe7bc, 0xe7bd, 0xe7be, 0xe7bf, 0xe7c0, 0xe7c1, 0xe7c2, 0xe7c3, 0xe7c4, 0xe7c5, 0xe7c6, 0xe7c7, /* 0xe7c0 */ 0xe7c8, 0xe7c9, 0xe7ca, 0xe7cb, 0xe7cc, 0xe7cd, 0xe7ce, 0xe7cf, 0xe7d0, 0xe7d1, 0xe7d2, 0xe7d3, 0xe7d4, 0xe7d5, 0xe7d6, 0xe7d7, 0xe7d8, 0xe7d9, 0xe7da, 0xe7db, 0xe7dc, 0xe7dd, 0xe7de, 0xe7df, 0xe7e0, 0xe7e1, 0xe7e2, 0xe7e3, 0xe7e4, 0xe7e5, 0xe7e6, 0xe7e7, 0xe7e8, 0xe7e9, 0xe7ea, 0xe7eb, 0xe7ec, 0xe7ed, 0xe7ee, 0xe7ef, 0xe7f0, 0xe7f1, 0xe7f2, 0xe7f3, 0xe7f4, 0xe7f5, 0xe7f6, 0xe7f7, 0xe7f8, 0xe7f9, 0xe7fa, 0xe7fb, 0xe7fc, 0xe7fd, 0xe7fe, 0xe7ff, 0xe800, 0xe801, 0xe802, 0xe803, 0xe804, 0xe805, 0xe806, 0xe807, /* 0xe800 */ 0xe808, 0xe809, 0xe80a, 0xe80b, 0xe80c, 0xe80d, 0xe80e, 0xe80f, 0xe810, 0xe811, 0xe812, 0xe813, 0xe814, 0xe815, 0xe816, 0xe817, 0xe818, 0xe819, 0xe81a, 0xe81b, 0xe81c, 0xe81d, 0xe81e, 0xe81f, 0xe820, 0xe821, 0xe822, 0xe823, 0xe824, 0xe825, 0xe826, 0xe827, 0xe828, 0xe829, 0xe82a, 0xe82b, 0xe82c, 0xe82d, 0xe82e, 0xe82f, 0xe830, 0xe831, 0xe832, 0xe833, 0xe834, 0xe835, 0xe836, 0xe837, 0xe838, 0xe839, 0xe83a, 0xe83b, 0xe83c, 0xe83d, 0xe83e, 0xe83f, 0xe840, 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, /* 0xe840 */ 0xe848, 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879, 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe87f, 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, /* 0xe880 */ 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a, 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe8a1, 0xe8a2, 0xe8a3, 0xe8a4, 0xe8a5, 0xe8a6, 0xe8a7, 0xe8a8, 0xe8a9, 0xe8aa, 0xe8ab, 0xe8ac, 0xe8ad, 0xe8ae, 0xe8af, 0xe8b0, 0xe8b1, 0xe8b2, 0xe8b3, 0xe8b4, 0xe8b5, 0xe8b6, 0xe8b7, 0xe8b8, 0xe8b9, 0xe8ba, 0xe8bb, 0xe8bc, 0xe8bd, 0xe8be, 0xe8bf, 0xe8c0, 0xe8c1, 0xe8c2, 0xe8c3, 0xe8c4, 0xe8c5, 0xe8c6, 0xe8c7, /* 0xe8c0 */ 0xe8c8, 0xe8c9, 0xe8ca, 0xe8cb, 0xe8cc, 0xe8cd, 0xe8ce, 0xe8cf, 0xe8d0, 0xe8d1, 0xe8d2, 0xe8d3, 0xe8d4, 0xe8d5, 0xe8d6, 0xe8d7, 0xe8d8, 0xe8d9, 0xe8da, 0xe8db, 0xe8dc, 0xe8dd, 0xe8de, 0xe8df, 0xe8e0, 0xe8e1, 0xe8e2, 0xe8e3, 0xe8e4, 0xe8e5, 0xe8e6, 0xe8e7, 0xe8e8, 0xe8e9, 0xe8ea, 0xe8eb, 0xe8ec, 0xe8ed, 0xe8ee, 0xe8ef, 0xe8f0, 0xe8f1, 0xe8f2, 0xe8f3, 0xe8f4, 0xe8f5, 0xe8f6, 0xe8f7, 0xe8f8, 0xe8f9, 0xe8fa, 0xe8fb, 0xe8fc, 0xe8fd, 0xe8fe, 0xe8ff, 0xe900, 0xe901, 0xe902, 0xe903, 0xe904, 0xe905, 0xe906, 0xe907, /* 0xe900 */ 0xe908, 0xe909, 0xe90a, 0xe90b, 0xe90c, 0xe90d, 0xe90e, 0xe90f, 0xe910, 0xe911, 0xe912, 0xe913, 0xe914, 0xe915, 0xe916, 0xe917, 0xe918, 0xe919, 0xe91a, 0xe91b, 0xe91c, 0xe91d, 0xe91e, 0xe91f, 0xe920, 0xe921, 0xe922, 0xe923, 0xe924, 0xe925, 0xe926, 0xe927, 0xe928, 0xe929, 0xe92a, 0xe92b, 0xe92c, 0xe92d, 0xe92e, 0xe92f, 0xe930, 0xe931, 0xe932, 0xe933, 0xe934, 0xe935, 0xe936, 0xe937, 0xe938, 0xe939, 0xe93a, 0xe93b, 0xe93c, 0xe93d, 0xe93e, 0xe93f, 0xe940, 0xe941, 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, /* 0xe940 */ 0xe948, 0xe949, 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe97f, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, /* 0xe980 */ 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xe9a1, 0xe9a2, 0xe9a3, 0xe9a4, 0xe9a5, 0xe9a6, 0xe9a7, 0xe9a8, 0xe9a9, 0xe9aa, 0xe9ab, 0xe9ac, 0xe9ad, 0xe9ae, 0xe9af, 0xe9b0, 0xe9b1, 0xe9b2, 0xe9b3, 0xe9b4, 0xe9b5, 0xe9b6, 0xe9b7, 0xe9b8, 0xe9b9, 0xe9ba, 0xe9bb, 0xe9bc, 0xe9bd, 0xe9be, 0xe9bf, 0xe9c0, 0xe9c1, 0xe9c2, 0xe9c3, 0xe9c4, 0xe9c5, 0xe9c6, 0xe9c7, /* 0xe9c0 */ 0xe9c8, 0xe9c9, 0xe9ca, 0xe9cb, 0xe9cc, 0xe9cd, 0xe9ce, 0xe9cf, 0xe9d0, 0xe9d1, 0xe9d2, 0xe9d3, 0xe9d4, 0xe9d5, 0xe9d6, 0xe9d7, 0xe9d8, 0xe9d9, 0xe9da, 0xe9db, 0xe9dc, 0xe9dd, 0xe9de, 0xe9df, 0xe9e0, 0xe9e1, 0xe9e2, 0xe9e3, 0xe9e4, 0xe9e5, 0xe9e6, 0xe9e7, 0xe9e8, 0xe9e9, 0xe9ea, 0xe9eb, 0xe9ec, 0xe9ed, 0xe9ee, 0xe9ef, 0xe9f0, 0xe9f1, 0xe9f2, 0xe9f3, 0xe9f4, 0xe9f5, 0xe9f6, 0xe9f7, 0xe9f8, 0xe9f9, 0xe9fa, 0xe9fb, 0xe9fc, 0xe9fd, 0xe9fe, 0xe9ff, 0xea00, 0xea01, 0xea02, 0xea03, 0xea04, 0xea05, 0xea06, 0xea07, /* 0xea00 */ 0xea08, 0xea09, 0xea0a, 0xea0b, 0xea0c, 0xea0d, 0xea0e, 0xea0f, 0xea10, 0xea11, 0xea12, 0xea13, 0xea14, 0xea15, 0xea16, 0xea17, 0xea18, 0xea19, 0xea1a, 0xea1b, 0xea1c, 0xea1d, 0xea1e, 0xea1f, 0xea20, 0xea21, 0xea22, 0xea23, 0xea24, 0xea25, 0xea26, 0xea27, 0xea28, 0xea29, 0xea2a, 0xea2b, 0xea2c, 0xea2d, 0xea2e, 0xea2f, 0xea30, 0xea31, 0xea32, 0xea33, 0xea34, 0xea35, 0xea36, 0xea37, 0xea38, 0xea39, 0xea3a, 0xea3b, 0xea3c, 0xea3d, 0xea3e, 0xea3f, 0xea40, 0xea41, 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, /* 0xea40 */ 0xea48, 0xea49, 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61, 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69, 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71, 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79, 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea7f, 0xea80, 0xea81, 0xea82, 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, /* 0xea80 */ 0xea88, 0xea89, 0xea8a, 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeaa1, 0xeaa2, 0xeaa3, 0xeaa4, 0xeaa5, 0xeaa6, 0xeaa7, 0xeaa8, 0xeaa9, 0xeaaa, 0xeaab, 0xeaac, 0xeaad, 0xeaae, 0xeaaf, 0xeab0, 0xeab1, 0xeab2, 0xeab3, 0xeab4, 0xeab5, 0xeab6, 0xeab7, 0xeab8, 0xeab9, 0xeaba, 0xeabb, 0xeabc, 0xeabd, 0xeabe, 0xeabf, 0xeac0, 0xeac1, 0xeac2, 0xeac3, 0xeac4, 0xeac5, 0xeac6, 0xeac7, /* 0xeac0 */ 0xeac8, 0xeac9, 0xeaca, 0xeacb, 0xeacc, 0xeacd, 0xeace, 0xeacf, 0xead0, 0xead1, 0xead2, 0xead3, 0xead4, 0xead5, 0xead6, 0xead7, 0xead8, 0xead9, 0xeada, 0xeadb, 0xeadc, 0xeadd, 0xeade, 0xeadf, 0xeae0, 0xeae1, 0xeae2, 0xeae3, 0xeae4, 0xeae5, 0xeae6, 0xeae7, 0xeae8, 0xeae9, 0xeaea, 0xeaeb, 0xeaec, 0xeaed, 0xeaee, 0xeaef, 0xeaf0, 0xeaf1, 0xeaf2, 0xeaf3, 0xeaf4, 0xeaf5, 0xeaf6, 0xeaf7, 0xeaf8, 0xeaf9, 0xeafa, 0xeafb, 0xeafc, 0xeafd, 0xeafe, 0xeaff, 0xeb00, 0xeb01, 0xeb02, 0xeb03, 0xeb04, 0xeb05, 0xeb06, 0xeb07, /* 0xeb00 */ 0xeb08, 0xeb09, 0xeb0a, 0xeb0b, 0xeb0c, 0xeb0d, 0xeb0e, 0xeb0f, 0xeb10, 0xeb11, 0xeb12, 0xeb13, 0xeb14, 0xeb15, 0xeb16, 0xeb17, 0xeb18, 0xeb19, 0xeb1a, 0xeb1b, 0xeb1c, 0xeb1d, 0xeb1e, 0xeb1f, 0xeb20, 0xeb21, 0xeb22, 0xeb23, 0xeb24, 0xeb25, 0xeb26, 0xeb27, 0xeb28, 0xeb29, 0xeb2a, 0xeb2b, 0xeb2c, 0xeb2d, 0xeb2e, 0xeb2f, 0xeb30, 0xeb31, 0xeb32, 0xeb33, 0xeb34, 0xeb35, 0xeb36, 0xeb37, 0xeb38, 0xeb39, 0xeb3a, 0xeb3b, 0xeb3c, 0xeb3d, 0xeb3e, 0xeb3f, 0xeb40, 0xeb41, 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, /* 0xeb40 */ 0xeb48, 0xeb49, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61, 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69, 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb7f, 0xeb80, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, /* 0xeb80 */ 0xeb88, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92, 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xeba1, 0xeba2, 0xeba3, 0xeba4, 0xeba5, 0xeba6, 0xeba7, 0xeba8, 0xeba9, 0xebaa, 0xebab, 0xebac, 0xebad, 0xebae, 0xebaf, 0xebb0, 0xebb1, 0xebb2, 0xebb3, 0xebb4, 0xebb5, 0xebb6, 0xebb7, 0xebb8, 0xebb9, 0xebba, 0xebbb, 0xebbc, 0xebbd, 0xebbe, 0xebbf, 0xebc0, 0xebc1, 0xebc2, 0xebc3, 0xebc4, 0xebc5, 0xebc6, 0xebc7, /* 0xebc0 */ 0xebc8, 0xebc9, 0xebca, 0xebcb, 0xebcc, 0xebcd, 0xebce, 0xebcf, 0xebd0, 0xebd1, 0xebd2, 0xebd3, 0xebd4, 0xebd5, 0xebd6, 0xebd7, 0xebd8, 0xebd9, 0xebda, 0xebdb, 0xebdc, 0xebdd, 0xebde, 0xebdf, 0xebe0, 0xebe1, 0xebe2, 0xebe3, 0xebe4, 0xebe5, 0xebe6, 0xebe7, 0xebe8, 0xebe9, 0xebea, 0xebeb, 0xebec, 0xebed, 0xebee, 0xebef, 0xebf0, 0xebf1, 0xebf2, 0xebf3, 0xebf4, 0xebf5, 0xebf6, 0xebf7, 0xebf8, 0xebf9, 0xebfa, 0xebfb, 0xebfc, 0xebfd, 0xebfe, 0xebff, 0xec00, 0xec01, 0xec02, 0xec03, 0xec04, 0xec05, 0xec06, 0xec07, /* 0xec00 */ 0xec08, 0xec09, 0xec0a, 0xec0b, 0xec0c, 0xec0d, 0xec0e, 0xec0f, 0xec10, 0xec11, 0xec12, 0xec13, 0xec14, 0xec15, 0xec16, 0xec17, 0xec18, 0xec19, 0xec1a, 0xec1b, 0xec1c, 0xec1d, 0xec1e, 0xec1f, 0xec20, 0xec21, 0xec22, 0xec23, 0xec24, 0xec25, 0xec26, 0xec27, 0xec28, 0xec29, 0xec2a, 0xec2b, 0xec2c, 0xec2d, 0xec2e, 0xec2f, 0xec30, 0xec31, 0xec32, 0xec33, 0xec34, 0xec35, 0xec36, 0xec37, 0xec38, 0xec39, 0xec3a, 0xec3b, 0xec3c, 0xec3d, 0xec3e, 0xec3f, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, /* 0xec40 */ 0xec48, 0xec49, 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec7f, 0xec80, 0xec81, 0xec82, 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, /* 0xec80 */ 0xec88, 0xec89, 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a, 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xeca1, 0xeca2, 0xeca3, 0xeca4, 0xeca5, 0xeca6, 0xeca7, 0xeca8, 0xeca9, 0xecaa, 0xecab, 0xecac, 0xecad, 0xecae, 0xecaf, 0xecb0, 0xecb1, 0xecb2, 0xecb3, 0xecb4, 0xecb5, 0xecb6, 0xecb7, 0xecb8, 0xecb9, 0xecba, 0xecbb, 0xecbc, 0xecbd, 0xecbe, 0xecbf, 0xecc0, 0xecc1, 0xecc2, 0xecc3, 0xecc4, 0xecc5, 0xecc6, 0xecc7, /* 0xecc0 */ 0xecc8, 0xecc9, 0xecca, 0xeccb, 0xeccc, 0xeccd, 0xecce, 0xeccf, 0xecd0, 0xecd1, 0xecd2, 0xecd3, 0xecd4, 0xecd5, 0xecd6, 0xecd7, 0xecd8, 0xecd9, 0xecda, 0xecdb, 0xecdc, 0xecdd, 0xecde, 0xecdf, 0xece0, 0xece1, 0xece2, 0xece3, 0xece4, 0xece5, 0xece6, 0xece7, 0xece8, 0xece9, 0xecea, 0xeceb, 0xecec, 0xeced, 0xecee, 0xecef, 0xecf0, 0xecf1, 0xecf2, 0xecf3, 0xecf4, 0xecf5, 0xecf6, 0xecf7, 0xecf8, 0xecf9, 0xecfa, 0xecfb, 0xecfc, 0xecfd, 0xecfe, 0xecff, 0xed00, 0xed01, 0xed02, 0xed03, 0xed04, 0xed05, 0xed06, 0xed07, /* 0xed00 */ 0xed08, 0xed09, 0xed0a, 0xed0b, 0xed0c, 0xed0d, 0xed0e, 0xed0f, 0xed10, 0xed11, 0xed12, 0xed13, 0xed14, 0xed15, 0xed16, 0xed17, 0xed18, 0xed19, 0xed1a, 0xed1b, 0xed1c, 0xed1d, 0xed1e, 0xed1f, 0xed20, 0xed21, 0xed22, 0xed23, 0xed24, 0xed25, 0xed26, 0xed27, 0xed28, 0xed29, 0xed2a, 0xed2b, 0xed2c, 0xed2d, 0xed2e, 0xed2f, 0xed30, 0xed31, 0xed32, 0xed33, 0xed34, 0xed35, 0xed36, 0xed37, 0xed38, 0xed39, 0xed3a, 0xed3b, 0xed3c, 0xed3d, 0xed3e, 0xed3f, 0xed40, 0xed41, 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, /* 0xed40 */ 0xed48, 0xed49, 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51, 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed7f, 0xed80, 0xed81, 0xed82, 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, /* 0xed80 */ 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xeda1, 0xeda2, 0xeda3, 0xeda4, 0xeda5, 0xeda6, 0xeda7, 0xeda8, 0xeda9, 0xedaa, 0xedab, 0xedac, 0xedad, 0xedae, 0xedaf, 0xedb0, 0xedb1, 0xedb2, 0xedb3, 0xedb4, 0xedb5, 0xedb6, 0xedb7, 0xedb8, 0xedb9, 0xedba, 0xedbb, 0xedbc, 0xedbd, 0xedbe, 0xedbf, 0xedc0, 0xedc1, 0xedc2, 0xedc3, 0xedc4, 0xedc5, 0xedc6, 0xedc7, /* 0xedc0 */ 0xedc8, 0xedc9, 0xedca, 0xedcb, 0xedcc, 0xedcd, 0xedce, 0xedcf, 0xedd0, 0xedd1, 0xedd2, 0xedd3, 0xedd4, 0xedd5, 0xedd6, 0xedd7, 0xedd8, 0xedd9, 0xedda, 0xeddb, 0xeddc, 0xeddd, 0xedde, 0xeddf, 0xede0, 0xede1, 0xede2, 0xede3, 0xede4, 0xede5, 0xede6, 0xede7, 0xede8, 0xede9, 0xedea, 0xedeb, 0xedec, 0xeded, 0xedee, 0xedef, 0xedf0, 0xedf1, 0xedf2, 0xedf3, 0xedf4, 0xedf5, 0xedf6, 0xedf7, 0xedf8, 0xedf9, 0xedfa, 0xedfb, 0xedfc, 0xedfd, 0xedfe, 0xedff, 0xee00, 0xee01, 0xee02, 0xee03, 0xee04, 0xee05, 0xee06, 0xee07, /* 0xee00 */ 0xee08, 0xee09, 0xee0a, 0xee0b, 0xee0c, 0xee0d, 0xee0e, 0xee0f, 0xee10, 0xee11, 0xee12, 0xee13, 0xee14, 0xee15, 0xee16, 0xee17, 0xee18, 0xee19, 0xee1a, 0xee1b, 0xee1c, 0xee1d, 0xee1e, 0xee1f, 0xee20, 0xee21, 0xee22, 0xee23, 0xee24, 0xee25, 0xee26, 0xee27, 0xee28, 0xee29, 0xee2a, 0xee2b, 0xee2c, 0xee2d, 0xee2e, 0xee2f, 0xee30, 0xee31, 0xee32, 0xee33, 0xee34, 0xee35, 0xee36, 0xee37, 0xee38, 0xee39, 0xee3a, 0xee3b, 0xee3c, 0xee3d, 0xee3e, 0xee3f, 0xee40, 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, /* 0xee40 */ 0xee48, 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee7f, 0xee80, 0xee81, 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, /* 0xee80 */ 0xee88, 0xee89, 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xeea1, 0xeea2, 0xeea3, 0xeea4, 0xeea5, 0xeea6, 0xeea7, 0xeea8, 0xeea9, 0xeeaa, 0xeeab, 0xeeac, 0xeead, 0xeeae, 0xeeaf, 0xeeb0, 0xeeb1, 0xeeb2, 0xeeb3, 0xeeb4, 0xeeb5, 0xeeb6, 0xeeb7, 0xeeb8, 0xeeb9, 0xeeba, 0xeebb, 0xeebc, 0xeebd, 0xeebe, 0xeebf, 0xeec0, 0xeec1, 0xeec2, 0xeec3, 0xeec4, 0xeec5, 0xeec6, 0xeec7, /* 0xeec0 */ 0xeec8, 0xeec9, 0xeeca, 0xeecb, 0xeecc, 0xeecd, 0xeece, 0xeecf, 0xeed0, 0xeed1, 0xeed2, 0xeed3, 0xeed4, 0xeed5, 0xeed6, 0xeed7, 0xeed8, 0xeed9, 0xeeda, 0xeedb, 0xeedc, 0xeedd, 0xeede, 0xeedf, 0xeee0, 0xeee1, 0xeee2, 0xeee3, 0xeee4, 0xeee5, 0xeee6, 0xeee7, 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xeeed, 0xeeee, 0xeeef, 0xeef0, 0xeef1, 0xeef2, 0xeef3, 0xeef4, 0xeef5, 0xeef6, 0xeef7, 0xeef8, 0xeef9, 0xeefa, 0xeefb, 0xeefc, 0xeefd, 0xeefe, 0xeeff, 0xef00, 0xef01, 0xef02, 0xef03, 0xef04, 0xef05, 0xef06, 0xef07, /* 0xef00 */ 0xef08, 0xef09, 0xef0a, 0xef0b, 0xef0c, 0xef0d, 0xef0e, 0xef0f, 0xef10, 0xef11, 0xef12, 0xef13, 0xef14, 0xef15, 0xef16, 0xef17, 0xef18, 0xef19, 0xef1a, 0xef1b, 0xef1c, 0xef1d, 0xef1e, 0xef1f, 0xef20, 0xef21, 0xef22, 0xef23, 0xef24, 0xef25, 0xef26, 0xef27, 0xef28, 0xef29, 0xef2a, 0xef2b, 0xef2c, 0xef2d, 0xef2e, 0xef2f, 0xef30, 0xef31, 0xef32, 0xef33, 0xef34, 0xef35, 0xef36, 0xef37, 0xef38, 0xef39, 0xef3a, 0xef3b, 0xef3c, 0xef3d, 0xef3e, 0xef3f, 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, /* 0xef40 */ 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef7f, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, /* 0xef80 */ 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xefa1, 0xefa2, 0xefa3, 0xefa4, 0xefa5, 0xefa6, 0xefa7, 0xefa8, 0xefa9, 0xefaa, 0xefab, 0xefac, 0xefad, 0xefae, 0xefaf, 0xefb0, 0xefb1, 0xefb2, 0xefb3, 0xefb4, 0xefb5, 0xefb6, 0xefb7, 0xefb8, 0xefb9, 0xefba, 0xefbb, 0xefbc, 0xefbd, 0xefbe, 0xefbf, 0xefc0, 0xefc1, 0xefc2, 0xefc3, 0xefc4, 0xefc5, 0xefc6, 0xefc7, /* 0xefc0 */ 0xefc8, 0xefc9, 0xefca, 0xefcb, 0xefcc, 0xefcd, 0xefce, 0xefcf, 0xefd0, 0xefd1, 0xefd2, 0xefd3, 0xefd4, 0xefd5, 0xefd6, 0xefd7, 0xefd8, 0xefd9, 0xefda, 0xefdb, 0xefdc, 0xefdd, 0xefde, 0xefdf, 0xefe0, 0xefe1, 0xefe2, 0xefe3, 0xefe4, 0xefe5, 0xefe6, 0xefe7, 0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec, 0xefed, 0xefee, 0xefef, 0xeff0, 0xeff1, 0xeff2, 0xeff3, 0xeff4, 0xeff5, 0xeff6, 0xeff7, 0xeff8, 0xeff9, 0xeffa, 0xeffb, 0xeffc, 0xeffd, 0xeffe, 0xefff, 0xf000, 0xf001, 0xf002, 0xf003, 0xf004, 0xf005, 0xf006, 0xf007, /* 0xf000 */ 0xf008, 0xf009, 0xf00a, 0xf00b, 0xf00c, 0xf00d, 0xf00e, 0xf00f, 0xf010, 0xf011, 0xf012, 0xf013, 0xf014, 0xf015, 0xf016, 0xf017, 0xf018, 0xf019, 0xf01a, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf020, 0xf021, 0xf022, 0xf023, 0xf024, 0xf025, 0xf026, 0xf027, 0xf028, 0xf029, 0xf02a, 0xf02b, 0xf02c, 0xf02d, 0xf02e, 0xf02f, 0xf030, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038, 0xf039, 0xf03a, 0xf03b, 0xf03c, 0xf03d, 0xf03e, 0xf03f, 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, /* 0xf040 */ 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf07f, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, /* 0xf080 */ 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf0a1, 0xf0a2, 0xf0a3, 0xf0a4, 0xf0a5, 0xf0a6, 0xf0a7, 0xf0a8, 0xf0a9, 0xf0aa, 0xf0ab, 0xf0ac, 0xf0ad, 0xf0ae, 0xf0af, 0xf0b0, 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xf0b6, 0xf0b7, 0xf0b8, 0xf0b9, 0xf0ba, 0xf0bb, 0xf0bc, 0xf0bd, 0xf0be, 0xf0bf, 0xf0c0, 0xf0c1, 0xf0c2, 0xf0c3, 0xf0c4, 0xf0c5, 0xf0c6, 0xf0c7, /* 0xf0c0 */ 0xf0c8, 0xf0c9, 0xf0ca, 0xf0cb, 0xf0cc, 0xf0cd, 0xf0ce, 0xf0cf, 0xf0d0, 0xf0d1, 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d7, 0xf0d8, 0xf0d9, 0xf0da, 0xf0db, 0xf0dc, 0xf0dd, 0xf0de, 0xf0df, 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf0e5, 0xf0e6, 0xf0e7, 0xf0e8, 0xf0e9, 0xf0ea, 0xf0eb, 0xf0ec, 0xf0ed, 0xf0ee, 0xf0ef, 0xf0f0, 0xf0f1, 0xf0f2, 0xf0f3, 0xf0f4, 0xf0f5, 0xf0f6, 0xf0f7, 0xf0f8, 0xf0f9, 0xf0fa, 0xf0fb, 0xf0fc, 0xf0fd, 0xf0fe, 0xf0ff, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, /* 0xf100 */ 0xf108, 0xf109, 0xf10a, 0xf10b, 0xf10c, 0xf10d, 0xf10e, 0xf10f, 0xf110, 0xf111, 0xf112, 0xf113, 0xf114, 0xf115, 0xf116, 0xf117, 0xf118, 0xf119, 0xf11a, 0xf11b, 0xf11c, 0xf11d, 0xf11e, 0xf11f, 0xf120, 0xf121, 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf127, 0xf128, 0xf129, 0xf12a, 0xf12b, 0xf12c, 0xf12d, 0xf12e, 0xf12f, 0xf130, 0xf131, 0xf132, 0xf133, 0xf134, 0xf135, 0xf136, 0xf137, 0xf138, 0xf139, 0xf13a, 0xf13b, 0xf13c, 0xf13d, 0xf13e, 0xf13f, 0xf140, 0xf141, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, /* 0xf140 */ 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf17f, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, /* 0xf180 */ 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf1a1, 0xf1a2, 0xf1a3, 0xf1a4, 0xf1a5, 0xf1a6, 0xf1a7, 0xf1a8, 0xf1a9, 0xf1aa, 0xf1ab, 0xf1ac, 0xf1ad, 0xf1ae, 0xf1af, 0xf1b0, 0xf1b1, 0xf1b2, 0xf1b3, 0xf1b4, 0xf1b5, 0xf1b6, 0xf1b7, 0xf1b8, 0xf1b9, 0xf1ba, 0xf1bb, 0xf1bc, 0xf1bd, 0xf1be, 0xf1bf, 0xf1c0, 0xf1c1, 0xf1c2, 0xf1c3, 0xf1c4, 0xf1c5, 0xf1c6, 0xf1c7, /* 0xf1c0 */ 0xf1c8, 0xf1c9, 0xf1ca, 0xf1cb, 0xf1cc, 0xf1cd, 0xf1ce, 0xf1cf, 0xf1d0, 0xf1d1, 0xf1d2, 0xf1d3, 0xf1d4, 0xf1d5, 0xf1d6, 0xf1d7, 0xf1d8, 0xf1d9, 0xf1da, 0xf1db, 0xf1dc, 0xf1dd, 0xf1de, 0xf1df, 0xf1e0, 0xf1e1, 0xf1e2, 0xf1e3, 0xf1e4, 0xf1e5, 0xf1e6, 0xf1e7, 0xf1e8, 0xf1e9, 0xf1ea, 0xf1eb, 0xf1ec, 0xf1ed, 0xf1ee, 0xf1ef, 0xf1f0, 0xf1f1, 0xf1f2, 0xf1f3, 0xf1f4, 0xf1f5, 0xf1f6, 0xf1f7, 0xf1f8, 0xf1f9, 0xf1fa, 0xf1fb, 0xf1fc, 0xf1fd, 0xf1fe, 0xf1ff, 0xf200, 0xf201, 0xf202, 0xf203, 0xf204, 0xf205, 0xf206, 0xf207, /* 0xf200 */ 0xf208, 0xf209, 0xf20a, 0xf20b, 0xf20c, 0xf20d, 0xf20e, 0xf20f, 0xf210, 0xf211, 0xf212, 0xf213, 0xf214, 0xf215, 0xf216, 0xf217, 0xf218, 0xf219, 0xf21a, 0xf21b, 0xf21c, 0xf21d, 0xf21e, 0xf21f, 0xf220, 0xf221, 0xf222, 0xf223, 0xf224, 0xf225, 0xf226, 0xf227, 0xf228, 0xf229, 0xf22a, 0xf22b, 0xf22c, 0xf22d, 0xf22e, 0xf22f, 0xf230, 0xf231, 0xf232, 0xf233, 0xf234, 0xf235, 0xf236, 0xf237, 0xf238, 0xf239, 0xf23a, 0xf23b, 0xf23c, 0xf23d, 0xf23e, 0xf23f, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, /* 0xf240 */ 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf27f, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, /* 0xf280 */ 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf2a1, 0xf2a2, 0xf2a3, 0xf2a4, 0xf2a5, 0xf2a6, 0xf2a7, 0xf2a8, 0xf2a9, 0xf2aa, 0xf2ab, 0xf2ac, 0xf2ad, 0xf2ae, 0xf2af, 0xf2b0, 0xf2b1, 0xf2b2, 0xf2b3, 0xf2b4, 0xf2b5, 0xf2b6, 0xf2b7, 0xf2b8, 0xf2b9, 0xf2ba, 0xf2bb, 0xf2bc, 0xf2bd, 0xf2be, 0xf2bf, 0xf2c0, 0xf2c1, 0xf2c2, 0xf2c3, 0xf2c4, 0xf2c5, 0xf2c6, 0xf2c7, /* 0xf2c0 */ 0xf2c8, 0xf2c9, 0xf2ca, 0xf2cb, 0xf2cc, 0xf2cd, 0xf2ce, 0xf2cf, 0xf2d0, 0xf2d1, 0xf2d2, 0xf2d3, 0xf2d4, 0xf2d5, 0xf2d6, 0xf2d7, 0xf2d8, 0xf2d9, 0xf2da, 0xf2db, 0xf2dc, 0xf2dd, 0xf2de, 0xf2df, 0xf2e0, 0xf2e1, 0xf2e2, 0xf2e3, 0xf2e4, 0xf2e5, 0xf2e6, 0xf2e7, 0xf2e8, 0xf2e9, 0xf2ea, 0xf2eb, 0xf2ec, 0xf2ed, 0xf2ee, 0xf2ef, 0xf2f0, 0xf2f1, 0xf2f2, 0xf2f3, 0xf2f4, 0xf2f5, 0xf2f6, 0xf2f7, 0xf2f8, 0xf2f9, 0xf2fa, 0xf2fb, 0xf2fc, 0xf2fd, 0xf2fe, 0xf2ff, 0xf300, 0xf301, 0xf302, 0xf303, 0xf304, 0xf305, 0xf306, 0xf307, /* 0xf300 */ 0xf308, 0xf309, 0xf30a, 0xf30b, 0xf30c, 0xf30d, 0xf30e, 0xf30f, 0xf310, 0xf311, 0xf312, 0xf313, 0xf314, 0xf315, 0xf316, 0xf317, 0xf318, 0xf319, 0xf31a, 0xf31b, 0xf31c, 0xf31d, 0xf31e, 0xf31f, 0xf320, 0xf321, 0xf322, 0xf323, 0xf324, 0xf325, 0xf326, 0xf327, 0xf328, 0xf329, 0xf32a, 0xf32b, 0xf32c, 0xf32d, 0xf32e, 0xf32f, 0xf330, 0xf331, 0xf332, 0xf333, 0xf334, 0xf335, 0xf336, 0xf337, 0xf338, 0xf339, 0xf33a, 0xf33b, 0xf33c, 0xf33d, 0xf33e, 0xf33f, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, /* 0xf340 */ 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf37f, 0xf380, 0xf381, 0xf382, 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, /* 0xf380 */ 0xf388, 0xf389, 0xf38a, 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a, 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0xf3a0, 0xf3a1, 0xf3a2, 0xf3a3, 0xf3a4, 0xf3a5, 0xf3a6, 0xf3a7, 0xf3a8, 0xf3a9, 0xf3aa, 0xf3ab, 0xf3ac, 0xf3ad, 0xf3ae, 0xf3af, 0xf3b0, 0xf3b1, 0xf3b2, 0xf3b3, 0xf3b4, 0xf3b5, 0xf3b6, 0xf3b7, 0xf3b8, 0xf3b9, 0xf3ba, 0xf3bb, 0xf3bc, 0xf3bd, 0xf3be, 0xf3bf, 0xf3c0, 0xf3c1, 0xf3c2, 0xf3c3, 0xf3c4, 0xf3c5, 0xf3c6, 0xf3c7, /* 0xf3c0 */ 0xf3c8, 0xf3c9, 0xf3ca, 0xf3cb, 0xf3cc, 0xf3cd, 0xf3ce, 0xf3cf, 0xf3d0, 0xf3d1, 0xf3d2, 0xf3d3, 0xf3d4, 0xf3d5, 0xf3d6, 0xf3d7, 0xf3d8, 0xf3d9, 0xf3da, 0xf3db, 0xf3dc, 0xf3dd, 0xf3de, 0xf3df, 0xf3e0, 0xf3e1, 0xf3e2, 0xf3e3, 0xf3e4, 0xf3e5, 0xf3e6, 0xf3e7, 0xf3e8, 0xf3e9, 0xf3ea, 0xf3eb, 0xf3ec, 0xf3ed, 0xf3ee, 0xf3ef, 0xf3f0, 0xf3f1, 0xf3f2, 0xf3f3, 0xf3f4, 0xf3f5, 0xf3f6, 0xf3f7, 0xf3f8, 0xf3f9, 0xf3fa, 0xf3fb, 0xf3fc, 0xf3fd, 0xf3fe, 0xf3ff, 0xf400, 0xf401, 0xf402, 0xf403, 0xf404, 0xf405, 0xf406, 0xf407, /* 0xf400 */ 0xf408, 0xf409, 0xf40a, 0xf40b, 0xf40c, 0xf40d, 0xf40e, 0xf40f, 0xf410, 0xf411, 0xf412, 0xf413, 0xf414, 0xf415, 0xf416, 0xf417, 0xf418, 0xf419, 0xf41a, 0xf41b, 0xf41c, 0xf41d, 0xf41e, 0xf41f, 0xf420, 0xf421, 0xf422, 0xf423, 0xf424, 0xf425, 0xf426, 0xf427, 0xf428, 0xf429, 0xf42a, 0xf42b, 0xf42c, 0xf42d, 0xf42e, 0xf42f, 0xf430, 0xf431, 0xf432, 0xf433, 0xf434, 0xf435, 0xf436, 0xf437, 0xf438, 0xf439, 0xf43a, 0xf43b, 0xf43c, 0xf43d, 0xf43e, 0xf43f, 0xf440, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, /* 0xf440 */ 0xf448, 0xf449, 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471, 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479, 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf47f, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, /* 0xf480 */ 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf4a1, 0xf4a2, 0xf4a3, 0xf4a4, 0xf4a5, 0xf4a6, 0xf4a7, 0xf4a8, 0xf4a9, 0xf4aa, 0xf4ab, 0xf4ac, 0xf4ad, 0xf4ae, 0xf4af, 0xf4b0, 0xf4b1, 0xf4b2, 0xf4b3, 0xf4b4, 0xf4b5, 0xf4b6, 0xf4b7, 0xf4b8, 0xf4b9, 0xf4ba, 0xf4bb, 0xf4bc, 0xf4bd, 0xf4be, 0xf4bf, 0xf4c0, 0xf4c1, 0xf4c2, 0xf4c3, 0xf4c4, 0xf4c5, 0xf4c6, 0xf4c7, /* 0xf4c0 */ 0xf4c8, 0xf4c9, 0xf4ca, 0xf4cb, 0xf4cc, 0xf4cd, 0xf4ce, 0xf4cf, 0xf4d0, 0xf4d1, 0xf4d2, 0xf4d3, 0xf4d4, 0xf4d5, 0xf4d6, 0xf4d7, 0xf4d8, 0xf4d9, 0xf4da, 0xf4db, 0xf4dc, 0xf4dd, 0xf4de, 0xf4df, 0xf4e0, 0xf4e1, 0xf4e2, 0xf4e3, 0xf4e4, 0xf4e5, 0xf4e6, 0xf4e7, 0xf4e8, 0xf4e9, 0xf4ea, 0xf4eb, 0xf4ec, 0xf4ed, 0xf4ee, 0xf4ef, 0xf4f0, 0xf4f1, 0xf4f2, 0xf4f3, 0xf4f4, 0xf4f5, 0xf4f6, 0xf4f7, 0xf4f8, 0xf4f9, 0xf4fa, 0xf4fb, 0xf4fc, 0xf4fd, 0xf4fe, 0xf4ff, 0xf500, 0xf501, 0xf502, 0xf503, 0xf504, 0xf505, 0xf506, 0xf507, /* 0xf500 */ 0xf508, 0xf509, 0xf50a, 0xf50b, 0xf50c, 0xf50d, 0xf50e, 0xf50f, 0xf510, 0xf511, 0xf512, 0xf513, 0xf514, 0xf515, 0xf516, 0xf517, 0xf518, 0xf519, 0xf51a, 0xf51b, 0xf51c, 0xf51d, 0xf51e, 0xf51f, 0xf520, 0xf521, 0xf522, 0xf523, 0xf524, 0xf525, 0xf526, 0xf527, 0xf528, 0xf529, 0xf52a, 0xf52b, 0xf52c, 0xf52d, 0xf52e, 0xf52f, 0xf530, 0xf531, 0xf532, 0xf533, 0xf534, 0xf535, 0xf536, 0xf537, 0xf538, 0xf539, 0xf53a, 0xf53b, 0xf53c, 0xf53d, 0xf53e, 0xf53f, 0xf540, 0xf541, 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, /* 0xf540 */ 0xf548, 0xf549, 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf57f, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, /* 0xf580 */ 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf5a1, 0xf5a2, 0xf5a3, 0xf5a4, 0xf5a5, 0xf5a6, 0xf5a7, 0xf5a8, 0xf5a9, 0xf5aa, 0xf5ab, 0xf5ac, 0xf5ad, 0xf5ae, 0xf5af, 0xf5b0, 0xf5b1, 0xf5b2, 0xf5b3, 0xf5b4, 0xf5b5, 0xf5b6, 0xf5b7, 0xf5b8, 0xf5b9, 0xf5ba, 0xf5bb, 0xf5bc, 0xf5bd, 0xf5be, 0xf5bf, 0xf5c0, 0xf5c1, 0xf5c2, 0xf5c3, 0xf5c4, 0xf5c5, 0xf5c6, 0xf5c7, /* 0xf5c0 */ 0xf5c8, 0xf5c9, 0xf5ca, 0xf5cb, 0xf5cc, 0xf5cd, 0xf5ce, 0xf5cf, 0xf5d0, 0xf5d1, 0xf5d2, 0xf5d3, 0xf5d4, 0xf5d5, 0xf5d6, 0xf5d7, 0xf5d8, 0xf5d9, 0xf5da, 0xf5db, 0xf5dc, 0xf5dd, 0xf5de, 0xf5df, 0xf5e0, 0xf5e1, 0xf5e2, 0xf5e3, 0xf5e4, 0xf5e5, 0xf5e6, 0xf5e7, 0xf5e8, 0xf5e9, 0xf5ea, 0xf5eb, 0xf5ec, 0xf5ed, 0xf5ee, 0xf5ef, 0xf5f0, 0xf5f1, 0xf5f2, 0xf5f3, 0xf5f4, 0xf5f5, 0xf5f6, 0xf5f7, 0xf5f8, 0xf5f9, 0xf5fa, 0xf5fb, 0xf5fc, 0xf5fd, 0xf5fe, 0xf5ff, 0xf600, 0xf601, 0xf602, 0xf603, 0xf604, 0xf605, 0xf606, 0xf607, /* 0xf600 */ 0xf608, 0xf609, 0xf60a, 0xf60b, 0xf60c, 0xf60d, 0xf60e, 0xf60f, 0xf610, 0xf611, 0xf612, 0xf613, 0xf614, 0xf615, 0xf616, 0xf617, 0xf618, 0xf619, 0xf61a, 0xf61b, 0xf61c, 0xf61d, 0xf61e, 0xf61f, 0xf620, 0xf621, 0xf622, 0xf623, 0xf624, 0xf625, 0xf626, 0xf627, 0xf628, 0xf629, 0xf62a, 0xf62b, 0xf62c, 0xf62d, 0xf62e, 0xf62f, 0xf630, 0xf631, 0xf632, 0xf633, 0xf634, 0xf635, 0xf636, 0xf637, 0xf638, 0xf639, 0xf63a, 0xf63b, 0xf63c, 0xf63d, 0xf63e, 0xf63f, 0xf640, 0xf641, 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, /* 0xf640 */ 0xf648, 0xf649, 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf67f, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, /* 0xf680 */ 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf6a1, 0xf6a2, 0xf6a3, 0xf6a4, 0xf6a5, 0xf6a6, 0xf6a7, 0xf6a8, 0xf6a9, 0xf6aa, 0xf6ab, 0xf6ac, 0xf6ad, 0xf6ae, 0xf6af, 0xf6b0, 0xf6b1, 0xf6b2, 0xf6b3, 0xf6b4, 0xf6b5, 0xf6b6, 0xf6b7, 0xf6b8, 0xf6b9, 0xf6ba, 0xf6bb, 0xf6bc, 0xf6bd, 0xf6be, 0xf6bf, 0xf6c0, 0xf6c1, 0xf6c2, 0xf6c3, 0xf6c4, 0xf6c5, 0xf6c6, 0xf6c7, /* 0xf6c0 */ 0xf6c8, 0xf6c9, 0xf6ca, 0xf6cb, 0xf6cc, 0xf6cd, 0xf6ce, 0xf6cf, 0xf6d0, 0xf6d1, 0xf6d2, 0xf6d3, 0xf6d4, 0xf6d5, 0xf6d6, 0xf6d7, 0xf6d8, 0xf6d9, 0xf6da, 0xf6db, 0xf6dc, 0xf6dd, 0xf6de, 0xf6df, 0xf6e0, 0xf6e1, 0xf6e2, 0xf6e3, 0xf6e4, 0xf6e5, 0xf6e6, 0xf6e7, 0xf6e8, 0xf6e9, 0xf6ea, 0xf6eb, 0xf6ec, 0xf6ed, 0xf6ee, 0xf6ef, 0xf6f0, 0xf6f1, 0xf6f2, 0xf6f3, 0xf6f4, 0xf6f5, 0xf6f6, 0xf6f7, 0xf6f8, 0xf6f9, 0xf6fa, 0xf6fb, 0xf6fc, 0xf6fd, 0xf6fe, 0xf6ff, 0xf700, 0xf701, 0xf702, 0xf703, 0xf704, 0xf705, 0xf706, 0xf707, /* 0xf700 */ 0xf708, 0xf709, 0xf70a, 0xf70b, 0xf70c, 0xf70d, 0xf70e, 0xf70f, 0xf710, 0xf711, 0xf712, 0xf713, 0xf714, 0xf715, 0xf716, 0xf717, 0xf718, 0xf719, 0xf71a, 0xf71b, 0xf71c, 0xf71d, 0xf71e, 0xf71f, 0xf720, 0xf721, 0xf722, 0xf723, 0xf724, 0xf725, 0xf726, 0xf727, 0xf728, 0xf729, 0xf72a, 0xf72b, 0xf72c, 0xf72d, 0xf72e, 0xf72f, 0xf730, 0xf731, 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0xf73a, 0xf73b, 0xf73c, 0xf73d, 0xf73e, 0xf73f, 0xf740, 0xf741, 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, /* 0xf740 */ 0xf748, 0xf749, 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf77f, 0xf780, 0xf781, 0xf782, 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, /* 0xf780 */ 0xf788, 0xf789, 0xf78a, 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792, 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a, 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4, 0xf7a5, 0xf7a6, 0xf7a7, 0xf7a8, 0xf7a9, 0xf7aa, 0xf7ab, 0xf7ac, 0xf7ad, 0xf7ae, 0xf7af, 0xf7b0, 0xf7b1, 0xf7b2, 0xf7b3, 0xf7b4, 0xf7b5, 0xf7b6, 0xf7b7, 0xf7b8, 0xf7b9, 0xf7ba, 0xf7bb, 0xf7bc, 0xf7bd, 0xf7be, 0xf7bf, 0xf7c0, 0xf7c1, 0xf7c2, 0xf7c3, 0xf7c4, 0xf7c5, 0xf7c6, 0xf7c7, /* 0xf7c0 */ 0xf7c8, 0xf7c9, 0xf7ca, 0xf7cb, 0xf7cc, 0xf7cd, 0xf7ce, 0xf7cf, 0xf7d0, 0xf7d1, 0xf7d2, 0xf7d3, 0xf7d4, 0xf7d5, 0xf7d6, 0xf7d7, 0xf7d8, 0xf7d9, 0xf7da, 0xf7db, 0xf7dc, 0xf7dd, 0xf7de, 0xf7df, 0xf7e0, 0xf7e1, 0xf7e2, 0xf7e3, 0xf7e4, 0xf7e5, 0xf7e6, 0xf7e7, 0xf7e8, 0xf7e9, 0xf7ea, 0xf7eb, 0xf7ec, 0xf7ed, 0xf7ee, 0xf7ef, 0xf7f0, 0xf7f1, 0xf7f2, 0xf7f3, 0xf7f4, 0xf7f5, 0xf7f6, 0xf7f7, 0xf7f8, 0xf7f9, 0xf7fa, 0xf7fb, 0xf7fc, 0xf7fd, 0xf7fe, 0xf7ff, 0xf800, 0xf801, 0xf802, 0xf803, 0xf804, 0xf805, 0xf806, 0xf807, /* 0xf800 */ 0xf808, 0xf809, 0xf80a, 0xf80b, 0xf80c, 0xf80d, 0xf80e, 0xf80f, 0xf810, 0xf811, 0xf812, 0xf813, 0xf814, 0xf815, 0xf816, 0xf817, 0xf818, 0xf819, 0xf81a, 0xf81b, 0xf81c, 0xf81d, 0xf81e, 0xf81f, 0xf820, 0xf821, 0xf822, 0xf823, 0xf824, 0xf825, 0xf826, 0xf827, 0xf828, 0xf829, 0xf82a, 0xf82b, 0xf82c, 0xf82d, 0xf82e, 0xf82f, 0xf830, 0xf831, 0xf832, 0xf833, 0xf834, 0xf835, 0xf836, 0xf837, 0xf838, 0xf839, 0xf83a, 0xf83b, 0xf83c, 0xf83d, 0xf83e, 0xf83f, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, /* 0xf840 */ 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf87f, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, /* 0xf880 */ 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf8a1, 0xf8a2, 0xf8a3, 0xf8a4, 0xf8a5, 0xf8a6, 0xf8a7, 0xf8a8, 0xf8a9, 0xf8aa, 0xf8ab, 0xf8ac, 0xf8ad, 0xf8ae, 0xf8af, 0xf8b0, 0xf8b1, 0xf8b2, 0xf8b3, 0xf8b4, 0xf8b5, 0xf8b6, 0xf8b7, 0xf8b8, 0xf8b9, 0xf8ba, 0xf8bb, 0xf8bc, 0xf8bd, 0xf8be, 0xf8bf, 0xf8c0, 0xf8c1, 0xf8c2, 0xf8c3, 0xf8c4, 0xf8c5, 0xf8c6, 0xf8c7, /* 0xf8c0 */ 0xf8c8, 0xf8c9, 0xf8ca, 0xf8cb, 0xf8cc, 0xf8cd, 0xf8ce, 0xf8cf, 0xf8d0, 0xf8d1, 0xf8d2, 0xf8d3, 0xf8d4, 0xf8d5, 0xf8d6, 0xf8d7, 0xf8d8, 0xf8d9, 0xf8da, 0xf8db, 0xf8dc, 0xf8dd, 0xf8de, 0xf8df, 0xf8e0, 0xf8e1, 0xf8e2, 0xf8e3, 0xf8e4, 0xf8e5, 0xf8e6, 0xf8e7, 0xf8e8, 0xf8e9, 0xf8ea, 0xf8eb, 0xf8ec, 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0, 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, 0xf8f5, 0xf8f6, 0xf8f7, 0xf8f8, 0xf8f9, 0xf8fa, 0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0xf8ff, 0xf900, 0xf901, 0xf902, 0xf903, 0xf904, 0xf905, 0xf906, 0xf907, /* 0xf900 */ 0xf908, 0xf909, 0xf90a, 0xf90b, 0xf90c, 0xf90d, 0xf90e, 0xf90f, 0xf910, 0xf911, 0xf912, 0xf913, 0xf914, 0xf915, 0xf916, 0xf917, 0xf918, 0xf919, 0xf91a, 0xf91b, 0xf91c, 0xf91d, 0xf91e, 0xf91f, 0xf920, 0xf921, 0xf922, 0xf923, 0xf924, 0xf925, 0xf926, 0xf927, 0xf928, 0xf929, 0xf92a, 0xf92b, 0xf92c, 0xf92d, 0xf92e, 0xf92f, 0xf930, 0xf931, 0xf932, 0xf933, 0xf934, 0xf935, 0xf936, 0xf937, 0xf938, 0xf939, 0xf93a, 0xf93b, 0xf93c, 0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, /* 0xf940 */ 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf97f, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, /* 0xf980 */ 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xf9a1, 0xf9a2, 0xf9a3, 0xf9a4, 0xf9a5, 0xf9a6, 0xf9a7, 0xf9a8, 0xf9a9, 0xf9aa, 0xf9ab, 0xf9ac, 0xf9ad, 0xf9ae, 0xf9af, 0xf9b0, 0xf9b1, 0xf9b2, 0xf9b3, 0xf9b4, 0xf9b5, 0xf9b6, 0xf9b7, 0xf9b8, 0xf9b9, 0xf9ba, 0xf9bb, 0xf9bc, 0xf9bd, 0xf9be, 0xf9bf, 0xf9c0, 0xf9c1, 0xf9c2, 0xf9c3, 0xf9c4, 0xf9c5, 0xf9c6, 0xf9c7, /* 0xf9c0 */ 0xf9c8, 0xf9c9, 0xf9ca, 0xf9cb, 0xf9cc, 0xf9cd, 0xf9ce, 0xf9cf, 0xf9d0, 0xf9d1, 0xf9d2, 0xf9d3, 0xf9d4, 0xf9d5, 0xf9d6, 0xf9d7, 0xf9d8, 0xf9d9, 0xf9da, 0xf9db, 0xf9dc, 0xf9dd, 0xf9de, 0xf9df, 0xf9e0, 0xf9e1, 0xf9e2, 0xf9e3, 0xf9e4, 0xf9e5, 0xf9e6, 0xf9e7, 0xf9e8, 0xf9e9, 0xf9ea, 0xf9eb, 0xf9ec, 0xf9ed, 0xf9ee, 0xf9ef, 0xf9f0, 0xf9f1, 0xf9f2, 0xf9f3, 0xf9f4, 0xf9f5, 0xf9f6, 0xf9f7, 0xf9f8, 0xf9f9, 0xf9fa, 0xf9fb, 0xf9fc, 0xf9fd, 0xf9fe, 0xf9ff, 0xfa00, 0xfa01, 0xfa02, 0xfa03, 0xfa04, 0xfa05, 0xfa06, 0xfa07, /* 0xfa00 */ 0xfa08, 0xfa09, 0xfa0a, 0xfa0b, 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa10, 0xfa11, 0xfa12, 0xfa13, 0xfa14, 0xfa15, 0xfa16, 0xfa17, 0xfa18, 0xfa19, 0xfa1a, 0xfa1b, 0xfa1c, 0xfa1d, 0xfa1e, 0xfa1f, 0xfa20, 0xfa21, 0xfa22, 0xfa23, 0xfa24, 0xfa25, 0xfa26, 0xfa27, 0xfa28, 0xfa29, 0xfa2a, 0xfa2b, 0xfa2c, 0xfa2d, 0xfa2e, 0xfa2f, 0xfa30, 0xfa31, 0xfa32, 0xfa33, 0xfa34, 0xfa35, 0xfa36, 0xfa37, 0xfa38, 0xfa39, 0xfa3a, 0xfa3b, 0xfa3c, 0xfa3d, 0xfa3e, 0xfa3f, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, /* 0xfa40 */ 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0x0000, 0x0000, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa7f, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, /* 0xfa80 */ 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfaa1, 0xfaa2, 0xfaa3, 0xfaa4, 0xfaa5, 0xfaa6, 0xfaa7, 0xfaa8, 0xfaa9, 0xfaaa, 0xfaab, 0xfaac, 0xfaad, 0xfaae, 0xfaaf, 0xfab0, 0xfab1, 0xfab2, 0xfab3, 0xfab4, 0xfab5, 0xfab6, 0xfab7, 0xfab8, 0xfab9, 0xfaba, 0xfabb, 0xfabc, 0xfabd, 0xfabe, 0xfabf, 0xfac0, 0xfac1, 0xfac2, 0xfac3, 0xfac4, 0xfac5, 0xfac6, 0xfac7, /* 0xfac0 */ 0xfac8, 0xfac9, 0xfaca, 0xfacb, 0xfacc, 0xfacd, 0xface, 0xfacf, 0xfad0, 0xfad1, 0xfad2, 0xfad3, 0xfad4, 0xfad5, 0xfad6, 0xfad7, 0xfad8, 0xfad9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03, 0xfb04, 0xfb05, 0xfb06, 0x0000, /* 0xfb00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb13, 0xfb14, 0xfb15, 0xfb16, 0xfb17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb1d, 0xfb1e, 0xfb1f, 0xfb20, 0xfb21, 0xfb22, 0xfb23, 0xfb24, 0xfb25, 0xfb26, 0xfb27, 0xfb28, 0xfb29, 0xfb2a, 0xfb2b, 0xfb2c, 0xfb2d, 0xfb2e, 0xfb2f, 0xfb30, 0xfb31, 0xfb32, 0xfb33, 0xfb34, 0xfb35, 0xfb36, 0x0000, 0xfb38, 0xfb39, 0xfb3a, 0xfb3b, 0xfb3c, 0x0000, 0xfb3e, 0x0000, 0xfb40, 0xfb41, 0x0000, 0xfb43, 0xfb44, 0x0000, 0xfb46, 0xfb47, /* 0xfb40 */ 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb7f, 0xfb80, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, /* 0xfb80 */ 0xfb88, 0xfb89, 0xfb8a, 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfba1, 0xfba2, 0xfba3, 0xfba4, 0xfba5, 0xfba6, 0xfba7, 0xfba8, 0xfba9, 0xfbaa, 0xfbab, 0xfbac, 0xfbad, 0xfbae, 0xfbaf, 0xfbb0, 0xfbb1, 0xfbb2, 0xfbb3, 0xfbb4, 0xfbb5, 0xfbb6, 0xfbb7, 0xfbb8, 0xfbb9, 0xfbba, 0xfbbb, 0xfbbc, 0xfbbd, 0xfbbe, 0xfbbf, 0xfbc0, 0xfbc1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfbc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfbd3, 0xfbd4, 0xfbd5, 0xfbd6, 0xfbd7, 0xfbd8, 0xfbd9, 0xfbda, 0xfbdb, 0xfbdc, 0xfbdd, 0xfbde, 0xfbdf, 0xfbe0, 0xfbe1, 0xfbe2, 0xfbe3, 0xfbe4, 0xfbe5, 0xfbe6, 0xfbe7, 0xfbe8, 0xfbe9, 0xfbea, 0xfbeb, 0xfbec, 0xfbed, 0xfbee, 0xfbef, 0xfbf0, 0xfbf1, 0xfbf2, 0xfbf3, 0xfbf4, 0xfbf5, 0xfbf6, 0xfbf7, 0xfbf8, 0xfbf9, 0xfbfa, 0xfbfb, 0xfbfc, 0xfbfd, 0xfbfe, 0xfbff, 0xfc00, 0xfc01, 0xfc02, 0xfc03, 0xfc04, 0xfc05, 0xfc06, 0xfc07, /* 0xfc00 */ 0xfc08, 0xfc09, 0xfc0a, 0xfc0b, 0xfc0c, 0xfc0d, 0xfc0e, 0xfc0f, 0xfc10, 0xfc11, 0xfc12, 0xfc13, 0xfc14, 0xfc15, 0xfc16, 0xfc17, 0xfc18, 0xfc19, 0xfc1a, 0xfc1b, 0xfc1c, 0xfc1d, 0xfc1e, 0xfc1f, 0xfc20, 0xfc21, 0xfc22, 0xfc23, 0xfc24, 0xfc25, 0xfc26, 0xfc27, 0xfc28, 0xfc29, 0xfc2a, 0xfc2b, 0xfc2c, 0xfc2d, 0xfc2e, 0xfc2f, 0xfc30, 0xfc31, 0xfc32, 0xfc33, 0xfc34, 0xfc35, 0xfc36, 0xfc37, 0xfc38, 0xfc39, 0xfc3a, 0xfc3b, 0xfc3c, 0xfc3d, 0xfc3e, 0xfc3f, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, /* 0xfc40 */ 0xfc48, 0xfc49, 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59, 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc7f, 0xfc80, 0xfc81, 0xfc82, 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, /* 0xfc80 */ 0xfc88, 0xfc89, 0xfc8a, 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfca1, 0xfca2, 0xfca3, 0xfca4, 0xfca5, 0xfca6, 0xfca7, 0xfca8, 0xfca9, 0xfcaa, 0xfcab, 0xfcac, 0xfcad, 0xfcae, 0xfcaf, 0xfcb0, 0xfcb1, 0xfcb2, 0xfcb3, 0xfcb4, 0xfcb5, 0xfcb6, 0xfcb7, 0xfcb8, 0xfcb9, 0xfcba, 0xfcbb, 0xfcbc, 0xfcbd, 0xfcbe, 0xfcbf, 0xfcc0, 0xfcc1, 0xfcc2, 0xfcc3, 0xfcc4, 0xfcc5, 0xfcc6, 0xfcc7, /* 0xfcc0 */ 0xfcc8, 0xfcc9, 0xfcca, 0xfccb, 0xfccc, 0xfccd, 0xfcce, 0xfccf, 0xfcd0, 0xfcd1, 0xfcd2, 0xfcd3, 0xfcd4, 0xfcd5, 0xfcd6, 0xfcd7, 0xfcd8, 0xfcd9, 0xfcda, 0xfcdb, 0xfcdc, 0xfcdd, 0xfcde, 0xfcdf, 0xfce0, 0xfce1, 0xfce2, 0xfce3, 0xfce4, 0xfce5, 0xfce6, 0xfce7, 0xfce8, 0xfce9, 0xfcea, 0xfceb, 0xfcec, 0xfced, 0xfcee, 0xfcef, 0xfcf0, 0xfcf1, 0xfcf2, 0xfcf3, 0xfcf4, 0xfcf5, 0xfcf6, 0xfcf7, 0xfcf8, 0xfcf9, 0xfcfa, 0xfcfb, 0xfcfc, 0xfcfd, 0xfcfe, 0xfcff, 0xfd00, 0xfd01, 0xfd02, 0xfd03, 0xfd04, 0xfd05, 0xfd06, 0xfd07, /* 0xfd00 */ 0xfd08, 0xfd09, 0xfd0a, 0xfd0b, 0xfd0c, 0xfd0d, 0xfd0e, 0xfd0f, 0xfd10, 0xfd11, 0xfd12, 0xfd13, 0xfd14, 0xfd15, 0xfd16, 0xfd17, 0xfd18, 0xfd19, 0xfd1a, 0xfd1b, 0xfd1c, 0xfd1d, 0xfd1e, 0xfd1f, 0xfd20, 0xfd21, 0xfd22, 0xfd23, 0xfd24, 0xfd25, 0xfd26, 0xfd27, 0xfd28, 0xfd29, 0xfd2a, 0xfd2b, 0xfd2c, 0xfd2d, 0xfd2e, 0xfd2f, 0xfd30, 0xfd31, 0xfd32, 0xfd33, 0xfd34, 0xfd35, 0xfd36, 0xfd37, 0xfd38, 0xfd39, 0xfd3a, 0xfd3b, 0xfd3c, 0xfd3d, 0xfd3e, 0xfd3f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfd40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd7f, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, /* 0xfd80 */ 0xfd88, 0xfd89, 0xfd8a, 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0x0000, 0x0000, 0xfd92, 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfda1, 0xfda2, 0xfda3, 0xfda4, 0xfda5, 0xfda6, 0xfda7, 0xfda8, 0xfda9, 0xfdaa, 0xfdab, 0xfdac, 0xfdad, 0xfdae, 0xfdaf, 0xfdb0, 0xfdb1, 0xfdb2, 0xfdb3, 0xfdb4, 0xfdb5, 0xfdb6, 0xfdb7, 0xfdb8, 0xfdb9, 0xfdba, 0xfdbb, 0xfdbc, 0xfdbd, 0xfdbe, 0xfdbf, 0xfdc0, 0xfdc1, 0xfdc2, 0xfdc3, 0xfdc4, 0xfdc5, 0xfdc6, 0xfdc7, /* 0xfdc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfdf0, 0xfdf1, 0xfdf2, 0xfdf3, 0xfdf4, 0xfdf5, 0xfdf6, 0xfdf7, 0xfdf8, 0xfdf9, 0xfdfa, 0xfdfb, 0xfdfc, 0xfdfd, 0x0000, 0x0000, 0xfe00, 0xfe01, 0xfe02, 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07, /* 0xfe00 */ 0xfe08, 0xfe09, 0xfe0a, 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f, 0xfe10, 0xfe11, 0xfe12, 0xfe13, 0xfe14, 0xfe15, 0xfe16, 0xfe17, 0xfe18, 0xfe19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe20, 0xfe21, 0xfe22, 0xfe23, 0xfe24, 0xfe25, 0xfe26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe30, 0xfe31, 0xfe32, 0xfe33, 0xfe34, 0xfe35, 0xfe36, 0xfe37, 0xfe38, 0xfe39, 0xfe3a, 0xfe3b, 0xfe3c, 0xfe3d, 0xfe3e, 0xfe3f, 0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, /* 0xfe40 */ 0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xfe50, 0xfe51, 0xfe52, 0x0000, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe58, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, 0xfe60, 0xfe61, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0x0000, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe70, 0xfe71, 0xfe72, 0xfe73, 0xfe74, 0x0000, 0xfe76, 0xfe77, 0xfe78, 0xfe79, 0xfe7a, 0xfe7b, 0xfe7c, 0xfe7d, 0xfe7e, 0xfe7f, 0xfe80, 0xfe81, 0xfe82, 0xfe83, 0xfe84, 0xfe85, 0xfe86, 0xfe87, /* 0xfe80 */ 0xfe88, 0xfe89, 0xfe8a, 0xfe8b, 0xfe8c, 0xfe8d, 0xfe8e, 0xfe8f, 0xfe90, 0xfe91, 0xfe92, 0xfe93, 0xfe94, 0xfe95, 0xfe96, 0xfe97, 0xfe98, 0xfe99, 0xfe9a, 0xfe9b, 0xfe9c, 0xfe9d, 0xfe9e, 0xfe9f, 0xfea0, 0xfea1, 0xfea2, 0xfea3, 0xfea4, 0xfea5, 0xfea6, 0xfea7, 0xfea8, 0xfea9, 0xfeaa, 0xfeab, 0xfeac, 0xfead, 0xfeae, 0xfeaf, 0xfeb0, 0xfeb1, 0xfeb2, 0xfeb3, 0xfeb4, 0xfeb5, 0xfeb6, 0xfeb7, 0xfeb8, 0xfeb9, 0xfeba, 0xfebb, 0xfebc, 0xfebd, 0xfebe, 0xfebf, 0xfec0, 0xfec1, 0xfec2, 0xfec3, 0xfec4, 0xfec5, 0xfec6, 0xfec7, /* 0xfec0 */ 0xfec8, 0xfec9, 0xfeca, 0xfecb, 0xfecc, 0xfecd, 0xfece, 0xfecf, 0xfed0, 0xfed1, 0xfed2, 0xfed3, 0xfed4, 0xfed5, 0xfed6, 0xfed7, 0xfed8, 0xfed9, 0xfeda, 0xfedb, 0xfedc, 0xfedd, 0xfede, 0xfedf, 0xfee0, 0xfee1, 0xfee2, 0xfee3, 0xfee4, 0xfee5, 0xfee6, 0xfee7, 0xfee8, 0xfee9, 0xfeea, 0xfeeb, 0xfeec, 0xfeed, 0xfeee, 0xfeef, 0xfef0, 0xfef1, 0xfef2, 0xfef3, 0xfef4, 0xfef5, 0xfef6, 0xfef7, 0xfef8, 0xfef9, 0xfefa, 0xfefb, 0xfefc, 0x0000, 0x0000, 0xfeff, 0x0000, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, /* 0xff00 */ 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, /* 0xff40 */ 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f, 0xff60, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, 0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, 0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, 0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, /* 0xff80 */ 0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, 0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, 0xffa0, 0xffa1, 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, 0xffa8, 0xffa9, 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, 0xffb0, 0xffb1, 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, 0xffb8, 0xffb9, 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0x0000, 0x0000, 0x0000, 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, /* 0xffc0 */ 0x0000, 0x0000, 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, 0x0000, 0x0000, 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, 0x0000, 0x0000, 0xffda, 0xffdb, 0xffdc, 0x0000, 0x0000, 0x0000, 0xffe0, 0xffe1, 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0x0000, 0xffe8, 0xffe9, 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfff9, 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0x0000, 0x0000 }; const unsigned short ____tomirror[] = { 0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003e, 0x0000, 0x003c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005d, 0x0000, 0x005b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007d, 0x0000, 0x007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x00c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x01c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x04c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x05c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x06c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x09c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x10c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x11c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x13c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x14c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x15c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x17c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x18c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x19c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x1fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x203a, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2046, 0x2045, 0x0000, /* 0x2040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x207e, 0x207d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x208e, 0x208d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x20c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x21c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x22c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2300 */ 0x2309, 0x2308, 0x230b, 0x230a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x232a, 0x2329, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x23c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x24c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x25c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x26c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x27c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x28c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x29c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x2fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3000 */ 0x3009, 0x3008, 0x300b, 0x300a, 0x300d, 0x300c, 0x300f, 0x300e, 0x3011, 0x3010, 0x0000, 0x0000, 0x3015, 0x3014, 0x3017, 0x3016, 0x3019, 0x3018, 0x301b, 0x301a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x30c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x31c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x32c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x33c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x34c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x35c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x36c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x37c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x38c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x39c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x3fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x40c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x41c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x42c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x43c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x44c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x45c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x46c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x47c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x48c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x49c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x4fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x50c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x51c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x52c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x53c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x54c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x55c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x56c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x57c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x58c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x59c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x5fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x60c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x61c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x62c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x63c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x64c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x65c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x66c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x67c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x68c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x69c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x6fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x70c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x71c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x72c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x73c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x74c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x75c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x76c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x77c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x78c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x79c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x7fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x80c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x81c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x82c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x83c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x84c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x85c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x86c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x87c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x88c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x89c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x8fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x90c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x91c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x92c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x93c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x94c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x95c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x96c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x97c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x98c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x99c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9a00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9a40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9a80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9ac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9b00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9b40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9b80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9bc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9c00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9c40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9c80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9cc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9d00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9d40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9d80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9dc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9e00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9e40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9e80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9ec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9f00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9f40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9f80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x9fc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa0c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa1c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa2c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa3c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa5c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa6c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xa9c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaa00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaa40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaa80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xab00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xab40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xab80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xabc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xac00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xac40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xac80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xacc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xad00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xad40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xad80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xadc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xae00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xae40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xae80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaf00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaf40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xaf80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xafc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb0c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb1c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb2c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb3c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb5c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb6c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xb9c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xba00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xba40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xba80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbb00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbb40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbb80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbbc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbc00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbc40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbc80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbcc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbd00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbd40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbd80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbdc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbe00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbe40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbe80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbf00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbf40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbf80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xbfc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc0c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc1c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc2c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc3c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc5c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc6c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xc9c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xca00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xca40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xca80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcb00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcb40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcb80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcbc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcc00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcc40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcc80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xccc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcd00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcd40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcd80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcdc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xce00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xce40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xce80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcf00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcf40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcf80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xcfc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd0c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd1c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd2c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd3c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd5c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd6c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xd9c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xda00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xda40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xda80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdb00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdb40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdb80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdbc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdc00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdc40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdc80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdcc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdd00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdd40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdd80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xddc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xde00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xde40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xde80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdf00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdf40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdf80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xdfc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe0c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe1c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe2c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe3c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe5c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe6c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xe9c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xea00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xea40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xea80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xeac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xeb00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xeb40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xeb80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xebc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xec00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xec40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xec80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xecc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xed00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xed40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xed80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xedc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xee00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xee40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xee80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xeec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xef00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xef40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xef80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xefc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf000 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf040 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf080 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf0c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf100 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf140 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf180 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf1c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf200 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf240 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf280 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf2c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf300 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf340 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf380 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf3c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf400 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf440 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf480 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf4c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf500 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf540 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf580 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf5c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf600 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf640 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf680 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf6c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf700 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf740 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf780 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf7c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf800 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf840 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf880 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf8c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf900 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf940 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf980 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xf9c0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfa00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfa40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfa80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfac0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfb00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfb40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfb80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfbc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfc00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfc40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfc80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfcc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfd00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfd40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfd80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfdc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfe00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfe40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfe80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xfec0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xff00 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xff40 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xff80 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0xffc0 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; const uint32 ____utype[] = { 0, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, /* 0x0000 */ 0x00080000, 0x00020010, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00020010, 0x00000020, 0x00000000, 0x00004000, 0x00004000, 0x00004000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00000000, 0x00001000, 0x00002020, 0x00021000, 0x00002020, 0x00102000, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00000448, 0x00002020, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000000, 0x00200142, 0x00200142, 0x00200142, 0x00200142, 0x00200142, 0x00200142, 0x00200102, /* 0x0040 */ 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200141, 0x00200141, 0x00200141, 0x00200141, 0x00200141, 0x00200141, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00080000, 0x00020000, 0x00040000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00000010, 0x00080000, 0x00080000, /* 0x0080 */ 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x180c2010, 0x00080000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x10200100, 0x00000000, 0x00000000, 0x00020000, 0x00000000, 0x10000000, 0x00004000, 0x00004000, 0x10000400, 0x10000400, 0x10010000, 0x10200101, 0x00000000, 0x00000000, 0x10000000, 0x10000400, 0x10200100, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x00080000, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00200102, 0x10200102, /* 0x00c0 */ 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00000000, 0x00200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00200102, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, /* 0x0100 */ 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, /* 0x0140 */ 0x10200101, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200101, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200102, /* 0x0180 */ 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200101, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x10200102, 0x10200101, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200101, 0x00200100, 0x00200102, 0x00200101, 0x00200101, 0x00200101, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200102, 0x10200104, 0x10200101, 0x10200102, /* 0x01c0 */ 0x10200104, 0x10200101, 0x10200102, 0x10200104, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200101, 0x10200102, 0x10200104, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200102, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, /* 0x0200 */ 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200101, /* 0x0240 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x0280 */ 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200100, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x02c0 */ 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00010000, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, /* 0x0300 */ 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x10088000, 0x10088000, 0x00088000, 0x10088000, 0x10088000, 0x00288000, 0x00088000, 0x00088000, /* 0x0340 */ 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x000c8000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x000c0000, 0x000c8000, 0x000c8000, 0x000c8000, 0x000c8000, 0x000c8000, 0x000c8000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x10000000, 0x00000000, 0x00200102, 0x00200101, 0x00000000, 0x00000000, 0x10000100, 0x00200101, 0x00200101, 0x00200101, 0x10000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10200102, 0x10000020, /* 0x0380 */ 0x10200102, 0x10200102, 0x10200102, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x10200102, 0x10200101, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00000000, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x03c0 */ 0x00200101, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00200102, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x10200102, 0x10200101, 0x00000000, 0x00200102, 0x00200101, 0x10200102, 0x00200102, 0x00200101, 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x10200102, 0x10200102, 0x00200102, 0x10200102, 0x00200102, 0x00200102, 0x00200102, 0x10200102, /* 0x0400 */ 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x10200102, 0x10200102, 0x10200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x10200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x0440 */ 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10200101, 0x10200101, 0x00200101, 0x10200101, 0x00200101, 0x00200101, 0x00200101, 0x10200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00000100, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, /* 0x0480 */ 0x00080000, 0x00080000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, /* 0x04c0 */ 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0x0500 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, /* 0x0540 */ 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10200101, /* 0x0580 */ 0x00000000, 0x00000120, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00020200, 0x00280000, 0x00000200, 0x00280000, 0x00280000, 0x00000220, 0x00280000, 0x00280000, 0x00000200, 0x00280000, /* 0x05c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200200, 0x00200200, 0x00200200, 0x00000200, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000800, 0x00000000, 0x00000000, 0x00000000, /* 0x0600 */ 0x00000200, 0x00004000, 0x00004000, 0x00000200, 0x00002020, 0x00000200, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000220, 0x00080200, 0x00000000, 0x00000200, 0x00000220, 0x00200200, 0x00200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00000200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, /* 0x0640 */ 0x00200200, 0x00200200, 0x00200200, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00080000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00000808, 0x00004000, 0x00000800, 0x00000800, 0x00000200, 0x00200200, 0x00200200, 0x00280000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, /* 0x0680 */ 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x10200200, 0x00200200, 0x10200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, /* 0x06c0 */ 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x10200200, 0x00000220, 0x00200200, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000800, 0x00000000, 0x00080000, 0x00080000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000200, 0x00000200, 0x00280000, 0x00280000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00280000, 0x00200200, 0x00200200, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00000408, 0x00200200, 0x00200200, 0x00200200, 0x00000200, 0x00000200, 0x00200200, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, /* 0x0700 */ 0x00000220, 0x00000220, 0x00000220, 0x00000200, 0x00000220, 0x00000200, 0x00000000, 0x00000200, 0x00200200, 0x00280000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, /* 0x0740 */ 0x00080000, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, /* 0x0780 */ 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00200200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000208, 0x00000208, 0x00000208, 0x00000208, 0x00000208, 0x00000208, 0x00000208, 0x00000208, /* 0x07c0 */ 0x00000208, 0x00000208, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00000200, 0x00000200, 0x00000000, 0x00000000, 0x00000020, 0x00000020, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, /* 0x0800 */ 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00280000, 0x00280000, 0x00080000, 0x00080000, 0x00000200, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000200, 0x00280000, 0x00280000, 0x00280000, 0x00000200, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00080000, 0x00000000, 0x00000000, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000220, 0x00000000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, /* 0x0840 */ 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00080000, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00000220, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x0880 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200200, 0x00000000, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00200200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x08c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x0900 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280100, 0x00080000, 0x00200100, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, /* 0x0940 */ 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00080000, 0x00280100, 0x00280100, 0x00200100, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00280000, 0x00280000, 0x00280000, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00020120, 0x00020120, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00280000, 0x00280100, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0980 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00080000, 0x00200100, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00280100, /* 0x09c0 */ 0x00280100, 0x00000000, 0x00000000, 0x10280100, 0x10280100, 0x00080000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x00000000, 0x10200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00200100, 0x00200100, 0x00004000, 0x00004000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0a00 */ 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x10200100, 0x00000000, 0x00200100, 0x10200100, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, /* 0x0a40 */ 0x00280000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x10200100, 0x00200100, 0x00000000, 0x10200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00280000, 0x00280000, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0a80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00080000, 0x00200100, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00280000, /* 0x0ac0 */ 0x00280000, 0x00280100, 0x00000000, 0x00280100, 0x00280100, 0x00080000, 0x00000000, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280100, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0b00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00080000, 0x00200100, 0x00280100, 0x00280000, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00280100, /* 0x0b40 */ 0x10280100, 0x00000000, 0x00000000, 0x10280100, 0x10280100, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0b80 */ 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00280000, 0x00280100, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, /* 0x0bc0 */ 0x00280100, 0x00000000, 0x10280100, 0x10280100, 0x10280100, 0x00080000, 0x00000000, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0c00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00000000, 0x00280000, 0x00280000, /* 0x0c40 */ 0x10280000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0c80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00080000, 0x00200100, 0x00280100, 0x00280100, 0x10280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00000000, 0x00280100, 0x10280100, /* 0x0cc0 */ 0x10280100, 0x00000000, 0x10280100, 0x10280100, 0x00280000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0d00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00280100, 0x00280100, /* 0x0d40 */ 0x00280100, 0x00000000, 0x10280100, 0x10280100, 0x10280100, 0x00080000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, /* 0x0d80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, /* 0x0dc0 */ 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00280000, 0x00000000, 0x00280100, 0x00280100, 0x10280100, 0x00280100, 0x10280100, 0x10280100, 0x10280100, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x0e00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200100, 0x10200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000000, /* 0x0e40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200000, 0x00000000, 0x00000100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00020120, 0x00020120, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00200100, /* 0x0e80 */ 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200100, 0x10200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00000000, 0x00200000, 0x00200000, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000100, 0x00000000, /* 0x0ec0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00010100, 0x00010100, 0x00010100, 0x00010100, 0x00000100, 0x00010100, 0x00010100, /* 0x0f00 */ 0x000c0120, 0x00010100, 0x00010100, 0x00020100, 0x100c0100, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x000c0120, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00080000, 0x00080000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00020100, 0x00080000, 0x00000100, 0x00080000, 0x00000100, 0x00080000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080100, 0x00080100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x0f40 */ 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x10280000, 0x10280000, 0x10280000, 0x10280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00220100, 0x00280000, 0x10280000, 0x00080000, 0x00080000, 0x00080000, 0x00020100, 0x00080000, 0x00080000, /* 0x0f80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00020100, 0x00020100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00080000, 0x00000100, /* 0x0fc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000100, 0x00000100, 0x00010100, 0x00010100, 0x00020100, 0x00010100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x000c0100, 0x000c0100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1000 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, /* 0x1040 */ 0x00000108, 0x00000108, 0x00020120, 0x00020120, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00000100, /* 0x1080 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00200100, 0x00000100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00000100, 0x00200100, 0x00200000, 0x00000100, 0x00000100, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00000000, 0x00200102, /* 0x10c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x10000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1100 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1140 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1180 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x11c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1200 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1240 */ 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1280 */ 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, /* 0x12c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1300 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1340 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x00280000, 0x00000100, 0x00020120, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1380 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x13c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1400 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1440 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1480 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x14c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1500 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1540 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1580 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x15c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1600 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1640 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000120, 0x00000120, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00020010, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1680 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x16c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00020120, 0x00020120, 0x00020120, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1700 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00080000, 0x00020100, 0x00020100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1740 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1780 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200100, /* 0x17c0 */ 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020120, 0x00020120, 0x00040120, 0x00000100, 0x00020100, 0x00000100, 0x00020120, 0x00004000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000020, 0x00020020, 0x00020020, 0x00010000, 0x00000000, /* 0x1800 */ 0x00000020, 0x00000020, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x000c0000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1840 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1880 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x18c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1900 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00080000, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000020, 0x00000108, 0x00000108, /* 0x1940 */ 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1980 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x19c0 */ 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1a00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1a40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00000000, 0x00000000, 0x00200100, 0x00200000, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00088000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, /* 0x1a80 */ 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000120, 0x00000120, 0x00000120, 0x00000120, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x1ac0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00200100, 0x10200100, 0x00200100, /* 0x1b00 */ 0x10200100, 0x00200100, 0x10200100, 0x00200100, 0x10200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x10200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x10280100, 0x00280000, 0x10280100, 0x00280100, 0x00280100, 0x10280100, 0x10280100, 0x00280000, 0x10280100, 0x00080100, 0x00200100, 0x00200100, 0x00200100, /* 0x1b40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00020120, 0x00020120, 0x00000100, 0x00020120, 0x00020120, 0x00020120, 0x00020100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1b80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00080100, 0x00080000, 0x00280100, 0x00280100, 0x00200100, 0x00200100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1bc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00280100, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00080100, 0x00080100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x1c00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00020120, 0x00020120, 0x00020120, 0x00020120, 0x00020120, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, /* 0x1c40 */ 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00020120, 0x00020120, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x1c80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0x1cc0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00000100, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080100, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280100, 0x00080000, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x1d00 */ 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10000100, 0x10000100, 0x10000100, 0x00000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, /* 0x1d40 */ 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10000100, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x1d80 */ 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, /* 0x1dc0 */ 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00088000, 0x00088000, 0x00088000, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, /* 0x1e00 */ 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, /* 0x1e40 */ 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, /* 0x1e80 */ 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, /* 0x1ec0 */ 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x10200102, 0x10200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, /* 0x1f00 */ 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x00000000, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00000000, 0x00000000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x00000000, /* 0x1f40 */ 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00000000, 0x00000000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x00000000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, /* 0x1f80 */ 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200104, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200104, 0x10000000, 0x10200101, 0x10000000, 0x10000000, 0x10000000, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x10200101, 0x10200101, /* 0x1fc0 */ 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200104, 0x10000000, 0x10000000, 0x10000000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x00000000, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200104, 0x10010000, 0x10000000, 0x00000000, 0x10020010, 0x10020010, 0x10020010, 0x10020010, 0x10020010, 0x10020010, 0x10020010, 0x100c0010, /* 0x2000 */ 0x10020010, 0x10020010, 0x10020010, 0x00020080, 0x00080080, 0x00080080, 0x00080110, 0x00080210, 0x00020000, 0x180c0000, 0x00020000, 0x00020000, 0x00030000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x00020000, 0x00000010, 0x00000010, 0x00088180, 0x00080200, 0x00080000, 0x00080100, 0x00080200, 0x180c2010, 0x00004000, 0x00004000, 0x00004000, 0x10004000, 0x10004000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10040020, 0x00040020, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00002000, 0x00080000, 0x00040000, 0x10040020, /* 0x2040 */ 0x10040020, 0x10040020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020000, 0x10000000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00000000, 0x00020000, 0x00020000, 0x10020010, 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x10000400, 0x10000100, 0x00000000, 0x00000000, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10001000, 0x10001000, 0x10000000, 0x10080000, 0x10040000, 0x10000100, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, /* 0x2080 */ 0x10000400, 0x10000400, 0x10001000, 0x10001000, 0x10000000, 0x10080000, 0x10040000, 0x00000000, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x10004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x20c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00088000, 0x00080000, 0x00080000, 0x00080000, 0x00088000, 0x00088000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10200102, 0x10000000, 0x00000000, 0x10000000, 0x10000000, 0x10200102, /* 0x2100 */ 0x00000000, 0x10000000, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10200102, 0x10200101, 0x00000000, 0x10200102, 0x10000000, 0x00000000, 0x00000000, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x00000000, 0x10200102, 0x10200102, 0x10200102, 0x10200102, 0x00004000, 0x10200101, 0x10200102, 0x10200102, 0x00200102, 0x10200102, 0x10200101, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200101, 0x00000000, 0x10000000, 0x10200101, 0x10200101, 0x10200102, 0x10200102, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10200102, 0x10200101, 0x10200101, /* 0x2140 */ 0x10200101, 0x10200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200101, 0x00000100, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x00000100, 0x00000100, 0x00000100, 0x00200102, 0x00200101, 0x00000100, 0x00000100, 0x00000100, /* 0x2180 */ 0x00000100, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x21c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2200 */ 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, /* 0x2240 */ 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, /* 0x2280 */ 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x22c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2300 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10080000, 0x10040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0x2340 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2380 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x23c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2400 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2440 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, /* 0x2480 */ 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000400, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10000100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, /* 0x24c0 */ 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2500 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2540 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2580 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x25c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2600 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00030000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2640 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2680 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, /* 0x26c0 */ 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00030000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, /* 0x2700 */ 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2740 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2780 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00000000, /* 0x27c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0x2800 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0x2840 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0x2880 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0x28c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2900 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2940 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, /* 0x2980 */ 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x29c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2a00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2a40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2a80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2ac0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2b00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2b40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2b80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2bc0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, /* 0x2c00 */ 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00000000, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x2c40 */ 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x10000100, 0x10000100, 0x00200102, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0x2c80 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0x2cc0 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00088000, 0x00088000, 0x00088000, 0x00200102, 0x00200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020000, 0x00020000, 0x00020000, 0x00000000, 0x00000000, 0x00020000, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, /* 0x2d00 */ 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00000000, 0x00200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200101, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x2d40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000100, 0x00020100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0x2d80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, /* 0x2dc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2e00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00000000, 0x00020000, 0x00080000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00020000, 0x00020000, 0x00020000, 0x00020000, 0x00000020, 0x00000000, 0x00020000, 0x00020000, 0x00000000, 0x00020000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x2e40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, /* 0x2e80 */ 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x10030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, /* 0x2ec0 */ 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x10030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, /* 0x2f00 */ 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, /* 0x2f40 */ 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, /* 0x2f80 */ 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, /* 0x2fc0 */ 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10020010, 0x00040020, 0x00040020, 0x00030000, 0x00030000, 0x00040100, 0x00630100, 0x00430100, /* 0x3000 */ 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00030000, 0x00030000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00080000, 0x00040000, 0x00040000, 0x00080000, 0x00040000, 0x00040000, 0x00030000, 0x00430100, 0x00430100, 0x00430100, 0x00430100, 0x00430100, 0x00430100, 0x00430100, 0x00430100, 0x00430100, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080100, 0x00080100, 0x00030000, 0x00030100, 0x00030100, 0x00030100, 0x00030100, 0x00080100, 0x10030000, 0x00030000, 0x10430100, 0x10430100, 0x10430100, 0x00040100, 0x00240100, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, /* 0x3040 */ 0x00230100, 0x00200100, 0x00230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00200100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, /* 0x3080 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00200100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x10230100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00088000, 0x00088000, 0x10040000, 0x10040000, 0x00040100, 0x10040100, 0x10230100, 0x00040000, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, 0x00200100, 0x00230100, 0x10230100, 0x00230100, 0x10230100, /* 0x30c0 */ 0x00230100, 0x10230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x10230100, 0x10230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00200100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00200100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x10230100, 0x00200100, 0x00200100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x00040000, 0x00000100, 0x00040100, 0x10040100, 0x10230100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00230100, 0x00230100, 0x00230100, /* 0x3100 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00000000, 0x00000000, 0x00000000, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, /* 0x3140 */ 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, /* 0x3180 */ 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x10230100, 0x00000000, 0x00030100, 0x00030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, /* 0x31c0 */ 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x3200 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x10030000, 0x00000000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x3240 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x10030000, 0x10030000, 0x00030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x3280 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x32c0 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x00000000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x3300 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x3340 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x3380 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, /* 0x33c0 */ 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x10030000, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030100, 0x10030000, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x34c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x35c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x36c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x37c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x38c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x39c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3dc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x3fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4000 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4040 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4080 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x40c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4100 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4140 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4180 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x41c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4200 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4240 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4280 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x42c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4300 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4340 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4380 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x43c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x44c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x45c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x46c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x47c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x48c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x49c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0x4dc0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x4fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5000 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5040 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5080 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x50c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5100 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5140 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5180 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x51c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5200 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5240 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5280 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x52c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5300 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5340 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5380 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x53c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x54c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x55c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x56c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x57c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x58c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x59c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5dc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x5fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6000 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6040 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6080 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x60c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6100 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6140 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6180 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x61c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6200 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6240 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6280 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x62c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6300 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6340 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6380 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x63c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x64c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x65c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x66c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x67c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x68c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x69c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6dc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x6fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7000 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7040 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7080 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x70c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7100 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7140 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7180 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x71c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7200 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7240 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7280 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x72c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7300 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7340 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7380 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x73c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x74c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x75c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x76c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x77c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x78c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x79c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7dc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x7fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8000 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8040 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8080 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x80c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8100 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8140 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8180 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x81c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8200 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8240 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8280 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x82c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8300 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8340 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8380 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x83c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x84c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x85c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x86c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x87c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x88c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x89c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8dc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x8fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9000 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9040 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9080 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x90c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9100 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9140 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9180 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x91c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9200 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9240 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9280 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x92c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9300 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9340 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9380 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x93c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9400 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9440 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9480 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x94c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9500 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9540 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9580 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x95c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9600 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9640 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9680 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x96c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9700 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9740 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9780 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x97c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9800 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9840 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9880 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x98c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9900 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9940 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9980 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x99c0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9a00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9a40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9a80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9ac0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9b00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9b40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9b80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9bc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9c00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9c40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9c80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9cc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9d00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9d40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9d80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9dc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9e00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9e40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9e80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9ec0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9f00 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9f40 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9f80 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, /* 0x9fc0 */ 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00630100, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa000 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00040100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa040 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa080 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa0c0 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa100 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa140 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa180 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa1c0 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa200 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa240 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa280 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa2c0 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa300 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa340 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa380 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa3c0 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa400 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa440 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, /* 0xa480 */ 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00230100, 0x00000000, 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00000000, /* 0xa4c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00020120, 0x00020120, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa500 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa540 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa580 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa5c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa600 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00020020, 0x00000020, 0x00020020, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0xa640 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200100, 0x00088000, 0x00080000, 0x00080000, 0x00080000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00088000, 0x00088000, 0x00000000, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0xa680 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa6c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00088000, 0x00088000, 0x00000100, 0x00020120, 0x00020120, 0x00020120, 0x00020120, 0x00020120, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xa700 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0xa740 */ 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x10000100, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, /* 0xa780 */ 0x00000000, 0x00000100, 0x00000100, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00200101, 0x00200102, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xa7c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000100, 0x10000100, 0x00200101, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00200100, /* 0xa800 */ 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00004000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa840 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00010000, 0x00010000, 0x00000020, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00280100, 0x00280100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa880 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00280100, 0x00080000, 0x00000000, 0x00000000, 0x00000000, /* 0xa8c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00020120, 0x00020120, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, /* 0xa900 */ 0x00000108, 0x00000108, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00080000, 0x00080000, 0x00080000, 0x00020100, 0x00020120, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, /* 0xa940 */ 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00080100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xa980 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00080000, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280000, 0x00280100, 0x00280100, 0x00280100, 0x00080100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00020120, /* 0xa9c0 */ 0x00020120, 0x00020120, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000000, 0x00000100, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaa00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00280000, 0x00280000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaa40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280000, 0x00280100, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000100, 0x00020120, 0x00020120, 0x00020120, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000100, 0x00200100, 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaa80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00200100, 0x00200000, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00200000, 0x00200000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200000, 0x00000000, 0x00200100, 0x00000000, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xaac0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00000100, 0x00000100, 0x00000120, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280000, 0x00280000, 0x00280100, 0x00280100, 0x00020120, 0x00020120, 0x00200100, 0x00000100, 0x00000100, 0x00280100, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, /* 0xab00 */ 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xab40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xab80 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xabc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00280100, 0x00280100, 0x00280000, 0x00280100, 0x00280100, 0x00280000, 0x00280100, 0x00280100, 0x00020120, 0x00080100, 0x00080000, 0x00000000, 0x00000000, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000108, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xac00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xac40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xac80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xacc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xad00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xad40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xad80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xadc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xae00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xae40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xae80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaec0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaf00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaf40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xaf80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xafc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb000 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb040 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb080 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb0c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb100 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb140 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb180 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb1c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb200 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb240 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb280 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb2c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb300 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb340 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb380 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb3c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb400 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb440 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb480 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb4c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb500 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb540 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb580 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb5c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb600 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb640 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb680 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb6c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb700 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb740 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb780 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb7c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb800 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb840 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb880 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb8c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb900 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb940 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb980 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xb9c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xba00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xba40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xba80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbac0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbb00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbb40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbb80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbbc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbc00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbc40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbc80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbcc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbd00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbd40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbd80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbdc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbe00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbe40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbe80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbec0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbf00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbf40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbf80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xbfc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc000 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc040 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc080 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc0c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc100 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc140 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc180 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc1c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc200 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc240 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc280 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc2c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc300 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc340 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc380 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc3c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc400 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc440 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc480 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc4c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc500 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc540 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc580 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc5c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc600 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc640 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc680 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc6c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc700 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc740 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc780 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc7c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc800 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc840 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc880 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc8c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc900 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc940 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc980 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xc9c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xca00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xca40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xca80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcac0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcb00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcb40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcb80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcbc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcc00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcc40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcc80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xccc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcd00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcd40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcd80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcdc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xce00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xce40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xce80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcec0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcf00 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcf40 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcf80 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xcfc0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd000 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd040 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd080 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd0c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd100 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd140 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd180 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd1c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd200 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd240 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd280 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd2c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd300 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd340 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd380 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd3c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd400 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd440 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd480 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd4c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd500 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd540 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd580 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd5c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd600 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd640 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd680 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd6c0 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd700 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd740 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, /* 0xd780 */ 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, /* 0xd7c0 */ 0x00000000, 0x00000000, 0x00000000, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00200100, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd800 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd840 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd880 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd8c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd900 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd940 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd980 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xd9c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xda00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xda40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xda80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdac0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdb00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdb40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdb80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdbc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdc00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdc40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdc80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdcc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdd00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdd40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdd80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xddc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xde00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xde40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xde80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdec0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdf00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdf40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdf80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xdfc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe000 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe040 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe080 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe0c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe100 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe140 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe180 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe1c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe200 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe240 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe280 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe2c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe300 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe340 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe380 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe3c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe400 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe440 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe480 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe4c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe500 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe540 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe580 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe5c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe600 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe640 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe680 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe6c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe700 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe740 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe780 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe7c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe800 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe840 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe880 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe8c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe900 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe940 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe980 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xe9c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xea00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xea40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xea80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xeac0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xeb00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xeb40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xeb80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xebc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xec00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xec40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xec80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xecc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xed00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xed40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xed80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xedc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xee00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xee40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xee80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xeec0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xef00 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xef40 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xef80 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xefc0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf000 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf040 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf080 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf0c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf100 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf140 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf180 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf1c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf200 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf240 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf280 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf2c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf300 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf340 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf380 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf3c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf400 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf440 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf480 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf4c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf500 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf540 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf580 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf5c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf600 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf640 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf680 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf6c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf700 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf740 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf780 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf7c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf800 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf840 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf880 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, /* 0xf8c0 */ 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x00000100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xf900 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xf940 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xf980 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xf9c0 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xfa00 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x00630100, 0x00630100, 0x10630100, 0x00630100, 0x10630100, 0x00630100, 0x00630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x00630100, 0x10630100, 0x00630100, 0x10630100, 0x00630100, 0x00630100, 0x10630100, 0x10630100, 0x00630100, 0x00630100, 0x00630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xfa40 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x00030000, 0x00030000, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xfa80 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, /* 0xfac0 */ 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x10630100, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x00030000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, /* 0xfb00 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x10200101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10200200, 0x00280000, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10001000, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x00000000, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x00000000, 0x10200200, 0x00000000, 0x10200200, 0x10200200, 0x00000000, 0x10200200, 0x10200200, 0x00000000, 0x10200200, 0x10200200, /* 0xfb40 */ 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x10200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, /* 0xfb80 */ 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xfbc0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x14200200, 0x12200200, 0x10a00200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, /* 0xfc00 */ 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, /* 0xfc40 */ 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, /* 0xfc80 */ 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, /* 0xfcc0 */ 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, /* 0xfd00 */ 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x11200200, 0x12200200, 0x14200200, 0x00080000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, /* 0xfd40 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10a00200, 0x12200200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x10a00200, 0x12200200, 0x10a00200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x10a00200, 0x10a00200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, /* 0xfd80 */ 0x10a00200, 0x10a00200, 0x10a00200, 0x12200200, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x00000000, 0x00000000, 0x10a00200, 0x10a00200, 0x10a00200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x10a00200, 0x12200200, 0x12200200, 0x10a00200, 0x12200200, 0x10a00200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x12200200, 0x10a00200, 0x10a00200, 0x10a00200, 0x12200200, 0x12200200, /* 0xfdc0 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14200200, 0x14000200, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, /* 0xfe00 */ 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x00080000, 0x10000000, 0x10040000, 0x10040000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10080000, 0x10040000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00088000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x00030000, 0x00030000, 0x10080000, /* 0xfe40 */ 0x10040000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10030000, 0x10042020, 0x10030020, 0x10042020, 0x00000000, 0x10040020, 0x10042020, 0x10000020, 0x10000020, 0x10030000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10080000, 0x10040000, 0x10034000, 0x10030000, 0x10030000, 0x10031000, 0x10031000, 0x10030000, 0x10030000, 0x10030000, 0x00000000, 0x10030000, 0x10004000, 0x10004000, 0x10030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x14200200, 0x11200200, 0x14200200, 0x00200200, 0x14200200, 0x00000000, 0x14200200, 0x11200200, 0x14200200, 0x11200200, 0x14200200, 0x11200200, 0x14200200, 0x11200200, 0x14200200, 0x11200200, 0x14200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, /* 0xfe80 */ 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, /* 0xfec0 */ 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x10a00200, 0x11200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x14200200, 0x12200200, 0x00000000, 0x00000000, 0x08000080, 0x00000000, 0x10000020, 0x10030000, 0x10034000, 0x10004000, 0x10004000, 0x10030000, 0x10030000, /* 0xff00 */ 0x10080000, 0x10040000, 0x10030000, 0x10031000, 0x10042020, 0x10031000, 0x10042020, 0x10032000, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10030448, 0x10042020, 0x10040020, 0x10030000, 0x10030000, 0x10030000, 0x10000020, 0x10030000, 0x10230142, 0x10230142, 0x10230142, 0x10230142, 0x10230142, 0x10230142, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10230102, 0x10080000, 0x10030000, 0x10040000, 0x10030000, 0x10030000, 0x10030000, 0x10230141, 0x10230141, 0x10230141, 0x10230141, 0x10230141, 0x10230141, 0x10230101, /* 0xff40 */ 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10230101, 0x10080000, 0x10030000, 0x10040000, 0x10030000, 0x10080000, 0x10040000, 0x10040020, 0x10080000, 0x10040000, 0x10040020, 0x10040000, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10000100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, /* 0xff80 */ 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10040100, 0x10040100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x00000000, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, /* 0xffc0 */ 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x10200100, 0x00000000, 0x00000000, 0x10200100, 0x10200100, 0x10200100, 0x00000000, 0x00000000, 0x00000000, 0x10004000, 0x10004000, 0x10030000, 0x10030000, 0x10030000, 0x10004000, 0x10004000, 0x00000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00080000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }; dvisvgm-2.8.1/libs/ff-woff/fontforge/macenc.c0000664000175000017500000024322413510660062016000 00000000000000/* Copyright (C) 2003-2012 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 "fontforgevw.h" #include "ttf.h" /* 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 }; unichar_t MacRomanEnc[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[] = { MacRomanEnc, 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 */ 0x43a, /* 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 */ 0x43c, /* 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 */ 0x42c, /* Azerbaijani (Cyrillic) */ /*50*/ 0x82c, /* Azerbaijani (Arabic) */ 0x42b, /* Armenian */ 0x437, /* Georgian */ 0x818, /* Moldavian */ 0x440, /* Kirghiz */ 0x428, /* Tajiki */ 0x442, /* Turkmen */ 0x450, /* Mongolian (Mongolian) */ 0x850, /* Mongolian (cyrillic) */ 0x463, /* Pashto */ /*60*/ 0xffff, /* Kurdish */ 0x860, /* Kashmiri */ 0x459, /* Sindhi */ 0xffff, /* Tibetan */ 0x461, /* Nepali */ 0x43b, /* Sanskrit */ 0x44e, /* Marathi */ 0x445, /* Bengali */ 0x44d, /* Assamese */ 0x447, /* Gujarati */ /*70*/ 0x446, /* Punjabi */ 0x448, /* Oriya */ 0x44c, /* Malayalam */ 0x44b, /* Kannada */ 0x449, /* Tamil */ 0x44a, /* Telugu */ 0x45b, /* Sinhalese */ 0x455, /* Burmese */ 0x453, /* Khmer */ 0x454, /* Lao */ /*80*/ 0x42a, /* Vietnamese */ 0x421, /* Indonesian */ 0x464, /* Tagalog */ 0x43e, /* Malay (latin) */ 0x83e, /* Malay (arabic) */ 0x45e, /* Amharic */ 0x473, /* Tigrinya */ 0x472, /* Galla, oromo, afan */ 0x477, /* Somali */ 0x441, /* Swahili */ /*90*/ 0xffff, /* Kinyarwanda/Ruanda */ 0xffff, /* Rundi/Kirundi */ 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*/ 0x452, /* Welsh */ 0x42d, /* Basque */ /*130*/ 0x403, /* Catalan */ 0x476, /* Latin */ 0xffff, /* Quechua */ 0x474, /* Guarani */ 0xffff, /* Aymara */ 0x444, /* Tatar */ 0xffff, /* Uighur */ 0xffff, /* Dzongkha/Bhutani */ 0xffff, /* Javanese (roman) */ 0xffff, /* Sundanese (roman) */ /*140*/ 0x456, /* Galician */ 0x436, /* Afrikaans */ 0xffff, /* Breton */ 0x45d, /* Inuktitut */ 0x43c, /* Scottish Gaelic */ 0xc3c, /* Manx Gaelic */ 0x83c, /* Irish Gaelic (with dot) */ 0xffff, /* Tongan */ 0xffff, /* Greek (polytonic) */ 0xffff, /* Greenlandic */ /* Presumably icelandic? */ /*150*/ 0x42c, /* Azebaijani (roman) */ 0xffff }; char *Utf8ToMacStr(const char *ustr,int macenc,int maclang) { char *ret, *rpt; const unichar_t *table; int i, ch; if ( ustr==NULL ) return( NULL ); if ( macenc==sm_japanese || macenc==sm_korean || macenc==sm_tradchinese || macenc == sm_simpchinese ) { Encoding *enc = FindOrMakeEncoding(macenc==sm_japanese ? "Sjis" : macenc==sm_korean ? "EUC-KR" : macenc==sm_tradchinese ? "Big5" : "EUC-CN" ); iconv_t fromutf8; ICONV_CONST char *in; char *out; size_t inlen, outlen; if ( enc==NULL ) return( NULL ); fromutf8 = iconv_open(enc->iconv_name!=NULL?enc->iconv_name:enc->enc_name,"UTF-8"); if ( fromutf8==(iconv_t) -1 || fromutf8==NULL ) return( NULL ); in = (char *) ustr; inlen = strlen(ustr); outlen = sizeof(unichar_t)*strlen(ustr); out = ret = malloc(outlen+sizeof(unichar_t)); iconv(fromutf8,&in,&inlen,&out,&outlen); out[0] = out[1] = '\0'; out[2] = out[3] = '\0'; iconv_close(fromutf8); 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 = malloc(strlen(ustr)+1); for ( rpt = ret; (ch=utf8_ildb(&ustr)); ) { for ( i=0; i<256; ++i ) if ( table[i]==ch ) { *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 WinLangToMac(int winlang) { int i; for ( i=0; ifeatures; 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; if ( sf!=NULL ) for ( from_f = sf->features; from_f!=NULL && from_f->feature!=feat; from_f=from_f->next ); else from_f = NULL; 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 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 */ /* { 1, 4, CHR('h','l','i','g') }, /\* rare ligatures => historic *\/ */ /* { 1, 4, CHR('a','l','i','g') }, /\* rare ligatures => ?ancient? *\/ */ /* 2, 1, partially connected cursive */ { 2, 2, CHR('i','s','o','l') }, /* Arabic forms */ { 2, 2, CHR('c','a','l','t') }, /* ??? */ /* 3, 1, all caps */ /* 3, 2, all lower */ { 3, 3, 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 */ /* { 4, 0, CHR('v','k','n','a') }, /\* vertical forms => vertical kana *\/ */ { 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 */ /* { 10, 3, CHR('s','u','p','s') }, /\* ordinal vertical position => superscript *\/ */ { 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 */ /* { 20, 0, CHR('t','n','a','m') }, /\* traditional characters => traditional names *\/ */ { 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 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, 0, 0, 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, 0, 0, NULL, 0 } }; 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, 0, 0, 0, 0, NULL, NULL } }; MacFeat *default_mac_feature_map = &fs_features[26], *builtin_mac_feature_map=&fs_features[26], *user_mac_feature_map; dvisvgm-2.8.1/libs/ff-woff/fontforge/splineorder2.c0000664000175000017500000015160313510660062017161 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #ifdef HAVE_IEEEFP_H # include /* Solaris defines isnan in ieeefp rather than math.h */ #endif /* This file contains utility routines for second 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; extended ts[3]; int i; /* 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.1 && ttf_t<=1.1 ) { /* Optimizer gives us rounding errors */ /* And tmin/tmax are no longer exact */ 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.1 && ttf_t<=1.1 ) { val = (ttf->splines[other].b*ttf_t+ttf->splines[other].c)*ttf_t+ ttf->splines[other].d; if ( val>o-err && valsplines[dim].b*t+ttf->splines[dim].c)*t+ttf->splines[dim].d; o = (ttf->splines[other].b*t+ttf->splines[other].c)*t+ttf->splines[other].d; CubicSolve(&ps->splines[dim],d,ts); for ( i=0; i<3; ++i ) if ( ts[i]!=-1 ) { val = ((ps->splines[other].a*ts[i]+ps->splines[other].b)*ts[i]+ps->splines[other].c)*ts[i]+ps->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, DBounds *psbb) { real fudge, normal, para; BasePoint segdir, cpdir; /* test the control points are reasonable */ fudge = (psbb->maxx-psbb->minx) + (psbb->maxy-psbb->miny); if ( cxminx-fudge || cx>psbb->maxx+fudge ) return( false ); if ( cyminy-fudge || cy>psbb->maxy+fudge ) return( false ); segdir.x = x-xmin; segdir.y = y-ymin; cpdir.x = cx-xmin; cpdir.y = cy-ymin; para = segdir.x*cpdir.x + segdir.y*cpdir.y; if ( (normal = segdir.x*cpdir.y - segdir.y*cpdir.x)<0 ) normal=-normal; if ( para<0 && -para >4*normal ) return( false ); cpdir.x = x-cx; cpdir.y = y-cy; para = segdir.x*cpdir.x + segdir.y*cpdir.y; if ( (normal = segdir.x*cpdir.y - segdir.y*cpdir.x)<0 ) normal=-normal; if ( para<0 && -para >4*normal ) 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 ); 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; new->islinear = new->knownlinear = true; return( end ); } static SplinePoint *_ttfapprox(Spline *ps,real tmin, real tmax, SplinePoint *start) { 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; BasePoint end, rend, dend; DBounds bb; 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)); bb.minx = bb.maxx = ps->from->me.x; if ( ps->from->nextcp.x > bb.maxx ) bb.maxx = ps->from->nextcp.x; else if ( ps->from->nextcp.x < bb.minx ) bb.minx = ps->from->nextcp.x; if ( ps->to->prevcp.x > bb.maxx ) bb.maxx = ps->to->prevcp.x; else if ( ps->to->prevcp.x < bb.minx ) bb.minx = ps->to->prevcp.x; if ( ps->to->me.x > bb.maxx ) bb.maxx = ps->to->me.x; else if ( ps->to->me.x < bb.minx ) bb.minx = ps->to->me.x; bb.miny = bb.maxy = ps->from->me.y; if ( ps->from->nextcp.y > bb.maxy ) bb.maxy = ps->from->nextcp.y; else if ( ps->from->nextcp.y < bb.miny ) bb.miny = ps->from->nextcp.y; if ( ps->to->prevcp.y > bb.maxy ) bb.maxy = ps->to->prevcp.y; else if ( ps->to->prevcp.y < bb.miny ) bb.miny = ps->to->prevcp.y; if ( ps->to->me.y > bb.maxy ) bb.maxy = ps->to->me.y; else if ( ps->to->me.y < bb.miny ) bb.miny = ps->to->me.y; 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 ) { ddim = dx; } else { ddim = dy; } 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: */ 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)) ) 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); /* 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,&bb)) { 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) { extended inflect[2]; int i=0; SplinePoint *end; Spline *s, *next; end = _ttfapprox(ps,tmin,tmax,start); if ( ps->knownlinear ) return( end ); for ( s=start->next; s!=NULL && !s->islinear; s=s->to->next ); if ( s==NULL ) return( end ); for ( s=start->next; s!=NULL ; s=next ) { next = s->to->next; SplinePointFree(s->to); SplineFree(s); } /* 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 */ /* However if we get a bad match (a line) in the normal approx, then check */ /* Err... I was computing POI incorrectly. Above statement might not be correct*/ /* no points of inflection in quad splines */ i = Spline2DFindPointsOfInflection(ps, inflect); if ( i==2 ) { if ( RealNearish(inflect[0],inflect[1]) ) --i; else if ( inflect[0]>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]; } } return( _ttfapprox(ps,tmin,tmax,start)); } #if !defined(FONTFORGE_CONFIG_NON_SYMMETRIC_QUADRATIC_CONVERSION) typedef struct qpoint { BasePoint bp; BasePoint cp; bigreal t; } QPoint; static int comparedata(Spline *ps,QPoint *data,int qfirst,int qlast, int round_to_int, int test_level ) { Spline ttf; int i; bigreal err = round_to_int ? 1.5 : 1; if ( qfirst==qlast ) /* happened (was a bug) */ return( false ); err *= (test_level+1); /* Control points diametrically opposed */ if ( (data[qlast-2].cp.x-ps->to->me.x)*(ps->to->prevcp.x-ps->to->me.x) + (data[qlast-2].cp.y-ps->to->me.y)*(ps->to->prevcp.y-ps->to->me.y)<0 ) return( false ); if ( (data[qfirst-1].cp.x-ps->from->me.x)*(ps->from->nextcp.x-ps->from->me.x) + (data[qfirst-1].cp.y-ps->from->me.y)*(ps->from->nextcp.y-ps->from->me.y)<0 ) return( false ); memset(&ttf,0,sizeof(ttf)); for ( i=qfirst; inextcp = end->prevcp = data[i-1].cp; start->nonextcp = end->noprevcp = false; if (( data[i-1].cp.x == data[i].bp.x && data[i-1].cp.y == data[i].bp.y ) || ( data[i-1].cp.x == start->me.x && data[i-1].cp.y == start->me.y )) start->nonextcp = end->noprevcp = true; SplineMake2(start,end); start = end; } return( start ); } static int SplineWithWellBehavedControlPoints(Spline *ps) { BasePoint splineunit; bigreal splinelen, npos, ppos; splineunit.x = ps->to->me.x - ps->from->me.x; splineunit.y = ps->to->me.y - ps->from->me.y; splinelen = sqrt(splineunit.x*splineunit.x + splineunit.y*splineunit.y); if ( splinelen!=0 ) { splineunit.x /= splinelen; splineunit.y /= splinelen; } npos = (ps->from->nextcp.x-ps->from->me.x) * splineunit.x + (ps->from->nextcp.y-ps->from->me.y) * splineunit.y; ppos = (ps->to->prevcp.x-ps->from->me.x) * splineunit.x + (ps->to->prevcp.y-ps->from->me.y) * splineunit.y; return( npos>=0 && /* npos<=ppos &&*/ ppos<=splinelen ); } static int PrettyApprox(Spline *ps,bigreal tmin, bigreal tmax, QPoint *data, int qcnt, int round_to_int, int test_level ) { int ptcnt, q, i; bigreal distance, dx, dy, tstart; BasePoint end, mid, slopemin, slopemid, slopeend; BasePoint splineunit, start; bigreal splinelen, midpos, lastpos, lastpos2, cppos; int do_good_spline_check; QPoint data2[12]; if ( qcnt==-1 ) return( -1 ); slopemin.x = (3*ps->splines[0].a*tmin+2*ps->splines[0].b)*tmin+ps->splines[0].c; slopemin.y = (3*ps->splines[1].a*tmin+2*ps->splines[1].b)*tmin+ps->splines[1].c; if ( slopemin.x==0 && slopemin.y==0 ) { bigreal t = tmin + (tmax-tmin)/256; /* If there is no control point for this end point, then the slope is */ /* 0/0 at the end point. Which isn't useful, it leads to a quadratic */ /* control point at the end point, but this one is real because it */ /* is used to interpolate the next point, but we get all confused */ /* because we don't expect a real cp to be on the base point. */ slopemin.x = (3*ps->splines[0].a*t+2*ps->splines[0].b)*t+ps->splines[0].c; slopemin.y = (3*ps->splines[1].a*t+2*ps->splines[1].b)*t+ps->splines[1].c; } end.x = ((ps->splines[0].a*tmax+ps->splines[0].b)*tmax+ps->splines[0].c)*tmax+ps->splines[0].d; end.y = ((ps->splines[1].a*tmax+ps->splines[1].b)*tmax+ps->splines[1].c)*tmax+ps->splines[1].d; slopeend.x = (3*ps->splines[0].a*tmax+2*ps->splines[0].b)*tmax+ps->splines[0].c; slopeend.y = (3*ps->splines[1].a*tmax+2*ps->splines[1].b)*tmax+ps->splines[1].c; if ( slopemin.x==0 && slopemin.y==0 ) { bigreal t = tmax - (tmax-tmin)/256; /* Same problem as above, except at the other end */ slopeend.x = (3*ps->splines[0].a*t+2*ps->splines[0].b)*t+ps->splines[0].c; slopeend.y = (3*ps->splines[1].a*t+2*ps->splines[1].b)*t+ps->splines[1].c; } start.x = data[qcnt-1].bp.x; start.y = data[qcnt-1].bp.y; splineunit.x = end.x - start.x; splineunit.y = end.y - start.y; splinelen = sqrt(splineunit.x*splineunit.x + splineunit.y*splineunit.y); if ( splinelen!=0 ) { splineunit.x /= splinelen; splineunit.y /= splinelen; } do_good_spline_check = SplineWithWellBehavedControlPoints(ps); if ( round_to_int && tmax!=1 ) { end.x = rint( end.x ); end.y = rint( end.y ); } dx = end.x-data[qcnt-1].bp.x; dy = end.y-data[qcnt-1].bp.y; distance = dx*dx + dy*dy; if ( distance<.3 ) { /* This is meaningless in truetype, use a line */ data[qcnt-1].cp = data[qcnt-1].bp; data[qcnt].bp = end; data[qcnt].t = 1; return( qcnt+1 ); } for ( ptcnt=0; ptcnt<10; ++ptcnt ) { if ( ptcnt>1 && distance/(ptcnt*ptcnt)<16 ) return( -1 ); /* Points too close for a good approx */ q = qcnt; data2[ptcnt+1].bp = end; lastpos=0; lastpos2 = splinelen; for ( i=0; i<=ptcnt; ++i ) { tstart = (tmin*(ptcnt-i) + tmax*(i+1))/(ptcnt+1); mid.x = ((ps->splines[0].a*tstart+ps->splines[0].b)*tstart+ps->splines[0].c)*tstart+ps->splines[0].d; mid.y = ((ps->splines[1].a*tstart+ps->splines[1].b)*tstart+ps->splines[1].c)*tstart+ps->splines[1].d; if ( i==0 ) { slopemid.x = (3*ps->splines[0].a*tstart+2*ps->splines[0].b)*tstart+ps->splines[0].c; slopemid.y = (3*ps->splines[1].a*tstart+2*ps->splines[1].b)*tstart+ps->splines[1].c; if ( slopemid.x==0 ) data[q-1].cp.x=mid.x; else if ( slopemin.x==0 ) data[q-1].cp.x=data[q-1].bp.x; else if ( RealNear(slopemin.y/slopemin.x,slopemid.y/slopemid.x) ) break; else data[q-1].cp.x = -(data[q-1].bp.y-(slopemin.y/slopemin.x)*data[q-1].bp.x-mid.y+(slopemid.y/slopemid.x)*mid.x)/(slopemin.y/slopemin.x-slopemid.y/slopemid.x); if ( slopemid.y==0 ) data[q-1].cp.y=mid.y; else if ( slopemin.y==0 ) data[q-1].cp.y=data[q-1].bp.y; else if ( RealNear(slopemin.x/slopemin.y,slopemid.x/slopemid.y) ) break; else data[q-1].cp.y = -(data[q-1].bp.x-(slopemin.x/slopemin.y)*data[q-1].bp.y-mid.x+(slopemid.x/slopemid.y)*mid.y)/(slopemin.x/slopemin.y-slopemid.x/slopemid.y); } else { data[q-1].cp.x = 2*data[q-1].bp.x - data[q-2].cp.x; data[q-1].cp.y = 2*data[q-1].bp.y - data[q-2].cp.y; } midpos = (mid.x-start.x)*splineunit.x + (mid.y-start.y)*splineunit.y; cppos = (data[q-1].cp.x-start.x)*splineunit.x + (data[q-1].cp.y-start.y)*splineunit.y; if ( ((do_good_spline_check || i!=0 ) && cpposmidpos ) { i = 0; /* Means we failed */ break; } lastpos = midpos; data[q].bp = mid; data[q++].t = tstart; tstart = (tmax*(ptcnt-i) + tmin*(i+1))/(ptcnt+1); mid.x = ((ps->splines[0].a*tstart+ps->splines[0].b)*tstart+ps->splines[0].c)*tstart+ps->splines[0].d; mid.y = ((ps->splines[1].a*tstart+ps->splines[1].b)*tstart+ps->splines[1].c)*tstart+ps->splines[1].d; if ( i==0 ) { slopemid.x = (3*ps->splines[0].a*tstart+2*ps->splines[0].b)*tstart+ps->splines[0].c; slopemid.y = (3*ps->splines[1].a*tstart+2*ps->splines[1].b)*tstart+ps->splines[1].c; if ( slopemid.x==0 ) data2[ptcnt-i].cp.x=mid.x; else if ( slopeend.x==0 ) data2[ptcnt-i].cp.x=data2[ptcnt-i+1].bp.x; else if ( RealNear(slopeend.y/slopeend.x,slopemid.y/slopemid.x) ) break; else data2[ptcnt-i].cp.x = -(data2[ptcnt-i+1].bp.y-(slopeend.y/slopeend.x)*data2[ptcnt-i+1].bp.x-mid.y+(slopemid.y/slopemid.x)*mid.x)/(slopeend.y/slopeend.x-slopemid.y/slopemid.x); if ( slopemid.y==0 ) data2[ptcnt-i].cp.y=mid.y; else if ( slopeend.y==0 ) data2[ptcnt-i].cp.y=data2[ptcnt-i+1].bp.y; else if ( RealNear(slopeend.x/slopeend.y,slopemid.x/slopemid.y) ) break; else data2[ptcnt-i].cp.y = -(data2[ptcnt-i+1].bp.x-(slopeend.x/slopeend.y)*data2[ptcnt-i+1].bp.y-mid.x+(slopemid.x/slopemid.y)*mid.y)/(slopeend.x/slopeend.y-slopemid.x/slopemid.y); } else { data2[ptcnt-i].cp.x = 2*data2[ptcnt-i+1].bp.x - data2[ptcnt-i+1].cp.x; data2[ptcnt-i].cp.y = 2*data2[ptcnt-i+1].bp.y - data2[ptcnt-i+1].cp.y; } data2[ptcnt-i].bp = mid; midpos = (mid.x-start.x)*splineunit.x + (mid.y-start.y)*splineunit.y; cppos = (data2[ptcnt-i].cp.x-start.x)*splineunit.x + (data2[ptcnt-i].cp.y-start.y)*splineunit.y; if ( ((do_good_spline_check || i!=0 ) && cppos>lastpos2) || cppossplines[0].a,0) && RealNearish(ps->splines[1].a,0)) || ((ps->splines[0].b!=0 && RealNearish(ps->splines[0].a/ps->splines[0].b,0)) && (ps->splines[1].b!=0 && RealNearish(ps->splines[1].a/ps->splines[1].b,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 ); } return( NULL ); } static SplinePoint *ttfApprox(Spline *ps, SplinePoint *start) { #if !defined(FONTFORGE_CONFIG_NON_SYMMETRIC_QUADRATIC_CONVERSION) extended magicpoints[6], last; int cnt, i, j, qcnt, test_level; QPoint data[8*10]; int round_to_int = /* The end points are at integer points, or one coord is at half while */ /* the other is at an integer (ie. condition for ttf interpolated point)*/ ((ps->from->me.x==rint(ps->from->me.x) && ps->from->me.y==rint(ps->from->me.y)) || (ps->from->me.x==rint(ps->from->me.x) && ps->from->me.x==ps->from->nextcp.x && ps->from->me.y!=ps->from->nextcp.y && 2*ps->from->me.y==rint(2*ps->from->me.y)) || (ps->from->me.y==rint(ps->from->me.y) && ps->from->me.y==ps->from->nextcp.y && ps->from->me.x!=ps->from->nextcp.x && 2*ps->from->me.x==rint(2*ps->from->me.x)) ) && ((ps->to->me.x == rint(ps->to->me.x) && ps->to->me.y == rint(ps->to->me.y)) || (ps->to->me.x==rint(ps->to->me.x) && ps->to->me.x==ps->to->prevcp.x && ps->to->me.y!=ps->to->prevcp.y && 2*ps->to->me.y==rint(2*ps->to->me.y)) || (ps->to->me.y==rint(ps->to->me.y) && ps->to->me.y==ps->to->prevcp.y && ps->to->me.x!=ps->to->prevcp.x && 2*ps->to->me.x==rint(2*ps->to->me.x)) ); #endif SplinePoint *ret; /* Divide the spline up at extrema and points of inflection. The first */ /* because ttf splines should have points at their extrema, the second */ /* because quadratic splines can't have points of inflection. */ /* Let's not do the first (extrema) AddExtrema does this better and we */ /* don't want unneeded extrema. */ /* And sometimes we don't want to look at the points of inflection either*/ if (( ret = AlreadyQuadraticCheck(ps,start))!=NULL ) return( ret ); #if !defined(FONTFORGE_CONFIG_NON_SYMMETRIC_QUADRATIC_CONVERSION) qcnt = 1; data[0].bp = ps->from->me; data[0].t = 0; qcnt = PrettyApprox(ps,0,1,data,qcnt,round_to_int,0); if ( qcnt!=-1 ) return( CvtDataToSplines(data,1,qcnt,start)); cnt = 0; /* cnt = Spline2DFindExtrema(ps,magicpoints);*/ cnt += Spline2DFindPointsOfInflection(ps,magicpoints+cnt); /* remove points outside range */ for ( i=0; i=1 ) { for ( j=i+1; jmagicpoints[j] ) { bigreal temp = magicpoints[i]; magicpoints[i] = magicpoints[j]; magicpoints[j] = temp; } } /* Remove duplicates */ for ( i=1; inext!=NULL; test = next ) { next = test->next->to; /* Too close together to be meaningful when output as ttf */ if ( rint(test->me.x) == rint(next->me.x) && rint(test->me.y) == rint(next->me.y) ) { if ( next->next==NULL || next==from ) { if ( test==from ) break; next->prevcp = test->prevcp; next->noprevcp = test->noprevcp; next->prev = test->prev; next->prev->to = next; SplineFree(test->next); SplinePointFree(test); } else { test->nextcp = next->nextcp; test->nonextcp = next->nonextcp; test->next = next->next; test->next->from = test; SplineFree(next->prev); SplinePointFree(next); next = test->next->to; } } if ( next==from ) break; } } SplineSet *SSttfApprox(SplineSet *ss) { SplineSet *ret = chunkalloc(sizeof(SplineSet)); Spline *spline, *first; ret->first = chunkalloc(sizeof(SplinePoint)); *ret->first = *ss->first; if ( ret->first->hintmask != NULL ) { ret->first->hintmask = chunkalloc(sizeof(HintMask)); memcpy(ret->first->hintmask,ss->first->hintmask,sizeof(HintMask)); } ret->last = ret->first; first = NULL; for ( spline=ss->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { ret->last = ttfApprox(spline,ret->last); ret->last->ptindex = spline->to->ptindex; ret->last->ttfindex = spline->to->ttfindex; ret->last->nextcpindex = spline->to->nextcpindex; if ( spline->to->hintmask != NULL ) { ret->last->hintmask = chunkalloc(sizeof(HintMask)); memcpy(ret->last->hintmask,spline->to->hintmask,sizeof(HintMask)); } 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; } } ttfCleanup(ret->first); SPLCategorizePoints(ret); 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 ); } static void ImproveB3CPForQuadratic(real from,real *_ncp,real *_pcp,real to) { real ncp = *_ncp, pcp = *_pcp; real noff, poff; real c,b, best; int err, i, besti; real offs[9]; if ( (noff=ncp/32768.0)<0 ) noff = -noff; if ( (poff=pcp/32768.0)<0 ) poff = -poff; if ( noff<1.0/32768.0 ) noff = 1.0/32768.0; if ( poff<1.0/32768.0 ) poff = 1.0/32768.0; c = 3*(ncp-from); b = 3*(pcp-ncp)-c; best = to-from-c-b; offs[4] = best; if ( best==0 ) return; for ( err=0; err<10; ++err, noff/=2.0, poff/=2.0 ) { c = 3*(ncp-noff-from); b = 3*(pcp-poff-(ncp-noff))-c; offs[0] = to-from-c-b; c = 3*(ncp-noff-from); b = 3*(pcp -(ncp-noff))-c; offs[1] = to-from-c-b; c = 3*(ncp-noff-from); b = 3*(pcp+poff-(ncp-noff))-c; offs[2] = to-from-c-b; c = 3*(ncp -from); b = 3*(pcp-poff-(ncp ))-c; offs[3] = to-from-c-b; c = 3*(ncp -from); b = 3*(pcp+poff-(ncp ))-c; offs[5] = to-from-c-b; c = 3*(ncp+noff-from); b = 3*(pcp-poff-(ncp+noff))-c; offs[6] = to-from-c-b; c = 3*(ncp+noff-from); b = 3*(pcp -(ncp+noff))-c; offs[7] = to-from-c-b; c = 3*(ncp+noff-from); b = 3*(pcp+poff-(ncp+noff))-c; offs[8] = to-from-c-b; besti=4; for ( i=0; i<9; ++i ) { if ( offs[i]<0 ) offs[i]= - offs[i]; if ( offs[i]=6 ) ncp += noff; if ( besti%3==0 ) pcp -= poff; else if ( besti%3==2 ) pcp += poff; offs[4] = best; if ( best==0 ) break; } } *_ncp = ncp; *_pcp = pcp; } SplineSet *SSPSApprox(SplineSet *ss) { SplineSet *ret = chunkalloc(sizeof(SplineSet)); Spline *spline, *first; SplinePoint *to; ret->first = chunkalloc(sizeof(SplinePoint)); *ret->first = *ss->first; if ( ret->first->hintmask != NULL ) { ret->first->hintmask = chunkalloc(sizeof(HintMask)); memcpy(ret->first->hintmask,ss->first->hintmask,sizeof(HintMask)); } 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; if ( to->hintmask != NULL ) { to->hintmask = chunkalloc(sizeof(HintMask)); memcpy(to->hintmask,spline->to->hintmask,sizeof(HintMask)); } if ( !spline->knownlinear ) { ret->last->nextcp.x = ret->last->me.x + 2*(ret->last->nextcp.x-ret->last->me.x)/3; ret->last->nextcp.y = ret->last->me.y + 2*(ret->last->nextcp.y-ret->last->me.y)/3; to->prevcp.x = to->me.x + 2*(to->prevcp.x-to->me.x)/3; to->prevcp.y = to->me.y + 2*(to->prevcp.y-to->me.y)/3; ImproveB3CPForQuadratic(ret->last->me.x,&ret->last->nextcp.x,&to->prevcp.x,to->me.x); ImproveB3CPForQuadratic(ret->last->me.y,&ret->last->nextcp.y,&to->prevcp.y,to->me.y); } 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; } } ret->is_clip_path = ss->is_clip_path; 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 ); } void SCConvertLayerToOrder2(SplineChar *sc,int layer) { SplineSet *new; if ( sc==NULL ) return; new = SplineSetsTTFApprox(sc->layers[layer].splines); SplinePointListsFree(sc->layers[layer].splines); sc->layers[layer].splines = new; sc->layers[layer].order2 = true; MinimumDistancesFree(sc->md); sc->md = NULL; } void SCConvertToOrder2(SplineChar *sc) { int layer; if ( sc==NULL ) return; for ( layer=ly_back; layerlayer_cnt; ++layer ) SCConvertLayerToOrder2(sc,layer); } static void SCConvertRefs(SplineChar *sc,int layer) { RefChar *rf; sc->ticked = true; for ( rf=sc->layers[layer].refs; rf!=NULL; rf=rf->next ) { if ( !rf->sc->ticked ) SCConvertRefs(rf->sc,layer); SCReinstanciateRefChar(sc,rf,layer); /* Conversion is done by reinstanciating */ /* Since the base thing will have been converted, all we do is copy its data */ } } void SFConvertLayerToOrder2(SplineFont *_sf,int layer) { int i, k; SplineFont *sf; if ( _sf->cidmaster!=NULL ) _sf=_sf->cidmaster; k = 0; do { sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { SCConvertLayerToOrder2(sf->glyphs[i],layer); sf->glyphs[i]->ticked = false; sf->glyphs[i]->changedsincelasthinted = false; } for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL && !sf->glyphs[i]->ticked ) SCConvertRefs(sf->glyphs[i],layer); if ( layer!=ly_back ) for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) SCNumberPoints(sf->glyphs[i],layer); ++k; } while ( k<_sf->subfontcnt ); _sf->layers[layer].order2 = true; } void SFConvertGridToOrder2(SplineFont *_sf) { int k; SplineSet *new; SplineFont *sf; if ( _sf->cidmaster!=NULL ) _sf=_sf->cidmaster; k = 0; do { sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; new = SplineSetsTTFApprox(sf->grid.splines); SplinePointListsFree(sf->grid.splines); sf->grid.splines = new; sf->grid.order2 = true; ++k; } while ( k<_sf->subfontcnt ); _sf->grid.order2 = true; } void SFConvertToOrder2(SplineFont *_sf) { int layer; for ( layer=0; layer<_sf->layer_cnt; ++layer ) SFConvertLayerToOrder2(_sf,layer); SFConvertGridToOrder2(_sf); } /* ************************************************************************** */ void SplineRefigure2(Spline *spline) { SplinePoint *from = spline->from, *to = spline->to; Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; Spline old; #ifdef DEBUG if ( RealNear(from->me.x,to->me.x) && RealNear(from->me.y,to->me.y)) IError("Zero length spline created"); #endif if ( spline->acceptableextrema ) old = *spline; if ( from->nonextcp || to->noprevcp || ( from->nextcp.x==from->me.x && from->nextcp.y == from->me.y && from->nextcpindex>=0xfffe ) || ( to->prevcp.x==to->me.x && to->prevcp.y == to->me.y && from->nextcpindex>=0xfffe )) { 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 { IError("Invalid 2nd order spline in SplineRefigure2" ); #ifndef GWW_TEST /* I don't want these to go away when I'm debugging. I want to */ /* know how I got them */ 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; #endif } } 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) ) IError("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; if ( spline->acceptableextrema ) { /* I don't check "d", because changes to that reflect simple */ /* translations which will not affect the shape of the spline */ /* (I don't check "a" because it is always 0 in a quadratic spline) */ if ( !RealNear(old.splines[0].b,spline->splines[0].b) || !RealNear(old.splines[0].c,spline->splines[0].c) || !RealNear(old.splines[1].b,spline->splines[1].b) || !RealNear(old.splines[1].c,spline->splines[1].c) ) spline->acceptableextrema = false; } } void SplineRefigure(Spline *spline) { if ( spline==NULL ) return; if ( spline->order2 ) SplineRefigure2(spline); else SplineRefigure3(spline); } static int IsHV(Spline *spline, int isfrom) { SplinePoint *sp; if ( spline==NULL ) return( false ); if ( !isfrom ) { sp = spline->to; if ( sp->noprevcp ) return( false ); if ( sp->me.x == sp->prevcp.x ) return( 2 ); /* Vertical */ else if ( sp->me.y == sp->prevcp.y ) return( 1 ); /* Horizontal */ else return( 0 ); /* Neither */ } else { sp = spline->from; if ( sp->nonextcp ) return( false ); if ( sp->me.x == sp->nextcp.x ) return( 2 ); /* Vertical */ else if ( sp->me.y == sp->nextcp.y ) return( 1 ); /* Horizontal */ else return( 0 ); /* Neither */ } } void SplineRefigureFixup(Spline *spline) { SplinePoint *from, *to, *prev, *next; BasePoint foff, toff, unit, new; bigreal len; enum pointtype fpt, tpt; int done = false; extern int snaptoint; if ( !spline->order2 ) { SplineRefigure3(spline); return; } from = spline->from; to = spline->to; if ( from->pointtype==pt_hvcurve && to->pointtype==pt_hvcurve ) { done = true; if ( !IsHV(from->prev,0) && !IsHV(to->next,1) ) { if ( to->me.x == from->me.x ) { from->nextcp.x = to->prevcp.x = to->me.x; from->nextcp.y = to->prevcp.y = (from->me.y+from->me.y)/2; } else if ( to->me.y==from->me.y ) { from->nextcp.y = to->prevcp.y = to->me.y; from->nextcp.x = to->prevcp.x = (from->me.x+from->me.x)/2; /* Assume they are drawing clockwise */ } else if (( to->me.x>from->me.x && to->me.y>=from->me.y ) || (to->me.xme.x && to->me.y<=from->me.y )) { from->nextcp.x = to->prevcp.x = from->me.x; from->nextcp.y = to->prevcp.y = to->me.y; } else { from->nextcp.x = to->prevcp.x = to->me.x; from->nextcp.y = to->prevcp.y = from->me.y; } } else if ( !IsHV(to->next,1)) { if ( IsHV(from->prev,0)==1 ) { from->nextcp.x = to->prevcp.x = to->me.x; from->nextcp.y = to->prevcp.y = from->me.y; } else { from->nextcp.x = to->prevcp.x = from->me.x; from->nextcp.y = to->prevcp.y = to->me.y; } } else if ( !IsHV(from->prev,0)) { if ( IsHV(to->next,1)==1 ) { from->nextcp.x = to->prevcp.x = from->me.x; from->nextcp.y = to->prevcp.y = to->me.y; } else { from->nextcp.x = to->prevcp.x = to->me.x; from->nextcp.y = to->prevcp.y = from->me.y; } } else { if ( IsHV(from->prev,0)==1 && IsHV(to->next,1)==2 ) { from->nextcp.x = to->prevcp.x = to->me.x; from->nextcp.y = to->prevcp.y = from->me.y; } else if ( IsHV(from->prev,0)==2 && IsHV(to->next,1)==1 ) { from->nextcp.x = to->prevcp.x = from->me.x; from->nextcp.y = to->prevcp.y = to->me.y; } else done = false; } if ( done ) to->noprevcp = from->nonextcp = false; } if ( !done ) { 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 ( (fpt = from->pointtype)==pt_hvcurve ) fpt = pt_curve; if ( (tpt = to->pointtype)==pt_hvcurve ) tpt = pt_curve; if ( from->nextcpdef && to->prevcpdef ) switch ( fpt*3+tpt ) { 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 || from->pointtype==pt_hvcurve)) { 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); prev = NULL; } if ( to->next!=NULL && (to->pointtype==pt_tangent || to->pointtype==pt_hvcurve)) { 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); next = NULL; } if (( from->pointtype==pt_hvcurve && foff.x!=from->me.x && foff.y!=from->me.y ) || ( to->pointtype==pt_hvcurve && toff.x!=to->me.x && toff.y!=to->me.y )) { if ( from->me.x == to->me.x ) { if ( from->pointtype==pt_hvcurve ) foff.x = from->me.x; if ( to->pointtype==pt_hvcurve ) toff.x = to->me.x; } else if ( from->me.y == to->me.y ) { if ( from->pointtype==pt_hvcurve ) foff.y = from->me.y; if ( to->pointtype==pt_hvcurve ) toff.y = to->me.y; } else { if ( from->pointtype==pt_hvcurve && foff.x!=from->me.x && foff.y!=from->me.y ) { if ( fabs(foff.x-from->me.x) > fabs(foff.y-from->me.y) ) foff.y = from->me.y; else foff.x = from->me.x; } if ( to->pointtype==pt_hvcurve && toff.x!=to->me.x && toff.y!=to->me.y ) { if ( from->pointtype==pt_hvcurve ) { if ( from->me.x==foff.x ) toff.y = to->me.y; else toff.x = to->me.x; } else if ( fabs(toff.x-to->me.x) > fabs(toff.y-to->me.y) ) toff.y = to->me.y; else toff.x = to->me.x; } } } 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->pointtype==pt_hvcurve ) && !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->pointtype==pt_hvcurve) && !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->pointtype==pt_hvcurve ) && !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 ) { prev = NULL; 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; if ( prev!=NULL ) prev->nextcp = 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->pointtype==pt_hvcurve ) && !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; if ( to->next!=NULL ) { to->next->to->prevcp = new; SplineRefigure(to->next); } } } } } 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; } } } if ( snaptoint && !from->nonextcp ) { from->nextcp.x = to->prevcp.x = rint(from->nextcp.x); from->nextcp.y = to->prevcp.y = rint(from->nextcp.y); } SplineRefigure2(spline); /* Now in order2 splines it is possible to request combinations that are */ /* mathematically impossible -- two adjacent hv points often don't work */ if ( to->pointtype==pt_hvcurve && !(to->prevcp.x == to->me.x && to->prevcp.y != to->me.y ) && !(to->prevcp.y == to->me.y && to->prevcp.x != to->me.x ) ) to->pointtype = pt_curve; if ( from->pointtype==pt_hvcurve && !(from->nextcp.x == from->me.x && from->nextcp.y != from->me.y ) && !(from->nextcp.y == from->me.y && from->nextcp.x != from->me.x ) ) from->pointtype = pt_curve; } 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 > 0) return( SplineMake2(from,to)); else return( SplineMake3(from,to)); } dvisvgm-2.8.1/libs/ff-woff/fontforge/psread.c0000664000175000017500000000452413510660062016026 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include "sd.h" #ifdef HAVE_IEEEFP_H # include /* Solaris defines isnan in ieeefp rather than math.h */ #endif typedef struct _io { const char *macro; char *start; FILE *ps, *fog; char fogbuf[60]; int backedup, cnt, isloop, isstopped, fogns; struct _io *prev; } _IO; typedef struct io { struct _io *top; int endedstopped; int advance_width; /* Can be set from a PS comment by MF2PT1 */ } IO; #define GARBAGE_MAX 64 /* length (of string) fill eofill stroke gsave grestore */ 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)); } dvisvgm-2.8.1/libs/ff-woff/fontforge/fflocale.c0000664000175000017500000000226013510660062016316 00000000000000#include #include #include #include "fflocale.h" void switch_to_c_locale(ff_locale_t * tmplocale_p, ff_locale_t * oldlocale_p) { #ifdef HAVE_USELOCALE *tmplocale_p = newlocale(LC_NUMERIC_MASK, "C", NULL); if (*tmplocale_p == NULL) fprintf(stderr, "Failed to create temporary locale.\n"); else if ((*oldlocale_p = uselocale(*tmplocale_p)) == NULL) { fprintf(stderr, "Failed to change locale.\n"); freelocale(*tmplocale_p); *tmplocale_p = NULL; } #else *tmplocale_p = setlocale(LC_NUMERIC, "C"); if (*tmplocale_p) *oldlocale_p = strdup(*tmplocale_p); else { *oldlocale_p = NULL; fprintf(stderr, "Failed to change locale.\n"); } #endif } void switch_to_old_locale(ff_locale_t * tmplocale_p, ff_locale_t * oldlocale_p) { #ifdef HAVE_USELOCALE if (*oldlocale_p) uselocale(*oldlocale_p); else uselocale(LC_GLOBAL_LOCALE); *oldlocale_p = NULL; // This ends the lifecycle of the temporary old locale storage. if (*tmplocale_p) { freelocale(*tmplocale_p); *tmplocale_p = NULL; } #else if (*oldlocale_p) { setlocale(LC_NUMERIC, *oldlocale_p); free(*oldlocale_p); *oldlocale_p = NULL; } #endif } dvisvgm-2.8.1/libs/ff-woff/fontforge/encoding.c0000664000175000017500000007160413510660062016341 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #ifdef _MSC_VER #define strcasecmp _stricmp #define strncasecmp _strnicmp #else #endif #include "encoding.h" #include "psfont.h" Encoding *default_encoding = NULL; 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 int32 unicode_from_MacSymbol[] = { 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, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220d, 0x0028, 0x0029, 0x2217, 0x002b, 0x002c, 0x2212, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x2245, 0x0391, 0x0392, 0x03a7, 0x0394, 0x0395, 0x03a6, 0x0393, 0x0397, 0x0399, 0x03d1, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f, 0x03a0, 0x0398, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03c2, 0x03a9, 0x039e, 0x03a8, 0x0396, 0x005b, 0x2234, 0x005d, 0x22a5, 0x005f, 0xf8e5, 0x03b1, 0x03b2, 0x03c7, 0x03b4, 0x03b5, 0x03c6, 0x03b3, 0x03b7, 0x03b9, 0x03d5, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf, 0x03c0, 0x03b8, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d6, 0x03c9, 0x03be, 0x03c8, 0x03b6, 0x007b, 0x007c, 0x007d, 0x223c, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x0000, 0x03d2, 0x2032, 0x2264, 0x2044, 0x221e, 0x0192, 0x2663, 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193, 0x00b0, 0x00b1, 0x2033, 0x2265, 0x00d7, 0x221d, 0x2202, 0x2022, 0x00f7, 0x2260, 0x2261, 0x2248, 0x2026, 0xf8e6, 0xf8e7, 0x21b5, 0x2135, 0x2111, 0x211c, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229, 0x222a, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209, 0x2220, 0x2207, 0x00ae, 0x00a9, 0x2122, 0x220f, 0x221a, 0x22c5, 0x00ac, 0x2227, 0x2228, 0x21d4, 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x22c4, 0x2329, 0xf8e8, 0xf8e9, 0xf8ea, 0x2211, 0xf8eb, 0xf8ec, 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0, 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, 0xf8ff, 0x232a, 0x222b, 0x2320, 0xf8f5, 0x2321, 0xf8f6, 0xf8f7, 0xf8f8, 0xf8f9, 0xf8fa, 0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0x02c7 }; /* I don't think iconv provides encodings for zapfdingbats nor jis201 */ /* Perhaps I should list them here for compatability, but I think I'll just */ /* leave them out. I doubt they get used. */ static Encoding texbase = { "TeX-Base-Encoding", 256, tex_base_encoding, NULL, NULL, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; Encoding custom = { "Custom", 0, NULL, NULL, &texbase, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; static Encoding original = { "Original", 0, NULL, NULL, &custom, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; static Encoding unicodebmp = { "UnicodeBmp", 65536, NULL, NULL, &original, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; static Encoding unicodefull = { "UnicodeFull", 17*65536, NULL, NULL, &unicodebmp, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; static Encoding adobestd = { "AdobeStandard", 256, unicode_from_adobestd, (char**)AdobeStandardEncoding, &unicodefull, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; static Encoding symbol = { "Symbol", 256, unicode_from_MacSymbol, NULL, &adobestd, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, NULL, NULL, NULL, NULL, NULL, 0, 0 }; Encoding *enclist = &symbol; const char *FindUnicharName(void) { /* Iconv and libiconv use different names for UCS2. Just great. Perhaps */ /* different versions of each use still different names? */ /* Even worse, both accept UCS-2, but under iconv it means native byte */ /* ordering and under libiconv it means big-endian */ iconv_t test; static const char *goodname = NULL; static const char *names[] = { "UCS-4-INTERNAL", "UCS-4", "UCS4", "ISO-10646-UCS-4", "UTF-32", NULL }; static const char *namesle[] = { "UCS-4LE", "UTF-32LE", NULL }; static const char *namesbe[] = { "UCS-4BE", "UTF-32BE", NULL }; const char **testnames; int i; union { short s; char c[2]; } u; if ( goodname!=NULL ) return( goodname ); u.c[0] = 0x1; u.c[1] = 0x2; if ( u.s==0x201 ) { /* Little endian */ testnames = namesle; } else { testnames = namesbe; } for ( i=0; testnames[i]!=NULL; ++i ) { test = iconv_open(testnames[i],"ISO-8859-1"); if ( test!=(iconv_t) -1 && test!=NULL ) { iconv_close(test); goodname = testnames[i]; break; } } if ( goodname==NULL ) { for ( i=0; names[i]!=NULL; ++i ) { test = iconv_open(names[i],"ISO-8859-1"); if ( test!=(iconv_t) -1 && test!=NULL ) { iconv_close(test); goodname = names[i]; break; } } } if ( goodname==NULL ) { IError( "I can't figure out your version of iconv(). I need a name for the UCS-4 encoding and I can't find one. Reconfigure --without-iconv. Bye."); exit( 1 ); } test = iconv_open(goodname,"Mac"); if ( test==(iconv_t) -1 || test==NULL ) { IError( "Your version of iconv does not support the \"Mac Roman\" encoding.\nIf this causes problems, reconfigure --without-iconv." ); } else iconv_close(test); /* I really should check for ISO-2022-JP, KR, CN, and all the other encodings */ /* I might find in a ttf 'name' table. But those tables take too long to build */ return( goodname ); } static int TryEscape( Encoding *enc, const char *escape_sequence ) { char from[20], ucs[20]; size_t fromlen, tolen; ICONV_CONST char *fpt; char *upt; int i, j, low; int esc_len = strlen(escape_sequence); strcpy(from,escape_sequence); enc->has_2byte = false; low = -1; for ( i=0; i<256; ++i ) if ( i!=escape_sequence[0] ) { for ( j=0; j<256; ++j ) { from[esc_len] = i; from[esc_len+1] = j; from[esc_len+2] = 0; fromlen = esc_len+2; fpt = from; upt = ucs; tolen = sizeof(ucs); if ( iconv( enc->tounicode , &fpt, &fromlen, &upt, &tolen )!= (size_t) (-1) && upt-ucs==sizeof(unichar_t) /* Exactly one character */ ) { if ( low==-1 ) { enc->low_page = low = i; enc->has_2byte = true; } enc->high_page = i; break; } } } if ( enc->low_page==enc->high_page ) enc->has_2byte = false; if ( enc->has_2byte ) { strcpy(enc->iso_2022_escape, escape_sequence); enc->iso_2022_escape_len = esc_len; } return( enc->has_2byte ); } Encoding *_FindOrMakeEncoding(const char *name,int make_it) { Encoding *enc; char buffer[20]; const char *iconv_name; Encoding temp; uint8 good[256]; int i, j, any, all; char from[8], ucs[20]; size_t fromlen, tolen; ICONV_CONST char *fpt; char *upt; /* iconv is not case sensitive */ if ( strncasecmp(name,"iso8859_",8)==0 || strncasecmp(name,"koi8_",5)==0 ) { /* Fixup for old naming conventions */ strncpy(buffer,name,sizeof(buffer)); buffer[sizeof(buffer)-1] = '\0'; *strchr(buffer,'_') = '-'; name = buffer; } else if ( strcasecmp(name,"iso-8859")==0 ) { /* Fixup for old naming conventions */ strncpy(buffer,name,3); strncpy(buffer+3,name+4,sizeof(buffer)-3); buffer[sizeof(buffer)-1] = '\0'; name = buffer; } else if ( strcasecmp(name,"isolatin1")==0 ) { name = "iso8859-1"; } else if ( strcasecmp(name,"isocyrillic")==0 ) { name = "iso8859-5"; } else if ( strcasecmp(name,"isoarabic")==0 ) { name = "iso8859-6"; } else if ( strcasecmp(name,"isogreek")==0 ) { name = "iso8859-7"; } else if ( strcasecmp(name,"isohebrew")==0 ) { name = "iso8859-8"; } else if ( strcasecmp(name,"isothai")==0 ) { name = "tis-620"; /* TIS doesn't define non-breaking space in 0xA0 */ } else if ( strcasecmp(name,"latin0")==0 || strcasecmp(name,"latin9")==0 ) { name = "iso8859-15"; /* "latin-9" is supported (libiconv bug?) */ } else if ( strcasecmp(name,"koi8r")==0 ) { name = "koi8-r"; } else if ( strncasecmp(name,"jis201",6)==0 || strncasecmp(name,"jisx0201",8)==0 ) { name = "jis_x0201"; } else if ( strcasecmp(name,"AdobeStandardEncoding")==0 || strcasecmp(name,"Adobe")==0 ) name = "AdobeStandard"; for ( enc=enclist; enc!=NULL; enc=enc->next ) if ( strmatch(name,enc->enc_name)==0 || (enc->iconv_name!=NULL && strmatch(name,enc->iconv_name)==0)) return( enc ); if ( strmatch(name,"unicode")==0 || strmatch(name,"iso10646")==0 || strmatch(name,"iso10646-1")==0 ) return( &unicodebmp ); if ( strmatch(name,"unicode4")==0 || strmatch(name,"ucs4")==0 ) return( &unicodefull ); iconv_name = name; /* Mac seems to work ok */ if ( strcasecmp(name,"win")==0 || strcasecmp(name,"ansi")==0 ) iconv_name = "MS-ANSI"; /* "WINDOWS-1252";*/ else if ( strncasecmp(name,"jis208",6)==0 || strncasecmp(name,"jisx0208",8)==0 ) iconv_name = "ISO-2022-JP"; else if ( strncasecmp(name,"jis212",6)==0 || strncasecmp(name,"jisx0212",8)==0 ) iconv_name = "ISO-2022-JP-2"; else if ( strncasecmp(name,"ksc5601",7)==0 ) iconv_name = "ISO-2022-KR"; else if ( strcasecmp(name,"gb2312pk")==0 || strcasecmp(name,"gb2312packed")==0 ) iconv_name = "EUC-CN"; else if ( strncasecmp(name,"gb2312",6)==0 ) iconv_name = "ISO-2022-CN"; else if ( strcasecmp(name,"wansung")==0 ) iconv_name = "EUC-KR"; else if ( strcasecmp(name,"EUC-CN")==0 ) { iconv_name = name; name = "gb2312pk"; } else if ( strcasecmp(name,"EUC-KR")==0 ) { iconv_name = name; name = "wansung"; } /* Escape sequences: */ /* ISO-2022-CN: \e $ ) A ^N */ /* ISO-2022-KR: \e $ ) C ^N */ /* ISO-2022-JP: \e $ B */ /* ISO-2022-JP-2: \e $ ( D */ /* ISO-2022-JP-3: \e $ ( O */ /* Capital "O", not zero */ /* ISO-2022-CN-EXT: \e $ ) E ^N */ /* Not sure about this, also uses CN escape */ memset(&temp,0,sizeof(temp)); temp.builtin = true; temp.tounicode = iconv_open(FindUnicharName(),iconv_name); if ( temp.tounicode==(iconv_t) -1 || temp.tounicode==NULL ) return( NULL ); /* Iconv doesn't recognize this name */ temp.fromunicode = iconv_open(iconv_name,FindUnicharName()); if ( temp.fromunicode==(iconv_t) -1 || temp.fromunicode==NULL ) { /* This should never happen, but if it does... */ iconv_close(temp.tounicode); return( NULL ); } memset(good,0,sizeof(good)); any = false; all = true; for ( i=1; i<256; ++i ) { from[0] = i; from[1] = 0; fromlen = 1; fpt = from; upt = ucs; tolen = sizeof(ucs); if ( iconv( temp.tounicode , &fpt, &fromlen, &upt, &tolen )!= (size_t) (-1)) { good[i] = true; any = true; } else all = false; } if ( any ) temp.has_1byte = true; if ( all ) temp.only_1byte = true; if ( !all ) { if ( strstr(iconv_name,"2022")==NULL ) { for ( i=temp.has_1byte; i<256; ++i ) if ( !good[i] ) { for ( j=0; j<256; ++j ) { from[0] = i; from[1] = j; from[2] = 0; fromlen = 2; fpt = from; upt = ucs; tolen = sizeof(ucs); if ( iconv( temp.tounicode , &fpt, &fromlen, &upt, &tolen )!= (size_t) (-1) && upt-ucs==sizeof(unichar_t) /* Exactly one character */ ) { if ( temp.low_page==-1 ) temp.low_page = i; temp.high_page = i; temp.has_2byte = true; break; } } } if ( temp.low_page==temp.high_page ) { temp.has_2byte = false; temp.low_page = temp.high_page = -1; } } if ( !temp.has_2byte && !good[033]/* escape */ ) { if ( strstr(iconv_name,"2022")!=NULL && strstr(iconv_name,"JP3")!=NULL && TryEscape( &temp,"\33$(O" )) { ; } else if ( strstr(iconv_name,"2022")!=NULL && strstr(iconv_name,"JP2")!=NULL && TryEscape( &temp,"\33$(D" )) { ; } else if ( strstr(iconv_name,"2022")!=NULL && strstr(iconv_name,"JP")!=NULL && TryEscape( &temp,"\33$B" )) { ; } else if ( strstr(iconv_name,"2022")!=NULL && strstr(iconv_name,"KR")!=NULL && TryEscape( &temp,"\33$)C\16" )) { ; } else if ( strstr(iconv_name,"2022")!=NULL && strstr(iconv_name,"CN")!=NULL && TryEscape( &temp,"\33$)A\16" )) { ; } } } if ( !temp.has_1byte && !temp.has_2byte ) return( NULL ); if ( !make_it ) return( NULL ); enc = chunkalloc(sizeof(Encoding)); *enc = temp; enc->enc_name = copy(name); if ( iconv_name!=name ) enc->iconv_name = copy(iconv_name); enc->next = enclist; enc->builtin = true; enclist = enc; if ( enc->has_2byte ) enc->char_cnt = (enc->high_page<<8) + 256; else { enc->char_cnt = 256; enc->only_1byte = true; } if ( strstrmatch(iconv_name,"JP")!=NULL || strstrmatch(iconv_name,"sjis")!=NULL || strstrmatch(iconv_name,"cp932")!=NULL ) enc->is_japanese = true; else if ( strstrmatch(iconv_name,"KR")!=NULL ) enc->is_korean = true; else if ( strstrmatch(iconv_name,"CN")!=NULL ) enc->is_simplechinese = true; else if ( strstrmatch(iconv_name,"BIG")!=NULL && strstrmatch(iconv_name,"5")!=NULL ) enc->is_tradchinese = true; if ( strstrmatch(name,"ISO8859")!=NULL && strtol(name+strlen(name)-2,NULL,10)>=16 ) /* Not in our menu, don't hide */; else if ( iconv_name!=name || strmatch(name,"mac")==0 || strstrmatch(name,"ISO8859")!=NULL || strmatch(name,"koi8-r")==0 || strmatch(name,"sjis")==0 || strmatch(name,"big5")==0 || strmatch(name,"big5hkscs")==0 ) enc->hidden = true; return( enc ); } Encoding *FindOrMakeEncoding(const char *name) { return( _FindOrMakeEncoding(name,true)); } /* Plugin API */ void EncodingFree(Encoding *item) { int i; if ( item==NULL ) return; 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); } /* ************************************************************************** */ /* ****************************** CID Encodings ***************************** */ /* ************************************************************************** */ int CIDFromName(char *name,SplineFont *cidmaster) { /* We've had various conventions for encoding a cid inside a name */ /* I'm primarily interested in this when the name is something like */ /* Japan1.504.vert */ /* which tells me that the current glyph is the rotated version of */ /* cid 504 */ /* Other convention "cid-504.vert" */ int len = strlen( cidmaster->ordering ); int cid; char *end; if ( strncmp(name,cidmaster->ordering,len)==0 ) { if ( name[len]=='.' ) ++len; } else if ( strncmp(name,"cid-",4)==0 ) { len = 4; } else len = 0; cid = strtol(name+len,&end,10); if ( end==name+len ) return( -1 ); if ( *end!='.' && *end!='\0' ) return( -1 ); return ( cid ); } enum cmaptype { cmt_out=-1, cmt_coderange, cmt_notdefs, cmt_cid, cmt_max }; struct coderange { uint32 first, last, cid; }; /* ************************** Reencoding routines ************************** */ EncMap *EncMapFromEncoding(SplineFont *sf,Encoding *enc) { int i,j, extras, found, base, unmax; int32 *encoded, *unencoded; EncMap *map; struct altuni *altuni; SplineChar *sc; if ( enc==NULL ) return( NULL ); base = enc->char_cnt; if ( enc->is_original ) base = 0; else if ( enc->char_cnt<=256 ) base = 256; else if ( enc->char_cnt<=0x10000 ) base = 0x10000; encoded = malloc(base*sizeof(int32)); memset(encoded,-1,base*sizeof(int32)); unencoded = malloc(sf->glyphcnt*sizeof(int32)); unmax = sf->glyphcnt; for ( i=extras=0; iglyphcnt; ++i ) if ( (sc=sf->glyphs[i])!=NULL ) { found = false; if ( enc->psnames!=NULL ) { for ( j=enc->char_cnt-1; j>=0; --j ) { if ( enc->psnames[j]!=NULL && strcmp(enc->psnames[j],sc->name)==0 ) { found = true; encoded[j] = i; } } } if ( !found ) { if ( sc->unicodeenc!=-1 && sc->unicodeenc < (int)unicode4_size && (j = EncFromUni(sc->unicodeenc,enc))!= -1 ) encoded[j] = i; else { /* I don't think extras can surpass unmax now, but it doesn't */ /* hurt to leave the code (it's from when we encoded duplicates see below) */ if ( extras>=unmax ) unencoded = realloc(unencoded,(unmax+=300)*sizeof(int32)); unencoded[extras++] = i; } for ( altuni=sc->altuni; altuni!=NULL; altuni=altuni->next ) { if ( altuni->unienc!=-1 && (uint32)altuni->uniencvs==-1 && altuni->fid==0 && (j = EncFromUni(altuni->unienc,enc))!= -1 ) encoded[j] = i; /* I used to have code here to add these unencoded duplicates */ /* but I don't really see any reason to do so. The main unicode */ /* will occur, and any encoded duplicates so the glyph won't */ /* vanish */ } } } /* Some glyphs have both a pua encoding and an encoding in a non-bmp */ /* plane. Big5HK does and the AMS glyphs do */ if ( enc->is_unicodefull && (sf->uni_interp == ui_trad_chinese || sf->uni_interp == ui_ams )) { extern const int cns14pua[], amspua[]; const int *pua = sf->uni_interp == ui_ams? amspua : cns14pua; for ( i=0xe000; i<0xf8ff; ++i ) { if ( pua[i-0xe000]!=0 ) encoded[pua[i-0xe000]] = encoded[i]; } } if ( enc->psnames != NULL ) { /* Names are more important than unicode code points for some encodings */ /* AdobeStandard for instance which won't work if you have a glyph */ /* named "f_i" (must be "fi") even though the code point is correct */ /* The code above would match f_i where AS requires fi, so force the */ /* names to be correct. */ for ( j=0; jchar_cnt; ++j ) { if ( encoded[j]!=-1 && enc->psnames[j]!=NULL && strcmp(sf->glyphs[encoded[j]]->name,enc->psnames[j])!=0 ) { free(sf->glyphs[encoded[j]]->name); sf->glyphs[encoded[j]]->name = copy(enc->psnames[j]); } } } map = chunkalloc(sizeof(EncMap)); map->enccount = map->encmax = base + extras; map->map = malloc(map->enccount*sizeof(int32)); memcpy(map->map,encoded,base*sizeof(int32)); memcpy(map->map+base,unencoded,extras*sizeof(int32)); map->backmax = sf->glyphcnt; map->backmap = malloc(sf->glyphcnt*sizeof(int32)); memset(map->backmap,-1,sf->glyphcnt*sizeof(int32)); /* Just in case there are some unencoded glyphs (duplicates perhaps) */ for ( i = map->enccount-1; i>=0; --i ) if ( map->map[i]!=-1 ) map->backmap[map->map[i]] = i; map->enc = enc; free(encoded); free(unencoded); return( map ); } static SplineChar *SplineCharMatch(SplineFont *parent,SplineChar *sc) { SplineChar *scnew = SFSplineCharCreate(parent); scnew->parent = parent; scnew->orig_pos = sc->orig_pos; scnew->name = copy(sc->name); scnew->unicodeenc = sc->unicodeenc; scnew->width = sc->width; scnew->vwidth = sc->vwidth; scnew->widthset = true; return( scnew ); } void SFMatchGlyphs(SplineFont *sf,SplineFont *target,int addempties) { /* reorder sf so that its glyphs array is the same as that in target */ int i, j, cnt, cnt2; SplineChar **glyphs; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->ticked = false; if (( cnt = target->glyphcnt )glyphcnt ) cnt = sf->glyphcnt; glyphs = calloc(cnt,sizeof(SplineChar *)); for ( i=0; iglyphcnt; ++i ) if ( target->glyphs[i]!=NULL ) { SplineChar *sc = SFGetChar(sf,target->glyphs[i]->unicodeenc,target->glyphs[i]->name ); if ( sc==NULL && addempties ) sc = SplineCharMatch(sf,target->glyphs[i]); if ( sc!=NULL ) { glyphs[i] = sc; sc->ticked = true; } } for ( i=cnt2=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL && !sf->glyphs[i]->ticked ) ++cnt2; if ( target->glyphcnt+cnt2>cnt ) { glyphs = realloc(glyphs,(target->glyphcnt+cnt2)*sizeof(SplineChar *)); memset(glyphs+cnt,0,(target->glyphcnt+cnt2-cnt)*sizeof(SplineChar *)); cnt = target->glyphcnt+cnt2; } j = target->glyphcnt; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL && !sf->glyphs[i]->ticked ) glyphs[j++] = sf->glyphs[i]; free(sf->glyphs); sf->glyphs = glyphs; sf->glyphcnt = sf->glyphmax = cnt; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->orig_pos = i; } void MMMatchGlyphs(MMSet *mm) { /* reorder all instances so that they have the same orig_pos */ int i, j, index, lasthole; SplineFont *sf, *base = NULL; SplineChar *sc, *scnew, *sc2; for ( i = 0; iinstance_count; ++i ) if ( mm->instances[i]!=NULL ) { base = mm->instances[i]; break; } if ( base==NULL ) return; /* First build up an ordering that uses all glyphs found in any of the */ /* sub-fonts, "base" will be the start of it. We will add glyphs to */ /* "base" as needed */ lasthole = -1; for ( i = 0; iinstance_count; ++i ) if ( (sf=mm->instances[i])!=NULL && sf!=NULL ) { for ( j=0; jglyphcnt; ++j ) if ( (sc=sf->glyphs[j])!=NULL ) { if ( jglyphcnt && base->glyphs[j]!=NULL && base->glyphs[j]->unicodeenc==sc->unicodeenc && strcmp(base->glyphs[j]->name,sc->name)==0 ) continue; /* It's good, and in the same place */ else if ( (sc2=SFGetChar(base,sc->unicodeenc,sc->name))!=NULL && sc2->unicodeenc==sc->unicodeenc && strcmp(sc2->name,sc->name)==0 ) continue; /* Well, it's in there somewhere */ else { /* We need to add it */ if ( jglyphcnt && base->glyphs[j]==NULL ) index = j; else { for ( ++lasthole ; lastholeglyphcnt && base->glyphs[lasthole]!=NULL; ++lasthole ); index = lasthole; if ( lasthole>=base->glyphmax ) base->glyphs = realloc(base->glyphs,(base->glyphmax+=20)*sizeof(SplineChar *)); if ( lasthole>=base->glyphcnt ) base->glyphcnt = lasthole+1; } base->glyphs[index] = scnew = SplineCharMatch(base,sc); scnew->orig_pos = index; } } } /* Now force all other instances to match */ for ( i = 0; iinstance_count; ++i ) if ( (sf=mm->instances[i])!=NULL && sf!=base ) SFMatchGlyphs(sf,base,true); if ( mm->normal!=NULL ) SFMatchGlyphs(mm->normal,base,true); } int32 UniFromEnc(int enc, Encoding *encname) { char from[20]; unichar_t to[20]; ICONV_CONST char *fpt; char *tpt; size_t fromlen, tolen; if ( encname->is_custom || encname->is_original ) return( -1 ); if ( enc>=encname->char_cnt ) return( -1 ); if ( encname->is_unicodebmp || encname->is_unicodefull ) return( enc ); if ( encname->unicode!=NULL ) return( encname->unicode[enc] ); else if ( encname->tounicode ) { /* To my surprise, on RH9, doing a reset on conversion of CP1258->UCS2 */ /* causes subsequent calls to return garbage */ if ( encname->iso_2022_escape_len ) { tolen = sizeof(to); fromlen = 0; iconv(encname->tounicode,NULL,&fromlen,NULL,&tolen); /* Reset state */ } fpt = from; tpt = (char *) to; tolen = sizeof(to); if ( encname->has_1byte && enc<256 ) { *(char *) fpt = enc; fromlen = 1; } else if ( encname->has_2byte ) { if ( encname->iso_2022_escape_len ) strncpy(from,encname->iso_2022_escape,encname->iso_2022_escape_len ); fromlen = encname->iso_2022_escape_len; from[fromlen++] = enc>>8; from[fromlen++] = enc&0xff; } if ( iconv(encname->tounicode,&fpt,&fromlen,&tpt,&tolen)==(size_t) -1 ) return( -1 ); if ( tpt-(char *) to == 0 ) { /* This strange call appears to be what we need to make CP1258->UCS2 */ /* work. It's supposed to reset the state and give us the shift */ /* out. As there is no state, and no shift out I have no idea why*/ /* this works, but it does. */ if ( iconv(encname->tounicode,NULL,&fromlen,&tpt,&tolen)==(size_t) -1 ) return( -1 ); } if ( tpt-(char *) to == sizeof(unichar_t) ) { return( to[0] ); } } else if ( encname->tounicode_func!=NULL ) { return( (encname->tounicode_func)(enc) ); } return( -1 ); } int32 EncFromUni(int32 uni, Encoding *enc) { unichar_t from[20]; unsigned char to[20]; ICONV_CONST char *fpt; char *tpt; size_t fromlen, tolen; int i; if ( enc->is_custom || enc->is_original || enc->is_compact || uni==-1 ) return( -1 ); if ( enc->is_unicodebmp || enc->is_unicodefull ) return( unichar_cnt ? uni : -1 ); if ( enc->unicode!=NULL ) { for ( i=0; ichar_cnt; ++i ) { if ( enc->unicode[i]==uni ) return( i ); } return( -1 ); } else if ( enc->fromunicode!=NULL ) { /* I don't see how there can be any state to reset in this direction */ /* So I don't reset it */ from[0] = uni; fromlen = sizeof(unichar_t); fpt = (char *) from; tpt = (char *) to; tolen = sizeof(to); iconv(enc->fromunicode,NULL,NULL,NULL,NULL); /* reset shift in/out, etc. */ if ( iconv(enc->fromunicode,&fpt,&fromlen,&tpt,&tolen)==(size_t) -1 ) return( -1 ); if ( tpt-(char *) to == 1 ) return( to[0] ); if ( enc->iso_2022_escape_len!=0 ) { if ( tpt-(char *) to == enc->iso_2022_escape_len+2 && strncmp((char *) to,enc->iso_2022_escape,enc->iso_2022_escape_len)==0 ) return( (to[enc->iso_2022_escape_len]<<8) | to[enc->iso_2022_escape_len+1] ); } else { if ( tpt-(char *) to == sizeof(unichar_t) ) return( (to[0]<<8) | to[1] ); } } else if ( enc->fromunicode_func!=NULL ) { return( (enc->fromunicode_func)(uni) ); } return( -1 ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/tmpfile2.cpp0000664000175000017500000000377113510660062016635 00000000000000/* This file is part of ff-woff, a reduced version of the FontForge library. * It provides the function tmpfile2() with the functionality of tmpfile() but * works on POSIX and Windows systems. * License: Revised BSD license used by FontForge * https://github.com/fontforge/fontforge/blob/master/LICENSE * (C) 2017-2019 Martin Gieseking */ #include #include #include #include #include #if _WIN32 #include #include #include #ifdef _MSC_VER #include #endif #endif using namespace std; class TmpFileException : public exception { public: TmpFileException (const char *msg) : _message(msg) {} const char* what () const noexcept override {return _message.c_str();} private: string _message; }; static inline void tmpfile_error (const char *msg) { #if defined(_MSC_VER) || defined(__MINGW32__) // Visual C++ and MinGW support exception handling // between extern "C" and C++ functions. throw TmpFileException(msg); #else cerr << msg << endl; exit(EXIT_FAILURE); #endif } /* Creates a temporary binary file in the system's temp folder and returns * its file pointer. The file is automatically removed when closing it. * If the temp file can't be created for some reason, the function calls * exit() or throws a TmpFileException (depending on OS and compiler). */ extern "C" FILE* tmpfile2 () { #ifndef _WIN32 if (FILE *fp = std::tmpfile()) return fp; #else char tmpdir[MAX_PATH+1]; DWORD len = GetTempPath(MAX_PATH+1, tmpdir); if (len > 0) { if (len >= MAX_PATH-14) tmpfile_error("path to temp folder too long"); char fname[MAX_PATH]; if (GetTempFileName(tmpdir, "tmp", 0, fname)) { int fd = _open(fname, _O_CREAT | _O_TEMPORARY | _O_RDWR | _O_BINARY, _S_IREAD | _S_IWRITE); if (fd >= 0) { if (FILE *fp = _fdopen(fd, "w+b")) return fp; int saved_errno = errno; _close(fd); errno = saved_errno; } } } #endif tmpfile_error("failed to create temporary file"); } dvisvgm-2.8.1/libs/ff-woff/fontforge/parsepfa.c0000664000175000017500000003276413510660062016360 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include "psfont.h" const 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" }; const 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" }; unsigned short r; #define c1 52845 #define c2 22719 #define EODMARKLEN 16 #define bgetc(extra,in) (*(extra)=='\0' ? getc(in) : (unsigned char ) *(extra)++ ) 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); } dvisvgm-2.8.1/libs/ff-woff/fontforge/gwwiconv.c0000664000175000017500000005611213510660062016413 00000000000000/* Copyright (C) 2004-2012 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 #include #include #ifndef HAVE_ICONV_H /* I have written an limited iconv which will convert either to or from unichar_t */ /* (either UCS2 or UCS4) */ /* it will not convert latin1 to latin2, but latin1->UCS2, UCS2->latin2 */ /* it uses the encodings built into libgunicode for systems with no iconv */ /* (ie. macs before 10.3, perhaps others) */ struct gww_iconv_t { enum encoding from; enum encoding to; }; enum extended_encoding { e_jisgbpk = e_encodingmax }; static enum endian { end_big, end_little, end_unknown } endian = end_unknown; static void endian_detector(void) { union { short s; char c[2]; } u; u.s = 0x0102; if ( u.c[0]==0x1 ) endian = end_big; else endian = end_little; } static enum encoding name_to_enc(const char *encname) { struct { const char *name; enum encoding enc; } map[] = { { "UCS-2-INTERNAL", e_unicode }, { "UCS2", e_unicode }, { "UCS-2", e_unicode }, { "UCS-2LE", e_unicode }, { "UCS-2BE", e_unicode }, { "UNICODELITTLE", e_unicode }, { "UNICODEBIG", e_unicode }, { "ISO-10646/UCS2", e_unicode }, { "ISO-10646/USC2", e_unicode }, /* Old typo */ { "UCS4", e_ucs4 }, { "UCS-4", e_ucs4 }, { "UCS-4LE", e_ucs4 }, { "UCS-4BE", e_ucs4 }, { "UCS-4-INTERNAL", e_ucs4 }, { "ISO-10646/UCS4", e_ucs4 }, { "iso8859-1", e_iso8859_1 }, { "iso8859-2", e_iso8859_2 }, { "iso8859-3", e_iso8859_3 }, { "iso8859-4", e_iso8859_4 }, { "iso8859-5", e_iso8859_5 }, { "iso8859-6", e_iso8859_6 }, { "iso8859-7", e_iso8859_7 }, { "iso8859-8", e_iso8859_8 }, { "iso8859-9", e_iso8859_9 }, { "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 }, { "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_5 }, { "iso-8859-6", e_iso8859_6 }, { "iso-8859-7", e_iso8859_7 }, { "iso-8859-8", e_iso8859_8 }, { "iso-8859-9", e_iso8859_9 }, { "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 }, { "koi8-r", e_koi8_r }, { "jis201", e_jis201 }, { "mac", e_mac }, { "Macintosh", e_mac }, { "MS-ANSI", e_win }, { "EUC-KR", e_wansung }, { "johab", e_johab }, { "ISO-2022-KR", e_jiskorean }, { "ISO-2022-CN", e_jisgb }, { "EUC-CN", e_jisgbpk }, { "big5", e_big5 }, { "big5hkscs", e_big5hkscs }, { "ISO-2022-JP", e_jis }, { "ISO-2022-JP-2", e_jis2 }, { "Sjis", e_sjis }, { "UTF-8", e_utf8 }, { "UTF8", e_utf8 }, { NULL }}; int i; for ( i=0; map[i].name!=NULL; ++i ) if ( strmatch(map[i].name,encname)==0 ) return( map[i].enc ); return( -1 ); } gww_iconv_t gww_iconv_open(const char *toenc,const char *fromenc) { struct gww_iconv_t stuff, *ret; if ( endian==end_unknown ) endian_detector(); stuff.from = name_to_enc(fromenc); stuff.to = name_to_enc(toenc); if ( stuff.from==(enum encoding) -1 || stuff.to==(enum encoding) -1 ) { /*fprintf( stderr, "Unknown encoding\n" );*/ return( (iconv_t)(-1) ); } else if ( stuff.from!=e_ucs4 && stuff.to!=e_ucs4 ) { fprintf( stderr, "Bad call to gww_iconv_open, neither arg is UCS4\n" ); return( (iconv_t)(-1) ); } ret = malloc(sizeof(struct gww_iconv_t)); *ret = stuff; return( ret ); } void gww_iconv_close( gww_iconv_t cd) { free(cd); } size_t gww_iconv( gww_iconv_t _cd, char **inbuf, size_t *inlen, char **outbuf, size_t *outlen) { struct gww_iconv_t *cd = _cd; int char_cnt = 0; unsigned char *plane; int ch; if ( inbuf==NULL || outbuf==NULL || inlen==NULL || outlen==NULL || *inbuf==NULL || *outbuf==NULL ) return( 0 ); /* Legal, used to reset the state. As we don't do states, irrelevant */ if ( cd->from<0 || cd->from>e_encodingmax || cd->to<0 || cd->to>e_encodingmax ) { fprintf( stderr, "Garbage encoding passed to gww_iconv()\n" ); return( (size_t) -1 ); } if ( cd->from==e_unicode ) { if ( cd->to==e_unicode ) { int min = *inlen < *outlen ? *inlen : *outlen; min &= ~1; memcpy(*inbuf,*outbuf,min); char_cnt = min/sizeof(short); *inbuf += min; *outbuf += min; *inlen -= min; *outlen -= min; if ( *inlen==1 && *outlen>0 ) return( (size_t) -1 ); /* Incomplete multi-byte sequence */ } else if ( cd->to==e_ucs4 ) { int min = *inlen/sizeof(short) < *outlen/sizeof(int32) ? *inlen/sizeof(short) : *outlen/sizeof(int32); int highch, lowch; if ( endian == end_little ) { while ( *inlen>=sizeof(short) && *outlen>=sizeof(int32) ) { highch = ((unsigned char *) *inbuf)[1], lowch = *(unsigned char *) *inbuf; ((uint8 *) outbuf)[3] = 0; ((uint8 *) outbuf)[2] = 0; ((uint8 *) outbuf)[1] = highch; ((uint8 *) outbuf)[0] = lowch; outbuf += sizeof(int32); inbuf += sizeof(short); *outlen -= sizeof(int32); *inlen -= sizeof(short); } } else { while ( *inlen>=sizeof(short) && *outlen>=sizeof(int32) ) { highch = ((unsigned char *) *inbuf)[0], lowch = ((unsigned char *) *inbuf)[1]; ((uint8 *) outbuf)[0] = 0; ((uint8 *) outbuf)[1] = 0; ((uint8 *) outbuf)[2] = highch; ((uint8 *) outbuf)[3] = lowch; outbuf += sizeof(int32); inbuf += sizeof(short); *outlen -= sizeof(int32); *inlen -= sizeof(short); } } char_cnt = min; if ( *inlen==1 && *outlen>0 ) return( (size_t) -1 ); /* Incomplete multi-byte sequence */ } else if ( cd->toto]; while ( *inlen>1 && *outlen>0 ) { int highch, lowch; if ( endian == end_little ) { highch = ((unsigned char *) *inbuf)[1], lowch = *(unsigned char *) *inbuf; } else { highch = *(unsigned char *) *inbuf, lowch = ((unsigned char *) *inbuf)[1]; } if ( highch>=table->first && highch<=table->last && (plane = table->table[highch])!=NULL && (ch=plane[lowch])!=0 ) { *((*outbuf)++) = ch; -- *outlen; *inlen -= 2; *inbuf += 2; ++char_cnt; } else return( (size_t) -1 ); } } else if ( cd->to==e_utf8 ) { while ( *inlen>1 && *outlen>0 ) { unichar_t uch; if ( endian == end_little ) { uch = (((unsigned char *) *inbuf)[1]<<8) | (*((unsigned char *) *inbuf)); } else { uch = (*((unsigned char *) *inbuf)<<8) | (((unsigned char *) *inbuf)[1]); } if ( uch < 0x80 ) { *((*outbuf)++) = uch; --*outlen; } else if ( uch<0x800 ) { if ( *outlen==1 ) return( (size_t) -1 ); *((*outbuf)++) = 0xc0 | (uch>>6); *((*outbuf)++) = 0x80 | (uch&0x3f); *outlen-=2; } else { /* I'm not dealing with */ if ( *outlen<=2 ) return( (size_t) -1 ); *((*outbuf)++) = 0xe0 | (uch>>12); *((*outbuf)++) = 0x80 | ((uch>>6)&0x3f); *((*outbuf)++) = 0x80 | (uch&0x3f); *outlen-=3; } *inbuf += 2; *inlen -= 2; ++char_cnt; } } else { fprintf( stderr, "Unexpected encoding\n" ); return( (size_t) -1 ); } } else if ( cd->from==e_ucs4 ) { if ( cd->to==e_unicode ) { int min = *inlen/sizeof(int32) < *outlen/sizeof(int16) ? *inlen/sizeof(int32) : *outlen/sizeof(int16); int highch, lowch; if ( endian == end_little ) { while ( *inlen>=sizeof(short) && *outlen>=sizeof(int32) ) { highch = ((unsigned char *) *inbuf)[1], lowch = *(unsigned char *) *inbuf; ((uint8 *) outbuf)[1] = highch; ((uint8 *) outbuf)[0] = lowch; outbuf += sizeof(int16); inbuf += sizeof(int32); *outlen -= sizeof(int16); *inlen -= sizeof(int32); } } else { while ( *inlen>=sizeof(short) && *outlen>=sizeof(int32) ) { highch = ((unsigned char *) *inbuf)[2], lowch = ((unsigned char *) *inbuf)[3]; ((uint8 *) outbuf)[0] = highch; ((uint8 *) outbuf)[1] = lowch; outbuf += sizeof(int16); inbuf += sizeof(int32); *outlen -= sizeof(int16); *inlen -= sizeof(int32); } } char_cnt = min; if ( *inlen>0 && *outlen>0 ) return( (size_t) -1 ); /* Incomplete multi-byte sequence */ } else if ( cd->toto]; while ( *inlen>1 && *outlen>0 ) { int highch, lowch; if ( endian == end_little ) { highch = ((unsigned char *) *inbuf)[1], lowch = *(unsigned char *) *inbuf; } else { highch = ((unsigned char *) *inbuf)[2], lowch = ((unsigned char *) *inbuf)[3]; } if ( highch>=table->first && highch<=table->last && (plane = table->table[highch])!=NULL && (ch=plane[lowch])!=0 ) { *((*outbuf)++) = ch; -- *outlen; *inlen -= 4; *inbuf += 4; ++char_cnt; } else return( (size_t) -1 ); } } else if ( cd->to==e_utf8 ) { while ( *inlen>1 && *outlen>0 ) { int uch; if ( endian == end_little ) { uch = (((unsigned char *) *inbuf)[3]<<24) | (((unsigned char *) *inbuf)[2]<<16) | (((unsigned char *) *inbuf)[1]<<8) | (*((unsigned char *) *inbuf)); } else { uch = (*((unsigned char *) *inbuf)<<24) | (((unsigned char *) *inbuf)[1]<<16) | (((unsigned char *) *inbuf)[2]<<8) | (((unsigned char *) *inbuf)[3]); } if ( uch < 0x80 ) { *((*outbuf)++) = uch; --*outlen; } else if ( uch<0x800 ) { if ( *outlen==1 ) return( (size_t) -1 ); *((*outbuf)++) = 0xc0 | (uch>>6); *((*outbuf)++) = 0x80 | (uch&0x3f); *outlen-=2; } else if ( uch < 0x10000 ) { if ( *outlen<=2 ) return( (size_t) -1 ); *((*outbuf)++) = 0xe0 | (uch>>12); *((*outbuf)++) = 0x80 | ((uch>>6)&0x3f); *((*outbuf)++) = 0x80 | (uch&0x3f); *outlen-=3; } else { uint32 val = uch-0x10000; int u = ((val&0xf0000)>>16)+1, z=(val&0x0f000)>>12, y=(val&0x00fc0)>>6, x=val&0x0003f; if ( *outlen<=3 ) return( (size_t) -1 ); *(*outbuf)++ = 0xf0 | (u>>2); *(*outbuf)++ = 0x80 | ((u&3)<<4) | z; *(*outbuf)++ = 0x80 | y; *(*outbuf)++ = 0x80 | x; *outlen-=4; } *inbuf += 4; *inlen -= 4; ++char_cnt; } } else { fprintf( stderr, "Unexpected encoding\n" ); return( (size_t) -1 ); } } else if ( cd->to==e_unicode ) { const unichar_t *table; if ( cd->fromfrom]; while ( *inlen>0 && *outlen>1 ) { unichar_t ch = table[ *(unsigned char *) ((*inbuf)++)]; --*inlen; if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_jis || cd->from==e_jis2 || cd->from==e_jiskorean || cd->from==e_jisgb ) { table = cd->from==e_jisgb ? unicode_from_gb2312 : cd->from==e_jiskorean ? unicode_from_ksc5601 : cd->from==e_jis ? unicode_from_jis208 : unicode_from_jis212; while ( *inlen>1 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch; if ( *ipt<0x21 || *ipt>0x7e || ipt[1]<0x21 || ipt[1]>0x7e ) return( (size_t) -1 ); ch = (*ipt-0x21)*94 + (ipt[1]-0x21); ch = table[ch]; *inlen -= 2; *inbuf = (char *) ipt+2; if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } if ( *inlen==1 && *outlen>0 ) return( (size_t) -1 ); /* Incomplete multi-byte sequence */ } else if ( cd->from==e_wansung || cd->from==e_jisgbpk ) { table = cd->from==e_jisgbpk ? unicode_from_gb2312 : unicode_from_ksc5601 ; while ( *inlen>0 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch; if ( *ipt<0x7f ) { ch = *ipt; --*inlen; *inbuf = (char *) ipt+1; } else { if ( *ipt<0xa1 || *ipt>0xfe || ipt[1]<0xa1 || ipt[1]>0xfe || *inlen==1 ) return( (size_t) -1 ); ch = (*ipt-0xa1)*94 + (ipt[1]-0xa1); ch = table[ch]; *inlen -= 2;; *inbuf = (char *) ipt+2; } if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_johab || cd->from==e_big5 || cd->from==e_big5hkscs ) { int offset; if ( cd->from==e_big5 ) { offset = 0xa100; table = unicode_from_big5; } else if ( cd->from==e_big5hkscs ) { offset = 0x8100; table = unicode_from_big5hkscs; } else { offset = 0x8400; table = unicode_from_johab; } while ( *inlen>0 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch; if ( *ipt<0x7f ) { ch = *ipt; --*inlen; *inbuf = (char *) ipt+1; } else { if ( *inlen==1 ) return( (size_t) -1 ); ch = (*ipt<<8) | ipt[1]; if ( ch>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_sjis ) { while ( *inlen>0 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch1 = *ipt; if ( ch1<127 || ( ch1>=161 && ch1<=223 )) { ch = unicode_from_jis201[ch1]; *inbuf = (char *) ipt+1; --*inlen; } else if ( *inlen==1 ) return( (size_t) -1 ); else { int ch2 = ipt[1]; 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; } if ( ch1-0x21>=94 || ch2-0x21>=94 ) return( (size_t) -1 ); ch = unicode_from_jis208[(ch1-0x21)*94+(ch2-0x21)]; *inlen -= 2; *inbuf = (char *) ipt+2; } if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_utf8 ) { while ( *inlen>0 && *outlen>sizeof(unichar_t) ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch = *ipt; if ( ch <= 127 ) { *inbuf = (char *) ipt+1; --*inlen; } else if ( ch<=0xdf ) { if ( *inlen<2 || ipt[1]<0x80 ) return( (size_t) -1 ); ch = ((ch&0x1f)<<6) | (ipt[1] &0x3f); *inlen -= 2; *inbuf = (char *) ipt+2; } else if ( ch<=0xef ) { if ( *inlen<3 || ipt[1]<0x80 || ipt[2]<0x80 ) return( (size_t) -1 ); ch = ((ch&0x1f)<<12) | ((ipt[1] &0x3f)<<6) | (ipt[2]&0x3f); *inlen -= 3; *inbuf = (char *) ipt+3; } else { int w; if ( *inlen<4 || *outlen<4 || ipt[1]<0x80 || ipt[2]<0x80 || ipt[3]<0x80 ) return( (size_t) -1 ); w = ( ((ch&0x7)<<2) | ((ipt[1]&0x30)>>4) )-1; ch = 0xd800 | (w<<6) | ((ipt[1]&0xf)<<2) | ((ipt[2]&0x30)>>4); if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= 2; ch = 0xdc00 | ((ipt[2]&0xf)<<6) | (ipt[3]&0x3f); } if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else { fprintf( stderr, "Unexpected encoding\n" ); return( (size_t) -1 ); } } else if ( cd->to==e_ucs4 ) { const unichar_t *table; if ( cd->fromfrom]; while ( *inlen>0 && *outlen>1 ) { unichar_t ch = table[ *(unsigned char *) ((*inbuf)++)]; --*inlen; if ( endian==end_little ) { *((*outbuf)++) = 0; *((*outbuf)++) = 0; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = 0; *((*outbuf)++) = 0; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_jis || cd->from==e_jis2 || cd->from==e_jiskorean || cd->from==e_jisgb ) { table = cd->from==e_jisgb ? unicode_from_gb2312 : cd->from==e_jiskorean ? unicode_from_ksc5601 : cd->from==e_jis ? unicode_from_jis208 : unicode_from_jis212; while ( *inlen>1 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch; if ( *ipt<0x21 || *ipt>0x7e || ipt[1]<0x21 || ipt[1]>0x7e ) return( (size_t) -1 ); ch = (*ipt-0x21)*94 + (ipt[1]-0x21); ch = table[ch]; *inlen -= 2; *inbuf = (char *) ipt+2; if ( endian==end_little ) { *((*outbuf)++) = 0; *((*outbuf)++) = 0; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = 0; *((*outbuf)++) = 0; } *outlen -= sizeof(unichar_t); ++char_cnt; } if ( *inlen==1 && *outlen>0 ) return( (size_t) -1 ); /* Incomplete multi-byte sequence */ } else if ( cd->from==e_wansung || cd->from==e_jisgbpk ) { table = cd->from==e_jisgbpk ? unicode_from_gb2312 : unicode_from_ksc5601 ; while ( *inlen>0 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch; if ( *ipt<0x7f ) { ch = *ipt; --*inlen; *inbuf = (char *) ipt+1; } else { if ( *ipt<0xa1 || *ipt>0xfe || ipt[1]<0xa1 || ipt[1]>0xfe || *inlen==1 ) return( (size_t) -1 ); ch = (*ipt-0xa1)*94 + (ipt[1]-0xa1); ch = table[ch]; *inlen -= 2;; *inbuf = (char *) ipt+2; } if ( endian==end_little ) { *((*outbuf)++) = 0; *((*outbuf)++) = 0; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = 0; *((*outbuf)++) = 0; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_johab || cd->from==e_big5 || cd->from==e_big5hkscs ) { int offset; if ( cd->from==e_big5 ) { offset = 0xa100; table = unicode_from_big5; } else if ( cd->from==e_big5hkscs ) { offset = 0x8100; table = unicode_from_big5hkscs; } else { offset = 0x8400; table = unicode_from_johab; } while ( *inlen>0 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch; if ( *ipt<0x7f ) { ch = *ipt; --*inlen; *inbuf = (char *) ipt+1; } else { if ( *inlen==1 ) return( (size_t) -1 ); ch = (*ipt<<8) | ipt[1]; if ( ch>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = 0; *((*outbuf)++) = 0; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_sjis ) { while ( *inlen>0 && *outlen>1 ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch1 = *ipt; if ( ch1<127 || ( ch1>=161 && ch1<=223 )) { ch = unicode_from_jis201[ch1]; *inbuf = (char *) ipt+1; --*inlen; } else if ( *inlen==1 ) return( (size_t) -1 ); else { int ch2 = ipt[1]; 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; } if ( ch1-0x21>=94 || ch2-0x21>=94 ) return( (size_t) -1 ); ch = unicode_from_jis208[(ch1-0x21)*94+(ch2-0x21)]; *inlen -= 2; *inbuf = (char *) ipt+2; } if ( endian==end_little ) { *((*outbuf)++) = 0; *((*outbuf)++) = 0; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; } else { *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; *((*outbuf)++) = 0; *((*outbuf)++) = 0; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else if ( cd->from==e_utf8 ) { while ( *inlen>0 && *outlen>sizeof(unichar_t) ) { unsigned char *ipt = (unsigned char *) *inbuf; int ch = *ipt; if ( ch <= 127 ) { *inbuf = (char *) ipt+1; --*inlen; } else if ( ch<=0xdf ) { if ( *inlen<2 || ipt[1]<0x80 ) return( (size_t) -1 ); ch = ((ch&0x1f)<<6) | (ipt[1] &0x3f); *inlen -= 2; *inbuf = (char *) ipt+2; } else if ( ch<=0xef ) { if ( *inlen<3 || ipt[1]<0x80 || ipt[2]<0x80 ) return( (size_t) -1 ); ch = ((ch&0x1f)<<12) | ((ipt[1] &0x3f)<<6) | (ipt[2]&0x3f); *inlen -= 3; *inbuf = (char *) ipt+3; } else { int w,w2; w = ( ((*ipt&0x7)<<2) | ((ipt[1]&0x30)>>4) )-1; w = (w<<6) | ((ipt[1]&0xf)<<2) | ((ipt[2]&0x30)>>4); w2 = ((ipt[2]&0xf)<<6) | (ipt[3]&0x3f); ch = w*0x400 + w2 + 0x10000; *inbuf = (char *) ipt+4; } if ( endian==end_little ) { *((*outbuf)++) = ch&0xff; *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch>>16; *((*outbuf)++) = ch>>24; } else { *((*outbuf)++) = ch>>24; *((*outbuf)++) = ch>>16; *((*outbuf)++) = ch>>8; *((*outbuf)++) = ch&0xff; } *outlen -= sizeof(unichar_t); ++char_cnt; } } else { fprintf( stderr, "Unexpected encoding\n" ); return( (size_t) -1 ); } } else { fprintf( stderr, "One of the two encodings must be UCS2 in gww_iconv()\n" ); return( (size_t) -1 ); } if ( *outlen>=1 ) { **outbuf = '\0'; if ( *outlen>1 ) (*outbuf)[1] = '\0'; if ( cd->to==e_ucs4 && *outlen>3 ) { (*outbuf)[2] = '\0'; (*outbuf)[3] = '\0'; } } return( char_cnt ); } #else static const int a_file_must_define_something=1; #endif /* HAVE_ICONV_H */ dvisvgm-2.8.1/libs/ff-woff/fontforge/unialt.c0000664000175000017500000115601213510660062016045 00000000000000#include /* This file was generated using the program 'makeutype' */ static const unichar_t str_a0[] = { 0x0020, 0 }; static const unichar_t str_a8[] = { 0x0020, 0x0308, 0 }; static const unichar_t str_aa[] = { 0x0061, 0 }; static const unichar_t str_af[] = { 0x0020, 0x0304, 0 }; static const unichar_t str_b2[] = { 0x0032, 0 }; static const unichar_t str_b3[] = { 0x0033, 0 }; static const unichar_t str_b4[] = { 0x0020, 0x0301, 0 }; static const unichar_t str_b5[] = { 0x03bc, 0 }; static const unichar_t str_b8[] = { 0x0020, 0x0327, 0 }; static const unichar_t str_b9[] = { 0x0031, 0 }; static const unichar_t str_ba[] = { 0x006f, 0 }; static const unichar_t str_bc[] = { 0x0031, 0x2044, 0x0034, 0 }; static const unichar_t str_bd[] = { 0x0031, 0x2044, 0x0032, 0 }; static const unichar_t str_be[] = { 0x0033, 0x2044, 0x0034, 0 }; static const unichar_t str_c0[] = { 0x0041, 0x0300, 0 }; static const unichar_t str_c1[] = { 0x0041, 0x0301, 0 }; static const unichar_t str_c2[] = { 0x0041, 0x0302, 0 }; static const unichar_t str_c3[] = { 0x0041, 0x0303, 0 }; static const unichar_t str_c4[] = { 0x0041, 0x0308, 0 }; static const unichar_t str_c5[] = { 0x0041, 0x030a, 0 }; static const unichar_t str_c7[] = { 0x0043, 0x0327, 0 }; static const unichar_t str_c8[] = { 0x0045, 0x0300, 0 }; static const unichar_t str_c9[] = { 0x0045, 0x0301, 0 }; static const unichar_t str_ca[] = { 0x0045, 0x0302, 0 }; static const unichar_t str_cb[] = { 0x0045, 0x0308, 0 }; static const unichar_t str_cc[] = { 0x0049, 0x0300, 0 }; static const unichar_t str_cd[] = { 0x0049, 0x0301, 0 }; static const unichar_t str_ce[] = { 0x0049, 0x0302, 0 }; static const unichar_t str_cf[] = { 0x0049, 0x0308, 0 }; static const unichar_t str_d1[] = { 0x004e, 0x0303, 0 }; static const unichar_t str_d2[] = { 0x004f, 0x0300, 0 }; static const unichar_t str_d3[] = { 0x004f, 0x0301, 0 }; static const unichar_t str_d4[] = { 0x004f, 0x0302, 0 }; static const unichar_t str_d5[] = { 0x004f, 0x0303, 0 }; static const unichar_t str_d6[] = { 0x004f, 0x0308, 0 }; static const unichar_t str_d9[] = { 0x0055, 0x0300, 0 }; static const unichar_t str_da[] = { 0x0055, 0x0301, 0 }; static const unichar_t str_db[] = { 0x0055, 0x0302, 0 }; static const unichar_t str_dc[] = { 0x0055, 0x0308, 0 }; static const unichar_t str_dd[] = { 0x0059, 0x0301, 0 }; static const unichar_t str_e0[] = { 0x0061, 0x0300, 0 }; static const unichar_t str_e1[] = { 0x0061, 0x0301, 0 }; static const unichar_t str_e2[] = { 0x0061, 0x0302, 0 }; static const unichar_t str_e3[] = { 0x0061, 0x0303, 0 }; static const unichar_t str_e4[] = { 0x0061, 0x0308, 0 }; static const unichar_t str_e5[] = { 0x0061, 0x030a, 0 }; static const unichar_t str_e7[] = { 0x0063, 0x0327, 0 }; static const unichar_t str_e8[] = { 0x0065, 0x0300, 0 }; static const unichar_t str_e9[] = { 0x0065, 0x0301, 0 }; static const unichar_t str_ea[] = { 0x0065, 0x0302, 0 }; static const unichar_t str_eb[] = { 0x0065, 0x0308, 0 }; static const unichar_t str_ec[] = { 0x0069, 0x0300, 0 }; static const unichar_t str_ed[] = { 0x0069, 0x0301, 0 }; static const unichar_t str_ee[] = { 0x0069, 0x0302, 0 }; static const unichar_t str_ef[] = { 0x0069, 0x0308, 0 }; static const unichar_t str_f1[] = { 0x006e, 0x0303, 0 }; static const unichar_t str_f2[] = { 0x006f, 0x0300, 0 }; static const unichar_t str_f3[] = { 0x006f, 0x0301, 0 }; static const unichar_t str_f4[] = { 0x006f, 0x0302, 0 }; static const unichar_t str_f5[] = { 0x006f, 0x0303, 0 }; static const unichar_t str_f6[] = { 0x006f, 0x0308, 0 }; static const unichar_t str_f9[] = { 0x0075, 0x0300, 0 }; static const unichar_t str_fa[] = { 0x0075, 0x0301, 0 }; static const unichar_t str_fb[] = { 0x0075, 0x0302, 0 }; static const unichar_t str_fc[] = { 0x0075, 0x0308, 0 }; static const unichar_t str_fd[] = { 0x0079, 0x0301, 0 }; static const unichar_t str_ff[] = { 0x0079, 0x0308, 0 }; static const unichar_t str_100[] = { 0x0041, 0x0304, 0 }; static const unichar_t str_101[] = { 0x0061, 0x0304, 0 }; static const unichar_t str_102[] = { 0x0041, 0x0306, 0 }; static const unichar_t str_103[] = { 0x0061, 0x0306, 0 }; static const unichar_t str_104[] = { 0x0041, 0x0328, 0 }; static const unichar_t str_105[] = { 0x0061, 0x0328, 0 }; static const unichar_t str_106[] = { 0x0043, 0x0301, 0 }; static const unichar_t str_107[] = { 0x0063, 0x0301, 0 }; static const unichar_t str_108[] = { 0x0043, 0x0302, 0 }; static const unichar_t str_109[] = { 0x0063, 0x0302, 0 }; static const unichar_t str_10a[] = { 0x0043, 0x0307, 0 }; static const unichar_t str_10b[] = { 0x0063, 0x0307, 0 }; static const unichar_t str_10c[] = { 0x0043, 0x030c, 0 }; static const unichar_t str_10d[] = { 0x0063, 0x030c, 0 }; static const unichar_t str_10e[] = { 0x0044, 0x030c, 0 }; static const unichar_t str_10f[] = { 0x0064, 0x030c, 0 }; static const unichar_t str_110[] = { 0x00d0, 0 }; static const unichar_t str_112[] = { 0x0045, 0x0304, 0 }; static const unichar_t str_113[] = { 0x0065, 0x0304, 0 }; static const unichar_t str_114[] = { 0x0045, 0x0306, 0 }; static const unichar_t str_115[] = { 0x0065, 0x0306, 0 }; static const unichar_t str_116[] = { 0x0045, 0x0307, 0 }; static const unichar_t str_117[] = { 0x0065, 0x0307, 0 }; static const unichar_t str_118[] = { 0x0045, 0x0328, 0 }; static const unichar_t str_119[] = { 0x0065, 0x0328, 0 }; static const unichar_t str_11a[] = { 0x0045, 0x030c, 0 }; static const unichar_t str_11b[] = { 0x0065, 0x030c, 0 }; static const unichar_t str_11c[] = { 0x0047, 0x0302, 0 }; static const unichar_t str_11d[] = { 0x0067, 0x0302, 0 }; static const unichar_t str_11e[] = { 0x0047, 0x0306, 0 }; static const unichar_t str_11f[] = { 0x0067, 0x0306, 0 }; static const unichar_t str_120[] = { 0x0047, 0x0307, 0 }; static const unichar_t str_121[] = { 0x0067, 0x0307, 0 }; static const unichar_t str_122[] = { 0x0047, 0x0327, 0 }; static const unichar_t str_123[] = { 0x0067, 0x0327, 0 }; static const unichar_t str_124[] = { 0x0048, 0x0302, 0 }; static const unichar_t str_125[] = { 0x0068, 0x0302, 0 }; static const unichar_t str_128[] = { 0x0049, 0x0303, 0 }; static const unichar_t str_129[] = { 0x0069, 0x0303, 0 }; static const unichar_t str_12a[] = { 0x0049, 0x0304, 0 }; static const unichar_t str_12b[] = { 0x0069, 0x0304, 0 }; static const unichar_t str_12c[] = { 0x0049, 0x0306, 0 }; static const unichar_t str_12d[] = { 0x0069, 0x0306, 0 }; static const unichar_t str_12e[] = { 0x0049, 0x0328, 0 }; static const unichar_t str_12f[] = { 0x0069, 0x0328, 0 }; static const unichar_t str_130[] = { 0x0049, 0x0307, 0 }; static const unichar_t str_132[] = { 0x0049, 0x004a, 0 }; static const unichar_t str_133[] = { 0x0069, 0x006a, 0 }; static const unichar_t str_134[] = { 0x004a, 0x0302, 0 }; static const unichar_t str_135[] = { 0x006a, 0x0302, 0 }; static const unichar_t str_136[] = { 0x004b, 0x0327, 0 }; static const unichar_t str_137[] = { 0x006b, 0x0327, 0 }; static const unichar_t str_138[] = { 0x03ba, 0 }; static const unichar_t str_139[] = { 0x004c, 0x0301, 0 }; static const unichar_t str_13a[] = { 0x006c, 0x0301, 0 }; static const unichar_t str_13b[] = { 0x004c, 0x0327, 0 }; static const unichar_t str_13c[] = { 0x006c, 0x0327, 0 }; static const unichar_t str_13d[] = { 0x004c, 0x030c, 0 }; static const unichar_t str_13e[] = { 0x006c, 0x030c, 0 }; static const unichar_t str_13f[] = { 0x004c, 0x00b7, 0 }; static const unichar_t str_140[] = { 0x006c, 0x00b7, 0 }; static const unichar_t str_143[] = { 0x004e, 0x0301, 0 }; static const unichar_t str_144[] = { 0x006e, 0x0301, 0 }; static const unichar_t str_145[] = { 0x004e, 0x0327, 0 }; static const unichar_t str_146[] = { 0x006e, 0x0327, 0 }; static const unichar_t str_147[] = { 0x004e, 0x030c, 0 }; static const unichar_t str_148[] = { 0x006e, 0x030c, 0 }; static const unichar_t str_149[] = { 0x02bc, 0x006e, 0 }; static const unichar_t str_14c[] = { 0x004f, 0x0304, 0 }; static const unichar_t str_14d[] = { 0x006f, 0x0304, 0 }; static const unichar_t str_14e[] = { 0x004f, 0x0306, 0 }; static const unichar_t str_14f[] = { 0x006f, 0x0306, 0 }; static const unichar_t str_150[] = { 0x004f, 0x030b, 0 }; static const unichar_t str_151[] = { 0x006f, 0x030b, 0 }; static const unichar_t str_152[] = { 0x004f, 0x0045, 0 }; static const unichar_t str_153[] = { 0x006f, 0x0065, 0 }; static const unichar_t str_154[] = { 0x0052, 0x0301, 0 }; static const unichar_t str_155[] = { 0x0072, 0x0301, 0 }; static const unichar_t str_156[] = { 0x0052, 0x0327, 0 }; static const unichar_t str_157[] = { 0x0072, 0x0327, 0 }; static const unichar_t str_158[] = { 0x0052, 0x030c, 0 }; static const unichar_t str_159[] = { 0x0072, 0x030c, 0 }; static const unichar_t str_15a[] = { 0x0053, 0x0301, 0 }; static const unichar_t str_15b[] = { 0x0073, 0x0301, 0 }; static const unichar_t str_15c[] = { 0x0053, 0x0302, 0 }; static const unichar_t str_15d[] = { 0x0073, 0x0302, 0 }; static const unichar_t str_15e[] = { 0x0053, 0x0327, 0 }; static const unichar_t str_15f[] = { 0x0073, 0x0327, 0 }; static const unichar_t str_160[] = { 0x0053, 0x030c, 0 }; static const unichar_t str_161[] = { 0x0073, 0x030c, 0 }; static const unichar_t str_162[] = { 0x0054, 0x0327, 0 }; static const unichar_t str_163[] = { 0x0074, 0x0327, 0 }; static const unichar_t str_164[] = { 0x0054, 0x030c, 0 }; static const unichar_t str_165[] = { 0x0074, 0x030c, 0 }; static const unichar_t str_168[] = { 0x0055, 0x0303, 0 }; static const unichar_t str_169[] = { 0x0075, 0x0303, 0 }; static const unichar_t str_16a[] = { 0x0055, 0x0304, 0 }; static const unichar_t str_16b[] = { 0x0075, 0x0304, 0 }; static const unichar_t str_16c[] = { 0x0055, 0x0306, 0 }; static const unichar_t str_16d[] = { 0x0075, 0x0306, 0 }; static const unichar_t str_16e[] = { 0x0055, 0x030a, 0 }; static const unichar_t str_16f[] = { 0x0075, 0x030a, 0 }; static const unichar_t str_170[] = { 0x0055, 0x030b, 0 }; static const unichar_t str_171[] = { 0x0075, 0x030b, 0 }; static const unichar_t str_172[] = { 0x0055, 0x0328, 0 }; static const unichar_t str_173[] = { 0x0075, 0x0328, 0 }; static const unichar_t str_174[] = { 0x0057, 0x0302, 0 }; static const unichar_t str_175[] = { 0x0077, 0x0302, 0 }; static const unichar_t str_176[] = { 0x0059, 0x0302, 0 }; static const unichar_t str_177[] = { 0x0079, 0x0302, 0 }; static const unichar_t str_178[] = { 0x0059, 0x0308, 0 }; static const unichar_t str_179[] = { 0x005a, 0x0301, 0 }; static const unichar_t str_17a[] = { 0x007a, 0x0301, 0 }; static const unichar_t str_17b[] = { 0x005a, 0x0307, 0 }; static const unichar_t str_17c[] = { 0x007a, 0x0307, 0 }; static const unichar_t str_17d[] = { 0x005a, 0x030c, 0 }; static const unichar_t str_17e[] = { 0x007a, 0x030c, 0 }; static const unichar_t str_17f[] = { 0x0073, 0 }; static const unichar_t str_182[] = { 0x0402, 0 }; static const unichar_t str_189[] = { 0x00d0, 0 }; static const unichar_t str_19e[] = { 0x03b7, 0 }; static const unichar_t str_19f[] = { 0x0398, 0 }; static const unichar_t str_1a0[] = { 0x004f, 0x031b, 0 }; static const unichar_t str_1a1[] = { 0x006f, 0x031b, 0 }; static const unichar_t str_1a9[] = { 0x03a3, 0 }; static const unichar_t str_1af[] = { 0x0055, 0x031b, 0 }; static const unichar_t str_1b0[] = { 0x0075, 0x031b, 0 }; static const unichar_t str_1c0[] = { 0x007c, 0 }; static const unichar_t str_1c1[] = { 0x007c, 0x007c, 0 }; static const unichar_t str_1c4[] = { 0x0044, 0x017d, 0 }; static const unichar_t str_1c5[] = { 0x0044, 0x017e, 0 }; static const unichar_t str_1c6[] = { 0x0064, 0x017e, 0 }; static const unichar_t str_1c7[] = { 0x004c, 0x004a, 0 }; static const unichar_t str_1c8[] = { 0x004c, 0x006a, 0 }; static const unichar_t str_1c9[] = { 0x006c, 0x006a, 0 }; static const unichar_t str_1ca[] = { 0x004e, 0x004a, 0 }; static const unichar_t str_1cb[] = { 0x004e, 0x006a, 0 }; static const unichar_t str_1cc[] = { 0x006e, 0x006a, 0 }; static const unichar_t str_1cd[] = { 0x0041, 0x030c, 0 }; static const unichar_t str_1ce[] = { 0x0061, 0x030c, 0 }; static const unichar_t str_1cf[] = { 0x0049, 0x030c, 0 }; static const unichar_t str_1d0[] = { 0x0069, 0x030c, 0 }; static const unichar_t str_1d1[] = { 0x004f, 0x030c, 0 }; static const unichar_t str_1d2[] = { 0x006f, 0x030c, 0 }; static const unichar_t str_1d3[] = { 0x0055, 0x030c, 0 }; static const unichar_t str_1d4[] = { 0x0075, 0x030c, 0 }; static const unichar_t str_1d5[] = { 0x00dc, 0x0304, 0 }; static const unichar_t str_1d6[] = { 0x00fc, 0x0304, 0 }; static const unichar_t str_1d7[] = { 0x00dc, 0x0301, 0 }; static const unichar_t str_1d8[] = { 0x00fc, 0x0301, 0 }; static const unichar_t str_1d9[] = { 0x00dc, 0x030c, 0 }; static const unichar_t str_1da[] = { 0x00fc, 0x030c, 0 }; static const unichar_t str_1db[] = { 0x00dc, 0x0300, 0 }; static const unichar_t str_1dc[] = { 0x00fc, 0x0300, 0 }; static const unichar_t str_1de[] = { 0x00c4, 0x0304, 0 }; static const unichar_t str_1df[] = { 0x00e4, 0x0304, 0 }; static const unichar_t str_1e0[] = { 0x0226, 0x0304, 0 }; static const unichar_t str_1e1[] = { 0x0227, 0x0304, 0 }; static const unichar_t str_1e2[] = { 0x00c6, 0x0304, 0 }; static const unichar_t str_1e3[] = { 0x00e6, 0x0304, 0 }; static const unichar_t str_1e6[] = { 0x0047, 0x030c, 0 }; static const unichar_t str_1e7[] = { 0x0067, 0x030c, 0 }; static const unichar_t str_1e8[] = { 0x004b, 0x030c, 0 }; static const unichar_t str_1e9[] = { 0x006b, 0x030c, 0 }; static const unichar_t str_1ea[] = { 0x004f, 0x0328, 0 }; static const unichar_t str_1eb[] = { 0x006f, 0x0328, 0 }; static const unichar_t str_1ec[] = { 0x01ea, 0x0304, 0 }; static const unichar_t str_1ed[] = { 0x01eb, 0x0304, 0 }; static const unichar_t str_1ee[] = { 0x01b7, 0x030c, 0 }; static const unichar_t str_1ef[] = { 0x0292, 0x030c, 0 }; static const unichar_t str_1f0[] = { 0x006a, 0x030c, 0 }; static const unichar_t str_1f1[] = { 0x0044, 0x005a, 0 }; static const unichar_t str_1f2[] = { 0x0044, 0x007a, 0 }; static const unichar_t str_1f3[] = { 0x0064, 0x007a, 0 }; static const unichar_t str_1f4[] = { 0x0047, 0x0301, 0 }; static const unichar_t str_1f5[] = { 0x0067, 0x0301, 0 }; static const unichar_t str_1f8[] = { 0x004e, 0x0300, 0 }; static const unichar_t str_1f9[] = { 0x006e, 0x0300, 0 }; static const unichar_t str_1fa[] = { 0x00c5, 0x0301, 0 }; static const unichar_t str_1fb[] = { 0x00e5, 0x0301, 0 }; static const unichar_t str_1fc[] = { 0x00c6, 0x0301, 0 }; static const unichar_t str_1fd[] = { 0x00e6, 0x0301, 0 }; static const unichar_t str_1fe[] = { 0x00d8, 0x0301, 0 }; static const unichar_t str_1ff[] = { 0x00f8, 0x0301, 0 }; static const unichar_t str_200[] = { 0x0041, 0x030f, 0 }; static const unichar_t str_201[] = { 0x0061, 0x030f, 0 }; static const unichar_t str_202[] = { 0x0041, 0x0311, 0 }; static const unichar_t str_203[] = { 0x0061, 0x0311, 0 }; static const unichar_t str_204[] = { 0x0045, 0x030f, 0 }; static const unichar_t str_205[] = { 0x0065, 0x030f, 0 }; static const unichar_t str_206[] = { 0x0045, 0x0311, 0 }; static const unichar_t str_207[] = { 0x0065, 0x0311, 0 }; static const unichar_t str_208[] = { 0x0049, 0x030f, 0 }; static const unichar_t str_209[] = { 0x0069, 0x030f, 0 }; static const unichar_t str_20a[] = { 0x0049, 0x0311, 0 }; static const unichar_t str_20b[] = { 0x0069, 0x0311, 0 }; static const unichar_t str_20c[] = { 0x004f, 0x030f, 0 }; static const unichar_t str_20d[] = { 0x006f, 0x030f, 0 }; static const unichar_t str_20e[] = { 0x004f, 0x0311, 0 }; static const unichar_t str_20f[] = { 0x006f, 0x0311, 0 }; static const unichar_t str_210[] = { 0x0052, 0x030f, 0 }; static const unichar_t str_211[] = { 0x0072, 0x030f, 0 }; static const unichar_t str_212[] = { 0x0052, 0x0311, 0 }; static const unichar_t str_213[] = { 0x0072, 0x0311, 0 }; static const unichar_t str_214[] = { 0x0055, 0x030f, 0 }; static const unichar_t str_215[] = { 0x0075, 0x030f, 0 }; static const unichar_t str_216[] = { 0x0055, 0x0311, 0 }; static const unichar_t str_217[] = { 0x0075, 0x0311, 0 }; static const unichar_t str_218[] = { 0x0053, 0x0326, 0 }; static const unichar_t str_219[] = { 0x0073, 0x0326, 0 }; static const unichar_t str_21a[] = { 0x0054, 0x0326, 0 }; static const unichar_t str_21b[] = { 0x0074, 0x0326, 0 }; static const unichar_t str_21e[] = { 0x0048, 0x030c, 0 }; static const unichar_t str_21f[] = { 0x0068, 0x030c, 0 }; static const unichar_t str_226[] = { 0x0041, 0x0307, 0 }; static const unichar_t str_227[] = { 0x0061, 0x0307, 0 }; static const unichar_t str_228[] = { 0x0045, 0x0327, 0 }; static const unichar_t str_229[] = { 0x0065, 0x0327, 0 }; static const unichar_t str_22a[] = { 0x00d6, 0x0304, 0 }; static const unichar_t str_22b[] = { 0x00f6, 0x0304, 0 }; static const unichar_t str_22c[] = { 0x00d5, 0x0304, 0 }; static const unichar_t str_22d[] = { 0x00f5, 0x0304, 0 }; static const unichar_t str_22e[] = { 0x004f, 0x0307, 0 }; static const unichar_t str_22f[] = { 0x006f, 0x0307, 0 }; static const unichar_t str_230[] = { 0x022e, 0x0304, 0 }; static const unichar_t str_231[] = { 0x022f, 0x0304, 0 }; static const unichar_t str_232[] = { 0x0059, 0x0304, 0 }; static const unichar_t str_233[] = { 0x0079, 0x0304, 0 }; static const unichar_t str_269[] = { 0x03b9, 0 }; static const unichar_t str_278[] = { 0x03a6, 0 }; static const unichar_t str_292[] = { 0x01b7, 0 }; static const unichar_t str_299[] = { 0x0432, 0 }; static const unichar_t str_29c[] = { 0x043d, 0 }; static const unichar_t str_2b0[] = { 0x0068, 0 }; static const unichar_t str_2b1[] = { 0x0266, 0 }; static const unichar_t str_2b2[] = { 0x006a, 0 }; static const unichar_t str_2b3[] = { 0x0072, 0 }; static const unichar_t str_2b4[] = { 0x0279, 0 }; static const unichar_t str_2b5[] = { 0x027b, 0 }; static const unichar_t str_2b6[] = { 0x0281, 0 }; static const unichar_t str_2b7[] = { 0x0077, 0 }; static const unichar_t str_2b8[] = { 0x0079, 0 }; static const unichar_t str_2b9[] = { 0x0027, 0 }; static const unichar_t str_2ba[] = { 0x0022, 0 }; static const unichar_t str_2bc[] = { 0x0027, 0 }; static const unichar_t str_2c4[] = { 0x005e, 0 }; static const unichar_t str_2c6[] = { 0x005e, 0 }; static const unichar_t str_2c8[] = { 0x0027, 0 }; static const unichar_t str_2d8[] = { 0x0020, 0x0306, 0 }; static const unichar_t str_2d9[] = { 0x0020, 0x0307, 0 }; static const unichar_t str_2da[] = { 0x0020, 0x030a, 0 }; static const unichar_t str_2db[] = { 0x0020, 0x0328, 0 }; static const unichar_t str_2dc[] = { 0x0020, 0x0303, 0 }; static const unichar_t str_2dd[] = { 0x0020, 0x030b, 0 }; static const unichar_t str_2e0[] = { 0x0263, 0 }; static const unichar_t str_2e1[] = { 0x006c, 0 }; static const unichar_t str_2e2[] = { 0x0073, 0 }; static const unichar_t str_2e3[] = { 0x0078, 0 }; static const unichar_t str_2e4[] = { 0x0295, 0 }; static const unichar_t str_301[] = { 0x00b4, 0 }; static const unichar_t str_302[] = { 0x005e, 0 }; static const unichar_t str_303[] = { 0x007e, 0 }; static const unichar_t str_308[] = { 0x00a8, 0 }; static const unichar_t str_30a[] = { 0x00b0, 0 }; static const unichar_t str_30b[] = { 0x0022, 0 }; static const unichar_t str_30e[] = { 0x0022, 0 }; static const unichar_t str_327[] = { 0x00b8, 0 }; static const unichar_t str_340[] = { 0x0300, 0 }; static const unichar_t str_341[] = { 0x0301, 0 }; static const unichar_t str_343[] = { 0x0313, 0 }; static const unichar_t str_344[] = { 0x0308, 0x0301, 0 }; static const unichar_t str_374[] = { 0x02b9, 0 }; static const unichar_t str_375[] = { 0x02cf, 0 }; static const unichar_t str_37a[] = { 0x0020, 0x0345, 0 }; static const unichar_t str_37e[] = { 0x003b, 0 }; static const unichar_t str_384[] = { 0x0020, 0x0301, 0 }; static const unichar_t str_385[] = { 0x00a8, 0x0301, 0 }; static const unichar_t str_386[] = { 0x0391, 0x0301, 0 }; static const unichar_t str_387[] = { 0x00b7, 0 }; static const unichar_t str_388[] = { 0x0395, 0x0301, 0 }; static const unichar_t str_389[] = { 0x0397, 0x0301, 0 }; static const unichar_t str_38a[] = { 0x0399, 0x0301, 0 }; static const unichar_t str_38c[] = { 0x039f, 0x0301, 0 }; static const unichar_t str_38e[] = { 0x03a5, 0x0301, 0 }; static const unichar_t str_38f[] = { 0x03a9, 0x0301, 0 }; static const unichar_t str_390[] = { 0x03ca, 0x0301, 0 }; static const unichar_t str_391[] = { 0x0041, 0 }; static const unichar_t str_392[] = { 0x0042, 0 }; static const unichar_t str_393[] = { 0x0413, 0 }; static const unichar_t str_395[] = { 0x0045, 0 }; static const unichar_t str_396[] = { 0x005a, 0 }; static const unichar_t str_397[] = { 0x0048, 0 }; static const unichar_t str_399[] = { 0x0049, 0 }; static const unichar_t str_39a[] = { 0x004b, 0 }; static const unichar_t str_39c[] = { 0x004d, 0 }; static const unichar_t str_39d[] = { 0x004e, 0 }; static const unichar_t str_39f[] = { 0x004f, 0 }; static const unichar_t str_3a1[] = { 0x0050, 0 }; static const unichar_t str_3a4[] = { 0x0054, 0 }; static const unichar_t str_3a5[] = { 0x0059, 0 }; static const unichar_t str_3a7[] = { 0x0058, 0 }; static const unichar_t str_3aa[] = { 0x0399, 0x0308, 0 }; static const unichar_t str_3ab[] = { 0x03a5, 0x0308, 0 }; static const unichar_t str_3ac[] = { 0x03b1, 0x0301, 0 }; static const unichar_t str_3ad[] = { 0x03b5, 0x0301, 0 }; static const unichar_t str_3ae[] = { 0x03b7, 0x0301, 0 }; static const unichar_t str_3af[] = { 0x03b9, 0x0301, 0 }; static const unichar_t str_3b0[] = { 0x03cb, 0x0301, 0 }; static const unichar_t str_3ba[] = { 0x0138, 0 }; static const unichar_t str_3bf[] = { 0x006f, 0 }; static const unichar_t str_3c1[] = { 0x0070, 0 }; static const unichar_t str_3c7[] = { 0x0078, 0 }; static const unichar_t str_3ca[] = { 0x03b9, 0x0308, 0 }; static const unichar_t str_3cb[] = { 0x03c5, 0x0308, 0 }; static const unichar_t str_3cc[] = { 0x03bf, 0x0301, 0 }; static const unichar_t str_3cd[] = { 0x03c5, 0x0301, 0 }; static const unichar_t str_3ce[] = { 0x03c9, 0x0301, 0 }; static const unichar_t str_3d0[] = { 0x03b2, 0 }; static const unichar_t str_3d1[] = { 0x03b8, 0 }; static const unichar_t str_3d2[] = { 0x03a5, 0 }; static const unichar_t str_3d3[] = { 0x03d2, 0x0301, 0 }; static const unichar_t str_3d4[] = { 0x03d2, 0x0308, 0 }; static const unichar_t str_3d5[] = { 0x03c6, 0 }; static const unichar_t str_3d6[] = { 0x03c0, 0 }; static const unichar_t str_3f0[] = { 0x03ba, 0 }; static const unichar_t str_3f1[] = { 0x03c1, 0 }; static const unichar_t str_3f2[] = { 0x03c2, 0 }; static const unichar_t str_3f4[] = { 0x0398, 0 }; static const unichar_t str_3f5[] = { 0x03b5, 0 }; static const unichar_t str_3f9[] = { 0x03a3, 0 }; static const unichar_t str_400[] = { 0x0415, 0x0300, 0 }; static const unichar_t str_401[] = { 0x0415, 0x0308, 0 }; static const unichar_t str_403[] = { 0x0413, 0x0301, 0 }; static const unichar_t str_405[] = { 0x0053, 0 }; static const unichar_t str_406[] = { 0x0049, 0 }; static const unichar_t str_407[] = { 0x0406, 0x0308, 0 }; static const unichar_t str_408[] = { 0x004a, 0 }; static const unichar_t str_40c[] = { 0x041a, 0x0301, 0 }; static const unichar_t str_40d[] = { 0x0418, 0x0300, 0 }; static const unichar_t str_40e[] = { 0x0423, 0x0306, 0 }; static const unichar_t str_410[] = { 0x0041, 0 }; static const unichar_t str_412[] = { 0x0042, 0 }; static const unichar_t str_413[] = { 0x0393, 0 }; static const unichar_t str_415[] = { 0x0045, 0 }; static const unichar_t str_419[] = { 0x0418, 0x0306, 0 }; static const unichar_t str_41a[] = { 0x004b, 0 }; static const unichar_t str_41c[] = { 0x004d, 0 }; static const unichar_t str_41d[] = { 0x0048, 0 }; static const unichar_t str_41e[] = { 0x004f, 0 }; static const unichar_t str_41f[] = { 0x03a0, 0 }; static const unichar_t str_420[] = { 0x0050, 0 }; static const unichar_t str_421[] = { 0x0043, 0 }; static const unichar_t str_422[] = { 0x0054, 0 }; static const unichar_t str_424[] = { 0x03a6, 0 }; static const unichar_t str_425[] = { 0x0058, 0 }; static const unichar_t str_430[] = { 0x0061, 0 }; static const unichar_t str_435[] = { 0x0065, 0 }; static const unichar_t str_439[] = { 0x0438, 0x0306, 0 }; static const unichar_t str_43a[] = { 0x03ba, 0 }; static const unichar_t str_43e[] = { 0x006f, 0 }; static const unichar_t str_43f[] = { 0x03c0, 0 }; static const unichar_t str_440[] = { 0x0070, 0 }; static const unichar_t str_441[] = { 0x0063, 0 }; static const unichar_t str_443[] = { 0x0079, 0 }; static const unichar_t str_445[] = { 0x0078, 0 }; static const unichar_t str_450[] = { 0x0435, 0x0300, 0 }; static const unichar_t str_451[] = { 0x0435, 0x0308, 0 }; static const unichar_t str_453[] = { 0x0433, 0x0301, 0 }; static const unichar_t str_455[] = { 0x0073, 0 }; static const unichar_t str_456[] = { 0x0069, 0 }; static const unichar_t str_457[] = { 0x0456, 0x0308, 0 }; static const unichar_t str_458[] = { 0x006a, 0 }; static const unichar_t str_45c[] = { 0x043a, 0x0301, 0 }; static const unichar_t str_45d[] = { 0x0438, 0x0300, 0 }; static const unichar_t str_45e[] = { 0x0443, 0x0306, 0 }; static const unichar_t str_470[] = { 0x03a8, 0 }; static const unichar_t str_471[] = { 0x03c8, 0 }; static const unichar_t str_476[] = { 0x0474, 0x030f, 0 }; static const unichar_t str_477[] = { 0x0475, 0x030f, 0 }; static const unichar_t str_4ae[] = { 0x0059, 0 }; static const unichar_t str_4c0[] = { 0x0049, 0 }; static const unichar_t str_4c1[] = { 0x0416, 0x0306, 0 }; static const unichar_t str_4c2[] = { 0x0436, 0x0306, 0 }; static const unichar_t str_4d0[] = { 0x0410, 0x0306, 0 }; static const unichar_t str_4d1[] = { 0x0430, 0x0306, 0 }; static const unichar_t str_4d2[] = { 0x0410, 0x0308, 0 }; static const unichar_t str_4d3[] = { 0x0430, 0x0308, 0 }; static const unichar_t str_4d4[] = { 0x00c6, 0 }; static const unichar_t str_4d5[] = { 0x00e6, 0 }; static const unichar_t str_4d6[] = { 0x0415, 0x0306, 0 }; static const unichar_t str_4d7[] = { 0x0435, 0x0306, 0 }; static const unichar_t str_4da[] = { 0x04d8, 0x0308, 0 }; static const unichar_t str_4db[] = { 0x04d9, 0x0308, 0 }; static const unichar_t str_4dc[] = { 0x0416, 0x0308, 0 }; static const unichar_t str_4dd[] = { 0x0436, 0x0308, 0 }; static const unichar_t str_4de[] = { 0x0417, 0x0308, 0 }; static const unichar_t str_4df[] = { 0x0437, 0x0308, 0 }; static const unichar_t str_4e0[] = { 0x01b7, 0 }; static const unichar_t str_4e1[] = { 0x0292, 0 }; static const unichar_t str_4e2[] = { 0x0418, 0x0304, 0 }; static const unichar_t str_4e3[] = { 0x0438, 0x0304, 0 }; static const unichar_t str_4e4[] = { 0x0418, 0x0308, 0 }; static const unichar_t str_4e5[] = { 0x0438, 0x0308, 0 }; static const unichar_t str_4e6[] = { 0x041e, 0x0308, 0 }; static const unichar_t str_4e7[] = { 0x043e, 0x0308, 0 }; static const unichar_t str_4e8[] = { 0x0398, 0 }; static const unichar_t str_4e9[] = { 0x03b8, 0 }; static const unichar_t str_4ea[] = { 0x04e8, 0x0308, 0 }; static const unichar_t str_4eb[] = { 0x04e9, 0x0308, 0 }; static const unichar_t str_4ec[] = { 0x042d, 0x0308, 0 }; static const unichar_t str_4ed[] = { 0x044d, 0x0308, 0 }; static const unichar_t str_4ee[] = { 0x0423, 0x0304, 0 }; static const unichar_t str_4ef[] = { 0x0443, 0x0304, 0 }; static const unichar_t str_4f0[] = { 0x0423, 0x0308, 0 }; static const unichar_t str_4f1[] = { 0x0443, 0x0308, 0 }; static const unichar_t str_4f2[] = { 0x0423, 0x030b, 0 }; static const unichar_t str_4f3[] = { 0x0443, 0x030b, 0 }; static const unichar_t str_4f4[] = { 0x0427, 0x0308, 0 }; static const unichar_t str_4f5[] = { 0x0447, 0x0308, 0 }; static const unichar_t str_4f8[] = { 0x042b, 0x0308, 0 }; static const unichar_t str_4f9[] = { 0x044b, 0x0308, 0 }; static const unichar_t str_54f[] = { 0x0053, 0 }; static const unichar_t str_555[] = { 0x004f, 0 }; static const unichar_t str_570[] = { 0x0068, 0 }; static const unichar_t str_578[] = { 0x006e, 0 }; static const unichar_t str_57a[] = { 0x0270, 0 }; static const unichar_t str_57d[] = { 0x0075, 0 }; static const unichar_t str_581[] = { 0x0261, 0 }; static const unichar_t str_582[] = { 0x0269, 0 }; static const unichar_t str_584[] = { 0x0066, 0 }; static const unichar_t str_585[] = { 0x006f, 0 }; static const unichar_t str_587[] = { 0x0565, 0x0582, 0 }; static const unichar_t str_589[] = { 0x003a, 0 }; static const unichar_t str_5f0[] = { 0x05d5, 0x05d5, 0 }; static const unichar_t str_5f1[] = { 0x05d5, 0x05d9, 0 }; static const unichar_t str_5f2[] = { 0x05d9, 0x05d9, 0 }; static const unichar_t str_60c[] = { 0x2018, 0 }; static const unichar_t str_621[] = { 0xfe80, 0 }; static const unichar_t str_622[] = { 0x0627, 0x0653, 0 }; static const unichar_t str_623[] = { 0x0627, 0x0654, 0 }; static const unichar_t str_624[] = { 0x0648, 0x0654, 0 }; static const unichar_t str_625[] = { 0x0627, 0x0655, 0 }; static const unichar_t str_626[] = { 0x064a, 0x0654, 0 }; static const unichar_t str_627[] = { 0xfe8d, 0 }; static const unichar_t str_628[] = { 0xfe8f, 0 }; static const unichar_t str_629[] = { 0xfe93, 0 }; static const unichar_t str_62a[] = { 0xfe95, 0 }; static const unichar_t str_62b[] = { 0xfe99, 0 }; static const unichar_t str_62c[] = { 0xfe9d, 0 }; static const unichar_t str_62d[] = { 0xfea1, 0 }; static const unichar_t str_62e[] = { 0xfea5, 0 }; static const unichar_t str_62f[] = { 0xfea9, 0 }; static const unichar_t str_630[] = { 0xfeab, 0 }; static const unichar_t str_631[] = { 0xfead, 0 }; static const unichar_t str_632[] = { 0xfeaf, 0 }; static const unichar_t str_633[] = { 0xfeb1, 0 }; static const unichar_t str_634[] = { 0xfeb5, 0 }; static const unichar_t str_635[] = { 0xfeb9, 0 }; static const unichar_t str_636[] = { 0xfebd, 0 }; static const unichar_t str_637[] = { 0xfec1, 0 }; static const unichar_t str_638[] = { 0xfec5, 0 }; static const unichar_t str_639[] = { 0xfec9, 0 }; static const unichar_t str_63a[] = { 0xfecd, 0 }; static const unichar_t str_641[] = { 0xfed1, 0 }; static const unichar_t str_642[] = { 0xfed5, 0 }; static const unichar_t str_643[] = { 0xfed9, 0 }; static const unichar_t str_644[] = { 0xfedd, 0 }; static const unichar_t str_645[] = { 0xfee1, 0 }; static const unichar_t str_646[] = { 0xfee5, 0 }; static const unichar_t str_647[] = { 0xfee9, 0 }; static const unichar_t str_648[] = { 0xfeed, 0 }; static const unichar_t str_649[] = { 0xfeef, 0 }; static const unichar_t str_64a[] = { 0xfef1, 0 }; static const unichar_t str_66a[] = { 0x0025, 0 }; static const unichar_t str_66c[] = { 0x002c, 0 }; static const unichar_t str_66d[] = { 0x22c6, 0 }; static const unichar_t str_671[] = { 0xfb50, 0 }; static const unichar_t str_675[] = { 0x0627, 0x0674, 0 }; static const unichar_t str_676[] = { 0x0648, 0x0674, 0 }; static const unichar_t str_677[] = { 0x06c7, 0x0674, 0 }; static const unichar_t str_678[] = { 0x064a, 0x0674, 0 }; static const unichar_t str_679[] = { 0xfb66, 0 }; static const unichar_t str_67a[] = { 0xfb5e, 0 }; static const unichar_t str_67b[] = { 0xfb52, 0 }; static const unichar_t str_67e[] = { 0xfb56, 0 }; static const unichar_t str_67f[] = { 0xfb62, 0 }; static const unichar_t str_680[] = { 0xfb5a, 0 }; static const unichar_t str_683[] = { 0xfb76, 0 }; static const unichar_t str_684[] = { 0xfb72, 0 }; static const unichar_t str_686[] = { 0xfb7a, 0 }; static const unichar_t str_687[] = { 0xfb7e, 0 }; static const unichar_t str_688[] = { 0xfb88, 0 }; static const unichar_t str_68c[] = { 0xfb84, 0 }; static const unichar_t str_68d[] = { 0xfb82, 0 }; static const unichar_t str_68e[] = { 0xfb86, 0 }; static const unichar_t str_691[] = { 0xfb8c, 0 }; static const unichar_t str_698[] = { 0xfb8a, 0 }; static const unichar_t str_6a4[] = { 0xfb6a, 0 }; static const unichar_t str_6a6[] = { 0xfb6e, 0 }; static const unichar_t str_6a9[] = { 0xfb8e, 0 }; static const unichar_t str_6ad[] = { 0xfbd3, 0 }; static const unichar_t str_6af[] = { 0xfb92, 0 }; static const unichar_t str_6b1[] = { 0xfb9a, 0 }; static const unichar_t str_6b3[] = { 0xfb96, 0 }; static const unichar_t str_6ba[] = { 0xfb9e, 0 }; static const unichar_t str_6bb[] = { 0xfba0, 0 }; static const unichar_t str_6be[] = { 0xfbaa, 0 }; static const unichar_t str_6c0[] = { 0x06d5, 0x0654, 0 }; static const unichar_t str_6c1[] = { 0xfba6, 0 }; static const unichar_t str_6c2[] = { 0x06c1, 0x0654, 0 }; static const unichar_t str_6c5[] = { 0xfbe0, 0 }; static const unichar_t str_6c6[] = { 0xfbd9, 0 }; static const unichar_t str_6c7[] = { 0xfbd7, 0 }; static const unichar_t str_6c8[] = { 0xfbdb, 0 }; static const unichar_t str_6c9[] = { 0xfbe2, 0 }; static const unichar_t str_6cb[] = { 0xfbde, 0 }; static const unichar_t str_6cc[] = { 0xfbfc, 0 }; static const unichar_t str_6d0[] = { 0xfbe4, 0 }; static const unichar_t str_6d2[] = { 0xfbae, 0 }; static const unichar_t str_6d3[] = { 0x06d2, 0x0654, 0 }; static const unichar_t str_6d4[] = { 0x00b7, 0 }; static const unichar_t str_929[] = { 0x0928, 0x093c, 0 }; static const unichar_t str_931[] = { 0x0930, 0x093c, 0 }; static const unichar_t str_934[] = { 0x0933, 0x093c, 0 }; static const unichar_t str_958[] = { 0x0915, 0x093c, 0 }; static const unichar_t str_959[] = { 0x0916, 0x093c, 0 }; static const unichar_t str_95a[] = { 0x0917, 0x093c, 0 }; static const unichar_t str_95b[] = { 0x091c, 0x093c, 0 }; static const unichar_t str_95c[] = { 0x0921, 0x093c, 0 }; static const unichar_t str_95d[] = { 0x0922, 0x093c, 0 }; static const unichar_t str_95e[] = { 0x092b, 0x093c, 0 }; static const unichar_t str_95f[] = { 0x092f, 0x093c, 0 }; static const unichar_t str_9cb[] = { 0x09c7, 0x09be, 0 }; static const unichar_t str_9cc[] = { 0x09c7, 0x09d7, 0 }; static const unichar_t str_9dc[] = { 0x09a1, 0x09bc, 0 }; static const unichar_t str_9dd[] = { 0x09a2, 0x09bc, 0 }; static const unichar_t str_9df[] = { 0x09af, 0x09bc, 0 }; static const unichar_t str_a33[] = { 0x0a32, 0x0a3c, 0 }; static const unichar_t str_a36[] = { 0x0a38, 0x0a3c, 0 }; static const unichar_t str_a59[] = { 0x0a16, 0x0a3c, 0 }; static const unichar_t str_a5a[] = { 0x0a17, 0x0a3c, 0 }; static const unichar_t str_a5b[] = { 0x0a1c, 0x0a3c, 0 }; static const unichar_t str_a5e[] = { 0x0a2b, 0x0a3c, 0 }; static const unichar_t str_b48[] = { 0x0b47, 0x0b56, 0 }; static const unichar_t str_b4b[] = { 0x0b47, 0x0b3e, 0 }; static const unichar_t str_b4c[] = { 0x0b47, 0x0b57, 0 }; static const unichar_t str_b5c[] = { 0x0b21, 0x0b3c, 0 }; static const unichar_t str_b5d[] = { 0x0b22, 0x0b3c, 0 }; static const unichar_t str_b94[] = { 0x0b92, 0x0bd7, 0 }; static const unichar_t str_bca[] = { 0x0bc6, 0x0bbe, 0 }; static const unichar_t str_bcb[] = { 0x0bc7, 0x0bbe, 0 }; static const unichar_t str_bcc[] = { 0x0bc6, 0x0bd7, 0 }; static const unichar_t str_c48[] = { 0x0c46, 0x0c56, 0 }; static const unichar_t str_cc0[] = { 0x0cbf, 0x0cd5, 0 }; static const unichar_t str_cc7[] = { 0x0cc6, 0x0cd5, 0 }; static const unichar_t str_cc8[] = { 0x0cc6, 0x0cd6, 0 }; static const unichar_t str_cca[] = { 0x0cc6, 0x0cc2, 0 }; static const unichar_t str_ccb[] = { 0x0cca, 0x0cd5, 0 }; static const unichar_t str_d4a[] = { 0x0d46, 0x0d3e, 0 }; static const unichar_t str_d4b[] = { 0x0d47, 0x0d3e, 0 }; static const unichar_t str_d4c[] = { 0x0d46, 0x0d57, 0 }; static const unichar_t str_dda[] = { 0x0dd9, 0x0dca, 0 }; static const unichar_t str_ddc[] = { 0x0dd9, 0x0dcf, 0 }; static const unichar_t str_ddd[] = { 0x0ddc, 0x0dca, 0 }; static const unichar_t str_dde[] = { 0x0dd9, 0x0ddf, 0 }; static const unichar_t str_e33[] = { 0x0e4d, 0x0e32, 0 }; static const unichar_t str_eb3[] = { 0x0ecd, 0x0eb2, 0 }; static const unichar_t str_edc[] = { 0x0eab, 0x0e99, 0 }; static const unichar_t str_edd[] = { 0x0eab, 0x0ea1, 0 }; static const unichar_t str_f0c[] = { 0x0f0b, 0 }; static const unichar_t str_f43[] = { 0x0f42, 0x0fb7, 0 }; static const unichar_t str_f4d[] = { 0x0f4c, 0x0fb7, 0 }; static const unichar_t str_f52[] = { 0x0f51, 0x0fb7, 0 }; static const unichar_t str_f57[] = { 0x0f56, 0x0fb7, 0 }; static const unichar_t str_f5c[] = { 0x0f5b, 0x0fb7, 0 }; static const unichar_t str_f69[] = { 0x0f40, 0x0fb5, 0 }; static const unichar_t str_f73[] = { 0x0f71, 0x0f72, 0 }; static const unichar_t str_f75[] = { 0x0f71, 0x0f74, 0 }; static const unichar_t str_f76[] = { 0x0fb2, 0x0f80, 0 }; static const unichar_t str_f77[] = { 0x0fb2, 0x0f81, 0 }; static const unichar_t str_f78[] = { 0x0fb3, 0x0f80, 0 }; static const unichar_t str_f79[] = { 0x0fb3, 0x0f81, 0 }; static const unichar_t str_f81[] = { 0x0f71, 0x0f80, 0 }; static const unichar_t str_f93[] = { 0x0f92, 0x0fb7, 0 }; static const unichar_t str_f9d[] = { 0x0f9c, 0x0fb7, 0 }; static const unichar_t str_fa2[] = { 0x0fa1, 0x0fb7, 0 }; static const unichar_t str_fa7[] = { 0x0fa6, 0x0fb7, 0 }; static const unichar_t str_fac[] = { 0x0fab, 0x0fb7, 0 }; static const unichar_t str_fb9[] = { 0x0f90, 0x0fb5, 0 }; static const unichar_t str_1026[] = { 0x1025, 0x102e, 0 }; static const unichar_t str_10fc[] = { 0x10dc, 0 }; static const unichar_t str_1101[] = { 0x1100, 0x1100, 0 }; static const unichar_t str_1104[] = { 0x1103, 0x1103, 0 }; static const unichar_t str_1108[] = { 0x1107, 0x1107, 0 }; static const unichar_t str_110a[] = { 0x1109, 0x1109, 0 }; static const unichar_t str_110d[] = { 0x110c, 0x110c, 0 }; static const unichar_t str_1113[] = { 0x1102, 0x1100, 0 }; static const unichar_t str_1114[] = { 0x1102, 0x1102, 0 }; static const unichar_t str_1115[] = { 0x1102, 0x1103, 0 }; static const unichar_t str_1116[] = { 0x1102, 0x1107, 0 }; static const unichar_t str_1117[] = { 0x1103, 0x1100, 0 }; static const unichar_t str_1118[] = { 0x1105, 0x1102, 0 }; static const unichar_t str_1119[] = { 0x1105, 0x1105, 0 }; static const unichar_t str_111a[] = { 0x1105, 0x1112, 0 }; static const unichar_t str_111b[] = { 0x1105, 0x110b, 0 }; static const unichar_t str_111c[] = { 0x1106, 0x1107, 0 }; static const unichar_t str_111d[] = { 0x1106, 0x110b, 0 }; static const unichar_t str_111e[] = { 0x1107, 0x1100, 0 }; static const unichar_t str_111f[] = { 0x1107, 0x1102, 0 }; static const unichar_t str_1120[] = { 0x1107, 0x1103, 0 }; static const unichar_t str_1121[] = { 0x1107, 0x1109, 0 }; static const unichar_t str_1122[] = { 0x1107, 0x1109, 0x1100, 0 }; static const unichar_t str_1123[] = { 0x1107, 0x1109, 0x1103, 0 }; static const unichar_t str_1124[] = { 0x1107, 0x1109, 0x1107, 0 }; static const unichar_t str_1125[] = { 0x1107, 0x1109, 0x1109, 0 }; static const unichar_t str_1126[] = { 0x1107, 0x1109, 0x110c, 0 }; static const unichar_t str_1127[] = { 0x1107, 0x110c, 0 }; static const unichar_t str_1128[] = { 0x1107, 0x110e, 0 }; static const unichar_t str_1129[] = { 0x1107, 0x1110, 0 }; static const unichar_t str_112a[] = { 0x1107, 0x1111, 0 }; static const unichar_t str_112b[] = { 0x1107, 0x110b, 0 }; static const unichar_t str_112c[] = { 0x1107, 0x1107, 0x110b, 0 }; static const unichar_t str_112d[] = { 0x1109, 0x1100, 0 }; static const unichar_t str_112e[] = { 0x1109, 0x1102, 0 }; static const unichar_t str_112f[] = { 0x1109, 0x1103, 0 }; static const unichar_t str_1130[] = { 0x1109, 0x1105, 0 }; static const unichar_t str_1131[] = { 0x1109, 0x1106, 0 }; static const unichar_t str_1132[] = { 0x1109, 0x1107, 0 }; static const unichar_t str_1133[] = { 0x1109, 0x1107, 0x1100, 0 }; static const unichar_t str_1134[] = { 0x1109, 0x1109, 0x1109, 0 }; static const unichar_t str_1135[] = { 0x1109, 0x110b, 0 }; static const unichar_t str_1136[] = { 0x1109, 0x110c, 0 }; static const unichar_t str_1137[] = { 0x1109, 0x110e, 0 }; static const unichar_t str_1138[] = { 0x1109, 0x110f, 0 }; static const unichar_t str_1139[] = { 0x1109, 0x1110, 0 }; static const unichar_t str_113a[] = { 0x1109, 0x1111, 0 }; static const unichar_t str_113b[] = { 0x1109, 0x1112, 0 }; static const unichar_t str_113d[] = { 0x113c, 0x113c, 0 }; static const unichar_t str_113f[] = { 0x113e, 0x113e, 0 }; static const unichar_t str_1141[] = { 0x110b, 0x1100, 0 }; static const unichar_t str_1142[] = { 0x110b, 0x1103, 0 }; static const unichar_t str_1143[] = { 0x110b, 0x1106, 0 }; static const unichar_t str_1144[] = { 0x110b, 0x1107, 0 }; static const unichar_t str_1145[] = { 0x110b, 0x1109, 0 }; static const unichar_t str_1146[] = { 0x110b, 0x1140, 0 }; static const unichar_t str_1147[] = { 0x110b, 0x110b, 0 }; static const unichar_t str_1148[] = { 0x110b, 0x110c, 0 }; static const unichar_t str_1149[] = { 0x110b, 0x110e, 0 }; static const unichar_t str_114a[] = { 0x110b, 0x1110, 0 }; static const unichar_t str_114b[] = { 0x110b, 0x1111, 0 }; static const unichar_t str_114d[] = { 0x110c, 0x110b, 0 }; static const unichar_t str_114f[] = { 0x114e, 0x114e, 0 }; static const unichar_t str_1151[] = { 0x1150, 0x1150, 0 }; static const unichar_t str_1152[] = { 0x110e, 0x110f, 0 }; static const unichar_t str_1153[] = { 0x110e, 0x1112, 0 }; static const unichar_t str_1156[] = { 0x1111, 0x1107, 0 }; static const unichar_t str_1157[] = { 0x1111, 0x110b, 0 }; static const unichar_t str_1158[] = { 0x1112, 0x1112, 0 }; static const unichar_t str_1162[] = { 0x1161, 0x1175, 0 }; static const unichar_t str_1164[] = { 0x1163, 0x1175, 0 }; static const unichar_t str_1166[] = { 0x1165, 0x1175, 0 }; static const unichar_t str_1168[] = { 0x1167, 0x1175, 0 }; static const unichar_t str_116a[] = { 0x1169, 0x1161, 0 }; static const unichar_t str_116b[] = { 0x1169, 0x1162, 0 }; static const unichar_t str_116c[] = { 0x1169, 0x1175, 0 }; static const unichar_t str_116f[] = { 0x116e, 0x1165, 0 }; static const unichar_t str_1170[] = { 0x116e, 0x1166, 0 }; static const unichar_t str_1171[] = { 0x116e, 0x1175, 0 }; static const unichar_t str_1174[] = { 0x1173, 0x1175, 0 }; static const unichar_t str_1176[] = { 0x1161, 0x1169, 0 }; static const unichar_t str_1177[] = { 0x1161, 0x116e, 0 }; static const unichar_t str_1178[] = { 0x1163, 0x1169, 0 }; static const unichar_t str_1179[] = { 0x1163, 0x116d, 0 }; static const unichar_t str_117a[] = { 0x1165, 0x1169, 0 }; static const unichar_t str_117b[] = { 0x1165, 0x116e, 0 }; static const unichar_t str_117c[] = { 0x1165, 0x1173, 0 }; static const unichar_t str_117d[] = { 0x1167, 0x1169, 0 }; static const unichar_t str_117e[] = { 0x1167, 0x116e, 0 }; static const unichar_t str_117f[] = { 0x1169, 0x1165, 0 }; static const unichar_t str_1180[] = { 0x1169, 0x1166, 0 }; static const unichar_t str_1181[] = { 0x1169, 0x1168, 0 }; static const unichar_t str_1182[] = { 0x1169, 0x1169, 0 }; static const unichar_t str_1183[] = { 0x1169, 0x116e, 0 }; static const unichar_t str_1184[] = { 0x116d, 0x1163, 0 }; static const unichar_t str_1185[] = { 0x116d, 0x1164, 0 }; static const unichar_t str_1186[] = { 0x116d, 0x1167, 0 }; static const unichar_t str_1187[] = { 0x116d, 0x1169, 0 }; static const unichar_t str_1188[] = { 0x116d, 0x1175, 0 }; static const unichar_t str_1189[] = { 0x116e, 0x1161, 0 }; static const unichar_t str_118a[] = { 0x116e, 0x1162, 0 }; static const unichar_t str_118b[] = { 0x116e, 0x1165, 0x1173, 0 }; static const unichar_t str_118c[] = { 0x116e, 0x1168, 0 }; static const unichar_t str_118d[] = { 0x116e, 0x116e, 0 }; static const unichar_t str_118e[] = { 0x1172, 0x1161, 0 }; static const unichar_t str_118f[] = { 0x1172, 0x1165, 0 }; static const unichar_t str_1190[] = { 0x1172, 0x1166, 0 }; static const unichar_t str_1191[] = { 0x1172, 0x1167, 0 }; static const unichar_t str_1192[] = { 0x1172, 0x1168, 0 }; static const unichar_t str_1193[] = { 0x1172, 0x116e, 0 }; static const unichar_t str_1194[] = { 0x1172, 0x1175, 0 }; static const unichar_t str_1195[] = { 0x1173, 0x116e, 0 }; static const unichar_t str_1196[] = { 0x1173, 0x1173, 0 }; static const unichar_t str_1197[] = { 0x1174, 0x116e, 0 }; static const unichar_t str_1198[] = { 0x1175, 0x1161, 0 }; static const unichar_t str_1199[] = { 0x1175, 0x1163, 0 }; static const unichar_t str_119a[] = { 0x1175, 0x1169, 0 }; static const unichar_t str_119b[] = { 0x1175, 0x116e, 0 }; static const unichar_t str_119c[] = { 0x1175, 0x1173, 0 }; static const unichar_t str_119d[] = { 0x1175, 0x119e, 0 }; static const unichar_t str_119f[] = { 0x119e, 0x1165, 0 }; static const unichar_t str_11a0[] = { 0x119e, 0x116e, 0 }; static const unichar_t str_11a1[] = { 0x119e, 0x1175, 0 }; static const unichar_t str_11a2[] = { 0x119e, 0x119e, 0 }; static const unichar_t str_11a8[] = { 0x1100, 0 }; static const unichar_t str_11a9[] = { 0x11a8, 0x11a8, 0 }; static const unichar_t str_11aa[] = { 0x11a8, 0x11ba, 0 }; static const unichar_t str_11ab[] = { 0x1102, 0 }; static const unichar_t str_11ac[] = { 0x11ab, 0x11bd, 0 }; static const unichar_t str_11ad[] = { 0x11ab, 0x11c2, 0 }; static const unichar_t str_11ae[] = { 0x1103, 0 }; static const unichar_t str_11af[] = { 0x1105, 0 }; static const unichar_t str_11b0[] = { 0x11af, 0x11a8, 0 }; static const unichar_t str_11b1[] = { 0x11af, 0x11b7, 0 }; static const unichar_t str_11b2[] = { 0x11af, 0x11b8, 0 }; static const unichar_t str_11b3[] = { 0x11af, 0x11ba, 0 }; static const unichar_t str_11b4[] = { 0x11af, 0x11c0, 0 }; static const unichar_t str_11b5[] = { 0x11af, 0x11c1, 0 }; static const unichar_t str_11b6[] = { 0x11af, 0x11c2, 0 }; static const unichar_t str_11b7[] = { 0x1106, 0 }; static const unichar_t str_11b8[] = { 0x1107, 0 }; static const unichar_t str_11b9[] = { 0x11b8, 0x11ba, 0 }; static const unichar_t str_11ba[] = { 0x1109, 0 }; static const unichar_t str_11bb[] = { 0x11ba, 0x11ba, 0 }; static const unichar_t str_11bc[] = { 0x110b, 0 }; static const unichar_t str_11bd[] = { 0x110c, 0 }; static const unichar_t str_11be[] = { 0x110e, 0 }; static const unichar_t str_11bf[] = { 0x110f, 0 }; static const unichar_t str_11c0[] = { 0x1110, 0 }; static const unichar_t str_11c1[] = { 0x1111, 0 }; static const unichar_t str_11c2[] = { 0x1112, 0 }; static const unichar_t str_11c3[] = { 0x11a8, 0x11af, 0 }; static const unichar_t str_11c4[] = { 0x11a8, 0x11ba, 0x11a8, 0 }; static const unichar_t str_11c5[] = { 0x11ab, 0x11a8, 0 }; static const unichar_t str_11c6[] = { 0x11ab, 0x11ae, 0 }; static const unichar_t str_11c7[] = { 0x11ab, 0x11ba, 0 }; static const unichar_t str_11c8[] = { 0x11ab, 0x11eb, 0 }; static const unichar_t str_11c9[] = { 0x11ab, 0x11c0, 0 }; static const unichar_t str_11ca[] = { 0x11ae, 0x11a8, 0 }; static const unichar_t str_11cb[] = { 0x11ae, 0x11af, 0 }; static const unichar_t str_11cc[] = { 0x11af, 0x11a8, 0x11ba, 0 }; static const unichar_t str_11cd[] = { 0x11af, 0x11ab, 0 }; static const unichar_t str_11ce[] = { 0x11af, 0x11ae, 0 }; static const unichar_t str_11cf[] = { 0x11af, 0x11ae, 0x11c2, 0 }; static const unichar_t str_11d0[] = { 0x11af, 0x11af, 0 }; static const unichar_t str_11d1[] = { 0x11af, 0x11b7, 0x11a8, 0 }; static const unichar_t str_11d2[] = { 0x11af, 0x11b7, 0x11ba, 0 }; static const unichar_t str_11d3[] = { 0x11af, 0x11b8, 0x11ba, 0 }; static const unichar_t str_11d4[] = { 0x11af, 0x11b8, 0x11c2, 0 }; static const unichar_t str_11d5[] = { 0x11af, 0x11e6, 0 }; static const unichar_t str_11d6[] = { 0x11af, 0x11ba, 0x11ba, 0 }; static const unichar_t str_11d7[] = { 0x11af, 0x11eb, 0 }; static const unichar_t str_11d8[] = { 0x11af, 0x11bf, 0 }; static const unichar_t str_11d9[] = { 0x11af, 0x11f9, 0 }; static const unichar_t str_11da[] = { 0x11b7, 0x11a8, 0 }; static const unichar_t str_11db[] = { 0x11b7, 0x11af, 0 }; static const unichar_t str_11dc[] = { 0x11b7, 0x11b8, 0 }; static const unichar_t str_11dd[] = { 0x11b7, 0x11ba, 0 }; static const unichar_t str_11de[] = { 0x11b7, 0x11ba, 0x11ba, 0 }; static const unichar_t str_11df[] = { 0x11b7, 0x11eb, 0 }; static const unichar_t str_11e0[] = { 0x11b7, 0x11be, 0 }; static const unichar_t str_11e1[] = { 0x11b7, 0x11c2, 0 }; static const unichar_t str_11e2[] = { 0x11b7, 0x11bc, 0 }; static const unichar_t str_11e3[] = { 0x11b8, 0x11af, 0 }; static const unichar_t str_11e4[] = { 0x11b8, 0x11c1, 0 }; static const unichar_t str_11e5[] = { 0x11b8, 0x11c2, 0 }; static const unichar_t str_11e6[] = { 0x11b8, 0x11bc, 0 }; static const unichar_t str_11e7[] = { 0x11ba, 0x11a8, 0 }; static const unichar_t str_11e8[] = { 0x11ba, 0x11ae, 0 }; static const unichar_t str_11e9[] = { 0x11ba, 0x11af, 0 }; static const unichar_t str_11ea[] = { 0x11ba, 0x11b8, 0 }; static const unichar_t str_11eb[] = { 0x1140, 0 }; static const unichar_t str_11ec[] = { 0x11bc, 0x11a8, 0 }; static const unichar_t str_11ed[] = { 0x11bc, 0x11a8, 0x11a8, 0 }; static const unichar_t str_11ee[] = { 0x11bc, 0x11bc, 0 }; static const unichar_t str_11ef[] = { 0x11bc, 0x11bf, 0 }; static const unichar_t str_11f0[] = { 0x114c, 0 }; static const unichar_t str_11f1[] = { 0x11f0, 0x11ba, 0 }; static const unichar_t str_11f2[] = { 0x11f0, 0x11eb, 0 }; static const unichar_t str_11f3[] = { 0x11c1, 0x11b8, 0 }; static const unichar_t str_11f4[] = { 0x11c1, 0x11bc, 0 }; static const unichar_t str_11f5[] = { 0x11c2, 0x11ab, 0 }; static const unichar_t str_11f6[] = { 0x11c2, 0x11af, 0 }; static const unichar_t str_11f7[] = { 0x11c2, 0x11b7, 0 }; static const unichar_t str_11f8[] = { 0x11c2, 0x11b8, 0 }; static const unichar_t str_11f9[] = { 0x1159, 0 }; static const unichar_t str_13a0[] = { 0x0044, 0 }; static const unichar_t str_13a1[] = { 0x0052, 0 }; static const unichar_t str_13a2[] = { 0x0054, 0 }; static const unichar_t str_13a9[] = { 0x0423, 0 }; static const unichar_t str_13aa[] = { 0x0041, 0 }; static const unichar_t str_13ab[] = { 0x004a, 0 }; static const unichar_t str_13ac[] = { 0x0045, 0 }; static const unichar_t str_13b1[] = { 0x0393, 0 }; static const unichar_t str_13b3[] = { 0x0057, 0 }; static const unichar_t str_13b7[] = { 0x004d, 0 }; static const unichar_t str_13bb[] = { 0x0048, 0 }; static const unichar_t str_13be[] = { 0x0398, 0 }; static const unichar_t str_13c0[] = { 0x0047, 0 }; static const unichar_t str_13c2[] = { 0x0068, 0 }; static const unichar_t str_13c3[] = { 0x005a, 0 }; static const unichar_t str_13cf[] = { 0x042c, 0 }; static const unichar_t str_13d9[] = { 0x0056, 0 }; static const unichar_t str_13da[] = { 0x0053, 0 }; static const unichar_t str_13de[] = { 0x004c, 0 }; static const unichar_t str_13df[] = { 0x0043, 0 }; static const unichar_t str_13e2[] = { 0x0050, 0 }; static const unichar_t str_13e6[] = { 0x004b, 0 }; static const unichar_t str_13f4[] = { 0x0042, 0 }; static const unichar_t str_1b06[] = { 0x1b05, 0x1b35, 0 }; static const unichar_t str_1b08[] = { 0x1b07, 0x1b35, 0 }; static const unichar_t str_1b0a[] = { 0x1b09, 0x1b35, 0 }; static const unichar_t str_1b0c[] = { 0x1b0b, 0x1b35, 0 }; static const unichar_t str_1b0e[] = { 0x1b0d, 0x1b35, 0 }; static const unichar_t str_1b12[] = { 0x1b11, 0x1b35, 0 }; static const unichar_t str_1b3b[] = { 0x1b3a, 0x1b35, 0 }; static const unichar_t str_1b3d[] = { 0x1b3c, 0x1b35, 0 }; static const unichar_t str_1b40[] = { 0x1b3e, 0x1b35, 0 }; static const unichar_t str_1b41[] = { 0x1b3f, 0x1b35, 0 }; static const unichar_t str_1b43[] = { 0x1b42, 0x1b35, 0 }; static const unichar_t str_1d2c[] = { 0x0041, 0 }; static const unichar_t str_1d2d[] = { 0x00c6, 0 }; static const unichar_t str_1d2e[] = { 0x0042, 0 }; static const unichar_t str_1d30[] = { 0x0044, 0 }; static const unichar_t str_1d31[] = { 0x0045, 0 }; static const unichar_t str_1d32[] = { 0x018e, 0 }; static const unichar_t str_1d33[] = { 0x0047, 0 }; static const unichar_t str_1d34[] = { 0x0048, 0 }; static const unichar_t str_1d35[] = { 0x0049, 0 }; static const unichar_t str_1d36[] = { 0x004a, 0 }; static const unichar_t str_1d37[] = { 0x004b, 0 }; static const unichar_t str_1d38[] = { 0x004c, 0 }; static const unichar_t str_1d39[] = { 0x004d, 0 }; static const unichar_t str_1d3a[] = { 0x004e, 0 }; static const unichar_t str_1d3c[] = { 0x004f, 0 }; static const unichar_t str_1d3d[] = { 0x0222, 0 }; static const unichar_t str_1d3e[] = { 0x0050, 0 }; static const unichar_t str_1d3f[] = { 0x0052, 0 }; static const unichar_t str_1d40[] = { 0x0054, 0 }; static const unichar_t str_1d41[] = { 0x0055, 0 }; static const unichar_t str_1d42[] = { 0x0057, 0 }; static const unichar_t str_1d43[] = { 0x0061, 0 }; static const unichar_t str_1d44[] = { 0x0250, 0 }; static const unichar_t str_1d45[] = { 0x0251, 0 }; static const unichar_t str_1d46[] = { 0x1d02, 0 }; static const unichar_t str_1d47[] = { 0x0062, 0 }; static const unichar_t str_1d48[] = { 0x0064, 0 }; static const unichar_t str_1d49[] = { 0x0065, 0 }; static const unichar_t str_1d4a[] = { 0x0259, 0 }; static const unichar_t str_1d4b[] = { 0x025b, 0 }; static const unichar_t str_1d4c[] = { 0x025c, 0 }; static const unichar_t str_1d4d[] = { 0x0067, 0 }; static const unichar_t str_1d4f[] = { 0x006b, 0 }; static const unichar_t str_1d50[] = { 0x006d, 0 }; static const unichar_t str_1d51[] = { 0x014b, 0 }; static const unichar_t str_1d52[] = { 0x006f, 0 }; static const unichar_t str_1d53[] = { 0x0254, 0 }; static const unichar_t str_1d54[] = { 0x1d16, 0 }; static const unichar_t str_1d55[] = { 0x1d17, 0 }; static const unichar_t str_1d56[] = { 0x0070, 0 }; static const unichar_t str_1d57[] = { 0x0074, 0 }; static const unichar_t str_1d58[] = { 0x0075, 0 }; static const unichar_t str_1d59[] = { 0x1d1d, 0 }; static const unichar_t str_1d5a[] = { 0x026f, 0 }; static const unichar_t str_1d5b[] = { 0x0076, 0 }; static const unichar_t str_1d5c[] = { 0x1d25, 0 }; static const unichar_t str_1d5d[] = { 0x03b2, 0 }; static const unichar_t str_1d5e[] = { 0x03b3, 0 }; static const unichar_t str_1d5f[] = { 0x03b4, 0 }; static const unichar_t str_1d60[] = { 0x03c6, 0 }; static const unichar_t str_1d61[] = { 0x03c7, 0 }; static const unichar_t str_1d62[] = { 0x0069, 0 }; static const unichar_t str_1d63[] = { 0x0072, 0 }; static const unichar_t str_1d64[] = { 0x0075, 0 }; static const unichar_t str_1d65[] = { 0x0076, 0 }; static const unichar_t str_1d66[] = { 0x03b2, 0 }; static const unichar_t str_1d67[] = { 0x03b3, 0 }; static const unichar_t str_1d68[] = { 0x03c1, 0 }; static const unichar_t str_1d69[] = { 0x03c6, 0 }; static const unichar_t str_1d6a[] = { 0x03c7, 0 }; static const unichar_t str_1d78[] = { 0x043d, 0 }; static const unichar_t str_1d9b[] = { 0x0252, 0 }; static const unichar_t str_1d9c[] = { 0x0063, 0 }; static const unichar_t str_1d9d[] = { 0x0255, 0 }; static const unichar_t str_1d9e[] = { 0x00f0, 0 }; static const unichar_t str_1d9f[] = { 0x025c, 0 }; static const unichar_t str_1da0[] = { 0x0066, 0 }; static const unichar_t str_1da1[] = { 0x025f, 0 }; static const unichar_t str_1da2[] = { 0x0261, 0 }; static const unichar_t str_1da3[] = { 0x0265, 0 }; static const unichar_t str_1da4[] = { 0x0268, 0 }; static const unichar_t str_1da5[] = { 0x0269, 0 }; static const unichar_t str_1da6[] = { 0x026a, 0 }; static const unichar_t str_1da7[] = { 0x1d7b, 0 }; static const unichar_t str_1da8[] = { 0x029d, 0 }; static const unichar_t str_1da9[] = { 0x026d, 0 }; static const unichar_t str_1daa[] = { 0x1d85, 0 }; static const unichar_t str_1dab[] = { 0x029f, 0 }; static const unichar_t str_1dac[] = { 0x0271, 0 }; static const unichar_t str_1dad[] = { 0x0270, 0 }; static const unichar_t str_1dae[] = { 0x0272, 0 }; static const unichar_t str_1daf[] = { 0x0273, 0 }; static const unichar_t str_1db0[] = { 0x0274, 0 }; static const unichar_t str_1db1[] = { 0x0275, 0 }; static const unichar_t str_1db2[] = { 0x0278, 0 }; static const unichar_t str_1db3[] = { 0x0282, 0 }; static const unichar_t str_1db4[] = { 0x0283, 0 }; static const unichar_t str_1db5[] = { 0x01ab, 0 }; static const unichar_t str_1db6[] = { 0x0289, 0 }; static const unichar_t str_1db7[] = { 0x028a, 0 }; static const unichar_t str_1db8[] = { 0x1d1c, 0 }; static const unichar_t str_1db9[] = { 0x028b, 0 }; static const unichar_t str_1dba[] = { 0x028c, 0 }; static const unichar_t str_1dbb[] = { 0x007a, 0 }; static const unichar_t str_1dbc[] = { 0x0290, 0 }; static const unichar_t str_1dbd[] = { 0x0291, 0 }; static const unichar_t str_1dbe[] = { 0x0292, 0 }; static const unichar_t str_1dbf[] = { 0x03b8, 0 }; static const unichar_t str_1e00[] = { 0x0041, 0x0325, 0 }; static const unichar_t str_1e01[] = { 0x0061, 0x0325, 0 }; static const unichar_t str_1e02[] = { 0x0042, 0x0307, 0 }; static const unichar_t str_1e03[] = { 0x0062, 0x0307, 0 }; static const unichar_t str_1e04[] = { 0x0042, 0x0323, 0 }; static const unichar_t str_1e05[] = { 0x0062, 0x0323, 0 }; static const unichar_t str_1e06[] = { 0x0042, 0x0331, 0 }; static const unichar_t str_1e07[] = { 0x0062, 0x0331, 0 }; static const unichar_t str_1e08[] = { 0x00c7, 0x0301, 0 }; static const unichar_t str_1e09[] = { 0x00e7, 0x0301, 0 }; static const unichar_t str_1e0a[] = { 0x0044, 0x0307, 0 }; static const unichar_t str_1e0b[] = { 0x0064, 0x0307, 0 }; static const unichar_t str_1e0c[] = { 0x0044, 0x0323, 0 }; static const unichar_t str_1e0d[] = { 0x0064, 0x0323, 0 }; static const unichar_t str_1e0e[] = { 0x0044, 0x0331, 0 }; static const unichar_t str_1e0f[] = { 0x0064, 0x0331, 0 }; static const unichar_t str_1e10[] = { 0x0044, 0x0327, 0 }; static const unichar_t str_1e11[] = { 0x0064, 0x0327, 0 }; static const unichar_t str_1e12[] = { 0x0044, 0x032d, 0 }; static const unichar_t str_1e13[] = { 0x0064, 0x032d, 0 }; static const unichar_t str_1e14[] = { 0x0112, 0x0300, 0 }; static const unichar_t str_1e15[] = { 0x0113, 0x0300, 0 }; static const unichar_t str_1e16[] = { 0x0112, 0x0301, 0 }; static const unichar_t str_1e17[] = { 0x0113, 0x0301, 0 }; static const unichar_t str_1e18[] = { 0x0045, 0x032d, 0 }; static const unichar_t str_1e19[] = { 0x0065, 0x032d, 0 }; static const unichar_t str_1e1a[] = { 0x0045, 0x0330, 0 }; static const unichar_t str_1e1b[] = { 0x0065, 0x0330, 0 }; static const unichar_t str_1e1c[] = { 0x0228, 0x0306, 0 }; static const unichar_t str_1e1d[] = { 0x0229, 0x0306, 0 }; static const unichar_t str_1e1e[] = { 0x0046, 0x0307, 0 }; static const unichar_t str_1e1f[] = { 0x0066, 0x0307, 0 }; static const unichar_t str_1e20[] = { 0x0047, 0x0304, 0 }; static const unichar_t str_1e21[] = { 0x0067, 0x0304, 0 }; static const unichar_t str_1e22[] = { 0x0048, 0x0307, 0 }; static const unichar_t str_1e23[] = { 0x0068, 0x0307, 0 }; static const unichar_t str_1e24[] = { 0x0048, 0x0323, 0 }; static const unichar_t str_1e25[] = { 0x0068, 0x0323, 0 }; static const unichar_t str_1e26[] = { 0x0048, 0x0308, 0 }; static const unichar_t str_1e27[] = { 0x0068, 0x0308, 0 }; static const unichar_t str_1e28[] = { 0x0048, 0x0327, 0 }; static const unichar_t str_1e29[] = { 0x0068, 0x0327, 0 }; static const unichar_t str_1e2a[] = { 0x0048, 0x032e, 0 }; static const unichar_t str_1e2b[] = { 0x0068, 0x032e, 0 }; static const unichar_t str_1e2c[] = { 0x0049, 0x0330, 0 }; static const unichar_t str_1e2d[] = { 0x0069, 0x0330, 0 }; static const unichar_t str_1e2e[] = { 0x00cf, 0x0301, 0 }; static const unichar_t str_1e2f[] = { 0x00ef, 0x0301, 0 }; static const unichar_t str_1e30[] = { 0x004b, 0x0301, 0 }; static const unichar_t str_1e31[] = { 0x006b, 0x0301, 0 }; static const unichar_t str_1e32[] = { 0x004b, 0x0323, 0 }; static const unichar_t str_1e33[] = { 0x006b, 0x0323, 0 }; static const unichar_t str_1e34[] = { 0x004b, 0x0331, 0 }; static const unichar_t str_1e35[] = { 0x006b, 0x0331, 0 }; static const unichar_t str_1e36[] = { 0x004c, 0x0323, 0 }; static const unichar_t str_1e37[] = { 0x006c, 0x0323, 0 }; static const unichar_t str_1e38[] = { 0x1e36, 0x0304, 0 }; static const unichar_t str_1e39[] = { 0x1e37, 0x0304, 0 }; static const unichar_t str_1e3a[] = { 0x004c, 0x0331, 0 }; static const unichar_t str_1e3b[] = { 0x006c, 0x0331, 0 }; static const unichar_t str_1e3c[] = { 0x004c, 0x032d, 0 }; static const unichar_t str_1e3d[] = { 0x006c, 0x032d, 0 }; static const unichar_t str_1e3e[] = { 0x004d, 0x0301, 0 }; static const unichar_t str_1e3f[] = { 0x006d, 0x0301, 0 }; static const unichar_t str_1e40[] = { 0x004d, 0x0307, 0 }; static const unichar_t str_1e41[] = { 0x006d, 0x0307, 0 }; static const unichar_t str_1e42[] = { 0x004d, 0x0323, 0 }; static const unichar_t str_1e43[] = { 0x006d, 0x0323, 0 }; static const unichar_t str_1e44[] = { 0x004e, 0x0307, 0 }; static const unichar_t str_1e45[] = { 0x006e, 0x0307, 0 }; static const unichar_t str_1e46[] = { 0x004e, 0x0323, 0 }; static const unichar_t str_1e47[] = { 0x006e, 0x0323, 0 }; static const unichar_t str_1e48[] = { 0x004e, 0x0331, 0 }; static const unichar_t str_1e49[] = { 0x006e, 0x0331, 0 }; static const unichar_t str_1e4a[] = { 0x004e, 0x032d, 0 }; static const unichar_t str_1e4b[] = { 0x006e, 0x032d, 0 }; static const unichar_t str_1e4c[] = { 0x00d5, 0x0301, 0 }; static const unichar_t str_1e4d[] = { 0x00f5, 0x0301, 0 }; static const unichar_t str_1e4e[] = { 0x00d5, 0x0308, 0 }; static const unichar_t str_1e4f[] = { 0x00f5, 0x0308, 0 }; static const unichar_t str_1e50[] = { 0x014c, 0x0300, 0 }; static const unichar_t str_1e51[] = { 0x014d, 0x0300, 0 }; static const unichar_t str_1e52[] = { 0x014c, 0x0301, 0 }; static const unichar_t str_1e53[] = { 0x014d, 0x0301, 0 }; static const unichar_t str_1e54[] = { 0x0050, 0x0301, 0 }; static const unichar_t str_1e55[] = { 0x0070, 0x0301, 0 }; static const unichar_t str_1e56[] = { 0x0050, 0x0307, 0 }; static const unichar_t str_1e57[] = { 0x0070, 0x0307, 0 }; static const unichar_t str_1e58[] = { 0x0052, 0x0307, 0 }; static const unichar_t str_1e59[] = { 0x0072, 0x0307, 0 }; static const unichar_t str_1e5a[] = { 0x0052, 0x0323, 0 }; static const unichar_t str_1e5b[] = { 0x0072, 0x0323, 0 }; static const unichar_t str_1e5c[] = { 0x1e5a, 0x0304, 0 }; static const unichar_t str_1e5d[] = { 0x1e5b, 0x0304, 0 }; static const unichar_t str_1e5e[] = { 0x0052, 0x0331, 0 }; static const unichar_t str_1e5f[] = { 0x0072, 0x0331, 0 }; static const unichar_t str_1e60[] = { 0x0053, 0x0307, 0 }; static const unichar_t str_1e61[] = { 0x0073, 0x0307, 0 }; static const unichar_t str_1e62[] = { 0x0053, 0x0323, 0 }; static const unichar_t str_1e63[] = { 0x0073, 0x0323, 0 }; static const unichar_t str_1e64[] = { 0x015a, 0x0307, 0 }; static const unichar_t str_1e65[] = { 0x015b, 0x0307, 0 }; static const unichar_t str_1e66[] = { 0x0160, 0x0307, 0 }; static const unichar_t str_1e67[] = { 0x0161, 0x0307, 0 }; static const unichar_t str_1e68[] = { 0x1e62, 0x0307, 0 }; static const unichar_t str_1e69[] = { 0x1e63, 0x0307, 0 }; static const unichar_t str_1e6a[] = { 0x0054, 0x0307, 0 }; static const unichar_t str_1e6b[] = { 0x0074, 0x0307, 0 }; static const unichar_t str_1e6c[] = { 0x0054, 0x0323, 0 }; static const unichar_t str_1e6d[] = { 0x0074, 0x0323, 0 }; static const unichar_t str_1e6e[] = { 0x0054, 0x0331, 0 }; static const unichar_t str_1e6f[] = { 0x0074, 0x0331, 0 }; static const unichar_t str_1e70[] = { 0x0054, 0x032d, 0 }; static const unichar_t str_1e71[] = { 0x0074, 0x032d, 0 }; static const unichar_t str_1e72[] = { 0x0055, 0x0324, 0 }; static const unichar_t str_1e73[] = { 0x0075, 0x0324, 0 }; static const unichar_t str_1e74[] = { 0x0055, 0x0330, 0 }; static const unichar_t str_1e75[] = { 0x0075, 0x0330, 0 }; static const unichar_t str_1e76[] = { 0x0055, 0x032d, 0 }; static const unichar_t str_1e77[] = { 0x0075, 0x032d, 0 }; static const unichar_t str_1e78[] = { 0x0168, 0x0301, 0 }; static const unichar_t str_1e79[] = { 0x0169, 0x0301, 0 }; static const unichar_t str_1e7a[] = { 0x016a, 0x0308, 0 }; static const unichar_t str_1e7b[] = { 0x016b, 0x0308, 0 }; static const unichar_t str_1e7c[] = { 0x0056, 0x0303, 0 }; static const unichar_t str_1e7d[] = { 0x0076, 0x0303, 0 }; static const unichar_t str_1e7e[] = { 0x0056, 0x0323, 0 }; static const unichar_t str_1e7f[] = { 0x0076, 0x0323, 0 }; static const unichar_t str_1e80[] = { 0x0057, 0x0300, 0 }; static const unichar_t str_1e81[] = { 0x0077, 0x0300, 0 }; static const unichar_t str_1e82[] = { 0x0057, 0x0301, 0 }; static const unichar_t str_1e83[] = { 0x0077, 0x0301, 0 }; static const unichar_t str_1e84[] = { 0x0057, 0x0308, 0 }; static const unichar_t str_1e85[] = { 0x0077, 0x0308, 0 }; static const unichar_t str_1e86[] = { 0x0057, 0x0307, 0 }; static const unichar_t str_1e87[] = { 0x0077, 0x0307, 0 }; static const unichar_t str_1e88[] = { 0x0057, 0x0323, 0 }; static const unichar_t str_1e89[] = { 0x0077, 0x0323, 0 }; static const unichar_t str_1e8a[] = { 0x0058, 0x0307, 0 }; static const unichar_t str_1e8b[] = { 0x0078, 0x0307, 0 }; static const unichar_t str_1e8c[] = { 0x0058, 0x0308, 0 }; static const unichar_t str_1e8d[] = { 0x0078, 0x0308, 0 }; static const unichar_t str_1e8e[] = { 0x0059, 0x0307, 0 }; static const unichar_t str_1e8f[] = { 0x0079, 0x0307, 0 }; static const unichar_t str_1e90[] = { 0x005a, 0x0302, 0 }; static const unichar_t str_1e91[] = { 0x007a, 0x0302, 0 }; static const unichar_t str_1e92[] = { 0x005a, 0x0323, 0 }; static const unichar_t str_1e93[] = { 0x007a, 0x0323, 0 }; static const unichar_t str_1e94[] = { 0x005a, 0x0331, 0 }; static const unichar_t str_1e95[] = { 0x007a, 0x0331, 0 }; static const unichar_t str_1e96[] = { 0x0068, 0x0331, 0 }; static const unichar_t str_1e97[] = { 0x0074, 0x0308, 0 }; static const unichar_t str_1e98[] = { 0x0077, 0x030a, 0 }; static const unichar_t str_1e99[] = { 0x0079, 0x030a, 0 }; static const unichar_t str_1e9a[] = { 0x0061, 0x02be, 0 }; static const unichar_t str_1e9b[] = { 0x017f, 0x0307, 0 }; static const unichar_t str_1ea0[] = { 0x0041, 0x0323, 0 }; static const unichar_t str_1ea1[] = { 0x0061, 0x0323, 0 }; static const unichar_t str_1ea2[] = { 0x0041, 0x0309, 0 }; static const unichar_t str_1ea3[] = { 0x0061, 0x0309, 0 }; static const unichar_t str_1ea4[] = { 0x00c2, 0x0301, 0 }; static const unichar_t str_1ea5[] = { 0x00e2, 0x0301, 0 }; static const unichar_t str_1ea6[] = { 0x00c2, 0x0300, 0 }; static const unichar_t str_1ea7[] = { 0x00e2, 0x0300, 0 }; static const unichar_t str_1ea8[] = { 0x00c2, 0x0309, 0 }; static const unichar_t str_1ea9[] = { 0x00e2, 0x0309, 0 }; static const unichar_t str_1eaa[] = { 0x00c2, 0x0303, 0 }; static const unichar_t str_1eab[] = { 0x00e2, 0x0303, 0 }; static const unichar_t str_1eac[] = { 0x1ea0, 0x0302, 0 }; static const unichar_t str_1ead[] = { 0x1ea1, 0x0302, 0 }; static const unichar_t str_1eae[] = { 0x0102, 0x0301, 0 }; static const unichar_t str_1eaf[] = { 0x0103, 0x0301, 0 }; static const unichar_t str_1eb0[] = { 0x0102, 0x0300, 0 }; static const unichar_t str_1eb1[] = { 0x0103, 0x0300, 0 }; static const unichar_t str_1eb2[] = { 0x0102, 0x0309, 0 }; static const unichar_t str_1eb3[] = { 0x0103, 0x0309, 0 }; static const unichar_t str_1eb4[] = { 0x0102, 0x0303, 0 }; static const unichar_t str_1eb5[] = { 0x0103, 0x0303, 0 }; static const unichar_t str_1eb6[] = { 0x1ea0, 0x0306, 0 }; static const unichar_t str_1eb7[] = { 0x1ea1, 0x0306, 0 }; static const unichar_t str_1eb8[] = { 0x0045, 0x0323, 0 }; static const unichar_t str_1eb9[] = { 0x0065, 0x0323, 0 }; static const unichar_t str_1eba[] = { 0x0045, 0x0309, 0 }; static const unichar_t str_1ebb[] = { 0x0065, 0x0309, 0 }; static const unichar_t str_1ebc[] = { 0x0045, 0x0303, 0 }; static const unichar_t str_1ebd[] = { 0x0065, 0x0303, 0 }; static const unichar_t str_1ebe[] = { 0x00ca, 0x0301, 0 }; static const unichar_t str_1ebf[] = { 0x00ea, 0x0301, 0 }; static const unichar_t str_1ec0[] = { 0x00ca, 0x0300, 0 }; static const unichar_t str_1ec1[] = { 0x00ea, 0x0300, 0 }; static const unichar_t str_1ec2[] = { 0x00ca, 0x0309, 0 }; static const unichar_t str_1ec3[] = { 0x00ea, 0x0309, 0 }; static const unichar_t str_1ec4[] = { 0x00ca, 0x0303, 0 }; static const unichar_t str_1ec5[] = { 0x00ea, 0x0303, 0 }; static const unichar_t str_1ec6[] = { 0x1eb8, 0x0302, 0 }; static const unichar_t str_1ec7[] = { 0x1eb9, 0x0302, 0 }; static const unichar_t str_1ec8[] = { 0x0049, 0x0309, 0 }; static const unichar_t str_1ec9[] = { 0x0069, 0x0309, 0 }; static const unichar_t str_1eca[] = { 0x0049, 0x0323, 0 }; static const unichar_t str_1ecb[] = { 0x0069, 0x0323, 0 }; static const unichar_t str_1ecc[] = { 0x004f, 0x0323, 0 }; static const unichar_t str_1ecd[] = { 0x006f, 0x0323, 0 }; static const unichar_t str_1ece[] = { 0x004f, 0x0309, 0 }; static const unichar_t str_1ecf[] = { 0x006f, 0x0309, 0 }; static const unichar_t str_1ed0[] = { 0x00d4, 0x0301, 0 }; static const unichar_t str_1ed1[] = { 0x00f4, 0x0301, 0 }; static const unichar_t str_1ed2[] = { 0x00d4, 0x0300, 0 }; static const unichar_t str_1ed3[] = { 0x00f4, 0x0300, 0 }; static const unichar_t str_1ed4[] = { 0x00d4, 0x0309, 0 }; static const unichar_t str_1ed5[] = { 0x00f4, 0x0309, 0 }; static const unichar_t str_1ed6[] = { 0x00d4, 0x0303, 0 }; static const unichar_t str_1ed7[] = { 0x00f4, 0x0303, 0 }; static const unichar_t str_1ed8[] = { 0x1ecc, 0x0302, 0 }; static const unichar_t str_1ed9[] = { 0x1ecd, 0x0302, 0 }; static const unichar_t str_1eda[] = { 0x01a0, 0x0301, 0 }; static const unichar_t str_1edb[] = { 0x01a1, 0x0301, 0 }; static const unichar_t str_1edc[] = { 0x01a0, 0x0300, 0 }; static const unichar_t str_1edd[] = { 0x01a1, 0x0300, 0 }; static const unichar_t str_1ede[] = { 0x01a0, 0x0309, 0 }; static const unichar_t str_1edf[] = { 0x01a1, 0x0309, 0 }; static const unichar_t str_1ee0[] = { 0x01a0, 0x0303, 0 }; static const unichar_t str_1ee1[] = { 0x01a1, 0x0303, 0 }; static const unichar_t str_1ee2[] = { 0x01a0, 0x0323, 0 }; static const unichar_t str_1ee3[] = { 0x01a1, 0x0323, 0 }; static const unichar_t str_1ee4[] = { 0x0055, 0x0323, 0 }; static const unichar_t str_1ee5[] = { 0x0075, 0x0323, 0 }; static const unichar_t str_1ee6[] = { 0x0055, 0x0309, 0 }; static const unichar_t str_1ee7[] = { 0x0075, 0x0309, 0 }; static const unichar_t str_1ee8[] = { 0x01af, 0x0301, 0 }; static const unichar_t str_1ee9[] = { 0x01b0, 0x0301, 0 }; static const unichar_t str_1eea[] = { 0x01af, 0x0300, 0 }; static const unichar_t str_1eeb[] = { 0x01b0, 0x0300, 0 }; static const unichar_t str_1eec[] = { 0x01af, 0x0309, 0 }; static const unichar_t str_1eed[] = { 0x01b0, 0x0309, 0 }; static const unichar_t str_1eee[] = { 0x01af, 0x0303, 0 }; static const unichar_t str_1eef[] = { 0x01b0, 0x0303, 0 }; static const unichar_t str_1ef0[] = { 0x01af, 0x0323, 0 }; static const unichar_t str_1ef1[] = { 0x01b0, 0x0323, 0 }; static const unichar_t str_1ef2[] = { 0x0059, 0x0300, 0 }; static const unichar_t str_1ef3[] = { 0x0079, 0x0300, 0 }; static const unichar_t str_1ef4[] = { 0x0059, 0x0323, 0 }; static const unichar_t str_1ef5[] = { 0x0079, 0x0323, 0 }; static const unichar_t str_1ef6[] = { 0x0059, 0x0309, 0 }; static const unichar_t str_1ef7[] = { 0x0079, 0x0309, 0 }; static const unichar_t str_1ef8[] = { 0x0059, 0x0303, 0 }; static const unichar_t str_1ef9[] = { 0x0079, 0x0303, 0 }; static const unichar_t str_1f00[] = { 0x03b1, 0x0313, 0 }; static const unichar_t str_1f01[] = { 0x03b1, 0x0314, 0 }; static const unichar_t str_1f02[] = { 0x1f00, 0x0300, 0 }; static const unichar_t str_1f03[] = { 0x1f01, 0x0300, 0 }; static const unichar_t str_1f04[] = { 0x1f00, 0x0301, 0 }; static const unichar_t str_1f05[] = { 0x1f01, 0x0301, 0 }; static const unichar_t str_1f06[] = { 0x1f00, 0x0342, 0 }; static const unichar_t str_1f07[] = { 0x1f01, 0x0342, 0 }; static const unichar_t str_1f08[] = { 0x0391, 0x0313, 0 }; static const unichar_t str_1f09[] = { 0x0391, 0x0314, 0 }; static const unichar_t str_1f0a[] = { 0x1f08, 0x0300, 0 }; static const unichar_t str_1f0b[] = { 0x1f09, 0x0300, 0 }; static const unichar_t str_1f0c[] = { 0x1f08, 0x0301, 0 }; static const unichar_t str_1f0d[] = { 0x1f09, 0x0301, 0 }; static const unichar_t str_1f0e[] = { 0x1f08, 0x0342, 0 }; static const unichar_t str_1f0f[] = { 0x1f09, 0x0342, 0 }; static const unichar_t str_1f10[] = { 0x03b5, 0x0313, 0 }; static const unichar_t str_1f11[] = { 0x03b5, 0x0314, 0 }; static const unichar_t str_1f12[] = { 0x1f10, 0x0300, 0 }; static const unichar_t str_1f13[] = { 0x1f11, 0x0300, 0 }; static const unichar_t str_1f14[] = { 0x1f10, 0x0301, 0 }; static const unichar_t str_1f15[] = { 0x1f11, 0x0301, 0 }; static const unichar_t str_1f18[] = { 0x0395, 0x0313, 0 }; static const unichar_t str_1f19[] = { 0x0395, 0x0314, 0 }; static const unichar_t str_1f1a[] = { 0x1f18, 0x0300, 0 }; static const unichar_t str_1f1b[] = { 0x1f19, 0x0300, 0 }; static const unichar_t str_1f1c[] = { 0x1f18, 0x0301, 0 }; static const unichar_t str_1f1d[] = { 0x1f19, 0x0301, 0 }; static const unichar_t str_1f20[] = { 0x03b7, 0x0313, 0 }; static const unichar_t str_1f21[] = { 0x03b7, 0x0314, 0 }; static const unichar_t str_1f22[] = { 0x1f20, 0x0300, 0 }; static const unichar_t str_1f23[] = { 0x1f21, 0x0300, 0 }; static const unichar_t str_1f24[] = { 0x1f20, 0x0301, 0 }; static const unichar_t str_1f25[] = { 0x1f21, 0x0301, 0 }; static const unichar_t str_1f26[] = { 0x1f20, 0x0342, 0 }; static const unichar_t str_1f27[] = { 0x1f21, 0x0342, 0 }; static const unichar_t str_1f28[] = { 0x0397, 0x0313, 0 }; static const unichar_t str_1f29[] = { 0x0397, 0x0314, 0 }; static const unichar_t str_1f2a[] = { 0x1f28, 0x0300, 0 }; static const unichar_t str_1f2b[] = { 0x1f29, 0x0300, 0 }; static const unichar_t str_1f2c[] = { 0x1f28, 0x0301, 0 }; static const unichar_t str_1f2d[] = { 0x1f29, 0x0301, 0 }; static const unichar_t str_1f2e[] = { 0x1f28, 0x0342, 0 }; static const unichar_t str_1f2f[] = { 0x1f29, 0x0342, 0 }; static const unichar_t str_1f30[] = { 0x03b9, 0x0313, 0 }; static const unichar_t str_1f31[] = { 0x03b9, 0x0314, 0 }; static const unichar_t str_1f32[] = { 0x1f30, 0x0300, 0 }; static const unichar_t str_1f33[] = { 0x1f31, 0x0300, 0 }; static const unichar_t str_1f34[] = { 0x1f30, 0x0301, 0 }; static const unichar_t str_1f35[] = { 0x1f31, 0x0301, 0 }; static const unichar_t str_1f36[] = { 0x1f30, 0x0342, 0 }; static const unichar_t str_1f37[] = { 0x1f31, 0x0342, 0 }; static const unichar_t str_1f38[] = { 0x0399, 0x0313, 0 }; static const unichar_t str_1f39[] = { 0x0399, 0x0314, 0 }; static const unichar_t str_1f3a[] = { 0x1f38, 0x0300, 0 }; static const unichar_t str_1f3b[] = { 0x1f39, 0x0300, 0 }; static const unichar_t str_1f3c[] = { 0x1f38, 0x0301, 0 }; static const unichar_t str_1f3d[] = { 0x1f39, 0x0301, 0 }; static const unichar_t str_1f3e[] = { 0x1f38, 0x0342, 0 }; static const unichar_t str_1f3f[] = { 0x1f39, 0x0342, 0 }; static const unichar_t str_1f40[] = { 0x03bf, 0x0313, 0 }; static const unichar_t str_1f41[] = { 0x03bf, 0x0314, 0 }; static const unichar_t str_1f42[] = { 0x1f40, 0x0300, 0 }; static const unichar_t str_1f43[] = { 0x1f41, 0x0300, 0 }; static const unichar_t str_1f44[] = { 0x1f40, 0x0301, 0 }; static const unichar_t str_1f45[] = { 0x1f41, 0x0301, 0 }; static const unichar_t str_1f48[] = { 0x039f, 0x0313, 0 }; static const unichar_t str_1f49[] = { 0x039f, 0x0314, 0 }; static const unichar_t str_1f4a[] = { 0x1f48, 0x0300, 0 }; static const unichar_t str_1f4b[] = { 0x1f49, 0x0300, 0 }; static const unichar_t str_1f4c[] = { 0x1f48, 0x0301, 0 }; static const unichar_t str_1f4d[] = { 0x1f49, 0x0301, 0 }; static const unichar_t str_1f50[] = { 0x03c5, 0x0313, 0 }; static const unichar_t str_1f51[] = { 0x03c5, 0x0314, 0 }; static const unichar_t str_1f52[] = { 0x1f50, 0x0300, 0 }; static const unichar_t str_1f53[] = { 0x1f51, 0x0300, 0 }; static const unichar_t str_1f54[] = { 0x1f50, 0x0301, 0 }; static const unichar_t str_1f55[] = { 0x1f51, 0x0301, 0 }; static const unichar_t str_1f56[] = { 0x1f50, 0x0342, 0 }; static const unichar_t str_1f57[] = { 0x1f51, 0x0342, 0 }; static const unichar_t str_1f59[] = { 0x03a5, 0x0314, 0 }; static const unichar_t str_1f5b[] = { 0x1f59, 0x0300, 0 }; static const unichar_t str_1f5d[] = { 0x1f59, 0x0301, 0 }; static const unichar_t str_1f5f[] = { 0x1f59, 0x0342, 0 }; static const unichar_t str_1f60[] = { 0x03c9, 0x0313, 0 }; static const unichar_t str_1f61[] = { 0x03c9, 0x0314, 0 }; static const unichar_t str_1f62[] = { 0x1f60, 0x0300, 0 }; static const unichar_t str_1f63[] = { 0x1f61, 0x0300, 0 }; static const unichar_t str_1f64[] = { 0x1f60, 0x0301, 0 }; static const unichar_t str_1f65[] = { 0x1f61, 0x0301, 0 }; static const unichar_t str_1f66[] = { 0x1f60, 0x0342, 0 }; static const unichar_t str_1f67[] = { 0x1f61, 0x0342, 0 }; static const unichar_t str_1f68[] = { 0x03a9, 0x0313, 0 }; static const unichar_t str_1f69[] = { 0x03a9, 0x0314, 0 }; static const unichar_t str_1f6a[] = { 0x1f68, 0x0300, 0 }; static const unichar_t str_1f6b[] = { 0x1f69, 0x0300, 0 }; static const unichar_t str_1f6c[] = { 0x1f68, 0x0301, 0 }; static const unichar_t str_1f6d[] = { 0x1f69, 0x0301, 0 }; static const unichar_t str_1f6e[] = { 0x1f68, 0x0342, 0 }; static const unichar_t str_1f6f[] = { 0x1f69, 0x0342, 0 }; static const unichar_t str_1f70[] = { 0x03b1, 0x0300, 0 }; static const unichar_t str_1f71[] = { 0x03ac, 0 }; static const unichar_t str_1f72[] = { 0x03b5, 0x0300, 0 }; static const unichar_t str_1f73[] = { 0x03ad, 0 }; static const unichar_t str_1f74[] = { 0x03b7, 0x0300, 0 }; static const unichar_t str_1f75[] = { 0x03ae, 0 }; static const unichar_t str_1f76[] = { 0x03b9, 0x0300, 0 }; static const unichar_t str_1f77[] = { 0x03af, 0 }; static const unichar_t str_1f78[] = { 0x03bf, 0x0300, 0 }; static const unichar_t str_1f79[] = { 0x03cc, 0 }; static const unichar_t str_1f7a[] = { 0x03c5, 0x0300, 0 }; static const unichar_t str_1f7b[] = { 0x03cd, 0 }; static const unichar_t str_1f7c[] = { 0x03c9, 0x0300, 0 }; static const unichar_t str_1f7d[] = { 0x03ce, 0 }; static const unichar_t str_1f80[] = { 0x1f00, 0x0345, 0 }; static const unichar_t str_1f81[] = { 0x1f01, 0x0345, 0 }; static const unichar_t str_1f82[] = { 0x1f02, 0x0345, 0 }; static const unichar_t str_1f83[] = { 0x1f03, 0x0345, 0 }; static const unichar_t str_1f84[] = { 0x1f04, 0x0345, 0 }; static const unichar_t str_1f85[] = { 0x1f05, 0x0345, 0 }; static const unichar_t str_1f86[] = { 0x1f06, 0x0345, 0 }; static const unichar_t str_1f87[] = { 0x1f07, 0x0345, 0 }; static const unichar_t str_1f88[] = { 0x1f08, 0x0345, 0 }; static const unichar_t str_1f89[] = { 0x1f09, 0x0345, 0 }; static const unichar_t str_1f8a[] = { 0x1f0a, 0x0345, 0 }; static const unichar_t str_1f8b[] = { 0x1f0b, 0x0345, 0 }; static const unichar_t str_1f8c[] = { 0x1f0c, 0x0345, 0 }; static const unichar_t str_1f8d[] = { 0x1f0d, 0x0345, 0 }; static const unichar_t str_1f8e[] = { 0x1f0e, 0x0345, 0 }; static const unichar_t str_1f8f[] = { 0x1f0f, 0x0345, 0 }; static const unichar_t str_1f90[] = { 0x1f20, 0x0345, 0 }; static const unichar_t str_1f91[] = { 0x1f21, 0x0345, 0 }; static const unichar_t str_1f92[] = { 0x1f22, 0x0345, 0 }; static const unichar_t str_1f93[] = { 0x1f23, 0x0345, 0 }; static const unichar_t str_1f94[] = { 0x1f24, 0x0345, 0 }; static const unichar_t str_1f95[] = { 0x1f25, 0x0345, 0 }; static const unichar_t str_1f96[] = { 0x1f26, 0x0345, 0 }; static const unichar_t str_1f97[] = { 0x1f27, 0x0345, 0 }; static const unichar_t str_1f98[] = { 0x1f28, 0x0345, 0 }; static const unichar_t str_1f99[] = { 0x1f29, 0x0345, 0 }; static const unichar_t str_1f9a[] = { 0x1f2a, 0x0345, 0 }; static const unichar_t str_1f9b[] = { 0x1f2b, 0x0345, 0 }; static const unichar_t str_1f9c[] = { 0x1f2c, 0x0345, 0 }; static const unichar_t str_1f9d[] = { 0x1f2d, 0x0345, 0 }; static const unichar_t str_1f9e[] = { 0x1f2e, 0x0345, 0 }; static const unichar_t str_1f9f[] = { 0x1f2f, 0x0345, 0 }; static const unichar_t str_1fa0[] = { 0x1f60, 0x0345, 0 }; static const unichar_t str_1fa1[] = { 0x1f61, 0x0345, 0 }; static const unichar_t str_1fa2[] = { 0x1f62, 0x0345, 0 }; static const unichar_t str_1fa3[] = { 0x1f63, 0x0345, 0 }; static const unichar_t str_1fa4[] = { 0x1f64, 0x0345, 0 }; static const unichar_t str_1fa5[] = { 0x1f65, 0x0345, 0 }; static const unichar_t str_1fa6[] = { 0x1f66, 0x0345, 0 }; static const unichar_t str_1fa7[] = { 0x1f67, 0x0345, 0 }; static const unichar_t str_1fa8[] = { 0x1f68, 0x0345, 0 }; static const unichar_t str_1fa9[] = { 0x1f69, 0x0345, 0 }; static const unichar_t str_1faa[] = { 0x1f6a, 0x0345, 0 }; static const unichar_t str_1fab[] = { 0x1f6b, 0x0345, 0 }; static const unichar_t str_1fac[] = { 0x1f6c, 0x0345, 0 }; static const unichar_t str_1fad[] = { 0x1f6d, 0x0345, 0 }; static const unichar_t str_1fae[] = { 0x1f6e, 0x0345, 0 }; static const unichar_t str_1faf[] = { 0x1f6f, 0x0345, 0 }; static const unichar_t str_1fb0[] = { 0x03b1, 0x0306, 0 }; static const unichar_t str_1fb1[] = { 0x03b1, 0x0304, 0 }; static const unichar_t str_1fb2[] = { 0x1f70, 0x0345, 0 }; static const unichar_t str_1fb3[] = { 0x03b1, 0x0345, 0 }; static const unichar_t str_1fb4[] = { 0x03ac, 0x0345, 0 }; static const unichar_t str_1fb6[] = { 0x03b1, 0x0342, 0 }; static const unichar_t str_1fb7[] = { 0x1fb6, 0x0345, 0 }; static const unichar_t str_1fb8[] = { 0x0391, 0x0306, 0 }; static const unichar_t str_1fb9[] = { 0x0391, 0x0304, 0 }; static const unichar_t str_1fba[] = { 0x0391, 0x0300, 0 }; static const unichar_t str_1fbb[] = { 0x0386, 0 }; static const unichar_t str_1fbc[] = { 0x0391, 0x0345, 0 }; static const unichar_t str_1fbd[] = { 0x0020, 0x0313, 0 }; static const unichar_t str_1fbe[] = { 0x03b9, 0 }; static const unichar_t str_1fbf[] = { 0x0020, 0x0313, 0 }; static const unichar_t str_1fc0[] = { 0x0020, 0x0342, 0 }; static const unichar_t str_1fc1[] = { 0x00a8, 0x0342, 0 }; static const unichar_t str_1fc2[] = { 0x1f74, 0x0345, 0 }; static const unichar_t str_1fc3[] = { 0x03b7, 0x0345, 0 }; static const unichar_t str_1fc4[] = { 0x03ae, 0x0345, 0 }; static const unichar_t str_1fc6[] = { 0x03b7, 0x0342, 0 }; static const unichar_t str_1fc7[] = { 0x1fc6, 0x0345, 0 }; static const unichar_t str_1fc8[] = { 0x0395, 0x0300, 0 }; static const unichar_t str_1fc9[] = { 0x0388, 0 }; static const unichar_t str_1fca[] = { 0x0397, 0x0300, 0 }; static const unichar_t str_1fcb[] = { 0x0389, 0 }; static const unichar_t str_1fcc[] = { 0x0397, 0x0345, 0 }; static const unichar_t str_1fcd[] = { 0x1fbf, 0x0300, 0 }; static const unichar_t str_1fce[] = { 0x1fbf, 0x0301, 0 }; static const unichar_t str_1fcf[] = { 0x1fbf, 0x0342, 0 }; static const unichar_t str_1fd0[] = { 0x03b9, 0x0306, 0 }; static const unichar_t str_1fd1[] = { 0x03b9, 0x0304, 0 }; static const unichar_t str_1fd2[] = { 0x03ca, 0x0300, 0 }; static const unichar_t str_1fd3[] = { 0x0390, 0 }; static const unichar_t str_1fd6[] = { 0x03b9, 0x0342, 0 }; static const unichar_t str_1fd7[] = { 0x03ca, 0x0342, 0 }; static const unichar_t str_1fd8[] = { 0x0399, 0x0306, 0 }; static const unichar_t str_1fd9[] = { 0x0399, 0x0304, 0 }; static const unichar_t str_1fda[] = { 0x0399, 0x0300, 0 }; static const unichar_t str_1fdb[] = { 0x038a, 0 }; static const unichar_t str_1fdd[] = { 0x1ffe, 0x0300, 0 }; static const unichar_t str_1fde[] = { 0x1ffe, 0x0301, 0 }; static const unichar_t str_1fdf[] = { 0x1ffe, 0x0342, 0 }; static const unichar_t str_1fe0[] = { 0x03c5, 0x0306, 0 }; static const unichar_t str_1fe1[] = { 0x03c5, 0x0304, 0 }; static const unichar_t str_1fe2[] = { 0x03cb, 0x0300, 0 }; static const unichar_t str_1fe3[] = { 0x03b0, 0 }; static const unichar_t str_1fe4[] = { 0x03c1, 0x0313, 0 }; static const unichar_t str_1fe5[] = { 0x03c1, 0x0314, 0 }; static const unichar_t str_1fe6[] = { 0x03c5, 0x0342, 0 }; static const unichar_t str_1fe7[] = { 0x03cb, 0x0342, 0 }; static const unichar_t str_1fe8[] = { 0x03a5, 0x0306, 0 }; static const unichar_t str_1fe9[] = { 0x03a5, 0x0304, 0 }; static const unichar_t str_1fea[] = { 0x03a5, 0x0300, 0 }; static const unichar_t str_1feb[] = { 0x038e, 0 }; static const unichar_t str_1fec[] = { 0x03a1, 0x0314, 0 }; static const unichar_t str_1fed[] = { 0x00a8, 0x0300, 0 }; static const unichar_t str_1fee[] = { 0x0385, 0 }; static const unichar_t str_1fef[] = { 0x0060, 0 }; static const unichar_t str_1ff2[] = { 0x1f7c, 0x0345, 0 }; static const unichar_t str_1ff3[] = { 0x03c9, 0x0345, 0 }; static const unichar_t str_1ff4[] = { 0x03ce, 0x0345, 0 }; static const unichar_t str_1ff6[] = { 0x03c9, 0x0342, 0 }; static const unichar_t str_1ff7[] = { 0x1ff6, 0x0345, 0 }; static const unichar_t str_1ff8[] = { 0x039f, 0x0300, 0 }; static const unichar_t str_1ff9[] = { 0x038c, 0 }; static const unichar_t str_1ffa[] = { 0x03a9, 0x0300, 0 }; static const unichar_t str_1ffb[] = { 0x038f, 0 }; static const unichar_t str_1ffc[] = { 0x03a9, 0x0345, 0 }; static const unichar_t str_1ffd[] = { 0x00b4, 0 }; static const unichar_t str_1ffe[] = { 0x0020, 0x0314, 0 }; static const unichar_t str_2000[] = { 0x2002, 0 }; static const unichar_t str_2001[] = { 0x2003, 0 }; static const unichar_t str_2002[] = { 0x0020, 0 }; static const unichar_t str_2003[] = { 0x0020, 0 }; static const unichar_t str_2004[] = { 0x0020, 0 }; static const unichar_t str_2005[] = { 0x0020, 0 }; static const unichar_t str_2006[] = { 0x0020, 0 }; static const unichar_t str_2007[] = { 0x0020, 0 }; static const unichar_t str_2008[] = { 0x0020, 0 }; static const unichar_t str_2009[] = { 0x0020, 0 }; static const unichar_t str_200a[] = { 0x0020, 0 }; static const unichar_t str_2010[] = { 0x002d, 0 }; static const unichar_t str_2011[] = { 0x2010, 0 }; static const unichar_t str_2012[] = { 0x002d, 0 }; static const unichar_t str_2013[] = { 0x002d, 0 }; static const unichar_t str_2014[] = { 0x002d, 0 }; static const unichar_t str_2015[] = { 0x002d, 0 }; static const unichar_t str_2016[] = { 0x007c, 0x007c, 0 }; static const unichar_t str_2017[] = { 0x0020, 0x0333, 0 }; static const unichar_t str_2018[] = { 0x0060, 0 }; static const unichar_t str_2019[] = { 0x0027, 0 }; static const unichar_t str_201c[] = { 0x0022, 0 }; static const unichar_t str_201d[] = { 0x0022, 0 }; static const unichar_t str_2024[] = { 0x002e, 0 }; static const unichar_t str_2025[] = { 0x002e, 0x002e, 0 }; static const unichar_t str_2026[] = { 0x002e, 0x002e, 0x002e, 0 }; static const unichar_t str_202f[] = { 0x0020, 0 }; static const unichar_t str_2032[] = { 0x0027, 0 }; static const unichar_t str_2033[] = { 0x2032, 0x2032, 0 }; static const unichar_t str_2034[] = { 0x2032, 0x2032, 0x2032, 0 }; static const unichar_t str_2035[] = { 0x0060, 0 }; static const unichar_t str_2036[] = { 0x2035, 0x2035, 0 }; static const unichar_t str_2037[] = { 0x2035, 0x2035, 0x2035, 0 }; static const unichar_t str_2039[] = { 0x003c, 0 }; static const unichar_t str_203a[] = { 0x003e, 0 }; static const unichar_t str_203c[] = { 0x0021, 0x0021, 0 }; static const unichar_t str_203e[] = { 0x0020, 0x0305, 0 }; static const unichar_t str_2047[] = { 0x003f, 0x003f, 0 }; static const unichar_t str_2048[] = { 0x003f, 0x0021, 0 }; static const unichar_t str_2049[] = { 0x0021, 0x003f, 0 }; static const unichar_t str_2057[] = { 0x2032, 0x2032, 0x2032, 0x2032, 0 }; static const unichar_t str_205f[] = { 0x0020, 0 }; static const unichar_t str_2070[] = { 0x0030, 0 }; static const unichar_t str_2071[] = { 0x0069, 0 }; static const unichar_t str_2074[] = { 0x0034, 0 }; static const unichar_t str_2075[] = { 0x0035, 0 }; static const unichar_t str_2076[] = { 0x0036, 0 }; static const unichar_t str_2077[] = { 0x0037, 0 }; static const unichar_t str_2078[] = { 0x0038, 0 }; static const unichar_t str_2079[] = { 0x0039, 0 }; static const unichar_t str_207a[] = { 0x002b, 0 }; static const unichar_t str_207b[] = { 0x2212, 0 }; static const unichar_t str_207c[] = { 0x003d, 0 }; static const unichar_t str_207d[] = { 0x0028, 0 }; static const unichar_t str_207e[] = { 0x0029, 0 }; static const unichar_t str_207f[] = { 0x006e, 0 }; static const unichar_t str_2080[] = { 0x0030, 0 }; static const unichar_t str_2081[] = { 0x0031, 0 }; static const unichar_t str_2082[] = { 0x0032, 0 }; static const unichar_t str_2083[] = { 0x0033, 0 }; static const unichar_t str_2084[] = { 0x0034, 0 }; static const unichar_t str_2085[] = { 0x0035, 0 }; static const unichar_t str_2086[] = { 0x0036, 0 }; static const unichar_t str_2087[] = { 0x0037, 0 }; static const unichar_t str_2088[] = { 0x0038, 0 }; static const unichar_t str_2089[] = { 0x0039, 0 }; static const unichar_t str_208a[] = { 0x002b, 0 }; static const unichar_t str_208b[] = { 0x2212, 0 }; static const unichar_t str_208c[] = { 0x003d, 0 }; static const unichar_t str_208d[] = { 0x0028, 0 }; static const unichar_t str_208e[] = { 0x0029, 0 }; static const unichar_t str_2090[] = { 0x0061, 0 }; static const unichar_t str_2091[] = { 0x0065, 0 }; static const unichar_t str_2092[] = { 0x006f, 0 }; static const unichar_t str_2093[] = { 0x0078, 0 }; static const unichar_t str_2094[] = { 0x0259, 0 }; static const unichar_t str_2095[] = { 0x0068, 0 }; static const unichar_t str_2096[] = { 0x006b, 0 }; static const unichar_t str_2097[] = { 0x006c, 0 }; static const unichar_t str_2098[] = { 0x006d, 0 }; static const unichar_t str_2099[] = { 0x006e, 0 }; static const unichar_t str_209a[] = { 0x0070, 0 }; static const unichar_t str_209b[] = { 0x0073, 0 }; static const unichar_t str_209c[] = { 0x0074, 0 }; static const unichar_t str_20a8[] = { 0x0052, 0x0073, 0 }; static const unichar_t str_2100[] = { 0x0061, 0x002f, 0x0063, 0 }; static const unichar_t str_2101[] = { 0x0061, 0x002f, 0x0073, 0 }; static const unichar_t str_2102[] = { 0x0043, 0 }; static const unichar_t str_2103[] = { 0x00b0, 0x0043, 0 }; static const unichar_t str_2105[] = { 0x0063, 0x002f, 0x006f, 0 }; static const unichar_t str_2106[] = { 0x0063, 0x002f, 0x0075, 0 }; static const unichar_t str_2107[] = { 0x0190, 0 }; static const unichar_t str_2109[] = { 0x00b0, 0x0046, 0 }; static const unichar_t str_210a[] = { 0x0067, 0 }; static const unichar_t str_210b[] = { 0x0048, 0 }; static const unichar_t str_210c[] = { 0x0048, 0 }; static const unichar_t str_210d[] = { 0x0048, 0 }; static const unichar_t str_210e[] = { 0x0068, 0 }; static const unichar_t str_210f[] = { 0x0127, 0 }; static const unichar_t str_2110[] = { 0x0049, 0 }; static const unichar_t str_2111[] = { 0x0049, 0 }; static const unichar_t str_2112[] = { 0x004c, 0 }; static const unichar_t str_2113[] = { 0x006c, 0 }; static const unichar_t str_2115[] = { 0x004e, 0 }; static const unichar_t str_2116[] = { 0x004e, 0x006f, 0 }; static const unichar_t str_2119[] = { 0x0050, 0 }; static const unichar_t str_211a[] = { 0x0051, 0 }; static const unichar_t str_211b[] = { 0x0052, 0 }; static const unichar_t str_211c[] = { 0x0052, 0 }; static const unichar_t str_211d[] = { 0x0052, 0 }; static const unichar_t str_2120[] = { 0x0053, 0x004d, 0 }; static const unichar_t str_2121[] = { 0x0054, 0x0045, 0x004c, 0 }; static const unichar_t str_2122[] = { 0x0054, 0x004d, 0 }; static const unichar_t str_2124[] = { 0x005a, 0 }; static const unichar_t str_2126[] = { 0x03a9, 0 }; static const unichar_t str_2128[] = { 0x005a, 0 }; static const unichar_t str_212a[] = { 0x004b, 0 }; static const unichar_t str_212b[] = { 0x00c5, 0 }; static const unichar_t str_212c[] = { 0x0042, 0 }; static const unichar_t str_212d[] = { 0x0043, 0 }; static const unichar_t str_212f[] = { 0x0065, 0 }; static const unichar_t str_2130[] = { 0x0045, 0 }; static const unichar_t str_2131[] = { 0x0046, 0 }; static const unichar_t str_2133[] = { 0x004d, 0 }; static const unichar_t str_2134[] = { 0x006f, 0 }; static const unichar_t str_2135[] = { 0x05d0, 0 }; static const unichar_t str_2136[] = { 0x05d1, 0 }; static const unichar_t str_2137[] = { 0x05d2, 0 }; static const unichar_t str_2138[] = { 0x05d3, 0 }; static const unichar_t str_2139[] = { 0x0069, 0 }; static const unichar_t str_213b[] = { 0x0046, 0x0041, 0x0058, 0 }; static const unichar_t str_213c[] = { 0x03c0, 0 }; static const unichar_t str_213d[] = { 0x03b3, 0 }; static const unichar_t str_213e[] = { 0x0393, 0 }; static const unichar_t str_213f[] = { 0x03a0, 0 }; static const unichar_t str_2140[] = { 0x2211, 0 }; static const unichar_t str_2145[] = { 0x0044, 0 }; static const unichar_t str_2146[] = { 0x0064, 0 }; static const unichar_t str_2147[] = { 0x0065, 0 }; static const unichar_t str_2148[] = { 0x0069, 0 }; static const unichar_t str_2149[] = { 0x006a, 0 }; static const unichar_t str_2150[] = { 0x0031, 0x2044, 0x0037, 0 }; static const unichar_t str_2151[] = { 0x0031, 0x2044, 0x0039, 0 }; static const unichar_t str_2152[] = { 0x0031, 0x2044, 0x0031, 0x0030, 0 }; static const unichar_t str_2153[] = { 0x0031, 0x2044, 0x0033, 0 }; static const unichar_t str_2154[] = { 0x0032, 0x2044, 0x0033, 0 }; static const unichar_t str_2155[] = { 0x0031, 0x2044, 0x0035, 0 }; static const unichar_t str_2156[] = { 0x0032, 0x2044, 0x0035, 0 }; static const unichar_t str_2157[] = { 0x0033, 0x2044, 0x0035, 0 }; static const unichar_t str_2158[] = { 0x0034, 0x2044, 0x0035, 0 }; static const unichar_t str_2159[] = { 0x0031, 0x2044, 0x0036, 0 }; static const unichar_t str_215a[] = { 0x0035, 0x2044, 0x0036, 0 }; static const unichar_t str_215b[] = { 0x0031, 0x2044, 0x0038, 0 }; static const unichar_t str_215c[] = { 0x0033, 0x2044, 0x0038, 0 }; static const unichar_t str_215d[] = { 0x0035, 0x2044, 0x0038, 0 }; static const unichar_t str_215e[] = { 0x0037, 0x2044, 0x0038, 0 }; static const unichar_t str_215f[] = { 0x0031, 0x2044, 0 }; static const unichar_t str_2160[] = { 0x0049, 0 }; static const unichar_t str_2161[] = { 0x0049, 0x0049, 0 }; static const unichar_t str_2162[] = { 0x0049, 0x0049, 0x0049, 0 }; static const unichar_t str_2163[] = { 0x0049, 0x0056, 0 }; static const unichar_t str_2164[] = { 0x0056, 0 }; static const unichar_t str_2165[] = { 0x0056, 0x0049, 0 }; static const unichar_t str_2166[] = { 0x0056, 0x0049, 0x0049, 0 }; static const unichar_t str_2167[] = { 0x0056, 0x0049, 0x0049, 0x0049, 0 }; static const unichar_t str_2168[] = { 0x0049, 0x0058, 0 }; static const unichar_t str_2169[] = { 0x0058, 0 }; static const unichar_t str_216a[] = { 0x0058, 0x0049, 0 }; static const unichar_t str_216b[] = { 0x0058, 0x0049, 0x0049, 0 }; static const unichar_t str_216c[] = { 0x004c, 0 }; static const unichar_t str_216d[] = { 0x0043, 0 }; static const unichar_t str_216e[] = { 0x0044, 0 }; static const unichar_t str_216f[] = { 0x004d, 0 }; static const unichar_t str_2170[] = { 0x0069, 0 }; static const unichar_t str_2171[] = { 0x0069, 0x0069, 0 }; static const unichar_t str_2172[] = { 0x0069, 0x0069, 0x0069, 0 }; static const unichar_t str_2173[] = { 0x0069, 0x0076, 0 }; static const unichar_t str_2174[] = { 0x0076, 0 }; static const unichar_t str_2175[] = { 0x0076, 0x0069, 0 }; static const unichar_t str_2176[] = { 0x0076, 0x0069, 0x0069, 0 }; static const unichar_t str_2177[] = { 0x0076, 0x0069, 0x0069, 0x0069, 0 }; static const unichar_t str_2178[] = { 0x0069, 0x0078, 0 }; static const unichar_t str_2179[] = { 0x0078, 0 }; static const unichar_t str_217a[] = { 0x0078, 0x0069, 0 }; static const unichar_t str_217b[] = { 0x0078, 0x0069, 0x0069, 0 }; static const unichar_t str_217c[] = { 0x006c, 0 }; static const unichar_t str_217d[] = { 0x0063, 0 }; static const unichar_t str_217e[] = { 0x0064, 0 }; static const unichar_t str_217f[] = { 0x006d, 0 }; static const unichar_t str_2189[] = { 0x0030, 0x2044, 0x0033, 0 }; static const unichar_t str_219a[] = { 0x2190, 0x0338, 0 }; static const unichar_t str_219b[] = { 0x2192, 0x0338, 0 }; static const unichar_t str_21ae[] = { 0x2194, 0x0338, 0 }; static const unichar_t str_21cd[] = { 0x21d0, 0x0338, 0 }; static const unichar_t str_21ce[] = { 0x21d4, 0x0338, 0 }; static const unichar_t str_21cf[] = { 0x21d2, 0x0338, 0 }; static const unichar_t str_2204[] = { 0x2203, 0x0338, 0 }; static const unichar_t str_2205[] = { 0x00d8, 0 }; static const unichar_t str_2206[] = { 0x0394, 0 }; static const unichar_t str_2209[] = { 0x2208, 0x0338, 0 }; static const unichar_t str_220c[] = { 0x220b, 0x0338, 0 }; static const unichar_t str_220f[] = { 0x03a0, 0 }; static const unichar_t str_2211[] = { 0x03a3, 0 }; static const unichar_t str_2212[] = { 0x002d, 0 }; static const unichar_t str_2215[] = { 0x002f, 0 }; static const unichar_t str_2216[] = { 0x005c, 0 }; static const unichar_t str_2217[] = { 0x002a, 0 }; static const unichar_t str_2218[] = { 0x00b0, 0 }; static const unichar_t str_2219[] = { 0x00b7, 0 }; static const unichar_t str_2223[] = { 0x007c, 0 }; static const unichar_t str_2224[] = { 0x2223, 0x0338, 0 }; static const unichar_t str_2225[] = { 0x007c, 0x007c, 0 }; static const unichar_t str_2226[] = { 0x2225, 0x0338, 0 }; static const unichar_t str_222c[] = { 0x222b, 0x222b, 0 }; static const unichar_t str_222d[] = { 0x222b, 0x222b, 0x222b, 0 }; static const unichar_t str_222f[] = { 0x222e, 0x222e, 0 }; static const unichar_t str_2230[] = { 0x222e, 0x222e, 0x222e, 0 }; static const unichar_t str_2236[] = { 0x003a, 0 }; static const unichar_t str_223c[] = { 0x007e, 0 }; static const unichar_t str_2241[] = { 0x223c, 0x0338, 0 }; static const unichar_t str_2244[] = { 0x2243, 0x0338, 0 }; static const unichar_t str_2247[] = { 0x2245, 0x0338, 0 }; static const unichar_t str_2249[] = { 0x2248, 0x0338, 0 }; static const unichar_t str_2260[] = { 0x003d, 0x0338, 0 }; static const unichar_t str_2262[] = { 0x2261, 0x0338, 0 }; static const unichar_t str_226a[] = { 0x00ab, 0 }; static const unichar_t str_226b[] = { 0x00bb, 0 }; static const unichar_t str_226d[] = { 0x224d, 0x0338, 0 }; static const unichar_t str_226e[] = { 0x003c, 0x0338, 0 }; static const unichar_t str_226f[] = { 0x003e, 0x0338, 0 }; static const unichar_t str_2270[] = { 0x2264, 0x0338, 0 }; static const unichar_t str_2271[] = { 0x2265, 0x0338, 0 }; static const unichar_t str_2274[] = { 0x2272, 0x0338, 0 }; static const unichar_t str_2275[] = { 0x2273, 0x0338, 0 }; static const unichar_t str_2278[] = { 0x2276, 0x0338, 0 }; static const unichar_t str_2279[] = { 0x2277, 0x0338, 0 }; static const unichar_t str_2280[] = { 0x227a, 0x0338, 0 }; static const unichar_t str_2281[] = { 0x227b, 0x0338, 0 }; static const unichar_t str_2284[] = { 0x2282, 0x0338, 0 }; static const unichar_t str_2285[] = { 0x2283, 0x0338, 0 }; static const unichar_t str_2288[] = { 0x2286, 0x0338, 0 }; static const unichar_t str_2289[] = { 0x2287, 0x0338, 0 }; static const unichar_t str_2299[] = { 0x0298, 0 }; static const unichar_t str_22ac[] = { 0x22a2, 0x0338, 0 }; static const unichar_t str_22ad[] = { 0x22a8, 0x0338, 0 }; static const unichar_t str_22ae[] = { 0x22a9, 0x0338, 0 }; static const unichar_t str_22af[] = { 0x22ab, 0x0338, 0 }; static const unichar_t str_22c4[] = { 0x25ca, 0 }; static const unichar_t str_22c5[] = { 0x00b7, 0 }; static const unichar_t str_22e0[] = { 0x227c, 0x0338, 0 }; static const unichar_t str_22e1[] = { 0x227d, 0x0338, 0 }; static const unichar_t str_22e2[] = { 0x2291, 0x0338, 0 }; static const unichar_t str_22e3[] = { 0x2292, 0x0338, 0 }; static const unichar_t str_22ea[] = { 0x22b2, 0x0338, 0 }; static const unichar_t str_22eb[] = { 0x22b3, 0x0338, 0 }; static const unichar_t str_22ec[] = { 0x22b4, 0x0338, 0 }; static const unichar_t str_22ed[] = { 0x22b5, 0x0338, 0 }; static const unichar_t str_22ef[] = { 0x00b7, 0x00b7, 0x00b7, 0 }; static const unichar_t str_2303[] = { 0x005e, 0 }; static const unichar_t str_2329[] = { 0x3008, 0 }; static const unichar_t str_232a[] = { 0x3009, 0 }; static const unichar_t str_2373[] = { 0x03b9, 0 }; static const unichar_t str_2374[] = { 0x03c1, 0 }; static const unichar_t str_2375[] = { 0x03c9, 0 }; static const unichar_t str_237a[] = { 0x03b1, 0 }; static const unichar_t str_2400[] = { 0x004e, 0x0055, 0x004c, 0 }; static const unichar_t str_2401[] = { 0x0053, 0x004f, 0x0048, 0 }; static const unichar_t str_2402[] = { 0x0053, 0x0054, 0x0058, 0 }; static const unichar_t str_2403[] = { 0x0045, 0x0054, 0x0058, 0 }; static const unichar_t str_2404[] = { 0x0045, 0x004f, 0x0054, 0 }; static const unichar_t str_2405[] = { 0x0045, 0x004e, 0x0041, 0 }; static const unichar_t str_2406[] = { 0x0041, 0x0043, 0x004b, 0 }; static const unichar_t str_2407[] = { 0x0042, 0x0045, 0x004c, 0 }; static const unichar_t str_2408[] = { 0x0042, 0x0053, 0 }; static const unichar_t str_2409[] = { 0x0048, 0x0054, 0 }; static const unichar_t str_240a[] = { 0x004c, 0x0046, 0 }; static const unichar_t str_240b[] = { 0x0056, 0x0054, 0 }; static const unichar_t str_240c[] = { 0x0046, 0x0046, 0 }; static const unichar_t str_240d[] = { 0x0043, 0x0052, 0 }; static const unichar_t str_240e[] = { 0x0053, 0x004f, 0 }; static const unichar_t str_240f[] = { 0x0053, 0x0049, 0 }; static const unichar_t str_2410[] = { 0x0044, 0x004c, 0x0045, 0 }; static const unichar_t str_2411[] = { 0x0044, 0x0043, 0x0031, 0 }; static const unichar_t str_2412[] = { 0x0044, 0x0043, 0x0032, 0 }; static const unichar_t str_2413[] = { 0x0044, 0x0043, 0x0033, 0 }; static const unichar_t str_2414[] = { 0x0044, 0x0043, 0x0034, 0 }; static const unichar_t str_2415[] = { 0x004e, 0x0041, 0x004b, 0 }; static const unichar_t str_2416[] = { 0x0053, 0x0059, 0x004e, 0 }; static const unichar_t str_2417[] = { 0x0045, 0x0054, 0x0042, 0 }; static const unichar_t str_2418[] = { 0x0043, 0x0041, 0x004e, 0 }; static const unichar_t str_2419[] = { 0x0045, 0x004d, 0 }; static const unichar_t str_241a[] = { 0x0053, 0x0055, 0x0042, 0 }; static const unichar_t str_241b[] = { 0x0045, 0x0053, 0x0043, 0 }; static const unichar_t str_241c[] = { 0x0046, 0x0053, 0 }; static const unichar_t str_241d[] = { 0x0047, 0x0053, 0 }; static const unichar_t str_241e[] = { 0x0052, 0x0053, 0 }; static const unichar_t str_241f[] = { 0x0055, 0x0053, 0 }; static const unichar_t str_2420[] = { 0x0053, 0x0050, 0 }; static const unichar_t str_2421[] = { 0x0044, 0x0045, 0x004c, 0 }; static const unichar_t str_2422[] = { 0x0180, 0 }; static const unichar_t str_2460[] = { 0x0031, 0x20dd, 0 }; static const unichar_t str_2461[] = { 0x0032, 0x20dd, 0 }; static const unichar_t str_2462[] = { 0x0033, 0x20dd, 0 }; static const unichar_t str_2463[] = { 0x0034, 0x20dd, 0 }; static const unichar_t str_2464[] = { 0x0035, 0x20dd, 0 }; static const unichar_t str_2465[] = { 0x0036, 0x20dd, 0 }; static const unichar_t str_2466[] = { 0x0037, 0x20dd, 0 }; static const unichar_t str_2467[] = { 0x0038, 0x20dd, 0 }; static const unichar_t str_2468[] = { 0x0039, 0x20dd, 0 }; static const unichar_t str_2469[] = { 0x0031, 0x0030, 0x20dd, 0 }; static const unichar_t str_246a[] = { 0x0031, 0x0031, 0x20dd, 0 }; static const unichar_t str_246b[] = { 0x0031, 0x0032, 0x20dd, 0 }; static const unichar_t str_246c[] = { 0x0031, 0x0033, 0x20dd, 0 }; static const unichar_t str_246d[] = { 0x0031, 0x0034, 0x20dd, 0 }; static const unichar_t str_246e[] = { 0x0031, 0x0035, 0x20dd, 0 }; static const unichar_t str_246f[] = { 0x0031, 0x0036, 0x20dd, 0 }; static const unichar_t str_2470[] = { 0x0031, 0x0037, 0x20dd, 0 }; static const unichar_t str_2471[] = { 0x0031, 0x0038, 0x20dd, 0 }; static const unichar_t str_2472[] = { 0x0031, 0x0039, 0x20dd, 0 }; static const unichar_t str_2473[] = { 0x0032, 0x0030, 0x20dd, 0 }; static const unichar_t str_2474[] = { 0x0028, 0x0031, 0x0029, 0 }; static const unichar_t str_2475[] = { 0x0028, 0x0032, 0x0029, 0 }; static const unichar_t str_2476[] = { 0x0028, 0x0033, 0x0029, 0 }; static const unichar_t str_2477[] = { 0x0028, 0x0034, 0x0029, 0 }; static const unichar_t str_2478[] = { 0x0028, 0x0035, 0x0029, 0 }; static const unichar_t str_2479[] = { 0x0028, 0x0036, 0x0029, 0 }; static const unichar_t str_247a[] = { 0x0028, 0x0037, 0x0029, 0 }; static const unichar_t str_247b[] = { 0x0028, 0x0038, 0x0029, 0 }; static const unichar_t str_247c[] = { 0x0028, 0x0039, 0x0029, 0 }; static const unichar_t str_247d[] = { 0x0028, 0x0031, 0x0030, 0x0029, 0 }; static const unichar_t str_247e[] = { 0x0028, 0x0031, 0x0031, 0x0029, 0 }; static const unichar_t str_247f[] = { 0x0028, 0x0031, 0x0032, 0x0029, 0 }; static const unichar_t str_2480[] = { 0x0028, 0x0031, 0x0033, 0x0029, 0 }; static const unichar_t str_2481[] = { 0x0028, 0x0031, 0x0034, 0x0029, 0 }; static const unichar_t str_2482[] = { 0x0028, 0x0031, 0x0035, 0x0029, 0 }; static const unichar_t str_2483[] = { 0x0028, 0x0031, 0x0036, 0x0029, 0 }; static const unichar_t str_2484[] = { 0x0028, 0x0031, 0x0037, 0x0029, 0 }; static const unichar_t str_2485[] = { 0x0028, 0x0031, 0x0038, 0x0029, 0 }; static const unichar_t str_2486[] = { 0x0028, 0x0031, 0x0039, 0x0029, 0 }; static const unichar_t str_2487[] = { 0x0028, 0x0032, 0x0030, 0x0029, 0 }; static const unichar_t str_2488[] = { 0x0031, 0x002e, 0 }; static const unichar_t str_2489[] = { 0x0032, 0x002e, 0 }; static const unichar_t str_248a[] = { 0x0033, 0x002e, 0 }; static const unichar_t str_248b[] = { 0x0034, 0x002e, 0 }; static const unichar_t str_248c[] = { 0x0035, 0x002e, 0 }; static const unichar_t str_248d[] = { 0x0036, 0x002e, 0 }; static const unichar_t str_248e[] = { 0x0037, 0x002e, 0 }; static const unichar_t str_248f[] = { 0x0038, 0x002e, 0 }; static const unichar_t str_2490[] = { 0x0039, 0x002e, 0 }; static const unichar_t str_2491[] = { 0x0031, 0x0030, 0x002e, 0 }; static const unichar_t str_2492[] = { 0x0031, 0x0031, 0x002e, 0 }; static const unichar_t str_2493[] = { 0x0031, 0x0032, 0x002e, 0 }; static const unichar_t str_2494[] = { 0x0031, 0x0033, 0x002e, 0 }; static const unichar_t str_2495[] = { 0x0031, 0x0034, 0x002e, 0 }; static const unichar_t str_2496[] = { 0x0031, 0x0035, 0x002e, 0 }; static const unichar_t str_2497[] = { 0x0031, 0x0036, 0x002e, 0 }; static const unichar_t str_2498[] = { 0x0031, 0x0037, 0x002e, 0 }; static const unichar_t str_2499[] = { 0x0031, 0x0038, 0x002e, 0 }; static const unichar_t str_249a[] = { 0x0031, 0x0039, 0x002e, 0 }; static const unichar_t str_249b[] = { 0x0032, 0x0030, 0x002e, 0 }; static const unichar_t str_249c[] = { 0x0028, 0x0061, 0x0029, 0 }; static const unichar_t str_249d[] = { 0x0028, 0x0062, 0x0029, 0 }; static const unichar_t str_249e[] = { 0x0028, 0x0063, 0x0029, 0 }; static const unichar_t str_249f[] = { 0x0028, 0x0064, 0x0029, 0 }; static const unichar_t str_24a0[] = { 0x0028, 0x0065, 0x0029, 0 }; static const unichar_t str_24a1[] = { 0x0028, 0x0066, 0x0029, 0 }; static const unichar_t str_24a2[] = { 0x0028, 0x0067, 0x0029, 0 }; static const unichar_t str_24a3[] = { 0x0028, 0x0068, 0x0029, 0 }; static const unichar_t str_24a4[] = { 0x0028, 0x0069, 0x0029, 0 }; static const unichar_t str_24a5[] = { 0x0028, 0x006a, 0x0029, 0 }; static const unichar_t str_24a6[] = { 0x0028, 0x006b, 0x0029, 0 }; static const unichar_t str_24a7[] = { 0x0028, 0x006c, 0x0029, 0 }; static const unichar_t str_24a8[] = { 0x0028, 0x006d, 0x0029, 0 }; static const unichar_t str_24a9[] = { 0x0028, 0x006e, 0x0029, 0 }; static const unichar_t str_24aa[] = { 0x0028, 0x006f, 0x0029, 0 }; static const unichar_t str_24ab[] = { 0x0028, 0x0070, 0x0029, 0 }; static const unichar_t str_24ac[] = { 0x0028, 0x0071, 0x0029, 0 }; static const unichar_t str_24ad[] = { 0x0028, 0x0072, 0x0029, 0 }; static const unichar_t str_24ae[] = { 0x0028, 0x0073, 0x0029, 0 }; static const unichar_t str_24af[] = { 0x0028, 0x0074, 0x0029, 0 }; static const unichar_t str_24b0[] = { 0x0028, 0x0075, 0x0029, 0 }; static const unichar_t str_24b1[] = { 0x0028, 0x0076, 0x0029, 0 }; static const unichar_t str_24b2[] = { 0x0028, 0x0077, 0x0029, 0 }; static const unichar_t str_24b3[] = { 0x0028, 0x0078, 0x0029, 0 }; static const unichar_t str_24b4[] = { 0x0028, 0x0079, 0x0029, 0 }; static const unichar_t str_24b5[] = { 0x0028, 0x007a, 0x0029, 0 }; static const unichar_t str_24b6[] = { 0x0041, 0x20dd, 0 }; static const unichar_t str_24b7[] = { 0x0042, 0x20dd, 0 }; static const unichar_t str_24b8[] = { 0x0043, 0x20dd, 0 }; static const unichar_t str_24b9[] = { 0x0044, 0x20dd, 0 }; static const unichar_t str_24ba[] = { 0x0045, 0x20dd, 0 }; static const unichar_t str_24bb[] = { 0x0046, 0x20dd, 0 }; static const unichar_t str_24bc[] = { 0x0047, 0x20dd, 0 }; static const unichar_t str_24bd[] = { 0x0048, 0x20dd, 0 }; static const unichar_t str_24be[] = { 0x0049, 0x20dd, 0 }; static const unichar_t str_24bf[] = { 0x004a, 0x20dd, 0 }; static const unichar_t str_24c0[] = { 0x004b, 0x20dd, 0 }; static const unichar_t str_24c1[] = { 0x004c, 0x20dd, 0 }; static const unichar_t str_24c2[] = { 0x004d, 0x20dd, 0 }; static const unichar_t str_24c3[] = { 0x004e, 0x20dd, 0 }; static const unichar_t str_24c4[] = { 0x004f, 0x20dd, 0 }; static const unichar_t str_24c5[] = { 0x0050, 0x20dd, 0 }; static const unichar_t str_24c6[] = { 0x0051, 0x20dd, 0 }; static const unichar_t str_24c7[] = { 0x0052, 0x20dd, 0 }; static const unichar_t str_24c8[] = { 0x0053, 0x20dd, 0 }; static const unichar_t str_24c9[] = { 0x0054, 0x20dd, 0 }; static const unichar_t str_24ca[] = { 0x0055, 0x20dd, 0 }; static const unichar_t str_24cb[] = { 0x0056, 0x20dd, 0 }; static const unichar_t str_24cc[] = { 0x0057, 0x20dd, 0 }; static const unichar_t str_24cd[] = { 0x0058, 0x20dd, 0 }; static const unichar_t str_24ce[] = { 0x0059, 0x20dd, 0 }; static const unichar_t str_24cf[] = { 0x005a, 0x20dd, 0 }; static const unichar_t str_24d0[] = { 0x0061, 0x20dd, 0 }; static const unichar_t str_24d1[] = { 0x0062, 0x20dd, 0 }; static const unichar_t str_24d2[] = { 0x0063, 0x20dd, 0 }; static const unichar_t str_24d3[] = { 0x0064, 0x20dd, 0 }; static const unichar_t str_24d4[] = { 0x0065, 0x20dd, 0 }; static const unichar_t str_24d5[] = { 0x0066, 0x20dd, 0 }; static const unichar_t str_24d6[] = { 0x0067, 0x20dd, 0 }; static const unichar_t str_24d7[] = { 0x0068, 0x20dd, 0 }; static const unichar_t str_24d8[] = { 0x0069, 0x20dd, 0 }; static const unichar_t str_24d9[] = { 0x006a, 0x20dd, 0 }; static const unichar_t str_24da[] = { 0x006b, 0x20dd, 0 }; static const unichar_t str_24db[] = { 0x006c, 0x20dd, 0 }; static const unichar_t str_24dc[] = { 0x006d, 0x20dd, 0 }; static const unichar_t str_24dd[] = { 0x006e, 0x20dd, 0 }; static const unichar_t str_24de[] = { 0x006f, 0x20dd, 0 }; static const unichar_t str_24df[] = { 0x0070, 0x20dd, 0 }; static const unichar_t str_24e0[] = { 0x0071, 0x20dd, 0 }; static const unichar_t str_24e1[] = { 0x0072, 0x20dd, 0 }; static const unichar_t str_24e2[] = { 0x0073, 0x20dd, 0 }; static const unichar_t str_24e3[] = { 0x0074, 0x20dd, 0 }; static const unichar_t str_24e4[] = { 0x0075, 0x20dd, 0 }; static const unichar_t str_24e5[] = { 0x0076, 0x20dd, 0 }; static const unichar_t str_24e6[] = { 0x0077, 0x20dd, 0 }; static const unichar_t str_24e7[] = { 0x0078, 0x20dd, 0 }; static const unichar_t str_24e8[] = { 0x0079, 0x20dd, 0 }; static const unichar_t str_24e9[] = { 0x007a, 0x20dd, 0 }; static const unichar_t str_24ea[] = { 0x0030, 0x20dd, 0 }; static const unichar_t str_2500[] = { 0x2014, 0 }; static const unichar_t str_2502[] = { 0x007c, 0 }; static const unichar_t str_25b3[] = { 0x2206, 0 }; static const unichar_t str_25b8[] = { 0x2023, 0 }; static const unichar_t str_25bd[] = { 0x2207, 0 }; static const unichar_t str_25c7[] = { 0x25ca, 0 }; static const unichar_t str_25e6[] = { 0x00b0, 0 }; static const unichar_t str_2662[] = { 0x25ca, 0 }; static const unichar_t str_2731[] = { 0x002a, 0 }; static const unichar_t str_2758[] = { 0x007c, 0 }; static const unichar_t str_2762[] = { 0x0021, 0 }; static const unichar_t str_2a0c[] = { 0x222b, 0x222b, 0x222b, 0x222b, 0 }; static const unichar_t str_2a74[] = { 0x003a, 0x003a, 0x003d, 0 }; static const unichar_t str_2a75[] = { 0x003d, 0x003d, 0 }; static const unichar_t str_2a76[] = { 0x003d, 0x003d, 0x003d, 0 }; static const unichar_t str_2adc[] = { 0x2add, 0x0338, 0 }; static const unichar_t str_2c7c[] = { 0x006a, 0 }; static const unichar_t str_2c7d[] = { 0x0056, 0 }; static const unichar_t str_2d6f[] = { 0x2d61, 0 }; static const unichar_t str_2e28[] = { 0xff5f, 0 }; static const unichar_t str_2e29[] = { 0xff60, 0 }; static const unichar_t str_2e9f[] = { 0x6bcd, 0 }; static const unichar_t str_2ef3[] = { 0x9f9f, 0 }; static const unichar_t str_2f00[] = { 0x4e00, 0 }; static const unichar_t str_2f01[] = { 0x4e28, 0 }; static const unichar_t str_2f02[] = { 0x4e36, 0 }; static const unichar_t str_2f03[] = { 0x4e3f, 0 }; static const unichar_t str_2f04[] = { 0x4e59, 0 }; static const unichar_t str_2f05[] = { 0x4e85, 0 }; static const unichar_t str_2f06[] = { 0x4e8c, 0 }; static const unichar_t str_2f07[] = { 0x4ea0, 0 }; static const unichar_t str_2f08[] = { 0x4eba, 0 }; static const unichar_t str_2f09[] = { 0x513f, 0 }; static const unichar_t str_2f0a[] = { 0x5165, 0 }; static const unichar_t str_2f0b[] = { 0x516b, 0 }; static const unichar_t str_2f0c[] = { 0x5182, 0 }; static const unichar_t str_2f0d[] = { 0x5196, 0 }; static const unichar_t str_2f0e[] = { 0x51ab, 0 }; static const unichar_t str_2f0f[] = { 0x51e0, 0 }; static const unichar_t str_2f10[] = { 0x51f5, 0 }; static const unichar_t str_2f11[] = { 0x5200, 0 }; static const unichar_t str_2f12[] = { 0x529b, 0 }; static const unichar_t str_2f13[] = { 0x52f9, 0 }; static const unichar_t str_2f14[] = { 0x5315, 0 }; static const unichar_t str_2f15[] = { 0x531a, 0 }; static const unichar_t str_2f16[] = { 0x5338, 0 }; static const unichar_t str_2f17[] = { 0x5341, 0 }; static const unichar_t str_2f18[] = { 0x535c, 0 }; static const unichar_t str_2f19[] = { 0x5369, 0 }; static const unichar_t str_2f1a[] = { 0x5382, 0 }; static const unichar_t str_2f1b[] = { 0x53b6, 0 }; static const unichar_t str_2f1c[] = { 0x53c8, 0 }; static const unichar_t str_2f1d[] = { 0x53e3, 0 }; static const unichar_t str_2f1e[] = { 0x56d7, 0 }; static const unichar_t str_2f1f[] = { 0x571f, 0 }; static const unichar_t str_2f20[] = { 0x58eb, 0 }; static const unichar_t str_2f21[] = { 0x5902, 0 }; static const unichar_t str_2f22[] = { 0x590a, 0 }; static const unichar_t str_2f23[] = { 0x5915, 0 }; static const unichar_t str_2f24[] = { 0x5927, 0 }; static const unichar_t str_2f25[] = { 0x5973, 0 }; static const unichar_t str_2f26[] = { 0x5b50, 0 }; static const unichar_t str_2f27[] = { 0x5b80, 0 }; static const unichar_t str_2f28[] = { 0x5bf8, 0 }; static const unichar_t str_2f29[] = { 0x5c0f, 0 }; static const unichar_t str_2f2a[] = { 0x5c22, 0 }; static const unichar_t str_2f2b[] = { 0x5c38, 0 }; static const unichar_t str_2f2c[] = { 0x5c6e, 0 }; static const unichar_t str_2f2d[] = { 0x5c71, 0 }; static const unichar_t str_2f2e[] = { 0x5ddb, 0 }; static const unichar_t str_2f2f[] = { 0x5de5, 0 }; static const unichar_t str_2f30[] = { 0x5df1, 0 }; static const unichar_t str_2f31[] = { 0x5dfe, 0 }; static const unichar_t str_2f32[] = { 0x5e72, 0 }; static const unichar_t str_2f33[] = { 0x5e7a, 0 }; static const unichar_t str_2f34[] = { 0x5e7f, 0 }; static const unichar_t str_2f35[] = { 0x5ef4, 0 }; static const unichar_t str_2f36[] = { 0x5efe, 0 }; static const unichar_t str_2f37[] = { 0x5f0b, 0 }; static const unichar_t str_2f38[] = { 0x5f13, 0 }; static const unichar_t str_2f39[] = { 0x5f50, 0 }; static const unichar_t str_2f3a[] = { 0x5f61, 0 }; static const unichar_t str_2f3b[] = { 0x5f73, 0 }; static const unichar_t str_2f3c[] = { 0x5fc3, 0 }; static const unichar_t str_2f3d[] = { 0x6208, 0 }; static const unichar_t str_2f3e[] = { 0x6236, 0 }; static const unichar_t str_2f3f[] = { 0x624b, 0 }; static const unichar_t str_2f40[] = { 0x652f, 0 }; static const unichar_t str_2f41[] = { 0x6534, 0 }; static const unichar_t str_2f42[] = { 0x6587, 0 }; static const unichar_t str_2f43[] = { 0x6597, 0 }; static const unichar_t str_2f44[] = { 0x65a4, 0 }; static const unichar_t str_2f45[] = { 0x65b9, 0 }; static const unichar_t str_2f46[] = { 0x65e0, 0 }; static const unichar_t str_2f47[] = { 0x65e5, 0 }; static const unichar_t str_2f48[] = { 0x66f0, 0 }; static const unichar_t str_2f49[] = { 0x6708, 0 }; static const unichar_t str_2f4a[] = { 0x6728, 0 }; static const unichar_t str_2f4b[] = { 0x6b20, 0 }; static const unichar_t str_2f4c[] = { 0x6b62, 0 }; static const unichar_t str_2f4d[] = { 0x6b79, 0 }; static const unichar_t str_2f4e[] = { 0x6bb3, 0 }; static const unichar_t str_2f4f[] = { 0x6bcb, 0 }; static const unichar_t str_2f50[] = { 0x6bd4, 0 }; static const unichar_t str_2f51[] = { 0x6bdb, 0 }; static const unichar_t str_2f52[] = { 0x6c0f, 0 }; static const unichar_t str_2f53[] = { 0x6c14, 0 }; static const unichar_t str_2f54[] = { 0x6c34, 0 }; static const unichar_t str_2f55[] = { 0x706b, 0 }; static const unichar_t str_2f56[] = { 0x722a, 0 }; static const unichar_t str_2f57[] = { 0x7236, 0 }; static const unichar_t str_2f58[] = { 0x723b, 0 }; static const unichar_t str_2f59[] = { 0x723f, 0 }; static const unichar_t str_2f5a[] = { 0x7247, 0 }; static const unichar_t str_2f5b[] = { 0x7259, 0 }; static const unichar_t str_2f5c[] = { 0x725b, 0 }; static const unichar_t str_2f5d[] = { 0x72ac, 0 }; static const unichar_t str_2f5e[] = { 0x7384, 0 }; static const unichar_t str_2f5f[] = { 0x7389, 0 }; static const unichar_t str_2f60[] = { 0x74dc, 0 }; static const unichar_t str_2f61[] = { 0x74e6, 0 }; static const unichar_t str_2f62[] = { 0x7518, 0 }; static const unichar_t str_2f63[] = { 0x751f, 0 }; static const unichar_t str_2f64[] = { 0x7528, 0 }; static const unichar_t str_2f65[] = { 0x7530, 0 }; static const unichar_t str_2f66[] = { 0x758b, 0 }; static const unichar_t str_2f67[] = { 0x7592, 0 }; static const unichar_t str_2f68[] = { 0x7676, 0 }; static const unichar_t str_2f69[] = { 0x767d, 0 }; static const unichar_t str_2f6a[] = { 0x76ae, 0 }; static const unichar_t str_2f6b[] = { 0x76bf, 0 }; static const unichar_t str_2f6c[] = { 0x76ee, 0 }; static const unichar_t str_2f6d[] = { 0x77db, 0 }; static const unichar_t str_2f6e[] = { 0x77e2, 0 }; static const unichar_t str_2f6f[] = { 0x77f3, 0 }; static const unichar_t str_2f70[] = { 0x793a, 0 }; static const unichar_t str_2f71[] = { 0x79b8, 0 }; static const unichar_t str_2f72[] = { 0x79be, 0 }; static const unichar_t str_2f73[] = { 0x7a74, 0 }; static const unichar_t str_2f74[] = { 0x7acb, 0 }; static const unichar_t str_2f75[] = { 0x7af9, 0 }; static const unichar_t str_2f76[] = { 0x7c73, 0 }; static const unichar_t str_2f77[] = { 0x7cf8, 0 }; static const unichar_t str_2f78[] = { 0x7f36, 0 }; static const unichar_t str_2f79[] = { 0x7f51, 0 }; static const unichar_t str_2f7a[] = { 0x7f8a, 0 }; static const unichar_t str_2f7b[] = { 0x7fbd, 0 }; static const unichar_t str_2f7c[] = { 0x8001, 0 }; static const unichar_t str_2f7d[] = { 0x800c, 0 }; static const unichar_t str_2f7e[] = { 0x8012, 0 }; static const unichar_t str_2f7f[] = { 0x8033, 0 }; static const unichar_t str_2f80[] = { 0x807f, 0 }; static const unichar_t str_2f81[] = { 0x8089, 0 }; static const unichar_t str_2f82[] = { 0x81e3, 0 }; static const unichar_t str_2f83[] = { 0x81ea, 0 }; static const unichar_t str_2f84[] = { 0x81f3, 0 }; static const unichar_t str_2f85[] = { 0x81fc, 0 }; static const unichar_t str_2f86[] = { 0x820c, 0 }; static const unichar_t str_2f87[] = { 0x821b, 0 }; static const unichar_t str_2f88[] = { 0x821f, 0 }; static const unichar_t str_2f89[] = { 0x826e, 0 }; static const unichar_t str_2f8a[] = { 0x8272, 0 }; static const unichar_t str_2f8b[] = { 0x8278, 0 }; static const unichar_t str_2f8c[] = { 0x864d, 0 }; static const unichar_t str_2f8d[] = { 0x866b, 0 }; static const unichar_t str_2f8e[] = { 0x8840, 0 }; static const unichar_t str_2f8f[] = { 0x884c, 0 }; static const unichar_t str_2f90[] = { 0x8863, 0 }; static const unichar_t str_2f91[] = { 0x897e, 0 }; static const unichar_t str_2f92[] = { 0x898b, 0 }; static const unichar_t str_2f93[] = { 0x89d2, 0 }; static const unichar_t str_2f94[] = { 0x8a00, 0 }; static const unichar_t str_2f95[] = { 0x8c37, 0 }; static const unichar_t str_2f96[] = { 0x8c46, 0 }; static const unichar_t str_2f97[] = { 0x8c55, 0 }; static const unichar_t str_2f98[] = { 0x8c78, 0 }; static const unichar_t str_2f99[] = { 0x8c9d, 0 }; static const unichar_t str_2f9a[] = { 0x8d64, 0 }; static const unichar_t str_2f9b[] = { 0x8d70, 0 }; static const unichar_t str_2f9c[] = { 0x8db3, 0 }; static const unichar_t str_2f9d[] = { 0x8eab, 0 }; static const unichar_t str_2f9e[] = { 0x8eca, 0 }; static const unichar_t str_2f9f[] = { 0x8f9b, 0 }; static const unichar_t str_2fa0[] = { 0x8fb0, 0 }; static const unichar_t str_2fa1[] = { 0x8fb5, 0 }; static const unichar_t str_2fa2[] = { 0x9091, 0 }; static const unichar_t str_2fa3[] = { 0x9149, 0 }; static const unichar_t str_2fa4[] = { 0x91c6, 0 }; static const unichar_t str_2fa5[] = { 0x91cc, 0 }; static const unichar_t str_2fa6[] = { 0x91d1, 0 }; static const unichar_t str_2fa7[] = { 0x9577, 0 }; static const unichar_t str_2fa8[] = { 0x9580, 0 }; static const unichar_t str_2fa9[] = { 0x961c, 0 }; static const unichar_t str_2faa[] = { 0x96b6, 0 }; static const unichar_t str_2fab[] = { 0x96b9, 0 }; static const unichar_t str_2fac[] = { 0x96e8, 0 }; static const unichar_t str_2fad[] = { 0x9751, 0 }; static const unichar_t str_2fae[] = { 0x975e, 0 }; static const unichar_t str_2faf[] = { 0x9762, 0 }; static const unichar_t str_2fb0[] = { 0x9769, 0 }; static const unichar_t str_2fb1[] = { 0x97cb, 0 }; static const unichar_t str_2fb2[] = { 0x97ed, 0 }; static const unichar_t str_2fb3[] = { 0x97f3, 0 }; static const unichar_t str_2fb4[] = { 0x9801, 0 }; static const unichar_t str_2fb5[] = { 0x98a8, 0 }; static const unichar_t str_2fb6[] = { 0x98db, 0 }; static const unichar_t str_2fb7[] = { 0x98df, 0 }; static const unichar_t str_2fb8[] = { 0x9996, 0 }; static const unichar_t str_2fb9[] = { 0x9999, 0 }; static const unichar_t str_2fba[] = { 0x99ac, 0 }; static const unichar_t str_2fbb[] = { 0x9aa8, 0 }; static const unichar_t str_2fbc[] = { 0x9ad8, 0 }; static const unichar_t str_2fbd[] = { 0x9adf, 0 }; static const unichar_t str_2fbe[] = { 0x9b25, 0 }; static const unichar_t str_2fbf[] = { 0x9b2f, 0 }; static const unichar_t str_2fc0[] = { 0x9b32, 0 }; static const unichar_t str_2fc1[] = { 0x9b3c, 0 }; static const unichar_t str_2fc2[] = { 0x9b5a, 0 }; static const unichar_t str_2fc3[] = { 0x9ce5, 0 }; static const unichar_t str_2fc4[] = { 0x9e75, 0 }; static const unichar_t str_2fc5[] = { 0x9e7f, 0 }; static const unichar_t str_2fc6[] = { 0x9ea5, 0 }; static const unichar_t str_2fc7[] = { 0x9ebb, 0 }; static const unichar_t str_2fc8[] = { 0x9ec3, 0 }; static const unichar_t str_2fc9[] = { 0x9ecd, 0 }; static const unichar_t str_2fca[] = { 0x9ed1, 0 }; static const unichar_t str_2fcb[] = { 0x9ef9, 0 }; static const unichar_t str_2fcc[] = { 0x9efd, 0 }; static const unichar_t str_2fcd[] = { 0x9f0e, 0 }; static const unichar_t str_2fce[] = { 0x9f13, 0 }; static const unichar_t str_2fcf[] = { 0x9f20, 0 }; static const unichar_t str_2fd0[] = { 0x9f3b, 0 }; static const unichar_t str_2fd1[] = { 0x9f4a, 0 }; static const unichar_t str_2fd2[] = { 0x9f52, 0 }; static const unichar_t str_2fd3[] = { 0x9f8d, 0 }; static const unichar_t str_2fd4[] = { 0x9f9c, 0 }; static const unichar_t str_2fd5[] = { 0x9fa0, 0 }; static const unichar_t str_3000[] = { 0x0020, 0 }; static const unichar_t str_3001[] = { 0x002c, 0 }; static const unichar_t str_3008[] = { 0x003c, 0 }; static const unichar_t str_3009[] = { 0x003e, 0 }; static const unichar_t str_300a[] = { 0x00ab, 0 }; static const unichar_t str_300b[] = { 0x00bb, 0 }; static const unichar_t str_3036[] = { 0x3012, 0 }; static const unichar_t str_3038[] = { 0x5341, 0 }; static const unichar_t str_3039[] = { 0x5344, 0 }; static const unichar_t str_303a[] = { 0x5345, 0 }; static const unichar_t str_304c[] = { 0x304b, 0x3099, 0 }; static const unichar_t str_304e[] = { 0x304d, 0x3099, 0 }; static const unichar_t str_3050[] = { 0x304f, 0x3099, 0 }; static const unichar_t str_3052[] = { 0x3051, 0x3099, 0 }; static const unichar_t str_3054[] = { 0x3053, 0x3099, 0 }; static const unichar_t str_3056[] = { 0x3055, 0x3099, 0 }; static const unichar_t str_3058[] = { 0x3057, 0x3099, 0 }; static const unichar_t str_305a[] = { 0x3059, 0x3099, 0 }; static const unichar_t str_305c[] = { 0x305b, 0x3099, 0 }; static const unichar_t str_305e[] = { 0x305d, 0x3099, 0 }; static const unichar_t str_3060[] = { 0x305f, 0x3099, 0 }; static const unichar_t str_3062[] = { 0x3061, 0x3099, 0 }; static const unichar_t str_3065[] = { 0x3064, 0x3099, 0 }; static const unichar_t str_3067[] = { 0x3066, 0x3099, 0 }; static const unichar_t str_3069[] = { 0x3068, 0x3099, 0 }; static const unichar_t str_3070[] = { 0x306f, 0x3099, 0 }; static const unichar_t str_3071[] = { 0x306f, 0x309a, 0 }; static const unichar_t str_3073[] = { 0x3072, 0x3099, 0 }; static const unichar_t str_3074[] = { 0x3072, 0x309a, 0 }; static const unichar_t str_3076[] = { 0x3075, 0x3099, 0 }; static const unichar_t str_3077[] = { 0x3075, 0x309a, 0 }; static const unichar_t str_3079[] = { 0x3078, 0x3099, 0 }; static const unichar_t str_307a[] = { 0x3078, 0x309a, 0 }; static const unichar_t str_307c[] = { 0x307b, 0x3099, 0 }; static const unichar_t str_307d[] = { 0x307b, 0x309a, 0 }; static const unichar_t str_3094[] = { 0x3046, 0x3099, 0 }; static const unichar_t str_309b[] = { 0x0020, 0x3099, 0 }; static const unichar_t str_309c[] = { 0x0020, 0x309a, 0 }; static const unichar_t str_309e[] = { 0x309d, 0x3099, 0 }; static const unichar_t str_309f[] = { 0x3088, 0x308a, 0 }; static const unichar_t str_30ac[] = { 0x30ab, 0x3099, 0 }; static const unichar_t str_30ae[] = { 0x30ad, 0x3099, 0 }; static const unichar_t str_30b0[] = { 0x30af, 0x3099, 0 }; static const unichar_t str_30b2[] = { 0x30b1, 0x3099, 0 }; static const unichar_t str_30b4[] = { 0x30b3, 0x3099, 0 }; static const unichar_t str_30b6[] = { 0x30b5, 0x3099, 0 }; static const unichar_t str_30b8[] = { 0x30b7, 0x3099, 0 }; static const unichar_t str_30ba[] = { 0x30b9, 0x3099, 0 }; static const unichar_t str_30bc[] = { 0x30bb, 0x3099, 0 }; static const unichar_t str_30be[] = { 0x30bd, 0x3099, 0 }; static const unichar_t str_30c0[] = { 0x30bf, 0x3099, 0 }; static const unichar_t str_30c2[] = { 0x30c1, 0x3099, 0 }; static const unichar_t str_30c5[] = { 0x30c4, 0x3099, 0 }; static const unichar_t str_30c7[] = { 0x30c6, 0x3099, 0 }; static const unichar_t str_30c9[] = { 0x30c8, 0x3099, 0 }; static const unichar_t str_30d0[] = { 0x30cf, 0x3099, 0 }; static const unichar_t str_30d1[] = { 0x30cf, 0x309a, 0 }; static const unichar_t str_30d3[] = { 0x30d2, 0x3099, 0 }; static const unichar_t str_30d4[] = { 0x30d2, 0x309a, 0 }; static const unichar_t str_30d6[] = { 0x30d5, 0x3099, 0 }; static const unichar_t str_30d7[] = { 0x30d5, 0x309a, 0 }; static const unichar_t str_30d9[] = { 0x30d8, 0x3099, 0 }; static const unichar_t str_30da[] = { 0x30d8, 0x309a, 0 }; static const unichar_t str_30dc[] = { 0x30db, 0x3099, 0 }; static const unichar_t str_30dd[] = { 0x30db, 0x309a, 0 }; static const unichar_t str_30f4[] = { 0x30a6, 0x3099, 0 }; static const unichar_t str_30f7[] = { 0x30ef, 0x3099, 0 }; static const unichar_t str_30f8[] = { 0x30f0, 0x3099, 0 }; static const unichar_t str_30f9[] = { 0x30f1, 0x3099, 0 }; static const unichar_t str_30fa[] = { 0x30f2, 0x3099, 0 }; static const unichar_t str_30fe[] = { 0x30fd, 0x3099, 0 }; static const unichar_t str_30ff[] = { 0x30b3, 0x30c8, 0 }; static const unichar_t str_3131[] = { 0x1100, 0 }; static const unichar_t str_3132[] = { 0x1101, 0 }; static const unichar_t str_3133[] = { 0x11aa, 0 }; static const unichar_t str_3134[] = { 0x1102, 0 }; static const unichar_t str_3135[] = { 0x11ac, 0 }; static const unichar_t str_3136[] = { 0x11ad, 0 }; static const unichar_t str_3137[] = { 0x1103, 0 }; static const unichar_t str_3138[] = { 0x1104, 0 }; static const unichar_t str_3139[] = { 0x1105, 0 }; static const unichar_t str_313a[] = { 0x11b0, 0 }; static const unichar_t str_313b[] = { 0x11b1, 0 }; static const unichar_t str_313c[] = { 0x11b2, 0 }; static const unichar_t str_313d[] = { 0x11b3, 0 }; static const unichar_t str_313e[] = { 0x11b4, 0 }; static const unichar_t str_313f[] = { 0x11b5, 0 }; static const unichar_t str_3140[] = { 0x111a, 0 }; static const unichar_t str_3141[] = { 0x1106, 0 }; static const unichar_t str_3142[] = { 0x1107, 0 }; static const unichar_t str_3143[] = { 0x1108, 0 }; static const unichar_t str_3144[] = { 0x1121, 0 }; static const unichar_t str_3145[] = { 0x1109, 0 }; static const unichar_t str_3146[] = { 0x110a, 0 }; static const unichar_t str_3147[] = { 0x110b, 0 }; static const unichar_t str_3148[] = { 0x110c, 0 }; static const unichar_t str_3149[] = { 0x110d, 0 }; static const unichar_t str_314a[] = { 0x110e, 0 }; static const unichar_t str_314b[] = { 0x110f, 0 }; static const unichar_t str_314c[] = { 0x1110, 0 }; static const unichar_t str_314d[] = { 0x1111, 0 }; static const unichar_t str_314e[] = { 0x1112, 0 }; static const unichar_t str_314f[] = { 0x1161, 0 }; static const unichar_t str_3150[] = { 0x1162, 0 }; static const unichar_t str_3151[] = { 0x1163, 0 }; static const unichar_t str_3152[] = { 0x1164, 0 }; static const unichar_t str_3153[] = { 0x1165, 0 }; static const unichar_t str_3154[] = { 0x1166, 0 }; static const unichar_t str_3155[] = { 0x1167, 0 }; static const unichar_t str_3156[] = { 0x1168, 0 }; static const unichar_t str_3157[] = { 0x1169, 0 }; static const unichar_t str_3158[] = { 0x116a, 0 }; static const unichar_t str_3159[] = { 0x116b, 0 }; static const unichar_t str_315a[] = { 0x116c, 0 }; static const unichar_t str_315b[] = { 0x116d, 0 }; static const unichar_t str_315c[] = { 0x116e, 0 }; static const unichar_t str_315d[] = { 0x116f, 0 }; static const unichar_t str_315e[] = { 0x1170, 0 }; static const unichar_t str_315f[] = { 0x1171, 0 }; static const unichar_t str_3160[] = { 0x1172, 0 }; static const unichar_t str_3161[] = { 0x1173, 0 }; static const unichar_t str_3162[] = { 0x1174, 0 }; static const unichar_t str_3163[] = { 0x1175, 0 }; static const unichar_t str_3164[] = { 0x1160, 0 }; static const unichar_t str_3165[] = { 0x1114, 0 }; static const unichar_t str_3166[] = { 0x1115, 0 }; static const unichar_t str_3167[] = { 0x11c7, 0 }; static const unichar_t str_3168[] = { 0x11c8, 0 }; static const unichar_t str_3169[] = { 0x11cc, 0 }; static const unichar_t str_316a[] = { 0x11ce, 0 }; static const unichar_t str_316b[] = { 0x11d3, 0 }; static const unichar_t str_316c[] = { 0x11d7, 0 }; static const unichar_t str_316d[] = { 0x11d9, 0 }; static const unichar_t str_316e[] = { 0x111c, 0 }; static const unichar_t str_316f[] = { 0x11dd, 0 }; static const unichar_t str_3170[] = { 0x11df, 0 }; static const unichar_t str_3171[] = { 0x111d, 0 }; static const unichar_t str_3172[] = { 0x111e, 0 }; static const unichar_t str_3173[] = { 0x1120, 0 }; static const unichar_t str_3174[] = { 0x1122, 0 }; static const unichar_t str_3175[] = { 0x1123, 0 }; static const unichar_t str_3176[] = { 0x1127, 0 }; static const unichar_t str_3177[] = { 0x1129, 0 }; static const unichar_t str_3178[] = { 0x112b, 0 }; static const unichar_t str_3179[] = { 0x112c, 0 }; static const unichar_t str_317a[] = { 0x112d, 0 }; static const unichar_t str_317b[] = { 0x112e, 0 }; static const unichar_t str_317c[] = { 0x112f, 0 }; static const unichar_t str_317d[] = { 0x1132, 0 }; static const unichar_t str_317e[] = { 0x1136, 0 }; static const unichar_t str_317f[] = { 0x1140, 0 }; static const unichar_t str_3180[] = { 0x1147, 0 }; static const unichar_t str_3181[] = { 0x114c, 0 }; static const unichar_t str_3182[] = { 0x11f1, 0 }; static const unichar_t str_3183[] = { 0x11f2, 0 }; static const unichar_t str_3184[] = { 0x1157, 0 }; static const unichar_t str_3185[] = { 0x1158, 0 }; static const unichar_t str_3186[] = { 0x1159, 0 }; static const unichar_t str_3187[] = { 0x1184, 0 }; static const unichar_t str_3188[] = { 0x1185, 0 }; static const unichar_t str_3189[] = { 0x1188, 0 }; static const unichar_t str_318a[] = { 0x1191, 0 }; static const unichar_t str_318b[] = { 0x1192, 0 }; static const unichar_t str_318c[] = { 0x1194, 0 }; static const unichar_t str_318d[] = { 0x119e, 0 }; static const unichar_t str_318e[] = { 0x11a1, 0 }; static const unichar_t str_3192[] = { 0x4e00, 0 }; static const unichar_t str_3193[] = { 0x4e8c, 0 }; static const unichar_t str_3194[] = { 0x4e09, 0 }; static const unichar_t str_3195[] = { 0x56db, 0 }; static const unichar_t str_3196[] = { 0x4e0a, 0 }; static const unichar_t str_3197[] = { 0x4e2d, 0 }; static const unichar_t str_3198[] = { 0x4e0b, 0 }; static const unichar_t str_3199[] = { 0x7532, 0 }; static const unichar_t str_319a[] = { 0x4e59, 0 }; static const unichar_t str_319b[] = { 0x4e19, 0 }; static const unichar_t str_319c[] = { 0x4e01, 0 }; static const unichar_t str_319d[] = { 0x5929, 0 }; static const unichar_t str_319e[] = { 0x5730, 0 }; static const unichar_t str_319f[] = { 0x4eba, 0 }; static const unichar_t str_3200[] = { 0x0028, 0x1100, 0x0029, 0 }; static const unichar_t str_3201[] = { 0x0028, 0x1102, 0x0029, 0 }; static const unichar_t str_3202[] = { 0x0028, 0x1103, 0x0029, 0 }; static const unichar_t str_3203[] = { 0x0028, 0x1105, 0x0029, 0 }; static const unichar_t str_3204[] = { 0x0028, 0x1106, 0x0029, 0 }; static const unichar_t str_3205[] = { 0x0028, 0x1107, 0x0029, 0 }; static const unichar_t str_3206[] = { 0x0028, 0x1109, 0x0029, 0 }; static const unichar_t str_3207[] = { 0x0028, 0x110b, 0x0029, 0 }; static const unichar_t str_3208[] = { 0x0028, 0x110c, 0x0029, 0 }; static const unichar_t str_3209[] = { 0x0028, 0x110e, 0x0029, 0 }; static const unichar_t str_320a[] = { 0x0028, 0x110f, 0x0029, 0 }; static const unichar_t str_320b[] = { 0x0028, 0x1110, 0x0029, 0 }; static const unichar_t str_320c[] = { 0x0028, 0x1111, 0x0029, 0 }; static const unichar_t str_320d[] = { 0x0028, 0x1112, 0x0029, 0 }; static const unichar_t str_320e[] = { 0x0028, 0x1100, 0x1161, 0x0029, 0 }; static const unichar_t str_320f[] = { 0x0028, 0x1102, 0x1161, 0x0029, 0 }; static const unichar_t str_3210[] = { 0x0028, 0x1103, 0x1161, 0x0029, 0 }; static const unichar_t str_3211[] = { 0x0028, 0x1105, 0x1161, 0x0029, 0 }; static const unichar_t str_3212[] = { 0x0028, 0x1106, 0x1161, 0x0029, 0 }; static const unichar_t str_3213[] = { 0x0028, 0x1107, 0x1161, 0x0029, 0 }; static const unichar_t str_3214[] = { 0x0028, 0x1109, 0x1161, 0x0029, 0 }; static const unichar_t str_3215[] = { 0x0028, 0x110b, 0x1161, 0x0029, 0 }; static const unichar_t str_3216[] = { 0x0028, 0x110c, 0x1161, 0x0029, 0 }; static const unichar_t str_3217[] = { 0x0028, 0x110e, 0x1161, 0x0029, 0 }; static const unichar_t str_3218[] = { 0x0028, 0x110f, 0x1161, 0x0029, 0 }; static const unichar_t str_3219[] = { 0x0028, 0x1110, 0x1161, 0x0029, 0 }; static const unichar_t str_321a[] = { 0x0028, 0x1111, 0x1161, 0x0029, 0 }; static const unichar_t str_321b[] = { 0x0028, 0x1112, 0x1161, 0x0029, 0 }; static const unichar_t str_321c[] = { 0x0028, 0x110c, 0x116e, 0x0029, 0 }; static const unichar_t str_321d[] = { 0x0028, 0x110b, 0x1169, 0x110c, 0x1165, 0x11ab, 0x0029, 0 }; static const unichar_t str_321e[] = { 0x0028, 0x110b, 0x1169, 0x1112, 0x116e, 0x0029, 0 }; static const unichar_t str_3220[] = { 0x0028, 0x4e00, 0x0029, 0 }; static const unichar_t str_3221[] = { 0x0028, 0x4e8c, 0x0029, 0 }; static const unichar_t str_3222[] = { 0x0028, 0x4e09, 0x0029, 0 }; static const unichar_t str_3223[] = { 0x0028, 0x56db, 0x0029, 0 }; static const unichar_t str_3224[] = { 0x0028, 0x4e94, 0x0029, 0 }; static const unichar_t str_3225[] = { 0x0028, 0x516d, 0x0029, 0 }; static const unichar_t str_3226[] = { 0x0028, 0x4e03, 0x0029, 0 }; static const unichar_t str_3227[] = { 0x0028, 0x516b, 0x0029, 0 }; static const unichar_t str_3228[] = { 0x0028, 0x4e5d, 0x0029, 0 }; static const unichar_t str_3229[] = { 0x0028, 0x5341, 0x0029, 0 }; static const unichar_t str_322a[] = { 0x0028, 0x6708, 0x0029, 0 }; static const unichar_t str_322b[] = { 0x0028, 0x706b, 0x0029, 0 }; static const unichar_t str_322c[] = { 0x0028, 0x6c34, 0x0029, 0 }; static const unichar_t str_322d[] = { 0x0028, 0x6728, 0x0029, 0 }; static const unichar_t str_322e[] = { 0x0028, 0x91d1, 0x0029, 0 }; static const unichar_t str_322f[] = { 0x0028, 0x571f, 0x0029, 0 }; static const unichar_t str_3230[] = { 0x0028, 0x65e5, 0x0029, 0 }; static const unichar_t str_3231[] = { 0x0028, 0x682a, 0x0029, 0 }; static const unichar_t str_3232[] = { 0x0028, 0x6709, 0x0029, 0 }; static const unichar_t str_3233[] = { 0x0028, 0x793e, 0x0029, 0 }; static const unichar_t str_3234[] = { 0x0028, 0x540d, 0x0029, 0 }; static const unichar_t str_3235[] = { 0x0028, 0x7279, 0x0029, 0 }; static const unichar_t str_3236[] = { 0x0028, 0x8ca1, 0x0029, 0 }; static const unichar_t str_3237[] = { 0x0028, 0x795d, 0x0029, 0 }; static const unichar_t str_3238[] = { 0x0028, 0x52b4, 0x0029, 0 }; static const unichar_t str_3239[] = { 0x0028, 0x4ee3, 0x0029, 0 }; static const unichar_t str_323a[] = { 0x0028, 0x547c, 0x0029, 0 }; static const unichar_t str_323b[] = { 0x0028, 0x5b66, 0x0029, 0 }; static const unichar_t str_323c[] = { 0x0028, 0x76e3, 0x0029, 0 }; static const unichar_t str_323d[] = { 0x0028, 0x4f01, 0x0029, 0 }; static const unichar_t str_323e[] = { 0x0028, 0x8cc7, 0x0029, 0 }; static const unichar_t str_323f[] = { 0x0028, 0x5354, 0x0029, 0 }; static const unichar_t str_3240[] = { 0x0028, 0x796d, 0x0029, 0 }; static const unichar_t str_3241[] = { 0x0028, 0x4f11, 0x0029, 0 }; static const unichar_t str_3242[] = { 0x0028, 0x81ea, 0x0029, 0 }; static const unichar_t str_3243[] = { 0x0028, 0x81f3, 0x0029, 0 }; static const unichar_t str_3244[] = { 0x554f, 0x20dd, 0 }; static const unichar_t str_3245[] = { 0x5e7c, 0x20dd, 0 }; static const unichar_t str_3246[] = { 0x6587, 0x20dd, 0 }; static const unichar_t str_3247[] = { 0x7b8f, 0x20dd, 0 }; static const unichar_t str_3250[] = { 0x0050, 0x0054, 0x0045, 0 }; static const unichar_t str_3251[] = { 0x0032, 0x0031, 0x20dd, 0 }; static const unichar_t str_3252[] = { 0x0032, 0x0032, 0x20dd, 0 }; static const unichar_t str_3253[] = { 0x0032, 0x0033, 0x20dd, 0 }; static const unichar_t str_3254[] = { 0x0032, 0x0034, 0x20dd, 0 }; static const unichar_t str_3255[] = { 0x0032, 0x0035, 0x20dd, 0 }; static const unichar_t str_3256[] = { 0x0032, 0x0036, 0x20dd, 0 }; static const unichar_t str_3257[] = { 0x0032, 0x0037, 0x20dd, 0 }; static const unichar_t str_3258[] = { 0x0032, 0x0038, 0x20dd, 0 }; static const unichar_t str_3259[] = { 0x0032, 0x0039, 0x20dd, 0 }; static const unichar_t str_325a[] = { 0x0033, 0x0030, 0x20dd, 0 }; static const unichar_t str_325b[] = { 0x0033, 0x0031, 0x20dd, 0 }; static const unichar_t str_325c[] = { 0x0033, 0x0032, 0x20dd, 0 }; static const unichar_t str_325d[] = { 0x0033, 0x0033, 0x20dd, 0 }; static const unichar_t str_325e[] = { 0x0033, 0x0034, 0x20dd, 0 }; static const unichar_t str_325f[] = { 0x0033, 0x0035, 0x20dd, 0 }; static const unichar_t str_3260[] = { 0x1100, 0x20dd, 0 }; static const unichar_t str_3261[] = { 0x1102, 0x20dd, 0 }; static const unichar_t str_3262[] = { 0x1103, 0x20dd, 0 }; static const unichar_t str_3263[] = { 0x1105, 0x20dd, 0 }; static const unichar_t str_3264[] = { 0x1106, 0x20dd, 0 }; static const unichar_t str_3265[] = { 0x1107, 0x20dd, 0 }; static const unichar_t str_3266[] = { 0x1109, 0x20dd, 0 }; static const unichar_t str_3267[] = { 0x110b, 0x20dd, 0 }; static const unichar_t str_3268[] = { 0x110c, 0x20dd, 0 }; static const unichar_t str_3269[] = { 0x110e, 0x20dd, 0 }; static const unichar_t str_326a[] = { 0x110f, 0x20dd, 0 }; static const unichar_t str_326b[] = { 0x1110, 0x20dd, 0 }; static const unichar_t str_326c[] = { 0x1111, 0x20dd, 0 }; static const unichar_t str_326d[] = { 0x1112, 0x20dd, 0 }; static const unichar_t str_326e[] = { 0x1100, 0x1161, 0x20dd, 0 }; static const unichar_t str_326f[] = { 0x1102, 0x1161, 0x20dd, 0 }; static const unichar_t str_3270[] = { 0x1103, 0x1161, 0x20dd, 0 }; static const unichar_t str_3271[] = { 0x1105, 0x1161, 0x20dd, 0 }; static const unichar_t str_3272[] = { 0x1106, 0x1161, 0x20dd, 0 }; static const unichar_t str_3273[] = { 0x1107, 0x1161, 0x20dd, 0 }; static const unichar_t str_3274[] = { 0x1109, 0x1161, 0x20dd, 0 }; static const unichar_t str_3275[] = { 0x110b, 0x1161, 0x20dd, 0 }; static const unichar_t str_3276[] = { 0x110c, 0x1161, 0x20dd, 0 }; static const unichar_t str_3277[] = { 0x110e, 0x1161, 0x20dd, 0 }; static const unichar_t str_3278[] = { 0x110f, 0x1161, 0x20dd, 0 }; static const unichar_t str_3279[] = { 0x1110, 0x1161, 0x20dd, 0 }; static const unichar_t str_327a[] = { 0x1111, 0x1161, 0x20dd, 0 }; static const unichar_t str_327b[] = { 0x1112, 0x1161, 0x20dd, 0 }; static const unichar_t str_327c[] = { 0x110e, 0x1161, 0x11b7, 0x1100, 0x1169, 0x20dd, 0 }; static const unichar_t str_327d[] = { 0x110c, 0x116e, 0x110b, 0x1174, 0x20dd, 0 }; static const unichar_t str_327e[] = { 0x110b, 0x116e, 0x20dd, 0 }; static const unichar_t str_3280[] = { 0x4e00, 0x20dd, 0 }; static const unichar_t str_3281[] = { 0x4e8c, 0x20dd, 0 }; static const unichar_t str_3282[] = { 0x4e09, 0x20dd, 0 }; static const unichar_t str_3283[] = { 0x56db, 0x20dd, 0 }; static const unichar_t str_3284[] = { 0x4e94, 0x20dd, 0 }; static const unichar_t str_3285[] = { 0x516d, 0x20dd, 0 }; static const unichar_t str_3286[] = { 0x4e03, 0x20dd, 0 }; static const unichar_t str_3287[] = { 0x516b, 0x20dd, 0 }; static const unichar_t str_3288[] = { 0x4e5d, 0x20dd, 0 }; static const unichar_t str_3289[] = { 0x5341, 0x20dd, 0 }; static const unichar_t str_328a[] = { 0x6708, 0x20dd, 0 }; static const unichar_t str_328b[] = { 0x706b, 0x20dd, 0 }; static const unichar_t str_328c[] = { 0x6c34, 0x20dd, 0 }; static const unichar_t str_328d[] = { 0x6728, 0x20dd, 0 }; static const unichar_t str_328e[] = { 0x91d1, 0x20dd, 0 }; static const unichar_t str_328f[] = { 0x571f, 0x20dd, 0 }; static const unichar_t str_3290[] = { 0x65e5, 0x20dd, 0 }; static const unichar_t str_3291[] = { 0x682a, 0x20dd, 0 }; static const unichar_t str_3292[] = { 0x6709, 0x20dd, 0 }; static const unichar_t str_3293[] = { 0x793e, 0x20dd, 0 }; static const unichar_t str_3294[] = { 0x540d, 0x20dd, 0 }; static const unichar_t str_3295[] = { 0x7279, 0x20dd, 0 }; static const unichar_t str_3296[] = { 0x8ca1, 0x20dd, 0 }; static const unichar_t str_3297[] = { 0x795d, 0x20dd, 0 }; static const unichar_t str_3298[] = { 0x52b4, 0x20dd, 0 }; static const unichar_t str_3299[] = { 0x79d8, 0x20dd, 0 }; static const unichar_t str_329a[] = { 0x7537, 0x20dd, 0 }; static const unichar_t str_329b[] = { 0x5973, 0x20dd, 0 }; static const unichar_t str_329c[] = { 0x9069, 0x20dd, 0 }; static const unichar_t str_329d[] = { 0x512a, 0x20dd, 0 }; static const unichar_t str_329e[] = { 0x5370, 0x20dd, 0 }; static const unichar_t str_329f[] = { 0x6ce8, 0x20dd, 0 }; static const unichar_t str_32a0[] = { 0x9805, 0x20dd, 0 }; static const unichar_t str_32a1[] = { 0x4f11, 0x20dd, 0 }; static const unichar_t str_32a2[] = { 0x5199, 0x20dd, 0 }; static const unichar_t str_32a3[] = { 0x6b63, 0x20dd, 0 }; static const unichar_t str_32a4[] = { 0x4e0a, 0x20dd, 0 }; static const unichar_t str_32a5[] = { 0x4e2d, 0x20dd, 0 }; static const unichar_t str_32a6[] = { 0x4e0b, 0x20dd, 0 }; static const unichar_t str_32a7[] = { 0x5de6, 0x20dd, 0 }; static const unichar_t str_32a8[] = { 0x53f3, 0x20dd, 0 }; static const unichar_t str_32a9[] = { 0x533b, 0x20dd, 0 }; static const unichar_t str_32aa[] = { 0x5b97, 0x20dd, 0 }; static const unichar_t str_32ab[] = { 0x5b66, 0x20dd, 0 }; static const unichar_t str_32ac[] = { 0x76e3, 0x20dd, 0 }; static const unichar_t str_32ad[] = { 0x4f01, 0x20dd, 0 }; static const unichar_t str_32ae[] = { 0x8cc7, 0x20dd, 0 }; static const unichar_t str_32af[] = { 0x5354, 0x20dd, 0 }; static const unichar_t str_32b0[] = { 0x591c, 0x20dd, 0 }; static const unichar_t str_32b1[] = { 0x0033, 0x0036, 0x20dd, 0 }; static const unichar_t str_32b2[] = { 0x0033, 0x0037, 0x20dd, 0 }; static const unichar_t str_32b3[] = { 0x0033, 0x0038, 0x20dd, 0 }; static const unichar_t str_32b4[] = { 0x0033, 0x0039, 0x20dd, 0 }; static const unichar_t str_32b5[] = { 0x0034, 0x0030, 0x20dd, 0 }; static const unichar_t str_32b6[] = { 0x0034, 0x0031, 0x20dd, 0 }; static const unichar_t str_32b7[] = { 0x0034, 0x0032, 0x20dd, 0 }; static const unichar_t str_32b8[] = { 0x0034, 0x0033, 0x20dd, 0 }; static const unichar_t str_32b9[] = { 0x0034, 0x0034, 0x20dd, 0 }; static const unichar_t str_32ba[] = { 0x0034, 0x0035, 0x20dd, 0 }; static const unichar_t str_32bb[] = { 0x0034, 0x0036, 0x20dd, 0 }; static const unichar_t str_32bc[] = { 0x0034, 0x0037, 0x20dd, 0 }; static const unichar_t str_32bd[] = { 0x0034, 0x0038, 0x20dd, 0 }; static const unichar_t str_32be[] = { 0x0034, 0x0039, 0x20dd, 0 }; static const unichar_t str_32bf[] = { 0x0035, 0x0030, 0x20dd, 0 }; static const unichar_t str_32c0[] = { 0x0031, 0x6708, 0 }; static const unichar_t str_32c1[] = { 0x0032, 0x6708, 0 }; static const unichar_t str_32c2[] = { 0x0033, 0x6708, 0 }; static const unichar_t str_32c3[] = { 0x0034, 0x6708, 0 }; static const unichar_t str_32c4[] = { 0x0035, 0x6708, 0 }; static const unichar_t str_32c5[] = { 0x0036, 0x6708, 0 }; static const unichar_t str_32c6[] = { 0x0037, 0x6708, 0 }; static const unichar_t str_32c7[] = { 0x0038, 0x6708, 0 }; static const unichar_t str_32c8[] = { 0x0039, 0x6708, 0 }; static const unichar_t str_32c9[] = { 0x0031, 0x0030, 0x6708, 0 }; static const unichar_t str_32ca[] = { 0x0031, 0x0031, 0x6708, 0 }; static const unichar_t str_32cb[] = { 0x0031, 0x0032, 0x6708, 0 }; static const unichar_t str_32cc[] = { 0x0048, 0x0067, 0 }; static const unichar_t str_32cd[] = { 0x0065, 0x0072, 0x0067, 0 }; static const unichar_t str_32ce[] = { 0x0065, 0x0056, 0 }; static const unichar_t str_32cf[] = { 0x004c, 0x0054, 0x0044, 0 }; static const unichar_t str_32d0[] = { 0x30a2, 0x20dd, 0 }; static const unichar_t str_32d1[] = { 0x30a4, 0x20dd, 0 }; static const unichar_t str_32d2[] = { 0x30a6, 0x20dd, 0 }; static const unichar_t str_32d3[] = { 0x30a8, 0x20dd, 0 }; static const unichar_t str_32d4[] = { 0x30aa, 0x20dd, 0 }; static const unichar_t str_32d5[] = { 0x30ab, 0x20dd, 0 }; static const unichar_t str_32d6[] = { 0x30ad, 0x20dd, 0 }; static const unichar_t str_32d7[] = { 0x30af, 0x20dd, 0 }; static const unichar_t str_32d8[] = { 0x30b1, 0x20dd, 0 }; static const unichar_t str_32d9[] = { 0x30b3, 0x20dd, 0 }; static const unichar_t str_32da[] = { 0x30b5, 0x20dd, 0 }; static const unichar_t str_32db[] = { 0x30b7, 0x20dd, 0 }; static const unichar_t str_32dc[] = { 0x30b9, 0x20dd, 0 }; static const unichar_t str_32dd[] = { 0x30bb, 0x20dd, 0 }; static const unichar_t str_32de[] = { 0x30bd, 0x20dd, 0 }; static const unichar_t str_32df[] = { 0x30bf, 0x20dd, 0 }; static const unichar_t str_32e0[] = { 0x30c1, 0x20dd, 0 }; static const unichar_t str_32e1[] = { 0x30c4, 0x20dd, 0 }; static const unichar_t str_32e2[] = { 0x30c6, 0x20dd, 0 }; static const unichar_t str_32e3[] = { 0x30c8, 0x20dd, 0 }; static const unichar_t str_32e4[] = { 0x30ca, 0x20dd, 0 }; static const unichar_t str_32e5[] = { 0x30cb, 0x20dd, 0 }; static const unichar_t str_32e6[] = { 0x30cc, 0x20dd, 0 }; static const unichar_t str_32e7[] = { 0x30cd, 0x20dd, 0 }; static const unichar_t str_32e8[] = { 0x30ce, 0x20dd, 0 }; static const unichar_t str_32e9[] = { 0x30cf, 0x20dd, 0 }; static const unichar_t str_32ea[] = { 0x30d2, 0x20dd, 0 }; static const unichar_t str_32eb[] = { 0x30d5, 0x20dd, 0 }; static const unichar_t str_32ec[] = { 0x30d8, 0x20dd, 0 }; static const unichar_t str_32ed[] = { 0x30db, 0x20dd, 0 }; static const unichar_t str_32ee[] = { 0x30de, 0x20dd, 0 }; static const unichar_t str_32ef[] = { 0x30df, 0x20dd, 0 }; static const unichar_t str_32f0[] = { 0x30e0, 0x20dd, 0 }; static const unichar_t str_32f1[] = { 0x30e1, 0x20dd, 0 }; static const unichar_t str_32f2[] = { 0x30e2, 0x20dd, 0 }; static const unichar_t str_32f3[] = { 0x30e4, 0x20dd, 0 }; static const unichar_t str_32f4[] = { 0x30e6, 0x20dd, 0 }; static const unichar_t str_32f5[] = { 0x30e8, 0x20dd, 0 }; static const unichar_t str_32f6[] = { 0x30e9, 0x20dd, 0 }; static const unichar_t str_32f7[] = { 0x30ea, 0x20dd, 0 }; static const unichar_t str_32f8[] = { 0x30eb, 0x20dd, 0 }; static const unichar_t str_32f9[] = { 0x30ec, 0x20dd, 0 }; static const unichar_t str_32fa[] = { 0x30ed, 0x20dd, 0 }; static const unichar_t str_32fb[] = { 0x30ef, 0x20dd, 0 }; static const unichar_t str_32fc[] = { 0x30f0, 0x20dd, 0 }; static const unichar_t str_32fd[] = { 0x30f1, 0x20dd, 0 }; static const unichar_t str_32fe[] = { 0x30f2, 0x20dd, 0 }; static const unichar_t str_3300[] = { 0x30a2, 0x30d1, 0x30fc, 0x30c8, 0 }; static const unichar_t str_3301[] = { 0x30a2, 0x30eb, 0x30d5, 0x30a1, 0 }; static const unichar_t str_3302[] = { 0x30a2, 0x30f3, 0x30da, 0x30a2, 0 }; static const unichar_t str_3303[] = { 0x30a2, 0x30fc, 0x30eb, 0 }; static const unichar_t str_3304[] = { 0x30a4, 0x30cb, 0x30f3, 0x30b0, 0 }; static const unichar_t str_3305[] = { 0x30a4, 0x30f3, 0x30c1, 0 }; static const unichar_t str_3306[] = { 0x30a6, 0x30a9, 0x30f3, 0 }; static const unichar_t str_3307[] = { 0x30a8, 0x30b9, 0x30af, 0x30fc, 0x30c9, 0 }; static const unichar_t str_3308[] = { 0x30a8, 0x30fc, 0x30ab, 0x30fc, 0 }; static const unichar_t str_3309[] = { 0x30aa, 0x30f3, 0x30b9, 0 }; static const unichar_t str_330a[] = { 0x30aa, 0x30fc, 0x30e0, 0 }; static const unichar_t str_330b[] = { 0x30ab, 0x30a4, 0x30ea, 0 }; static const unichar_t str_330c[] = { 0x30ab, 0x30e9, 0x30c3, 0x30c8, 0 }; static const unichar_t str_330d[] = { 0x30ab, 0x30ed, 0x30ea, 0x30fc, 0 }; static const unichar_t str_330e[] = { 0x30ac, 0x30ed, 0x30f3, 0 }; static const unichar_t str_330f[] = { 0x30ac, 0x30f3, 0x30de, 0 }; static const unichar_t str_3310[] = { 0x30ae, 0x30ac, 0 }; static const unichar_t str_3311[] = { 0x30ae, 0x30cb, 0x30fc, 0 }; static const unichar_t str_3312[] = { 0x30ad, 0x30e5, 0x30ea, 0x30fc, 0 }; static const unichar_t str_3313[] = { 0x30ae, 0x30eb, 0x30c0, 0x30fc, 0 }; static const unichar_t str_3314[] = { 0x30ad, 0x30ed, 0 }; static const unichar_t str_3315[] = { 0x30ad, 0x30ed, 0x30b0, 0x30e9, 0x30e0, 0 }; static const unichar_t str_3316[] = { 0x30ad, 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0 }; static const unichar_t str_3317[] = { 0x30ad, 0x30ed, 0x30ef, 0x30c3, 0x30c8, 0 }; static const unichar_t str_3318[] = { 0x30b0, 0x30e9, 0x30e0, 0 }; static const unichar_t str_3319[] = { 0x30b0, 0x30e9, 0x30e0, 0x30c8, 0x30f3, 0 }; static const unichar_t str_331a[] = { 0x30af, 0x30eb, 0x30bc, 0x30a4, 0x30ed, 0 }; static const unichar_t str_331b[] = { 0x30af, 0x30ed, 0x30fc, 0x30cd, 0 }; static const unichar_t str_331c[] = { 0x30b1, 0x30fc, 0x30b9, 0 }; static const unichar_t str_331d[] = { 0x30b3, 0x30eb, 0x30ca, 0 }; static const unichar_t str_331e[] = { 0x30b3, 0x30fc, 0x30dd, 0 }; static const unichar_t str_331f[] = { 0x30b5, 0x30a4, 0x30af, 0x30eb, 0 }; static const unichar_t str_3320[] = { 0x30b5, 0x30f3, 0x30c1, 0x30fc, 0x30e0, 0 }; static const unichar_t str_3321[] = { 0x30b7, 0x30ea, 0x30f3, 0x30b0, 0 }; static const unichar_t str_3322[] = { 0x30bb, 0x30f3, 0x30c1, 0 }; static const unichar_t str_3323[] = { 0x30bb, 0x30f3, 0x30c8, 0 }; static const unichar_t str_3324[] = { 0x30c0, 0x30fc, 0x30b9, 0 }; static const unichar_t str_3325[] = { 0x30c7, 0x30b7, 0 }; static const unichar_t str_3326[] = { 0x30c9, 0x30eb, 0 }; static const unichar_t str_3327[] = { 0x30c8, 0x30f3, 0 }; static const unichar_t str_3328[] = { 0x30ca, 0x30ce, 0 }; static const unichar_t str_3329[] = { 0x30ce, 0x30c3, 0x30c8, 0 }; static const unichar_t str_332a[] = { 0x30cf, 0x30a4, 0x30c4, 0 }; static const unichar_t str_332b[] = { 0x30d1, 0x30fc, 0x30bb, 0x30f3, 0x30c8, 0 }; static const unichar_t str_332c[] = { 0x30d1, 0x30fc, 0x30c4, 0 }; static const unichar_t str_332d[] = { 0x30d0, 0x30fc, 0x30ec, 0x30eb, 0 }; static const unichar_t str_332e[] = { 0x30d4, 0x30a2, 0x30b9, 0x30c8, 0x30eb, 0 }; static const unichar_t str_332f[] = { 0x30d4, 0x30af, 0x30eb, 0 }; static const unichar_t str_3330[] = { 0x30d4, 0x30b3, 0 }; static const unichar_t str_3331[] = { 0x30d3, 0x30eb, 0 }; static const unichar_t str_3332[] = { 0x30d5, 0x30a1, 0x30e9, 0x30c3, 0x30c9, 0 }; static const unichar_t str_3333[] = { 0x30d5, 0x30a3, 0x30fc, 0x30c8, 0 }; static const unichar_t str_3334[] = { 0x30d6, 0x30c3, 0x30b7, 0x30a7, 0x30eb, 0 }; static const unichar_t str_3335[] = { 0x30d5, 0x30e9, 0x30f3, 0 }; static const unichar_t str_3336[] = { 0x30d8, 0x30af, 0x30bf, 0x30fc, 0x30eb, 0 }; static const unichar_t str_3337[] = { 0x30da, 0x30bd, 0 }; static const unichar_t str_3338[] = { 0x30da, 0x30cb, 0x30d2, 0 }; static const unichar_t str_3339[] = { 0x30d8, 0x30eb, 0x30c4, 0 }; static const unichar_t str_333a[] = { 0x30da, 0x30f3, 0x30b9, 0 }; static const unichar_t str_333b[] = { 0x30da, 0x30fc, 0x30b8, 0 }; static const unichar_t str_333c[] = { 0x30d9, 0x30fc, 0x30bf, 0 }; static const unichar_t str_333d[] = { 0x30dd, 0x30a4, 0x30f3, 0x30c8, 0 }; static const unichar_t str_333e[] = { 0x30dc, 0x30eb, 0x30c8, 0 }; static const unichar_t str_333f[] = { 0x30db, 0x30f3, 0 }; static const unichar_t str_3340[] = { 0x30dd, 0x30f3, 0x30c9, 0 }; static const unichar_t str_3341[] = { 0x30db, 0x30fc, 0x30eb, 0 }; static const unichar_t str_3342[] = { 0x30db, 0x30fc, 0x30f3, 0 }; static const unichar_t str_3343[] = { 0x30de, 0x30a4, 0x30af, 0x30ed, 0 }; static const unichar_t str_3344[] = { 0x30de, 0x30a4, 0x30eb, 0 }; static const unichar_t str_3345[] = { 0x30de, 0x30c3, 0x30cf, 0 }; static const unichar_t str_3346[] = { 0x30de, 0x30eb, 0x30af, 0 }; static const unichar_t str_3347[] = { 0x30de, 0x30f3, 0x30b7, 0x30e7, 0x30f3, 0 }; static const unichar_t str_3348[] = { 0x30df, 0x30af, 0x30ed, 0x30f3, 0 }; static const unichar_t str_3349[] = { 0x30df, 0x30ea, 0 }; static const unichar_t str_334a[] = { 0x30df, 0x30ea, 0x30d0, 0x30fc, 0x30eb, 0 }; static const unichar_t str_334b[] = { 0x30e1, 0x30ac, 0 }; static const unichar_t str_334c[] = { 0x30e1, 0x30ac, 0x30c8, 0x30f3, 0 }; static const unichar_t str_334d[] = { 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0 }; static const unichar_t str_334e[] = { 0x30e4, 0x30fc, 0x30c9, 0 }; static const unichar_t str_334f[] = { 0x30e4, 0x30fc, 0x30eb, 0 }; static const unichar_t str_3350[] = { 0x30e6, 0x30a2, 0x30f3, 0 }; static const unichar_t str_3351[] = { 0x30ea, 0x30c3, 0x30c8, 0x30eb, 0 }; static const unichar_t str_3352[] = { 0x30ea, 0x30e9, 0 }; static const unichar_t str_3353[] = { 0x30eb, 0x30d4, 0x30fc, 0 }; static const unichar_t str_3354[] = { 0x30eb, 0x30fc, 0x30d6, 0x30eb, 0 }; static const unichar_t str_3355[] = { 0x30ec, 0x30e0, 0 }; static const unichar_t str_3356[] = { 0x30ec, 0x30f3, 0x30c8, 0x30b2, 0x30f3, 0 }; static const unichar_t str_3357[] = { 0x30ef, 0x30c3, 0x30c8, 0 }; static const unichar_t str_3358[] = { 0x0030, 0x70b9, 0 }; static const unichar_t str_3359[] = { 0x0031, 0x70b9, 0 }; static const unichar_t str_335a[] = { 0x0032, 0x70b9, 0 }; static const unichar_t str_335b[] = { 0x0033, 0x70b9, 0 }; static const unichar_t str_335c[] = { 0x0034, 0x70b9, 0 }; static const unichar_t str_335d[] = { 0x0035, 0x70b9, 0 }; static const unichar_t str_335e[] = { 0x0036, 0x70b9, 0 }; static const unichar_t str_335f[] = { 0x0037, 0x70b9, 0 }; static const unichar_t str_3360[] = { 0x0038, 0x70b9, 0 }; static const unichar_t str_3361[] = { 0x0039, 0x70b9, 0 }; static const unichar_t str_3362[] = { 0x0031, 0x0030, 0x70b9, 0 }; static const unichar_t str_3363[] = { 0x0031, 0x0031, 0x70b9, 0 }; static const unichar_t str_3364[] = { 0x0031, 0x0032, 0x70b9, 0 }; static const unichar_t str_3365[] = { 0x0031, 0x0033, 0x70b9, 0 }; static const unichar_t str_3366[] = { 0x0031, 0x0034, 0x70b9, 0 }; static const unichar_t str_3367[] = { 0x0031, 0x0035, 0x70b9, 0 }; static const unichar_t str_3368[] = { 0x0031, 0x0036, 0x70b9, 0 }; static const unichar_t str_3369[] = { 0x0031, 0x0037, 0x70b9, 0 }; static const unichar_t str_336a[] = { 0x0031, 0x0038, 0x70b9, 0 }; static const unichar_t str_336b[] = { 0x0031, 0x0039, 0x70b9, 0 }; static const unichar_t str_336c[] = { 0x0032, 0x0030, 0x70b9, 0 }; static const unichar_t str_336d[] = { 0x0032, 0x0031, 0x70b9, 0 }; static const unichar_t str_336e[] = { 0x0032, 0x0032, 0x70b9, 0 }; static const unichar_t str_336f[] = { 0x0032, 0x0033, 0x70b9, 0 }; static const unichar_t str_3370[] = { 0x0032, 0x0034, 0x70b9, 0 }; static const unichar_t str_3371[] = { 0x0068, 0x0050, 0x0061, 0 }; static const unichar_t str_3372[] = { 0x0064, 0x0061, 0 }; static const unichar_t str_3373[] = { 0x0041, 0x0055, 0 }; static const unichar_t str_3374[] = { 0x0062, 0x0061, 0x0072, 0 }; static const unichar_t str_3375[] = { 0x006f, 0x0056, 0 }; static const unichar_t str_3376[] = { 0x0070, 0x0063, 0 }; static const unichar_t str_3377[] = { 0x0064, 0x006d, 0 }; static const unichar_t str_3378[] = { 0x0064, 0x006d, 0x00b2, 0 }; static const unichar_t str_3379[] = { 0x0064, 0x006d, 0x00b3, 0 }; static const unichar_t str_337a[] = { 0x0049, 0x0055, 0 }; static const unichar_t str_337b[] = { 0x5e73, 0x6210, 0 }; static const unichar_t str_337c[] = { 0x662d, 0x548c, 0 }; static const unichar_t str_337d[] = { 0x5927, 0x6b63, 0 }; static const unichar_t str_337e[] = { 0x660e, 0x6cbb, 0 }; static const unichar_t str_337f[] = { 0x682a, 0x5f0f, 0x4f1a, 0x793e, 0 }; static const unichar_t str_3380[] = { 0x0070, 0x0041, 0 }; static const unichar_t str_3381[] = { 0x006e, 0x0041, 0 }; static const unichar_t str_3382[] = { 0x03bc, 0x0041, 0 }; static const unichar_t str_3383[] = { 0x006d, 0x0041, 0 }; static const unichar_t str_3384[] = { 0x006b, 0x0041, 0 }; static const unichar_t str_3385[] = { 0x004b, 0x0042, 0 }; static const unichar_t str_3386[] = { 0x004d, 0x0042, 0 }; static const unichar_t str_3387[] = { 0x0047, 0x0042, 0 }; static const unichar_t str_3388[] = { 0x0063, 0x0061, 0x006c, 0 }; static const unichar_t str_3389[] = { 0x006b, 0x0063, 0x0061, 0x006c, 0 }; static const unichar_t str_338a[] = { 0x0070, 0x0046, 0 }; static const unichar_t str_338b[] = { 0x006e, 0x0046, 0 }; static const unichar_t str_338c[] = { 0x03bc, 0x0046, 0 }; static const unichar_t str_338d[] = { 0x03bc, 0x0067, 0 }; static const unichar_t str_338e[] = { 0x006d, 0x0067, 0 }; static const unichar_t str_338f[] = { 0x006b, 0x0067, 0 }; static const unichar_t str_3390[] = { 0x0048, 0x007a, 0 }; static const unichar_t str_3391[] = { 0x006b, 0x0048, 0x007a, 0 }; static const unichar_t str_3392[] = { 0x004d, 0x0048, 0x007a, 0 }; static const unichar_t str_3393[] = { 0x0047, 0x0048, 0x007a, 0 }; static const unichar_t str_3394[] = { 0x0054, 0x0048, 0x007a, 0 }; static const unichar_t str_3395[] = { 0x03bc, 0x2113, 0 }; static const unichar_t str_3396[] = { 0x006d, 0x2113, 0 }; static const unichar_t str_3397[] = { 0x0064, 0x2113, 0 }; static const unichar_t str_3398[] = { 0x006b, 0x2113, 0 }; static const unichar_t str_3399[] = { 0x0066, 0x006d, 0 }; static const unichar_t str_339a[] = { 0x006e, 0x006d, 0 }; static const unichar_t str_339b[] = { 0x03bc, 0x006d, 0 }; static const unichar_t str_339c[] = { 0x006d, 0x006d, 0 }; static const unichar_t str_339d[] = { 0x0063, 0x006d, 0 }; static const unichar_t str_339e[] = { 0x006b, 0x006d, 0 }; static const unichar_t str_339f[] = { 0x006d, 0x006d, 0x00b2, 0 }; static const unichar_t str_33a0[] = { 0x0063, 0x006d, 0x00b2, 0 }; static const unichar_t str_33a1[] = { 0x006d, 0x00b2, 0 }; static const unichar_t str_33a2[] = { 0x006b, 0x006d, 0x00b2, 0 }; static const unichar_t str_33a3[] = { 0x006d, 0x006d, 0x00b3, 0 }; static const unichar_t str_33a4[] = { 0x0063, 0x006d, 0x00b3, 0 }; static const unichar_t str_33a5[] = { 0x006d, 0x00b3, 0 }; static const unichar_t str_33a6[] = { 0x006b, 0x006d, 0x00b3, 0 }; static const unichar_t str_33a7[] = { 0x006d, 0x2215, 0x0073, 0 }; static const unichar_t str_33a8[] = { 0x006d, 0x2215, 0x0073, 0x00b2, 0 }; static const unichar_t str_33a9[] = { 0x0050, 0x0061, 0 }; static const unichar_t str_33aa[] = { 0x006b, 0x0050, 0x0061, 0 }; static const unichar_t str_33ab[] = { 0x004d, 0x0050, 0x0061, 0 }; static const unichar_t str_33ac[] = { 0x0047, 0x0050, 0x0061, 0 }; static const unichar_t str_33ad[] = { 0x0072, 0x0061, 0x0064, 0 }; static const unichar_t str_33ae[] = { 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0 }; static const unichar_t str_33af[] = { 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00b2, 0 }; static const unichar_t str_33b0[] = { 0x0070, 0x0073, 0 }; static const unichar_t str_33b1[] = { 0x006e, 0x0073, 0 }; static const unichar_t str_33b2[] = { 0x03bc, 0x0073, 0 }; static const unichar_t str_33b3[] = { 0x006d, 0x0073, 0 }; static const unichar_t str_33b4[] = { 0x0070, 0x0056, 0 }; static const unichar_t str_33b5[] = { 0x006e, 0x0056, 0 }; static const unichar_t str_33b6[] = { 0x03bc, 0x0056, 0 }; static const unichar_t str_33b7[] = { 0x006d, 0x0056, 0 }; static const unichar_t str_33b8[] = { 0x006b, 0x0056, 0 }; static const unichar_t str_33b9[] = { 0x004d, 0x0056, 0 }; static const unichar_t str_33ba[] = { 0x0070, 0x0057, 0 }; static const unichar_t str_33bb[] = { 0x006e, 0x0057, 0 }; static const unichar_t str_33bc[] = { 0x03bc, 0x0057, 0 }; static const unichar_t str_33bd[] = { 0x006d, 0x0057, 0 }; static const unichar_t str_33be[] = { 0x006b, 0x0057, 0 }; static const unichar_t str_33bf[] = { 0x004d, 0x0057, 0 }; static const unichar_t str_33c0[] = { 0x006b, 0x03a9, 0 }; static const unichar_t str_33c1[] = { 0x004d, 0x03a9, 0 }; static const unichar_t str_33c2[] = { 0x0061, 0x002e, 0x006d, 0x002e, 0 }; static const unichar_t str_33c3[] = { 0x0042, 0x0071, 0 }; static const unichar_t str_33c4[] = { 0x0063, 0x0063, 0 }; static const unichar_t str_33c5[] = { 0x0063, 0x0064, 0 }; static const unichar_t str_33c6[] = { 0x0043, 0x2215, 0x006b, 0x0067, 0 }; static const unichar_t str_33c7[] = { 0x0043, 0x006f, 0x002e, 0 }; static const unichar_t str_33c8[] = { 0x0064, 0x0042, 0 }; static const unichar_t str_33c9[] = { 0x0047, 0x0079, 0 }; static const unichar_t str_33ca[] = { 0x0068, 0x0061, 0 }; static const unichar_t str_33cb[] = { 0x0048, 0x0050, 0 }; static const unichar_t str_33cc[] = { 0x0069, 0x006e, 0 }; static const unichar_t str_33cd[] = { 0x004b, 0x004b, 0 }; static const unichar_t str_33ce[] = { 0x004b, 0x004d, 0 }; static const unichar_t str_33cf[] = { 0x006b, 0x0074, 0 }; static const unichar_t str_33d0[] = { 0x006c, 0x006d, 0 }; static const unichar_t str_33d1[] = { 0x006c, 0x006e, 0 }; static const unichar_t str_33d2[] = { 0x006c, 0x006f, 0x0067, 0 }; static const unichar_t str_33d3[] = { 0x006c, 0x0078, 0 }; static const unichar_t str_33d4[] = { 0x006d, 0x0062, 0 }; static const unichar_t str_33d5[] = { 0x006d, 0x0069, 0x006c, 0 }; static const unichar_t str_33d6[] = { 0x006d, 0x006f, 0x006c, 0 }; static const unichar_t str_33d7[] = { 0x0050, 0x0048, 0 }; static const unichar_t str_33d8[] = { 0x0070, 0x002e, 0x006d, 0x002e, 0 }; static const unichar_t str_33d9[] = { 0x0050, 0x0050, 0x004d, 0 }; static const unichar_t str_33da[] = { 0x0050, 0x0052, 0 }; static const unichar_t str_33db[] = { 0x0073, 0x0072, 0 }; static const unichar_t str_33dc[] = { 0x0053, 0x0076, 0 }; static const unichar_t str_33dd[] = { 0x0057, 0x0062, 0 }; static const unichar_t str_33de[] = { 0x0056, 0x2215, 0x006d, 0 }; static const unichar_t str_33df[] = { 0x0041, 0x2215, 0x006d, 0 }; static const unichar_t str_33e0[] = { 0x0031, 0x65e5, 0 }; static const unichar_t str_33e1[] = { 0x0032, 0x65e5, 0 }; static const unichar_t str_33e2[] = { 0x0033, 0x65e5, 0 }; static const unichar_t str_33e3[] = { 0x0034, 0x65e5, 0 }; static const unichar_t str_33e4[] = { 0x0035, 0x65e5, 0 }; static const unichar_t str_33e5[] = { 0x0036, 0x65e5, 0 }; static const unichar_t str_33e6[] = { 0x0037, 0x65e5, 0 }; static const unichar_t str_33e7[] = { 0x0038, 0x65e5, 0 }; static const unichar_t str_33e8[] = { 0x0039, 0x65e5, 0 }; static const unichar_t str_33e9[] = { 0x0031, 0x0030, 0x65e5, 0 }; static const unichar_t str_33ea[] = { 0x0031, 0x0031, 0x65e5, 0 }; static const unichar_t str_33eb[] = { 0x0031, 0x0032, 0x65e5, 0 }; static const unichar_t str_33ec[] = { 0x0031, 0x0033, 0x65e5, 0 }; static const unichar_t str_33ed[] = { 0x0031, 0x0034, 0x65e5, 0 }; static const unichar_t str_33ee[] = { 0x0031, 0x0035, 0x65e5, 0 }; static const unichar_t str_33ef[] = { 0x0031, 0x0036, 0x65e5, 0 }; static const unichar_t str_33f0[] = { 0x0031, 0x0037, 0x65e5, 0 }; static const unichar_t str_33f1[] = { 0x0031, 0x0038, 0x65e5, 0 }; static const unichar_t str_33f2[] = { 0x0031, 0x0039, 0x65e5, 0 }; static const unichar_t str_33f3[] = { 0x0032, 0x0030, 0x65e5, 0 }; static const unichar_t str_33f4[] = { 0x0032, 0x0031, 0x65e5, 0 }; static const unichar_t str_33f5[] = { 0x0032, 0x0032, 0x65e5, 0 }; static const unichar_t str_33f6[] = { 0x0032, 0x0033, 0x65e5, 0 }; static const unichar_t str_33f7[] = { 0x0032, 0x0034, 0x65e5, 0 }; static const unichar_t str_33f8[] = { 0x0032, 0x0035, 0x65e5, 0 }; static const unichar_t str_33f9[] = { 0x0032, 0x0036, 0x65e5, 0 }; static const unichar_t str_33fa[] = { 0x0032, 0x0037, 0x65e5, 0 }; static const unichar_t str_33fb[] = { 0x0032, 0x0038, 0x65e5, 0 }; static const unichar_t str_33fc[] = { 0x0032, 0x0039, 0x65e5, 0 }; static const unichar_t str_33fd[] = { 0x0033, 0x0030, 0x65e5, 0 }; static const unichar_t str_33fe[] = { 0x0033, 0x0031, 0x65e5, 0 }; static const unichar_t str_33ff[] = { 0x0067, 0x0061, 0x006c, 0 }; static const unichar_t str_a770[] = { 0xa76f, 0 }; static const unichar_t str_a7f8[] = { 0x0126, 0 }; static const unichar_t str_a7f9[] = { 0x0153, 0 }; static const unichar_t str_f900[] = { 0x8c48, 0 }; static const unichar_t str_f901[] = { 0x66f4, 0 }; static const unichar_t str_f902[] = { 0x8eca, 0 }; static const unichar_t str_f903[] = { 0x8cc8, 0 }; static const unichar_t str_f904[] = { 0x6ed1, 0 }; static const unichar_t str_f905[] = { 0x4e32, 0 }; static const unichar_t str_f906[] = { 0x53e5, 0 }; static const unichar_t str_f907[] = { 0x9f9c, 0 }; static const unichar_t str_f908[] = { 0x9f9c, 0 }; static const unichar_t str_f909[] = { 0x5951, 0 }; static const unichar_t str_f90a[] = { 0x91d1, 0 }; static const unichar_t str_f90b[] = { 0x5587, 0 }; static const unichar_t str_f90c[] = { 0x5948, 0 }; static const unichar_t str_f90d[] = { 0x61f6, 0 }; static const unichar_t str_f90e[] = { 0x7669, 0 }; static const unichar_t str_f90f[] = { 0x7f85, 0 }; static const unichar_t str_f910[] = { 0x863f, 0 }; static const unichar_t str_f911[] = { 0x87ba, 0 }; static const unichar_t str_f912[] = { 0x88f8, 0 }; static const unichar_t str_f913[] = { 0x908f, 0 }; static const unichar_t str_f914[] = { 0x6a02, 0 }; static const unichar_t str_f915[] = { 0x6d1b, 0 }; static const unichar_t str_f916[] = { 0x70d9, 0 }; static const unichar_t str_f917[] = { 0x73de, 0 }; static const unichar_t str_f918[] = { 0x843d, 0 }; static const unichar_t str_f919[] = { 0x916a, 0 }; static const unichar_t str_f91a[] = { 0x99f1, 0 }; static const unichar_t str_f91b[] = { 0x4e82, 0 }; static const unichar_t str_f91c[] = { 0x5375, 0 }; static const unichar_t str_f91d[] = { 0x6b04, 0 }; static const unichar_t str_f91e[] = { 0x721b, 0 }; static const unichar_t str_f91f[] = { 0x862d, 0 }; static const unichar_t str_f920[] = { 0x9e1e, 0 }; static const unichar_t str_f921[] = { 0x5d50, 0 }; static const unichar_t str_f922[] = { 0x6feb, 0 }; static const unichar_t str_f923[] = { 0x85cd, 0 }; static const unichar_t str_f924[] = { 0x8964, 0 }; static const unichar_t str_f925[] = { 0x62c9, 0 }; static const unichar_t str_f926[] = { 0x81d8, 0 }; static const unichar_t str_f927[] = { 0x881f, 0 }; static const unichar_t str_f928[] = { 0x5eca, 0 }; static const unichar_t str_f929[] = { 0x6717, 0 }; static const unichar_t str_f92a[] = { 0x6d6a, 0 }; static const unichar_t str_f92b[] = { 0x72fc, 0 }; static const unichar_t str_f92c[] = { 0x90ce, 0 }; static const unichar_t str_f92d[] = { 0x4f86, 0 }; static const unichar_t str_f92e[] = { 0x51b7, 0 }; static const unichar_t str_f92f[] = { 0x52de, 0 }; static const unichar_t str_f930[] = { 0x64c4, 0 }; static const unichar_t str_f931[] = { 0x6ad3, 0 }; static const unichar_t str_f932[] = { 0x7210, 0 }; static const unichar_t str_f933[] = { 0x76e7, 0 }; static const unichar_t str_f934[] = { 0x8001, 0 }; static const unichar_t str_f935[] = { 0x8606, 0 }; static const unichar_t str_f936[] = { 0x865c, 0 }; static const unichar_t str_f937[] = { 0x8def, 0 }; static const unichar_t str_f938[] = { 0x9732, 0 }; static const unichar_t str_f939[] = { 0x9b6f, 0 }; static const unichar_t str_f93a[] = { 0x9dfa, 0 }; static const unichar_t str_f93b[] = { 0x788c, 0 }; static const unichar_t str_f93c[] = { 0x797f, 0 }; static const unichar_t str_f93d[] = { 0x7da0, 0 }; static const unichar_t str_f93e[] = { 0x83c9, 0 }; static const unichar_t str_f93f[] = { 0x9304, 0 }; static const unichar_t str_f940[] = { 0x9e7f, 0 }; static const unichar_t str_f941[] = { 0x8ad6, 0 }; static const unichar_t str_f942[] = { 0x58df, 0 }; static const unichar_t str_f943[] = { 0x5f04, 0 }; static const unichar_t str_f944[] = { 0x7c60, 0 }; static const unichar_t str_f945[] = { 0x807e, 0 }; static const unichar_t str_f946[] = { 0x7262, 0 }; static const unichar_t str_f947[] = { 0x78ca, 0 }; static const unichar_t str_f948[] = { 0x8cc2, 0 }; static const unichar_t str_f949[] = { 0x96f7, 0 }; static const unichar_t str_f94a[] = { 0x58d8, 0 }; static const unichar_t str_f94b[] = { 0x5c62, 0 }; static const unichar_t str_f94c[] = { 0x6a13, 0 }; static const unichar_t str_f94d[] = { 0x6dda, 0 }; static const unichar_t str_f94e[] = { 0x6f0f, 0 }; static const unichar_t str_f94f[] = { 0x7d2f, 0 }; static const unichar_t str_f950[] = { 0x7e37, 0 }; static const unichar_t str_f951[] = { 0x964b, 0 }; static const unichar_t str_f952[] = { 0x52d2, 0 }; static const unichar_t str_f953[] = { 0x808b, 0 }; static const unichar_t str_f954[] = { 0x51dc, 0 }; static const unichar_t str_f955[] = { 0x51cc, 0 }; static const unichar_t str_f956[] = { 0x7a1c, 0 }; static const unichar_t str_f957[] = { 0x7dbe, 0 }; static const unichar_t str_f958[] = { 0x83f1, 0 }; static const unichar_t str_f959[] = { 0x9675, 0 }; static const unichar_t str_f95a[] = { 0x8b80, 0 }; static const unichar_t str_f95b[] = { 0x62cf, 0 }; static const unichar_t str_f95c[] = { 0x6a02, 0 }; static const unichar_t str_f95d[] = { 0x8afe, 0 }; static const unichar_t str_f95e[] = { 0x4e39, 0 }; static const unichar_t str_f95f[] = { 0x5be7, 0 }; static const unichar_t str_f960[] = { 0x6012, 0 }; static const unichar_t str_f961[] = { 0x7387, 0 }; static const unichar_t str_f962[] = { 0x7570, 0 }; static const unichar_t str_f963[] = { 0x5317, 0 }; static const unichar_t str_f964[] = { 0x78fb, 0 }; static const unichar_t str_f965[] = { 0x4fbf, 0 }; static const unichar_t str_f966[] = { 0x5fa9, 0 }; static const unichar_t str_f967[] = { 0x4e0d, 0 }; static const unichar_t str_f968[] = { 0x6ccc, 0 }; static const unichar_t str_f969[] = { 0x6578, 0 }; static const unichar_t str_f96a[] = { 0x7d22, 0 }; static const unichar_t str_f96b[] = { 0x53c3, 0 }; static const unichar_t str_f96c[] = { 0x585e, 0 }; static const unichar_t str_f96d[] = { 0x7701, 0 }; static const unichar_t str_f96e[] = { 0x8449, 0 }; static const unichar_t str_f96f[] = { 0x8aaa, 0 }; static const unichar_t str_f970[] = { 0x6bba, 0 }; static const unichar_t str_f971[] = { 0x8fb0, 0 }; static const unichar_t str_f972[] = { 0x6c88, 0 }; static const unichar_t str_f973[] = { 0x62fe, 0 }; static const unichar_t str_f974[] = { 0x82e5, 0 }; static const unichar_t str_f975[] = { 0x63a0, 0 }; static const unichar_t str_f976[] = { 0x7565, 0 }; static const unichar_t str_f977[] = { 0x4eae, 0 }; static const unichar_t str_f978[] = { 0x5169, 0 }; static const unichar_t str_f979[] = { 0x51c9, 0 }; static const unichar_t str_f97a[] = { 0x6881, 0 }; static const unichar_t str_f97b[] = { 0x7ce7, 0 }; static const unichar_t str_f97c[] = { 0x826f, 0 }; static const unichar_t str_f97d[] = { 0x8ad2, 0 }; static const unichar_t str_f97e[] = { 0x91cf, 0 }; static const unichar_t str_f97f[] = { 0x52f5, 0 }; static const unichar_t str_f980[] = { 0x5442, 0 }; static const unichar_t str_f981[] = { 0x5973, 0 }; static const unichar_t str_f982[] = { 0x5eec, 0 }; static const unichar_t str_f983[] = { 0x65c5, 0 }; static const unichar_t str_f984[] = { 0x6ffe, 0 }; static const unichar_t str_f985[] = { 0x792a, 0 }; static const unichar_t str_f986[] = { 0x95ad, 0 }; static const unichar_t str_f987[] = { 0x9a6a, 0 }; static const unichar_t str_f988[] = { 0x9e97, 0 }; static const unichar_t str_f989[] = { 0x9ece, 0 }; static const unichar_t str_f98a[] = { 0x529b, 0 }; static const unichar_t str_f98b[] = { 0x66c6, 0 }; static const unichar_t str_f98c[] = { 0x6b77, 0 }; static const unichar_t str_f98d[] = { 0x8f62, 0 }; static const unichar_t str_f98e[] = { 0x5e74, 0 }; static const unichar_t str_f98f[] = { 0x6190, 0 }; static const unichar_t str_f990[] = { 0x6200, 0 }; static const unichar_t str_f991[] = { 0x649a, 0 }; static const unichar_t str_f992[] = { 0x6f23, 0 }; static const unichar_t str_f993[] = { 0x7149, 0 }; static const unichar_t str_f994[] = { 0x7489, 0 }; static const unichar_t str_f995[] = { 0x79ca, 0 }; static const unichar_t str_f996[] = { 0x7df4, 0 }; static const unichar_t str_f997[] = { 0x806f, 0 }; static const unichar_t str_f998[] = { 0x8f26, 0 }; static const unichar_t str_f999[] = { 0x84ee, 0 }; static const unichar_t str_f99a[] = { 0x9023, 0 }; static const unichar_t str_f99b[] = { 0x934a, 0 }; static const unichar_t str_f99c[] = { 0x5217, 0 }; static const unichar_t str_f99d[] = { 0x52a3, 0 }; static const unichar_t str_f99e[] = { 0x54bd, 0 }; static const unichar_t str_f99f[] = { 0x70c8, 0 }; static const unichar_t str_f9a0[] = { 0x88c2, 0 }; static const unichar_t str_f9a1[] = { 0x8aaa, 0 }; static const unichar_t str_f9a2[] = { 0x5ec9, 0 }; static const unichar_t str_f9a3[] = { 0x5ff5, 0 }; static const unichar_t str_f9a4[] = { 0x637b, 0 }; static const unichar_t str_f9a5[] = { 0x6bae, 0 }; static const unichar_t str_f9a6[] = { 0x7c3e, 0 }; static const unichar_t str_f9a7[] = { 0x7375, 0 }; static const unichar_t str_f9a8[] = { 0x4ee4, 0 }; static const unichar_t str_f9a9[] = { 0x56f9, 0 }; static const unichar_t str_f9aa[] = { 0x5be7, 0 }; static const unichar_t str_f9ab[] = { 0x5dba, 0 }; static const unichar_t str_f9ac[] = { 0x601c, 0 }; static const unichar_t str_f9ad[] = { 0x73b2, 0 }; static const unichar_t str_f9ae[] = { 0x7469, 0 }; static const unichar_t str_f9af[] = { 0x7f9a, 0 }; static const unichar_t str_f9b0[] = { 0x8046, 0 }; static const unichar_t str_f9b1[] = { 0x9234, 0 }; static const unichar_t str_f9b2[] = { 0x96f6, 0 }; static const unichar_t str_f9b3[] = { 0x9748, 0 }; static const unichar_t str_f9b4[] = { 0x9818, 0 }; static const unichar_t str_f9b5[] = { 0x4f8b, 0 }; static const unichar_t str_f9b6[] = { 0x79ae, 0 }; static const unichar_t str_f9b7[] = { 0x91b4, 0 }; static const unichar_t str_f9b8[] = { 0x96b8, 0 }; static const unichar_t str_f9b9[] = { 0x60e1, 0 }; static const unichar_t str_f9ba[] = { 0x4e86, 0 }; static const unichar_t str_f9bb[] = { 0x50da, 0 }; static const unichar_t str_f9bc[] = { 0x5bee, 0 }; static const unichar_t str_f9bd[] = { 0x5c3f, 0 }; static const unichar_t str_f9be[] = { 0x6599, 0 }; static const unichar_t str_f9bf[] = { 0x6a02, 0 }; static const unichar_t str_f9c0[] = { 0x71ce, 0 }; static const unichar_t str_f9c1[] = { 0x7642, 0 }; static const unichar_t str_f9c2[] = { 0x84fc, 0 }; static const unichar_t str_f9c3[] = { 0x907c, 0 }; static const unichar_t str_f9c4[] = { 0x9f8d, 0 }; static const unichar_t str_f9c5[] = { 0x6688, 0 }; static const unichar_t str_f9c6[] = { 0x962e, 0 }; static const unichar_t str_f9c7[] = { 0x5289, 0 }; static const unichar_t str_f9c8[] = { 0x677b, 0 }; static const unichar_t str_f9c9[] = { 0x67f3, 0 }; static const unichar_t str_f9ca[] = { 0x6d41, 0 }; static const unichar_t str_f9cb[] = { 0x6e9c, 0 }; static const unichar_t str_f9cc[] = { 0x7409, 0 }; static const unichar_t str_f9cd[] = { 0x7559, 0 }; static const unichar_t str_f9ce[] = { 0x786b, 0 }; static const unichar_t str_f9cf[] = { 0x7d10, 0 }; static const unichar_t str_f9d0[] = { 0x985e, 0 }; static const unichar_t str_f9d1[] = { 0x516d, 0 }; static const unichar_t str_f9d2[] = { 0x622e, 0 }; static const unichar_t str_f9d3[] = { 0x9678, 0 }; static const unichar_t str_f9d4[] = { 0x502b, 0 }; static const unichar_t str_f9d5[] = { 0x5d19, 0 }; static const unichar_t str_f9d6[] = { 0x6dea, 0 }; static const unichar_t str_f9d7[] = { 0x8f2a, 0 }; static const unichar_t str_f9d8[] = { 0x5f8b, 0 }; static const unichar_t str_f9d9[] = { 0x6144, 0 }; static const unichar_t str_f9da[] = { 0x6817, 0 }; static const unichar_t str_f9db[] = { 0x7387, 0 }; static const unichar_t str_f9dc[] = { 0x9686, 0 }; static const unichar_t str_f9dd[] = { 0x5229, 0 }; static const unichar_t str_f9de[] = { 0x540f, 0 }; static const unichar_t str_f9df[] = { 0x5c65, 0 }; static const unichar_t str_f9e0[] = { 0x6613, 0 }; static const unichar_t str_f9e1[] = { 0x674e, 0 }; static const unichar_t str_f9e2[] = { 0x68a8, 0 }; static const unichar_t str_f9e3[] = { 0x6ce5, 0 }; static const unichar_t str_f9e4[] = { 0x7406, 0 }; static const unichar_t str_f9e5[] = { 0x75e2, 0 }; static const unichar_t str_f9e6[] = { 0x7f79, 0 }; static const unichar_t str_f9e7[] = { 0x88cf, 0 }; static const unichar_t str_f9e8[] = { 0x88e1, 0 }; static const unichar_t str_f9e9[] = { 0x91cc, 0 }; static const unichar_t str_f9ea[] = { 0x96e2, 0 }; static const unichar_t str_f9eb[] = { 0x533f, 0 }; static const unichar_t str_f9ec[] = { 0x6eba, 0 }; static const unichar_t str_f9ed[] = { 0x541d, 0 }; static const unichar_t str_f9ee[] = { 0x71d0, 0 }; static const unichar_t str_f9ef[] = { 0x7498, 0 }; static const unichar_t str_f9f0[] = { 0x85fa, 0 }; static const unichar_t str_f9f1[] = { 0x96a3, 0 }; static const unichar_t str_f9f2[] = { 0x9c57, 0 }; static const unichar_t str_f9f3[] = { 0x9e9f, 0 }; static const unichar_t str_f9f4[] = { 0x6797, 0 }; static const unichar_t str_f9f5[] = { 0x6dcb, 0 }; static const unichar_t str_f9f6[] = { 0x81e8, 0 }; static const unichar_t str_f9f7[] = { 0x7acb, 0 }; static const unichar_t str_f9f8[] = { 0x7b20, 0 }; static const unichar_t str_f9f9[] = { 0x7c92, 0 }; static const unichar_t str_f9fa[] = { 0x72c0, 0 }; static const unichar_t str_f9fb[] = { 0x7099, 0 }; static const unichar_t str_f9fc[] = { 0x8b58, 0 }; static const unichar_t str_f9fd[] = { 0x4ec0, 0 }; static const unichar_t str_f9fe[] = { 0x8336, 0 }; static const unichar_t str_f9ff[] = { 0x523a, 0 }; static const unichar_t str_fa00[] = { 0x5207, 0 }; static const unichar_t str_fa01[] = { 0x5ea6, 0 }; static const unichar_t str_fa02[] = { 0x62d3, 0 }; static const unichar_t str_fa03[] = { 0x7cd6, 0 }; static const unichar_t str_fa04[] = { 0x5b85, 0 }; static const unichar_t str_fa05[] = { 0x6d1e, 0 }; static const unichar_t str_fa06[] = { 0x66b4, 0 }; static const unichar_t str_fa07[] = { 0x8f3b, 0 }; static const unichar_t str_fa08[] = { 0x884c, 0 }; static const unichar_t str_fa09[] = { 0x964d, 0 }; static const unichar_t str_fa0a[] = { 0x898b, 0 }; static const unichar_t str_fa0b[] = { 0x5ed3, 0 }; static const unichar_t str_fa0c[] = { 0x5140, 0 }; static const unichar_t str_fa0d[] = { 0x55c0, 0 }; static const unichar_t str_fa10[] = { 0x585a, 0 }; static const unichar_t str_fa12[] = { 0x6674, 0 }; static const unichar_t str_fa15[] = { 0x51de, 0 }; static const unichar_t str_fa16[] = { 0x732a, 0 }; static const unichar_t str_fa17[] = { 0x76ca, 0 }; static const unichar_t str_fa18[] = { 0x793c, 0 }; static const unichar_t str_fa19[] = { 0x795e, 0 }; static const unichar_t str_fa1a[] = { 0x7965, 0 }; static const unichar_t str_fa1b[] = { 0x798f, 0 }; static const unichar_t str_fa1c[] = { 0x9756, 0 }; static const unichar_t str_fa1d[] = { 0x7cbe, 0 }; static const unichar_t str_fa1e[] = { 0x7fbd, 0 }; static const unichar_t str_fa20[] = { 0x8612, 0 }; static const unichar_t str_fa22[] = { 0x8af8, 0 }; static const unichar_t str_fa25[] = { 0x9038, 0 }; static const unichar_t str_fa26[] = { 0x90fd, 0 }; static const unichar_t str_fa2a[] = { 0x98ef, 0 }; static const unichar_t str_fa2b[] = { 0x98fc, 0 }; static const unichar_t str_fa2c[] = { 0x9928, 0 }; static const unichar_t str_fa2d[] = { 0x9db4, 0 }; static const unichar_t str_fa2e[] = { 0x90de, 0 }; static const unichar_t str_fa2f[] = { 0x96b7, 0 }; static const unichar_t str_fa30[] = { 0x4fae, 0 }; static const unichar_t str_fa31[] = { 0x50e7, 0 }; static const unichar_t str_fa32[] = { 0x514d, 0 }; static const unichar_t str_fa33[] = { 0x52c9, 0 }; static const unichar_t str_fa34[] = { 0x52e4, 0 }; static const unichar_t str_fa35[] = { 0x5351, 0 }; static const unichar_t str_fa36[] = { 0x559d, 0 }; static const unichar_t str_fa37[] = { 0x5606, 0 }; static const unichar_t str_fa38[] = { 0x5668, 0 }; static const unichar_t str_fa39[] = { 0x5840, 0 }; static const unichar_t str_fa3a[] = { 0x58a8, 0 }; static const unichar_t str_fa3b[] = { 0x5c64, 0 }; static const unichar_t str_fa3c[] = { 0x5c6e, 0 }; static const unichar_t str_fa3d[] = { 0x6094, 0 }; static const unichar_t str_fa3e[] = { 0x6168, 0 }; static const unichar_t str_fa3f[] = { 0x618e, 0 }; static const unichar_t str_fa40[] = { 0x61f2, 0 }; static const unichar_t str_fa41[] = { 0x654f, 0 }; static const unichar_t str_fa42[] = { 0x65e2, 0 }; static const unichar_t str_fa43[] = { 0x6691, 0 }; static const unichar_t str_fa44[] = { 0x6885, 0 }; static const unichar_t str_fa45[] = { 0x6d77, 0 }; static const unichar_t str_fa46[] = { 0x6e1a, 0 }; static const unichar_t str_fa47[] = { 0x6f22, 0 }; static const unichar_t str_fa48[] = { 0x716e, 0 }; static const unichar_t str_fa49[] = { 0x722b, 0 }; static const unichar_t str_fa4a[] = { 0x7422, 0 }; static const unichar_t str_fa4b[] = { 0x7891, 0 }; static const unichar_t str_fa4c[] = { 0x793e, 0 }; static const unichar_t str_fa4d[] = { 0x7949, 0 }; static const unichar_t str_fa4e[] = { 0x7948, 0 }; static const unichar_t str_fa4f[] = { 0x7950, 0 }; static const unichar_t str_fa50[] = { 0x7956, 0 }; static const unichar_t str_fa51[] = { 0x795d, 0 }; static const unichar_t str_fa52[] = { 0x798d, 0 }; static const unichar_t str_fa53[] = { 0x798e, 0 }; static const unichar_t str_fa54[] = { 0x7a40, 0 }; static const unichar_t str_fa55[] = { 0x7a81, 0 }; static const unichar_t str_fa56[] = { 0x7bc0, 0 }; static const unichar_t str_fa57[] = { 0x7df4, 0 }; static const unichar_t str_fa58[] = { 0x7e09, 0 }; static const unichar_t str_fa59[] = { 0x7e41, 0 }; static const unichar_t str_fa5a[] = { 0x7f72, 0 }; static const unichar_t str_fa5b[] = { 0x8005, 0 }; static const unichar_t str_fa5c[] = { 0x81ed, 0 }; static const unichar_t str_fa5d[] = { 0x8279, 0 }; static const unichar_t str_fa5e[] = { 0x8279, 0 }; static const unichar_t str_fa5f[] = { 0x8457, 0 }; static const unichar_t str_fa60[] = { 0x8910, 0 }; static const unichar_t str_fa61[] = { 0x8996, 0 }; static const unichar_t str_fa62[] = { 0x8b01, 0 }; static const unichar_t str_fa63[] = { 0x8b39, 0 }; static const unichar_t str_fa64[] = { 0x8cd3, 0 }; static const unichar_t str_fa65[] = { 0x8d08, 0 }; static const unichar_t str_fa66[] = { 0x8fb6, 0 }; static const unichar_t str_fa67[] = { 0x9038, 0 }; static const unichar_t str_fa68[] = { 0x96e3, 0 }; static const unichar_t str_fa69[] = { 0x97ff, 0 }; static const unichar_t str_fa6a[] = { 0x983b, 0 }; static const unichar_t str_fa6b[] = { 0x6075, 0 }; static const unichar_t str_fa6c[] = { 0x242ee, 0 }; static const unichar_t str_fa6d[] = { 0x8218, 0 }; static const unichar_t str_fa70[] = { 0x4e26, 0 }; static const unichar_t str_fa71[] = { 0x51b5, 0 }; static const unichar_t str_fa72[] = { 0x5168, 0 }; static const unichar_t str_fa73[] = { 0x4f80, 0 }; static const unichar_t str_fa74[] = { 0x5145, 0 }; static const unichar_t str_fa75[] = { 0x5180, 0 }; static const unichar_t str_fa76[] = { 0x52c7, 0 }; static const unichar_t str_fa77[] = { 0x52fa, 0 }; static const unichar_t str_fa78[] = { 0x559d, 0 }; static const unichar_t str_fa79[] = { 0x5555, 0 }; static const unichar_t str_fa7a[] = { 0x5599, 0 }; static const unichar_t str_fa7b[] = { 0x55e2, 0 }; static const unichar_t str_fa7c[] = { 0x585a, 0 }; static const unichar_t str_fa7d[] = { 0x58b3, 0 }; static const unichar_t str_fa7e[] = { 0x5944, 0 }; static const unichar_t str_fa7f[] = { 0x5954, 0 }; static const unichar_t str_fa80[] = { 0x5a62, 0 }; static const unichar_t str_fa81[] = { 0x5b28, 0 }; static const unichar_t str_fa82[] = { 0x5ed2, 0 }; static const unichar_t str_fa83[] = { 0x5ed9, 0 }; static const unichar_t str_fa84[] = { 0x5f69, 0 }; static const unichar_t str_fa85[] = { 0x5fad, 0 }; static const unichar_t str_fa86[] = { 0x60d8, 0 }; static const unichar_t str_fa87[] = { 0x614e, 0 }; static const unichar_t str_fa88[] = { 0x6108, 0 }; static const unichar_t str_fa89[] = { 0x618e, 0 }; static const unichar_t str_fa8a[] = { 0x6160, 0 }; static const unichar_t str_fa8b[] = { 0x61f2, 0 }; static const unichar_t str_fa8c[] = { 0x6234, 0 }; static const unichar_t str_fa8d[] = { 0x63c4, 0 }; static const unichar_t str_fa8e[] = { 0x641c, 0 }; static const unichar_t str_fa8f[] = { 0x6452, 0 }; static const unichar_t str_fa90[] = { 0x6556, 0 }; static const unichar_t str_fa91[] = { 0x6674, 0 }; static const unichar_t str_fa92[] = { 0x6717, 0 }; static const unichar_t str_fa93[] = { 0x671b, 0 }; static const unichar_t str_fa94[] = { 0x6756, 0 }; static const unichar_t str_fa95[] = { 0x6b79, 0 }; static const unichar_t str_fa96[] = { 0x6bba, 0 }; static const unichar_t str_fa97[] = { 0x6d41, 0 }; static const unichar_t str_fa98[] = { 0x6edb, 0 }; static const unichar_t str_fa99[] = { 0x6ecb, 0 }; static const unichar_t str_fa9a[] = { 0x6f22, 0 }; static const unichar_t str_fa9b[] = { 0x701e, 0 }; static const unichar_t str_fa9c[] = { 0x716e, 0 }; static const unichar_t str_fa9d[] = { 0x77a7, 0 }; static const unichar_t str_fa9e[] = { 0x7235, 0 }; static const unichar_t str_fa9f[] = { 0x72af, 0 }; static const unichar_t str_faa0[] = { 0x732a, 0 }; static const unichar_t str_faa1[] = { 0x7471, 0 }; static const unichar_t str_faa2[] = { 0x7506, 0 }; static const unichar_t str_faa3[] = { 0x753b, 0 }; static const unichar_t str_faa4[] = { 0x761d, 0 }; static const unichar_t str_faa5[] = { 0x761f, 0 }; static const unichar_t str_faa6[] = { 0x76ca, 0 }; static const unichar_t str_faa7[] = { 0x76db, 0 }; static const unichar_t str_faa8[] = { 0x76f4, 0 }; static const unichar_t str_faa9[] = { 0x774a, 0 }; static const unichar_t str_faaa[] = { 0x7740, 0 }; static const unichar_t str_faab[] = { 0x78cc, 0 }; static const unichar_t str_faac[] = { 0x7ab1, 0 }; static const unichar_t str_faad[] = { 0x7bc0, 0 }; static const unichar_t str_faae[] = { 0x7c7b, 0 }; static const unichar_t str_faaf[] = { 0x7d5b, 0 }; static const unichar_t str_fab0[] = { 0x7df4, 0 }; static const unichar_t str_fab1[] = { 0x7f3e, 0 }; static const unichar_t str_fab2[] = { 0x8005, 0 }; static const unichar_t str_fab3[] = { 0x8352, 0 }; static const unichar_t str_fab4[] = { 0x83ef, 0 }; static const unichar_t str_fab5[] = { 0x8779, 0 }; static const unichar_t str_fab6[] = { 0x8941, 0 }; static const unichar_t str_fab7[] = { 0x8986, 0 }; static const unichar_t str_fab8[] = { 0x8996, 0 }; static const unichar_t str_fab9[] = { 0x8abf, 0 }; static const unichar_t str_faba[] = { 0x8af8, 0 }; static const unichar_t str_fabb[] = { 0x8acb, 0 }; static const unichar_t str_fabc[] = { 0x8b01, 0 }; static const unichar_t str_fabd[] = { 0x8afe, 0 }; static const unichar_t str_fabe[] = { 0x8aed, 0 }; static const unichar_t str_fabf[] = { 0x8b39, 0 }; static const unichar_t str_fac0[] = { 0x8b8a, 0 }; static const unichar_t str_fac1[] = { 0x8d08, 0 }; static const unichar_t str_fac2[] = { 0x8f38, 0 }; static const unichar_t str_fac3[] = { 0x9072, 0 }; static const unichar_t str_fac4[] = { 0x9199, 0 }; static const unichar_t str_fac5[] = { 0x9276, 0 }; static const unichar_t str_fac6[] = { 0x967c, 0 }; static const unichar_t str_fac7[] = { 0x96e3, 0 }; static const unichar_t str_fac8[] = { 0x9756, 0 }; static const unichar_t str_fac9[] = { 0x97db, 0 }; static const unichar_t str_faca[] = { 0x97ff, 0 }; static const unichar_t str_facb[] = { 0x980b, 0 }; static const unichar_t str_facc[] = { 0x983b, 0 }; static const unichar_t str_facd[] = { 0x9b12, 0 }; static const unichar_t str_face[] = { 0x9f9c, 0 }; static const unichar_t str_facf[] = { 0x2284a, 0 }; static const unichar_t str_fad0[] = { 0x22844, 0 }; static const unichar_t str_fad1[] = { 0x233d5, 0 }; static const unichar_t str_fad2[] = { 0x3b9d, 0 }; static const unichar_t str_fad3[] = { 0x4018, 0 }; static const unichar_t str_fad4[] = { 0x4039, 0 }; static const unichar_t str_fad5[] = { 0x25249, 0 }; static const unichar_t str_fad6[] = { 0x25cd0, 0 }; static const unichar_t str_fad7[] = { 0x27ed3, 0 }; static const unichar_t str_fad8[] = { 0x9f43, 0 }; static const unichar_t str_fad9[] = { 0x9f8e, 0 }; static const unichar_t str_fb00[] = { 0x0066, 0x0066, 0 }; static const unichar_t str_fb01[] = { 0x0066, 0x0069, 0 }; static const unichar_t str_fb02[] = { 0x0066, 0x006c, 0 }; static const unichar_t str_fb03[] = { 0x0066, 0x0066, 0x0069, 0 }; static const unichar_t str_fb04[] = { 0x0066, 0x0066, 0x006c, 0 }; static const unichar_t str_fb05[] = { 0x017f, 0x0074, 0 }; static const unichar_t str_fb06[] = { 0x0073, 0x0074, 0 }; static const unichar_t str_fb13[] = { 0x0574, 0x0576, 0 }; static const unichar_t str_fb14[] = { 0x0574, 0x0565, 0 }; static const unichar_t str_fb15[] = { 0x0574, 0x056b, 0 }; static const unichar_t str_fb16[] = { 0x057e, 0x0576, 0 }; static const unichar_t str_fb17[] = { 0x0574, 0x056d, 0 }; static const unichar_t str_fb1d[] = { 0x05d9, 0x05b4, 0 }; static const unichar_t str_fb1f[] = { 0x05f2, 0x05b7, 0 }; static const unichar_t str_fb20[] = { 0x05e2, 0 }; static const unichar_t str_fb21[] = { 0x05d0, 0 }; static const unichar_t str_fb22[] = { 0x05d3, 0 }; static const unichar_t str_fb23[] = { 0x05d4, 0 }; static const unichar_t str_fb24[] = { 0x05db, 0 }; static const unichar_t str_fb25[] = { 0x05dc, 0 }; static const unichar_t str_fb26[] = { 0x05dd, 0 }; static const unichar_t str_fb27[] = { 0x05e8, 0 }; static const unichar_t str_fb28[] = { 0x05ea, 0 }; static const unichar_t str_fb29[] = { 0x002b, 0 }; static const unichar_t str_fb2a[] = { 0x05e9, 0x05c1, 0 }; static const unichar_t str_fb2b[] = { 0x05e9, 0x05c2, 0 }; static const unichar_t str_fb2c[] = { 0xfb49, 0x05c1, 0 }; static const unichar_t str_fb2d[] = { 0xfb49, 0x05c2, 0 }; static const unichar_t str_fb2e[] = { 0x05d0, 0x05b7, 0 }; static const unichar_t str_fb2f[] = { 0x05d0, 0x05b8, 0 }; static const unichar_t str_fb30[] = { 0x05d0, 0x05bc, 0 }; static const unichar_t str_fb31[] = { 0x05d1, 0x05bc, 0 }; static const unichar_t str_fb32[] = { 0x05d2, 0x05bc, 0 }; static const unichar_t str_fb33[] = { 0x05d3, 0x05bc, 0 }; static const unichar_t str_fb34[] = { 0x05d4, 0x05bc, 0 }; static const unichar_t str_fb35[] = { 0x05d5, 0x05bc, 0 }; static const unichar_t str_fb36[] = { 0x05d6, 0x05bc, 0 }; static const unichar_t str_fb38[] = { 0x05d8, 0x05bc, 0 }; static const unichar_t str_fb39[] = { 0x05d9, 0x05bc, 0 }; static const unichar_t str_fb3a[] = { 0x05da, 0x05bc, 0 }; static const unichar_t str_fb3b[] = { 0x05db, 0x05bc, 0 }; static const unichar_t str_fb3c[] = { 0x05dc, 0x05bc, 0 }; static const unichar_t str_fb3e[] = { 0x05de, 0x05bc, 0 }; static const unichar_t str_fb40[] = { 0x05e0, 0x05bc, 0 }; static const unichar_t str_fb41[] = { 0x05e1, 0x05bc, 0 }; static const unichar_t str_fb43[] = { 0x05e3, 0x05bc, 0 }; static const unichar_t str_fb44[] = { 0x05e4, 0x05bc, 0 }; static const unichar_t str_fb46[] = { 0x05e6, 0x05bc, 0 }; static const unichar_t str_fb47[] = { 0x05e7, 0x05bc, 0 }; static const unichar_t str_fb48[] = { 0x05e8, 0x05bc, 0 }; static const unichar_t str_fb49[] = { 0x05e9, 0x05bc, 0 }; static const unichar_t str_fb4a[] = { 0x05ea, 0x05bc, 0 }; static const unichar_t str_fb4b[] = { 0x05d5, 0x05b9, 0 }; static const unichar_t str_fb4c[] = { 0x05d1, 0x05bf, 0 }; static const unichar_t str_fb4d[] = { 0x05db, 0x05bf, 0 }; static const unichar_t str_fb4e[] = { 0x05e4, 0x05bf, 0 }; static const unichar_t str_fb4f[] = { 0x05d0, 0x05dc, 0 }; static const unichar_t str_fb50[] = { 0x0671, 0 }; static const unichar_t str_fb51[] = { 0x0671, 0 }; static const unichar_t str_fb52[] = { 0x067b, 0 }; static const unichar_t str_fb53[] = { 0x067b, 0 }; static const unichar_t str_fb54[] = { 0x067b, 0 }; static const unichar_t str_fb55[] = { 0x067b, 0 }; static const unichar_t str_fb56[] = { 0x067e, 0 }; static const unichar_t str_fb57[] = { 0x067e, 0 }; static const unichar_t str_fb58[] = { 0x067e, 0 }; static const unichar_t str_fb59[] = { 0x067e, 0 }; static const unichar_t str_fb5a[] = { 0x0680, 0 }; static const unichar_t str_fb5b[] = { 0x0680, 0 }; static const unichar_t str_fb5c[] = { 0x0680, 0 }; static const unichar_t str_fb5d[] = { 0x0680, 0 }; static const unichar_t str_fb5e[] = { 0x067a, 0 }; static const unichar_t str_fb5f[] = { 0x067a, 0 }; static const unichar_t str_fb60[] = { 0x067a, 0 }; static const unichar_t str_fb61[] = { 0x067a, 0 }; static const unichar_t str_fb62[] = { 0x067f, 0 }; static const unichar_t str_fb63[] = { 0x067f, 0 }; static const unichar_t str_fb64[] = { 0x067f, 0 }; static const unichar_t str_fb65[] = { 0x067f, 0 }; static const unichar_t str_fb66[] = { 0x0679, 0 }; static const unichar_t str_fb67[] = { 0x0679, 0 }; static const unichar_t str_fb68[] = { 0x0679, 0 }; static const unichar_t str_fb69[] = { 0x0679, 0 }; static const unichar_t str_fb6a[] = { 0x06a4, 0 }; static const unichar_t str_fb6b[] = { 0x06a4, 0 }; static const unichar_t str_fb6c[] = { 0x06a4, 0 }; static const unichar_t str_fb6d[] = { 0x06a4, 0 }; static const unichar_t str_fb6e[] = { 0x06a6, 0 }; static const unichar_t str_fb6f[] = { 0x06a6, 0 }; static const unichar_t str_fb70[] = { 0x06a6, 0 }; static const unichar_t str_fb71[] = { 0x06a6, 0 }; static const unichar_t str_fb72[] = { 0x0684, 0 }; static const unichar_t str_fb73[] = { 0x0684, 0 }; static const unichar_t str_fb74[] = { 0x0684, 0 }; static const unichar_t str_fb75[] = { 0x0684, 0 }; static const unichar_t str_fb76[] = { 0x0683, 0 }; static const unichar_t str_fb77[] = { 0x0683, 0 }; static const unichar_t str_fb78[] = { 0x0683, 0 }; static const unichar_t str_fb79[] = { 0x0683, 0 }; static const unichar_t str_fb7a[] = { 0x0686, 0 }; static const unichar_t str_fb7b[] = { 0x0686, 0 }; static const unichar_t str_fb7c[] = { 0x0686, 0 }; static const unichar_t str_fb7d[] = { 0x0686, 0 }; static const unichar_t str_fb7e[] = { 0x0687, 0 }; static const unichar_t str_fb7f[] = { 0x0687, 0 }; static const unichar_t str_fb80[] = { 0x0687, 0 }; static const unichar_t str_fb81[] = { 0x0687, 0 }; static const unichar_t str_fb82[] = { 0x068d, 0 }; static const unichar_t str_fb83[] = { 0x068d, 0 }; static const unichar_t str_fb84[] = { 0x068c, 0 }; static const unichar_t str_fb85[] = { 0x068c, 0 }; static const unichar_t str_fb86[] = { 0x068e, 0 }; static const unichar_t str_fb87[] = { 0x068e, 0 }; static const unichar_t str_fb88[] = { 0x0688, 0 }; static const unichar_t str_fb89[] = { 0x0688, 0 }; static const unichar_t str_fb8a[] = { 0x0698, 0 }; static const unichar_t str_fb8b[] = { 0x0698, 0 }; static const unichar_t str_fb8c[] = { 0x0691, 0 }; static const unichar_t str_fb8d[] = { 0x0691, 0 }; static const unichar_t str_fb8e[] = { 0x06a9, 0 }; static const unichar_t str_fb8f[] = { 0x06a9, 0 }; static const unichar_t str_fb90[] = { 0x06a9, 0 }; static const unichar_t str_fb91[] = { 0x06a9, 0 }; static const unichar_t str_fb92[] = { 0x06af, 0 }; static const unichar_t str_fb93[] = { 0x06af, 0 }; static const unichar_t str_fb94[] = { 0x06af, 0 }; static const unichar_t str_fb95[] = { 0x06af, 0 }; static const unichar_t str_fb96[] = { 0x06b3, 0 }; static const unichar_t str_fb97[] = { 0x06b3, 0 }; static const unichar_t str_fb98[] = { 0x06b3, 0 }; static const unichar_t str_fb99[] = { 0x06b3, 0 }; static const unichar_t str_fb9a[] = { 0x06b1, 0 }; static const unichar_t str_fb9b[] = { 0x06b1, 0 }; static const unichar_t str_fb9c[] = { 0x06b1, 0 }; static const unichar_t str_fb9d[] = { 0x06b1, 0 }; static const unichar_t str_fb9e[] = { 0x06ba, 0 }; static const unichar_t str_fb9f[] = { 0x06ba, 0 }; static const unichar_t str_fba0[] = { 0x06bb, 0 }; static const unichar_t str_fba1[] = { 0x06bb, 0 }; static const unichar_t str_fba2[] = { 0x06bb, 0 }; static const unichar_t str_fba3[] = { 0x06bb, 0 }; static const unichar_t str_fba4[] = { 0x06c0, 0 }; static const unichar_t str_fba5[] = { 0x06c0, 0 }; static const unichar_t str_fba6[] = { 0x06c1, 0 }; static const unichar_t str_fba7[] = { 0x06c1, 0 }; static const unichar_t str_fba8[] = { 0x06c1, 0 }; static const unichar_t str_fba9[] = { 0x06c1, 0 }; static const unichar_t str_fbaa[] = { 0x06be, 0 }; static const unichar_t str_fbab[] = { 0x06be, 0 }; static const unichar_t str_fbac[] = { 0x06be, 0 }; static const unichar_t str_fbad[] = { 0x06be, 0 }; static const unichar_t str_fbae[] = { 0x06d2, 0 }; static const unichar_t str_fbaf[] = { 0x06d2, 0 }; static const unichar_t str_fbb0[] = { 0x06d3, 0 }; static const unichar_t str_fbb1[] = { 0x06d3, 0 }; static const unichar_t str_fbd3[] = { 0x06ad, 0 }; static const unichar_t str_fbd4[] = { 0x06ad, 0 }; static const unichar_t str_fbd5[] = { 0x06ad, 0 }; static const unichar_t str_fbd6[] = { 0x06ad, 0 }; static const unichar_t str_fbd7[] = { 0x06c7, 0 }; static const unichar_t str_fbd8[] = { 0x06c7, 0 }; static const unichar_t str_fbd9[] = { 0x06c6, 0 }; static const unichar_t str_fbda[] = { 0x06c6, 0 }; static const unichar_t str_fbdb[] = { 0x06c8, 0 }; static const unichar_t str_fbdc[] = { 0x06c8, 0 }; static const unichar_t str_fbdd[] = { 0x0677, 0 }; static const unichar_t str_fbde[] = { 0x06cb, 0 }; static const unichar_t str_fbdf[] = { 0x06cb, 0 }; static const unichar_t str_fbe0[] = { 0x06c5, 0 }; static const unichar_t str_fbe1[] = { 0x06c5, 0 }; static const unichar_t str_fbe2[] = { 0x06c9, 0 }; static const unichar_t str_fbe3[] = { 0x06c9, 0 }; static const unichar_t str_fbe4[] = { 0x06d0, 0 }; static const unichar_t str_fbe5[] = { 0x06d0, 0 }; static const unichar_t str_fbe6[] = { 0x06d0, 0 }; static const unichar_t str_fbe7[] = { 0x06d0, 0 }; static const unichar_t str_fbe8[] = { 0x0649, 0 }; static const unichar_t str_fbe9[] = { 0x0649, 0 }; static const unichar_t str_fbea[] = { 0x0626, 0x0627, 0 }; static const unichar_t str_fbeb[] = { 0x0626, 0x0627, 0 }; static const unichar_t str_fbec[] = { 0x0626, 0x06d5, 0 }; static const unichar_t str_fbed[] = { 0x0626, 0x06d5, 0 }; static const unichar_t str_fbee[] = { 0x0626, 0x0648, 0 }; static const unichar_t str_fbef[] = { 0x0626, 0x0648, 0 }; static const unichar_t str_fbf0[] = { 0x0626, 0x06c7, 0 }; static const unichar_t str_fbf1[] = { 0x0626, 0x06c7, 0 }; static const unichar_t str_fbf2[] = { 0x0626, 0x06c6, 0 }; static const unichar_t str_fbf3[] = { 0x0626, 0x06c6, 0 }; static const unichar_t str_fbf4[] = { 0x0626, 0x06c8, 0 }; static const unichar_t str_fbf5[] = { 0x0626, 0x06c8, 0 }; static const unichar_t str_fbf6[] = { 0x0626, 0x06d0, 0 }; static const unichar_t str_fbf7[] = { 0x0626, 0x06d0, 0 }; static const unichar_t str_fbf8[] = { 0x0626, 0x06d0, 0 }; static const unichar_t str_fbf9[] = { 0x0626, 0x0649, 0 }; static const unichar_t str_fbfa[] = { 0x0626, 0x0649, 0 }; static const unichar_t str_fbfb[] = { 0x0626, 0x0649, 0 }; static const unichar_t str_fbfc[] = { 0x06cc, 0 }; static const unichar_t str_fbfd[] = { 0x06cc, 0 }; static const unichar_t str_fbfe[] = { 0x06cc, 0 }; static const unichar_t str_fbff[] = { 0x06cc, 0 }; static const unichar_t str_fc00[] = { 0x0626, 0x062c, 0 }; static const unichar_t str_fc01[] = { 0x0626, 0x062d, 0 }; static const unichar_t str_fc02[] = { 0x0626, 0x0645, 0 }; static const unichar_t str_fc03[] = { 0x0626, 0x0649, 0 }; static const unichar_t str_fc04[] = { 0x0626, 0x064a, 0 }; static const unichar_t str_fc05[] = { 0x0628, 0x062c, 0 }; static const unichar_t str_fc06[] = { 0x0628, 0x062d, 0 }; static const unichar_t str_fc07[] = { 0x0628, 0x062e, 0 }; static const unichar_t str_fc08[] = { 0x0628, 0x0645, 0 }; static const unichar_t str_fc09[] = { 0x0628, 0x0649, 0 }; static const unichar_t str_fc0a[] = { 0x0628, 0x064a, 0 }; static const unichar_t str_fc0b[] = { 0x062a, 0x062c, 0 }; static const unichar_t str_fc0c[] = { 0x062a, 0x062d, 0 }; static const unichar_t str_fc0d[] = { 0x062a, 0x062e, 0 }; static const unichar_t str_fc0e[] = { 0x062a, 0x0645, 0 }; static const unichar_t str_fc0f[] = { 0x062a, 0x0649, 0 }; static const unichar_t str_fc10[] = { 0x062a, 0x064a, 0 }; static const unichar_t str_fc11[] = { 0x062b, 0x062c, 0 }; static const unichar_t str_fc12[] = { 0x062b, 0x0645, 0 }; static const unichar_t str_fc13[] = { 0x062b, 0x0649, 0 }; static const unichar_t str_fc14[] = { 0x062b, 0x064a, 0 }; static const unichar_t str_fc15[] = { 0x062c, 0x062d, 0 }; static const unichar_t str_fc16[] = { 0x062c, 0x0645, 0 }; static const unichar_t str_fc17[] = { 0x062d, 0x062c, 0 }; static const unichar_t str_fc18[] = { 0x062d, 0x0645, 0 }; static const unichar_t str_fc19[] = { 0x062e, 0x062c, 0 }; static const unichar_t str_fc1a[] = { 0x062e, 0x062d, 0 }; static const unichar_t str_fc1b[] = { 0x062e, 0x0645, 0 }; static const unichar_t str_fc1c[] = { 0x0633, 0x062c, 0 }; static const unichar_t str_fc1d[] = { 0x0633, 0x062d, 0 }; static const unichar_t str_fc1e[] = { 0x0633, 0x062e, 0 }; static const unichar_t str_fc1f[] = { 0x0633, 0x0645, 0 }; static const unichar_t str_fc20[] = { 0x0635, 0x062d, 0 }; static const unichar_t str_fc21[] = { 0x0635, 0x0645, 0 }; static const unichar_t str_fc22[] = { 0x0636, 0x062c, 0 }; static const unichar_t str_fc23[] = { 0x0636, 0x062d, 0 }; static const unichar_t str_fc24[] = { 0x0636, 0x062e, 0 }; static const unichar_t str_fc25[] = { 0x0636, 0x0645, 0 }; static const unichar_t str_fc26[] = { 0x0637, 0x062d, 0 }; static const unichar_t str_fc27[] = { 0x0637, 0x0645, 0 }; static const unichar_t str_fc28[] = { 0x0638, 0x0645, 0 }; static const unichar_t str_fc29[] = { 0x0639, 0x062c, 0 }; static const unichar_t str_fc2a[] = { 0x0639, 0x0645, 0 }; static const unichar_t str_fc2b[] = { 0x063a, 0x062c, 0 }; static const unichar_t str_fc2c[] = { 0x063a, 0x0645, 0 }; static const unichar_t str_fc2d[] = { 0x0641, 0x062c, 0 }; static const unichar_t str_fc2e[] = { 0x0641, 0x062d, 0 }; static const unichar_t str_fc2f[] = { 0x0641, 0x062e, 0 }; static const unichar_t str_fc30[] = { 0x0641, 0x0645, 0 }; static const unichar_t str_fc31[] = { 0x0641, 0x0649, 0 }; static const unichar_t str_fc32[] = { 0x0641, 0x064a, 0 }; static const unichar_t str_fc33[] = { 0x0642, 0x062d, 0 }; static const unichar_t str_fc34[] = { 0x0642, 0x0645, 0 }; static const unichar_t str_fc35[] = { 0x0642, 0x0649, 0 }; static const unichar_t str_fc36[] = { 0x0642, 0x064a, 0 }; static const unichar_t str_fc37[] = { 0x0643, 0x0627, 0 }; static const unichar_t str_fc38[] = { 0x0643, 0x062c, 0 }; static const unichar_t str_fc39[] = { 0x0643, 0x062d, 0 }; static const unichar_t str_fc3a[] = { 0x0643, 0x062e, 0 }; static const unichar_t str_fc3b[] = { 0x0643, 0x0644, 0 }; static const unichar_t str_fc3c[] = { 0x0643, 0x0645, 0 }; static const unichar_t str_fc3d[] = { 0x0643, 0x0649, 0 }; static const unichar_t str_fc3e[] = { 0x0643, 0x064a, 0 }; static const unichar_t str_fc3f[] = { 0x0644, 0x062c, 0 }; static const unichar_t str_fc40[] = { 0x0644, 0x062d, 0 }; static const unichar_t str_fc41[] = { 0x0644, 0x062e, 0 }; static const unichar_t str_fc42[] = { 0x0644, 0x0645, 0 }; static const unichar_t str_fc43[] = { 0x0644, 0x0649, 0 }; static const unichar_t str_fc44[] = { 0x0644, 0x064a, 0 }; static const unichar_t str_fc45[] = { 0x0645, 0x062c, 0 }; static const unichar_t str_fc46[] = { 0x0645, 0x062d, 0 }; static const unichar_t str_fc47[] = { 0x0645, 0x062e, 0 }; static const unichar_t str_fc48[] = { 0x0645, 0x0645, 0 }; static const unichar_t str_fc49[] = { 0x0645, 0x0649, 0 }; static const unichar_t str_fc4a[] = { 0x0645, 0x064a, 0 }; static const unichar_t str_fc4b[] = { 0x0646, 0x062c, 0 }; static const unichar_t str_fc4c[] = { 0x0646, 0x062d, 0 }; static const unichar_t str_fc4d[] = { 0x0646, 0x062e, 0 }; static const unichar_t str_fc4e[] = { 0x0646, 0x0645, 0 }; static const unichar_t str_fc4f[] = { 0x0646, 0x0649, 0 }; static const unichar_t str_fc50[] = { 0x0646, 0x064a, 0 }; static const unichar_t str_fc51[] = { 0x0647, 0x062c, 0 }; static const unichar_t str_fc52[] = { 0x0647, 0x0645, 0 }; static const unichar_t str_fc53[] = { 0x0647, 0x0649, 0 }; static const unichar_t str_fc54[] = { 0x0647, 0x064a, 0 }; static const unichar_t str_fc55[] = { 0x064a, 0x062c, 0 }; static const unichar_t str_fc56[] = { 0x064a, 0x062d, 0 }; static const unichar_t str_fc57[] = { 0x064a, 0x062e, 0 }; static const unichar_t str_fc58[] = { 0x064a, 0x0645, 0 }; static const unichar_t str_fc59[] = { 0x064a, 0x0649, 0 }; static const unichar_t str_fc5a[] = { 0x064a, 0x064a, 0 }; static const unichar_t str_fc5b[] = { 0x0630, 0x0670, 0 }; static const unichar_t str_fc5c[] = { 0x0631, 0x0670, 0 }; static const unichar_t str_fc5d[] = { 0x0649, 0x0670, 0 }; static const unichar_t str_fc5e[] = { 0x0020, 0x064c, 0x0651, 0 }; static const unichar_t str_fc5f[] = { 0x0020, 0x064d, 0x0651, 0 }; static const unichar_t str_fc60[] = { 0x0020, 0x064e, 0x0651, 0 }; static const unichar_t str_fc61[] = { 0x0020, 0x064f, 0x0651, 0 }; static const unichar_t str_fc62[] = { 0x0020, 0x0650, 0x0651, 0 }; static const unichar_t str_fc63[] = { 0x0020, 0x0651, 0x0670, 0 }; static const unichar_t str_fc64[] = { 0x0626, 0x0631, 0 }; static const unichar_t str_fc65[] = { 0x0626, 0x0632, 0 }; static const unichar_t str_fc66[] = { 0x0626, 0x0645, 0 }; static const unichar_t str_fc67[] = { 0x0626, 0x0646, 0 }; static const unichar_t str_fc68[] = { 0x0626, 0x0649, 0 }; static const unichar_t str_fc69[] = { 0x0626, 0x064a, 0 }; static const unichar_t str_fc6a[] = { 0x0628, 0x0631, 0 }; static const unichar_t str_fc6b[] = { 0x0628, 0x0632, 0 }; static const unichar_t str_fc6c[] = { 0x0628, 0x0645, 0 }; static const unichar_t str_fc6d[] = { 0x0628, 0x0646, 0 }; static const unichar_t str_fc6e[] = { 0x0628, 0x0649, 0 }; static const unichar_t str_fc6f[] = { 0x0628, 0x064a, 0 }; static const unichar_t str_fc70[] = { 0x062a, 0x0631, 0 }; static const unichar_t str_fc71[] = { 0x062a, 0x0632, 0 }; static const unichar_t str_fc72[] = { 0x062a, 0x0645, 0 }; static const unichar_t str_fc73[] = { 0x062a, 0x0646, 0 }; static const unichar_t str_fc74[] = { 0x062a, 0x0649, 0 }; static const unichar_t str_fc75[] = { 0x062a, 0x064a, 0 }; static const unichar_t str_fc76[] = { 0x062b, 0x0631, 0 }; static const unichar_t str_fc77[] = { 0x062b, 0x0632, 0 }; static const unichar_t str_fc78[] = { 0x062b, 0x0645, 0 }; static const unichar_t str_fc79[] = { 0x062b, 0x0646, 0 }; static const unichar_t str_fc7a[] = { 0x062b, 0x0649, 0 }; static const unichar_t str_fc7b[] = { 0x062b, 0x064a, 0 }; static const unichar_t str_fc7c[] = { 0x0641, 0x0649, 0 }; static const unichar_t str_fc7d[] = { 0x0641, 0x064a, 0 }; static const unichar_t str_fc7e[] = { 0x0642, 0x0649, 0 }; static const unichar_t str_fc7f[] = { 0x0642, 0x064a, 0 }; static const unichar_t str_fc80[] = { 0x0643, 0x0627, 0 }; static const unichar_t str_fc81[] = { 0x0643, 0x0644, 0 }; static const unichar_t str_fc82[] = { 0x0643, 0x0645, 0 }; static const unichar_t str_fc83[] = { 0x0643, 0x0649, 0 }; static const unichar_t str_fc84[] = { 0x0643, 0x064a, 0 }; static const unichar_t str_fc85[] = { 0x0644, 0x0645, 0 }; static const unichar_t str_fc86[] = { 0x0644, 0x0649, 0 }; static const unichar_t str_fc87[] = { 0x0644, 0x064a, 0 }; static const unichar_t str_fc88[] = { 0x0645, 0x0627, 0 }; static const unichar_t str_fc89[] = { 0x0645, 0x0645, 0 }; static const unichar_t str_fc8a[] = { 0x0646, 0x0631, 0 }; static const unichar_t str_fc8b[] = { 0x0646, 0x0632, 0 }; static const unichar_t str_fc8c[] = { 0x0646, 0x0645, 0 }; static const unichar_t str_fc8d[] = { 0x0646, 0x0646, 0 }; static const unichar_t str_fc8e[] = { 0x0646, 0x0649, 0 }; static const unichar_t str_fc8f[] = { 0x0646, 0x064a, 0 }; static const unichar_t str_fc90[] = { 0x0649, 0x0670, 0 }; static const unichar_t str_fc91[] = { 0x064a, 0x0631, 0 }; static const unichar_t str_fc92[] = { 0x064a, 0x0632, 0 }; static const unichar_t str_fc93[] = { 0x064a, 0x0645, 0 }; static const unichar_t str_fc94[] = { 0x064a, 0x0646, 0 }; static const unichar_t str_fc95[] = { 0x064a, 0x0649, 0 }; static const unichar_t str_fc96[] = { 0x064a, 0x064a, 0 }; static const unichar_t str_fc97[] = { 0x0626, 0x062c, 0 }; static const unichar_t str_fc98[] = { 0x0626, 0x062d, 0 }; static const unichar_t str_fc99[] = { 0x0626, 0x062e, 0 }; static const unichar_t str_fc9a[] = { 0x0626, 0x0645, 0 }; static const unichar_t str_fc9b[] = { 0x0626, 0x0647, 0 }; static const unichar_t str_fc9c[] = { 0x0628, 0x062c, 0 }; static const unichar_t str_fc9d[] = { 0x0628, 0x062d, 0 }; static const unichar_t str_fc9e[] = { 0x0628, 0x062e, 0 }; static const unichar_t str_fc9f[] = { 0x0628, 0x0645, 0 }; static const unichar_t str_fca0[] = { 0x0628, 0x0647, 0 }; static const unichar_t str_fca1[] = { 0x062a, 0x062c, 0 }; static const unichar_t str_fca2[] = { 0x062a, 0x062d, 0 }; static const unichar_t str_fca3[] = { 0x062a, 0x062e, 0 }; static const unichar_t str_fca4[] = { 0x062a, 0x0645, 0 }; static const unichar_t str_fca5[] = { 0x062a, 0x0647, 0 }; static const unichar_t str_fca6[] = { 0x062b, 0x0645, 0 }; static const unichar_t str_fca7[] = { 0x062c, 0x062d, 0 }; static const unichar_t str_fca8[] = { 0x062c, 0x0645, 0 }; static const unichar_t str_fca9[] = { 0x062d, 0x062c, 0 }; static const unichar_t str_fcaa[] = { 0x062d, 0x0645, 0 }; static const unichar_t str_fcab[] = { 0x062e, 0x062c, 0 }; static const unichar_t str_fcac[] = { 0x062e, 0x0645, 0 }; static const unichar_t str_fcad[] = { 0x0633, 0x062c, 0 }; static const unichar_t str_fcae[] = { 0x0633, 0x062d, 0 }; static const unichar_t str_fcaf[] = { 0x0633, 0x062e, 0 }; static const unichar_t str_fcb0[] = { 0x0633, 0x0645, 0 }; static const unichar_t str_fcb1[] = { 0x0635, 0x062d, 0 }; static const unichar_t str_fcb2[] = { 0x0635, 0x062e, 0 }; static const unichar_t str_fcb3[] = { 0x0635, 0x0645, 0 }; static const unichar_t str_fcb4[] = { 0x0636, 0x062c, 0 }; static const unichar_t str_fcb5[] = { 0x0636, 0x062d, 0 }; static const unichar_t str_fcb6[] = { 0x0636, 0x062e, 0 }; static const unichar_t str_fcb7[] = { 0x0636, 0x0645, 0 }; static const unichar_t str_fcb8[] = { 0x0637, 0x062d, 0 }; static const unichar_t str_fcb9[] = { 0x0638, 0x0645, 0 }; static const unichar_t str_fcba[] = { 0x0639, 0x062c, 0 }; static const unichar_t str_fcbb[] = { 0x0639, 0x0645, 0 }; static const unichar_t str_fcbc[] = { 0x063a, 0x062c, 0 }; static const unichar_t str_fcbd[] = { 0x063a, 0x0645, 0 }; static const unichar_t str_fcbe[] = { 0x0641, 0x062c, 0 }; static const unichar_t str_fcbf[] = { 0x0641, 0x062d, 0 }; static const unichar_t str_fcc0[] = { 0x0641, 0x062e, 0 }; static const unichar_t str_fcc1[] = { 0x0641, 0x0645, 0 }; static const unichar_t str_fcc2[] = { 0x0642, 0x062d, 0 }; static const unichar_t str_fcc3[] = { 0x0642, 0x0645, 0 }; static const unichar_t str_fcc4[] = { 0x0643, 0x062c, 0 }; static const unichar_t str_fcc5[] = { 0x0643, 0x062d, 0 }; static const unichar_t str_fcc6[] = { 0x0643, 0x062e, 0 }; static const unichar_t str_fcc7[] = { 0x0643, 0x0644, 0 }; static const unichar_t str_fcc8[] = { 0x0643, 0x0645, 0 }; static const unichar_t str_fcc9[] = { 0x0644, 0x062c, 0 }; static const unichar_t str_fcca[] = { 0x0644, 0x062d, 0 }; static const unichar_t str_fccb[] = { 0x0644, 0x062e, 0 }; static const unichar_t str_fccc[] = { 0x0644, 0x0645, 0 }; static const unichar_t str_fccd[] = { 0x0644, 0x0647, 0 }; static const unichar_t str_fcce[] = { 0x0645, 0x062c, 0 }; static const unichar_t str_fccf[] = { 0x0645, 0x062d, 0 }; static const unichar_t str_fcd0[] = { 0x0645, 0x062e, 0 }; static const unichar_t str_fcd1[] = { 0x0645, 0x0645, 0 }; static const unichar_t str_fcd2[] = { 0x0646, 0x062c, 0 }; static const unichar_t str_fcd3[] = { 0x0646, 0x062d, 0 }; static const unichar_t str_fcd4[] = { 0x0646, 0x062e, 0 }; static const unichar_t str_fcd5[] = { 0x0646, 0x0645, 0 }; static const unichar_t str_fcd6[] = { 0x0646, 0x0647, 0 }; static const unichar_t str_fcd7[] = { 0x0647, 0x062c, 0 }; static const unichar_t str_fcd8[] = { 0x0647, 0x0645, 0 }; static const unichar_t str_fcd9[] = { 0x0647, 0x0670, 0 }; static const unichar_t str_fcda[] = { 0x064a, 0x062c, 0 }; static const unichar_t str_fcdb[] = { 0x064a, 0x062d, 0 }; static const unichar_t str_fcdc[] = { 0x064a, 0x062e, 0 }; static const unichar_t str_fcdd[] = { 0x064a, 0x0645, 0 }; static const unichar_t str_fcde[] = { 0x064a, 0x0647, 0 }; static const unichar_t str_fcdf[] = { 0x0626, 0x0645, 0 }; static const unichar_t str_fce0[] = { 0x0626, 0x0647, 0 }; static const unichar_t str_fce1[] = { 0x0628, 0x0645, 0 }; static const unichar_t str_fce2[] = { 0x0628, 0x0647, 0 }; static const unichar_t str_fce3[] = { 0x062a, 0x0645, 0 }; static const unichar_t str_fce4[] = { 0x062a, 0x0647, 0 }; static const unichar_t str_fce5[] = { 0x062b, 0x0645, 0 }; static const unichar_t str_fce6[] = { 0x062b, 0x0647, 0 }; static const unichar_t str_fce7[] = { 0x0633, 0x0645, 0 }; static const unichar_t str_fce8[] = { 0x0633, 0x0647, 0 }; static const unichar_t str_fce9[] = { 0x0634, 0x0645, 0 }; static const unichar_t str_fcea[] = { 0x0634, 0x0647, 0 }; static const unichar_t str_fceb[] = { 0x0643, 0x0644, 0 }; static const unichar_t str_fcec[] = { 0x0643, 0x0645, 0 }; static const unichar_t str_fced[] = { 0x0644, 0x0645, 0 }; static const unichar_t str_fcee[] = { 0x0646, 0x0645, 0 }; static const unichar_t str_fcef[] = { 0x0646, 0x0647, 0 }; static const unichar_t str_fcf0[] = { 0x064a, 0x0645, 0 }; static const unichar_t str_fcf1[] = { 0x064a, 0x0647, 0 }; static const unichar_t str_fcf2[] = { 0x0640, 0x064e, 0x0651, 0 }; static const unichar_t str_fcf3[] = { 0x0640, 0x064f, 0x0651, 0 }; static const unichar_t str_fcf4[] = { 0x0640, 0x0650, 0x0651, 0 }; static const unichar_t str_fcf5[] = { 0x0637, 0x0649, 0 }; static const unichar_t str_fcf6[] = { 0x0637, 0x064a, 0 }; static const unichar_t str_fcf7[] = { 0x0639, 0x0649, 0 }; static const unichar_t str_fcf8[] = { 0x0639, 0x064a, 0 }; static const unichar_t str_fcf9[] = { 0x063a, 0x0649, 0 }; static const unichar_t str_fcfa[] = { 0x063a, 0x064a, 0 }; static const unichar_t str_fcfb[] = { 0x0633, 0x0649, 0 }; static const unichar_t str_fcfc[] = { 0x0633, 0x064a, 0 }; static const unichar_t str_fcfd[] = { 0x0634, 0x0649, 0 }; static const unichar_t str_fcfe[] = { 0x0634, 0x064a, 0 }; static const unichar_t str_fcff[] = { 0x062d, 0x0649, 0 }; static const unichar_t str_fd00[] = { 0x062d, 0x064a, 0 }; static const unichar_t str_fd01[] = { 0x062c, 0x0649, 0 }; static const unichar_t str_fd02[] = { 0x062c, 0x064a, 0 }; static const unichar_t str_fd03[] = { 0x062e, 0x0649, 0 }; static const unichar_t str_fd04[] = { 0x062e, 0x064a, 0 }; static const unichar_t str_fd05[] = { 0x0635, 0x0649, 0 }; static const unichar_t str_fd06[] = { 0x0635, 0x064a, 0 }; static const unichar_t str_fd07[] = { 0x0636, 0x0649, 0 }; static const unichar_t str_fd08[] = { 0x0636, 0x064a, 0 }; static const unichar_t str_fd09[] = { 0x0634, 0x062c, 0 }; static const unichar_t str_fd0a[] = { 0x0634, 0x062d, 0 }; static const unichar_t str_fd0b[] = { 0x0634, 0x062e, 0 }; static const unichar_t str_fd0c[] = { 0x0634, 0x0645, 0 }; static const unichar_t str_fd0d[] = { 0x0634, 0x0631, 0 }; static const unichar_t str_fd0e[] = { 0x0633, 0x0631, 0 }; static const unichar_t str_fd0f[] = { 0x0635, 0x0631, 0 }; static const unichar_t str_fd10[] = { 0x0636, 0x0631, 0 }; static const unichar_t str_fd11[] = { 0x0637, 0x0649, 0 }; static const unichar_t str_fd12[] = { 0x0637, 0x064a, 0 }; static const unichar_t str_fd13[] = { 0x0639, 0x0649, 0 }; static const unichar_t str_fd14[] = { 0x0639, 0x064a, 0 }; static const unichar_t str_fd15[] = { 0x063a, 0x0649, 0 }; static const unichar_t str_fd16[] = { 0x063a, 0x064a, 0 }; static const unichar_t str_fd17[] = { 0x0633, 0x0649, 0 }; static const unichar_t str_fd18[] = { 0x0633, 0x064a, 0 }; static const unichar_t str_fd19[] = { 0x0634, 0x0649, 0 }; static const unichar_t str_fd1a[] = { 0x0634, 0x064a, 0 }; static const unichar_t str_fd1b[] = { 0x062d, 0x0649, 0 }; static const unichar_t str_fd1c[] = { 0x062d, 0x064a, 0 }; static const unichar_t str_fd1d[] = { 0x062c, 0x0649, 0 }; static const unichar_t str_fd1e[] = { 0x062c, 0x064a, 0 }; static const unichar_t str_fd1f[] = { 0x062e, 0x0649, 0 }; static const unichar_t str_fd20[] = { 0x062e, 0x064a, 0 }; static const unichar_t str_fd21[] = { 0x0635, 0x0649, 0 }; static const unichar_t str_fd22[] = { 0x0635, 0x064a, 0 }; static const unichar_t str_fd23[] = { 0x0636, 0x0649, 0 }; static const unichar_t str_fd24[] = { 0x0636, 0x064a, 0 }; static const unichar_t str_fd25[] = { 0x0634, 0x062c, 0 }; static const unichar_t str_fd26[] = { 0x0634, 0x062d, 0 }; static const unichar_t str_fd27[] = { 0x0634, 0x062e, 0 }; static const unichar_t str_fd28[] = { 0x0634, 0x0645, 0 }; static const unichar_t str_fd29[] = { 0x0634, 0x0631, 0 }; static const unichar_t str_fd2a[] = { 0x0633, 0x0631, 0 }; static const unichar_t str_fd2b[] = { 0x0635, 0x0631, 0 }; static const unichar_t str_fd2c[] = { 0x0636, 0x0631, 0 }; static const unichar_t str_fd2d[] = { 0x0634, 0x062c, 0 }; static const unichar_t str_fd2e[] = { 0x0634, 0x062d, 0 }; static const unichar_t str_fd2f[] = { 0x0634, 0x062e, 0 }; static const unichar_t str_fd30[] = { 0x0634, 0x0645, 0 }; static const unichar_t str_fd31[] = { 0x0633, 0x0647, 0 }; static const unichar_t str_fd32[] = { 0x0634, 0x0647, 0 }; static const unichar_t str_fd33[] = { 0x0637, 0x0645, 0 }; static const unichar_t str_fd34[] = { 0x0633, 0x062c, 0 }; static const unichar_t str_fd35[] = { 0x0633, 0x062d, 0 }; static const unichar_t str_fd36[] = { 0x0633, 0x062e, 0 }; static const unichar_t str_fd37[] = { 0x0634, 0x062c, 0 }; static const unichar_t str_fd38[] = { 0x0634, 0x062d, 0 }; static const unichar_t str_fd39[] = { 0x0634, 0x062e, 0 }; static const unichar_t str_fd3a[] = { 0x0637, 0x0645, 0 }; static const unichar_t str_fd3b[] = { 0x0638, 0x0645, 0 }; static const unichar_t str_fd3c[] = { 0x0627, 0x064b, 0 }; static const unichar_t str_fd3d[] = { 0x0627, 0x064b, 0 }; static const unichar_t str_fd50[] = { 0x062a, 0x062c, 0x0645, 0 }; static const unichar_t str_fd51[] = { 0x062a, 0x062d, 0x062c, 0 }; static const unichar_t str_fd52[] = { 0x062a, 0x062d, 0x062c, 0 }; static const unichar_t str_fd53[] = { 0x062a, 0x062d, 0x0645, 0 }; static const unichar_t str_fd54[] = { 0x062a, 0x062e, 0x0645, 0 }; static const unichar_t str_fd55[] = { 0x062a, 0x0645, 0x062c, 0 }; static const unichar_t str_fd56[] = { 0x062a, 0x0645, 0x062d, 0 }; static const unichar_t str_fd57[] = { 0x062a, 0x0645, 0x062e, 0 }; static const unichar_t str_fd58[] = { 0x062c, 0x0645, 0x062d, 0 }; static const unichar_t str_fd59[] = { 0x062c, 0x0645, 0x062d, 0 }; static const unichar_t str_fd5a[] = { 0x062d, 0x0645, 0x064a, 0 }; static const unichar_t str_fd5b[] = { 0x062d, 0x0645, 0x0649, 0 }; static const unichar_t str_fd5c[] = { 0x0633, 0x062d, 0x062c, 0 }; static const unichar_t str_fd5d[] = { 0x0633, 0x062c, 0x062d, 0 }; static const unichar_t str_fd5e[] = { 0x0633, 0x062c, 0x0649, 0 }; static const unichar_t str_fd5f[] = { 0x0633, 0x0645, 0x062d, 0 }; static const unichar_t str_fd60[] = { 0x0633, 0x0645, 0x062d, 0 }; static const unichar_t str_fd61[] = { 0x0633, 0x0645, 0x062c, 0 }; static const unichar_t str_fd62[] = { 0x0633, 0x0645, 0x0645, 0 }; static const unichar_t str_fd63[] = { 0x0633, 0x0645, 0x0645, 0 }; static const unichar_t str_fd64[] = { 0x0635, 0x062d, 0x062d, 0 }; static const unichar_t str_fd65[] = { 0x0635, 0x062d, 0x062d, 0 }; static const unichar_t str_fd66[] = { 0x0635, 0x0645, 0x0645, 0 }; static const unichar_t str_fd67[] = { 0x0634, 0x062d, 0x0645, 0 }; static const unichar_t str_fd68[] = { 0x0634, 0x062d, 0x0645, 0 }; static const unichar_t str_fd69[] = { 0x0634, 0x062c, 0x064a, 0 }; static const unichar_t str_fd6a[] = { 0x0634, 0x0645, 0x062e, 0 }; static const unichar_t str_fd6b[] = { 0x0634, 0x0645, 0x062e, 0 }; static const unichar_t str_fd6c[] = { 0x0634, 0x0645, 0x0645, 0 }; static const unichar_t str_fd6d[] = { 0x0634, 0x0645, 0x0645, 0 }; static const unichar_t str_fd6e[] = { 0x0636, 0x062d, 0x0649, 0 }; static const unichar_t str_fd6f[] = { 0x0636, 0x062e, 0x0645, 0 }; static const unichar_t str_fd70[] = { 0x0636, 0x062e, 0x0645, 0 }; static const unichar_t str_fd71[] = { 0x0637, 0x0645, 0x062d, 0 }; static const unichar_t str_fd72[] = { 0x0637, 0x0645, 0x062d, 0 }; static const unichar_t str_fd73[] = { 0x0637, 0x0645, 0x0645, 0 }; static const unichar_t str_fd74[] = { 0x0637, 0x0645, 0x064a, 0 }; static const unichar_t str_fd75[] = { 0x0639, 0x062c, 0x0645, 0 }; static const unichar_t str_fd76[] = { 0x0639, 0x0645, 0x0645, 0 }; static const unichar_t str_fd77[] = { 0x0639, 0x0645, 0x0645, 0 }; static const unichar_t str_fd78[] = { 0x0639, 0x0645, 0x0649, 0 }; static const unichar_t str_fd79[] = { 0x063a, 0x0645, 0x0645, 0 }; static const unichar_t str_fd7a[] = { 0x063a, 0x0645, 0x064a, 0 }; static const unichar_t str_fd7b[] = { 0x063a, 0x0645, 0x0649, 0 }; static const unichar_t str_fd7c[] = { 0x0641, 0x062e, 0x0645, 0 }; static const unichar_t str_fd7d[] = { 0x0641, 0x062e, 0x0645, 0 }; static const unichar_t str_fd7e[] = { 0x0642, 0x0645, 0x062d, 0 }; static const unichar_t str_fd7f[] = { 0x0642, 0x0645, 0x0645, 0 }; static const unichar_t str_fd80[] = { 0x0644, 0x062d, 0x0645, 0 }; static const unichar_t str_fd81[] = { 0x0644, 0x062d, 0x064a, 0 }; static const unichar_t str_fd82[] = { 0x0644, 0x062d, 0x0649, 0 }; static const unichar_t str_fd83[] = { 0x0644, 0x062c, 0x062c, 0 }; static const unichar_t str_fd84[] = { 0x0644, 0x062c, 0x062c, 0 }; static const unichar_t str_fd85[] = { 0x0644, 0x062e, 0x0645, 0 }; static const unichar_t str_fd86[] = { 0x0644, 0x062e, 0x0645, 0 }; static const unichar_t str_fd87[] = { 0x0644, 0x0645, 0x062d, 0 }; static const unichar_t str_fd88[] = { 0x0644, 0x0645, 0x062d, 0 }; static const unichar_t str_fd89[] = { 0x0645, 0x062d, 0x062c, 0 }; static const unichar_t str_fd8a[] = { 0x0645, 0x062d, 0x0645, 0 }; static const unichar_t str_fd8b[] = { 0x0645, 0x062d, 0x064a, 0 }; static const unichar_t str_fd8c[] = { 0x0645, 0x062c, 0x062d, 0 }; static const unichar_t str_fd8d[] = { 0x0645, 0x062c, 0x0645, 0 }; static const unichar_t str_fd8e[] = { 0x0645, 0x062e, 0x062c, 0 }; static const unichar_t str_fd8f[] = { 0x0645, 0x062e, 0x0645, 0 }; static const unichar_t str_fd92[] = { 0x0645, 0x062c, 0x062e, 0 }; static const unichar_t str_fd93[] = { 0x0647, 0x0645, 0x062c, 0 }; static const unichar_t str_fd94[] = { 0x0647, 0x0645, 0x0645, 0 }; static const unichar_t str_fd95[] = { 0x0646, 0x062d, 0x0645, 0 }; static const unichar_t str_fd96[] = { 0x0646, 0x062d, 0x0649, 0 }; static const unichar_t str_fd97[] = { 0x0646, 0x062c, 0x0645, 0 }; static const unichar_t str_fd98[] = { 0x0646, 0x062c, 0x0645, 0 }; static const unichar_t str_fd99[] = { 0x0646, 0x062c, 0x0649, 0 }; static const unichar_t str_fd9a[] = { 0x0646, 0x0645, 0x064a, 0 }; static const unichar_t str_fd9b[] = { 0x0646, 0x0645, 0x0649, 0 }; static const unichar_t str_fd9c[] = { 0x064a, 0x0645, 0x0645, 0 }; static const unichar_t str_fd9d[] = { 0x064a, 0x0645, 0x0645, 0 }; static const unichar_t str_fd9e[] = { 0x0628, 0x062e, 0x064a, 0 }; static const unichar_t str_fd9f[] = { 0x062a, 0x062c, 0x064a, 0 }; static const unichar_t str_fda0[] = { 0x062a, 0x062c, 0x0649, 0 }; static const unichar_t str_fda1[] = { 0x062a, 0x062e, 0x064a, 0 }; static const unichar_t str_fda2[] = { 0x062a, 0x062e, 0x0649, 0 }; static const unichar_t str_fda3[] = { 0x062a, 0x0645, 0x064a, 0 }; static const unichar_t str_fda4[] = { 0x062a, 0x0645, 0x0649, 0 }; static const unichar_t str_fda5[] = { 0x062c, 0x0645, 0x064a, 0 }; static const unichar_t str_fda6[] = { 0x062c, 0x062d, 0x0649, 0 }; static const unichar_t str_fda7[] = { 0x062c, 0x0645, 0x0649, 0 }; static const unichar_t str_fda8[] = { 0x0633, 0x062e, 0x0649, 0 }; static const unichar_t str_fda9[] = { 0x0635, 0x062d, 0x064a, 0 }; static const unichar_t str_fdaa[] = { 0x0634, 0x062d, 0x064a, 0 }; static const unichar_t str_fdab[] = { 0x0636, 0x062d, 0x064a, 0 }; static const unichar_t str_fdac[] = { 0x0644, 0x062c, 0x064a, 0 }; static const unichar_t str_fdad[] = { 0x0644, 0x0645, 0x064a, 0 }; static const unichar_t str_fdae[] = { 0x064a, 0x062d, 0x064a, 0 }; static const unichar_t str_fdaf[] = { 0x064a, 0x062c, 0x064a, 0 }; static const unichar_t str_fdb0[] = { 0x064a, 0x0645, 0x064a, 0 }; static const unichar_t str_fdb1[] = { 0x0645, 0x0645, 0x064a, 0 }; static const unichar_t str_fdb2[] = { 0x0642, 0x0645, 0x064a, 0 }; static const unichar_t str_fdb3[] = { 0x0646, 0x062d, 0x064a, 0 }; static const unichar_t str_fdb4[] = { 0x0642, 0x0645, 0x062d, 0 }; static const unichar_t str_fdb5[] = { 0x0644, 0x062d, 0x0645, 0 }; static const unichar_t str_fdb6[] = { 0x0639, 0x0645, 0x064a, 0 }; static const unichar_t str_fdb7[] = { 0x0643, 0x0645, 0x064a, 0 }; static const unichar_t str_fdb8[] = { 0x0646, 0x062c, 0x062d, 0 }; static const unichar_t str_fdb9[] = { 0x0645, 0x062e, 0x064a, 0 }; static const unichar_t str_fdba[] = { 0x0644, 0x062c, 0x0645, 0 }; static const unichar_t str_fdbb[] = { 0x0643, 0x0645, 0x0645, 0 }; static const unichar_t str_fdbc[] = { 0x0644, 0x062c, 0x0645, 0 }; static const unichar_t str_fdbd[] = { 0x0646, 0x062c, 0x062d, 0 }; static const unichar_t str_fdbe[] = { 0x062c, 0x062d, 0x064a, 0 }; static const unichar_t str_fdbf[] = { 0x062d, 0x062c, 0x064a, 0 }; static const unichar_t str_fdc0[] = { 0x0645, 0x062c, 0x064a, 0 }; static const unichar_t str_fdc1[] = { 0x0641, 0x0645, 0x064a, 0 }; static const unichar_t str_fdc2[] = { 0x0628, 0x062d, 0x064a, 0 }; static const unichar_t str_fdc3[] = { 0x0643, 0x0645, 0x0645, 0 }; static const unichar_t str_fdc4[] = { 0x0639, 0x062c, 0x0645, 0 }; static const unichar_t str_fdc5[] = { 0x0635, 0x0645, 0x0645, 0 }; static const unichar_t str_fdc6[] = { 0x0633, 0x062e, 0x064a, 0 }; static const unichar_t str_fdc7[] = { 0x0646, 0x062c, 0x064a, 0 }; static const unichar_t str_fdf0[] = { 0x0635, 0x0644, 0x06d2, 0 }; static const unichar_t str_fdf1[] = { 0x0642, 0x0644, 0x06d2, 0 }; static const unichar_t str_fdf2[] = { 0x0627, 0x0644, 0x0644, 0x0647, 0 }; static const unichar_t str_fdf3[] = { 0x0627, 0x0643, 0x0628, 0x0631, 0 }; static const unichar_t str_fdf4[] = { 0x0645, 0x062d, 0x0645, 0x062f, 0 }; static const unichar_t str_fdf5[] = { 0x0635, 0x0644, 0x0639, 0x0645, 0 }; static const unichar_t str_fdf6[] = { 0x0631, 0x0633, 0x0648, 0x0644, 0 }; static const unichar_t str_fdf7[] = { 0x0639, 0x0644, 0x064a, 0x0647, 0 }; static const unichar_t str_fdf8[] = { 0x0648, 0x0633, 0x0644, 0x0645, 0 }; static const unichar_t str_fdf9[] = { 0x0635, 0x0644, 0x0649, 0 }; static const unichar_t str_fdfa[] = { 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064a, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0 }; static const unichar_t str_fdfb[] = { 0x062c, 0x0644, 0x0020, 0x062c, 0x0644, 0x0627, 0x0644, 0x0647, 0 }; static const unichar_t str_fdfc[] = { 0x0631, 0x06cc, 0x0627, 0x0644, 0 }; static const unichar_t str_fe10[] = { 0x002c, 0 }; static const unichar_t str_fe11[] = { 0x3001, 0 }; static const unichar_t str_fe12[] = { 0x3002, 0 }; static const unichar_t str_fe13[] = { 0x003a, 0 }; static const unichar_t str_fe14[] = { 0x003b, 0 }; static const unichar_t str_fe15[] = { 0x0021, 0 }; static const unichar_t str_fe16[] = { 0x003f, 0 }; static const unichar_t str_fe17[] = { 0x3016, 0 }; static const unichar_t str_fe18[] = { 0x3017, 0 }; static const unichar_t str_fe19[] = { 0x2026, 0 }; static const unichar_t str_fe30[] = { 0x2025, 0 }; static const unichar_t str_fe31[] = { 0x2014, 0 }; static const unichar_t str_fe32[] = { 0x2013, 0 }; static const unichar_t str_fe33[] = { 0x005f, 0 }; static const unichar_t str_fe34[] = { 0x005f, 0 }; static const unichar_t str_fe35[] = { 0x0028, 0 }; static const unichar_t str_fe36[] = { 0x0029, 0 }; static const unichar_t str_fe37[] = { 0x007b, 0 }; static const unichar_t str_fe38[] = { 0x007d, 0 }; static const unichar_t str_fe39[] = { 0x3014, 0 }; static const unichar_t str_fe3a[] = { 0x3015, 0 }; static const unichar_t str_fe3b[] = { 0x3010, 0 }; static const unichar_t str_fe3c[] = { 0x3011, 0 }; static const unichar_t str_fe3d[] = { 0x300a, 0 }; static const unichar_t str_fe3e[] = { 0x300b, 0 }; static const unichar_t str_fe3f[] = { 0x3008, 0 }; static const unichar_t str_fe40[] = { 0x3009, 0 }; static const unichar_t str_fe41[] = { 0x300c, 0 }; static const unichar_t str_fe42[] = { 0x300d, 0 }; static const unichar_t str_fe43[] = { 0x300e, 0 }; static const unichar_t str_fe44[] = { 0x300f, 0 }; static const unichar_t str_fe47[] = { 0x005b, 0 }; static const unichar_t str_fe48[] = { 0x005d, 0 }; static const unichar_t str_fe49[] = { 0x203e, 0 }; static const unichar_t str_fe4a[] = { 0x203e, 0 }; static const unichar_t str_fe4b[] = { 0x203e, 0 }; static const unichar_t str_fe4c[] = { 0x203e, 0 }; static const unichar_t str_fe4d[] = { 0x005f, 0 }; static const unichar_t str_fe4e[] = { 0x005f, 0 }; static const unichar_t str_fe4f[] = { 0x005f, 0 }; static const unichar_t str_fe50[] = { 0x002c, 0 }; static const unichar_t str_fe51[] = { 0x3001, 0 }; static const unichar_t str_fe52[] = { 0x002e, 0 }; static const unichar_t str_fe54[] = { 0x003b, 0 }; static const unichar_t str_fe55[] = { 0x003a, 0 }; static const unichar_t str_fe56[] = { 0x003f, 0 }; static const unichar_t str_fe57[] = { 0x0021, 0 }; static const unichar_t str_fe58[] = { 0x2014, 0 }; static const unichar_t str_fe59[] = { 0x0028, 0 }; static const unichar_t str_fe5a[] = { 0x0029, 0 }; static const unichar_t str_fe5b[] = { 0x007b, 0 }; static const unichar_t str_fe5c[] = { 0x007d, 0 }; static const unichar_t str_fe5d[] = { 0x3014, 0 }; static const unichar_t str_fe5e[] = { 0x3015, 0 }; static const unichar_t str_fe5f[] = { 0x0023, 0 }; static const unichar_t str_fe60[] = { 0x0026, 0 }; static const unichar_t str_fe61[] = { 0x002a, 0 }; static const unichar_t str_fe62[] = { 0x002b, 0 }; static const unichar_t str_fe63[] = { 0x002d, 0 }; static const unichar_t str_fe64[] = { 0x003c, 0 }; static const unichar_t str_fe65[] = { 0x003e, 0 }; static const unichar_t str_fe66[] = { 0x003d, 0 }; static const unichar_t str_fe68[] = { 0x005c, 0 }; static const unichar_t str_fe69[] = { 0x0024, 0 }; static const unichar_t str_fe6a[] = { 0x0025, 0 }; static const unichar_t str_fe6b[] = { 0x0040, 0 }; static const unichar_t str_fe70[] = { 0x0020, 0x064b, 0 }; static const unichar_t str_fe71[] = { 0x0640, 0x064b, 0 }; static const unichar_t str_fe72[] = { 0x0020, 0x064c, 0 }; static const unichar_t str_fe74[] = { 0x0020, 0x064d, 0 }; static const unichar_t str_fe76[] = { 0x0020, 0x064e, 0 }; static const unichar_t str_fe77[] = { 0x0640, 0x064e, 0 }; static const unichar_t str_fe78[] = { 0x0020, 0x064f, 0 }; static const unichar_t str_fe79[] = { 0x0640, 0x064f, 0 }; static const unichar_t str_fe7a[] = { 0x0020, 0x0650, 0 }; static const unichar_t str_fe7b[] = { 0x0640, 0x0650, 0 }; static const unichar_t str_fe7c[] = { 0x0020, 0x0651, 0 }; static const unichar_t str_fe7d[] = { 0x0640, 0x0651, 0 }; static const unichar_t str_fe7e[] = { 0x0020, 0x0652, 0 }; static const unichar_t str_fe7f[] = { 0x0640, 0x0652, 0 }; static const unichar_t str_fe80[] = { 0x0621, 0 }; static const unichar_t str_fe81[] = { 0x0622, 0 }; static const unichar_t str_fe82[] = { 0x0622, 0 }; static const unichar_t str_fe83[] = { 0x0623, 0 }; static const unichar_t str_fe84[] = { 0x0623, 0 }; static const unichar_t str_fe85[] = { 0x0624, 0 }; static const unichar_t str_fe86[] = { 0x0624, 0 }; static const unichar_t str_fe87[] = { 0x0625, 0 }; static const unichar_t str_fe88[] = { 0x0625, 0 }; static const unichar_t str_fe89[] = { 0x0626, 0 }; static const unichar_t str_fe8a[] = { 0x0626, 0 }; static const unichar_t str_fe8b[] = { 0x0626, 0 }; static const unichar_t str_fe8c[] = { 0x0626, 0 }; static const unichar_t str_fe8d[] = { 0x0627, 0 }; static const unichar_t str_fe8e[] = { 0x0627, 0 }; static const unichar_t str_fe8f[] = { 0x0628, 0 }; static const unichar_t str_fe90[] = { 0x0628, 0 }; static const unichar_t str_fe91[] = { 0x0628, 0 }; static const unichar_t str_fe92[] = { 0x0628, 0 }; static const unichar_t str_fe93[] = { 0x0629, 0 }; static const unichar_t str_fe94[] = { 0x0629, 0 }; static const unichar_t str_fe95[] = { 0x062a, 0 }; static const unichar_t str_fe96[] = { 0x062a, 0 }; static const unichar_t str_fe97[] = { 0x062a, 0 }; static const unichar_t str_fe98[] = { 0x062a, 0 }; static const unichar_t str_fe99[] = { 0x062b, 0 }; static const unichar_t str_fe9a[] = { 0x062b, 0 }; static const unichar_t str_fe9b[] = { 0x062b, 0 }; static const unichar_t str_fe9c[] = { 0x062b, 0 }; static const unichar_t str_fe9d[] = { 0x062c, 0 }; static const unichar_t str_fe9e[] = { 0x062c, 0 }; static const unichar_t str_fe9f[] = { 0x062c, 0 }; static const unichar_t str_fea0[] = { 0x062c, 0 }; static const unichar_t str_fea1[] = { 0x062d, 0 }; static const unichar_t str_fea2[] = { 0x062d, 0 }; static const unichar_t str_fea3[] = { 0x062d, 0 }; static const unichar_t str_fea4[] = { 0x062d, 0 }; static const unichar_t str_fea5[] = { 0x062e, 0 }; static const unichar_t str_fea6[] = { 0x062e, 0 }; static const unichar_t str_fea7[] = { 0x062e, 0 }; static const unichar_t str_fea8[] = { 0x062e, 0 }; static const unichar_t str_fea9[] = { 0x062f, 0 }; static const unichar_t str_feaa[] = { 0x062f, 0 }; static const unichar_t str_feab[] = { 0x0630, 0 }; static const unichar_t str_feac[] = { 0x0630, 0 }; static const unichar_t str_fead[] = { 0x0631, 0 }; static const unichar_t str_feae[] = { 0x0631, 0 }; static const unichar_t str_feaf[] = { 0x0632, 0 }; static const unichar_t str_feb0[] = { 0x0632, 0 }; static const unichar_t str_feb1[] = { 0x0633, 0 }; static const unichar_t str_feb2[] = { 0x0633, 0 }; static const unichar_t str_feb3[] = { 0x0633, 0 }; static const unichar_t str_feb4[] = { 0x0633, 0 }; static const unichar_t str_feb5[] = { 0x0634, 0 }; static const unichar_t str_feb6[] = { 0x0634, 0 }; static const unichar_t str_feb7[] = { 0x0634, 0 }; static const unichar_t str_feb8[] = { 0x0634, 0 }; static const unichar_t str_feb9[] = { 0x0635, 0 }; static const unichar_t str_feba[] = { 0x0635, 0 }; static const unichar_t str_febb[] = { 0x0635, 0 }; static const unichar_t str_febc[] = { 0x0635, 0 }; static const unichar_t str_febd[] = { 0x0636, 0 }; static const unichar_t str_febe[] = { 0x0636, 0 }; static const unichar_t str_febf[] = { 0x0636, 0 }; static const unichar_t str_fec0[] = { 0x0636, 0 }; static const unichar_t str_fec1[] = { 0x0637, 0 }; static const unichar_t str_fec2[] = { 0x0637, 0 }; static const unichar_t str_fec3[] = { 0x0637, 0 }; static const unichar_t str_fec4[] = { 0x0637, 0 }; static const unichar_t str_fec5[] = { 0x0638, 0 }; static const unichar_t str_fec6[] = { 0x0638, 0 }; static const unichar_t str_fec7[] = { 0x0638, 0 }; static const unichar_t str_fec8[] = { 0x0638, 0 }; static const unichar_t str_fec9[] = { 0x0639, 0 }; static const unichar_t str_feca[] = { 0x0639, 0 }; static const unichar_t str_fecb[] = { 0x0639, 0 }; static const unichar_t str_fecc[] = { 0x0639, 0 }; static const unichar_t str_fecd[] = { 0x063a, 0 }; static const unichar_t str_fece[] = { 0x063a, 0 }; static const unichar_t str_fecf[] = { 0x063a, 0 }; static const unichar_t str_fed0[] = { 0x063a, 0 }; static const unichar_t str_fed1[] = { 0x0641, 0 }; static const unichar_t str_fed2[] = { 0x0641, 0 }; static const unichar_t str_fed3[] = { 0x0641, 0 }; static const unichar_t str_fed4[] = { 0x0641, 0 }; static const unichar_t str_fed5[] = { 0x0642, 0 }; static const unichar_t str_fed6[] = { 0x0642, 0 }; static const unichar_t str_fed7[] = { 0x0642, 0 }; static const unichar_t str_fed8[] = { 0x0642, 0 }; static const unichar_t str_fed9[] = { 0x0643, 0 }; static const unichar_t str_feda[] = { 0x0643, 0 }; static const unichar_t str_fedb[] = { 0x0643, 0 }; static const unichar_t str_fedc[] = { 0x0643, 0 }; static const unichar_t str_fedd[] = { 0x0644, 0 }; static const unichar_t str_fede[] = { 0x0644, 0 }; static const unichar_t str_fedf[] = { 0x0644, 0 }; static const unichar_t str_fee0[] = { 0x0644, 0 }; static const unichar_t str_fee1[] = { 0x0645, 0 }; static const unichar_t str_fee2[] = { 0x0645, 0 }; static const unichar_t str_fee3[] = { 0x0645, 0 }; static const unichar_t str_fee4[] = { 0x0645, 0 }; static const unichar_t str_fee5[] = { 0x0646, 0 }; static const unichar_t str_fee6[] = { 0x0646, 0 }; static const unichar_t str_fee7[] = { 0x0646, 0 }; static const unichar_t str_fee8[] = { 0x0646, 0 }; static const unichar_t str_fee9[] = { 0x0647, 0 }; static const unichar_t str_feea[] = { 0x0647, 0 }; static const unichar_t str_feeb[] = { 0x0647, 0 }; static const unichar_t str_feec[] = { 0x0647, 0 }; static const unichar_t str_feed[] = { 0x0648, 0 }; static const unichar_t str_feee[] = { 0x0648, 0 }; static const unichar_t str_feef[] = { 0x0649, 0 }; static const unichar_t str_fef0[] = { 0x0649, 0 }; static const unichar_t str_fef1[] = { 0x064a, 0 }; static const unichar_t str_fef2[] = { 0x064a, 0 }; static const unichar_t str_fef3[] = { 0x064a, 0 }; static const unichar_t str_fef4[] = { 0x064a, 0 }; static const unichar_t str_fef5[] = { 0x0644, 0x0622, 0 }; static const unichar_t str_fef6[] = { 0x0644, 0x0622, 0 }; static const unichar_t str_fef7[] = { 0x0644, 0x0623, 0 }; static const unichar_t str_fef8[] = { 0x0644, 0x0623, 0 }; static const unichar_t str_fef9[] = { 0x0644, 0x0625, 0 }; static const unichar_t str_fefa[] = { 0x0644, 0x0625, 0 }; static const unichar_t str_fefb[] = { 0x0644, 0x0627, 0 }; static const unichar_t str_fefc[] = { 0x0644, 0x0627, 0 }; static const unichar_t str_ff01[] = { 0x0021, 0 }; static const unichar_t str_ff02[] = { 0x0022, 0 }; static const unichar_t str_ff03[] = { 0x0023, 0 }; static const unichar_t str_ff04[] = { 0x0024, 0 }; static const unichar_t str_ff05[] = { 0x0025, 0 }; static const unichar_t str_ff06[] = { 0x0026, 0 }; static const unichar_t str_ff07[] = { 0x0027, 0 }; static const unichar_t str_ff08[] = { 0x0028, 0 }; static const unichar_t str_ff09[] = { 0x0029, 0 }; static const unichar_t str_ff0a[] = { 0x002a, 0 }; static const unichar_t str_ff0b[] = { 0x002b, 0 }; static const unichar_t str_ff0c[] = { 0x002c, 0 }; static const unichar_t str_ff0d[] = { 0x002d, 0 }; static const unichar_t str_ff0e[] = { 0x002e, 0 }; static const unichar_t str_ff0f[] = { 0x002f, 0 }; static const unichar_t str_ff10[] = { 0x0030, 0 }; static const unichar_t str_ff11[] = { 0x0031, 0 }; static const unichar_t str_ff12[] = { 0x0032, 0 }; static const unichar_t str_ff13[] = { 0x0033, 0 }; static const unichar_t str_ff14[] = { 0x0034, 0 }; static const unichar_t str_ff15[] = { 0x0035, 0 }; static const unichar_t str_ff16[] = { 0x0036, 0 }; static const unichar_t str_ff17[] = { 0x0037, 0 }; static const unichar_t str_ff18[] = { 0x0038, 0 }; static const unichar_t str_ff19[] = { 0x0039, 0 }; static const unichar_t str_ff1a[] = { 0x003a, 0 }; static const unichar_t str_ff1b[] = { 0x003b, 0 }; static const unichar_t str_ff1c[] = { 0x003c, 0 }; static const unichar_t str_ff1d[] = { 0x003d, 0 }; static const unichar_t str_ff1e[] = { 0x003e, 0 }; static const unichar_t str_ff1f[] = { 0x003f, 0 }; static const unichar_t str_ff20[] = { 0x0040, 0 }; static const unichar_t str_ff21[] = { 0x0041, 0 }; static const unichar_t str_ff22[] = { 0x0042, 0 }; static const unichar_t str_ff23[] = { 0x0043, 0 }; static const unichar_t str_ff24[] = { 0x0044, 0 }; static const unichar_t str_ff25[] = { 0x0045, 0 }; static const unichar_t str_ff26[] = { 0x0046, 0 }; static const unichar_t str_ff27[] = { 0x0047, 0 }; static const unichar_t str_ff28[] = { 0x0048, 0 }; static const unichar_t str_ff29[] = { 0x0049, 0 }; static const unichar_t str_ff2a[] = { 0x004a, 0 }; static const unichar_t str_ff2b[] = { 0x004b, 0 }; static const unichar_t str_ff2c[] = { 0x004c, 0 }; static const unichar_t str_ff2d[] = { 0x004d, 0 }; static const unichar_t str_ff2e[] = { 0x004e, 0 }; static const unichar_t str_ff2f[] = { 0x004f, 0 }; static const unichar_t str_ff30[] = { 0x0050, 0 }; static const unichar_t str_ff31[] = { 0x0051, 0 }; static const unichar_t str_ff32[] = { 0x0052, 0 }; static const unichar_t str_ff33[] = { 0x0053, 0 }; static const unichar_t str_ff34[] = { 0x0054, 0 }; static const unichar_t str_ff35[] = { 0x0055, 0 }; static const unichar_t str_ff36[] = { 0x0056, 0 }; static const unichar_t str_ff37[] = { 0x0057, 0 }; static const unichar_t str_ff38[] = { 0x0058, 0 }; static const unichar_t str_ff39[] = { 0x0059, 0 }; static const unichar_t str_ff3a[] = { 0x005a, 0 }; static const unichar_t str_ff3b[] = { 0x005b, 0 }; static const unichar_t str_ff3c[] = { 0x005c, 0 }; static const unichar_t str_ff3d[] = { 0x005d, 0 }; static const unichar_t str_ff3e[] = { 0x005e, 0 }; static const unichar_t str_ff3f[] = { 0x005f, 0 }; static const unichar_t str_ff40[] = { 0x0060, 0 }; static const unichar_t str_ff41[] = { 0x0061, 0 }; static const unichar_t str_ff42[] = { 0x0062, 0 }; static const unichar_t str_ff43[] = { 0x0063, 0 }; static const unichar_t str_ff44[] = { 0x0064, 0 }; static const unichar_t str_ff45[] = { 0x0065, 0 }; static const unichar_t str_ff46[] = { 0x0066, 0 }; static const unichar_t str_ff47[] = { 0x0067, 0 }; static const unichar_t str_ff48[] = { 0x0068, 0 }; static const unichar_t str_ff49[] = { 0x0069, 0 }; static const unichar_t str_ff4a[] = { 0x006a, 0 }; static const unichar_t str_ff4b[] = { 0x006b, 0 }; static const unichar_t str_ff4c[] = { 0x006c, 0 }; static const unichar_t str_ff4d[] = { 0x006d, 0 }; static const unichar_t str_ff4e[] = { 0x006e, 0 }; static const unichar_t str_ff4f[] = { 0x006f, 0 }; static const unichar_t str_ff50[] = { 0x0070, 0 }; static const unichar_t str_ff51[] = { 0x0071, 0 }; static const unichar_t str_ff52[] = { 0x0072, 0 }; static const unichar_t str_ff53[] = { 0x0073, 0 }; static const unichar_t str_ff54[] = { 0x0074, 0 }; static const unichar_t str_ff55[] = { 0x0075, 0 }; static const unichar_t str_ff56[] = { 0x0076, 0 }; static const unichar_t str_ff57[] = { 0x0077, 0 }; static const unichar_t str_ff58[] = { 0x0078, 0 }; static const unichar_t str_ff59[] = { 0x0079, 0 }; static const unichar_t str_ff5a[] = { 0x007a, 0 }; static const unichar_t str_ff5b[] = { 0x007b, 0 }; static const unichar_t str_ff5c[] = { 0x007c, 0 }; static const unichar_t str_ff5d[] = { 0x007d, 0 }; static const unichar_t str_ff5e[] = { 0x007e, 0 }; static const unichar_t str_ff5f[] = { 0x2985, 0 }; static const unichar_t str_ff60[] = { 0x2986, 0 }; static const unichar_t str_ff61[] = { 0x3002, 0 }; static const unichar_t str_ff62[] = { 0x300c, 0 }; static const unichar_t str_ff63[] = { 0x300d, 0 }; static const unichar_t str_ff64[] = { 0x3001, 0 }; static const unichar_t str_ff65[] = { 0x30fb, 0 }; static const unichar_t str_ff66[] = { 0x30f2, 0 }; static const unichar_t str_ff67[] = { 0x30a1, 0 }; static const unichar_t str_ff68[] = { 0x30a3, 0 }; static const unichar_t str_ff69[] = { 0x30a5, 0 }; static const unichar_t str_ff6a[] = { 0x30a7, 0 }; static const unichar_t str_ff6b[] = { 0x30a9, 0 }; static const unichar_t str_ff6c[] = { 0x30e3, 0 }; static const unichar_t str_ff6d[] = { 0x30e5, 0 }; static const unichar_t str_ff6e[] = { 0x30e7, 0 }; static const unichar_t str_ff6f[] = { 0x30c3, 0 }; static const unichar_t str_ff70[] = { 0x30fc, 0 }; static const unichar_t str_ff71[] = { 0x30a2, 0 }; static const unichar_t str_ff72[] = { 0x30a4, 0 }; static const unichar_t str_ff73[] = { 0x30a6, 0 }; static const unichar_t str_ff74[] = { 0x30a8, 0 }; static const unichar_t str_ff75[] = { 0x30aa, 0 }; static const unichar_t str_ff76[] = { 0x30ab, 0 }; static const unichar_t str_ff77[] = { 0x30ad, 0 }; static const unichar_t str_ff78[] = { 0x30af, 0 }; static const unichar_t str_ff79[] = { 0x30b1, 0 }; static const unichar_t str_ff7a[] = { 0x30b3, 0 }; static const unichar_t str_ff7b[] = { 0x30b5, 0 }; static const unichar_t str_ff7c[] = { 0x30b7, 0 }; static const unichar_t str_ff7d[] = { 0x30b9, 0 }; static const unichar_t str_ff7e[] = { 0x30bb, 0 }; static const unichar_t str_ff7f[] = { 0x30bd, 0 }; static const unichar_t str_ff80[] = { 0x30bf, 0 }; static const unichar_t str_ff81[] = { 0x30c1, 0 }; static const unichar_t str_ff82[] = { 0x30c4, 0 }; static const unichar_t str_ff83[] = { 0x30c6, 0 }; static const unichar_t str_ff84[] = { 0x30c8, 0 }; static const unichar_t str_ff85[] = { 0x30ca, 0 }; static const unichar_t str_ff86[] = { 0x30cb, 0 }; static const unichar_t str_ff87[] = { 0x30cc, 0 }; static const unichar_t str_ff88[] = { 0x30cd, 0 }; static const unichar_t str_ff89[] = { 0x30ce, 0 }; static const unichar_t str_ff8a[] = { 0x30cf, 0 }; static const unichar_t str_ff8b[] = { 0x30d2, 0 }; static const unichar_t str_ff8c[] = { 0x30d5, 0 }; static const unichar_t str_ff8d[] = { 0x30d8, 0 }; static const unichar_t str_ff8e[] = { 0x30db, 0 }; static const unichar_t str_ff8f[] = { 0x30de, 0 }; static const unichar_t str_ff90[] = { 0x30df, 0 }; static const unichar_t str_ff91[] = { 0x30e0, 0 }; static const unichar_t str_ff92[] = { 0x30e1, 0 }; static const unichar_t str_ff93[] = { 0x30e2, 0 }; static const unichar_t str_ff94[] = { 0x30e4, 0 }; static const unichar_t str_ff95[] = { 0x30e6, 0 }; static const unichar_t str_ff96[] = { 0x30e8, 0 }; static const unichar_t str_ff97[] = { 0x30e9, 0 }; static const unichar_t str_ff98[] = { 0x30ea, 0 }; static const unichar_t str_ff99[] = { 0x30eb, 0 }; static const unichar_t str_ff9a[] = { 0x30ec, 0 }; static const unichar_t str_ff9b[] = { 0x30ed, 0 }; static const unichar_t str_ff9c[] = { 0x30ef, 0 }; static const unichar_t str_ff9d[] = { 0x30f3, 0 }; static const unichar_t str_ff9e[] = { 0x3099, 0 }; static const unichar_t str_ff9f[] = { 0x309a, 0 }; static const unichar_t str_ffa0[] = { 0x3164, 0 }; static const unichar_t str_ffa1[] = { 0x3131, 0 }; static const unichar_t str_ffa2[] = { 0x3132, 0 }; static const unichar_t str_ffa3[] = { 0x3133, 0 }; static const unichar_t str_ffa4[] = { 0x3134, 0 }; static const unichar_t str_ffa5[] = { 0x3135, 0 }; static const unichar_t str_ffa6[] = { 0x3136, 0 }; static const unichar_t str_ffa7[] = { 0x3137, 0 }; static const unichar_t str_ffa8[] = { 0x3138, 0 }; static const unichar_t str_ffa9[] = { 0x3139, 0 }; static const unichar_t str_ffaa[] = { 0x313a, 0 }; static const unichar_t str_ffab[] = { 0x313b, 0 }; static const unichar_t str_ffac[] = { 0x313c, 0 }; static const unichar_t str_ffad[] = { 0x313d, 0 }; static const unichar_t str_ffae[] = { 0x313e, 0 }; static const unichar_t str_ffaf[] = { 0x313f, 0 }; static const unichar_t str_ffb0[] = { 0x3140, 0 }; static const unichar_t str_ffb1[] = { 0x3141, 0 }; static const unichar_t str_ffb2[] = { 0x3142, 0 }; static const unichar_t str_ffb3[] = { 0x3143, 0 }; static const unichar_t str_ffb4[] = { 0x3144, 0 }; static const unichar_t str_ffb5[] = { 0x3145, 0 }; static const unichar_t str_ffb6[] = { 0x3146, 0 }; static const unichar_t str_ffb7[] = { 0x3147, 0 }; static const unichar_t str_ffb8[] = { 0x3148, 0 }; static const unichar_t str_ffb9[] = { 0x3149, 0 }; static const unichar_t str_ffba[] = { 0x314a, 0 }; static const unichar_t str_ffbb[] = { 0x314b, 0 }; static const unichar_t str_ffbc[] = { 0x314c, 0 }; static const unichar_t str_ffbd[] = { 0x314d, 0 }; static const unichar_t str_ffbe[] = { 0x314e, 0 }; static const unichar_t str_ffc2[] = { 0x314f, 0 }; static const unichar_t str_ffc3[] = { 0x3150, 0 }; static const unichar_t str_ffc4[] = { 0x3151, 0 }; static const unichar_t str_ffc5[] = { 0x3152, 0 }; static const unichar_t str_ffc6[] = { 0x3153, 0 }; static const unichar_t str_ffc7[] = { 0x3154, 0 }; static const unichar_t str_ffca[] = { 0x3155, 0 }; static const unichar_t str_ffcb[] = { 0x3156, 0 }; static const unichar_t str_ffcc[] = { 0x3157, 0 }; static const unichar_t str_ffcd[] = { 0x3158, 0 }; static const unichar_t str_ffce[] = { 0x3159, 0 }; static const unichar_t str_ffcf[] = { 0x315a, 0 }; static const unichar_t str_ffd2[] = { 0x315b, 0 }; static const unichar_t str_ffd3[] = { 0x315c, 0 }; static const unichar_t str_ffd4[] = { 0x315d, 0 }; static const unichar_t str_ffd5[] = { 0x315e, 0 }; static const unichar_t str_ffd6[] = { 0x315f, 0 }; static const unichar_t str_ffd7[] = { 0x3160, 0 }; static const unichar_t str_ffda[] = { 0x3161, 0 }; static const unichar_t str_ffdb[] = { 0x3162, 0 }; static const unichar_t str_ffdc[] = { 0x3163, 0 }; static const unichar_t str_ffe0[] = { 0x00a2, 0 }; static const unichar_t str_ffe1[] = { 0x00a3, 0 }; static const unichar_t str_ffe2[] = { 0x00ac, 0 }; static const unichar_t str_ffe3[] = { 0x00af, 0 }; static const unichar_t str_ffe4[] = { 0x00a6, 0 }; static const unichar_t str_ffe5[] = { 0x00a5, 0 }; static const unichar_t str_ffe6[] = { 0x20a9, 0 }; static const unichar_t str_ffe8[] = { 0x2502, 0 }; static const unichar_t str_ffe9[] = { 0x2190, 0 }; static const unichar_t str_ffea[] = { 0x2191, 0 }; static const unichar_t str_ffeb[] = { 0x2192, 0 }; static const unichar_t str_ffec[] = { 0x2193, 0 }; static const unichar_t str_ffed[] = { 0x25a0, 0 }; static const unichar_t str_ffee[] = { 0x25cb, 0 }; static const unichar_t *const up_allzeros[256] = { NULL }; static const unichar_t * const tab_0[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_a0, 0, 0, 0, 0, 0, 0, 0, str_a8, 0, str_aa, 0, 0, 0, 0, str_af, 0, 0, str_b2, str_b3, str_b4, str_b5, 0, 0, str_b8, str_b9, str_ba, 0, str_bc, str_bd, str_be, 0, str_c0, str_c1, str_c2, str_c3, str_c4, str_c5, 0, str_c7, str_c8, str_c9, str_ca, str_cb, str_cc, str_cd, str_ce, str_cf, 0, str_d1, str_d2, str_d3, str_d4, str_d5, str_d6, 0, 0, str_d9, str_da, str_db, str_dc, str_dd, 0, 0, str_e0, str_e1, str_e2, str_e3, str_e4, str_e5, 0, str_e7, str_e8, str_e9, str_ea, str_eb, str_ec, str_ed, str_ee, str_ef, 0, str_f1, str_f2, str_f3, str_f4, str_f5, str_f6, 0, 0, str_f9, str_fa, str_fb, str_fc, str_fd, 0, str_ff, 0}; static const unichar_t * const tab_1[] = { str_100, str_101, str_102, str_103, str_104, str_105, str_106, str_107, str_108, str_109, str_10a, str_10b, str_10c, str_10d, str_10e, str_10f, str_110, 0, str_112, str_113, str_114, str_115, str_116, str_117, str_118, str_119, str_11a, str_11b, str_11c, str_11d, str_11e, str_11f, str_120, str_121, str_122, str_123, str_124, str_125, 0, 0, str_128, str_129, str_12a, str_12b, str_12c, str_12d, str_12e, str_12f, str_130, 0, str_132, str_133, str_134, str_135, str_136, str_137, str_138, str_139, str_13a, str_13b, str_13c, str_13d, str_13e, str_13f, str_140, 0, 0, str_143, str_144, str_145, str_146, str_147, str_148, str_149, 0, 0, str_14c, str_14d, str_14e, str_14f, str_150, str_151, str_152, str_153, str_154, str_155, str_156, str_157, str_158, str_159, str_15a, str_15b, str_15c, str_15d, str_15e, str_15f, str_160, str_161, str_162, str_163, str_164, str_165, 0, 0, str_168, str_169, str_16a, str_16b, str_16c, str_16d, str_16e, str_16f, str_170, str_171, str_172, str_173, str_174, str_175, str_176, str_177, str_178, str_179, str_17a, str_17b, str_17c, str_17d, str_17e, str_17f, 0, 0, str_182, 0, 0, 0, 0, 0, 0, str_189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_19e, str_19f, str_1a0, str_1a1, 0, 0, 0, 0, 0, 0, 0, str_1a9, 0, 0, 0, 0, 0, str_1af, str_1b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1c0, str_1c1, 0, 0, str_1c4, str_1c5, str_1c6, str_1c7, str_1c8, str_1c9, str_1ca, str_1cb, str_1cc, str_1cd, str_1ce, str_1cf, str_1d0, str_1d1, str_1d2, str_1d3, str_1d4, str_1d5, str_1d6, str_1d7, str_1d8, str_1d9, str_1da, str_1db, str_1dc, 0, str_1de, str_1df, str_1e0, str_1e1, str_1e2, str_1e3, 0, 0, str_1e6, str_1e7, str_1e8, str_1e9, str_1ea, str_1eb, str_1ec, str_1ed, str_1ee, str_1ef, str_1f0, str_1f1, str_1f2, str_1f3, str_1f4, str_1f5, 0, 0, str_1f8, str_1f9, str_1fa, str_1fb, str_1fc, str_1fd, str_1fe, str_1ff, 0}; static const unichar_t * const tab_2[] = { str_200, str_201, str_202, str_203, str_204, str_205, str_206, str_207, str_208, str_209, str_20a, str_20b, str_20c, str_20d, str_20e, str_20f, str_210, str_211, str_212, str_213, str_214, str_215, str_216, str_217, str_218, str_219, str_21a, str_21b, 0, 0, str_21e, str_21f, 0, 0, 0, 0, 0, 0, str_226, str_227, str_228, str_229, str_22a, str_22b, str_22c, str_22d, str_22e, str_22f, str_230, str_231, str_232, str_233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_292, 0, 0, 0, 0, 0, 0, str_299, 0, 0, str_29c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2b0, str_2b1, str_2b2, str_2b3, str_2b4, str_2b5, str_2b6, str_2b7, str_2b8, str_2b9, str_2ba, 0, str_2bc, 0, 0, 0, 0, 0, 0, 0, str_2c4, 0, str_2c6, 0, str_2c8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2d8, str_2d9, str_2da, str_2db, str_2dc, str_2dd, 0, 0, str_2e0, str_2e1, str_2e2, str_2e3, str_2e4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_3[] = { 0, str_301, str_302, str_303, 0, 0, 0, 0, str_308, 0, str_30a, str_30b, 0, 0, str_30e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_340, str_341, 0, str_343, str_344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_374, str_375, 0, 0, 0, 0, str_37a, 0, 0, 0, str_37e, 0, 0, 0, 0, 0, str_384, str_385, str_386, str_387, str_388, str_389, str_38a, 0, str_38c, 0, str_38e, str_38f, str_390, str_391, str_392, str_393, 0, str_395, str_396, str_397, 0, str_399, str_39a, 0, str_39c, str_39d, 0, str_39f, 0, str_3a1, 0, 0, str_3a4, str_3a5, 0, str_3a7, 0, 0, str_3aa, str_3ab, str_3ac, str_3ad, str_3ae, str_3af, str_3b0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_3ba, 0, 0, 0, 0, str_3bf, 0, str_3c1, 0, 0, 0, 0, 0, str_3c7, 0, 0, str_3ca, str_3cb, str_3cc, str_3cd, str_3ce, 0, str_3d0, str_3d1, str_3d2, str_3d3, str_3d4, str_3d5, str_3d6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_3f0, str_3f1, str_3f2, 0, str_3f4, str_3f5, 0, 0, 0, str_3f9, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_4[] = { str_400, str_401, 0, str_403, 0, str_405, str_406, str_407, str_408, 0, 0, 0, str_40c, str_40d, str_40e, 0, str_410, 0, str_412, str_413, 0, str_415, 0, 0, 0, str_419, str_41a, 0, str_41c, str_41d, str_41e, str_41f, str_420, str_421, str_422, 0, str_424, str_425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_430, 0, 0, 0, 0, str_435, 0, 0, 0, str_439, str_43a, 0, 0, 0, str_43e, str_43f, str_440, str_441, 0, str_443, 0, str_445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_450, str_451, 0, str_453, 0, str_455, str_456, str_457, str_458, 0, 0, 0, str_45c, str_45d, str_45e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_470, str_471, 0, 0, 0, 0, str_476, str_477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_4ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_4c0, str_4c1, str_4c2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_4d0, str_4d1, str_4d2, str_4d3, str_4d4, str_4d5, str_4d6, str_4d7, 0, 0, str_4da, str_4db, str_4dc, str_4dd, str_4de, str_4df, str_4e0, str_4e1, str_4e2, str_4e3, str_4e4, str_4e5, str_4e6, str_4e7, str_4e8, str_4e9, str_4ea, str_4eb, str_4ec, str_4ed, str_4ee, str_4ef, str_4f0, str_4f1, str_4f2, str_4f3, str_4f4, str_4f5, 0, 0, str_4f8, str_4f9, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_5[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_54f, 0, 0, 0, 0, 0, str_555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_570, 0, 0, 0, 0, 0, 0, 0, str_578, 0, str_57a, 0, 0, str_57d, 0, 0, 0, str_581, str_582, 0, str_584, str_585, 0, str_587, 0, str_589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_5f0, str_5f1, str_5f2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_6[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_60c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_621, str_622, str_623, str_624, str_625, str_626, str_627, str_628, str_629, str_62a, str_62b, str_62c, str_62d, str_62e, str_62f, str_630, str_631, str_632, str_633, str_634, str_635, str_636, str_637, str_638, str_639, str_63a, 0, 0, 0, 0, 0, 0, str_641, str_642, str_643, str_644, str_645, str_646, str_647, str_648, str_649, str_64a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_66a, 0, str_66c, str_66d, 0, 0, 0, str_671, 0, 0, 0, str_675, str_676, str_677, str_678, str_679, str_67a, str_67b, 0, 0, str_67e, str_67f, str_680, 0, 0, str_683, str_684, 0, str_686, str_687, str_688, 0, 0, 0, str_68c, str_68d, str_68e, 0, 0, str_691, 0, 0, 0, 0, 0, 0, str_698, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_6a4, 0, str_6a6, 0, 0, str_6a9, 0, 0, 0, str_6ad, 0, str_6af, 0, str_6b1, 0, str_6b3, 0, 0, 0, 0, 0, 0, str_6ba, str_6bb, 0, 0, str_6be, 0, str_6c0, str_6c1, str_6c2, 0, 0, str_6c5, str_6c6, str_6c7, str_6c8, str_6c9, 0, str_6cb, str_6cc, 0, 0, 0, str_6d0, 0, str_6d2, str_6d3, str_6d4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_9[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_929, 0, 0, 0, 0, 0, 0, 0, str_931, 0, 0, str_934, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_958, str_959, str_95a, str_95b, str_95c, str_95d, str_95e, str_95f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_9cb, str_9cc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_9dc, str_9dd, 0, str_9df, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_a[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_a33, 0, 0, str_a36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_a59, str_a5a, str_a5b, 0, 0, str_a5e, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_b[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_b48, 0, 0, str_b4b, str_b4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_b5c, str_b5d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_b94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_bca, str_bcb, str_bcc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_c[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_c48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_cc0, 0, 0, 0, 0, 0, 0, str_cc7, str_cc8, 0, str_cca, str_ccb, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_d[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_d4a, str_d4b, str_d4c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_dda, 0, str_ddc, str_ddd, str_dde, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_e[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_e33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_eb3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_edc, str_edd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_f[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f43, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f4d, 0, 0, 0, 0, str_f52, 0, 0, 0, 0, str_f57, 0, 0, 0, 0, str_f5c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f69, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f73, 0, str_f75, str_f76, str_f77, str_f78, str_f79, 0, 0, 0, 0, 0, 0, 0, str_f81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f93, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_f9d, 0, 0, 0, 0, str_fa2, 0, 0, 0, 0, str_fa7, 0, 0, 0, 0, str_fac, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fb9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_10[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_10fc, 0, 0, 0, 0}; static const unichar_t * const tab_11[] = { 0, str_1101, 0, 0, str_1104, 0, 0, 0, str_1108, 0, str_110a, 0, 0, str_110d, 0, 0, 0, 0, 0, str_1113, str_1114, str_1115, str_1116, str_1117, str_1118, str_1119, str_111a, str_111b, str_111c, str_111d, str_111e, str_111f, str_1120, str_1121, str_1122, str_1123, str_1124, str_1125, str_1126, str_1127, str_1128, str_1129, str_112a, str_112b, str_112c, str_112d, str_112e, str_112f, str_1130, str_1131, str_1132, str_1133, str_1134, str_1135, str_1136, str_1137, str_1138, str_1139, str_113a, str_113b, 0, str_113d, 0, str_113f, 0, str_1141, str_1142, str_1143, str_1144, str_1145, str_1146, str_1147, str_1148, str_1149, str_114a, str_114b, 0, str_114d, 0, str_114f, 0, str_1151, str_1152, str_1153, 0, 0, str_1156, str_1157, str_1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1162, 0, str_1164, 0, str_1166, 0, str_1168, 0, str_116a, str_116b, str_116c, 0, 0, str_116f, str_1170, str_1171, 0, 0, str_1174, 0, str_1176, str_1177, str_1178, str_1179, str_117a, str_117b, str_117c, str_117d, str_117e, str_117f, str_1180, str_1181, str_1182, str_1183, str_1184, str_1185, str_1186, str_1187, str_1188, str_1189, str_118a, str_118b, str_118c, str_118d, str_118e, str_118f, str_1190, str_1191, str_1192, str_1193, str_1194, str_1195, str_1196, str_1197, str_1198, str_1199, str_119a, str_119b, str_119c, str_119d, 0, str_119f, str_11a0, str_11a1, str_11a2, 0, 0, 0, 0, 0, str_11a8, str_11a9, str_11aa, str_11ab, str_11ac, str_11ad, str_11ae, str_11af, str_11b0, str_11b1, str_11b2, str_11b3, str_11b4, str_11b5, str_11b6, str_11b7, str_11b8, str_11b9, str_11ba, str_11bb, str_11bc, str_11bd, str_11be, str_11bf, str_11c0, str_11c1, str_11c2, str_11c3, str_11c4, str_11c5, str_11c6, str_11c7, str_11c8, str_11c9, str_11ca, str_11cb, str_11cc, str_11cd, str_11ce, str_11cf, str_11d0, str_11d1, str_11d2, str_11d3, str_11d4, str_11d5, str_11d6, str_11d7, str_11d8, str_11d9, str_11da, str_11db, str_11dc, str_11dd, str_11de, str_11df, str_11e0, str_11e1, str_11e2, str_11e3, str_11e4, str_11e5, str_11e6, str_11e7, str_11e8, str_11e9, str_11ea, str_11eb, str_11ec, str_11ed, str_11ee, str_11ef, str_11f0, str_11f1, str_11f2, str_11f3, str_11f4, str_11f5, str_11f6, str_11f7, str_11f8, str_11f9, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_13[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_13a0, str_13a1, str_13a2, 0, 0, 0, 0, 0, 0, str_13a9, str_13aa, str_13ab, str_13ac, 0, 0, 0, 0, str_13b1, 0, str_13b3, 0, 0, 0, str_13b7, 0, 0, 0, str_13bb, 0, 0, str_13be, 0, str_13c0, 0, str_13c2, str_13c3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_13cf, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_13d9, str_13da, 0, 0, 0, str_13de, str_13df, 0, 0, str_13e2, 0, 0, 0, str_13e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_13f4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_1b[] = { 0, 0, 0, 0, 0, 0, str_1b06, 0, str_1b08, 0, str_1b0a, 0, str_1b0c, 0, str_1b0e, 0, 0, 0, str_1b12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1b3b, 0, str_1b3d, 0, 0, str_1b40, str_1b41, 0, str_1b43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_1d[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1d2c, str_1d2d, str_1d2e, 0, str_1d30, str_1d31, str_1d32, str_1d33, str_1d34, str_1d35, str_1d36, str_1d37, str_1d38, str_1d39, str_1d3a, 0, str_1d3c, str_1d3d, str_1d3e, str_1d3f, str_1d40, str_1d41, str_1d42, str_1d43, str_1d44, str_1d45, str_1d46, str_1d47, str_1d48, str_1d49, str_1d4a, str_1d4b, str_1d4c, str_1d4d, 0, str_1d4f, str_1d50, str_1d51, str_1d52, str_1d53, str_1d54, str_1d55, str_1d56, str_1d57, str_1d58, str_1d59, str_1d5a, str_1d5b, str_1d5c, str_1d5d, str_1d5e, str_1d5f, str_1d60, str_1d61, str_1d62, str_1d63, str_1d64, str_1d65, str_1d66, str_1d67, str_1d68, str_1d69, str_1d6a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1d78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_1d9b, str_1d9c, str_1d9d, str_1d9e, str_1d9f, str_1da0, str_1da1, str_1da2, str_1da3, str_1da4, str_1da5, str_1da6, str_1da7, str_1da8, str_1da9, str_1daa, str_1dab, str_1dac, str_1dad, str_1dae, str_1daf, str_1db0, str_1db1, str_1db2, str_1db3, str_1db4, str_1db5, str_1db6, str_1db7, str_1db8, str_1db9, str_1dba, str_1dbb, str_1dbc, str_1dbd, str_1dbe, str_1dbf, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_1e[] = { str_1e00, str_1e01, str_1e02, str_1e03, str_1e04, str_1e05, str_1e06, str_1e07, str_1e08, str_1e09, str_1e0a, str_1e0b, str_1e0c, str_1e0d, str_1e0e, str_1e0f, str_1e10, str_1e11, str_1e12, str_1e13, str_1e14, str_1e15, str_1e16, str_1e17, str_1e18, str_1e19, str_1e1a, str_1e1b, str_1e1c, str_1e1d, str_1e1e, str_1e1f, str_1e20, str_1e21, str_1e22, str_1e23, str_1e24, str_1e25, str_1e26, str_1e27, str_1e28, str_1e29, str_1e2a, str_1e2b, str_1e2c, str_1e2d, str_1e2e, str_1e2f, str_1e30, str_1e31, str_1e32, str_1e33, str_1e34, str_1e35, str_1e36, str_1e37, str_1e38, str_1e39, str_1e3a, str_1e3b, str_1e3c, str_1e3d, str_1e3e, str_1e3f, str_1e40, str_1e41, str_1e42, str_1e43, str_1e44, str_1e45, str_1e46, str_1e47, str_1e48, str_1e49, str_1e4a, str_1e4b, str_1e4c, str_1e4d, str_1e4e, str_1e4f, str_1e50, str_1e51, str_1e52, str_1e53, str_1e54, str_1e55, str_1e56, str_1e57, str_1e58, str_1e59, str_1e5a, str_1e5b, str_1e5c, str_1e5d, str_1e5e, str_1e5f, str_1e60, str_1e61, str_1e62, str_1e63, str_1e64, str_1e65, str_1e66, str_1e67, str_1e68, str_1e69, str_1e6a, str_1e6b, str_1e6c, str_1e6d, str_1e6e, str_1e6f, str_1e70, str_1e71, str_1e72, str_1e73, str_1e74, str_1e75, str_1e76, str_1e77, str_1e78, str_1e79, str_1e7a, str_1e7b, str_1e7c, str_1e7d, str_1e7e, str_1e7f, str_1e80, str_1e81, str_1e82, str_1e83, str_1e84, str_1e85, str_1e86, str_1e87, str_1e88, str_1e89, str_1e8a, str_1e8b, str_1e8c, str_1e8d, str_1e8e, str_1e8f, str_1e90, str_1e91, str_1e92, str_1e93, str_1e94, str_1e95, str_1e96, str_1e97, str_1e98, str_1e99, str_1e9a, str_1e9b, 0, 0, 0, 0, str_1ea0, str_1ea1, str_1ea2, str_1ea3, str_1ea4, str_1ea5, str_1ea6, str_1ea7, str_1ea8, str_1ea9, str_1eaa, str_1eab, str_1eac, str_1ead, str_1eae, str_1eaf, str_1eb0, str_1eb1, str_1eb2, str_1eb3, str_1eb4, str_1eb5, str_1eb6, str_1eb7, str_1eb8, str_1eb9, str_1eba, str_1ebb, str_1ebc, str_1ebd, str_1ebe, str_1ebf, str_1ec0, str_1ec1, str_1ec2, str_1ec3, str_1ec4, str_1ec5, str_1ec6, str_1ec7, str_1ec8, str_1ec9, str_1eca, str_1ecb, str_1ecc, str_1ecd, str_1ece, str_1ecf, str_1ed0, str_1ed1, str_1ed2, str_1ed3, str_1ed4, str_1ed5, str_1ed6, str_1ed7, str_1ed8, str_1ed9, str_1eda, str_1edb, str_1edc, str_1edd, str_1ede, str_1edf, str_1ee0, str_1ee1, str_1ee2, str_1ee3, str_1ee4, str_1ee5, str_1ee6, str_1ee7, str_1ee8, str_1ee9, str_1eea, str_1eeb, str_1eec, str_1eed, str_1eee, str_1eef, str_1ef0, str_1ef1, str_1ef2, str_1ef3, str_1ef4, str_1ef5, str_1ef6, str_1ef7, str_1ef8, str_1ef9, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_1f[] = { str_1f00, str_1f01, str_1f02, str_1f03, str_1f04, str_1f05, str_1f06, str_1f07, str_1f08, str_1f09, str_1f0a, str_1f0b, str_1f0c, str_1f0d, str_1f0e, str_1f0f, str_1f10, str_1f11, str_1f12, str_1f13, str_1f14, str_1f15, 0, 0, str_1f18, str_1f19, str_1f1a, str_1f1b, str_1f1c, str_1f1d, 0, 0, str_1f20, str_1f21, str_1f22, str_1f23, str_1f24, str_1f25, str_1f26, str_1f27, str_1f28, str_1f29, str_1f2a, str_1f2b, str_1f2c, str_1f2d, str_1f2e, str_1f2f, str_1f30, str_1f31, str_1f32, str_1f33, str_1f34, str_1f35, str_1f36, str_1f37, str_1f38, str_1f39, str_1f3a, str_1f3b, str_1f3c, str_1f3d, str_1f3e, str_1f3f, str_1f40, str_1f41, str_1f42, str_1f43, str_1f44, str_1f45, 0, 0, str_1f48, str_1f49, str_1f4a, str_1f4b, str_1f4c, str_1f4d, 0, 0, str_1f50, str_1f51, str_1f52, str_1f53, str_1f54, str_1f55, str_1f56, str_1f57, 0, str_1f59, 0, str_1f5b, 0, str_1f5d, 0, str_1f5f, str_1f60, str_1f61, str_1f62, str_1f63, str_1f64, str_1f65, str_1f66, str_1f67, str_1f68, str_1f69, str_1f6a, str_1f6b, str_1f6c, str_1f6d, str_1f6e, str_1f6f, str_1f70, str_1f71, str_1f72, str_1f73, str_1f74, str_1f75, str_1f76, str_1f77, str_1f78, str_1f79, str_1f7a, str_1f7b, str_1f7c, str_1f7d, 0, 0, str_1f80, str_1f81, str_1f82, str_1f83, str_1f84, str_1f85, str_1f86, str_1f87, str_1f88, str_1f89, str_1f8a, str_1f8b, str_1f8c, str_1f8d, str_1f8e, str_1f8f, str_1f90, str_1f91, str_1f92, str_1f93, str_1f94, str_1f95, str_1f96, str_1f97, str_1f98, str_1f99, str_1f9a, str_1f9b, str_1f9c, str_1f9d, str_1f9e, str_1f9f, str_1fa0, str_1fa1, str_1fa2, str_1fa3, str_1fa4, str_1fa5, str_1fa6, str_1fa7, str_1fa8, str_1fa9, str_1faa, str_1fab, str_1fac, str_1fad, str_1fae, str_1faf, str_1fb0, str_1fb1, str_1fb2, str_1fb3, str_1fb4, 0, str_1fb6, str_1fb7, str_1fb8, str_1fb9, str_1fba, str_1fbb, str_1fbc, str_1fbd, str_1fbe, str_1fbf, str_1fc0, str_1fc1, str_1fc2, str_1fc3, str_1fc4, 0, str_1fc6, str_1fc7, str_1fc8, str_1fc9, str_1fca, str_1fcb, str_1fcc, str_1fcd, str_1fce, str_1fcf, str_1fd0, str_1fd1, str_1fd2, str_1fd3, 0, 0, str_1fd6, str_1fd7, str_1fd8, str_1fd9, str_1fda, str_1fdb, 0, str_1fdd, str_1fde, str_1fdf, str_1fe0, str_1fe1, str_1fe2, str_1fe3, str_1fe4, str_1fe5, str_1fe6, str_1fe7, str_1fe8, str_1fe9, str_1fea, str_1feb, str_1fec, str_1fed, str_1fee, str_1fef, 0, 0, str_1ff2, str_1ff3, str_1ff4, 0, str_1ff6, str_1ff7, str_1ff8, str_1ff9, str_1ffa, str_1ffb, str_1ffc, str_1ffd, str_1ffe, 0, 0}; static const unichar_t * const tab_20[] = { str_2000, str_2001, str_2002, str_2003, str_2004, str_2005, str_2006, str_2007, str_2008, str_2009, str_200a, 0, 0, 0, 0, 0, str_2010, str_2011, str_2012, str_2013, str_2014, str_2015, str_2016, str_2017, str_2018, str_2019, 0, 0, str_201c, str_201d, 0, 0, 0, 0, 0, 0, str_2024, str_2025, str_2026, 0, 0, 0, 0, 0, 0, 0, 0, str_202f, 0, 0, str_2032, str_2033, str_2034, str_2035, str_2036, str_2037, 0, str_2039, str_203a, 0, str_203c, 0, str_203e, 0, 0, 0, 0, 0, 0, 0, 0, str_2047, str_2048, str_2049, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2057, 0, 0, 0, 0, 0, 0, 0, str_205f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2070, str_2071, 0, 0, str_2074, str_2075, str_2076, str_2077, str_2078, str_2079, str_207a, str_207b, str_207c, str_207d, str_207e, str_207f, str_2080, str_2081, str_2082, str_2083, str_2084, str_2085, str_2086, str_2087, str_2088, str_2089, str_208a, str_208b, str_208c, str_208d, str_208e, 0, str_2090, str_2091, str_2092, str_2093, str_2094, str_2095, str_2096, str_2097, str_2098, str_2099, str_209a, str_209b, str_209c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_20a8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_21[] = { str_2100, str_2101, str_2102, str_2103, 0, str_2105, str_2106, str_2107, 0, str_2109, str_210a, str_210b, str_210c, str_210d, str_210e, str_210f, str_2110, str_2111, str_2112, str_2113, 0, str_2115, str_2116, 0, 0, str_2119, str_211a, str_211b, str_211c, str_211d, 0, 0, str_2120, str_2121, str_2122, 0, str_2124, 0, str_2126, 0, str_2128, 0, str_212a, str_212b, str_212c, str_212d, 0, str_212f, str_2130, str_2131, 0, str_2133, str_2134, str_2135, str_2136, str_2137, str_2138, str_2139, 0, str_213b, str_213c, str_213d, str_213e, str_213f, str_2140, 0, 0, 0, 0, str_2145, str_2146, str_2147, str_2148, str_2149, 0, 0, 0, 0, 0, 0, str_2150, str_2151, str_2152, str_2153, str_2154, str_2155, str_2156, str_2157, str_2158, str_2159, str_215a, str_215b, str_215c, str_215d, str_215e, str_215f, str_2160, str_2161, str_2162, str_2163, str_2164, str_2165, str_2166, str_2167, str_2168, str_2169, str_216a, str_216b, str_216c, str_216d, str_216e, str_216f, str_2170, str_2171, str_2172, str_2173, str_2174, str_2175, str_2176, str_2177, str_2178, str_2179, str_217a, str_217b, str_217c, str_217d, str_217e, str_217f, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_219a, str_219b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_21ae, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_21cd, str_21ce, str_21cf, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_22[] = { 0, 0, 0, 0, str_2204, str_2205, str_2206, 0, 0, str_2209, 0, 0, str_220c, 0, 0, str_220f, 0, str_2211, str_2212, 0, 0, str_2215, str_2216, str_2217, str_2218, str_2219, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2223, str_2224, str_2225, str_2226, 0, 0, 0, 0, 0, str_222c, str_222d, 0, str_222f, str_2230, 0, 0, 0, 0, 0, str_2236, 0, 0, 0, 0, 0, str_223c, 0, 0, 0, 0, str_2241, 0, 0, str_2244, 0, 0, str_2247, 0, str_2249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2260, 0, str_2262, 0, 0, 0, 0, 0, 0, 0, str_226a, str_226b, 0, str_226d, str_226e, str_226f, str_2270, str_2271, 0, 0, str_2274, str_2275, 0, 0, str_2278, str_2279, 0, 0, 0, 0, 0, 0, str_2280, str_2281, 0, 0, str_2284, str_2285, 0, 0, str_2288, str_2289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_22ac, str_22ad, str_22ae, str_22af, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_22c4, str_22c5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_22e0, str_22e1, str_22e2, str_22e3, 0, 0, 0, 0, 0, 0, str_22ea, str_22eb, str_22ec, str_22ed, 0, str_22ef, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_23[] = { 0, 0, 0, str_2303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2329, str_232a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2373, str_2374, str_2375, 0, 0, 0, 0, str_237a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_24[] = { str_2400, str_2401, str_2402, str_2403, str_2404, str_2405, str_2406, str_2407, str_2408, str_2409, str_240a, str_240b, str_240c, str_240d, str_240e, str_240f, str_2410, str_2411, str_2412, str_2413, str_2414, str_2415, str_2416, str_2417, str_2418, str_2419, str_241a, str_241b, str_241c, str_241d, str_241e, str_241f, str_2420, str_2421, str_2422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2460, str_2461, str_2462, str_2463, str_2464, str_2465, str_2466, str_2467, str_2468, str_2469, str_246a, str_246b, str_246c, str_246d, str_246e, str_246f, str_2470, str_2471, str_2472, str_2473, str_2474, str_2475, str_2476, str_2477, str_2478, str_2479, str_247a, str_247b, str_247c, str_247d, str_247e, str_247f, str_2480, str_2481, str_2482, str_2483, str_2484, str_2485, str_2486, str_2487, str_2488, str_2489, str_248a, str_248b, str_248c, str_248d, str_248e, str_248f, str_2490, str_2491, str_2492, str_2493, str_2494, str_2495, str_2496, str_2497, str_2498, str_2499, str_249a, str_249b, str_249c, str_249d, str_249e, str_249f, str_24a0, str_24a1, str_24a2, str_24a3, str_24a4, str_24a5, str_24a6, str_24a7, str_24a8, str_24a9, str_24aa, str_24ab, str_24ac, str_24ad, str_24ae, str_24af, str_24b0, str_24b1, str_24b2, str_24b3, str_24b4, str_24b5, str_24b6, str_24b7, str_24b8, str_24b9, str_24ba, str_24bb, str_24bc, str_24bd, str_24be, str_24bf, str_24c0, str_24c1, str_24c2, str_24c3, str_24c4, str_24c5, str_24c6, str_24c7, str_24c8, str_24c9, str_24ca, str_24cb, str_24cc, str_24cd, str_24ce, str_24cf, str_24d0, str_24d1, str_24d2, str_24d3, str_24d4, str_24d5, str_24d6, str_24d7, str_24d8, str_24d9, str_24da, str_24db, str_24dc, str_24dd, str_24de, str_24df, str_24e0, str_24e1, str_24e2, str_24e3, str_24e4, str_24e5, str_24e6, str_24e7, str_24e8, str_24e9, str_24ea, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_25[] = { str_2500, 0, str_2502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_25b3, 0, 0, 0, 0, str_25b8, 0, 0, 0, 0, str_25bd, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_25c7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_25e6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_26[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_27[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2758, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_2a[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2a0c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2a74, str_2a75, str_2a76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2adc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_2c[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2c7c, str_2c7d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_2d[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2d6f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_2e[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2e28, str_2e29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2e9f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_2ef3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_2f[] = { str_2f00, str_2f01, str_2f02, str_2f03, str_2f04, str_2f05, str_2f06, str_2f07, str_2f08, str_2f09, str_2f0a, str_2f0b, str_2f0c, str_2f0d, str_2f0e, str_2f0f, str_2f10, str_2f11, str_2f12, str_2f13, str_2f14, str_2f15, str_2f16, str_2f17, str_2f18, str_2f19, str_2f1a, str_2f1b, str_2f1c, str_2f1d, str_2f1e, str_2f1f, str_2f20, str_2f21, str_2f22, str_2f23, str_2f24, str_2f25, str_2f26, str_2f27, str_2f28, str_2f29, str_2f2a, str_2f2b, str_2f2c, str_2f2d, str_2f2e, str_2f2f, str_2f30, str_2f31, str_2f32, str_2f33, str_2f34, str_2f35, str_2f36, str_2f37, str_2f38, str_2f39, str_2f3a, str_2f3b, str_2f3c, str_2f3d, str_2f3e, str_2f3f, str_2f40, str_2f41, str_2f42, str_2f43, str_2f44, str_2f45, str_2f46, str_2f47, str_2f48, str_2f49, str_2f4a, str_2f4b, str_2f4c, str_2f4d, str_2f4e, str_2f4f, str_2f50, str_2f51, str_2f52, str_2f53, str_2f54, str_2f55, str_2f56, str_2f57, str_2f58, str_2f59, str_2f5a, str_2f5b, str_2f5c, str_2f5d, str_2f5e, str_2f5f, str_2f60, str_2f61, str_2f62, str_2f63, str_2f64, str_2f65, str_2f66, str_2f67, str_2f68, str_2f69, str_2f6a, str_2f6b, str_2f6c, str_2f6d, str_2f6e, str_2f6f, str_2f70, str_2f71, str_2f72, str_2f73, str_2f74, str_2f75, str_2f76, str_2f77, str_2f78, str_2f79, str_2f7a, str_2f7b, str_2f7c, str_2f7d, str_2f7e, str_2f7f, str_2f80, str_2f81, str_2f82, str_2f83, str_2f84, str_2f85, str_2f86, str_2f87, str_2f88, str_2f89, str_2f8a, str_2f8b, str_2f8c, str_2f8d, str_2f8e, str_2f8f, str_2f90, str_2f91, str_2f92, str_2f93, str_2f94, str_2f95, str_2f96, str_2f97, str_2f98, str_2f99, str_2f9a, str_2f9b, str_2f9c, str_2f9d, str_2f9e, str_2f9f, str_2fa0, str_2fa1, str_2fa2, str_2fa3, str_2fa4, str_2fa5, str_2fa6, str_2fa7, str_2fa8, str_2fa9, str_2faa, str_2fab, str_2fac, str_2fad, str_2fae, str_2faf, str_2fb0, str_2fb1, str_2fb2, str_2fb3, str_2fb4, str_2fb5, str_2fb6, str_2fb7, str_2fb8, str_2fb9, str_2fba, str_2fbb, str_2fbc, str_2fbd, str_2fbe, str_2fbf, str_2fc0, str_2fc1, str_2fc2, str_2fc3, str_2fc4, str_2fc5, str_2fc6, str_2fc7, str_2fc8, str_2fc9, str_2fca, str_2fcb, str_2fcc, str_2fcd, str_2fce, str_2fcf, str_2fd0, str_2fd1, str_2fd2, str_2fd3, str_2fd4, str_2fd5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_30[] = { str_3000, str_3001, 0, 0, 0, 0, 0, 0, str_3008, str_3009, str_300a, str_300b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_3036, 0, str_3038, str_3039, str_303a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_304c, 0, str_304e, 0, str_3050, 0, str_3052, 0, str_3054, 0, str_3056, 0, str_3058, 0, str_305a, 0, str_305c, 0, str_305e, 0, str_3060, 0, str_3062, 0, 0, str_3065, 0, str_3067, 0, str_3069, 0, 0, 0, 0, 0, 0, str_3070, str_3071, 0, str_3073, str_3074, 0, str_3076, str_3077, 0, str_3079, str_307a, 0, str_307c, str_307d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_3094, 0, 0, 0, 0, 0, 0, str_309b, str_309c, 0, str_309e, str_309f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_30ac, 0, str_30ae, 0, str_30b0, 0, str_30b2, 0, str_30b4, 0, str_30b6, 0, str_30b8, 0, str_30ba, 0, str_30bc, 0, str_30be, 0, str_30c0, 0, str_30c2, 0, 0, str_30c5, 0, str_30c7, 0, str_30c9, 0, 0, 0, 0, 0, 0, str_30d0, str_30d1, 0, str_30d3, str_30d4, 0, str_30d6, str_30d7, 0, str_30d9, str_30da, 0, str_30dc, str_30dd, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_30f4, 0, 0, str_30f7, str_30f8, str_30f9, str_30fa, 0, 0, 0, str_30fe, str_30ff, 0}; static const unichar_t * const tab_31[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_3131, str_3132, str_3133, str_3134, str_3135, str_3136, str_3137, str_3138, str_3139, str_313a, str_313b, str_313c, str_313d, str_313e, str_313f, str_3140, str_3141, str_3142, str_3143, str_3144, str_3145, str_3146, str_3147, str_3148, str_3149, str_314a, str_314b, str_314c, str_314d, str_314e, str_314f, str_3150, str_3151, str_3152, str_3153, str_3154, str_3155, str_3156, str_3157, str_3158, str_3159, str_315a, str_315b, str_315c, str_315d, str_315e, str_315f, str_3160, str_3161, str_3162, str_3163, str_3164, str_3165, str_3166, str_3167, str_3168, str_3169, str_316a, str_316b, str_316c, str_316d, str_316e, str_316f, str_3170, str_3171, str_3172, str_3173, str_3174, str_3175, str_3176, str_3177, str_3178, str_3179, str_317a, str_317b, str_317c, str_317d, str_317e, str_317f, str_3180, str_3181, str_3182, str_3183, str_3184, str_3185, str_3186, str_3187, str_3188, str_3189, str_318a, str_318b, str_318c, str_318d, str_318e, 0, 0, 0, str_3192, str_3193, str_3194, str_3195, str_3196, str_3197, str_3198, str_3199, str_319a, str_319b, str_319c, str_319d, str_319e, str_319f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_32[] = { str_3200, str_3201, str_3202, str_3203, str_3204, str_3205, str_3206, str_3207, str_3208, str_3209, str_320a, str_320b, str_320c, str_320d, str_320e, str_320f, str_3210, str_3211, str_3212, str_3213, str_3214, str_3215, str_3216, str_3217, str_3218, str_3219, str_321a, str_321b, str_321c, str_321d, str_321e, 0, str_3220, str_3221, str_3222, str_3223, str_3224, str_3225, str_3226, str_3227, str_3228, str_3229, str_322a, str_322b, str_322c, str_322d, str_322e, str_322f, str_3230, str_3231, str_3232, str_3233, str_3234, str_3235, str_3236, str_3237, str_3238, str_3239, str_323a, str_323b, str_323c, str_323d, str_323e, str_323f, str_3240, str_3241, str_3242, str_3243, str_3244, str_3245, str_3246, str_3247, 0, 0, 0, 0, 0, 0, 0, 0, str_3250, str_3251, str_3252, str_3253, str_3254, str_3255, str_3256, str_3257, str_3258, str_3259, str_325a, str_325b, str_325c, str_325d, str_325e, str_325f, str_3260, str_3261, str_3262, str_3263, str_3264, str_3265, str_3266, str_3267, str_3268, str_3269, str_326a, str_326b, str_326c, str_326d, str_326e, str_326f, str_3270, str_3271, str_3272, str_3273, str_3274, str_3275, str_3276, str_3277, str_3278, str_3279, str_327a, str_327b, str_327c, str_327d, str_327e, 0, str_3280, str_3281, str_3282, str_3283, str_3284, str_3285, str_3286, str_3287, str_3288, str_3289, str_328a, str_328b, str_328c, str_328d, str_328e, str_328f, str_3290, str_3291, str_3292, str_3293, str_3294, str_3295, str_3296, str_3297, str_3298, str_3299, str_329a, str_329b, str_329c, str_329d, str_329e, str_329f, str_32a0, str_32a1, str_32a2, str_32a3, str_32a4, str_32a5, str_32a6, str_32a7, str_32a8, str_32a9, str_32aa, str_32ab, str_32ac, str_32ad, str_32ae, str_32af, str_32b0, str_32b1, str_32b2, str_32b3, str_32b4, str_32b5, str_32b6, str_32b7, str_32b8, str_32b9, str_32ba, str_32bb, str_32bc, str_32bd, str_32be, str_32bf, str_32c0, str_32c1, str_32c2, str_32c3, str_32c4, str_32c5, str_32c6, str_32c7, str_32c8, str_32c9, str_32ca, str_32cb, str_32cc, str_32cd, str_32ce, str_32cf, str_32d0, str_32d1, str_32d2, str_32d3, str_32d4, str_32d5, str_32d6, str_32d7, str_32d8, str_32d9, str_32da, str_32db, str_32dc, str_32dd, str_32de, str_32df, str_32e0, str_32e1, str_32e2, str_32e3, str_32e4, str_32e5, str_32e6, str_32e7, str_32e8, str_32e9, str_32ea, str_32eb, str_32ec, str_32ed, str_32ee, str_32ef, str_32f0, str_32f1, str_32f2, str_32f3, str_32f4, str_32f5, str_32f6, str_32f7, str_32f8, str_32f9, str_32fa, str_32fb, str_32fc, str_32fd, str_32fe, 0, 0}; static const unichar_t * const tab_33[] = { str_3300, str_3301, str_3302, str_3303, str_3304, str_3305, str_3306, str_3307, str_3308, str_3309, str_330a, str_330b, str_330c, str_330d, str_330e, str_330f, str_3310, str_3311, str_3312, str_3313, str_3314, str_3315, str_3316, str_3317, str_3318, str_3319, str_331a, str_331b, str_331c, str_331d, str_331e, str_331f, str_3320, str_3321, str_3322, str_3323, str_3324, str_3325, str_3326, str_3327, str_3328, str_3329, str_332a, str_332b, str_332c, str_332d, str_332e, str_332f, str_3330, str_3331, str_3332, str_3333, str_3334, str_3335, str_3336, str_3337, str_3338, str_3339, str_333a, str_333b, str_333c, str_333d, str_333e, str_333f, str_3340, str_3341, str_3342, str_3343, str_3344, str_3345, str_3346, str_3347, str_3348, str_3349, str_334a, str_334b, str_334c, str_334d, str_334e, str_334f, str_3350, str_3351, str_3352, str_3353, str_3354, str_3355, str_3356, str_3357, str_3358, str_3359, str_335a, str_335b, str_335c, str_335d, str_335e, str_335f, str_3360, str_3361, str_3362, str_3363, str_3364, str_3365, str_3366, str_3367, str_3368, str_3369, str_336a, str_336b, str_336c, str_336d, str_336e, str_336f, str_3370, str_3371, str_3372, str_3373, str_3374, str_3375, str_3376, str_3377, str_3378, str_3379, str_337a, str_337b, str_337c, str_337d, str_337e, str_337f, str_3380, str_3381, str_3382, str_3383, str_3384, str_3385, str_3386, str_3387, str_3388, str_3389, str_338a, str_338b, str_338c, str_338d, str_338e, str_338f, str_3390, str_3391, str_3392, str_3393, str_3394, str_3395, str_3396, str_3397, str_3398, str_3399, str_339a, str_339b, str_339c, str_339d, str_339e, str_339f, str_33a0, str_33a1, str_33a2, str_33a3, str_33a4, str_33a5, str_33a6, str_33a7, str_33a8, str_33a9, str_33aa, str_33ab, str_33ac, str_33ad, str_33ae, str_33af, str_33b0, str_33b1, str_33b2, str_33b3, str_33b4, str_33b5, str_33b6, str_33b7, str_33b8, str_33b9, str_33ba, str_33bb, str_33bc, str_33bd, str_33be, str_33bf, str_33c0, str_33c1, str_33c2, str_33c3, str_33c4, str_33c5, str_33c6, str_33c7, str_33c8, str_33c9, str_33ca, str_33cb, str_33cc, str_33cd, str_33ce, str_33cf, str_33d0, str_33d1, str_33d2, str_33d3, str_33d4, str_33d5, str_33d6, str_33d7, str_33d8, str_33d9, str_33da, str_33db, str_33dc, str_33dd, str_33de, str_33df, str_33e0, str_33e1, str_33e2, str_33e3, str_33e4, str_33e5, str_33e6, str_33e7, str_33e8, str_33e9, str_33ea, str_33eb, str_33ec, str_33ed, str_33ee, str_33ef, str_33f0, str_33f1, str_33f2, str_33f3, str_33f4, str_33f5, str_33f6, str_33f7, str_33f8, str_33f9, str_33fa, str_33fb, str_33fc, str_33fd, str_33fe, str_33ff, 0}; static const unichar_t * const tab_a7[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_a770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_a7f8, str_a7f9, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_f9[] = { str_f900, str_f901, str_f902, str_f903, str_f904, str_f905, str_f906, str_f907, str_f908, str_f909, str_f90a, str_f90b, str_f90c, str_f90d, str_f90e, str_f90f, str_f910, str_f911, str_f912, str_f913, str_f914, str_f915, str_f916, str_f917, str_f918, str_f919, str_f91a, str_f91b, str_f91c, str_f91d, str_f91e, str_f91f, str_f920, str_f921, str_f922, str_f923, str_f924, str_f925, str_f926, str_f927, str_f928, str_f929, str_f92a, str_f92b, str_f92c, str_f92d, str_f92e, str_f92f, str_f930, str_f931, str_f932, str_f933, str_f934, str_f935, str_f936, str_f937, str_f938, str_f939, str_f93a, str_f93b, str_f93c, str_f93d, str_f93e, str_f93f, str_f940, str_f941, str_f942, str_f943, str_f944, str_f945, str_f946, str_f947, str_f948, str_f949, str_f94a, str_f94b, str_f94c, str_f94d, str_f94e, str_f94f, str_f950, str_f951, str_f952, str_f953, str_f954, str_f955, str_f956, str_f957, str_f958, str_f959, str_f95a, str_f95b, str_f95c, str_f95d, str_f95e, str_f95f, str_f960, str_f961, str_f962, str_f963, str_f964, str_f965, str_f966, str_f967, str_f968, str_f969, str_f96a, str_f96b, str_f96c, str_f96d, str_f96e, str_f96f, str_f970, str_f971, str_f972, str_f973, str_f974, str_f975, str_f976, str_f977, str_f978, str_f979, str_f97a, str_f97b, str_f97c, str_f97d, str_f97e, str_f97f, str_f980, str_f981, str_f982, str_f983, str_f984, str_f985, str_f986, str_f987, str_f988, str_f989, str_f98a, str_f98b, str_f98c, str_f98d, str_f98e, str_f98f, str_f990, str_f991, str_f992, str_f993, str_f994, str_f995, str_f996, str_f997, str_f998, str_f999, str_f99a, str_f99b, str_f99c, str_f99d, str_f99e, str_f99f, str_f9a0, str_f9a1, str_f9a2, str_f9a3, str_f9a4, str_f9a5, str_f9a6, str_f9a7, str_f9a8, str_f9a9, str_f9aa, str_f9ab, str_f9ac, str_f9ad, str_f9ae, str_f9af, str_f9b0, str_f9b1, str_f9b2, str_f9b3, str_f9b4, str_f9b5, str_f9b6, str_f9b7, str_f9b8, str_f9b9, str_f9ba, str_f9bb, str_f9bc, str_f9bd, str_f9be, str_f9bf, str_f9c0, str_f9c1, str_f9c2, str_f9c3, str_f9c4, str_f9c5, str_f9c6, str_f9c7, str_f9c8, str_f9c9, str_f9ca, str_f9cb, str_f9cc, str_f9cd, str_f9ce, str_f9cf, str_f9d0, str_f9d1, str_f9d2, str_f9d3, str_f9d4, str_f9d5, str_f9d6, str_f9d7, str_f9d8, str_f9d9, str_f9da, str_f9db, str_f9dc, str_f9dd, str_f9de, str_f9df, str_f9e0, str_f9e1, str_f9e2, str_f9e3, str_f9e4, str_f9e5, str_f9e6, str_f9e7, str_f9e8, str_f9e9, str_f9ea, str_f9eb, str_f9ec, str_f9ed, str_f9ee, str_f9ef, str_f9f0, str_f9f1, str_f9f2, str_f9f3, str_f9f4, str_f9f5, str_f9f6, str_f9f7, str_f9f8, str_f9f9, str_f9fa, str_f9fb, str_f9fc, str_f9fd, str_f9fe, str_f9ff, 0}; static const unichar_t * const tab_fa[] = { str_fa00, str_fa01, str_fa02, str_fa03, str_fa04, str_fa05, str_fa06, str_fa07, str_fa08, str_fa09, str_fa0a, str_fa0b, str_fa0c, str_fa0d, 0, 0, str_fa10, 0, str_fa12, 0, 0, str_fa15, str_fa16, str_fa17, str_fa18, str_fa19, str_fa1a, str_fa1b, str_fa1c, str_fa1d, str_fa1e, 0, str_fa20, 0, str_fa22, 0, 0, str_fa25, str_fa26, 0, 0, 0, str_fa2a, str_fa2b, str_fa2c, str_fa2d, str_fa2e, str_fa2f, str_fa30, str_fa31, str_fa32, str_fa33, str_fa34, str_fa35, str_fa36, str_fa37, str_fa38, str_fa39, str_fa3a, str_fa3b, str_fa3c, str_fa3d, str_fa3e, str_fa3f, str_fa40, str_fa41, str_fa42, str_fa43, str_fa44, str_fa45, str_fa46, str_fa47, str_fa48, str_fa49, str_fa4a, str_fa4b, str_fa4c, str_fa4d, str_fa4e, str_fa4f, str_fa50, str_fa51, str_fa52, str_fa53, str_fa54, str_fa55, str_fa56, str_fa57, str_fa58, str_fa59, str_fa5a, str_fa5b, str_fa5c, str_fa5d, str_fa5e, str_fa5f, str_fa60, str_fa61, str_fa62, str_fa63, str_fa64, str_fa65, str_fa66, str_fa67, str_fa68, str_fa69, str_fa6a, str_fa6b, str_fa6c, str_fa6d, 0, 0, str_fa70, str_fa71, str_fa72, str_fa73, str_fa74, str_fa75, str_fa76, str_fa77, str_fa78, str_fa79, str_fa7a, str_fa7b, str_fa7c, str_fa7d, str_fa7e, str_fa7f, str_fa80, str_fa81, str_fa82, str_fa83, str_fa84, str_fa85, str_fa86, str_fa87, str_fa88, str_fa89, str_fa8a, str_fa8b, str_fa8c, str_fa8d, str_fa8e, str_fa8f, str_fa90, str_fa91, str_fa92, str_fa93, str_fa94, str_fa95, str_fa96, str_fa97, str_fa98, str_fa99, str_fa9a, str_fa9b, str_fa9c, str_fa9d, str_fa9e, str_fa9f, str_faa0, str_faa1, str_faa2, str_faa3, str_faa4, str_faa5, str_faa6, str_faa7, str_faa8, str_faa9, str_faaa, str_faab, str_faac, str_faad, str_faae, str_faaf, str_fab0, str_fab1, str_fab2, str_fab3, str_fab4, str_fab5, str_fab6, str_fab7, str_fab8, str_fab9, str_faba, str_fabb, str_fabc, str_fabd, str_fabe, str_fabf, str_fac0, str_fac1, str_fac2, str_fac3, str_fac4, str_fac5, str_fac6, str_fac7, str_fac8, str_fac9, str_faca, str_facb, str_facc, str_facd, str_face, str_facf, str_fad0, str_fad1, str_fad2, str_fad3, str_fad4, str_fad5, str_fad6, str_fad7, str_fad8, str_fad9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; static const unichar_t * const tab_fb[] = { str_fb00, str_fb01, str_fb02, str_fb03, str_fb04, str_fb05, str_fb06, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fb13, str_fb14, str_fb15, str_fb16, str_fb17, 0, 0, 0, 0, 0, str_fb1d, 0, str_fb1f, str_fb20, str_fb21, str_fb22, str_fb23, str_fb24, str_fb25, str_fb26, str_fb27, str_fb28, str_fb29, str_fb2a, str_fb2b, str_fb2c, str_fb2d, str_fb2e, str_fb2f, str_fb30, str_fb31, str_fb32, str_fb33, str_fb34, str_fb35, str_fb36, 0, str_fb38, str_fb39, str_fb3a, str_fb3b, str_fb3c, 0, str_fb3e, 0, str_fb40, str_fb41, 0, str_fb43, str_fb44, 0, str_fb46, str_fb47, str_fb48, str_fb49, str_fb4a, str_fb4b, str_fb4c, str_fb4d, str_fb4e, str_fb4f, str_fb50, str_fb51, str_fb52, str_fb53, str_fb54, str_fb55, str_fb56, str_fb57, str_fb58, str_fb59, str_fb5a, str_fb5b, str_fb5c, str_fb5d, str_fb5e, str_fb5f, str_fb60, str_fb61, str_fb62, str_fb63, str_fb64, str_fb65, str_fb66, str_fb67, str_fb68, str_fb69, str_fb6a, str_fb6b, str_fb6c, str_fb6d, str_fb6e, str_fb6f, str_fb70, str_fb71, str_fb72, str_fb73, str_fb74, str_fb75, str_fb76, str_fb77, str_fb78, str_fb79, str_fb7a, str_fb7b, str_fb7c, str_fb7d, str_fb7e, str_fb7f, str_fb80, str_fb81, str_fb82, str_fb83, str_fb84, str_fb85, str_fb86, str_fb87, str_fb88, str_fb89, str_fb8a, str_fb8b, str_fb8c, str_fb8d, str_fb8e, str_fb8f, str_fb90, str_fb91, str_fb92, str_fb93, str_fb94, str_fb95, str_fb96, str_fb97, str_fb98, str_fb99, str_fb9a, str_fb9b, str_fb9c, str_fb9d, str_fb9e, str_fb9f, str_fba0, str_fba1, str_fba2, str_fba3, str_fba4, str_fba5, str_fba6, str_fba7, str_fba8, str_fba9, str_fbaa, str_fbab, str_fbac, str_fbad, str_fbae, str_fbaf, str_fbb0, str_fbb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fbd3, str_fbd4, str_fbd5, str_fbd6, str_fbd7, str_fbd8, str_fbd9, str_fbda, str_fbdb, str_fbdc, str_fbdd, str_fbde, str_fbdf, str_fbe0, str_fbe1, str_fbe2, str_fbe3, str_fbe4, str_fbe5, str_fbe6, str_fbe7, str_fbe8, str_fbe9, str_fbea, str_fbeb, str_fbec, str_fbed, str_fbee, str_fbef, str_fbf0, str_fbf1, str_fbf2, str_fbf3, str_fbf4, str_fbf5, str_fbf6, str_fbf7, str_fbf8, str_fbf9, str_fbfa, str_fbfb, str_fbfc, str_fbfd, str_fbfe, str_fbff, 0}; static const unichar_t * const tab_fc[] = { str_fc00, str_fc01, str_fc02, str_fc03, str_fc04, str_fc05, str_fc06, str_fc07, str_fc08, str_fc09, str_fc0a, str_fc0b, str_fc0c, str_fc0d, str_fc0e, str_fc0f, str_fc10, str_fc11, str_fc12, str_fc13, str_fc14, str_fc15, str_fc16, str_fc17, str_fc18, str_fc19, str_fc1a, str_fc1b, str_fc1c, str_fc1d, str_fc1e, str_fc1f, str_fc20, str_fc21, str_fc22, str_fc23, str_fc24, str_fc25, str_fc26, str_fc27, str_fc28, str_fc29, str_fc2a, str_fc2b, str_fc2c, str_fc2d, str_fc2e, str_fc2f, str_fc30, str_fc31, str_fc32, str_fc33, str_fc34, str_fc35, str_fc36, str_fc37, str_fc38, str_fc39, str_fc3a, str_fc3b, str_fc3c, str_fc3d, str_fc3e, str_fc3f, str_fc40, str_fc41, str_fc42, str_fc43, str_fc44, str_fc45, str_fc46, str_fc47, str_fc48, str_fc49, str_fc4a, str_fc4b, str_fc4c, str_fc4d, str_fc4e, str_fc4f, str_fc50, str_fc51, str_fc52, str_fc53, str_fc54, str_fc55, str_fc56, str_fc57, str_fc58, str_fc59, str_fc5a, str_fc5b, str_fc5c, str_fc5d, str_fc5e, str_fc5f, str_fc60, str_fc61, str_fc62, str_fc63, str_fc64, str_fc65, str_fc66, str_fc67, str_fc68, str_fc69, str_fc6a, str_fc6b, str_fc6c, str_fc6d, str_fc6e, str_fc6f, str_fc70, str_fc71, str_fc72, str_fc73, str_fc74, str_fc75, str_fc76, str_fc77, str_fc78, str_fc79, str_fc7a, str_fc7b, str_fc7c, str_fc7d, str_fc7e, str_fc7f, str_fc80, str_fc81, str_fc82, str_fc83, str_fc84, str_fc85, str_fc86, str_fc87, str_fc88, str_fc89, str_fc8a, str_fc8b, str_fc8c, str_fc8d, str_fc8e, str_fc8f, str_fc90, str_fc91, str_fc92, str_fc93, str_fc94, str_fc95, str_fc96, str_fc97, str_fc98, str_fc99, str_fc9a, str_fc9b, str_fc9c, str_fc9d, str_fc9e, str_fc9f, str_fca0, str_fca1, str_fca2, str_fca3, str_fca4, str_fca5, str_fca6, str_fca7, str_fca8, str_fca9, str_fcaa, str_fcab, str_fcac, str_fcad, str_fcae, str_fcaf, str_fcb0, str_fcb1, str_fcb2, str_fcb3, str_fcb4, str_fcb5, str_fcb6, str_fcb7, str_fcb8, str_fcb9, str_fcba, str_fcbb, str_fcbc, str_fcbd, str_fcbe, str_fcbf, str_fcc0, str_fcc1, str_fcc2, str_fcc3, str_fcc4, str_fcc5, str_fcc6, str_fcc7, str_fcc8, str_fcc9, str_fcca, str_fccb, str_fccc, str_fccd, str_fcce, str_fccf, str_fcd0, str_fcd1, str_fcd2, str_fcd3, str_fcd4, str_fcd5, str_fcd6, str_fcd7, str_fcd8, str_fcd9, str_fcda, str_fcdb, str_fcdc, str_fcdd, str_fcde, str_fcdf, str_fce0, str_fce1, str_fce2, str_fce3, str_fce4, str_fce5, str_fce6, str_fce7, str_fce8, str_fce9, str_fcea, str_fceb, str_fcec, str_fced, str_fcee, str_fcef, str_fcf0, str_fcf1, str_fcf2, str_fcf3, str_fcf4, str_fcf5, str_fcf6, str_fcf7, str_fcf8, str_fcf9, str_fcfa, str_fcfb, str_fcfc, str_fcfd, str_fcfe, str_fcff, 0}; static const unichar_t * const tab_fd[] = { str_fd00, str_fd01, str_fd02, str_fd03, str_fd04, str_fd05, str_fd06, str_fd07, str_fd08, str_fd09, str_fd0a, str_fd0b, str_fd0c, str_fd0d, str_fd0e, str_fd0f, str_fd10, str_fd11, str_fd12, str_fd13, str_fd14, str_fd15, str_fd16, str_fd17, str_fd18, str_fd19, str_fd1a, str_fd1b, str_fd1c, str_fd1d, str_fd1e, str_fd1f, str_fd20, str_fd21, str_fd22, str_fd23, str_fd24, str_fd25, str_fd26, str_fd27, str_fd28, str_fd29, str_fd2a, str_fd2b, str_fd2c, str_fd2d, str_fd2e, str_fd2f, str_fd30, str_fd31, str_fd32, str_fd33, str_fd34, str_fd35, str_fd36, str_fd37, str_fd38, str_fd39, str_fd3a, str_fd3b, str_fd3c, str_fd3d, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fd50, str_fd51, str_fd52, str_fd53, str_fd54, str_fd55, str_fd56, str_fd57, str_fd58, str_fd59, str_fd5a, str_fd5b, str_fd5c, str_fd5d, str_fd5e, str_fd5f, str_fd60, str_fd61, str_fd62, str_fd63, str_fd64, str_fd65, str_fd66, str_fd67, str_fd68, str_fd69, str_fd6a, str_fd6b, str_fd6c, str_fd6d, str_fd6e, str_fd6f, str_fd70, str_fd71, str_fd72, str_fd73, str_fd74, str_fd75, str_fd76, str_fd77, str_fd78, str_fd79, str_fd7a, str_fd7b, str_fd7c, str_fd7d, str_fd7e, str_fd7f, str_fd80, str_fd81, str_fd82, str_fd83, str_fd84, str_fd85, str_fd86, str_fd87, str_fd88, str_fd89, str_fd8a, str_fd8b, str_fd8c, str_fd8d, str_fd8e, str_fd8f, 0, 0, str_fd92, str_fd93, str_fd94, str_fd95, str_fd96, str_fd97, str_fd98, str_fd99, str_fd9a, str_fd9b, str_fd9c, str_fd9d, str_fd9e, str_fd9f, str_fda0, str_fda1, str_fda2, str_fda3, str_fda4, str_fda5, str_fda6, str_fda7, str_fda8, str_fda9, str_fdaa, str_fdab, str_fdac, str_fdad, str_fdae, str_fdaf, str_fdb0, str_fdb1, str_fdb2, str_fdb3, str_fdb4, str_fdb5, str_fdb6, str_fdb7, str_fdb8, str_fdb9, str_fdba, str_fdbb, str_fdbc, str_fdbd, str_fdbe, str_fdbf, str_fdc0, str_fdc1, str_fdc2, str_fdc3, str_fdc4, str_fdc5, str_fdc6, str_fdc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fdf0, str_fdf1, str_fdf2, str_fdf3, str_fdf4, str_fdf5, str_fdf6, str_fdf7, str_fdf8, str_fdf9, str_fdfa, str_fdfb, str_fdfc, 0, 0, 0, 0}; static const unichar_t * const tab_fe[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fe10, str_fe11, str_fe12, str_fe13, str_fe14, str_fe15, str_fe16, str_fe17, str_fe18, str_fe19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, str_fe30, str_fe31, str_fe32, str_fe33, str_fe34, str_fe35, str_fe36, str_fe37, str_fe38, str_fe39, str_fe3a, str_fe3b, str_fe3c, str_fe3d, str_fe3e, str_fe3f, str_fe40, str_fe41, str_fe42, str_fe43, str_fe44, 0, 0, str_fe47, str_fe48, str_fe49, str_fe4a, str_fe4b, str_fe4c, str_fe4d, str_fe4e, str_fe4f, str_fe50, str_fe51, str_fe52, 0, str_fe54, str_fe55, str_fe56, str_fe57, str_fe58, str_fe59, str_fe5a, str_fe5b, str_fe5c, str_fe5d, str_fe5e, str_fe5f, str_fe60, str_fe61, str_fe62, str_fe63, str_fe64, str_fe65, str_fe66, 0, str_fe68, str_fe69, str_fe6a, str_fe6b, 0, 0, 0, 0, str_fe70, str_fe71, str_fe72, 0, str_fe74, 0, str_fe76, str_fe77, str_fe78, str_fe79, str_fe7a, str_fe7b, str_fe7c, str_fe7d, str_fe7e, str_fe7f, str_fe80, str_fe81, str_fe82, str_fe83, str_fe84, str_fe85, str_fe86, str_fe87, str_fe88, str_fe89, str_fe8a, str_fe8b, str_fe8c, str_fe8d, str_fe8e, str_fe8f, str_fe90, str_fe91, str_fe92, str_fe93, str_fe94, str_fe95, str_fe96, str_fe97, str_fe98, str_fe99, str_fe9a, str_fe9b, str_fe9c, str_fe9d, str_fe9e, str_fe9f, str_fea0, str_fea1, str_fea2, str_fea3, str_fea4, str_fea5, str_fea6, str_fea7, str_fea8, str_fea9, str_feaa, str_feab, str_feac, str_fead, str_feae, str_feaf, str_feb0, str_feb1, str_feb2, str_feb3, str_feb4, str_feb5, str_feb6, str_feb7, str_feb8, str_feb9, str_feba, str_febb, str_febc, str_febd, str_febe, str_febf, str_fec0, str_fec1, str_fec2, str_fec3, str_fec4, str_fec5, str_fec6, str_fec7, str_fec8, str_fec9, str_feca, str_fecb, str_fecc, str_fecd, str_fece, str_fecf, str_fed0, str_fed1, str_fed2, str_fed3, str_fed4, str_fed5, str_fed6, str_fed7, str_fed8, str_fed9, str_feda, str_fedb, str_fedc, str_fedd, str_fede, str_fedf, str_fee0, str_fee1, str_fee2, str_fee3, str_fee4, str_fee5, str_fee6, str_fee7, str_fee8, str_fee9, str_feea, str_feeb, str_feec, str_feed, str_feee, str_feef, str_fef0, str_fef1, str_fef2, str_fef3, str_fef4, str_fef5, str_fef6, str_fef7, str_fef8, str_fef9, str_fefa, str_fefb, str_fefc, 0, 0, 0, 0}; static const unichar_t * const tab_ff[] = { 0, str_ff01, str_ff02, str_ff03, str_ff04, str_ff05, str_ff06, str_ff07, str_ff08, str_ff09, str_ff0a, str_ff0b, str_ff0c, str_ff0d, str_ff0e, str_ff0f, str_ff10, str_ff11, str_ff12, str_ff13, str_ff14, str_ff15, str_ff16, str_ff17, str_ff18, str_ff19, str_ff1a, str_ff1b, str_ff1c, str_ff1d, str_ff1e, str_ff1f, str_ff20, str_ff21, str_ff22, str_ff23, str_ff24, str_ff25, str_ff26, str_ff27, str_ff28, str_ff29, str_ff2a, str_ff2b, str_ff2c, str_ff2d, str_ff2e, str_ff2f, str_ff30, str_ff31, str_ff32, str_ff33, str_ff34, str_ff35, str_ff36, str_ff37, str_ff38, str_ff39, str_ff3a, str_ff3b, str_ff3c, str_ff3d, str_ff3e, str_ff3f, str_ff40, str_ff41, str_ff42, str_ff43, str_ff44, str_ff45, str_ff46, str_ff47, str_ff48, str_ff49, str_ff4a, str_ff4b, str_ff4c, str_ff4d, str_ff4e, str_ff4f, str_ff50, str_ff51, str_ff52, str_ff53, str_ff54, str_ff55, str_ff56, str_ff57, str_ff58, str_ff59, str_ff5a, str_ff5b, str_ff5c, str_ff5d, str_ff5e, str_ff5f, str_ff60, str_ff61, str_ff62, str_ff63, str_ff64, str_ff65, str_ff66, str_ff67, str_ff68, str_ff69, str_ff6a, str_ff6b, str_ff6c, str_ff6d, str_ff6e, str_ff6f, str_ff70, str_ff71, str_ff72, str_ff73, str_ff74, str_ff75, str_ff76, str_ff77, str_ff78, str_ff79, str_ff7a, str_ff7b, str_ff7c, str_ff7d, str_ff7e, str_ff7f, str_ff80, str_ff81, str_ff82, str_ff83, str_ff84, str_ff85, str_ff86, str_ff87, str_ff88, str_ff89, str_ff8a, str_ff8b, str_ff8c, str_ff8d, str_ff8e, str_ff8f, str_ff90, str_ff91, str_ff92, str_ff93, str_ff94, str_ff95, str_ff96, str_ff97, str_ff98, str_ff99, str_ff9a, str_ff9b, str_ff9c, str_ff9d, str_ff9e, str_ff9f, str_ffa0, str_ffa1, str_ffa2, str_ffa3, str_ffa4, str_ffa5, str_ffa6, str_ffa7, str_ffa8, str_ffa9, str_ffaa, str_ffab, str_ffac, str_ffad, str_ffae, str_ffaf, str_ffb0, str_ffb1, str_ffb2, str_ffb3, str_ffb4, str_ffb5, str_ffb6, str_ffb7, str_ffb8, str_ffb9, str_ffba, str_ffbb, str_ffbc, str_ffbd, str_ffbe, 0, 0, 0, str_ffc2, str_ffc3, str_ffc4, str_ffc5, str_ffc6, str_ffc7, 0, 0, str_ffca, str_ffcb, str_ffcc, str_ffcd, str_ffce, str_ffcf, 0, 0, str_ffd2, str_ffd3, str_ffd4, str_ffd5, str_ffd6, str_ffd7, 0, 0, str_ffda, str_ffdb, str_ffdc, 0, 0, 0, str_ffe0, str_ffe1, str_ffe2, str_ffe3, str_ffe4, str_ffe5, str_ffe6, 0, str_ffe8, str_ffe9, str_ffea, str_ffeb, str_ffec, str_ffed, str_ffee, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const unichar_t *const * const unicode_alternates[] = { tab_0, tab_1, tab_2, tab_3, tab_4, tab_5, tab_6, up_allzeros, up_allzeros, tab_9, tab_a, tab_b, tab_c, tab_d, tab_e, tab_f, tab_10, tab_11, up_allzeros, tab_13, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, tab_1b, up_allzeros, tab_1d, tab_1e, tab_1f, tab_20, tab_21, tab_22, tab_23, tab_24, tab_25, tab_26, tab_27, up_allzeros, up_allzeros, tab_2a, up_allzeros, tab_2c, tab_2d, tab_2e, tab_2f, tab_30, tab_31, tab_32, tab_33, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, tab_a7, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, up_allzeros, tab_f9, tab_fa, tab_fb, tab_fc, tab_fd, tab_fe, tab_ff, 0}; dvisvgm-2.8.1/libs/ff-woff/fontforge/splinefont.h0000664000175000017500000031026713510660062016742 00000000000000/* Copyright (C) 2000-2012 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 #ifdef HAVE_CONFIG_H #include #endif #include #include #include "configure-fontforge.h" #include "fflocale.h" #ifdef HAVE_ICONV # include #else # include #endif #include #ifdef FONTFORGE_CONFIG_USE_DOUBLE # define real double # define bigreal double #else # define real float # define bigreal double #endif #define extended double /* Solaris wants to define extended to be unsigned [3] unless we do this*/ #define _EXTENDED #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 */ #define AppleMmMax 26 /* Apple sort of has a limit of 4095, but we only support this many */ typedef struct ipoint { int x; int y; } IPoint; #define IPOINT_EMPTY { 0, 0 } typedef struct basepoint { real x; real y; } BasePoint; #define BASEPOINT_EMPTY { (real)0.0, (real)0.0 } typedef struct dbasepoint { bigreal x; bigreal y; } DBasePoint; #define DBASEPOINT_EMPTY { (bigreal)0.0, (bigreal)0.0 } typedef struct tpoint { real x; real y; real t; } TPoint; #define TPOINT_EMPTY { (real)0.0, (real)0.0, (real)0.0 } typedef struct dbounds { real minx, maxx; real miny, maxy; } DBounds; #define DBOUNDS_EMPTY { (real)0.0, (real)0.0, (real)0.0, (real)0.0 } typedef struct ibounds { int minx, maxx; int miny, maxy; } IBounds; #define IBOUNDS_EMPTY { 0, 0, 0, 0 } enum val_type { v_int, v_real, v_str, v_unicode, v_lval, v_arr, v_arrfree, v_int32pt, v_int16pt, v_int8pt, v_void }; typedef struct val { enum val_type type; union { int ival; real fval; char *sval; struct val *lval; struct array *aval; uint32 *u32ptval; uint16 *u16ptval; uint8 *u8ptval; } u; } Val; /* Used by scripting */ struct psdict { int cnt; /* *key[0..cnt] and *values[0..cnt] currently available */ int next; /* **key[0..next] and **values[0..next] currently used */ 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 }; enum spreadMethod { sm_pad, sm_reflect, sm_repeat }; #define COLOR_INHERITED 0xfffffffe struct grad_stops { real offset; uint32 col; real opacity; }; struct gradient { BasePoint start; /* focal of a radial gradient, start of a linear */ BasePoint stop; /* center of a radial gradient, end of a linear */ real radius; /* 0=>linear gradient, else radius of a radial gradient */ enum spreadMethod sm; int stop_cnt; struct grad_stops *grad_stops; }; struct pattern { char *pattern; real width, height; /* Pattern is scaled to be repeated every width/height (in user coordinates) */ real transform[6]; /* Used during rasterization process */ struct bdfchar *pat; real invtrans[6]; int bminx, bminy, bwidth, bheight; /* of the pattern at bdfchar scale */ }; struct brush { uint32 col; float opacity; /* number between [0,1], only for svg/pdf */ struct pattern *pattern; /* A pattern to be tiled */ struct gradient *gradient; /* A gradient fill */ }; #define WIDTH_INHERITED (-1) #define DASH_INHERITED 255 /* if the dashes[0]==0 && dashes[1]==DASH_INHERITED */ #define DASH_MAX 8 typedef unsigned char DashType; struct pen { struct brush brush; uint8 linejoin; uint8 linecap; float width; real trans[4]; DashType dashes[DASH_MAX]; }; struct spline; enum si_type { si_std, si_caligraphic, si_poly, 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 removeinternal: 1; unsigned int removeexternal: 1; unsigned int leave_users_center: 1; /* Don't move the pen so its center is at the origin */ real penangle; real minorradius; struct splinepointlist *poly; real resolution; /* For freehand tool */ real radius2; int pressure1, pressure2; /* End freehand tool */ void *data; bigreal (*factor)(void *data,struct spline *spline,real t); } StrokeInfo; enum PolyType { Poly_Convex, Poly_Concave, Poly_PointOnEdge, Poly_TooFewPoints, Poly_Line }; enum overlap_type { over_remove, over_rmselected, over_intersect, over_intersel, over_exclude, over_findinter, over_fisel }; enum simpify_flags { sf_cleanup=-1, sf_normal=0, sf_ignoreslopes=1, sf_ignoreextremum=2, sf_smoothcurves=4, sf_choosehv=8, sf_forcelines=0x10, sf_nearlyhvlines=0x20, sf_mergelines=0x40, sf_setstart2extremum=0x80, sf_rmsingletonpoints=0x100 }; struct hsquash { double lsb_percent, stem_percent, counter_percent, rsb_percent; }; enum serif_type { srf_flat, srf_simpleslant, srf_complexslant }; /* | | (flat) | | (simple) | | (complex) */ /* | | | / | / */ /* | | | / | / */ /* +----+ |/ \ / */ typedef struct italicinfo { double italic_angle; double xheight_percent; struct hsquash lc, uc, neither; enum serif_type secondary_serif; unsigned int transform_bottom_serifs: 1; unsigned int transform_top_xh_serifs: 1; /* Those at x-height */ unsigned int transform_top_as_serifs: 1; /* Those at ascender-height */ unsigned int transform_diagon_serifs: 1; /* Those at baseline/xheight */ unsigned int a_from_d: 1; /* replace the "a" glyph with the variant which looks like a "d" without an ascender */ /* When I say "f" I also mean "f_f" ligature, "longs", cyrillic phi and other things shaped like "f" */ unsigned int f_long_tail: 1; /* Some Italic fonts have the "f" grow an extension of the main stem below the baseline */ unsigned int f_rotate_top: 1; /* Most Italic fonts take the top curve of the "f", rotate it 180 and attach to the bottom */ unsigned int pq_deserif: 1; /* Remove a serif from the descender of p or q and replace with a secondary serif as above */ /* Unsupported */ /* e becomes rounder, cross bar slightly slanted */ /* g closed counter at bottom */ /* k closed counter at top */ /* v-z diagonal stems become more curvatious */ unsigned int cyrl_phi: 1; /* Gains an "f" like top, bottom treated like "f" */ unsigned int cyrl_i: 1; /* Turns into a latin u */ unsigned int cyrl_pi: 1; /* Turns into a latin n */ unsigned int cyrl_te: 1; /* Turns into a latin m */ unsigned int cyrl_sha: 1; /* Turns into a latin m rotated 180 */ unsigned int cyrl_dje: 1; /* Turns into a latin smallcaps T */ unsigned int cyrl_dzhe: 1; /* Turns into a latin u */ /* Is there a difference between dzhe and i? both look like u to me */ /* Unsupported */ /* u432 curved B */ /* u433 strange gamma */ /* u434 normal delta */ /* u436 */ /* u43b lambda ? */ /* u43c */ /* u446 */ /* u449 */ /* u449 */ /* u44a */ /* This half of the structure gets filled in later - see ITALICINFO_REMAINDER */ double tan_ia; double x_height; double pq_depth; double ascender_height; double emsize; int order2; struct splinefont *sf; int layer; double serif_extent, serif_height; struct splinepoint *f_start, *f_end; /* start has next pointing into the f head and up */ struct splinepoint *ff_start1, *ff_end1, *ff_start2, *ff_end2; double f_height, ff_height; } ItalicInfo; #define ITALICINFO_REMAINDER 0, 0, 0, 0, 0, 0, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0 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; #define BLUEDATA_EMPTY { \ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, \ { { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, \ { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 }, { 0.0, 0.0 } \ } \ } 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. */ /* (Adobe uses it too) we'll turn it into a default entry when we output it. */ #define DEFAULT_LANG CHR('d','f','l','t') /* The OpenType spec says in one place that the default script is 'dflt' and */ /* in another that it is 'DFLT'. 'DFLT' is correct */ #define DEFAULT_SCRIPT CHR('D','F','L','T') #define REQUIRED_FEATURE CHR(' ','R','Q','D') enum otlookup_type { ot_undef = 0, /* Not a lookup type */ gsub_start = 0x000, /* Not a lookup type */ gsub_single = 0x001, gsub_multiple = 0x002, gsub_alternate = 0x003, gsub_ligature = 0x004, gsub_context = 0x005, gsub_contextchain = 0x006, /* GSUB extension 7 */ gsub_reversecchain = 0x008, /* mac state machines */ morx_indic = 0x0fd, morx_context = 0x0fe, morx_insert = 0x0ff, /* ********************* */ gpos_start = 0x100, /* Not a lookup type */ gpos_single = 0x101, gpos_pair = 0x102, gpos_cursive = 0x103, gpos_mark2base = 0x104, gpos_mark2ligature = 0x105, gpos_mark2mark = 0x106, gpos_context = 0x107, gpos_contextchain = 0x108, /* GPOS extension 9 */ kern_statemachine = 0x1ff /* otlookup&0xff == lookup type for the appropriate table */ /* otlookup>>8: 0=>GSUB, 1=>GPOS */ }; enum otlookup_typemasks { gsub_single_mask = 0x00001, gsub_multiple_mask = 0x00002, gsub_alternate_mask = 0x00004, gsub_ligature_mask = 0x00008, gsub_context_mask = 0x00010, gsub_contextchain_mask = 0x00020, gsub_reversecchain_mask = 0x00040, morx_indic_mask = 0x00080, morx_context_mask = 0x00100, morx_insert_mask = 0x00200, /* ********************* */ gpos_single_mask = 0x00400, gpos_pair_mask = 0x00800, gpos_cursive_mask = 0x01000, gpos_mark2base_mask = 0x02000, gpos_mark2ligature_mask = 0x04000, gpos_mark2mark_mask = 0x08000, gpos_context_mask = 0x10000, gpos_contextchain_mask = 0x20000, kern_statemachine_mask = 0x40000 }; #define MAX_LANG 4 /* If more than this we allocate more_langs in chunks of MAX_LANG */ struct scriptlanglist { uint32 script; uint32 langs[MAX_LANG]; uint32 *morelangs; int lang_cnt; struct scriptlanglist *next; }; #define OPENTYPE_FEATURE_FRIENDLYNAMES_EMPTY { 0, NULL, NULL, 0 } typedef struct featurescriptlanglist { uint32 featuretag; struct scriptlanglist *scripts; struct featurescriptlanglist *next; unsigned int ismac: 1; /* treat the featuretag as a mac feature/setting */ } FeatureScriptLangList; enum pst_flags { pst_r2l=1, pst_ignorebaseglyphs=2, pst_ignoreligatures=4, pst_ignorecombiningmarks=8, pst_usemarkfilteringset=0x10, pst_markclass=0xff00, pst_markset=0xffff0000 }; struct lookup_subtable { char *subtable_name; char *suffix; /* for gsub_single, used to find a default replacement */ int16 separation, minkern; /* for gpos_pair, used to guess default kerning values */ struct otlookup *lookup; unsigned int unused: 1; unsigned int per_glyph_pst_or_kern: 1; unsigned int anchor_classes: 1; unsigned int vertical_kerning: 1; unsigned int ticked: 1; unsigned int kerning_by_touch: 1; /* for gpos_pair, calculate kerning so that glyphs will touch */ unsigned int onlyCloser: 1; /* for kerning classes */ unsigned int dontautokern: 1; /* for kerning classes */ struct kernclass *kc; struct generic_fpst *fpst; struct generic_asm *sm; /* Each time an item is added to a lookup we must place it into a */ /* subtable. If it's a kerning class, fpst or state machine it has */ /* a subtable all to itself. If it's an anchor class it can share */ /* a subtable with other anchor classes (merge with). If it's a glyph */ /* PST it may share a subtable with other PSTs */ /* Note items may only be placed in lookups in which they fit. Can't */ /* put kerning data in a gpos_single lookup, etc. */ struct lookup_subtable *next; int32 subtable_offset; int32 *extra_subtables; /* If a kerning subtable has too much stuff in it, we are prepared to */ /* break it up into several smaller subtables, each of which has */ /* an offset in this list (extra-subtables[0]==subtable_offset) */ /* the list is terminated by an entry of -1 */ }; typedef struct otlookup { struct otlookup *next; enum otlookup_type lookup_type; uint32 lookup_flags; /* Low order: traditional flags, High order: markset index, only meaningful if pst_usemarkfilteringset set */ char *lookup_name; FeatureScriptLangList *features; struct lookup_subtable *subtables; unsigned int unused: 1; /* No subtable is used (call SFFindUnusedLookups before examining) */ unsigned int empty: 1; /* No subtable is used, and no anchor classes are used */ unsigned int store_in_afm: 1; /* Used for ligatures, some get stored */ /* 'liga' generally does, but 'frac' doesn't */ unsigned int needs_extension: 1; /* Used during opentype generation */ unsigned int temporary_kern: 1; /* Used when decomposing kerning classes into kern pairs for older formats */ unsigned int def_lang_checked: 1; unsigned int def_lang_found: 1; unsigned int ticked: 1; unsigned int in_gpos: 1; unsigned int in_jstf: 1; unsigned int only_jstf: 1; int16 subcnt; /* Actual number of subtables we will output */ /* Some of our subtables may contain no data */ /* Some may be too big and need to be broken up.*/ /* So this field may be different than just counting the subtables */ int lookup_index; /* used during opentype generation */ uint32 lookup_offset; uint32 lookup_length; char *tempname; } OTLookup; #define LOOKUP_SUBTABLE_EMPTY { NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, 0, NULL } #define OTLOOKUP_EMPTY { NULL, 0, 0, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL } typedef struct devicetab { uint16 first_pixel_size, last_pixel_size; /* A range of point sizes to which this table applies */ int8 *corrections; /* a set of pixel corrections, one for each point size */ } DeviceTable; typedef struct valdev { /* Value records can have four associated device tables */ DeviceTable xadjust; DeviceTable yadjust; DeviceTable xadv; DeviceTable yadv; } ValDevTab; enum anchorclass_type { act_mark, act_mkmk, act_curs, act_mklg, act_unknown }; typedef struct anchorclass { char *name; /* in utf8 */ struct lookup_subtable *subtable; uint8 type; /* anchorclass_type */ uint8 has_base; uint8 processed, has_mark, matches, ac_num; uint8 ticked; struct anchorclass *next; } 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; DeviceTable xadjust, yadjust; unsigned int type: 4; unsigned int selected: 1; unsigned int ticked: 1; unsigned int has_ttf_pt: 1; uint16 ttf_pt_index; int16 lig_index; struct anchorpoint *next; } AnchorPoint; typedef struct kernpair { // Note that the left character in the pair has the reference to the kerning pair, which in turn references the right character. struct lookup_subtable *subtable; struct splinechar *sc; int16 off; uint16 kcid; /* temporary value */ DeviceTable *adjust; /* Only adjustment in one dimen, if more needed use pst */ struct kernpair *next; } KernPair; #define FF_KERNCLASS_FLAG_NATIVE 2 // If set, the class goes into groups.plist or kerning.plist. #define FF_KERNCLASS_FLAG_FEATURE 4 // If set, the class or rule goes into the feature file. In the present configuration, this ought to be zero always. #define FF_KERNCLASS_FLAG_NAMETYPE 8 // If unset (default), the class has a standard name, which translates to a U. F. O. name starting in public.kern, which may be illegal in the feature file. If set, it has a name like @MMK_. #define FF_KERNCLASS_FLAG_NAMELEGACY 16 // If set, the class has a U. F. O. name starting in @kc as FontForge liked to do in the past. #define FF_KERNCLASS_FLAG_VIRTUAL 32 // If unset (default), the class is a real character class and does not conflict with same-sided classes. If set, FontForge mostly ignores the class except for U. F. O. input/output. #define FF_KERNCLASS_FLAG_FLATTEN 64 // If unset (default), the class gets exported as a class. If set, it gets exported as its first member (in order to support class-character kerns). #define FF_KERNCLASS_FLAG_SINGLECHAR (FF_KERNCLASS_FLAG_VIRTUAL | FF_KERNCLASS_FLAG_FLATTEN) // We expect to see these used together. typedef struct kernclass { int first_cnt, second_cnt; /* Count of classes for first and second chars */ char **firsts; /* list of a space separated list of char names */ char **seconds; /* one entry for each class. Entry 0 is null */ /* and means everything not specified elsewhere */ char **firsts_names; // We need to track the names of the classes in order to round-trip U. F. O. data. char **seconds_names; int *firsts_flags; // This tracks the storage format of the class in U. F. O. (groups.plist or features.fea) and whether it's a single-character class. int *seconds_flags; // We also track the name format (@MMK or public.kern). struct lookup_subtable *subtable; uint16 kcid; /* Temporary value, used for many things briefly */ int16 *offsets; /* array of first_cnt*second_cnt entries with 0 representing no data */ int *offsets_flags; DeviceTable *adjusts; /* array of first_cnt*second_cnt entries representing resolution-specific adjustments */ struct kernclass *next; // Note that, in most cases, a typeface needs only one struct kernclass since it can contain all classes. int feature; // This indicates whether the kerning class came from a feature file. This is important during export. } KernClass; 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, /* And these are used to specify a kerning pair where the current */ /* char is the final glyph rather than the initial one */ /* A kludge used when cutting and pasting features */ pst_kernback, pst_vkernback }; struct vr { int16 xoff, yoff, h_adv_off, v_adv_off; ValDevTab *adjust; }; typedef struct generic_pst { unsigned int ticked: 1; unsigned int temporary: 1; /* Used in afm ligature closure */ /* enum possub_type*/ uint8 type; struct lookup_subtable *subtable; struct generic_pst *next; union { struct vr 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 }; struct seqlookup { int seq; struct otlookup *lookup; }; struct fpg { char *names, *back, *fore; }; struct fpc { int ncnt, bcnt, fcnt; uint16 *nclasses, *bclasses, *fclasses, *allclasses; }; struct fpv { int ncnt, bcnt, fcnt; char **ncovers, **bcovers, **fcovers; }; struct fpr { int always1, bcnt, fcnt; char **ncovers, **bcovers, **fcovers; char *replacements; }; struct fpst_rule { union { /* Note: Items in backtrack area are in reverse order because that's how the OT wants them */ /* they need to be reversed again to be displayed to the user */ struct fpg glyph; struct fpc class; struct fpv coverage; struct fpr rcoverage; } u; int lookup_cnt; struct seqlookup *lookups; }; typedef struct generic_fpst { uint16 /*enum possub_type*/ type; uint16 /*enum fpossub_format*/ format; struct lookup_subtable *subtable; struct generic_fpst *next; uint16 nccnt, bccnt, fccnt; uint16 rule_cnt; char **nclass, **bclass, **fclass; struct fpst_rule *rules; uint8 ticked; uint8 effectively_by_glyphs; char **nclassnames, **bclassnames, **fclassnames; } 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 }; struct asm_state { uint16 next_state; uint16 flags; union { struct { struct otlookup *mark_lookup; /* for contextual glyph subs (tag of a nested lookup) */ struct otlookup *cur_lookup; /* for contextual glyph subs */ } context; struct { char *mark_ins; char *cur_ins; } insert; struct { int16 *kerns; int kcnt; } kern; } u; }; typedef struct generic_asm { /* Apple State Machine */ struct generic_asm *next; uint16 /*enum asm_type*/ type; struct lookup_subtable *subtable; /* Lookup contains feature setting info */ uint16 flags; /* 0x8000=>vert, 0x4000=>r2l, 0x2000=>hor&vert */ uint8 ticked; uint16 class_cnt, state_cnt; char **classes; struct asm_state *state; } 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 jstf_prio { OTLookup **enableShrink; /* Points to an array of lookups (GSUB or GPOS)*/ OTLookup **disableShrink; /* NULL terminated */ OTLookup **maxShrink; /* Array of GPOS like lookups */ OTLookup **enableExtend; OTLookup **disableExtend; OTLookup **maxExtend; }; struct jstf_lang { uint32 lang; struct jstf_lang *next; int cnt; struct jstf_prio *prios; }; typedef struct jstf_script { uint32 script; struct jstf_script *next; char *extenders; /* list of glyph names */ struct jstf_lang *langs; } Justify; 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 */ }; /* Wow, the GPOS 'size' feature stores a string in the name table just as mac */ /* features do */ /* And now (OTF 1.6) GSUB 'ss01'-'ss20' do too */ struct otfname { struct otfname *next; uint16 lang; /* windows language code */ char *name; /* utf8 */ }; struct otffeatname { uint32 tag; /* Feature tag */ struct otfname *names; struct otffeatname *next; uint16 nid; /* temporary value */ }; struct macsetting { struct macsetting *next; uint16 setting; uint16 strid; struct macname *setname; unsigned int initially_enabled: 1; }; 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 *settings; } MacFeat; typedef struct refbdfc { unsigned int checked: 1; unsigned int selected: 1; int8 xoff; int8 yoff; uint16 gid; struct refbdfc *next; struct bdfchar *bdfc; } BDFRefChar; struct bdfcharlist { struct bdfchar *bc; struct bdfcharlist *next; }; typedef struct bdfchar { struct splinechar *sc; int16 xmin,xmax,ymin,ymax; int16 width; int16 bytes_per_line; uint8 *bitmap; struct refbdfc *refs; int orig_pos; int16 pixelsize; /* for undoes */ struct bitmapview *views; struct undoes *undoes; struct 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 */ unsigned int isreference: 1; /* for ttf bitmap input, */ unsigned int ticked: 1; uint8 depth; /* for ttf bitmap output */ uint16 vwidth; BDFFloat *selection; BDFFloat *backup; struct bdfcharlist *dependents; } BDFChar; enum undotype { ut_none=0, ut_state, ut_tstate, ut_statehint, ut_statename, ut_statelookup, ut_anchors, ut_width, ut_vwidth, ut_lbearing, ut_rbearing, ut_possub, ut_hints, ut_bitmap, ut_bitmapsel, ut_composit, ut_multiple, ut_layers, ut_noop }; #define UNDO_LAYER_UNKNOWN -1 enum sfundotype { sfut_none=0, sfut_lookups, sfut_lookups_kerns, sfut_fontinfo, sfut_noop }; /** * A spline font level undo stack. undoes are doubly linked using the * 'ln' member and carry some user presentable description of what the * undo relates to in 'msg'. * * The sfdchunk is a pointer to an SFD fragment which will apply the * undo to the current state. For example, it might contain * information about the old value of kerning pairs which can be used * to restore state to how it was. Note that the sfdchunk might only * be partial, containing only enough information to restore the state * which changed when the undo was created. */ typedef struct enc { char *enc_name; int char_cnt; /* Size of the next two arrays */ int32 *unicode; /* unicode value for each encoding point */ char **psnames; /* optional postscript name for each encoding point */ struct enc *next; unsigned int builtin: 1; unsigned int hidden: 1; unsigned int only_1byte: 1; unsigned int has_1byte: 1; unsigned int has_2byte: 1; unsigned int is_unicodebmp: 1; unsigned int is_unicodefull: 1; unsigned int is_custom: 1; unsigned int is_original: 1; unsigned int is_compact: 1; unsigned int is_japanese: 1; unsigned int is_korean: 1; unsigned int is_tradchinese: 1; unsigned int is_simplechinese: 1; char iso_2022_escape[8]; int iso_2022_escape_len; int low_page, high_page; char *iconv_name; /* For compatibility to old versions we might use a different name from that used by iconv. */ iconv_t *tounicode; iconv_t *fromunicode; int (*tounicode_func)(int); int (*fromunicode_func)(int); unsigned int is_temporary: 1; /* freed when the map gets freed */ int char_max; /* Used by temporary encodings */ } Encoding; struct renames { char *from; char *to; }; typedef struct namelist { struct namelist *basedon; char *title; const char ***unicode[17]; struct namelist *next; struct renames *renames; int uses_unicode; char *a_utf8_name; } NameList; enum uni_interp { ui_unset= -1, ui_none, ui_adobe, ui_greek, ui_japanese, ui_trad_chinese, ui_simp_chinese, ui_korean, ui_ams }; struct remap { uint32 firstenc, lastenc; int32 infont; }; typedef struct encmap { /* A per-font map of encoding to glyph id */ int32 *map; /* Map from encoding to glyphid */ int32 *backmap; /* Map from glyphid to encoding */ int enccount; /* used size of the map array */ /* strictly speaking this might include */ /* glyphs that are not encoded, but which */ /* are displayed after the proper encoding */ int encmax; /* allocated size of the map array */ int backmax; /* allocated size of the backmap array */ struct remap *remap; Encoding *enc; unsigned int ticked: 1; } EncMap; enum property_type { prt_string, prt_atom, prt_int, prt_uint, prt_property=0x10 }; typedef struct bdfprops { char *name; /* These include both properties (like SLANT) and non-properties (like FONT) */ int type; union { char *str; char *atom; int val; } u; } BDFProperties; typedef struct bdffont { struct splinefont *sf; int glyphcnt, glyphmax; /* used & allocated sizes of glyphs array */ BDFChar **glyphs; /* an array of charcnt entries */ int16 pixelsize; int16 ascent, descent; int16 layer; /* for piecemeal fonts */ unsigned int piecemeal: 1; unsigned int bbsized: 1; unsigned int ticked: 1; unsigned int unhinted_freetype: 1; unsigned int recontext_freetype: 1; struct bdffont *next; struct clut *clut; char *foundry; int res; void *freetype_context; uint16 truesize; /* for bbsized fonts */ int16 prop_cnt; int16 prop_max; /* only used within bdfinfo dlg */ BDFProperties *props; uint16 ptsize, dpi; /* for piecemeal fonts */ } BDFFont; #define HntMax 96 /* PS says at most 96 hints */ typedef uint8 HintMask[HntMax/8]; enum pointtype { pt_curve, pt_corner, pt_tangent, pt_hvcurve }; 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 nextcpselected: 2; /* Is the next BCP selected */ unsigned int prevcpselected: 2; /* Is the prev BCP selected */ unsigned int pointtype:2; unsigned int isintersection: 1; unsigned int flexy: 1; /* When "freetype_markup" is on in charview.c:DrawPoint */ unsigned int flexx: 1; /* flexy means select nextcp, and flexx means draw circle around nextcp */ unsigned int roundx: 1; /* For true type hinting */ unsigned int roundy: 1; /* For true type hinting */ unsigned int dontinterpolate: 1; /* in ttf, don't imply point by interpolating between cps */ 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 yet */ /* (or perhaps point in context where no number is possible as in a glyph with points & refs) */ uint16 nextcpindex; /* Truetype point index */ struct spline *next; struct spline *prev; HintMask *hintmask; char* name; } SplinePoint; enum linelist_flags { cvli_onscreen=0x1, cvli_clipped=0x2 }; 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 linelist_flags 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; /** * * 2013Note: If you are altering from->me.x and y then you will * probably have to modify splines[] to match your change. * eg, moving both ends of a spline up/down by changing their * to/from will also probably need an update to splines[ 0 | 1 ].d to * match. */ 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; unsigned int acceptableextrema: 1; /* This spline has extrema, but we don't care */ SplinePoint *from; SplinePoint *to; Spline1D splines[2]; /* splines[0] is the x spline, splines[1] is y */ struct linearapprox *approx; /* Posible optimizations: Precalculate bounding box Precalculate min/max/ points of inflection */ } Spline; #ifndef _NO_LIBSPIRO # include "spiroentrypoints.h" #else # define SPIRO_OPEN_CONTOUR '{' # define SPIRO_CORNER 'v' # define SPIRO_G4 'o' # define SPIRO_G2 'c' # define SPIRO_LEFT '[' # define SPIRO_RIGHT ']' # define SPIRO_END 'z' typedef struct { /* Taken from spiro.h because I want */ double x; /* to be able to compile for spiro */ double y; /* even on a system without it */ char ty; } spiro_cp; #endif #define SPIRO_SELECTED(cp) ((cp)->ty&0x80) #define SPIRO_DESELECT(cp) ((cp)->ty&=~0x80) #define SPIRO_SELECT(cp) ((cp)->ty|=0x80) #define SPIRO_SPL_OPEN(spl) ((spl)->spiro_cnt>1 && ((spl)->spiros[0].ty&0x7f)==SPIRO_OPEN_CONTOUR) #define SPIRO_NEXT_CONSTRAINT SPIRO_RIGHT /* The curve is on the next side of the constraint point */ #define SPIRO_PREV_CONSTRAINT SPIRO_LEFT /* The curve is on the prev side of the constraint point */ typedef struct splinepointlist { SplinePoint *first, *last; struct splinepointlist *next; spiro_cp *spiros; uint16 spiro_cnt, spiro_max; /* These could be bit fields, but bytes are easier to access and we */ /* don't need the space (yet) */ uint8 ticked; uint8 beziers_need_optimizer; /* If the spiros have changed in spiro mode, then reverting to bezier mode might, someday, run a simplifier */ uint8 is_clip_path; /* In type3/svg fonts */ int start_offset; // This indicates which point is the canonical first for purposes of outputting to U. F. O.. char *contour_name; } SplinePointList, SplineSet; struct reflayer { unsigned int background: 1; unsigned int order2: 1; unsigned int anyflexes: 1; unsigned int dofill: 1; unsigned int dostroke: 1; unsigned int fillfirst: 1; struct brush fill_brush; struct pen stroke_pen; SplinePointList *splines; }; typedef struct refchar { unsigned int checked: 1; unsigned int selected: 1; unsigned int point_match: 1; /* match_pt* are point indexes */ /* and need to be converted to a */ /* translation after truetype readin */ unsigned int encoded: 1; /* orig_pos is actually an encoded value, used for old sfd files */ unsigned int justtranslated: 1; /* The transformation matrix specifies a translation (or is identity) */ unsigned int use_my_metrics: 1; /* Retain the ttf "use_my_metrics" info. */ /* important for glyphs with instructions which change the width used */ /* inside composites */ unsigned int round_translation_to_grid: 1; /* Retain the ttf "round_to_grid" info. */ unsigned int point_match_out_of_date: 1; /* Someone has edited a base glyph */ int16 adobe_enc; int orig_pos; int unicode_enc; /* used by paste */ real transform[6]; /* transformation matrix (first 2 rows of a 3x3 matrix, missing row is 0,0,1) */ struct reflayer *layers; int layer_cnt; struct refchar *next; DBounds bb; struct splinechar *sc; BasePoint top; uint16 match_pt_base, match_pt_ref; } RefChar; /* 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 */ 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 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 */ BasePoint left, right, unit; HintInstance *where; /* location(s) along the unit vector */ } DStemInfo; 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 */{ unsigned int background: 1; unsigned int order2: 1; unsigned int anyflexes: 1; unsigned int dofill: 1; unsigned int dostroke: 1; unsigned int fillfirst: 1; struct brush fill_brush; struct pen stroke_pen; SplinePointList *splines; RefChar *refs; /* Only in foreground layer(s) */ uint32 validation_state; uint32 old_vs; void *python_persistent; /* If python this will hold a python object, if not python this will hold a string containing a pickled object. We do nothing with it (if not python) except save it back out unchanged */ int python_persistent_has_lists; } Layer; enum layer_type { ly_all=-2, ly_grid= -1, ly_back=0, ly_fore=1, /* Possibly other foreground layers for type3 things */ /* Possibly other background layers for normal fonts */ ly_none = -3 }; struct gv_part { char *component; unsigned int is_extender: 1; /* This component may be skipped or repeated */ uint16 startConnectorLength; uint16 endConnectorLength; uint16 fullAdvance; }; /* For the 'MATH' table (and for TeX) */ struct glyphvariants { char *variants; /* Space separated list of glyph names */ /* Glyph assembly */ int16 italic_correction; /* Of the composed glyph */ DeviceTable *italic_adjusts; int part_cnt; struct gv_part *parts; }; struct mathkerndata { int16 height,kern; DeviceTable *height_adjusts; DeviceTable *kern_adjusts; }; /* For the 'MATH' table */ struct mathkernvertex { int cnt; /* There is one more kern entry than height entry */ /* So the last mkd should have its height ignored */ /* The MATH table stores the height count, I think the kern count */ /* is more useful (and that's what I use here). They differ by 1 */ struct mathkerndata *mkd; }; struct mathkern { struct mathkernvertex top_right; struct mathkernvertex top_left; struct mathkernvertex bottom_right; struct mathkernvertex bottom_left; }; enum privatedict_state { pds_odd = 0x1, /* Odd number of entries */ pds_outoforder = 0x2, /* Bluevalues should be listed in order */ pds_toomany = 0x4, /* arrays are of limited sizes */ pds_tooclose = 0x8, /* adjacent zones must not be within 2*bluefuzz+1 (or 3, if bluefuzz omitted) */ pds_notintegral= 0x10, /* Must be integers */ pds_toobig = 0x20, /* within pair difference have some relation to BlueScale but the docs make no sense to me */ pds_shift = 8, /* BlueValues/OtherBlues, unshifted, FamilyBlues/FamilyOtherBlues shifted once */ pds_missingblue = 0x010000, pds_badbluefuzz = 0x020000, pds_badbluescale = 0x040000, pds_badstdhw = 0x080000, pds_badstdvw = 0x100000, pds_badstemsnaph = 0x200000, pds_badstemsnapv = 0x400000, pds_stemsnapnostdh = 0x0800000, pds_stemsnapnostdv = 0x1000000, pds_badblueshift = 0x2000000 }; enum validation_state { vs_unknown = 0, vs_known=0x01, /* It has been validated */ vs_opencontour=0x02, vs_selfintersects=0x04, vs_wrongdirection=0x08, vs_flippedreferences=0x10, /* special case of wrong direction */ vs_missingextrema=0x20, vs_missingglyphnameingsub=0x40, /* Next few are postscript only */ vs_toomanypoints=0x80, vs_toomanyhints=0x100, vs_badglyphname=0x200, /* Next few are only for fontlint */ /* These are relative to maxp values which ff would fix on generating a font */ vs_maxp_toomanypoints =0x400, vs_maxp_toomanypaths =0x800, vs_maxp_toomanycomppoints=0x1000, vs_maxp_toomanycomppaths =0x2000, vs_maxp_instrtoolong =0x4000, vs_maxp_toomanyrefs =0x8000, vs_maxp_refstoodeep =0x10000, /* vs_maxp_prepfpgmtoolong=0x20000, */ /* I think I was wrong about this "error" */ /* Oops, we need another one, two, for the glyphs */ vs_pointstoofarapart = 0x40000, vs_nonintegral = 0x80000, /* This will never be interesting in a real font, but might be in an sfd file */ vs_missinganchor = 0x100000, vs_dupname = 0x200000, vs_dupunicode = 0x400000, vs_overlappedhints = 0x800000, vs_last = vs_overlappedhints, vs_maskps = 0x3fe | vs_pointstoofarapart | vs_missinganchor | vs_dupname | vs_dupunicode | vs_overlappedhints, vs_maskcid = 0x1fe | vs_pointstoofarapart | vs_missinganchor | vs_dupname | vs_overlappedhints, vs_maskttf = 0x7e | vs_pointstoofarapart | vs_nonintegral | vs_missinganchor | vs_dupunicode, vs_maskfindproblems = 0x1be | vs_pointstoofarapart | vs_nonintegral | vs_missinganchor | vs_overlappedhints }; struct splinecharlist { struct splinechar *sc; struct splinecharlist *next;}; struct altuni { struct altuni *next; int32 unienc, vs; uint32 fid; }; /* vs is the "variation selector" a unicode codepoint which modifieds */ /* the code point before it. If vs is -1 then unienc is just an */ /* alternate encoding (greek Alpha and latin A), but if vs is one */ /* of unicode's variation selectors then this glyph is somehow a */ /* variant shape. The specifics depend on the selector and script */ /* fid is currently unused, but may, someday, be used to do ttcs */ /* NOTE: GlyphInfo displays vs==-1 as vs==0, and fixes things up */ typedef struct splinechar { char *name; int unicodeenc; int orig_pos; /* Original position in the glyph list */ 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 without bit 1 of head.flags set */ /* or (once upon a time, but no longer) a ttf font with vert metrics where it is the ymax value when we had a font-wide vertical offset */ /* or when generating morx where it is the mask of tables in which the glyph occurs */ /* Always a temporary value */ int ttf_glyph; /* only used when writing out a ttf or otf font */ Layer *layers; /* layer[0] is background, layer[1] foreground */ /* In type3 fonts 2-n are also foreground, otherwise also background */ 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 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 */ /* And fontview 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 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 ticked2: 1; unsigned int glyph_class: 3; /* 0=> fontforge determines class automagically, else one more than the class value in gdef so 2+1=>lig, 3+1=>mark */ unsigned int numberpointsbackards: 1; unsigned int instructions_out_of_date: 1; unsigned int complained_about_ptnums: 1; unsigned int vs_open: 1; unsigned int unlink_rm_ovrlp_save_undo: 1; unsigned int inspiro: 1; unsigned int lig_caret_cnt_fixed: 1; unsigned int suspendMetricsViewEventPropagation: 1; /* rect tool might do this while drawing */ /* 5 bits left (one more if we ignore compositionunit below) */ #if HANYANG unsigned int compositionunit: 1; int16 jamo, varient; #endif struct splinecharlist *dependents; /* The dependents list is a list of all characters which refenence*/ /* the current character directly */ KernPair *kerns; // Note that the left character in the pair has the reference to the kerning pair, which in turn references the right character. 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 */ char *comment; /* in utf8 */ uint32 /*Color*/ color; AnchorPoint *anchor; uint8 *ttf_instrs; int16 ttf_instrs_len; int16 countermask_cnt; HintMask *countermasks; struct altuni *altuni; /* for TeX */ int16 tex_height, tex_depth; /* TeX also uses italic_correction and glyph variants below */ /* For the 'MATH' table (and for TeX) */ unsigned int is_extended_shape: 1; int16 italic_correction; int16 top_accent_horiz; /* MATH table allows you to specific a*/ /* horizontal anchor for accent attachments, vertical */ /* positioning is done elsewhere */ DeviceTable *italic_adjusts; DeviceTable *top_accent_adjusts; struct glyphvariants *vert_variants; struct glyphvariants *horiz_variants; struct mathkern *mathkern; /* End of MATH/TeX fields */ #ifndef _NO_PYTHON void *python_sc_object; void *python_temporary; #endif #if 0 // Python persistent data is now in the layers. void *python_persistent; /* If python this will hold a python object, if not python this will hold a string containing a pickled object. We do nothing with it (if not python) except save it back out unchanged */ int python_persistent_has_lists; #endif // 0 /* If the glyph is used as a tile pattern, then the next two values */ /* determine the amount of white space around the tile. If extra is*/ /* non-zero then we add it to the max components of the bbox and */ /* subtract it from the min components. If extra is 0 then tile_bounds*/ /* will be used. If tile_bounds is all zeros then the glyph's bbox */ /* will be used. */ real tile_margin; /* If the glyph is used as a tile */ DBounds tile_bounds; char * glif_name; // This stores the base name of the glyph when saved to U. F. O.. } SplineChar; #define TEX_UNDEF 0x7fff 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/*reserved*/, ttf_preffamilyname, ttf_prefmodifiers, ttf_compatfull, ttf_sampletext, ttf_cidfindfontname, ttf_wwsfamily, ttf_wwssubfamily, ttf_namemax }; struct ttflangname { int lang; char *names[ttf_namemax]; /* in utf8 */ int frommac[(ttf_namemax+31)/32]; /* Used when parsing the 'name' table */ struct ttflangname *next; }; struct MATH { /* From the MATH Constants subtable (constants for positioning glyphs. Not PI)*/ int16 ScriptPercentScaleDown; int16 ScriptScriptPercentScaleDown; uint16 DelimitedSubFormulaMinHeight; uint16 DisplayOperatorMinHeight; int16 MathLeading; DeviceTable *MathLeading_adjust; int16 AxisHeight; DeviceTable *AxisHeight_adjust; int16 AccentBaseHeight; DeviceTable *AccentBaseHeight_adjust; int16 FlattenedAccentBaseHeight; DeviceTable *FlattenedAccentBaseHeight_adjust; int16 SubscriptShiftDown; DeviceTable *SubscriptShiftDown_adjust; int16 SubscriptTopMax; DeviceTable *SubscriptTopMax_adjust; int16 SubscriptBaselineDropMin; DeviceTable *SubscriptBaselineDropMin_adjust; int16 SuperscriptShiftUp; DeviceTable *SuperscriptShiftUp_adjust; int16 SuperscriptShiftUpCramped; DeviceTable *SuperscriptShiftUpCramped_adjust; int16 SuperscriptBottomMin; DeviceTable *SuperscriptBottomMin_adjust; int16 SuperscriptBaselineDropMax; DeviceTable *SuperscriptBaselineDropMax_adjust; int16 SubSuperscriptGapMin; DeviceTable *SubSuperscriptGapMin_adjust; int16 SuperscriptBottomMaxWithSubscript; DeviceTable *SuperscriptBottomMaxWithSubscript_adjust; int16 SpaceAfterScript; DeviceTable *SpaceAfterScript_adjust; int16 UpperLimitGapMin; DeviceTable *UpperLimitGapMin_adjust; int16 UpperLimitBaselineRiseMin; DeviceTable *UpperLimitBaselineRiseMin_adjust; int16 LowerLimitGapMin; DeviceTable *LowerLimitGapMin_adjust; int16 LowerLimitBaselineDropMin; DeviceTable *LowerLimitBaselineDropMin_adjust; int16 StackTopShiftUp; DeviceTable *StackTopShiftUp_adjust; int16 StackTopDisplayStyleShiftUp; DeviceTable *StackTopDisplayStyleShiftUp_adjust; int16 StackBottomShiftDown; DeviceTable *StackBottomShiftDown_adjust; int16 StackBottomDisplayStyleShiftDown; DeviceTable *StackBottomDisplayStyleShiftDown_adjust; int16 StackGapMin; DeviceTable *StackGapMin_adjust; int16 StackDisplayStyleGapMin; DeviceTable *StackDisplayStyleGapMin_adjust; int16 StretchStackTopShiftUp; DeviceTable *StretchStackTopShiftUp_adjust; int16 StretchStackBottomShiftDown; DeviceTable *StretchStackBottomShiftDown_adjust; int16 StretchStackGapAboveMin; DeviceTable *StretchStackGapAboveMin_adjust; int16 StretchStackGapBelowMin; DeviceTable *StretchStackGapBelowMin_adjust; int16 FractionNumeratorShiftUp; DeviceTable *FractionNumeratorShiftUp_adjust; int16 FractionNumeratorDisplayStyleShiftUp; DeviceTable *FractionNumeratorDisplayStyleShiftUp_adjust; int16 FractionDenominatorShiftDown; DeviceTable *FractionDenominatorShiftDown_adjust; int16 FractionDenominatorDisplayStyleShiftDown; DeviceTable *FractionDenominatorDisplayStyleShiftDown_adjust; int16 FractionNumeratorGapMin; DeviceTable *FractionNumeratorGapMin_adjust; int16 FractionNumeratorDisplayStyleGapMin; DeviceTable *FractionNumeratorDisplayStyleGapMin_adjust; int16 FractionRuleThickness; DeviceTable *FractionRuleThickness_adjust; int16 FractionDenominatorGapMin; DeviceTable *FractionDenominatorGapMin_adjust; int16 FractionDenominatorDisplayStyleGapMin; DeviceTable *FractionDenominatorDisplayStyleGapMin_adjust; int16 SkewedFractionHorizontalGap; DeviceTable *SkewedFractionHorizontalGap_adjust; int16 SkewedFractionVerticalGap; DeviceTable *SkewedFractionVerticalGap_adjust; int16 OverbarVerticalGap; DeviceTable *OverbarVerticalGap_adjust; int16 OverbarRuleThickness; DeviceTable *OverbarRuleThickness_adjust; int16 OverbarExtraAscender; DeviceTable *OverbarExtraAscender_adjust; int16 UnderbarVerticalGap; DeviceTable *UnderbarVerticalGap_adjust; int16 UnderbarRuleThickness; DeviceTable *UnderbarRuleThickness_adjust; int16 UnderbarExtraDescender; DeviceTable *UnderbarExtraDescender_adjust; int16 RadicalVerticalGap; DeviceTable *RadicalVerticalGap_adjust; int16 RadicalDisplayStyleVerticalGap; DeviceTable *RadicalDisplayStyleVerticalGap_adjust; int16 RadicalRuleThickness; DeviceTable *RadicalRuleThickness_adjust; int16 RadicalExtraAscender; DeviceTable *RadicalExtraAscender_adjust; int16 RadicalKernBeforeDegree; DeviceTable *RadicalKernBeforeDegree_adjust; int16 RadicalKernAfterDegree; DeviceTable *RadicalKernAfterDegree_adjust; uint16 RadicalDegreeBottomRaisePercent; /* Global constants from other subtables */ uint16 MinConnectorOverlap; /* in the math variants sub-table */ }; enum backedup_state { bs_dontknow=0, bs_not=1, bs_backedup=2 }; enum loadvalidation_state { lvs_bad_ps_fontname = 0x001, lvs_bad_glyph_table = 0x002, lvs_bad_cff_table = 0x004, lvs_bad_metrics_table = 0x008, lvs_bad_cmap_table = 0x010, lvs_bad_bitmaps_table = 0x020, lvs_bad_gx_table = 0x040, lvs_bad_ot_table = 0x080, lvs_bad_os2_version = 0x100, lvs_bad_sfnt_header = 0x200 }; typedef struct layerinfo { char *name; unsigned int background: 1; /* Layer is to be treated as background: No width, images, not worth outputting */ unsigned int order2: 1; /* Layer's data are order 2 bezier splines (truetype) rather than order 3 (postscript) */ /* In all glyphs in the font */ unsigned int ticked: 1; char * ufo_path; } LayerInfo; /* Baseline data from the 'BASE' table */ struct baselangextent { uint32 lang; /* also used for feature tag */ struct baselangextent *next; int16 ascent, descent; struct baselangextent *features; }; struct basescript { uint32 script; struct basescript *next; int def_baseline; /* index [0-baseline_cnt) */ int16 *baseline_pos; /* baseline_cnt of these */ struct baselangextent *langs; /* Language specific extents (may be NULL) */ /* The default one has the tag DEFAULT_LANG */ }; struct Base { int baseline_cnt; uint32 *baseline_tags; /* A font does not need to provide info on all baselines, but if one script */ /* talks about a baseline, then all must. So the set of baselines is global*/ struct basescript *scripts; }; 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 int winascent_add: 1; unsigned int windescent_add: 1; unsigned int hheadascent_add: 1; unsigned int hheaddescent_add: 1; unsigned int typoascent_add: 1; unsigned int typodescent_add: 1; unsigned int subsuper_set: 1; unsigned int panose_set: 1; unsigned int hheadset: 1; unsigned int vheadset: 1; unsigned int hascodepages: 1; unsigned int hasunicoderanges: 1; unsigned char pfmfamily; int16 weight; int16 width; char panose[10]; /* A subset of OS/2 fsSelection, used for style mapping. */ /* Must agree with macStyle per otspec, takes precedence. */ /* Can't use macStyle because it doesn't have a "regular" bit unlike the OS/2 component. */ int16 stylemap; int16 fstype; int16 linegap; /* from hhea */ int16 vlinegap; /* from vhea */ int16 hhead_ascent, hhead_descent; int16 os2_typoascent, os2_typodescent, os2_typolinegap; int16 os2_winascent, os2_windescent; int16 os2_subxsize, os2_subysize, os2_subxoff, os2_subyoff; int16 os2_supxsize, os2_supysize, os2_supxoff, os2_supyoff; int16 os2_strikeysize, os2_strikeypos; int16 os2_capheight, os2_xheight; char os2_vendor[4]; int16 os2_family_class; uint32 codepages[2]; uint32 unicoderanges[4]; }; struct ttf_table { uint32 tag; uint32 len, maxlen; uint8 *data; struct ttf_table *next; FILE *temp; /* Temporary storage used during generation */ }; enum texdata_type { tex_unset, tex_text, tex_math, tex_mathext }; struct texdata { enum texdata_type type; int32 params[22]; /* param[6] has different meanings in normal and math fonts */ }; struct gasp { uint16 ppem; uint16 flags; }; struct ff_glyphclasses { // This matches struct glyphclasses from featurefile.c for now. We may make the references numeric in the future. // There may be a matching entry as a class elsewhere. For now, the output driver is responsible for eliminating duplicates. // In the interest of preserving orderings, we shall output from here, checking for value overrides from kerning classes on each kerning group entry. char *classname, *glyphs; struct ff_glyphclasses *next; }; struct ff_rawoffsets { // This stores raw offsets as read from kerning.plist. // FontForge shall output these after native data and shall output only those for which it has not emitted native data. char *left; char *right; int offset; struct ff_rawoffsets *next; }; typedef struct splinefont { char *fontname, *fullname, *familyname, *weight; char *familyname_with_timestamp; char *copyright; char *filename; /* sfd name. NULL if we open a font, that's origname */ char *defbasefilename; char *version; real italicangle, upos, uwidth; /* In font info */ int ascent, descent, invalidem; // If invalidem, then we use the format-specific ascent and descent on export. int uniqueid; /* Not copied when reading in!!!! */ int glyphcnt, glyphmax; /* allocated size of glyphs array */ SplineChar **glyphs; 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 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 encodingchanged: 1; /* Font's encoding has changed since it was loaded */ 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 strokedfont: 1; unsigned int new: 1; /* A new and unsaved font */ unsigned int compacted: 1; /* only used when opening a font */ unsigned int backedup: 2; /* 0=>don't know, 1=>no, 2=>yes */ unsigned int use_typo_metrics: 1; /* The standard says to. But MS */ /* seems to feel that isn't good */ /* enough and has created a bit */ /* to mean "really use them" */ unsigned int weight_width_slope_only: 1; /* This bit seems stupid to me */ unsigned int save_to_dir: 1; /* Loaded from an sfdir collection rather than a simple sfd file */ unsigned int head_optimized_for_cleartype: 1;/* Bit in the 'head' flags field, if unset "East Asian fonts in the Windows Presentation Framework (Avalon) will not be hinted" */ unsigned int ticked: 1; unsigned int internal_temp: 1; /* Internal temporary font to be passed to freetype for rasterizing. Don't complain about oddities. Don't generate GPOS/GSUB tables, etc. */ unsigned int complained_about_spiros: 1; unsigned int use_xuid: 1; /* Adobe has deprecated these two */ unsigned int use_uniqueid: 1; /* fields. Mostly we don't want to use them */ /* 2 bits left */ struct metricsview *metrics; enum uni_interp uni_interp; NameList *for_new_glyphs; EncMap *map; /* only used when opening a font to provide original default encoding */ Layer grid; 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 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; /* Used to be restricted to ASCII, now utf8 */ char *fontlog; int tempuniqueid; int top_enc; uint16 desired_row_cnt, desired_col_cnt; struct glyphnamehash *glyphnames; struct ttf_table *ttf_tables, *ttf_tab_saved; /* We copy: fpgm, prep, cvt, maxp (into ttf_tables) user can ask for others, into saved*/ char **cvt_names; /* The end of this array is marked by a special entry: */ #define END_CVT_NAMES ((char *) (~(intpt) 0)) struct instrdata *instr_dlgs; /* Pointer to all table and character instruction dlgs in this font */ struct shortview *cvt_dlg; struct kernclasslistdlg *kcld, *vkcld; struct kernclassdlg *kcd; struct texdata texdata; OTLookup *gsub_lookups, *gpos_lookups; /* Apple morx subtables become gsub, and kern subtables become gpos */ AnchorClass *anchor; KernClass *kerns, *vkerns; 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; char *fondname; /* For use in generating mac families */ /* from the GPOS 'size' feature. design_size, etc. are measured in tenths of a point */ /* bottom is exclusive, top is inclusive */ /* if any field is 0, it is undefined. All may be undefined, All may be */ /* defined, or design_size may be defined without any of the others */ /* but we can't define the range without defining the other junk */ /* Name must contain an English language name, may contain others */ uint16 design_size; uint16 fontstyle_id; struct otfname *fontstyle_name; uint16 design_range_bottom, design_range_top; struct otffeatname *feat_names; real strokewidth; /* For GDEF Mark Attachment Class -- used in lookup flags */ /* As usual, class 0 is unused */ int mark_class_cnt; char **mark_classes; /* glyph name list */ char **mark_class_names; /* used within ff, utf8 (the name we've given to this class of marks) */ /* For GDEF Mark Attachment Sets -- used in lookup flags */ /* but here, set 0 is meaningful, since pst_usemarkfilteringset tells us */ int mark_set_cnt; char **mark_sets; /* glyph name list */ char **mark_set_names; /* used within ff, utf8 (the name we've given to this class of marks) */ struct ff_glyphclasses *groups; // This stores arbitrary named character lists for use in kerning or in the feature file. struct ff_rawoffsets *groupkerns; struct ff_rawoffsets *groupvkerns; long long creationtime; /* seconds since 1970 */ long long modificationtime; short os2_version; /* 0 means default rather than the real version 0 */ short compression; /* If we opened a compressed sfd file, then save it out compressed too */ short gasp_version; /* 0/1 currently */ short gasp_cnt; struct gasp *gasp; struct MATH *MATH; float sfd_version; /* Used only when reading in an sfd file */ struct gfi_data *fontinfo; struct val_data *valwin; #if !defined(_NO_PYTHON) void *python_temporary; #endif void *python_persistent; /* If python this will hold a python object, if not python this will hold a string containing a pickled object. We do nothing with it (if not python) except save it back out unchanged */ int python_persistent_has_lists; // This affects whether arrays exist as tuples or as lists (thus allowing us to use tuples for foreign data). enum loadvalidation_state loadvalidation_state; LayerInfo *layers; int layer_cnt; int display_layer; struct Base *horiz_base, *vert_base; Justify *justify; int extrema_bound; /* Splines do not count for extrema complaints when the distance between the endpoints is less than or equal to this */ int width_separation; int sfntRevision; #define sfntRevisionUnset 0x44445555 int woffMajor; #define woffUnset 0x4455 int woffMinor; char *woffMetadata; real ufo_ascent, ufo_descent; /* I don't know what these mean, they don't seem to correspond to any other ascent/descent pair, but retain them so round-trip ufo input/output leaves them unchanged */ /* ufo_descent is negative */ char *styleMapFamilyName; struct sfundoes *undoes; char collab_uuid[ FF_UUID_STRING_SIZE ]; int preferred_kerning; // 1 for U. F. O. native, 2 for feature file, 0 undefined. Input functions shall flag 2, I think. This is now in S. F. D. in order to round-trip U. F. O. consistently. } SplineFont; 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, ttf_flag_glyphmap=0x40, ttf_flag_TeXtable=0x80, ttf_flag_ofm=0x100, ttf_flag_oldkern=0x200, /* never set in conjunction with applemode */ ttf_flag_pfed_lookupnames=0x800, ttf_flag_pfed_guides=0x1000, ttf_flag_pfed_layers=0x2000, ttf_flag_symbol=0x4000, ttf_flag_dummyDSIG=0x8000, ttf_native_kern=0x10000, // This applies mostly to U. F. O. right now. ttf_flag_oldkernmappedonly=0x20000000 // Allow only mapped glyphs in the old-style "kern" table, required for Windows compatibility }; enum ttc_flags { ttc_flag_trymerge=0x1, ttc_flag_cff=0x2 }; enum openflags { of_fstypepermitted=1, of_askcmap=2, of_all_glyphs_in_ttc=4, of_fontlint=8, of_hidewindow=0x10, of_all_tables=0x20 }; 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, /* CFF fonts are wrapped up in some postscript sugar -- unless they are to */ /* go into a pdf file or an otf font */ ps_flag_nocffsugar = 0x1000000, /* in type42 cid fonts we sometimes want an identity map from gid to cid */ ps_flag_identitycidmap = 0x2000000, ps_flag_afmwithmarks = 0x4000000, ps_flag_noseac = 0x8000000, ps_flag_outputfontlog = 0x10000000, ps_flag_mask = (ps_flag_nohintsubs|ps_flag_noflex| ps_flag_afm|ps_flag_pfm|ps_flag_tfm|ps_flag_round) }; struct compressors { char *ext, *decomp, *recomp; }; #define COMPRESSORS_EMPTY { NULL, NULL, NULL } extern struct compressors compressors[]; enum archive_list_style { ars_tar, ars_zip }; #define ARCHIVERS_EMPTY { NULL, NULL, NULL, NULL, NULL, NULL, 0 } struct fontdict; struct pschars; struct findsel; struct charprocs; struct enc; #define chunkalloc(size) calloc(1,size) #define chunkfree(item,size) free(item) extern int SFOneWidth(SplineFont *sf); extern int CIDOneWidth(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_type42, ff_type42cid, ff_ttf, ff_ttfsym, ff_ttfmacbin, ff_ttc, ff_ttfdfont, ff_otf, ff_otfdfont, ff_otfcid, ff_otfciddfont, ff_svg, ff_ufo, ff_woff, ff_none }; struct cidbytes; struct fd2data; struct ttfinfo; struct alltabs; typedef struct growbuf { unsigned char *pt; unsigned char *base; unsigned char *end; } GrowBuf; extern void GrowBuffer(GrowBuf *gb); struct glyphdata; extern int UnitsParallel(BasePoint *u1,BasePoint *u2,int strict); extern int CvtPsStem3(struct growbuf *gb, SplineChar *scs[MmMax], int instance_count, int ishstem, int round); extern struct pschars *SplineFont2ChrsSubrs2(SplineFont *sf, int nomwid, int defwid, const int *bygid, int cnt, int flags, struct pschars **_subrs,int layer); extern struct pschars *CID2ChrsSubrs2(SplineFont *cidmaster,struct fd2data *fds, int flags, struct pschars **_glbls,int layer); enum bitmapformat { bf_bdf, bf_ttf, bf_sfnt_dfont, bf_sfnt_ms, bf_otb, bf_nfntmacbin, /*bf_nfntdfont, */bf_fon, bf_fnt, bf_palm, bf_ptype3, bf_none }; extern int32 filechecksum(FILE *file); extern int _WriteWOFFFont(FILE *ttf,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer); extern int WriteWOFFFont(char *fontname,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer); extern int _WriteTTFFont(FILE *ttf,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer); extern int WriteTTFFont(char *fontname,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer); extern int _WriteType42SFNTS(FILE *type42,SplineFont *sf,enum fontformat format, int flags,EncMap *enc,int layer); extern int WriteMacTTFFont(char *fontname,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer); extern int WriteMacFamily(char *filename,struct sflist *sfs,enum fontformat format, enum bitmapformat bf,int flags,int layer); extern int WriteTTC(const char *filename,struct sflist *sfs,enum fontformat format, enum bitmapformat bf,int flags,int layer,enum ttc_flags ttcflags); extern long mactime(void); extern void DefaultTTFEnglishNames(struct ttflangname *dummy, SplineFont *sf); extern int AlreadyMSSymbolArea(SplineFont *sf,EncMap *map); extern void OS2FigureCodePages(SplineFont *sf, uint32 CodePage[2]); extern void OS2FigureUnicodeRanges(SplineFont *sf, uint32 Ranges[4]); extern void SFDefaultOS2Info(struct pfminfo *pfminfo,SplineFont *sf,char *fontname); extern void SFDefaultOS2Simple(struct pfminfo *pfminfo,SplineFont *sf); extern void SFDefaultOS2SubSuper(struct pfminfo *pfminfo,int emsize,double italicangle); extern int ScriptIsRightToLeft(uint32 script); extern uint32 ScriptFromUnicode(uint32 u,SplineFont *sf); extern uint32 SCScriptFromUnicode(SplineChar *sc); extern int SCRightToLeft(SplineChar *sc); extern void SFMatchGlyphs(SplineFont *sf,SplineFont *target,int addempties); extern void MMMatchGlyphs(MMSet *mm); extern const char *_GetModifiers(const char *fontname, const char *familyname, const char *weight); extern const char *SFGetModifiers(const SplineFont *sf); extern int Within4RoundingErrors(bigreal v1, bigreal v2); extern int Within16RoundingErrors(bigreal v1, bigreal v2); 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 int PointsDiagonalable(SplineFont *sf,BasePoint **bp,BasePoint *unit); extern int MergeDStemInfo(SplineFont *sf,DStemInfo **ds, DStemInfo *test); 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 SplinePointsFree(SplinePointList *spl); extern void SplinePointListFree(SplinePointList *spl); extern void SplinePointListsFree(SplinePointList *head); extern void SplineSetSpirosClear(SplineSet *spl); extern void RefCharFree(RefChar *ref); extern void RefCharsFree(RefChar *ref); 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 AnchorPointsFree(AnchorPoint *ap); extern void AnchorClassesFree(AnchorClass *kp); extern void TtfTablesFree(struct ttf_table *tab); extern void ValDevFree(ValDevTab *adjust); extern void DeviceTableFree(DeviceTable *adjust); extern void PSTFree(PST *lig); struct lookup_cvt { OTLookup *from, *to; int old;}; struct sub_cvt { struct lookup_subtable *from, *to; int old;}; struct ac_cvt { AnchorClass *from, *to; int old;}; extern void TTFLangNamesFree(struct ttflangname *l); extern void AltUniFree(struct altuni *altuni); extern void AltUniFigure(SplineFont *sf,EncMap *map,int check_dups); extern void AltUniAdd(SplineChar *sc,int uni); extern void AltUniAdd_DontCheckDups(SplineChar *sc,int uni); extern void MinimumDistancesFree(MinimumDistance *md); extern void LayerDefault(Layer *); extern SplineChar *SplineCharCreate(int layer_cnt); extern SplineChar *SFSplineCharCreate(SplineFont *sf); extern RefChar *RefCharCreate(void); extern void KernClassFreeContents(KernClass *kc); extern void KernClassClearSpecialContents(KernClass *kc); extern void KernClassListFree(KernClass *kc); extern void KernClassListClearSpecialContents(KernClass *kc); extern void OTLookupFree(OTLookup *lookup); extern void OTLookupListFree(OTLookup *lookup ); extern void FPSTRuleContentsFree(struct fpst_rule *r, enum fpossub_format format); extern void FPSTClassesFree(FPST *fpst); 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 GlyphVariantsFree(struct glyphvariants *gv); extern void MathKernVContentsFree(struct mathkernvertex *mk); extern void MathKernFree(struct mathkern *mk); extern void SplineCharListsFree(struct splinecharlist *dlist); extern void LayerFreeContents(SplineChar *sc, int layer); extern void SplineCharFreeContents(SplineChar *sc); extern void SplineCharFree(SplineChar *sc); extern void EncMapFree(EncMap *map); extern EncMap *EncMapFromEncoding(SplineFont *sf,Encoding *enc); extern EncMap *EncMapNew(int encmax, int backmax, Encoding *enc); extern EncMap *EncMap1to1(int enccount); extern void ScriptLangListFree(struct scriptlanglist *sl); extern void FeatureScriptLangListFree(FeatureScriptLangList *fl); extern void SFBaseSort(SplineFont *sf); extern struct baselangextent *BaseLangCopy(struct baselangextent *extent); extern void BaseLangFree(struct baselangextent *extent); extern void BaseScriptFree(struct basescript *bs); extern void BaseFree(struct Base *base); extern void SplineFontFree(SplineFont *sf); extern void SplineFontClearSpecial(SplineFont *sf); #if 1 // These relate to experimental support for U. F. O. groups. #define GROUP_NAME_KERNING_UFO 1 #define GROUP_NAME_KERNING_FEATURE 2 #define GROUP_NAME_VERTICAL 4 // Otherwise horizontal. #define GROUP_NAME_RIGHT 8 // Otherwise left (or above). void GlyphGroupFree(struct ff_glyphclasses* group); void GlyphGroupsFree(struct ff_glyphclasses* root); void GlyphGroupKernFree(struct ff_rawoffsets* groupkern); void GlyphGroupKernsFree(struct ff_rawoffsets* root); #ifdef FF_UTHASH_GLIF_NAMES struct glif_name_index; int HashKerningClassNamesFlex(SplineFont *sf, struct glif_name_index * class_name_hash, int capitalize); int HashKerningClassNames(SplineFont *sf, struct glif_name_index * class_name_hash); int HashKerningClassNamesCaps(SplineFont *sf, struct glif_name_index * class_name_hash); #endif #endif // 1 extern void JstfLangFree(struct jstf_lang *jl); extern void JustifyFree(Justify *just); extern void OtfNameListFree(struct otfname *on); extern void OtfFeatNameListFree(struct otffeatname *fn); extern struct otffeatname *findotffeatname(uint32 tag,SplineFont *sf); extern void MarkSetFree(int cnt,char **classes,char **names); extern void MarkClassFree(int cnt,char **classes,char **names); extern void MMSetFreeContents(MMSet *mm); extern void MMSetFree(MMSet *mm); extern void MMSetClearSpecial(MMSet *mm); extern void SplineRefigure3(Spline *spline); extern void SplineRefigure(Spline *spline); extern Spline *SplineMake3(SplinePoint *from, SplinePoint *to); extern int SplinePointListIsClockwise(const SplineSet *spl); extern void SplineCharLayerFindBounds(SplineChar *sc,int layer,DBounds *bounds); extern void SplineCharFindBounds(SplineChar *sc,DBounds *bounds); extern void SplineFontLayerFindBounds(SplineFont *sf,int layer,DBounds *bounds); extern void SplineFontFindBounds(SplineFont *sf,DBounds *bounds); extern void CIDLayerFindBounds(SplineFont *sf,int layer,DBounds *bounds); extern void SplineSetQuickBounds(SplineSet *ss,DBounds *b); extern void SplineCharLayerQuickBounds(SplineChar *sc,int layer,DBounds *bounds); extern void SplineCharQuickBounds(SplineChar *sc, DBounds *b); extern void SplinePointCategorize(SplinePoint *sp); extern void SPLCategorizePoints(SplinePointList *spl); extern SplinePointList *SplinePointListCopy1(const SplinePointList *spl); extern SplinePointList *SplinePointListCopy(const SplinePointList *base); extern void BpTransform(BasePoint *to, BasePoint *from, real transform[6]); /* The order of the enum elements below doesn't make much sense, but it's done*/ /* this way to preserve binary compatibility */ enum transformPointType { tpt_OnlySelected, tpt_AllPoints, tpt_OnlySelectedInterpCPs }; /* * As SplinePointListTransform() does a few things, this is a mask to selectively be * able to disable some of them. */ enum transformPointMask { tpmask_dontFixControlPoints = 1 << 1, tpmask_operateOnSelectedBCP = 1 << 2 }; extern SplinePointList *SplinePointListTransform(SplinePointList *base, real transform[6], enum transformPointType allpoints ); extern SplinePointList *SplinePointListTransformExtended(SplinePointList *base, real transform[6], enum transformPointType tpt, enum transformPointMask tpmask ); extern HintMask *HintMaskFromTransformedRef(RefChar *ref,BasePoint *trans, SplineChar *basesc,HintMask *hm); extern SplinePointList *SPLCopyTranslatedHintMasks(SplinePointList *base, SplineChar *basesc, SplineChar *subsc, BasePoint *trans); extern SplinePointList *SPLCopyTransformedHintMasks(RefChar *r, SplineChar *basesc, BasePoint *trans,int layer); extern void RefCharFindBounds(RefChar *rf); extern void SCReinstanciateRefChar(SplineChar *sc,RefChar *rf,int layer); enum piecemeal_flags { pf_antialias=1, pf_bbsized=2, pf_ft_nohints=4, pf_ft_recontext=8 }; #define STD_BDF_PROPS_EMPTY { NULL, 0, 0 } /* 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(const Spline *s1, const Spline *s2, BasePoint pts[9], extended t1s[10], extended t2s[10]); extern int _CubicSolve(const Spline1D *sp,bigreal sought,extended ts[3]); extern int CubicSolve(const Spline1D *sp,bigreal sought,extended ts[3]); /* Uses an iterative approximation */ extern extended IterateSplineSolve(const Spline1D *sp, extended tmin, extended tmax, extended sought_y); /* Uses an iterative approximation and then tries to fix things up */ extern extended IterateSplineSolveFixup(const Spline1D *sp, extended tmin, extended tmax, extended sought_y); extern void SplineFindExtrema(const Spline1D *sp, extended *_t1, extended *_t2 ); #define CURVATURE_ERROR -1e9 extern bigreal SplineCurvature(Spline *s, bigreal t); extern double CheckExtremaForSingleBitErrors(const Spline1D *sp, double t, double othert); extern int Spline2DFindExtrema(const Spline *sp, extended extrema[4] ); extern int Spline2DFindPointsOfInflection(const Spline *sp, extended poi[2] ); extern void SplineRemoveExtremaTooClose(Spline1D *sp, extended *_t1, extended *_t2 ); extern void SCMakeDependent(SplineChar *dependent,SplineChar *base); extern SplinePoint *SplineBisect(Spline *spline, extended t); extern bigreal SplineLength(Spline *spline); extern int SplineIsLinear(Spline *spline); extern int SPInterpolate(const SplinePoint *sp); enum ae_type { ae_all, ae_between_selected, ae_only_good, ae_only_good_rm_later }; extern int SpIsExtremum(SplinePoint *sp); extern int Spline1DCantExtremeX(const Spline *s); extern int Spline1DCantExtremeY(const Spline *s); extern Spline *SplineAddExtrema(Spline *s,int always,real lenbound, real offsetbound,DBounds *b); extern SplineFont *SplineFontEmpty(void); extern void SFIncrementXUID(SplineFont *sf); extern SplineSet *SplineSetReverse(SplineSet *spl); extern void BP_HVForce(BasePoint *vector); extern void SplineCharDefaultPrevCP(SplinePoint *base); extern void SplineCharDefaultNextCP(SplinePoint *base); extern void SplineCharTangentNextCP(SplinePoint *sp); extern void SplineCharTangentPrevCP(SplinePoint *sp); /** * This is like SPAdjustControl but you have not wanting to move the * BCP at all, but you would like the current location of the passed * BCP to reshape the spline through the splinepoint. For example, if * you drag the spline between two points then you might like to touch * the inside BCP between the two splinepoints to reshape the whole * curve through a curve point. */ extern void SPTouchControl(SplinePoint *sp,BasePoint *which, int order2); extern void SPAdjustControl(SplinePoint *sp,BasePoint *cp, BasePoint *to,int order2); extern SplineSet *SSttfApprox(SplineSet *ss); extern SplineSet *SSPSApprox(SplineSet *ss); extern SplineSet *SplineSetsPSApprox(SplineSet *ss); 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 void SCConvertToOrder2(SplineChar *sc); extern void SFConvertToOrder2(SplineFont *sf); 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); extern double BlueScaleFigureForced(struct psdict *private_,real bluevalues[], real otherblues[]); extern double BlueScaleFigure(struct psdict *private_,real bluevalues[], real otherblues[]); extern void FindBlues( SplineFont *sf, int layer, real blues[14], real otherblues[10]); extern void QuickBlues(SplineFont *sf, int layer, 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 void SCGuessHintInstancesList(SplineChar *sc,int layer,StemInfo *hstem,StemInfo *vstem,DStemInfo *dstem,int hvforce,int dforce); extern real HIlen( StemInfo *stems); extern real HIoverlap( HintInstance *mhi, HintInstance *thi); extern int StemListAnyConflicts(StemInfo *stems); extern HintInstance *HICopyTrans(HintInstance *hi, real mul, real offset); typedef struct bluezone { real base; int cvtindex; real family_base; /* NaN if none */ int family_cvtindex; real overshoot; /* relative to baseline, NOT to base */ int highest; /* used in autoinstructing for HStem positioning */ int lowest; /* as above */ } BlueZone; typedef struct stdstem { real width; /* -1 if none */ int cvtindex; struct stdstem *snapto;/* NULL means stem isn't snapped to any other */ int stopat; /* at which ppem stop snapping to snapto */ } StdStem; typedef struct globalinstrct { SplineFont *sf; int layer; BlueData *bd; double fudge; /* Did we initialize the tables needed? 'maxp' is skipped because */ /* its initialization always succeeds. */ int cvt_done; int fpgm_done; int prep_done; /* PS private data with truetype-specific information added */ BlueZone blues[12]; /* like in BlueData */ int bluecnt; StdStem stdhw; StdStem *stemsnaph; /* StdHW excluded */ int stemsnaphcnt; StdStem stdvw; StdStem *stemsnapv; /* StdVW excluded */ int stemsnapvcnt; } GlobalInstrCt; extern void InitGlobalInstrCt( GlobalInstrCt *gic,SplineFont *sf,int layer, BlueData *bd ); extern void FreeGlobalInstrCt( GlobalInstrCt *gic ); extern void NowakowskiSCAutoInstr( GlobalInstrCt *gic,SplineChar *sc ); extern void SCClearHintMasks(SplineChar *sc,int layer,int counterstoo); extern void SCFigureHintMasks(SplineChar *sc,int layer); extern void _SplineCharAutoHint( SplineChar *sc, int layer, BlueData *bd, struct glyphdata *gd2, int gen_undoes ); extern void SplineCharAutoHint( SplineChar *sc,int layer, BlueData *bd); extern void SFSCAutoHint( SplineChar *sc,int layer,BlueData *bd); extern void SplineFontAutoHint( SplineFont *sf, int layer); extern void SplineFontAutoHintRefs( SplineFont *sf, int layer); extern int SplineFontIsFlexible(SplineFont *sf,int layer, int flags); extern int SCDrawsSomething(SplineChar *sc); extern int SCWorthOutputting(SplineChar *sc); extern void SFLigaturePrepare(SplineFont *sf); extern void SFLigatureCleanup(SplineFont *sf); extern void SFKernClassTempDecompose(SplineFont *sf,int isv); extern void SFKernCleanup(SplineFont *sf,int isv); typedef struct sfd_getfontmetadatadata { // these indicate if we saw some metadata or not. // perhaps the caller wants to do something special // if the metadata was present/missing. int hadtimes; int had_layer_cnt; // state that is mostly interesting to SFD_GetFontMetaData() only struct Base* last_base; struct basescript* last_base_script; OTLookup* lastpotl; OTLookup* lastsotl; KernClass* lastkc; KernClass* lastvkc; struct ff_glyphclasses* lastgroup; struct ff_rawoffsets* lastgroupkern; struct ff_rawoffsets* lastgroupvkern; FPST* lastfp; ASM* lastsm; struct ttf_table* lastttf[2]; } SFD_GetFontMetaDataData; extern void SFD_GetFontMetaDataData_Init( SFD_GetFontMetaDataData* d ); extern bool SFD_GetFontMetaData( FILE *sfd, char *tok, SplineFont *sf, SFD_GetFontMetaDataData* d ); extern const char*FindUnicharName(void); extern Encoding *_FindOrMakeEncoding(const char *name,int make_it); extern Encoding *FindOrMakeEncoding(const char *name); extern MacFeat *SFDParseMacFeatures(FILE *sfd, char *tok); extern SplineFont *SFDRead(char *filename); extern SplineFont *_SFDRead(char *filename,FILE *sfd); enum ttfflags { ttf_onlystrikes=1, ttf_onlyonestrike=2, ttf_onlykerns=4, ttf_onlynames=8 }; extern uint16 _MacStyleCode( const char *styles, SplineFont *sf, uint16 *psstyle ); extern uint16 MacStyleCode( SplineFont *sf, uint16 *psstyle ); extern int getAdobeEnc(const char *name); extern void MatMultiply(real m1[6], real m2[6], real to[6]); extern void GlyphHashFree(SplineFont *sf); extern SplineChar *SFHashName(SplineFont *sf,const char *name); extern int SFFindGID(SplineFont *sf, int unienc, const char *name ); extern int SFCIDFindCID(SplineFont *sf, int unienc, const char *name ); extern SplineChar *SFGetChar(SplineFont *sf, int unienc, const char *name ); extern int SFFindExistingSlot(SplineFont *sf, int unienc, const char *name ); extern int SFHasCID(SplineFont *sf, int cid); extern void PSCharsFree(struct pschars *chrs); extern void PSDictFree(struct psdict *chrs); extern char *PSDictHasEntry(struct psdict *dict, const char *key); extern int PSDictSame(struct psdict *dict1, struct psdict *dict2); struct cidmap; /* private structure to encoding.c */ int getushort(FILE *ttf); int32 getlong(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, const char *table_name); extern int UniFromName(const char *name,enum uni_interp interp, Encoding *encname); extern NameList *DefaultNameListForNewFonts(void); extern NameList *NameListByName(const char *name); extern int SSTtfNumberPoints(SplineSet *ss); extern int SCNumberPoints(SplineChar *sc,int layer); extern int SCPointsNumberedProperly(SplineChar *sc,int layer); int SFFigureDefWidth(SplineFont *sf, int *_nomwid); extern int ClassesMatch(int cnt1,char **classes1,int cnt2,char **classes2); extern FPST *FPSTGlyphToClass(FPST *fpst); extern ASM *ASMFromOpenTypeForms(SplineFont *sf,uint32 script); extern ASM *ASMFromFPST(SplineFont *sf,FPST *fpst,int ordered); extern char *utf8_verify_copy(const char *str); extern char *Utf8ToMacStr(const char *ustr,int macenc,int maclang); extern uint8 MacEncFromMacLang(int maclang); extern uint16 WinLangToMac(int winlang); extern MacFeat *FindMacFeature(SplineFont *sf, int feat,MacFeat **secondary); extern struct macsetting *FindMacSetting(SplineFont *sf, int feat, int set,struct macsetting **secondary); extern int32 UniFromEnc(int enc, Encoding *encname); extern int32 EncFromUni(int32 uni, Encoding *encname); /* Colinear & between */ enum psstrokeflags { /* sf_removeoverlap=2,*/ sf_handle_eraser=4, sf_correctdir=8, sf_clearbeforeinput=16 }; extern int MMValid(MMSet *mm,int complain); enum Compare_Ret { SS_DiffContourCount = 1, SS_MismatchOpenClosed = 2, SS_DisorderedContours = 4, SS_DisorderedStart = 8, SS_DisorderedDirection = 16, SS_PointsMatch = 32, SS_ContourMatch = 64, SS_NoMatch = 128, SS_RefMismatch = 256, SS_WidthMismatch = 512, SS_VWidthMismatch = 1024, SS_HintMismatch = 2048, SS_HintMaskMismatch = 4096, SS_LayerCntMismatch = 8192, SS_ContourMismatch = 16384, SS_UnlinkRefMatch = 32768, BC_DepthMismatch = 1<<16, BC_BoundingBoxMismatch = 2<<16, BC_BitmapMismatch = 4<<16, BC_NoMatch = 8<<16, BC_Match = 16<<16, SS_RefPtMismatch = 32<<16 }; enum font_compare_flags { fcf_outlines=1, fcf_exact=2, fcf_warn_not_exact=4, fcf_hinting=8, fcf_hintmasks=0x10, fcf_hmonlywithconflicts=0x20, fcf_warn_not_ref_exact=0x40, fcf_bitmaps=0x80, fcf_names = 0x100, fcf_gpos=0x200, fcf_gsub=0x400, fcf_adddiff2sf1=0x800, fcf_addmissing=0x1000 }; # 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 extern void SFTimesFromFile(SplineFont *sf,FILE *); extern int SFHasInstructions(SplineFont *sf); extern int RefDepth(RefChar *ref,int layer); extern uint32 *SFScriptsInLookups(SplineFont *sf,int gpos); extern uint32 *SFLangsInScript(SplineFont *sf,int gpos,uint32 script); extern uint32 *SFFeaturesInScriptLang(SplineFont *sf,int gpos,uint32 script,uint32 lang); extern OTLookup **SFLookupsInScriptLangFeature(SplineFont *sf,int gpos,uint32 script,uint32 lang, uint32 feature); extern SplineChar **SFGlyphsWithPSTinSubtable(SplineFont *sf,struct lookup_subtable *subtable); extern void SFFindUnusedLookups(SplineFont *sf); extern struct lookup_subtable *SFFindLookupSubtable(SplineFont *sf,char *name); extern struct lookup_subtable *SFFindLookupSubtableAndFreeName(SplineFont *sf,char *name); extern OTLookup *SFFindLookup(SplineFont *sf,char *name); struct scriptlanglist *SLCopy(struct scriptlanglist *sl); struct scriptlanglist *SListCopy(struct scriptlanglist *sl); extern FeatureScriptLangList *FeatureListCopy(FeatureScriptLangList *fl); extern int DefaultLangTagInOneScriptList(struct scriptlanglist *sl); extern RefChar *HasUseMyMetrics(SplineChar *sc,int layer); extern EncMap *EncMapFromEncoding(SplineFont *sf,Encoding *enc); extern void InitSimpleStuff(void); extern struct math_constants_descriptor { char *script_name; int offset; int devtab_offset; } math_constants_descriptor[]; #define MATH_CONSTANTS_DESCRIPTOR_EMPTY { NULL, 0, 0} extern const char *knownweights[], *realweights[], **noticeweights[]; struct lang_frequencies; extern struct gradient *GradientCopy(struct gradient *old,real transform[6]); extern void GradientFree(struct gradient *grad); extern struct pattern *PatternCopy(struct pattern *old,real transform[6]); extern void PatternFree(struct pattern *pat); extern void BrushCopy(struct brush *into, struct brush *from,real transform[6]); extern void PenCopy(struct pen *into, struct pen *from,real transform[6]); extern bigreal SFCapHeight(SplineFont *sf, int layer, int return_error); extern bigreal SFXHeight(SplineFont *sf, int layer, int return_error); /** * Visitor for SPLFirstVisitSplines() */ typedef void (*SPLFirstVisitSplinesVisitor)( SplinePoint* splfirst, Spline* s, void* udata ); /** * Visitor Function: print debug information about each spline */ /** * Given a SplinePointList* that you want to visit each spline in the * iteration is not as simple as it could be, so you can call this * function passing spl->first as 'splfirst' and a visitor function * which will see each spline in the splfirst colleciton. * * For debug, you can pass SPLFirstVisitorDebug which will print * information for each item in the splfirst collection. * * You can pass any arbitrary data in as udata and SPLFirstVisit() * will pass that udata to your visitor function without change. If * you want a return value from your visitor, pass a pointer to a * struct as udata. eg: * * typedef struct SPLFirstVisitorFoundSoughtDataS * { * SplinePoint* sought; * int found; * } SPLFirstVisitorFoundSoughtData; * * // ... * * SPLFirstVisitorFoundSoughtData d; * d.sought = sought; * d.found = 0; * SPLFirstVisit( spl->first, SPLFirstVisitorFoundSought, &d ); * if( d.found ) * return 1; * */ extern void SPLFirstVisitSplines( SplinePoint* splfirst, SPLFirstVisitSplinesVisitor f, void* udata ); /** * Visitor for SPLFirstVisitPoints() */ typedef void (*SPLFirstVisitPointsVisitor)( SplinePoint* splfirst, Spline* s, SplinePoint* sp, void* udata ); /** * Applies a visitor to the container and returns false if no point in the SPL * has an x coordinate of 'x'. */ extern SplinePoint* SplinePointListContainsPointAtX( SplinePointList* container, real x ); /** * It is like a == b, but also true if a is within * tolerence of b. */ extern bool equalWithTolerence( real a, real b, real tolerence ); // The following functions are in splineutil.c at present. char * upper_case(const char * input); #include "ustring.h" #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/stemdb.h0000664000175000017500000002071713510660062016035 00000000000000/* Copyright (C) 2005-2012 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 _STEMDB_H_ # define _STEMDB_H_ # include "fontforge.h" struct segment { double start, end, sbase, ebase; int curved, scurved, ecurved; }; typedef struct glyphdata { SplineFont *sf; BlueData bd; int fuzz; SplineChar *sc; int layer; int emsize; int order2; int has_slant; BasePoint slant_unit; int ccnt; int *contourends; int realcnt; /* Includes control points, excludes implied points */ int norefpcnt; /* Does not include points in glyphs with references */ int pcnt; /* Includes control points, includes implied points */ struct pointdata *points; /* Entries corresponding to control points are empty */ int stemcnt; struct stemdata *stems; int linecnt; struct linedata *lines; struct stembundle *hbundle; struct stembundle *vbundle; struct stembundle *ibundle; /* Temporary values, quickly freed */ int mcnt; struct monotonic *ms; struct monotonic **space; int scnt; Spline **sspace; struct st *stspace; DBounds size; struct pointdata **pspace; struct segment *lspace, *rspace, *bothspace, *activespace; int only_hv; } GlyphData; typedef struct pointdata { SplinePoint *sp; SplineSet *ss; int ttfindex; /* normally same as sp->ttfindex, but needed for offcurve points */ BasePoint base; /* normally same as sp->me, but needed for offcurve points */ BasePoint nextunit, prevunit; /* unit vectors pointing in the next/prev directions */ struct linedata *nextline, *prevline; /* any other points lying on approximately the same line */ Spline *nextedges[2], *prevedges[2]; /* There should always be a matching spline, which may end up as part of a stem, and may not */ Spline *bothedge; double next_e_t[2], prev_e_t[2]; /* Location on other edge where our normal hits it */ double both_e_t; int next_e_cnt, prev_e_cnt; double next_dist[2], prev_dist[2]; /* Distance from the point to the matching edge */ struct stemdata **nextstems, **prevstems; int *next_is_l, *prev_is_l; int nextcnt, prevcnt; double nextlen, prevlen; int value; /* Temporary value, used to compare points assigned to the same edge and determine which one can be used as a reference point*/ unsigned int nextlinear: 1; unsigned int nextzero: 1; unsigned int prevlinear: 1; unsigned int prevzero: 1; unsigned int colinear: 1; unsigned int symetrical_h: 1; /* Are next & prev symetrical? */ unsigned int symetrical_v: 1; /* Are next & prev symetrical? */ unsigned int next_hor: 1; unsigned int next_ver: 1; unsigned int prev_hor: 1; unsigned int prev_ver: 1; unsigned int ticked: 1; uint8 touched, affected; uint8 x_extr, y_extr; uint8 x_corner, y_corner; BasePoint newpos; BasePoint newnext, newprev; BasePoint posdir; /* If point has been positioned in 1 direction, this is that direction */ double projection; /* temporary value */ } PointData; typedef struct linedata { BasePoint unit; BasePoint online; uint8 is_left; int pcnt; double length; struct pointdata **points; } LineData; struct stem_chunk { struct stemdata *parent; struct pointdata *l; struct pointdata *r; uint8 lpotential, rpotential; uint8 lnext, rnext; /* are we using the next/prev side of the left/right points */ uint8 ltick, rtick; uint8 stub; uint8 stemcheat; /* It's not a real stem, but it's something we'd like PostScript to hint for us */ uint8 is_ball; /* Specifies if this chunk marks the opposite sides of a ball terminal (useful for TTF instructions) */ struct stemdata *ball_m; int l_e_idx, r_e_idx; /* Which of the opposed edges assigned to the left and right points corresponds to this chunk */ }; struct dependent_stem { struct stemdata *stem; uint8 lbase; char dep_type; /* can be 'a' (align), 'i' (interpolate), 'm' (move) or 's' (serif) */ }; struct dependent_serif { struct stemdata *stem; double width; /* The distance from an edge of the main stem to the opposite edge of the serif stem */ uint8 lbase; uint8 is_ball; }; typedef struct stemdata { BasePoint unit; /* Unit vector pointing in direction of stem */ BasePoint l_to_r; /* Unit vector pointing from left to right (across stem) */ BasePoint left; /* a point on one side of the stem (not necissarily left, even for vertical stems) */ BasePoint right; /* and one on the other */ BasePoint newunit; /* Unit vector after repositioning (e. g. in Metafont routines) */ BasePoint newleft, newright;/* Left and right edges after repositioning */ int leftidx, rightidx; /* TTF indices of the left and right key points */ struct pointdata *keypts[4];/* Uppest and lowest points on left and right edges. Used for positioning diagonal stems */ double lmin, lmax, rmin, rmax; double width; int chunk_cnt; /* number of separate point-pairs on this stem */ struct stem_chunk *chunks; int activecnt; struct segment *active; uint8 toobig; /* Stem is fatter than tall, unlikely to be a real stem */ uint8 positioned; uint8 ticked; uint8 ghost; uint8 bbox; uint8 ldone, rdone; uint8 italic; int blue; /* Blue zone a ghost hint is attached to */ double len, clen; /* Length of linear segments. clen adds "length" of curved bits */ struct stembundle *bundle; int lpcnt, rpcnt; /* Count of points assigned to left and right edges of this stem */ struct linedata *leftline, *rightline; struct stemdata *master, *next_c_m, *prev_c_m; int confl_cnt; int dep_cnt; int serif_cnt; struct dependent_stem *dependent; /* Lists other stems dependent from the given stem */ struct dependent_serif *serifs; /* Lists serifs and other elements protruding from the base stem */ } StemData; typedef struct vchunk { struct stem_chunk *chunk; double dist; int parallel; int value; } VChunk; struct stembounds { struct stembounds *next; struct stemdata *stem; double tstart, tend; uint8 isr; }; typedef struct stembundle { BasePoint unit; /* All these stems are parallel, pointing in unit direction */ BasePoint l_to_r; /* Axis along which these stems are ordered (normal to unit) */ BasePoint bp; /* Base point for measuring by l_to_r (stem->lpos,rpos) */ int cnt; /* Number of stems in the bundle */ struct stemdata **stemlist; } StemBundle; extern struct glyphdata *GlyphDataBuild(SplineChar *sc, int layer, BlueData *bd, int use_existing); extern struct glyphdata *GlyphDataInit(SplineChar *sc, int layer, double em_size, int only_hv); extern struct glyphdata *StemInfoToStemData( struct glyphdata *gd,StemInfo *si,int is_v ); extern struct glyphdata *DStemInfoToStemData( struct glyphdata *gd,DStemInfo *dsi ); extern int IsStemAssignedToPoint( struct pointdata *pd,struct stemdata *stem,int is_next ); extern void GlyphDataFree(struct glyphdata *gd); #endif /* _STEMDB_H_ */ dvisvgm-2.8.1/libs/ff-woff/fontforge/lookups.c0000664000175000017500000005155513510660062016252 00000000000000/* -*- coding: utf-8 -*- */ /* Copyright (C) 2007-2012 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 "fontforgevw.h" static int uint32_cmp(const void *_ui1, const void *_ui2) { if ( *(uint32 *) _ui1 > *(uint32 *)_ui2 ) return( 1 ); if ( *(uint32 *) _ui1 < *(uint32 *)_ui2 ) return( -1 ); return( 0 ); } static int lang_cmp(const void *_ui1, const void *_ui2) { /* The default language is magic, and should come first in the list even */ /* if that is not true alphabetical order */ if ( *(uint32 *) _ui1 == DEFAULT_LANG ) return( -1 ); if ( *(uint32 *) _ui2 == DEFAULT_LANG ) return( 1 ); if ( *(uint32 *) _ui1 > *(uint32 *)_ui2 ) return( 1 ); if ( *(uint32 *) _ui1 < *(uint32 *)_ui2 ) return( -1 ); return( 0 ); } uint32 *SFScriptsInLookups(SplineFont *sf,int gpos) { /* Presumes that either SFFindUnusedLookups or SFFindClearUnusedLookupBits */ /* has been called first */ /* Since MS will sometimes ignore a script if it isn't found in both */ /* GPOS and GSUB we want to return the same script list no matter */ /* what the setting of gpos ... so we totally ignore that argument */ /* and always look at both sets of lookups */ /* Sergey Malkin from MicroSoft tells me: Each shaping engine in Uniscribe can decide on its requirements for layout tables - some of them require both GSUB and GPOS, in some cases any table present is enough, or it can work without any table. Sometimes, purpose of the check is to determine if font is supporting particular script - if required tables are not there font is just rejected by this shaping engine. Sometimes, shaping engine can not just reject the font because there are fonts using older shaping technologies we still have to support, so it uses some logic when to fallback to legacy layout code. In your case this is Hebrew, where both tables are required to use OpenType processing. Arabic requires both tables too, Latin requires GSUB to execute GPOS. But in general, if you have both tables you should be safe with any script to get fully featured OpenType shaping. In other words, if we have a Hebrew font with just GPOS features they won't work, and MS will not use the font at all. We must add a GSUB table. In the unlikely event that we had a hebrew font with only GSUB it would not work either. So if we want our lookups to have a chance of executing under Uniscribe we better make sure that both tables have the same script set. (Sergey says we could optimize a little: A Latin GSUB table will run without a GPOS, but he says the GPOS won't work without a GSUB.) */ int cnt=0, tot=0, i; uint32 *scripts = NULL; OTLookup *test; FeatureScriptLangList *fl; struct scriptlanglist *sl; /* So here always give scripts for both (see comment above) no */ /* matter what they asked for */ for ( gpos=0; gpos<2; ++gpos ) { for ( test = gpos ? sf->gpos_lookups : sf->gsub_lookups; test!=NULL; test = test->next ) { if ( test->unused ) continue; for ( fl=test->features; fl!=NULL; fl=fl->next ) { if ( fl->ismac ) continue; for ( sl=fl->scripts ; sl!=NULL; sl=sl->next ) { for ( i=0; iscript==scripts[i] ) break; } if ( i==cnt ) { if ( cnt>=tot ) scripts = realloc(scripts,(tot+=10)*sizeof(uint32)); scripts[cnt++] = sl->script; } } } } } if ( cnt==0 ) return( NULL ); /* We want our scripts in alphabetic order */ qsort(scripts,cnt,sizeof(uint32),uint32_cmp); /* add a 0 entry to mark the end of the list */ if ( cnt>=tot ) scripts = realloc(scripts,(tot+1)*sizeof(uint32)); scripts[cnt] = 0; return( scripts ); } uint32 *SFLangsInScript(SplineFont *sf,int gpos,uint32 script) { /* However, the language lists (I think) are distinct */ /* But giving a value of -1 for gpos will give us the set of languages in */ /* both tables (for this script) */ int cnt=0, tot=0, i, g, l; uint32 *langs = NULL; OTLookup *test; FeatureScriptLangList *fl; struct scriptlanglist *sl; for ( g=0; g<2; ++g ) { if (( gpos==0 && g==1 ) || ( gpos==1 && g==0 )) continue; for ( test = g ? sf->gpos_lookups : sf->gsub_lookups; test!=NULL; test = test->next ) { if ( test->unused ) continue; for ( fl=test->features; fl!=NULL; fl=fl->next ) { for ( sl=fl->scripts ; sl!=NULL; sl=sl->next ) { if ( sl->script==script ) { for ( l=0; llang_cnt; ++l ) { uint32 lang; if ( llangs[l]; else lang = sl->morelangs[l-MAX_LANG]; for ( i=0; i=tot ) langs = realloc(langs,(tot+=10)*sizeof(uint32)); langs[cnt++] = lang; } } } } } } } if ( cnt==0 ) { /* We add dummy script entries. Because Uniscribe will refuse to */ /* process some scripts if they don't have an entry in both GPOS */ /* an GSUB. So if a script appears in either table, force it to */ /* appear in both. That means we can get scripts with no lookups */ /* and hence no languages. It seems that Uniscribe doesn't like */ /* that either. So give each such script a dummy default language */ /* entry. This is what VOLT does */ langs = calloc(2,sizeof(uint32)); langs[0] = DEFAULT_LANG; return( langs ); } /* We want our languages in alphabetic order */ qsort(langs,cnt,sizeof(uint32),lang_cmp); /* add a 0 entry to mark the end of the list */ if ( cnt>=tot ) langs = realloc(langs,(tot+1)*sizeof(uint32)); langs[cnt] = 0; return( langs ); } uint32 *SFFeaturesInScriptLang(SplineFont *sf,int gpos,uint32 script,uint32 lang) { int cnt=0, tot=0, i, l, isg; uint32 *features = NULL; OTLookup *test; FeatureScriptLangList *fl; struct scriptlanglist *sl; /* gpos==0 => GSUB, gpos==1 => GPOS, gpos==-1 => both, gpos==-2 => Both & morx & kern */ if ( sf->cidmaster ) sf=sf->cidmaster; for ( isg = 0; isg<2; ++isg ) { if ( gpos>=0 && isg!=gpos ) continue; for ( test = isg ? sf->gpos_lookups : sf->gsub_lookups; test!=NULL; test = test->next ) { if ( test->unused ) continue; for ( fl=test->features; fl!=NULL; fl=fl->next ) { if ( fl->ismac && gpos!=-2 ) continue; if ( script==0xffffffff ) { for ( i=0; ifeaturetag==features[i] ) break; } if ( i==cnt ) { if ( cnt>=tot ) features = realloc(features,(tot+=10)*sizeof(uint32)); features[cnt++] = fl->featuretag; } } else for ( sl=fl->scripts ; sl!=NULL; sl=sl->next ) { if ( sl->script==script ) { int matched = false; if ( fl->ismac && gpos==-2 ) matched = true; else for ( l=0; llang_cnt; ++l ) { uint32 testlang; if ( llangs[l]; else testlang = sl->morelangs[l-MAX_LANG]; if ( testlang==lang ) { matched = true; break; } } if ( matched ) { for ( i=0; ifeaturetag==features[i] ) break; } if ( i==cnt ) { if ( cnt>=tot ) features = realloc(features,(tot+=10)*sizeof(uint32)); features[cnt++] = fl->featuretag; } } } } } } } if ( sf->design_size!=0 && gpos ) { /* The 'size' feature is like no other. It has no lookups and so */ /* we will never find it in the normal course of events. If the */ /* user has specified a design size, then every script/lang combo */ /* gets a 'size' feature which contains no lookups but feature */ /* params */ if ( cnt>=tot ) features = realloc(features,(tot+=2)*sizeof(uint32)); features[cnt++] = CHR('s','i','z','e'); } if ( cnt==0 ) return( calloc(1,sizeof(uint32)) ); /* We don't care if our features are in alphabetical order here */ /* all that matters is whether the complete list of features is */ /* ordering here would be irrelevant */ /* qsort(features,cnt,sizeof(uint32),uint32_cmp); */ /* add a 0 entry to mark the end of the list */ if ( cnt>=tot ) features = realloc(features,(tot+1)*sizeof(uint32)); features[cnt] = 0; return( features ); } OTLookup **SFLookupsInScriptLangFeature(SplineFont *sf,int gpos,uint32 script,uint32 lang, uint32 feature) { int cnt=0, tot=0, l; OTLookup **lookups = NULL; OTLookup *test; FeatureScriptLangList *fl; struct scriptlanglist *sl; for ( test = gpos ? sf->gpos_lookups : sf->gsub_lookups; test!=NULL; test = test->next ) { if ( test->unused ) continue; for ( fl=test->features; fl!=NULL; fl=fl->next ) { if ( fl->featuretag==feature ) { for ( sl=fl->scripts ; sl!=NULL; sl=sl->next ) { if ( sl->script==script ) { for ( l=0; llang_cnt; ++l ) { uint32 testlang; if ( llangs[l]; else testlang = sl->morelangs[l-MAX_LANG]; if ( testlang==lang ) { if ( cnt>=tot ) lookups = realloc(lookups,(tot+=10)*sizeof(OTLookup *)); lookups[cnt++] = test; goto found; } } } } } } found:; } if ( cnt==0 ) return( NULL ); /* lookup order is irrelevant here. might as well leave it in invocation order */ /* add a 0 entry to mark the end of the list */ if ( cnt>=tot ) lookups = realloc(lookups,(tot+1)*sizeof(OTLookup *)); lookups[cnt] = 0; return( lookups ); } static int LigaturesFirstComponentGID(SplineFont *sf,char *components) { int gid, ch; char *pt; for ( pt = components; *pt!='\0' && *pt!=' '; ++pt ); ch = *pt; *pt = '\0'; gid = SFFindExistingSlot(sf,-1,components); *pt = ch; return( gid ); } static int PSTValid(SplineFont *sf,PST *pst) { char *start, *pt, ch; int ret; switch ( pst->type ) { case pst_position: return( true ); case pst_pair: return( SCWorthOutputting(SFGetChar(sf,-1,pst->u.pair.paired)) ); case pst_substitution: case pst_alternate: case pst_multiple: case pst_ligature: for ( start = pst->u.mult.components; *start ; ) { for ( pt=start; *pt && *pt!=' '; ++pt ); ch = *pt; *pt = '\0'; ret = SCWorthOutputting(SFGetChar(sf,-1,start)); if ( !ret ) { LogError(_("Lookup subtable contains unused glyph %s making the whole subtable invalid"), start); *pt = ch; return( false ); } *pt = ch; if ( ch==0 ) start = pt; else start = pt+1; } default: break; } return( true ); } SplineChar **SFGlyphsWithPSTinSubtable(SplineFont *sf,struct lookup_subtable *subtable) { uint8 *used = calloc(sf->glyphcnt,sizeof(uint8)); SplineChar **glyphs, *sc; int i, k, gid, cnt; KernPair *kp; PST *pst; int ispair = subtable->lookup->lookup_type == gpos_pair; int isliga = subtable->lookup->lookup_type == gsub_ligature; for ( i=0; iglyphcnt; ++i ) if ( SCWorthOutputting(sc = sf->glyphs[i]) ) { if ( ispair ) { for ( k=0; k<2; ++k ) { for ( kp= k ? sc->kerns : sc->vkerns; kp!=NULL ; kp=kp->next ) { if ( !SCWorthOutputting(kp->sc)) continue; if ( kp->subtable == subtable ) { used[i] = true; goto continue_; } } } } for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable == subtable && PSTValid(sf,pst)) { if ( !isliga ) { used[i] = true; goto continue_; } else { gid = LigaturesFirstComponentGID(sf,pst->u.lig.components); pst->u.lig.lig = sc; if ( gid!=-1 ) used[gid] = true; /* can't continue here. ffi might be "f+f+i" and "ff+i" */ /* and we need to mark both "f" and "ff" as used */ } } } continue_: ; } for ( i=cnt=0 ; iglyphcnt; ++i ) if ( used[i] ) ++cnt; if ( cnt==0 ) { free(used); return( NULL ); } glyphs = malloc((cnt+1)*sizeof(SplineChar *)); for ( i=cnt=0 ; iglyphcnt; ++i ) { if ( used[i] ) glyphs[cnt++] = sf->glyphs[i]; } glyphs[cnt] = NULL; free(used); return( glyphs ); } static void TickLookupKids(OTLookup *otl) { struct lookup_subtable *sub; int i,j; for ( sub=otl->subtables; sub!=NULL; sub=sub->next ) { if ( sub->fpst!=NULL ) { for ( i=0; ifpst->rule_cnt; ++i ) { struct fpst_rule *rule = &sub->fpst->rules[i]; for ( j=0; jlookup_cnt; ++j ) { if ( rule->lookups[j].lookup!=NULL ) rule->lookups[j].lookup->in_gpos = true; } } } } } void SFFindUnusedLookups(SplineFont *sf) { OTLookup *test; struct lookup_subtable *sub; int gpos; AnchorClass *ac; AnchorPoint *ap; SplineChar *sc; KernPair *kp; PST *pst; int i,k,gid,isv; SplineFont *_sf = sf; Justify *jscripts; struct jstf_lang *jlangs; if ( _sf->cidmaster ) _sf = _sf->cidmaster; /* Some things are obvious. If a subtable consists of a kernclass or some */ /* such, then obviously it is used. But more distributed info takes more */ /* work. So mark anything easy as used, and anything difficult as unused */ /* We'll work on the difficult things later */ for ( gpos=0; gpos<2; ++gpos ) { for ( test = gpos ? _sf->gpos_lookups : _sf->gsub_lookups; test!=NULL; test = test->next ) { for ( sub = test->subtables; sub!=NULL; sub=sub->next ) { if ( sub->kc!=NULL || sub->fpst!=NULL || sub->sm!=NULL ) { sub->unused = false; continue; } sub->unused = true; /* We'll turn the following bit back on if there turns out */ /* to be an anchor class attached to it -- that is subtly */ /* different than being unused -- unused will be set if all */ /* acs are unused, this bit will be on if there are unused */ /* classes that still refer to us. */ sub->anchor_classes = false; } } } /* To be useful an anchor class must have both at least one base and one mark */ /* (for cursive anchors that means at least one entry and at least one exit) */ /* Start by assuming the worst */ for ( ac = _sf->anchor; ac!=NULL; ac=ac->next ) ac->has_mark = ac->has_base = false; /* Ok, for each glyph, look at all lookups (or anchor classes) it affects */ /* and mark the appropriate parts of them as used */ k = 0; do { sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k]; for ( gid=0; gidglyphcnt; ++gid ) if ( SCWorthOutputting(sc = sf->glyphs[gid]) ) { for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) { switch ( ap->type ) { case at_mark: case at_centry: ap->anchor->has_mark = true; break; case at_basechar: case at_baselig: case at_basemark: case at_cexit: ap->anchor->has_base = true; break; default: break; } } for ( isv=0; isv<2; ++isv ) { for ( kp= isv ? sc->kerns : sc->vkerns ; kp!=NULL; kp=kp->next ) { if ( SCWorthOutputting(kp->sc)) kp->subtable->unused = false; } } for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable==NULL ) continue; if ( !PSTValid(sf,pst)) continue; pst->subtable->unused = false; } } ++k; } while ( k<_sf->subfontcnt ); /* Finally for any anchor class that has both a mark and a base then it is */ /* used, and its lookup is also used */ /* Also, even if unused, as long as the anchor class exists we must keep */ /* the subtable around */ for ( ac = _sf->anchor; ac!=NULL; ac=ac->next ) { if ( ac->subtable==NULL ) continue; ac->subtable->anchor_classes = true; if ( ac->has_mark && ac->has_base ) ac->subtable->unused = false; } /* Now for each lookup, a lookup is unused if ALL subtables are unused */ for ( gpos=0; gpos<2; ++gpos ) { for ( test = gpos ? _sf->gpos_lookups : _sf->gsub_lookups; test!=NULL; test = test->next ) { test->unused = test->empty = true; for ( sub=test->subtables; sub!=NULL; sub=sub->next ) { if ( !sub->unused ) test->unused = false; if ( !sub->unused && !sub->anchor_classes ) { test->empty = false; break; } } } } /* I store JSTF max lookups in the gpos list because they have the same */ /* format. But now I need to tease them out and learn which lookups are */ /* used in GPOS and which in JSTF (and conceivably which get duplicated */ /* and placed in both) */ for ( test = sf->gpos_lookups; test!=NULL; test = test->next ) { test->only_jstf = test->in_jstf = test->in_gpos = false; if ( test->features!=NULL ) test->in_gpos = true; } for ( jscripts = sf->justify; jscripts!=NULL; jscripts=jscripts->next ) { for ( jlangs=jscripts->langs; jlangs!=NULL; jlangs=jlangs->next ) { for ( i=0; icnt; ++i ) { struct jstf_prio *prio = &jlangs->prios[i]; if ( prio->enableShrink!=NULL ) for ( k=0; prio->enableShrink[k]!=NULL; ++k ) prio->enableShrink[k]->in_gpos = true; if ( prio->disableShrink!=NULL ) for ( k=0; prio->disableShrink[k]!=NULL; ++k ) prio->disableShrink[k]->in_gpos = true; if ( prio->enableExtend!=NULL ) for ( k=0; prio->enableExtend[k]!=NULL; ++k ) prio->enableExtend[k]->in_gpos = true; if ( prio->disableExtend!=NULL ) for ( k=0; prio->disableExtend[k]!=NULL; ++k ) prio->disableExtend[k]->in_gpos = true; if ( prio->maxShrink!=NULL ) for ( k=0; prio->maxShrink[k]!=NULL; ++k ) prio->maxShrink[k]->in_jstf = true; if ( prio->maxExtend!=NULL ) for ( k=0; prio->maxExtend[k]!=NULL; ++k ) prio->maxExtend[k]->in_jstf = true; } } } for ( test = sf->gpos_lookups; test!=NULL; test = test->next ) { if ( test->in_gpos && (test->lookup_type==gpos_context || test->lookup_type==gpos_contextchain)) TickLookupKids(test); } for ( test = sf->gpos_lookups; test!=NULL; test = test->next ) test->only_jstf = test->in_jstf && !test->in_gpos; } struct lookup_subtable *SFFindLookupSubtable(SplineFont *sf,char *name) { int isgpos; OTLookup *otl; struct lookup_subtable *sub; if ( sf->cidmaster ) sf = sf->cidmaster; if ( name==NULL ) return( NULL ); for ( isgpos=0; isgpos<2; ++isgpos ) { for ( otl = isgpos ? sf->gpos_lookups : sf->gsub_lookups ; otl!=NULL; otl=otl->next ) { for ( sub = otl->subtables; sub!=NULL; sub=sub->next ) { if ( strcmp(name,sub->subtable_name)==0 ) return( sub ); } } } return( NULL ); } struct lookup_subtable *SFFindLookupSubtableAndFreeName(SplineFont *sf,char *name) { struct lookup_subtable *sub = SFFindLookupSubtable(sf,name); free(name); return( sub ); } OTLookup *SFFindLookup(SplineFont *sf,char *name) { int isgpos; OTLookup *otl; if ( sf->cidmaster ) sf = sf->cidmaster; if ( name==NULL ) return( NULL ); for ( isgpos=0; isgpos<2; ++isgpos ) { for ( otl = isgpos ? sf->gpos_lookups : sf->gsub_lookups ; otl!=NULL; otl=otl->next ) { if ( strcmp(name,otl->lookup_name)==0 ) return( otl ); } } return( NULL ); } struct scriptlanglist *SLCopy(struct scriptlanglist *sl) { struct scriptlanglist *newsl; newsl = chunkalloc(sizeof(struct scriptlanglist)); *newsl = *sl; newsl->next = NULL; if ( sl->lang_cnt>MAX_LANG ) { newsl->morelangs = malloc((newsl->lang_cnt-MAX_LANG)*sizeof(uint32)); memcpy(newsl->morelangs,sl->morelangs,(newsl->lang_cnt-MAX_LANG)*sizeof(uint32)); } return( newsl ); } struct scriptlanglist *SListCopy(struct scriptlanglist *sl) { struct scriptlanglist *head=NULL, *last=NULL, *cur; for ( ; sl!=NULL; sl=sl->next ) { cur = SLCopy(sl); if ( head==NULL ) head = cur; else last->next = cur; last = cur; } return( head ); } FeatureScriptLangList *FeatureListCopy(FeatureScriptLangList *fl) { FeatureScriptLangList *newfl; if ( fl==NULL ) return( NULL ); newfl = chunkalloc(sizeof(FeatureScriptLangList)); *newfl = *fl; newfl->next = NULL; newfl->scripts = SListCopy(fl->scripts); return( newfl ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/cjk.c0000664000175000017500000372675713510660062015345 00000000000000#include const unichar_t unicode_from_jis208[] = { 0x2003, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e, 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd, 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0xff3c, 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x0000, 0x0000, 0x0000, 0x0000, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b, 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7, 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04, 0xffe0, 0xffe1, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2227, 0x2228, 0xffe2, 0x21d2, 0x21d4, 0x2200, 0x2203, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, 0x00b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x25ef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6, 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed, 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b, 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f, 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d, 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937, 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905, 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e, 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df, 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32, 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0, 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d, 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf, 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893, 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5, 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2, 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3, 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834, 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5, 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712, 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf, 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276, 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a, 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc, 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956, 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b, 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069, 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d, 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6, 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b, 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304, 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6, 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b, 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb, 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a, 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539, 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75, 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916, 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb, 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3, 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1, 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a, 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66, 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f, 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b, 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6, 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc, 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431, 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2, 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c, 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be, 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57, 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff, 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e, 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2, 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc, 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811, 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa, 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee, 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4, 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63, 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc, 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993, 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947, 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409, 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd, 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7, 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d, 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08, 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8, 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac, 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354, 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a, 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2, 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1, 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d, 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4, 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981, 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39, 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a, 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2, 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047, 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48, 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688, 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab, 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2, 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951, 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a, 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c, 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63, 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287, 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a, 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039, 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805, 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372, 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79, 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375, 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b, 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00, 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1, 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56, 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87, 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d, 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7, 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e, 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c, 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411, 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f, 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18, 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643, 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69, 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05, 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154, 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc, 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805, 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5, 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a, 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170, 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc, 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068, 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a, 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6, 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df, 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9, 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73, 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e, 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750, 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4, 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b, 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f, 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237, 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1, 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09, 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6, 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178, 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f, 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9, 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307, 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b, 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2, 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee, 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d, 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642, 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a, 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f, 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1, 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be, 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61, 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c, 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7, 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c, 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6, 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b, 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388, 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468, 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0, 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846, 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6, 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4, 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919, 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa, 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c, 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96, 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6, 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72, 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f, 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f, 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a, 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c, 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f, 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167, 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11, 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3, 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266, 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57, 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5, 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8, 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe, 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6, 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507, 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b, 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e, 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab, 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875, 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663, 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017, 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b, 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e, 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e, 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe, 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4, 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574, 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f, 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93, 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106, 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3, 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f, 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83, 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148, 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247, 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c, 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda, 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce, 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d, 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce, 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9, 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44, 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc, 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64, 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd, 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89, 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349, 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d, 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e, 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373, 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e, 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58, 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a, 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1, 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe, 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff, 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000, 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c, 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85, 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438, 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea, 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea, 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39, 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1, 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6, 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696, 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b, 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718, 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010, 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99, 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b, 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457, 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5, 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2, 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074, 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a, 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88, 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc, 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb, 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f, 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3, 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448, 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c, 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b, 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013, 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575, 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9, 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55, 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9, 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835, 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b, 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa, 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b, 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7, 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977, 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230, 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003, 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5, 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5, 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97, 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec, 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6, 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566, 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948, 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a, 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf, 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1, 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165, 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1, 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5, 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc, 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2, 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2, 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3, 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc, 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973, 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f, 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf, 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd, 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6, 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61, 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197, 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a, 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db, 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af, 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6, 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0, 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c, 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2, 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9, 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e, 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e, 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d, 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867, 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19, 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf, 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed, 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3, 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66, 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7, 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c, 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66, 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a, 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d, 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8, 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4, 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587, 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a, 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb, 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f, 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf, 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703, 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893, 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29, 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b, 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c, 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd, 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8, 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2, 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e, 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2, 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86, 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469, 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce, 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52, 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4, 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80, 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac, 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d, 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727, 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e, 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d, 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302, 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24, 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301, 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2, 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3, 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652, 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5, 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c, 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091, 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89, 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da, 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194, 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21, 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83, 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765, 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71, 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229, 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483, 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387, 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409, 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e, 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee, 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7, 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1, 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a, 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e, 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2, 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62, 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b, 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f, 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2, 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c, 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e, 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6, 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0, 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900, 0x6e7e, 0x7897, 0x8155, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f, 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212, 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3, 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede, 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d, 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69, 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf, 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5, 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6, 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c, 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2, 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed, 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b, 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169, 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f, 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9, 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd, 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0, 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a, 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e, 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8, 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7, 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8, 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315, 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e, 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5, 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc, 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440, 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e, 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492, 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2, 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8, 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6, 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539, 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f, 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9, 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4, 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9, 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b, 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0, 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc, 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7, 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709, 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c, 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769, 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3, 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3, 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821, 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885, 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae, 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc, 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd, 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d, 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a, 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969, 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6, 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11, 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36, 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd, 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c, 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43, 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69, 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83, 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4, 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3, 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28, 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53, 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79, 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc, 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa, 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f, 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c, 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84, 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7, 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb, 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36, 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f, 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f, 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf, 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8, 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe, 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29, 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51, 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83, 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99, 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4, 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026, 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a, 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b, 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a, 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1, 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5, 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4, 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147, 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134, 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a, 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a, 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8, 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3, 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200, 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b, 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241, 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282, 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294, 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8, 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c, 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350, 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab, 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369, 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6, 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d, 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a, 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc, 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1, 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c, 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c, 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e, 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f, 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2, 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603, 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644, 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f, 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698, 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc, 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9, 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727, 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9, 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7, 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de, 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c, 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3, 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad, 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5, 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908, 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd, 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3, 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923, 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954, 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961, 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf, 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb, 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4, 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2, 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a, 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36, 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22, 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3, 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac, 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05, 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37, 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59, 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80, 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa, 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6, 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe, 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55, 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e, 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd, 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe, 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36, 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c, 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95, 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6, 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5, 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e, 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b, 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff, 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3, 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5, 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe, 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc, 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80, 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e, 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9, 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1, 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f, 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030, 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1, 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9, 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195, 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4, 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc, 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c, 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b, 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce, 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317, 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325, 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370, 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb, 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425, 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441, 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b, 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1, 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1, 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d, 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d, 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567, 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a, 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2, 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd, 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc, 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609, 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670, 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b, 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8, 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1, 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738, 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e, 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6, 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7, 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926, 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a, 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb, 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec, 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955, 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa, 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec, 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f, 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49, 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88, 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6, 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf, 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6, 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18, 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50, 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65, 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98, 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d, 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd, 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07, 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27, 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54, 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65, 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab, 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd, 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b, 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06, 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32, 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68, 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d, 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab, 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8, 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a, 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22, 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32, 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79, 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae, 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94, 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a, 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54, 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82, 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d, 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8, 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6, 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012, 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a, 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086, 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db, 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef, 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b, 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182, 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0, 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9, 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0, 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207, 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262, 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e, 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3, 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb, 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa, 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c, 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413, 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7, 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438, 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477, 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f, 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9, 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1, 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515, 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548, 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591, 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c, 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0, 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b, 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d, 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9, 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0, 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df, 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb, 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737, 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c, 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759, 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af, 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3, 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d, 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844, 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e, 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1, 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902, 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913, 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b, 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e, 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e, 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6, 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da, 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10, 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52, 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82, 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3, 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4, 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c, 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33, 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f, 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b, 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e, 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f, 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78, 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94, 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3, 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd, 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d, 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d, 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf, 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf, 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10, 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a, 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60, 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87, 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99, 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5, 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe, 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f, 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42, 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62, 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7, 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005, 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016, 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8, 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056, 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082, 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af, 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab, 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9, 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5, 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b, 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9, 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e, 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c, 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394, 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd, 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452, 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470, 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f, 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0, 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca, 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc, 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642, 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e, 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695, 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6, 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc, 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e, 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739, 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c, 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779, 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790, 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6, 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6, 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d, 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870, 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4, 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e, 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951, 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae, 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee, 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2, 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e, 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64, 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf, 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6, 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7, 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44, 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93, 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4, 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3, 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0, 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12, 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30, 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76, 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03, 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15, 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48, 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89, 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2, 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2, 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a, 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b, 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8, 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4, 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4, 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08, 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54, 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a, 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0, 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fa5, 0x1c2a, 0xbfffdb88, 0x4204f04f, 0x804ef70, 0x0000, 0x2288, 0x804f240, 0x42130a14, 0x40015360, 0xbfffdba8, 0x804bcc9 }; const unichar_t unicode_from_jis212[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02d8, 0x02c7, 0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da, 0x007e, 0x0384, 0x0385, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00a1, 0x00a6, 0x00bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00ba, 0x00aa, 0x00a9, 0x00ae, 0x2122, 0x00a4, 0x2116, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, 0x0000, 0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0000, 0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, 0x03c2, 0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040e, 0x040f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x0110, 0x0000, 0x0126, 0x0000, 0x0132, 0x0000, 0x0141, 0x013f, 0x0000, 0x014a, 0x00d8, 0x0152, 0x0000, 0x0166, 0x00de, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142, 0x0140, 0x0149, 0x014b, 0x00f8, 0x0153, 0x00df, 0x0167, 0x00fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c1, 0x00c0, 0x00c4, 0x00c2, 0x0102, 0x01cd, 0x0100, 0x0104, 0x00c5, 0x00c3, 0x0106, 0x0108, 0x010c, 0x00c7, 0x010a, 0x010e, 0x00c9, 0x00c8, 0x00cb, 0x00ca, 0x011a, 0x0116, 0x0112, 0x0118, 0x0000, 0x011c, 0x011e, 0x0122, 0x0120, 0x0124, 0x00cd, 0x00cc, 0x00cf, 0x00ce, 0x01cf, 0x0130, 0x012a, 0x012e, 0x0128, 0x0134, 0x0136, 0x0139, 0x013d, 0x013b, 0x0143, 0x0147, 0x0145, 0x00d1, 0x00d3, 0x00d2, 0x00d6, 0x00d4, 0x01d1, 0x0150, 0x014c, 0x00d5, 0x0154, 0x0158, 0x0156, 0x015a, 0x015c, 0x0160, 0x015e, 0x0164, 0x0162, 0x00da, 0x00d9, 0x00dc, 0x00db, 0x016c, 0x01d3, 0x0170, 0x016a, 0x0172, 0x016e, 0x0168, 0x01d7, 0x01db, 0x01d9, 0x01d5, 0x0174, 0x00dd, 0x0178, 0x0176, 0x0179, 0x017d, 0x017b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e1, 0x00e0, 0x00e4, 0x00e2, 0x0103, 0x01ce, 0x0101, 0x0105, 0x00e5, 0x00e3, 0x0107, 0x0109, 0x010d, 0x00e7, 0x010b, 0x010f, 0x00e9, 0x00e8, 0x00eb, 0x00ea, 0x011b, 0x0117, 0x0113, 0x0119, 0x01f5, 0x011d, 0x011f, 0x0000, 0x0121, 0x0125, 0x00ed, 0x00ec, 0x00ef, 0x00ee, 0x01d0, 0x0000, 0x012b, 0x012f, 0x0129, 0x0135, 0x0137, 0x013a, 0x013e, 0x013c, 0x0144, 0x0148, 0x0146, 0x00f1, 0x00f3, 0x00f2, 0x00f6, 0x00f4, 0x01d2, 0x0151, 0x014d, 0x00f5, 0x0155, 0x0159, 0x0157, 0x015b, 0x015d, 0x0161, 0x015f, 0x0165, 0x0163, 0x00fa, 0x00f9, 0x00fc, 0x00fb, 0x016d, 0x01d4, 0x0171, 0x016b, 0x0173, 0x016f, 0x0169, 0x01d8, 0x01dc, 0x01da, 0x01d6, 0x0175, 0x00fd, 0x00ff, 0x0177, 0x017a, 0x017e, 0x017c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e02, 0x4e04, 0x4e05, 0x4e0c, 0x4e12, 0x4e1f, 0x4e23, 0x4e24, 0x4e28, 0x4e2b, 0x4e2e, 0x4e2f, 0x4e30, 0x4e35, 0x4e40, 0x4e41, 0x4e44, 0x4e47, 0x4e51, 0x4e5a, 0x4e5c, 0x4e63, 0x4e68, 0x4e69, 0x4e74, 0x4e75, 0x4e79, 0x4e7f, 0x4e8d, 0x4e96, 0x4e97, 0x4e9d, 0x4eaf, 0x4eb9, 0x4ec3, 0x4ed0, 0x4eda, 0x4edb, 0x4ee0, 0x4ee1, 0x4ee2, 0x4ee8, 0x4eef, 0x4ef1, 0x4ef3, 0x4ef5, 0x4efd, 0x4efe, 0x4eff, 0x4f00, 0x4f02, 0x4f03, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f15, 0x4f16, 0x4f17, 0x4f19, 0x4f2e, 0x4f31, 0x4f60, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f40, 0x4f42, 0x4f48, 0x4f49, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f58, 0x4f5f, 0x4f63, 0x4f6a, 0x4f6c, 0x4f6e, 0x4f71, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d, 0x4f7e, 0x4f81, 0x4f82, 0x4f84, 0x4f85, 0x4f89, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f94, 0x4f97, 0x4f99, 0x4f9a, 0x4f9e, 0x4f9f, 0x4fb2, 0x4fb7, 0x4fb9, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc5, 0x4fc6, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fcf, 0x4fd2, 0x4fdc, 0x4fe0, 0x4fe2, 0x4ff0, 0x4ff2, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5004, 0x5007, 0x500a, 0x500c, 0x500e, 0x5010, 0x5013, 0x5017, 0x5018, 0x501b, 0x501c, 0x501d, 0x501e, 0x5022, 0x5027, 0x502e, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, 0x5041, 0x5042, 0x5045, 0x5046, 0x504a, 0x504c, 0x504e, 0x5051, 0x5052, 0x5053, 0x5057, 0x5059, 0x505f, 0x5060, 0x5062, 0x5063, 0x5066, 0x5067, 0x506a, 0x506d, 0x5070, 0x5071, 0x503b, 0x5081, 0x5083, 0x5084, 0x5086, 0x508a, 0x508e, 0x508f, 0x5090, 0x5092, 0x5093, 0x5094, 0x5096, 0x509b, 0x509c, 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50aa, 0x50af, 0x50b0, 0x50b9, 0x50ba, 0x50bd, 0x50c0, 0x50c3, 0x50c4, 0x50c7, 0x50cc, 0x50ce, 0x50d0, 0x50d3, 0x50d4, 0x50d8, 0x50dc, 0x50dd, 0x50df, 0x50e2, 0x50e4, 0x50e6, 0x50e8, 0x50e9, 0x50ef, 0x50f1, 0x50f6, 0x50fa, 0x50fe, 0x5103, 0x5106, 0x5107, 0x5108, 0x510b, 0x510c, 0x510d, 0x510e, 0x50f2, 0x5110, 0x5117, 0x5119, 0x511b, 0x511c, 0x511d, 0x511e, 0x5123, 0x5127, 0x5128, 0x512c, 0x512d, 0x512f, 0x5131, 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514a, 0x514f, 0x5153, 0x5155, 0x5157, 0x5158, 0x515f, 0x5164, 0x5166, 0x517e, 0x5183, 0x5184, 0x518b, 0x518e, 0x5198, 0x519d, 0x51a1, 0x51a3, 0x51ad, 0x51b8, 0x51ba, 0x51bc, 0x51be, 0x51bf, 0x51c2, 0x51c8, 0x51cf, 0x51d1, 0x51d2, 0x51d3, 0x51d5, 0x51d8, 0x51de, 0x51e2, 0x51e5, 0x51ee, 0x51f2, 0x51f3, 0x51f4, 0x51f7, 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523c, 0x5245, 0x5249, 0x5255, 0x5257, 0x5258, 0x525a, 0x525c, 0x525f, 0x5260, 0x5261, 0x5266, 0x526e, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, 0x528a, 0x528c, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52af, 0x52b0, 0x52b6, 0x52b7, 0x52b8, 0x52ba, 0x52bb, 0x52bd, 0x52c0, 0x52c4, 0x52c6, 0x52c8, 0x52cc, 0x52cf, 0x52d1, 0x52d4, 0x52d6, 0x52db, 0x52dc, 0x52e1, 0x52e5, 0x52e8, 0x52e9, 0x52ea, 0x52ec, 0x52f0, 0x52f1, 0x52f4, 0x52f6, 0x52f7, 0x5300, 0x5303, 0x530a, 0x530b, 0x530c, 0x5311, 0x5313, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x5330, 0x5332, 0x5335, 0x533c, 0x533d, 0x533e, 0x5342, 0x534c, 0x534b, 0x5359, 0x535b, 0x5361, 0x5363, 0x5365, 0x536c, 0x536d, 0x5372, 0x5379, 0x537e, 0x5383, 0x5387, 0x5388, 0x538e, 0x5393, 0x5394, 0x5399, 0x539d, 0x53a1, 0x53a4, 0x53aa, 0x53ab, 0x53af, 0x53b2, 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53ba, 0x53bd, 0x53c0, 0x53c5, 0x53cf, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dd, 0x53de, 0x53e0, 0x53e6, 0x53e7, 0x53f5, 0x5402, 0x5413, 0x541a, 0x5421, 0x5427, 0x5428, 0x542a, 0x542f, 0x5431, 0x5434, 0x5435, 0x5443, 0x5444, 0x5447, 0x544d, 0x544f, 0x545e, 0x5462, 0x5464, 0x5466, 0x5467, 0x5469, 0x546b, 0x546d, 0x546e, 0x5474, 0x547f, 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548d, 0x5491, 0x5495, 0x5496, 0x549c, 0x549f, 0x54a1, 0x54a6, 0x54a7, 0x54a9, 0x54aa, 0x54ad, 0x54ae, 0x54b1, 0x54b7, 0x54b9, 0x54ba, 0x54bb, 0x54bf, 0x54c6, 0x54ca, 0x54cd, 0x54ce, 0x54e0, 0x54ea, 0x54ec, 0x54ef, 0x54f6, 0x54fc, 0x54fe, 0x54ff, 0x5500, 0x5501, 0x5505, 0x5508, 0x5509, 0x550c, 0x550d, 0x550e, 0x5515, 0x552a, 0x552b, 0x5532, 0x5535, 0x5536, 0x553b, 0x553c, 0x553d, 0x5541, 0x5547, 0x5549, 0x554a, 0x554d, 0x5550, 0x5551, 0x5558, 0x555a, 0x555b, 0x555e, 0x5560, 0x5561, 0x5564, 0x5566, 0x557f, 0x5581, 0x5582, 0x5586, 0x5588, 0x558e, 0x558f, 0x5591, 0x5592, 0x5593, 0x5594, 0x5597, 0x55a3, 0x55a4, 0x55ad, 0x55b2, 0x55bf, 0x55c1, 0x55c3, 0x55c6, 0x55c9, 0x55cb, 0x55cc, 0x55ce, 0x55d1, 0x55d2, 0x55d3, 0x55d7, 0x55d8, 0x55db, 0x55de, 0x55e2, 0x55e9, 0x55f6, 0x55ff, 0x5605, 0x5608, 0x560a, 0x560d, 0x560e, 0x560f, 0x5610, 0x5611, 0x5612, 0x5619, 0x562c, 0x5630, 0x5633, 0x5635, 0x5637, 0x5639, 0x563b, 0x563c, 0x563d, 0x563f, 0x5640, 0x5641, 0x5643, 0x5644, 0x5646, 0x5649, 0x564b, 0x564d, 0x564f, 0x5654, 0x565e, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566d, 0x566f, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568b, 0x568c, 0x5695, 0x5699, 0x569a, 0x569d, 0x569e, 0x569f, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56ab, 0x56ac, 0x56ad, 0x56b1, 0x56b3, 0x56b7, 0x56be, 0x56c5, 0x56c9, 0x56ca, 0x56cb, 0x56cf, 0x56d0, 0x56cc, 0x56cd, 0x56d9, 0x56dc, 0x56dd, 0x56df, 0x56e1, 0x56e4, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56f1, 0x56eb, 0x56ed, 0x56f6, 0x56f7, 0x5701, 0x5702, 0x5707, 0x570a, 0x570c, 0x5711, 0x5715, 0x571a, 0x571b, 0x571d, 0x5720, 0x5722, 0x5723, 0x5724, 0x5725, 0x5729, 0x572a, 0x572c, 0x572e, 0x572f, 0x5733, 0x5734, 0x573d, 0x573e, 0x573f, 0x5745, 0x5746, 0x574c, 0x574d, 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576b, 0x576d, 0x576e, 0x576f, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, 0x577a, 0x577b, 0x577c, 0x577e, 0x5781, 0x5783, 0x578c, 0x5794, 0x5797, 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a1, 0x5795, 0x57a7, 0x57a8, 0x57a9, 0x57ac, 0x57b8, 0x57bd, 0x57c7, 0x57c8, 0x57cc, 0x57cf, 0x57d5, 0x57dd, 0x57de, 0x57e4, 0x57e6, 0x57e7, 0x57e9, 0x57ed, 0x57f0, 0x57f5, 0x57f6, 0x57f8, 0x57fd, 0x57fe, 0x57ff, 0x5803, 0x5804, 0x5808, 0x5809, 0x57e1, 0x580c, 0x580d, 0x581b, 0x581e, 0x581f, 0x5820, 0x5826, 0x5827, 0x582d, 0x5832, 0x5839, 0x583f, 0x5849, 0x584c, 0x584d, 0x584f, 0x5850, 0x5855, 0x585f, 0x5861, 0x5864, 0x5867, 0x5868, 0x5878, 0x587c, 0x587f, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, 0x588a, 0x588c, 0x588d, 0x588f, 0x5890, 0x5894, 0x5896, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a6, 0x58a9, 0x58b1, 0x58b2, 0x58c4, 0x58bc, 0x58c2, 0x58c8, 0x58cd, 0x58ce, 0x58d0, 0x58d2, 0x58d4, 0x58d6, 0x58da, 0x58dd, 0x58e1, 0x58e2, 0x58e9, 0x58f3, 0x5905, 0x5906, 0x590b, 0x590c, 0x5912, 0x5913, 0x5914, 0x8641, 0x591d, 0x5921, 0x5923, 0x5924, 0x5928, 0x592f, 0x5930, 0x5933, 0x5935, 0x5936, 0x593f, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595b, 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x596b, 0x596d, 0x596f, 0x5972, 0x5975, 0x5976, 0x5979, 0x597b, 0x597c, 0x598b, 0x598c, 0x598e, 0x5992, 0x5995, 0x5997, 0x599f, 0x59a4, 0x59a7, 0x59ad, 0x59ae, 0x59af, 0x59b0, 0x59b3, 0x59b7, 0x59ba, 0x59bc, 0x59c1, 0x59c3, 0x59c4, 0x59c8, 0x59ca, 0x59cd, 0x59d2, 0x59dd, 0x59de, 0x59df, 0x59e3, 0x59e4, 0x59e7, 0x59ee, 0x59ef, 0x59f1, 0x59f2, 0x59f4, 0x59f7, 0x5a00, 0x5a04, 0x5a0c, 0x5a0d, 0x5a0e, 0x5a12, 0x5a13, 0x5a1e, 0x5a23, 0x5a24, 0x5a27, 0x5a28, 0x5a2a, 0x5a2d, 0x5a30, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4c, 0x5a50, 0x5a55, 0x5a5e, 0x5a63, 0x5a65, 0x5a67, 0x5a6d, 0x5a77, 0x5a7a, 0x5a7b, 0x5a7e, 0x5a8b, 0x5a90, 0x5a93, 0x5a96, 0x5a99, 0x5a9c, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa2, 0x5aa7, 0x5aac, 0x5ab1, 0x5ab2, 0x5ab3, 0x5ab5, 0x5ab8, 0x5aba, 0x5abb, 0x5abf, 0x5ac4, 0x5ac6, 0x5ac8, 0x5acf, 0x5ada, 0x5adc, 0x5ae0, 0x5ae5, 0x5aea, 0x5aee, 0x5af5, 0x5af6, 0x5afd, 0x5b00, 0x5b01, 0x5b08, 0x5b17, 0x5b34, 0x5b19, 0x5b1b, 0x5b1d, 0x5b21, 0x5b25, 0x5b2d, 0x5b38, 0x5b41, 0x5b4b, 0x5b4c, 0x5b52, 0x5b56, 0x5b5e, 0x5b68, 0x5b6e, 0x5b6f, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, 0x5b81, 0x5b84, 0x5b86, 0x5b8a, 0x5b8e, 0x5b90, 0x5b91, 0x5b93, 0x5b94, 0x5b96, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7, 0x5bba, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bcd, 0x5bcf, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5be0, 0x5bef, 0x5bf1, 0x5bf4, 0x5bfd, 0x5c0c, 0x5c17, 0x5c1e, 0x5c1f, 0x5c23, 0x5c26, 0x5c29, 0x5c2b, 0x5c2c, 0x5c2e, 0x5c30, 0x5c32, 0x5c35, 0x5c36, 0x5c59, 0x5c5a, 0x5c5c, 0x5c62, 0x5c63, 0x5c67, 0x5c68, 0x5c69, 0x5c6d, 0x5c70, 0x5c74, 0x5c75, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c87, 0x5c88, 0x5c8a, 0x5c8f, 0x5c92, 0x5c9d, 0x5c9f, 0x5ca0, 0x5ca2, 0x5ca3, 0x5ca6, 0x5caa, 0x5cb2, 0x5cb4, 0x5cb5, 0x5cba, 0x5cc9, 0x5ccb, 0x5cd2, 0x5cdd, 0x5cd7, 0x5cee, 0x5cf1, 0x5cf2, 0x5cf4, 0x5d01, 0x5d06, 0x5d0d, 0x5d12, 0x5d2b, 0x5d23, 0x5d24, 0x5d26, 0x5d27, 0x5d31, 0x5d34, 0x5d39, 0x5d3d, 0x5d3f, 0x5d42, 0x5d43, 0x5d46, 0x5d48, 0x5d55, 0x5d51, 0x5d59, 0x5d4a, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d64, 0x5d6a, 0x5d6d, 0x5d70, 0x5d79, 0x5d7a, 0x5d7e, 0x5d7f, 0x5d81, 0x5d83, 0x5d88, 0x5d8a, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d99, 0x5d9b, 0x5d9f, 0x5da0, 0x5da7, 0x5dab, 0x5db0, 0x5db4, 0x5db8, 0x5db9, 0x5dc3, 0x5dc7, 0x5dcb, 0x5dd0, 0x5dce, 0x5dd8, 0x5dd9, 0x5de0, 0x5de4, 0x5de9, 0x5df8, 0x5df9, 0x5e00, 0x5e07, 0x5e0d, 0x5e12, 0x5e14, 0x5e15, 0x5e18, 0x5e1f, 0x5e20, 0x5e2e, 0x5e28, 0x5e32, 0x5e35, 0x5e3e, 0x5e4b, 0x5e50, 0x5e49, 0x5e51, 0x5e56, 0x5e58, 0x5e5b, 0x5e5c, 0x5e5e, 0x5e68, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e70, 0x5e80, 0x5e8b, 0x5e8e, 0x5ea2, 0x5ea4, 0x5ea5, 0x5ea8, 0x5eaa, 0x5eac, 0x5eb1, 0x5eb3, 0x5ebd, 0x5ebe, 0x5ebf, 0x5ec6, 0x5ecc, 0x5ecb, 0x5ece, 0x5ed1, 0x5ed2, 0x5ed4, 0x5ed5, 0x5edc, 0x5ede, 0x5ee5, 0x5eeb, 0x5f02, 0x5f06, 0x5f07, 0x5f08, 0x5f0e, 0x5f19, 0x5f1c, 0x5f1d, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f34, 0x5f36, 0x5f3b, 0x5f3d, 0x5f3f, 0x5f40, 0x5f44, 0x5f45, 0x5f47, 0x5f4d, 0x5f50, 0x5f54, 0x5f58, 0x5f5b, 0x5f60, 0x5f63, 0x5f64, 0x5f67, 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f89, 0x5f8d, 0x5f8f, 0x5f96, 0x5f9c, 0x5f9d, 0x5fa2, 0x5fa7, 0x5fab, 0x5fa4, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb8, 0x5fc4, 0x5fc7, 0x5fc8, 0x5fc9, 0x5fcb, 0x5fd0, 0x5fd1, 0x5fd2, 0x5fd3, 0x5fd4, 0x5fde, 0x5fe1, 0x5fe2, 0x5fe8, 0x5fe9, 0x5fea, 0x5fec, 0x5fed, 0x5fee, 0x5fef, 0x5ff2, 0x5ff3, 0x5ff6, 0x5ffa, 0x5ffc, 0x6007, 0x600a, 0x600d, 0x6013, 0x6014, 0x6017, 0x6018, 0x601a, 0x601f, 0x6024, 0x602d, 0x6033, 0x6035, 0x6040, 0x6047, 0x6048, 0x6049, 0x604c, 0x6051, 0x6054, 0x6056, 0x6057, 0x605d, 0x6061, 0x6067, 0x6071, 0x607e, 0x607f, 0x6082, 0x6086, 0x6088, 0x608a, 0x608e, 0x6091, 0x6093, 0x6095, 0x6098, 0x609d, 0x609e, 0x60a2, 0x60a4, 0x60a5, 0x60a8, 0x60b0, 0x60b1, 0x60b7, 0x60bb, 0x60be, 0x60c2, 0x60c4, 0x60c8, 0x60c9, 0x60ca, 0x60cb, 0x60ce, 0x60cf, 0x60d4, 0x60d5, 0x60d9, 0x60db, 0x60dd, 0x60de, 0x60e2, 0x60e5, 0x60f2, 0x60f5, 0x60f8, 0x60fc, 0x60fd, 0x6102, 0x6107, 0x610a, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6119, 0x611c, 0x611e, 0x6122, 0x612a, 0x612b, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, 0x6145, 0x6146, 0x6149, 0x615e, 0x6160, 0x616c, 0x6172, 0x6178, 0x617b, 0x617c, 0x617f, 0x6180, 0x6181, 0x6183, 0x6184, 0x618b, 0x618d, 0x6192, 0x6193, 0x6197, 0x6198, 0x619c, 0x619d, 0x619f, 0x61a0, 0x61a5, 0x61a8, 0x61aa, 0x61ad, 0x61b8, 0x61b9, 0x61bc, 0x61c0, 0x61c1, 0x61c2, 0x61ce, 0x61cf, 0x61d5, 0x61dc, 0x61dd, 0x61de, 0x61df, 0x61e1, 0x61e2, 0x61e7, 0x61e9, 0x61e5, 0x61ec, 0x61ed, 0x61ef, 0x6201, 0x6203, 0x6204, 0x6207, 0x6213, 0x6215, 0x621c, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, 0x622b, 0x6239, 0x623d, 0x6242, 0x6243, 0x6244, 0x6246, 0x624c, 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625a, 0x625c, 0x6264, 0x626d, 0x626f, 0x6273, 0x627a, 0x627d, 0x628d, 0x628e, 0x628f, 0x6290, 0x62a6, 0x62a8, 0x62b3, 0x62b6, 0x62b7, 0x62ba, 0x62be, 0x62bf, 0x62c4, 0x62ce, 0x62d5, 0x62d6, 0x62da, 0x62ea, 0x62f2, 0x62f4, 0x62fc, 0x62fd, 0x6303, 0x6304, 0x630a, 0x630b, 0x630d, 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632a, 0x632d, 0x6335, 0x6336, 0x6339, 0x633c, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, 0x634a, 0x634b, 0x634e, 0x6352, 0x6353, 0x6354, 0x6358, 0x635b, 0x6365, 0x6366, 0x636c, 0x636d, 0x6371, 0x6374, 0x6375, 0x6378, 0x637c, 0x637d, 0x637f, 0x6382, 0x6384, 0x6387, 0x638a, 0x6390, 0x6394, 0x6395, 0x6399, 0x639a, 0x639e, 0x63a4, 0x63a6, 0x63ad, 0x63ae, 0x63af, 0x63bd, 0x63c1, 0x63c5, 0x63c8, 0x63ce, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63dc, 0x63e0, 0x63e5, 0x63ea, 0x63ec, 0x63f2, 0x63f3, 0x63f5, 0x63f8, 0x63f9, 0x6409, 0x640a, 0x6410, 0x6412, 0x6414, 0x6418, 0x641e, 0x6420, 0x6422, 0x6424, 0x6425, 0x6429, 0x642a, 0x642f, 0x6430, 0x6435, 0x643d, 0x643f, 0x644b, 0x644f, 0x6451, 0x6452, 0x6453, 0x6454, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6463, 0x646d, 0x6473, 0x6474, 0x647b, 0x647d, 0x6485, 0x6487, 0x648f, 0x6490, 0x6491, 0x6498, 0x6499, 0x649b, 0x649d, 0x649f, 0x64a1, 0x64a3, 0x64a6, 0x64a8, 0x64ac, 0x64b3, 0x64bd, 0x64be, 0x64bf, 0x64c4, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64ce, 0x64d0, 0x64d1, 0x64d5, 0x64d7, 0x64e4, 0x64e5, 0x64e9, 0x64ea, 0x64ed, 0x64f0, 0x64f5, 0x64f7, 0x64fb, 0x64ff, 0x6501, 0x6504, 0x6508, 0x6509, 0x650a, 0x650f, 0x6513, 0x6514, 0x6516, 0x6519, 0x651b, 0x651e, 0x651f, 0x6522, 0x6526, 0x6529, 0x652e, 0x6531, 0x653a, 0x653c, 0x653d, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, 0x655f, 0x6560, 0x6567, 0x656b, 0x657a, 0x657d, 0x6581, 0x6585, 0x658a, 0x6592, 0x6595, 0x6598, 0x659d, 0x65a0, 0x65a3, 0x65a6, 0x65ae, 0x65b2, 0x65b3, 0x65b4, 0x65bf, 0x65c2, 0x65c8, 0x65c9, 0x65ce, 0x65d0, 0x65d4, 0x65d6, 0x65d8, 0x65df, 0x65f0, 0x65f2, 0x65f4, 0x65f5, 0x65f9, 0x65fe, 0x65ff, 0x6600, 0x6604, 0x6608, 0x6609, 0x660d, 0x6611, 0x6612, 0x6615, 0x6616, 0x661d, 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, 0x6631, 0x6633, 0x6639, 0x6637, 0x6640, 0x6645, 0x6646, 0x664a, 0x664c, 0x6651, 0x664e, 0x6657, 0x6658, 0x6659, 0x665b, 0x665c, 0x6660, 0x6661, 0x66fb, 0x666a, 0x666b, 0x666c, 0x667e, 0x6673, 0x6675, 0x667f, 0x6677, 0x6678, 0x6679, 0x667b, 0x6680, 0x667c, 0x668b, 0x668c, 0x668d, 0x6690, 0x6692, 0x6699, 0x669a, 0x669b, 0x669c, 0x669f, 0x66a0, 0x66a4, 0x66ad, 0x66b1, 0x66b2, 0x66b5, 0x66bb, 0x66bf, 0x66c0, 0x66c2, 0x66c3, 0x66c8, 0x66cc, 0x66ce, 0x66cf, 0x66d4, 0x66db, 0x66df, 0x66e8, 0x66eb, 0x66ec, 0x66ee, 0x66fa, 0x6705, 0x6707, 0x670e, 0x6713, 0x6719, 0x671c, 0x6720, 0x6722, 0x6733, 0x673e, 0x6745, 0x6747, 0x6748, 0x674c, 0x6754, 0x6755, 0x675d, 0x6766, 0x676c, 0x676e, 0x6774, 0x6776, 0x677b, 0x6781, 0x6784, 0x678e, 0x678f, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, 0x679b, 0x67b0, 0x67b1, 0x67b2, 0x67b5, 0x67bb, 0x67bc, 0x67bd, 0x67f9, 0x67c0, 0x67c2, 0x67c3, 0x67c5, 0x67c8, 0x67c9, 0x67d2, 0x67d7, 0x67d9, 0x67dc, 0x67e1, 0x67e6, 0x67f0, 0x67f2, 0x67f6, 0x67f7, 0x6852, 0x6814, 0x6819, 0x681d, 0x681f, 0x6828, 0x6827, 0x682c, 0x682d, 0x682f, 0x6830, 0x6831, 0x6833, 0x683b, 0x683f, 0x6844, 0x6845, 0x684a, 0x684c, 0x6855, 0x6857, 0x6858, 0x685b, 0x686b, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, 0x687a, 0x687b, 0x687c, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, 0x6898, 0x689a, 0x689c, 0x68a1, 0x68a3, 0x68a5, 0x68a9, 0x68aa, 0x68ae, 0x68b2, 0x68bb, 0x68c5, 0x68c8, 0x68cc, 0x68cf, 0x68d0, 0x68d1, 0x68d3, 0x68d6, 0x68d9, 0x68dc, 0x68dd, 0x68e5, 0x68e8, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68f0, 0x68f1, 0x68f5, 0x68f6, 0x68fb, 0x68fc, 0x68fd, 0x6906, 0x6909, 0x690a, 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, 0x6938, 0x693b, 0x6942, 0x6945, 0x6949, 0x694e, 0x6957, 0x695b, 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696c, 0x6970, 0x6971, 0x6972, 0x697a, 0x697b, 0x697f, 0x6980, 0x698d, 0x6992, 0x6996, 0x6998, 0x69a1, 0x69a5, 0x69a6, 0x69a8, 0x69ab, 0x69ad, 0x69af, 0x69b7, 0x69b8, 0x69ba, 0x69bc, 0x69c5, 0x69c8, 0x69d1, 0x69d6, 0x69d7, 0x69e2, 0x69e5, 0x69ee, 0x69ef, 0x69f1, 0x69f3, 0x69f5, 0x69fe, 0x6a00, 0x6a01, 0x6a03, 0x6a0f, 0x6a11, 0x6a15, 0x6a1a, 0x6a1d, 0x6a20, 0x6a24, 0x6a28, 0x6a30, 0x6a32, 0x6a34, 0x6a37, 0x6a3b, 0x6a3e, 0x6a3f, 0x6a45, 0x6a46, 0x6a49, 0x6a4a, 0x6a4e, 0x6a50, 0x6a51, 0x6a52, 0x6a55, 0x6a56, 0x6a5b, 0x6a64, 0x6a67, 0x6a6a, 0x6a71, 0x6a73, 0x6a7e, 0x6a81, 0x6a83, 0x6a86, 0x6a87, 0x6a89, 0x6a8b, 0x6a91, 0x6a9b, 0x6a9d, 0x6a9e, 0x6a9f, 0x6aa5, 0x6aab, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab4, 0x6abd, 0x6abe, 0x6abf, 0x6ac6, 0x6ac9, 0x6ac8, 0x6acc, 0x6ad0, 0x6ad4, 0x6ad5, 0x6ad6, 0x6adc, 0x6add, 0x6ae4, 0x6ae7, 0x6aec, 0x6af0, 0x6af1, 0x6af2, 0x6afc, 0x6afd, 0x6b02, 0x6b03, 0x6b06, 0x6b07, 0x6b09, 0x6b0f, 0x6b10, 0x6b11, 0x6b17, 0x6b1b, 0x6b1e, 0x6b24, 0x6b28, 0x6b2b, 0x6b2c, 0x6b2f, 0x6b35, 0x6b36, 0x6b3b, 0x6b3f, 0x6b46, 0x6b4a, 0x6b4d, 0x6b52, 0x6b56, 0x6b58, 0x6b5d, 0x6b60, 0x6b67, 0x6b6b, 0x6b6e, 0x6b70, 0x6b75, 0x6b7d, 0x6b7e, 0x6b82, 0x6b85, 0x6b97, 0x6b9b, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3, 0x6ba8, 0x6ba9, 0x6bac, 0x6bad, 0x6bae, 0x6bb0, 0x6bb8, 0x6bb9, 0x6bbd, 0x6bbe, 0x6bc3, 0x6bc4, 0x6bc9, 0x6bcc, 0x6bd6, 0x6bda, 0x6be1, 0x6be3, 0x6be6, 0x6be7, 0x6bee, 0x6bf1, 0x6bf7, 0x6bf9, 0x6bff, 0x6c02, 0x6c04, 0x6c05, 0x6c09, 0x6c0d, 0x6c0e, 0x6c10, 0x6c12, 0x6c19, 0x6c1f, 0x6c26, 0x6c27, 0x6c28, 0x6c2c, 0x6c2e, 0x6c33, 0x6c35, 0x6c36, 0x6c3a, 0x6c3b, 0x6c3f, 0x6c4a, 0x6c4b, 0x6c4d, 0x6c4f, 0x6c52, 0x6c54, 0x6c59, 0x6c5b, 0x6c5c, 0x6c6b, 0x6c6d, 0x6c6f, 0x6c74, 0x6c76, 0x6c78, 0x6c79, 0x6c7b, 0x6c85, 0x6c86, 0x6c87, 0x6c89, 0x6c94, 0x6c95, 0x6c97, 0x6c98, 0x6c9c, 0x6c9f, 0x6cb0, 0x6cb2, 0x6cb4, 0x6cc2, 0x6cc6, 0x6ccd, 0x6ccf, 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd4, 0x6cd6, 0x6cda, 0x6cdc, 0x6ce0, 0x6ce7, 0x6ce9, 0x6ceb, 0x6cec, 0x6cee, 0x6cf2, 0x6cf4, 0x6d04, 0x6d07, 0x6d0a, 0x6d0e, 0x6d0f, 0x6d11, 0x6d13, 0x6d1a, 0x6d26, 0x6d27, 0x6d28, 0x6c67, 0x6d2e, 0x6d2f, 0x6d31, 0x6d39, 0x6d3c, 0x6d3f, 0x6d57, 0x6d5e, 0x6d5f, 0x6d61, 0x6d65, 0x6d67, 0x6d6f, 0x6d70, 0x6d7c, 0x6d82, 0x6d87, 0x6d91, 0x6d92, 0x6d94, 0x6d96, 0x6d97, 0x6d98, 0x6daa, 0x6dac, 0x6db4, 0x6db7, 0x6db9, 0x6dbd, 0x6dbf, 0x6dc4, 0x6dc8, 0x6dca, 0x6dce, 0x6dcf, 0x6dd6, 0x6ddb, 0x6ddd, 0x6ddf, 0x6de0, 0x6de2, 0x6de5, 0x6de9, 0x6def, 0x6df0, 0x6df4, 0x6df6, 0x6dfc, 0x6e00, 0x6e04, 0x6e1e, 0x6e22, 0x6e27, 0x6e32, 0x6e36, 0x6e39, 0x6e3b, 0x6e3c, 0x6e44, 0x6e45, 0x6e48, 0x6e49, 0x6e4b, 0x6e4f, 0x6e51, 0x6e52, 0x6e53, 0x6e54, 0x6e57, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e62, 0x6e63, 0x6e68, 0x6e73, 0x6e7b, 0x6e7d, 0x6e8d, 0x6e93, 0x6e99, 0x6ea0, 0x6ea7, 0x6ead, 0x6eae, 0x6eb1, 0x6eb3, 0x6ebb, 0x6ebf, 0x6ec0, 0x6ec1, 0x6ec3, 0x6ec7, 0x6ec8, 0x6eca, 0x6ecd, 0x6ece, 0x6ecf, 0x6eeb, 0x6eed, 0x6eee, 0x6ef9, 0x6efb, 0x6efd, 0x6f04, 0x6f08, 0x6f0a, 0x6f0c, 0x6f0d, 0x6f16, 0x6f18, 0x6f1a, 0x6f1b, 0x6f26, 0x6f29, 0x6f2a, 0x6f2f, 0x6f30, 0x6f33, 0x6f36, 0x6f3b, 0x6f3c, 0x6f2d, 0x6f4f, 0x6f51, 0x6f52, 0x6f53, 0x6f57, 0x6f59, 0x6f5a, 0x6f5d, 0x6f5e, 0x6f61, 0x6f62, 0x6f68, 0x6f6c, 0x6f7d, 0x6f7e, 0x6f83, 0x6f87, 0x6f88, 0x6f8b, 0x6f8c, 0x6f8d, 0x6f90, 0x6f92, 0x6f93, 0x6f94, 0x6f96, 0x6f9a, 0x6f9f, 0x6fa0, 0x6fa5, 0x6fa6, 0x6fa7, 0x6fa8, 0x6fae, 0x6faf, 0x6fb0, 0x6fb5, 0x6fb6, 0x6fbc, 0x6fc5, 0x6fc7, 0x6fc8, 0x6fca, 0x6fda, 0x6fde, 0x6fe8, 0x6fe9, 0x6ff0, 0x6ff5, 0x6ff9, 0x6ffc, 0x6ffd, 0x7000, 0x7005, 0x7006, 0x7007, 0x700d, 0x7017, 0x7020, 0x7023, 0x702f, 0x7034, 0x7037, 0x7039, 0x703c, 0x7043, 0x7044, 0x7048, 0x7049, 0x704a, 0x704b, 0x7054, 0x7055, 0x705d, 0x705e, 0x704e, 0x7064, 0x7065, 0x706c, 0x706e, 0x7075, 0x7076, 0x707e, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098, 0x709b, 0x70a4, 0x70ab, 0x70b0, 0x70b1, 0x70b4, 0x70b7, 0x70ca, 0x70d1, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d8, 0x70dc, 0x70e4, 0x70fa, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710b, 0x710c, 0x710f, 0x711e, 0x7120, 0x712b, 0x712d, 0x712f, 0x7130, 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714a, 0x714b, 0x7150, 0x7152, 0x7157, 0x715a, 0x715c, 0x715e, 0x7160, 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718c, 0x7192, 0x719a, 0x719b, 0x71a0, 0x71a2, 0x71af, 0x71b0, 0x71b2, 0x71b3, 0x71ba, 0x71bf, 0x71c0, 0x71c1, 0x71c4, 0x71cb, 0x71cc, 0x71d3, 0x71d6, 0x71d9, 0x71da, 0x71dc, 0x71f8, 0x71fe, 0x7200, 0x7207, 0x7208, 0x7209, 0x7213, 0x7217, 0x721a, 0x721d, 0x721f, 0x7224, 0x722b, 0x722f, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, 0x7245, 0x724e, 0x724f, 0x7250, 0x7253, 0x7255, 0x7256, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7268, 0x726b, 0x726e, 0x726f, 0x7271, 0x7277, 0x7278, 0x727b, 0x727c, 0x727f, 0x7284, 0x7289, 0x728d, 0x728e, 0x7293, 0x729b, 0x72a8, 0x72ad, 0x72ae, 0x72b1, 0x72b4, 0x72be, 0x72c1, 0x72c7, 0x72c9, 0x72cc, 0x72d5, 0x72d6, 0x72d8, 0x72df, 0x72e5, 0x72f3, 0x72f4, 0x72fa, 0x72fb, 0x72fe, 0x7302, 0x7304, 0x7305, 0x7307, 0x730b, 0x730d, 0x7312, 0x7313, 0x7318, 0x7319, 0x731e, 0x7322, 0x7324, 0x7327, 0x7328, 0x732c, 0x7331, 0x7332, 0x7335, 0x733a, 0x733b, 0x733d, 0x7343, 0x734d, 0x7350, 0x7352, 0x7356, 0x7358, 0x735d, 0x735e, 0x735f, 0x7360, 0x7366, 0x7367, 0x7369, 0x736b, 0x736c, 0x736e, 0x736f, 0x7371, 0x7377, 0x7379, 0x737c, 0x7380, 0x7381, 0x7383, 0x7385, 0x7386, 0x738e, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, 0x739c, 0x739e, 0x739f, 0x73a0, 0x73a2, 0x73a5, 0x73a6, 0x73aa, 0x73ab, 0x73ad, 0x73b5, 0x73b7, 0x73b9, 0x73bc, 0x73bd, 0x73bf, 0x73c5, 0x73c6, 0x73c9, 0x73cb, 0x73cc, 0x73cf, 0x73d2, 0x73d3, 0x73d6, 0x73d9, 0x73dd, 0x73e1, 0x73e3, 0x73e6, 0x73e7, 0x73e9, 0x73f4, 0x73f5, 0x73f7, 0x73f9, 0x73fa, 0x73fb, 0x73fd, 0x73ff, 0x7400, 0x7401, 0x7404, 0x7407, 0x740a, 0x7411, 0x741a, 0x741b, 0x7424, 0x7426, 0x7428, 0x7429, 0x742a, 0x742b, 0x742c, 0x742d, 0x742e, 0x742f, 0x7430, 0x7431, 0x7439, 0x7440, 0x7443, 0x7444, 0x7446, 0x7447, 0x744b, 0x744d, 0x7451, 0x7452, 0x7457, 0x745d, 0x7462, 0x7466, 0x7467, 0x7468, 0x746b, 0x746d, 0x746e, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, 0x7489, 0x748f, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749a, 0x749c, 0x749f, 0x74a0, 0x74a1, 0x74a3, 0x74a6, 0x74a8, 0x74a9, 0x74aa, 0x74ab, 0x74ae, 0x74af, 0x74b1, 0x74b2, 0x74b5, 0x74b9, 0x74bb, 0x74bf, 0x74c8, 0x74c9, 0x74cc, 0x74d0, 0x74d3, 0x74d8, 0x74da, 0x74db, 0x74de, 0x74df, 0x74e4, 0x74e8, 0x74ea, 0x74eb, 0x74ef, 0x74f4, 0x74fa, 0x74fb, 0x74fc, 0x74ff, 0x7506, 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, 0x7529, 0x752a, 0x752f, 0x7536, 0x7539, 0x753d, 0x753e, 0x753f, 0x7540, 0x7543, 0x7547, 0x7548, 0x754e, 0x7550, 0x7552, 0x7557, 0x755e, 0x755f, 0x7561, 0x756f, 0x7571, 0x7579, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, 0x7595, 0x7599, 0x759c, 0x75a2, 0x75a4, 0x75b4, 0x75ba, 0x75bf, 0x75c0, 0x75c1, 0x75c4, 0x75c6, 0x75cc, 0x75ce, 0x75cf, 0x75d7, 0x75dc, 0x75df, 0x75e0, 0x75e1, 0x75e4, 0x75e7, 0x75ec, 0x75ee, 0x75ef, 0x75f1, 0x75f9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, 0x7608, 0x760a, 0x760c, 0x760f, 0x7612, 0x7613, 0x7615, 0x7616, 0x7619, 0x761b, 0x761c, 0x761d, 0x761e, 0x7623, 0x7625, 0x7626, 0x7629, 0x762d, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639, 0x763a, 0x763c, 0x764a, 0x7640, 0x7641, 0x7643, 0x7644, 0x7645, 0x7649, 0x764b, 0x7655, 0x7659, 0x765f, 0x7664, 0x7665, 0x766d, 0x766e, 0x766f, 0x7671, 0x7674, 0x7681, 0x7685, 0x768c, 0x768d, 0x7695, 0x769b, 0x769c, 0x769d, 0x769f, 0x76a0, 0x76a2, 0x76a3, 0x76a4, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76aa, 0x76ad, 0x76bd, 0x76c1, 0x76c5, 0x76c9, 0x76cb, 0x76cc, 0x76ce, 0x76d4, 0x76d9, 0x76e0, 0x76e6, 0x76e8, 0x76ec, 0x76f0, 0x76f1, 0x76f6, 0x76f9, 0x76fc, 0x7700, 0x7706, 0x770a, 0x770e, 0x7712, 0x7714, 0x7715, 0x7717, 0x7719, 0x771a, 0x771c, 0x7722, 0x7728, 0x772d, 0x772e, 0x772f, 0x7734, 0x7735, 0x7736, 0x7739, 0x773d, 0x773e, 0x7742, 0x7745, 0x7746, 0x774a, 0x774d, 0x774e, 0x774f, 0x7752, 0x7756, 0x7757, 0x775c, 0x775e, 0x775f, 0x7760, 0x7762, 0x7764, 0x7767, 0x776a, 0x776c, 0x7770, 0x7772, 0x7773, 0x7774, 0x777a, 0x777d, 0x7780, 0x7784, 0x778c, 0x778d, 0x7794, 0x7795, 0x7796, 0x779a, 0x779f, 0x77a2, 0x77a7, 0x77aa, 0x77ae, 0x77af, 0x77b1, 0x77b5, 0x77be, 0x77c3, 0x77c9, 0x77d1, 0x77d2, 0x77d5, 0x77d9, 0x77de, 0x77df, 0x77e0, 0x77e4, 0x77e6, 0x77ea, 0x77ec, 0x77f0, 0x77f1, 0x77f4, 0x77f8, 0x77fb, 0x7805, 0x7806, 0x7809, 0x780d, 0x780e, 0x7811, 0x781d, 0x7821, 0x7822, 0x7823, 0x782d, 0x782e, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, 0x7848, 0x784c, 0x784e, 0x7852, 0x785c, 0x785e, 0x7860, 0x7861, 0x7863, 0x7864, 0x7868, 0x786a, 0x786e, 0x787a, 0x787e, 0x788a, 0x788f, 0x7894, 0x7898, 0x78a1, 0x789d, 0x789e, 0x789f, 0x78a4, 0x78a8, 0x78ac, 0x78ad, 0x78b0, 0x78b1, 0x78b2, 0x78b3, 0x78bb, 0x78bd, 0x78bf, 0x78c7, 0x78c8, 0x78c9, 0x78cc, 0x78ce, 0x78d2, 0x78d3, 0x78d5, 0x78d6, 0x78e4, 0x78db, 0x78df, 0x78e0, 0x78e1, 0x78e6, 0x78ea, 0x78f2, 0x78f3, 0x7900, 0x78f6, 0x78f7, 0x78fa, 0x78fb, 0x78ff, 0x7906, 0x790c, 0x7910, 0x791a, 0x791c, 0x791e, 0x791f, 0x7920, 0x7925, 0x7927, 0x7929, 0x792d, 0x7931, 0x7934, 0x7935, 0x793b, 0x793d, 0x793f, 0x7944, 0x7945, 0x7946, 0x794a, 0x794b, 0x794f, 0x7951, 0x7954, 0x7958, 0x795b, 0x795c, 0x7967, 0x7969, 0x796b, 0x7972, 0x7979, 0x797b, 0x797c, 0x797e, 0x798b, 0x798c, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, 0x7998, 0x799b, 0x799c, 0x79a1, 0x79a8, 0x79a9, 0x79ab, 0x79af, 0x79b1, 0x79b4, 0x79b8, 0x79bb, 0x79c2, 0x79c4, 0x79c7, 0x79c8, 0x79ca, 0x79cf, 0x79d4, 0x79d6, 0x79da, 0x79dd, 0x79de, 0x79e0, 0x79e2, 0x79e5, 0x79ea, 0x79eb, 0x79ed, 0x79f1, 0x79f8, 0x79fc, 0x7a02, 0x7a03, 0x7a07, 0x7a09, 0x7a0a, 0x7a0c, 0x7a11, 0x7a15, 0x7a1b, 0x7a1e, 0x7a21, 0x7a27, 0x7a2b, 0x7a2d, 0x7a2f, 0x7a30, 0x7a34, 0x7a35, 0x7a38, 0x7a39, 0x7a3a, 0x7a44, 0x7a45, 0x7a47, 0x7a48, 0x7a4c, 0x7a55, 0x7a56, 0x7a59, 0x7a5c, 0x7a5d, 0x7a5f, 0x7a60, 0x7a65, 0x7a67, 0x7a6a, 0x7a6d, 0x7a75, 0x7a78, 0x7a7e, 0x7a80, 0x7a82, 0x7a85, 0x7a86, 0x7a8a, 0x7a8b, 0x7a90, 0x7a91, 0x7a94, 0x7a9e, 0x7aa0, 0x7aa3, 0x7aac, 0x7ab3, 0x7ab5, 0x7ab9, 0x7abb, 0x7abc, 0x7ac6, 0x7ac9, 0x7acc, 0x7ace, 0x7ad1, 0x7adb, 0x7ae8, 0x7ae9, 0x7aeb, 0x7aec, 0x7af1, 0x7af4, 0x7afb, 0x7afd, 0x7afe, 0x7b07, 0x7b14, 0x7b1f, 0x7b23, 0x7b27, 0x7b29, 0x7b2a, 0x7b2b, 0x7b2d, 0x7b2e, 0x7b2f, 0x7b30, 0x7b31, 0x7b34, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b47, 0x7b4e, 0x7b55, 0x7b60, 0x7b64, 0x7b66, 0x7b69, 0x7b6a, 0x7b6d, 0x7b6f, 0x7b72, 0x7b73, 0x7b77, 0x7b84, 0x7b89, 0x7b8e, 0x7b90, 0x7b91, 0x7b96, 0x7b9b, 0x7b9e, 0x7ba0, 0x7ba5, 0x7bac, 0x7baf, 0x7bb0, 0x7bb2, 0x7bb5, 0x7bb6, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bc2, 0x7bc5, 0x7bc8, 0x7bca, 0x7bd4, 0x7bd6, 0x7bd7, 0x7bd9, 0x7bda, 0x7bdb, 0x7be8, 0x7bea, 0x7bf2, 0x7bf4, 0x7bf5, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfc, 0x7bfe, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c06, 0x7c09, 0x7c0b, 0x7c0c, 0x7c0e, 0x7c0f, 0x7c19, 0x7c1b, 0x7c20, 0x7c25, 0x7c26, 0x7c28, 0x7c2c, 0x7c31, 0x7c33, 0x7c34, 0x7c36, 0x7c39, 0x7c3a, 0x7c46, 0x7c4a, 0x7c55, 0x7c51, 0x7c52, 0x7c53, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0x7c61, 0x7c63, 0x7c67, 0x7c69, 0x7c6d, 0x7c6e, 0x7c70, 0x7c72, 0x7c79, 0x7c7c, 0x7c7d, 0x7c86, 0x7c87, 0x7c8f, 0x7c94, 0x7c9e, 0x7ca0, 0x7ca6, 0x7cb0, 0x7cb6, 0x7cb7, 0x7cba, 0x7cbb, 0x7cbc, 0x7cbf, 0x7cc4, 0x7cc7, 0x7cc8, 0x7cc9, 0x7ccd, 0x7ccf, 0x7cd3, 0x7cd4, 0x7cd5, 0x7cd7, 0x7cd9, 0x7cda, 0x7cdd, 0x7ce6, 0x7ce9, 0x7ceb, 0x7cf5, 0x7d03, 0x7d07, 0x7d08, 0x7d09, 0x7d0f, 0x7d11, 0x7d12, 0x7d13, 0x7d16, 0x7d1d, 0x7d1e, 0x7d23, 0x7d26, 0x7d2a, 0x7d2d, 0x7d31, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d40, 0x7d41, 0x7d47, 0x7d48, 0x7d4d, 0x7d51, 0x7d53, 0x7d57, 0x7d59, 0x7d5a, 0x7d5c, 0x7d5d, 0x7d65, 0x7d67, 0x7d6a, 0x7d70, 0x7d78, 0x7d7a, 0x7d7b, 0x7d7f, 0x7d81, 0x7d82, 0x7d83, 0x7d85, 0x7d86, 0x7d88, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d91, 0x7d96, 0x7d97, 0x7d9d, 0x7d9e, 0x7da6, 0x7da7, 0x7daa, 0x7db3, 0x7db6, 0x7db7, 0x7db9, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dcc, 0x7dcd, 0x7dce, 0x7dd7, 0x7dd9, 0x7e00, 0x7de2, 0x7de5, 0x7de6, 0x7dea, 0x7deb, 0x7ded, 0x7df1, 0x7df5, 0x7df6, 0x7df9, 0x7dfa, 0x7e08, 0x7e10, 0x7e11, 0x7e15, 0x7e17, 0x7e1c, 0x7e1d, 0x7e20, 0x7e27, 0x7e28, 0x7e2c, 0x7e2d, 0x7e2f, 0x7e33, 0x7e36, 0x7e3f, 0x7e44, 0x7e45, 0x7e47, 0x7e4e, 0x7e50, 0x7e52, 0x7e58, 0x7e5f, 0x7e61, 0x7e62, 0x7e65, 0x7e6b, 0x7e6e, 0x7e6f, 0x7e73, 0x7e78, 0x7e7e, 0x7e81, 0x7e86, 0x7e87, 0x7e8a, 0x7e8d, 0x7e91, 0x7e95, 0x7e98, 0x7e9a, 0x7e9d, 0x7e9e, 0x7f3c, 0x7f3b, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f43, 0x7f44, 0x7f47, 0x7f4f, 0x7f52, 0x7f53, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f61, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f6d, 0x7f71, 0x7f7d, 0x7f7e, 0x7f7f, 0x7f80, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90, 0x7f91, 0x7f96, 0x7f97, 0x7f9c, 0x7fa1, 0x7fa2, 0x7fa6, 0x7faa, 0x7fad, 0x7fb4, 0x7fbc, 0x7fbf, 0x7fc0, 0x7fc3, 0x7fc8, 0x7fce, 0x7fcf, 0x7fdb, 0x7fdf, 0x7fe3, 0x7fe5, 0x7fe8, 0x7fec, 0x7fee, 0x7fef, 0x7ff2, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8007, 0x8008, 0x800a, 0x800d, 0x800e, 0x800f, 0x8011, 0x8013, 0x8014, 0x8016, 0x801d, 0x801e, 0x801f, 0x8020, 0x8024, 0x8026, 0x802c, 0x802e, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803a, 0x803c, 0x803e, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806d, 0x8071, 0x8075, 0x8081, 0x8088, 0x808e, 0x809c, 0x809e, 0x80a6, 0x80a7, 0x80ab, 0x80b8, 0x80b9, 0x80c8, 0x80cd, 0x80cf, 0x80d2, 0x80d4, 0x80d5, 0x80d7, 0x80d8, 0x80e0, 0x80ed, 0x80ee, 0x80f0, 0x80f2, 0x80f3, 0x80f6, 0x80f9, 0x80fa, 0x80fe, 0x8103, 0x810b, 0x8116, 0x8117, 0x8118, 0x811c, 0x811e, 0x8120, 0x8124, 0x8127, 0x812c, 0x8130, 0x8135, 0x813a, 0x813c, 0x8145, 0x8147, 0x814a, 0x814c, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, 0x8168, 0x8169, 0x816d, 0x816f, 0x8177, 0x8181, 0x8190, 0x8184, 0x8185, 0x8186, 0x818b, 0x818e, 0x8196, 0x8198, 0x819b, 0x819e, 0x81a2, 0x81ae, 0x81b2, 0x81b4, 0x81bb, 0x81cb, 0x81c3, 0x81c5, 0x81ca, 0x81ce, 0x81cf, 0x81d5, 0x81d7, 0x81db, 0x81dd, 0x81de, 0x81e1, 0x81e4, 0x81eb, 0x81ec, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f8, 0x81f9, 0x81fd, 0x81ff, 0x8200, 0x8203, 0x820f, 0x8213, 0x8214, 0x8219, 0x821a, 0x821d, 0x8221, 0x8222, 0x8228, 0x8232, 0x8234, 0x823a, 0x8243, 0x8244, 0x8245, 0x8246, 0x824b, 0x824e, 0x824f, 0x8251, 0x8256, 0x825c, 0x8260, 0x8263, 0x8267, 0x826d, 0x8274, 0x827b, 0x827d, 0x827f, 0x8280, 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828a, 0x828e, 0x8291, 0x8294, 0x8296, 0x8298, 0x829a, 0x829b, 0x82a0, 0x82a1, 0x82a3, 0x82a4, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ae, 0x82b0, 0x82b2, 0x82b4, 0x82b7, 0x82ba, 0x82bc, 0x82be, 0x82bf, 0x82c6, 0x82d0, 0x82d5, 0x82da, 0x82e0, 0x82e2, 0x82e4, 0x82e8, 0x82ea, 0x82ed, 0x82ef, 0x82f6, 0x82f7, 0x82fd, 0x82fe, 0x8300, 0x8301, 0x8307, 0x8308, 0x830a, 0x830b, 0x8354, 0x831b, 0x831d, 0x831e, 0x831f, 0x8321, 0x8322, 0x832c, 0x832d, 0x832e, 0x8330, 0x8333, 0x8337, 0x833a, 0x833c, 0x833d, 0x8342, 0x8343, 0x8344, 0x8347, 0x834d, 0x834e, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378, 0x837d, 0x837f, 0x8380, 0x8382, 0x8384, 0x8386, 0x838d, 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839b, 0x839c, 0x839d, 0x83a6, 0x83a7, 0x83a9, 0x83ac, 0x83be, 0x83bf, 0x83c0, 0x83c7, 0x83c9, 0x83cf, 0x83d0, 0x83d1, 0x83d4, 0x83dd, 0x8353, 0x83e8, 0x83ea, 0x83f6, 0x83f8, 0x83f9, 0x83fc, 0x8401, 0x8406, 0x840a, 0x840f, 0x8411, 0x8415, 0x8419, 0x83ad, 0x842f, 0x8439, 0x8445, 0x8447, 0x8448, 0x844a, 0x844d, 0x844f, 0x8451, 0x8452, 0x8456, 0x8458, 0x8459, 0x845a, 0x845c, 0x8460, 0x8464, 0x8465, 0x8467, 0x846a, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847c, 0x847d, 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849e, 0x84a6, 0x84a8, 0x84a9, 0x84aa, 0x84af, 0x84b1, 0x84b4, 0x84ba, 0x84bd, 0x84be, 0x84c0, 0x84c2, 0x84c7, 0x84c8, 0x84cc, 0x84cf, 0x84d3, 0x84dc, 0x84e7, 0x84ea, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f7, 0x8532, 0x84fa, 0x84fb, 0x84fd, 0x8502, 0x8503, 0x8507, 0x850c, 0x850e, 0x8510, 0x851c, 0x851e, 0x8522, 0x8523, 0x8524, 0x8525, 0x8527, 0x852a, 0x852b, 0x852f, 0x8533, 0x8534, 0x8536, 0x853f, 0x8546, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, 0x8559, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8564, 0x856b, 0x856f, 0x8579, 0x857a, 0x857b, 0x857d, 0x857f, 0x8581, 0x8585, 0x8586, 0x8589, 0x858b, 0x858c, 0x858f, 0x8593, 0x8598, 0x859d, 0x859f, 0x85a0, 0x85a2, 0x85a5, 0x85a7, 0x85b4, 0x85b6, 0x85b7, 0x85b8, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c2, 0x85c7, 0x85ca, 0x85cb, 0x85ce, 0x85ad, 0x85d8, 0x85da, 0x85df, 0x85e0, 0x85e6, 0x85e8, 0x85ed, 0x85f3, 0x85f6, 0x85fc, 0x85ff, 0x8600, 0x8604, 0x8605, 0x860d, 0x860e, 0x8610, 0x8611, 0x8612, 0x8618, 0x8619, 0x861b, 0x861e, 0x8621, 0x8627, 0x8629, 0x8636, 0x8638, 0x863a, 0x863c, 0x863d, 0x8640, 0x8642, 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865d, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866c, 0x866f, 0x8675, 0x8676, 0x8677, 0x867a, 0x868d, 0x8691, 0x8696, 0x8698, 0x869a, 0x869c, 0x86a1, 0x86a6, 0x86a7, 0x86a8, 0x86ad, 0x86b1, 0x86b3, 0x86b4, 0x86b5, 0x86b7, 0x86b8, 0x86b9, 0x86bf, 0x86c0, 0x86c1, 0x86c3, 0x86c5, 0x86d1, 0x86d2, 0x86d5, 0x86d7, 0x86da, 0x86dc, 0x86e0, 0x86e3, 0x86e5, 0x86e7, 0x8688, 0x86fa, 0x86fc, 0x86fd, 0x8704, 0x8705, 0x8707, 0x870b, 0x870e, 0x870f, 0x8710, 0x8713, 0x8714, 0x8719, 0x871e, 0x871f, 0x8721, 0x8723, 0x8728, 0x872e, 0x872f, 0x8731, 0x8732, 0x8739, 0x873a, 0x873c, 0x873d, 0x873e, 0x8740, 0x8743, 0x8745, 0x874d, 0x8758, 0x875d, 0x8761, 0x8764, 0x8765, 0x876f, 0x8771, 0x8772, 0x877b, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878b, 0x878c, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879e, 0x87a0, 0x87a3, 0x87a7, 0x87ac, 0x87ad, 0x87ae, 0x87b1, 0x87b5, 0x87be, 0x87bf, 0x87c1, 0x87c8, 0x87c9, 0x87ca, 0x87ce, 0x87d5, 0x87d6, 0x87d9, 0x87da, 0x87dc, 0x87df, 0x87e2, 0x87e3, 0x87e4, 0x87ea, 0x87eb, 0x87ed, 0x87f1, 0x87f3, 0x87f8, 0x87fa, 0x87ff, 0x8801, 0x8803, 0x8806, 0x8809, 0x880a, 0x880b, 0x8810, 0x8819, 0x8812, 0x8813, 0x8814, 0x8818, 0x881a, 0x881b, 0x881c, 0x881e, 0x881f, 0x8828, 0x882d, 0x882e, 0x8830, 0x8832, 0x8835, 0x883a, 0x883c, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, 0x884a, 0x884b, 0x884e, 0x8851, 0x8855, 0x8856, 0x8858, 0x885a, 0x885c, 0x885f, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887b, 0x8880, 0x8898, 0x889a, 0x889b, 0x889c, 0x889f, 0x88a0, 0x88a8, 0x88aa, 0x88ba, 0x88bd, 0x88be, 0x88c0, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88d1, 0x88d2, 0x88d3, 0x88db, 0x88de, 0x88e7, 0x88ef, 0x88f0, 0x88f1, 0x88f5, 0x88f7, 0x8901, 0x8906, 0x890d, 0x890e, 0x890f, 0x8915, 0x8916, 0x8918, 0x8919, 0x891a, 0x891c, 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, 0x8939, 0x893a, 0x893e, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, 0x894f, 0x8952, 0x8957, 0x895a, 0x895b, 0x895c, 0x8961, 0x8962, 0x8963, 0x896b, 0x896e, 0x8970, 0x8973, 0x8975, 0x897a, 0x897b, 0x897c, 0x897d, 0x8989, 0x898d, 0x8990, 0x8994, 0x8995, 0x899b, 0x899c, 0x899f, 0x89a0, 0x89a5, 0x89b0, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89bc, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89e5, 0x89e9, 0x89eb, 0x89ed, 0x89f1, 0x89f3, 0x89f6, 0x89f9, 0x89fd, 0x89ff, 0x8a04, 0x8a05, 0x8a07, 0x8a0f, 0x8a11, 0x8a12, 0x8a14, 0x8a15, 0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26, 0x8a2b, 0x8a2c, 0x8a2f, 0x8a35, 0x8a37, 0x8a3d, 0x8a3e, 0x8a40, 0x8a43, 0x8a45, 0x8a47, 0x8a49, 0x8a4d, 0x8a4e, 0x8a53, 0x8a56, 0x8a57, 0x8a58, 0x8a5c, 0x8a5d, 0x8a61, 0x8a65, 0x8a67, 0x8a75, 0x8a76, 0x8a77, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7e, 0x8a7f, 0x8a80, 0x8a83, 0x8a86, 0x8a8b, 0x8a8f, 0x8a90, 0x8a92, 0x8a96, 0x8a97, 0x8a99, 0x8a9f, 0x8aa7, 0x8aa9, 0x8aae, 0x8aaf, 0x8ab3, 0x8ab6, 0x8ab7, 0x8abb, 0x8abe, 0x8ac3, 0x8ac6, 0x8ac8, 0x8ac9, 0x8aca, 0x8ad1, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad7, 0x8add, 0x8adf, 0x8aec, 0x8af0, 0x8af4, 0x8af5, 0x8af6, 0x8afc, 0x8aff, 0x8b05, 0x8b06, 0x8b0b, 0x8b11, 0x8b1c, 0x8b1e, 0x8b1f, 0x8b0a, 0x8b2d, 0x8b30, 0x8b37, 0x8b3c, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b48, 0x8b52, 0x8b53, 0x8b54, 0x8b59, 0x8b4d, 0x8b5e, 0x8b63, 0x8b6d, 0x8b76, 0x8b78, 0x8b79, 0x8b7c, 0x8b7e, 0x8b81, 0x8b84, 0x8b85, 0x8b8b, 0x8b8d, 0x8b8f, 0x8b94, 0x8b95, 0x8b9c, 0x8b9e, 0x8b9f, 0x8c38, 0x8c39, 0x8c3d, 0x8c3e, 0x8c45, 0x8c47, 0x8c49, 0x8c4b, 0x8c4f, 0x8c51, 0x8c53, 0x8c54, 0x8c57, 0x8c58, 0x8c5b, 0x8c5d, 0x8c59, 0x8c63, 0x8c64, 0x8c66, 0x8c68, 0x8c69, 0x8c6d, 0x8c73, 0x8c75, 0x8c76, 0x8c7b, 0x8c7e, 0x8c86, 0x8c87, 0x8c8b, 0x8c90, 0x8c92, 0x8c93, 0x8c99, 0x8c9b, 0x8c9c, 0x8ca4, 0x8cb9, 0x8cba, 0x8cc5, 0x8cc6, 0x8cc9, 0x8ccb, 0x8ccf, 0x8cd6, 0x8cd5, 0x8cd9, 0x8cdd, 0x8ce1, 0x8ce8, 0x8cec, 0x8cef, 0x8cf0, 0x8cf2, 0x8cf5, 0x8cf7, 0x8cf8, 0x8cfe, 0x8cff, 0x8d01, 0x8d03, 0x8d09, 0x8d12, 0x8d17, 0x8d1b, 0x8d65, 0x8d69, 0x8d6c, 0x8d6e, 0x8d7f, 0x8d82, 0x8d84, 0x8d88, 0x8d8d, 0x8d90, 0x8d91, 0x8d95, 0x8d9e, 0x8d9f, 0x8da0, 0x8da6, 0x8dab, 0x8dac, 0x8daf, 0x8db2, 0x8db5, 0x8db7, 0x8db9, 0x8dbb, 0x8dc0, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dca, 0x8dce, 0x8dd1, 0x8dd4, 0x8dd5, 0x8dd7, 0x8dd9, 0x8de4, 0x8de5, 0x8de7, 0x8dec, 0x8df0, 0x8dbc, 0x8df1, 0x8df2, 0x8df4, 0x8dfd, 0x8e01, 0x8e04, 0x8e05, 0x8e06, 0x8e0b, 0x8e11, 0x8e14, 0x8e16, 0x8e20, 0x8e21, 0x8e22, 0x8e23, 0x8e26, 0x8e27, 0x8e31, 0x8e33, 0x8e36, 0x8e37, 0x8e38, 0x8e39, 0x8e3d, 0x8e40, 0x8e41, 0x8e4b, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e54, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e61, 0x8e62, 0x8e69, 0x8e6c, 0x8e6d, 0x8e6f, 0x8e70, 0x8e71, 0x8e79, 0x8e7a, 0x8e7b, 0x8e82, 0x8e83, 0x8e89, 0x8e90, 0x8e92, 0x8e95, 0x8e9a, 0x8e9b, 0x8e9d, 0x8e9e, 0x8ea2, 0x8ea7, 0x8ea9, 0x8ead, 0x8eae, 0x8eb3, 0x8eb5, 0x8eba, 0x8ebb, 0x8ec0, 0x8ec1, 0x8ec3, 0x8ec4, 0x8ec7, 0x8ecf, 0x8ed1, 0x8ed4, 0x8edc, 0x8ee8, 0x8eee, 0x8ef0, 0x8ef1, 0x8ef7, 0x8ef9, 0x8efa, 0x8eed, 0x8f00, 0x8f02, 0x8f07, 0x8f08, 0x8f0f, 0x8f10, 0x8f16, 0x8f17, 0x8f18, 0x8f1e, 0x8f20, 0x8f21, 0x8f23, 0x8f25, 0x8f27, 0x8f28, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f3a, 0x8f40, 0x8f41, 0x8f43, 0x8f47, 0x8f4f, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f58, 0x8f5d, 0x8f5e, 0x8f65, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fb5, 0x8fb6, 0x8fb8, 0x8fbe, 0x8fc0, 0x8fc1, 0x8fc6, 0x8fca, 0x8fcb, 0x8fcd, 0x8fd0, 0x8fd2, 0x8fd3, 0x8fd5, 0x8fe0, 0x8fe3, 0x8fe4, 0x8fe8, 0x8fee, 0x8ff1, 0x8ff5, 0x8ff6, 0x8ffb, 0x8ffe, 0x9002, 0x9004, 0x9008, 0x900c, 0x9018, 0x901b, 0x9028, 0x9029, 0x902f, 0x902a, 0x902c, 0x902d, 0x9033, 0x9034, 0x9037, 0x903f, 0x9043, 0x9044, 0x904c, 0x905b, 0x905d, 0x9062, 0x9066, 0x9067, 0x906c, 0x9070, 0x9074, 0x9079, 0x9085, 0x9088, 0x908b, 0x908c, 0x908e, 0x9090, 0x9095, 0x9097, 0x9098, 0x9099, 0x909b, 0x90a0, 0x90a1, 0x90a2, 0x90a5, 0x90b0, 0x90b2, 0x90b3, 0x90b4, 0x90b6, 0x90bd, 0x90cc, 0x90be, 0x90c3, 0x90c4, 0x90c5, 0x90c7, 0x90c8, 0x90d5, 0x90d7, 0x90d8, 0x90d9, 0x90dc, 0x90dd, 0x90df, 0x90e5, 0x90d2, 0x90f6, 0x90eb, 0x90ef, 0x90f0, 0x90f4, 0x90fe, 0x90ff, 0x9100, 0x9104, 0x9105, 0x9106, 0x9108, 0x910d, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, 0x911a, 0x911c, 0x911e, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, 0x9129, 0x912e, 0x912f, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, 0x913a, 0x913c, 0x913d, 0x9143, 0x9147, 0x9148, 0x914f, 0x9153, 0x9157, 0x9159, 0x915a, 0x915b, 0x9161, 0x9164, 0x9167, 0x916d, 0x9174, 0x9179, 0x917a, 0x917b, 0x9181, 0x9183, 0x9185, 0x9186, 0x918a, 0x918e, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919e, 0x91a1, 0x91a6, 0x91a8, 0x91ac, 0x91ad, 0x91ae, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b6, 0x91bb, 0x91bc, 0x91bd, 0x91bf, 0x91c2, 0x91c3, 0x91c5, 0x91d3, 0x91d4, 0x91d7, 0x91d9, 0x91da, 0x91de, 0x91e4, 0x91e5, 0x91e9, 0x91ea, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f7, 0x91f9, 0x91fb, 0x91fd, 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920a, 0x920c, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921c, 0x921d, 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922e, 0x922f, 0x9230, 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923a, 0x923c, 0x923e, 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924a, 0x924d, 0x924e, 0x924f, 0x9251, 0x9258, 0x9259, 0x925c, 0x925d, 0x9260, 0x9261, 0x9265, 0x9267, 0x9268, 0x9269, 0x926e, 0x926f, 0x9270, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927b, 0x927c, 0x927d, 0x927f, 0x9288, 0x9289, 0x928a, 0x928d, 0x928e, 0x9292, 0x9297, 0x9299, 0x929f, 0x92a0, 0x92a4, 0x92a5, 0x92a7, 0x92a8, 0x92ab, 0x92af, 0x92b2, 0x92b6, 0x92b8, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92d0, 0x92d3, 0x92d5, 0x92d7, 0x92d8, 0x92d9, 0x92dc, 0x92dd, 0x92df, 0x92e0, 0x92e1, 0x92e3, 0x92e5, 0x92e7, 0x92e8, 0x92ec, 0x92ee, 0x92f0, 0x92f9, 0x92fb, 0x92ff, 0x9300, 0x9302, 0x9308, 0x930d, 0x9311, 0x9314, 0x9315, 0x931c, 0x931d, 0x931e, 0x931f, 0x9321, 0x9324, 0x9325, 0x9327, 0x9329, 0x932a, 0x9333, 0x9334, 0x9336, 0x9337, 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, 0x9358, 0x935a, 0x935e, 0x9364, 0x9365, 0x9367, 0x9369, 0x936a, 0x936d, 0x936f, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376, 0x937a, 0x937d, 0x937f, 0x9380, 0x9381, 0x9382, 0x9388, 0x938a, 0x938b, 0x938d, 0x938f, 0x9392, 0x9395, 0x9398, 0x939b, 0x939e, 0x93a1, 0x93a3, 0x93a4, 0x93a6, 0x93a8, 0x93ab, 0x93b4, 0x93b5, 0x93b6, 0x93ba, 0x93a9, 0x93c1, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93d3, 0x93d9, 0x93dc, 0x93de, 0x93df, 0x93e2, 0x93e6, 0x93e7, 0x93f9, 0x93f7, 0x93f8, 0x93fa, 0x93fb, 0x93fd, 0x9401, 0x9402, 0x9404, 0x9408, 0x9409, 0x940d, 0x940e, 0x940f, 0x9415, 0x9416, 0x9417, 0x941f, 0x942e, 0x942f, 0x9431, 0x9432, 0x9433, 0x9434, 0x943b, 0x943f, 0x943d, 0x9443, 0x9445, 0x9448, 0x944a, 0x944c, 0x9455, 0x9459, 0x945c, 0x945f, 0x9461, 0x9463, 0x9468, 0x946b, 0x946d, 0x946e, 0x946f, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579, 0x957e, 0x9584, 0x9588, 0x958c, 0x958d, 0x958e, 0x959d, 0x959e, 0x959f, 0x95a1, 0x95a6, 0x95a9, 0x95ab, 0x95ac, 0x95b4, 0x95b6, 0x95ba, 0x95bd, 0x95bf, 0x95c6, 0x95c8, 0x95c9, 0x95cb, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d9, 0x95da, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e4, 0x95e6, 0x961d, 0x961e, 0x9622, 0x9624, 0x9625, 0x9626, 0x962c, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, 0x963a, 0x963c, 0x963d, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, 0x9658, 0x9661, 0x966e, 0x9674, 0x967b, 0x967c, 0x967e, 0x967f, 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969a, 0x969d, 0x969f, 0x96a4, 0x96a5, 0x96a6, 0x96a9, 0x96ae, 0x96af, 0x96b3, 0x96ba, 0x96ca, 0x96d2, 0x5db2, 0x96d8, 0x96da, 0x96dd, 0x96de, 0x96df, 0x96e9, 0x96ef, 0x96f1, 0x96fa, 0x9702, 0x9703, 0x9705, 0x9709, 0x971a, 0x971b, 0x971d, 0x9721, 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974a, 0x974e, 0x974f, 0x9755, 0x9757, 0x9758, 0x975a, 0x975b, 0x9763, 0x9767, 0x976a, 0x976e, 0x9773, 0x9776, 0x9777, 0x9778, 0x977b, 0x977d, 0x977f, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979e, 0x979f, 0x97a2, 0x97ac, 0x97ae, 0x97b1, 0x97b2, 0x97b5, 0x97b6, 0x97b8, 0x97b9, 0x97ba, 0x97bc, 0x97be, 0x97bf, 0x97c1, 0x97c4, 0x97c5, 0x97c7, 0x97c9, 0x97ca, 0x97cc, 0x97cd, 0x97ce, 0x97d0, 0x97d1, 0x97d4, 0x97d7, 0x97d8, 0x97d9, 0x97dd, 0x97de, 0x97e0, 0x97db, 0x97e1, 0x97e4, 0x97ef, 0x97f1, 0x97f4, 0x97f7, 0x97f8, 0x97fa, 0x9807, 0x980a, 0x9819, 0x980d, 0x980e, 0x9814, 0x9816, 0x981c, 0x981e, 0x9820, 0x9823, 0x9826, 0x982b, 0x982e, 0x982f, 0x9830, 0x9832, 0x9833, 0x9835, 0x9825, 0x983e, 0x9844, 0x9847, 0x984a, 0x9851, 0x9852, 0x9853, 0x9856, 0x9857, 0x9859, 0x985a, 0x9862, 0x9863, 0x9865, 0x9866, 0x986a, 0x986c, 0x98ab, 0x98ad, 0x98ae, 0x98b0, 0x98b4, 0x98b7, 0x98b8, 0x98ba, 0x98bb, 0x98bf, 0x98c2, 0x98c5, 0x98c8, 0x98cc, 0x98e1, 0x98e3, 0x98e5, 0x98e6, 0x98e7, 0x98ea, 0x98f3, 0x98f6, 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991a, 0x991b, 0x991c, 0x991f, 0x9922, 0x9926, 0x9927, 0x992b, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993a, 0x993b, 0x993c, 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994d, 0x994e, 0x9954, 0x9958, 0x9959, 0x995b, 0x995c, 0x995e, 0x995f, 0x9960, 0x999b, 0x999d, 0x999f, 0x99a6, 0x99b0, 0x99b1, 0x99b2, 0x99b5, 0x99b9, 0x99ba, 0x99bd, 0x99bf, 0x99c3, 0x99c9, 0x99d3, 0x99d4, 0x99d9, 0x99da, 0x99dc, 0x99de, 0x99e7, 0x99ea, 0x99eb, 0x99ec, 0x99f0, 0x99f4, 0x99f5, 0x99f9, 0x99fd, 0x99fe, 0x9a02, 0x9a03, 0x9a04, 0x9a0b, 0x9a0c, 0x9a10, 0x9a11, 0x9a16, 0x9a1e, 0x9a20, 0x9a22, 0x9a23, 0x9a24, 0x9a27, 0x9a2d, 0x9a2e, 0x9a33, 0x9a35, 0x9a36, 0x9a38, 0x9a47, 0x9a41, 0x9a44, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4e, 0x9a51, 0x9a54, 0x9a56, 0x9a5d, 0x9aaa, 0x9aac, 0x9aae, 0x9aaf, 0x9ab2, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab9, 0x9abb, 0x9abe, 0x9abf, 0x9ac1, 0x9ac3, 0x9ac6, 0x9ac8, 0x9ace, 0x9ad0, 0x9ad2, 0x9ad5, 0x9ad6, 0x9ad7, 0x9adb, 0x9adc, 0x9ae0, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae9, 0x9aec, 0x9af2, 0x9af3, 0x9af5, 0x9af9, 0x9afa, 0x9afd, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b03, 0x9b04, 0x9b05, 0x9b08, 0x9b09, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10, 0x9b12, 0x9b16, 0x9b19, 0x9b1b, 0x9b1c, 0x9b20, 0x9b26, 0x9b2b, 0x9b2d, 0x9b33, 0x9b34, 0x9b35, 0x9b37, 0x9b39, 0x9b3a, 0x9b3d, 0x9b48, 0x9b4b, 0x9b4c, 0x9b55, 0x9b56, 0x9b57, 0x9b5b, 0x9b5e, 0x9b61, 0x9b63, 0x9b65, 0x9b66, 0x9b68, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b73, 0x9b75, 0x9b77, 0x9b78, 0x9b79, 0x9b7f, 0x9b80, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8d, 0x9b8f, 0x9b90, 0x9b94, 0x9b9a, 0x9b9d, 0x9b9e, 0x9ba6, 0x9ba7, 0x9ba9, 0x9bac, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb7, 0x9bb8, 0x9bbb, 0x9bbc, 0x9bbe, 0x9bbf, 0x9bc1, 0x9bc7, 0x9bc8, 0x9bce, 0x9bd0, 0x9bd7, 0x9bd8, 0x9bdd, 0x9bdf, 0x9be5, 0x9be7, 0x9bea, 0x9beb, 0x9bef, 0x9bf3, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfd, 0x9bff, 0x9c00, 0x9c02, 0x9c0b, 0x9c0f, 0x9c11, 0x9c16, 0x9c18, 0x9c19, 0x9c1a, 0x9c1c, 0x9c1e, 0x9c22, 0x9c23, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c31, 0x9c35, 0x9c36, 0x9c37, 0x9c3d, 0x9c41, 0x9c43, 0x9c44, 0x9c45, 0x9c49, 0x9c4a, 0x9c4e, 0x9c4f, 0x9c50, 0x9c53, 0x9c54, 0x9c56, 0x9c58, 0x9c5b, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c63, 0x9c69, 0x9c6a, 0x9c5c, 0x9c6b, 0x9c68, 0x9c6e, 0x9c70, 0x9c72, 0x9c75, 0x9c77, 0x9c7b, 0x9ce6, 0x9cf2, 0x9cf7, 0x9cf9, 0x9d0b, 0x9d02, 0x9d11, 0x9d17, 0x9d18, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d2f, 0x9d30, 0x9d32, 0x9d33, 0x9d34, 0x9d3a, 0x9d3c, 0x9d45, 0x9d3d, 0x9d42, 0x9d43, 0x9d47, 0x9d4a, 0x9d53, 0x9d54, 0x9d5f, 0x9d63, 0x9d62, 0x9d65, 0x9d69, 0x9d6a, 0x9d6b, 0x9d70, 0x9d76, 0x9d77, 0x9d7b, 0x9d7c, 0x9d7e, 0x9d83, 0x9d84, 0x9d86, 0x9d8a, 0x9d8d, 0x9d8e, 0x9d92, 0x9d93, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9da1, 0x9daa, 0x9dac, 0x9dae, 0x9db1, 0x9db5, 0x9db9, 0x9dbc, 0x9dbf, 0x9dc3, 0x9dc7, 0x9dc9, 0x9dca, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dda, 0x9dde, 0x9ddf, 0x9de0, 0x9de5, 0x9de7, 0x9de9, 0x9deb, 0x9dee, 0x9df0, 0x9df3, 0x9df4, 0x9dfe, 0x9e0a, 0x9e02, 0x9e07, 0x9e0e, 0x9e10, 0x9e11, 0x9e12, 0x9e15, 0x9e16, 0x9e19, 0x9e1c, 0x9e1d, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e80, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e87, 0x9e8e, 0x9e8f, 0x9e96, 0x9e98, 0x9e9b, 0x9e9e, 0x9ea4, 0x9ea8, 0x9eac, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb3, 0x9eb4, 0x9eb5, 0x9ec6, 0x9ec8, 0x9ecb, 0x9ed5, 0x9edf, 0x9ee4, 0x9ee7, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef5, 0x9ef8, 0x9eff, 0x9f02, 0x9f03, 0x9f09, 0x9f0f, 0x9f10, 0x9f11, 0x9f12, 0x9f14, 0x9f16, 0x9f17, 0x9f19, 0x9f1a, 0x9f1b, 0x9f1f, 0x9f22, 0x9f26, 0x9f2a, 0x9f2b, 0x9f2f, 0x9f31, 0x9f32, 0x9f34, 0x9f37, 0x9f39, 0x9f3a, 0x9f3c, 0x9f3d, 0x9f3f, 0x9f41, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f53, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f5a, 0x9f5d, 0x9f5e, 0x9f68, 0x9f69, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f73, 0x9f75, 0x9f7a, 0x9f7d, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f94, 0x9f96, 0x9f97, 0x9f9e, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2003, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, 0xff1f, 0xff01, 0x309b, 0x309c }; const unichar_t unicode_from_big5[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, 0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, 0x00af, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xff0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff3c, 0x2215, 0xfe68, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3, 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x3038, 0x5344, 0x303a, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02d9, 0x0000, 0x02ca, 0x02c7, 0x02cb, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405, 0x2406, 0x2407, 0x2408, 0x2409, 0x240a, 0x240b, 0x240c, 0x240d, 0x240e, 0x240f, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415, 0x2416, 0x2417, 0x2418, 0x2419, 0x241a, 0x241b, 0x241c, 0x241d, 0x241e, 0x241f, 0x2421, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e11, 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0xe05b, 0x5306, 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60c5, 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74f7, 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90e8, 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63d2, 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a97, 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9593, 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x695a, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, 0x7459, 0x745b, 0xe2a3, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8179, 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6eff, 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0xe4c5, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85, 0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 0x0000, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c36, 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, 0x9099, 0xe7d3, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6034, 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x741a, 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9689, 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6433, 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, 0x6b41, 0x6b9b, 0x0000, 0x6bfb, 0x6bfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7144, 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8144, 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9044, 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be3, 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f36, 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8024, 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x619b, 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92b5, 0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b18, 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, 0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b, 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9da0, 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0xeb45, 0x7e88, 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a49, 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f71, 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe4f, 0xffffffff, 0x00ff, 0x0000, 0x0100, 0x0002, 0x6000, 0x804f240 }; const unichar_t unicode_from_big5hkscs[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeeb8, 0xeeb9, 0xeeba, 0xeebb, 0xeebc, 0xeebd, 0xeebe, 0xeebf, 0xeec0, 0xeec1, 0xeec2, 0xeec3, 0xeec4, 0xeec5, 0xeec6, 0xeec7, 0xeec8, 0xeec9, 0xeeca, 0xeecb, 0xeecc, 0xeecd, 0xeece, 0xeecf, 0xeed0, 0xeed1, 0xeed2, 0xeed3, 0xeed4, 0xeed5, 0xeed6, 0xeed7, 0xeed8, 0xeed9, 0xeeda, 0xeedb, 0xeedc, 0xeedd, 0xeede, 0xeedf, 0xeee0, 0xeee1, 0xeee2, 0xeee3, 0xeee4, 0xeee5, 0xeee6, 0xeee7, 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xeeed, 0xeeee, 0xeeef, 0xeef0, 0xeef1, 0xeef2, 0xeef3, 0xeef4, 0xeef5, 0xeef6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeef7, 0xeef8, 0xeef9, 0xeefa, 0xeefb, 0xeefc, 0xeefd, 0xeefe, 0xeeff, 0xef00, 0xef01, 0xef02, 0xef03, 0xef04, 0xef05, 0xef06, 0xef07, 0xef08, 0xef09, 0xef0a, 0xef0b, 0xef0c, 0xef0d, 0xef0e, 0xef0f, 0xef10, 0xef11, 0xef12, 0xef13, 0xef14, 0xef15, 0xef16, 0xef17, 0xef18, 0xef19, 0xef1a, 0xef1b, 0xef1c, 0xef1d, 0xef1e, 0xef1f, 0xef20, 0xef21, 0xef22, 0xef23, 0xef24, 0xef25, 0xef26, 0xef27, 0xef28, 0xef29, 0xef2a, 0xef2b, 0xef2c, 0xef2d, 0xef2e, 0xef2f, 0xef30, 0xef31, 0xef32, 0xef33, 0xef34, 0xef35, 0xef36, 0xef37, 0xef38, 0xef39, 0xef3a, 0xef3b, 0xef3c, 0xef3d, 0xef3e, 0xef3f, 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef7f, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xefa1, 0xefa2, 0xefa3, 0xefa4, 0xefa5, 0xefa6, 0xefa7, 0xefa8, 0xefa9, 0xefaa, 0xefab, 0xefac, 0xefad, 0xefae, 0xefaf, 0xefb0, 0xefb1, 0xefb2, 0xefb3, 0xefb4, 0xefb5, 0xefb6, 0xefb7, 0xefb8, 0xefb9, 0xefba, 0xefbb, 0xefbc, 0xefbd, 0xefbe, 0xefbf, 0xefc0, 0xefc1, 0xefc2, 0xefc3, 0xefc4, 0xefc5, 0xefc6, 0xefc7, 0xefc8, 0xefc9, 0xefca, 0xefcb, 0xefcc, 0xefcd, 0xefce, 0xefcf, 0xefd0, 0xefd1, 0xefd2, 0xefd3, 0xefd4, 0xefd5, 0xefd6, 0xefd7, 0xefd8, 0xefd9, 0xefda, 0xefdb, 0xefdc, 0xefdd, 0xefde, 0xefdf, 0xefe0, 0xefe1, 0xefe2, 0xefe3, 0xefe4, 0xefe5, 0xefe6, 0xefe7, 0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec, 0xefed, 0xefee, 0xefef, 0xeff0, 0xeff1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeff2, 0xeff3, 0xeff4, 0xeff5, 0xeff6, 0xeff7, 0xeff8, 0xeff9, 0xeffa, 0xeffb, 0xeffc, 0xeffd, 0xeffe, 0xefff, 0xf000, 0xf001, 0xf002, 0xf003, 0xf004, 0xf005, 0xf006, 0xf007, 0xf008, 0xf009, 0xf00a, 0xf00b, 0xf00c, 0xf00d, 0xf00e, 0xf00f, 0xf010, 0xf011, 0xf012, 0xf013, 0xf014, 0xf015, 0xf016, 0xf017, 0xf018, 0xf019, 0xf01a, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf020, 0xf021, 0xf022, 0xf023, 0xf024, 0xf025, 0xf026, 0xf027, 0xf028, 0xf029, 0xf02a, 0xf02b, 0xf02c, 0xf02d, 0xf02e, 0xf02f, 0xf030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf031, 0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038, 0xf039, 0xf03a, 0xf03b, 0xf03c, 0xf03d, 0xf03e, 0xf03f, 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf07f, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf0a1, 0xf0a2, 0xf0a3, 0xf0a4, 0xf0a5, 0xf0a6, 0xf0a7, 0xf0a8, 0xf0a9, 0xf0aa, 0xf0ab, 0xf0ac, 0xf0ad, 0xf0ae, 0xf0af, 0xf0b0, 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xf0b6, 0xf0b7, 0xf0b8, 0xf0b9, 0xf0ba, 0xf0bb, 0xf0bc, 0xf0bd, 0xf0be, 0xf0bf, 0xf0c0, 0xf0c1, 0xf0c2, 0xf0c3, 0xf0c4, 0xf0c5, 0xf0c6, 0xf0c7, 0xf0c8, 0xf0c9, 0xf0ca, 0xf0cb, 0xf0cc, 0xf0cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf0ce, 0xf0cf, 0xf0d0, 0xf0d1, 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d7, 0xf0d8, 0xf0d9, 0xf0da, 0xf0db, 0xf0dc, 0xf0dd, 0xf0de, 0xf0df, 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf0e5, 0xf0e6, 0xf0e7, 0xf0e8, 0xf0e9, 0xf0ea, 0xf0eb, 0xf0ec, 0xf0ed, 0xf0ee, 0xf0ef, 0xf0f0, 0xf0f1, 0xf0f2, 0xf0f3, 0xf0f4, 0xf0f5, 0xf0f6, 0xf0f7, 0xf0f8, 0xf0f9, 0xf0fa, 0xf0fb, 0xf0fc, 0xf0fd, 0xf0fe, 0xf0ff, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106, 0xf107, 0xf108, 0xf109, 0xf10a, 0xf10b, 0xf10c, 0xf10d, 0xf10e, 0xf10f, 0xf110, 0xf111, 0xf112, 0xf113, 0xf114, 0xf115, 0xf116, 0xf117, 0xf118, 0xf119, 0xf11a, 0xf11b, 0xf11c, 0xf11d, 0xf11e, 0xf11f, 0xf120, 0xf121, 0xf122, 0xf123, 0xf124, 0xf125, 0xf126, 0xf127, 0xf128, 0xf129, 0xf12a, 0xf12b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf12c, 0xf12d, 0xf12e, 0xf12f, 0xf130, 0xf131, 0xf132, 0xf133, 0xf134, 0xf135, 0xf136, 0xf137, 0xf138, 0xf139, 0xf13a, 0xf13b, 0xf13c, 0xf13d, 0xf13e, 0xf13f, 0xf140, 0xf141, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf17f, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf1a1, 0xf1a2, 0xf1a3, 0xf1a4, 0xf1a5, 0xf1a6, 0xf1a7, 0xf1a8, 0xf1a9, 0xf1aa, 0xf1ab, 0xf1ac, 0xf1ad, 0xf1ae, 0xf1af, 0xf1b0, 0xf1b1, 0xf1b2, 0xf1b3, 0xf1b4, 0xf1b5, 0xf1b6, 0xf1b7, 0xf1b8, 0xf1b9, 0xf1ba, 0xf1bb, 0xf1bc, 0xf1bd, 0xf1be, 0xf1bf, 0xf1c0, 0xf1c1, 0xf1c2, 0xf1c3, 0xf1c4, 0xf1c5, 0xf1c6, 0xf1c7, 0xf1c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf1c9, 0xf1ca, 0xf1cb, 0xf1cc, 0xf1cd, 0xf1ce, 0xf1cf, 0xf1d0, 0xf1d1, 0xf1d2, 0xf1d3, 0xf1d4, 0xf1d5, 0xf1d6, 0xf1d7, 0xf1d8, 0xf1d9, 0xf1da, 0xf1db, 0xf1dc, 0xf1dd, 0xf1de, 0xf1df, 0xf1e0, 0xf1e1, 0xf1e2, 0xf1e3, 0xf1e4, 0xf1e5, 0xf1e6, 0xf1e7, 0xf1e8, 0xf1e9, 0xf1ea, 0xf1eb, 0xf1ec, 0xf1ed, 0xf1ee, 0xf1ef, 0xf1f0, 0xf1f1, 0xf1f2, 0xf1f3, 0xf1f4, 0xf1f5, 0xf1f6, 0xf1f7, 0xf1f8, 0xf1f9, 0xf1fa, 0xf1fb, 0xf1fc, 0xf1fd, 0xf1fe, 0xf1ff, 0xf200, 0xf201, 0xf202, 0xf203, 0xf204, 0xf205, 0xf206, 0xf207, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf208, 0xf209, 0xf20a, 0xf20b, 0xf20c, 0xf20d, 0xf20e, 0xf20f, 0xf210, 0xf211, 0xf212, 0xf213, 0xf214, 0xf215, 0xf216, 0xf217, 0xf218, 0xf219, 0xf21a, 0xf21b, 0xf21c, 0xf21d, 0xf21e, 0xf21f, 0xf220, 0xf221, 0xf222, 0xf223, 0xf224, 0xf225, 0xf226, 0xf227, 0xf228, 0xf229, 0xf22a, 0xf22b, 0xf22c, 0xf22d, 0xf22e, 0xf22f, 0xf230, 0xf231, 0xf232, 0xf233, 0xf234, 0xf235, 0xf236, 0xf237, 0xf238, 0xf239, 0xf23a, 0xf23b, 0xf23c, 0xf23d, 0xf23e, 0xf23f, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf27f, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf2a1, 0xf2a2, 0xf2a3, 0xf2a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf2a5, 0xf2a6, 0xf2a7, 0xf2a8, 0xf2a9, 0xf2aa, 0xf2ab, 0xf2ac, 0xf2ad, 0xf2ae, 0xf2af, 0xf2b0, 0xf2b1, 0xf2b2, 0xf2b3, 0xf2b4, 0xf2b5, 0xf2b6, 0xf2b7, 0xf2b8, 0xf2b9, 0xf2ba, 0xf2bb, 0xf2bc, 0xf2bd, 0xf2be, 0xf2bf, 0xf2c0, 0xf2c1, 0xf2c2, 0xf2c3, 0xf2c4, 0xf2c5, 0xf2c6, 0xf2c7, 0xf2c8, 0xf2c9, 0xf2ca, 0xf2cb, 0xf2cc, 0xf2cd, 0xf2ce, 0xf2cf, 0xf2d0, 0xf2d1, 0xf2d2, 0xf2d3, 0xf2d4, 0xf2d5, 0xf2d6, 0xf2d7, 0xf2d8, 0xf2d9, 0xf2da, 0xf2db, 0xf2dc, 0xf2dd, 0xf2de, 0xf2df, 0xf2e0, 0xf2e1, 0xf2e2, 0xf2e3, 0xf2e4, 0xf2e5, 0xf2e6, 0xf2e7, 0xf2e8, 0xf2e9, 0xf2ea, 0xf2eb, 0xf2ec, 0xf2ed, 0xf2ee, 0xf2ef, 0xf2f0, 0xf2f1, 0xf2f2, 0xf2f3, 0xf2f4, 0xf2f5, 0xf2f6, 0xf2f7, 0xf2f8, 0xf2f9, 0xf2fa, 0xf2fb, 0xf2fc, 0xf2fd, 0xf2fe, 0xf2ff, 0xf300, 0xf301, 0xf302, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf303, 0xf304, 0xf305, 0xf306, 0xf307, 0xf308, 0xf309, 0xf30a, 0xf30b, 0xf30c, 0xf30d, 0xf30e, 0xf30f, 0xf310, 0xf311, 0xf312, 0xf313, 0xf314, 0xf315, 0xf316, 0xf317, 0xf318, 0x0100, 0x00c1, 0x01cd, 0x00c0, 0x0112, 0x00c9, 0x011a, 0x00c8, 0x014c, 0x00d3, 0x01d1, 0x00d2, 0xf325, 0x1ebe, 0xf327, 0x1ec0, 0x00ca, 0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0251, 0x0113, 0x00e9, 0x011b, 0x00e8, 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01dc, 0x00fc, 0xf344, 0x1ebf, 0xf346, 0x1ec1, 0x00ea, 0x0261, 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf37f, 0xf380, 0xf381, 0xf382, 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a, 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a, 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf3a0, 0xf3a1, 0xf3a2, 0x650a, 0xf3a4, 0xf3a5, 0x4e3d, 0x6edd, 0x9d4e, 0x91df, 0xf3aa, 0xf3ab, 0xf3ac, 0x6491, 0x4f1a, 0x4f28, 0x4fa8, 0x5156, 0x5174, 0x519c, 0x51e4, 0x52a1, 0x52a8, 0x533b, 0x534e, 0x53d1, 0x53d8, 0x56e2, 0x58f0, 0x5904, 0x5907, 0x5932, 0x5934, 0x5b66, 0x5b9e, 0x5b9f, 0x5c9a, 0x5e86, 0x603b, 0x6589, 0x67fe, 0x6804, 0x6865, 0x6d4e, 0x70bc, 0x7535, 0x7ea4, 0x7eac, 0x7eba, 0x7ec7, 0x7ecf, 0x7edf, 0x7f06, 0x7f37, 0x827a, 0x82cf, 0x836f, 0x89c6, 0x8bbe, 0x8be2, 0x8f66, 0x8f67, 0x8f6e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7411, 0x7cfc, 0x7dcd, 0x6946, 0x7ac9, 0x5227, 0xf3e5, 0xf3e6, 0xf3e7, 0xf3e8, 0x918c, 0x78b8, 0x915e, 0x80bc, 0xf3ed, 0x8d0b, 0x80f6, 0xf3f0, 0xf3f1, 0xf3f2, 0x809f, 0x9ec7, 0x4ccd, 0x9dc9, 0x9e0c, 0x4c3e, 0xf3f9, 0xf3fa, 0x9e0a, 0xf3fc, 0x35c1, 0xf3fe, 0x6e9a, 0x823e, 0x7519, 0xf402, 0x4911, 0x9a6c, 0x9a8f, 0x9f99, 0x7987, 0xf408, 0xf409, 0xf40a, 0xf40b, 0x4e24, 0x4e81, 0x4e80, 0x4e87, 0x4ebf, 0x4eeb, 0x4f37, 0x344c, 0x4fbd, 0x3e48, 0x5003, 0x5088, 0x347d, 0x3493, 0x34a5, 0x5186, 0x5905, 0x51db, 0x51fc, 0x5205, 0x4e89, 0x5279, 0x5290, 0x5327, 0x35c7, 0x53a9, 0x3551, 0x53b0, 0x3553, 0x53c2, 0x5423, 0x356d, 0x3572, 0x3681, 0x5493, 0x54a3, 0x54b4, 0x54b9, 0x54d0, 0x54ef, 0x5518, 0x5523, 0x5528, 0x3598, 0x553f, 0x35a5, 0x35bf, 0x55d7, 0x35c5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf43d, 0x5525, 0xf43f, 0xf440, 0xf441, 0xf442, 0x5590, 0xf444, 0x39ec, 0xf446, 0x8e46, 0xf448, 0xf449, 0x4053, 0xf44b, 0x777a, 0xf44d, 0x3a34, 0x47d5, 0xf450, 0xf451, 0xf452, 0x64dd, 0xf454, 0xf455, 0xf456, 0xf457, 0x648d, 0x8e7e, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0x47f4, 0xf465, 0xf466, 0x9ab2, 0x3a67, 0xf469, 0x3fed, 0x3506, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0x9d6e, 0x9815, 0xf472, 0x43d9, 0xf474, 0x64b4, 0x54e3, 0xf477, 0xf478, 0xf479, 0x39fb, 0xf47b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf47c, 0xf47d, 0xf47e, 0x64ea, 0xf480, 0xf481, 0x8e68, 0xf483, 0xf484, 0xf485, 0xf486, 0x480b, 0xf488, 0x3ffa, 0x5873, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0x5579, 0x40bb, 0x43ba, 0xf495, 0x4ab4, 0xf497, 0xf498, 0x81aa, 0x98f5, 0xf49b, 0x6379, 0x39fe, 0xf49e, 0x8dc0, 0x56a1, 0x647c, 0x3e43, 0xf4a3, 0xf4a4, 0xf4a5, 0xf4a6, 0xf4a7, 0xf4a8, 0xf4a9, 0xf4aa, 0x3992, 0x3a06, 0xf4ad, 0x3578, 0xf4af, 0xf4b0, 0x5652, 0xf4b2, 0xf4b3, 0xf4b4, 0x34bc, 0x6c3d, 0xf4b7, 0xf4b8, 0xf4b9, 0xf4ba, 0xf4bb, 0xf4bc, 0xf4bd, 0xf4be, 0xf4bf, 0xf4c0, 0xf4c1, 0x7f93, 0xf4c3, 0xf4c4, 0xf4c5, 0x35fb, 0xf4c7, 0xf4c8, 0xf4c9, 0xf4ca, 0x3f93, 0xf4cc, 0xf4cd, 0xf4ce, 0xf4cf, 0xf4d0, 0xf4d1, 0xf4d2, 0xf4d3, 0xf4d4, 0xf4d5, 0x3ff9, 0xf4d7, 0x6432, 0xf4d9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf4da, 0xf4db, 0xf4dc, 0xf4dd, 0xf4de, 0xf4df, 0xf4e0, 0x3a18, 0xf4e2, 0xf4e3, 0xf4e4, 0xf4e5, 0xf4e6, 0xf4e7, 0xf4e8, 0xf4e9, 0x95aa, 0x54cc, 0x82c4, 0x55b9, 0xf4ee, 0xf4ef, 0x9c26, 0x9ab6, 0xf4f2, 0xf4f3, 0x7140, 0x816d, 0x80ec, 0x5c1c, 0xf4f8, 0x8134, 0x3797, 0x535f, 0xf4fc, 0x91b6, 0xf4fe, 0xf4ff, 0xf500, 0xf501, 0x35dd, 0xf503, 0x3609, 0xf505, 0x56af, 0xf507, 0xf508, 0xf509, 0xf50a, 0xf50b, 0xf50c, 0xf50d, 0xf50e, 0xf50f, 0xf510, 0xf511, 0x5a54, 0xf513, 0xf514, 0xf515, 0xf516, 0x579c, 0xf518, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf519, 0xf51a, 0xf51b, 0xf51c, 0xf51d, 0x3703, 0xf51f, 0xf520, 0xf521, 0xf522, 0xf523, 0xf524, 0xf525, 0xf526, 0x5899, 0x5268, 0x361a, 0xf52a, 0x7bb2, 0x5b68, 0x4800, 0x4b2c, 0x9f27, 0x49e7, 0x9c1f, 0x9b8d, 0xf533, 0xf534, 0x55fb, 0x35f2, 0x5689, 0x4e28, 0x5902, 0xf53a, 0xf53b, 0x9751, 0xf53d, 0x4e5b, 0x4ebb, 0x353e, 0x5c23, 0x5f51, 0x5fc4, 0x38fa, 0x624c, 0x6535, 0x6b7a, 0x6c35, 0x6c3a, 0x706c, 0x722b, 0x4e2c, 0x72ad, 0xf54e, 0x7f52, 0x793b, 0x7cf9, 0x7f53, 0xf553, 0x34c1, 0xf555, 0xf556, 0x8002, 0x8080, 0xf559, 0xf55a, 0x535d, 0x8864, 0x89c1, 0xf55e, 0x8ba0, 0x8d1d, 0x9485, 0x9578, 0x957f, 0x95e8, 0xf565, 0x97e6, 0x9875, 0x98ce, 0x98de, 0x9963, 0xf56b, 0x9c7c, 0x9e1f, 0x9ec4, 0x6b6f, 0xf907, 0x4e37, 0xf572, 0x961d, 0x6237, 0x94a2, 0xf576, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x503b, 0x6dfe, 0xf579, 0xf57a, 0x3dc9, 0x888f, 0xf57d, 0x7077, 0x5cf5, 0x4b20, 0xf581, 0x3559, 0xf583, 0x6122, 0xf585, 0x8fa7, 0x91f6, 0x7191, 0x6719, 0x73ba, 0xf58b, 0xf58c, 0x3c8b, 0xf58e, 0x4b10, 0x78e4, 0x7402, 0x51ae, 0xf593, 0x4009, 0x6a63, 0xf596, 0x4223, 0x860f, 0xf599, 0x7a2a, 0xf59b, 0xf59c, 0x9755, 0x704d, 0x5324, 0xf5a0, 0x93f4, 0x76d9, 0xf5a3, 0xf5a4, 0x77dd, 0x4ea3, 0x4ff0, 0x50bc, 0x4e2f, 0x4f17, 0xf5ab, 0x5434, 0x7d8b, 0x5892, 0x58d0, 0xf5b0, 0x5e92, 0x5e99, 0x5fc2, 0xf5b4, 0x658b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf5b6, 0x6919, 0x6a43, 0xf5b9, 0x6cff, 0xf5bb, 0x7200, 0xf5bd, 0x738c, 0x3edb, 0xf5c0, 0x5b15, 0x74b9, 0x8b83, 0xf5c4, 0xf5c5, 0x7a93, 0x7bec, 0x7cc3, 0x7e6c, 0x82f8, 0x8597, 0xf5cc, 0x8890, 0xf5ce, 0x8eb9, 0xf5d0, 0x8fcf, 0x855f, 0x99e0, 0x9221, 0xf5d5, 0xf5d6, 0xf5d7, 0x4071, 0x42a2, 0x5a1a, 0xf5db, 0xf5dc, 0xf5dd, 0x9868, 0x676b, 0x4276, 0x573d, 0xf5e2, 0x85d6, 0xf5e4, 0x82bf, 0xf5e6, 0x4c81, 0xf5e8, 0x5d7b, 0xf5ea, 0xf5eb, 0xf5ec, 0xf5ed, 0x5b96, 0xf5ef, 0xf5f0, 0x7e5b, 0xf5f2, 0xf5f3, 0xf5f4, 0xf5f5, 0xf5f6, 0xf5f7, 0xf5f8, 0xf5f9, 0xf5fa, 0xf5fb, 0xf5fc, 0xf5fd, 0xf5fe, 0xf5ff, 0xf600, 0xf601, 0xf602, 0xf603, 0xf604, 0xf605, 0xf606, 0xf607, 0xf608, 0xf609, 0xf60a, 0xf60b, 0xf60c, 0xf60d, 0xf60e, 0xf60f, 0xf610, 0xf611, 0xf612, 0xf613, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf614, 0xf615, 0xf616, 0xf617, 0xf618, 0xf619, 0xf61a, 0xf61b, 0xf61c, 0xf61d, 0xf61e, 0xf61f, 0xf620, 0xf621, 0xf622, 0xf623, 0xf624, 0xf625, 0xf626, 0xf627, 0xf628, 0xf629, 0xf62a, 0xf62b, 0xf62c, 0xf62d, 0xf62e, 0xf62f, 0xf630, 0xf631, 0xf632, 0xf633, 0x5d3e, 0x5d48, 0x5d56, 0x3dfc, 0x380f, 0x5da4, 0x5db9, 0x3820, 0x3838, 0x5e42, 0x5ebd, 0x5f25, 0x5f83, 0x3908, 0x3914, 0x393f, 0x394d, 0x60d7, 0x613d, 0x5ce5, 0x3989, 0x61b7, 0x61b9, 0x61cf, 0x39b8, 0x622c, 0x6290, 0x62e5, 0x6318, 0x39f8, 0x56b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3a03, 0x63e2, 0x63fb, 0x6407, 0x645a, 0x3a4b, 0x64c0, 0x5d15, 0x5621, 0x9f9f, 0x3a97, 0x6586, 0x3abd, 0x65ff, 0x6653, 0x3af2, 0x6692, 0x3b22, 0x6716, 0x3b42, 0x67a4, 0x6800, 0x3b58, 0x684a, 0x6884, 0x3b72, 0x3b71, 0x3b7b, 0x6909, 0x6943, 0x725c, 0x6964, 0x699f, 0x6985, 0x3bbc, 0x69d6, 0x3bdd, 0x6a65, 0x6a74, 0x6a71, 0x6a82, 0x3bec, 0x6a99, 0x3bf2, 0x6aab, 0x6ab5, 0x6ad4, 0x6af6, 0x6b81, 0x6bc1, 0x6bea, 0x6c75, 0x6caa, 0x3ccb, 0x6d02, 0x6d06, 0x6d26, 0x6d81, 0x3cef, 0x6da4, 0x6db1, 0x6e15, 0x6e18, 0x6e29, 0x6e86, 0xf694, 0x6ebb, 0x6ee2, 0x6eda, 0x9f7f, 0x6ee8, 0x6ee9, 0x6f24, 0x6f34, 0x3d46, 0xf69e, 0x6f81, 0x6fbe, 0x3d6a, 0x3d75, 0x71b7, 0x5c99, 0x3d8a, 0x702c, 0x3d91, 0x7050, 0x7054, 0x706f, 0x707f, 0x7089, 0xf6ad, 0x43c1, 0x35f1, 0xf6b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe311, 0x57be, 0xe313, 0x713e, 0xe315, 0x364e, 0x69a2, 0xe318, 0x5b74, 0x7a49, 0xe31b, 0xe31c, 0x7a65, 0x7a7d, 0xe31f, 0x7abb, 0x7ab0, 0x7ac2, 0x7ac3, 0x71d1, 0xe325, 0x41ca, 0x7ada, 0x7add, 0x7aea, 0x41ef, 0x54b2, 0xe32c, 0x7b0b, 0x7b55, 0x7b29, 0xe330, 0xe331, 0x7ba2, 0x7b6f, 0x839c, 0xe335, 0xe336, 0x7bd0, 0x8421, 0x7b92, 0x7bb8, 0xe33b, 0x3dad, 0xe33d, 0x8492, 0x7bfa, 0x7c06, 0x7c35, 0xe342, 0x7c44, 0x7c83, 0xe345, 0x7ca6, 0x667d, 0xe348, 0x7cc9, 0x7cc7, 0x7ce6, 0x7c74, 0x7cf3, 0x7cf5, 0x7cce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e67, 0x451d, 0xe352, 0x7d5d, 0xe354, 0x748d, 0x7d89, 0x7dab, 0x7135, 0x7db3, 0x7dd2, 0xe35b, 0xe35c, 0x7de4, 0x3d13, 0x7df5, 0xe360, 0x7de5, 0xe362, 0x7e1d, 0xe364, 0xe365, 0x7e6e, 0x7e92, 0x432b, 0x946c, 0x7e27, 0x7f40, 0x7f41, 0x7f47, 0x7936, 0xe36f, 0x99e1, 0x7f97, 0xe372, 0x7fa3, 0xe374, 0xe375, 0x455c, 0xe377, 0x4503, 0xe379, 0x7ffa, 0xe37b, 0x8005, 0x8008, 0x801d, 0x8028, 0x802f, 0xe381, 0xe382, 0x803b, 0x803c, 0x8061, 0xe386, 0x4989, 0xe388, 0xe389, 0xe38a, 0x6725, 0x80a7, 0xe38d, 0x8107, 0x811a, 0x58b0, 0xe391, 0x6c7f, 0xe393, 0xe394, 0x64e7, 0xe396, 0x8218, 0xe398, 0x6a53, 0xe39a, 0xe39b, 0x447a, 0x8229, 0xe39e, 0xe39f, 0xe3a0, 0x4ff9, 0xe3a2, 0x84e2, 0x8362, 0xe3a5, 0xe3a6, 0xe3a7, 0xe3a8, 0xe3a9, 0x82aa, 0x691b, 0xe3ac, 0x41db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x854b, 0x82d0, 0x831a, 0xe3b1, 0xe3b2, 0x36c1, 0xe3b4, 0xe3b5, 0x827b, 0x82e2, 0x8318, 0xe3b9, 0xe3ba, 0xe3bb, 0xe3bc, 0xe3bd, 0x3dbf, 0x831d, 0x55ec, 0x8385, 0x450b, 0xe3c3, 0x83ac, 0x83c1, 0x83d3, 0x347e, 0xe3c8, 0x6a57, 0x855a, 0x3496, 0xe3cc, 0xe3cd, 0x8458, 0xe3cf, 0x8471, 0x3dd3, 0x44e4, 0x6aa7, 0x844a, 0xe3d5, 0x7958, 0x84a8, 0xe3d8, 0xe3d9, 0xe3da, 0x84de, 0x840f, 0x8391, 0x44a0, 0x8493, 0x84e4, 0xe3e1, 0x4240, 0xe3e3, 0x4543, 0x8534, 0x5af2, 0xe3e7, 0x4527, 0x8573, 0x4516, 0x67bf, 0x8616, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe3ed, 0xe3ee, 0x85c1, 0xe3f0, 0x8602, 0xe3f2, 0xe3f3, 0xe3f4, 0x456a, 0x8628, 0x3648, 0xe3f8, 0x53f7, 0xe3fa, 0x867e, 0x8771, 0xe3fd, 0x87ee, 0xe3ff, 0x87b1, 0x87da, 0x880f, 0x5661, 0x866c, 0x6856, 0x460f, 0x8845, 0x8846, 0xe409, 0xe40a, 0xe40b, 0x885e, 0x889c, 0x465b, 0x88b4, 0x88b5, 0x63c1, 0x88c5, 0x7777, 0xe414, 0x8987, 0x898a, 0x89a6, 0x89a9, 0x89a7, 0x89bc, 0xe41b, 0x89e7, 0xe41d, 0xe41e, 0x8a9c, 0x7793, 0x91fe, 0x8a90, 0xe423, 0x7ae9, 0xe425, 0xe426, 0x4713, 0xe428, 0x717c, 0x8b0c, 0x8b1f, 0xe42c, 0xe42d, 0x8b3f, 0x8b4c, 0x8b4d, 0x8aa9, 0xe432, 0x8b90, 0x8b9b, 0x8aaf, 0xe436, 0x4615, 0x884f, 0x8c9b, 0xe43a, 0xe43b, 0xe43c, 0x3725, 0xe43e, 0x8cd6, 0xe440, 0xe441, 0x8d12, 0x8d03, 0xe444, 0x8cdb, 0x705c, 0x8d11, 0xe448, 0x3ed0, 0x8d77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8da9, 0xe44c, 0xe44d, 0xe44e, 0x3b7c, 0xe450, 0xe451, 0x7ae7, 0x8ead, 0x8eb6, 0x8ec3, 0x92d4, 0x8f19, 0x8f2d, 0xe459, 0xe45a, 0x8fa5, 0x9303, 0xe45d, 0xe45e, 0x8fb3, 0x492a, 0xe461, 0xe462, 0xe463, 0x5ef8, 0xe465, 0x8ff9, 0xe467, 0xe468, 0xe469, 0xe46a, 0x3980, 0xe46c, 0x9037, 0xe46e, 0xe46f, 0x9061, 0xe471, 0xe472, 0x90a8, 0xe474, 0x90c4, 0xe476, 0x90ae, 0x90fd, 0x9167, 0x3af0, 0x91a9, 0x91c4, 0x7cac, 0xe47e, 0xe47f, 0x920e, 0x6c9f, 0x9241, 0x9262, 0xe484, 0x92b9, 0xe486, 0xe487, 0xe488, 0xe489, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe48a, 0x932c, 0x936b, 0xe48d, 0xe48e, 0x708f, 0x5ac3, 0xe491, 0xe492, 0x4965, 0x9244, 0xe495, 0xe496, 0xe497, 0x9373, 0x945b, 0x8ebc, 0x9585, 0x95a6, 0x9426, 0x95a0, 0x6ff6, 0x42b9, 0xe4a1, 0xe4a2, 0xe4a3, 0xe4a4, 0x49df, 0x6c1c, 0x967b, 0x9696, 0x416c, 0x96a3, 0xe4ab, 0x61da, 0x96b6, 0x78f5, 0xe4af, 0x96bd, 0x53cc, 0x49a1, 0xe4b3, 0xe4b4, 0xe4b5, 0xe4b6, 0xe4b7, 0xe4b8, 0xe4b9, 0xe4ba, 0x9731, 0x8642, 0x9736, 0x4a0f, 0x453d, 0x4585, 0xe4c1, 0x7075, 0x5b41, 0x971b, 0x975c, 0xe4c6, 0x9757, 0x5b4a, 0xe4c9, 0x975f, 0x9425, 0x50d0, 0xe4cd, 0xe4ce, 0x9789, 0x979f, 0x97b1, 0x97be, 0x97c0, 0x97d2, 0x97e0, 0xe4d6, 0x97ee, 0x741c, 0xe4d9, 0x97ff, 0x97f5, 0xe4dc, 0xe4dd, 0x4ad1, 0x9834, 0x9833, 0x984b, 0x9866, 0x3b0e, 0xe4e4, 0x3d51, 0xe4e6, 0xe4e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe4e8, 0x98ca, 0x98b7, 0x98c8, 0x98c7, 0x4aff, 0xe4ee, 0xe4ef, 0x55b0, 0x98e1, 0x98e6, 0x98ec, 0x9378, 0x9939, 0xe4f6, 0x4b72, 0xe4f8, 0xe4f9, 0x99f5, 0x9a0c, 0x9a3b, 0x9a10, 0x9a58, 0xe4ff, 0x36c4, 0xe501, 0xe502, 0x9ae0, 0x9ae2, 0xe505, 0x9af4, 0x4c0e, 0x9b14, 0x9b2d, 0xe50a, 0x5034, 0x9b34, 0xe50d, 0x38c3, 0xe50f, 0x9b50, 0x9b40, 0xe512, 0x5a45, 0xe514, 0x9b8e, 0xe516, 0x9c02, 0x9bff, 0x9c0c, 0xe51a, 0x9dd4, 0xe51c, 0xe51d, 0xe51e, 0xe51f, 0xe520, 0xe521, 0x9d7e, 0x9d83, 0xe524, 0x9e0e, 0x6888, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9dc4, 0xe528, 0xe529, 0xe52a, 0xe52b, 0xe52c, 0x9d39, 0xe52e, 0xe52f, 0x9e90, 0x9e95, 0x9e9e, 0x9ea2, 0x4d34, 0x9eaa, 0x9eaf, 0xe537, 0x9ec1, 0x3b60, 0x39e5, 0x3d1d, 0x4f32, 0x37be, 0xe53e, 0x9f02, 0x9f08, 0x4b96, 0x9424, 0xe543, 0x9f17, 0x9f16, 0x9f39, 0x569f, 0x568a, 0x9f45, 0x99b8, 0xe54b, 0x97f2, 0x847f, 0x9f62, 0x9f69, 0x7adc, 0x9f8e, 0x7216, 0x4bbe, 0xe554, 0xe555, 0x7177, 0xe557, 0xe558, 0xe559, 0x739e, 0xe55b, 0xe55c, 0x799f, 0xe55e, 0xe55f, 0x9369, 0x93f3, 0xe562, 0x92ec, 0x9381, 0x93cb, 0xe566, 0xe567, 0x7217, 0x3eeb, 0x7772, 0x7a43, 0x70d0, 0xe56d, 0xe56e, 0x717e, 0xe570, 0x70a3, 0xe572, 0xe573, 0x3ec7, 0xe575, 0xe576, 0xe577, 0x3722, 0xe579, 0xe57a, 0x36e1, 0xe57c, 0xe57d, 0xe57e, 0x3723, 0xe580, 0x575b, 0xe582, 0xe583, 0xe584, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe585, 0xe586, 0x8503, 0xe588, 0x8503, 0x8455, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0x44f4, 0xe592, 0xe593, 0xe594, 0x67f9, 0x3733, 0x3c15, 0x3de7, 0x586c, 0xe59a, 0x6810, 0x4057, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe5a1, 0x54cb, 0x569e, 0xe5a4, 0x5692, 0xe5a6, 0xe5a7, 0xe5a8, 0x93c6, 0xe5aa, 0x939c, 0x4ef8, 0x512b, 0x3819, 0xe5af, 0x4ebc, 0xe5b1, 0xe5b2, 0x4f4b, 0x4f8a, 0xe5b5, 0x5a68, 0xe5b7, 0xe5b8, 0x3999, 0xe5ba, 0xe5bb, 0x3435, 0x4f29, 0xe5be, 0xe5bf, 0xe5c0, 0x8ada, 0xe5c2, 0x4e98, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x50cd, 0x510d, 0x4fa2, 0x4f03, 0xe5c8, 0xe5c9, 0x4f42, 0x502e, 0x506c, 0x5081, 0x4fcc, 0x4fe5, 0x5058, 0x50fc, 0x5159, 0x515b, 0x515d, 0x515e, 0x6e76, 0xe5d7, 0xe5d8, 0xe5d9, 0x6d72, 0xe5db, 0xe5dc, 0x51a8, 0x51c3, 0xe5df, 0x44dd, 0xe5e1, 0xe5e2, 0xe5e3, 0x8d7a, 0xe5e5, 0xe5e6, 0x5259, 0x52a4, 0xe5e9, 0x52e1, 0x936e, 0x467a, 0x718c, 0xe5ee, 0xe5ef, 0xe5f0, 0xe5f1, 0x69d1, 0xe5f3, 0x7479, 0x3ede, 0x7499, 0x7414, 0x7456, 0x7398, 0x4b8e, 0xe5fb, 0xe5fc, 0x53d0, 0x3584, 0x720f, 0xe600, 0x55b4, 0xe602, 0x54cd, 0xe604, 0x571d, 0x925d, 0x96f4, 0x9366, 0x57dd, 0x578d, 0x577f, 0x363e, 0x58cb, 0x5a99, 0xe60f, 0xe610, 0xe611, 0xe612, 0x5a2c, 0x59b8, 0x928f, 0x5a7e, 0x5acf, 0x5a12, 0xe619, 0xe61a, 0xe61b, 0xe61c, 0x36f5, 0x6d05, 0x7443, 0x5a21, 0xe621, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a81, 0xe623, 0xe624, 0x93e0, 0x748c, 0xe627, 0x7105, 0x4972, 0x9408, 0xe62b, 0x93bd, 0x37a0, 0x5c1e, 0x5c9e, 0x5e5e, 0x5e48, 0xe632, 0xe633, 0xe634, 0x5ecd, 0x5b4f, 0xe637, 0xe638, 0x3701, 0xe63a, 0x36dd, 0xe63c, 0x36d3, 0x812a, 0xe63f, 0xe640, 0xe641, 0xe642, 0x5f0c, 0x5f0e, 0xe645, 0xe646, 0x5a6b, 0xe648, 0x5b44, 0x8614, 0xe64b, 0x8860, 0x607e, 0xe64e, 0xe64f, 0x5fdb, 0x3eb8, 0xe652, 0xe653, 0xe654, 0xe655, 0x61c0, 0xe657, 0xe658, 0xe659, 0x6199, 0x6198, 0x6075, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6471, 0xe662, 0xe663, 0x3a29, 0xe665, 0xe666, 0xe667, 0xe668, 0x6337, 0xe66a, 0x64b6, 0x6331, 0x63d1, 0xe66e, 0xe66f, 0x62a4, 0xe671, 0x643b, 0x656b, 0x6972, 0x3bf4, 0xe676, 0xe677, 0xe678, 0xe679, 0x550d, 0xe67b, 0xe67c, 0xe67d, 0x66ce, 0xe67f, 0xe680, 0x3ae0, 0x4190, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0x78ee, 0xe68a, 0xe68b, 0xe68c, 0x3464, 0xe68e, 0xe68f, 0xe690, 0x668e, 0xe692, 0x666b, 0x4b93, 0x6630, 0xe696, 0xe697, 0x6663, 0xe699, 0xe69a, 0x661e, 0xe69c, 0x38d1, 0xe69e, 0xe69f, 0x3b99, 0xe6a1, 0xe6a2, 0x74d0, 0x3b96, 0x678f, 0xe6a6, 0x68b6, 0x681e, 0x3bc4, 0x6abe, 0x3863, 0xe6ac, 0xe6ad, 0x6a33, 0x6a52, 0x6ac9, 0x6b05, 0xe6b2, 0x6511, 0x6898, 0x6a4c, 0x3bd7, 0x6a7a, 0x6b57, 0xe6b9, 0xe6ba, 0x93a0, 0x92f2, 0xe6bd, 0xe6be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9289, 0xe6c0, 0xe6c1, 0x9467, 0x6da5, 0x6f0b, 0xe6c5, 0x6d67, 0xe6c7, 0x3d8f, 0x6e04, 0xe6ca, 0x5a3d, 0x6e0a, 0x5847, 0x6d24, 0x7842, 0x713b, 0xe6d1, 0xe6d2, 0x70f1, 0x7250, 0x7287, 0x7294, 0xe6d7, 0xe6d8, 0x5179, 0xe6da, 0xe6db, 0x747a, 0xe6dd, 0xe6de, 0xe6df, 0xe6e0, 0xe6e1, 0x3f06, 0x3eb1, 0xe6e4, 0xe6e5, 0xe6e6, 0x60a7, 0x3ef3, 0x74cc, 0x743c, 0x9387, 0x7437, 0x449f, 0xe6ee, 0x4551, 0x7583, 0x3f63, 0xe6f2, 0xe6f3, 0x3f58, 0x7555, 0x7673, 0xe6f7, 0x3b19, 0x7468, 0xe6fa, 0xe6fb, 0xe6fc, 0x3afb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3dcd, 0xe6ff, 0x3eff, 0xe701, 0xe702, 0x91fa, 0x5732, 0x9342, 0xe706, 0xe707, 0x50df, 0xe709, 0xe70a, 0x7778, 0xe70c, 0x770e, 0x770f, 0x777b, 0xe710, 0xe711, 0x3a5e, 0xe713, 0x7438, 0x749b, 0x3ebf, 0xe717, 0xe718, 0x40c8, 0xe71a, 0xe71b, 0x9307, 0xe71d, 0x781e, 0x788d, 0x7888, 0x78d2, 0x73d0, 0x7959, 0xe724, 0xe725, 0x410e, 0x799b, 0x8496, 0x79a5, 0x6a2d, 0xe72b, 0x7a3a, 0x79f4, 0x416e, 0xe72f, 0x4132, 0x9235, 0x79f1, 0xe733, 0xe734, 0xe735, 0xe736, 0xe737, 0x3597, 0x556b, 0x3570, 0x36aa, 0xe73c, 0xe73d, 0x7ae2, 0x5a59, 0xe740, 0xe741, 0xe742, 0x5a0d, 0xe744, 0x78f0, 0x5a2a, 0xe747, 0x7afe, 0x41f9, 0x7c5d, 0x7c6d, 0x4211, 0xe74d, 0xe74e, 0xe74f, 0x7ccd, 0xe751, 0xe752, 0x7c8e, 0x7c7c, 0x7cae, 0x6ab2, 0x7ddc, 0x7e07, 0x7dd3, 0x7f4e, 0xe75b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe75c, 0xe75d, 0x7d97, 0xe75f, 0x426a, 0xe761, 0xe762, 0x67d6, 0xe764, 0xe765, 0x57c4, 0xe767, 0xe768, 0xe769, 0x7fdd, 0x7b27, 0xe76c, 0xe76d, 0xe76e, 0x7b0c, 0xe770, 0x99e6, 0x8645, 0x9a63, 0x6a1c, 0xe775, 0x39e2, 0xe777, 0xe778, 0x9a1f, 0xe77a, 0x8480, 0xe77c, 0xe77d, 0x44ea, 0x8137, 0x4402, 0x80c6, 0x8109, 0x8142, 0xe784, 0x98c3, 0xe786, 0x8262, 0x8265, 0xe789, 0x8453, 0xe78b, 0x8610, 0xe78d, 0x5a86, 0x417f, 0xe790, 0x5b2b, 0xe792, 0x5ae4, 0xe794, 0x86a0, 0xe796, 0xe797, 0x882d, 0xe799, 0x5a02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886e, 0x4f45, 0x8887, 0x88bf, 0x88e6, 0x8965, 0x894d, 0xe7a2, 0x8954, 0xe7a4, 0xe7a5, 0xe7a6, 0xe7a7, 0xe7a8, 0xe7a9, 0x3ead, 0x84a3, 0x46f5, 0x46cf, 0x37f2, 0x8a3d, 0x8a1c, 0xe7b1, 0x5f4d, 0x922b, 0xe7b4, 0x65d4, 0x7129, 0x70c4, 0xe7b8, 0x9d6d, 0x8c9f, 0x8ce9, 0xe7bc, 0x599a, 0x77c3, 0x59f0, 0x436e, 0x36d4, 0x8e2a, 0x8ea7, 0xe7c4, 0x8f30, 0x8f4a, 0x42f4, 0x6c58, 0x6fbb, 0xe7ca, 0x489b, 0x6f79, 0x6e8b, 0xe7ce, 0x9be9, 0x36b5, 0xe7d1, 0x90bb, 0x9097, 0x5571, 0x4906, 0x91bb, 0x9404, 0xe7d8, 0x4062, 0xe7da, 0x9427, 0xe7dc, 0xe7dd, 0x84e5, 0x8a2b, 0x9599, 0x95a7, 0x9597, 0x9596, 0xe7e4, 0x7445, 0x3ec2, 0xe7e7, 0xe7e8, 0xe7e9, 0x3ee7, 0xe7eb, 0x968f, 0xe7ed, 0xe7ee, 0xe7ef, 0x3ecc, 0xe7f1, 0xe7f2, 0xe7f3, 0x7412, 0x746b, 0x3efc, 0x9741, 0xe7f8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6847, 0x4a1d, 0xe7fb, 0xe7fc, 0x975d, 0x9368, 0xe7ff, 0xe800, 0xe801, 0xe802, 0x92ba, 0x5b11, 0x8b69, 0x493c, 0x73f9, 0xe808, 0x979b, 0x9771, 0x9938, 0xe80c, 0x5dc1, 0xe80e, 0xe80f, 0x981f, 0xe811, 0x92f6, 0xe813, 0x91e5, 0x44c0, 0xe816, 0xe817, 0xe818, 0x98dc, 0xe81a, 0x3f00, 0x922a, 0x4925, 0x8414, 0x993b, 0x994d, 0xe821, 0x3dfd, 0x999b, 0x4b6f, 0x99aa, 0x9a5c, 0xe827, 0xe828, 0x6a8f, 0x9a21, 0x5afe, 0x9a2f, 0xe82d, 0x4b90, 0xe82f, 0x99bc, 0x4bbd, 0x4b97, 0x937d, 0x5872, 0xe835, 0x5822, 0xe837, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe838, 0x7844, 0xe83a, 0xe83b, 0x68c5, 0x3d7d, 0x9458, 0x3927, 0x6150, 0xe841, 0xe842, 0x6107, 0x9c4f, 0x9c53, 0x9c7b, 0x9c35, 0x9c10, 0x9b7f, 0x9bcf, 0xe84b, 0x9b9f, 0xe84d, 0xe84e, 0x9d21, 0x4cae, 0xe851, 0x9e18, 0x4cb0, 0x9d0c, 0xe855, 0xe856, 0xe857, 0xe858, 0x9da5, 0x84bd, 0xe85b, 0xe85c, 0xe85d, 0x85fc, 0x4533, 0xe860, 0xe861, 0xe862, 0x8420, 0x85ee, 0xe865, 0xe866, 0xe867, 0x79e2, 0xe869, 0xe86a, 0x492d, 0xe86c, 0x3d62, 0x93db, 0x92be, 0x9348, 0xe871, 0x78b9, 0x9277, 0x944d, 0x4fe4, 0x3440, 0x9064, 0xe878, 0x783d, 0x7854, 0x78b6, 0x784b, 0xe87d, 0xe87e, 0xe87f, 0x369a, 0x4f72, 0x6fda, 0x6fd9, 0x701e, 0x701e, 0x5414, 0xe887, 0x57bb, 0x58f3, 0x578a, 0x9d16, 0x57d7, 0x7134, 0x34af, 0xe88f, 0x71eb, 0xe891, 0xe892, 0x5b28, 0xe894, 0xe895, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x610c, 0x5ace, 0x5a0b, 0x42bc, 0xe89a, 0x372c, 0x4b7b, 0xe89d, 0x93bb, 0x93b8, 0xe8a0, 0xe8a1, 0x8472, 0xe8a3, 0xe8a4, 0xe8a5, 0xe8a6, 0xe8a7, 0x5994, 0xe8a9, 0xe8aa, 0x7da8, 0xe8ac, 0xe8ad, 0xe8ae, 0xe8af, 0xe8b0, 0x92e5, 0x73e2, 0x3ee9, 0x74b4, 0xe8b5, 0xe8b6, 0x3ee1, 0xe8b8, 0x6ad8, 0x73f3, 0x73fb, 0x3ed6, 0xe8bd, 0xe8be, 0xe8bf, 0xe8c0, 0xe8c1, 0xe8c2, 0xe8c3, 0x7448, 0xe8c5, 0x70a5, 0xe8c7, 0x9284, 0x73e6, 0x935f, 0xe8cb, 0x9331, 0xe8cd, 0xe8ce, 0x9386, 0xe8d0, 0xe8d1, 0x4935, 0xe8d3, 0x716b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe8d5, 0xe8d6, 0x56a4, 0xe8d8, 0xe8d9, 0xe8da, 0x5502, 0x79c4, 0xe8dd, 0x7dfe, 0xe8df, 0xe8e0, 0xe8e1, 0x452e, 0x9401, 0x370a, 0xe8e5, 0xe8e6, 0x59b0, 0xe8e8, 0xe8e9, 0xe8ea, 0x5aa1, 0x36e2, 0xe8ed, 0x36b0, 0x925f, 0x5a79, 0xe8f1, 0xe8f2, 0x9374, 0x3ccd, 0xe8f5, 0x4a96, 0x398a, 0x50f4, 0x3d69, 0x3d4c, 0xe8fb, 0x7175, 0x42fb, 0xe8fe, 0x6e0f, 0xe900, 0x44eb, 0x6d57, 0xe903, 0x7067, 0x6caf, 0x3cd6, 0xe907, 0xe908, 0x6e02, 0x6f0c, 0x3d6f, 0xe90c, 0x7551, 0x36bc, 0x34c8, 0x4680, 0x3eda, 0x4871, 0x59c4, 0x926e, 0x493e, 0x8f41, 0xe917, 0xe918, 0x5812, 0x57c8, 0x36d6, 0xe91c, 0x70fe, 0xe91e, 0xe91f, 0xe920, 0xe921, 0xe922, 0x68b9, 0x6967, 0xe925, 0xe926, 0xe927, 0xe928, 0xe929, 0xe92a, 0xe92b, 0xe92c, 0x6a1a, 0xe92e, 0xe92f, 0x843e, 0x44df, 0x44ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe933, 0xe934, 0xe935, 0xe936, 0x6f17, 0xe938, 0x833d, 0xe93a, 0x83ed, 0xe93c, 0xe93d, 0xe93e, 0x5989, 0x5a82, 0xe941, 0x5a61, 0x5a71, 0xe944, 0xe945, 0x372d, 0x59ef, 0xe948, 0x36c7, 0x718e, 0x9390, 0x669a, 0xe94d, 0x5a6e, 0x5a2b, 0xe950, 0x6a2b, 0xe952, 0xe953, 0xe954, 0xe955, 0x711d, 0xe957, 0xe958, 0x4fb0, 0xe95a, 0x5cc2, 0xe95c, 0xe95d, 0xe95e, 0x6a0c, 0xe960, 0xe961, 0x70a6, 0x7133, 0xe964, 0x3da5, 0x6cdf, 0xe967, 0xe968, 0x7e65, 0x59eb, 0x5d2f, 0x3df3, 0x5f5c, 0xe96e, 0xe96f, 0x7da4, 0x8426, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5485, 0xe973, 0xe974, 0xe975, 0x577e, 0xe977, 0xe978, 0x3fe5, 0xe97a, 0xe97b, 0x7003, 0xe97d, 0x5d70, 0x738f, 0x7cd3, 0xe981, 0xe982, 0x4fc8, 0x7fe7, 0x72cd, 0x7310, 0xe987, 0x7338, 0x7339, 0xe98a, 0x7341, 0x7348, 0x3ea9, 0xe98e, 0x906c, 0x71f5, 0xe991, 0x73e1, 0x81f6, 0x3eca, 0x770c, 0x3ed1, 0x6ca2, 0x56fd, 0x7419, 0x741e, 0x741f, 0x3ee2, 0x3ef0, 0x3ef4, 0x3efa, 0x74d3, 0x3f0e, 0x3f53, 0x7542, 0x756d, 0x7572, 0x758d, 0x3f7c, 0x75c8, 0x75dc, 0x3fc0, 0x764d, 0x3fd7, 0x7674, 0x3fdc, 0x767a, 0xe9b0, 0x7188, 0x5623, 0x8980, 0x5869, 0x401d, 0x7743, 0x4039, 0x6761, 0x4045, 0x35db, 0x7798, 0x406a, 0x406f, 0x5c5e, 0x77be, 0x77cb, 0x58f2, 0x7818, 0x70b9, 0x781c, 0x40a8, 0x7839, 0x7847, 0x7851, 0x7866, 0x8448, 0xe9cb, 0x7933, 0x6803, 0x7932, 0x4103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4109, 0x7991, 0x7999, 0x8fbb, 0x7a06, 0x8fbc, 0x4167, 0x7a91, 0x41b2, 0x7abc, 0x8279, 0x41c4, 0x7acf, 0x7adb, 0x41cf, 0x4e21, 0x7b62, 0x7b6c, 0x7b7b, 0x7c12, 0x7c1b, 0x4260, 0x427a, 0x7c7b, 0x7c9c, 0x428c, 0x7cb8, 0x4294, 0x7ced, 0x8f93, 0x70c0, 0xe9ef, 0x7dcf, 0x7dd4, 0x7dd0, 0x7dfd, 0x7fae, 0x7fb4, 0x729f, 0x4397, 0x8020, 0x8025, 0x7b39, 0x802e, 0x8031, 0x8054, 0x3dcc, 0x57b4, 0x70a0, 0x80b7, 0x80e9, 0x43ed, 0x810c, 0x732a, 0x810e, 0x8112, 0x7560, 0x8114, 0x4401, 0x3b39, 0x8156, 0x8159, 0x815a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4413, 0x583a, 0x817c, 0x8184, 0x4425, 0x8193, 0x442d, 0x81a5, 0x57ef, 0x81c1, 0x81e4, 0x8254, 0x448f, 0x82a6, 0x8276, 0x82ca, 0x82d8, 0x82ff, 0x44b0, 0x8357, 0x9669, 0x698a, 0x8405, 0x70f5, 0x8464, 0x60e3, 0x8488, 0x4504, 0x84be, 0x84e1, 0x84f8, 0x8510, 0x8538, 0x8552, 0x453b, 0x856f, 0x8570, 0x85e0, 0x4577, 0x8672, 0x8692, 0x86b2, 0x86ef, 0x9645, 0x878b, 0x4606, 0x4617, 0x88ae, 0x88ff, 0x8924, 0x8947, 0x8991, 0xea43, 0x8a29, 0x8a38, 0x8a94, 0x8ab4, 0x8c51, 0x8cd4, 0x8cf2, 0x8d1c, 0x4798, 0x585f, 0x8dc3, 0x47ed, 0x4eee, 0x8e3a, 0x55d8, 0x5754, 0x8e71, 0x55f5, 0x8eb0, 0x4837, 0x8ece, 0x8ee2, 0x8ee4, 0x8eed, 0x8ef2, 0x8fb7, 0x8fc1, 0x8fca, 0x8fcc, 0x9033, 0x99c4, 0x48ad, 0x98e0, 0x9213, 0x491e, 0x9228, 0x9258, 0x926b, 0x92b1, 0x92ae, 0x92bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92e3, 0x92eb, 0x92f3, 0x92f4, 0x92fd, 0x9343, 0x9384, 0x93ad, 0x4945, 0x4951, 0x9ebf, 0x9417, 0x5301, 0x941d, 0x942d, 0x943e, 0x496a, 0x9454, 0x9479, 0x952d, 0x95a2, 0x49a7, 0x95f4, 0x9633, 0x49e5, 0x67a0, 0x4a24, 0x9740, 0x4a35, 0x97b2, 0x97c2, 0x5654, 0x4ae4, 0x60e8, 0x98b9, 0x4b19, 0x98f1, 0x5844, 0x990e, 0x9919, 0x51b4, 0x991c, 0x9937, 0x9942, 0x995d, 0x9962, 0x4b70, 0x99c5, 0x4b9d, 0x9a3c, 0x9b0f, 0x7a83, 0x9b69, 0x9b81, 0x9bdd, 0x9bf1, 0x9bf4, 0x4c6d, 0x9c20, 0x376f, 0xeaa9, 0x9d49, 0x9c3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9efe, 0x5650, 0x9d93, 0x9dbd, 0x9dc0, 0x9dfc, 0x94f6, 0x8fb6, 0x9e7b, 0x9eac, 0x9eb1, 0x9ebd, 0x9ec6, 0x94dc, 0x9ee2, 0x9ef1, 0x9ef8, 0x7ac8, 0x9f44, 0xeabf, 0xeac0, 0xeac1, 0x691a, 0x94c3, 0x59ac, 0xeac5, 0x5840, 0x94c1, 0x37b9, 0xeac9, 0xeaca, 0xeacb, 0xeacc, 0x5757, 0x7173, 0xeacf, 0xead0, 0xead1, 0x546a, 0xead3, 0xead4, 0x549e, 0xead6, 0xead7, 0xead8, 0xead9, 0xeada, 0x60e7, 0xeadc, 0x567a, 0xeade, 0xeadf, 0xeae0, 0xeae1, 0xeae2, 0xeae3, 0x6955, 0x9c2f, 0x87a5, 0xeae7, 0xeae8, 0xeae9, 0xeaea, 0xeaeb, 0xeaec, 0x5c20, 0xeaee, 0x5e0b, 0xeaf0, 0xeaf1, 0xeaf2, 0x671e, 0xeaf4, 0xeaf5, 0xeaf6, 0x3647, 0xeaf8, 0xeaf9, 0xeafa, 0xeafb, 0x5364, 0x84ad, 0xeafe, 0xeaff, 0xeb00, 0x8b81, 0xeb02, 0xeb03, 0xeb04, 0xeb05, 0x4e78, 0x70bb, 0xeb08, 0xeb09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xeb0a, 0xeb0b, 0xeb0c, 0xeb0d, 0xeb0e, 0xeb0f, 0x62c3, 0xeb11, 0xeb12, 0x7198, 0x6855, 0xeb15, 0x69e9, 0x36c8, 0xeb18, 0xeb19, 0xeb1a, 0xeb1b, 0xeb1c, 0xeb1d, 0x82fd, 0xeb1f, 0xeb20, 0xeb21, 0x89a5, 0xeb23, 0x8fa0, 0xeb25, 0x97b8, 0xeb27, 0x9847, 0x9abd, 0xeb2a, 0xeb2b, 0xeb2c, 0xeb2d, 0xeb2e, 0xeb2f, 0xeb30, 0xeb31, 0xeb32, 0xeb33, 0xeb34, 0xeb35, 0xeb36, 0xeb37, 0xeb38, 0xeb39, 0x5fb1, 0x6648, 0x66bf, 0xeb3d, 0xeb3e, 0xeb3f, 0x7201, 0xeb41, 0x77d7, 0xeb43, 0xeb44, 0x7e87, 0xeb46, 0x58b5, 0x670e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6918, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0x48d0, 0x4ab8, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0x51d2, 0xeb5d, 0x599f, 0xeb5f, 0x3bbe, 0xeb61, 0xeb62, 0xeb63, 0x5788, 0xeb65, 0x399b, 0xeb67, 0xeb68, 0xeb69, 0x3762, 0xeb6b, 0x8b5e, 0xeb6d, 0x99d6, 0xeb6f, 0xeb70, 0xeb71, 0x7209, 0xeb73, 0xeb74, 0x5965, 0xeb76, 0xeb77, 0xeb78, 0x8eda, 0xeb7a, 0x528f, 0x573f, 0x7171, 0xeb7e, 0xeb7f, 0xeb80, 0xeb81, 0x55bc, 0xeb83, 0xeb84, 0xeb85, 0x91d4, 0x3473, 0xeb88, 0xeb89, 0xeb8a, 0x4718, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0x5066, 0x34fb, 0xeb93, 0x60de, 0xeb95, 0x477c, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0x57a1, 0x7151, 0x6fb6, 0xeb9f, 0xeba0, 0x9056, 0xeba2, 0xeba3, 0x8b62, 0xeba5, 0xeba6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d5b, 0xeba8, 0x8f36, 0xebaa, 0xebab, 0x8aea, 0xebad, 0xebae, 0xebaf, 0xebb0, 0x4bc0, 0xebb2, 0xebb3, 0xebb4, 0x9465, 0xebb6, 0x6195, 0x5a27, 0xebb9, 0x4fbb, 0x56b9, 0xebbc, 0xebbd, 0x4e6a, 0xebbf, 0x9656, 0x6d8f, 0xebc2, 0x3618, 0x8977, 0xebc5, 0xebc6, 0xebc7, 0xebc8, 0x71df, 0xebca, 0x7b42, 0xebcc, 0xebcd, 0xebce, 0x9104, 0xebd0, 0x7a45, 0x9df0, 0xebd3, 0x9a26, 0xebd5, 0x365f, 0xebd7, 0xebd8, 0x7983, 0xebda, 0xebdb, 0x5d2c, 0xebdd, 0x83cf, 0xebdf, 0x46d0, 0xebe1, 0x753b, 0x8865, 0xebe4, 0x58b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x371c, 0xebe7, 0xebe8, 0xebe9, 0x3c54, 0xebeb, 0xebec, 0x9281, 0xebee, 0xebef, 0x9330, 0xebf1, 0xebf2, 0x6c39, 0x949f, 0xebf5, 0xebf6, 0x8827, 0x88f5, 0xebf9, 0xebfa, 0xebfb, 0x6eb8, 0xebfd, 0xebfe, 0x39a4, 0x36b9, 0x5c10, 0x79e3, 0x453f, 0x66b6, 0xec05, 0xec06, 0x8943, 0xec08, 0xec09, 0x56d6, 0x40df, 0xec0c, 0x39a1, 0xec0e, 0xec0f, 0xec10, 0x71ad, 0x8366, 0xec13, 0xec14, 0x5a67, 0x4cb7, 0xec17, 0xec18, 0xec19, 0xec1a, 0xec1b, 0xec1c, 0xec1d, 0x7b43, 0x797e, 0xec20, 0x6fb5, 0xec22, 0x6a03, 0xec24, 0x53a2, 0xec26, 0x93bf, 0x6836, 0x975d, 0xec2a, 0xec2b, 0xec2c, 0xec2d, 0xec2e, 0xec2f, 0x5d85, 0xec31, 0xec32, 0x5715, 0x9823, 0xec35, 0x5dab, 0xec37, 0x65be, 0x69d5, 0x53d2, 0xec3b, 0xec3c, 0x3c11, 0x6736, 0xec3f, 0xec40, 0xec41, 0xec42, 0xec43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, 0x35ca, 0xec4b, 0xec4c, 0x48fa, 0x63e6, 0xec4f, 0x7808, 0x9255, 0xec52, 0x43f2, 0xec54, 0x43df, 0xec56, 0xec57, 0xec58, 0x59f8, 0xec5a, 0x8f0b, 0xec5c, 0xec5d, 0x7b51, 0xec5f, 0xec60, 0x3df7, 0xec62, 0xec63, 0x8fd0, 0x728f, 0x568b, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73, 0x7e9f, 0xec75, 0xec76, 0x4ca4, 0x9547, 0xec79, 0x71a2, 0xec7b, 0x4d91, 0x9012, 0xec7e, 0x4d9c, 0xec80, 0x8fbe, 0x55c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fba, 0xec84, 0x8fb9, 0xec86, 0x4509, 0x7e7f, 0x6f56, 0x6ab1, 0x4eea, 0x34e4, 0xec8d, 0xec8e, 0x373a, 0x8e80, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0x3deb, 0xec98, 0xec99, 0xec9a, 0xec9b, 0x4e9a, 0xec9d, 0xec9e, 0x56bf, 0xeca0, 0x8e0e, 0x5b6d, 0xeca3, 0xeca4, 0x63de, 0x62d0, 0xeca7, 0xeca8, 0x6530, 0x562d, 0xecab, 0x541a, 0xecad, 0x3dc6, 0xecaf, 0x4c7d, 0x5622, 0x561e, 0x7f49, 0xecb4, 0x5975, 0xecb6, 0x8770, 0x4e1c, 0xecb9, 0xecba, 0xecbb, 0x8117, 0x9d5e, 0x8d18, 0x763b, 0x9c45, 0x764e, 0x77b9, 0x9345, 0x5432, 0x8148, 0x82f7, 0x5625, 0x8132, 0x8418, 0x80bd, 0x55ea, 0x7962, 0x5643, 0x5416, 0xeccf, 0x35ce, 0x5605, 0x55f1, 0x66f1, 0xecd4, 0x362d, 0x7534, 0x55f0, 0x55ba, 0x5497, 0x5572, 0xecdb, 0xecdc, 0x5ed0, 0xecde, 0xecdf, 0xece0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xece1, 0x9eab, 0x7d5a, 0x55de, 0xece5, 0x629d, 0x976d, 0x5494, 0x8ccd, 0x71f6, 0x9176, 0x63fc, 0x63b9, 0x63fe, 0x5569, 0xecf0, 0x9c72, 0xecf2, 0x519a, 0x34df, 0xecf5, 0x51a7, 0x544d, 0x551e, 0x5513, 0x7666, 0x8e2d, 0xecfc, 0x75b1, 0x80b6, 0x8804, 0x8786, 0x88c7, 0x81b6, 0x841c, 0xed04, 0x44ec, 0x7304, 0xed07, 0x5b90, 0x830b, 0xed0a, 0x567b, 0xed0c, 0xed0d, 0xed0e, 0xed0f, 0xed10, 0xed11, 0x9170, 0xed13, 0x9208, 0xed15, 0xed16, 0xed17, 0xed18, 0x7266, 0xed1a, 0x474e, 0xed1c, 0xed1d, 0xed1e, 0x40fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9c5d, 0x651f, 0xed22, 0x48f3, 0xed24, 0xed25, 0xed26, 0xed27, 0x6062, 0xed29, 0xed2a, 0xed2b, 0xed2c, 0xed2d, 0x71a3, 0x7e8e, 0x9d50, 0x4e1a, 0x4e04, 0x3577, 0x5b0d, 0x6cb2, 0x5367, 0x36ac, 0x39dc, 0x537d, 0x36a5, 0xed3b, 0x589a, 0xed3d, 0x822d, 0x544b, 0x57aa, 0xed41, 0xed42, 0xed43, 0x3a52, 0xed45, 0x7374, 0xed47, 0x4d09, 0x9bed, 0xed4a, 0xed4b, 0x4c5b, 0xed4d, 0xed4e, 0xed4f, 0x845c, 0xed51, 0xed52, 0xed53, 0xed54, 0x632e, 0x7d25, 0xed57, 0xed58, 0x3a2a, 0x9008, 0x52cc, 0x3e74, 0x367a, 0x45e9, 0xed5f, 0x7640, 0x5af0, 0xed62, 0x787a, 0x47b6, 0x58a7, 0x40bf, 0x567c, 0x9b8b, 0x5d74, 0x7654, 0xed6b, 0x9e85, 0x4ce1, 0x75f9, 0x37fb, 0x6119, 0xed71, 0xed72, 0xed73, 0x565d, 0xed75, 0x57a7, 0xed77, 0xed78, 0x5234, 0xed7a, 0x35ad, 0x6c4a, 0x9d7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7c56, 0x9b39, 0x57de, 0xed81, 0x5c53, 0x64d3, 0xed84, 0xed85, 0xed86, 0x86ad, 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0x51fe, 0xed8e, 0x5d8e, 0x9703, 0xed91, 0x9e81, 0x904c, 0x7b1f, 0x9b02, 0x5cd1, 0x7ba3, 0x6268, 0x6335, 0x9aff, 0x7bcf, 0x9b2a, 0x7c7e, 0x9b2e, 0x7c42, 0x7c86, 0x9c15, 0x7bfc, 0x9b09, 0x9f17, 0x9c1b, 0xeda6, 0x9f5a, 0x5573, 0x5bc3, 0x4ffd, 0x9e98, 0x4ff2, 0x5260, 0x3e06, 0x52d1, 0x5767, 0x5056, 0x59b7, 0x5e12, 0x97c8, 0x9dab, 0x8f5c, 0x5469, 0x97b4, 0x9940, 0x97ba, 0x532c, 0x6130, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x692c, 0x53da, 0x9c0a, 0x9d02, 0x4c3b, 0x9641, 0x6980, 0x50a6, 0x7546, 0xedc6, 0x99da, 0x5273, 0xedc9, 0x9159, 0x9681, 0x915c, 0xedcd, 0x9151, 0xedcf, 0x637f, 0xedd1, 0x6aca, 0x5611, 0x918e, 0x757a, 0x6285, 0xedd7, 0x734f, 0x7c70, 0xedda, 0xeddb, 0xeddc, 0xeddd, 0x76d6, 0x9b9d, 0x4e2a, 0xede1, 0x83be, 0x8842, 0xede4, 0x5c4a, 0x69c0, 0x50ed, 0x577a, 0x521f, 0x5df5, 0x4ece, 0x6c31, 0xeded, 0x4f39, 0x549c, 0x54da, 0x529a, 0x8d82, 0x35fe, 0x5f0c, 0x35f3, 0xedf6, 0x6b52, 0x917c, 0x9fa5, 0x9b97, 0x982e, 0x98b4, 0x9aba, 0x9ea8, 0x9e84, 0x717a, 0x7b14, 0xee02, 0x6bfa, 0x8818, 0x7f78, 0xee06, 0x5620, 0xee08, 0x8e77, 0x9f53, 0xee0b, 0x8dd4, 0x8e4f, 0x9e1c, 0x8e01, 0x6282, 0xee11, 0x8e28, 0x8e75, 0x7ad3, 0xee15, 0x7a3e, 0x78d8, 0x6cea, 0x8a67, 0x7607, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xee1b, 0x9f26, 0x6cce, 0x87d6, 0x75c3, 0xee20, 0x7853, 0xee22, 0x8d0c, 0x72e2, 0x7371, 0x8b2d, 0x7302, 0x74f1, 0x8ceb, 0xee2a, 0x862f, 0x5fba, 0x88a0, 0x44b7, 0xee2f, 0xee30, 0xee31, 0xee32, 0x8a7e, 0xee34, 0xee35, 0x60fd, 0x7667, 0x9ad7, 0x9d44, 0x936e, 0x9b8f, 0x87f5, 0xee3d, 0x880f, 0x8cf7, 0x732c, 0x9721, 0x9bb0, 0x35d6, 0x72b2, 0x4c07, 0x7c51, 0x994a, 0xee48, 0x6159, 0x4c04, 0x9e96, 0x617d, 0xee4d, 0x575f, 0x616f, 0x62a6, 0x6239, 0x62ce, 0x3a5c, 0x61e2, 0x53aa, 0xee56, 0x6364, 0x6802, 0x35d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d57, 0xee5b, 0x8fda, 0xee5d, 0xee5e, 0x50d9, 0xee60, 0x7906, 0x5332, 0x9638, 0xee64, 0x4065, 0xee66, 0x77fe, 0xee68, 0x7cc2, 0xee6a, 0x7cda, 0x7a2d, 0x8066, 0x8063, 0x7d4d, 0x7505, 0x74f2, 0x8994, 0x821a, 0x670c, 0x8062, 0xee76, 0x805b, 0x74f0, 0x8103, 0x7724, 0x8989, 0xee7c, 0x7553, 0xee7e, 0x87a9, 0x87ce, 0x81c8, 0x878c, 0x8a49, 0x8cad, 0x8b43, 0x772b, 0x74f8, 0x84da, 0x3635, 0x69b2, 0x8da6, 0xee8c, 0x89a9, 0x7468, 0x6db9, 0x87c1, 0xee91, 0x74e7, 0x3ddb, 0x7176, 0x60a4, 0x619c, 0x3cd1, 0x7162, 0x6077, 0xee9a, 0x7f71, 0xee9c, 0x7250, 0x60e9, 0x4b7e, 0x5220, 0x3c18, 0xeea2, 0xeea3, 0xeea4, 0xeea5, 0xeea6, 0xeea7, 0xeea8, 0xeea9, 0xeeaa, 0x5cc1, 0xeeac, 0xeead, 0xeeae, 0xeeaf, 0xeeb0, 0xeeb1, 0x4562, 0x5b1f, 0xeeb4, 0x9f50, 0x9ea6, 0xeeb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, 0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, 0x00af, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xff5e, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xff0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff3c, 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1, 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e11, 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60c5, 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74f7, 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90e8, 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63d2, 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a97, 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9593, 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x695a, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8179, 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6eff, 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85, 0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x4e36, 0x4e3f, 0x4e85, 0x4ea0, 0x5182, 0x5196, 0x51ab, 0x52f9, 0x5338, 0x5369, 0x53b6, 0x590a, 0x5b80, 0x5ddb, 0x2f33, 0x5e7f, 0xf6df, 0x5f50, 0x5f61, 0x6534, 0xf6e3, 0x7592, 0xf6e5, 0x8fb5, 0xf6e7, 0x00a8, 0x02c6, 0x30fd, 0x30fe, 0x309d, 0x309e, 0xf6ee, 0xf6ef, 0x3005, 0x3006, 0x3007, 0x30fc, 0xff3b, 0xff3d, 0x273d, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x21e7, 0x21b8, 0x21b9, 0xf7e5, 0xf7e6, 0x4e5a, 0xf7e8, 0x5202, 0xf7ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7eb, 0x5188, 0xf7ed, 0xf7ee, 0xf7ef, 0xf7f0, 0xf7f1, 0xf7f2, 0xf7f3, 0xf7f4, 0xf7f5, 0xf7f6, 0xf7f7, 0xf7f8, 0xf7f9, 0xf7fa, 0xf7fb, 0xf7fc, 0xf7fd, 0xf7fe, 0xf7ff, 0xf800, 0xf801, 0xf802, 0xf803, 0xf804, 0xf805, 0xf806, 0xf807, 0xf808, 0xf809, 0xf80a, 0xf80b, 0xf80c, 0xf80d, 0xf80e, 0xf80f, 0xf810, 0xf811, 0xf812, 0xf813, 0xf814, 0xf815, 0xf816, 0xffe2, 0xffe4, 0xff07, 0xff02, 0x3231, 0x2116, 0x2121, 0x309b, 0x309c, 0x2e80, 0x2e84, 0x2e86, 0x2e87, 0x2e88, 0x2e8a, 0x2e8c, 0x2e8d, 0x2e95, 0x2e9c, 0x2e9d, 0x2ea5, 0x2ea7, 0x2eaa, 0x2eac, 0x2eae, 0x2eb6, 0x2ebc, 0x2ebe, 0x2ec6, 0x2eca, 0x2ecc, 0x2ecd, 0x2ecf, 0x2ed6, 0x2ed7, 0x2ede, 0x2ee3, 0xf83c, 0xf83d, 0xf83e, 0x0283, 0x0250, 0x025b, 0x0254, 0x0275, 0x0153, 0x00f8, 0x014b, 0x028a, 0x026a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c36, 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6034, 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x741a, 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9689, 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6433, 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, 0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7144, 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8144, 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9044, 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be3, 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f36, 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8024, 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x619b, 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x92b5, 0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b18, 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, 0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b, 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9da0, 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9a49, 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f71, 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, 0x7881, 0x92b9, 0x88cf, 0x58bb, 0x6052, 0x7ca7, 0x5afa, 0x2554, 0x2566, 0x2557, 0x2560, 0x256c, 0x2563, 0x255a, 0x2569, 0x255d, 0x2552, 0x2564, 0x2555, 0x255e, 0x256a, 0x2561, 0x2558, 0x2567, 0x255b, 0x2553, 0x2565, 0x2556, 0x255f, 0x256b, 0x2562, 0x2559, 0x2568, 0x255c, 0x2551, 0x2550, 0x256d, 0x256e, 0x2570, 0x256f, 0xffed, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe000, 0x92db, 0xe002, 0xe003, 0x854c, 0x42b5, 0x73ef, 0x51b5, 0x3649, 0xe009, 0xe00a, 0x9344, 0xe00c, 0x82ee, 0xe00e, 0x783c, 0x6744, 0x62df, 0xe012, 0xe013, 0xe014, 0xe015, 0xe016, 0x4fab, 0xe018, 0x5008, 0xe01a, 0xe01b, 0xe01c, 0xe01d, 0xe01e, 0x5029, 0xe020, 0x5fa4, 0xe022, 0xe023, 0x6edb, 0xe025, 0x507d, 0x5101, 0x347a, 0x510e, 0x986c, 0x3743, 0x8416, 0xe02d, 0xe02e, 0x5160, 0xe030, 0x516a, 0xe032, 0xe033, 0xe034, 0xe035, 0xe036, 0xe037, 0xe038, 0x5b82, 0x877d, 0xe03b, 0xe03c, 0x51b2, 0x51b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9d34, 0x51c9, 0x51cf, 0x51d1, 0x3cdc, 0x51d3, 0xe045, 0x51b3, 0x51e2, 0x5342, 0x51ed, 0x83cd, 0x693e, 0xe04c, 0x5f7b, 0x520b, 0x5226, 0x523c, 0x52b5, 0x5257, 0x5294, 0x52b9, 0x52c5, 0x7c15, 0x8542, 0x52e0, 0x860d, 0xe05a, 0x5305, 0xe05c, 0x5549, 0x6ed9, 0xe05f, 0xe060, 0xe061, 0x5333, 0x5344, 0xe064, 0x6ccb, 0xe066, 0x681b, 0x73d5, 0x604a, 0x3eaa, 0x38cc, 0xe06c, 0x71dd, 0x44a2, 0x536d, 0x5374, 0xe071, 0x537e, 0x537f, 0xe074, 0xe075, 0x77e6, 0x5393, 0xe078, 0x53a0, 0x53ab, 0x53ae, 0x73a7, 0xe07d, 0x3f59, 0x739c, 0x53c1, 0x53c5, 0x6c49, 0x4e49, 0x57fe, 0x53d9, 0x3aab, 0xe087, 0x53e0, 0xe089, 0xe08a, 0x53f6, 0xe08c, 0x5413, 0x7079, 0x552b, 0x6657, 0x6d5b, 0x546d, 0xe093, 0xe094, 0x555d, 0x548f, 0x54a4, 0x47a6, 0xe099, 0xe09a, 0x3db4, 0xe09c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe09d, 0xe09e, 0x5547, 0x4ced, 0x542f, 0x7417, 0x5586, 0x55a9, 0x5605, 0xe0a6, 0xe0a7, 0x4552, 0xe0a9, 0x66b3, 0xe0ab, 0x5637, 0x66cd, 0xe0ae, 0x66a4, 0x66ad, 0x564d, 0x564f, 0x78f1, 0x56f1, 0x9787, 0x53fe, 0x5700, 0x56ef, 0x56ed, 0xe0ba, 0x3623, 0xe0bc, 0x5746, 0xe0be, 0x6c6e, 0x708b, 0x5742, 0x36b1, 0xe0c3, 0x57e6, 0xe0c5, 0x5803, 0xe0c7, 0xe0c8, 0x5826, 0xe0ca, 0x585c, 0x58aa, 0x3561, 0x58e0, 0x58dc, 0xe0d0, 0x58fb, 0x5bff, 0x5743, 0xe0d4, 0xe0d5, 0x93d3, 0x35a1, 0x591f, 0x68a6, 0x36c3, 0x6e59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe0dc, 0x5a24, 0x5553, 0xe0df, 0x8505, 0x59c9, 0xe0e2, 0xe0e3, 0xe0e4, 0xe0e5, 0x59d9, 0xe0e7, 0xe0e8, 0xe0e9, 0x6d71, 0xe0eb, 0xe0ec, 0x59f9, 0xe0ee, 0x5aab, 0x5a63, 0x36e6, 0xe0f2, 0x5a77, 0x3708, 0x5a96, 0x7465, 0x5ad3, 0xe0f8, 0xe0f9, 0x3d85, 0xe0fb, 0x3732, 0xe0fd, 0x5e83, 0x52d0, 0x5b76, 0x6588, 0x5b7c, 0xe103, 0x4004, 0x485d, 0xe106, 0x5bd5, 0x6160, 0xe109, 0xe10a, 0xe10b, 0x5bf3, 0x5b9d, 0x4d10, 0x5c05, 0xe110, 0x5c13, 0x73ce, 0x5c14, 0xe114, 0xe115, 0x5c49, 0x48dd, 0x5c85, 0x5ce9, 0x5cef, 0x5d8b, 0xe11c, 0xe11d, 0x5d10, 0x5d18, 0x5d46, 0xe121, 0x5cba, 0x5dd7, 0x82fc, 0x382d, 0xe126, 0xe127, 0xe128, 0x8287, 0x3836, 0x3bc2, 0x5e2e, 0x6a8a, 0x5e75, 0x5e7a, 0xe130, 0xe131, 0x53a6, 0x4eb7, 0x5ed0, 0x53a8, 0xe136, 0x5e09, 0x5ef4, 0xe139, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ef9, 0x5efb, 0x38a0, 0x5efc, 0x683e, 0x941b, 0x5f0d, 0xe141, 0xe142, 0x3ade, 0x48ae, 0xe145, 0x5f3a, 0xe147, 0xe148, 0x5f58, 0xe14a, 0x5f63, 0x97bd, 0xe14d, 0x5f72, 0x9340, 0xe150, 0x5fa7, 0x5db6, 0x3d5f, 0xe154, 0xe155, 0xe156, 0xe157, 0x91d6, 0xe159, 0xe15a, 0x6031, 0x6685, 0xe15d, 0x3963, 0x3dc7, 0x3639, 0x5790, 0xe162, 0x7971, 0x3e40, 0x609e, 0x60a4, 0x60b3, 0xe168, 0xe169, 0xe16a, 0x74a4, 0x50e1, 0x5aa0, 0x6164, 0x8424, 0x6142, 0xe171, 0xe172, 0x6181, 0x51f4, 0xe175, 0x6187, 0x5baa, 0xe178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe179, 0x61d3, 0xe17b, 0xe17c, 0x61d0, 0x3932, 0xe17f, 0xe180, 0x6023, 0x615c, 0x651e, 0x638b, 0xe185, 0x62c5, 0xe187, 0x62d5, 0xe189, 0x636c, 0xe18b, 0x3a17, 0x6438, 0x63f8, 0xe18f, 0xe190, 0x6490, 0x6f8a, 0xe193, 0x9814, 0xe195, 0xe196, 0x64e1, 0x64e5, 0x947b, 0x3a66, 0x643a, 0x3a57, 0x654d, 0x6f16, 0xe19f, 0xe1a0, 0x6585, 0x656d, 0x655f, 0xe1a4, 0x65b5, 0xe1a6, 0x4b37, 0x65d1, 0x40d8, 0xe1aa, 0x65e0, 0x65e3, 0x5fdf, 0xe1ae, 0x6618, 0xe1b0, 0xe1b1, 0x6644, 0xe1b3, 0xe1b4, 0x664b, 0xe1b6, 0x6667, 0xe1b8, 0x6673, 0x6674, 0xe1bb, 0xe1bc, 0xe1bd, 0xe1be, 0xe1bf, 0x77c5, 0xe1c1, 0x99a4, 0x6702, 0xe1c4, 0xe1c5, 0x3b2b, 0x69fa, 0xe1c8, 0x675e, 0x6767, 0x6762, 0xe1cc, 0xe1cd, 0x67d7, 0x44e9, 0x6822, 0x6e50, 0x923c, 0x6801, 0xe1d4, 0xe1d5, 0x685d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe1d7, 0x69e1, 0x6a0b, 0xe1da, 0x6973, 0x68c3, 0xe1dd, 0x6901, 0x6900, 0x3d32, 0x3a01, 0xe1e2, 0x3b80, 0x67ac, 0x6961, 0xe1e6, 0x42fc, 0x6936, 0x6998, 0x3ba1, 0xe1eb, 0x8363, 0x5090, 0x69f9, 0xe1ef, 0xe1f0, 0x6a45, 0xe1f2, 0x6a9d, 0x3bf3, 0x67b1, 0x6ac8, 0xe1f7, 0x3c0d, 0x6b1d, 0xe1fa, 0x60de, 0x6b35, 0x6b74, 0xe1fe, 0x6eb5, 0xe200, 0xe201, 0xe202, 0x3740, 0x5421, 0xe205, 0x6be1, 0xe207, 0x6bdc, 0x6c37, 0xe20a, 0xe20b, 0xe20c, 0x6c5a, 0x8226, 0x6c79, 0xe210, 0x44c5, 0xe212, 0xe213, 0xe214, 0xe215, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe216, 0x36e5, 0x3ceb, 0xe219, 0x9b83, 0xe21b, 0xe21c, 0x7f8f, 0x6837, 0xe21f, 0xe220, 0xe221, 0x6d96, 0x6d5c, 0x6e7c, 0x6f04, 0xe226, 0xe227, 0xe228, 0x8533, 0xe22a, 0x51c7, 0x6c9c, 0x6e1d, 0x842e, 0xe22f, 0x6e2f, 0xe231, 0x7453, 0xe233, 0x79cc, 0x6e4f, 0x5a91, 0xe237, 0x6ff8, 0x370d, 0x6f9d, 0xe23b, 0x6efa, 0xe23d, 0xe23e, 0x4555, 0x93f0, 0x6f44, 0x6f5c, 0x3d4e, 0x6f74, 0xe245, 0x3d3b, 0x6f9f, 0xe248, 0x6fd3, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0x51df, 0xe251, 0xe252, 0xe253, 0xe254, 0x704b, 0x707e, 0x70a7, 0x7081, 0x70cc, 0x70d5, 0x70d6, 0x70df, 0x4104, 0x3de8, 0x71b4, 0x7196, 0xe261, 0x712b, 0x7145, 0x5a88, 0x714a, 0x716e, 0x5c9c, 0xe268, 0x714f, 0x9362, 0xe26b, 0x712c, 0xe26d, 0xe26e, 0xe26f, 0x71ba, 0xe271, 0x70bd, 0x720e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341, 0xe27a, 0x722e, 0x7240, 0xe27d, 0x68bd, 0x7255, 0x7257, 0x3e55, 0xe282, 0x680d, 0x6f3d, 0x7282, 0x732a, 0x732b, 0xe288, 0xe289, 0x48ed, 0xe28b, 0x7328, 0x732e, 0x73cf, 0x73aa, 0xe290, 0xe291, 0x73c9, 0x7449, 0xe294, 0xe295, 0xe296, 0x6623, 0x36c5, 0xe299, 0xe29a, 0xe29b, 0x73f7, 0x7415, 0x6903, 0xe29f, 0x7439, 0xe2a1, 0x3ed7, 0x745c, 0xe2a4, 0x7460, 0xe2a6, 0x7447, 0x73e4, 0x7476, 0x83b9, 0x746c, 0x3730, 0x7474, 0x93f1, 0x6a2c, 0x7482, 0x4953, 0xe2b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe2b3, 0xe2b4, 0xe2b5, 0x5b46, 0xe2b7, 0xe2b8, 0x74c8, 0xe2ba, 0x750e, 0x74e9, 0x751e, 0xe2be, 0xe2bf, 0x5bd7, 0xe2c1, 0x9385, 0x754d, 0x754a, 0x7567, 0x756e, 0xe2c7, 0x3f04, 0xe2c9, 0x758e, 0x745d, 0x759e, 0x75b4, 0x7602, 0x762c, 0x7651, 0x764f, 0x766f, 0x7676, 0xe2d4, 0x7690, 0x81ef, 0x37f8, 0xe2d8, 0xe2d9, 0x76a1, 0x76a5, 0x76b7, 0x76cc, 0xe2de, 0x8462, 0xe2e0, 0xe2e1, 0xe2e2, 0x771e, 0x7726, 0x7740, 0x64af, 0xe2e7, 0x7758, 0xe2e9, 0x77af, 0xe2eb, 0xe2ec, 0xe2ed, 0x77f4, 0x7809, 0xe2f0, 0xe2f1, 0x68ca, 0x78af, 0x78c7, 0x78d3, 0x96a5, 0x792e, 0xe2f8, 0x78d7, 0x7934, 0x78b1, 0xe2fc, 0x8fb8, 0x8884, 0xe2ff, 0xe300, 0xe301, 0x7986, 0x8900, 0x6902, 0x7980, 0xe306, 0x799d, 0xe308, 0x793c, 0x79a9, 0x6e2a, 0xe30c, 0x3ea8, 0x79c6, 0xe30f, 0x79d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79d4, 0xfefe, 0x00ff, 0x0000, 0x0100, 0x0005, 0x8000, 0x804f240 }; const unichar_t unicode_from_ksc5601[] = { 0x3164, 0x3001, 0x3002, 0x30fb, 0x2025, 0x22ef, 0x00a8, 0x3003, 0x2013, 0x2014, 0x2016, 0xff3c, 0xff5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033, 0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013, 0x00ab, 0x00bb, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2, 0x21d2, 0x21d4, 0x2200, 0x2203, 0x00b4, 0x02dc, 0x02c7, 0x02d8, 0x02dd, 0x02da, 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x2236, 0x222e, 0x2211, 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0, 0x25b7, 0x25b6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, 0x25c9, 0x25c8, 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5, 0x25a8, 0x25a7, 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c, 0x261e, 0x00b6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266d, 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116, 0x33c7, 0x2122, 0x33c2, 0x33d8, 0x2121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xffe6, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x0000, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512, 0x2511, 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d, 0x251e, 0x251f, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a, 0x252d, 0x252e, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a, 0x253d, 0x253e, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33c4, 0x33a3, 0x33a4, 0x33a5, 0x33a6, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e, 0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33ca, 0x338d, 0x338e, 0x338f, 0x33cf, 0x3388, 0x3389, 0x33c8, 0x33a7, 0x33a8, 0x33b0, 0x33b1, 0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33ba, 0x33bb, 0x33bc, 0x33bd, 0x33be, 0x33bf, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33c0, 0x33c1, 0x338a, 0x338b, 0x338c, 0x33d6, 0x33c5, 0x33ad, 0x33ae, 0x33af, 0x33db, 0x33a9, 0x33aa, 0x33ab, 0x33ac, 0x33dd, 0x33d0, 0x33d3, 0x33c3, 0x33c9, 0x33dc, 0x33c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x00d0, 0x00aa, 0x0126, 0x0000, 0x0132, 0x0000, 0x013f, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0x0000, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd, 0x2153, 0x2154, 0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f, 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3, 0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10, 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19, 0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d, 0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b, 0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77, 0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d, 0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf, 0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4, 0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7, 0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5, 0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06, 0xad0c, 0xad0d, 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29, 0xad2c, 0xad2d, 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45, 0xad47, 0xad49, 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c, 0xad6d, 0xad70, 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c, 0xad7d, 0xad7f, 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90, 0xad9c, 0xad9d, 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8, 0xadd0, 0xadd1, 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9, 0xadfc, 0xadff, 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d, 0xae14, 0xae30, 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40, 0xae41, 0xae43, 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e, 0xae50, 0xae54, 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61, 0xae65, 0xae68, 0xae69, 0xae6c, 0xae70, 0xae78, 0xae79, 0xae7b, 0xae7c, 0xae7d, 0xae84, 0xae85, 0xae8c, 0xaebc, 0xaebd, 0xaebe, 0xaec0, 0xaec4, 0xaecc, 0xaecd, 0xaecf, 0xaed0, 0xaed1, 0xaed8, 0xaed9, 0xaedc, 0xaee8, 0xaeeb, 0xaeed, 0xaef4, 0xaef8, 0xaefc, 0xaf07, 0xaf08, 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d, 0xaf30, 0xaf32, 0xaf34, 0xaf3c, 0xaf3d, 0xaf3f, 0xaf41, 0xaf42, 0xaf43, 0xaf48, 0xaf49, 0xaf50, 0xaf5c, 0xaf5d, 0xaf64, 0xaf65, 0xaf79, 0xaf80, 0xaf84, 0xaf88, 0xaf90, 0xaf91, 0xaf95, 0xaf9c, 0xafb8, 0xafb9, 0xafbc, 0xafc0, 0xafc7, 0xafc8, 0xafc9, 0xafcb, 0xafcd, 0xafce, 0xafd4, 0xafdc, 0xafe8, 0xafe9, 0xaff0, 0xaff1, 0xaff4, 0xaff8, 0xb000, 0xb001, 0xb004, 0xb00c, 0xb010, 0xb014, 0xb01c, 0xb01d, 0xb028, 0xb044, 0xb045, 0xb048, 0xb04a, 0xb04c, 0xb04e, 0xb053, 0xb054, 0xb055, 0xb057, 0xb059, 0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c, 0xb08d, 0xb08f, 0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f, 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, 0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc, 0xb0c4, 0xb0c5, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4, 0xb0d8, 0xb0e0, 0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110, 0xb112, 0xb113, 0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123, 0xb124, 0xb125, 0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138, 0xb139, 0xb140, 0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154, 0xb155, 0xb158, 0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180, 0xb182, 0xb188, 0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194, 0xb198, 0xb19c, 0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd, 0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd, 0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217, 0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268, 0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290, 0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3, 0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9, 0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2, 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa, 0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311, 0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358, 0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365, 0xb367, 0xb369, 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378, 0xb380, 0xb381, 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394, 0xb3a0, 0xb3a1, 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb, 0xb3cc, 0xb3ce, 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db, 0xb3dd, 0xb3e0, 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c, 0xb420, 0xb428, 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454, 0xb458, 0xb460, 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488, 0xb49d, 0xb4a4, 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0, 0xb4c4, 0xb4c8, 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3, 0xb4e4, 0xb4e6, 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514, 0xb515, 0xb518, 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528, 0xb529, 0xb52a, 0xb530, 0xb531, 0xb534, 0xb538, 0xb540, 0xb541, 0xb543, 0xb544, 0xb545, 0xb54b, 0xb54c, 0xb54d, 0xb550, 0xb554, 0xb55c, 0xb55d, 0xb55f, 0xb560, 0xb561, 0xb5a0, 0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa, 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc, 0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d8, 0xb5ec, 0xb610, 0xb611, 0xb614, 0xb618, 0xb625, 0xb62c, 0xb634, 0xb648, 0xb664, 0xb668, 0xb69c, 0xb69d, 0xb6a0, 0xb6a4, 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4, 0xb6f0, 0xb6f4, 0xb6f8, 0xb700, 0xb701, 0xb705, 0xb728, 0xb729, 0xb72c, 0xb72f, 0xb730, 0xb738, 0xb739, 0xb73b, 0xb744, 0xb748, 0xb74c, 0xb754, 0xb755, 0xb760, 0xb764, 0xb768, 0xb770, 0xb771, 0xb773, 0xb775, 0xb77c, 0xb77d, 0xb780, 0xb784, 0xb78c, 0xb78d, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9, 0xb7ec, 0xb7ed, 0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800, 0xb801, 0xb807, 0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819, 0xb81b, 0xb81d, 0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835, 0xb837, 0xb838, 0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c, 0xb85d, 0xb860, 0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878, 0xb87c, 0xb88d, 0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1, 0xb8c3, 0xb8c5, 0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1, 0xb8e8, 0xb8e9, 0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd, 0xb904, 0xb918, 0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c, 0xb94f, 0xb951, 0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969, 0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985, 0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0, 0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc, 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db, 0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec, 0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01, 0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48, 0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58, 0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71, 0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8, 0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb, 0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc, 0xbb00, 0xbb04, 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20, 0xbb29, 0xbb2b, 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e, 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f, 0xbb50, 0xbb54, 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c, 0xbb90, 0xbba4, 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4, 0xbbc8, 0xbbd0, 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00, 0xbc02, 0xbc08, 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11, 0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f, 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30, 0xbc31, 0xbc34, 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45, 0xbc49, 0xbc4c, 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88, 0xbc8b, 0xbc8c, 0xbc8e, 0xbc94, 0xbc95, 0xbc97, 0xbc99, 0xbc9a, 0xbca0, 0xbca1, 0xbca4, 0xbca7, 0xbca8, 0xbcb0, 0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4, 0xbccd, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc, 0xbd04, 0xbd05, 0xbd07, 0xbd09, 0xbd10, 0xbd14, 0xbd24, 0xbd2c, 0xbd40, 0xbd48, 0xbd49, 0xbd4c, 0xbd50, 0xbd58, 0xbd59, 0xbd64, 0xbd68, 0xbd80, 0xbd81, 0xbd84, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd90, 0xbd91, 0xbd93, 0xbd95, 0xbd99, 0xbd9a, 0xbd9c, 0xbda4, 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5, 0xbdd8, 0xbddc, 0xbde9, 0xbdf0, 0xbdf4, 0xbdf8, 0xbe00, 0xbe03, 0xbe05, 0xbe0c, 0xbe0d, 0xbe10, 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f, 0xbe44, 0xbe45, 0xbe48, 0xbe4c, 0xbe4e, 0xbe54, 0xbe55, 0xbe57, 0xbe59, 0xbe5a, 0xbe5b, 0xbe60, 0xbe61, 0xbe64, 0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74, 0xbe75, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d, 0xbe8f, 0xbe90, 0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1, 0xbed4, 0xbed7, 0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec, 0xbf01, 0xbf08, 0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf40, 0xbf41, 0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94, 0xbfb0, 0xbfc5, 0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf, 0xbfe1, 0xc03c, 0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069, 0xc090, 0xc091, 0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5, 0xc0ac, 0xc0ad, 0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0bc, 0xc0bd, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9, 0xc0cc, 0xc0d0, 0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4, 0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100, 0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f, 0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f, 0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148, 0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c, 0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178, 0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c, 0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0, 0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0, 0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200, 0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c, 0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d, 0xc22f, 0xc231, 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254, 0xc258, 0xc260, 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c, 0xc27d, 0xc27f, 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b, 0xc29d, 0xc2a4, 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5, 0xc2b7, 0xc2b9, 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb, 0xc2ec, 0xc2ed, 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb, 0xc2fc, 0xc300, 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314, 0xc315, 0xc318, 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345, 0xc368, 0xc369, 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c, 0xc37d, 0xc384, 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc, 0xc3df, 0xc3e0, 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5, 0xc3f8, 0xc408, 0xc410, 0xc424, 0xc42c, 0xc430, 0xc434, 0xc43c, 0xc43d, 0xc448, 0xc464, 0xc465, 0xc468, 0xc46c, 0xc474, 0xc475, 0xc479, 0xc480, 0xc494, 0xc49c, 0xc4b8, 0xc4bc, 0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4, 0xc4f8, 0xc4fa, 0xc4ff, 0xc500, 0xc501, 0xc50c, 0xc510, 0xc514, 0xc51c, 0xc528, 0xc529, 0xc52c, 0xc530, 0xc538, 0xc539, 0xc53b, 0xc53d, 0xc544, 0xc545, 0xc548, 0xc549, 0xc54a, 0xc54c, 0xc54d, 0xc54e, 0xc553, 0xc554, 0xc555, 0xc557, 0xc558, 0xc559, 0xc55d, 0xc55e, 0xc560, 0xc561, 0xc564, 0xc568, 0xc570, 0xc571, 0xc573, 0xc574, 0xc575, 0xc57c, 0xc57d, 0xc580, 0xc584, 0xc587, 0xc58c, 0xc58d, 0xc58f, 0xc591, 0xc595, 0xc597, 0xc598, 0xc59c, 0xc5a0, 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8, 0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cc, 0xc5ce, 0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1, 0xc5e3, 0xc5e5, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6, 0xc5f7, 0xc5fc, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605, 0xc606, 0xc607, 0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b, 0xc61c, 0xc624, 0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630, 0xc633, 0xc634, 0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641, 0xc644, 0xc648, 0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c, 0xc65d, 0xc660, 0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c, 0xc680, 0xc688, 0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698, 0xc69c, 0xc6a4, 0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc, 0xc6cd, 0xc6d0, 0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8, 0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705, 0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721, 0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c, 0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c, 0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d, 0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a, 0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad, 0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8, 0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8, 0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a, 0xc810, 0xc811, 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820, 0xc824, 0xc82c, 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840, 0xc848, 0xc849, 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874, 0xc878, 0xc87a, 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887, 0xc88b, 0xc88c, 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8, 0xc8bc, 0xc8bd, 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7, 0xc8d9, 0xc8e0, 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900, 0xc904, 0xc905, 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918, 0xc92c, 0xc934, 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961, 0xc963, 0xc96c, 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c, 0xc990, 0xc998, 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4, 0xc9c7, 0xc9c8, 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3, 0xc9d5, 0xc9d6, 0xc9d9, 0xc9da, 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2, 0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8, 0xc9f9, 0xc9fc, 0xca00, 0xca08, 0xca09, 0xca0b, 0xca0c, 0xca0d, 0xca14, 0xca18, 0xca29, 0xca4c, 0xca4d, 0xca50, 0xca54, 0xca5c, 0xca5d, 0xca5f, 0xca60, 0xca61, 0xca68, 0xca7d, 0xca84, 0xca98, 0xcabc, 0xcabd, 0xcac0, 0xcac4, 0xcacc, 0xcacd, 0xcacf, 0xcad1, 0xcad3, 0xcad8, 0xcad9, 0xcae0, 0xcaec, 0xcaf4, 0xcb08, 0xcb10, 0xcb14, 0xcb18, 0xcb20, 0xcb21, 0xcb41, 0xcb48, 0xcb49, 0xcb4c, 0xcb50, 0xcb58, 0xcb59, 0xcb5d, 0xcb64, 0xcb78, 0xcb79, 0xcb9c, 0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7, 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10, 0xcc14, 0xcc1c, 0xcc1d, 0xcc21, 0xcc22, 0xcc27, 0xcc28, 0xcc29, 0xcc2c, 0xcc2e, 0xcc30, 0xcc38, 0xcc39, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48, 0xcc4c, 0xcc54, 0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64, 0xcc66, 0xcc68, 0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0, 0xcca8, 0xcca9, 0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8, 0xccbc, 0xccc4, 0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4, 0xccec, 0xccf0, 0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18, 0xcd19, 0xcd1b, 0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c, 0xcd60, 0xcd64, 0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88, 0xcd94, 0xcd95, 0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9, 0xcdb0, 0xcdc4, 0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8, 0xcdf9, 0xcdfb, 0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19, 0xce20, 0xce21, 0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35, 0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69, 0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85, 0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1, 0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5, 0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9, 0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15, 0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31, 0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67, 0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c, 0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8, 0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011, 0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c, 0xd044, 0xd045, 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060, 0xd06c, 0xd06d, 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4, 0xd0a5, 0xd0a8, 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0, 0xd0c1, 0xd0c4, 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0dc, 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef, 0xd0f0, 0xd0f1, 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138, 0xd13a, 0xd140, 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d, 0xd150, 0xd154, 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c, 0xd17c, 0xd184, 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0, 0xd1b1, 0xd1b3, 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4, 0xd1f8, 0xd207, 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234, 0xd23c, 0xd23d, 0xd23f, 0xd241, 0xd248, 0xd25c, 0xd264, 0xd280, 0xd281, 0xd284, 0xd288, 0xd290, 0xd291, 0xd295, 0xd29c, 0xd2a0, 0xd2a4, 0xd2ac, 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc, 0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8, 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8, 0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0, 0xd2f1, 0xd2f4, 0xd2f8, 0xd300, 0xd301, 0xd303, 0xd305, 0xd30c, 0xd30d, 0xd30e, 0xd310, 0xd314, 0xd316, 0xd31c, 0xd31d, 0xd31f, 0xd320, 0xd321, 0xd325, 0xd328, 0xd329, 0xd32c, 0xd330, 0xd338, 0xd339, 0xd33b, 0xd33c, 0xd33d, 0xd344, 0xd345, 0xd37c, 0xd37d, 0xd380, 0xd384, 0xd38c, 0xd38d, 0xd38f, 0xd390, 0xd391, 0xd398, 0xd399, 0xd39c, 0xd3a0, 0xd3a8, 0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4, 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5, 0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8, 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed, 0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd, 0xd3ff, 0xd401, 0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460, 0xd464, 0xd46d, 0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480, 0xd482, 0xd488, 0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc, 0xd4d0, 0xd4d4, 0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8, 0xd4fb, 0xd4fd, 0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517, 0xd53c, 0xd53d, 0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551, 0xd558, 0xd559, 0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b, 0xd56d, 0xd574, 0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587, 0xd588, 0xd589, 0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0, 0xd5d2, 0xd5d8, 0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8, 0xd5ec, 0xd5f4, 0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604, 0xd608, 0xd610, 0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620, 0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648, 0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c, 0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c, 0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac, 0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1, 0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5, 0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c, 0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738, 0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756, 0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769, 0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789, 0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5, 0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c, 0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36, 0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404, 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3, 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7, 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5, 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593, 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x611f, 0x61be, 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3, 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95, 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808, 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f, 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221, 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x0000, 0x9c47, 0x4ecb, 0x4ef7, 0x500b, 0x51f1, 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea, 0x6f11, 0x75a5, 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0x0000, 0x93a7, 0x958b, 0x5580, 0x5ba2, 0x5751, 0x66f4, 0x7cb3, 0x7fb9, 0x91b5, 0x5028, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da, 0x64e7, 0x6e20, 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0x0000, 0x907d, 0x9245, 0x92f8, 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171, 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x5109, 0x528d, 0x5292, 0x6aa2, 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, 0x5048, 0x61a9, 0x63ed, 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x0000, 0x8b74, 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, 0x0000, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1, 0x9803, 0x9838, 0x9a5a, 0x9be8, 0x4fc2, 0x5553, 0x583a, 0x0000, 0x5b63, 0x5c46, 0x60b8, 0x6212, 0x6842, 0x68b0, 0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d, 0x7cfb, 0x7e6b, 0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4, 0x53e4, 0x53e9, 0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b, 0x5eab, 0x62f7, 0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1, 0x6cbd, 0x75fc, 0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1, 0x818f, 0x82e6, 0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5, 0x0000, 0x8f9c, 0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed, 0x659b, 0x66f2, 0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, 0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0x0000, 0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, 0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, 0x978f, 0x0000, 0x5be1, 0x6208, 0x679c, 0x74dc, 0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846, 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0x4e32, 0x51a0, 0x5b98, 0x5bec, 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b, 0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0, 0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1, 0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821, 0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x81a0, 0x854e, 0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18, 0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe, 0x5340, 0x53e3, 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7, 0x5d87, 0x5ed0, 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb, 0x6b50, 0x6bc6, 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396, 0x7403, 0x77bf, 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205, 0x820a, 0x82df, 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1, 0x9264, 0x92b6, 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b, 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568, 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d, 0x8ecc, 0x994b, 0x0000, 0x6677, 0x6b78, 0x8cb4, 0x9b3c, 0x0000, 0x53eb, 0x572d, 0x594e, 0x63c6, 0x69fb, 0x73ea, 0x7845, 0x7aba, 0x7ac5, 0x7cfe, 0x8475, 0x898f, 0x8d73, 0x9035, 0x95a8, 0x52fb, 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0x0000, 0x6a58, 0x514b, 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0x5951, 0x4eca, 0x5997, 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, 0x887f, 0x895f, 0x91d1, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x4f01, 0x4f0e, 0x5176, 0x5180, 0x55dc, 0x5668, 0x573b, 0x57fa, 0x57fc, 0x5914, 0x5947, 0x5993, 0x5bc4, 0x5c90, 0x5d0e, 0x5df1, 0x5e7e, 0x5fcc, 0x6280, 0x65d7, 0x65e3, 0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f, 0x6b3a, 0x6c23, 0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a, 0x7482, 0x74a3, 0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947, 0x7948, 0x797a, 0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d, 0x808c, 0x8a18, 0x8b4f, 0x8c48, 0x8d77, 0x9321, 0x9324, 0x98e2, 0x9951, 0x9a0e, 0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409, 0x62ee, 0x6854, 0x0000, 0x55ab, 0x513a, 0x5587, 0x5948, 0x5a1c, 0x61e6, 0x61f6, 0x62cf, 0x62ff, 0x7669, 0x7f85, 0x863f, 0x87ba, 0x88f8, 0x908f, 0x90a3, 0x6a02, 0x6d1b, 0x70d9, 0x73de, 0x843d, 0x8afe, 0x916a, 0x99f1, 0x4e82, 0x5375, 0x6696, 0x6b04, 0x7156, 0x721b, 0x862d, 0x96e3, 0x9e1e, 0x634f, 0x637a, 0x5357, 0x5d50, 0x678f, 0x6960, 0x6e73, 0x6feb, 0x7537, 0x85cd, 0x8964, 0x62c9, 0x7d0d, 0x81d8, 0x881f, 0x8872, 0x56ca, 0x5a18, 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x90de, 0x4e43, 0x4f86, 0x5167, 0x0000, 0x67f0, 0x8010, 0x51b7, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c, 0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0x52de, 0x5974, 0x5f29, 0x6012, 0x64c4, 0x6ad3, 0x7210, 0x7459, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def, 0x9732, 0x99d1, 0x9b6f, 0x9dfa, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, 0x9e7f, 0x8ad6, 0x58df, 0x5f04, 0x6fc3, 0x7c60, 0x807e, 0x81bf, 0x8fb2, 0x60f1, 0x7262, 0x78ca, 0x8166, 0x8cc2, 0x96f7, 0x5c3f, 0x58d8, 0x5c62, 0x6a13, 0x6dda, 0x6f0f, 0x7d2f, 0x7e37, 0x964b, 0x5ae9, 0x8a25, 0x677b, 0x7d10, 0x52d2, 0x808b, 0x51dc, 0x51cc, 0x7a1c, 0x7dbe, 0x80fd, 0x83f1, 0x9675, 0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336, 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8, 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1, 0x5e36, 0x5f85, 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8, 0x968a, 0x9edb, 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835, 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6, 0x5f92, 0x60bc, 0x6311, 0x6389, 0x6417, 0x6843, 0x68f9, 0x6ac2, 0x6dd8, 0x6e21, 0x6ed4, 0x6fe4, 0x71fe, 0x76dc, 0x7779, 0x79b1, 0x7a3b, 0x8404, 0x89a9, 0x8ced, 0x8df3, 0x8e48, 0x9003, 0x9014, 0x9053, 0x90fd, 0x934d, 0x9676, 0x97dc, 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x515c, 0x6597, 0x675c, 0x6793, 0x75d8, 0x7ac7, 0x8373, 0x0000, 0x8c46, 0x9017, 0x982d, 0x5c6f, 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97, 0x5d9d, 0x6a59, 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b12, 0x703e, 0x0000, 0x0000, 0x0000, 0x524c, 0x8fa3, 0x0000, 0x64e5, 0x652c, 0x6b16, 0x0000, 0x7c43, 0x7e9c, 0x0000, 0x0000, 0x89bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7405, 0x746f, 0x8782, 0x0000, 0x0000, 0x5d0d, 0x5fa0, 0x840a, 0x0000, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, 0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, 0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec, 0x616e, 0x623e, 0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823, 0x95ad, 0x9a62, 0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23, 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a, 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582, 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0x0000, 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046, 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7, 0x79ae, 0x91b4, 0x96b7, 0x0000, 0x0000, 0x6488, 0x0000, 0x0000, 0x6f5e, 0x7018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f05, 0x0000, 0x0000, 0x0000, 0x9e75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e93, 0x0000, 0x0000, 0x0000, 0x6727, 0x7027, 0x74cf, 0x0000, 0x0000, 0x5121, 0x7028, 0x0000, 0x0000, 0x0000, 0x8cda, 0x8cf4, 0x0000, 0x4e86, 0x50da, 0x5bee, 0x5ed6, 0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc, 0x907c, 0x9b27, 0x9f8d, 0x0000, 0x5a41, 0x0000, 0x0000, 0x0000, 0x0000, 0x763b, 0x0000, 0x0000, 0x851e, 0x8938, 0x93e4, 0x0000, 0x5289, 0x65d2, 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409, 0x7460, 0x7559, 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e, 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817, 0x7387, 0x9686, 0x0000, 0x0000, 0x0000, 0x0000, 0x695e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fda, 0x5229, 0x5398, 0x540f, 0x550e, 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281, 0x72f8, 0x7406, 0x7483, 0x7570, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8, 0x8389, 0x88cf, 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d, 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f, 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, 0x7acb, 0x7b20, 0x7c92, 0x6469, 0x746a, 0x75f2, 0x78bc, 0x78e8, 0x99ac, 0x9b54, 0x9ebb, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x57cb, 0x59b9, 0x5a92, 0x5bd0, 0x6627, 0x679a, 0x6885, 0x6bcf, 0x7164, 0x7f75, 0x8cb7, 0x8ce3, 0x9081, 0x9b45, 0x8108, 0x8c8a, 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, 0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, 0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, 0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d, 0x6155, 0x6478, 0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb, 0x725f, 0x7261, 0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305, 0x8b00, 0x8b28, 0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, 0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f, 0x5893, 0x5999, 0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b, 0x7ad7, 0x82d7, 0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a, 0x62c7, 0x64ab, 0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7, 0x755d, 0x7e46, 0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727, 0x9d61, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587, 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff, 0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae, 0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e, 0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d, 0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, 0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, 0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, 0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, 0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, 0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc, 0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, 0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8, 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609, 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b, 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90, 0x500d, 0x4ff3, 0x5317, 0x57f9, 0x5f98, 0x62dc, 0x6392, 0x676f, 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4, 0x88f5, 0x8919, 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70, 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a, 0x7169, 0x71d4, 0x756a, 0x0000, 0x7e41, 0x8543, 0x85e9, 0x98dc, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e, 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb, 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x78a7, 0x8617, 0x95e2, 0x9739, 0x4fbf, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4fdd, 0x5821, 0x5831, 0x5bf6, 0x666e, 0x6b65, 0x6d11, 0x6e7a, 0x6f7d, 0x73e4, 0x752b, 0x83e9, 0x88dc, 0x8913, 0x8b5c, 0x8f14, 0x4f0f, 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702, 0x9022, 0x92d2, 0x9cf3, 0x4e0d, 0x4ed8, 0x4fef, 0x5085, 0x5256, 0x526f, 0x5426, 0x5490, 0x57e0, 0x592b, 0x5a66, 0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0x0000, 0x6276, 0x6577, 0x65a7, 0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36, 0x8150, 0x8151, 0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0, 0x8ce6, 0x8cfb, 0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644, 0x99d9, 0x9ce7, 0x0000, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0x0000, 0x4f5b, 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, 0x9d6c, 0x4e15, 0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62, 0x5e87, 0x60b2, 0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7, 0x6bd4, 0x6bd6, 0x6bd7, 0x6bd8, 0x6cb8, 0x6ccc, 0x7435, 0x75fa, 0x7812, 0x7891, 0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5, 0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb, 0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, 0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, 0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b, 0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2, 0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb, 0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c, 0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23, 0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9, 0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x86c7, 0x88df, 0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc, 0x99df, 0x9e9d, 0x524a, 0x6578, 0x6714, 0x7d22, 0x5098, 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x4e09, 0x53c3, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, 0x8c61, 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7, 0x0000, 0x7a61, 0x0000, 0x8272, 0x7272, 0x751f, 0x7525, 0x7701, 0x7b19, 0x5885, 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055, 0x6292, 0x637f, 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2, 0x7280, 0x745e, 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72, 0x80e5, 0x8212, 0x85af, 0x897f, 0x8a93, 0x901d, 0x92e4, 0x9ecd, 0x9f20, 0x5915, 0x596d, 0x5e2d, 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584, 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401, 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8, 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078, 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583, 0x965d, 0x651d, 0x6d89, 0x71ee, 0x8449, 0x57ce, 0x59d3, 0x5bac, 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db, 0x0000, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16, 0x52e2, 0x6b72, 0x6d17, 0x7a05, 0x7b39, 0x7d30, 0x0000, 0x8cb0, 0x53ec, 0x562f, 0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240, 0x6383, 0x6414, 0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f, 0x70a4, 0x71d2, 0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0, 0x7c2b, 0x7d20, 0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d, 0x9061, 0x90b5, 0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f, 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd, 0x640d, 0x84c0, 0x905c, 0x98e1, 0x0000, 0x5b8b, 0x609a, 0x677e, 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x5237, 0x0000, 0x7051, 0x788e, 0x9396, 0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da, 0x5782, 0x58fd, 0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101, 0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x0000, 0x6a39, 0x6b8a, 0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2, 0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac, 0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896, 0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9, 0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3, 0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, 0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, 0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, 0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340, 0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, 0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f, 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e, 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805, 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4, 0x5c38, 0x5c4e, 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f, 0x6642, 0x67be, 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494, 0x84cd, 0x8996, 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4, 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0x8fb0, 0x8fc5, 0x5931, 0x5ba4, 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0x6c88, 0x6df1, 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, 0x0000, 0x96d9, 0x6c0f, 0x4e9e, 0x4fc4, 0x5152, 0x555e, 0x5a25, 0x5ce8, 0x6211, 0x7259, 0x82bd, 0x83aa, 0x86fe, 0x8859, 0x8a1d, 0x963f, 0x96c5, 0x9913, 0x9d09, 0x9d5d, 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x0000, 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5393, 0x54c0, 0x57c3, 0x5d16, 0x611b, 0x66d6, 0x6daf, 0x788d, 0x827e, 0x9698, 0x9744, 0x5384, 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, 0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b, 0x51b6, 0x591c, 0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0x82e5, 0x91ce, 0x5f31, 0x0000, 0x0000, 0x7d04, 0x0000, 0x846f, 0x84bb, 0x85e5, 0x8e8d, 0x0000, 0x4f6f, 0x0000, 0x0000, 0x58e4, 0x5b43, 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0x0000, 0x694a, 0x6a23, 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0x0000, 0x7f8a, 0x0000, 0x8944, 0x0000, 0x8b93, 0x91c0, 0x967d, 0x0000, 0x990a, 0x5704, 0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e, 0x99ad, 0x9b5a, 0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, 0x4e88, 0x4f59, 0x0000, 0x0000, 0x0000, 0x5982, 0x0000, 0x0000, 0x6b5f, 0x6c5d, 0x0000, 0x74b5, 0x7916, 0x0000, 0x8207, 0x8245, 0x8339, 0x8f3f, 0x8f5d, 0x0000, 0x9918, 0x0000, 0x0000, 0x0000, 0x4ea6, 0x0000, 0x57df, 0x5f79, 0x6613, 0x0000, 0x0000, 0x75ab, 0x7e79, 0x8b6f, 0x0000, 0x9006, 0x9a5b, 0x56a5, 0x5827, 0x59f8, 0x5a1f, 0x5bb4, 0x0000, 0x5ef6, 0x0000, 0x0000, 0x6350, 0x633b, 0x0000, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, 0x6f14, 0x0000, 0x70df, 0x7136, 0x7159, 0x0000, 0x71c3, 0x71d5, 0x0000, 0x784f, 0x786f, 0x0000, 0x7b75, 0x7de3, 0x0000, 0x7e2f, 0x0000, 0x884d, 0x8edf, 0x0000, 0x0000, 0x0000, 0x925b, 0x0000, 0x9cf6, 0x0000, 0x0000, 0x54bd, 0x6085, 0x6d85, 0x0000, 0x71b1, 0x0000, 0x0000, 0x95b1, 0x53ad, 0x0000, 0x0000, 0x0000, 0x67d3, 0x0000, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0x0000, 0x95bb, 0x9ae5, 0x9e7d, 0x66c4, 0x0000, 0x71c1, 0x0000, 0x0000, 0x0000, 0x584b, 0x0000, 0x0000, 0x5db8, 0x5f71, 0x0000, 0x6620, 0x668e, 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b, 0x702f, 0x7150, 0x71df, 0x7370, 0x0000, 0x745b, 0x7469, 0x74d4, 0x76c8, 0x7a4e, 0x7e93, 0x0000, 0x0000, 0x82f1, 0x8a60, 0x8fce, 0x0000, 0x9348, 0x0000, 0x9719, 0x0000, 0x0000, 0x4e42, 0x502a, 0x0000, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca, 0x730a, 0x777f, 0x7a62, 0x82ae, 0x85dd, 0x8602, 0x0000, 0x88d4, 0x8a63, 0x8b7d, 0x8c6b, 0x0000, 0x92b3, 0x0000, 0x9713, 0x9810, 0x4e94, 0x4f0d, 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da, 0x5862, 0x58ba, 0x5967, 0x5a1b, 0x5be4, 0x609f, 0x0000, 0x61ca, 0x6556, 0x65ff, 0x6664, 0x68a7, 0x6c5a, 0x6fb3, 0x70cf, 0x71ac, 0x7352, 0x7b7d, 0x8708, 0x8aa4, 0x9c32, 0x9f07, 0x5c4b, 0x6c83, 0x7344, 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, 0x96cd, 0x9954, 0x6e26, 0x74e6, 0x7aa9, 0x7aaa, 0x81e5, 0x86d9, 0x8778, 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, 0x6c6a, 0x738b, 0x502d, 0x5a03, 0x6b6a, 0x77ee, 0x5916, 0x5d6c, 0x5dcd, 0x7325, 0x754f, 0x0000, 0x0000, 0x50e5, 0x51f9, 0x582f, 0x592d, 0x5996, 0x59da, 0x5be5, 0x0000, 0x0000, 0x5da2, 0x62d7, 0x6416, 0x6493, 0x64fe, 0x0000, 0x66dc, 0x0000, 0x6a48, 0x0000, 0x71ff, 0x7464, 0x0000, 0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170, 0x0000, 0x87ef, 0x8981, 0x8b20, 0x9059, 0x0000, 0x9080, 0x9952, 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad, 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995, 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073, 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0x0000, 0x4e8e, 0x4f51, 0x5076, 0x512a, 0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24, 0x611a, 0x6182, 0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950, 0x7991, 0x79b9, 0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2, 0x9047, 0x90f5, 0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67, 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91, 0x6688, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553, 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a, 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b, 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72, 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060, 0x0000, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d, 0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170, 0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466, 0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f, 0x4e73, 0x4f91, 0x5112, 0x516a, 0x0000, 0x552f, 0x55a9, 0x5b7a, 0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x6108, 0x6109, 0x63c4, 0x6538, 0x6709, 0x0000, 0x67d4, 0x67da, 0x0000, 0x6961, 0x6962, 0x6cb9, 0x6d27, 0x0000, 0x6e38, 0x0000, 0x6fe1, 0x7336, 0x7337, 0x0000, 0x745c, 0x7531, 0x0000, 0x7652, 0x0000, 0x0000, 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb, 0x8aed, 0x8e30, 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9, 0x936e, 0x0000, 0x0000, 0x5809, 0x0000, 0x6bd3, 0x8089, 0x80b2, 0x0000, 0x0000, 0x5141, 0x596b, 0x5c39, 0x0000, 0x0000, 0x6f64, 0x73a7, 0x80e4, 0x8d07, 0x0000, 0x9217, 0x958f, 0x0000, 0x0000, 0x0000, 0x0000, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0x0000, 0x57a0, 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100, 0x5b9c, 0x610f, 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3, 0x7fa9, 0x8264, 0x858f, 0x87fb, 0x8863, 0x8abc, 0x8b70, 0x91ab, 0x4e8c, 0x4ee5, 0x4f0a, 0x0000, 0x0000, 0x5937, 0x59e8, 0x0000, 0x5df2, 0x5f1b, 0x5f5b, 0x6021, 0x0000, 0x0000, 0x0000, 0x0000, 0x723e, 0x73e5, 0x0000, 0x0000, 0x75cd, 0x0000, 0x79fb, 0x0000, 0x800c, 0x8033, 0x8084, 0x82e1, 0x8351, 0x0000, 0x0000, 0x8cbd, 0x8cb3, 0x9087, 0x0000, 0x0000, 0x98f4, 0x990c, 0x0000, 0x0000, 0x7037, 0x76ca, 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370, 0x0000, 0x0000, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, 0x0000, 0x0000, 0x7d6a, 0x8335, 0x0000, 0x8693, 0x8a8d, 0x0000, 0x976d, 0x9777, 0x0000, 0x0000, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a, 0x59d9, 0x6041, 0x0000, 0x0000, 0x7a14, 0x0000, 0x834f, 0x8cc3, 0x5165, 0x5344, 0x0000, 0x0000, 0x0000, 0x4ecd, 0x5269, 0x5b55, 0x82bf, 0x4ed4, 0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57, 0x5b5c, 0x6063, 0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7, 0x75b5, 0x78c1, 0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9, 0x8aee, 0x8cc7, 0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0x0000, 0x7350, 0x748b, 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, 0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d, 0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09, 0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e, 0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17, 0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7, 0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8, 0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575, 0x6ef4, 0x72c4, 0x0000, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e, 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea, 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, 0x5178, 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb, 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, 0x975c, 0x9802, 0x9f0e, 0x5236, 0x5291, 0x557c, 0x5824, 0x5e1d, 0x5f1f, 0x608c, 0x63d0, 0x68af, 0x6fdf, 0x796d, 0x7b2c, 0x81cd, 0x85ba, 0x88fd, 0x8af8, 0x8e44, 0x918d, 0x9664, 0x969b, 0x973d, 0x984c, 0x9f4a, 0x4fce, 0x5146, 0x51cb, 0x52a9, 0x5632, 0x5f14, 0x5f6b, 0x63aa, 0x64cd, 0x65e9, 0x6641, 0x66fa, 0x66f9, 0x671d, 0x689d, 0x68d7, 0x69fd, 0x6f15, 0x6f6e, 0x7167, 0x71e5, 0x722a, 0x74aa, 0x773a, 0x7956, 0x795a, 0x79df, 0x7a20, 0x7a95, 0x7c97, 0x7cdf, 0x7d44, 0x7e70, 0x8087, 0x85fb, 0x86a4, 0x8a54, 0x8abf, 0x8d99, 0x8e81, 0x9020, 0x906d, 0x91e3, 0x963b, 0x96d5, 0x9ce5, 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9, 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, 0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750, 0x5de6, 0x5ea7, 0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a, 0x59dd, 0x80c4, 0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde, 0x5eda, 0x665d, 0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a, 0x6f8d, 0x70b7, 0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2, 0x821f, 0x86db, 0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031, 0x914e, 0x9152, 0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea, 0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f, 0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c, 0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3, 0x829d, 0x82b7, 0x8718, 0x8a8c, 0x0000, 0x8d04, 0x8dbe, 0x9072, 0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875, 0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25, 0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e, 0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a, 0x8cd1, 0x8eeb, 0x0000, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f, 0x6715, 0x0000, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f, 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f, 0x53c9, 0x55df, 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a, 0x0000, 0x8e49, 0x8eca, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed, 0x0000, 0x5879, 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5, 0x57f0, 0x5bc0, 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc, 0x8521, 0x91c7, 0x91f5, 0x518a, 0x67f5, 0x7b56, 0x8cac, 0x51c4, 0x59bb, 0x60bd, 0x8655, 0x501c, 0x0000, 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0x0000, 0x5243, 0x66ff, 0x6d95, 0x6eef, 0x7de0, 0x8ae6, 0x902e, 0x905e, 0x9ad4, 0x521d, 0x527f, 0x54e8, 0x6194, 0x6284, 0x62db, 0x68a2, 0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d, 0x7901, 0x790e, 0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349, 0x8549, 0x8c82, 0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1, 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, 0x8525, 0x9283, 0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd, 0x63a8, 0x690e, 0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb, 0x8429, 0x8acf, 0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310, 0x9318, 0x939a, 0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, 0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403, 0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0, 0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074, 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4, 0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4, 0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4, 0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed, 0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x0000, 0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31, 0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253, 0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x99dd, 0x502c, 0x5353, 0x5544, 0x577c, 0x0000, 0x6258, 0x0000, 0x64e2, 0x666b, 0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0x0000, 0x8569, 0x514c, 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70, 0x6cf0, 0x7b1e, 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0x0000, 0x64c7, 0x6fa4, 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e, 0x615f, 0x6876, 0x0000, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806, 0x69cc, 0x817f, 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac, 0x6295, 0x900f, 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46, 0x5df4, 0x628a, 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c, 0x7436, 0x7834, 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742, 0x677f, 0x7248, 0x74e3, 0x8ca9, 0x8fa6, 0x9211, 0x962a, 0x516b, 0x53ed, 0x634c, 0x4f69, 0x5504, 0x6096, 0x6557, 0x6c9b, 0x6d7f, 0x724c, 0x72fd, 0x7a17, 0x8987, 0x8c9d, 0x5f6d, 0x6f8e, 0x70f9, 0x81a8, 0x610e, 0x0000, 0x504f, 0x6241, 0x7247, 0x7bc7, 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, 0x67b0, 0x840d, 0x8a55, 0x5420, 0x5b16, 0x5e63, 0x5ee2, 0x5f0a, 0x6583, 0x80ba, 0x853d, 0x9589, 0x965b, 0x4f48, 0x5305, 0x530d, 0x530f, 0x5486, 0x54fa, 0x5703, 0x5e03, 0x6016, 0x629b, 0x62b1, 0x6355, 0x66b4, 0x6ce1, 0x6d66, 0x75b1, 0x7832, 0x80de, 0x812f, 0x82de, 0x8461, 0x84b2, 0x888d, 0x8912, 0x900b, 0x92ea, 0x98fd, 0x9b91, 0x5e45, 0x0000, 0x66dd, 0x7011, 0x7206, 0x0000, 0x4ff5, 0x527d, 0x5f6a, 0x6153, 0x6753, 0x6a19, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8c79, 0x98c7, 0x98c4, 0x9a43, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, 0x5f7c, 0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642, 0x5339, 0x5f3c, 0x5fc5, 0x0000, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f, 0x5ec8, 0x6630, 0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050, 0x971e, 0x9c15, 0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2, 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55, 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd, 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266, 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4, 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052, 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a, 0x884c, 0x964d, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a, 0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3, 0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016, 0x5e78, 0x674f, 0x8347, 0x0000, 0x4eab, 0x5411, 0x56ae, 0x73e6, 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b, 0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57, 0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, 0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d, 0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0x898b, 0x8ce2, 0x9249, 0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x4fe0, 0x5354, 0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2, 0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b, 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9, 0x0000, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8, 0x516e, 0x5f57, 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af, 0x978b, 0x4e4e, 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5, 0x5f27, 0x6236, 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf, 0x6e56, 0x6ef8, 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425, 0x745a, 0x74e0, 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6, 0x846b, 0x84bf, 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac, 0x9800, 0x9865, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, 0x5316, 0x548c, 0x5b05, 0x6a3a, 0x706b, 0x7575, 0x798d, 0x79be, 0x82b1, 0x83ef, 0x8a71, 0x8b41, 0x8ca8, 0x9774, 0x0000, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, 0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, 0x8757, 0x9051, 0x968d, 0x9ec3, 0x532f, 0x56de, 0x5efb, 0x5f8a, 0x6062, 0x6094, 0x61f7, 0x6666, 0x6703, 0x6a9c, 0x6dee, 0x6fae, 0x7070, 0x736a, 0x7e6a, 0x81be, 0x8334, 0x86d4, 0x8aa8, 0x8cc4, 0x5283, 0x7372, 0x5b96, 0x6a6b, 0x9404, 0x54ee, 0x5686, 0x5b5d, 0x6548, 0x6585, 0x66c9, 0x689f, 0x6d8d, 0x6dc6, 0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019, 0x539a, 0x540e, 0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d, 0x7166, 0x73dd, 0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, 0x85b0, 0x8a13, 0x0000, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, 0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee, 0x6689, 0x7147, 0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb, 0x7566, 0x8667, 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, 0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd, 0x59ec, 0x5b09, 0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6, 0x7199, 0x71b9, 0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffffffff, 0xffffffff, 0xffffffff, 0x0000, 0x0000, 0x79d4, 0x0004, 0x2288, 0x804f240 }; const unichar_t unicode_from_johab[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x0000, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x0000, 0x0000, 0x0000, 0x314f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3150, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3151, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3152, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3153, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3154, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3155, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3156, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3157, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3158, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3159, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x315f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3160, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3161, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3162, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3163, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac00, 0xac01, 0xac02, 0xac03, 0xac04, 0xac05, 0xac06, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac0b, 0xac0c, 0xac0d, 0xac0e, 0xac0f, 0xac10, 0x0000, 0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac18, 0xac19, 0xac1a, 0xac1b, 0x0000, 0x0000, 0x0000, 0xac1c, 0xac1d, 0xac1e, 0xac1f, 0xac20, 0xac21, 0xac22, 0xac23, 0xac24, 0xac25, 0xac26, 0xac27, 0xac28, 0xac29, 0xac2a, 0xac2b, 0xac2c, 0x0000, 0xac2d, 0xac2e, 0xac2f, 0xac30, 0xac31, 0xac32, 0xac33, 0xac34, 0xac35, 0xac36, 0xac37, 0x0000, 0x0000, 0x0000, 0xac38, 0xac39, 0xac3a, 0xac3b, 0xac3c, 0xac3d, 0xac3e, 0xac3f, 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0x0000, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0x0000, 0x0000, 0x0000, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0x0000, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0x0000, 0x0000, 0x0000, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac7f, 0xac80, 0x0000, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a, 0xac8b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0x0000, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xaca1, 0xaca2, 0xaca3, 0xaca4, 0xaca5, 0xaca6, 0xaca7, 0x0000, 0x0000, 0x0000, 0xaca8, 0xaca9, 0xacaa, 0xacab, 0xacac, 0xacad, 0xacae, 0xacaf, 0xacb0, 0xacb1, 0xacb2, 0xacb3, 0xacb4, 0xacb5, 0xacb6, 0xacb7, 0xacb8, 0x0000, 0xacb9, 0xacba, 0xacbb, 0xacbc, 0xacbd, 0xacbe, 0xacbf, 0xacc0, 0xacc1, 0xacc2, 0xacc3, 0x0000, 0x0000, 0x0000, 0xacc4, 0xacc5, 0xacc6, 0xacc7, 0xacc8, 0xacc9, 0xacca, 0xaccb, 0xaccc, 0xaccd, 0xacce, 0xaccf, 0xacd0, 0xacd1, 0xacd2, 0xacd3, 0xacd4, 0x0000, 0xacd5, 0xacd6, 0xacd7, 0xacd8, 0xacd9, 0xacda, 0xacdb, 0xacdc, 0xacdd, 0xacde, 0xacdf, 0x0000, 0x0000, 0x0000, 0xace0, 0xace1, 0xace2, 0xace3, 0xace4, 0xace5, 0xace6, 0xace7, 0xace8, 0xace9, 0xacea, 0xaceb, 0xacec, 0xaced, 0xacee, 0xacef, 0xacf0, 0x0000, 0xacf1, 0xacf2, 0xacf3, 0xacf4, 0xacf5, 0xacf6, 0xacf7, 0xacf8, 0xacf9, 0xacfa, 0xacfb, 0x0000, 0x0000, 0x0000, 0xacfc, 0xacfd, 0xacfe, 0xacff, 0xad00, 0xad01, 0xad02, 0xad03, 0xad04, 0xad05, 0xad06, 0xad07, 0xad08, 0xad09, 0xad0a, 0xad0b, 0xad0c, 0x0000, 0xad0d, 0xad0e, 0xad0f, 0xad10, 0xad11, 0xad12, 0xad13, 0xad14, 0xad15, 0xad16, 0xad17, 0x0000, 0x0000, 0x0000, 0xad18, 0xad19, 0xad1a, 0xad1b, 0xad1c, 0xad1d, 0xad1e, 0xad1f, 0xad20, 0xad21, 0xad22, 0xad23, 0xad24, 0xad25, 0xad26, 0xad27, 0xad28, 0x0000, 0xad29, 0xad2a, 0xad2b, 0xad2c, 0xad2d, 0xad2e, 0xad2f, 0xad30, 0xad31, 0xad32, 0xad33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad34, 0xad35, 0xad36, 0xad37, 0xad38, 0xad39, 0xad3a, 0xad3b, 0xad3c, 0xad3d, 0xad3e, 0xad3f, 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0x0000, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0x0000, 0x0000, 0x0000, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0x0000, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0x0000, 0x0000, 0x0000, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0x0000, 0xad7d, 0xad7e, 0xad7f, 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0x0000, 0x0000, 0x0000, 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0x0000, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xada1, 0xada2, 0xada3, 0x0000, 0x0000, 0x0000, 0xada4, 0xada5, 0xada6, 0xada7, 0xada8, 0xada9, 0xadaa, 0xadab, 0xadac, 0xadad, 0xadae, 0xadaf, 0xadb0, 0xadb1, 0xadb2, 0xadb3, 0xadb4, 0x0000, 0xadb5, 0xadb6, 0xadb7, 0xadb8, 0xadb9, 0xadba, 0xadbb, 0xadbc, 0xadbd, 0xadbe, 0xadbf, 0x0000, 0x0000, 0x0000, 0xadc0, 0xadc1, 0xadc2, 0xadc3, 0xadc4, 0xadc5, 0xadc6, 0xadc7, 0xadc8, 0xadc9, 0xadca, 0xadcb, 0xadcc, 0xadcd, 0xadce, 0xadcf, 0xadd0, 0x0000, 0xadd1, 0xadd2, 0xadd3, 0xadd4, 0xadd5, 0xadd6, 0xadd7, 0xadd8, 0xadd9, 0xadda, 0xaddb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaddc, 0xaddd, 0xadde, 0xaddf, 0xade0, 0xade1, 0xade2, 0xade3, 0xade4, 0xade5, 0xade6, 0xade7, 0xade8, 0xade9, 0xadea, 0xadeb, 0xadec, 0x0000, 0xaded, 0xadee, 0xadef, 0xadf0, 0xadf1, 0xadf2, 0xadf3, 0xadf4, 0xadf5, 0xadf6, 0xadf7, 0x0000, 0x0000, 0x0000, 0xadf8, 0xadf9, 0xadfa, 0xadfb, 0xadfc, 0xadfd, 0xadfe, 0xadff, 0xae00, 0xae01, 0xae02, 0xae03, 0xae04, 0xae05, 0xae06, 0xae07, 0xae08, 0x0000, 0xae09, 0xae0a, 0xae0b, 0xae0c, 0xae0d, 0xae0e, 0xae0f, 0xae10, 0xae11, 0xae12, 0xae13, 0x0000, 0x0000, 0x0000, 0xae14, 0xae15, 0xae16, 0xae17, 0xae18, 0xae19, 0xae1a, 0xae1b, 0xae1c, 0xae1d, 0xae1e, 0xae1f, 0xae20, 0xae21, 0xae22, 0xae23, 0xae24, 0x0000, 0xae25, 0xae26, 0xae27, 0xae28, 0xae29, 0xae2a, 0xae2b, 0xae2c, 0xae2d, 0xae2e, 0xae2f, 0x0000, 0x0000, 0x0000, 0xae30, 0xae31, 0xae32, 0xae33, 0xae34, 0xae35, 0xae36, 0xae37, 0xae38, 0xae39, 0xae3a, 0xae3b, 0xae3c, 0xae3d, 0xae3e, 0xae3f, 0xae40, 0x0000, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49, 0xae4a, 0xae4b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0x0000, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0x0000, 0x0000, 0x0000, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0x0000, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae7f, 0xae80, 0xae81, 0xae82, 0xae83, 0x0000, 0x0000, 0x0000, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0x0000, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0x0000, 0x0000, 0x0000, 0xaea0, 0xaea1, 0xaea2, 0xaea3, 0xaea4, 0xaea5, 0xaea6, 0xaea7, 0xaea8, 0xaea9, 0xaeaa, 0xaeab, 0xaeac, 0xaead, 0xaeae, 0xaeaf, 0xaeb0, 0x0000, 0xaeb1, 0xaeb2, 0xaeb3, 0xaeb4, 0xaeb5, 0xaeb6, 0xaeb7, 0xaeb8, 0xaeb9, 0xaeba, 0xaebb, 0x0000, 0x0000, 0x0000, 0xaebc, 0xaebd, 0xaebe, 0xaebf, 0xaec0, 0xaec1, 0xaec2, 0xaec3, 0xaec4, 0xaec5, 0xaec6, 0xaec7, 0xaec8, 0xaec9, 0xaeca, 0xaecb, 0xaecc, 0x0000, 0xaecd, 0xaece, 0xaecf, 0xaed0, 0xaed1, 0xaed2, 0xaed3, 0xaed4, 0xaed5, 0xaed6, 0xaed7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaed8, 0xaed9, 0xaeda, 0xaedb, 0xaedc, 0xaedd, 0xaede, 0xaedf, 0xaee0, 0xaee1, 0xaee2, 0xaee3, 0xaee4, 0xaee5, 0xaee6, 0xaee7, 0xaee8, 0x0000, 0xaee9, 0xaeea, 0xaeeb, 0xaeec, 0xaeed, 0xaeee, 0xaeef, 0xaef0, 0xaef1, 0xaef2, 0xaef3, 0x0000, 0x0000, 0x0000, 0xaef4, 0xaef5, 0xaef6, 0xaef7, 0xaef8, 0xaef9, 0xaefa, 0xaefb, 0xaefc, 0xaefd, 0xaefe, 0xaeff, 0xaf00, 0xaf01, 0xaf02, 0xaf03, 0xaf04, 0x0000, 0xaf05, 0xaf06, 0xaf07, 0xaf08, 0xaf09, 0xaf0a, 0xaf0b, 0xaf0c, 0xaf0d, 0xaf0e, 0xaf0f, 0x0000, 0x0000, 0x0000, 0xaf10, 0xaf11, 0xaf12, 0xaf13, 0xaf14, 0xaf15, 0xaf16, 0xaf17, 0xaf18, 0xaf19, 0xaf1a, 0xaf1b, 0xaf1c, 0xaf1d, 0xaf1e, 0xaf1f, 0xaf20, 0x0000, 0xaf21, 0xaf22, 0xaf23, 0xaf24, 0xaf25, 0xaf26, 0xaf27, 0xaf28, 0xaf29, 0xaf2a, 0xaf2b, 0x0000, 0x0000, 0x0000, 0xaf2c, 0xaf2d, 0xaf2e, 0xaf2f, 0xaf30, 0xaf31, 0xaf32, 0xaf33, 0xaf34, 0xaf35, 0xaf36, 0xaf37, 0xaf38, 0xaf39, 0xaf3a, 0xaf3b, 0xaf3c, 0x0000, 0xaf3d, 0xaf3e, 0xaf3f, 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0x0000, 0x0000, 0x0000, 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0x0000, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0x0000, 0x0000, 0x0000, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0x0000, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf7f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0x0000, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0x0000, 0x0000, 0x0000, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xafa1, 0xafa2, 0xafa3, 0xafa4, 0xafa5, 0xafa6, 0xafa7, 0xafa8, 0xafa9, 0xafaa, 0xafab, 0xafac, 0x0000, 0xafad, 0xafae, 0xafaf, 0xafb0, 0xafb1, 0xafb2, 0xafb3, 0xafb4, 0xafb5, 0xafb6, 0xafb7, 0x0000, 0x0000, 0x0000, 0xafb8, 0xafb9, 0xafba, 0xafbb, 0xafbc, 0xafbd, 0xafbe, 0xafbf, 0xafc0, 0xafc1, 0xafc2, 0xafc3, 0xafc4, 0xafc5, 0xafc6, 0xafc7, 0xafc8, 0x0000, 0xafc9, 0xafca, 0xafcb, 0xafcc, 0xafcd, 0xafce, 0xafcf, 0xafd0, 0xafd1, 0xafd2, 0xafd3, 0x0000, 0x0000, 0x0000, 0xafd4, 0xafd5, 0xafd6, 0xafd7, 0xafd8, 0xafd9, 0xafda, 0xafdb, 0xafdc, 0xafdd, 0xafde, 0xafdf, 0xafe0, 0xafe1, 0xafe2, 0xafe3, 0xafe4, 0x0000, 0xafe5, 0xafe6, 0xafe7, 0xafe8, 0xafe9, 0xafea, 0xafeb, 0xafec, 0xafed, 0xafee, 0xafef, 0x0000, 0x0000, 0x0000, 0xaff0, 0xaff1, 0xaff2, 0xaff3, 0xaff4, 0xaff5, 0xaff6, 0xaff7, 0xaff8, 0xaff9, 0xaffa, 0xaffb, 0xaffc, 0xaffd, 0xaffe, 0xafff, 0xb000, 0x0000, 0xb001, 0xb002, 0xb003, 0xb004, 0xb005, 0xb006, 0xb007, 0xb008, 0xb009, 0xb00a, 0xb00b, 0x0000, 0x0000, 0x0000, 0xb00c, 0xb00d, 0xb00e, 0xb00f, 0xb010, 0xb011, 0xb012, 0xb013, 0xb014, 0xb015, 0xb016, 0xb017, 0xb018, 0xb019, 0xb01a, 0xb01b, 0xb01c, 0x0000, 0xb01d, 0xb01e, 0xb01f, 0xb020, 0xb021, 0xb022, 0xb023, 0xb024, 0xb025, 0xb026, 0xb027, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb028, 0xb029, 0xb02a, 0xb02b, 0xb02c, 0xb02d, 0xb02e, 0xb02f, 0xb030, 0xb031, 0xb032, 0xb033, 0xb034, 0xb035, 0xb036, 0xb037, 0xb038, 0x0000, 0xb039, 0xb03a, 0xb03b, 0xb03c, 0xb03d, 0xb03e, 0xb03f, 0xb040, 0xb041, 0xb042, 0xb043, 0x0000, 0x0000, 0x0000, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0x0000, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0x0000, 0x0000, 0x0000, 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0x0000, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0x0000, 0x0000, 0x0000, 0xb07c, 0xb07d, 0xb07e, 0xb07f, 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0x0000, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb0a1, 0xb0a2, 0xb0a3, 0xb0a4, 0xb0a5, 0xb0a6, 0xb0a7, 0xb0a8, 0x0000, 0xb0a9, 0xb0aa, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af, 0xb0b0, 0xb0b1, 0xb0b2, 0xb0b3, 0x0000, 0x0000, 0x0000, 0xb0b4, 0xb0b5, 0xb0b6, 0xb0b7, 0xb0b8, 0xb0b9, 0xb0ba, 0xb0bb, 0xb0bc, 0xb0bd, 0xb0be, 0xb0bf, 0xb0c0, 0xb0c1, 0xb0c2, 0xb0c3, 0xb0c4, 0x0000, 0xb0c5, 0xb0c6, 0xb0c7, 0xb0c8, 0xb0c9, 0xb0ca, 0xb0cb, 0xb0cc, 0xb0cd, 0xb0ce, 0xb0cf, 0x0000, 0x0000, 0x0000, 0xb0d0, 0xb0d1, 0xb0d2, 0xb0d3, 0xb0d4, 0xb0d5, 0xb0d6, 0xb0d7, 0xb0d8, 0xb0d9, 0xb0da, 0xb0db, 0xb0dc, 0xb0dd, 0xb0de, 0xb0df, 0xb0e0, 0x0000, 0xb0e1, 0xb0e2, 0xb0e3, 0xb0e4, 0xb0e5, 0xb0e6, 0xb0e7, 0xb0e8, 0xb0e9, 0xb0ea, 0xb0eb, 0x0000, 0x0000, 0x0000, 0xb0ec, 0xb0ed, 0xb0ee, 0xb0ef, 0xb0f0, 0xb0f1, 0xb0f2, 0xb0f3, 0xb0f4, 0xb0f5, 0xb0f6, 0xb0f7, 0xb0f8, 0xb0f9, 0xb0fa, 0xb0fb, 0xb0fc, 0x0000, 0xb0fd, 0xb0fe, 0xb0ff, 0xb100, 0xb101, 0xb102, 0xb103, 0xb104, 0xb105, 0xb106, 0xb107, 0x0000, 0x0000, 0x0000, 0xb108, 0xb109, 0xb10a, 0xb10b, 0xb10c, 0xb10d, 0xb10e, 0xb10f, 0xb110, 0xb111, 0xb112, 0xb113, 0xb114, 0xb115, 0xb116, 0xb117, 0xb118, 0x0000, 0xb119, 0xb11a, 0xb11b, 0xb11c, 0xb11d, 0xb11e, 0xb11f, 0xb120, 0xb121, 0xb122, 0xb123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb124, 0xb125, 0xb126, 0xb127, 0xb128, 0xb129, 0xb12a, 0xb12b, 0xb12c, 0xb12d, 0xb12e, 0xb12f, 0xb130, 0xb131, 0xb132, 0xb133, 0xb134, 0x0000, 0xb135, 0xb136, 0xb137, 0xb138, 0xb139, 0xb13a, 0xb13b, 0xb13c, 0xb13d, 0xb13e, 0xb13f, 0x0000, 0x0000, 0x0000, 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0x0000, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0x0000, 0x0000, 0x0000, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0x0000, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0x0000, 0x0000, 0x0000, 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb17f, 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0x0000, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, 0xb193, 0x0000, 0x0000, 0x0000, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb1a1, 0xb1a2, 0xb1a3, 0xb1a4, 0x0000, 0xb1a5, 0xb1a6, 0xb1a7, 0xb1a8, 0xb1a9, 0xb1aa, 0xb1ab, 0xb1ac, 0xb1ad, 0xb1ae, 0xb1af, 0x0000, 0x0000, 0x0000, 0xb1b0, 0xb1b1, 0xb1b2, 0xb1b3, 0xb1b4, 0xb1b5, 0xb1b6, 0xb1b7, 0xb1b8, 0xb1b9, 0xb1ba, 0xb1bb, 0xb1bc, 0xb1bd, 0xb1be, 0xb1bf, 0xb1c0, 0x0000, 0xb1c1, 0xb1c2, 0xb1c3, 0xb1c4, 0xb1c5, 0xb1c6, 0xb1c7, 0xb1c8, 0xb1c9, 0xb1ca, 0xb1cb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb1cc, 0xb1cd, 0xb1ce, 0xb1cf, 0xb1d0, 0xb1d1, 0xb1d2, 0xb1d3, 0xb1d4, 0xb1d5, 0xb1d6, 0xb1d7, 0xb1d8, 0xb1d9, 0xb1da, 0xb1db, 0xb1dc, 0x0000, 0xb1dd, 0xb1de, 0xb1df, 0xb1e0, 0xb1e1, 0xb1e2, 0xb1e3, 0xb1e4, 0xb1e5, 0xb1e6, 0xb1e7, 0x0000, 0x0000, 0x0000, 0xb1e8, 0xb1e9, 0xb1ea, 0xb1eb, 0xb1ec, 0xb1ed, 0xb1ee, 0xb1ef, 0xb1f0, 0xb1f1, 0xb1f2, 0xb1f3, 0xb1f4, 0xb1f5, 0xb1f6, 0xb1f7, 0xb1f8, 0x0000, 0xb1f9, 0xb1fa, 0xb1fb, 0xb1fc, 0xb1fd, 0xb1fe, 0xb1ff, 0xb200, 0xb201, 0xb202, 0xb203, 0x0000, 0x0000, 0x0000, 0xb204, 0xb205, 0xb206, 0xb207, 0xb208, 0xb209, 0xb20a, 0xb20b, 0xb20c, 0xb20d, 0xb20e, 0xb20f, 0xb210, 0xb211, 0xb212, 0xb213, 0xb214, 0x0000, 0xb215, 0xb216, 0xb217, 0xb218, 0xb219, 0xb21a, 0xb21b, 0xb21c, 0xb21d, 0xb21e, 0xb21f, 0x0000, 0x0000, 0x0000, 0xb220, 0xb221, 0xb222, 0xb223, 0xb224, 0xb225, 0xb226, 0xb227, 0xb228, 0xb229, 0xb22a, 0xb22b, 0xb22c, 0xb22d, 0xb22e, 0xb22f, 0xb230, 0x0000, 0xb231, 0xb232, 0xb233, 0xb234, 0xb235, 0xb236, 0xb237, 0xb238, 0xb239, 0xb23a, 0xb23b, 0x0000, 0x0000, 0x0000, 0xb23c, 0xb23d, 0xb23e, 0xb23f, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0x0000, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0x0000, 0x0000, 0x0000, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0x0000, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb27f, 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0x0000, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0x0000, 0x0000, 0x0000, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0x0000, 0xb2a1, 0xb2a2, 0xb2a3, 0xb2a4, 0xb2a5, 0xb2a6, 0xb2a7, 0xb2a8, 0xb2a9, 0xb2aa, 0xb2ab, 0x0000, 0x0000, 0x0000, 0xb2ac, 0xb2ad, 0xb2ae, 0xb2af, 0xb2b0, 0xb2b1, 0xb2b2, 0xb2b3, 0xb2b4, 0xb2b5, 0xb2b6, 0xb2b7, 0xb2b8, 0xb2b9, 0xb2ba, 0xb2bb, 0xb2bc, 0x0000, 0xb2bd, 0xb2be, 0xb2bf, 0xb2c0, 0xb2c1, 0xb2c2, 0xb2c3, 0xb2c4, 0xb2c5, 0xb2c6, 0xb2c7, 0x0000, 0x0000, 0x0000, 0xb2c8, 0xb2c9, 0xb2ca, 0xb2cb, 0xb2cc, 0xb2cd, 0xb2ce, 0xb2cf, 0xb2d0, 0xb2d1, 0xb2d2, 0xb2d3, 0xb2d4, 0xb2d5, 0xb2d6, 0xb2d7, 0xb2d8, 0x0000, 0xb2d9, 0xb2da, 0xb2db, 0xb2dc, 0xb2dd, 0xb2de, 0xb2df, 0xb2e0, 0xb2e1, 0xb2e2, 0xb2e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb2e4, 0xb2e5, 0xb2e6, 0xb2e7, 0xb2e8, 0xb2e9, 0xb2ea, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee, 0xb2ef, 0xb2f0, 0xb2f1, 0xb2f2, 0xb2f3, 0xb2f4, 0x0000, 0xb2f5, 0xb2f6, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa, 0xb2fb, 0xb2fc, 0xb2fd, 0xb2fe, 0xb2ff, 0x0000, 0x0000, 0x0000, 0xb300, 0xb301, 0xb302, 0xb303, 0xb304, 0xb305, 0xb306, 0xb307, 0xb308, 0xb309, 0xb30a, 0xb30b, 0xb30c, 0xb30d, 0xb30e, 0xb30f, 0xb310, 0x0000, 0xb311, 0xb312, 0xb313, 0xb314, 0xb315, 0xb316, 0xb317, 0xb318, 0xb319, 0xb31a, 0xb31b, 0x0000, 0x0000, 0x0000, 0xb31c, 0xb31d, 0xb31e, 0xb31f, 0xb320, 0xb321, 0xb322, 0xb323, 0xb324, 0xb325, 0xb326, 0xb327, 0xb328, 0xb329, 0xb32a, 0xb32b, 0xb32c, 0x0000, 0xb32d, 0xb32e, 0xb32f, 0xb330, 0xb331, 0xb332, 0xb333, 0xb334, 0xb335, 0xb336, 0xb337, 0x0000, 0x0000, 0x0000, 0xb338, 0xb339, 0xb33a, 0xb33b, 0xb33c, 0xb33d, 0xb33e, 0xb33f, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0x0000, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0x0000, 0x0000, 0x0000, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0x0000, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb37f, 0xb380, 0x0000, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0x0000, 0x0000, 0x0000, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0x0000, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb3a1, 0xb3a2, 0xb3a3, 0xb3a4, 0xb3a5, 0xb3a6, 0xb3a7, 0x0000, 0x0000, 0x0000, 0xb3a8, 0xb3a9, 0xb3aa, 0xb3ab, 0xb3ac, 0xb3ad, 0xb3ae, 0xb3af, 0xb3b0, 0xb3b1, 0xb3b2, 0xb3b3, 0xb3b4, 0xb3b5, 0xb3b6, 0xb3b7, 0xb3b8, 0x0000, 0xb3b9, 0xb3ba, 0xb3bb, 0xb3bc, 0xb3bd, 0xb3be, 0xb3bf, 0xb3c0, 0xb3c1, 0xb3c2, 0xb3c3, 0x0000, 0x0000, 0x0000, 0xb3c4, 0xb3c5, 0xb3c6, 0xb3c7, 0xb3c8, 0xb3c9, 0xb3ca, 0xb3cb, 0xb3cc, 0xb3cd, 0xb3ce, 0xb3cf, 0xb3d0, 0xb3d1, 0xb3d2, 0xb3d3, 0xb3d4, 0x0000, 0xb3d5, 0xb3d6, 0xb3d7, 0xb3d8, 0xb3d9, 0xb3da, 0xb3db, 0xb3dc, 0xb3dd, 0xb3de, 0xb3df, 0x0000, 0x0000, 0x0000, 0xb3e0, 0xb3e1, 0xb3e2, 0xb3e3, 0xb3e4, 0xb3e5, 0xb3e6, 0xb3e7, 0xb3e8, 0xb3e9, 0xb3ea, 0xb3eb, 0xb3ec, 0xb3ed, 0xb3ee, 0xb3ef, 0xb3f0, 0x0000, 0xb3f1, 0xb3f2, 0xb3f3, 0xb3f4, 0xb3f5, 0xb3f6, 0xb3f7, 0xb3f8, 0xb3f9, 0xb3fa, 0xb3fb, 0x0000, 0x0000, 0x0000, 0xb3fc, 0xb3fd, 0xb3fe, 0xb3ff, 0xb400, 0xb401, 0xb402, 0xb403, 0xb404, 0xb405, 0xb406, 0xb407, 0xb408, 0xb409, 0xb40a, 0xb40b, 0xb40c, 0x0000, 0xb40d, 0xb40e, 0xb40f, 0xb410, 0xb411, 0xb412, 0xb413, 0xb414, 0xb415, 0xb416, 0xb417, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb418, 0xb419, 0xb41a, 0xb41b, 0xb41c, 0xb41d, 0xb41e, 0xb41f, 0xb420, 0xb421, 0xb422, 0xb423, 0xb424, 0xb425, 0xb426, 0xb427, 0xb428, 0x0000, 0xb429, 0xb42a, 0xb42b, 0xb42c, 0xb42d, 0xb42e, 0xb42f, 0xb430, 0xb431, 0xb432, 0xb433, 0x0000, 0x0000, 0x0000, 0xb434, 0xb435, 0xb436, 0xb437, 0xb438, 0xb439, 0xb43a, 0xb43b, 0xb43c, 0xb43d, 0xb43e, 0xb43f, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0x0000, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0x0000, 0x0000, 0x0000, 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0x0000, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0x0000, 0x0000, 0x0000, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0x0000, 0xb47d, 0xb47e, 0xb47f, 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0x0000, 0x0000, 0x0000, 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0x0000, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb4a1, 0xb4a2, 0xb4a3, 0x0000, 0x0000, 0x0000, 0xb4a4, 0xb4a5, 0xb4a6, 0xb4a7, 0xb4a8, 0xb4a9, 0xb4aa, 0xb4ab, 0xb4ac, 0xb4ad, 0xb4ae, 0xb4af, 0xb4b0, 0xb4b1, 0xb4b2, 0xb4b3, 0xb4b4, 0x0000, 0xb4b5, 0xb4b6, 0xb4b7, 0xb4b8, 0xb4b9, 0xb4ba, 0xb4bb, 0xb4bc, 0xb4bd, 0xb4be, 0xb4bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb4c0, 0xb4c1, 0xb4c2, 0xb4c3, 0xb4c4, 0xb4c5, 0xb4c6, 0xb4c7, 0xb4c8, 0xb4c9, 0xb4ca, 0xb4cb, 0xb4cc, 0xb4cd, 0xb4ce, 0xb4cf, 0xb4d0, 0x0000, 0xb4d1, 0xb4d2, 0xb4d3, 0xb4d4, 0xb4d5, 0xb4d6, 0xb4d7, 0xb4d8, 0xb4d9, 0xb4da, 0xb4db, 0x0000, 0x0000, 0x0000, 0xb4dc, 0xb4dd, 0xb4de, 0xb4df, 0xb4e0, 0xb4e1, 0xb4e2, 0xb4e3, 0xb4e4, 0xb4e5, 0xb4e6, 0xb4e7, 0xb4e8, 0xb4e9, 0xb4ea, 0xb4eb, 0xb4ec, 0x0000, 0xb4ed, 0xb4ee, 0xb4ef, 0xb4f0, 0xb4f1, 0xb4f2, 0xb4f3, 0xb4f4, 0xb4f5, 0xb4f6, 0xb4f7, 0x0000, 0x0000, 0x0000, 0xb4f8, 0xb4f9, 0xb4fa, 0xb4fb, 0xb4fc, 0xb4fd, 0xb4fe, 0xb4ff, 0xb500, 0xb501, 0xb502, 0xb503, 0xb504, 0xb505, 0xb506, 0xb507, 0xb508, 0x0000, 0xb509, 0xb50a, 0xb50b, 0xb50c, 0xb50d, 0xb50e, 0xb50f, 0xb510, 0xb511, 0xb512, 0xb513, 0x0000, 0x0000, 0x0000, 0xb514, 0xb515, 0xb516, 0xb517, 0xb518, 0xb519, 0xb51a, 0xb51b, 0xb51c, 0xb51d, 0xb51e, 0xb51f, 0xb520, 0xb521, 0xb522, 0xb523, 0xb524, 0x0000, 0xb525, 0xb526, 0xb527, 0xb528, 0xb529, 0xb52a, 0xb52b, 0xb52c, 0xb52d, 0xb52e, 0xb52f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3138, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb530, 0xb531, 0xb532, 0xb533, 0xb534, 0xb535, 0xb536, 0xb537, 0xb538, 0xb539, 0xb53a, 0xb53b, 0xb53c, 0xb53d, 0xb53e, 0xb53f, 0xb540, 0x0000, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54b, 0x0000, 0x0000, 0x0000, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0x0000, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0x0000, 0x0000, 0x0000, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0x0000, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb57f, 0xb580, 0xb581, 0xb582, 0xb583, 0x0000, 0x0000, 0x0000, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0x0000, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0x0000, 0x0000, 0x0000, 0xb5a0, 0xb5a1, 0xb5a2, 0xb5a3, 0xb5a4, 0xb5a5, 0xb5a6, 0xb5a7, 0xb5a8, 0xb5a9, 0xb5aa, 0xb5ab, 0xb5ac, 0xb5ad, 0xb5ae, 0xb5af, 0xb5b0, 0x0000, 0xb5b1, 0xb5b2, 0xb5b3, 0xb5b4, 0xb5b5, 0xb5b6, 0xb5b7, 0xb5b8, 0xb5b9, 0xb5ba, 0xb5bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb5bc, 0xb5bd, 0xb5be, 0xb5bf, 0xb5c0, 0xb5c1, 0xb5c2, 0xb5c3, 0xb5c4, 0xb5c5, 0xb5c6, 0xb5c7, 0xb5c8, 0xb5c9, 0xb5ca, 0xb5cb, 0xb5cc, 0x0000, 0xb5cd, 0xb5ce, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d2, 0xb5d3, 0xb5d4, 0xb5d5, 0xb5d6, 0xb5d7, 0x0000, 0x0000, 0x0000, 0xb5d8, 0xb5d9, 0xb5da, 0xb5db, 0xb5dc, 0xb5dd, 0xb5de, 0xb5df, 0xb5e0, 0xb5e1, 0xb5e2, 0xb5e3, 0xb5e4, 0xb5e5, 0xb5e6, 0xb5e7, 0xb5e8, 0x0000, 0xb5e9, 0xb5ea, 0xb5eb, 0xb5ec, 0xb5ed, 0xb5ee, 0xb5ef, 0xb5f0, 0xb5f1, 0xb5f2, 0xb5f3, 0x0000, 0x0000, 0x0000, 0xb5f4, 0xb5f5, 0xb5f6, 0xb5f7, 0xb5f8, 0xb5f9, 0xb5fa, 0xb5fb, 0xb5fc, 0xb5fd, 0xb5fe, 0xb5ff, 0xb600, 0xb601, 0xb602, 0xb603, 0xb604, 0x0000, 0xb605, 0xb606, 0xb607, 0xb608, 0xb609, 0xb60a, 0xb60b, 0xb60c, 0xb60d, 0xb60e, 0xb60f, 0x0000, 0x0000, 0x0000, 0xb610, 0xb611, 0xb612, 0xb613, 0xb614, 0xb615, 0xb616, 0xb617, 0xb618, 0xb619, 0xb61a, 0xb61b, 0xb61c, 0xb61d, 0xb61e, 0xb61f, 0xb620, 0x0000, 0xb621, 0xb622, 0xb623, 0xb624, 0xb625, 0xb626, 0xb627, 0xb628, 0xb629, 0xb62a, 0xb62b, 0x0000, 0x0000, 0x0000, 0xb62c, 0xb62d, 0xb62e, 0xb62f, 0xb630, 0xb631, 0xb632, 0xb633, 0xb634, 0xb635, 0xb636, 0xb637, 0xb638, 0xb639, 0xb63a, 0xb63b, 0xb63c, 0x0000, 0xb63d, 0xb63e, 0xb63f, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0x0000, 0x0000, 0x0000, 0xb648, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0x0000, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0x0000, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb67f, 0x0000, 0x0000, 0x0000, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0x0000, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0x0000, 0x0000, 0x0000, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb6a1, 0xb6a2, 0xb6a3, 0xb6a4, 0xb6a5, 0xb6a6, 0xb6a7, 0xb6a8, 0xb6a9, 0xb6aa, 0xb6ab, 0xb6ac, 0x0000, 0xb6ad, 0xb6ae, 0xb6af, 0xb6b0, 0xb6b1, 0xb6b2, 0xb6b3, 0xb6b4, 0xb6b5, 0xb6b6, 0xb6b7, 0x0000, 0x0000, 0x0000, 0xb6b8, 0xb6b9, 0xb6ba, 0xb6bb, 0xb6bc, 0xb6bd, 0xb6be, 0xb6bf, 0xb6c0, 0xb6c1, 0xb6c2, 0xb6c3, 0xb6c4, 0xb6c5, 0xb6c6, 0xb6c7, 0xb6c8, 0x0000, 0xb6c9, 0xb6ca, 0xb6cb, 0xb6cc, 0xb6cd, 0xb6ce, 0xb6cf, 0xb6d0, 0xb6d1, 0xb6d2, 0xb6d3, 0x0000, 0x0000, 0x0000, 0xb6d4, 0xb6d5, 0xb6d6, 0xb6d7, 0xb6d8, 0xb6d9, 0xb6da, 0xb6db, 0xb6dc, 0xb6dd, 0xb6de, 0xb6df, 0xb6e0, 0xb6e1, 0xb6e2, 0xb6e3, 0xb6e4, 0x0000, 0xb6e5, 0xb6e6, 0xb6e7, 0xb6e8, 0xb6e9, 0xb6ea, 0xb6eb, 0xb6ec, 0xb6ed, 0xb6ee, 0xb6ef, 0x0000, 0x0000, 0x0000, 0xb6f0, 0xb6f1, 0xb6f2, 0xb6f3, 0xb6f4, 0xb6f5, 0xb6f6, 0xb6f7, 0xb6f8, 0xb6f9, 0xb6fa, 0xb6fb, 0xb6fc, 0xb6fd, 0xb6fe, 0xb6ff, 0xb700, 0x0000, 0xb701, 0xb702, 0xb703, 0xb704, 0xb705, 0xb706, 0xb707, 0xb708, 0xb709, 0xb70a, 0xb70b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb70c, 0xb70d, 0xb70e, 0xb70f, 0xb710, 0xb711, 0xb712, 0xb713, 0xb714, 0xb715, 0xb716, 0xb717, 0xb718, 0xb719, 0xb71a, 0xb71b, 0xb71c, 0x0000, 0xb71d, 0xb71e, 0xb71f, 0xb720, 0xb721, 0xb722, 0xb723, 0xb724, 0xb725, 0xb726, 0xb727, 0x0000, 0x0000, 0x0000, 0xb728, 0xb729, 0xb72a, 0xb72b, 0xb72c, 0xb72d, 0xb72e, 0xb72f, 0xb730, 0xb731, 0xb732, 0xb733, 0xb734, 0xb735, 0xb736, 0xb737, 0xb738, 0x0000, 0xb739, 0xb73a, 0xb73b, 0xb73c, 0xb73d, 0xb73e, 0xb73f, 0xb740, 0xb741, 0xb742, 0xb743, 0x0000, 0x0000, 0x0000, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0x0000, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0x0000, 0x0000, 0x0000, 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0x0000, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb77c, 0xb77d, 0xb77e, 0xb77f, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0x0000, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0x0000, 0x0000, 0x0000, 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb7a1, 0xb7a2, 0xb7a3, 0xb7a4, 0xb7a5, 0xb7a6, 0xb7a7, 0xb7a8, 0x0000, 0xb7a9, 0xb7aa, 0xb7ab, 0xb7ac, 0xb7ad, 0xb7ae, 0xb7af, 0xb7b0, 0xb7b1, 0xb7b2, 0xb7b3, 0x0000, 0x0000, 0x0000, 0xb7b4, 0xb7b5, 0xb7b6, 0xb7b7, 0xb7b8, 0xb7b9, 0xb7ba, 0xb7bb, 0xb7bc, 0xb7bd, 0xb7be, 0xb7bf, 0xb7c0, 0xb7c1, 0xb7c2, 0xb7c3, 0xb7c4, 0x0000, 0xb7c5, 0xb7c6, 0xb7c7, 0xb7c8, 0xb7c9, 0xb7ca, 0xb7cb, 0xb7cc, 0xb7cd, 0xb7ce, 0xb7cf, 0x0000, 0x0000, 0x0000, 0xb7d0, 0xb7d1, 0xb7d2, 0xb7d3, 0xb7d4, 0xb7d5, 0xb7d6, 0xb7d7, 0xb7d8, 0xb7d9, 0xb7da, 0xb7db, 0xb7dc, 0xb7dd, 0xb7de, 0xb7df, 0xb7e0, 0x0000, 0xb7e1, 0xb7e2, 0xb7e3, 0xb7e4, 0xb7e5, 0xb7e6, 0xb7e7, 0xb7e8, 0xb7e9, 0xb7ea, 0xb7eb, 0x0000, 0x0000, 0x0000, 0xb7ec, 0xb7ed, 0xb7ee, 0xb7ef, 0xb7f0, 0xb7f1, 0xb7f2, 0xb7f3, 0xb7f4, 0xb7f5, 0xb7f6, 0xb7f7, 0xb7f8, 0xb7f9, 0xb7fa, 0xb7fb, 0xb7fc, 0x0000, 0xb7fd, 0xb7fe, 0xb7ff, 0xb800, 0xb801, 0xb802, 0xb803, 0xb804, 0xb805, 0xb806, 0xb807, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb808, 0xb809, 0xb80a, 0xb80b, 0xb80c, 0xb80d, 0xb80e, 0xb80f, 0xb810, 0xb811, 0xb812, 0xb813, 0xb814, 0xb815, 0xb816, 0xb817, 0xb818, 0x0000, 0xb819, 0xb81a, 0xb81b, 0xb81c, 0xb81d, 0xb81e, 0xb81f, 0xb820, 0xb821, 0xb822, 0xb823, 0x0000, 0x0000, 0x0000, 0xb824, 0xb825, 0xb826, 0xb827, 0xb828, 0xb829, 0xb82a, 0xb82b, 0xb82c, 0xb82d, 0xb82e, 0xb82f, 0xb830, 0xb831, 0xb832, 0xb833, 0xb834, 0x0000, 0xb835, 0xb836, 0xb837, 0xb838, 0xb839, 0xb83a, 0xb83b, 0xb83c, 0xb83d, 0xb83e, 0xb83f, 0x0000, 0x0000, 0x0000, 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0x0000, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0x0000, 0x0000, 0x0000, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0x0000, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0x0000, 0x0000, 0x0000, 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb87f, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0x0000, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0x0000, 0x0000, 0x0000, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb8a1, 0xb8a2, 0xb8a3, 0xb8a4, 0x0000, 0xb8a5, 0xb8a6, 0xb8a7, 0xb8a8, 0xb8a9, 0xb8aa, 0xb8ab, 0xb8ac, 0xb8ad, 0xb8ae, 0xb8af, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb8b0, 0xb8b1, 0xb8b2, 0xb8b3, 0xb8b4, 0xb8b5, 0xb8b6, 0xb8b7, 0xb8b8, 0xb8b9, 0xb8ba, 0xb8bb, 0xb8bc, 0xb8bd, 0xb8be, 0xb8bf, 0xb8c0, 0x0000, 0xb8c1, 0xb8c2, 0xb8c3, 0xb8c4, 0xb8c5, 0xb8c6, 0xb8c7, 0xb8c8, 0xb8c9, 0xb8ca, 0xb8cb, 0x0000, 0x0000, 0x0000, 0xb8cc, 0xb8cd, 0xb8ce, 0xb8cf, 0xb8d0, 0xb8d1, 0xb8d2, 0xb8d3, 0xb8d4, 0xb8d5, 0xb8d6, 0xb8d7, 0xb8d8, 0xb8d9, 0xb8da, 0xb8db, 0xb8dc, 0x0000, 0xb8dd, 0xb8de, 0xb8df, 0xb8e0, 0xb8e1, 0xb8e2, 0xb8e3, 0xb8e4, 0xb8e5, 0xb8e6, 0xb8e7, 0x0000, 0x0000, 0x0000, 0xb8e8, 0xb8e9, 0xb8ea, 0xb8eb, 0xb8ec, 0xb8ed, 0xb8ee, 0xb8ef, 0xb8f0, 0xb8f1, 0xb8f2, 0xb8f3, 0xb8f4, 0xb8f5, 0xb8f6, 0xb8f7, 0xb8f8, 0x0000, 0xb8f9, 0xb8fa, 0xb8fb, 0xb8fc, 0xb8fd, 0xb8fe, 0xb8ff, 0xb900, 0xb901, 0xb902, 0xb903, 0x0000, 0x0000, 0x0000, 0xb904, 0xb905, 0xb906, 0xb907, 0xb908, 0xb909, 0xb90a, 0xb90b, 0xb90c, 0xb90d, 0xb90e, 0xb90f, 0xb910, 0xb911, 0xb912, 0xb913, 0xb914, 0x0000, 0xb915, 0xb916, 0xb917, 0xb918, 0xb919, 0xb91a, 0xb91b, 0xb91c, 0xb91d, 0xb91e, 0xb91f, 0x0000, 0x0000, 0x0000, 0xb920, 0xb921, 0xb922, 0xb923, 0xb924, 0xb925, 0xb926, 0xb927, 0xb928, 0xb929, 0xb92a, 0xb92b, 0xb92c, 0xb92d, 0xb92e, 0xb92f, 0xb930, 0x0000, 0xb931, 0xb932, 0xb933, 0xb934, 0xb935, 0xb936, 0xb937, 0xb938, 0xb939, 0xb93a, 0xb93b, 0x0000, 0x0000, 0x0000, 0xb93c, 0xb93d, 0xb93e, 0xb93f, 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0x0000, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0x0000, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0x0000, 0x0000, 0x0000, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb97f, 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0x0000, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0x0000, 0x0000, 0x0000, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0x0000, 0xb9a1, 0xb9a2, 0xb9a3, 0xb9a4, 0xb9a5, 0xb9a6, 0xb9a7, 0xb9a8, 0xb9a9, 0xb9aa, 0xb9ab, 0x0000, 0x0000, 0x0000, 0xb9ac, 0xb9ad, 0xb9ae, 0xb9af, 0xb9b0, 0xb9b1, 0xb9b2, 0xb9b3, 0xb9b4, 0xb9b5, 0xb9b6, 0xb9b7, 0xb9b8, 0xb9b9, 0xb9ba, 0xb9bb, 0xb9bc, 0x0000, 0xb9bd, 0xb9be, 0xb9bf, 0xb9c0, 0xb9c1, 0xb9c2, 0xb9c3, 0xb9c4, 0xb9c5, 0xb9c6, 0xb9c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xb9c8, 0xb9c9, 0xb9ca, 0xb9cb, 0xb9cc, 0xb9cd, 0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d3, 0xb9d4, 0xb9d5, 0xb9d6, 0xb9d7, 0xb9d8, 0x0000, 0xb9d9, 0xb9da, 0xb9db, 0xb9dc, 0xb9dd, 0xb9de, 0xb9df, 0xb9e0, 0xb9e1, 0xb9e2, 0xb9e3, 0x0000, 0x0000, 0x0000, 0xb9e4, 0xb9e5, 0xb9e6, 0xb9e7, 0xb9e8, 0xb9e9, 0xb9ea, 0xb9eb, 0xb9ec, 0xb9ed, 0xb9ee, 0xb9ef, 0xb9f0, 0xb9f1, 0xb9f2, 0xb9f3, 0xb9f4, 0x0000, 0xb9f5, 0xb9f6, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xb9fb, 0xb9fc, 0xb9fd, 0xb9fe, 0xb9ff, 0x0000, 0x0000, 0x0000, 0xba00, 0xba01, 0xba02, 0xba03, 0xba04, 0xba05, 0xba06, 0xba07, 0xba08, 0xba09, 0xba0a, 0xba0b, 0xba0c, 0xba0d, 0xba0e, 0xba0f, 0xba10, 0x0000, 0xba11, 0xba12, 0xba13, 0xba14, 0xba15, 0xba16, 0xba17, 0xba18, 0xba19, 0xba1a, 0xba1b, 0x0000, 0x0000, 0x0000, 0xba1c, 0xba1d, 0xba1e, 0xba1f, 0xba20, 0xba21, 0xba22, 0xba23, 0xba24, 0xba25, 0xba26, 0xba27, 0xba28, 0xba29, 0xba2a, 0xba2b, 0xba2c, 0x0000, 0xba2d, 0xba2e, 0xba2f, 0xba30, 0xba31, 0xba32, 0xba33, 0xba34, 0xba35, 0xba36, 0xba37, 0x0000, 0x0000, 0x0000, 0xba38, 0xba39, 0xba3a, 0xba3b, 0xba3c, 0xba3d, 0xba3e, 0xba3f, 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0x0000, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0x0000, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0x0000, 0x0000, 0x0000, 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba7f, 0xba80, 0x0000, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xba8b, 0x0000, 0x0000, 0x0000, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0x0000, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbaa1, 0xbaa2, 0xbaa3, 0xbaa4, 0xbaa5, 0xbaa6, 0xbaa7, 0x0000, 0x0000, 0x0000, 0xbaa8, 0xbaa9, 0xbaaa, 0xbaab, 0xbaac, 0xbaad, 0xbaae, 0xbaaf, 0xbab0, 0xbab1, 0xbab2, 0xbab3, 0xbab4, 0xbab5, 0xbab6, 0xbab7, 0xbab8, 0x0000, 0xbab9, 0xbaba, 0xbabb, 0xbabc, 0xbabd, 0xbabe, 0xbabf, 0xbac0, 0xbac1, 0xbac2, 0xbac3, 0x0000, 0x0000, 0x0000, 0xbac4, 0xbac5, 0xbac6, 0xbac7, 0xbac8, 0xbac9, 0xbaca, 0xbacb, 0xbacc, 0xbacd, 0xbace, 0xbacf, 0xbad0, 0xbad1, 0xbad2, 0xbad3, 0xbad4, 0x0000, 0xbad5, 0xbad6, 0xbad7, 0xbad8, 0xbad9, 0xbada, 0xbadb, 0xbadc, 0xbadd, 0xbade, 0xbadf, 0x0000, 0x0000, 0x0000, 0xbae0, 0xbae1, 0xbae2, 0xbae3, 0xbae4, 0xbae5, 0xbae6, 0xbae7, 0xbae8, 0xbae9, 0xbaea, 0xbaeb, 0xbaec, 0xbaed, 0xbaee, 0xbaef, 0xbaf0, 0x0000, 0xbaf1, 0xbaf2, 0xbaf3, 0xbaf4, 0xbaf5, 0xbaf6, 0xbaf7, 0xbaf8, 0xbaf9, 0xbafa, 0xbafb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbafc, 0xbafd, 0xbafe, 0xbaff, 0xbb00, 0xbb01, 0xbb02, 0xbb03, 0xbb04, 0xbb05, 0xbb06, 0xbb07, 0xbb08, 0xbb09, 0xbb0a, 0xbb0b, 0xbb0c, 0x0000, 0xbb0d, 0xbb0e, 0xbb0f, 0xbb10, 0xbb11, 0xbb12, 0xbb13, 0xbb14, 0xbb15, 0xbb16, 0xbb17, 0x0000, 0x0000, 0x0000, 0xbb18, 0xbb19, 0xbb1a, 0xbb1b, 0xbb1c, 0xbb1d, 0xbb1e, 0xbb1f, 0xbb20, 0xbb21, 0xbb22, 0xbb23, 0xbb24, 0xbb25, 0xbb26, 0xbb27, 0xbb28, 0x0000, 0xbb29, 0xbb2a, 0xbb2b, 0xbb2c, 0xbb2d, 0xbb2e, 0xbb2f, 0xbb30, 0xbb31, 0xbb32, 0xbb33, 0x0000, 0x0000, 0x0000, 0xbb34, 0xbb35, 0xbb36, 0xbb37, 0xbb38, 0xbb39, 0xbb3a, 0xbb3b, 0xbb3c, 0xbb3d, 0xbb3e, 0xbb3f, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0x0000, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0x0000, 0x0000, 0x0000, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0x0000, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0x0000, 0x0000, 0x0000, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0x0000, 0xbb7d, 0xbb7e, 0xbb7f, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0x0000, 0x0000, 0x0000, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0x0000, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbba1, 0xbba2, 0xbba3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbba4, 0xbba5, 0xbba6, 0xbba7, 0xbba8, 0xbba9, 0xbbaa, 0xbbab, 0xbbac, 0xbbad, 0xbbae, 0xbbaf, 0xbbb0, 0xbbb1, 0xbbb2, 0xbbb3, 0xbbb4, 0x0000, 0xbbb5, 0xbbb6, 0xbbb7, 0xbbb8, 0xbbb9, 0xbbba, 0xbbbb, 0xbbbc, 0xbbbd, 0xbbbe, 0xbbbf, 0x0000, 0x0000, 0x0000, 0xbbc0, 0xbbc1, 0xbbc2, 0xbbc3, 0xbbc4, 0xbbc5, 0xbbc6, 0xbbc7, 0xbbc8, 0xbbc9, 0xbbca, 0xbbcb, 0xbbcc, 0xbbcd, 0xbbce, 0xbbcf, 0xbbd0, 0x0000, 0xbbd1, 0xbbd2, 0xbbd3, 0xbbd4, 0xbbd5, 0xbbd6, 0xbbd7, 0xbbd8, 0xbbd9, 0xbbda, 0xbbdb, 0x0000, 0x0000, 0x0000, 0xbbdc, 0xbbdd, 0xbbde, 0xbbdf, 0xbbe0, 0xbbe1, 0xbbe2, 0xbbe3, 0xbbe4, 0xbbe5, 0xbbe6, 0xbbe7, 0xbbe8, 0xbbe9, 0xbbea, 0xbbeb, 0xbbec, 0x0000, 0xbbed, 0xbbee, 0xbbef, 0xbbf0, 0xbbf1, 0xbbf2, 0xbbf3, 0xbbf4, 0xbbf5, 0xbbf6, 0xbbf7, 0x0000, 0x0000, 0x0000, 0xbbf8, 0xbbf9, 0xbbfa, 0xbbfb, 0xbbfc, 0xbbfd, 0xbbfe, 0xbbff, 0xbc00, 0xbc01, 0xbc02, 0xbc03, 0xbc04, 0xbc05, 0xbc06, 0xbc07, 0xbc08, 0x0000, 0xbc09, 0xbc0a, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0e, 0xbc0f, 0xbc10, 0xbc11, 0xbc12, 0xbc13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc19, 0xbc1a, 0xbc1b, 0xbc1c, 0xbc1d, 0xbc1e, 0xbc1f, 0xbc20, 0xbc21, 0xbc22, 0xbc23, 0xbc24, 0x0000, 0xbc25, 0xbc26, 0xbc27, 0xbc28, 0xbc29, 0xbc2a, 0xbc2b, 0xbc2c, 0xbc2d, 0xbc2e, 0xbc2f, 0x0000, 0x0000, 0x0000, 0xbc30, 0xbc31, 0xbc32, 0xbc33, 0xbc34, 0xbc35, 0xbc36, 0xbc37, 0xbc38, 0xbc39, 0xbc3a, 0xbc3b, 0xbc3c, 0xbc3d, 0xbc3e, 0xbc3f, 0xbc40, 0x0000, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0x0000, 0x0000, 0x0000, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0x0000, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0x0000, 0x0000, 0x0000, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0x0000, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc7f, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0x0000, 0x0000, 0x0000, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0x0000, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbca0, 0xbca1, 0xbca2, 0xbca3, 0xbca4, 0xbca5, 0xbca6, 0xbca7, 0xbca8, 0xbca9, 0xbcaa, 0xbcab, 0xbcac, 0xbcad, 0xbcae, 0xbcaf, 0xbcb0, 0x0000, 0xbcb1, 0xbcb2, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcb6, 0xbcb7, 0xbcb8, 0xbcb9, 0xbcba, 0xbcbb, 0x0000, 0x0000, 0x0000, 0xbcbc, 0xbcbd, 0xbcbe, 0xbcbf, 0xbcc0, 0xbcc1, 0xbcc2, 0xbcc3, 0xbcc4, 0xbcc5, 0xbcc6, 0xbcc7, 0xbcc8, 0xbcc9, 0xbcca, 0xbccb, 0xbccc, 0x0000, 0xbccd, 0xbcce, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd2, 0xbcd3, 0xbcd4, 0xbcd5, 0xbcd6, 0xbcd7, 0x0000, 0x0000, 0x0000, 0xbcd8, 0xbcd9, 0xbcda, 0xbcdb, 0xbcdc, 0xbcdd, 0xbcde, 0xbcdf, 0xbce0, 0xbce1, 0xbce2, 0xbce3, 0xbce4, 0xbce5, 0xbce6, 0xbce7, 0xbce8, 0x0000, 0xbce9, 0xbcea, 0xbceb, 0xbcec, 0xbced, 0xbcee, 0xbcef, 0xbcf0, 0xbcf1, 0xbcf2, 0xbcf3, 0x0000, 0x0000, 0x0000, 0xbcf4, 0xbcf5, 0xbcf6, 0xbcf7, 0xbcf8, 0xbcf9, 0xbcfa, 0xbcfb, 0xbcfc, 0xbcfd, 0xbcfe, 0xbcff, 0xbd00, 0xbd01, 0xbd02, 0xbd03, 0xbd04, 0x0000, 0xbd05, 0xbd06, 0xbd07, 0xbd08, 0xbd09, 0xbd0a, 0xbd0b, 0xbd0c, 0xbd0d, 0xbd0e, 0xbd0f, 0x0000, 0x0000, 0x0000, 0xbd10, 0xbd11, 0xbd12, 0xbd13, 0xbd14, 0xbd15, 0xbd16, 0xbd17, 0xbd18, 0xbd19, 0xbd1a, 0xbd1b, 0xbd1c, 0xbd1d, 0xbd1e, 0xbd1f, 0xbd20, 0x0000, 0xbd21, 0xbd22, 0xbd23, 0xbd24, 0xbd25, 0xbd26, 0xbd27, 0xbd28, 0xbd29, 0xbd2a, 0xbd2b, 0x0000, 0x0000, 0x0000, 0xbd2c, 0xbd2d, 0xbd2e, 0xbd2f, 0xbd30, 0xbd31, 0xbd32, 0xbd33, 0xbd34, 0xbd35, 0xbd36, 0xbd37, 0xbd38, 0xbd39, 0xbd3a, 0xbd3b, 0xbd3c, 0x0000, 0xbd3d, 0xbd3e, 0xbd3f, 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0x0000, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0x0000, 0x0000, 0x0000, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0x0000, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd7f, 0x0000, 0x0000, 0x0000, 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0x0000, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0x0000, 0x0000, 0x0000, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbda1, 0xbda2, 0xbda3, 0xbda4, 0xbda5, 0xbda6, 0xbda7, 0xbda8, 0xbda9, 0xbdaa, 0xbdab, 0xbdac, 0x0000, 0xbdad, 0xbdae, 0xbdaf, 0xbdb0, 0xbdb1, 0xbdb2, 0xbdb3, 0xbdb4, 0xbdb5, 0xbdb6, 0xbdb7, 0x0000, 0x0000, 0x0000, 0xbdb8, 0xbdb9, 0xbdba, 0xbdbb, 0xbdbc, 0xbdbd, 0xbdbe, 0xbdbf, 0xbdc0, 0xbdc1, 0xbdc2, 0xbdc3, 0xbdc4, 0xbdc5, 0xbdc6, 0xbdc7, 0xbdc8, 0x0000, 0xbdc9, 0xbdca, 0xbdcb, 0xbdcc, 0xbdcd, 0xbdce, 0xbdcf, 0xbdd0, 0xbdd1, 0xbdd2, 0xbdd3, 0x0000, 0x0000, 0x0000, 0xbdd4, 0xbdd5, 0xbdd6, 0xbdd7, 0xbdd8, 0xbdd9, 0xbdda, 0xbddb, 0xbddc, 0xbddd, 0xbdde, 0xbddf, 0xbde0, 0xbde1, 0xbde2, 0xbde3, 0xbde4, 0x0000, 0xbde5, 0xbde6, 0xbde7, 0xbde8, 0xbde9, 0xbdea, 0xbdeb, 0xbdec, 0xbded, 0xbdee, 0xbdef, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdf0, 0xbdf1, 0xbdf2, 0xbdf3, 0xbdf4, 0xbdf5, 0xbdf6, 0xbdf7, 0xbdf8, 0xbdf9, 0xbdfa, 0xbdfb, 0xbdfc, 0xbdfd, 0xbdfe, 0xbdff, 0xbe00, 0x0000, 0xbe01, 0xbe02, 0xbe03, 0xbe04, 0xbe05, 0xbe06, 0xbe07, 0xbe08, 0xbe09, 0xbe0a, 0xbe0b, 0x0000, 0x0000, 0x0000, 0xbe0c, 0xbe0d, 0xbe0e, 0xbe0f, 0xbe10, 0xbe11, 0xbe12, 0xbe13, 0xbe14, 0xbe15, 0xbe16, 0xbe17, 0xbe18, 0xbe19, 0xbe1a, 0xbe1b, 0xbe1c, 0x0000, 0xbe1d, 0xbe1e, 0xbe1f, 0xbe20, 0xbe21, 0xbe22, 0xbe23, 0xbe24, 0xbe25, 0xbe26, 0xbe27, 0x0000, 0x0000, 0x0000, 0xbe28, 0xbe29, 0xbe2a, 0xbe2b, 0xbe2c, 0xbe2d, 0xbe2e, 0xbe2f, 0xbe30, 0xbe31, 0xbe32, 0xbe33, 0xbe34, 0xbe35, 0xbe36, 0xbe37, 0xbe38, 0x0000, 0xbe39, 0xbe3a, 0xbe3b, 0xbe3c, 0xbe3d, 0xbe3e, 0xbe3f, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0x0000, 0x0000, 0x0000, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0x0000, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3143, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0x0000, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0x0000, 0x0000, 0x0000, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe7f, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0x0000, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0x0000, 0x0000, 0x0000, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbea1, 0xbea2, 0xbea3, 0xbea4, 0xbea5, 0xbea6, 0xbea7, 0xbea8, 0x0000, 0xbea9, 0xbeaa, 0xbeab, 0xbeac, 0xbead, 0xbeae, 0xbeaf, 0xbeb0, 0xbeb1, 0xbeb2, 0xbeb3, 0x0000, 0x0000, 0x0000, 0xbeb4, 0xbeb5, 0xbeb6, 0xbeb7, 0xbeb8, 0xbeb9, 0xbeba, 0xbebb, 0xbebc, 0xbebd, 0xbebe, 0xbebf, 0xbec0, 0xbec1, 0xbec2, 0xbec3, 0xbec4, 0x0000, 0xbec5, 0xbec6, 0xbec7, 0xbec8, 0xbec9, 0xbeca, 0xbecb, 0xbecc, 0xbecd, 0xbece, 0xbecf, 0x0000, 0x0000, 0x0000, 0xbed0, 0xbed1, 0xbed2, 0xbed3, 0xbed4, 0xbed5, 0xbed6, 0xbed7, 0xbed8, 0xbed9, 0xbeda, 0xbedb, 0xbedc, 0xbedd, 0xbede, 0xbedf, 0xbee0, 0x0000, 0xbee1, 0xbee2, 0xbee3, 0xbee4, 0xbee5, 0xbee6, 0xbee7, 0xbee8, 0xbee9, 0xbeea, 0xbeeb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbeec, 0xbeed, 0xbeee, 0xbeef, 0xbef0, 0xbef1, 0xbef2, 0xbef3, 0xbef4, 0xbef5, 0xbef6, 0xbef7, 0xbef8, 0xbef9, 0xbefa, 0xbefb, 0xbefc, 0x0000, 0xbefd, 0xbefe, 0xbeff, 0xbf00, 0xbf01, 0xbf02, 0xbf03, 0xbf04, 0xbf05, 0xbf06, 0xbf07, 0x0000, 0x0000, 0x0000, 0xbf08, 0xbf09, 0xbf0a, 0xbf0b, 0xbf0c, 0xbf0d, 0xbf0e, 0xbf0f, 0xbf10, 0xbf11, 0xbf12, 0xbf13, 0xbf14, 0xbf15, 0xbf16, 0xbf17, 0xbf18, 0x0000, 0xbf19, 0xbf1a, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf1f, 0xbf20, 0xbf21, 0xbf22, 0xbf23, 0x0000, 0x0000, 0x0000, 0xbf24, 0xbf25, 0xbf26, 0xbf27, 0xbf28, 0xbf29, 0xbf2a, 0xbf2b, 0xbf2c, 0xbf2d, 0xbf2e, 0xbf2f, 0xbf30, 0xbf31, 0xbf32, 0xbf33, 0xbf34, 0x0000, 0xbf35, 0xbf36, 0xbf37, 0xbf38, 0xbf39, 0xbf3a, 0xbf3b, 0xbf3c, 0xbf3d, 0xbf3e, 0xbf3f, 0x0000, 0x0000, 0x0000, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0x0000, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0x0000, 0x0000, 0x0000, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0x0000, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0x0000, 0x0000, 0x0000, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf7f, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0x0000, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xbfa1, 0xbfa2, 0xbfa3, 0xbfa4, 0x0000, 0xbfa5, 0xbfa6, 0xbfa7, 0xbfa8, 0xbfa9, 0xbfaa, 0xbfab, 0xbfac, 0xbfad, 0xbfae, 0xbfaf, 0x0000, 0x0000, 0x0000, 0xbfb0, 0xbfb1, 0xbfb2, 0xbfb3, 0xbfb4, 0xbfb5, 0xbfb6, 0xbfb7, 0xbfb8, 0xbfb9, 0xbfba, 0xbfbb, 0xbfbc, 0xbfbd, 0xbfbe, 0xbfbf, 0xbfc0, 0x0000, 0xbfc1, 0xbfc2, 0xbfc3, 0xbfc4, 0xbfc5, 0xbfc6, 0xbfc7, 0xbfc8, 0xbfc9, 0xbfca, 0xbfcb, 0x0000, 0x0000, 0x0000, 0xbfcc, 0xbfcd, 0xbfce, 0xbfcf, 0xbfd0, 0xbfd1, 0xbfd2, 0xbfd3, 0xbfd4, 0xbfd5, 0xbfd6, 0xbfd7, 0xbfd8, 0xbfd9, 0xbfda, 0xbfdb, 0xbfdc, 0x0000, 0xbfdd, 0xbfde, 0xbfdf, 0xbfe0, 0xbfe1, 0xbfe2, 0xbfe3, 0xbfe4, 0xbfe5, 0xbfe6, 0xbfe7, 0x0000, 0x0000, 0x0000, 0xbfe8, 0xbfe9, 0xbfea, 0xbfeb, 0xbfec, 0xbfed, 0xbfee, 0xbfef, 0xbff0, 0xbff1, 0xbff2, 0xbff3, 0xbff4, 0xbff5, 0xbff6, 0xbff7, 0xbff8, 0x0000, 0xbff9, 0xbffa, 0xbffb, 0xbffc, 0xbffd, 0xbffe, 0xbfff, 0xc000, 0xc001, 0xc002, 0xc003, 0x0000, 0x0000, 0x0000, 0xc004, 0xc005, 0xc006, 0xc007, 0xc008, 0xc009, 0xc00a, 0xc00b, 0xc00c, 0xc00d, 0xc00e, 0xc00f, 0xc010, 0xc011, 0xc012, 0xc013, 0xc014, 0x0000, 0xc015, 0xc016, 0xc017, 0xc018, 0xc019, 0xc01a, 0xc01b, 0xc01c, 0xc01d, 0xc01e, 0xc01f, 0x0000, 0x0000, 0x0000, 0xc020, 0xc021, 0xc022, 0xc023, 0xc024, 0xc025, 0xc026, 0xc027, 0xc028, 0xc029, 0xc02a, 0xc02b, 0xc02c, 0xc02d, 0xc02e, 0xc02f, 0xc030, 0x0000, 0xc031, 0xc032, 0xc033, 0xc034, 0xc035, 0xc036, 0xc037, 0xc038, 0xc039, 0xc03a, 0xc03b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc03c, 0xc03d, 0xc03e, 0xc03f, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0x0000, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0x0000, 0x0000, 0x0000, 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0x0000, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0x0000, 0x0000, 0x0000, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc07f, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0x0000, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0x0000, 0x0000, 0x0000, 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0x0000, 0xc0a1, 0xc0a2, 0xc0a3, 0xc0a4, 0xc0a5, 0xc0a6, 0xc0a7, 0xc0a8, 0xc0a9, 0xc0aa, 0xc0ab, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc0ac, 0xc0ad, 0xc0ae, 0xc0af, 0xc0b0, 0xc0b1, 0xc0b2, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0b7, 0xc0b8, 0xc0b9, 0xc0ba, 0xc0bb, 0xc0bc, 0x0000, 0xc0bd, 0xc0be, 0xc0bf, 0xc0c0, 0xc0c1, 0xc0c2, 0xc0c3, 0xc0c4, 0xc0c5, 0xc0c6, 0xc0c7, 0x0000, 0x0000, 0x0000, 0xc0c8, 0xc0c9, 0xc0ca, 0xc0cb, 0xc0cc, 0xc0cd, 0xc0ce, 0xc0cf, 0xc0d0, 0xc0d1, 0xc0d2, 0xc0d3, 0xc0d4, 0xc0d5, 0xc0d6, 0xc0d7, 0xc0d8, 0x0000, 0xc0d9, 0xc0da, 0xc0db, 0xc0dc, 0xc0dd, 0xc0de, 0xc0df, 0xc0e0, 0xc0e1, 0xc0e2, 0xc0e3, 0x0000, 0x0000, 0x0000, 0xc0e4, 0xc0e5, 0xc0e6, 0xc0e7, 0xc0e8, 0xc0e9, 0xc0ea, 0xc0eb, 0xc0ec, 0xc0ed, 0xc0ee, 0xc0ef, 0xc0f0, 0xc0f1, 0xc0f2, 0xc0f3, 0xc0f4, 0x0000, 0xc0f5, 0xc0f6, 0xc0f7, 0xc0f8, 0xc0f9, 0xc0fa, 0xc0fb, 0xc0fc, 0xc0fd, 0xc0fe, 0xc0ff, 0x0000, 0x0000, 0x0000, 0xc100, 0xc101, 0xc102, 0xc103, 0xc104, 0xc105, 0xc106, 0xc107, 0xc108, 0xc109, 0xc10a, 0xc10b, 0xc10c, 0xc10d, 0xc10e, 0xc10f, 0xc110, 0x0000, 0xc111, 0xc112, 0xc113, 0xc114, 0xc115, 0xc116, 0xc117, 0xc118, 0xc119, 0xc11a, 0xc11b, 0x0000, 0x0000, 0x0000, 0xc11c, 0xc11d, 0xc11e, 0xc11f, 0xc120, 0xc121, 0xc122, 0xc123, 0xc124, 0xc125, 0xc126, 0xc127, 0xc128, 0xc129, 0xc12a, 0xc12b, 0xc12c, 0x0000, 0xc12d, 0xc12e, 0xc12f, 0xc130, 0xc131, 0xc132, 0xc133, 0xc134, 0xc135, 0xc136, 0xc137, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc138, 0xc139, 0xc13a, 0xc13b, 0xc13c, 0xc13d, 0xc13e, 0xc13f, 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0x0000, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0x0000, 0x0000, 0x0000, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0x0000, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0x0000, 0x0000, 0x0000, 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc17f, 0xc180, 0x0000, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0x0000, 0x0000, 0x0000, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0x0000, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc1a1, 0xc1a2, 0xc1a3, 0xc1a4, 0xc1a5, 0xc1a6, 0xc1a7, 0x0000, 0x0000, 0x0000, 0xc1a8, 0xc1a9, 0xc1aa, 0xc1ab, 0xc1ac, 0xc1ad, 0xc1ae, 0xc1af, 0xc1b0, 0xc1b1, 0xc1b2, 0xc1b3, 0xc1b4, 0xc1b5, 0xc1b6, 0xc1b7, 0xc1b8, 0x0000, 0xc1b9, 0xc1ba, 0xc1bb, 0xc1bc, 0xc1bd, 0xc1be, 0xc1bf, 0xc1c0, 0xc1c1, 0xc1c2, 0xc1c3, 0x0000, 0x0000, 0x0000, 0xc1c4, 0xc1c5, 0xc1c6, 0xc1c7, 0xc1c8, 0xc1c9, 0xc1ca, 0xc1cb, 0xc1cc, 0xc1cd, 0xc1ce, 0xc1cf, 0xc1d0, 0xc1d1, 0xc1d2, 0xc1d3, 0xc1d4, 0x0000, 0xc1d5, 0xc1d6, 0xc1d7, 0xc1d8, 0xc1d9, 0xc1da, 0xc1db, 0xc1dc, 0xc1dd, 0xc1de, 0xc1df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc1e0, 0xc1e1, 0xc1e2, 0xc1e3, 0xc1e4, 0xc1e5, 0xc1e6, 0xc1e7, 0xc1e8, 0xc1e9, 0xc1ea, 0xc1eb, 0xc1ec, 0xc1ed, 0xc1ee, 0xc1ef, 0xc1f0, 0x0000, 0xc1f1, 0xc1f2, 0xc1f3, 0xc1f4, 0xc1f5, 0xc1f6, 0xc1f7, 0xc1f8, 0xc1f9, 0xc1fa, 0xc1fb, 0x0000, 0x0000, 0x0000, 0xc1fc, 0xc1fd, 0xc1fe, 0xc1ff, 0xc200, 0xc201, 0xc202, 0xc203, 0xc204, 0xc205, 0xc206, 0xc207, 0xc208, 0xc209, 0xc20a, 0xc20b, 0xc20c, 0x0000, 0xc20d, 0xc20e, 0xc20f, 0xc210, 0xc211, 0xc212, 0xc213, 0xc214, 0xc215, 0xc216, 0xc217, 0x0000, 0x0000, 0x0000, 0xc218, 0xc219, 0xc21a, 0xc21b, 0xc21c, 0xc21d, 0xc21e, 0xc21f, 0xc220, 0xc221, 0xc222, 0xc223, 0xc224, 0xc225, 0xc226, 0xc227, 0xc228, 0x0000, 0xc229, 0xc22a, 0xc22b, 0xc22c, 0xc22d, 0xc22e, 0xc22f, 0xc230, 0xc231, 0xc232, 0xc233, 0x0000, 0x0000, 0x0000, 0xc234, 0xc235, 0xc236, 0xc237, 0xc238, 0xc239, 0xc23a, 0xc23b, 0xc23c, 0xc23d, 0xc23e, 0xc23f, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0x0000, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0x0000, 0x0000, 0x0000, 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0x0000, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0x0000, 0x0000, 0x0000, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0x0000, 0xc27d, 0xc27e, 0xc27f, 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0x0000, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc2a1, 0xc2a2, 0xc2a3, 0x0000, 0x0000, 0x0000, 0xc2a4, 0xc2a5, 0xc2a6, 0xc2a7, 0xc2a8, 0xc2a9, 0xc2aa, 0xc2ab, 0xc2ac, 0xc2ad, 0xc2ae, 0xc2af, 0xc2b0, 0xc2b1, 0xc2b2, 0xc2b3, 0xc2b4, 0x0000, 0xc2b5, 0xc2b6, 0xc2b7, 0xc2b8, 0xc2b9, 0xc2ba, 0xc2bb, 0xc2bc, 0xc2bd, 0xc2be, 0xc2bf, 0x0000, 0x0000, 0x0000, 0xc2c0, 0xc2c1, 0xc2c2, 0xc2c3, 0xc2c4, 0xc2c5, 0xc2c6, 0xc2c7, 0xc2c8, 0xc2c9, 0xc2ca, 0xc2cb, 0xc2cc, 0xc2cd, 0xc2ce, 0xc2cf, 0xc2d0, 0x0000, 0xc2d1, 0xc2d2, 0xc2d3, 0xc2d4, 0xc2d5, 0xc2d6, 0xc2d7, 0xc2d8, 0xc2d9, 0xc2da, 0xc2db, 0x0000, 0x0000, 0x0000, 0xc2dc, 0xc2dd, 0xc2de, 0xc2df, 0xc2e0, 0xc2e1, 0xc2e2, 0xc2e3, 0xc2e4, 0xc2e5, 0xc2e6, 0xc2e7, 0xc2e8, 0xc2e9, 0xc2ea, 0xc2eb, 0xc2ec, 0x0000, 0xc2ed, 0xc2ee, 0xc2ef, 0xc2f0, 0xc2f1, 0xc2f2, 0xc2f3, 0xc2f4, 0xc2f5, 0xc2f6, 0xc2f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc2f8, 0xc2f9, 0xc2fa, 0xc2fb, 0xc2fc, 0xc2fd, 0xc2fe, 0xc2ff, 0xc300, 0xc301, 0xc302, 0xc303, 0xc304, 0xc305, 0xc306, 0xc307, 0xc308, 0x0000, 0xc309, 0xc30a, 0xc30b, 0xc30c, 0xc30d, 0xc30e, 0xc30f, 0xc310, 0xc311, 0xc312, 0xc313, 0x0000, 0x0000, 0x0000, 0xc314, 0xc315, 0xc316, 0xc317, 0xc318, 0xc319, 0xc31a, 0xc31b, 0xc31c, 0xc31d, 0xc31e, 0xc31f, 0xc320, 0xc321, 0xc322, 0xc323, 0xc324, 0x0000, 0xc325, 0xc326, 0xc327, 0xc328, 0xc329, 0xc32a, 0xc32b, 0xc32c, 0xc32d, 0xc32e, 0xc32f, 0x0000, 0x0000, 0x0000, 0xc330, 0xc331, 0xc332, 0xc333, 0xc334, 0xc335, 0xc336, 0xc337, 0xc338, 0xc339, 0xc33a, 0xc33b, 0xc33c, 0xc33d, 0xc33e, 0xc33f, 0xc340, 0x0000, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0x0000, 0x0000, 0x0000, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0x0000, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0x0000, 0x0000, 0x0000, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0x0000, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc37f, 0xc380, 0xc381, 0xc382, 0xc383, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0x0000, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0x0000, 0x0000, 0x0000, 0xc3a0, 0xc3a1, 0xc3a2, 0xc3a3, 0xc3a4, 0xc3a5, 0xc3a6, 0xc3a7, 0xc3a8, 0xc3a9, 0xc3aa, 0xc3ab, 0xc3ac, 0xc3ad, 0xc3ae, 0xc3af, 0xc3b0, 0x0000, 0xc3b1, 0xc3b2, 0xc3b3, 0xc3b4, 0xc3b5, 0xc3b6, 0xc3b7, 0xc3b8, 0xc3b9, 0xc3ba, 0xc3bb, 0x0000, 0x0000, 0x0000, 0xc3bc, 0xc3bd, 0xc3be, 0xc3bf, 0xc3c0, 0xc3c1, 0xc3c2, 0xc3c3, 0xc3c4, 0xc3c5, 0xc3c6, 0xc3c7, 0xc3c8, 0xc3c9, 0xc3ca, 0xc3cb, 0xc3cc, 0x0000, 0xc3cd, 0xc3ce, 0xc3cf, 0xc3d0, 0xc3d1, 0xc3d2, 0xc3d3, 0xc3d4, 0xc3d5, 0xc3d6, 0xc3d7, 0x0000, 0x0000, 0x0000, 0xc3d8, 0xc3d9, 0xc3da, 0xc3db, 0xc3dc, 0xc3dd, 0xc3de, 0xc3df, 0xc3e0, 0xc3e1, 0xc3e2, 0xc3e3, 0xc3e4, 0xc3e5, 0xc3e6, 0xc3e7, 0xc3e8, 0x0000, 0xc3e9, 0xc3ea, 0xc3eb, 0xc3ec, 0xc3ed, 0xc3ee, 0xc3ef, 0xc3f0, 0xc3f1, 0xc3f2, 0xc3f3, 0x0000, 0x0000, 0x0000, 0xc3f4, 0xc3f5, 0xc3f6, 0xc3f7, 0xc3f8, 0xc3f9, 0xc3fa, 0xc3fb, 0xc3fc, 0xc3fd, 0xc3fe, 0xc3ff, 0xc400, 0xc401, 0xc402, 0xc403, 0xc404, 0x0000, 0xc405, 0xc406, 0xc407, 0xc408, 0xc409, 0xc40a, 0xc40b, 0xc40c, 0xc40d, 0xc40e, 0xc40f, 0x0000, 0x0000, 0x0000, 0xc410, 0xc411, 0xc412, 0xc413, 0xc414, 0xc415, 0xc416, 0xc417, 0xc418, 0xc419, 0xc41a, 0xc41b, 0xc41c, 0xc41d, 0xc41e, 0xc41f, 0xc420, 0x0000, 0xc421, 0xc422, 0xc423, 0xc424, 0xc425, 0xc426, 0xc427, 0xc428, 0xc429, 0xc42a, 0xc42b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc42c, 0xc42d, 0xc42e, 0xc42f, 0xc430, 0xc431, 0xc432, 0xc433, 0xc434, 0xc435, 0xc436, 0xc437, 0xc438, 0xc439, 0xc43a, 0xc43b, 0xc43c, 0x0000, 0xc43d, 0xc43e, 0xc43f, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0x0000, 0x0000, 0x0000, 0xc448, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0x0000, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, 0xc462, 0xc463, 0x0000, 0x0000, 0x0000, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0x0000, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc47f, 0x0000, 0x0000, 0x0000, 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0x0000, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0x0000, 0x0000, 0x0000, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc4a1, 0xc4a2, 0xc4a3, 0xc4a4, 0xc4a5, 0xc4a6, 0xc4a7, 0xc4a8, 0xc4a9, 0xc4aa, 0xc4ab, 0xc4ac, 0x0000, 0xc4ad, 0xc4ae, 0xc4af, 0xc4b0, 0xc4b1, 0xc4b2, 0xc4b3, 0xc4b4, 0xc4b5, 0xc4b6, 0xc4b7, 0x0000, 0x0000, 0x0000, 0xc4b8, 0xc4b9, 0xc4ba, 0xc4bb, 0xc4bc, 0xc4bd, 0xc4be, 0xc4bf, 0xc4c0, 0xc4c1, 0xc4c2, 0xc4c3, 0xc4c4, 0xc4c5, 0xc4c6, 0xc4c7, 0xc4c8, 0x0000, 0xc4c9, 0xc4ca, 0xc4cb, 0xc4cc, 0xc4cd, 0xc4ce, 0xc4cf, 0xc4d0, 0xc4d1, 0xc4d2, 0xc4d3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc4d4, 0xc4d5, 0xc4d6, 0xc4d7, 0xc4d8, 0xc4d9, 0xc4da, 0xc4db, 0xc4dc, 0xc4dd, 0xc4de, 0xc4df, 0xc4e0, 0xc4e1, 0xc4e2, 0xc4e3, 0xc4e4, 0x0000, 0xc4e5, 0xc4e6, 0xc4e7, 0xc4e8, 0xc4e9, 0xc4ea, 0xc4eb, 0xc4ec, 0xc4ed, 0xc4ee, 0xc4ef, 0x0000, 0x0000, 0x0000, 0xc4f0, 0xc4f1, 0xc4f2, 0xc4f3, 0xc4f4, 0xc4f5, 0xc4f6, 0xc4f7, 0xc4f8, 0xc4f9, 0xc4fa, 0xc4fb, 0xc4fc, 0xc4fd, 0xc4fe, 0xc4ff, 0xc500, 0x0000, 0xc501, 0xc502, 0xc503, 0xc504, 0xc505, 0xc506, 0xc507, 0xc508, 0xc509, 0xc50a, 0xc50b, 0x0000, 0x0000, 0x0000, 0xc50c, 0xc50d, 0xc50e, 0xc50f, 0xc510, 0xc511, 0xc512, 0xc513, 0xc514, 0xc515, 0xc516, 0xc517, 0xc518, 0xc519, 0xc51a, 0xc51b, 0xc51c, 0x0000, 0xc51d, 0xc51e, 0xc51f, 0xc520, 0xc521, 0xc522, 0xc523, 0xc524, 0xc525, 0xc526, 0xc527, 0x0000, 0x0000, 0x0000, 0xc528, 0xc529, 0xc52a, 0xc52b, 0xc52c, 0xc52d, 0xc52e, 0xc52f, 0xc530, 0xc531, 0xc532, 0xc533, 0xc534, 0xc535, 0xc536, 0xc537, 0xc538, 0x0000, 0xc539, 0xc53a, 0xc53b, 0xc53c, 0xc53d, 0xc53e, 0xc53f, 0xc540, 0xc541, 0xc542, 0xc543, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0x0000, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0x0000, 0x0000, 0x0000, 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0x0000, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0x0000, 0x0000, 0x0000, 0xc57c, 0xc57d, 0xc57e, 0xc57f, 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0x0000, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0x0000, 0x0000, 0x0000, 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc5a1, 0xc5a2, 0xc5a3, 0xc5a4, 0xc5a5, 0xc5a6, 0xc5a7, 0xc5a8, 0x0000, 0xc5a9, 0xc5aa, 0xc5ab, 0xc5ac, 0xc5ad, 0xc5ae, 0xc5af, 0xc5b0, 0xc5b1, 0xc5b2, 0xc5b3, 0x0000, 0x0000, 0x0000, 0xc5b4, 0xc5b5, 0xc5b6, 0xc5b7, 0xc5b8, 0xc5b9, 0xc5ba, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5bf, 0xc5c0, 0xc5c1, 0xc5c2, 0xc5c3, 0xc5c4, 0x0000, 0xc5c5, 0xc5c6, 0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cb, 0xc5cc, 0xc5cd, 0xc5ce, 0xc5cf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc5d0, 0xc5d1, 0xc5d2, 0xc5d3, 0xc5d4, 0xc5d5, 0xc5d6, 0xc5d7, 0xc5d8, 0xc5d9, 0xc5da, 0xc5db, 0xc5dc, 0xc5dd, 0xc5de, 0xc5df, 0xc5e0, 0x0000, 0xc5e1, 0xc5e2, 0xc5e3, 0xc5e4, 0xc5e5, 0xc5e6, 0xc5e7, 0xc5e8, 0xc5e9, 0xc5ea, 0xc5eb, 0x0000, 0x0000, 0x0000, 0xc5ec, 0xc5ed, 0xc5ee, 0xc5ef, 0xc5f0, 0xc5f1, 0xc5f2, 0xc5f3, 0xc5f4, 0xc5f5, 0xc5f6, 0xc5f7, 0xc5f8, 0xc5f9, 0xc5fa, 0xc5fb, 0xc5fc, 0x0000, 0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc602, 0xc603, 0xc604, 0xc605, 0xc606, 0xc607, 0x0000, 0x0000, 0x0000, 0xc608, 0xc609, 0xc60a, 0xc60b, 0xc60c, 0xc60d, 0xc60e, 0xc60f, 0xc610, 0xc611, 0xc612, 0xc613, 0xc614, 0xc615, 0xc616, 0xc617, 0xc618, 0x0000, 0xc619, 0xc61a, 0xc61b, 0xc61c, 0xc61d, 0xc61e, 0xc61f, 0xc620, 0xc621, 0xc622, 0xc623, 0x0000, 0x0000, 0x0000, 0xc624, 0xc625, 0xc626, 0xc627, 0xc628, 0xc629, 0xc62a, 0xc62b, 0xc62c, 0xc62d, 0xc62e, 0xc62f, 0xc630, 0xc631, 0xc632, 0xc633, 0xc634, 0x0000, 0xc635, 0xc636, 0xc637, 0xc638, 0xc639, 0xc63a, 0xc63b, 0xc63c, 0xc63d, 0xc63e, 0xc63f, 0x0000, 0x0000, 0x0000, 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0x0000, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0x0000, 0x0000, 0x0000, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0x0000, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc67f, 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0x0000, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0x0000, 0x0000, 0x0000, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc6a1, 0xc6a2, 0xc6a3, 0xc6a4, 0x0000, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0x0000, 0x0000, 0x0000, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0x0000, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0x0000, 0x0000, 0x0000, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0x0000, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0x0000, 0x0000, 0x0000, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6f8, 0x0000, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc6ff, 0xc700, 0xc701, 0xc702, 0xc703, 0x0000, 0x0000, 0x0000, 0xc704, 0xc705, 0xc706, 0xc707, 0xc708, 0xc709, 0xc70a, 0xc70b, 0xc70c, 0xc70d, 0xc70e, 0xc70f, 0xc710, 0xc711, 0xc712, 0xc713, 0xc714, 0x0000, 0xc715, 0xc716, 0xc717, 0xc718, 0xc719, 0xc71a, 0xc71b, 0xc71c, 0xc71d, 0xc71e, 0xc71f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc720, 0xc721, 0xc722, 0xc723, 0xc724, 0xc725, 0xc726, 0xc727, 0xc728, 0xc729, 0xc72a, 0xc72b, 0xc72c, 0xc72d, 0xc72e, 0xc72f, 0xc730, 0x0000, 0xc731, 0xc732, 0xc733, 0xc734, 0xc735, 0xc736, 0xc737, 0xc738, 0xc739, 0xc73a, 0xc73b, 0x0000, 0x0000, 0x0000, 0xc73c, 0xc73d, 0xc73e, 0xc73f, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0x0000, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0x0000, 0x0000, 0x0000, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0x0000, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0x0000, 0x0000, 0x0000, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc77f, 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0x0000, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0x0000, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0x0000, 0x0000, 0x0000, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0x0000, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0x0000, 0x0000, 0x0000, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7ce, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0x0000, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0x0000, 0x0000, 0x0000, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0x0000, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc7ff, 0x0000, 0x0000, 0x0000, 0xc800, 0xc801, 0xc802, 0xc803, 0xc804, 0xc805, 0xc806, 0xc807, 0xc808, 0xc809, 0xc80a, 0xc80b, 0xc80c, 0xc80d, 0xc80e, 0xc80f, 0xc810, 0x0000, 0xc811, 0xc812, 0xc813, 0xc814, 0xc815, 0xc816, 0xc817, 0xc818, 0xc819, 0xc81a, 0xc81b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc81c, 0xc81d, 0xc81e, 0xc81f, 0xc820, 0xc821, 0xc822, 0xc823, 0xc824, 0xc825, 0xc826, 0xc827, 0xc828, 0xc829, 0xc82a, 0xc82b, 0xc82c, 0x0000, 0xc82d, 0xc82e, 0xc82f, 0xc830, 0xc831, 0xc832, 0xc833, 0xc834, 0xc835, 0xc836, 0xc837, 0x0000, 0x0000, 0x0000, 0xc838, 0xc839, 0xc83a, 0xc83b, 0xc83c, 0xc83d, 0xc83e, 0xc83f, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0x0000, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0x0000, 0x0000, 0x0000, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0x0000, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0x0000, 0x0000, 0x0000, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc87f, 0xc880, 0x0000, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0x0000, 0x0000, 0x0000, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0x0000, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc8a1, 0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, 0x0000, 0x0000, 0x0000, 0xc8a8, 0xc8a9, 0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, 0xc8b0, 0xc8b1, 0xc8b2, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, 0xc8b8, 0x0000, 0xc8b9, 0xc8ba, 0xc8bb, 0xc8bc, 0xc8bd, 0xc8be, 0xc8bf, 0xc8c0, 0xc8c1, 0xc8c2, 0xc8c3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc8c4, 0xc8c5, 0xc8c6, 0xc8c7, 0xc8c8, 0xc8c9, 0xc8ca, 0xc8cb, 0xc8cc, 0xc8cd, 0xc8ce, 0xc8cf, 0xc8d0, 0xc8d1, 0xc8d2, 0xc8d3, 0xc8d4, 0x0000, 0xc8d5, 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9, 0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0x0000, 0x0000, 0x0000, 0xc8e0, 0xc8e1, 0xc8e2, 0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0x0000, 0xc8f1, 0xc8f2, 0xc8f3, 0xc8f4, 0xc8f5, 0xc8f6, 0xc8f7, 0xc8f8, 0xc8f9, 0xc8fa, 0xc8fb, 0x0000, 0x0000, 0x0000, 0xc8fc, 0xc8fd, 0xc8fe, 0xc8ff, 0xc900, 0xc901, 0xc902, 0xc903, 0xc904, 0xc905, 0xc906, 0xc907, 0xc908, 0xc909, 0xc90a, 0xc90b, 0xc90c, 0x0000, 0xc90d, 0xc90e, 0xc90f, 0xc910, 0xc911, 0xc912, 0xc913, 0xc914, 0xc915, 0xc916, 0xc917, 0x0000, 0x0000, 0x0000, 0xc918, 0xc919, 0xc91a, 0xc91b, 0xc91c, 0xc91d, 0xc91e, 0xc91f, 0xc920, 0xc921, 0xc922, 0xc923, 0xc924, 0xc925, 0xc926, 0xc927, 0xc928, 0x0000, 0xc929, 0xc92a, 0xc92b, 0xc92c, 0xc92d, 0xc92e, 0xc92f, 0xc930, 0xc931, 0xc932, 0xc933, 0x0000, 0x0000, 0x0000, 0xc934, 0xc935, 0xc936, 0xc937, 0xc938, 0xc939, 0xc93a, 0xc93b, 0xc93c, 0xc93d, 0xc93e, 0xc93f, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0x0000, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0x0000, 0x0000, 0x0000, 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0x0000, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0x0000, 0xc97d, 0xc97e, 0xc97f, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0x0000, 0x0000, 0x0000, 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0x0000, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xc9a1, 0xc9a2, 0xc9a3, 0x0000, 0x0000, 0x0000, 0xc9a4, 0xc9a5, 0xc9a6, 0xc9a7, 0xc9a8, 0xc9a9, 0xc9aa, 0xc9ab, 0xc9ac, 0xc9ad, 0xc9ae, 0xc9af, 0xc9b0, 0xc9b1, 0xc9b2, 0xc9b3, 0xc9b4, 0x0000, 0xc9b5, 0xc9b6, 0xc9b7, 0xc9b8, 0xc9b9, 0xc9ba, 0xc9bb, 0xc9bc, 0xc9bd, 0xc9be, 0xc9bf, 0x0000, 0x0000, 0x0000, 0xc9c0, 0xc9c1, 0xc9c2, 0xc9c3, 0xc9c4, 0xc9c5, 0xc9c6, 0xc9c7, 0xc9c8, 0xc9c9, 0xc9ca, 0xc9cb, 0xc9cc, 0xc9cd, 0xc9ce, 0xc9cf, 0xc9d0, 0x0000, 0xc9d1, 0xc9d2, 0xc9d3, 0xc9d4, 0xc9d5, 0xc9d6, 0xc9d7, 0xc9d8, 0xc9d9, 0xc9da, 0xc9db, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3149, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xc9dc, 0xc9dd, 0xc9de, 0xc9df, 0xc9e0, 0xc9e1, 0xc9e2, 0xc9e3, 0xc9e4, 0xc9e5, 0xc9e6, 0xc9e7, 0xc9e8, 0xc9e9, 0xc9ea, 0xc9eb, 0xc9ec, 0x0000, 0xc9ed, 0xc9ee, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f2, 0xc9f3, 0xc9f4, 0xc9f5, 0xc9f6, 0xc9f7, 0x0000, 0x0000, 0x0000, 0xc9f8, 0xc9f9, 0xc9fa, 0xc9fb, 0xc9fc, 0xc9fd, 0xc9fe, 0xc9ff, 0xca00, 0xca01, 0xca02, 0xca03, 0xca04, 0xca05, 0xca06, 0xca07, 0xca08, 0x0000, 0xca09, 0xca0a, 0xca0b, 0xca0c, 0xca0d, 0xca0e, 0xca0f, 0xca10, 0xca11, 0xca12, 0xca13, 0x0000, 0x0000, 0x0000, 0xca14, 0xca15, 0xca16, 0xca17, 0xca18, 0xca19, 0xca1a, 0xca1b, 0xca1c, 0xca1d, 0xca1e, 0xca1f, 0xca20, 0xca21, 0xca22, 0xca23, 0xca24, 0x0000, 0xca25, 0xca26, 0xca27, 0xca28, 0xca29, 0xca2a, 0xca2b, 0xca2c, 0xca2d, 0xca2e, 0xca2f, 0x0000, 0x0000, 0x0000, 0xca30, 0xca31, 0xca32, 0xca33, 0xca34, 0xca35, 0xca36, 0xca37, 0xca38, 0xca39, 0xca3a, 0xca3b, 0xca3c, 0xca3d, 0xca3e, 0xca3f, 0xca40, 0x0000, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0x0000, 0x0000, 0x0000, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0x0000, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0x0000, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca7f, 0xca80, 0xca81, 0xca82, 0xca83, 0x0000, 0x0000, 0x0000, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0x0000, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0x0000, 0x0000, 0x0000, 0xcaa0, 0xcaa1, 0xcaa2, 0xcaa3, 0xcaa4, 0xcaa5, 0xcaa6, 0xcaa7, 0xcaa8, 0xcaa9, 0xcaaa, 0xcaab, 0xcaac, 0xcaad, 0xcaae, 0xcaaf, 0xcab0, 0x0000, 0xcab1, 0xcab2, 0xcab3, 0xcab4, 0xcab5, 0xcab6, 0xcab7, 0xcab8, 0xcab9, 0xcaba, 0xcabb, 0x0000, 0x0000, 0x0000, 0xcabc, 0xcabd, 0xcabe, 0xcabf, 0xcac0, 0xcac1, 0xcac2, 0xcac3, 0xcac4, 0xcac5, 0xcac6, 0xcac7, 0xcac8, 0xcac9, 0xcaca, 0xcacb, 0xcacc, 0x0000, 0xcacd, 0xcace, 0xcacf, 0xcad0, 0xcad1, 0xcad2, 0xcad3, 0xcad4, 0xcad5, 0xcad6, 0xcad7, 0x0000, 0x0000, 0x0000, 0xcad8, 0xcad9, 0xcada, 0xcadb, 0xcadc, 0xcadd, 0xcade, 0xcadf, 0xcae0, 0xcae1, 0xcae2, 0xcae3, 0xcae4, 0xcae5, 0xcae6, 0xcae7, 0xcae8, 0x0000, 0xcae9, 0xcaea, 0xcaeb, 0xcaec, 0xcaed, 0xcaee, 0xcaef, 0xcaf0, 0xcaf1, 0xcaf2, 0xcaf3, 0x0000, 0x0000, 0x0000, 0xcaf4, 0xcaf5, 0xcaf6, 0xcaf7, 0xcaf8, 0xcaf9, 0xcafa, 0xcafb, 0xcafc, 0xcafd, 0xcafe, 0xcaff, 0xcb00, 0xcb01, 0xcb02, 0xcb03, 0xcb04, 0x0000, 0xcb05, 0xcb06, 0xcb07, 0xcb08, 0xcb09, 0xcb0a, 0xcb0b, 0xcb0c, 0xcb0d, 0xcb0e, 0xcb0f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcb10, 0xcb11, 0xcb12, 0xcb13, 0xcb14, 0xcb15, 0xcb16, 0xcb17, 0xcb18, 0xcb19, 0xcb1a, 0xcb1b, 0xcb1c, 0xcb1d, 0xcb1e, 0xcb1f, 0xcb20, 0x0000, 0xcb21, 0xcb22, 0xcb23, 0xcb24, 0xcb25, 0xcb26, 0xcb27, 0xcb28, 0xcb29, 0xcb2a, 0xcb2b, 0x0000, 0x0000, 0x0000, 0xcb2c, 0xcb2d, 0xcb2e, 0xcb2f, 0xcb30, 0xcb31, 0xcb32, 0xcb33, 0xcb34, 0xcb35, 0xcb36, 0xcb37, 0xcb38, 0xcb39, 0xcb3a, 0xcb3b, 0xcb3c, 0x0000, 0xcb3d, 0xcb3e, 0xcb3f, 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0x0000, 0x0000, 0x0000, 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0x0000, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0x0000, 0x0000, 0x0000, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0x0000, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb7f, 0x0000, 0x0000, 0x0000, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0x0000, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0x0000, 0x0000, 0x0000, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcba1, 0xcba2, 0xcba3, 0xcba4, 0xcba5, 0xcba6, 0xcba7, 0xcba8, 0xcba9, 0xcbaa, 0xcbab, 0xcbac, 0x0000, 0xcbad, 0xcbae, 0xcbaf, 0xcbb0, 0xcbb1, 0xcbb2, 0xcbb3, 0xcbb4, 0xcbb5, 0xcbb6, 0xcbb7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcbb8, 0xcbb9, 0xcbba, 0xcbbb, 0xcbbc, 0xcbbd, 0xcbbe, 0xcbbf, 0xcbc0, 0xcbc1, 0xcbc2, 0xcbc3, 0xcbc4, 0xcbc5, 0xcbc6, 0xcbc7, 0xcbc8, 0x0000, 0xcbc9, 0xcbca, 0xcbcb, 0xcbcc, 0xcbcd, 0xcbce, 0xcbcf, 0xcbd0, 0xcbd1, 0xcbd2, 0xcbd3, 0x0000, 0x0000, 0x0000, 0xcbd4, 0xcbd5, 0xcbd6, 0xcbd7, 0xcbd8, 0xcbd9, 0xcbda, 0xcbdb, 0xcbdc, 0xcbdd, 0xcbde, 0xcbdf, 0xcbe0, 0xcbe1, 0xcbe2, 0xcbe3, 0xcbe4, 0x0000, 0xcbe5, 0xcbe6, 0xcbe7, 0xcbe8, 0xcbe9, 0xcbea, 0xcbeb, 0xcbec, 0xcbed, 0xcbee, 0xcbef, 0x0000, 0x0000, 0x0000, 0xcbf0, 0xcbf1, 0xcbf2, 0xcbf3, 0xcbf4, 0xcbf5, 0xcbf6, 0xcbf7, 0xcbf8, 0xcbf9, 0xcbfa, 0xcbfb, 0xcbfc, 0xcbfd, 0xcbfe, 0xcbff, 0xcc00, 0x0000, 0xcc01, 0xcc02, 0xcc03, 0xcc04, 0xcc05, 0xcc06, 0xcc07, 0xcc08, 0xcc09, 0xcc0a, 0xcc0b, 0x0000, 0x0000, 0x0000, 0xcc0c, 0xcc0d, 0xcc0e, 0xcc0f, 0xcc10, 0xcc11, 0xcc12, 0xcc13, 0xcc14, 0xcc15, 0xcc16, 0xcc17, 0xcc18, 0xcc19, 0xcc1a, 0xcc1b, 0xcc1c, 0x0000, 0xcc1d, 0xcc1e, 0xcc1f, 0xcc20, 0xcc21, 0xcc22, 0xcc23, 0xcc24, 0xcc25, 0xcc26, 0xcc27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcc28, 0xcc29, 0xcc2a, 0xcc2b, 0xcc2c, 0xcc2d, 0xcc2e, 0xcc2f, 0xcc30, 0xcc31, 0xcc32, 0xcc33, 0xcc34, 0xcc35, 0xcc36, 0xcc37, 0xcc38, 0x0000, 0xcc39, 0xcc3a, 0xcc3b, 0xcc3c, 0xcc3d, 0xcc3e, 0xcc3f, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0x0000, 0x0000, 0x0000, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0x0000, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0x0000, 0x0000, 0x0000, 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0x0000, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0x0000, 0x0000, 0x0000, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc7f, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0x0000, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0x0000, 0x0000, 0x0000, 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcca1, 0xcca2, 0xcca3, 0xcca4, 0xcca5, 0xcca6, 0xcca7, 0xcca8, 0x0000, 0xcca9, 0xccaa, 0xccab, 0xccac, 0xccad, 0xccae, 0xccaf, 0xccb0, 0xccb1, 0xccb2, 0xccb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xccb4, 0xccb5, 0xccb6, 0xccb7, 0xccb8, 0xccb9, 0xccba, 0xccbb, 0xccbc, 0xccbd, 0xccbe, 0xccbf, 0xccc0, 0xccc1, 0xccc2, 0xccc3, 0xccc4, 0x0000, 0xccc5, 0xccc6, 0xccc7, 0xccc8, 0xccc9, 0xccca, 0xcccb, 0xcccc, 0xcccd, 0xccce, 0xcccf, 0x0000, 0x0000, 0x0000, 0xccd0, 0xccd1, 0xccd2, 0xccd3, 0xccd4, 0xccd5, 0xccd6, 0xccd7, 0xccd8, 0xccd9, 0xccda, 0xccdb, 0xccdc, 0xccdd, 0xccde, 0xccdf, 0xcce0, 0x0000, 0xcce1, 0xcce2, 0xcce3, 0xcce4, 0xcce5, 0xcce6, 0xcce7, 0xcce8, 0xcce9, 0xccea, 0xcceb, 0x0000, 0x0000, 0x0000, 0xccec, 0xcced, 0xccee, 0xccef, 0xccf0, 0xccf1, 0xccf2, 0xccf3, 0xccf4, 0xccf5, 0xccf6, 0xccf7, 0xccf8, 0xccf9, 0xccfa, 0xccfb, 0xccfc, 0x0000, 0xccfd, 0xccfe, 0xccff, 0xcd00, 0xcd01, 0xcd02, 0xcd03, 0xcd04, 0xcd05, 0xcd06, 0xcd07, 0x0000, 0x0000, 0x0000, 0xcd08, 0xcd09, 0xcd0a, 0xcd0b, 0xcd0c, 0xcd0d, 0xcd0e, 0xcd0f, 0xcd10, 0xcd11, 0xcd12, 0xcd13, 0xcd14, 0xcd15, 0xcd16, 0xcd17, 0xcd18, 0x0000, 0xcd19, 0xcd1a, 0xcd1b, 0xcd1c, 0xcd1d, 0xcd1e, 0xcd1f, 0xcd20, 0xcd21, 0xcd22, 0xcd23, 0x0000, 0x0000, 0x0000, 0xcd24, 0xcd25, 0xcd26, 0xcd27, 0xcd28, 0xcd29, 0xcd2a, 0xcd2b, 0xcd2c, 0xcd2d, 0xcd2e, 0xcd2f, 0xcd30, 0xcd31, 0xcd32, 0xcd33, 0xcd34, 0x0000, 0xcd35, 0xcd36, 0xcd37, 0xcd38, 0xcd39, 0xcd3a, 0xcd3b, 0xcd3c, 0xcd3d, 0xcd3e, 0xcd3f, 0x0000, 0x0000, 0x0000, 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0x0000, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0x0000, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0x0000, 0x0000, 0x0000, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd7f, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0x0000, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0x0000, 0x0000, 0x0000, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xcda1, 0xcda2, 0xcda3, 0xcda4, 0x0000, 0xcda5, 0xcda6, 0xcda7, 0xcda8, 0xcda9, 0xcdaa, 0xcdab, 0xcdac, 0xcdad, 0xcdae, 0xcdaf, 0x0000, 0x0000, 0x0000, 0xcdb0, 0xcdb1, 0xcdb2, 0xcdb3, 0xcdb4, 0xcdb5, 0xcdb6, 0xcdb7, 0xcdb8, 0xcdb9, 0xcdba, 0xcdbb, 0xcdbc, 0xcdbd, 0xcdbe, 0xcdbf, 0xcdc0, 0x0000, 0xcdc1, 0xcdc2, 0xcdc3, 0xcdc4, 0xcdc5, 0xcdc6, 0xcdc7, 0xcdc8, 0xcdc9, 0xcdca, 0xcdcb, 0x0000, 0x0000, 0x0000, 0xcdcc, 0xcdcd, 0xcdce, 0xcdcf, 0xcdd0, 0xcdd1, 0xcdd2, 0xcdd3, 0xcdd4, 0xcdd5, 0xcdd6, 0xcdd7, 0xcdd8, 0xcdd9, 0xcdda, 0xcddb, 0xcddc, 0x0000, 0xcddd, 0xcdde, 0xcddf, 0xcde0, 0xcde1, 0xcde2, 0xcde3, 0xcde4, 0xcde5, 0xcde6, 0xcde7, 0x0000, 0x0000, 0x0000, 0xcde8, 0xcde9, 0xcdea, 0xcdeb, 0xcdec, 0xcded, 0xcdee, 0xcdef, 0xcdf0, 0xcdf1, 0xcdf2, 0xcdf3, 0xcdf4, 0xcdf5, 0xcdf6, 0xcdf7, 0xcdf8, 0x0000, 0xcdf9, 0xcdfa, 0xcdfb, 0xcdfc, 0xcdfd, 0xcdfe, 0xcdff, 0xce00, 0xce01, 0xce02, 0xce03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce04, 0xce05, 0xce06, 0xce07, 0xce08, 0xce09, 0xce0a, 0xce0b, 0xce0c, 0xce0d, 0xce0e, 0xce0f, 0xce10, 0xce11, 0xce12, 0xce13, 0xce14, 0x0000, 0xce15, 0xce16, 0xce17, 0xce18, 0xce19, 0xce1a, 0xce1b, 0xce1c, 0xce1d, 0xce1e, 0xce1f, 0x0000, 0x0000, 0x0000, 0xce20, 0xce21, 0xce22, 0xce23, 0xce24, 0xce25, 0xce26, 0xce27, 0xce28, 0xce29, 0xce2a, 0xce2b, 0xce2c, 0xce2d, 0xce2e, 0xce2f, 0xce30, 0x0000, 0xce31, 0xce32, 0xce33, 0xce34, 0xce35, 0xce36, 0xce37, 0xce38, 0xce39, 0xce3a, 0xce3b, 0x0000, 0x0000, 0x0000, 0xce3c, 0xce3d, 0xce3e, 0xce3f, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0x0000, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0x0000, 0x0000, 0x0000, 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0x0000, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce7f, 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0x0000, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0x0000, 0x0000, 0x0000, 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0x0000, 0xcea1, 0xcea2, 0xcea3, 0xcea4, 0xcea5, 0xcea6, 0xcea7, 0xcea8, 0xcea9, 0xceaa, 0xceab, 0x0000, 0x0000, 0x0000, 0xceac, 0xcead, 0xceae, 0xceaf, 0xceb0, 0xceb1, 0xceb2, 0xceb3, 0xceb4, 0xceb5, 0xceb6, 0xceb7, 0xceb8, 0xceb9, 0xceba, 0xcebb, 0xcebc, 0x0000, 0xcebd, 0xcebe, 0xcebf, 0xcec0, 0xcec1, 0xcec2, 0xcec3, 0xcec4, 0xcec5, 0xcec6, 0xcec7, 0x0000, 0x0000, 0x0000, 0xcec8, 0xcec9, 0xceca, 0xcecb, 0xcecc, 0xcecd, 0xcece, 0xcecf, 0xced0, 0xced1, 0xced2, 0xced3, 0xced4, 0xced5, 0xced6, 0xced7, 0xced8, 0x0000, 0xced9, 0xceda, 0xcedb, 0xcedc, 0xcedd, 0xcede, 0xcedf, 0xcee0, 0xcee1, 0xcee2, 0xcee3, 0x0000, 0x0000, 0x0000, 0xcee4, 0xcee5, 0xcee6, 0xcee7, 0xcee8, 0xcee9, 0xceea, 0xceeb, 0xceec, 0xceed, 0xceee, 0xceef, 0xcef0, 0xcef1, 0xcef2, 0xcef3, 0xcef4, 0x0000, 0xcef5, 0xcef6, 0xcef7, 0xcef8, 0xcef9, 0xcefa, 0xcefb, 0xcefc, 0xcefd, 0xcefe, 0xceff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcf00, 0xcf01, 0xcf02, 0xcf03, 0xcf04, 0xcf05, 0xcf06, 0xcf07, 0xcf08, 0xcf09, 0xcf0a, 0xcf0b, 0xcf0c, 0xcf0d, 0xcf0e, 0xcf0f, 0xcf10, 0x0000, 0xcf11, 0xcf12, 0xcf13, 0xcf14, 0xcf15, 0xcf16, 0xcf17, 0xcf18, 0xcf19, 0xcf1a, 0xcf1b, 0x0000, 0x0000, 0x0000, 0xcf1c, 0xcf1d, 0xcf1e, 0xcf1f, 0xcf20, 0xcf21, 0xcf22, 0xcf23, 0xcf24, 0xcf25, 0xcf26, 0xcf27, 0xcf28, 0xcf29, 0xcf2a, 0xcf2b, 0xcf2c, 0x0000, 0xcf2d, 0xcf2e, 0xcf2f, 0xcf30, 0xcf31, 0xcf32, 0xcf33, 0xcf34, 0xcf35, 0xcf36, 0xcf37, 0x0000, 0x0000, 0x0000, 0xcf38, 0xcf39, 0xcf3a, 0xcf3b, 0xcf3c, 0xcf3d, 0xcf3e, 0xcf3f, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0x0000, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0x0000, 0x0000, 0x0000, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0x0000, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0x0000, 0x0000, 0x0000, 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf7f, 0xcf80, 0x0000, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0x0000, 0x0000, 0x0000, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0x0000, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xcfa1, 0xcfa2, 0xcfa3, 0xcfa4, 0xcfa5, 0xcfa6, 0xcfa7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xcfa8, 0xcfa9, 0xcfaa, 0xcfab, 0xcfac, 0xcfad, 0xcfae, 0xcfaf, 0xcfb0, 0xcfb1, 0xcfb2, 0xcfb3, 0xcfb4, 0xcfb5, 0xcfb6, 0xcfb7, 0xcfb8, 0x0000, 0xcfb9, 0xcfba, 0xcfbb, 0xcfbc, 0xcfbd, 0xcfbe, 0xcfbf, 0xcfc0, 0xcfc1, 0xcfc2, 0xcfc3, 0x0000, 0x0000, 0x0000, 0xcfc4, 0xcfc5, 0xcfc6, 0xcfc7, 0xcfc8, 0xcfc9, 0xcfca, 0xcfcb, 0xcfcc, 0xcfcd, 0xcfce, 0xcfcf, 0xcfd0, 0xcfd1, 0xcfd2, 0xcfd3, 0xcfd4, 0x0000, 0xcfd5, 0xcfd6, 0xcfd7, 0xcfd8, 0xcfd9, 0xcfda, 0xcfdb, 0xcfdc, 0xcfdd, 0xcfde, 0xcfdf, 0x0000, 0x0000, 0x0000, 0xcfe0, 0xcfe1, 0xcfe2, 0xcfe3, 0xcfe4, 0xcfe5, 0xcfe6, 0xcfe7, 0xcfe8, 0xcfe9, 0xcfea, 0xcfeb, 0xcfec, 0xcfed, 0xcfee, 0xcfef, 0xcff0, 0x0000, 0xcff1, 0xcff2, 0xcff3, 0xcff4, 0xcff5, 0xcff6, 0xcff7, 0xcff8, 0xcff9, 0xcffa, 0xcffb, 0x0000, 0x0000, 0x0000, 0xcffc, 0xcffd, 0xcffe, 0xcfff, 0xd000, 0xd001, 0xd002, 0xd003, 0xd004, 0xd005, 0xd006, 0xd007, 0xd008, 0xd009, 0xd00a, 0xd00b, 0xd00c, 0x0000, 0xd00d, 0xd00e, 0xd00f, 0xd010, 0xd011, 0xd012, 0xd013, 0xd014, 0xd015, 0xd016, 0xd017, 0x0000, 0x0000, 0x0000, 0xd018, 0xd019, 0xd01a, 0xd01b, 0xd01c, 0xd01d, 0xd01e, 0xd01f, 0xd020, 0xd021, 0xd022, 0xd023, 0xd024, 0xd025, 0xd026, 0xd027, 0xd028, 0x0000, 0xd029, 0xd02a, 0xd02b, 0xd02c, 0xd02d, 0xd02e, 0xd02f, 0xd030, 0xd031, 0xd032, 0xd033, 0x0000, 0x0000, 0x0000, 0xd034, 0xd035, 0xd036, 0xd037, 0xd038, 0xd039, 0xd03a, 0xd03b, 0xd03c, 0xd03d, 0xd03e, 0xd03f, 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0x0000, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0x0000, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0x0000, 0x0000, 0x0000, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0x0000, 0xd07d, 0xd07e, 0xd07f, 0xd080, 0xd081, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0x0000, 0x0000, 0x0000, 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0x0000, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd0a1, 0xd0a2, 0xd0a3, 0x0000, 0x0000, 0x0000, 0xd0a4, 0xd0a5, 0xd0a6, 0xd0a7, 0xd0a8, 0xd0a9, 0xd0aa, 0xd0ab, 0xd0ac, 0xd0ad, 0xd0ae, 0xd0af, 0xd0b0, 0xd0b1, 0xd0b2, 0xd0b3, 0xd0b4, 0x0000, 0xd0b5, 0xd0b6, 0xd0b7, 0xd0b8, 0xd0b9, 0xd0ba, 0xd0bb, 0xd0bc, 0xd0bd, 0xd0be, 0xd0bf, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd0c0, 0xd0c1, 0xd0c2, 0xd0c3, 0xd0c4, 0xd0c5, 0xd0c6, 0xd0c7, 0xd0c8, 0xd0c9, 0xd0ca, 0xd0cb, 0xd0cc, 0xd0cd, 0xd0ce, 0xd0cf, 0xd0d0, 0x0000, 0xd0d1, 0xd0d2, 0xd0d3, 0xd0d4, 0xd0d5, 0xd0d6, 0xd0d7, 0xd0d8, 0xd0d9, 0xd0da, 0xd0db, 0x0000, 0x0000, 0x0000, 0xd0dc, 0xd0dd, 0xd0de, 0xd0df, 0xd0e0, 0xd0e1, 0xd0e2, 0xd0e3, 0xd0e4, 0xd0e5, 0xd0e6, 0xd0e7, 0xd0e8, 0xd0e9, 0xd0ea, 0xd0eb, 0xd0ec, 0x0000, 0xd0ed, 0xd0ee, 0xd0ef, 0xd0f0, 0xd0f1, 0xd0f2, 0xd0f3, 0xd0f4, 0xd0f5, 0xd0f6, 0xd0f7, 0x0000, 0x0000, 0x0000, 0xd0f8, 0xd0f9, 0xd0fa, 0xd0fb, 0xd0fc, 0xd0fd, 0xd0fe, 0xd0ff, 0xd100, 0xd101, 0xd102, 0xd103, 0xd104, 0xd105, 0xd106, 0xd107, 0xd108, 0x0000, 0xd109, 0xd10a, 0xd10b, 0xd10c, 0xd10d, 0xd10e, 0xd10f, 0xd110, 0xd111, 0xd112, 0xd113, 0x0000, 0x0000, 0x0000, 0xd114, 0xd115, 0xd116, 0xd117, 0xd118, 0xd119, 0xd11a, 0xd11b, 0xd11c, 0xd11d, 0xd11e, 0xd11f, 0xd120, 0xd121, 0xd122, 0xd123, 0xd124, 0x0000, 0xd125, 0xd126, 0xd127, 0xd128, 0xd129, 0xd12a, 0xd12b, 0xd12c, 0xd12d, 0xd12e, 0xd12f, 0x0000, 0x0000, 0x0000, 0xd130, 0xd131, 0xd132, 0xd133, 0xd134, 0xd135, 0xd136, 0xd137, 0xd138, 0xd139, 0xd13a, 0xd13b, 0xd13c, 0xd13d, 0xd13e, 0xd13f, 0xd140, 0x0000, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0x0000, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0x0000, 0x0000, 0x0000, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0x0000, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd17f, 0xd180, 0xd181, 0xd182, 0xd183, 0x0000, 0x0000, 0x0000, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0x0000, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0x0000, 0x0000, 0x0000, 0xd1a0, 0xd1a1, 0xd1a2, 0xd1a3, 0xd1a4, 0xd1a5, 0xd1a6, 0xd1a7, 0xd1a8, 0xd1a9, 0xd1aa, 0xd1ab, 0xd1ac, 0xd1ad, 0xd1ae, 0xd1af, 0xd1b0, 0x0000, 0xd1b1, 0xd1b2, 0xd1b3, 0xd1b4, 0xd1b5, 0xd1b6, 0xd1b7, 0xd1b8, 0xd1b9, 0xd1ba, 0xd1bb, 0x0000, 0x0000, 0x0000, 0xd1bc, 0xd1bd, 0xd1be, 0xd1bf, 0xd1c0, 0xd1c1, 0xd1c2, 0xd1c3, 0xd1c4, 0xd1c5, 0xd1c6, 0xd1c7, 0xd1c8, 0xd1c9, 0xd1ca, 0xd1cb, 0xd1cc, 0x0000, 0xd1cd, 0xd1ce, 0xd1cf, 0xd1d0, 0xd1d1, 0xd1d2, 0xd1d3, 0xd1d4, 0xd1d5, 0xd1d6, 0xd1d7, 0x0000, 0x0000, 0x0000, 0xd1d8, 0xd1d9, 0xd1da, 0xd1db, 0xd1dc, 0xd1dd, 0xd1de, 0xd1df, 0xd1e0, 0xd1e1, 0xd1e2, 0xd1e3, 0xd1e4, 0xd1e5, 0xd1e6, 0xd1e7, 0xd1e8, 0x0000, 0xd1e9, 0xd1ea, 0xd1eb, 0xd1ec, 0xd1ed, 0xd1ee, 0xd1ef, 0xd1f0, 0xd1f1, 0xd1f2, 0xd1f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd1f4, 0xd1f5, 0xd1f6, 0xd1f7, 0xd1f8, 0xd1f9, 0xd1fa, 0xd1fb, 0xd1fc, 0xd1fd, 0xd1fe, 0xd1ff, 0xd200, 0xd201, 0xd202, 0xd203, 0xd204, 0x0000, 0xd205, 0xd206, 0xd207, 0xd208, 0xd209, 0xd20a, 0xd20b, 0xd20c, 0xd20d, 0xd20e, 0xd20f, 0x0000, 0x0000, 0x0000, 0xd210, 0xd211, 0xd212, 0xd213, 0xd214, 0xd215, 0xd216, 0xd217, 0xd218, 0xd219, 0xd21a, 0xd21b, 0xd21c, 0xd21d, 0xd21e, 0xd21f, 0xd220, 0x0000, 0xd221, 0xd222, 0xd223, 0xd224, 0xd225, 0xd226, 0xd227, 0xd228, 0xd229, 0xd22a, 0xd22b, 0x0000, 0x0000, 0x0000, 0xd22c, 0xd22d, 0xd22e, 0xd22f, 0xd230, 0xd231, 0xd232, 0xd233, 0xd234, 0xd235, 0xd236, 0xd237, 0xd238, 0xd239, 0xd23a, 0xd23b, 0xd23c, 0x0000, 0xd23d, 0xd23e, 0xd23f, 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0x0000, 0x0000, 0x0000, 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0x0000, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0x0000, 0x0000, 0x0000, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0x0000, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd27f, 0x0000, 0x0000, 0x0000, 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0x0000, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd2a1, 0xd2a2, 0xd2a3, 0xd2a4, 0xd2a5, 0xd2a6, 0xd2a7, 0xd2a8, 0xd2a9, 0xd2aa, 0xd2ab, 0xd2ac, 0x0000, 0xd2ad, 0xd2ae, 0xd2af, 0xd2b0, 0xd2b1, 0xd2b2, 0xd2b3, 0xd2b4, 0xd2b5, 0xd2b6, 0xd2b7, 0x0000, 0x0000, 0x0000, 0xd2b8, 0xd2b9, 0xd2ba, 0xd2bb, 0xd2bc, 0xd2bd, 0xd2be, 0xd2bf, 0xd2c0, 0xd2c1, 0xd2c2, 0xd2c3, 0xd2c4, 0xd2c5, 0xd2c6, 0xd2c7, 0xd2c8, 0x0000, 0xd2c9, 0xd2ca, 0xd2cb, 0xd2cc, 0xd2cd, 0xd2ce, 0xd2cf, 0xd2d0, 0xd2d1, 0xd2d2, 0xd2d3, 0x0000, 0x0000, 0x0000, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2d7, 0xd2d8, 0xd2d9, 0xd2da, 0xd2db, 0xd2dc, 0xd2dd, 0xd2de, 0xd2df, 0xd2e0, 0xd2e1, 0xd2e2, 0xd2e3, 0xd2e4, 0x0000, 0xd2e5, 0xd2e6, 0xd2e7, 0xd2e8, 0xd2e9, 0xd2ea, 0xd2eb, 0xd2ec, 0xd2ed, 0xd2ee, 0xd2ef, 0x0000, 0x0000, 0x0000, 0xd2f0, 0xd2f1, 0xd2f2, 0xd2f3, 0xd2f4, 0xd2f5, 0xd2f6, 0xd2f7, 0xd2f8, 0xd2f9, 0xd2fa, 0xd2fb, 0xd2fc, 0xd2fd, 0xd2fe, 0xd2ff, 0xd300, 0x0000, 0xd301, 0xd302, 0xd303, 0xd304, 0xd305, 0xd306, 0xd307, 0xd308, 0xd309, 0xd30a, 0xd30b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd30c, 0xd30d, 0xd30e, 0xd30f, 0xd310, 0xd311, 0xd312, 0xd313, 0xd314, 0xd315, 0xd316, 0xd317, 0xd318, 0xd319, 0xd31a, 0xd31b, 0xd31c, 0x0000, 0xd31d, 0xd31e, 0xd31f, 0xd320, 0xd321, 0xd322, 0xd323, 0xd324, 0xd325, 0xd326, 0xd327, 0x0000, 0x0000, 0x0000, 0xd328, 0xd329, 0xd32a, 0xd32b, 0xd32c, 0xd32d, 0xd32e, 0xd32f, 0xd330, 0xd331, 0xd332, 0xd333, 0xd334, 0xd335, 0xd336, 0xd337, 0xd338, 0x0000, 0xd339, 0xd33a, 0xd33b, 0xd33c, 0xd33d, 0xd33e, 0xd33f, 0xd340, 0xd341, 0xd342, 0xd343, 0x0000, 0x0000, 0x0000, 0xd344, 0xd345, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0x0000, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0x0000, 0x0000, 0x0000, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0x0000, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, 0xd37a, 0xd37b, 0x0000, 0x0000, 0x0000, 0xd37c, 0xd37d, 0xd37e, 0xd37f, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0x0000, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd3a1, 0xd3a2, 0xd3a3, 0xd3a4, 0xd3a5, 0xd3a6, 0xd3a7, 0xd3a8, 0x0000, 0xd3a9, 0xd3aa, 0xd3ab, 0xd3ac, 0xd3ad, 0xd3ae, 0xd3af, 0xd3b0, 0xd3b1, 0xd3b2, 0xd3b3, 0x0000, 0x0000, 0x0000, 0xd3b4, 0xd3b5, 0xd3b6, 0xd3b7, 0xd3b8, 0xd3b9, 0xd3ba, 0xd3bb, 0xd3bc, 0xd3bd, 0xd3be, 0xd3bf, 0xd3c0, 0xd3c1, 0xd3c2, 0xd3c3, 0xd3c4, 0x0000, 0xd3c5, 0xd3c6, 0xd3c7, 0xd3c8, 0xd3c9, 0xd3ca, 0xd3cb, 0xd3cc, 0xd3cd, 0xd3ce, 0xd3cf, 0x0000, 0x0000, 0x0000, 0xd3d0, 0xd3d1, 0xd3d2, 0xd3d3, 0xd3d4, 0xd3d5, 0xd3d6, 0xd3d7, 0xd3d8, 0xd3d9, 0xd3da, 0xd3db, 0xd3dc, 0xd3dd, 0xd3de, 0xd3df, 0xd3e0, 0x0000, 0xd3e1, 0xd3e2, 0xd3e3, 0xd3e4, 0xd3e5, 0xd3e6, 0xd3e7, 0xd3e8, 0xd3e9, 0xd3ea, 0xd3eb, 0x0000, 0x0000, 0x0000, 0xd3ec, 0xd3ed, 0xd3ee, 0xd3ef, 0xd3f0, 0xd3f1, 0xd3f2, 0xd3f3, 0xd3f4, 0xd3f5, 0xd3f6, 0xd3f7, 0xd3f8, 0xd3f9, 0xd3fa, 0xd3fb, 0xd3fc, 0x0000, 0xd3fd, 0xd3fe, 0xd3ff, 0xd400, 0xd401, 0xd402, 0xd403, 0xd404, 0xd405, 0xd406, 0xd407, 0x0000, 0x0000, 0x0000, 0xd408, 0xd409, 0xd40a, 0xd40b, 0xd40c, 0xd40d, 0xd40e, 0xd40f, 0xd410, 0xd411, 0xd412, 0xd413, 0xd414, 0xd415, 0xd416, 0xd417, 0xd418, 0x0000, 0xd419, 0xd41a, 0xd41b, 0xd41c, 0xd41d, 0xd41e, 0xd41f, 0xd420, 0xd421, 0xd422, 0xd423, 0x0000, 0x0000, 0x0000, 0xd424, 0xd425, 0xd426, 0xd427, 0xd428, 0xd429, 0xd42a, 0xd42b, 0xd42c, 0xd42d, 0xd42e, 0xd42f, 0xd430, 0xd431, 0xd432, 0xd433, 0xd434, 0x0000, 0xd435, 0xd436, 0xd437, 0xd438, 0xd439, 0xd43a, 0xd43b, 0xd43c, 0xd43d, 0xd43e, 0xd43f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0x0000, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0x0000, 0x0000, 0x0000, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0x0000, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0x0000, 0x0000, 0x0000, 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd47f, 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0x0000, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0x0000, 0x0000, 0x0000, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd4a1, 0xd4a2, 0xd4a3, 0xd4a4, 0x0000, 0xd4a5, 0xd4a6, 0xd4a7, 0xd4a8, 0xd4a9, 0xd4aa, 0xd4ab, 0xd4ac, 0xd4ad, 0xd4ae, 0xd4af, 0x0000, 0x0000, 0x0000, 0xd4b0, 0xd4b1, 0xd4b2, 0xd4b3, 0xd4b4, 0xd4b5, 0xd4b6, 0xd4b7, 0xd4b8, 0xd4b9, 0xd4ba, 0xd4bb, 0xd4bc, 0xd4bd, 0xd4be, 0xd4bf, 0xd4c0, 0x0000, 0xd4c1, 0xd4c2, 0xd4c3, 0xd4c4, 0xd4c5, 0xd4c6, 0xd4c7, 0xd4c8, 0xd4c9, 0xd4ca, 0xd4cb, 0x0000, 0x0000, 0x0000, 0xd4cc, 0xd4cd, 0xd4ce, 0xd4cf, 0xd4d0, 0xd4d1, 0xd4d2, 0xd4d3, 0xd4d4, 0xd4d5, 0xd4d6, 0xd4d7, 0xd4d8, 0xd4d9, 0xd4da, 0xd4db, 0xd4dc, 0x0000, 0xd4dd, 0xd4de, 0xd4df, 0xd4e0, 0xd4e1, 0xd4e2, 0xd4e3, 0xd4e4, 0xd4e5, 0xd4e6, 0xd4e7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd4e8, 0xd4e9, 0xd4ea, 0xd4eb, 0xd4ec, 0xd4ed, 0xd4ee, 0xd4ef, 0xd4f0, 0xd4f1, 0xd4f2, 0xd4f3, 0xd4f4, 0xd4f5, 0xd4f6, 0xd4f7, 0xd4f8, 0x0000, 0xd4f9, 0xd4fa, 0xd4fb, 0xd4fc, 0xd4fd, 0xd4fe, 0xd4ff, 0xd500, 0xd501, 0xd502, 0xd503, 0x0000, 0x0000, 0x0000, 0xd504, 0xd505, 0xd506, 0xd507, 0xd508, 0xd509, 0xd50a, 0xd50b, 0xd50c, 0xd50d, 0xd50e, 0xd50f, 0xd510, 0xd511, 0xd512, 0xd513, 0xd514, 0x0000, 0xd515, 0xd516, 0xd517, 0xd518, 0xd519, 0xd51a, 0xd51b, 0xd51c, 0xd51d, 0xd51e, 0xd51f, 0x0000, 0x0000, 0x0000, 0xd520, 0xd521, 0xd522, 0xd523, 0xd524, 0xd525, 0xd526, 0xd527, 0xd528, 0xd529, 0xd52a, 0xd52b, 0xd52c, 0xd52d, 0xd52e, 0xd52f, 0xd530, 0x0000, 0xd531, 0xd532, 0xd533, 0xd534, 0xd535, 0xd536, 0xd537, 0xd538, 0xd539, 0xd53a, 0xd53b, 0x0000, 0x0000, 0x0000, 0xd53c, 0xd53d, 0xd53e, 0xd53f, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0x0000, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0x0000, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0x0000, 0x0000, 0x0000, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd57f, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0x0000, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0x0000, 0x0000, 0x0000, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0x0000, 0xd5a1, 0xd5a2, 0xd5a3, 0xd5a4, 0xd5a5, 0xd5a6, 0xd5a7, 0xd5a8, 0xd5a9, 0xd5aa, 0xd5ab, 0x0000, 0x0000, 0x0000, 0xd5ac, 0xd5ad, 0xd5ae, 0xd5af, 0xd5b0, 0xd5b1, 0xd5b2, 0xd5b3, 0xd5b4, 0xd5b5, 0xd5b6, 0xd5b7, 0xd5b8, 0xd5b9, 0xd5ba, 0xd5bb, 0xd5bc, 0x0000, 0xd5bd, 0xd5be, 0xd5bf, 0xd5c0, 0xd5c1, 0xd5c2, 0xd5c3, 0xd5c4, 0xd5c5, 0xd5c6, 0xd5c7, 0x0000, 0x0000, 0x0000, 0xd5c8, 0xd5c9, 0xd5ca, 0xd5cb, 0xd5cc, 0xd5cd, 0xd5ce, 0xd5cf, 0xd5d0, 0xd5d1, 0xd5d2, 0xd5d3, 0xd5d4, 0xd5d5, 0xd5d6, 0xd5d7, 0xd5d8, 0x0000, 0xd5d9, 0xd5da, 0xd5db, 0xd5dc, 0xd5dd, 0xd5de, 0xd5df, 0xd5e0, 0xd5e1, 0xd5e2, 0xd5e3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd5e4, 0xd5e5, 0xd5e6, 0xd5e7, 0xd5e8, 0xd5e9, 0xd5ea, 0xd5eb, 0xd5ec, 0xd5ed, 0xd5ee, 0xd5ef, 0xd5f0, 0xd5f1, 0xd5f2, 0xd5f3, 0xd5f4, 0x0000, 0xd5f5, 0xd5f6, 0xd5f7, 0xd5f8, 0xd5f9, 0xd5fa, 0xd5fb, 0xd5fc, 0xd5fd, 0xd5fe, 0xd5ff, 0x0000, 0x0000, 0x0000, 0xd600, 0xd601, 0xd602, 0xd603, 0xd604, 0xd605, 0xd606, 0xd607, 0xd608, 0xd609, 0xd60a, 0xd60b, 0xd60c, 0xd60d, 0xd60e, 0xd60f, 0xd610, 0x0000, 0xd611, 0xd612, 0xd613, 0xd614, 0xd615, 0xd616, 0xd617, 0xd618, 0xd619, 0xd61a, 0xd61b, 0x0000, 0x0000, 0x0000, 0xd61c, 0xd61d, 0xd61e, 0xd61f, 0xd620, 0xd621, 0xd622, 0xd623, 0xd624, 0xd625, 0xd626, 0xd627, 0xd628, 0xd629, 0xd62a, 0xd62b, 0xd62c, 0x0000, 0xd62d, 0xd62e, 0xd62f, 0xd630, 0xd631, 0xd632, 0xd633, 0xd634, 0xd635, 0xd636, 0xd637, 0x0000, 0x0000, 0x0000, 0xd638, 0xd639, 0xd63a, 0xd63b, 0xd63c, 0xd63d, 0xd63e, 0xd63f, 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0x0000, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, 0x0000, 0x0000, 0x0000, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0x0000, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0x0000, 0x0000, 0x0000, 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd67f, 0xd680, 0x0000, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, 0xd68b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0x0000, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd6a1, 0xd6a2, 0xd6a3, 0xd6a4, 0xd6a5, 0xd6a6, 0xd6a7, 0x0000, 0x0000, 0x0000, 0xd6a8, 0xd6a9, 0xd6aa, 0xd6ab, 0xd6ac, 0xd6ad, 0xd6ae, 0xd6af, 0xd6b0, 0xd6b1, 0xd6b2, 0xd6b3, 0xd6b4, 0xd6b5, 0xd6b6, 0xd6b7, 0xd6b8, 0x0000, 0xd6b9, 0xd6ba, 0xd6bb, 0xd6bc, 0xd6bd, 0xd6be, 0xd6bf, 0xd6c0, 0xd6c1, 0xd6c2, 0xd6c3, 0x0000, 0x0000, 0x0000, 0xd6c4, 0xd6c5, 0xd6c6, 0xd6c7, 0xd6c8, 0xd6c9, 0xd6ca, 0xd6cb, 0xd6cc, 0xd6cd, 0xd6ce, 0xd6cf, 0xd6d0, 0xd6d1, 0xd6d2, 0xd6d3, 0xd6d4, 0x0000, 0xd6d5, 0xd6d6, 0xd6d7, 0xd6d8, 0xd6d9, 0xd6da, 0xd6db, 0xd6dc, 0xd6dd, 0xd6de, 0xd6df, 0x0000, 0x0000, 0x0000, 0xd6e0, 0xd6e1, 0xd6e2, 0xd6e3, 0xd6e4, 0xd6e5, 0xd6e6, 0xd6e7, 0xd6e8, 0xd6e9, 0xd6ea, 0xd6eb, 0xd6ec, 0xd6ed, 0xd6ee, 0xd6ef, 0xd6f0, 0x0000, 0xd6f1, 0xd6f2, 0xd6f3, 0xd6f4, 0xd6f5, 0xd6f6, 0xd6f7, 0xd6f8, 0xd6f9, 0xd6fa, 0xd6fb, 0x0000, 0x0000, 0x0000, 0xd6fc, 0xd6fd, 0xd6fe, 0xd6ff, 0xd700, 0xd701, 0xd702, 0xd703, 0xd704, 0xd705, 0xd706, 0xd707, 0xd708, 0xd709, 0xd70a, 0xd70b, 0xd70c, 0x0000, 0xd70d, 0xd70e, 0xd70f, 0xd710, 0xd711, 0xd712, 0xd713, 0xd714, 0xd715, 0xd716, 0xd717, 0x0000, 0x0000, 0x0000, 0xd718, 0xd719, 0xd71a, 0xd71b, 0xd71c, 0xd71d, 0xd71e, 0xd71f, 0xd720, 0xd721, 0xd722, 0xd723, 0xd724, 0xd725, 0xd726, 0xd727, 0xd728, 0x0000, 0xd729, 0xd72a, 0xd72b, 0xd72c, 0xd72d, 0xd72e, 0xd72f, 0xd730, 0xd731, 0xd732, 0xd733, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xd734, 0xd735, 0xd736, 0xd737, 0xd738, 0xd739, 0xd73a, 0xd73b, 0xd73c, 0xd73d, 0xd73e, 0xd73f, 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0x0000, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0x0000, 0x0000, 0x0000, 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0x0000, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, 0xd76a, 0xd76b, 0x0000, 0x0000, 0x0000, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0x0000, 0xd77d, 0xd77e, 0xd77f, 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0x0000, 0x0000, 0x0000, 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0x0000, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd7a1, 0xd7a2, 0xd7a3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3164, 0x3001, 0x3002, 0x30fb, 0x2025, 0x22ef, 0x00a8, 0x3003, 0x2013, 0x2014, 0x2016, 0xff3c, 0xff5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033, 0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013, 0x00ab, 0x00bb, 0x221a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2, 0x21d2, 0x21d4, 0x2200, 0x2203, 0x00b4, 0x02dc, 0x02c7, 0x02d8, 0x02dd, 0x02da, 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x2236, 0x222e, 0x2211, 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0, 0x25b7, 0x25b6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663, 0x25c9, 0x25c8, 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5, 0x25a8, 0x25a7, 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c, 0x261e, 0x00b6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266d, 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116, 0x33c7, 0x2122, 0x33c2, 0x33d8, 0x2121, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xffe6, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512, 0x2511, 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d, 0x251e, 0x251f, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a, 0x252d, 0x252e, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a, 0x253d, 0x253e, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33c4, 0x33a3, 0x33a4, 0x33a5, 0x33a6, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e, 0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33ca, 0x338d, 0x338e, 0x338f, 0x33cf, 0x3388, 0x3389, 0x33c8, 0x33a7, 0x33a8, 0x33b0, 0x33b1, 0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33ba, 0x33bb, 0x33bc, 0x33bd, 0x33be, 0x33bf, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394, 0x2126, 0x33c0, 0x33c1, 0x338a, 0x338b, 0x338c, 0x33d6, 0x33c5, 0x33ad, 0x33ae, 0x33af, 0x33db, 0x33a9, 0x33aa, 0x33ab, 0x33ac, 0x33dd, 0x33d0, 0x33d3, 0x33c3, 0x33c9, 0x33dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x33c6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x00d0, 0x00aa, 0x0126, 0x0000, 0x0132, 0x0000, 0x013f, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0x0000, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1, 0x24d2, 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd, 0x2153, 0x2154, 0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f, 0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7, 0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af, 0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3, 0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5, 0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c, 0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36, 0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404, 0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3, 0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7, 0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5, 0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593, 0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910, 0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x611f, 0x61be, 0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3, 0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95, 0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808, 0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f, 0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221, 0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x4ecb, 0x4ef7, 0x500b, 0x51f1, 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea, 0x6f11, 0x75a5, 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0x8c48, 0x93a7, 0x958b, 0x5580, 0x5ba2, 0x5751, 0x66f4, 0x7cb3, 0x7fb9, 0x91b5, 0x5028, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da, 0x64e7, 0x6e20, 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0x8eca, 0x907d, 0x9245, 0x92f8, 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106, 0x6957, 0x8171, 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091, 0x6770, 0x6840, 0x5109, 0x528d, 0x5292, 0x6aa2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, 0x5048, 0x61a9, 0x63ed, 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694, 0x5805, 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b, 0x8b74, 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a, 0x8a23, 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac, 0x4fd3, 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770, 0x5883, 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f, 0x66bb, 0x0000, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5, 0x74ca, 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93, 0x8015, 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x93e1, 0x9803, 0x9838, 0x9a5a, 0x9be8, 0x4fc2, 0x5553, 0x583a, 0x5951, 0x5b63, 0x5c46, 0x60b8, 0x6212, 0x6842, 0x68b0, 0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d, 0x7cfb, 0x7e6b, 0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4, 0x53e4, 0x53e9, 0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b, 0x5eab, 0x62f7, 0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1, 0x6cbd, 0x75fc, 0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1, 0x818f, 0x82e6, 0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5, 0x0000, 0x8f9c, 0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed, 0x659b, 0x66f2, 0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606, 0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0x6ed1, 0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050, 0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2, 0x978f, 0x4e32, 0x5be1, 0x6208, 0x679c, 0x74dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846, 0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0x0000, 0x51a0, 0x5b98, 0x5bec, 0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50, 0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec, 0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38, 0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b, 0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0, 0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1, 0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821, 0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81a0, 0x854e, 0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18, 0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe, 0x5340, 0x53e3, 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7, 0x5d87, 0x5ed0, 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb, 0x6b50, 0x6bc6, 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396, 0x7403, 0x77bf, 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205, 0x820a, 0x82df, 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1, 0x9264, 0x92b6, 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b, 0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4, 0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae, 0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8, 0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5, 0x7357, 0x8568, 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d, 0x8ecc, 0x994b, 0x0000, 0x6677, 0x6b78, 0x8cb4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9b3c, 0x0000, 0x53eb, 0x572d, 0x594e, 0x63c6, 0x69fb, 0x73ea, 0x7845, 0x7aba, 0x7ac5, 0x7cfe, 0x8475, 0x898f, 0x8d73, 0x9035, 0x95a8, 0x52fb, 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0x0000, 0x6a58, 0x514b, 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699, 0x50c5, 0x52a4, 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e, 0x7b4b, 0x82b9, 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0x0000, 0x4eca, 0x5997, 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd, 0x82a9, 0x887e, 0x887f, 0x895f, 0x91d1, 0x9326, 0x4f0b, 0x53ca, 0x6025, 0x6271, 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc, 0x80af, 0x4f01, 0x4f0e, 0x5176, 0x5180, 0x55dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5668, 0x573b, 0x57fa, 0x57fc, 0x5914, 0x5947, 0x5993, 0x5bc4, 0x5c90, 0x5d0e, 0x5df1, 0x5e7e, 0x5fcc, 0x6280, 0x65d7, 0x65e3, 0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f, 0x6b3a, 0x6c23, 0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a, 0x7482, 0x74a3, 0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947, 0x7948, 0x797a, 0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d, 0x808c, 0x8a18, 0x8b4f, 0x0000, 0x8d77, 0x9321, 0x9324, 0x98e2, 0x9951, 0x9a0e, 0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409, 0x62ee, 0x6854, 0x0000, 0x55ab, 0x513a, 0x5587, 0x5948, 0x5a1c, 0x61e6, 0x61f6, 0x62cf, 0x62ff, 0x7669, 0x7f85, 0x863f, 0x87ba, 0x88f8, 0x908f, 0x90a3, 0x6a02, 0x6d1b, 0x70d9, 0x73de, 0x843d, 0x8afe, 0x916a, 0x99f1, 0x4e82, 0x5375, 0x6696, 0x6b04, 0x7156, 0x721b, 0x862d, 0x96e3, 0x9e1e, 0x634f, 0x637a, 0x5357, 0x5d50, 0x678f, 0x6960, 0x6e73, 0x6feb, 0x7537, 0x85cd, 0x8964, 0x62c9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d0d, 0x81d8, 0x881f, 0x8872, 0x56ca, 0x5a18, 0x5eca, 0x6717, 0x6d6a, 0x72fc, 0x90de, 0x4e43, 0x4f86, 0x5167, 0x0000, 0x67f0, 0x8010, 0x51b7, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c, 0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0x52de, 0x5974, 0x5f29, 0x6012, 0x64c4, 0x6ad3, 0x7210, 0x7459, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def, 0x9732, 0x99d1, 0x9b6f, 0x9dfa, 0x788c, 0x797f, 0x7da0, 0x83c9, 0x9304, 0x9e7f, 0x8ad6, 0x58df, 0x5f04, 0x6fc3, 0x7c60, 0x807e, 0x81bf, 0x8fb2, 0x60f1, 0x7262, 0x78ca, 0x8166, 0x8cc2, 0x96f7, 0x5c3f, 0x58d8, 0x5c62, 0x6a13, 0x6dda, 0x6f0f, 0x7d2f, 0x7e37, 0x964b, 0x5ae9, 0x8a25, 0x677b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d10, 0x52d2, 0x808b, 0x51dc, 0x51cc, 0x7a1c, 0x7dbe, 0x80fd, 0x83f1, 0x9675, 0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336, 0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7, 0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde, 0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8, 0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b, 0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7, 0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510, 0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6, 0x87b3, 0x9ee8, 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1, 0x5e36, 0x5f85, 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8, 0x968a, 0x9edb, 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230, 0x5716, 0x5835, 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6, 0x5f92, 0x60bc, 0x6311, 0x6389, 0x6417, 0x6843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x68f9, 0x6ac2, 0x6dd8, 0x6e21, 0x6ed4, 0x6fe4, 0x71fe, 0x76dc, 0x7779, 0x79b1, 0x7a3b, 0x8404, 0x89a9, 0x8ced, 0x8df3, 0x8e48, 0x9003, 0x9014, 0x9053, 0x90fd, 0x934d, 0x9676, 0x97dc, 0x6bd2, 0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, 0x7e9b, 0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, 0x711e, 0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, 0x51cd, 0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, 0x6f7c, 0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x515c, 0x6597, 0x675c, 0x6793, 0x75d8, 0x7ac7, 0x8373, 0x0000, 0x8c46, 0x9017, 0x982d, 0x5c6f, 0x81c0, 0x829a, 0x9041, 0x906f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x920d, 0x5f97, 0x5d9d, 0x6a59, 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127, 0x9a30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7d61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b12, 0x703e, 0x0000, 0x0000, 0x0000, 0x524c, 0x8fa3, 0x0000, 0x64e5, 0x652c, 0x6b16, 0x0000, 0x7c43, 0x7e9c, 0x0000, 0x0000, 0x89bd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7405, 0x746f, 0x8782, 0x0000, 0x0000, 0x5d0d, 0x5fa0, 0x840a, 0x0000, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9, 0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b, 0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec, 0x616e, 0x623e, 0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823, 0x95ad, 0x9a62, 0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b, 0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a, 0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582, 0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0x0000, 0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046, 0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7, 0x79ae, 0x91b4, 0x96b7, 0x0000, 0x0000, 0x6488, 0x0000, 0x0000, 0x6f5e, 0x7018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8f05, 0x0000, 0x0000, 0x0000, 0x9e75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9e93, 0x0000, 0x0000, 0x0000, 0x6727, 0x7027, 0x74cf, 0x0000, 0x0000, 0x5121, 0x7028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8cda, 0x8cf4, 0x0000, 0x4e86, 0x50da, 0x5bee, 0x5ed6, 0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc, 0x907c, 0x9b27, 0x9f8d, 0x0000, 0x5a41, 0x0000, 0x0000, 0x0000, 0x0000, 0x763b, 0x0000, 0x0000, 0x851e, 0x8938, 0x93e4, 0x0000, 0x5289, 0x65d2, 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409, 0x7460, 0x7559, 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e, 0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b, 0x6144, 0x6817, 0x7387, 0x9686, 0x0000, 0x0000, 0x0000, 0x0000, 0x695e, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fda, 0x5229, 0x5398, 0x540f, 0x550e, 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281, 0x72f8, 0x7406, 0x7483, 0x7570, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8, 0x8389, 0x88cf, 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d, 0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f, 0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7acb, 0x7b20, 0x7c92, 0x6469, 0x746a, 0x75f2, 0x78bc, 0x78e8, 0x99ac, 0x9b54, 0x9ebb, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab, 0x9088, 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d, 0x6669, 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513, 0x883b, 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab, 0x8309, 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b, 0x7db2, 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x57cb, 0x59b9, 0x5a92, 0x5bd0, 0x6627, 0x679a, 0x6885, 0x6bcf, 0x7164, 0x7f75, 0x8cb7, 0x8ce3, 0x9081, 0x9b45, 0x8108, 0x8c8a, 0x964c, 0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76df, 0x840c, 0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, 0x7704, 0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5, 0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f, 0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4, 0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d, 0x6155, 0x6478, 0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb, 0x725f, 0x7261, 0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305, 0x8b00, 0x8b28, 0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9, 0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f, 0x5893, 0x5999, 0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b, 0x7ad7, 0x82d7, 0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a, 0x62c7, 0x64ab, 0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7, 0x755d, 0x7e46, 0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727, 0x9d61, 0x58a8, 0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff, 0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae, 0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e, 0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d, 0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9, 0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd, 0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94, 0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1, 0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591, 0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x76e4, 0x76fc, 0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812, 0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51, 0x767c, 0x8dcb, 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d, 0x574a, 0x59a8, 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9, 0x65c1, 0x6609, 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa, 0x8180, 0x822b, 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6, 0x9632, 0x9f90, 0x500d, 0x4ff3, 0x5317, 0x57f9, 0x5f98, 0x62dc, 0x6392, 0x676f, 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4, 0x88f5, 0x8919, 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70, 0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a, 0x7169, 0x71d4, 0x756a, 0x0000, 0x7e41, 0x8543, 0x85e9, 0x98dc, 0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e, 0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb, 0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x78a7, 0x8617, 0x95e2, 0x9739, 0x4fbf, 0x535e, 0x5f01, 0x8b8a, 0x8fa8, 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19, 0x5002, 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5, 0x70b3, 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08, 0x4fdd, 0x5821, 0x5831, 0x5bf6, 0x666e, 0x6b65, 0x6d11, 0x6e7a, 0x6f7d, 0x73e4, 0x752b, 0x83e9, 0x88dc, 0x8913, 0x8b5c, 0x8f14, 0x4f0f, 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f, 0x8179, 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5, 0x9c12, 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0, 0x6367, 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84ec, 0x8702, 0x9022, 0x92d2, 0x9cf3, 0x4e0d, 0x4ed8, 0x4fef, 0x5085, 0x5256, 0x526f, 0x5426, 0x5490, 0x57e0, 0x592b, 0x5a66, 0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0x0000, 0x6276, 0x6577, 0x65a7, 0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36, 0x8150, 0x8151, 0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0, 0x8ce6, 0x8cfb, 0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644, 0x99d9, 0x9ce7, 0x0000, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, 0x596e, 0x5fff, 0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, 0x7c89, 0x7cde, 0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0x0000, 0x4f5b, 0x5f17, 0x5f7f, 0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, 0x9d6c, 0x4e15, 0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62, 0x5e87, 0x60b2, 0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7, 0x6bd4, 0x6bd6, 0x6bd7, 0x6bd8, 0x6cb8, 0x6ccc, 0x7435, 0x75fa, 0x7812, 0x7891, 0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb, 0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c, 0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7, 0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b, 0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2, 0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb, 0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c, 0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23, 0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9, 0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x86c7, 0x88df, 0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc, 0x99df, 0x9e9d, 0x524a, 0x6578, 0x6714, 0x7d22, 0x5098, 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d, 0x7b97, 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e, 0x85a9, 0x4e09, 0x53c3, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518, 0x886b, 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf, 0x511f, 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38, 0x5e8a, 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d, 0x7240, 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4, 0x8a73, 0x8c61, 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7, 0x0000, 0x7a61, 0x0000, 0x8272, 0x7272, 0x751f, 0x7525, 0x7701, 0x7b19, 0x5885, 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055, 0x6292, 0x637f, 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2, 0x7280, 0x745e, 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x80e5, 0x8212, 0x85af, 0x897f, 0x8a93, 0x901d, 0x92e4, 0x9ecd, 0x9f20, 0x5915, 0x596d, 0x5e2d, 0x60dc, 0x6614, 0x6673, 0x6790, 0x6c50, 0x6dc5, 0x6f5f, 0x77f3, 0x78a9, 0x84c6, 0x91cb, 0x932b, 0x4ed9, 0x50ca, 0x5148, 0x5584, 0x5b0b, 0x5ba3, 0x6247, 0x657e, 0x65cb, 0x6e32, 0x717d, 0x7401, 0x7444, 0x7487, 0x74bf, 0x766c, 0x79aa, 0x7dda, 0x7e55, 0x7fa8, 0x817a, 0x81b3, 0x8239, 0x861a, 0x87ec, 0x8a75, 0x8de3, 0x9078, 0x9291, 0x9425, 0x994d, 0x9bae, 0x5368, 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b, 0x893b, 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x5261, 0x66b9, 0x6bb2, 0x7e96, 0x87fe, 0x8d0d, 0x9583, 0x965d, 0x651d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6d89, 0x71ee, 0x8449, 0x57ce, 0x59d3, 0x5bac, 0x6027, 0x60fa, 0x6210, 0x661f, 0x665f, 0x7329, 0x73f9, 0x76db, 0x0000, 0x7b6c, 0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16, 0x52e2, 0x6b72, 0x6d17, 0x7a05, 0x7b39, 0x7d30, 0x0000, 0x8cb0, 0x53ec, 0x562f, 0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240, 0x6383, 0x6414, 0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f, 0x70a4, 0x71d2, 0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0, 0x7c2b, 0x7d20, 0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d, 0x9061, 0x90b5, 0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f, 0x6d91, 0x7c9f, 0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd, 0x640d, 0x84c0, 0x905c, 0x98e1, 0x0000, 0x5b8b, 0x609a, 0x677e, 0x6dde, 0x8a1f, 0x8aa6, 0x9001, 0x980c, 0x5237, 0x0000, 0x7051, 0x788e, 0x9396, 0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da, 0x5782, 0x58fd, 0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x0000, 0x6a39, 0x6b8a, 0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2, 0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac, 0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896, 0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9, 0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3, 0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a, 0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa, 0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3, 0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x821c, 0x8340, 0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4, 0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27, 0x5d69, 0x745f, 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936, 0x8972, 0x4e1e, 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607, 0x7e69, 0x8805, 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4, 0x5c38, 0x5c4e, 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f, 0x6642, 0x67be, 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494, 0x84cd, 0x8996, 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4, 0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184, 0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81, 0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc, 0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce, 0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0x8fb0, 0x8fc5, 0x5931, 0x5ba4, 0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6c88, 0x6df1, 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341, 0x0000, 0x96d9, 0x6c0f, 0x4e9e, 0x4fc4, 0x5152, 0x555e, 0x5a25, 0x5ce8, 0x6211, 0x7259, 0x82bd, 0x83aa, 0x86fe, 0x8859, 0x8a1d, 0x963f, 0x96c5, 0x9913, 0x9d09, 0x9d5d, 0x580a, 0x5cb3, 0x5dbd, 0x5e44, 0x60e1, 0x6115, 0x63e1, 0x0000, 0x6e25, 0x9102, 0x9354, 0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, 0x6309, 0x664f, 0x6848, 0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, 0x65a1, 0x8b01, 0x8ecb, 0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, 0x6697, 0x764c, 0x83f4, 0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, 0x4ef0, 0x592e, 0x600f, 0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5393, 0x54c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x57c3, 0x5d16, 0x611b, 0x66d6, 0x6daf, 0x788d, 0x827e, 0x9698, 0x9744, 0x5384, 0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d, 0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b, 0x51b6, 0x591c, 0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0x82e5, 0x91ce, 0x5f31, 0x0000, 0x0000, 0x7d04, 0x0000, 0x846f, 0x84bb, 0x85e5, 0x8e8d, 0x0000, 0x4f6f, 0x0000, 0x0000, 0x58e4, 0x5b43, 0x6059, 0x63da, 0x6518, 0x656d, 0x6698, 0x0000, 0x694a, 0x6a23, 0x6d0b, 0x7001, 0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0x0000, 0x7f8a, 0x0000, 0x8944, 0x0000, 0x8b93, 0x91c0, 0x967d, 0x0000, 0x990a, 0x5704, 0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e, 0x99ad, 0x9b5a, 0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, 0x5830, 0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, 0x513c, 0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, 0x4e88, 0x4f59, 0x0000, 0x0000, 0x0000, 0x5982, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6b5f, 0x6c5d, 0x0000, 0x74b5, 0x7916, 0x0000, 0x8207, 0x8245, 0x8339, 0x8f3f, 0x8f5d, 0x0000, 0x9918, 0x0000, 0x0000, 0x0000, 0x4ea6, 0x0000, 0x57df, 0x5f79, 0x6613, 0x0000, 0x0000, 0x75ab, 0x7e79, 0x8b6f, 0x0000, 0x9006, 0x9a5b, 0x56a5, 0x5827, 0x59f8, 0x5a1f, 0x5bb4, 0x0000, 0x5ef6, 0x0000, 0x0000, 0x6350, 0x633b, 0x0000, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5, 0x6f14, 0x0000, 0x70df, 0x7136, 0x7159, 0x0000, 0x71c3, 0x71d5, 0x0000, 0x784f, 0x786f, 0x0000, 0x7b75, 0x7de3, 0x0000, 0x7e2f, 0x0000, 0x884d, 0x8edf, 0x0000, 0x0000, 0x0000, 0x925b, 0x0000, 0x9cf6, 0x0000, 0x0000, 0x54bd, 0x6085, 0x6d85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x71b1, 0x0000, 0x0000, 0x95b1, 0x53ad, 0x0000, 0x0000, 0x0000, 0x67d3, 0x0000, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2, 0x0000, 0x95bb, 0x9ae5, 0x9e7d, 0x66c4, 0x0000, 0x71c1, 0x0000, 0x0000, 0x0000, 0x584b, 0x0000, 0x0000, 0x5db8, 0x5f71, 0x0000, 0x6620, 0x668e, 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41, 0x6fda, 0x701b, 0x702f, 0x7150, 0x71df, 0x7370, 0x0000, 0x745b, 0x7469, 0x74d4, 0x76c8, 0x7a4e, 0x7e93, 0x0000, 0x0000, 0x82f1, 0x8a60, 0x8fce, 0x0000, 0x9348, 0x0000, 0x9719, 0x0000, 0x0000, 0x4e42, 0x502a, 0x0000, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca, 0x730a, 0x777f, 0x7a62, 0x82ae, 0x85dd, 0x8602, 0x0000, 0x88d4, 0x8a63, 0x8b7d, 0x8c6b, 0x0000, 0x92b3, 0x0000, 0x9713, 0x9810, 0x4e94, 0x4f0d, 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da, 0x5862, 0x58ba, 0x5967, 0x5a1b, 0x5be4, 0x609f, 0x0000, 0x61ca, 0x6556, 0x65ff, 0x6664, 0x68a7, 0x6c5a, 0x6fb3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x70cf, 0x71ac, 0x7352, 0x7b7d, 0x8708, 0x8aa4, 0x9c32, 0x9f07, 0x5c4b, 0x6c83, 0x7344, 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f, 0x7a69, 0x7e15, 0x860a, 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515, 0x7670, 0x7fc1, 0x9095, 0x96cd, 0x9954, 0x6e26, 0x74e6, 0x7aa9, 0x7aaa, 0x81e5, 0x86d9, 0x8778, 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b, 0x68a1, 0x6900, 0x6d63, 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9, 0x7feb, 0x8118, 0x8155, 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0, 0x5f80, 0x65fa, 0x6789, 0x6c6a, 0x738b, 0x502d, 0x5a03, 0x6b6a, 0x77ee, 0x5916, 0x5d6c, 0x5dcd, 0x7325, 0x754f, 0x0000, 0x0000, 0x50e5, 0x51f9, 0x582f, 0x592d, 0x5996, 0x59da, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5be5, 0x0000, 0x0000, 0x5da2, 0x62d7, 0x6416, 0x6493, 0x64fe, 0x0000, 0x66dc, 0x0000, 0x6a48, 0x0000, 0x71ff, 0x7464, 0x0000, 0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170, 0x0000, 0x87ef, 0x8981, 0x8b20, 0x9059, 0x0000, 0x9080, 0x9952, 0x617e, 0x6b32, 0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad, 0x5197, 0x52c7, 0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995, 0x6d8c, 0x6e67, 0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073, 0x8338, 0x84c9, 0x8e0a, 0x9394, 0x93de, 0x0000, 0x4e8e, 0x4f51, 0x5076, 0x512a, 0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24, 0x611a, 0x6182, 0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950, 0x7991, 0x79b9, 0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2, 0x9047, 0x90f5, 0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67, 0x65ed, 0x6631, 0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91, 0x6688, 0x6a52, 0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a, 0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b, 0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72, 0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060, 0x0000, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d, 0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170, 0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466, 0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f, 0x4e73, 0x4f91, 0x5112, 0x516a, 0x0000, 0x552f, 0x55a9, 0x5b7a, 0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6108, 0x6109, 0x63c4, 0x6538, 0x6709, 0x0000, 0x67d4, 0x67da, 0x0000, 0x6961, 0x6962, 0x6cb9, 0x6d27, 0x0000, 0x6e38, 0x0000, 0x6fe1, 0x7336, 0x7337, 0x0000, 0x745c, 0x7531, 0x0000, 0x7652, 0x0000, 0x0000, 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb, 0x8aed, 0x8e30, 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9, 0x936e, 0x0000, 0x0000, 0x5809, 0x0000, 0x6bd3, 0x8089, 0x80b2, 0x0000, 0x0000, 0x5141, 0x596b, 0x5c39, 0x0000, 0x0000, 0x6f64, 0x73a7, 0x80e4, 0x8d07, 0x0000, 0x9217, 0x958f, 0x0000, 0x0000, 0x0000, 0x0000, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0x0000, 0x57a0, 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59, 0x541f, 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3, 0x9091, 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100, 0x5b9c, 0x610f, 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3, 0x7fa9, 0x8264, 0x858f, 0x87fb, 0x8863, 0x8abc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8b70, 0x91ab, 0x4e8c, 0x4ee5, 0x4f0a, 0x0000, 0x0000, 0x5937, 0x59e8, 0x0000, 0x5df2, 0x5f1b, 0x5f5b, 0x6021, 0x0000, 0x0000, 0x0000, 0x0000, 0x723e, 0x73e5, 0x0000, 0x0000, 0x75cd, 0x0000, 0x79fb, 0x0000, 0x800c, 0x8033, 0x8084, 0x82e1, 0x8351, 0x0000, 0x0000, 0x8cbd, 0x8cb3, 0x9087, 0x0000, 0x0000, 0x98f4, 0x990c, 0x0000, 0x0000, 0x7037, 0x76ca, 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a, 0x4eba, 0x4ec1, 0x5203, 0x5370, 0x0000, 0x0000, 0x56e0, 0x59fb, 0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, 0x0000, 0x0000, 0x7d6a, 0x8335, 0x0000, 0x8693, 0x8a8d, 0x0000, 0x976d, 0x9777, 0x0000, 0x0000, 0x4e00, 0x4f5a, 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9038, 0x93b0, 0x99b9, 0x4efb, 0x58ec, 0x598a, 0x59d9, 0x6041, 0x0000, 0x0000, 0x7a14, 0x0000, 0x834f, 0x8cc3, 0x5165, 0x5344, 0x0000, 0x0000, 0x0000, 0x4ecd, 0x5269, 0x5b55, 0x82bf, 0x4ed4, 0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57, 0x5b5c, 0x6063, 0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7, 0x75b5, 0x78c1, 0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9, 0x8aee, 0x8cc7, 0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8, 0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7, 0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a, 0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef, 0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756, 0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0x0000, 0x7350, 0x748b, 0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523, 0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d, 0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09, 0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e, 0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17, 0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7, 0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8, 0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575, 0x6ef4, 0x72c4, 0x0000, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e, 0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea, 0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5168, 0x5178, 0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb, 0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1, 0x714e, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b, 0x7bad, 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293, 0x9322, 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a, 0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe, 0x5e97, 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5, 0x647a, 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448, 0x59c3, 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a, 0x653f, 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89, 0x6b63, 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1, 0x738e, 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d, 0x7cbe, 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a, 0x91d8, 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x975c, 0x9802, 0x9f0e, 0x5236, 0x5291, 0x557c, 0x5824, 0x5e1d, 0x5f1f, 0x608c, 0x63d0, 0x68af, 0x6fdf, 0x796d, 0x7b2c, 0x81cd, 0x85ba, 0x88fd, 0x8af8, 0x8e44, 0x918d, 0x9664, 0x969b, 0x973d, 0x984c, 0x9f4a, 0x4fce, 0x5146, 0x51cb, 0x52a9, 0x5632, 0x5f14, 0x5f6b, 0x63aa, 0x64cd, 0x65e9, 0x6641, 0x66fa, 0x66f9, 0x671d, 0x689d, 0x68d7, 0x69fd, 0x6f15, 0x6f6e, 0x7167, 0x71e5, 0x722a, 0x74aa, 0x773a, 0x7956, 0x795a, 0x79df, 0x7a20, 0x7a95, 0x7c97, 0x7cdf, 0x7d44, 0x7e70, 0x8087, 0x85fb, 0x86a4, 0x8a54, 0x8abf, 0x8d99, 0x8e81, 0x9020, 0x906d, 0x91e3, 0x963b, 0x96d5, 0x9ce5, 0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5352, 0x62d9, 0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9, 0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b, 0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750, 0x5de6, 0x5ea7, 0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a, 0x59dd, 0x80c4, 0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde, 0x5eda, 0x665d, 0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a, 0x6f8d, 0x70b7, 0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2, 0x821f, 0x86db, 0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031, 0x914e, 0x9152, 0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8, 0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c, 0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301, 0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41, 0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7, 0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f, 0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c, 0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3, 0x829d, 0x82b7, 0x8718, 0x8a8c, 0x0000, 0x8d04, 0x8dbe, 0x9072, 0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875, 0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25, 0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e, 0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a, 0x8cd1, 0x8eeb, 0x0000, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707, 0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x74c6, 0x75be, 0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f, 0x6715, 0x0000, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f, 0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f, 0x53c9, 0x55df, 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a, 0x0000, 0x8e49, 0x0000, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84, 0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da, 0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d, 0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed, 0x0000, 0x5879, 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92, 0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70, 0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32, 0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5, 0x57f0, 0x5bc0, 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc, 0x8521, 0x91c7, 0x91f5, 0x518a, 0x67f5, 0x7b56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8cac, 0x51c4, 0x59bb, 0x60bd, 0x8655, 0x501c, 0x0000, 0x5254, 0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, 0x7620, 0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, 0x5929, 0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, 0x85a6, 0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, 0x51f8, 0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, 0x8f4d, 0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, 0x7c3d, 0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, 0x7252, 0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, 0x6df8, 0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5243, 0x66ff, 0x6d95, 0x6eef, 0x7de0, 0x8ae6, 0x902e, 0x905e, 0x9ad4, 0x521d, 0x527f, 0x54e8, 0x6194, 0x6284, 0x62db, 0x68a2, 0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d, 0x7901, 0x790e, 0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349, 0x8549, 0x8c82, 0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1, 0x71ed, 0x77d7, 0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, 0x53e2, 0x585a, 0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, 0x8525, 0x9283, 0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd, 0x63a8, 0x690e, 0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb, 0x8429, 0x8acf, 0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310, 0x9318, 0x939a, 0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51, 0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625, 0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96, 0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0, 0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074, 0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4, 0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4, 0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4, 0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed, 0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x0000, 0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31, 0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253, 0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x99dd, 0x502c, 0x5353, 0x5544, 0x577c, 0x0000, 0x6258, 0x0000, 0x64e2, 0x666b, 0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058, 0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d, 0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0x0000, 0x8569, 0x514c, 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70, 0x6cf0, 0x7b1e, 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0x0000, 0x64c7, 0x6fa4, 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e, 0x615f, 0x6876, 0x0000, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806, 0x69cc, 0x817f, 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac, 0x6295, 0x900f, 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46, 0x5df4, 0x628a, 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c, 0x7436, 0x7834, 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742, 0x677f, 0x7248, 0x74e3, 0x8ca9, 0x8fa6, 0x9211, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x962a, 0x516b, 0x53ed, 0x634c, 0x4f69, 0x5504, 0x6096, 0x6557, 0x6c9b, 0x6d7f, 0x724c, 0x72fd, 0x7a17, 0x8987, 0x8c9d, 0x5f6d, 0x6f8e, 0x70f9, 0x81a8, 0x610e, 0x0000, 0x504f, 0x6241, 0x7247, 0x7bc7, 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a, 0x5e73, 0x67b0, 0x840d, 0x8a55, 0x5420, 0x5b16, 0x5e63, 0x5ee2, 0x5f0a, 0x6583, 0x80ba, 0x853d, 0x9589, 0x965b, 0x4f48, 0x5305, 0x530d, 0x530f, 0x5486, 0x54fa, 0x5703, 0x5e03, 0x6016, 0x629b, 0x62b1, 0x6355, 0x66b4, 0x6ce1, 0x6d66, 0x75b1, 0x7832, 0x80de, 0x812f, 0x82de, 0x8461, 0x84b2, 0x888d, 0x8912, 0x900b, 0x92ea, 0x98fd, 0x9b91, 0x5e45, 0x0000, 0x66dd, 0x7011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7206, 0x0000, 0x4ff5, 0x527d, 0x5f6a, 0x6153, 0x6753, 0x6a19, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8c79, 0x98c7, 0x98c4, 0x9a43, 0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, 0x5f7c, 0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642, 0x5339, 0x5f3c, 0x5fc5, 0x0000, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d, 0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f, 0x5ec8, 0x6630, 0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050, 0x971e, 0x9c15, 0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2, 0x6068, 0x608d, 0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55, 0x7ff0, 0x9591, 0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd, 0x542b, 0x54b8, 0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266, 0x929c, 0x9677, 0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4, 0x95d4, 0x965c, 0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052, 0x6297, 0x676d, 0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x884c, 0x0000, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a, 0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3, 0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016, 0x5e78, 0x674f, 0x8347, 0x0000, 0x4eab, 0x5411, 0x56ae, 0x73e6, 0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b, 0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57, 0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8, 0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d, 0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0x0000, 0x8ce2, 0x9249, 0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4fe0, 0x5354, 0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2, 0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b, 0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9, 0x0000, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8, 0x516e, 0x5f57, 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af, 0x978b, 0x4e4e, 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5, 0x5f27, 0x6236, 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf, 0x6e56, 0x6ef8, 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425, 0x745a, 0x74e0, 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6, 0x846b, 0x84bf, 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac, 0x9800, 0x9865, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7, 0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18, 0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b, 0x5316, 0x548c, 0x5b05, 0x6a3a, 0x706b, 0x7575, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x798d, 0x79be, 0x82b1, 0x83ef, 0x8a71, 0x8b41, 0x8ca8, 0x9774, 0x0000, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a, 0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853, 0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b, 0x0000, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d, 0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f, 0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352, 0x8757, 0x9051, 0x968d, 0x9ec3, 0x532f, 0x56de, 0x5efb, 0x5f8a, 0x6062, 0x6094, 0x61f7, 0x6666, 0x6703, 0x6a9c, 0x6dee, 0x6fae, 0x7070, 0x736a, 0x7e6a, 0x81be, 0x8334, 0x86d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8aa8, 0x8cc4, 0x5283, 0x7372, 0x5b96, 0x6a6b, 0x9404, 0x54ee, 0x5686, 0x5b5d, 0x6548, 0x6585, 0x66c9, 0x689f, 0x6d8d, 0x6dc6, 0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019, 0x539a, 0x540e, 0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d, 0x7166, 0x73dd, 0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb, 0x85b0, 0x8a13, 0x0000, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431, 0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee, 0x6689, 0x7147, 0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb, 0x7566, 0x8667, 0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8, 0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07, 0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5, 0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd, 0x59ec, 0x5b09, 0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6, 0x7199, 0x71b9, 0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3164, 0x3001, 0x3002, 0x30fb, 0x2025, 0x22ef, 0x00a8, 0x3003 }; const unichar_t unicode_from_gb2312[] = { 0x3000, 0x3001, 0x3002, 0x00b7, 0x02c9, 0x02c7, 0x00a8, 0x3003, 0x3005, 0x2014, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a, 0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d, 0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4, 0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x0000, 0x0000, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, 0x0000, 0x0000, 0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, 0xe793, 0xfe35, 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xe794, 0xe795, 0xfe3b, 0xfe3c, 0xfe37, 0xfe38, 0xfe31, 0x205d, 0xfe33, 0xfe34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8, 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x00fc, 0x00ea, 0x0251, 0x1e3f, 0x0144, 0x0148, 0x01f9, 0x0261, 0x0000, 0x0000, 0x0000, 0x0000, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c, 0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c, 0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691, 0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d, 0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848, 0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884, 0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed, 0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776, 0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf, 0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed, 0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc, 0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886, 0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d, 0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265, 0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5, 0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351, 0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907, 0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29, 0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4, 0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9, 0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5, 0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16, 0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab, 0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b, 0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175, 0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3, 0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2, 0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236, 0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa, 0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016, 0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29, 0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b, 0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf, 0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7, 0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336, 0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6, 0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20, 0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316, 0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e, 0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632, 0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3, 0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1, 0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59, 0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f, 0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60, 0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64, 0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0, 0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7, 0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8, 0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a, 0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd, 0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97, 0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524, 0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822, 0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148, 0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471, 0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07, 0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106, 0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb, 0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26, 0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e, 0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6, 0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb, 0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48, 0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053, 0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49, 0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c, 0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730, 0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382, 0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43, 0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc, 0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc, 0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0, 0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a, 0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b, 0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661, 0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec, 0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6, 0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e, 0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566, 0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a, 0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0, 0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25, 0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c, 0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c, 0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5, 0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492, 0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af, 0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632, 0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561, 0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8, 0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f, 0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa, 0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af, 0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b, 0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90, 0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d, 0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85, 0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74, 0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236, 0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490, 0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89, 0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f, 0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b, 0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f, 0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c, 0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b, 0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9, 0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9, 0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a, 0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1, 0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2, 0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30, 0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37, 0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250, 0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173, 0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c, 0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845, 0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842, 0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505, 0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8, 0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163, 0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a, 0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a, 0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a, 0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d, 0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2, 0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a, 0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8, 0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f, 0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c, 0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6, 0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56, 0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1, 0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd, 0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853, 0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115, 0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757, 0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d, 0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de, 0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd, 0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f, 0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b, 0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e, 0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95, 0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9, 0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca, 0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0, 0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d, 0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2, 0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939, 0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be, 0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1, 0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270, 0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3, 0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274, 0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6, 0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa, 0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868, 0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901, 0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc, 0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a, 0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb, 0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a, 0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01, 0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f, 0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1, 0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb, 0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78, 0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8, 0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f, 0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756, 0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0, 0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551, 0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8, 0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9, 0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd, 0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350, 0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b, 0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd, 0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb, 0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361, 0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a, 0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b, 0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777, 0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3, 0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543, 0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7, 0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6, 0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef, 0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50, 0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4, 0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080, 0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec, 0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a, 0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f, 0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8, 0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca, 0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c, 0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d, 0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b, 0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece, 0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4, 0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1, 0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0, 0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9, 0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f, 0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae, 0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e, 0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5, 0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217, 0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716, 0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce, 0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc, 0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409, 0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3, 0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf, 0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3, 0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3, 0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42, 0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415, 0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f, 0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6, 0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1, 0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523, 0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988, 0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417, 0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992, 0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b, 0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b, 0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192, 0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176, 0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e, 0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c, 0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f, 0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8, 0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5, 0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf, 0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d, 0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f, 0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478, 0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9, 0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c, 0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd, 0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766, 0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c, 0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462, 0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5, 0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b, 0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f, 0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d, 0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81, 0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53, 0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650, 0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25, 0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c, 0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43, 0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224, 0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486, 0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9, 0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6, 0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c, 0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812, 0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7, 0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41, 0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2, 0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058, 0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4, 0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb, 0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9, 0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd, 0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4, 0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566, 0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77, 0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14, 0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390, 0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1, 0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d, 0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49, 0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2, 0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8, 0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207, 0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6, 0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752, 0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30, 0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18, 0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a, 0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20, 0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743, 0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d, 0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0, 0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4, 0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed, 0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203, 0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9, 0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9, 0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1, 0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e, 0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428, 0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1, 0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b, 0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802, 0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b, 0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b, 0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247, 0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a, 0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6, 0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c, 0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe, 0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5, 0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17, 0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3, 0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee, 0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe, 0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2, 0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16, 0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc, 0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02, 0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88, 0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2, 0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f, 0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72, 0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f, 0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31, 0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813, 0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e, 0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1, 0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b, 0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3, 0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5, 0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20, 0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083, 0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3, 0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f, 0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501, 0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854, 0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0, 0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a, 0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08, 0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64, 0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018, 0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6, 0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279, 0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511, 0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5, 0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c, 0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3, 0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3, 0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a, 0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876, 0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f, 0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60, 0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f, 0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258, 0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3, 0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c, 0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38, 0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b, 0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51, 0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01, 0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f, 0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f, 0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3, 0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b, 0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33, 0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1, 0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c, 0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7, 0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e, 0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff, 0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852, 0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a, 0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184, 0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60, 0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6, 0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0, 0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2, 0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf, 0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8, 0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4, 0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61, 0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee, 0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653, 0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954, 0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa, 0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8, 0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23, 0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165, 0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c, 0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8, 0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d, 0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700, 0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9, 0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed, 0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384, 0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74, 0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb, 0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5, 0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259, 0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6, 0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814, 0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf, 0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5, 0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a, 0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f, 0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b, 0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476, 0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200, 0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce, 0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b, 0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d, 0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0, 0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a, 0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091, 0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6, 0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3, 0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335, 0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6, 0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690, 0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71, 0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8, 0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38, 0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24, 0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709, 0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2, 0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59, 0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88, 0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd, 0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea, 0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89, 0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a, 0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed, 0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f, 0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3, 0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300, 0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55, 0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d, 0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f, 0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1, 0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23, 0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe, 0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67, 0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8, 0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb, 0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d, 0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd, 0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756, 0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db, 0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087, 0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517, 0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827, 0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707, 0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0, 0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f, 0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431, 0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c, 0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307, 0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7, 0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9, 0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d, 0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd, 0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5, 0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4, 0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010, 0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457, 0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51, 0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13, 0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5, 0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58, 0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c, 0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179, 0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4, 0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5, 0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f, 0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b, 0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a, 0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750, 0x5ea7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98, 0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315, 0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997, 0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69, 0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d, 0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326, 0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e, 0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c, 0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54, 0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede, 0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09, 0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d, 0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89, 0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94, 0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1, 0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e, 0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043, 0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9, 0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107, 0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46, 0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9, 0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156, 0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34, 0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc, 0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa, 0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf, 0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6, 0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c, 0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b, 0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a, 0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369, 0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c, 0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674, 0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099, 0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba, 0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7, 0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef, 0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139, 0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be, 0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4, 0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c, 0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c, 0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742, 0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d, 0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7, 0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2, 0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd, 0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844, 0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8, 0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8, 0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be, 0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb, 0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4, 0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307, 0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311, 0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351, 0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b, 0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317, 0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365, 0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0, 0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385, 0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e, 0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807, 0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411, 0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea, 0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a, 0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c, 0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1, 0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba, 0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c, 0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a, 0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564, 0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8, 0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7, 0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629, 0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955, 0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c, 0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322, 0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a, 0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc, 0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452, 0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c, 0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496, 0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7, 0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519, 0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412, 0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d, 0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3, 0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9, 0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de, 0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523, 0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549, 0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c, 0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f, 0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594, 0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec, 0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3, 0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608, 0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d, 0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c, 0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c, 0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5, 0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f, 0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c, 0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a, 0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a, 0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3, 0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02, 0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b, 0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d, 0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d, 0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89, 0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc, 0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3, 0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2, 0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa, 0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315, 0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d, 0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a, 0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91, 0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3, 0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4, 0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4, 0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035, 0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f, 0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042, 0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092, 0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6, 0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100, 0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7, 0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3, 0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608, 0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54, 0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68, 0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad, 0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa, 0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe, 0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19, 0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52, 0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93, 0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5, 0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9, 0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b, 0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44, 0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7, 0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2, 0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f, 0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d, 0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1, 0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde, 0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f, 0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f, 0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07, 0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6, 0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d, 0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074, 0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56, 0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66, 0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e, 0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3, 0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af, 0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8, 0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13, 0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec, 0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2, 0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8, 0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15, 0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75, 0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85, 0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7, 0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9, 0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb, 0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8, 0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa, 0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b, 0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b, 0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e, 0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7, 0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a, 0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b, 0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c, 0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477, 0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b, 0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea, 0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5, 0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e, 0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a, 0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd, 0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832, 0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883, 0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a, 0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b, 0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9, 0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998, 0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966, 0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4, 0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff, 0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e, 0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28, 0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337, 0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d, 0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72, 0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c, 0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217, 0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7, 0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee, 0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6, 0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45, 0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7, 0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e, 0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b, 0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0, 0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9, 0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a, 0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b, 0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c, 0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4, 0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4, 0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4, 0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a, 0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153, 0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d, 0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5, 0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb, 0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59, 0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40, 0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4, 0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096, 0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca, 0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168, 0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5, 0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228, 0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248, 0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953, 0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985, 0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0, 0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab, 0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206, 0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d, 0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823, 0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1, 0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec, 0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b, 0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707, 0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768, 0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791, 0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e, 0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61, 0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e, 0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a, 0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a, 0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac, 0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5, 0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0, 0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea, 0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7, 0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522, 0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f, 0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573, 0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb, 0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14, 0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e, 0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22, 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36, 0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51, 0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d, 0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3, 0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2, 0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7, 0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c, 0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619, 0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f, 0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c, 0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80, 0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad, 0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2, 0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5, 0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919, 0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966, 0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014, 0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, 0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e, 0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c, 0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b, 0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6, 0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9, 0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0, 0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707, 0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e, 0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760, 0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764, 0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2, 0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5, 0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0, 0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe, 0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44, 0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15, 0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e, 0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58, 0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b, 0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac, 0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4, 0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea, 0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b, 0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201, 0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d, 0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e, 0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e, 0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7, 0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c, 0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc, 0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf, 0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3, 0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4, 0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47, 0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164, 0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172, 0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2, 0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba, 0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5, 0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde, 0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3, 0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f, 0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35, 0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a, 0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94, 0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98, 0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc, 0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3, 0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d, 0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc, 0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8, 0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90, 0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c, 0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2, 0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc, 0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45, 0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d, 0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb, 0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23, 0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92, 0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf, 0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c, 0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9f44, 0xffffffff, 0x00ff, 0x0000, 0x0100, 0x0003, 0x2288, 0x804f240, 0x0100, 0x0005, 0x00f8, 0x42130a14 }; dvisvgm-2.8.1/libs/ff-woff/fontforge/parsettf.c0000664000175000017500000002424213510660062016377 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #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 */ /* ************************************************************************** */ int getushort(FILE *ttf) { int ch1 = getc(ttf); int ch2 = getc(ttf); if ( ch2==EOF ) return( EOF ); return( (ch1<<8)|ch2 ); } 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 ); } /* Chooses which font to open from a TTC TrueType Collection font file. */ /* */ /* There are five ways that one enclosed font is selected: */ /* 1) there is only one font enclosed, so we force defaulting to that one.*/ /* 2a) the filename has a font index appended, we choose that N'th font. */ /* 2b) the filename has a font name appended, we try to match that name */ /* in list of discovered font names and select that named font. */ /* 3) the user is prompted with a list of all discovered font names, and */ /* asked to select one, and then that N'th font is chosen. */ /* 4) when there is no UI, then font index zero is used. */ /* */ /* On failure and no font is chosen, returns false. */ /* */ /* On success, true is returned. The chosen font name (allocated) pointer */ /* is returned via 'chosenname'. Additionally, the file position is set */ /* pointing to the chosen TTF font offset table, ready for reading the */ /* TTF header. */ /* */ /* Example filename strings with appended font selector: */ /* ./tests/fonts/mingliu.windows.ttc(PMingLiU) */ /* ./tests/fonts/mingliu.windows.ttc(1) */ /* */ /* 'offsets' is a list of file offsets to each enclosed TTF offset table. */ /* 'names' is a list of font names as found in each enclosed name table. */ /* 'names' is used to search for a matching font name, or to present as a */ /* list to the user via ff_choose() to select from. */ /* Once the chosen font index is determined, offsets[choice] is used to */ /* call fseek() to position to the chosen TTF header offset table. Then */ /* the chosen font name is copied into 'chosenname'. */ /* 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; void AltUniFigure(SplineFont *sf,EncMap *map,int check_dups) { int i,gid; if ( map->enc!=&custom ) { for ( i=0; ienccount; ++i ) if ( (gid = map->map[i])!=-1 ) { int uni = UniFromEnc(i,map->enc); if (check_dups) AltUniAdd(sf->glyphs[gid],uni); else AltUniAdd_DontCheckDups(sf->glyphs[gid],uni); } } } dvisvgm-2.8.1/libs/ff-woff/fontforge/sfd1.h0000664000175000017500000000760413510660062015414 00000000000000/* Copyright (C) 2000-2012 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 _SFD1_H #define _SFD1_H /* This file contains the data structures needed to read in an old sfd file */ /* features and lookups and scripts are handled differently. That means that */ /* the KernPair, KernClass, PST, FPST, AnchorClass, StateMachine data structures */ /* are organized differently. Also we've got a script language list which */ /* doesn't exist in the new format and we don't have OTLookup */ #include "splinefont.h" #define SLI_UNKNOWN 0xffff #define SLI_NESTED 0xfffe typedef struct anchorclass1 { AnchorClass ac; uint32 feature_tag; uint16 script_lang_index; uint16 flags; uint16 merge_with; uint8 has_bases; uint8 has_ligatures; } AnchorClass1; typedef struct kernpair1 { KernPair kp; uint16 sli, flags; } KernPair1; typedef struct kernclass1 { KernClass kc; uint16 sli; uint16 flags; } KernClass1; typedef struct generic_pst1 { PST pst; uint8 macfeature; /* tag should be interpretted as rather than 'abcd' */ uint16 flags; uint16 script_lang_index; /* 0xffff means none */ uint32 tag; } PST1; typedef struct generic_fpst1 { FPST fpst; uint16 script_lang_index; uint16 flags; uint32 tag; } FPST1; typedef struct generic_asm1 { /* Apple State Machine */ ASM sm; uint16 feature, setting; uint32 opentype_tag; /* If converted from opentype */ } ASM1; struct table_ordering { uint32 table_tag; uint32 *ordered_features; struct table_ordering *next; }; struct script_record { uint32 script; uint32 *langs; }; struct tagtype { enum possub_type type; uint32 tag; }; struct gentagtype { uint16 tt_cur, tt_max; struct tagtype *tagtype; }; typedef struct splinefont1 { SplineFont sf; struct table_ordering *orders; /* 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 **script_lang; int16 sli_cnt; struct gentagtype gentags; } SplineFont1; extern int SFFindBiggestScriptLangIndex(SplineFont *_sf,uint32 script,uint32 lang); #endif /* _SFD1_H */ dvisvgm-2.8.1/libs/ff-woff/fontforge/splinesaveafm.c0000664000175000017500000002257613510660062017414 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" /* For Error */ /* ************************************************************************** */ /* **************************** Reading OFM files *************************** */ /* ************************************************************************** */ #define ExtShort(off) (((ext+2*off)[0]<<8)|(ext+2*off)[1]) /* ************************************************************************** */ int SCDrawsSomething(SplineChar *sc) { int layer,l; RefChar *ref; if ( sc==NULL ) return( false ); for ( layer = 0; layerlayer_cnt; ++layer ) if ( !sc->layers[layer].background ) { if ( sc->layers[layer].splines!=NULL) return( true ); for ( ref = sc->layers[layer].refs; ref!=NULL; ref=ref->next ) for ( l=0; llayer_cnt; ++l ) if ( ref->layers[l].splines!=NULL ) return( true ); } return( false ); } int SCWorthOutputting(SplineChar *sc) { return( sc!=NULL && ( SCDrawsSomething(sc) || sc->widthset || sc->anchor!=NULL || #if HANYANG sc->compositionunit || #endif sc->dependents!=NULL /*|| sc->width!=sc->parent->ascent+sc->parent->descent*/ ) ); } void SFLigatureCleanup(SplineFont *sf) { LigList *l, *next; struct splinecharlist *scl, *sclnext; int j; if (sf->internal_temp) return; for ( j=0; jglyphcnt; ++j ) if ( sf->glyphs[j]!=NULL ) { for ( l = sf->glyphs[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->temporary ) { free(l->lig->u.lig.components); chunkfree(l->lig,sizeof(PST)); } free( l ); } sf->glyphs[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 = malloc(lmax*sizeof(LigList *)); /* First clear out any old stuff */ for ( j=0; jglyphcnt; ++j ) if ( sf->glyphs[j]!=NULL ) sf->glyphs[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 ; iglyphcnt; ++i ) if ( SCWorthOutputting(sf->glyphs[i]) && sf->glyphs[i]->possub!=NULL ) { for ( lig = sf->glyphs[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 = SFGetChar(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 = malloc(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 ; iglyphcnt; ++i ) if ( (sc=sf->glyphs[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 = realloc(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 ); } void SFKernCleanup(SplineFont *sf,int isv) { int i; KernPair *kp, *p, *n; OTLookup *otl, *otlp, *otln; if (sf->internal_temp) return; if ( (!isv && sf->kerns==NULL) || (isv && sf->vkerns==NULL) ) /* can't have gotten messed up */ return; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { for ( kp = isv ? sf->glyphs[i]->vkerns : sf->glyphs[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->glyphs[i]->vkerns = n; else sf->glyphs[i]->kerns = n; chunkfree(kp,sizeof(*kp)); } else p = kp; } } for ( otl=sf->gpos_lookups, otlp = NULL; otl!=NULL; otl = otln ) { otln = otl->next; if ( otl->temporary_kern ) { if ( otlp!=NULL ) otlp->next = otln; else sf->gpos_lookups = otln; OTLookupFree(otl); } else otlp = otl; } } 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->subtable = sub; kp->kcid = kcid; if ( isv ) { kp->next = first->vkerns; first->vkerns = kp; } else { kp->next = first->kerns; first->kerns = kp; } } } void SFKernClassTempDecompose(SplineFont *sf,int isv) { KernClass *kc, *head= isv ? sf->vkerns : sf->kerns; KernPair *kp; SplineChar ***first, ***last; int i, j, k, l; OTLookup *otl; /* Make sure the temporary field is cleaned up. Otherwise we may lose kerning data */ for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { for ( kp = isv ? sf->glyphs[i]->vkerns : sf->glyphs[i]->kerns; kp!=NULL; kp = kp->next ) { kp->kcid = false; } } for ( kc = head, i=0; kc!=NULL; kc = kc->next ) kc->kcid = ++i; for ( kc = head; kc!=NULL; kc = kc->next ) { otl = chunkalloc(sizeof(OTLookup)); otl->next = sf->gpos_lookups; sf->gpos_lookups = otl; otl->lookup_type = gpos_pair; otl->lookup_flags = kc->subtable->lookup->lookup_flags; otl->features = FeatureListCopy(kc->subtable->lookup->features); otl->lookup_name = copy(_("")); otl->temporary_kern = otl->store_in_afm = true; otl->subtables = chunkalloc(sizeof(struct lookup_subtable)); otl->subtables->lookup = otl; otl->subtables->per_glyph_pst_or_kern = true; otl->subtables->subtable_name = copy(_("")); 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], otl->subtables,kc->kcid,isv); } } KCSfree(first,kc->first_cnt); KCSfree(last,kc->second_cnt); } } dvisvgm-2.8.1/libs/ff-woff/fontforge/sd.h0000664000175000017500000001103513510660062015156 00000000000000/* Copyright (C) 2000-2012 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 # include /* All coordinates are in millimeters */ /* they will be displayed to the user scaled by the units field of the design */ #include "splinefont.h" struct epattern { struct entity *tile; real width, height; DBounds bbox; real transform[6]; }; typedef struct entpen { Color col; struct gradient *grad; struct epattern *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; 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) */ }; struct text { TextUnit *text; real transform[6]; struct entity *bound; }; struct image { GImage *image; real transform[6]; Color col; /* that gets poured into imagemasks */ }; struct group { struct entity *group; }; enum entity_type { et_splines, et_text, et_image, et_group }; typedef struct entity { enum entity_type type; union { struct filledsplines splines; struct text text; struct image image; struct group group; } u; SplineSet *clippath; 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; struct 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; /* Used for type3 fonts briefly */ /* 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, vwidth; SplineChar *sc; uint8 fromtype3; } EntityChar; extern SplinePointList *SplinesFromEntityChar(EntityChar *ec,int *flags,int is_stroked); struct pskeydict { int16 cnt, max; uint8 is_executable; struct pskeyval *entries; }; enum pstype { ps_void, ps_num, ps_bool, ps_string, ps_instr, ps_lit, ps_mark, ps_array, ps_dict }; union vals { real val; int tf; char *str; struct pskeydict dict; /* and for arrays too */ }; struct pskeyval { enum pstype type; union vals u; char *key; }; typedef struct retstack { int max; int cnt; real *stack; } RetStack; #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/uiinterface.h0000664000175000017500000001703613510660062017055 00000000000000/* Copyright (C) 2007-2012 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 _UIINTERFACE_H #define _UIINTERFACE_H # include #include /* This encapsulates a set of callbacks and stubs. The callbacks get activated*/ /* when an event happens (a glyph in a font changes for example, then all */ /* charviews looking at it must be updated), and the stubs provide some simple*/ /* UI routines: Post an error, etc. */ /* ************************************************************************** */ /* Basic, low-level UI routines for events we discover deep inside script code*/ /* ************************************************************************** */ struct ui_interface { /* The following is used to post a fontforge internal error */ /* currently it puts up a dlg displaying the error text */ void (*ierror)(const char *fmt,...); /* The following is a simple dialog to alert the user that s/he has */ /* made an error. Currently it posts a modal dlg and waits for the */ /* user to dismiss it */ /* The title argument is the window's title. The error argument is the */ /* text of the message. It may contain printf formatting. It may contain */ /* newlines to force line breaks -- even if it doesn't contain new lines */ /* the routine will wrap the text if a line is too long */ void (*post_error)(const char *title,const char *error,...); /* The following is used to post a warning message in such a way that it */ /* will not impede the user. Currently it creates a little window at the */ /* bottom right of the screen and writes successive messages there */ void (*logwarning)(const char *fmt,...); /* The following is another way to post a warning message in such a way */ /* that it will not impede the user. Currently it pops up a little */ /* non-modal dlg which vanishes after a minute or two (or if the user */ /* dismisses it, of course */ void (*post_warning)(const char *title,const char *statement,...); /* Occasionally we we be deep in a non-ui routine and we find we must ask */ /* the user a question. In this routine the choices are displayed as */ /* buttons, one button is the default, another is a cancel choice */ int (*ask)(const char *title, const char **answers, int def, int cancel,const char *question,...); /* Similar to the above, except here the choices are presented as a */ /* scrolled list. Return -1 if the user cancels */ int (*choose)(const char *title, const char **answers, int def, int cancel,const char *question,...); /* Multiple things can be selected, sel is an in/out parameter, one byte */ /* per entry in the choice array. 0=> not selected, 1=>selected */ int (*choose_multiple)(char *title, const char **choices,char *sel, int cnt, char *buts[2], const char *question,...); /* Here we want a string. We are passed a default answer (or NULL) */ /* The return is NULL on cancel, otherwise a string which must be freed */ char *(*ask_string)(const char *title, const char *def,const char *question,...); /* Same as above, except for entering a password */ char *(*ask_password)(const char *title, const char *def,const char *question,...); /* The next two routines are only used in the python interface to provide */ /* a python script running in ff a way to open a file */ /* Arguments are a window title for the dlg, a default file (or NULL), and */ /* an initial filter (unix wildcards) or NULL */ char *(*open_file)(const char *title, const char *defaultfile, const char *initial_filter); char *(*saveas_file)(const char *title, const char *defaultfile, const char *initial_filter); /* These routines are for a progress indicator */ void (*progress_start)(int delay, const char *title, const char *line1, const char *line2, int tot, int stages); void (*progress_end)(void); void (*progress_show)(void); void (*progress_enable_stop)(int); int (*progress_next)(void); int (*progress_next_stage)(void); int (*progress_increment)(int); void (*progress_change_line1)(const char *); void (*progress_change_line2)(const char *); void (*progress_pause)(void); void (*progress_resume)(void); void (*progress_change_stages)(int); void (*progress_change_total)(int); int (*progress_reset)(void); void (*allow_events)(void); /* pops up a dlg asking user whether to do remove overlap (and other stuff)*/ /* when loading an eps file with strokes, etc. */ int (*stroke_flags)(void); }; extern struct ui_interface *ui_interface; #define IError (ui_interface->ierror) #define LogError (ui_interface->logwarning) #define ff_post_notice (ui_interface->post_warning) #define ff_post_error (ui_interface->post_error) #define ff_ask (ui_interface->ask) #define ff_choose (ui_interface->choose) #define ff_choose_multiple (ui_interface->choose_multiple) #define ff_ask_string (ui_interface->ask_string) #define ff_ask_password (ui_interface->ask_password) #define ff_open_filename (ui_interface->open_file) #define ff_save_filename (ui_interface->saveas_file) #define ff_progress_start_indicator (ui_interface->progress_start) #define ff_progress_end_indicator (ui_interface->progress_end) #define ff_progress_show (ui_interface->progress_show) #define ff_progress_enable_stop (ui_interface->progress_enable_stop) #define ff_progress_next (ui_interface->progress_next) #define ff_progress_next_stage (ui_interface->progress_next_stage) #define ff_progress_increment (ui_interface->progress_increment) #define ff_progress_change_line1 (ui_interface->progress_change_line1) #define ff_progress_change_line2 (ui_interface->progress_change_line2) #define ff_progress_pause_timer (ui_interface->progress_pause) #define ff_progress_resume_timer (ui_interface->progress_resume) #define ff_progress_change_stages (ui_interface->progress_change_stages) #define ff_progress_change_total (ui_interface->progress_change_total) #define ff_progress_reset (ui_interface->progress_reset) #define ff_progress_allow_events (ui_interface->allow_events) #define TTFNameIds (ui_interface->strid) #define MSLangString (ui_interface->mslang) #define PsStrokeFlagsDlg (ui_interface->stroke_flags) #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/pua.c0000664000175000017500000040415613510660062015342 00000000000000/* A number of encodings use the public use area to map to glyphs that are */ /* defined in planes other than the BMP (chinese), or just multiple encodings*/ /* for the same glyph (ams) */ /* These data are taken from http://www.ams.org/STIX/bnb/stix-tbl.asc-2003-10-10 */ const int amspua[] = { /* E000 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E008 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E010 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E018 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E020 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E028 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E030 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E038 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E040 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E048 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E050 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E058 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E060 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E068 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E070 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E078 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E080 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E088 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E090 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E098 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E100 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E108 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E110 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E118 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E120 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E128 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E130 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E138 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E140 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E148 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E150 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E158 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E160 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E168 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E170 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E178 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E180 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E188 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E190 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E198 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E1F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E200 */ 0x027f8, 0x027f5, 0x027fa, 0x027f7, 0x027f9, 0x027f6, 0x0290e, 0x0290f, /* E208 */ 0x027fc, 0x02910, 0x02926, 0x02925, 0x02923, 0x02924, 0x02928, 0x02929, /* E210 */ 0x0292a, 0x02927, 0x02905, 0x0, 0x0297c, 0x0297d, 0x021f5, 0x0296f, /* E218 */ 0x0296e, 0x02937, 0x02936, 0x0, 0x02933, 0x0, 0x02945, 0x02946, /* E220 */ 0x0291f, 0x02920, 0x0291d, 0x0291e, 0x02964, 0x02962, 0x02963, 0x02965, /* E228 */ 0x0294b, 0x0294a, 0x02968, 0x02966, 0x02967, 0x02969, 0x0296a, 0x0296d, /* E230 */ 0x0296c, 0x0296b, 0x02192, 0x02190, 0x02972, 0x02975, 0x02971, 0x02949, /* E238 */ 0x02911, 0x02916, 0x0291a, 0x0291c, 0x02919, 0x0291b, 0x02938, 0x02939, /* E240 */ 0x02948, 0x021fe, 0x021fd, 0x021ff, 0x021dd, 0x02904, 0x02903, 0x02902, /* E248 */ 0x0237c, 0x0293c, 0x0293d, 0x0297e, 0x0297f, 0x02974, 0x02973, 0x02af0, /* E250 */ 0x02aef, 0x02a3f, 0x0, 0x0, 0x02a00, 0x02a01, 0x02a02, 0x02a06, /* E258 */ 0x02a04, 0x02a3c, 0x02a25, 0x02a2a, 0x02a2d, 0x02a2e, 0x02a34, 0x02a35, /* E260 */ 0x029b5, 0x02a40, 0x02abd, 0x02abe, 0x02a33, 0x02a5f, 0x02a22, 0x02a72, /* E268 */ 0x02a71, 0x02a27, 0x02a23, 0x02a24, 0x02a26, 0x02a30, 0x02a46, 0x02a47, /* E270 */ 0x02a48, 0x02a49, 0x02a4a, 0x02a4b, 0x0, 0x0, 0x0, 0x0, /* E278 */ 0x02a4c, 0x02a4d, 0x02a50, 0x02a39, 0x02a3a, 0x02a3b, 0x029cd, 0x029c4, /* E280 */ 0x029c5, 0x02a44, 0x02a45, 0x02a42, 0x02a43, 0x02a38, 0x029bc, 0x029bf, /* E288 */ 0x029c0, 0x029c1, 0x029b7, 0x029b9, 0x02a37, 0x02a36, 0x02a31, 0x0, /* E290 */ 0x0, 0x02994, 0x02993, 0x023b1, 0x023b0, 0x02996, 0x02995, 0x02991, /* E298 */ 0x02992, 0x0298b, 0x0298c, 0x0298d, 0x0298e, 0x0298f, 0x02990, 0x02a8a, /* E2A0 */ 0x02a88, 0x02269, 0x02a89, 0x02a87, 0x02268, 0x02271, 0x02271, 0x02270, /* E2A8 */ 0x02270, 0x0, 0x02224, 0x02226, 0x02284, 0x02288, 0x02288, 0x02285, /* E2B0 */ 0x02289, 0x02289, 0x02ab9, 0x02ab5, 0x02aba, 0x02ab6, 0x02acb, 0x02acc, /* E2B8 */ 0x02acb, 0x0228a, 0x0228b, 0x02acc, 0x0, 0x0, 0x0, 0x0, /* E2C0 */ 0x0, 0x02270, 0x02271, 0x0226e, 0x0226f, 0x0, 0x02249, 0x0, /* E2C8 */ 0x02af3, 0x0f423, 0x0f428, 0x0, 0x0, 0x0, 0x0, 0x022ed, /* E2D0 */ 0x022ec, 0x02aee, 0x0, 0x0, 0x0, 0x0210f, 0x029a4, 0x029a5, /* E2D8 */ 0x0, 0x029a8, 0x029a9, 0x029aa, 0x029ab, 0x029ac, 0x029ad, 0x029ae, /* E2E0 */ 0x029af, 0x0299d, 0x025f9, 0x0, 0x025f8, 0x025fa, 0x029c9, 0x029b1, /* E2E8 */ 0x029b2, 0x029b3, 0x029b4, 0x0299a, 0x0ee39, 0x0204f, 0x023b5, 0x023b4, /* E2F0 */ 0x023b6, 0x029c2, 0x029c3, 0x0, 0x02a86, 0x02a8c, 0x02a7e, 0x02aa2, /* E2F8 */ 0x02a85, 0x02a8b, 0x02a7d, 0x02aa1, 0x0, 0x02ab7, 0x02aaf, 0x02ab8, /* E300 */ 0x02ab0, 0x02223, 0x02225, 0x02323, 0x02ac5, 0x02ac6, 0x02248, 0x0, /* E308 */ 0x0, 0x02a77, 0x02adb, 0x02a9d, 0x02a9e, 0x02aeb, 0x02a74, 0x02ae4, /* E310 */ 0x02ae8, 0x02ae7, 0x02ae9, 0x02ae6, 0x02a6d, 0x02a70, 0x02aae, 0x02a73, /* E318 */ 0x02a78, 0x02a66, 0x02a29, 0x02ad9, 0x02ada, 0x02a7f, 0x02a80, 0x02a81, /* E320 */ 0x02a82, 0x02a83, 0x02a84, 0x02a97, 0x02a98, 0x02a79, 0x02a7a, 0x0, /* E328 */ 0x0, 0x02a7b, 0x02a7c, 0x022da, 0x022db, 0x02a91, 0x02a92, 0x02aa4, /* E330 */ 0x02aa5, 0x02a93, 0x02a94, 0x02a8d, 0x02a8e, 0x02a8f, 0x02a90, 0x02a9f, /* E338 */ 0x02aa0, 0x02aaa, 0x02aab, 0x02aac, 0x02aad, 0x0, 0x0, 0x02979, /* E340 */ 0x0297b, 0x02abf, 0x02ac0, 0x02ac1, 0x02ac2, 0x02ac7, 0x02ac8, 0x02ad3, /* E348 */ 0x02ad4, 0x02ad5, 0x02ad6, 0x02ad7, 0x02ad8, 0x0ee40, 0x0ee41, 0x02ac3, /* E350 */ 0x02ac4, 0x02acf, 0x02ad0, 0x02ad1, 0x02ad2, 0x02aa6, 0x02aa7, 0x02aa8, /* E358 */ 0x02aa9, 0x029ce, 0x02ab3, 0x02ab4, 0x02abb, 0x02abc, 0x02976, 0x02978, /* E360 */ 0x0, 0x02218, 0x0, 0x022a5, 0x1d453, 0x021d4, 0x0, 0x0, /* E368 */ 0x0, 0x0, 0x0204e, 0x0, 0x0220c, 0x0220c, 0x02a55, 0x02a56, /* E370 */ 0x02209, 0x02057, 0x029dc, 0x0299c, 0x02a53, 0x02a54, 0x02a15, 0x02a16, /* E378 */ 0x02a0c, 0x0, 0x0, 0x022f7, 0x022f6, 0x022fe, 0x022fd, 0x001b5, /* E380 */ 0x0ee44, 0x0ee45, 0x02afd, 0x02af1, 0x029e3, 0x029e4, 0x029e5, 0x0, /* E388 */ 0x0, 0x0, 0x0, 0x02a6a, 0x02a6f, 0x02af2, 0x029de, 0x029dd, /* E390 */ 0x0, 0x02a5a, 0x02a5b, 0x02a5d, 0x02a5c, 0x02a10, 0x02a0d, 0x02a12, /* E398 */ 0x02a13, 0x02a14, 0x02a17, 0x02a11, 0x022f5, 0x0, 0x022f9, 0x0, /* E3A0 */ 0x022f2, 0x022fa, 0x022f3, 0x022fb, 0x022f4, 0x022fc, 0x0ee46, 0x0ee47, /* E3A8 */ 0x029bb, 0x02052, 0x029a6, 0x029a7, 0x02aec, 0x02aed, 0x02a57, 0x02a58, /* E3B0 */ 0x02a61, 0x02218, 0x0ee24, 0x0, 0x02026, 0x0ee30, 0x00308, 0x02aea, /* E3B8 */ 0x022f8, 0x0, 0x0, 0x0, 0x02209, 0x02275, 0x02274, 0x0, /* E3C0 */ 0x02053, 0x0, 0x0, 0x0, 0x02ae2, 0x0, 0x0, 0x0299f, /* E3C8 */ 0x029e1, 0x0, 0x02a51, 0x02a52, 0x003b1, 0x0026b, 0x0, 0x0, /* E3D0 */ 0x003c3, 0x00067, 0x025aa, 0x02a0f, 0x022bd, 0x0007c, 0x02934, 0x02935, /* E3D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E3E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E3E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E3F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E3F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E400 */ 0x0, 0x0, 0x0290c, 0x0, 0x0, 0x0, 0x0, 0x0, /* E408 */ 0x0, 0x029be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E410 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x02241, 0x0, 0x0, /* E418 */ 0x0, 0x0, 0x029b0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E420 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E428 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E430 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E438 */ 0x0, 0x0, 0x0, 0x0ee3b, 0x0ee3c, 0x0, 0x0, 0x0, /* E440 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E448 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E450 */ 0x00308, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E458 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E460 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E468 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E470 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E478 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E480 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E488 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E490 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E498 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4F8 */ 0x0, 0x02423, 0x0, 0x0, 0x0ee31, 0x0, 0x0, 0x0ee32, /* E500 */ 0x1d538, 0x1d539, 0x02102, 0x1d53b, 0x1d53c, 0x1d53d, 0x1d53e, 0x0210d, /* E508 */ 0x1d540, 0x1d541, 0x1d542, 0x1d543, 0x1d544, 0x02115, 0x1d546, 0x02119, /* E510 */ 0x0211a, 0x0211d, 0x1d54a, 0x1d54b, 0x1d54c, 0x1d54d, 0x1d54e, 0x1d54f, /* E518 */ 0x1d550, 0x02124, 0x0213f, 0x0, 0x0, 0x0, 0x0, 0x0, /* E520 */ 0x1d49c, 0x0212c, 0x1d49e, 0x1d49f, 0x02130, 0x02131, 0x1d4a2, 0x0210b, /* E528 */ 0x02110, 0x1d4a5, 0x1d4a6, 0x02112, 0x02133, 0x1d4a9, 0x1d4aa, 0x1d4ab, /* E530 */ 0x1d4ac, 0x0211b, 0x1d4ae, 0x1d4af, 0x1d4b0, 0x1d4b1, 0x1d4b2, 0x1d4b3, /* E538 */ 0x1d4b4, 0x1d4b5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E540 */ 0x1d4b6, 0x1d4b7, 0x1d4b8, 0x1d4b9, 0x0212f, 0x1d4bb, 0x0210a, 0x1d4bd, /* E548 */ 0x1d4be, 0x1d4bf, 0x1d4c0, 0x02113, 0x1d4c2, 0x1d4c3, 0x02134, 0x1d4c5, /* E550 */ 0x1d4c6, 0x1d4c7, 0x1d4c8, 0x1d4c9, 0x1d4ca, 0x1d4cb, 0x1d4cc, 0x1d4cd, /* E558 */ 0x1d4ce, 0x1d4cf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E560 */ 0x1d504, 0x1d505, 0x1d506, 0x1d507, 0x1d508, 0x1d509, 0x1d50a, 0x0210c, /* E568 */ 0x02111, 0x1d50d, 0x1d50e, 0x1d50f, 0x1d510, 0x1d511, 0x1d512, 0x1d513, /* E570 */ 0x1d514, 0x0211c, 0x1d516, 0x1d517, 0x1d518, 0x1d519, 0x1d51a, 0x1d51b, /* E578 */ 0x1d51c, 0x12128, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E580 */ 0x1d51e, 0x1d51f, 0x1d520, 0x1d521, 0x1d522, 0x1d523, 0x1d524, 0x1d525, /* E588 */ 0x1d526, 0x1d527, 0x1d528, 0x1d529, 0x1d52a, 0x1d52b, 0x1d52c, 0x1d52d, /* E590 */ 0x1d52e, 0x1d52f, 0x1d530, 0x1d531, 0x1d532, 0x1d533, 0x1d534, 0x1d535, /* E598 */ 0x1d536, 0x1d537, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E5A0 */ 0x02942, 0x02944, 0x02947, 0x02940, 0x02941, 0x0, 0x0, 0x0, /* E5A8 */ 0x02985, 0x0, 0x02980, 0x0, 0x0ec01, 0x0, 0x0, 0x02986, /* E5B0 */ 0x02af6, 0x0, 0x02999, 0x0, 0x0ee33, 0x0ee34, 0x0ee35, 0x0ee36, /* E5B8 */ 0x025a9, 0x0ee37, 0x0ee38, 0x0, 0x0ee80, 0x0, 0x0, 0x02222, /* E5C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x02a08, 0x02a07, 0x02a63, /* E5C8 */ 0x02a5e, 0x0, 0x029ca, 0x0, 0x0, 0x0, 0x0, 0x02a95, /* E5D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E5D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x02a96, /* E5E0 */ 0x0, 0x0, 0x0, 0x0, 0x0e84e, 0x0, 0x0, 0x0ee50, /* E5E8 */ 0x0ee51, 0x0ee52, 0x0ee53, 0x0, 0x0, 0x0, 0x0, 0x0, /* E5F0 */ 0x0, 0x0, 0x0ee3a, 0x0, 0x0ee54, 0x0, 0x0ee55, 0x0ee56, /* E5F8 */ 0x0ee57, 0x0ee58, 0x0, 0x0ee59, 0x0ee5a, 0x0ee5b, 0x029f8, 0x029f9, /* E600 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0ee5c, 0x0ee5d, 0x0ee5e, /* E608 */ 0x0ee5f, 0x0ee60, 0x0ee61, 0x0ee62, 0x0224c, 0x0224c, 0x0, 0x029cb, /* E610 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E618 */ 0x0, 0x02a2f, 0x0, 0x029b6, 0x0, 0x0, 0x0, 0x0, /* E620 */ 0x0, 0x0, 0x0, 0x02205, 0x0ee10, 0x00326, 0x000b7, 0x0, /* E628 */ 0x0, 0x003f5, 0x0, 0x0, 0x0, 0x0ee14, 0x00061, 0x0, /* E630 */ 0x0ee15, 0x0, 0x0ee18, 0x0ee19, 0x0ee1a, 0x0ee1b, 0x0ee1c, 0x0, /* E638 */ 0x0ee1d, 0x0ee1e, 0x0026e, 0x0, 0x002af, 0x0, 0x00235, 0x00236, /* E640 */ 0x0ee1f, 0x00221, 0x0ee12, 0x02afd, 0x0ee20, 0x0, 0x0, 0x02afb, /* E648 */ 0x0, 0x0, 0x0005c, 0x0ee13, 0x0ee16, 0x0, 0x0, 0x0, /* E650 */ 0x021f9, 0x0, 0x0, 0x0, 0x0e215, 0x0, 0x0, 0x0, /* E658 */ 0x0, 0x1d5b2, 0x0, 0x02a05, 0x0, 0x0, 0x0, 0x0, /* E660 */ 0x003d8, 0x003d9, 0x0223c, 0x003d2, 0x003f4, 0x0, 0x0, 0x0, /* E668 */ 0x00062, 0x00063, 0x00064, 0x00065, 0x00066, 0x00068, 0x00069, 0x0006a, /* E670 */ 0x0006b, 0x0006c, 0x0006d, 0x0006e, 0x0006f, 0x00070, 0x00071, 0x00072, /* E678 */ 0x00073, 0x00074, 0x00075, 0x00076, 0x00077, 0x00078, 0x00079, 0x0007a, /* E680 */ 0x0030f, 0x003c7, 0x003b2, 0x001a5, 0x01d1c, 0x01d07, 0x0004d, 0x0002f, /* E688 */ 0x01d00, 0x0029c, 0x0e2d4, 0x003b8, 0x003bb, 0x02260, 0x00110, 0x003c9, /* E690 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E698 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6A0 */ 0x0ee17, 0x0ee70, 0x0ee71, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E700 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E708 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E710 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E718 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E720 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E728 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E730 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E738 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E740 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E748 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E750 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E758 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E760 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E768 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E770 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E778 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E780 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E788 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E790 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E798 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E800 */ 0x003f6, 0x0213f, 0x0, 0x1d7d9, 0x1d7d8, 0x02a03, 0x0, 0x0, /* E808 */ 0x0, 0x02a09, 0x0290d, 0x029eb, 0x0, 0x029c6, 0x0, 0x0, /* E810 */ 0x029c7, 0x0, 0x02a32, 0x02ae3, 0x0, 0x0, 0x0, 0x0, /* E818 */ 0x0, 0x029df, 0x02adc, 0x02add, 0x02141, 0x0, 0x0, 0x0, /* E820 */ 0x0, 0x02a0e, 0x02a19, 0x02a1a, 0x02af4, 0x02a18, 0x0, 0x0, /* E828 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x027fb, 0x027fd, 0x0, /* E830 */ 0x027fe, 0x0, 0x0, 0x0, 0x02906, 0x02907, 0x0, 0x0, /* E838 */ 0x0, 0x029b8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E840 */ 0x02aa3, 0x0, 0x0, 0x02322, 0x02216, 0x0, 0x0214b, 0x0221d, /* E848 */ 0x0, 0x00303, 0x0, 0x0, 0x0, 0x0, 0x0e84e, 0x0, /* E850 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E858 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E860 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E868 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E870 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E878 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E880 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E888 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E890 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E898 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E8F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E900 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E908 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E910 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E918 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E920 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E928 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E930 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E938 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E940 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E948 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E950 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E958 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E960 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E968 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E970 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E978 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E980 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E988 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E990 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E998 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA00 */ 0x029a2, 0x0299e, 0x029a3, 0x0ee73, 0x0ee74, 0x0, 0x0ee75, 0x02943, /* EA08 */ 0x02051, 0x00319, 0x0ee11, 0x0, 0x0ee76, 0x0, 0x0, 0x0, /* EA10 */ 0x0, 0x029f3, 0x029f1, 0x0, 0x0, 0x029bd, 0x029ec, 0x029ed, /* EA18 */ 0x0, 0x029ba, 0x02050, 0x0ee77, 0x029ef, 0x0, 0x0, 0x0, /* EA20 */ 0x0, 0x0, 0x025a0, 0x0, 0x0, 0x0223c, 0x0ee21, 0x0ee22, /* EA28 */ 0x029ea, 0x02908, 0x0ee72, 0x0, 0x0ee78, 0x0ee79, 0x0ee7a, 0x0ee7b, /* EA30 */ 0x0ee7c, 0x0ee7d, 0x0ee23, 0x0, 0x0, 0x0, 0x0, 0x0ee7e, /* EA38 */ 0x0, 0x0, 0x0, 0x0, 0x02142, 0x029e0, 0x0293e, 0x029d1, /* EA40 */ 0x029d4, 0x0, 0x0, 0x02983, 0x02922, 0x02921, 0x029f2, 0x029f0, /* EA48 */ 0x029ee, 0x0, 0x029d6, 0x02034, 0x021f6, 0x0293b, 0x029d2, 0x029d5, /* EA50 */ 0x02984, 0x02143, 0x1d5ab, 0x0ee42, 0x0ee43, 0x025fb, 0x025fc, 0x02a0b, /* EA58 */ 0x020e8, 0x0297a, 0x02a28, 0x029cc, 0x02909, 0x0ee7f, 0x02144, 0x029c8, /* EA60 */ 0x027d0, 0x029d3, 0x029d7, 0x00318, 0x02977, 0x02278, 0x02279, 0x0, /* EA68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAA0 */ 0x02987, 0x02988, 0x02989, 0x0298a, 0x02982, 0x02a3e, 0x02a1f, 0x02a20, /* EAA8 */ 0x02040, 0x02a21, 0x02a64, 0x02a65, 0x022ff, 0x02a41, 0x020e6, 0x0, /* EAB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAD0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAD8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB00 */ 0x0ee3d, 0x0, 0x0ee3e, 0x029e7, 0x0ee81, 0x029e8, 0x029e9, 0x0, /* EB08 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB10 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB20 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB40 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB58 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB60 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EB98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBD0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBD8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EBF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC00 */ 0x02a3d, 0x0e5ac, 0x0e5a5, 0x00302, 0x0030c, 0x00330, 0x020e7, 0x029e2, /* EC08 */ 0x0290a, 0x0290b, 0x02140, 0x02a1b, 0x02a1c, 0x02a1d, 0x02a1e, 0x0, /* EC10 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC20 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC40 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC58 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC60 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EC98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECD0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECD8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED00 */ 0x0292b, 0x0292c, 0x0292d, 0x0292e, 0x0292f, 0x02930, 0x02931, 0x02932, /* ED08 */ 0x0294c, 0x0294d, 0x021f7, 0x021f8, 0x021fa, 0x0, 0x021fb, 0x021fc, /* ED10 */ 0x02900, 0x02901, 0x02914, 0x02915, 0x02917, 0x02918, 0x0, 0x0, /* ED18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED20 */ 0x0293f, 0x0293a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED30 */ 0x0e370, 0x0e36c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED40 */ 0x0, 0x0, 0x02a2c, 0x02a2b, 0x02a62, 0x02a60, 0x0, 0x0, /* ED48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED50 */ 0x02a6b, 0x0, 0x0, 0x02a6c, 0x0, 0x0, 0x0, 0x0, /* ED58 */ 0x0, 0x0, 0x02a67, 0x0, 0x0, 0x0, 0x02a76, 0x0, /* ED60 */ 0x02270, 0x02271, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED68 */ 0x02a99, 0x02a9a, 0x02a9b, 0x02a9c, 0x0, 0x0, 0x0, 0x0, /* ED70 */ 0x02272, 0x02273, 0x02a9d, 0x02a9e, 0x02ab1, 0x02ab2, 0x0, 0x0, /* ED78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED80 */ 0x02ac9, 0x02aca, 0x02288, 0x02289, 0x02a59, 0x02a4e, 0x02a4f, 0x02acd, /* ED88 */ 0x02ace, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED90 */ 0x02ae0, 0x02ade, 0x02adf, 0x02ae5, 0x02ae1, 0x0299b, 0x029a0, 0x029a1, /* ED98 */ 0x0, 0x02af5, 0x02a68, 0x02a69, 0x02af7, 0x02af8, 0x02a0a, 0x0213e, /* EDA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDD0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDD8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDF0 */ 0x0ee82, 0x0ee83, 0x0ee84, 0x0220a, 0x0220d, 0x0ee85, 0x0, 0x0, /* EDF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE00 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE08 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE10 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE20 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE40 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE58 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE60 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EED0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EED8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF00 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF08 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF10 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF20 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF40 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF58 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF60 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFD0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFD8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F000 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F008 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F010 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F018 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F020 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F028 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F030 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F038 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F040 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F048 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F050 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F058 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F060 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F068 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F070 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F078 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F080 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F088 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F090 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F098 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F100 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F108 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F110 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F118 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F120 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F128 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F130 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F138 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F140 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F148 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F150 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F158 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F160 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F168 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F170 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F178 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F180 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F188 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F190 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F198 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F200 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F208 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F210 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F218 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F220 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F228 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F230 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F238 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F240 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F248 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F250 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F258 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F260 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F268 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F270 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F278 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F280 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F288 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F290 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F298 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F300 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F308 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F310 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F318 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F320 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F328 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F330 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F338 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F340 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F348 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F350 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F358 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F360 */ 0x0, 0x0, 0x0, 0x0, 0x0205f, 0x0, 0x0, 0x0, /* F368 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F370 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F378 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F380 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F388 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F390 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F398 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3B0 */ 0x0, 0x0, 0x0ee90, 0x0, 0x0, 0x0, 0x02062, 0x02061, /* F3B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F400 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F408 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F410 */ 0x029cf, 0x029d0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F418 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F420 */ 0x0, 0x0, 0x0, 0x0f423, 0x0, 0x0, 0x0, 0x0, /* F428 */ 0x0f428, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F430 */ 0x0, 0x02a75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F438 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F440 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F448 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F450 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F458 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F460 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F468 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F470 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F478 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F480 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F488 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F490 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F498 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F4F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F500 */ 0x0, 0x0, 0x0, 0x02912, 0x02913, 0x0294e, 0x0, 0x02952, /* F508 */ 0x02953, 0x0295a, 0x0295b, 0x02950, 0x02956, 0x02957, 0x0295e, 0x0295f, /* F510 */ 0x0294f, 0x02954, 0x02955, 0x0295c, 0x0295d, 0x02951, 0x02958, 0x02959, /* F518 */ 0x02960, 0x02961, 0x0, 0x0, 0x0, 0x0, 0x0, 0x029f4, /* F520 */ 0x0ee05, 0x0, 0x0, 0x0, 0x02970, 0x0, 0x0, 0x0ee06, /* F528 */ 0x0ee07, 0x025fe, 0x02191, 0x02193, 0x0, 0x0, 0x0, 0x0, /* F530 */ 0x025fd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F538 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F540 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F548 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F550 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F558 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F560 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F568 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F570 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F578 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F580 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F588 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F590 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F598 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F600 */ 0x0, 0x0ee91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F608 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F610 */ 0x0, 0x0, 0x0, 0x0, 0x00346, 0x0033a, 0x0, 0x0, /* F618 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F620 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F628 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F630 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F638 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F640 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F648 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F650 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F658 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F660 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F668 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F670 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F678 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F680 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F688 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F690 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F698 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d552, 0x1d553, /* F6E8 */ 0x1d554, 0x1d555, 0x1d556, 0x1d557, 0x1d558, 0x1d559, 0x1d55a, 0x1d55b, /* F6F0 */ 0x1d55c, 0x1d55d, 0x1d55e, 0x1d55f, 0x1d560, 0x1d561, 0x1d562, 0x1d563, /* F6F8 */ 0x1d564, 0x1d565, 0x1d566, 0x1d567, 0x1d568, 0x1d569, 0x1d56a, 0x1d56b, /* F700 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F708 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F710 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F718 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F720 */ 0x0, 0x0ee92, 0x0ee93, 0x0ee94, 0x0, 0x026a0, 0x0, 0x0, /* F728 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F730 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F738 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F740 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F748 */ 0x0, 0x0ee00, 0x0213d, 0x02145, 0x02146, 0x02147, 0x02148, 0x02149, /* F750 */ 0x02981, 0x0ee95, 0x0ee96, 0x0ee97, 0x0, 0x0, 0x0ee98, 0x0ee99, /* F758 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F760 */ 0x0, 0x0, 0x0, 0x0ee9d, 0x0ee9a, 0x0, 0x0ee9e, 0x0ee9b, /* F768 */ 0x0ee9c, 0x0ee9f, 0x0eea0, 0x0eeab, 0x0eeac, 0x0, 0x0, 0x0, /* F770 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F778 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F780 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F788 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F790 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F798 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0eea1, 0x0eea2, /* F7C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7D0 */ 0x0eea3, 0x0eea4, 0x0eea5, 0x0eea6, 0x0eea7, 0x0eea8, 0x0eea9, 0x0eeaa, /* F7D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F800 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F808 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F810 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F818 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F820 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F828 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F830 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F838 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F840 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F848 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F850 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F858 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F860 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F868 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F870 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F878 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F880 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F888 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F890 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F898 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; /* These data are taken from adobe's cid2code.txt for ac14 */ const int cns14pua[] = { /* Big5 and friends */ /* E000 */ 0x20547, 0x0, 0x205df, 0x23fc5, 0x0, 0x0, 0x0, 0x0, /* E008 */ 0x0, 0x24942, 0x289e4, 0x0, 0x219db, 0x0, 0x23cc8, 0x0, /* E010 */ 0x0, 0x0, 0x24933, 0x289aa, 0x202a0, 0x26bb3, 0x21305, 0x0, /* E018 */ 0x224ed, 0x0, 0x26d29, 0x27a84, 0x23600, 0x24ab1, 0x22513, 0x0, /* E020 */ 0x2037e, 0x0, 0x20380, 0x20347, 0x0, 0x2041f, 0x0, 0x0, /* E028 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x249a4, 0x20487, 0x0, /* E030 */ 0x233b4, 0x0, 0x20bff, 0x220fc, 0x202e5, 0x22530, 0x2058e, 0x23233, /* E038 */ 0x21983, 0x0, 0x0, 0x205b3, 0x23c99, 0x0, 0x0, 0x0, /* E040 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x24aa6, 0x0, 0x0, /* E048 */ 0x0, 0x0, 0x0, 0x0, 0x2372d, 0x0, 0x0, 0x0, /* E050 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E058 */ 0x0, 0x0, 0x26b13, 0x0, 0x28ade, 0x0, 0x0, 0x23f80, /* E060 */ 0x20954, 0x23fec, 0x0, 0x0, 0x20be2, 0x0, 0x21726, 0x0, /* E068 */ 0x0, 0x0, 0x0, 0x0, 0x216e8, 0x0, 0x0, 0x0, /* E070 */ 0x0, 0x286ab, 0x0, 0x0, 0x21596, 0x21613, 0x0, 0x0, /* E078 */ 0x28a9b, 0x0, 0x0, 0x0, 0x0, 0x25772, 0x0, 0x0, /* E080 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20b8f, /* E088 */ 0x0, 0x23feb, 0x22da3, 0x0, 0x20c77, 0x0, 0x0, 0x0, /* E090 */ 0x0, 0x0, 0x0, 0x26b53, 0x20d74, 0x0, 0x0, 0x0, /* E098 */ 0x0, 0x2170d, 0x20edd, 0x0, 0x20d4d, 0x289bc, 0x22698, 0x0, /* E0A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x218d7, 0x2403a, /* E0A8 */ 0x0, 0x24435, 0x0, 0x210b4, 0x0, 0x0, 0x2328a, 0x0, /* E0B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0B8 */ 0x0, 0x0, 0x28b66, 0x0, 0x2124f, 0x0, 0x241a5, 0x0, /* E0C0 */ 0x0, 0x0, 0x0, 0x26c7e, 0x0, 0x21416, 0x0, 0x21454, /* E0C8 */ 0x24363, 0x0, 0x24bf5, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0D0 */ 0x2123c, 0x0, 0x0, 0x0, 0x2a150, 0x24278, 0x0, 0x0, /* E0D8 */ 0x0, 0x0, 0x0, 0x0, 0x2163e, 0x0, 0x0, 0x21692, /* E0E0 */ 0x0, 0x0, 0x20d4e, 0x26c81, 0x26d2a, 0x217dc, 0x0, 0x217fb, /* E0E8 */ 0x217b2, 0x26da6, 0x0, 0x21828, 0x216d5, 0x0, 0x26e45, 0x0, /* E0F0 */ 0x0, 0x0, 0x249a9, 0x0, 0x0, 0x0, 0x0, 0x0, /* E0F8 */ 0x26fa1, 0x22554, 0x0, 0x21911, 0x0, 0x216b8, 0x0, 0x0, /* E100 */ 0x0, 0x0, 0x0, 0x27a0e, 0x0, 0x0, 0x20204, 0x0, /* E108 */ 0x0, 0x21a34, 0x259cc, 0x205a5, 0x0, 0x0, 0x0, 0x0, /* E110 */ 0x21b44, 0x0, 0x0, 0x0, 0x21ca5, 0x26b28, 0x0, 0x0, /* E118 */ 0x0, 0x0, 0x0, 0x0, 0x21df9, 0x21e37, 0x0, 0x0, /* E120 */ 0x0, 0x21ea4, 0x0, 0x0, 0x0, 0x0, 0x24901, 0x22049, /* E128 */ 0x22173, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E130 */ 0x244bc, 0x20cd3, 0x0, 0x0, 0x0, 0x0, 0x21771, 0x0, /* E138 */ 0x0, 0x28482, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E140 */ 0x0, 0x201c1, 0x2f894, 0x0, 0x0, 0x2133a, 0x0, 0x26888, /* E148 */ 0x223d0, 0x0, 0x22471, 0x0, 0x0, 0x26e6e, 0x0, 0x0, /* E150 */ 0x28a36, 0x0, 0x0, 0x0, 0x25250, 0x21f6a, 0x270f8, 0x22668, /* E158 */ 0x0, 0x2029e, 0x28a29, 0x0, 0x0, 0x21877, 0x0, 0x0, /* E160 */ 0x0, 0x0, 0x227b4, 0x0, 0x0, 0x0, 0x0, 0x0, /* E168 */ 0x24982, 0x2498f, 0x27a53, 0x0, 0x0, 0x0, 0x0, 0x0, /* E170 */ 0x0, 0x2f8a6, 0x26ed2, 0x0, 0x0, 0x20656, 0x0, 0x0, /* E178 */ 0x23fb7, 0x2285f, 0x0, 0x28b9d, 0x2995d, 0x0, 0x0, 0x22980, /* E180 */ 0x228c1, 0x0, 0x0, 0x0, 0x0, 0x20118, 0x0, 0x21770, /* E188 */ 0x0, 0x22e0d, 0x0, 0x249df, 0x0, 0x0, 0x0, 0x2138e, /* E190 */ 0x217fc, 0x0, 0x0, 0x22e36, 0x0, 0x2408c, 0x2571d, 0x0, /* E198 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24a28, /* E1A0 */ 0x24a23, 0x0, 0x0, 0x0, 0x2307e, 0x0, 0x24940, 0x0, /* E1A8 */ 0x0, 0x0, 0x21829, 0x0, 0x0, 0x0, 0x23400, 0x0, /* E1B0 */ 0x231f7, 0x231f8, 0x0, 0x231a4, 0x231a5, 0x0, 0x20e75, 0x0, /* E1B8 */ 0x251e6, 0x0, 0x0, 0x21e3d, 0x23231, 0x285f4, 0x231c8, 0x25313, /* E1C0 */ 0x0, 0x228f7, 0x0, 0x0, 0x2439c, 0x24a21, 0x0, 0x0, /* E1C8 */ 0x237c2, 0x0, 0x0, 0x0, 0x241cd, 0x290ed, 0x0, 0x0, /* E1D0 */ 0x0, 0x0, 0x0, 0x0, 0x233e6, 0x26da0, 0x0, 0x2346f, /* E1D8 */ 0x0, 0x0, 0x28adf, 0x0, 0x0, 0x235cd, 0x0, 0x0, /* E1E0 */ 0x0, 0x0, 0x2363c, 0x0, 0x0, 0x0, 0x28a4a, 0x0, /* E1E8 */ 0x0, 0x0, 0x0, 0x203c9, 0x0, 0x0, 0x0, 0x23659, /* E1F0 */ 0x2212a, 0x0, 0x23703, 0x0, 0x0, 0x0, 0x0, 0x2919c, /* E1F8 */ 0x0, 0x0, 0x20923, 0x0, 0x0, 0x0, 0x227cd, 0x0, /* E200 */ 0x23adb, 0x203b5, 0x21958, 0x0, 0x0, 0x23b5a, 0x0, 0x23efc, /* E208 */ 0x0, 0x0, 0x2248b, 0x248f1, 0x26b51, 0x0, 0x0, 0x0, /* E210 */ 0x23dbc, 0x0, 0x23dbd, 0x241a4, 0x2490c, 0x24900, 0x23cc9, 0x0, /* E218 */ 0x0, 0x20d32, 0x0, 0x231f9, 0x22491, 0x0, 0x0, 0x26d25, /* E220 */ 0x26da1, 0x26deb, 0x0, 0x0, 0x0, 0x0, 0x2497f, 0x24085, /* E228 */ 0x26e72, 0x0, 0x26f74, 0x0, 0x0, 0x0, 0x0, 0x28b21, /* E230 */ 0x0, 0x23e2f, 0x0, 0x23f82, 0x0, 0x0, 0x0, 0x2304b, /* E238 */ 0x0, 0x0, 0x0, 0x23e30, 0x0, 0x21497, 0x2403d, 0x0, /* E240 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x29170, 0x0, 0x0, /* E248 */ 0x24144, 0x0, 0x24091, 0x24155, 0x24039, 0x23ff0, 0x23fb4, 0x2413f, /* E250 */ 0x0, 0x24156, 0x24157, 0x24140, 0x261dd, 0x0, 0x0, 0x0, /* E258 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E260 */ 0x0, 0x24277, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E268 */ 0x24365, 0x0, 0x0, 0x242c1, 0x0, 0x2445a, 0x24a27, 0x24a22, /* E270 */ 0x0, 0x28be8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E278 */ 0x0, 0x0, 0x25605, 0x0, 0x0, 0x24974, 0x0, 0x0, /* E280 */ 0x0, 0x0, 0x23044, 0x0, 0x0, 0x0, 0x0, 0x0, /* E288 */ 0x24823, 0x2882b, 0x0, 0x28804, 0x0, 0x0, 0x0, 0x0, /* E290 */ 0x20c3a, 0x26a2e, 0x0, 0x0, 0x241e2, 0x216e7, 0x24a24, 0x0, /* E298 */ 0x0, 0x249b7, 0x2498d, 0x249fb, 0x0, 0x0, 0x0, 0x24a26, /* E2A0 */ 0x0, 0x205c3, 0x0, 0x0, 0x228ad, 0x0, 0x28eb2, 0x0, /* E2A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E2B0 */ 0x0, 0x0, 0x24a8c, 0x2415f, 0x24a79, 0x28b8f, 0x0, 0x28c03, /* E2B8 */ 0x2189e, 0x0, 0x21988, 0x0, 0x0, 0x0, 0x28ed9, 0x21a4b, /* E2C0 */ 0x0, 0x28eac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24f82, /* E2C8 */ 0x0, 0x24d13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E2D0 */ 0x0, 0x0, 0x0, 0x0, 0x263f5, 0x0, 0x0, 0x0, /* E2D8 */ 0x26911, 0x2690e, 0x0, 0x0, 0x0, 0x0, 0x26f9f, 0x0, /* E2E0 */ 0x2509d, 0x2517d, 0x21e1c, 0x0, 0x0, 0x0, 0x0, 0x25220, /* E2E8 */ 0x0, 0x232ac, 0x0, 0x28964, 0x28968, 0x216c1, 0x0, 0x0, /* E2F0 */ 0x21376, 0x24a12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E2F8 */ 0x255e0, 0x0, 0x0, 0x0, 0x2760c, 0x0, 0x0, 0x28b2b, /* E300 */ 0x26083, 0x2261c, 0x0, 0x0, 0x0, 0x0, 0x25857, 0x0, /* E308 */ 0x27b39, 0x0, 0x0, 0x0, 0x27126, 0x0, 0x0, 0x2910d, /* E310 */ 0x0, 0x23ed7, 0x0, 0x26ed3, 0x0, 0x257e0, 0x0, 0x0, /* E318 */ 0x28be9, 0x0, 0x0, 0x258e1, 0x294d9, 0x0, 0x0, 0x259ac, /* E320 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x2648d, 0x0, 0x0, /* E328 */ 0x0, 0x0, 0x0, 0x0, 0x25c01, 0x0, 0x0, 0x0, /* E330 */ 0x2530e, 0x25cfe, 0x0, 0x0, 0x0, 0x25bb4, 0x26c7f, 0x0, /* E338 */ 0x0, 0x0, 0x0, 0x25d20, 0x0, 0x25c65, 0x0, 0x0, /* E340 */ 0x0, 0x0, 0x25cc1, 0x0, 0x0, 0x24882, 0x0, 0x0, /* E348 */ 0x24578, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E350 */ 0x0, 0x0, 0x26e44, 0x0, 0x26ed6, 0x0, 0x0, 0x0, /* E358 */ 0x0, 0x0, 0x0, 0x24057, 0x26029, 0x0, 0x0, 0x0, /* E360 */ 0x217f9, 0x0, 0x2836d, 0x0, 0x26121, 0x2615a, 0x0, 0x0, /* E368 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x262d0, /* E370 */ 0x0, 0x0, 0x26351, 0x0, 0x21661, 0x20068, 0x0, 0x23766, /* E378 */ 0x0, 0x2833a, 0x0, 0x26489, 0x0, 0x0, 0x0, 0x0, /* E380 */ 0x0, 0x2a087, 0x26cc3, 0x0, 0x0, 0x0, 0x22714, 0x0, /* E388 */ 0x26626, 0x23de3, 0x266e8, 0x0, 0x0, 0x28a48, 0x0, 0x0, /* E390 */ 0x0, 0x226f6, 0x0, 0x26498, 0x24fb8, 0x0, 0x2148a, 0x0, /* E398 */ 0x2185e, 0x0, 0x24a65, 0x24a95, 0x0, 0x0, 0x20b0d, 0x26a52, /* E3A0 */ 0x23d7e, 0x0, 0x214fd, 0x0, 0x0, 0x26b0a, 0x249a7, 0x23530, /* E3A8 */ 0x21773, 0x23df8, 0x0, 0x0, 0x2f994, 0x0, 0x0, 0x0, /* E3B0 */ 0x0, 0x20e16, 0x217b4, 0x0, 0x2317d, 0x2355a, 0x0, 0x0, /* E3B8 */ 0x0, 0x23e8b, 0x26da3, 0x26b05, 0x26b97, 0x235ce, 0x0, 0x0, /* E3C0 */ 0x0, 0x0, 0x0, 0x26da5, 0x0, 0x0, 0x0, 0x0, /* E3C8 */ 0x26ed4, 0x0, 0x0, 0x0, 0x26e42, 0x22eef, 0x0, 0x25be4, /* E3D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x23cb5, 0x0, 0x0, /* E3D8 */ 0x26b96, 0x26e77, 0x26e43, 0x0, 0x0, 0x0, 0x0, 0x0, /* E3E0 */ 0x0, 0x25c91, 0x0, 0x25cc0, 0x0, 0x0, 0x0, 0x26e99, /* E3E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x28625, 0x2863b, 0x0, /* E3F0 */ 0x27088, 0x0, 0x21582, 0x270cd, 0x2f9b2, 0x0, 0x0, 0x0, /* E3F8 */ 0x218a2, 0x0, 0x2739a, 0x0, 0x0, 0x2a0f8, 0x0, 0x22c27, /* E400 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E408 */ 0x0, 0x275e0, 0x23db9, 0x275e4, 0x0, 0x0, 0x0, 0x0, /* E410 */ 0x0, 0x0, 0x0, 0x0, 0x2770f, 0x0, 0x0, 0x0, /* E418 */ 0x0, 0x0, 0x0, 0x28a25, 0x0, 0x27924, 0x27abd, 0x0, /* E420 */ 0x0, 0x0, 0x0, 0x27a59, 0x0, 0x27b3a, 0x23f8f, 0x0, /* E428 */ 0x27b38, 0x0, 0x0, 0x0, 0x25430, 0x25565, 0x0, 0x0, /* E430 */ 0x0, 0x0, 0x24a7a, 0x0, 0x0, 0x0, 0x216df, 0x0, /* E438 */ 0x0, 0x0, 0x27d54, 0x27d8f, 0x2f9d4, 0x0, 0x27d53, 0x0, /* E440 */ 0x27d98, 0x27dbd, 0x0, 0x0, 0x21910, 0x0, 0x0, 0x0, /* E448 */ 0x24cc9, 0x0, 0x0, 0x0, 0x28002, 0x21014, 0x2498a, 0x0, /* E450 */ 0x281bc, 0x2710c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E458 */ 0x0, 0x28365, 0x28412, 0x0, 0x0, 0x2a29f, 0x20a50, 0x0, /* E460 */ 0x0, 0x289de, 0x2853d, 0x23dbb, 0x0, 0x23262, 0x0, 0x2a014, /* E468 */ 0x286bc, 0x28501, 0x22325, 0x0, 0x26ed7, 0x0, 0x2853c, 0x27abe, /* E470 */ 0x0, 0x2856c, 0x2860b, 0x0, 0x28713, 0x0, 0x286e6, 0x0, /* E478 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28933, 0x21e89, /* E480 */ 0x0, 0x0, 0x0, 0x0, 0x255b9, 0x0, 0x28ac6, 0x23c9b, /* E488 */ 0x28b0c, 0x255db, 0x20d31, 0x0, 0x0, 0x28ae1, 0x28beb, 0x0, /* E490 */ 0x0, 0x28ae2, 0x28ae5, 0x0, 0x0, 0x28bec, 0x28c39, 0x28bff, /* E498 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4A0 */ 0x0, 0x2267a, 0x286d8, 0x2127c, 0x23e2e, 0x0, 0x0, 0x0, /* E4A8 */ 0x0, 0x0, 0x0, 0x26ed5, 0x0, 0x0, 0x0, 0x28ae0, /* E4B0 */ 0x0, 0x0, 0x0, 0x26cb8, 0x20274, 0x26410, 0x290af, 0x290e5, /* E4B8 */ 0x24ad1, 0x21915, 0x2330a, 0x0, 0x0, 0x0, 0x0, 0x0, /* E4C0 */ 0x0, 0x24ae9, 0x0, 0x0, 0x0, 0x0, 0x291d5, 0x0, /* E4C8 */ 0x0, 0x291eb, 0x0, 0x0, 0x0, 0x230b7, 0x230bc, 0x0, /* E4D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2546c, 0x0, /* E4D8 */ 0x0, 0x29433, 0x0, 0x0, 0x2941d, 0x2797a, 0x0, 0x0, /* E4E0 */ 0x0, 0x0, 0x0, 0x0, 0x27175, 0x0, 0x20630, 0x2415c, /* E4E8 */ 0x25706, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26d27, 0x216d3, /* E4F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24a29, 0x0, /* E4F8 */ 0x29857, 0x29905, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25725, /* E500 */ 0x0, 0x290b1, 0x29bd5, 0x0, 0x0, 0x29b05, 0x0, 0x0, /* E508 */ 0x0, 0x0, 0x28600, 0x0, 0x0, 0x269a8, 0x0, 0x2307d, /* E510 */ 0x0, 0x0, 0x29d3e, 0x0, 0x21863, 0x0, 0x2424b, 0x0, /* E518 */ 0x0, 0x0, 0x29e68, 0x0, 0x29fb7, 0x2a192, 0x2a1ab, 0x2a0e1, /* E520 */ 0x2a123, 0x2a1df, 0x0, 0x0, 0x2a134, 0x0, 0x0, 0x0, /* E528 */ 0x2215b, 0x2a193, 0x2a220, 0x2193b, 0x2a233, 0x0, 0x2a0b9, 0x2a2b4, /* E530 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24364, /* E538 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28c2b, 0x0, /* E540 */ 0x0, 0x0, 0x0, 0x26da2, 0x0, 0x0, 0x0, 0x0, /* E548 */ 0x0, 0x0, 0x0, 0x2908b, 0x0, 0x0, 0x0, 0x0, /* E550 */ 0x0, 0x0, 0x0, 0x0, 0x24975, 0x249bb, 0x0, 0x249f8, /* E558 */ 0x24348, 0x24a51, 0x0, 0x28bda, 0x218fa, 0x0, 0x2897e, 0x28e36, /* E560 */ 0x0, 0x0, 0x28a44, 0x0, 0x0, 0x0, 0x2896c, 0x244b9, /* E568 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x24473, 0x243f8, 0x0, /* E570 */ 0x217ef, 0x0, 0x218be, 0x23599, 0x0, 0x21885, 0x2542f, 0x217f8, /* E578 */ 0x0, 0x216fb, 0x21839, 0x0, 0x21774, 0x218d1, 0x25f4b, 0x0, /* E580 */ 0x216c0, 0x0, 0x24a25, 0x213fe, 0x212a8, 0x213c6, 0x214b6, 0x0, /* E588 */ 0x236a6, 0x0, 0x0, 0x24994, 0x27165, 0x23e31, 0x2555c, 0x23efb, /* E590 */ 0x27052, 0x0, 0x236ee, 0x2999d, 0x26f26, 0x0, 0x0, 0x0, /* E598 */ 0x0, 0x0, 0x21922, 0x0, 0x0, 0x2373f, 0x240e1, 0x2408b, /* E5A0 */ 0x2410f, 0x26c21, 0x0, 0x0, 0x266b1, 0x0, 0x20fdf, 0x20ba8, /* E5A8 */ 0x20e0d, 0x0, 0x28b13, 0x0, 0x0, 0x0, 0x0, 0x24436, /* E5B0 */ 0x0, 0x20465, 0x2037f, 0x0, 0x0, 0x25651, 0x0, 0x201ab, /* E5B8 */ 0x203cb, 0x0, 0x2030a, 0x20414, 0x0, 0x0, 0x202c0, 0x28eb3, /* E5C0 */ 0x20275, 0x0, 0x2020c, 0x0, 0x0, 0x0, 0x0, 0x0, /* E5C8 */ 0x24a0e, 0x23e8a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E5D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23595, /* E5D8 */ 0x23e39, 0x23ebf, 0x0, 0x21884, 0x23e89, 0x0, 0x0, 0x205e0, /* E5E0 */ 0x0, 0x204a3, 0x20492, 0x20491, 0x0, 0x28a9c, 0x2070e, 0x0, /* E5E8 */ 0x0, 0x20873, 0x0, 0x0, 0x0, 0x0, 0x2438c, 0x20c20, /* E5F0 */ 0x249ac, 0x210e4, 0x0, 0x20e1d, 0x0, 0x0, 0x0, 0x0, /* E5F8 */ 0x0, 0x0, 0x0, 0x24abc, 0x2408d, 0x0, 0x0, 0x0, /* E600 */ 0x240c9, 0x0, 0x20345, 0x0, 0x20bc6, 0x0, 0x0, 0x0, /* E608 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28a46, /* E610 */ 0x216fa, 0x2176f, 0x21710, 0x0, 0x0, 0x0, 0x0, 0x0, /* E618 */ 0x0, 0x25946, 0x219f3, 0x21861, 0x24295, 0x0, 0x0, 0x0, /* E620 */ 0x0, 0x25e83, 0x0, 0x28bd7, 0x20413, 0x0, 0x0, 0x21303, /* E628 */ 0x0, 0x0, 0x0, 0x289fb, 0x0, 0x0, 0x0, 0x0, /* E630 */ 0x0, 0x0, 0x21996, 0x2197c, 0x23aee, 0x0, 0x0, 0x21903, /* E638 */ 0x21904, 0x0, 0x218a0, 0x0, 0x216fe, 0x0, 0x0, 0x28a47, /* E640 */ 0x21dba, 0x23472, 0x289a8, 0x0, 0x0, 0x21927, 0x217ab, 0x0, /* E648 */ 0x2173b, 0x0, 0x0, 0x275fd, 0x0, 0x0, 0x22860, 0x2262b, /* E650 */ 0x0, 0x0, 0x225af, 0x225be, 0x29088, 0x26f73, 0x0, 0x2003e, /* E658 */ 0x20046, 0x2261b, 0x0, 0x0, 0x0, 0x22c9b, 0x22d07, 0x246d4, /* E660 */ 0x2914d, 0x0, 0x24665, 0x22b6a, 0x0, 0x22b22, 0x23450, 0x298ea, /* E668 */ 0x22e78, 0x0, 0x2a45b, 0x0, 0x0, 0x0, 0x249e3, 0x22d67, /* E670 */ 0x0, 0x22ca1, 0x0, 0x0, 0x0, 0x0, 0x2308e, 0x232ad, /* E678 */ 0x24989, 0x232ab, 0x0, 0x232e0, 0x218d9, 0x2943f, 0x0, 0x23289, /* E680 */ 0x231b3, 0x0, 0x0, 0x25584, 0x28b22, 0x2558f, 0x216fc, 0x2555b, /* E688 */ 0x25425, 0x0, 0x23103, 0x2182a, 0x23234, 0x0, 0x2320f, 0x23182, /* E690 */ 0x242c9, 0x0, 0x26d24, 0x0, 0x0, 0x0, 0x27870, 0x21deb, /* E698 */ 0x0, 0x232d2, 0x232e1, 0x0, 0x25872, 0x0, 0x2383a, 0x237bc, /* E6A0 */ 0x0, 0x237a2, 0x233fe, 0x0, 0x0, 0x0, 0x2462a, 0x0, /* E6A8 */ 0x0, 0x0, 0x0, 0x0, 0x237d5, 0x24487, 0x0, 0x0, /* E6B0 */ 0x0, 0x0, 0x21912, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6B8 */ 0x0, 0x23fc0, 0x23c9a, 0x0, 0x0, 0x28bea, 0x28acb, 0x0, /* E6C0 */ 0x2801e, 0x289dc, 0x0, 0x0, 0x0, 0x249ec, 0x0, 0x23f7f, /* E6C8 */ 0x0, 0x0, 0x2403c, 0x0, 0x0, 0x0, 0x0, 0x0, /* E6D0 */ 0x0, 0x2431a, 0x24276, 0x0, 0x0, 0x0, 0x0, 0x2478f, /* E6D8 */ 0x24725, 0x0, 0x24aa4, 0x205eb, 0x0, 0x23ef8, 0x2365f, 0x24a4a, /* E6E0 */ 0x24917, 0x25fe1, 0x0, 0x0, 0x24adf, 0x28c23, 0x23f35, 0x0, /* E6E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26dea, 0x0, /* E6F0 */ 0x0, 0x0, 0x24cd9, 0x24d06, 0x0, 0x0, 0x0, 0x2a5c6, /* E6F8 */ 0x0, 0x0, 0x28acc, 0x249ab, 0x2498e, 0x0, 0x0, 0x24a4e, /* E700 */ 0x0, 0x249c5, 0x248f3, 0x0, 0x0, 0x0, 0x28ae3, 0x21864, /* E708 */ 0x0, 0x25221, 0x251e7, 0x0, 0x23232, 0x0, 0x0, 0x0, /* E710 */ 0x24697, 0x23781, 0x0, 0x248f0, 0x0, 0x0, 0x0, 0x24aba, /* E718 */ 0x24ac7, 0x0, 0x24a96, 0x261ae, 0x0, 0x25581, 0x0, 0x0, /* E720 */ 0x0, 0x0, 0x0, 0x0, 0x27741, 0x256e3, 0x0, 0x0, /* E728 */ 0x0, 0x0, 0x0, 0x23efa, 0x0, 0x0, 0x0, 0x216e6, /* E730 */ 0x0, 0x0, 0x0, 0x20d4c, 0x2498c, 0x20299, 0x23dba, 0x2176e, /* E738 */ 0x0, 0x0, 0x0, 0x0, 0x201d4, 0x20c0d, 0x0, 0x0, /* E740 */ 0x226f5, 0x25aaf, 0x25a9c, 0x0, 0x2025b, 0x0, 0x0, 0x25bc6, /* E748 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x25bb3, 0x25ebc, 0x25ea6, /* E750 */ 0x0, 0x249f9, 0x217b0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E758 */ 0x0, 0x0, 0x0, 0x26261, 0x2615c, 0x27b48, 0x0, 0x25e82, /* E760 */ 0x0, 0x26b75, 0x20916, 0x0, 0x2004e, 0x235cf, 0x0, 0x26412, /* E768 */ 0x263f8, 0x24962, 0x0, 0x0, 0x2082c, 0x25ae9, 0x25d43, 0x0, /* E770 */ 0x25e0e, 0x0, 0x0, 0x0, 0x0, 0x2343f, 0x0, 0x249f7, /* E778 */ 0x265ad, 0x0, 0x265a0, 0x0, 0x27127, 0x26cd1, 0x0, 0x0, /* E780 */ 0x0, 0x0, 0x0, 0x0, 0x267b4, 0x0, 0x26a42, 0x0, /* E788 */ 0x0, 0x26a51, 0x0, 0x26da7, 0x0, 0x2721b, 0x0, 0x0, /* E790 */ 0x21840, 0x0, 0x218a1, 0x0, 0x218d8, 0x0, 0x2f9bc, 0x23d8f, /* E798 */ 0x0, 0x27422, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7A0 */ 0x0, 0x0, 0x25683, 0x0, 0x27785, 0x27784, 0x28bf5, 0x28bd9, /* E7A8 */ 0x28b9c, 0x289f9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7B0 */ 0x0, 0x29448, 0x0, 0x0, 0x24284, 0x0, 0x0, 0x0, /* E7B8 */ 0x21845, 0x0, 0x0, 0x0, 0x27ddc, 0x0, 0x0, 0x0, /* E7C0 */ 0x0, 0x0, 0x0, 0x0, 0x24c09, 0x0, 0x0, 0x0, /* E7C8 */ 0x0, 0x0, 0x22321, 0x0, 0x0, 0x0, 0x217da, 0x0, /* E7D0 */ 0x0, 0x2492f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E7D8 */ 0x28a4b, 0x0, 0x28afc, 0x0, 0x28c1d, 0x28c3b, 0x0, 0x0, /* E7E0 */ 0x0, 0x0, 0x0, 0x0, 0x28d34, 0x0, 0x0, 0x248ff, /* E7E8 */ 0x24a42, 0x243ea, 0x0, 0x23225, 0x0, 0x28ee7, 0x28e66, 0x28e65, /* E7F0 */ 0x0, 0x249ed, 0x24a78, 0x23fee, 0x0, 0x0, 0x0, 0x0, /* E7F8 */ 0x290b0, 0x0, 0x0, 0x29093, 0x257df, 0x0, 0x0, 0x28989, /* E800 */ 0x28c26, 0x28b2f, 0x263be, 0x0, 0x0, 0x0, 0x0, 0x0, /* E808 */ 0x2421b, 0x0, 0x0, 0x0, 0x20f26, 0x0, 0x28bc5, 0x24ab2, /* E810 */ 0x0, 0x294da, 0x0, 0x295d7, 0x0, 0x0, 0x28b50, 0x24a67, /* E818 */ 0x28b64, 0x0, 0x28a45, 0x0, 0x0, 0x0, 0x0, 0x0, /* E820 */ 0x0, 0x27b06, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28b65, /* E828 */ 0x258c8, 0x0, 0x0, 0x0, 0x0, 0x298f1, 0x0, 0x29948, /* E830 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x21302, 0x0, 0x249b8, /* E838 */ 0x214e8, 0x0, 0x2271f, 0x23db8, 0x0, 0x0, 0x0, 0x0, /* E840 */ 0x0, 0x22781, 0x2296b, 0x0, 0x0, 0x0, 0x0, 0x0, /* E848 */ 0x0, 0x0, 0x0, 0x29e2d, 0x0, 0x2a1f5, 0x2a0fe, 0x0, /* E850 */ 0x0, 0x24104, 0x0, 0x0, 0x0, 0x2a1b4, 0x2a0ed, 0x2a0f3, /* E858 */ 0x2992f, 0x0, 0x0, 0x26e12, 0x26fdf, 0x26b82, 0x0, 0x0, /* E860 */ 0x26da4, 0x26e84, 0x26df0, 0x0, 0x0, 0x26e00, 0x237d7, 0x26064, /* E868 */ 0x0, 0x2359c, 0x23640, 0x0, 0x249de, 0x0, 0x0, 0x0, /* E870 */ 0x0, 0x202bf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E878 */ 0x2555d, 0x0, 0x0, 0x0, 0x0, 0x21757, 0x231c9, 0x24941, /* E880 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x241b5, /* E888 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x241ac, /* E890 */ 0x0, 0x26c40, 0x24f97, 0x0, 0x217b5, 0x28a49, 0x0, 0x0, /* E898 */ 0x0, 0x0, 0x24488, 0x0, 0x0, 0x289fc, 0x0, 0x0, /* E8A0 */ 0x218d6, 0x20f1d, 0x0, 0x26cc0, 0x21413, 0x242fa, 0x22c26, 0x243c1, /* E8A8 */ 0x0, 0x23db7, 0x26741, 0x0, 0x2615b, 0x260a4, 0x249b9, 0x2498b, /* E8B0 */ 0x289fa, 0x0, 0x0, 0x0, 0x0, 0x28b63, 0x2189f, 0x0, /* E8B8 */ 0x24ab3, 0x0, 0x0, 0x0, 0x0, 0x24a3e, 0x24a94, 0x217d9, /* E8C0 */ 0x24a66, 0x203a7, 0x21424, 0x249e5, 0x0, 0x24916, 0x0, 0x24976, /* E8C8 */ 0x0, 0x0, 0x0, 0x204fe, 0x0, 0x28ace, 0x28a16, 0x0, /* E8D0 */ 0x28be7, 0x255d5, 0x0, 0x28a82, 0x0, 0x24943, 0x20cff, 0x0, /* E8D8 */ 0x2061a, 0x20beb, 0x20cb8, 0x0, 0x0, 0x217fa, 0x0, 0x216c2, /* E8E0 */ 0x24a50, 0x21852, 0x0, 0x0, 0x0, 0x28ac0, 0x249ad, 0x0, /* E8E8 */ 0x218bf, 0x21883, 0x27484, 0x0, 0x0, 0x23d5b, 0x0, 0x0, /* E8F0 */ 0x0, 0x28a81, 0x21862, 0x0, 0x0, 0x20ab4, 0x0, 0x0, /* E8F8 */ 0x0, 0x0, 0x0, 0x2139c, 0x0, 0x0, 0x28218, 0x0, /* E900 */ 0x290e4, 0x0, 0x0, 0x27e4f, 0x0, 0x0, 0x0, 0x23fed, /* E908 */ 0x23e2d, 0x0, 0x0, 0x0, 0x203f5, 0x0, 0x0, 0x0, /* E910 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28c1c, /* E918 */ 0x26bc0, 0x0, 0x0, 0x0, 0x21452, 0x0, 0x24362, 0x24a71, /* E920 */ 0x22fe3, 0x212b0, 0x223bd, 0x0, 0x0, 0x21398, 0x234e5, 0x27bf4, /* E928 */ 0x236df, 0x28a83, 0x237d6, 0x233fa, 0x24c9f, 0x0, 0x236ad, 0x26cb7, /* E930 */ 0x0, 0x0, 0x0, 0x26d26, 0x26d51, 0x26c82, 0x26fde, 0x0, /* E938 */ 0x27109, 0x0, 0x2173a, 0x0, 0x26c80, 0x27053, 0x217db, 0x0, /* E940 */ 0x0, 0x217b3, 0x0, 0x0, 0x21905, 0x241fc, 0x0, 0x0, /* E948 */ 0x2173c, 0x0, 0x0, 0x0, 0x0, 0x242a5, 0x0, 0x0, /* E950 */ 0x24293, 0x0, 0x23ef9, 0x27736, 0x2445b, 0x242ca, 0x0, 0x24259, /* E958 */ 0x289e1, 0x0, 0x26d28, 0x0, 0x244ce, 0x27e4d, 0x243bd, 0x0, /* E960 */ 0x24256, 0x21304, 0x0, 0x0, 0x243e9, 0x0, 0x0, 0x2f825, /* E968 */ 0x24a4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24a5d, 0x217df, /* E970 */ 0x0, 0x0, 0x0, 0x23afa, 0x23300, 0x20214, 0x0, 0x208d5, /* E978 */ 0x20619, 0x0, 0x21f9e, 0x2a2b6, 0x0, 0x2915b, 0x0, 0x0, /* E980 */ 0x0, 0x28a59, 0x29420, 0x0, 0x0, 0x0, 0x0, 0x27af4, /* E988 */ 0x0, 0x0, 0x256f6, 0x0, 0x0, 0x0, 0x27b18, 0x0, /* E990 */ 0x0, 0x248f2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E998 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9B0 */ 0x24f5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9C8 */ 0x0, 0x0, 0x0, 0x25535, 0x0, 0x0, 0x0, 0x0, /* E9D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20ccf, /* E9F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* E9F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA00 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA08 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA10 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA20 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA40 */ 0x0, 0x0, 0x0, 0x27967, 0x0, 0x0, 0x0, 0x0, /* EA48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA58 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA60 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EA98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAA8 */ 0x0, 0x21bc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EAB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20094, /* EAC0 */ 0x202b7, 0x203a0, 0x0, 0x0, 0x0, 0x204d7, 0x0, 0x0, /* EAC8 */ 0x0, 0x205d5, 0x20615, 0x20676, 0x216ba, 0x0, 0x0, 0x20ac2, /* EAD0 */ 0x20acd, 0x20bbf, 0x0, 0x2f83b, 0x20bcb, 0x0, 0x20bfb, 0x20c3b, /* EAD8 */ 0x20c53, 0x20c65, 0x20c7c, 0x0, 0x20c8d, 0x0, 0x20cb5, 0x20cdd, /* EAE0 */ 0x20ced, 0x20d6f, 0x20db2, 0x20dc8, 0x0, 0x0, 0x0, 0x20e04, /* EAE8 */ 0x20e0e, 0x20ed7, 0x20f90, 0x20f2d, 0x20e73, 0x0, 0x20fbc, 0x0, /* EAF0 */ 0x2105c, 0x2104f, 0x21076, 0x0, 0x2107b, 0x21088, 0x21096, 0x0, /* EAF8 */ 0x210bf, 0x210d3, 0x2112f, 0x2113b, 0x0, 0x0, 0x212e3, 0x21375, /* EB00 */ 0x21336, 0x0, 0x21577, 0x21619, 0x217c3, 0x217c7, 0x0, 0x0, /* EB08 */ 0x2182d, 0x2196a, 0x21a2d, 0x21a45, 0x21c2a, 0x21c70, 0x21cac, 0x21ec8, /* EB10 */ 0x0, 0x21ed5, 0x21f15, 0x0, 0x0, 0x22045, 0x0, 0x0, /* EB18 */ 0x2227c, 0x223d7, 0x223fa, 0x2272a, 0x22871, 0x2294f, 0x0, 0x22967, /* EB20 */ 0x22993, 0x22ad5, 0x0, 0x22ae8, 0x0, 0x22b0e, 0x0, 0x22b3f, /* EB28 */ 0x0, 0x0, 0x22c4c, 0x0, 0x22c88, 0x22cb7, 0x25be8, 0x22d08, /* EB30 */ 0x22d12, 0x22db7, 0x22d95, 0x22e42, 0x22f74, 0x22fcc, 0x23033, 0x23066, /* EB38 */ 0x2331f, 0x233de, 0x0, 0x0, 0x0, 0x27a79, 0x23567, 0x235f3, /* EB40 */ 0x0, 0x249ba, 0x0, 0x2361a, 0x23716, 0x0, 0x20346, 0x0, /* EB48 */ 0x0, 0x0, 0x23aa7, 0x27657, 0x25fe2, 0x23e11, 0x23eb9, 0x275fe, /* EB50 */ 0x2209a, 0x0, 0x0, 0x24119, 0x28a9a, 0x242ee, 0x2430d, 0x2403b, /* EB58 */ 0x24334, 0x24396, 0x24a45, 0x205ca, 0x0, 0x20611, 0x0, 0x21ea8, /* EB60 */ 0x0, 0x23cff, 0x24404, 0x244d6, 0x0, 0x24674, 0x0, 0x2472f, /* EB68 */ 0x285e8, 0x299c9, 0x0, 0x221c3, 0x0, 0x28b4e, 0x0, 0x24812, /* EB70 */ 0x248fb, 0x24a15, 0x0, 0x24ac0, 0x20c78, 0x0, 0x24ea5, 0x24f86, /* EB78 */ 0x20779, 0x0, 0x2502c, 0x0, 0x0, 0x0, 0x25299, 0x25419, /* EB80 */ 0x23f4a, 0x24aa7, 0x0, 0x25446, 0x2546e, 0x26b52, 0x0, 0x0, /* EB88 */ 0x2553f, 0x27632, 0x2555e, 0x0, 0x25562, 0x25566, 0x257c7, 0x2493f, /* EB90 */ 0x2585d, 0x0, 0x0, 0x233cc, 0x0, 0x25903, 0x0, 0x28948, /* EB98 */ 0x25aae, 0x25b89, 0x25c06, 0x21d90, 0x0, 0x0, 0x0, 0x26102, /* EBA0 */ 0x27c12, 0x0, 0x261b2, 0x24f9a, 0x0, 0x26402, 0x2644a, 0x0, /* EBA8 */ 0x26bf7, 0x0, 0x26484, 0x2191c, 0x0, 0x249f6, 0x26488, 0x23fef, /* EBB0 */ 0x26512, 0x0, 0x265bf, 0x266b5, 0x2271b, 0x0, 0x257e1, 0x0, /* EBB8 */ 0x0, 0x2f8cd, 0x0, 0x0, 0x24521, 0x266fc, 0x0, 0x24934, /* EBC0 */ 0x0, 0x0, 0x26cbd, 0x0, 0x0, 0x26799, 0x2686e, 0x26411, /* EBC8 */ 0x2685e, 0x0, 0x268c7, 0x0, 0x290c0, 0x20a11, 0x26926, 0x0, /* EBD0 */ 0x26939, 0x0, 0x0, 0x269fa, 0x0, 0x26a2d, 0x0, 0x26469, /* EBD8 */ 0x20021, 0x0, 0x26a34, 0x26b5b, 0x0, 0x23519, 0x0, 0x26b9d, /* EBE0 */ 0x0, 0x26ca4, 0x0, 0x0, 0x26dae, 0x0, 0x0, 0x2258d, /* EBE8 */ 0x2704b, 0x271cd, 0x0, 0x27280, 0x27285, 0x0, 0x2217a, 0x2728b, /* EBF0 */ 0x0, 0x272e6, 0x249d0, 0x0, 0x0, 0x27450, 0x20ef8, 0x0, /* EBF8 */ 0x0, 0x22926, 0x28473, 0x217b1, 0x0, 0x24a2a, 0x21820, 0x0, /* EC00 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x29cad, 0x298a4, 0x0, /* EC08 */ 0x277cc, 0x27858, 0x0, 0x0, 0x2160a, 0x0, 0x2372f, 0x280e8, /* EC10 */ 0x213c5, 0x0, 0x0, 0x279dd, 0x291a8, 0x0, 0x0, 0x270af, /* EC18 */ 0x289ab, 0x279fd, 0x27a0a, 0x27b0b, 0x27d66, 0x2417a, 0x0, 0x0, /* EC20 */ 0x28009, 0x0, 0x2a2df, 0x0, 0x28318, 0x0, 0x26e07, 0x0, /* EC28 */ 0x0, 0x0, 0x2816f, 0x28023, 0x269b5, 0x213ed, 0x2322f, 0x28048, /* EC30 */ 0x0, 0x28c30, 0x28083, 0x0, 0x0, 0x28949, 0x0, 0x24988, /* EC38 */ 0x0, 0x0, 0x0, 0x24aa5, 0x23f81, 0x0, 0x0, 0x28090, /* EC40 */ 0x280f4, 0x2812e, 0x21fa1, 0x2814f, 0x28189, 0x281af, 0x2821a, 0x28306, /* EC48 */ 0x2832f, 0x2838a, 0x0, 0x28468, 0x286aa, 0x0, 0x0, 0x28956, /* EC50 */ 0x0, 0x0, 0x289b8, 0x0, 0x289e7, 0x0, 0x289e8, 0x28b46, /* EC58 */ 0x28bd4, 0x0, 0x28c09, 0x0, 0x28fc5, 0x290ec, 0x0, 0x29110, /* EC60 */ 0x2913c, 0x0, 0x2915e, 0x24aca, 0x0, 0x0, 0x0, 0x294e7, /* EC68 */ 0x295e9, 0x295b0, 0x295b8, 0x29732, 0x298d1, 0x29949, 0x2996a, 0x299c3, /* EC70 */ 0x29a28, 0x29b0e, 0x29d5a, 0x29d9b, 0x0, 0x29ef8, 0x29f23, 0x0, /* EC78 */ 0x0, 0x2a293, 0x0, 0x2a2ff, 0x0, 0x0, 0x2a5cb, 0x0, /* EC80 */ 0x20c9c, 0x0, 0x0, 0x0, 0x224b0, 0x0, 0x24a93, 0x0, /* EC88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x28b2c, 0x2789d, 0x0, /* EC90 */ 0x0, 0x217f5, 0x28024, 0x28b6c, 0x28b99, 0x27a3e, 0x266af, 0x0, /* EC98 */ 0x27655, 0x23cb7, 0x25635, 0x25956, 0x0, 0x25e81, 0x26258, 0x0, /* ECA0 */ 0x20e6d, 0x0, 0x0, 0x23e88, 0x24c9e, 0x0, 0x0, 0x217f6, /* ECA8 */ 0x2187b, 0x0, 0x0, 0x25c4a, 0x0, 0x25311, 0x0, 0x29d98, /* ECB0 */ 0x0, 0x0, 0x0, 0x0, 0x25ed8, 0x0, 0x23d40, 0x0, /* ECB8 */ 0x0, 0x20fea, 0x20d49, 0x236ba, 0x0, 0x0, 0x0, 0x0, /* ECC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20e9d, /* ECD0 */ 0x0, 0x0, 0x0, 0x0, 0x282e2, 0x0, 0x0, 0x0, /* ECD8 */ 0x0, 0x0, 0x0, 0x20c41, 0x20c96, 0x0, 0x25148, 0x20e76, /* ECE0 */ 0x22c62, 0x20ea2, 0x0, 0x0, 0x0, 0x21075, 0x0, 0x0, /* ECE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ECF0 */ 0x22b43, 0x0, 0x22eb3, 0x0, 0x0, 0x20da7, 0x0, 0x0, /* ECF8 */ 0x0, 0x0, 0x0, 0x0, 0x2688a, 0x0, 0x0, 0x0, /* ED00 */ 0x0, 0x0, 0x0, 0x0, 0x210c1, 0x0, 0x0, 0x24706, /* ED08 */ 0x0, 0x0, 0x26893, 0x0, 0x226f4, 0x27d2f, 0x241a3, 0x27d73, /* ED10 */ 0x26ed0, 0x272b6, 0x0, 0x211d9, 0x0, 0x23cfc, 0x2a6a9, 0x20eac, /* ED18 */ 0x20ef9, 0x0, 0x21ca2, 0x0, 0x24fc2, 0x27ff9, 0x20feb, 0x0, /* ED20 */ 0x0, 0x0, 0x22da0, 0x0, 0x247e0, 0x29d7c, 0x20fec, 0x20e0a, /* ED28 */ 0x0, 0x275a3, 0x20fed, 0x0, 0x26048, 0x21187, 0x0, 0x0, /* ED30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED38 */ 0x0, 0x0, 0x0, 0x24618, 0x0, 0x24b6e, 0x0, 0x0, /* ED40 */ 0x0, 0x25a95, 0x20979, 0x0, 0x0, 0x22465, 0x0, 0x29eac, /* ED48 */ 0x0, 0x0, 0x23cfe, 0x29f30, 0x0, 0x24fa9, 0x2959e, 0x29fde, /* ED50 */ 0x0, 0x23db6, 0x272b2, 0x267b3, 0x23720, 0x0, 0x0, 0x23ef7, /* ED58 */ 0x23e2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2048e, /* ED60 */ 0x0, 0x0, 0x20eb6, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED68 */ 0x0, 0x0, 0x0, 0x2a434, 0x0, 0x0, 0x0, 0x0, /* ED70 */ 0x0, 0x230da, 0x243f2, 0x0, 0x0, 0x212a9, 0x0, 0x24963, /* ED78 */ 0x29e06, 0x0, 0x270ae, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED80 */ 0x0, 0x2176c, 0x0, 0x0, 0x294d0, 0x26335, 0x27164, 0x0, /* ED88 */ 0x20d28, 0x26d22, 0x24ae2, 0x20d71, 0x0, 0x0, 0x21f0f, 0x0, /* ED90 */ 0x0, 0x21dd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* ED98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2493e, 0x0, /* EDA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2176d, 0x0, /* EDC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28e97, /* EDD0 */ 0x0, 0x26d23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x203fc, /* EDD8 */ 0x0, 0x0, 0x25c21, 0x23cfd, 0x0, 0x24919, 0x0, 0x0, /* EDE0 */ 0x0, 0x20cd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x201f2, 0x0, 0x0, /* EDF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EDF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE00 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE08 */ 0x2a64a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE10 */ 0x0, 0x2837d, 0x0, 0x0, 0x0, 0x24a77, 0x0, 0x0, /* EE18 */ 0x0, 0x0, 0x0, 0x28a5a, 0x0, 0x0, 0x0, 0x0, /* EE20 */ 0x2a2b2, 0x0, 0x2f840, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE28 */ 0x0, 0x0, 0x24abb, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE30 */ 0x2183b, 0x26e05, 0x0, 0x0, 0x2251b, 0x0, 0x0, 0x0, /* EE38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE40 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE48 */ 0x26159, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x233f5, 0x0, /* EE58 */ 0x0, 0x0, 0x0, 0x28bc2, 0x0, 0x28e39, 0x0, 0x0, /* EE60 */ 0x21d46, 0x0, 0x0, 0x0, 0x20f3b, 0x0, 0x0, 0x0, /* EE68 */ 0x0, 0x0, 0x25f1a, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27486, 0x0, /* EE78 */ 0x0, 0x0, 0x0, 0x0, 0x267cc, 0x0, 0x26ed1, 0x0, /* EE80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE90 */ 0x0, 0x24011, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EE98 */ 0x0, 0x0, 0x0, 0x0, 0x28b2d, 0x0, 0x0, 0x0, /* EEA0 */ 0x0, 0x0, 0x23cc7, 0x25ed7, 0x27656, 0x25531, 0x21944, 0x212fe, /* EEA8 */ 0x29903, 0x26ddc, 0x270ad, 0x0, 0x261ad, 0x28a0f, 0x23677, 0x200ee, /* EEB0 */ 0x26846, 0x24f0e, 0x0, 0x0, 0x2634c, 0x0, 0x0, 0x2626b, /* EEB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EED0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EED8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EEF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF00 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF08 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF10 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF18 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF20 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF28 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF30 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF38 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF40 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF48 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF50 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF58 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF60 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF68 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF70 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF78 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF80 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF88 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF90 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EF98 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFA0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFA8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFB0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFB8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFC0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFC8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFD0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFD8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFE0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFE8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFF0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* EFF8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F000 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F008 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F010 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F018 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F020 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F028 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F030 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F038 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F040 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F048 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F050 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F058 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F060 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F068 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F070 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F078 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F080 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F088 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F090 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F098 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F0F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F100 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F108 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F110 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F118 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F120 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F128 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F130 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F138 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F140 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F148 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F150 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F158 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F160 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F168 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F170 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F178 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F180 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F188 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F190 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F198 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F1F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F200 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F208 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F210 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F218 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F220 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F228 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F230 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F238 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F240 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F248 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F250 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F258 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F260 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F268 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F270 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F278 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F280 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F288 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F290 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F298 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F2F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F300 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F308 */ 0x2010c, 0x0, 0x200d1, 0x200cd, 0x0, 0x0, 0x200cb, 0x21fe8, /* F310 */ 0x0, 0x200ca, 0x0, 0x0, 0x0, 0x0, 0x2010e, 0x0, /* F318 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F320 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F328 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F330 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F338 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F340 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F348 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F350 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F358 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F360 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F368 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F370 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F378 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F380 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F388 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F390 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F398 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3A0 */ 0x2a3a9, 0x21145, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3A8 */ 0x0, 0x0, 0x0, 0x0, 0x27735, 0x0, 0x0, 0x0, /* F3B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3F0 */ 0x209e7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F3F8 */ 0x0, 0x29df6, 0x2700e, 0x0, 0x2a133, 0x0, 0x0, 0x0, /* F400 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F408 */ 0x2846c, 0x21dca, 0x205d0, 0x22ae6, 0x0, 0x0, 0x0, 0x0, /* F410 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F418 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F420 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F428 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F430 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F438 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x27d84, 0x0, 0x0, /* F440 */ 0x20c42, 0x20d15, 0x2512b, 0x0, 0x22cc6, 0x0, 0x20341, 0x0, /* F448 */ 0x24db8, 0x294e5, 0x0, 0x280be, 0x0, 0x22c38, 0x0, 0x0, /* F450 */ 0x2815d, 0x269f2, 0x24dea, 0x0, 0x20d7c, 0x20fb4, 0x20cd5, 0x210f4, /* F458 */ 0x0, 0x0, 0x20e96, 0x20c0b, 0x20f64, 0x22ca9, 0x28256, 0x244d3, /* F460 */ 0x0, 0x20d46, 0x29a4d, 0x280e9, 0x0, 0x24ea7, 0x22cc2, 0x0, /* F468 */ 0x0, 0x295f4, 0x0, 0x0, 0x252c7, 0x297d4, 0x278c8, 0x22d44, /* F470 */ 0x0, 0x0, 0x0, 0x0, 0x260a5, 0x0, 0x0, 0x22d4c, /* F478 */ 0x22bca, 0x21077, 0x0, 0x2106f, 0x266da, 0x26716, 0x279a0, 0x0, /* F480 */ 0x25052, 0x20c43, 0x0, 0x221a1, 0x28b4c, 0x20731, 0x0, 0x0, /* F488 */ 0x201a9, 0x0, 0x0, 0x22d8d, 0x0, 0x245c8, 0x204fc, 0x26097, /* F490 */ 0x20f4c, 0x20d96, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22a66, /* F498 */ 0x2109d, 0x0, 0x0, 0x20d9c, 0x0, 0x0, 0x22775, 0x0, /* F4A0 */ 0x0, 0x0, 0x0, 0x0, 0x2a601, 0x20e09, 0x22acf, 0x22cc9, /* F4A8 */ 0x0, 0x210c8, 0x239c2, 0x0, 0x0, 0x2829b, 0x0, 0x25e49, /* F4B0 */ 0x220c7, 0x0, 0x20f31, 0x22cb2, 0x29720, 0x0, 0x0, 0x24e3b, /* F4B8 */ 0x0, 0x0, 0x27574, 0x22e8b, 0x22208, 0x2a65b, 0x28ccd, 0x20e7a, /* F4C0 */ 0x20c34, 0x2681c, 0x0, 0x210cf, 0x22803, 0x22939, 0x0, 0x251e3, /* F4C8 */ 0x20e8c, 0x20f8d, 0x20eaa, 0x0, 0x20f30, 0x20d47, 0x2114f, 0x20e4c, /* F4D0 */ 0x0, 0x20eab, 0x20ba9, 0x20d48, 0x210c0, 0x2113d, 0x0, 0x22696, /* F4D8 */ 0x0, 0x20fad, 0x233f4, 0x27639, 0x22bce, 0x20d7e, 0x20d7f, 0x22c51, /* F4E0 */ 0x22c55, 0x0, 0x20e98, 0x210c7, 0x20f2e, 0x2a632, 0x26b50, 0x28cd2, /* F4E8 */ 0x28d99, 0x28cca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29ec3, /* F4F0 */ 0x0, 0x0, 0x2775e, 0x22dee, 0x0, 0x0, 0x0, 0x0, /* F4F8 */ 0x26572, 0x0, 0x0, 0x0, 0x280bd, 0x0, 0x20efa, 0x20e0f, /* F500 */ 0x20e77, 0x20efb, 0x0, 0x24deb, 0x0, 0x20cd6, 0x0, 0x227b5, /* F508 */ 0x210c9, 0x20e10, 0x20e78, 0x21078, 0x21148, 0x28207, 0x21455, 0x20e79, /* F510 */ 0x24e50, 0x22da4, 0x0, 0x2101d, 0x2101e, 0x210f5, 0x210f6, 0x0, /* F518 */ 0x20e11, 0x27694, 0x282cd, 0x20fb5, 0x20e7b, 0x2517e, 0x0, 0x20fb6, /* F520 */ 0x21180, 0x252d8, 0x2a2bd, 0x249da, 0x2183a, 0x24177, 0x2827c, 0x0, /* F528 */ 0x0, 0x0, 0x2573d, 0x0, 0x0, 0x0, 0x0, 0x0, /* F530 */ 0x0, 0x0, 0x0, 0x25b74, 0x2313d, 0x0, 0x0, 0x0, /* F538 */ 0x0, 0x0, 0x21bc1, 0x2f878, 0x0, 0x20086, 0x0, 0x0, /* F540 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F548 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x248e9, 0x0, /* F550 */ 0x0, 0x0, 0x0, 0x2626a, 0x0, 0x0, 0x2634b, 0x0, /* F558 */ 0x0, 0x26612, 0x26951, 0x0, 0x0, 0x0, 0x278b2, 0x0, /* F560 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x28e0f, 0x0, 0x0, /* F568 */ 0x0, 0x0, 0x0, 0x29810, 0x0, 0x0, 0x0, 0x0, /* F570 */ 0x0, 0x0, 0x20087, 0x0, 0x0, 0x0, 0x0, 0x0, /* F578 */ 0x0, 0x29c73, 0x0, 0x0, 0x0, 0x2414e, 0x0, 0x0, /* F580 */ 0x0, 0x251cd, 0x0, 0x25d30, 0x0, 0x28a32, 0x0, 0x0, /* F588 */ 0x0, 0x0, 0x0, 0x23281, 0x2a107, 0x0, 0x21980, 0x0, /* F590 */ 0x0, 0x0, 0x0, 0x2870f, 0x0, 0x0, 0x2a2ba, 0x0, /* F598 */ 0x0, 0x0, 0x0, 0x29947, 0x28aea, 0x0, 0x0, 0x0, /* F5A0 */ 0x2207e, 0x0, 0x0, 0x289e3, 0x0, 0x0, 0x0, 0x0, /* F5A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5B0 */ 0x21db6, 0x0, 0x0, 0x0, 0x22712, 0x0, 0x233f9, 0x0, /* F5B8 */ 0x0, 0x23c63, 0x0, 0x0, 0x0, 0x24505, 0x0, 0x0, /* F5C0 */ 0x24a13, 0x0, 0x0, 0x0, 0x25ca4, 0x25695, 0x0, 0x0, /* F5C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28db9, 0x2143f, /* F5D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5E0 */ 0x0, 0x0, 0x0, 0x0, 0x2497b, 0x0, 0x2710d, 0x0, /* F5E8 */ 0x26d74, 0x0, 0x26b15, 0x26fbe, 0x0, 0x0, 0x0, 0x0, /* F5F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F5F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F600 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F608 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F610 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F618 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F620 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F628 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F630 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F638 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F640 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F648 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F650 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F658 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F660 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F668 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F670 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F678 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F680 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F688 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F690 */ 0x0, 0x0, 0x0, 0x0, 0x289c0, 0x0, 0x0, 0x0, /* F698 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23f41, 0x0, /* F6A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x20325, 0x0, 0x0, /* F6B0 */ 0x20ed8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F6F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F700 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F708 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F710 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F718 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F720 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F728 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F730 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F738 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F740 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F748 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F750 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F758 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F760 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F768 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F770 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F778 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F780 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F788 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F790 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F798 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x200cc, 0x0, /* F7E8 */ 0x2008a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27607, 0x0, /* F7F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F7F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F800 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F808 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F810 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F818 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F820 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F828 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F830 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F838 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F840 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F848 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F850 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F858 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F860 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F868 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F870 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F878 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F880 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F888 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F890 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F898 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8A0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8A8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8B0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8B8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8C0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8C8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8D0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8D8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8E0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8E8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8F0 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* F8F8 */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; dvisvgm-2.8.1/libs/ff-woff/fontforge/splinerefigure.c0000664000175000017500000001125313510660062017570 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #ifdef HAVE_IEEEFP_H # include /* Solaris defines isnan in ieeefp rather than math.h */ #endif /* 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]; Spline old; spline->isquadratic = false; if ( spline->acceptableextrema ) old = *spline; xsp->d = from->me.x; ysp->d = from->me.y; int nonextcp_effective = 0; int noprevcp_effective = 0; if ( from->nonextcp ) { from->nextcp = from->me; nonextcp_effective = true; } else if ( from->nextcp.x==from->me.x && from->nextcp.y == from->me.y ) { nonextcp_effective = true; } if ( to->noprevcp ) { to->prevcp = to->me; noprevcp_effective = true; } else if ( to->prevcp.x==to->me.x && to->prevcp.y == to->me.y ) { noprevcp_effective = true; } if ( nonextcp_effective && noprevcp_effective ) { 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; if ( xsp->a!=0 && ( Within16RoundingErrors(xsp->a+from->me.x,from->me.x) || Within16RoundingErrors(xsp->a+to->me.x,to->me.x))) xsp->a = 0; if ( ysp->a!=0 && ( Within16RoundingErrors(ysp->a+from->me.y,from->me.y) || Within16RoundingErrors(ysp->a+to->me.y,to->me.y))) ysp->a = 0; SplineIsLinear(spline); spline->islinear = false; if ( ysp->a==0 && xsp->a==0 ) { if ( ysp->b==0 && xsp->b==0 ) spline->islinear = true; /* This seems extremely unlikely... */ else spline->isquadratic = true; /* Only likely if we read in a TTF */ } } if ( !isfinite(ysp->a) || !isfinite(xsp->a) || !isfinite(ysp->c) || !isfinite(xsp->c) || !isfinite(ysp->d) || !isfinite(xsp->d)) IError("NaN value in spline creation"); LinearApproxFree(spline->approx); spline->approx = NULL; spline->knowncurved = false; spline->knownlinear = spline->islinear; SplineIsLinear(spline); spline->order2 = false; if ( spline->acceptableextrema ) { /* I don't check "d", because changes to that reflect simple */ /* translations which will not affect the shape of the spline */ if ( !RealNear(old.splines[0].a,spline->splines[0].a) || !RealNear(old.splines[0].b,spline->splines[0].b) || !RealNear(old.splines[0].c,spline->splines[0].c) || !RealNear(old.splines[1].a,spline->splines[1].a) || !RealNear(old.splines[1].b,spline->splines[1].b) || !RealNear(old.splines[1].c,spline->splines[1].c) ) spline->acceptableextrema = false; } } dvisvgm-2.8.1/libs/ff-woff/fontforge/fontforge.h0000664000175000017500000000567113510660062016552 00000000000000/* Copyright (C) 2000-2012 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 #include "configure-fontforge.h" #include #include "libffstamp.h" #include #include #include #include "splinefont.h" #include "uiinterface.h" static const unsigned unicode4_size = 17*65536; /* Unicode goes up to 0x10ffff */ extern FILE* tmpfile2 (); extern int32 unicode_from_adobestd[256]; /* unicode_nameannot - Deprecated, but kept for older programs to access. */ #if _NO_LIBUNINAMESLIST #endif extern int default_fv_font_size; extern int default_fv_antialias; extern int default_fv_bbsized; extern Encoding *default_encoding, custom; extern int adjustwidth; extern int adjustlbearing; extern int autohint_before_generate; extern int seperate_hint_controls; extern int no_windowing_ui; extern uint32 default_background; extern int use_utf8_in_script; extern int new_em_size; extern int new_fonts_are_order2; extern int loaded_fonts_same_as_new; extern char *TTFFoundry; extern Encoding *enclist; extern int quiet; extern MacFeat *default_mac_feature_map; #include #include typedef uint32_t Color; #define COLOR_DEFAULT ((Color) 0xfffffffe) typedef struct pressedOn { int x,y; /* screen location of the press */ float cx, cy; /* Translated into character space */ float t; /* location on the spline where we pressed */ } PressedOn; typedef struct findsel { float fudge; /* One pixel fudge factor */ float xl,xh, yl, yh; /* One pixel fudge factor */ PressedOn *p; } FindSel; #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/splinesave.c0000664000175000017500000020554513510660062016727 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #include "psfont.h" float GenerateHintWidthEqualityTolerance = 0.0; int autohint_before_generate = 1; /* 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 */ /* That's very complex. And it doesn't do a very good job. */ /* Instead let's take all strings bounded by either moveto or hintmask operators */ /* store these as potential subroutines. So a glyph becomes a sequence of */ /* potential subroutine calls preceded by the glyph header (width, hint decl,*/ /* counter declarations, etc.) and intersperced by hintmask/moveto operators */ /* Each time we get a potential subr we hash it and see if we've used that */ /* string before. If we have then we merge the two. Otherwise it's a new one.*/ /* Then at the end we see what strings get used often enough to go into subrs */ /* we create the subrs array from that. */ /* Then each glyph. We insert the preamble. We check of the potential subroutine */ /* became a real subroutine. If so we call it, else we insert the data inline*/ /* Do the same for the next hintmask/moveto and potential subroutine... */ /* Then, on top of that I tried generating some full glyph subroutines, and */ /* to my surprise, it just made things worse. */ struct potentialsubrs { uint8 *data; /* the charstring of the subr */ int len; /* the length of the charstring */ int idx; /* initially index into psubrs array */ /* then index into subrs array or -1 if none */ int cnt; /* the usage count */ int fd; /* Which sub font is it in */ /* -1 => used in more than one */ int next; int full_glyph_index; /* Into the glyphbits array */ /* for full references */ BasePoint *startstop; /* Again for full references */ }; struct bits { uint8 *data; int dlen; int psub_index; }; struct glyphbits { SplineChar *sc; int fd; /* Which subfont is it in */ int bcnt; struct bits *bits; uint8 wasseac; }; #define HSH_SIZE 511 /* In type2 charstrings we divide every character into bits where a bit is */ /* bounded by a hintmask/moveto. Each of these is a potential subroutine and */ /* is stored here */ typedef struct glyphinfo { struct potentialsubrs *psubrs; int pcnt, pmax; int hashed[HSH_SIZE]; struct glyphbits *gb, *active; SplineFont *sf; int layer; int glyphcnt; int subfontcnt; int bcnt, bmax; struct bits *bits; /* For current glyph */ const int *bygid; int justbroken; int instance_count; } GlyphInfo; struct mhlist { uint8 mask[HntMax/8]; int subr; struct mhlist *next; }; struct hintdb { uint8 mask[HntMax/8]; 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; unsigned int startset: 1; unsigned int skiphm: 1; /* Set when coming back to the start point of a contour. hintmask should be set the first time, not the second */ unsigned int donefirsthm: 1; int cursub; /* Current subr number */ DBasePoint current; GlyphInfo *gi; }; static void GIContentsFree(GlyphInfo *gi,SplineChar *dummynotdef) { int i,j; if ( gi->glyphcnt>0 && gi->gb[0].sc == dummynotdef ) { if ( dummynotdef->layers!=NULL ) { SplinePointListsFree(dummynotdef->layers[gi->layer].splines); dummynotdef->layers[gi->layer].splines = NULL; } StemInfosFree(dummynotdef->hstem); StemInfosFree(dummynotdef->vstem); dummynotdef->vstem = dummynotdef->hstem = NULL; free(dummynotdef->layers); dummynotdef->layers = NULL; } for ( i=0; ipcnt; ++i ) { free(gi->psubrs[i].data); free(gi->psubrs[i].startstop); gi->psubrs[i].data = NULL; gi->psubrs[i].startstop = NULL; } for ( i=0; iglyphcnt; ++i ) { for ( j=0; jgb[i].bcnt; ++j ) free(gi->gb[i].bits[j].data); free(gi->gb[i].bits); gi->gb[i].bits = NULL; gi->gb[i].bcnt = 0; } gi->pcnt = 0; gi->bcnt = 0; gi->justbroken = 0; } static void GIFree(GlyphInfo *gi,SplineChar *dummynotdef) { GIContentsFree(gi,dummynotdef); free(gi->gb); free(gi->psubrs); free(gi->bits); } static void StartNextSubroutine(GrowBuf *gb,struct hintdb *hdb) { GlyphInfo *gi; if ( hdb==NULL ) return; gi = hdb->gi; if ( gi==NULL ) return; /* Store everything in the grow buf into the data/dlen of the next bit */ if ( gi->bcnt==-1 ) gi->bcnt = 0; if ( gi->bcnt>=gi->bmax ) gi->bits = realloc(gi->bits,(gi->bmax+=20)*sizeof(struct bits)); gi->bits[gi->bcnt].dlen = gb->pt-gb->base; gi->bits[gi->bcnt].data = malloc(gi->bits[gi->bcnt].dlen); gi->bits[gi->bcnt].psub_index = -1; memcpy(gi->bits[gi->bcnt].data,gb->base,gi->bits[gi->bcnt].dlen); gb->pt = gb->base; gi->justbroken = false; } static int hashfunc(uint8 *data, int len) { uint8 *end = data+len; unsigned int hash = 0, r; while ( data>30)&3; hash <<= 2; hash = (hash|r)&0xffffffff; hash ^= *data++; } return( hash%HSH_SIZE ); } static void BreakSubroutine(GrowBuf *gb,struct hintdb *hdb) { GlyphInfo *gi; struct potentialsubrs *ps; int hash; int pi; if ( hdb==NULL ) return; gi = hdb->gi; if ( gi==NULL ) return; /* The stuff before the first moveto in a glyph (the header that sets */ /* the width, sets up the hints, counters, etc.) can't go into a subr */ if ( gi->bcnt==-1 ) { gi->bcnt=0; gi->justbroken = true; return; } else if ( gi->justbroken ) return; /* Otherwise stuff everything in the growbuffer into a subr */ hash = hashfunc(gb->base,gb->pt-gb->base); ps = NULL; for ( pi=gi->hashed[hash]; pi!=-1; pi=gi->psubrs[pi].next ) { ps = &gi->psubrs[pi]; if ( ps->len==gb->pt-gb->base && memcmp(ps->data,gb->base,gb->pt-gb->base)==0 ) break; } if ( pi==-1 ) { if ( gi->pcnt>=gi->pmax ) gi->psubrs = realloc(gi->psubrs,(gi->pmax+=gi->glyphcnt)*sizeof(struct potentialsubrs)); ps = &gi->psubrs[gi->pcnt]; memset(ps,0,sizeof(*ps)); /* set cnt to 0 */ ps->idx = gi->pcnt++; ps->len = gb->pt-gb->base; ps->data = malloc(ps->len); memcpy(ps->data,gb->base,ps->len); ps->next = gi->hashed[hash]; gi->hashed[hash] = ps->idx; ps->fd = gi->active->fd; ps->full_glyph_index = -1; } if ( ps->fd!=gi->active->fd ) ps->fd = -1; /* used in multiple cid sub-fonts */ gi->bits[gi->bcnt].psub_index = ps->idx; ++ps->cnt; gb->pt = gb->base; ++gi->bcnt; gi->justbroken = true; } static void MoveSubrsToChar(GlyphInfo *gi) { struct glyphbits *active; if ( gi==NULL ) return; active = gi->active; active->bcnt = gi->bcnt; active->bits = malloc(active->bcnt*sizeof(struct bits)); memcpy(active->bits,gi->bits,active->bcnt*sizeof(struct bits)); gi->bcnt = 0; } 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 ) IError("MM font with different hint counts"); } return( cnt ); } static void MarkTranslationRefs(SplineFont *sf,int layer) { int i; SplineChar *sc; RefChar *r; for ( i=0; iglyphcnt; ++i ) if ( (sc = sf->glyphs[i])!=NULL ) { for ( r = sc->layers[layer].refs; r!=NULL; r=r->next ) r->justtranslated = (r->transform[0]==1 && r->transform[3]==1 && r->transform[1]==0 && r->transform[2]==0); } } /* ************************************************************************** */ /* ********************** Type1 PostScript CharStrings ********************** */ /* ************************************************************************** */ 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); if ( !round && pos!=floor(pos) ) { { if ( rint(pos*64)/64 == pos ) { pos *= 64; dodiv = 64; } else { pos *= 1024; dodiv = 1024; } } } pos = rint(pos); if ( dodiv>0 && floor(pos)/dodiv == floor(pos/dodiv) ) { pos = rint(pos/dodiv); dodiv = 0; } val = pos; str = gb->pt; 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 ) { if ( dodiv<107 ) *str++ = dodiv+139; else { dodiv -= 108; *str++ = (dodiv>>8)+247; *str++ = dodiv&0xff; } *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, bigreal 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; bigreal 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 int _SCNeedsSubsPts(SplineChar *sc,int layer) { RefChar *ref; if ( sc->hstem==NULL && sc->vstem==NULL ) return( false ); if ( sc->layers[layer].splines!=NULL ) return( sc->layers[layer].splines->first->hintmask==NULL ); for ( ref = sc->layers[layer].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,int layer) { 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,layer)); } else { MMSet *mm = sc->parent->mm; int i; for ( i=0; iinstance_count; ++i ) if ( sc->orig_posinstances[i]->glyphcnt ) { if ( _SCNeedsSubsPts(mm->instances[i]->glyphs[sc->orig_pos],layer) ) return( true ); } return( false ); } } #ifdef FONTFORGE_CONFIG_PS_REFS_GET_SUBRS static int AlwaysSeacable(SplineChar *sc,int flags) { struct splinecharlist *d; RefChar *r; if ( sc->parent->cidmaster!=NULL ) /* Can't use seac in CID fonts, no encoding */ return( false ); if ( flags&ps_flag_noseac ) return( false ); for ( d=sc->dependents; d!=NULL; d = d->next ) { if ( d->sc->layers[layer].splines!=NULL ) /* I won't deal with things with both splines and refs. */ continue; /* skip it */ for ( r=d->sc->layers[layer].refs; r!=NULL; r=r->next ) { if ( !r->justtranslated ) 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[layer].refs; r!=NULL; r=r->next ) { if ( r->adobe_enc==-1 ) return( false ); /* not seacable, but could go in subr */ } r = d->sc->layers[layer].refs; if ( r->next!=NULL && r->next->next!=NULL ) return( false ); /* seac only takes 2 glyphs */ 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[layer].refs; r!=NULL; r=r->next ) if ( r->sc == sc && r->justtranslated && r->transform[4]==0 && r->transform[5]==0 ) return( true ); } return( false ); } static BasePoint *FigureStartStop(SplineChar *sc, GlyphInfo *gi ) { int m, didfirst; SplineChar *msc; SplineSet *spl; RefChar *r; BasePoint *startstop; /* We need to know the location of the first point on the */ /* first path (need to rmoveto it, and the location of the */ /* last point on the last path (will need to move from it */ /* for the next component) */ startstop = calloc(2*gi->instance_count,sizeof(BasePoint)); for ( m=0; minstance_count; ++m ) { if ( gi->instance_count==1 || sc->parent->mm==NULL ) msc = sc; else msc = sc->parent->mm->instances[m]->glyphs[sc->orig_pos]; didfirst = false; spl = msc->layers[layer].splines; if ( spl!=NULL ) { startstop[0] = spl->first->me; didfirst = true; while ( spl!=NULL ) { /* Closepath does NOT set the current point */ /* Remember we reverse PostScript */ if ( spl->last==spl->first && spl->first->next!=NULL && spl->first->next->knownlinear ) startstop[1] = spl->first->next->to->me; else startstop[1] = spl->last->me; spl = spl->next; } } for ( r=msc->layers[layer].refs; r!=NULL; r=r->next ) { spl = r->layers[0].splines; if ( spl!=NULL ) { if ( !didfirst ) startstop[0] = spl->first->me; didfirst = true; } while ( spl!=NULL ) { /* Closepath does NOT set the current point */ /* Remember we reverse PostScript */ if ( spl->last==spl->first && spl->first->next!=NULL && spl->first->next->knownlinear ) startstop[1] = spl->first->next->to->me; else startstop[1] = spl->last->me; spl = spl->next; } } } return( startstop ); } #endif /* FONTFORGE_CONFIG_PS_REFS_GET_SUBRS */ int SFOneWidth(SplineFont *sf) { int width, i; width = -2; for ( i=0; iglyphcnt; ++i ) if ( SCWorthOutputting(sf->glyphs[i]) && (strcmp(sf->glyphs[i]->name,".notdef")!=0 || sf->glyphs[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->glyphs[i]->width; else if ( width!=sf->glyphs[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; iglyphcnt; ++i ) if ( SCWorthOutputting(sf->glyphs[i]) && strcmp(sf->glyphs[i]->name,".null")!=0 && strcmp(sf->glyphs[i]->name,"nonmarkingreturn")!=0 && (strcmp(sf->glyphs[i]->name,".notdef")!=0 || sf->glyphs[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->glyphs[i]->width; else if ( width!=sf->glyphs[i]->width ) { width = -1; break; } } ++k; } while ( k<_sf->subfontcnt ); return(width); } /* ************************************************************************** */ /* ********************** Type2 PostScript CharStrings ********************** */ /* ************************************************************************** */ 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, factor; unsigned char *str; if ( gb->pt+5>=gb->end ) GrowBuffer(gb); pos = rint(65536*pos)/65536; if ( round ) pos = rint(pos); str = gb->pt; if ( pos>32767.99 || pos<-32768 ) { /* same logic for big ints and reals */ if ( pos>0x3fffffff || pos<-0x40000000 ) { LogError( _("Number out of range: %g in type2 output (must be [-65536,65535])\n"), pos ); if ( pos>0 ) pos = 0x3fffffff; else pos = -0x40000000; } for ( factor=2; factor<32768; factor<<=2 ) if ( pos/factor<32767.99 && pos/factor>-32768 ) break; AddNumber2(gb,pos/factor,false); AddNumber2(gb,factor,false); if ( gb->pt+2>=gb->end ) GrowBuffer(gb); *(gb->pt++) = 0x0c; /* Multiply operator */ *(gb->pt++) = 0x18; } else if ( pos!=floor(pos )) { val = pos*65536; *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, int break_subr ) { /* 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 || hdb->noconflicts || hdb->skiphm ) return( false ); if ( memcmp(hdb->mask,*to->hintmask,(hdb->cnt+7)/8)==0 ) return( false ); if ( break_subr ) BreakSubroutine(gb,hdb); AddMask2(gb,*to->hintmask,hdb->cnt,19); /* hintmask */ memcpy(hdb->mask,*to->hintmask,sizeof(HintMask)); hdb->donefirsthm = true; if ( break_subr ) StartNextSubroutine(gb,hdb); 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); BreakSubroutine(gb,hdb); HintSetup2(gb,hdb,to,false); tom = &to->me; if ( round ) { temp.x = rint(tom->x); temp.y = rint(tom->y); tom = &temp; } 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.x = rint(32768*tom->x)/32768; hdb->current.y = rint(32768*tom->y)/32768; StartNextSubroutine(gb,hdb); } 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; lastgood = NULL; for ( test=spline, cnt=0; test->knownlinear && cnt<15; ) { ++cnt; lastgood = test; test = test->to->next; /* it will be smaller to use a closepath operator so ignore the */ /* ultimate spline */ if ( test==done || test==NULL || test->to->next==done ) break; } HintSetup2(gb,hdb,spline->to,true); 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.x = rint(32768*tom->x)/32768; hdb->current.y = rint(32768*tom->y)/32768; 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.x = rint(32768*tom->x)/32768; hdb->current.y = rint(32768*tom->y)/32768; 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; DBasePoint start; int donehm; HintSetup2(gb,hdb,spline->to,true); 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,true); 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.x = rint(32768*end->x)/32768; hdb->current.y = rint(32768*end->y)/32768; } static void CvtPsSplineSet2(GrowBuf *gb, SplinePointList *spl, struct hintdb *hdb, int is_order2,int round ) { Spline *spline, *first; SplinePointList temp, *freeme = NULL; int unhinted = true;; if ( is_order2 ) freeme = spl = SplineSetsPSApprox(spl); for ( ; spl!=NULL; spl = spl->next ) { first = NULL; SplineSetReverse(spl); /* PostScript and TrueType store their splines in in reverse */ /* orientations. Annoying. Oh well. I shall adopt TrueType and */ /* If I reverse the PS 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 */ if ( spl->first->hintmask==NULL || spl->first->next->to->hintmask!=NULL ) { /* But we can't rotate it if we expect it to provide us with */ /* a hintmask. */ temp = *spl; temp.first = temp.last = spl->first->next->to; spl = &temp; } if ( spl->first->flexy || spl->first->flexx ) { /* If we couldn't rotate, or if we rotated to something that */ /* also is flexible, then just turn off flex. That's safe */ spl->first->flexx = spl->first->flexy = false; } } if ( unhinted && hdb->cnt>0 && spl->first->hintmask!=NULL ) { hdb->mask[0] = ~(*spl->first->hintmask)[0]; /* Make it different */ unhinted = false; } moveto2(gb,hdb,spl->first,round); for ( spline = spl->first->next; spline!=NULL && spline!=first; ) { if ( first==NULL ) first = spline; else if ( first->from==spline->to ) hdb->skiphm = true; 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->to == spl->first ) /* In Type2 we don't even need a closepath to finish this off */ /* (which is good, because there isn't a close path) */ break; else if ( spline->knownlinear ) spline = lineto2(gb,hdb,spline,first,round); else spline = curveto2(gb,hdb,spline,first,round); } hdb->skiphm = false; /* No closepath oper in type2 fonts, it's implied */ SplineSetReverse(spl); /* Of course, I have to Reverse again to get back to my convention after*/ /* saving */ } SplinePointListsFree(freeme); } bool equalWithTolerence( real a, real b, real tolerence ) { // printf("equalWithTolerence(1) a:%f b:%f tol:%f\n", a, b, tolerence ); // printf("equalWithTolerence(2) a:%lf b:%lf tol:%lf\n", a, b, tolerence ); if( tolerence == 0.0 ) return a == b; return( (b - tolerence < a) && (b + tolerence > a )); } 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 && h->hintnumber!=-1 ) { /* Type2 hints do not support negative widths except in the case of */ /* ghost (now called edge) hints */ if ( cnt>24-2 ) { /* 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 ( equalWithTolerence( h->width, 20, GenerateHintWidthEqualityTolerance )) { AddNumber2(gb,myround2(h->start,round)-last+20,round); AddNumber2(gb,-20,round); cur = myround2(h->start,round); } else { AddNumber2(gb,myround2(h->start+21,round)-last,round); AddNumber2(gb,-21,round); cur = myround2(h->start+21,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 DumpRefsHints(GrowBuf *gb, struct hintdb *hdb,RefChar *cur,StemInfo *h,StemInfo *v, BasePoint *trans, int round,int layer) { uint8 masks[12]; int cnt, sets=0; StemInfo *rs; /* trans has already been rounded (whole char is translated by an integral amount) */ /* If we have a subroutine containing conflicts, then its hints will match*/ /* ours exactly, and we can use its hintmasks directly */ if (( cur->sc->hconflicts || cur->sc->vconflicts ) && cur->sc->layers[layer].splines!=NULL && cur->sc->layers[layer].splines->first->hintmask!=NULL ) { AddMask2(gb,*cur->sc->layers[layer].splines->first->hintmask,hdb->cnt,19); /* hintmask */ hdb->donefirsthm = true; memcpy(hdb->mask,*cur->sc->layers[layer].splines->first->hintmask,sizeof(HintMask)); return; } if ( h==NULL && v==NULL ) IError("hintmask invoked when there are no hints"); memset(masks,'\0',sizeof(masks)); cnt = 0; while ( h!=NULL && h->hintnumber>=0 ) { /* Horizontal stems are defined by vertical bounds */ real pos = (round ? rint(h->start) : h->start) - trans->y; for ( rs = cur->sc->hstem; rs!=NULL; rs=rs->next ) { real rpos = round ? rint(rs->start) : rs->start; if ( rpos==pos && (round ? (rint(rs->width)==rint(h->width)) : (rs->width==h->width)) ) { masks[h->hintnumber>>3] |= 0x80>>(h->hintnumber&7); ++sets; break; } else if ( rpos>pos ) break; } h = h->next; ++cnt; } while ( v!=NULL && v->hintnumber>=0 ) { real pos = (round ? rint(v->start) : v->start) - trans->x; for ( rs = cur->sc->vstem; rs!=NULL; rs=rs->next ) { real rpos = round ? rint(rs->start) : rs->start; if ( rpos==pos && (round ? (rint(rs->width)==rint(v->width)) : (rs->width==v->width)) ) { masks[v->hintnumber>>3] |= 0x80>>(v->hintnumber&7); ++sets; break; } else if ( rpos>pos ) break; } v = v->next; ++cnt; } BreakSubroutine(gb,hdb); hdb->donefirsthm = true; /* if ( sets!=0 ) */ /* First ref will need a hintmask even if it has no hints (if there are conflicts) */ AddMask2(gb,masks,cnt,19); /* hintmask */ } static void DummyHintmask(GrowBuf *gb,struct hintdb *hdb) { HintMask hm; memset(hm,0,sizeof(hm)); if ( hdb->cnt!=0 ) { BreakSubroutine(gb,hdb); hdb->donefirsthm = true; AddMask2(gb,hm,hdb->cnt,19); /* hintmask */ } } static void SetTransformedHintMask(GrowBuf *gb,struct hintdb *hdb, SplineChar *sc, RefChar *ref, BasePoint *trans, int round) { HintMask hm; if ( HintMaskFromTransformedRef(ref,trans,sc,&hm)!=NULL ) { BreakSubroutine(gb,hdb); hdb->donefirsthm = true; AddMask2(gb,hm,hdb->cnt,19); /* hintmask */ } else if ( !hdb->donefirsthm ) DummyHintmask(gb,hdb); } static void ExpandRef2(GrowBuf *gb, SplineChar *sc, struct hintdb *hdb, RefChar *r, BasePoint *trans, struct pschars *subrs, int round,int layer) { BasePoint *bpt; BasePoint temp, rtrans; GlyphInfo *gi; /* The only refs I deal with here have no hint conflicts within them */ rtrans.x = r->transform[4]+trans->x; rtrans.y = r->transform[5]+trans->y; if ( round ) { rtrans.x = rint(rtrans.x); rtrans.y = rint(rtrans.y); } BreakSubroutine(gb,hdb); if ( hdb->cnt>0 && !hdb->noconflicts ) DumpRefsHints(gb,hdb,r,sc->hstem,sc->vstem,&rtrans,round,layer); /* 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 = hdb->gi->psubrs[r->sc->lsidebearing].startstop; temp.x = bpt[0].x+rtrans.x; temp.y = bpt[0].y+rtrans.y; if ( hdb->current.x!=temp.x ) AddNumber2(gb,temp.x-hdb->current.x,round); if ( hdb->current.y!=temp.y || hdb->current.x==temp.x ) AddNumber2(gb,temp.y-hdb->current.y,round); if ( gb->pt+1>=gb->end ) GrowBuffer(gb); *gb->pt++ = hdb->current.x==temp.x?4: /* vmoveto */ hdb->current.y==temp.y?22: /* hmoveto */ 21; /* rmoveto */ if ( r->sc->lsidebearing==0x7fff ) IError("Attempt to reference an unreferenceable glyph %s", r->sc->name ); gi = hdb->gi; StartNextSubroutine(gb,hdb); gi->bits[gi->bcnt].psub_index = r->sc->lsidebearing; ++gi->bcnt; gi->justbroken = true; hdb->current.x = bpt[1].x+rtrans.x; hdb->current.y = bpt[1].y+rtrans.y; } static void RSC2PS2(GrowBuf *gb, SplineChar *base,SplineChar *rsc, struct hintdb *hdb, BasePoint *trans, struct pschars *subrs, int flags, int layer ) { BasePoint subtrans; int stationary = trans->x==0 && trans->y==0; RefChar *r, *unsafe=NULL; int unsafecnt=0, allwithouthints=true; int round = (flags&ps_flag_round)? true : false; StemInfo *oldh, *oldv; int hc, vc; SplineSet *freeme, *temp; int wasntconflicted = hdb->noconflicts; if ( flags&ps_flag_nohints ) { oldh = rsc->hstem; oldv = rsc->vstem; hc = rsc->hconflicts; vc = rsc->vconflicts; rsc->hstem = NULL; rsc->vstem = NULL; rsc->hconflicts = false; rsc->vconflicts = false; } else { for ( r=rsc->layers[layer].refs; r!=NULL; r=r->next ) { /* Ensure hintmask on refs are set correctly */ if (SCNeedsSubsPts(r->sc, ff_otf, layer)) SCFigureHintMasks(r->sc, layer); if ( !r->justtranslated ) continue; if ( r->sc->hconflicts || r->sc->vconflicts ) { ++unsafecnt; unsafe = r; } else if ( r->sc->hstem!=NULL || r->sc->vstem!=NULL ) allwithouthints = false; } if ( !stationary ) allwithouthints = false; if ( allwithouthints && unsafe!=NULL && hdb->cnt!=NumberHints(&unsafe->sc,1)) allwithouthints = false; /* There are other hints elsewhere in the base glyph */ } if ( unsafe && allwithouthints ) { if ( unsafe->sc->lsidebearing!=0x7fff ) { ExpandRef2(gb,base,hdb,unsafe,trans,subrs,round,layer); } else if ( unsafe->transform[4]==0 && unsafe->transform[5]==0 ) RSC2PS2(gb,base,unsafe->sc,hdb,trans,subrs,flags,layer); else unsafe = NULL; } else unsafe = NULL; /* What is the hintmask state here? It should not matter */ freeme = NULL; temp = rsc->layers[layer].splines; if ( base!=rsc ) temp = freeme = SPLCopyTranslatedHintMasks(temp,base,rsc,trans); CvtPsSplineSet2(gb,temp,hdb,rsc->layers[layer].order2,round); SplinePointListsFree(freeme); for ( r = rsc->layers[layer].refs; r!=NULL; r = r->next ) if ( r!=unsafe ) { if ( !r->justtranslated ) { if ( !r->sc->hconflicts && !r->sc->vconflicts && !hdb->noconflicts && r->transform[1]==0 && r->transform[2]==0 && r->transform[0]>0 && r->transform[3]>0 ) SetTransformedHintMask(gb,hdb,base,r,trans,round); if ( !hdb->donefirsthm ) DummyHintmask(gb,hdb); temp = SPLCopyTransformedHintMasks(r,base,trans,layer); CvtPsSplineSet2(gb,temp,hdb,rsc->layers[layer].order2,round); SplinePointListsFree(temp); } else if ( r->sc->lsidebearing!=0x7fff && ((flags&ps_flag_nohints) || (!r->sc->hconflicts && !r->sc->vconflicts)) ) { ExpandRef2(gb,base,hdb,r,trans,subrs,round,layer); } else { subtrans.x = trans->x + r->transform[4]; subtrans.y = trans->y + r->transform[5]; if ( !hdb->noconflicts && !r->sc->hconflicts && !r->sc->vconflicts) { SetTransformedHintMask(gb,hdb,base,r,trans,round); hdb->noconflicts = true; } RSC2PS2(gb,base,r->sc,hdb,&subtrans,subrs,flags,layer); hdb->noconflicts = wasntconflicted; } } if ( flags&ps_flag_nohints ) { rsc->hstem = oldh; rsc->vstem = oldv; rsc->hconflicts = hc; rsc->vconflicts = vc; } } static unsigned char *SplineChar2PS2(SplineChar *sc,int *len, int nomwid, int defwid, struct pschars *subrs, int flags, GlyphInfo *gi) { GrowBuf gb; unsigned char *ret; struct hintdb hdb; StemInfo *oldh, *oldv; int hc, vc; SplineChar *scs[MmMax]; int round = (flags&ps_flag_round)? true : false; HintMask *hm = NULL; BasePoint trans; if ( autohint_before_generate && sc->changedsincelasthinted && !sc->manualhints && !(flags&ps_flag_nohints)) SplineCharAutoHint(sc,gi->layer,NULL); if ( !(flags&ps_flag_nohints) && SCNeedsSubsPts(sc,ff_otf,gi->layer)) SCFigureHintMasks(sc,gi->layer); 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; } else if ( sc->layers[gi->layer].splines!=NULL && !sc->vconflicts && !sc->hconflicts ) { hm = sc->layers[gi->layer].splines->first->hintmask; sc->layers[gi->layer].splines->first->hintmask = NULL; } memset(&gb,'\0',sizeof(gb)); GrowBuffer(&gb); /* 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); memset(&trans,'\0',sizeof(trans)); memset(&hdb,'\0',sizeof(hdb)); hdb.scs = scs; hdb.gi = gi; if ( gi!=NULL ) gi->bcnt = -1; scs[0] = sc; hdb.noconflicts = !sc->hconflicts && !sc->vconflicts; hdb.cnt = NumberHints(hdb.scs,1); DumpHints(&gb,sc->hstem,sc->hconflicts || sc->vconflicts?18:1, sc->hconflicts || sc->vconflicts?18:1,round); DumpHints(&gb,sc->vstem,sc->hconflicts || sc->vconflicts?-1:3, sc->hconflicts || sc->vconflicts?23:3,round); CounterHints2(&gb, sc, hdb.cnt ); RSC2PS2(&gb,sc,sc,&hdb,&trans,subrs,flags,gi->layer); if ( gi->bcnt==-1 ) { /* If it's whitespace */ gi->bcnt = 0; StartNextSubroutine(&gb,&hdb); } BreakSubroutine(&gb,&hdb); MoveSubrsToChar(gi); ret = NULL; free(gb.base); if ( flags&ps_flag_nohints ) { sc->hstem = oldh; sc->vstem = oldv; sc->hconflicts = hc; sc->vconflicts = vc; } else if ( hm!=NULL ) sc->layers[gi->layer].splines->first->hintmask = hm; return( ret ); } static SplinePoint *LineTo(SplinePoint *last, int x, int y) { SplinePoint *sp = SplinePointCreate(x,y); SplineMake3(last,sp); return( sp ); } static void Type2NotDefSplines(SplineFont *sf,SplineChar *sc,int layer) { /* I'd always assumed that Type2 notdefs would look like type1 notdefs */ /* but they don't, they look like truetype notdefs. And Ralf Stubner */ /* points out that the spec says they should. So make a box here */ int stem, ymax; SplineSet *inner, *ss; StemInfo *h, *hints; stem = (sf->ascent+sf->descent)/20; ymax = 2*sf->ascent/3; ss = chunkalloc(sizeof(SplineSet)); ss->first = ss->last = SplinePointCreate(stem,0); ss->last = LineTo(ss->last,stem,ymax); ss->last = LineTo(ss->last,sc->width-stem,ymax); ss->last = LineTo(ss->last,sc->width-stem,0); SplineMake3(ss->last,ss->first); ss->last = ss->first; ss->next = inner = chunkalloc(sizeof(SplineSet)); inner->first = inner->last = SplinePointCreate(2*stem,stem); inner->last = LineTo(inner->last,sc->width-2*stem,stem); inner->last = LineTo(inner->last,sc->width-2*stem,ymax-stem); inner->last = LineTo(inner->last,2*stem,ymax-stem); SplineMake3(inner->last,inner->first); inner->last = inner->first; sc->layers[layer].splines = ss; hints = chunkalloc(sizeof(StemInfo)); hints->start = stem; hints->width = stem; hints->next = h = chunkalloc(sizeof(StemInfo)); h->start = sc->width-2*stem; h->width = stem; sc->vstem = hints; hints = chunkalloc(sizeof(StemInfo)); hints->start = 0; hints->width = stem; hints->next = h = chunkalloc(sizeof(StemInfo)); h->start = ymax-stem; h->width = stem; sc->hstem = hints; } #ifdef FONTFORGE_CONFIG_PS_REFS_GET_SUBRS /* 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[layer].refs; r!=NULL; r = r->next ) { if ( autohint_before_generate && r->sc!=NULL && r->sc->changedsincelasthinted && !r->sc->manualhints ) SplineCharAutoHint(r->sc,NULL); 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 ); } #endif /* FONTFORGE_CONFIG_PS_REFS_GET_SUBRS */ /* Mark those glyphs which can live totally in subrs */ static void SplineFont2FullSubrs2(int flags,GlyphInfo *gi) { int i; SplineChar *sc; #ifdef FONTFORGE_CONFIG_PS_REFS_GET_SUBRS int cc; RefChar *r; struct potentialsubrs *ps; SplineSet *spl; #endif /* FONTFORGE_CONFIG_PS_REFS_GET_SUBRS */ if ( !autohint_before_generate && !(flags&ps_flag_nohints)) SplineFontAutoHintRefs(gi->sf,gi->layer); for ( i=0; iglyphcnt; ++i ) if ( (sc=gi->gb[i].sc)!=NULL ) sc->lsidebearing = 0x7fff; /* This code allows us to put whole glyphs into subroutines */ /* I found slight improvements in space on some fonts, and large increases */ /* in others. So I'm disabling it for now */ #ifdef FONTFORGE_CONFIG_PS_REFS_GET_SUBRS /* We don't allow refs to refs. It's too complex */ for ( i=0; iglyphcnt; ++i ) if ( (sc=gi->gb[i].sc)!=NULL ) { if ( SCWorthOutputting(sc) && (( sc->layers[layer].refs==NULL && sc->dependents!=NULL && ( (!sc->hconflicts && !sc->vconflicts) || Type2SpecialCase(sc)) ) )) { /* if the glyph is a single contour with no hintmasks then */ /* our single contour code will find it. If we do it here too */ /* we'll get a subr which points to another subr. Very dull and */ /* a waste of space */ cc = 0; for ( spl=sc->layers[layer].splines; spl!=NULL; spl=spl->next ) ++cc; for ( r= sc->layers[layer].refs; r!=NULL && cc<2 ; r=r->next ) { for ( spl=r->layers[0].splines; spl!=NULL; spl=spl->next ) ++cc; } if ( cc<2 ) continue; /* Put the */ /* character into a subr if it is referenced by other characters */ if ( gi->pcnt>=gi->pmax ) gi->psubrs = realloc(gi->psubrs,(gi->pmax+=gi->glyphcnt)*sizeof(struct potentialsubrs)); ps = &gi->psubrs[gi->pcnt]; memset(ps,0,sizeof(*ps)); /* set cnt to 0 */ ps->idx = gi->pcnt++; ps->full_glyph_index = i; sc->lsidebearing = gi->pcnt-1; ps->startstop = FigureStartStop(sc,gi); } } #endif /* FONTFORGE_CONFIG_PS_REFS_GET_SUBRS */ } struct pschars *SplineFont2ChrsSubrs2(SplineFont *sf, int nomwid, int defwid, const int *bygid, int cnt, int flags, struct pschars **_subrs, int layer) { struct pschars *subrs, *chrs; int i,j,k,scnt; SplineChar *sc; GlyphInfo gi; SplineChar dummynotdef; if ( !autohint_before_generate && !(flags&ps_flag_nohints)) SplineFontAutoHintRefs(sf,layer); memset(&gi,0,sizeof(gi)); memset(&gi.hashed,-1,sizeof(gi.hashed)); gi.instance_count = 1; gi.sf = sf; gi.layer = layer; gi.glyphcnt = cnt; gi.bygid = bygid; gi.gb = calloc(cnt,sizeof(struct glyphbits)); gi.pmax = 3*cnt; gi.psubrs = malloc(gi.pmax*sizeof(struct potentialsubrs)); for ( i=0; ilayer_cnt; dummynotdef.layers = calloc(sf->layer_cnt,sizeof(Layer)); dummynotdef.width = SFOneWidth(sf); if ( dummynotdef.width==-1 ) dummynotdef.width = (sf->ascent+sf->descent)/2; Type2NotDefSplines(sf,&dummynotdef,layer); } else if ( gid!=-1 ) sc = sf->glyphs[gid]; else continue; gi.gb[i].sc = sc; if ( autohint_before_generate && sc!=NULL && sc->changedsincelasthinted && !sc->manualhints && !(flags&ps_flag_nohints)) SplineCharAutoHint(sc,layer,NULL); sc->lsidebearing = 0x7fff; } MarkTranslationRefs(sf,layer); SplineFont2FullSubrs2(flags,&gi); for ( i=0; i(gi.psubrs[i].cnt*4)+gi.psubrs[i].len+1 ) gi.psubrs[i].idx = scnt++; else gi.psubrs[i].idx = -1; } subrs = calloc(1,sizeof(struct pschars)); subrs->cnt = scnt; subrs->next = scnt; subrs->lens = malloc(scnt*sizeof(int)); subrs->values = malloc(scnt*sizeof(unsigned char *)); subrs->bias = scnt<1240 ? 107 : scnt<33900 ? 1131 : 32768; for ( i=0; ilens[scnt] = gi.psubrs[i].len+1; subrs->values[scnt] = malloc(subrs->lens[scnt]); memcpy(subrs->values[scnt],gi.psubrs[i].data,gi.psubrs[i].len); subrs->values[scnt][gi.psubrs[i].len] = 11; /* Add a return to end of subr */ } } chrs = calloc(1,sizeof(struct pschars)); chrs->cnt = cnt; chrs->next = cnt; chrs->lens = malloc(cnt*sizeof(int)); chrs->values = malloc(cnt*sizeof(unsigned char *)); chrs->keys = malloc(cnt*sizeof(char *)); for ( i=0; isc==NULL ) continue; chrs->keys[i] = copy(gb->sc->name); for ( k=0; k<2; ++k ) if ( k!=0 || gb->sc->lsidebearing!=0x7fff ) { for ( j=0; jbcnt; ++j ) { if ( k!=0 || j!=0 ) len += gb->bits[j].dlen; if ( k==1 && gb->sc->lsidebearing!=0x7fff ) { int si = gi.psubrs[ gb->sc->lsidebearing ].idx; len += 1 + (si<=107 && si>=-107?1:si<=1131 && si>=-1131?2:si>=-32768 && si<32767?3:8); break; } if ( gi.psubrs[ gb->bits[j].psub_index ].idx==-1 ) len += gi.psubrs[ gb->bits[j].psub_index ].len; else { int si = gi.psubrs[ gb->bits[j].psub_index ].idx - subrs->bias; /* space for the number (subroutine index) */ if ( si>=-107 && si<=107 ) ++len; else if ( si>=-1131 && si<=1131 ) len += 2; else if ( si>=-32768 && si<=32767 ) len += 3; else len += 8; /* space for the subroutine operator */ ++len; } } if ( k==0 ) { int si = gi.psubrs[ gb->sc->lsidebearing ].idx; subrs->lens[si] = len+1; vals = subrs->values[si] = malloc(len+2); } else { chrs->lens[i] = len+1; vals = chrs->values[i] = malloc(len+2); /* space for endchar and a final NUL (which is really meaningless, but makes me feel better) */ } len = 0; for ( j=0; jbcnt; ++j ) { int si; if ( k!=0 || j!=0 ) { memcpy(vals+len,gb->bits[j].data,gb->bits[j].dlen); len += gb->bits[j].dlen; } si = 0x80000000; if ( k==1 && gb->sc->lsidebearing!=0x7fff ) si = gi.psubrs[ gb->sc->lsidebearing ].idx - subrs->bias; else if ( gi.psubrs[ gb->bits[j].psub_index ].idx==-1 ) { memcpy(vals+len,gi.psubrs[ gb->bits[j].psub_index ].data, gi.psubrs[ gb->bits[j].psub_index ].len); len += gi.psubrs[ gb->bits[j].psub_index ].len; } else si = gi.psubrs[ gb->bits[j].psub_index ].idx - subrs->bias; if ( si!=0x80000000 ) { /* space for the number (subroutine index) */ if ( si>=-107 && si<=107 ) vals[len++] = si+139; else if ( si>0 && si<=1131 ) { si-=108; vals[len++] = (si>>8)+247; vals[len++] = si&0xff; } else if ( si>=-1131 && si<0 ) { si=(-si)-108; vals[len++] = (si>>8)+251; vals[len++] = si&0xff; } else if ( si>=-32768 && si<=32767 ) { vals[len++] = 28; vals[len++] = (si>>8)&0xff; vals[len++] = si&0xff; } else { /* store as fixed point, then multiply by 64. Takes 8 bytes */ si *= (65536/64); vals[len++] = '\377'; vals[len++] = (si>>24)&0xff; vals[len++] = (si>>16)&0xff; vals[len++] = (si>>8)&0xff; vals[len++] = si&0xff; vals[len++] = 64 + 139; vals[len++] = 0xc; vals[len++] = 0x18; /* Multiply */ } /* space for the subroutine operator */ vals[len++] = 10; } if ( k==1 && gb->sc->lsidebearing!=0x7fff ) break; } if ( k==0 ) { vals[len++] = 11; /* return */ vals[len] = '\0'; } else { vals[len++] = 14; /* endchar */ vals[len] = '\0'; } } } GIFree(&gi,&dummynotdef); *_subrs = subrs; return( chrs ); } struct pschars *CID2ChrsSubrs2(SplineFont *cidmaster,struct fd2data *fds, int flags, struct pschars **_glbls, int layer) { struct pschars *chrs, *glbls; int i, j, cnt, cid, max, fd; int *scnts; 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. */ GlyphInfo gi; SplineChar dummynotdef; max = 0; for ( i=0; isubfontcnt; ++i ) { if ( maxsubfonts[i]->glyphcnt ) max = cidmaster->subfonts[i]->glyphcnt; MarkTranslationRefs(cidmaster->subfonts[i],layer); } cnt = 1; /* for .notdef */ for ( cid = 1; cidsubfontcnt; ++i ) { sf = cidmaster->subfonts[i]; if ( cidglyphcnt && (sc=sf->glyphs[cid])!=NULL ) { sc->ttf_glyph = -1; sc->lsidebearing = 0x7fff; if ( SCWorthOutputting(sc)) ++cnt; break; } } } memset(&gi,0,sizeof(gi)); memset(&gi.hashed,-1,sizeof(gi.hashed)); gi.instance_count = 1; gi.sf = sf; gi.glyphcnt = cnt; gi.bygid = NULL; gi.gb = calloc(cnt,sizeof(struct glyphbits)); gi.pmax = 3*cnt; gi.psubrs = malloc(gi.pmax*sizeof(struct potentialsubrs)); gi.layer = layer; for ( cid = cnt = 0; cidsubfontcnt; ++i ) { sf = cidmaster->subfonts[i]; if ( cidglyphcnt && SCWorthOutputting(sf->glyphs[cid]) ) break; } if ( cid!=0 && i==cidmaster->subfontcnt ) { sc=NULL; } else if ( i==cidmaster->subfontcnt ) { /* They didn't define CID 0 */ sc = &dummynotdef; /* Place it in the final subfont (which is what sf points to) */ memset(sc,0,sizeof(dummynotdef)); dummynotdef.name = ".notdef"; dummynotdef.parent = sf; dummynotdef.layer_cnt = layer+1; dummynotdef.layers = calloc(layer+1,sizeof(Layer)); dummynotdef.width = SFOneWidth(sf); if ( dummynotdef.width==-1 ) dummynotdef.width = (sf->ascent+sf->descent); Type2NotDefSplines(sf,&dummynotdef,layer); gi.gb[cnt].sc = sc; gi.gb[cnt].fd = i = cidmaster->subfontcnt-1; } else { gi.gb[cnt].sc = sc = sf->glyphs[cid]; gi.gb[cnt].fd = i; } if ( sc!=NULL ) { sc->lsidebearing = 0x7fff; gi.active = &gi.gb[cnt]; sc->ttf_glyph = cnt++; SplineChar2PS2(sc,NULL,fds[i].nomwid,fds[i].defwid,NULL,flags,&gi); } ff_progress_next(); } scnts = calloc( cidmaster->subfontcnt+1,sizeof(int)); for ( i=0; i(gi.psubrs[i].cnt*4)+gi.psubrs[i].len+1 ) gi.psubrs[i].idx = scnts[gi.psubrs[i].fd+1]++; } glbls = calloc(1,sizeof(struct pschars)); glbls->cnt = scnts[0]; glbls->next = scnts[0]; glbls->lens = malloc(scnts[0]*sizeof(int)); glbls->values = malloc(scnts[0]*sizeof(unsigned char *)); glbls->bias = scnts[0]<1240 ? 107 : scnts[0]<33900 ? 1131 : 32768; for ( fd=0; fdsubfontcnt; ++fd ) { fds[fd].subrs = calloc(1,sizeof(struct pschars)); fds[fd].subrs->cnt = scnts[fd+1]; fds[fd].subrs->next = scnts[fd+1]; fds[fd].subrs->lens = malloc(scnts[fd+1]*sizeof(int)); fds[fd].subrs->values = malloc(scnts[fd+1]*sizeof(unsigned char *)); fds[fd].subrs->bias = scnts[fd+1]<1240 ? 107 : scnts[fd+1]<33900 ? 1131 : 32768; } free( scnts); for ( i=0; ilens[scnt] = gi.psubrs[i].len+1; subrs->values[scnt] = malloc(subrs->lens[scnt]); memcpy(subrs->values[scnt],gi.psubrs[i].data,gi.psubrs[i].len); subrs->values[scnt][gi.psubrs[i].len] = 11; /* Add a return to end of subr */ } } chrs = calloc(1,sizeof(struct pschars)); chrs->cnt = cnt; chrs->next = cnt; chrs->lens = malloc(cnt*sizeof(int)); chrs->values = malloc(cnt*sizeof(unsigned char *)); chrs->keys = malloc(cnt*sizeof(char *)); for ( i=0; ikeys[i] = copy(gb->sc->name); for ( j=0; jbcnt; ++j ) { len += gb->bits[j].dlen; if ( gi.psubrs[ gb->bits[j].psub_index ].idx==-1 ) len += gi.psubrs[ gb->bits[j].psub_index ].len; else { struct pschars *subrs = gi.psubrs[gb->bits[j].psub_index].fd==-1 ? glbls : fds[gi.psubrs[gb->bits[j].psub_index].fd].subrs; int si = gi.psubrs[ gb->bits[j].psub_index ].idx - subrs->bias; /* space for the number (subroutine index) */ if ( si>=-107 && si<=107 ) ++len; else if ( si>=-1131 && si<=1131 ) len += 2; else if ( si>=-32768 && si<=32767 ) len += 3; else len += 8; /* space for the subroutine operator */ ++len; } } chrs->lens[i] = len+1; chrs->values[i] = malloc(len+2); /* space for endchar and a final NUL (which is really meaningless, but makes me feel better) */ len = 0; for ( j=0; jbcnt; ++j ) { memcpy(chrs->values[i]+len,gb->bits[j].data,gb->bits[j].dlen); len += gb->bits[j].dlen; if ( gi.psubrs[ gb->bits[j].psub_index ].idx==-1 ) { memcpy(chrs->values[i]+len,gi.psubrs[ gb->bits[j].psub_index ].data, gi.psubrs[ gb->bits[j].psub_index ].len); len += gi.psubrs[ gb->bits[j].psub_index ].len; } else { struct pschars *subrs = gi.psubrs[gb->bits[j].psub_index].fd==-1 ? glbls : fds[gi.psubrs[gb->bits[j].psub_index].fd].subrs; int si = gi.psubrs[ gb->bits[j].psub_index ].idx - subrs->bias; /* space for the number (subroutine index) */ if ( si>=-107 && si<=107 ) chrs->values[i][len++] = si+139; else if ( si>0 && si<=1131 ) { si-=108; chrs->values[i][len++] = (si>>8)+247; chrs->values[i][len++] = si&0xff; } else if ( si>=-1131 && si<0 ) { si=(-si)-108; chrs->values[i][len++] = (si>>8)+251; chrs->values[i][len++] = si&0xff; } else if ( si>=-32768 && si<=32767 ) { chrs->values[i][len++] = 28; chrs->values[i][len++] = (si>>8)&0xff; chrs->values[i][len++] = si&0xff; } else { /* store as fixed point, then multiply by 64. Takes 8 bytes */ si *= (65536/64); chrs->values[i][len++] = '\377'; chrs->values[i][len++] = (si>>24)&0xff; chrs->values[i][len++] = (si>>16)&0xff; chrs->values[i][len++] = (si>>8)&0xff; chrs->values[i][len++] = si&0xff; chrs->values[i][len++] = 64 + 139; chrs->values[i][len++] = 0xc; chrs->values[i][len++] = 0x18; /* Multiply */ } /* space for the subroutine operator */ if ( gi.psubrs[ gb->bits[j].psub_index ].fd==-1 ) { chrs->values[i][len++] = 29; } else chrs->values[i][len++] = 10; } } chrs->values[i][len++] = 14; /* endchar */ chrs->values[i][len] = '\0'; } GIFree(&gi,&dummynotdef); *_glbls = glbls; return( chrs ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/tables.h0000664000175000017500000000016213510660062016021 00000000000000/* Declarations for data tables */ extern const int amspua[], cns14pua[]; extern const char (*SaveTablesPref[]); dvisvgm-2.8.1/libs/ff-woff/fontforge/cvundoes.c0000664000175000017500000000344313510660062016375 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #include "psfont.h" #ifndef HAVE_EXECINFO_H // no backtrace available #else #include #endif /* ********************************* Undoes ********************************* */ int getAdobeEnc(const char *name) { int i; for ( i=0; i<256; ++i ) if ( strcmp(name,AdobeStandardEncoding[i])==0 ) break; if ( i==256 ) i = -1; return( i ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/sfd1.c0000664000175000017500000001244413510660062015405 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include "sfd1.h" /* This file contains the routines needed to process an old style sfd file and*/ /* convert it into the new format */ static void SFGuessScriptList(SplineFont1 *sf) { uint32 scripts[32], script; int i, scnt=0, j; for ( i=0; isf.glyphcnt; ++i ) if ( sf->sf.glyphs[i]!=NULL ) { script = SCScriptFromUnicode(sf->sf.glyphs[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->sf.cidmaster ) sf = (SplineFont1 *) sf->sf.cidmaster; else if ( sf->sf.mm!=NULL ) sf=(SplineFont1 *) sf->sf.mm->normal; if ( sf->script_lang!=NULL ) return; sf->script_lang = calloc(2,sizeof(struct script_record *)); sf->script_lang[0] = calloc(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 = malloc(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; } static int SLContains(struct script_record *sr, uint32 script, uint32 lang) { int i, j; if ( script==DEFAULT_SCRIPT || script == 0 ) return( true ); for ( i=0; sr[i].script!=0; ++i ) { if ( sr[i].script==script ) { if ( lang==0 ) return( true ); for ( j=0; sr[i].langs[j]!=0; ++j ) if ( sr[i].langs[j]==lang ) return( true ); return( false ); /* this script entry didn't contain the language. won't be any other scripts to check */ } } return( false ); /* Never found script */ } static int SFAddScriptLangIndex(SplineFont *_sf,uint32 script,uint32 lang) { int i; SplineFont1 *sf; if ( _sf->cidmaster ) _sf = _sf->cidmaster; else if ( _sf->mm!=NULL ) _sf=_sf->mm->normal; if ( _sf->sfd_version>=2 ) IError( "SFFindBiggestScriptLangIndex called with bad version number.\n" ); sf = (SplineFont1 *) _sf; if ( script==0 ) script=DEFAULT_SCRIPT; if ( lang==0 ) lang=DEFAULT_LANG; if ( sf->script_lang==NULL ) sf->script_lang = calloc(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 = realloc(sf->script_lang,(i+2)*sizeof(struct script_record *)); sf->script_lang[i] = calloc(2,sizeof(struct script_record)); sf->script_lang[i][0].script = script; sf->script_lang[i][0].langs = malloc(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 int SLCount(struct script_record *sr) { int sl_cnt = 0; int i,j; for ( i=0; sr[i].script!=0; ++i ) { for ( j=0; sr[i].langs[j]!=0; ++j ) ++sl_cnt; } return( sl_cnt ); } int SFFindBiggestScriptLangIndex(SplineFont *_sf,uint32 script,uint32 lang) { int i, best_sli= -1, best_cnt= -1, cnt; SplineFont1 *sf = (SplineFont1 *) _sf; if ( _sf->sfd_version>=2 ) IError( "SFFindBiggestScriptLangIndex called with bad version number.\n" ); if ( sf->script_lang==NULL ) SFGuessScriptList(sf); for ( i=0; sf->script_lang[i]!=NULL; ++i ) { if ( SLContains(sf->script_lang[i],script,lang)) { cnt = SLCount(sf->script_lang[i]); if ( cnt>best_cnt ) { best_sli = i; best_cnt = cnt; } } } if ( best_sli==-1 ) return( SFAddScriptLangIndex(_sf,script,lang) ); return( best_sli ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/tottfaat.c0000664000175000017500000024224213510660062016377 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #include "ttf.h" /* This file contains routines to create some of the Apple Advanced Typography Tables */ /* (or GX fonts) */ /* ************************************************************************** */ /* ************************* 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=-1; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { j = 0; for ( kp = sf->glyphs[at->gi.bygid[i]]->kerns; kp!=NULL; kp=kp->next ) if ( kp->off!=0 && kp->sc->ttf_glyph!=-1 && LookupHasDefault(kp->subtable->lookup )) ++cnt, ++j; if ( j>mh ) mh=j; j=0; for ( kp = sf->glyphs[at->gi.bygid[i]]->vkerns; kp!=NULL; kp=kp->next ) if ( kp->off!=0 && kp->sc->ttf_glyph!=-1 && LookupHasDefault(kp->subtable->lookup )) ++vcnt, ++j; if ( j>mv ) mv=j; } kcnt->cnt = cnt; kcnt->vcnt = vcnt; kcnt->mh = mh; kcnt->mv = mv; kcnt->hbreaks = kcnt->vbreaks = NULL; if ( cnt>=10000 ) { /* the sub-table size is 6*cnt+14 or so and needs to be less 65535 */ /* so break it up into little bits */ /* We might not need this when applemode is set because the subtable */ /* length is a long. BUT... there's a damn binsearch header with */ /* shorts in it still */ int b=0; kcnt->hbreaks = malloc((at->gi.gcnt+1)*sizeof(int)); cnt = 0; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { j = 0; for ( kp = sf->glyphs[at->gi.bygid[i]]->kerns; kp!=NULL; kp=kp->next ) if ( kp->off!=0 && LookupHasDefault(kp->subtable->lookup )) ++j; if ( (cnt+j)*6>64000L && cnt!=0 ) { kcnt->hbreaks[b++] = cnt; cnt = 0; } cnt += j; } kcnt->hbreaks[b++] = cnt; kcnt->hsubs = b; } else if ( cnt!=0 ) kcnt->hsubs = 1; else kcnt->hsubs = 0; if ( vcnt>=10000 ) { int b=0; kcnt->vbreaks = malloc((at->gi.gcnt+1)*sizeof(int)); vcnt = 0; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { j = 0; for ( kp = sf->glyphs[at->gi.bygid[i]]->vkerns; kp!=NULL; kp=kp->next ) if ( kp->off!=0 && LookupHasDefault(kp->subtable->lookup)) ++j; if ( (vcnt+j)*6>64000L && vcnt!=0 ) { kcnt->vbreaks[b++] = vcnt; vcnt = 0; } vcnt += j; } kcnt->vbreaks[b++] = vcnt; kcnt->vsubs = b; } else if ( vcnt!=0 ) kcnt->vsubs = 1; else kcnt->vsubs = 0; 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 ( LookupHasDefault(kc->subtable->lookup) ) ++kccnt; for ( kc=sf->vkerns; kc!=NULL; kc = kc->next ) if ( LookupHasDefault(kc->subtable->lookup) ) ++vkccnt; for ( sm=sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type == asm_kern ) ++ksm; } kcnt->kccnt = kccnt; kcnt->vkccnt = vkccnt; kcnt->ksm = ksm; return( kcnt->hsubs + kcnt->vsubs + kccnt + vkccnt + ksm ); } static void ttf_dumpsfkerns(struct alltabs *at, SplineFont *sf, int tupleIndex, int version) { struct kerncounts kcnt; int i, j, k, m, c, gid, tot, km; KernPair *kp; KernClass *kc; ASM *sm; uint16 *glnum, *offsets; int isv; int tupleMask = tupleIndex==-1 ? 0 : 0x2000; int b, bmax; int *breaks; int winfail=0; int subtableBeginPos,subtableEndPos; if ( CountKerns(at,sf,&kcnt)==0 ) return; if ( tupleIndex==-1 ) tupleIndex = 0; for ( isv=0; isv<2; ++isv ) { c = isv ? kcnt.vcnt : kcnt.cnt; bmax = isv ? kcnt.vsubs : kcnt.hsubs; breaks = isv ? kcnt.vbreaks : kcnt.hbreaks; if ( c!=0 ) { km = isv ? kcnt.mv : kcnt.mh; glnum = malloc(km*sizeof(uint16)); offsets = malloc(km*sizeof(uint16)); gid = 0; for ( b=0; bkern); if(version==0) fseek(at->kern,7*sizeof(uint16),SEEK_CUR); else fseek(at->kern,8*sizeof(uint16),SEEK_CUR); for ( tot = 0; gidgi.gcnt && totgi.bygid[gid]!=-1 ) { SplineChar *sc = sf->glyphs[at->gi.bygid[gid]]; // if requested, omit kern pairs with unmapped glyphs // (required for compatibility with non-OpenType-aware Windows applications) if( (at->gi.flags&ttf_flag_oldkernmappedonly) && (unsigned)(sc->unicodeenc)>0xFFFF ) continue; m = 0; for ( kp = isv ? sc->vkerns : sc->kerns; kp!=NULL; kp=kp->next ) { // if requested, omit kern pairs with unmapped glyphs // (required for compatibility with non-OpenType-aware Windows applications) if( (at->gi.flags&ttf_flag_oldkernmappedonly) && (unsigned)(kp->sc->unicodeenc)>0xFFFF ) continue; if ( kp->off!=0 && kp->sc->ttf_glyph!=-1 && LookupHasDefault(kp->subtable->lookup)) { /* 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; /* check if a pair will cause problems on Windows */ /* If the glyph is outside BMP, so either unicode >0xffff */ /* or -1. Cast to unsigned catches both */ if( (unsigned)(sf->glyphs[at->gi.bygid[gid]]->unicodeenc)>0xFFFF || (unsigned)(sf->glyphs[at->gi.bygid[glnum[j]]]->unicodeenc)>0xFFFF ) winfail++; } } for ( j=0; jkern,gid); putshort(at->kern,glnum[j]); putshort(at->kern,offsets[j]); } tot += m; } // now we can fill the subtable header c=tot; subtableEndPos=ftell(at->kern); fseek(at->kern,subtableBeginPos,SEEK_SET); if ( version==0 ) { putshort(at->kern,0); /* subtable version */ if ( c>10920 ) ff_post_error(_("Too many kern pairs"),_("The 'kern' table supports at most 10920 kern pairs in a subtable")); 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) */ tupleMask); putshort(at->kern,tupleIndex); } 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*(c-i)); fseek(at->kern,subtableEndPos,SEEK_SET); } free(offsets); free(glnum); } } free(kcnt.hbreaks); free(kcnt.vbreaks); if( winfail > 0 ) ff_post_error(_("Kerning is likely to fail on Windows"),_( "Note: On Windows many apps can have problems with this font's kerning, because %d of its glyph kern pairs cannot be mapped to unicode-BMP kern pairs (eg, they have a Unicode value of -1) To avoid this, go to Generate, Options, and check the \"Windows-compatible \'kern\'\" option."), winfail); if ( at->applemode ) for ( isv=0; isv<2; ++isv ) { for ( kc=isv ? sf->vkerns : sf->kerns; kc!=NULL; kc=kc->next ) if ( LookupHasDefault(kc->subtable->lookup) ) { /* If we are here, we must be using version 1 */ uint32 len_pos = ftell(at->kern), pos; uint16 *class1, *class2; int first_cnt = kc->first_cnt; /* OpenType fonts can actually have a set of glyphs in class[0] of*/ /* the first class. This happens when there are glyphs in the */ /* coverage table which are not in any of the classes. Otherwise */ /* class 0 is sort of useless in opentype */ if ( kc->firsts[0]!=NULL ) ++first_cnt; putlong(at->kern,0); /* subtable length */ putshort(at->kern,(isv?0x8002:2)| /* format 2, horizontal/vertical flags (coverage) */ tupleMask); putshort(at->kern,tupleIndex); 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 */ if ( kc->firsts[0]!=NULL ) { /* Create a dummy class to correspond to the mac's class 0 */ /* all entries will be 0 */ for ( i=0 ; isecond_cnt; ++i ) putshort(at->kern,0); } 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,true); 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,true); 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 ( at->applemode ) if ( kcnt.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 1, horizontal/vertical flags (coverage) */ tupleMask); putshort(at->kern,tupleIndex); 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); } } } void ttf_dumpkerns(struct alltabs *at, SplineFont *sf) { int i, mmcnt=0, sum; int version; MMSet *mm = at->dovariations ? sf->mm : NULL; struct kerncounts kcnt; int must_use_old_style = 0; if ( !at->applemode && (!at->opentypemode || (at->gi.flags&ttf_flag_oldkern)) ) { must_use_old_style = true; SFKernClassTempDecompose(sf,false); mm = NULL; } else { if ( mm!=NULL ) { for ( i=0; iinstance_count; ++i ) { mmcnt += CountKerns(at,mm->instances[i],&kcnt); free(kcnt.hbreaks); free(kcnt.vbreaks); } sf = mm->normal; } } sum = CountKerns(at,sf,&kcnt); free(kcnt.hbreaks); free(kcnt.vbreaks); if ( sum==0 && mmcnt==0 ) { if ( must_use_old_style ) SFKernCleanup(sf,false); return; } /* Old kerning format (version 0) uses 16 bit quantities */ /* Apple's new format (version 0x00010000) uses 32 bit quantities */ at->kern = tmpfile2(); if ( must_use_old_style || ( kcnt.kccnt==0 && kcnt.vkccnt==0 && kcnt.ksm==0 && mmcnt==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 */ /* If we might need to store tuple data, use the new format */ putshort(at->kern,0); /* version */ putshort(at->kern,sum); /* number of subtables */ version = 0; } else { putlong(at->kern,0x00010000); /* version */ putlong(at->kern,sum+mmcnt); /* number of subtables */ version = 1; } ttf_dumpsfkerns(at, sf, -1, version); if ( mm!=NULL ) { for ( i=0; iinstance_count; ++i ) ttf_dumpsfkerns(at, mm->instances[i], i, version); } if ( must_use_old_style ) SFKernCleanup(sf,false); 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 ) { if ( !sc->lig_caret_cnt_fixed ) { for ( j=pst->u.lcaret.cnt-1; j>=0 && pst->u.lcaret.carets[j]==0; --j ); if ( j==-1 ) pst = NULL; } else { if ( pst->u.lcaret.cnt==0 ) 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; SplineChar *sc; /* 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; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 && (pst = haslcaret(sc = sf->glyphs[at->gi.bygid[i]]))!=NULL ) { if ( k==1 ) tot = 0; else if ( k==2 ) { putshort(lcar,offset); offset += 2 + 2*LigCaretCnt(sc); } else if ( k==3 ) { putshort(lcar,LigCaretCnt(sc)); for ( l=0; lu.lcaret.cnt; ++l ) if ( pst->u.lcaret.carets[l]!=0 || sc->lig_caret_cnt_fixed ) putshort(lcar,pst->u.lcaret.carets[l]); } last = i; for ( j=i+1, ++tot; jgi.gcnt && at->gi.bygid[j]!=-1; ++j ) { if ( (pst = haslcaret(sc = sf->glyphs[at->gi.bygid[j]]))== NULL ) break; ++tot; last = j; if ( k==2 ) { putshort(lcar,offset); offset += 2 + 2*LigCaretCnt(sc); } else if ( k==3 ) { putshort(lcar,LigCaretCnt(sc)); for ( l=0; lu.lcaret.cnt; ++l ) if ( pst->u.lcaret.carets[l]!=0 || sc->lig_caret_cnt_fixed ) putshort(lcar,pst->u.lcaret.carets[l]); } } if ( k==1 ) { putshort(lcar,last); putshort(lcar,i); putshort(lcar,offset); offset += 2*tot; } ++seg_cnt; i = j-1; } if ( k==0 ) { if ( seg_cnt==0 ) return; lcar = tmpfile2(); 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+2+*/6*2 + seg_cnt*6 + 6 /* fake segment at end */; /* Offset relative to lookup table, not to lcar_start */ /* Or, that's true while we build the lookup table. Once we */ /* start working on the data offsets they are relative to */ /* lcar_start */ } else if ( k==1 ) { /* flag entry */ putshort(lcar,0xffff); putshort(lcar,0xffff); putshort(lcar,0); offset += 6; /* Now offsets are relative to lcar_start */ } } at->lcar = lcar; at->lcarlen = ftell(at->lcar); if ( at->lcarlen&2 ) putshort(at->lcar,0); } /* ************************************************************************** */ /* ************************* The 'morx' table ************************* */ /* ************************* (and 'feat') ************************* */ /* ************************************************************************** */ /* Each lookup gets its own subtable, so there may be multiple subtables */ /* with the same feature/setting. The subtables will be ordered the same */ /* way the lookups are, which might lead to awkwardness if there are many */ /* chains and the same feature occurs in several of them */ /* (only the default language will be used) */ struct feature { 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; unsigned int dummyOff: 1; uint8 subtable_type; int chain; int32 flag, offFlags; uint32 feature_start; uint32 feature_len; /* Does not include header yet */ struct feature *next; /* features in output order */ struct feature *nexttype; /* features in feature/setting order */ struct feature *nextsame; /* all features with the same feature/setting */ int setting_cnt, setting_index, real_index; }; static struct feature *featureFromSubtable(SplineFont *sf, struct lookup_subtable *sub ); static int PSTHasTag(PST *pst, 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,struct glyphinfo *gi) { int first, last, i, cnt; /* Mort tables just have a trimmed byte array for the classes */ for ( first=0; firstgcnt; ++first ) if ( gi->bygid[first]!=-1 && sf->glyphs[gi->bygid[first]]->lsidebearing!=1 ) break; for ( last=gi->gcnt-1; last>first; --last ) if ( gi->bygid[last]!=-1 && sf->glyphs[gi->bygid[last]]->lsidebearing!=1 ) break; cnt = last-first+1; putshort(temp,first); putshort(temp,cnt); for ( i=first; i<=last; ++i ) if ( gi->bygid[i]==-1 ) putc(1,temp); else putc(sf->glyphs[gi->bygid[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 struct feature *aat_dumpmorx_substitutions(struct alltabs *at, SplineFont *sf, FILE *temp, struct feature *features, struct lookup_subtable *sub) { int i, k, gcnt; SplineChar *sc, *msc, **glyphs; uint16 *maps; struct feature *cur; PST *pst; for ( k=0; k<2; ++k ) { gcnt = 0; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { sc = sf->glyphs[at->gi.bygid[i]]; for ( pst=sc->possub; pst!=NULL && pst->subtable!=sub; pst=pst->next ); if ( pst!=NULL ) { if ( k==1 ) { msc = SFGetChar(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 ) return( features ); glyphs = malloc((gcnt+1)*sizeof(SplineChar *)); maps = malloc((gcnt+1)*sizeof(uint16)); } else { glyphs[gcnt] = NULL; maps[gcnt] = 0; } } cur = featureFromSubtable(sf,sub); cur->next = features; cur->r2l = sub->lookup->lookup_flags&pst_r2l ? true : false; 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); return( features); } static LigList *LigListMatchSubtable(SplineFont *sf,LigList *ligs, struct lookup_subtable *sub) { LigList *l; for ( l=ligs; l!=NULL; l=l->next ) if ( l->lig->subtable==sub ) 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, struct lookup_subtable *sub, struct alltabs *at, SplineFont *sf, int ignoremarks) { LigList *l; struct splinecharlist *comp; uint16 *used = calloc(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->subtable==sub ) { 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; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { if ( IsMarkChar(sf->glyphs[at->gi.bygid[i]])) { anymarks = true; ++charcnt; used[i] = class; } } if ( anymarks ) ++class; } cglyphs = malloc((charcnt+1)*sizeof(SplineChar *)); map = malloc((charcnt+1)*sizeof(uint16)); j=0; for ( i=k=0; imaxp.numGlyphs; ++i ) if ( used[i] ) { j = at->gi.bygid[i]; if ( j!=-1 ) { cglyphs[k] = sf->glyphs[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 = malloc(state_max*sizeof(struct transition *)); states[0] = calloc(class,sizeof(struct transition)); /* Initial state */ states[1] = calloc(class,sizeof(struct transition)); /* other Initial state */ for ( i=0; i=state_max ) states = realloc(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++] = calloc(class,sizeof(struct transition)); for ( l=glyphs[i]->ligofme; l!=NULL; l=l->next ) if ( l->lig->subtable==sub ) { 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 = realloc(states,(state_max += 40)*sizeof(struct transition *)); last = state_cnt; states[state_cnt++] = calloc(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; imaxp.numGlyphs+1)*sizeof(SplineChar *)); for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->ticked = false; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 && !(sc=sf->glyphs[at->gi.bygid[i]])->ticked && (l = LigListMatchSubtable(sf,sc->ligofme,sub))!=NULL ) { int ignoremarks = sub->lookup->lookup_flags & pst_ignorecombiningmarks ? 1 : 0 ; for ( k=i, gcnt=0; kgi.gcnt; ++k ) if ( at->gi.bygid[k]!=-1 && (ssc=sf->glyphs[at->gi.bygid[k]])!=NULL && !ssc->ticked && LigListMatchSubtable(sf,ssc->ligofme,sub)) { glyphs[gcnt++] = ssc; ssc->ticked = true; } glyphs[gcnt] = NULL; cur = featureFromSubtable(sf,sub); cur->next = features; features = cur; cur->subtable_type = 2; /* ligature */ cur->feature_start = ftell(temp); morx_dumpLigaFeature(temp,glyphs,gcnt,sub,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 = sub->lookup->lookup_flags&pst_r2l ? true : false; } free(glyphs); return( features); } static void morx_dumpnestedsubs(FILE *temp,SplineFont *sf,OTLookup *otl,struct glyphinfo *gi) { int i, j, gcnt; PST *pst; SplineChar **glyphs, *sc; uint16 *map; struct lookup_subtable *sub = otl->subtables; /* Mac can't have more than one subtable/lookup */ for ( j=0; j<2; ++j ) { gcnt = 0; for ( i = 0; igcnt; ++i ) if ( gi->bygid[i]!=-1 ) { for ( pst=sf->glyphs[gi->bygid[i]]->possub; pst!=NULL && pst->subtable!=sub; pst=pst->next ); if ( pst!=NULL && pst->type==pst_substitution && (sc=SFGetChar(sf,-1,pst->u.subs.variant))!=NULL && sc->ttf_glyph!=-1 ) { if ( j ) { glyphs[gcnt] = sf->glyphs[gi->bygid[i]]; map[gcnt] = sc->ttf_glyph; } ++gcnt; } } if ( !j ) { glyphs = malloc((gcnt+1)*sizeof(SplineChar *)); map = malloc(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 = malloc((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 = SFGetChar(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; OTLookup **subslookups=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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[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 = SFGetChar(sf,-1,pt); *end = ch; if ( sc!=NULL ) { sc->lsidebearing = i; ++gcnt; } } } glyphs = malloc((gcnt+1)*sizeof(SplineChar *)); map = malloc((gcnt+1)*sizeof(uint16)); gcnt = 0; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 && sf->glyphs[at->gi.bygid[i]]->lsidebearing!=1 ) { glyphs[gcnt] = sf->glyphs[at->gi.bygid[i]]; map[gcnt++] = sf->glyphs[at->gi.bygid[i]]->lsidebearing; } glyphs[gcnt] = NULL; /* Give each subs tab an index into the mac's substitution lookups */ transdata = calloc(sm->state_cnt*sm->class_cnt,sizeof(struct transdata)); stcnt = 0; subslookups = NULL; subsins = NULL; if ( sm->type==asm_context ) { subslookups = malloc(2*sm->state_cnt*sm->class_cnt*sizeof(OTLookup)); 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_lookup!=NULL ) { for ( i=0; iu.context.mark_lookup ) break; if ( i==stcnt ) subslookups[stcnt++] = this->u.context.mark_lookup; transdata[j].mark_index = i; } if ( this->u.context.cur_lookup!=NULL ) { for ( i=0; iu.context.cur_lookup ) break; if ( i==stcnt ) subslookups[stcnt++] = this->u.context.cur_lookup; transdata[j].cur_index = i; } } } else if ( sm->type==asm_insert ) { subsins = malloc(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 = tmpfile2(); 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 = malloc(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,&at->gi); /* 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; igi); } free(subslookups); } else if ( sm->type==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) ) IError( "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,"kern-subtable")) 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; cur = featureFromSubtable(sf,sm->subtable); 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, struct lookup_subtable *sub) { ASM *sm; if ( FPSTisMacable(sf,sub->fpst)) { sm = ASMFromFPST(sf,sub->fpst,true); if ( sm!=NULL ) { features = aat_dumpmorx_asm(at,sf,temp,features,sm); ASMFree(sm); } } return( features ); } static int IsOtfArabicFormFeature(OTLookup *otl) { FeatureScriptLangList *fl; for ( fl=otl->features; fl!=NULL; fl=fl->next ) { if (( fl->featuretag == CHR('i','n','i','t') || fl->featuretag==CHR('m','e','d','i') || fl->featuretag==CHR('f','i','n','a') || fl->featuretag==CHR('i','s','o','l') ) && scriptsHaveDefault(fl->scripts)) return( true ); } return( false ); } static int HasCursiveConnectionSM(SplineFont *sf) { int featureType, featureSetting; uint32 tag; ASM *sm; if ( OTTagToMacFeature(CHR('i','s','o','l'),&featureType,&featureSetting) ) { tag = (featureType<<16) | featureSetting; for ( sm = sf->sm; sm!=NULL; sm=sm->next ) { if ( sm->subtable->lookup->features->featuretag==tag ) return( true ); } } for ( sm = sf->sm; sm!=NULL; sm=sm->next ) { if ( sm->subtable->lookup->features->featuretag==CHR('i','s','o','l') ) return( true ); } return( false ); } static uint32 *FormedScripts(SplineFont *sf) { OTLookup *otl; uint32 *ret = NULL; int scnt=0, smax=0; FeatureScriptLangList *fl; struct scriptlanglist *sl; int i; for ( otl= sf->gsub_lookups; otl!=NULL; otl=otl->next ) { if ( otl->lookup_type == gsub_single ) { for ( fl=otl->features; fl!=NULL; fl=fl->next ) { if ( fl->featuretag == CHR('i','n','i','t') || fl->featuretag==CHR('m','e','d','i') || fl->featuretag==CHR('f','i','n','a') || fl->featuretag==CHR('i','s','o','l') ) { for ( sl=fl->scripts; sl!=NULL; sl=sl->next ) { for ( i=0; ilang_cnt; ++i ) { if ( (ilangs[i] : sl->morelangs[i-MAX_LANG])==DEFAULT_LANG ) { if ( scnt<=smax ) ret = realloc(ret,(smax+=5)*sizeof(uint32)); ret[scnt++] = sl->script; } } } } } } } if ( scnt==0 ) return( NULL ); if ( scnt<=smax ) ret = realloc(ret,(smax+=1)*sizeof(uint32)); ret[scnt] = 0; return( ret ); } int Macable(SplineFont *sf, OTLookup *otl) { int ft, fs; FeatureScriptLangList *features; switch ( otl->lookup_type ) { /* These lookup types are mac only */ case kern_statemachine: case morx_indic: case morx_context: case morx_insert: return( true ); /* These lookup types or OpenType only */ case gsub_multiple: case gsub_alternate: case gpos_single: case gpos_cursive: case gpos_mark2base: case gpos_mark2ligature: case gpos_mark2mark: return( false ); /* These are OpenType only, but they might be convertable to a state */ /* machine */ case gsub_context: case gsub_contextchain: case gsub_reversecchain: case gpos_context: case gpos_contextchain: if ( sf==NULL || sf->sm!=NULL ) return( false ); /* Else fall through into the test on the feature tag */; /* These two can be expressed in both, and might be either */ case gsub_single: case gsub_ligature: case gpos_pair: for ( features = otl->features; features!=NULL; features = features->next ) { if ( features->ismac || OTTagToMacFeature(features->featuretag,&ft,&fs)) return( true ); } default:; } return( false ); } static struct feature *aat_dumpmorx_cvtopentypeforms(struct alltabs *at, SplineFont *sf, FILE *temp, struct feature *features) { ASM *sm; uint32 *scripts; int featureType, featureSetting; int i; OTLookup *otl; if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; else if ( sf->mm!=NULL ) sf=sf->mm->normal; for ( otl=sf->gsub_lookups; otl!=NULL; otl=otl->next ) if ( Macable(sf,otl) && otl->lookup_type==gsub_single && IsOtfArabicFormFeature(otl)) otl->ticked = true; if ( OTTagToMacFeature(CHR('i','s','o','l'),&featureType,&featureSetting) ) { scripts = FormedScripts(sf); for ( i=0; scripts[i]!=0; ++i ) { sm = ASMFromOpenTypeForms(sf,scripts[i]); if ( sm!=NULL ) { features = aat_dumpmorx_asm(at,sf,temp,features,sm); ASMFree(sf->sm); } } free(scripts); } return( features ); } static struct feature *featuresReverse(struct feature *features) { struct feature *p, *n; p = NULL; while ( features!=NULL ) { n = features->next; features->next = p; p = features; features = n; } return( p ); } 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 ) { return( features ); } all = malloc(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; inexttype = all[i+1]; all[cnt-1]->nexttype = NULL; features = all[0]; free( all ); return( features ); } static struct feature *AddExclusiveNoops(SplineFont *sf, struct feature *features) { struct feature *f, *n, *def, *p, *t; /* mutually exclusive features need to have a setting which does nothing */ for ( f=features; f!=NULL; f=n ) { n= f->nexttype; if ( f->mf!=NULL && f->mf->ismutex ) { def = NULL; for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->nexttype ) { if ( n->featureSetting==f->mf->default_setting ) def = n; } if ( def==NULL ) { t = chunkalloc(sizeof(struct feature)); *t = *f; t->feature_start = 0; t->feature_len=0; t->next = NULL; t->featureSetting = f->mf->default_setting; t->ms = FindMacSetting(sf,t->featureType,f->mf->default_setting,&t->sms); t->flag = 0; t->dummyOff = true; if ( f==features ) p = NULL; else for ( p=features; p->nexttype!=f; p=p->nexttype ); n = f; while ( n!=NULL && n->featureType==t->featureType && n->featureSettingfeatureSetting ) { p = n; n = n->nexttype; } t->nexttype = n; if ( p==NULL ) features = t; else p->nexttype = t; while ( n!=NULL && n->featureType==t->featureType ) n=n->nexttype; } } } return( features ); } static void SetExclusiveOffs(struct feature *features) { struct feature *f, *n; int offFlags; /* mutually exclusive features need to have a setting which does nothing */ for ( f=features; f!=NULL; f=n ) { n= f->nexttype; if ( f->mf!=NULL && f->mf->ismutex ) { offFlags=0; for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->nexttype ) { offFlags |= n->flag; } for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->nexttype ) n->offFlags = ~(offFlags&~n->flag); } } return; } 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 = at->next_strid; 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 */ /* WorldText doesn't exist any more. Perhaps the morx table needs to be */ /* sorted by feature id too? No, it can't be. Feature 0 must come last */ if ( feature==NULL ) return; fcnt = scnt = 0; for ( k=0; k<3; ++k ) { 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++); } for ( f=feature; f!=NULL; f=n ) { cnt=1; if ( k!=2 ) { p = f; for ( n=f->nexttype; n!=NULL && n->featureType==f->featureType; n = n->nexttype ) { if ( p->featureSetting!=n->featureSetting ) { ++cnt; p = n; } } } else { p = f; for ( n=f; n!=NULL && n->featureType==f->featureType; n = n->nexttype ) { 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 = tmpfile2(); at->feat_name = malloc((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; } } memset( &at->feat_name[fn],0,sizeof(struct feat_name)); at->next_strid = strid; at->featlen = ftell(at->feat); if ( at->featlen&2 ) putshort(at->feat,0); } static int featuresAssignFlagsChains(struct feature *features, struct feature *feature_by_type) { int bit, cnt, chain, fcnt, i, mybit; struct feature *f, *n, *p; uint16 chains_features[32]; uint32 chains_bitindex[32]; /* Index for bit of first setting of this feature */ if ( features==NULL ) return( 0 ); /* A feature may have several subtables which need not be contiguous in */ /* the feature list */ /* Indeed we could have a feature in several different chains */ /* Sigh */ /* we figure out how many possible settings there are for each feature */ /* and reserve that many bits for the feature in all chains in which it */ /* occurs */ /* Note that here we count dummy settings (they need turn off bits) */ /* so we use feature_by_type */ for ( f=feature_by_type; f!=NULL; f=n ) { cnt=0; p = NULL; for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->nexttype ) { if ( p==NULL || n->featureSetting != p->featureSetting ) { ++cnt; p = n; } n->setting_index = cnt-1; } for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->nexttype ) n->setting_cnt = cnt; } /* When we counted flags we need to count the dummy features for turning */ /* things off. Those features live in features_by_type. When we put */ /* things in chains we want only the meaningful features, and we want */ /* them to be properly ordered. That we get from the "features" list */ fcnt = 0; chain = 0; bit=0; for ( f=features; f!=NULL; f=f->next ) { for ( i=0; ifeatureType; ++i ); if ( i==fcnt ) { if ( bit+f->setting_cnt>=32 ) { ++chain; bit = 0; fcnt = 0; } chains_features[fcnt] = f->featureType; chains_bitindex[fcnt++] = bit; mybit = bit; bit += f->setting_cnt; } else mybit = chains_bitindex[i]; f->real_index = mybit+f->setting_index; f->flag = 1<real_index; if ( f->mf!=NULL && f->mf->ismutex ) { int off = (~((~0)<setting_cnt))<flag; f->offFlags = off; } else { if ( f->featureSetting&1 ) { for ( n=feature_by_type; n!=NULL && (n->featureType!=f->featureType || n->featureSetting!=f->featureSetting+1); n=n->next ); } else { for ( n=feature_by_type; n!=NULL && (n->featureType!=f->featureType || n->featureSetting!=f->featureSetting+1); n=n->next ); } if ( n!=NULL ) f->offFlags = 1<<(mybit+n->setting_index); else f->offFlags = ~0; } f->chain = chain; } return( chain+1 ); } static void morxDumpChain(struct alltabs *at,struct feature *features, struct feature *features_by_type, int chain, FILE *temp) { uint32 def_flags=0; struct feature *f, *n; uint32 chain_start, end; char *buf; int len, tot, fs_cnt, sub_cnt; struct feature *all[32]; int i,offFlags, last_ri=-1, last_f=-1, ri; memset(all,0,sizeof(all)); for ( f=features, fs_cnt=sub_cnt=0; f!=NULL; f=f->next ) { if ( f->chain==chain ) { if ( all[f->real_index]==NULL ) { int base = f->real_index-f->setting_index; /* Note we use features_by_type here. It will have the default*/ /* settings for features, and will be ordered nicely */ for ( n=features_by_type; n!=NULL; n=n->nexttype ) { if ( n->featureType==f->featureType && n->chain==chain ) { n->nextsame = all[base+n->setting_index]; all[base+n->setting_index] = n; if ( n->ms!=NULL && n->ms->initially_enabled ) def_flags |= n->flag; } } } ++sub_cnt; } } /* Chain header */ chain_start = ftell(at->morx); putlong(at->morx,def_flags); putlong(at->morx,0); /* Fix up length later */ putlong(at->morx,0); /* fix up feature count */ putlong(at->morx,sub_cnt); /* subtable cnt */ /* Features */ fs_cnt = 0; for ( i=0; i<32; ++i ) if ( all[i]!=NULL ) { putshort(at->morx,all[i]->featureType); putshort(at->morx,all[i]->featureSetting); if ( all[i]->dummyOff ) { putlong(at->morx,0); if ( last_f==all[i]->featureType ) ri = last_ri; else if ( i<31 && all[i+1]!=NULL && all[i+1]->featureType == all[i]->featureType ) ri = i+1 - all[i+1]->real_index; else ri = 0; /* This can't happen */ } else { putlong(at->morx,1<real_index; last_ri = ri; last_f = all[i]->featureType; } offFlags = all[i]->offFlags; if ( ri>0 ) offFlags<<=(ri); else if ( ri<0 ) offFlags>>=(-ri); putlong(at->morx,offFlags); ++fs_cnt; if ( all[i]->needsOff && (i==31 || all[i+1]==NULL || all[i+1]->featureType!=all[i]->featureType || all[i+1]->featureSetting!=all[i]->featureSetting+1 )) { putshort(at->morx,all[i]->featureType); putshort(at->morx,all[i]->featureSetting+1); putlong(at->morx,0); putlong(at->morx,all[i]->offFlags & ~all[i]->flag ); ++fs_cnt; } /* I used to have code to output the default setting of a mutex */ /* but I should already have put that in the feature list */ } /* The feature list of every chain must end with these two features */ 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 */ fs_cnt += 2; buf = malloc(16*1024); /* Subtables */ for ( f=features; f!=NULL; f=f->next ) if ( f->chain==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 ) { IError( "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); putlong(at->morx,fs_cnt); fseek(at->morx,0,SEEK_END); } void aat_dumpmorx(struct alltabs *at, SplineFont *sf) { FILE *temp = tmpfile2(); struct feature *features = NULL, *features_by_type; int nchains, i; OTLookup *otl; struct lookup_subtable *sub; /* Arabic Form features all need to be merged together and formed into */ /* a cursive connection state machine. So the first time we see one of */ /* we handle all of them. After that we ignore all of them. Note: if */ /* OpenType has them happening in different orders, that information */ /* will be lost. All will be processed at once. */ for ( otl = sf->gsub_lookups; otl!=NULL; otl=otl->next ) otl->ticked = false; SFLigaturePrepare(sf); /* Retain the same lookup ordering */ for ( otl = sf->gsub_lookups; otl!=NULL; otl=otl->next ) { if ( !Macable(sf,otl)) continue; if ( otl->lookup_type==gsub_single && IsOtfArabicFormFeature(otl) ) { if ( otl->ticked ) /* Already processed */; else if ( HasCursiveConnectionSM(sf) ) /* Skip the OpenType conversion and use the native state machine */; else features = aat_dumpmorx_cvtopentypeforms(at,sf,temp,features); } else { for ( sub=otl->subtables; sub!=NULL; sub=sub->next ) { switch ( otl->lookup_type ) { case gsub_single: features = aat_dumpmorx_substitutions(at,sf,temp,features,sub); break; case gsub_ligature: features = aat_dumpmorx_ligatures(at,sf,temp,features,sub); break; case morx_indic: case morx_context: case morx_insert: features = aat_dumpmorx_asm(at,sf,temp,features,sub->sm); break; default: if ( sf->sm==NULL ) features = aat_dumpmorx_cvtopentype(at,sf,temp,features,sub); } } } } SFLigatureCleanup(sf); if ( features==NULL ) { fclose(temp); return; } /* The features are in reverse execution order */ features = featuresReverse(features); /* But the feature table requires them in numeric order */ features_by_type = featuresOrderByType(features); features_by_type = AddExclusiveNoops(sf,features_by_type); aat_dumpfeat(at, sf, features_by_type); nchains = featuresAssignFlagsChains(features,features_by_type); SetExclusiveOffs(features_by_type); at->morx = tmpfile2(); putlong(at->morx,0x00020000); putlong(at->morx,nchains); 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 ( PSTHasTag(pst,CHR('l','f','b','d')) ) { *left = pst; if ( *right ) return( true ); } else if ( PSTHasTag(pst,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, 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 */ SplineChar *sc; for ( k=0; k<4; ++k ) { for ( i=seg_cnt=tot=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { l = 0; sc = _sf->glyphs[at->gi.bygid[i]]; if ( 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 */ } last = i; for ( j=i+1, ++tot; jgi.gcnt; ++j ) { if ( at->gi.bygid[i]==-1 || !haslrbounds(_sf->glyphs[at->gi.bygid[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,last); putshort(opbd,i); putshort(opbd,offset); offset += 2*tot; } ++seg_cnt; i = j-1; } } if ( k==0 ) { if ( seg_cnt==0 ) return; opbd = tmpfile2(); putlong(opbd, 0x00010000); /* version */ putshort(opbd,0); /* data are distances (not control 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 from start of lookup, not table */ offset = 6*2/* format, binsearch*/ + seg_cnt*6 +6 /*flag entry */; } 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,struct glyphinfo *gi) { uint16 *props; int i; SplineChar *sc, *bsc; int dir, isfloat, isbracket, offset, doit=false; AnchorPoint *ap; PST *pst; int p; props = calloc(gi->gcnt+1,sizeof(uint16)); props[gi->gcnt] = -1; for ( i=0; igcnt; ++i ) if ( (p = gi->bygid==NULL ? i : gi->bygid[i])!=-1 ) { sc = sf->glyphs[p]; if ( sc!=NULL && (gi->bygid==NULL || sc->ttf_glyph!=-1 )) { dir = 0; if ( sc->unicodeenc>=0x10300 && sc->unicodeenc<=0x103ff ) dir = 0; else if ( sc->unicodeenc>=0x10800 && sc->unicodeenc<=0x10fff ) 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 = SFGetChar(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 && PSTHasTag(pst,CHR('r','t','l','a')); pst=pst->next ); if ( pst!=NULL && pst->type==pst_substitution && (bsc=SFGetChar(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->gi); uint32 bin_srch_header; int i, j, cnt; if ( props==NULL ) return; at->prop = tmpfile2(); 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; igi.gcnt; ++i ) { while ( igi.gcnt && props[i]==0 ) ++i; /* skip default entries */ if ( i>=at->gi.gcnt ) break; for ( j=i+1; jgi.gcnt && 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); } /* ************************************************************************** */ /* ************************* The 'bsln' table ************************* */ /* ************************************************************************** */ static int BslnFromTag(uint32 tag) { switch ( tag ) { case CHR('r','o','m','n'): return( 0 ); /* Apple has a centered ideographic baseline, while OT has a top ideo bsln*/ /* no way to get Apple's baseline #1 */ case CHR('i','d','e','o'): return( 2 ); case CHR('h','a','n','g'): return( 3 ); case CHR('m','a','t','h'): return( 4 ); default: return( 0xffff ); } } int16 *PerGlyphDefBaseline(SplineFont *sf,int *def_baseline) { int16 *baselines = malloc(sf->glyphcnt*sizeof(int16)); int gid, bsln, i, any; SplineChar *sc; int counts[32]; /* Apple supports a max of 32 baselines, but only 5 are defined */ struct Base *base = sf->horiz_base; struct basescript *bs; int bestbsln, bestcnt; memset(counts,0,sizeof(counts)); for ( gid = 0; gidglyphcnt; ++gid ) if ( (sc = sf->glyphs[gid])!=NULL ) { uint32 script = SCScriptFromUnicode(sc); for ( bs= base->scripts; bs!=NULL; bs=bs->next ) if ( bs->script==script ) break; if ( bs==NULL ) bsln = 0xffff; else bsln = BslnFromTag( base->baseline_tags[bs->def_baseline] ); /* This if is duplicated (almost) in basedlg.c:Base_FinishEdit */ if ( bsln==0xffff ) { if ( script==CHR('k','a','n','a') || script==CHR('h','a','n','g') || script==CHR('h','a','n','i') || script==CHR('b','o','p','o') || script==CHR('j','a','m','o') || script==CHR('y','i',' ',' ')) bsln = 2; else if ( script==CHR('t','i','b','t' ) || script == CHR('b','e','n','g' ) || script == CHR('b','n','g','2') || script == CHR('d','e','v','a' ) || script == CHR('d','e','v','2') || script == CHR('g','u','j','r' ) || script == CHR('g','j','r','2') || script == CHR('g','u','r','u' ) || script == CHR('g','u','r','2') || script == CHR('k','n','d','a' ) || script == CHR('k','n','d','2') || script == CHR('m','l','y','m' ) || script == CHR('m','l','m','2') || script == CHR('o','r','y','a' ) || script == CHR('o','r','y','2') || script == CHR('t','a','m','l' ) || script == CHR('t','m','l','2') || script == CHR('t','e','l','u' ) || script == CHR('t','e','l','2')) bsln = 3; else if ( script==CHR('m','a','t','h') ) bsln = 4; else bsln = 0; } baselines[gid] = bsln; if ( bsln!=0xffff ) ++counts[bsln]; } bestbsln = 0; bestcnt = 0; any = 0; for ( i=0; i<32 ; ++i ) { if ( counts[i]>bestcnt ) { bestbsln = i; bestcnt = counts[i]; ++any; } } *def_baseline = bestbsln | (any<=1 ? 0x100 : 0 ); return( baselines ); } void FigureBaseOffsets(SplineFont *sf,int def_bsln,int offsets[32]) { struct Base *base = sf->horiz_base; struct basescript *bs = base->scripts; int i; memset( offsets,0xff,32*sizeof(int)); for ( i=0; ibaseline_cnt; ++i ) { int bsln = BslnFromTag(base->baseline_tags[i]); if ( bsln!=0xffff ) offsets[bsln] = bs->baseline_pos[i]; } if ( offsets[def_bsln]!=-1 ) { for ( i=0; i<32; ++i ) { if ( offsets[i]!=-1 ) offsets[i] -= offsets[def_bsln]; } } /* I suspect baseline 1 is the standard baseline for CJK glyphs on the mac*/ /* (because baseline 2 is often the same as baseline 1, which is wrong for 2) */ /* OT doesn't have a centered ideographic baseline, so guestimate */ /* And I don't want to base it on the actual ideo baseline (go up half an em?) */ /* because in my small sample of 'bsln' tables baseline 2 has been wrong */ /* most of the time, and it is wrong in the example in the docs. */ /* (I know it is wrong because it has the same value as baseline 1, but */ /* is supposed to be below baseline 1 ) */ if ( offsets[1]==-1 ) { if ( offsets[2]!=-1 ) offsets[1] = offsets[2]+(sf->ascent+sf->descent)/2; else offsets[1] = (sf->ascent+sf->descent)/2 - sf->descent; } for ( i=0; i<32; ++i ) if ( offsets[i]==-1 ) offsets[i] = 0; } void aat_dumpbsln(struct alltabs *at, SplineFont *sf) { int def_baseline; int offsets[32]; int16 *baselines; int i, gid, j, bsln, cnt; if ( sf->horiz_base==NULL || sf->horiz_base->baseline_cnt==0 || sf->horiz_base->scripts==NULL ) return; baselines = PerGlyphDefBaseline(sf,&def_baseline); at->bsln = tmpfile2(); putlong(at->bsln,0x00010000); /* Version */ if ( def_baseline & 0x100 ) /* Only one baseline in the font */ putshort(at->bsln,0); /* distanced based (no control point), no per-glyph info */ else putshort(at->bsln,1); /* distanced based (no cp info) with per-glyph info */ putshort(at->bsln,def_baseline&0x1f);/* Default baseline when no info specified for glyphs */ /* table of 32 int16 (the docs say uint16, but that must be wrong) giving */ /* the offset of the nth baseline from the default baseline. */ /* 0 => Roman, 1=> centered ideo, 2=>low ideo (same as OTF ideo) 3=>hang, 4=>Math */ /* values 5-31 undefined, set to 0 */ FigureBaseOffsets(sf,def_baseline&0x1f,offsets); for ( i=0; i<32; ++i ) putshort(at->bsln,offsets[i]); if ( !(def_baseline&0x100) ) { def_baseline &= 0x1f; putshort(at->bsln,2); /* Lookup format 2, segmented array w/ single value */ cnt = 0; for ( i=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 ) { if ( baselines[gid]!=-1 && baselines[gid]!=def_baseline ) { bsln = baselines[gid]; for ( j=i; jgi.gcnt && baselines[at->gi.bygid[i]]==bsln; ++j ); i = j-1; ++cnt; } } /* Dump out a binary search header */ putshort(at->bsln,6); /* size of each item */ putshort(at->bsln,cnt); /* number of items */ for ( j=1, i=0; cnt<=j; j<<=1, ++i ); putshort(at->bsln,6*j/2); /* j is a power of 2 too big */ putshort(at->bsln,i-1); putshort(at->bsln,6*(cnt-(j>>1)) ); for ( i=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 ) { if ( baselines[gid]!=-1 && baselines[gid]!=def_baseline ) { bsln = baselines[gid]; for ( j=i; jgi.gcnt && baselines[at->gi.bygid[i]]==bsln; ++j ); putshort(at->bsln,j-1); putshort(at->bsln,i); putshort(at->bsln,bsln); i = j-1; } } putshort(at->bsln,0xffff); /* Final eof marker */ putshort(at->bsln,0xffff); putshort(at->bsln,0x0000); } at->bslnlen = ftell(at->bsln); /* Only contains 2 & 4 byte quantities, can't have an odd number of bytes */ if ( at->bslnlen&2 ) putshort(at->bsln,0); free(baselines); } /* ************************************************************************** */ /* ************************* utility routines ************************* */ /* ************************************************************************** */ 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 = (tag >> 16); *featureSetting = (tag & 0xFFFF); /* Ranges taken from Apple Font Registry. An OT tag without a corresponding mac feature should fail this test.*/ if (*featureType >= 0 && *featureType < 105 && *featureSetting < 16) return ( true ); *featureType = 0; *featureSetting = 0; return( false ); } static struct feature *featureFromTag(SplineFont *sf, uint32 tag ) { int ft, fs; struct feature *feat; feat = chunkalloc(sizeof(struct feature)); if (OTTagToMacFeature(tag, &ft, &fs)) { feat->featureType = ft; feat->featureSetting = fs; 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 ); } static struct feature *featureFromSubtable(SplineFont *sf, struct lookup_subtable *sub ) { FeatureScriptLangList *fl; int ft, fs; for ( fl=sub->lookup->features; fl!=NULL; fl=fl->next ) { if ( fl->ismac ) break; } if ( fl==NULL ) { for ( fl=sub->lookup->features; fl!=NULL; fl=fl->next ) { if ( OTTagToMacFeature(fl->featuretag,&ft,&fs) ) break; } if ( fl==NULL ) { IError("Could not find a mac feature"); return NULL; } } return( featureFromTag(sf,fl->featuretag)); } static int PSTHasTag(PST *pst, uint32 tag) { FeatureScriptLangList *fl; if ( pst->subtable==NULL ) return( false ); for ( fl=pst->subtable->lookup->features; fl!=NULL; fl=fl->next ) if ( fl->featuretag == tag ) return( true ); return( false ); } int scriptsHaveDefault(struct scriptlanglist *sl) { int i; for ( ; sl!=NULL; sl=sl->next ) { for ( i=0; ilang_cnt; ++i ) { if ( (ilangs[i]==DEFAULT_LANG) || (i>=MAX_LANG && sl->morelangs[i-MAX_LANG]==DEFAULT_LANG)) { return( true ); } } } return( false ); } int LookupHasDefault(OTLookup *otl) { FeatureScriptLangList *feats; if ( otl->def_lang_checked ) return( otl->def_lang_found ); otl->def_lang_checked = true; for ( feats=otl->features; feats!=NULL; feats = feats->next ) { if ( scriptsHaveDefault(feats->scripts) ) { otl->def_lang_found = true; return( true ); } } otl->def_lang_found = false; return( false ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/edgelist.h0000664000175000017500000001223213510660062016350 00000000000000/* Copyright (C) 2000-2012 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; int layer; char *interesting; int major, other; unsigned int genmajoredges: 1; /* generate a list of edges parallel 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; DBounds bbox; /* Not always set. {m,o}{min,max} a provide scaled bbox, this is in glyph units */ } EdgeList; extern void FreeEdges(EdgeList *es); /* Version which is better for everything other than rasterization */ /* (I think) */ typedef struct edgeinfo { /* The spline is broken up at all extrema. 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 layer; 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 dvisvgm-2.8.1/libs/ff-woff/fontforge/macbinary.c0000664000175000017500000002047213510660062016515 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #if __Mac # include # include "carbon.h" #else #undef __Mac #define __Mac 0 #endif /* 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:// mirror.ctan.org/tools/macutils/crc */ /* MacBinary files use the same CRC that binhex does (in the MacBinary header) */ /* ******************************** Creation ******************************** */ struct resource { uint32 pos; uint8 flags; uint16 id; char *name; uint32 nameloc; uint32 nameptloc; }; enum psstyle_flags { psf_bold = 1, psf_italic = 2, psf_outline = 4, psf_shadow = 0x8, psf_condense = 0x10, psf_extend = 0x20 }; uint16 _MacStyleCode( const 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 ) LogError( _("Warning: %s(%s) is both extended and condensed. That's impossible.\n"), sf->fontname, sf->origname ); else LogError( _("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 ) { const char *styles; if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; if ( sf->macstyle!=-1 ) { if ( psstylecode!=NULL ) *psstylecode = (sf->macstyle&0x3)|((sf->macstyle&0x6c)>>1); return( sf->macstyle ); } styles = SFGetModifiers(sf); return( _MacStyleCode(styles,sf,psstylecode)); } /* ******************************** Reading ********************************* */ struct kerns { unsigned char ch1, ch2; short offset; /* 4.12 */ }; #if __Mac static SplineFont *HasResourceFork(char *filename,int flags,enum openflags openflags, SplineFont *into,EncMap *map) { /* 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)*/ SplineFont *ret; FILE *resfork; char *tempfn=filename, *pt, *lparen, *respath; if (( pt=strrchr(filename,'/'))==NULL ) pt = filename; if ( (lparen = strchr(pt,'('))!=NULL && strchr(lparen,')')!=NULL ) { tempfn = copy(filename); tempfn[lparen-filename] = '\0'; } respath = malloc(strlen(tempfn)+strlen("/..namedfork/rsrc")+1); strcpy(respath,tempfn); strcat(respath,"/..namedfork/rsrc"); resfork = fopen(respath,"r"); if ( resfork==NULL ) { strcpy(respath,tempfn); strcat(respath,"/rsrc"); resfork = fopen(respath,"r"); } free(respath); if ( tempfn!=filename ) free(tempfn); if ( resfork==NULL ) return( NULL ); ret = IsResourceFork(resfork,0,filename,flags,openflags,into,map); fclose(resfork); return( ret ); } #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/sfd.c0000664000175000017500000042341113510660062015324 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #include #ifndef NAME_MAX # ifndef _POSIX_NAME_MAX # define _POSIX_NAME_MAX 512 # endif # define NAME_MAX _POSIX_NAME_MAX #endif static const char *joins[] = { "miter", "round", "bevel", "inher", NULL }; static const char *caps[] = { "butt", "round", "square", "inher", NULL }; static const char *spreads[] = { "pad", "reflect", "repeat", NULL }; #define SFD_PTFLAG_TYPE_MASK 0x3 #define SFD_PTFLAG_IS_SELECTED 0x4 #define SFD_PTFLAG_NEXTCP_IS_DEFAULT 0x8 #define SFD_PTFLAG_PREVCP_IS_DEFAULT 0x10 #define SFD_PTFLAG_ROUND_IN_X 0x20 #define SFD_PTFLAG_ROUND_IN_Y 0x40 #define SFD_PTFLAG_INTERPOLATE 0x80 #define SFD_PTFLAG_INTERPOLATE_NEVER 0x100 #define SFD_PTFLAG_PREV_EXTREMA_MARKED_ACCEPTABLE 0x200 #define SFD_PTFLAG_FORCE_OPEN_PATH 0x400 /* I will retain this list in case there are still some really old sfd files */ /* including numeric encodings. This table maps them to string encodings */ 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", "ams", NULL }; /* sfdir files and extensions */ #define FONT_PROPS "font.props" #define STRIKE_PROPS "strike.props" #define EXT_CHAR '.' #define GLYPH_EXT ".glyph" #define BITMAP_EXT ".bitmap" #define STRIKE_EXT ".strike" #define SUBFONT_EXT ".subfont" #define INSTANCE_EXT ".instance" 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 const char *end_tt_instrs = "EndTTInstrs"; static RefChar *SFDGetRef(FILE *sfd, int was_enc); static AnchorPoint *SFDReadAnchorPoints(FILE *sfd,SplineChar *sc,AnchorPoint** alist, AnchorPoint *lastap); static StemInfo *SFDReadHints(FILE *sfd); static DStemInfo *SFDReadDHints( SplineFont *sf,FILE *sfd,int old ); extern uint8 *_IVParse(SplineFont *sf, char *text, int *len, void (*IVError)(void *,char *, int), void *iv); static int PeekMatch(FILE *stream, const char * target) { // This returns 1 if target matches the next characters in the stream. int pos1 = 0; int lastread = getc(stream); while (target[pos1] != '\0' && lastread != EOF && lastread == target[pos1]) { pos1 ++; lastread = getc(stream); } int rewind_amount = pos1 + ((lastread == EOF) ? 0 : 1); fseek(stream, -rewind_amount, SEEK_CUR); return (target[pos1] == '\0'); } /* Long lines can be broken by inserting \\\n (backslash newline) */ /* into the line. I don't think this is ever ambiguous as I don't */ /* think a line can end with backslash */ /* UPDATE: it can... that's handled in getquotedeol() below. */ static int nlgetc(FILE *sfd) { int ch, ch2; ch=getc(sfd); if ( ch!='\\' ) return( ch ); ch2 = getc(sfd); if ( ch2=='\n' ) return( nlgetc(sfd)); ungetc(ch2,sfd); return( ch ); } static char *SFDReadUTF7Str(FILE *sfd) { char *buffer = NULL, *pt, *end = NULL; int ch1, ch2, ch3, ch4, done, c; int prev_cnt=0, prev=0, in=0; ch1 = nlgetc(sfd); while ( isspace(ch1) && ch1!='\n' && ch1!='\r') ch1 = nlgetc(sfd); if ( ch1=='\n' || ch1=='\r' ) ungetc(ch1,sfd); if ( ch1!='"' ) return( NULL ); pt = 0; while ( (ch1=nlgetc(sfd))!=EOF && ch1!='"' ) { done = 0; if ( !done && !in ) { if ( ch1=='+' ) { ch1 = nlgetc(sfd); if ( ch1=='-' ) { ch1 = '+'; done = true; } else { in = true; prev_cnt = 0; } } else done = true; } if ( !done ) { if ( ch1=='-' ) { in = false; } else if ( inbase64[ch1]==-1 ) { in = false; done = true; } else { ch1 = inbase64[ch1]; ch2 = inbase64[c = nlgetc(sfd)]; if ( ch2==-1 ) { ungetc(c, sfd); ch2 = ch3 = ch4 = 0; } else { ch3 = inbase64[c = nlgetc(sfd)]; if ( ch3==-1 ) { ungetc(c, sfd); ch3 = ch4 = 0; } else { ch4 = inbase64[c = nlgetc(sfd)]; if ( ch4==-1 ) { ungetc(c, sfd); ch4 = 0; } } } ch1 = (ch1<<18) | (ch2<<12) | (ch3<<6) | ch4; if ( prev_cnt==0 ) { prev = ch1&0xff; ch1 >>= 8; prev_cnt = 1; } else /* if ( prev_cnt == 1 ) */ { ch1 |= (prev<<24); prev = (ch1&0xffff); ch1 = (ch1>>16)&0xffff; prev_cnt = 2; } done = true; } } if ( pt+10>=end ) { if ( buffer==NULL ) { pt = buffer = malloc(400); end = buffer+400; } else if (pt) { char *temp = realloc(buffer,end-buffer+400); pt = temp+(pt-buffer); end = temp+(end-buffer+400); buffer = temp; } } if ( pt && done ) pt = utf8_idpb(pt,ch1,0); if ( prev_cnt==2 ) { prev_cnt = 0; if ( pt && prev!=0 ) pt = utf8_idpb(pt,prev,0); } if ( pt==0 ) { free(buffer); return( NULL ); } } if ( buffer==NULL ) return( NULL ); *pt = '\0'; pt = copy(buffer); free(buffer ); return( pt ); } struct enc85 { FILE *sfd; unsigned char sofar[4]; int pos; int ccnt; }; static void *SFDUnPickle(FILE *sfd, int python_data_has_lists) { int ch, quoted; static int max = 0; static char *buf = NULL; char *pt, *end; int cnt; pt = buf; end = buf+max; while ( (ch=nlgetc(sfd))!='"' && ch!='\n' && ch!=EOF ); if ( ch!='"' ) return( NULL ); quoted = false; while ( ((ch=nlgetc(sfd))!='"' || quoted) && ch!=EOF ) { if ( !quoted && ch=='\\' ) quoted = true; else { if ( pt>=end ) { cnt = pt-buf; buf = realloc(buf,(max+=200)+1); pt = buf+cnt; end = buf+max; } *pt++ = ch; quoted = false; } } if ( pt==buf ) return( NULL ); *pt='\0'; #ifdef _NO_PYTHON return( copy(buf)); #else return( PyFF_UnPickleMeToObjects(buf)); #endif /* buf is a static buffer, I don't free it, I'll reuse it next time */ } /* ********************************* INPUT ********************************** */ #include "sfd1.h" char *getquotedeol(FILE *sfd) { char *pt, *str, *end; int ch; pt = str = malloc(101); end = str+100; while ( isspace(ch = nlgetc(sfd)) && ch!='\r' && ch!='\n' ); while ( ch!='\n' && ch!='\r' && ch!=EOF ) { if ( ch=='\\' ) { /* We can't use nlgetc() here, because it would misinterpret */ /* double backslash at the end of line. Multiline strings, */ /* broken with backslash + newline, are just handled above. */ ch = getc(sfd); if ( ch=='n' ) ch='\n'; /* else if ( ch=='\\' ) ch=='\\'; */ /* second backslash of '\\' */ /* FontForge doesn't write other escape sequences in this context. */ /* So any other value of ch is assumed impossible. */ } if ( pt>=end ) { pt = realloc(str,end-str+101); end = pt+(end-str)+100; str = pt; pt = end-100; } *pt++ = ch; ch = nlgetc(sfd); } *pt='\0'; /* these strings should be in utf8 now, but some old sfd files might have */ /* latin1. Not a severe problems because they SHOULD be in ASCII. So any */ /* non-ascii strings are erroneous anyway */ if ( !utf8_valid(str) ) { pt = latin1_2_utf8_copy(str); free(str); str = pt; } return( str ); } static int geteol(FILE *sfd, char *tokbuf) { char *pt=tokbuf, *end = tokbuf+2000-2; int ch; while ( isspace(ch = nlgetc(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 SFDGetType1(FILE *sfd) { /* 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 = malloc(len); sc->ttf_instrs_len = len; for ( i=0; ittf_instrs[i] = Dec85(&dec); } static void tterr(void *UNUSED(rubbish), char *message, int UNUSED(pos)) { LogError(_("When loading tt instrs from sfd: %s\n"), message ); } static void SFDGetTtInstrs(FILE *sfd, SplineChar *sc) { /* We've read the TtInstr token, it is followed by text versions of */ /* the instructions, slurp it all into a big buffer, and then parse that */ char *buf=NULL, *pt=buf, *end=buf; int ch; int backlen = strlen(end_tt_instrs); int instr_len; while ( (ch=nlgetc(sfd))!=EOF ) { if ( pt>=end ) { char *newbuf = realloc(buf,(end-buf+200)); pt = newbuf+(pt-buf); end = newbuf+(end+200-buf); buf = newbuf; } *pt++ = ch; if ( pt-buf>backlen && strncmp(pt-backlen,end_tt_instrs,backlen)==0 ) { pt -= backlen; break; } } *pt = '\0'; sc->ttf_instrs = _IVParse(sc->parent,buf,&instr_len,tterr,NULL); sc->ttf_instrs_len = instr_len; free(buf); } static struct ttf_table *SFDGetTtfTable(FILE *sfd, SplineFont *sf,struct ttf_table *lasttab[2]) { /* 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; int which; struct enc85 dec; struct ttf_table *tab = chunkalloc(sizeof(struct ttf_table)); memset(&dec,'\0', sizeof(dec)); dec.pos = -1; dec.sfd = sfd; tab->tag = gettag(sfd); if ( tab->tag==CHR('f','p','g','m') || tab->tag==CHR('p','r','e','p') || tab->tag==CHR('c','v','t',' ') || tab->tag==CHR('m','a','x','p')) which = 0; else which = 1; getint(sfd,&len); tab->data = malloc(len); tab->len = len; for ( i=0; idata[i] = Dec85(&dec); if ( lasttab[which]!=NULL ) lasttab[which]->next = tab; else if ( which==0 ) sf->ttf_tables = tab; else sf->ttf_tab_saved = tab; lasttab[which] = tab; return( tab ); } static struct ttf_table *SFDGetShortTable(FILE *sfd, SplineFont *sf,struct ttf_table *lasttab[2]) { /* We've read the ShortTable token, it is followed by a tag and a word count */ /* and then the (text) values of the words that make up the cvt table */ int i,len, ch; uint8 *pt; int which, iscvt, started; struct ttf_table *tab = chunkalloc(sizeof(struct ttf_table)); tab->tag = gettag(sfd); if ( tab->tag==CHR('f','p','g','m') || tab->tag==CHR('p','r','e','p') || tab->tag==CHR('c','v','t',' ') || tab->tag==CHR('m','a','x','p')) which = 0; else which = 1; iscvt = tab->tag==CHR('c','v','t',' '); getint(sfd,&len); pt = tab->data = malloc(2*len); tab->len = 2*len; started = false; for ( i=0; i>8; *pt++ = num&0xff; if ( iscvt ) { ch = nlgetc(sfd); if ( ch==' ' ) { if ( !started ) { sf->cvt_names = calloc(len+1,sizeof(char *)); sf->cvt_names[len] = END_CVT_NAMES; started = true; } sf->cvt_names[i] = SFDReadUTF7Str(sfd); } else ungetc(ch,sfd); } } if ( lasttab[which]!=NULL ) lasttab[which]->next = tab; else if ( which==0 ) sf->ttf_tables = tab; else sf->ttf_tab_saved = tab; lasttab[which] = tab; return( tab ); } static struct ttf_table *SFDGetTtTable(FILE *sfd, SplineFont *sf,struct ttf_table *lasttab[2]) { /* We've read the TtTable token, it is followed by a tag */ /* and then the instructions in text format */ int ch; int which; struct ttf_table *tab = chunkalloc(sizeof(struct ttf_table)); char *buf=NULL, *pt=buf, *end=buf; int backlen = strlen(end_tt_instrs); tab->tag = gettag(sfd); if ( tab->tag==CHR('f','p','g','m') || tab->tag==CHR('p','r','e','p') || tab->tag==CHR('c','v','t',' ') || tab->tag==CHR('m','a','x','p')) which = 0; else which = 1; while ( (ch=nlgetc(sfd))!=EOF ) { if ( pt>=end ) { char *newbuf = realloc(buf,(end-buf+200)); pt = newbuf+(pt-buf); end = newbuf+(end+200-buf); buf = newbuf; } *pt++ = ch; if ( pt-buf>backlen && strncmp(pt-backlen,end_tt_instrs,backlen)==0 ) { pt -= backlen; break; } } *pt = '\0'; tab->data = _IVParse(sf,buf,(int*)&tab->len,tterr,NULL); free(buf); if ( lasttab[which]!=NULL ) lasttab[which]->next = tab; else if ( which==0 ) sf->ttf_tables = tab; else sf->ttf_tab_saved = tab; lasttab[which] = 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 = oldlast->noprevcp; oldlast->prev->from->next = NULL; spl->last = oldlast->prev->from; chunkfree(oldlast->prev,sizeof(*oldlast)); chunkfree(oldlast->hintmask,sizeof(HintMask)); 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)); for (;;) { ch = nlgetc(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 void SFDGetSpiros(FILE *sfd,SplineSet *cur) { int ch; spiro_cp cp; ch = nlgetc(sfd); /* S */ ch = nlgetc(sfd); /* p */ ch = nlgetc(sfd); /* i */ ch = nlgetc(sfd); /* r */ ch = nlgetc(sfd); /* o */ while ( fscanf(sfd,"%lg %lg %c", &cp.x, &cp.y, &cp.ty )==3 ) { if ( cur!=NULL ) { if ( cur->spiro_cnt>=cur->spiro_max ) cur->spiros = realloc(cur->spiros,(cur->spiro_max+=10)*sizeof(spiro_cp)); cur->spiros[cur->spiro_cnt++] = cp; } } if ( cur!=NULL && (cur->spiros[cur->spiro_cnt-1].ty&0x7f)!=SPIRO_END ) { if ( cur->spiro_cnt>=cur->spiro_max ) cur->spiros = realloc(cur->spiros,(cur->spiro_max+=1)*sizeof(spiro_cp)); memset(&cur->spiros[cur->spiro_cnt],0,sizeof(spiro_cp)); cur->spiros[cur->spiro_cnt++].ty = SPIRO_END; } ch = nlgetc(sfd); if ( ch=='E' ) { ch = nlgetc(sfd); /* n */ ch = nlgetc(sfd); /* d */ ch = nlgetc(sfd); /* S */ ch = nlgetc(sfd); /* p */ ch = nlgetc(sfd); /* i */ ch = nlgetc(sfd); /* r */ ch = nlgetc(sfd); /* o */ } else ungetc(ch,sfd); } static SplineSet *SFDGetSplineSet(FILE *sfd,int order2) { SplinePointList *cur=NULL, *head=NULL; BasePoint current; real stack[100]; int sp=0; SplinePoint *pt = NULL; int ch; int ch2; char tok[100]; int ttfindex = 0; int lastacceptable; current.x = current.y = 0; lastacceptable = 0; while ( 1 ) { int have_read_val = 0; int val = 0; while ( getreal(sfd,&stack[sp])==1 ) if ( sp<99 ) ++sp; while ( isspace(ch=nlgetc(sfd))); if ( ch=='E' || ch=='e' || ch==EOF ) break; if ( ch=='S' ) { ungetc(ch,sfd); SFDGetSpiros(sfd,cur); continue; } else if (( ch=='N' ) && nlgetc(sfd)=='a' && /* a */ nlgetc(sfd)=='m' && /* m */ nlgetc(sfd)=='e' && /* e */ nlgetc(sfd)=='d' ) /* d */ { ch2 = nlgetc(sfd); /* : */ // We are either fetching a splineset name (Named:) or a point name (NamedP:). if (ch2=='P') { if ((nlgetc(sfd)==':') && (pt!=NULL)) { if (pt->name!=NULL) {free(pt->name);} pt->name = SFDReadUTF7Str(sfd); } } else if (ch2==':') { if (cur != NULL) cur->contour_name = SFDReadUTF7Str(sfd); else { char * freetmp = SFDReadUTF7Str(sfd); free(freetmp); freetmp = NULL; } } continue; } else if ( ch=='P' && PeekMatch(sfd,"ath") ) { int flags; nlgetc(sfd); /* a */ nlgetc(sfd); /* t */ nlgetc(sfd); /* h */ if (PeekMatch(sfd,"Flags:")) { nlgetc(sfd); /* F */ nlgetc(sfd); /* l */ nlgetc(sfd); /* a */ nlgetc(sfd); /* g */ nlgetc(sfd); /* s */ nlgetc(sfd); /* : */ getint(sfd,&flags); if (cur != NULL) cur->is_clip_path = flags&1; } else if (PeekMatch(sfd,"Start:")) { nlgetc(sfd); /* S */ nlgetc(sfd); /* t */ nlgetc(sfd); /* a */ nlgetc(sfd); /* r */ nlgetc(sfd); /* t */ nlgetc(sfd); /* : */ getint(sfd,&flags); if (cur != NULL) cur->start_offset = flags; } } 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; spl->start_offset = 0; if ( cur!=NULL ) { if ( SFDCloseCheck(cur,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,order2); cur->last->nonextcp = 1; pt->noprevcp = 1; cur->last = pt; } } } else sp = 0; } else if ( ch=='c' ) { if ( sp>=6 ) { getint(sfd,&val); have_read_val = 1; current.x = stack[sp-2]; current.y = stack[sp-1]; real original_current_x = current.x; if( val & SFD_PTFLAG_FORCE_OPEN_PATH ) { // Find somewhere vacant to put the point.x for now // we need to do this check in case we choose a point that is already // on the spline and this connect back to that point instead of creating // an open path while( 1 ) { real offset = 0.1; current.x += offset; if( !cur || !SplinePointListContainsPointAtX( cur, current.x )) { break; } } } 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,order2); cur->last = pt; // pt->me is a copy of 'current' so we should now move // the x coord of pt->me back to where it should be. // The whole aim here is that this spline remains an open path // when PTFLAG_FORCE_OPEN_PATH is set. pt->me.x = original_current_x; } // Move the point back to the same location it was // but do not connect it back to the point that is // already there. if( val & SFD_PTFLAG_FORCE_OPEN_PATH ) { current.x = original_current_x; } sp -= 6; } else sp = 0; } if ( pt!=NULL ) { if( !have_read_val ) getint(sfd,&val); pt->pointtype = (val & SFD_PTFLAG_TYPE_MASK); pt->selected = (val & SFD_PTFLAG_IS_SELECTED) > 0; pt->nextcpdef = (val & SFD_PTFLAG_NEXTCP_IS_DEFAULT) > 0; pt->prevcpdef = (val & SFD_PTFLAG_PREVCP_IS_DEFAULT) > 0; pt->roundx = (val & SFD_PTFLAG_ROUND_IN_X) > 0; pt->roundy = (val & SFD_PTFLAG_ROUND_IN_Y) > 0; pt->dontinterpolate = (val & SFD_PTFLAG_INTERPOLATE_NEVER) > 0; if ( pt->prev!=NULL ) pt->prev->acceptableextrema = (val & SFD_PTFLAG_PREV_EXTREMA_MARKED_ACCEPTABLE) > 0; else lastacceptable = (val & SFD_PTFLAG_PREV_EXTREMA_MARKED_ACCEPTABLE) > 0; if ( val&0x80 ) pt->ttfindex = 0xffff; else pt->ttfindex = ttfindex++; pt->nextcpindex = 0xfffe; ch = nlgetc(sfd); if ( ch=='x' ) { pt->hintmask = chunkalloc(sizeof(HintMask)); SFDGetHintMask(sfd,pt->hintmask); } else if ( ch!=',' ) ungetc(ch,sfd); else { ch = nlgetc(sfd); if ( ch==',' ) pt->ttfindex = 0xfffe; else { ungetc(ch,sfd); getint(sfd,&val); pt->ttfindex = val; nlgetc(sfd); /* skip comma */ if ( val!=-1 ) ttfindex = val+1; } ch = nlgetc(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,order2); if ( lastacceptable && cur->last->prev!=NULL ) cur->last->prev->acceptableextrema = true; 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, *mdhead=NULL; 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 = calloc(pt,sizeof(SplinePoint *)); } last = NULL; for ( ch=nlgetc(sfd); ch!=EOF && ch!='\n'; ch=nlgetc(sfd)) { err = false; while ( isspace(ch) && ch!='\n' ) ch=nlgetc(sfd); if ( ch=='\n' ) break; md = chunkalloc(sizeof(MinimumDistance)); if ( ch=='x' ) md->x = true; getint(sfd,&val); if ( val<-1 || val>=pt ) { IError( "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 = nlgetc(sfd); if ( ch!=',' ) { IError( "Minimum Distance lacks a comma where expected\n" ); err = true; } getint(sfd,&val); if ( val<-1 || val>=pt ) { IError( "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 ) last->next = md; last = md; } else chunkfree(md,sizeof(MinimumDistance)); } free(mapping); /* Obsolete concept */ MinimumDistancesFree(mdhead); } static HintInstance *SFDReadHintInstances(FILE *sfd, StemInfo *stem) { HintInstance *head=NULL, *last=NULL, *cur; real begin, end; int ch; while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); if ( ch=='G' && stem != NULL ) { stem->ghost = true; while ( (ch=nlgetc(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=nlgetc(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( SplineFont *sf,FILE *sfd,int old ) { DStemInfo *head=NULL, *last=NULL, *cur; int i; BasePoint bp[4], *bpref[4], left, right, unit; double rstartoff, rendoff, lendoff; if ( old ) { for ( i=0 ; i<4 ; i++ ) bpref[i] = &bp[i]; while ( getreal( sfd,&bp[0].x ) && getreal( sfd,&bp[0].y ) && getreal( sfd,&bp[1].x ) && getreal( sfd,&bp[1].y ) && getreal( sfd,&bp[2].x ) && getreal( sfd,&bp[2].y ) && getreal( sfd,&bp[3].x ) && getreal( sfd,&bp[3].y )) { /* Ensure point coordinates specified in the sfd file do */ /* form a diagonal line */ if ( PointsDiagonalable( sf,bpref,&unit )) { cur = chunkalloc( sizeof( DStemInfo )); cur->left = *bpref[0]; cur->right = *bpref[1]; cur->unit = unit; /* Generate a temporary hint instance, so that the hint can */ /* be visible in charview even if subsequent rebuilding instances */ /* fails (e. g. for composite characters) */ cur->where = chunkalloc( sizeof( HintInstance )); rstartoff = ( cur->right.x - cur->left.x ) * cur->unit.x + ( cur->right.y - cur->left.y ) * cur->unit.y; rendoff = ( bpref[2]->x - cur->left.x ) * cur->unit.x + ( bpref[2]->y - cur->left.y ) * cur->unit.y; lendoff = ( bpref[3]->x - cur->left.x ) * cur->unit.x + ( bpref[3]->y - cur->left.y ) * cur->unit.y; cur->where->begin = ( rstartoff > 0 ) ? rstartoff : 0; cur->where->end = ( rendoff > lendoff ) ? lendoff : rendoff; MergeDStemInfo( sf,&head,cur ); } } } else { while ( getreal( sfd,&left.x ) && getreal( sfd,&left.y ) && getreal( sfd,&right.x ) && getreal( sfd,&right.y ) && getreal( sfd,&unit.x ) && getreal( sfd,&unit.y )) { cur = chunkalloc( sizeof( DStemInfo )); cur->left = left; cur->right = right; cur->unit = unit; cur->where = SFDReadHintInstances( sfd,NULL ); if ( head == NULL ) head = cur; else last->next = cur; last = cur; } } return( head ); } static DeviceTable *SFDReadDeviceTable(FILE *sfd,DeviceTable *adjust) { int i, junk, first, last, ch, len; while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='{' ) { while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='}' ) return(NULL); else ungetc(ch,sfd); getint(sfd,&first); ch = nlgetc(sfd); /* Should be '-' */ getint(sfd,&last); len = last-first+1; if ( len<=0 ) { IError( "Bad device table, invalid length.\n" ); return(NULL); } if ( adjust==NULL ) adjust = chunkalloc(sizeof(DeviceTable)); adjust->first_pixel_size = first; adjust->last_pixel_size = last; adjust->corrections = malloc(len); for ( i=0; icorrections[i] = junk; } while ( (ch=nlgetc(sfd))==' ' ); if ( ch!='}' ) ungetc(ch,sfd); } else ungetc(ch,sfd); return( adjust ); } static ValDevTab *SFDReadValDevTab(FILE *sfd) { int i, j, ch; ValDevTab vdt; char buf[4]; memset(&vdt,0,sizeof(vdt)); buf[3] = '\0'; while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='[' ) { for ( i=0; i<4; ++i ) { while ( (ch=nlgetc(sfd))==' ' ); if ( ch==']' ) break; buf[0]=ch; for ( j=1; j<3; ++j ) buf[j]=nlgetc(sfd); while ( (ch=nlgetc(sfd))==' ' ); if ( ch!='=' ) ungetc(ch,sfd); SFDReadDeviceTable(sfd, strcmp(buf,"ddx")==0 ? &vdt.xadjust : strcmp(buf,"ddy")==0 ? &vdt.yadjust : strcmp(buf,"ddh")==0 ? &vdt.xadv : strcmp(buf,"ddv")==0 ? &vdt.yadv : (&vdt.xadjust) + i ); while ( (ch=nlgetc(sfd))==' ' ); if ( ch!=']' ) ungetc(ch,sfd); else break; } if ( vdt.xadjust.corrections!=NULL || vdt.yadjust.corrections!=NULL || vdt.xadv.corrections!=NULL || vdt.yadv.corrections!=NULL ) { ValDevTab *v = chunkalloc(sizeof(ValDevTab)); *v = vdt; return( v ); } } else ungetc(ch,sfd); return( NULL ); } static AnchorPoint *SFDReadAnchorPoints(FILE *sfd,SplineChar *sc,AnchorPoint** alist, AnchorPoint *lastap) { AnchorPoint *ap = chunkalloc(sizeof(AnchorPoint)); AnchorClass *an; char *name; char tok[200]; int ch; name = SFDReadUTF7Str(sfd); if ( name==NULL ) { LogError(_("Anchor Point with no class name: %s"), sc->name ); AnchorPointsFree(ap); return( lastap ); } for ( an=sc->parent->anchor; an!=NULL && 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; } getsint(sfd,&ap->lig_index); ch = nlgetc(sfd); ungetc(ch,sfd); if ( ch==' ' ) { SFDReadDeviceTable(sfd,&ap->xadjust); SFDReadDeviceTable(sfd,&ap->yadjust); ch = nlgetc(sfd); ungetc(ch,sfd); if ( isdigit(ch)) { getsint(sfd,(int16 *) &ap->ttf_pt_index); ap->has_ttf_pt = true; } } if ( ap->anchor==NULL || ap->type==-1 ) { LogError(_("Bad Anchor Point: %s"), sc->name ); AnchorPointsFree(ap); return( lastap ); } if ( lastap==NULL ) (*alist) = ap; else lastap->next = ap; return( ap ); } static RefChar *SFDGetRef(FILE *sfd, int was_enc) { RefChar *rf; int temp=0, ch; rf = RefCharCreate(); getint(sfd,&rf->orig_pos); rf->encoded = was_enc; if ( getint(sfd,&temp)) rf->unicode_enc = temp; while ( isspace(ch=nlgetc(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]); while ( (ch=nlgetc(sfd))==' '); ungetc(ch,sfd); if ( isdigit(ch) ) { getint(sfd,&temp); rf->use_my_metrics = temp&1; rf->round_translation_to_grid = (temp&2)?1:0; rf->point_match = (temp&4)?1:0; if ( rf->point_match ) { getsint(sfd,(int16 *) &rf->match_pt_base); getsint(sfd,(int16 *) &rf->match_pt_ref); while ( (ch=nlgetc(sfd))==' '); if ( ch=='O' ) rf->point_match_out_of_date = true; else ungetc(ch,sfd); } } 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 separate ligature structures for each */ static PST1 *LigaCreateFromOldStyleMultiple(PST1 *liga) { char *pt; PST1 *new, *last=liga; while ( (pt = strrchr(liga->pst.u.lig.components,';'))!=NULL ) { new = chunkalloc(sizeof( PST1 )); *new = *liga; new->pst.u.lig.components = copy(pt+1); last->pst.next = (PST *) 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(PST1 *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 void SFDSetEncMap(SplineFont *sf,int orig_pos,int enc) { EncMap *map = sf->map; if ( map==NULL ) return; if ( orig_pos>=map->backmax ) { int old = map->backmax; map->backmax = orig_pos+10; map->backmap = realloc(map->backmap,map->backmax*sizeof(int)); memset(map->backmap+old,-1,(map->backmax-old)*sizeof(int)); } if ( map->backmap[orig_pos] == -1 ) /* backmap will not be unique if multiple encodings come from same glyph */ map->backmap[orig_pos] = enc; if ( enc>=map->encmax ) { int old = map->encmax; map->encmax = enc+10; map->map = realloc(map->map,map->encmax*sizeof(int)); memset(map->map+old,-1,(map->encmax-old)*sizeof(int)); } if ( enc>=map->enccount ) map->enccount = enc+1; if ( enc!=-1 ) map->map[enc] = orig_pos; } static void SCDefaultInterpolation(SplineChar *sc) { SplineSet *cur; SplinePoint *sp; /* We used not to store the dontinterpolate bit. We used to use the */ /* presence or absence of instructions as that flag */ if ( sc->ttf_instrs_len!=0 ) { for ( cur=sc->layers[ly_fore].splines; cur!=NULL; cur=cur->next ) { for ( sp=cur->first; ; ) { if ( sp->ttfindex!=0xffff && SPInterpolate(sp)) sp->dontinterpolate = true; if ( sp->next==NULL ) break; sp=sp->next->to; if ( sp==cur->first ) break; } } } } static void SFDParseMathValueRecord(FILE *sfd,int16 *value,DeviceTable **devtab) { getsint(sfd,value); *devtab = SFDReadDeviceTable(sfd,NULL); } static struct glyphvariants *SFDParseGlyphComposition(FILE *sfd, struct glyphvariants *gv, char *tok) { int i; if ( gv==NULL ) gv = chunkalloc(sizeof(struct glyphvariants)); getint(sfd,&gv->part_cnt); gv->parts = calloc(gv->part_cnt,sizeof(struct gv_part)); for ( i=0; ipart_cnt; ++i ) { int temp, ch; getname(sfd,tok); gv->parts[i].component = copy(tok); while ( (ch=nlgetc(sfd))==' ' ); if ( ch!='%' ) ungetc(ch,sfd); getint(sfd,&temp); gv->parts[i].is_extender = temp; while ( (ch=nlgetc(sfd))==' ' ); if ( ch!=',' ) ungetc(ch,sfd); getint(sfd,&temp); gv->parts[i].startConnectorLength=temp; while ( (ch=nlgetc(sfd))==' ' ); if ( ch!=',' ) ungetc(ch,sfd); getint(sfd,&temp); gv->parts[i].endConnectorLength = temp; while ( (ch=nlgetc(sfd))==' ' ); if ( ch!=',' ) ungetc(ch,sfd); getint(sfd,&temp); gv->parts[i].fullAdvance = temp; } return( gv ); } static void SFDParseVertexKern(FILE *sfd, struct mathkernvertex *vertex) { int i,ch; getint(sfd,&vertex->cnt); vertex->mkd = calloc(vertex->cnt,sizeof(struct mathkerndata)); for ( i=0; icnt; ++i ) { SFDParseMathValueRecord(sfd,&vertex->mkd[i].height,&vertex->mkd[i].height_adjusts); while ( (ch=nlgetc(sfd))==' ' ); if ( ch!=EOF && ch!=',' ) ungetc(ch,sfd); SFDParseMathValueRecord(sfd,&vertex->mkd[i].kern,&vertex->mkd[i].kern_adjusts); } } static struct gradient *SFDParseGradient(FILE *sfd,char *tok) { struct gradient *grad = chunkalloc(sizeof(struct gradient)); int ch, i; getreal(sfd,&grad->start.x); while ( isspace(ch=nlgetc(sfd))); if ( ch!=';' ) ungetc(ch,sfd); getreal(sfd,&grad->start.y); getreal(sfd,&grad->stop.x); while ( isspace(ch=nlgetc(sfd))); if ( ch!=';' ) ungetc(ch,sfd); getreal(sfd,&grad->stop.y); getreal(sfd,&grad->radius); getname(sfd,tok); for ( i=0; spreads[i]!=NULL; ++i ) if ( strmatch(spreads[i],tok)==0 ) break; if ( spreads[i]==NULL ) i=0; grad->sm = i; getint(sfd,&grad->stop_cnt); grad->grad_stops = calloc(grad->stop_cnt,sizeof(struct grad_stops)); for ( i=0; istop_cnt; ++i ) { while ( isspace(ch=nlgetc(sfd))); if ( ch!='{' ) ungetc(ch,sfd); getreal( sfd, &grad->grad_stops[i].offset ); gethex( sfd, &grad->grad_stops[i].col ); getreal( sfd, &grad->grad_stops[i].opacity ); while ( isspace(ch=nlgetc(sfd))); if ( ch!='}' ) ungetc(ch,sfd); } return( grad ); } static struct pattern *SFDParsePattern(FILE *sfd,char *tok) { struct pattern *pat = chunkalloc(sizeof(struct pattern)); int ch; getname(sfd,tok); pat->pattern = copy(tok); getreal(sfd,&pat->width); while ( isspace(ch=nlgetc(sfd))); if ( ch!=';' ) ungetc(ch,sfd); getreal(sfd,&pat->height); while ( isspace(ch=nlgetc(sfd))); if ( ch!='[' ) ungetc(ch,sfd); getreal(sfd,&pat->transform[0]); getreal(sfd,&pat->transform[1]); getreal(sfd,&pat->transform[2]); getreal(sfd,&pat->transform[3]); getreal(sfd,&pat->transform[4]); getreal(sfd,&pat->transform[5]); while ( isspace(ch=nlgetc(sfd))); if ( ch!=']' ) ungetc(ch,sfd); return( pat ); } static int orig_pos; static SplineChar *SFDGetChar(FILE *sfd,SplineFont *sf, int had_sf_layer_cnt) { SplineChar *sc; char tok[2000], ch; RefChar *lastr=NULL, *ref; AnchorPoint *lastap = NULL; int isliga = 0, ispos, issubs=0, ismult=0, islcar=0, ispair=0, temp, i; PST *last = NULL; uint32 script = 0; int current_layer = ly_fore; int had_old_dstems = false; SplineFont *sli_sf = sf->cidmaster ? sf->cidmaster : sf; struct altuni *altuni; int oldback = false; if ( getname(sfd,tok)!=1 ) return( NULL ); if ( strcmp(tok,"StartChar:")!=0 ) return( NULL ); while ( isspace(ch=nlgetc(sfd))); ungetc(ch,sfd); sc = SFSplineCharCreate(sf); if ( ch!='"' ) { if ( getname(sfd,tok)!=1 ) { SplineCharFree(sc); return( NULL ); } sc->name = copy(tok); } else { sc->name = SFDReadUTF7Str(sfd); if ( sc->name==NULL ) { SplineCharFree(sc); return( NULL ); } } 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 ) { int enc; getint(sfd,&enc); getint(sfd,&sc->unicodeenc); while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); ungetc(ch,sfd); if ( ch!='\n' && ch!='\r' ) { getint(sfd,&sc->orig_pos); if ( sc->orig_pos==65535 ) sc->orig_pos = orig_pos++; /* An old mark meaning: "I don't know" */ if ( sc->orig_posglyphcnt && sf->glyphs[sc->orig_pos]!=NULL ) sc->orig_pos = sf->glyphcnt; if ( sc->orig_pos>=sf->glyphcnt ) { if ( sc->orig_pos>=sf->glyphmax ) sf->glyphs = realloc(sf->glyphs,(sf->glyphmax = sc->orig_pos+10)*sizeof(SplineChar *)); memset(sf->glyphs+sf->glyphcnt,0,(sc->orig_pos+1-sf->glyphcnt)*sizeof(SplineChar *)); sf->glyphcnt = sc->orig_pos+1; } if ( sc->orig_pos+1 > orig_pos ) orig_pos = sc->orig_pos+1; } else if ( sf->cidmaster!=NULL ) { /* In cid fonts the orig_pos is just the cid */ sc->orig_pos = enc; } else { sc->orig_pos = orig_pos++; } SFDSetEncMap(sf,sc->orig_pos,enc); } else if ( strmatch(tok,"AltUni:")==0 ) { int uni; while ( getint(sfd,&uni)==1 ) { altuni = chunkalloc(sizeof(struct altuni)); altuni->unienc = uni; altuni->vs = -1; altuni->fid = 0; altuni->next = sc->altuni; sc->altuni = altuni; } } else if ( strmatch(tok,"AltUni2:")==0 ) { uint32 uni[3]; while ( gethexints(sfd,uni,3) ) { altuni = chunkalloc(sizeof(struct altuni)); altuni->unienc = uni[0]; altuni->vs = uni[1]; altuni->fid = uni[2]; altuni->next = sc->altuni; sc->altuni = altuni; } } else if ( strmatch(tok,"OldEncoding:")==0 ) { int old_enc; /* Obsolete info */ getint(sfd,&old_enc); } else if ( strmatch(tok,"Script:")==0 ) { /* Obsolete. But still used for parsing obsolete ligature/subs tags */ while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); if ( ch=='\n' || ch=='\r' ) script = 0; else { ungetc(ch,sfd); script = gettag(sfd); } } else if ( strmatch(tok,"GlifName:")==0 ) { while ( isspace(ch=nlgetc(sfd))); ungetc(ch,sfd); if ( ch!='"' ) { if ( getname(sfd,tok)!=1 ) { LogError(_("Invalid glif name.\n")); } sc->glif_name = copy(tok); } else { sc->glif_name = SFDReadUTF7Str(sfd); if ( sc->glif_name==NULL ) { LogError(_("Invalid glif name.\n")); } } } 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,"UnlinkRmOvrlpSave:")==0 ) { getint(sfd,&temp); sc->unlink_rm_ovrlp_save_undo = temp; } else if ( strmatch(tok,"InSpiro:")==0 ) { getint(sfd,&temp); sc->inspiro = temp; } else if ( strmatch(tok,"LigCaretCntFixed:")==0 ) { getint(sfd,&temp); sc->lig_caret_cnt_fixed = temp; } else if ( strmatch(tok,"Flags:")==0 ) { while ( isspace(ch=nlgetc(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; else if ( ch=='I' ) sc->instructions_out_of_date = true; ch = nlgetc(sfd); } if ( sf->multilayer || sf->strokedfont || sc->layers[ly_fore].order2 ) sc->changedsincelasthinted = false; } else if ( strmatch(tok,"TeX:")==0 ) { getsint(sfd,&sc->tex_height); getsint(sfd,&sc->tex_depth); while ( isspace(ch=nlgetc(sfd)) && ch!='\n' && ch!='\r'); ungetc(ch,sfd); if ( ch!='\n' && ch!='\r' ) { int16 old_tex; /* Used to store two extra values here */ getsint(sfd,&old_tex); getsint(sfd,&old_tex); if ( sc->tex_height==0 && sc->tex_depth==0 ) /* Fixup old bug */ sc->tex_height = sc->tex_depth = TEX_UNDEF; } } else if ( strmatch(tok,"ItalicCorrection:")==0 ) { SFDParseMathValueRecord(sfd,&sc->italic_correction,&sc->italic_adjusts); } else if ( strmatch(tok,"TopAccentHorizontal:")==0 ) { SFDParseMathValueRecord(sfd,&sc->top_accent_horiz,&sc->top_accent_adjusts); } else if ( strmatch(tok,"GlyphCompositionVerticalIC:")==0 ) { if ( sc->vert_variants==NULL ) sc->vert_variants = chunkalloc(sizeof(struct glyphvariants)); SFDParseMathValueRecord(sfd,&sc->vert_variants->italic_correction,&sc->vert_variants->italic_adjusts); } else if ( strmatch(tok,"GlyphCompositionHorizontalIC:")==0 ) { if ( sc->horiz_variants==NULL ) sc->horiz_variants = chunkalloc(sizeof(struct glyphvariants)); SFDParseMathValueRecord(sfd,&sc->horiz_variants->italic_correction,&sc->horiz_variants->italic_adjusts); } else if ( strmatch(tok,"IsExtendedShape:")==0 ) { int temp; getint(sfd,&temp); sc->is_extended_shape = temp; } else if ( strmatch(tok,"GlyphVariantsVertical:")==0 ) { if ( sc->vert_variants==NULL ) sc->vert_variants = chunkalloc(sizeof(struct glyphvariants)); geteol(sfd,tok); sc->vert_variants->variants = copy(tok); } else if ( strmatch(tok,"GlyphVariantsHorizontal:")==0 ) { if ( sc->horiz_variants==NULL ) sc->horiz_variants = chunkalloc(sizeof(struct glyphvariants)); geteol(sfd,tok); sc->horiz_variants->variants = copy(tok); } else if ( strmatch(tok,"GlyphCompositionVertical:")==0 ) { sc->vert_variants = SFDParseGlyphComposition(sfd, sc->vert_variants,tok); } else if ( strmatch(tok,"GlyphCompositionHorizontal:")==0 ) { sc->horiz_variants = SFDParseGlyphComposition(sfd, sc->horiz_variants,tok); } else if ( strmatch(tok,"TopRightVertex:")==0 ) { if ( sc->mathkern==NULL ) sc->mathkern = chunkalloc(sizeof(struct mathkern)); SFDParseVertexKern(sfd, &sc->mathkern->top_right); } else if ( strmatch(tok,"TopLeftVertex:")==0 ) { if ( sc->mathkern==NULL ) sc->mathkern = chunkalloc(sizeof(struct mathkern)); SFDParseVertexKern(sfd, &sc->mathkern->top_left); } else if ( strmatch(tok,"BottomRightVertex:")==0 ) { if ( sc->mathkern==NULL ) sc->mathkern = chunkalloc(sizeof(struct mathkern)); SFDParseVertexKern(sfd, &sc->mathkern->bottom_right); } else if ( strmatch(tok,"BottomLeftVertex:")==0 ) { if ( sc->mathkern==NULL ) sc->mathkern = chunkalloc(sizeof(struct mathkern)); SFDParseVertexKern(sfd, &sc->mathkern->bottom_left); #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); sc->hconflicts = StemListAnyConflicts(sc->hstem); } else if ( strmatch(tok,"VStem:")==0 ) { sc->vstem = SFDReadHints(sfd); sc->vconflicts = StemListAnyConflicts(sc->vstem); } else if ( strmatch(tok,"DStem:")==0 ) { sc->dstem = SFDReadDHints( sc->parent,sfd,true ); had_old_dstems = true; } else if ( strmatch(tok,"DStem2:")==0 ) { sc->dstem = SFDReadDHints( sc->parent,sfd,false ); } else if ( strmatch(tok,"CounterMasks:")==0 ) { getsint(sfd,&sc->countermask_cnt); sc->countermasks = calloc(sc->countermask_cnt,sizeof(HintMask)); for ( i=0; icountermask_cnt; ++i ) { int ch; while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); SFDGetHintMask(sfd,&sc->countermasks[i]); } } else if ( strmatch(tok,"AnchorPoint:")==0 ) { lastap = SFDReadAnchorPoints(sfd,sc,&sc->anchor,lastap); } else if ( strmatch(tok,"Fore")==0 ) { while ( isspace(ch = nlgetc(sfd))); ungetc(ch,sfd); if ( ch!='I' && ch!='R' && ch!='S' && ch!='V' && ch!=' ' && ch!='\n' && !PeekMatch(sfd, "Pickled") && !PeekMatch(sfd, "EndChar") && !PeekMatch(sfd, "Fore") && !PeekMatch(sfd, "Back") && !PeekMatch(sfd, "Layer") ) { /* Old format, without a SplineSet token */ sc->layers[ly_fore].splines = SFDGetSplineSet(sfd,sc->layers[ly_fore].order2); } current_layer = ly_fore; } else if ( strmatch(tok,"MinimumDistance:")==0 ) { SFDGetMinimumDistances(sfd,sc); } else if ( strmatch(tok,"Validated:")==0 ) { getsint(sfd,(int16 *) &sc->layers[current_layer].validation_state); } else if ( strmatch(tok,"Back")==0 ) { while ( isspace(ch=nlgetc(sfd))); ungetc(ch,sfd); if ( ch!='I' && ch!='R' && ch!='S' && ch!='V' && ch!=' ' && ch!='\n' && !PeekMatch(sfd, "Pickled") && !PeekMatch(sfd, "EndChar") && !PeekMatch(sfd, "Fore") && !PeekMatch(sfd, "Back") && !PeekMatch(sfd, "Layer") ) { /* Old format, without a SplineSet token */ sc->layers[ly_back].splines = SFDGetSplineSet(sfd,sc->layers[ly_back].order2); oldback = true; } current_layer = ly_back; } else if ( strmatch(tok,"LayerCount:")==0 ) { getint(sfd,&temp); if ( temp>sc->layer_cnt ) { sc->layers = realloc(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; int dofill, dostroke, fillfirst, linejoin, linecap; uint32 fillcol, strokecol; real fillopacity, strokeopacity, strokewidth, trans[4]; DashType dashes[DASH_MAX]; int i; getint(sfd,&layer); if ( layer>=sc->layer_cnt ) { sc->layers = realloc(sc->layers,(layer+1)*sizeof(Layer)); memset(sc->layers+sc->layer_cnt,0,(layer+1-sc->layer_cnt)*sizeof(Layer)); } if ( sc->parent->multilayer ) { 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; while ( (ch=nlgetc(sfd))==' ' || ch=='[' ); ungetc(ch,sfd); getreal(sfd,&trans[0]); getreal(sfd,&trans[1]); getreal(sfd,&trans[2]); getreal(sfd,&trans[3]); while ( (ch=nlgetc(sfd))==' ' || ch==']' ); if ( ch=='[' ) { for ( i=0;; ++i ) { int temp; if ( !getint(sfd,&temp) ) break; else if ( ilayers[layer].dofill = dofill; sc->layers[layer].dostroke = dostroke; sc->layers[layer].fillfirst = fillfirst; sc->layers[layer].fill_brush.col = fillcol; sc->layers[layer].fill_brush.opacity = fillopacity; sc->layers[layer].stroke_pen.brush.col = strokecol; sc->layers[layer].stroke_pen.brush.opacity = strokeopacity; sc->layers[layer].stroke_pen.width = strokewidth; sc->layers[layer].stroke_pen.linejoin = linejoin; sc->layers[layer].stroke_pen.linecap = linecap; memcpy(sc->layers[layer].stroke_pen.dashes,dashes,sizeof(dashes)); memcpy(sc->layers[layer].stroke_pen.trans,trans,sizeof(trans)); } current_layer = layer; lastr = NULL; } else if ( strmatch(tok,"FillGradient:")==0 ) { sc->layers[current_layer].fill_brush.gradient = SFDParseGradient(sfd,tok); } else if ( strmatch(tok,"FillPattern:")==0 ) { sc->layers[current_layer].fill_brush.pattern = SFDParsePattern(sfd,tok); } else if ( strmatch(tok,"StrokeGradient:")==0 ) { sc->layers[current_layer].stroke_pen.brush.gradient = SFDParseGradient(sfd,tok); } else if ( strmatch(tok,"StrokePattern:")==0 ) { sc->layers[current_layer].stroke_pen.brush.pattern = SFDParsePattern(sfd,tok); } else if ( strmatch(tok,"SplineSet")==0 ) { sc->layers[current_layer].splines = SFDGetSplineSet(sfd,sc->layers[current_layer].order2); } else if ( strmatch(tok,"Ref:")==0 || strmatch(tok,"Refer:")==0 ) { /* I should be depending on the version number here, but I made */ /* a mistake and bumped the version too late. So the version is */ /* not an accurate mark, but the presence of a LayerCount keyword*/ /* in the font is an good mark. Before the LayerCount was added */ /* (version 2) only the foreground layer could have references */ /* after that (eventually version 3) any layer could. */ if ( oldback || !had_sf_layer_cnt ) current_layer = ly_fore; ref = SFDGetRef(sfd,strmatch(tok,"Ref:")==0); if ( sc->layers[current_layer].refs==NULL ) sc->layers[current_layer].refs = ref; else lastr->next = ref; lastr = ref; } else if ( strmatch(tok,"PickledData:")==0 ) { if (current_layer < sc->layer_cnt) { sc->layers[current_layer].python_persistent = SFDUnPickle(sfd, 0); sc->layers[current_layer].python_persistent_has_lists = 0; } } else if ( strmatch(tok,"PickledDataWithLists:")==0 ) { if (current_layer < sc->layer_cnt) { sc->layers[current_layer].python_persistent = SFDUnPickle(sfd, 1); sc->layers[current_layer].python_persistent_has_lists = 1; } } else if ( strmatch(tok,"OrigType1:")==0 ) { /* Accept, slurp, ignore contents */ SFDGetType1(sfd); } else if ( strmatch(tok,"TtfInstrs:")==0 ) { /* Binary format */ SFDGetTtfInstrs(sfd,sc); } else if ( strmatch(tok,"TtInstrs:")==0 ) { /* ASCII format */ SFDGetTtInstrs(sfd,sc); } else if ( strmatch(tok,"Kerns2:")==0 || strmatch(tok,"VKerns2:")==0 ) { KernPair *kp, *last=NULL; int isv = *tok=='V'; int off, index; struct lookup_subtable *sub; while ( fscanf(sfd,"%d %d", &index, &off )==2 ) { sub = SFFindLookupSubtableAndFreeName(sf,SFDReadUTF7Str(sfd)); if ( sub==NULL ) { LogError(_("KernPair with no subtable name.\n")); break; } kp = chunkalloc(sizeof(KernPair1)); kp->sc = (SplineChar *) (intpt) index; kp->kcid = true; kp->off = off; kp->subtable = sub; kp->next = NULL; while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( ch=='{' ) { kp->adjust = SFDReadDeviceTable(sfd, 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)) || ( ispos = (strmatch(tok,"Position2:")==0)) || ( ispair = (strmatch(tok,"PairPos:")==0)) || ( ispair = (strmatch(tok,"PairPos2:")==0)) || ( islcar = (strmatch(tok,"LCarets:")==0)) || ( islcar = (strmatch(tok,"LCarets2:")==0)) || ( isliga = (strmatch(tok,"Ligature:")==0)) || ( isliga = (strmatch(tok,"Ligature2:")==0)) || ( issubs = (strmatch(tok,"Substitution:")==0)) || ( issubs = (strmatch(tok,"Substitution2:")==0)) || ( ismult = (strmatch(tok,"MultipleSubs:")==0)) || ( ismult = (strmatch(tok,"MultipleSubs2:")==0)) || strmatch(tok,"AlternateSubs:")==0 || strmatch(tok,"AlternateSubs2:")==0 ) { PST *pst; int old, type; type = ispos ? pst_position : ispair ? pst_pair : islcar ? pst_lcaret : isliga ? pst_ligature : issubs ? pst_substitution : ismult ? pst_multiple : pst_alternate; if ( strchr(tok,'2')!=NULL ) { old = false; pst = chunkalloc(sizeof(PST)); if ( type!=pst_lcaret ) pst->subtable = SFFindLookupSubtableAndFreeName(sf,SFDReadUTF7Str(sfd)); } else { old = true; pst = chunkalloc(sizeof(PST1)); ((PST1 *) pst)->tag = CHR('l','i','g','a'); ((PST1 *) pst)->script_lang_index = 0xffff; while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); if ( isdigit(ch)) { int temp; ungetc(ch,sfd); getint(sfd,&temp); ((PST1 *) pst)->flags = temp; while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); } else ((PST1 *) pst)->flags = 0 /*PSTDefaultFlags(type,sc)*/; if ( isdigit(ch)) { ungetc(ch,sfd); getusint(sfd,&((PST1 *) pst)->script_lang_index); while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); } else ((PST1 *) pst)->script_lang_index = SFFindBiggestScriptLangIndex(sf, script!=0?script:SCScriptFromUnicode(sc),DEFAULT_LANG); if ( ch=='\'' ) { ungetc(ch,sfd); ((PST1 *) pst)->tag = gettag(sfd); } else if ( ch=='<' ) { getint(sfd,&temp); ((PST1 *) pst)->tag = temp<<16; nlgetc(sfd); /* comma */ getint(sfd,&temp); ((PST1 *) pst)->tag |= temp; nlgetc(sfd); /* close '>' */ ((PST1 *) pst)->macfeature = true; } else ungetc(ch,sfd); if ( type==pst_lcaret ) { /* These are meaningless for lcarets, set them to innocuous values */ ((PST1 *) pst)->script_lang_index = SLI_UNKNOWN; ((PST1 *) pst)->tag = CHR(' ',' ',' ',' '); } else if ( ((PST1 *) pst)->script_lang_index>=((SplineFont1 *) sli_sf)->sli_cnt && ((PST1 *) pst)->script_lang_index!=SLI_NESTED ) { static int complained=false; if ( !complained ) IError("'%c%c%c%c' in %s has a script index out of bounds: %d", (((PST1 *) pst)->tag>>24), (((PST1 *) pst)->tag>>16)&0xff, (((PST1 *) pst)->tag>>8)&0xff, ((PST1 *) pst)->tag&0xff, sc->name, ((PST1 *) pst)->script_lang_index ); else IError( "'%c%c%c%c' in %s has a script index out of bounds: %d\n", (((PST1 *) pst)->tag>>24), (((PST1 *) pst)->tag>>16)&0xff, (((PST1 *) pst)->tag>>8)&0xff, ((PST1 *) pst)->tag&0xff, sc->name, ((PST1 *) pst)->script_lang_index ); ((PST1 *) pst)->script_lang_index = SFFindBiggestScriptLangIndex(sli_sf, SCScriptFromUnicode(sc),DEFAULT_LANG); complained = true; } } if ( (sf->sfd_version<2)!=old ) { IError( "Version mixup in PST of sfd file." ); exit(1); } if ( last==NULL ) sc->possub = pst; else last->next = pst; last = pst; pst->type = type; if ( pst->type==pst_position ) { fscanf( sfd, " dx=%hd dy=%hd dh=%hd dv=%hd", &pst->u.pos.xoff, &pst->u.pos.yoff, &pst->u.pos.h_adv_off, &pst->u.pos.v_adv_off); pst->u.pos.adjust = SFDReadValDevTab(sfd); ch = nlgetc(sfd); /* Eat new line */ } else if ( pst->type==pst_pair ) { getname(sfd,tok); pst->u.pair.paired = copy(tok); pst->u.pair.vr = chunkalloc(sizeof(struct vr [2])); fscanf( sfd, " dx=%hd dy=%hd dh=%hd dv=%hd", &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[0].adjust = SFDReadValDevTab(sfd); fscanf( sfd, " dx=%hd dy=%hd dh=%hd dv=%hd", &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); pst->u.pair.vr[0].adjust = SFDReadValDevTab(sfd); ch = nlgetc(sfd); } else if ( pst->type==pst_lcaret ) { int i; fscanf( sfd, " %d", &pst->u.lcaret.cnt ); pst->u.lcaret.carets = malloc(pst->u.lcaret.cnt*sizeof(int16)); for ( i=0; iu.lcaret.cnt; ++i ) fscanf( sfd, " %hd", &pst->u.lcaret.carets[i]); geteol(sfd,tok); } else { geteol(sfd,tok); pst->u.lig.components = copy(tok); /* it's in the same place for all formats */ if ( isliga ) { pst->u.lig.lig = sc; if ( old ) last = (PST *) LigaCreateFromOldStyleMultiple((PST1 *) pst); } } #ifdef FONTFORGE_CONFIG_CVT_OLD_MAC_FEATURES if ( old ) CvtOldMacFeature((PST1 *) pst); #endif } else if ( strmatch(tok,"Colour:")==0 ) { uint32 temp; gethex(sfd,&temp); sc->color = temp; } else if ( strmatch(tok,"Comment:")==0 ) { sc->comment = SFDReadUTF7Str(sfd); } else if ( strmatch(tok,"TileMargin:")==0 ) { getreal(sfd,&sc->tile_margin); } else if ( strmatch(tok,"TileBounds:")==0 ) { getreal(sfd,&sc->tile_bounds.minx); getreal(sfd,&sc->tile_bounds.miny); getreal(sfd,&sc->tile_bounds.maxx); getreal(sfd,&sc->tile_bounds.maxy); } else if ( strmatch(tok,"EndChar")==0 ) { if ( sc->orig_posglyphcnt ) sf->glyphs[sc->orig_pos] = sc; /* Recalculating hint active zones may be needed for old .sfd files. */ /* Do this when we have finished with other glyph components, */ /* so that splines are already available */ if ( had_old_dstems && sc->layers[ly_fore].splines != NULL ) SCGuessHintInstancesList( sc,ly_fore,NULL,NULL,sc->dstem,false,true ); if ( sc->layers[ly_fore].order2 ) SCDefaultInterpolation(sc); return( sc ); } else { geteol(sfd,tok); } } } static void SFDFixupRef(SplineChar *sc,RefChar *ref,int layer) { RefChar *rf; int ly; if ( sc->parent->multilayer ) { for ( ly=ly_fore; lysc->layer_cnt; ++ly ) { for ( rf = ref->sc->layers[ly].refs; rf!=NULL; rf=rf->next ) { if ( rf->sc==sc ) { /* Huh? */ ref->sc->layers[ly].refs = NULL; break; } if ( rf->layers[0].splines==NULL ) SFDFixupRef(ref->sc,rf,layer); } } } else { for ( rf = ref->sc->layers[layer].refs; rf!=NULL; rf=rf->next ) { if ( rf->sc==sc ) { /* Huh? */ ref->sc->layers[layer].refs = NULL; break; } if ( rf->layers[0].splines==NULL ) SFDFixupRef(ref->sc,rf,layer); } } SCReinstanciateRefChar(sc,ref,layer); SCMakeDependent(sc,ref->sc); } /* Look for character duplicates, such as might be generated by having the same */ /* glyph at two encoding slots */ /* This is an obsolete convention, supported now only in sfd files */ /* 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 */ static SplineChar *SCDuplicate(SplineChar *sc) { SplineChar *matched = sc; if ( sc==NULL || sc->parent==NULL || sc->parent->cidmaster!=NULL ) return( sc ); /* Can't do this in CID keyed fonts */ if ( sc->layer_cnt!=2 ) return( sc ); while ( sc->layers[ly_fore].refs!=NULL && sc->layers[ly_fore].refs->sc!=NULL && /* Can happen if we are called during font loading before references are fixed up */ 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; if ( strcmp(sc->name,basename)!=0 ) break; matched = sc->layers[ly_fore].refs->sc; sc = sc->layers[ly_fore].refs->sc; } return( matched ); } void SFDFixupRefs(SplineFont *sf) { int i, isv; RefChar *refs, *rnext, *rprev; /*int isautorecovery = sf->changed;*/ KernPair *kp, *prev, *next; EncMap *map = sf->map; int layer; int k,l; SplineFont *cidmaster = sf, *ksf; k = 1; if ( sf->subfontcnt!=0 ) sf = sf->subfonts[0]; ff_progress_change_line2(_("Interpreting Glyphs")); for (;;) { for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { SplineChar *sc = sf->glyphs[i]; /* 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 && !sc->changed )*/ /*continue;*/ for ( layer = 0; layerlayer_cnt; ++layer ) { rprev = NULL; for ( refs = sc->layers[layer].refs; refs!=NULL; refs=rnext ) { rnext = refs->next; if ( refs->encoded ) { /* Old sfd format */ if ( refs->orig_posencmax && map->map[refs->orig_pos]!=-1 ) refs->orig_pos = map->map[refs->orig_pos]; else refs->orig_pos = sf->glyphcnt; refs->encoded = false; } if ( refs->orig_posglyphcnt && refs->orig_pos>=0 ) refs->sc = sf->glyphs[refs->orig_pos]; if ( refs->sc!=NULL ) { refs->unicode_enc = refs->sc->unicodeenc; refs->adobe_enc = getAdobeEnc(refs->sc->name); rprev = refs; if ( refs->use_my_metrics ) { if ( sc->width != refs->sc->width ) { LogError(_("Bad sfd file. Glyph %s has width %d even though it should be\n bound to the width of %s which is %d.\n"), sc->name, sc->width, refs->sc->name, refs->sc->width ); sc->width = refs->sc->width; } } } else { RefCharFree(refs); if ( rprev!=NULL ) rprev->next = rnext; else sc->layers[layer].refs = rnext; } } } /* In old sfd files we used a peculiar idiom to represent a multiply */ /* encoded glyph. Fix it up now. Remove the fake glyph and adjust the*/ /* map */ /*if ( isautorecovery && !sc->changed )*/ /*continue;*/ for ( isv=0; isv<2; ++isv ) { for ( prev = NULL, kp=isv?sc->vkerns : sc->kerns; kp!=NULL; kp=next ) { int index = (intpt) (kp->sc); next = kp->next; // be impotent if the reference is already to the correct location if ( !kp->kcid ) { /* It's encoded (old sfds), else orig */ if ( index>=map->encmax || map->map[index]==-1 ) index = sf->glyphcnt; else index = map->map[index]; } kp->kcid = false; ksf = sf; if ( cidmaster!=sf ) { for ( l=0; lsubfontcnt; ++l ) { ksf = cidmaster->subfonts[l]; if ( indexglyphcnt && ksf->glyphs[index]!=NULL ) break; } } if ( index>=ksf->glyphcnt || ksf->glyphs[index]==NULL ) { IError( "Bad kerning information in glyph %s\n", sc->name ); kp->sc = NULL; } else { kp->sc = ksf->glyphs[index]; } if ( kp->sc!=NULL ) prev = kp; else{ if ( prev!=NULL ) prev->next = next; else if ( isv ) sc->vkerns = next; else sc->kerns = next; chunkfree(kp,sizeof(KernPair)); } } } if ( SCDuplicate(sc)!=sc ) { SplineChar *base = SCDuplicate(sc); int orig = sc->orig_pos, enc = sf->map->backmap[orig], uni = sc->unicodeenc; SplineCharFree(sc); sf->glyphs[i]=NULL; sf->map->backmap[orig] = -1; sf->map->map[enc] = base->orig_pos; AltUniAdd(base,uni); } } for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { SplineChar *sc = sf->glyphs[i]; for ( layer=0; layerlayer_cnt; ++layer ) { for ( refs = sf->glyphs[i]->layers[layer].refs; refs!=NULL; refs=refs->next ) { SFDFixupRef(sf->glyphs[i],refs,layer); } } ff_progress_next(); } if ( sf->cidmaster==NULL ) for ( i=sf->glyphcnt-1; i>=0 && sf->glyphs[i]==NULL; --i ) sf->glyphcnt = i; if ( k>=cidmaster->subfontcnt ) break; sf = cidmaster->subfonts[k++]; } } static void SFDGetPrivate(FILE *sfd,SplineFont *sf) { int i, cnt, len; char name[200]; char *pt, *end; sf->private = calloc(1,sizeof(struct psdict)); getint(sfd,&cnt); sf->private->next = sf->private->cnt = cnt; sf->private->values = calloc(cnt,sizeof(char *)); sf->private->keys = calloc(cnt,sizeof(char *)); for ( i=0; iprivate->keys[i] = copy(name); getint(sfd,&len); nlgetc(sfd); /* skip space */ pt = sf->private->values[i] = malloc(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 void SFDGetGasp(FILE *sfd,SplineFont *sf) { int i; getsint(sfd,(int16 *) &sf->gasp_cnt); sf->gasp = malloc(sf->gasp_cnt*sizeof(struct gasp)); for ( i=0; igasp_cnt; ++i ) { getsint(sfd,(int16 *) &sf->gasp[i].ppem); getsint(sfd,(int16 *) &sf->gasp[i].flags); } getsint(sfd,(int16 *) &sf->gasp_version); } static void SFDGetDesignSize(FILE *sfd,SplineFont *sf) { int ch; struct otfname *cur; getsint(sfd,(int16 *) &sf->design_size); while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( isdigit(ch)) { getsint(sfd,(int16 *) &sf->design_range_bottom); while ( (ch=nlgetc(sfd))==' ' ); if ( ch!='-' ) ungetc(ch,sfd); getsint(sfd,(int16 *) &sf->design_range_top); getsint(sfd,(int16 *) &sf->fontstyle_id); for (;;) { while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( !isdigit(ch)) break; cur = chunkalloc(sizeof(struct otfname)); cur->next = sf->fontstyle_name; sf->fontstyle_name = cur; getsint(sfd,(int16 *) &cur->lang); cur->name = SFDReadUTF7Str(sfd); } } } static void SFDGetOtfFeatName(FILE *sfd,SplineFont *sf) { int ch; struct otfname *cur; struct otffeatname *fn; fn = chunkalloc(sizeof(struct otffeatname)); fn->tag = gettag(sfd); for (;;) { while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( !isdigit(ch)) break; cur = chunkalloc(sizeof(struct otfname)); cur->next = fn->names; fn->names = cur; getsint(sfd,(int16 *) &cur->lang); cur->name = SFDReadUTF7Str(sfd); } fn->next = sf->feat_names; sf->feat_names = fn; } static Encoding *SFDGetEncoding(FILE *sfd, char *tok) { Encoding *enc = NULL; int encname; if ( getint(sfd,&encname) ) { if ( encname<(int)(sizeof(charset_names)/sizeof(charset_names[0])-1) ) enc = FindOrMakeEncoding(charset_names[encname]); } else { geteol(sfd,tok); enc = FindOrMakeEncoding(tok); } if ( enc==NULL ) enc = &custom; return( enc ); } static enum uni_interp SFDGetUniInterp(FILE *sfd, char *tok, SplineFont *sf) { int uniinterp = ui_none; int i; geteol(sfd,tok); for ( i=0; unicode_interp_names[i]!=NULL; ++i ) if ( strcmp(tok,unicode_interp_names[i])==0 ) { uniinterp = i; break; } /* These values are now handled by namelists */ if ( uniinterp == ui_adobe ) { sf->for_new_glyphs = NameListByName("AGL with PUA"); uniinterp = ui_none; } else if ( uniinterp == ui_greek ) { sf->for_new_glyphs = NameListByName("Greek small caps"); uniinterp = ui_none; } else if ( uniinterp == ui_ams ) { sf->for_new_glyphs = NameListByName("AMS Names"); uniinterp = ui_none; } return( uniinterp ); } static void SFDGetNameList(FILE *sfd, char *tok, SplineFont *sf) { NameList *nl; geteol(sfd,tok); nl = NameListByName(tok); if ( nl==NULL ) LogError(_("Failed to find NameList: %s"), tok); else sf->for_new_glyphs = nl; } static OTLookup *SFD_ParseNestedLookup(FILE *sfd, SplineFont *sf, int old) { uint32 tag; int ch, isgpos; OTLookup *otl; char *name; while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='~' ) return( NULL ); else if ( old ) { if ( ch!='\'' ) return( NULL ); ungetc(ch,sfd); tag = gettag(sfd); return( (OTLookup *) (intpt) tag ); } else { ungetc(ch,sfd); name = SFDReadUTF7Str(sfd); if ( name==NULL ) return( NULL ); for ( isgpos=0; isgpos<2; ++isgpos ) { for ( otl=isgpos ? sf->gpos_lookups : sf->gsub_lookups; otl!=NULL; otl=otl->next ) { if ( strcmp(name,otl->lookup_name )==0 ) goto break2; } } break2: free(name); return( otl ); } } static void SFDParseChainContext(FILE *sfd,SplineFont *sf,FPST *fpst, char *tok, int old) { int ch, i, j, k, temp; SplineFont *sli_sf = sf->cidmaster ? sf->cidmaster : sf; fpst->type = strnmatch(tok,"ContextPos",10)==0 ? pst_contextpos : strnmatch(tok,"ContextSub",10)==0 ? pst_contextsub : strnmatch(tok,"ChainPos",8)==0 ? pst_chainpos : strnmatch(tok,"ChainSub",8)==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; if ( old ) { fscanf(sfd, "%hu %hu", &((FPST1 *) fpst)->flags, &((FPST1 *) fpst)->script_lang_index ); if ( ((FPST1 *) fpst)->script_lang_index>=((SplineFont1 *) sli_sf)->sli_cnt && ((FPST1 *) fpst)->script_lang_index!=SLI_NESTED ) { static int complained=false; if ( ((SplineFont1 *) sli_sf)->sli_cnt==0 ) IError("'%c%c%c%c' has a script index out of bounds: %d\nYou MUST fix this manually", (((FPST1 *) fpst)->tag>>24), (((FPST1 *) fpst)->tag>>16)&0xff, (((FPST1 *) fpst)->tag>>8)&0xff, ((FPST1 *) fpst)->tag&0xff, ((FPST1 *) fpst)->script_lang_index ); else if ( !complained ) IError("'%c%c%c%c' has a script index out of bounds: %d", (((FPST1 *) fpst)->tag>>24), (((FPST1 *) fpst)->tag>>16)&0xff, (((FPST1 *) fpst)->tag>>8)&0xff, ((FPST1 *) fpst)->tag&0xff, ((FPST1 *) fpst)->script_lang_index ); else IError("'%c%c%c%c' has a script index out of bounds: %d\n", (((FPST1 *) fpst)->tag>>24), (((FPST1 *) fpst)->tag>>16)&0xff, (((FPST1 *) fpst)->tag>>8)&0xff, ((FPST1 *) fpst)->tag&0xff, ((FPST1 *) fpst)->script_lang_index ); if ( ((SplineFont1 *) sli_sf)->sli_cnt!=0 ) ((FPST1 *) fpst)->script_lang_index = ((SplineFont1 *) sli_sf)->sli_cnt-1; complained = true; } while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); if ( ch=='\'' ) { ungetc(ch,sfd); ((FPST1 *) fpst)->tag = gettag(sfd); } else ungetc(ch,sfd); } else { fpst->subtable = SFFindLookupSubtableAndFreeName(sf,SFDReadUTF7Str(sfd)); if ( !fpst->subtable ) LogError(_("Missing Subtable definition found in chained context")); else fpst->subtable->fpst = fpst; } 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 = malloc(fpst->nccnt*sizeof(char *)); fpst->nclassnames = calloc(fpst->nccnt,sizeof(char *)); if ( fpst->nccnt!=0 ) fpst->nclass[0] = NULL; if ( fpst->bccnt!=0 || fpst->fccnt!=0 ) { fpst->bclass = malloc(fpst->bccnt*sizeof(char *)); fpst->bclassnames = calloc(fpst->bccnt,sizeof(char *)); if (fpst->bccnt!=0 ) fpst->bclass[0] = NULL; fpst->fclass = malloc(fpst->fccnt*sizeof(char *)); fpst->fclassnames = calloc(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); if ( i==1 && j==0 && strcmp(tok,"Class0:")==0 ) i=0; getint(sfd,&temp); (&fpst->nclass)[j][i] = malloc(temp+1); (&fpst->nclass)[j][i][temp] = '\0'; nlgetc(sfd); /* skip space */ fread((&fpst->nclass)[j][i],1,temp,sfd); } } fpst->rules = calloc(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] = malloc(temp+1); (&fpst->rules[i].u.glyph.names)[j][temp] = '\0'; nlgetc(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] = malloc((&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] = malloc((&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] = malloc(temp+1); (&fpst->rules[i].u.coverage.ncovers)[j][k][temp] = '\0'; nlgetc(sfd); /* skip space */ fread((&fpst->rules[i].u.coverage.ncovers)[j][k],1,temp,sfd); } } break; default: break; } switch ( fpst->format ) { case pst_glyphs: case pst_class: case pst_coverage: getint(sfd,&fpst->rules[i].lookup_cnt); fpst->rules[i].lookups = malloc(fpst->rules[i].lookup_cnt*sizeof(struct seqlookup)); for ( j=k=0; jrules[i].lookup_cnt; ++j ) { getname(sfd,tok); getint(sfd,&fpst->rules[i].lookups[j].seq); fpst->rules[i].lookups[k].lookup = SFD_ParseNestedLookup(sfd,sf,old); if ( fpst->rules[i].lookups[k].lookup!=NULL ) ++k; } fpst->rules[i].lookup_cnt = k; break; case pst_reversecoverage: getname(sfd,tok); getint(sfd,&temp); fpst->rules[i].u.rcoverage.replacements = malloc(temp+1); fpst->rules[i].u.rcoverage.replacements[temp] = '\0'; nlgetc(sfd); /* skip space */ fread(fpst->rules[i].u.rcoverage.replacements,1,temp,sfd); break; default: break; } } getname(sfd,tok); /* EndFPST, or one of the ClassName tokens (in newer sfds) */ while ( strcmp(tok,"ClassNames:")==0 || strcmp(tok,"BClassNames:")==0 || strcmp(tok,"FClassNames:")==0 ) { int which = strcmp(tok,"ClassNames:")==0 ? 0 : strcmp(tok,"BClassNames:")==0 ? 1 : 2; int cnt = (&fpst->nccnt)[which]; char **classnames = (&fpst->nclassnames)[which]; int i; for ( i=0; itype = strnmatch(tok,"MacIndic",8)==0 ? asm_indic : strnmatch(tok,"MacContext",10)==0 ? asm_context : strnmatch(tok,"MacLigature",11)==0 ? asm_lig : strnmatch(tok,"MacSimple",9)==0 ? asm_simple : strnmatch(tok,"MacKern",7)==0 ? asm_kern : asm_insert; if ( old ) { getusint(sfd,&((ASM1 *) sm)->feature); nlgetc(sfd); /* Skip comma */ getusint(sfd,&((ASM1 *) sm)->setting); } else { sm->subtable = SFFindLookupSubtableAndFreeName(sf,SFDReadUTF7Str(sfd)); sm->subtable->sm = sm; } getusint(sfd,&sm->flags); getusint(sfd,&sm->class_cnt); getusint(sfd,&sm->state_cnt); sm->classes = malloc(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] = malloc(temp+1); sm->classes[i][temp] = '\0'; nlgetc(sfd); /* skip space */ fread(sm->classes[i],1,temp,sfd); } sm->state = malloc(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_lookup = SFD_ParseNestedLookup(sfd,sf,old); sm->state[i].u.context.cur_lookup = SFD_ParseNestedLookup(sfd,sf,old); } 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 = malloc(temp+1); sm->state[i].u.insert.mark_ins[temp] = '\0'; nlgetc(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 = malloc(temp+1); sm->state[i].u.insert.cur_ins[temp] = '\0'; nlgetc(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 = malloc(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 = malloc(len+1); while ( (ch=nlgetc(sfd))==' '); if ( ch=='"' ) ch = nlgetc(sfd); while ( ch!='"' && ch!=EOF && ptname+len ) { if ( ch=='\\' ) { *pt = (nlgetc(sfd)-'0')<<6; *pt |= (nlgetc(sfd)-'0')<<3; *pt |= (nlgetc(sfd)-'0'); } else *pt++ = ch; ch = nlgetc(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=calloc(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 = realloc(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 MMInferStuff(MMSet *mm) { int i,j; if ( mm==NULL ) return; if ( mm->apple ) { for ( i=0; iaxis_count; ++i ) { for ( j=0; jaxismaps[i].points; ++j ) { real val = mm->axismaps[i].blends[j]; if ( val == -1. ) mm->axismaps[i].min = mm->axismaps[i].designs[j]; else if ( val==0 ) mm->axismaps[i].def = mm->axismaps[i].designs[j]; else if ( val==1 ) mm->axismaps[i].max = mm->axismaps[i].designs[j]; } } } } static void SFDSizeMap(EncMap *map,int glyphcnt,int enccnt) { if ( glyphcnt>map->backmax ) { map->backmap = realloc(map->backmap,glyphcnt*sizeof(int)); memset(map->backmap+map->backmax,-1,(glyphcnt-map->backmax)*sizeof(int)); map->backmax = glyphcnt; } if ( enccnt>map->encmax ) { map->map = realloc(map->map,enccnt*sizeof(int)); memset(map->map+map->backmax,-1,(enccnt-map->encmax)*sizeof(int)); map->encmax = map->enccount = enccnt; } } static SplineFont *SFD_GetFont(FILE *sfd,SplineFont *cidmaster,char *tok, int fromdir, char *dirname, float sfdversion); static void SFD_DoAltUnis(SplineFont *sf) { int i; struct altuni *alt; SplineChar *sc; for ( i=0; iglyphcnt; ++i ) if ( (sc = sf->glyphs[i])!=NULL ) { for ( alt = sc->altuni; alt!=NULL; alt = alt->next ) { if ( alt->vs==-1 && alt->fid==0 ) { int enc = EncFromUni(alt->unienc,sf->map->enc); if ( enc!=-1 ) SFDSetEncMap(sf,sc->orig_pos,enc); } } } } static void SFDParseLookup(FILE *sfd,OTLookup *otl) { int ch; struct lookup_subtable *sub, *lastsub; FeatureScriptLangList *fl, *lastfl; struct scriptlanglist *sl, *lastsl; int i, lcnt, lmax=0; uint32 *langs=NULL; char *subname; while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='{' ) { lastsub = NULL; while ( (subname = SFDReadUTF7Str(sfd))!=NULL ) { while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); sub = chunkalloc(sizeof(struct lookup_subtable)); sub->subtable_name = subname; sub->lookup = otl; switch ( otl->lookup_type ) { case gsub_single: while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='(' ) { sub->suffix = SFDReadUTF7Str(sfd); while ( (ch=nlgetc(sfd))==' ' ); /* slurp final paren */ } else ungetc(ch,sfd); sub->per_glyph_pst_or_kern = true; break; case gsub_multiple: case gsub_alternate: case gsub_ligature: case gpos_single: sub->per_glyph_pst_or_kern = true; break; case gpos_pair: if ( (ch=nlgetc(sfd))=='(' ) { ch = nlgetc(sfd); sub->vertical_kerning = (ch=='1'); nlgetc(sfd); /* slurp final paren */ ch=nlgetc(sfd); } if ( ch=='[' ) { getsint(sfd,&sub->separation); nlgetc(sfd); /* slurp comma */ getsint(sfd,&sub->minkern); nlgetc(sfd); /* slurp comma */ ch = nlgetc(sfd); sub->kerning_by_touch = ((ch-'0')&1)?1:0; sub->onlyCloser = ((ch-'0')&2)?1:0; sub->dontautokern = ((ch-'0')&4)?1:0; nlgetc(sfd); /* slurp final bracket */ } else { ungetc(ch,sfd); } sub->per_glyph_pst_or_kern = true; break; case gpos_cursive: case gpos_mark2base: case gpos_mark2ligature: case gpos_mark2mark: sub->anchor_classes = true; break; default: break; } if ( lastsub==NULL ) otl->subtables = sub; else lastsub->next = sub; lastsub = sub; } while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='}' ) ch = nlgetc(sfd); } while ( ch==' ' ) ch = nlgetc(sfd); if ( ch=='[' ) { lastfl = NULL; for (;;) { while ( (ch=nlgetc(sfd))==' ' ); if ( ch==']' ) break; fl = chunkalloc(sizeof(FeatureScriptLangList)); if ( lastfl==NULL ) otl->features = fl; else lastfl->next = fl; lastfl = fl; if ( ch=='<' ) { int ft=0,fs=0; fscanf(sfd,"%d,%d>", &ft, &fs ); fl->ismac = true; fl->featuretag = (ft<<16) | fs; } else if ( ch=='\'' ) { ungetc(ch,sfd); fl->featuretag = gettag(sfd); } while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='(' ) { lastsl = NULL; for (;;) { while ( (ch=nlgetc(sfd))==' ' ); if ( ch==')' ) break; sl = chunkalloc(sizeof(struct scriptlanglist)); if ( lastsl==NULL ) fl->scripts = sl; else lastsl->next = sl; lastsl = sl; if ( ch=='\'' ) { ungetc(ch,sfd); sl->script = gettag(sfd); } while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='<' ) { lcnt = 0; for (;;) { while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='>' ) break; if ( ch=='\'' ) { ungetc(ch,sfd); if ( lcnt>=lmax ) langs = realloc(langs,(lmax+=10)*sizeof(uint32)); langs[lcnt++] = gettag(sfd); } } sl->lang_cnt = lcnt; if ( lcnt>MAX_LANG ) sl->morelangs = malloc((lcnt-MAX_LANG)*sizeof(uint32)); for ( i=0; ilangs[i] = langs[i]; else sl->morelangs[i-MAX_LANG] = langs[i]; } } } } } } free(langs); } static void SFDParseMathItem(FILE *sfd,SplineFont *sf,char *tok) { /* The first five characters of a math item's keyword will be "MATH:" */ /* the rest will be one of the entries in math_constants_descriptor */ int i; struct MATH *math; if ( (math = sf->MATH) == NULL ) math = sf->MATH = calloc(1,sizeof(struct MATH)); for ( i=0; math_constants_descriptor[i].script_name!=NULL; ++i ) { char *name = math_constants_descriptor[i].script_name; int len = strlen( name ); if ( strncmp(tok+5,name,len)==0 && tok[5+len] == ':' && tok[6+len]=='\0' ) { int16 *pos = (int16 *) (((char *) (math)) + math_constants_descriptor[i].offset ); getsint(sfd,pos); if ( math_constants_descriptor[i].devtab_offset != -1 ) { DeviceTable **devtab = (DeviceTable **) (((char *) (math)) + math_constants_descriptor[i].devtab_offset ); *devtab = SFDReadDeviceTable(sfd,*devtab); break; } } } } static struct baselangextent *ParseBaseLang(FILE *sfd) { struct baselangextent *bl; struct baselangextent *cur, *last; int ch; while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='{' ) { bl = chunkalloc(sizeof(struct baselangextent)); while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( ch=='\'' ) bl->lang = gettag(sfd); /* Lang or Feature tag, or nothing */ getsint(sfd,&bl->descent); getsint(sfd,&bl->ascent); last = NULL; while ( (ch=nlgetc(sfd))==' ' ); while ( ch=='{' ) { ungetc(ch,sfd); cur = ParseBaseLang(sfd); if ( last==NULL ) bl->features = cur; else last->next = cur; last = cur; while ( (ch=nlgetc(sfd))==' ' ); } if ( ch!='}' ) ungetc(ch,sfd); return( bl ); } return( NULL ); } static struct basescript *SFDParseBaseScript(FILE *sfd,struct Base *base) { struct basescript *bs; int i, ch; struct baselangextent *last, *cur; if ( base==NULL ) return(NULL); bs = chunkalloc(sizeof(struct basescript)); bs->script = gettag(sfd); getint(sfd,&bs->def_baseline); if ( base->baseline_cnt!=0 ) { bs->baseline_pos = calloc(base->baseline_cnt,sizeof(int16)); for ( i=0; ibaseline_cnt; ++i ) getsint(sfd, &bs->baseline_pos[i]); } while ( (ch=nlgetc(sfd))==' ' ); last = NULL; while ( ch=='{' ) { ungetc(ch,sfd); cur = ParseBaseLang(sfd); if ( last==NULL ) bs->langs = cur; else last->next = cur; last = cur; while ( (ch=nlgetc(sfd))==' ' ); } return( bs ); } static struct Base *SFDParseBase(FILE *sfd) { struct Base *base = chunkalloc(sizeof(struct Base)); int i; getint(sfd,&base->baseline_cnt); if ( base->baseline_cnt!=0 ) { base->baseline_tags = malloc(base->baseline_cnt*sizeof(uint32)); for ( i=0; ibaseline_cnt; ++i ) base->baseline_tags[i] = gettag(sfd); } return( base ); } static OTLookup **SFDLookupList(FILE *sfd,SplineFont *sf) { int ch; OTLookup *space[100], **buf=space, *otl, **ret; int lcnt=0, lmax=100; char *name; for (;;) { while ( (ch=nlgetc(sfd))==' ' ); if ( ch=='\n' || ch==EOF ) break; ungetc(ch,sfd); name = SFDReadUTF7Str(sfd); otl = SFFindLookup(sf,name); free(name); if ( otl!=NULL ) { if ( lcnt>lmax ) { if ( buf==space ) { buf = malloc((lmax=lcnt+50)*sizeof(OTLookup *)); memcpy(buf,space,sizeof(space)); } else buf = realloc(buf,(lmax+=50)*sizeof(OTLookup *)); } buf[lcnt++] = otl; } } if ( lcnt==0 ) return( NULL ); ret = malloc((lcnt+1)*sizeof(OTLookup *)); memcpy(ret,buf,lcnt*sizeof(OTLookup *)); ret[lcnt] = NULL; return( ret ); } static void SFDParseJustify(FILE *sfd, SplineFont *sf, char *tok) { Justify *last=NULL, *cur; struct jstf_lang *jlang, *llast; int p = 0,ch; while ( strcmp(tok,"Justify:")==0 ) { cur = chunkalloc(sizeof(Justify)); if ( last==NULL ) sf->justify = cur; else last->next = cur; last = cur; llast = jlang = NULL; cur->script = gettag(sfd); while ( getname(sfd,tok)>0 ) { if ( strcmp(tok,"Justify:")==0 || strcmp(tok,"EndJustify")==0 ) break; if ( strcmp(tok,"JstfExtender:")==0 ) { while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); geteol(sfd,tok); cur->extenders = copy(tok); } else if ( strcmp(tok,"JstfLang:")==0 ) { jlang = chunkalloc(sizeof(struct jstf_lang)); if ( llast==NULL ) cur->langs = jlang; else llast->next = jlang; llast = jlang; jlang->lang = gettag(sfd); p = -1; getint(sfd,&jlang->cnt); if ( jlang->cnt!=0 ) jlang->prios = calloc(jlang->cnt,sizeof(struct jstf_prio)); } else if ( strcmp(tok,"JstfPrio:")==0 ) { if ( jlang!=NULL ) { ++p; if ( p>= jlang->cnt ) { jlang->prios = realloc(jlang->prios,(p+1)*sizeof(struct jstf_prio)); memset(jlang->prios+jlang->cnt,0,(p+1-jlang->cnt)*sizeof(struct jstf_prio)); jlang->cnt = p+1; } } } else if ( strcmp(tok,"JstfEnableShrink:" )==0 ) { if ( p<0 ) p=0; if ( jlang!=NULL && pcnt ) jlang->prios[p].enableShrink = SFDLookupList(sfd,sf); } else if ( strcmp(tok,"JstfDisableShrink:" )==0 ) { if ( p<0 ) p=0; if ( jlang!=NULL && pcnt ) jlang->prios[p].disableShrink = SFDLookupList(sfd,sf); } else if ( strcmp(tok,"JstfMaxShrink:" )==0 ) { if ( p<0 ) p=0; if ( jlang!=NULL && pcnt ) jlang->prios[p].maxShrink = SFDLookupList(sfd,sf); } else if ( strcmp(tok,"JstfEnableExtend:" )==0 ) { if ( p<0 ) p=0; if ( jlang!=NULL && pcnt ) jlang->prios[p].enableExtend = SFDLookupList(sfd,sf); } else if ( strcmp(tok,"JstfDisableExtend:" )==0 ) { if ( p<0 ) p=0; if ( jlang!=NULL && pcnt ) jlang->prios[p].disableExtend = SFDLookupList(sfd,sf); } else if ( strcmp(tok,"JstfMaxExtend:" )==0 ) { if ( p<0 ) p=0; if ( jlang!=NULL && pcnt ) jlang->prios[p].maxExtend = SFDLookupList(sfd,sf); } else geteol(sfd,tok); } } } void SFD_GetFontMetaDataData_Init( SFD_GetFontMetaDataData* d ) { memset( d, 0, sizeof(SFD_GetFontMetaDataData)); } /** * * @return true if the function matched the current token. If true * is returned the caller should avoid further processing of 'tok' * a return of false means that the caller might try * to handle the token with another function or drop it. */ bool SFD_GetFontMetaData( FILE *sfd, char *tok, SplineFont *sf, SFD_GetFontMetaDataData* d ) { int ch; int i; KernClass* kc = 0; int old; char val[2000]; // This allows us to assume we can dereference d // at all times static SFD_GetFontMetaDataData my_static_d; static int my_static_d_is_virgin = 1; if( !d ) { if( my_static_d_is_virgin ) { my_static_d_is_virgin = 0; SFD_GetFontMetaDataData_Init( &my_static_d ); } d = &my_static_d; } if ( strmatch(tok,"FontName:")==0 ) { geteol(sfd,val); sf->fontname = copy(val); } else if ( strmatch(tok,"FullName:")==0 ) { geteol(sfd,val); sf->fullname = copy(val); } else if ( strmatch(tok,"FamilyName:")==0 ) { geteol(sfd,val); sf->familyname = copy(val); } else if ( strmatch(tok,"DefaultBaseFilename:")==0 ) { geteol(sfd,val); sf->defbasefilename = copy(val); } else if ( strmatch(tok,"Weight:")==0 ) { getprotectedname(sfd,val); sf->weight = copy(val); } else if ( strmatch(tok,"Copyright:")==0 ) { sf->copyright = getquotedeol(sfd); } else if ( strmatch(tok,"Comments:")==0 ) { char *temp = getquotedeol(sfd); sf->comments = latin1_2_utf8_copy(temp); free(temp); } else if ( strmatch(tok,"UComments:")==0 ) { sf->comments = SFDReadUTF7Str(sfd); } else if ( strmatch(tok,"FontLog:")==0 ) { sf->fontlog = SFDReadUTF7Str(sfd); } else if ( strmatch(tok,"Version:")==0 ) { geteol(sfd,val); sf->version = copy(val); } else if ( strmatch(tok,"StyleMapFamilyName:")==0 ) { sf->styleMapFamilyName = SFDReadUTF7Str(sfd); } /* Legacy attribute for StyleMapFamilyName. Deprecated. */ else if ( strmatch(tok,"OS2FamilyName:")==0 ) { if (sf->styleMapFamilyName == NULL) sf->styleMapFamilyName = SFDReadUTF7Str(sfd); } else if ( strmatch(tok,"FONDName:")==0 ) { geteol(sfd,val); sf->fondname = copy(val); } else if ( strmatch(tok,"ItalicAngle:")==0 ) { getreal(sfd,&sf->italicangle); } else if ( strmatch(tok,"StrokeWidth:")==0 ) { getreal(sfd,&sf->strokewidth); } else if ( strmatch(tok,"UnderlinePosition:")==0 ) { getreal(sfd,&sf->upos); } else if ( strmatch(tok,"UnderlineWidth:")==0 ) { getreal(sfd,&sf->uwidth); } else if ( strmatch(tok,"ModificationTime:")==0 ) { getlonglong(sfd,&sf->modificationtime); } else if ( strmatch(tok,"CreationTime:")==0 ) { getlonglong(sfd,&sf->creationtime); d->hadtimes = true; } 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,"GaspTable:")==0 ) { SFDGetGasp(sfd,sf); } else if ( strmatch(tok,"DesignSize:")==0 ) { SFDGetDesignSize(sfd,sf); } else if ( strmatch(tok,"OtfFeatName:")==0 ) { SFDGetOtfFeatName(sfd,sf); } 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.panose_set = 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; } else if ( strmatch(tok,"HheadAscent:")==0 ) { getsint(sfd,&sf->pfminfo.hhead_ascent); } else if ( strmatch(tok,"HheadAOffset:")==0 ) { int temp; getint(sfd,&temp); sf->pfminfo.hheadascent_add = temp; } else if ( strmatch(tok,"HheadDescent:")==0 ) { getsint(sfd,&sf->pfminfo.hhead_descent); } else if ( strmatch(tok,"HheadDOffset:")==0 ) { int temp; getint(sfd,&temp); sf->pfminfo.hheaddescent_add = temp; } else if ( strmatch(tok,"OS2TypoLinegap:")==0 ) { getsint(sfd,&sf->pfminfo.os2_typolinegap); } else if ( strmatch(tok,"OS2TypoAscent:")==0 ) { getsint(sfd,&sf->pfminfo.os2_typoascent); } else if ( strmatch(tok,"OS2TypoAOffset:")==0 ) { int temp; getint(sfd,&temp); sf->pfminfo.typoascent_add = temp; } else if ( strmatch(tok,"OS2TypoDescent:")==0 ) { getsint(sfd,&sf->pfminfo.os2_typodescent); } else if ( strmatch(tok,"OS2TypoDOffset:")==0 ) { int temp; getint(sfd,&temp); sf->pfminfo.typodescent_add = temp; } 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,"OS2WinAOffset:")==0 ) { int temp; getint(sfd,&temp); sf->pfminfo.winascent_add = temp; } else if ( strmatch(tok,"OS2WinDOffset:")==0 ) { int temp; getint(sfd,&temp); sf->pfminfo.windescent_add = temp; } else if ( strmatch(tok,"HHeadAscent:")==0 ) { // DUPLICATE OF ABOVE getsint(sfd,&sf->pfminfo.hhead_ascent); } else if ( strmatch(tok,"HHeadDescent:")==0 ) { // DUPLICATE OF ABOVE getsint(sfd,&sf->pfminfo.hhead_descent); } else if ( strmatch(tok,"HHeadAOffset:")==0 ) { // DUPLICATE OF ABOVE int temp; getint(sfd,&temp); sf->pfminfo.hheadascent_add = temp; } else if ( strmatch(tok,"HHeadDOffset:")==0 ) { // DUPLICATE OF ABOVE int temp; getint(sfd,&temp); sf->pfminfo.hheaddescent_add = temp; } else if ( strmatch(tok,"MacStyle:")==0 ) { getsint(sfd,&sf->macstyle); } else if ( strmatch(tok,"OS2SubXSize:")==0 ) { getsint(sfd,&sf->pfminfo.os2_subxsize); sf->pfminfo.subsuper_set = true; } else if ( strmatch(tok,"OS2SubYSize:")==0 ) { getsint(sfd,&sf->pfminfo.os2_subysize); } else if ( strmatch(tok,"OS2SubXOff:")==0 ) { getsint(sfd,&sf->pfminfo.os2_subxoff); } else if ( strmatch(tok,"OS2SubYOff:")==0 ) { getsint(sfd,&sf->pfminfo.os2_subyoff); } else if ( strmatch(tok,"OS2SupXSize:")==0 ) { getsint(sfd,&sf->pfminfo.os2_supxsize); } else if ( strmatch(tok,"OS2SupYSize:")==0 ) { getsint(sfd,&sf->pfminfo.os2_supysize); } else if ( strmatch(tok,"OS2SupXOff:")==0 ) { getsint(sfd,&sf->pfminfo.os2_supxoff); } else if ( strmatch(tok,"OS2SupYOff:")==0 ) { getsint(sfd,&sf->pfminfo.os2_supyoff); } else if ( strmatch(tok,"OS2StrikeYSize:")==0 ) { getsint(sfd,&sf->pfminfo.os2_strikeysize); } else if ( strmatch(tok,"OS2StrikeYPos:")==0 ) { getsint(sfd,&sf->pfminfo.os2_strikeypos); } else if ( strmatch(tok,"OS2CapHeight:")==0 ) { getsint(sfd,&sf->pfminfo.os2_capheight); } else if ( strmatch(tok,"OS2XHeight:")==0 ) { getsint(sfd,&sf->pfminfo.os2_xheight); } else if ( strmatch(tok,"OS2FamilyClass:")==0 ) { getsint(sfd,&sf->pfminfo.os2_family_class); } else if ( strmatch(tok,"OS2Vendor:")==0 ) { while ( isspace(nlgetc(sfd))); sf->pfminfo.os2_vendor[0] = nlgetc(sfd); sf->pfminfo.os2_vendor[1] = nlgetc(sfd); sf->pfminfo.os2_vendor[2] = nlgetc(sfd); sf->pfminfo.os2_vendor[3] = nlgetc(sfd); (void) nlgetc(sfd); } else if ( strmatch(tok,"OS2CodePages:")==0 ) { gethexints(sfd,sf->pfminfo.codepages,2); sf->pfminfo.hascodepages = true; } else if ( strmatch(tok,"OS2UnicodeRanges:")==0 ) { gethexints(sfd,sf->pfminfo.unicoderanges,4); sf->pfminfo.hasunicoderanges = true; } else if ( strmatch(tok,"TopEncoding:")==0 ) { /* Obsolete */ getint(sfd,&sf->top_enc); } else if ( strmatch(tok,"Ascent:")==0 ) { getint(sfd,&sf->ascent); } else if ( strmatch(tok,"Descent:")==0 ) { getint(sfd,&sf->descent); } else if ( strmatch(tok,"InvalidEm:")==0 ) { getint(sfd,&sf->invalidem); } else if ( strmatch(tok,"woffMajor:")==0 ) { getint(sfd,&sf->woffMajor); } else if ( strmatch(tok,"woffMinor:")==0 ) { getint(sfd,&sf->woffMinor); } else if ( strmatch(tok,"woffMetadata:")==0 ) { sf->woffMetadata = SFDReadUTF7Str(sfd); } else if ( strmatch(tok,"sfntRevision:")==0 ) { gethex(sfd,(uint32 *)&sf->sfntRevision); } else if ( strmatch(tok,"LayerCount:")==0 ) { d->had_layer_cnt = true; getint(sfd,&sf->layer_cnt); if ( sf->layer_cnt>2 ) { sf->layers = realloc(sf->layers,sf->layer_cnt*sizeof(LayerInfo)); memset(sf->layers+2,0,(sf->layer_cnt-2)*sizeof(LayerInfo)); } } else if ( strmatch(tok,"Layer:")==0 ) { // TODO: Read the U. F. O. path. int layer, o2, bk; getint(sfd,&layer); if ( layer>=sf->layer_cnt ) { sf->layers = realloc(sf->layers,(layer+1)*sizeof(LayerInfo)); memset(sf->layers+sf->layer_cnt,0,((layer+1)-sf->layer_cnt)*sizeof(LayerInfo)); sf->layer_cnt = layer+1; } getint(sfd,&o2); sf->layers[layer].order2 = o2; sf->layers[layer].background = layer==ly_back; /* Used briefly, now background is after layer name */ while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( ch!='"' ) { getint(sfd,&bk); sf->layers[layer].background = bk; } /* end of section for obsolete format */ sf->layers[layer].name = SFDReadUTF7Str(sfd); while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( ch!='\n' ) { getint(sfd,&bk); sf->layers[layer].background = bk; } while ( (ch=nlgetc(sfd))==' ' ); ungetc(ch,sfd); if ( ch!='\n' ) { sf->layers[layer].ufo_path = SFDReadUTF7Str(sfd); } } else if ( strmatch(tok,"PreferredKerning:")==0 ) { int temp; getint(sfd,&temp); sf->preferred_kerning = temp; } else if ( strmatch(tok,"StrokedFont:")==0 ) { int temp; getint(sfd,&temp); sf->strokedfont = temp; } else if ( strmatch(tok,"MultiLayer:")==0 ) { int temp; getint(sfd,&temp); sf->multilayer = temp; } else if ( strmatch(tok,"NeedsXUIDChange:")==0 ) { int temp; getint(sfd,&temp); sf->changed_since_xuidchanged = temp; } else if ( strmatch(tok,"VerticalOrigin:")==0 ) { // this doesn't seem to be written ever. int temp; getint(sfd,&temp); sf->hasvmetrics = true; } else if ( strmatch(tok,"HasVMetrics:")==0 ) { int temp; getint(sfd,&temp); sf->hasvmetrics = temp; } else if ( strmatch(tok,"Justify:")==0 ) { SFDParseJustify(sfd,sf,tok); } else if ( strmatch(tok,"BaseHoriz:")==0 ) { sf->horiz_base = SFDParseBase(sfd); d->last_base = sf->horiz_base; d->last_base_script = NULL; } else if ( strmatch(tok,"BaseVert:")==0 ) { sf->vert_base = SFDParseBase(sfd); d->last_base = sf->vert_base; d->last_base_script = NULL; } else if ( strmatch(tok,"BaseScript:")==0 ) { struct basescript *bs = SFDParseBaseScript(sfd,d->last_base); if ( d->last_base==NULL ) { BaseScriptFree(bs); bs = NULL; } else if ( d->last_base_script!=NULL ) d->last_base_script->next = bs; else d->last_base->scripts = bs; d->last_base_script = bs; } else if ( strmatch(tok,"StyleMap:")==0 ) { gethex(sfd,(uint32 *)&sf->pfminfo.stylemap); } /* Legacy attribute for StyleMap. Deprecated. */ else if ( strmatch(tok,"OS2StyleName:")==0 ) { char* sname = SFDReadUTF7Str(sfd); if (sf->pfminfo.stylemap == -1) { if (strcmp(sname,"bold italic")==0) sf->pfminfo.stylemap = 0x21; else if (strcmp(sname,"bold")==0) sf->pfminfo.stylemap = 0x20; else if (strcmp(sname,"italic")==0) sf->pfminfo.stylemap = 0x01; else if (strcmp(sname,"regular")==0) sf->pfminfo.stylemap = 0x40; } free(sname); } else if ( strmatch(tok,"FSType:")==0 ) { getsint(sfd,&sf->pfminfo.fstype); } else if ( strmatch(tok,"OS2Version:")==0 ) { getsint(sfd,&sf->os2_version); } else if ( strmatch(tok,"OS2_WeightWidthSlopeOnly:")==0 ) { int temp; getint(sfd,&temp); sf->weight_width_slope_only = temp; } else if ( strmatch(tok,"OS2_UseTypoMetrics:")==0 ) { int temp; getint(sfd,&temp); sf->use_typo_metrics = temp; } else if ( strmatch(tok,"UseUniqueID:")==0 ) { int temp; getint(sfd,&temp); sf->use_uniqueid = temp; } else if ( strmatch(tok,"UseXUID:")==0 ) { int temp; getint(sfd,&temp); sf->use_xuid = temp; } 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,"Lookup:")==0 ) { OTLookup *otl; int temp; otl = chunkalloc(sizeof(OTLookup)); getint(sfd,&temp); otl->lookup_type = temp; getint(sfd,&temp); otl->lookup_flags = temp; getint(sfd,&temp); otl->store_in_afm = temp; otl->lookup_name = SFDReadUTF7Str(sfd); if ( otl->lookup_typelastsotl==NULL ) sf->gsub_lookups = otl; else d->lastsotl->next = otl; d->lastsotl = otl; } else { if ( d->lastpotl==NULL ) sf->gpos_lookups = otl; else d->lastpotl->next = otl; d->lastpotl = otl; } SFDParseLookup(sfd,otl); } else if ( strmatch(tok,"MarkAttachClasses:")==0 ) { getint(sfd,&sf->mark_class_cnt); sf->mark_classes = malloc(sf->mark_class_cnt*sizeof(char *)); sf->mark_class_names = malloc(sf->mark_class_cnt*sizeof(char *)); sf->mark_classes[0] = NULL; sf->mark_class_names[0] = NULL; for ( i=1; imark_class_cnt; ++i ) { /* Class 0 is unused */ int temp; while ( (temp=nlgetc(sfd))=='\n' || temp=='\r' ); ungetc(temp,sfd); sf->mark_class_names[i] = SFDReadUTF7Str(sfd); getint(sfd,&temp); sf->mark_classes[i] = malloc(temp+1); sf->mark_classes[i][temp] = '\0'; nlgetc(sfd); /* skip space */ fread(sf->mark_classes[i],1,temp,sfd); } } else if ( strmatch(tok,"MarkAttachSets:")==0 ) { getint(sfd,&sf->mark_set_cnt); sf->mark_sets = malloc(sf->mark_set_cnt*sizeof(char *)); sf->mark_set_names = malloc(sf->mark_set_cnt*sizeof(char *)); for ( i=0; imark_set_cnt; ++i ) { /* Set 0 is used */ int temp; while ( (temp=nlgetc(sfd))=='\n' || temp=='\r' ); ungetc(temp,sfd); sf->mark_set_names[i] = SFDReadUTF7Str(sfd); getint(sfd,&temp); sf->mark_sets[i] = malloc(temp+1); sf->mark_sets[i][temp] = '\0'; nlgetc(sfd); /* skip space */ fread(sf->mark_sets[i],1,temp,sfd); } } else if ( strmatch(tok,"KernClass2:")==0 || strmatch(tok,"VKernClass2:")==0 || strmatch(tok,"KernClass:")==0 || strmatch(tok,"VKernClass:")==0 || strmatch(tok,"KernClass3:")==0 || strmatch(tok,"VKernClass3:")==0 ) { int kernclassversion = 0; int isv = tok[0]=='V'; int kcvoffset = (isv ? 10 : 9); //Offset to read kerning class version if (isdigit(tok[kcvoffset])) kernclassversion = tok[kcvoffset] - '0'; int temp, classstart=1; int old = (kernclassversion == 0); if ( (sf->sfd_version<2)!=old ) { IError( "Version mixup in Kerning Classes of sfd file." ); exit(1); } kc = chunkalloc(old ? sizeof(KernClass1) : sizeof(KernClass)); getint(sfd,&kc->first_cnt); ch=nlgetc(sfd); if ( ch=='+' ) classstart = 0; else ungetc(ch,sfd); getint(sfd,&kc->second_cnt); if ( old ) { getint(sfd,&temp); ((KernClass1 *) kc)->sli = temp; getint(sfd,&temp); ((KernClass1 *) kc)->flags = temp; } else { kc->subtable = SFFindLookupSubtableAndFreeName(sf,SFDReadUTF7Str(sfd)); if ( kc->subtable!=NULL && kc->subtable->kc==NULL ) kc->subtable->kc = kc; else { if ( kc->subtable==NULL ) LogError(_("Bad SFD file, missing subtable in kernclass defn.\n") ); else LogError(_("Bad SFD file, two kerning classes assigned to the same subtable: %s\n"), kc->subtable->subtable_name ); kc->subtable = NULL; } } kc->firsts = calloc(kc->first_cnt,sizeof(char *)); kc->seconds = calloc(kc->second_cnt,sizeof(char *)); kc->offsets = calloc(kc->first_cnt*kc->second_cnt,sizeof(int16)); kc->adjusts = calloc(kc->first_cnt*kc->second_cnt,sizeof(DeviceTable)); if (kernclassversion >= 3) { kc->firsts_flags = calloc(kc->first_cnt, sizeof(int)); kc->seconds_flags = calloc(kc->second_cnt, sizeof(int)); kc->offsets_flags = calloc(kc->first_cnt*kc->second_cnt, sizeof(int)); kc->firsts_names = calloc(kc->first_cnt, sizeof(char*)); kc->seconds_names = calloc(kc->second_cnt, sizeof(char*)); } kc->firsts[0] = NULL; for ( i=classstart; ifirst_cnt; ++i ) { if (kernclassversion < 3) { getint(sfd,&temp); kc->firsts[i] = malloc(temp+1); kc->firsts[i][temp] = '\0'; nlgetc(sfd); /* skip space */ fread(kc->firsts[i],1,temp,sfd); } else { getint(sfd,&kc->firsts_flags[i]); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); if (ch == '\n' || ch == EOF) continue; kc->firsts_names[i] = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); if (ch == '\n' || ch == EOF) continue; kc->firsts[i] = SFDReadUTF7Str(sfd); if (kc->firsts[i] == NULL) kc->firsts[i] = copy(""); // In certain places, this must be defined. while ((ch=nlgetc(sfd)) == ' ' || ch == '\n'); ungetc(ch, sfd); } } kc->seconds[0] = NULL; for ( i=1; isecond_cnt; ++i ) { if (kernclassversion < 3) { getint(sfd,&temp); kc->seconds[i] = malloc(temp+1); kc->seconds[i][temp] = '\0'; nlgetc(sfd); /* skip space */ fread(kc->seconds[i],1,temp,sfd); } else { getint(sfd,&temp); kc->seconds_flags[i] = temp; while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); if (ch == '\n' || ch == EOF) continue; kc->seconds_names[i] = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); if (ch == '\n' || ch == EOF) continue; kc->seconds[i] = SFDReadUTF7Str(sfd); if (kc->seconds[i] == NULL) kc->seconds[i] = copy(""); // In certain places, this must be defined. while ((ch=nlgetc(sfd)) == ' ' || ch == '\n'); ungetc(ch, sfd); } } for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) { if (kernclassversion >= 3) { getint(sfd,&temp); kc->offsets_flags[i] = temp; } getint(sfd,&temp); kc->offsets[i] = temp; SFDReadDeviceTable(sfd,&kc->adjusts[i]); } if ( !old && kc->subtable == NULL ) { /* Error. Ignore it. Free it. Whatever */; } else if ( !isv ) { if ( d->lastkc==NULL ) sf->kerns = kc; else d->lastkc->next = kc; d->lastkc = kc; } else { if ( d->lastvkc==NULL ) sf->vkerns = kc; else d->lastvkc->next = kc; d->lastvkc = kc; } } else if ( strmatch(tok,"ContextPos2:")==0 || strmatch(tok,"ContextSub2:")==0 || strmatch(tok,"ChainPos2:")==0 || strmatch(tok,"ChainSub2:")==0 || strmatch(tok,"ReverseChain2:")==0 || strmatch(tok,"ContextPos:")==0 || strmatch(tok,"ContextSub:")==0 || strmatch(tok,"ChainPos:")==0 || strmatch(tok,"ChainSub:")==0 || strmatch(tok,"ReverseChain:")==0 ) { FPST *fpst; int old; if ( strchr(tok,'2')!=NULL ) { old = false; fpst = chunkalloc(sizeof(FPST)); } else { old = true; fpst = chunkalloc(sizeof(FPST1)); } if ( (sf->sfd_version<2)!=old ) { IError( "Version mixup in FPST of sfd file." ); exit(1); } if ( d->lastfp==NULL ) sf->possub = fpst; else d->lastfp->next = fpst; d->lastfp = fpst; SFDParseChainContext(sfd,sf,fpst,tok,old); } else if ( strmatch(tok,"Group:")==0 ) { struct ff_glyphclasses *grouptmp = calloc(1, sizeof(struct ff_glyphclasses)); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); grouptmp->classname = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); grouptmp->glyphs = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' ' || ch == '\n'); ungetc(ch, sfd); if (d->lastgroup != NULL) d->lastgroup->next = grouptmp; else sf->groups = grouptmp; d->lastgroup = grouptmp; } else if ( strmatch(tok,"GroupKern:")==0 ) { int temp = 0; struct ff_rawoffsets *kerntmp = calloc(1, sizeof(struct ff_rawoffsets)); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); kerntmp->left = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); kerntmp->right = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); getint(sfd,&temp); kerntmp->offset = temp; while ((ch=nlgetc(sfd)) == ' ' || ch == '\n'); ungetc(ch, sfd); if (d->lastgroupkern != NULL) d->lastgroupkern->next = kerntmp; else sf->groupkerns = kerntmp; d->lastgroupkern = kerntmp; } else if ( strmatch(tok,"GroupVKern:")==0 ) { int temp = 0; struct ff_rawoffsets *kerntmp = calloc(1, sizeof(struct ff_rawoffsets)); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); kerntmp->left = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); kerntmp->right = SFDReadUTF7Str(sfd); while ((ch=nlgetc(sfd)) == ' '); ungetc(ch, sfd); getint(sfd,&temp); kerntmp->offset = temp; while ((ch=nlgetc(sfd)) == ' ' || ch == '\n'); ungetc(ch, sfd); if (d->lastgroupvkern != NULL) d->lastgroupvkern->next = kerntmp; else sf->groupvkerns = kerntmp; d->lastgroupvkern = kerntmp; } else if ( strmatch(tok,"MacIndic2:")==0 || strmatch(tok,"MacContext2:")==0 || strmatch(tok,"MacLigature2:")==0 || strmatch(tok,"MacSimple2:")==0 || strmatch(tok,"MacKern2:")==0 || strmatch(tok,"MacInsert2:")==0 || 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; if ( strchr(tok,'2')!=NULL ) { old = false; sm = chunkalloc(sizeof(ASM)); } else { old = true; sm = chunkalloc(sizeof(ASM1)); } if ( (sf->sfd_version<2)!=old ) { IError( "Version mixup in state machine of sfd file." ); exit(1); } if ( d->lastsm==NULL ) sf->sm = sm; else d->lastsm->next = sm; d->lastsm = sm; SFDParseStateMachine(sfd,sf,sm,tok,old); } else if ( strmatch(tok,"MacFeat:")==0 ) { sf->features = SFDParseMacFeatures(sfd,tok); } else if ( strmatch(tok,"TtfTable:")==0 ) { /* Old, binary format */ /* still used for maxp and unknown tables */ SFDGetTtfTable(sfd,sf,d->lastttf); } else if ( strmatch(tok,"TtTable:")==0 ) { /* text instruction format */ SFDGetTtTable(sfd,sf,d->lastttf); } /////////////////// else if ( strmatch(tok,"ShortTable:")==0 ) { // only read, not written. /* text number format */ SFDGetShortTable(sfd,sf,d->lastttf); } else { // // We didn't have a match ourselves. // return false; } return true; } static SplineFont *SFD_GetFont( FILE *sfd,SplineFont *cidmaster,char *tok, int fromdir, char *dirname, float sfdversion ) { SplineFont *sf; int realcnt, i, eof, mappos=-1, ch; struct table_ordering *lastord = NULL; struct axismap *lastaxismap = NULL; struct named_instance *lastnamedinstance = NULL; int pushedbacktok = false; Encoding *enc = &custom; struct remap *remap = NULL; int haddupenc; int old_style_order2 = false; int had_layer_cnt=false; orig_pos = 0; /* Only used for compatibility with extremely old sfd files */ sf = SplineFontEmpty(); sf->sfd_version = sfdversion; sf->cidmaster = cidmaster; sf->uni_interp = ui_unset; SFD_GetFontMetaDataData d; SFD_GetFontMetaDataData_Init( &d ); while ( 1 ) { if ( pushedbacktok ) pushedbacktok = false; else if ( (eof = getname(sfd,tok))!=1 ) { if ( eof==-1 ) break; geteol(sfd,tok); continue; } bool wasMetadata = SFD_GetFontMetaData( sfd, tok, sf, &d ); had_layer_cnt = d.had_layer_cnt; if( wasMetadata ) { // we have handled the token entirely // inside SFD_GetFontMetaData() move to next token. continue; } if ( strmatch(tok,"DisplaySize:")==0 ) { getint(sfd,&sf->display_size); } else if ( strmatch(tok,"DisplayLayer:")==0 ) { getint(sfd,&sf->display_layer); } else if ( strmatch(tok,"ExtremaBound:")==0 ) { getint(sfd,&sf->extrema_bound); } else if ( strmatch(tok,"WidthSeparation:")==0 ) { getint(sfd,&sf->width_separation); } 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,"Order2:")==0 ) { getint(sfd,&old_style_order2); sf->grid.order2 = old_style_order2; sf->layers[ly_back].order2 = old_style_order2; sf->layers[ly_fore].order2 = old_style_order2; } else if ( strmatch(tok,"GridOrder2:")==0 ) { int o2; getint(sfd,&o2); sf->grid.order2 = o2; } else if ( strmatch(tok,"Encoding:")==0 ) { enc = SFDGetEncoding(sfd,tok); if ( sf->map!=NULL ) sf->map->enc = enc; } else if ( strmatch(tok,"OldEncoding:")==0 ) { /* old_encname =*/ (void) SFDGetEncoding(sfd,tok); } else if ( strmatch(tok,"UnicodeInterp:")==0 ) { sf->uni_interp = SFDGetUniInterp(sfd,tok,sf); } else if ( strmatch(tok,"NameList:")==0 ) { SFDGetNameList(sfd,tok,sf); } else if ( strmatch(tok,"Compacted:")==0 ) { int temp; getint(sfd,&temp); sf->compacted = temp; } 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); remap = calloc(n+1,sizeof(struct remap)); remap[n].infont = -1; mappos = 0; if ( sf->map!=NULL ) sf->map->remap = remap; } else if ( strmatch(tok,"Remap:")==0 ) { uint32 f, l; int p; gethex(sfd,&f); gethex(sfd,&l); getint(sfd,&p); if ( remap!=NULL && remap[mappos].infont!=-1 ) { remap[mappos].firstenc = f; remap[mappos].lastenc = l; 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(sfd,sf->grid.order2); } else if ( strmatch(tok,"ScriptLang:")==0 ) { int i,j,k; int imax, jmax, kmax; if ( sf->sfd_version==0 || sf->sfd_version>=2 ) { IError( "Script lang lists should not happen in version 2 sfd files." ); SplineFontFree(sf); return NULL; } getint(sfd,&imax); ((SplineFont1 *) sf)->sli_cnt = imax; ((SplineFont1 *) sf)->script_lang = malloc((imax+1)*sizeof(struct script_record *)); ((SplineFont1 *) sf)->script_lang[imax] = NULL; for ( i=0; iscript_lang[i] = malloc((jmax+1)*sizeof(struct script_record)); ((SplineFont1 *) sf)->script_lang[i][jmax].script = 0; for ( j=0; jscript_lang[i][j].script = gettag(sfd); getint(sfd,&kmax); ((SplineFont1 *) sf)->script_lang[i][j].langs = malloc((kmax+1)*sizeof(uint32)); ((SplineFont1 *) sf)->script_lang[i][j].langs[kmax] = 0; for ( k=0; kscript_lang[i][j].langs[k] = gettag(sfd); } } } } else if ( strmatch(tok,"TeXData:")==0 ) { int temp; getint(sfd,&temp); sf->texdata.type = temp; getint(sfd, &temp); if ( sf->design_size==0 ) { sf->design_size = (5*temp+(1<<18))>>19; } for ( i=0; i<22; ++i ) { int foo; getint(sfd,&foo); sf->texdata.params[i]=foo; } } else if ( strnmatch(tok,"AnchorClass",11)==0 ) { char *name; AnchorClass *lastan = NULL, *an; int old = strchr(tok,'2')==NULL; while ( (name=SFDReadUTF7Str(sfd))!=NULL ) { an = chunkalloc(old ? sizeof(AnchorClass1) : sizeof(AnchorClass)); an->name = name; if ( old ) { getname(sfd,tok); if ( tok[0]=='0' && tok[1]=='\0' ) ((AnchorClass1 *) 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; } ((AnchorClass1 *) an)->feature_tag = (tok[0]<<24) | (tok[1]<<16) | (tok[2]<<8) | tok[3]; } while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); ungetc(ch,sfd); if ( isdigit(ch)) { int temp; getint(sfd,&temp); ((AnchorClass1 *) an)->flags = temp; } while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); ungetc(ch,sfd); if ( isdigit(ch)) { int temp; getint(sfd,&temp); ((AnchorClass1 *) an)->script_lang_index = temp; } else ((AnchorClass1 *) an)->script_lang_index = 0xffff; /* Will be fixed up later */ while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); ungetc(ch,sfd); if ( isdigit(ch)) { int temp; getint(sfd,&temp); ((AnchorClass1 *) an)->merge_with = temp; } else ((AnchorClass1 *) an)->merge_with = 0xffff; /* Will be fixed up later */ } else { char *subtable_name = SFDReadUTF7Str(sfd); if ( subtable_name!=NULL) /* subtable is optional */ an->subtable = SFFindLookupSubtableAndFreeName(sf,subtable_name); } while ( (ch=nlgetc(sfd))==' ' || ch=='\t' ); ungetc(ch,sfd); if ( isdigit(ch) ) { /* Early versions of SfdFormat 2 had a number here */ int temp; getint(sfd,&temp); an->type = temp; } else if ( old ) { if ( ((AnchorClass1 *) an)->feature_tag==CHR('c','u','r','s')) an->type = act_curs; else if ( ((AnchorClass1 *) an)->feature_tag==CHR('m','k','m','k')) an->type = act_mkmk; else an->type = act_mark; } else { an->type = act_mark; if( an->subtable && an->subtable->lookup ) { switch ( an->subtable->lookup->lookup_type ) { case gpos_cursive: an->type = act_curs; break; case gpos_mark2base: an->type = act_mark; break; case gpos_mark2ligature: an->type = act_mklg; break; case gpos_mark2mark: an->type = act_mkmk; break; default: an->type = act_mark; break; } } } if ( lastan==NULL ) sf->anchor = an; else lastan->next = an; lastan = an; } } else if ( strncmp(tok,"MATH:",5)==0 ) { SFDParseMathItem(sfd,sf,tok); } else if ( strmatch(tok,"TableOrder:")==0 ) { int temp; struct table_ordering *ord; if ( sfdversion==0 || sfdversion>=2 ) { IError("Table ordering specified in version 2 sfd file.\n" ); SplineFontFree(sf); return NULL; } ord = chunkalloc(sizeof(struct table_ordering)); ord->table_tag = gettag(sfd); getint(sfd,&temp); ord->ordered_features = malloc((temp+1)*sizeof(uint32)); ord->ordered_features[temp] = 0; for ( i=0; iordered_features[i] = gettag(sfd); } else if ( ch=='<' ) { int f,s; fscanf(sfd,"%d,%d>", &f, &s ); ord->ordered_features[i] = (f<<16)|s; } } if ( lastord==NULL ) ((SplineFont1 *) 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); } else if ( strmatch(tok,"PickledData:")==0 ) { if (sf->python_persistent != NULL) { #if defined(_NO_PYTHON) free( sf->python_persistent ); /* It's a string of pickled data which we leave as a string */ #else PyFF_FreePythonPersistent(sf->python_persistent); #endif sf->python_persistent = NULL; } sf->python_persistent = SFDUnPickle(sfd, 0); sf->python_persistent_has_lists = 0; } else if ( strmatch(tok,"PickledDataWithLists:")==0 ) { if (sf->python_persistent != NULL) { #if defined(_NO_PYTHON) free( sf->python_persistent ); /* It's a string of pickled data which we leave as a string */ #else PyFF_FreePythonPersistent(sf->python_persistent); #endif sf->python_persistent = NULL; } sf->python_persistent = SFDUnPickle(sfd, 1); sf->python_persistent_has_lists = 1; } else if ( strmatch(tok,"MMCounts:")==0 ) { MMSet *mm = sf->mm = chunkalloc(sizeof(MMSet)); getint(sfd,&mm->instance_count); getint(sfd,&mm->axis_count); ch = nlgetc(sfd); if ( ch!=' ' ) ungetc(ch,sfd); else { int temp; getint(sfd,&temp); mm->apple = temp; getint(sfd,&mm->named_instance_count); } mm->instances = calloc(mm->instance_count,sizeof(SplineFont *)); mm->positions = malloc(mm->instance_count*mm->axis_count*sizeof(real)); mm->defweights = malloc(mm->instance_count*sizeof(real)); mm->axismaps = calloc(mm->axis_count,sizeof(struct axismap)); if ( mm->named_instance_count!=0 ) mm->named_instances = calloc(mm->named_instance_count,sizeof(struct named_instance)); } 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 = malloc(points*sizeof(real)); mm->axismaps[index].designs = malloc(points*sizeof(real)); for ( i=0; iaxismaps[index].blends[i]); while ( (ch=nlgetc(sfd))!=EOF && isspace(ch)); ungetc(ch,sfd); if ( (ch=nlgetc(sfd))!='=' ) ungetc(ch,sfd); else if ( (ch=nlgetc(sfd))!='>' ) ungetc(ch,sfd); getreal(sfd,&mm->axismaps[index].designs[i]); } lastaxismap = &mm->axismaps[index]; lastnamedinstance = NULL; } } else if ( strmatch(tok,"MMNamedInstance:")==0 ) { MMSet *mm = sf->mm; if ( mm!=NULL ) { int index; getint(sfd,&index); mm->named_instances[index].coords = malloc(mm->axis_count*sizeof(real)); for ( i=0; iaxis_count; ++i ) getreal(sfd,&mm->named_instances[index].coords[i]); lastnamedinstance = &mm->named_instances[index]; lastaxismap = NULL; } } else if ( strmatch(tok,"MacName:")==0 ) { struct macname *names = SFDParseMacNames(sfd,tok); if ( lastaxismap!=NULL ) lastaxismap->axisnames = names; else if ( lastnamedinstance !=NULL ) lastnamedinstance->names = names; pushedbacktok = true; } 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); ff_progress_change_stages(cnt); ff_progress_change_total(realcnt); MMInferStuff(sf->mm); break; } else if ( strmatch(tok,"BeginSubFonts:")==0 ) { getint(sfd,&sf->subfontcnt); sf->subfonts = calloc(sf->subfontcnt,sizeof(SplineFont *)); getint(sfd,&realcnt); sf->map = EncMap1to1(realcnt); ff_progress_change_stages(2); ff_progress_change_total(realcnt); break; } else if ( strmatch(tok,"BeginChars:")==0 ) { int charcnt; getint(sfd,&charcnt); if (charcntchar_cnt) { IError("SFD file specifies too few slots for its encoding.\n" ); exit( 1 ); } if ( getint(sfd,&realcnt)!=1 || realcnt==-1 ) realcnt = charcnt; else ++realcnt; /* value saved is max glyph, not glyph cnt */ ff_progress_change_total(realcnt); sf->glyphcnt = sf->glyphmax = realcnt; sf->glyphs = calloc(realcnt,sizeof(SplineChar *)); if ( cidmaster!=NULL ) { sf->map = cidmaster->map; } else { sf->map = EncMapNew(charcnt,realcnt,enc); sf->map->remap = remap; } SFDSizeMap(sf->map,sf->glyphcnt,charcnt); 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 ) { ff_progress_change_stages(2*sf->subfontcnt); for ( i=0; isubfontcnt; ++i ) { if ( i!=0 ) ff_progress_next_stage(); sf->subfonts[i] = SFD_GetFont(sfd,sf,tok,fromdir,dirname,sfdversion); } } else if ( sf->mm!=NULL ) { MMSet *mm = sf->mm; ff_progress_change_stages(2*(mm->instance_count+1)); for ( i=0; iinstance_count; ++i ) { if ( i!=0 ) ff_progress_next_stage(); mm->instances[i] = SFD_GetFont(sfd,NULL,tok,fromdir,dirname,sfdversion); EncMapFree(mm->instances[i]->map); mm->instances[i]->map=NULL; mm->instances[i]->mm = mm; } ff_progress_next_stage(); mm->normal = SFD_GetFont(sfd,NULL,tok,fromdir,dirname,sfdversion); mm->normal->mm = mm; sf->mm = NULL; SplineFontFree(sf); sf = mm->normal; if ( sf->map->enc!=&custom ) { EncMap *map; MMMatchGlyphs(mm); /* sfd files from before the encoding change can have mismatched orig pos */ map = EncMapFromEncoding(sf,sf->map->enc); EncMapFree(sf->map); sf->map = map; } } else { while ( SFDGetChar(sfd,sf,had_layer_cnt)!=NULL ) { ff_progress_next(); } ff_progress_next_stage(); } haddupenc = false; while ( getname(sfd,tok)==1 ) { if ( strcmp(tok,"EndSplineFont")==0 || strcmp(tok,"EndSubSplineFont")==0 ) break; else if ( strmatch(tok,"DupEnc:")==0 ) { int enc, orig; haddupenc = true; if ( getint(sfd,&enc) && getint(sfd,&orig) && sf->map!=NULL ) { SFDSetEncMap(sf,orig,enc); } } } if ( sf->cidmaster==NULL ) SFDFixupRefs(sf); if ( !haddupenc ) SFD_DoAltUnis(sf); else AltUniFigure(sf,sf->map,true); if ( !d.hadtimes ) SFTimesFromFile(sf,sfd); return( sf ); } void SFTimesFromFile(SplineFont *sf,FILE *file) { struct stat b; if ( fstat(fileno(file),&b)!=-1 ) { sf->modificationtime = b.st_mtime; sf->creationtime = b.st_mtime; } } static double SFDStartsCorrectly(FILE *sfd,char *tok) { real dval; int ch; if ( getname(sfd,tok)!=1 ) return( -1 ); if ( strcmp(tok,"SplineFontDB:")!=0 ) return( -1 ); if ( getreal(sfd,&dval)!=1 ) return( -1 ); /* We don't yet generate version 4 of sfd. It will contain backslash */ /* newline in the middle of very long lines. I've put in code to parse */ /* this sequence, but I don't yet generate it. I want the parser to */ /* perculate through to users before I introduce the new format so there */ /* will be fewer complaints when it happens */ // MIQ: getreal() can give some funky rounding errors it seems if ( dval!=2.0 && dval!=3.0 && !(dval > 3.09 && dval <= 3.11) && dval!=4.0 ) { LogError("Bad SFD Version number %.1f", dval ); return( -1 ); } ch = nlgetc(sfd); ungetc(ch,sfd); if ( ch!='\r' && ch!='\n' ) return( -1 ); return( dval ); } static SplineFont *SFD_Read(char *filename,FILE *sfd, int fromdir) { SplineFont *sf=NULL; char tok[2000]; double version; if ( sfd==NULL ) { if ( fromdir ) { snprintf(tok,sizeof(tok),"%s/" FONT_PROPS, filename ); sfd = fopen(tok,"r"); } else sfd = fopen(filename,"r"); } if ( sfd==NULL ) return( NULL ); ff_locale_t tmplocale, oldlocale; // Declare temporary locale storage. switch_to_c_locale(&tmplocale, &oldlocale); // Switch to the C locale temporarily and cache the old locale. ff_progress_change_stages(2); if ( (version = SFDStartsCorrectly(sfd,tok))!=-1 ) sf = SFD_GetFont(sfd,NULL,tok,fromdir,filename,version); switch_to_old_locale(&tmplocale, &oldlocale); // Switch to the cached locale. 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 ); } SplineFont *SFDRead(char *filename) { return( SFD_Read(filename,NULL,false)); } dvisvgm-2.8.1/libs/ff-woff/fontforge/splinechar.c0000664000175000017500000002271313510660062016700 00000000000000/* -*- coding: utf-8 -*- */ /* Copyright (C) 2000-2012 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 "fontforgevw.h" # include #ifdef HAVE_IEEEFP_H # include /* Solaris defines isnan in ieeefp rather than math.h */ #endif int adjustwidth = true; RefChar *HasUseMyMetrics(SplineChar *sc,int layer) { RefChar *r; if ( layer==ly_grid ) layer = ly_fore; for ( r=sc->layers[layer].refs; r!=NULL; r=r->next ) if ( r->use_my_metrics ) return( r ); return( NULL ); } /* 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) { struct splinecharlist *dlist; RefChar *r = HasUseMyMetrics(sc,ly_fore); int isprobablybase; sc->widthset = true; if( r!=NULL ) { if ( oldwidth==r->sc->width ) { sc->width = r->sc->width; return; } newwidth = r->sc->width; } if ( newwidth==oldwidth ) return; sc->width = newwidth; if ( !adjustwidth ) return; isprobablybase = true; if ( sc->unicodeenc==-1 || sc->unicodeenc>=0x10000 || !isalpha(sc->unicodeenc) || iscombining(sc->unicodeenc)) isprobablybase = false; for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) { RefChar *metrics = HasUseMyMetrics(dlist->sc,ly_fore); if ( metrics!=NULL && metrics->sc!=sc ) continue; else if ( metrics==NULL && !isprobablybase ) continue; if ( dlist->sc->width==oldwidth && (metrics!=NULL)) { SCSynchronizeWidth(dlist->sc,newwidth,oldwidth); if ( !dlist->sc->changed ) { dlist->sc->changed = true; } } } } static int _SCRefNumberPoints2(SplineSet **_rss,SplineChar *sc,int pnum,int layer) { SplineSet *ss, *rss = *_rss; SplinePoint *sp, *rsp; RefChar *r; int starts_with_cp, startcnt; for ( ss=sc->layers[layer].splines; ss!=NULL; ss=ss->next, rss=rss->next ) { if ( rss==NULL ) /* Can't happen */ break; starts_with_cp = !ss->first->noprevcp && ((ss->first->ttfindex == pnum+1 && ss->first->prev!=NULL && ss->first->prev->from->nextcpindex==pnum ) || ((ss->first->ttfindex==0xffff || SPInterpolate( ss->first )))); startcnt = pnum; if ( starts_with_cp ) ++pnum; for ( sp = ss->first, rsp=rss->first; ; ) { if ( sp->ttfindex==0xffff || SPInterpolate( sp )) rsp->ttfindex = 0xffff; else rsp->ttfindex = pnum++; if ( sp->next==NULL ) break; if ( sp->next!=NULL && sp->next->to == ss->first ) { if ( sp->nonextcp ) rsp->nextcpindex = 0xffff; else if ( starts_with_cp ) rsp->nextcpindex = startcnt; else rsp->nextcpindex = pnum++; break; } if ( sp->nonextcp ) rsp->nextcpindex = 0xffff; else rsp->nextcpindex = pnum++; if ( sp->next==NULL ) break; sp = sp->next->to; rsp = rsp->next->to; } } *_rss = rss; for ( r = sc->layers[layer].refs; r!=NULL; r=r->next ) pnum = _SCRefNumberPoints2(_rss,r->sc,pnum,layer); return( pnum ); } static int SCRefNumberPoints2(RefChar *ref,int pnum,int layer) { SplineSet *rss; rss = ref->layers[0].splines; return( _SCRefNumberPoints2(&rss,ref->sc,pnum,layer)); } int SSTtfNumberPoints(SplineSet *ss) { int pnum=0; SplinePoint *sp; int starts_with_cp; for ( ; ss!=NULL; ss=ss->next ) { starts_with_cp = !ss->first->noprevcp && ((ss->first->ttfindex == pnum+1 && ss->first->prev!=NULL && ss->first->prev->from->nextcpindex==pnum ) || SPInterpolate( ss->first )); if ( starts_with_cp && ss->first->prev!=NULL ) ss->first->prev->from->nextcpindex = pnum++; for ( sp=ss->first; ; ) { if ( SPInterpolate(sp) ) sp->ttfindex = 0xffff; else sp->ttfindex = pnum++; if ( sp->nonextcp && sp->nextcpindex!=pnum ) sp->nextcpindex = 0xffff; else if ( !starts_with_cp || (sp->next!=NULL && sp->next->to!=ss->first) ) sp->nextcpindex = pnum++; if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } } return( pnum ); } static int SSPsNumberPoints(SplineChar *sc, SplineSet *splines,int pnum) { SplineSet *ss; SplinePoint *sp; for ( ss = splines; ss!=NULL; ss=ss->next ) { for ( sp=ss->first; ; ) { sp->ttfindex = pnum++; sp->nextcpindex = 0xffff; if ( sc->numberpointsbackards ) { if ( sp->prev==NULL ) break; if ( !sp->noprevcp || !sp->prev->from->nonextcp ) pnum += 2; sp = sp->prev->from; } else { if ( sp->next==NULL ) break; if ( !sp->nonextcp || !sp->next->to->noprevcp ) pnum += 2; sp = sp->next->to; } if ( sp==ss->first ) break; } } return( pnum ); } int SCNumberPoints(SplineChar *sc,int layer) { int pnum=0; SplineSet *ss; SplinePoint *sp; RefChar *ref; if ( layer<0 || layer>=sc->layer_cnt ) return( pnum ); if ( sc->layers[layer].order2 ) { /* TrueType and its complexities. I ignore svg here */ if ( sc->layers[layer].refs!=NULL ) { /* if there are references there can't be splines. So if we've got*/ /* splines mark all point numbers on them as meaningless */ for ( ss = sc->layers[layer].splines; ss!=NULL; ss=ss->next ) { for ( sp=ss->first; ; ) { sp->ttfindex = 0xfffe; if ( !sp->nonextcp ) sp->nextcpindex = 0xfffe; if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } } for ( ref = sc->layers[layer].refs; ref!=NULL; ref=ref->next ) pnum = SCRefNumberPoints2(ref,pnum,layer); } else { pnum = SSTtfNumberPoints(sc->layers[layer].splines); } } else { /* cubic (PostScript/SVG) splines */ int first, last; if ( sc->parent->multilayer ) { first = ly_fore; last = sc->layer_cnt-1; } else first = last = layer; for ( layer=first; layer<=last; ++layer ) { for ( ref = sc->layers[layer].refs; ref!=NULL; ref=ref->next ) pnum = SSPsNumberPoints(sc,ref->layers[0].splines,pnum); pnum = SSPsNumberPoints(sc,sc->layers[layer].splines,pnum); } } return( pnum ); } int SCPointsNumberedProperly(SplineChar *sc,int layer) { int pnum=0, skipit; SplineSet *ss; SplinePoint *sp; int starts_with_cp; int start_pnum; if ( sc->layers[layer].splines!=NULL && sc->layers[layer].refs!=NULL ) return( false ); /* TrueType can't represent this, so always remove instructions. They can't be meaningful */ for ( ss = sc->layers[layer].splines; ss!=NULL; ss=ss->next ) { starts_with_cp = (ss->first->ttfindex == pnum+1 || ss->first->ttfindex==0xffff) && !ss->first->noprevcp; start_pnum = pnum; if ( starts_with_cp ) ++pnum; for ( sp=ss->first; ; ) { skipit = SPInterpolate(sp); if ( sp->nonextcp || sp->noprevcp ) skipit = false; if ( sp->ttfindex==0xffff && skipit ) /* Doesn't count */; else if ( sp->ttfindex!=pnum ) return( false ); else ++pnum; if ( sp->nonextcp && sp->nextcpindex==0xffff ) /* Doesn't count */; else if ( sp->nextcpindex==pnum ) ++pnum; else if ( sp->nextcpindex==start_pnum && starts_with_cp && (sp->next!=NULL && sp->next->to==ss->first) ) /* Ok */; else return( false ); if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp==ss->first ) break; } /* if ( starts_with_cp ) --pnum; */ } return( true ); } void AltUniAdd(SplineChar *sc,int uni) { struct altuni *altuni; if ( sc!=NULL && uni!=-1 && uni!=sc->unicodeenc ) { for ( altuni = sc->altuni; altuni!=NULL && (altuni->unienc!=uni || altuni->vs!=-1 || altuni->fid); altuni=altuni->next ); if ( altuni==NULL ) { altuni = chunkalloc(sizeof(struct altuni)); altuni->next = sc->altuni; sc->altuni = altuni; altuni->unienc = uni; altuni->vs = -1; altuni->fid = 0; } } } void AltUniAdd_DontCheckDups(SplineChar *sc,int uni) { struct altuni *altuni; if ( sc!=NULL && uni!=-1 && uni!=sc->unicodeenc ) { altuni = chunkalloc(sizeof(struct altuni)); altuni->next = sc->altuni; sc->altuni = altuni; altuni->unienc = uni; altuni->vs = -1; altuni->fid = 0; } } dvisvgm-2.8.1/libs/ff-woff/fontforge/ttfinstrs.c0000664000175000017500000002551613510660062016614 00000000000000/* Copyright (C) 2001-2012 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 "fontforgevw.h" #include #include "ttf.h" #include "ttfinstrs.h" const char *ff_ttf_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-rp0]", "MSIRP[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" }; enum byte_types { bt_instr, bt_cnt, bt_byte, bt_wordhi, bt_wordlo, bt_impliedreturn }; uint8 *_IVParse(SplineFont *sf, char *text, int *len, void (*IVError)(void *,char *, int), void *iv) { short numberstack[256]; int npos=0, nread, i; int push_left= 0, push_size=0; char *pt; char *end, *bend, *brack; int icnt=0, imax=strlen(text)/2, val, temp; uint8 *instrs = malloc(imax); for ( pt = text; *pt ; ++pt ) { npos = 0; while ( npos<256 ) { while ( *pt==' ' || *pt=='\t' ) ++pt; if ( isdigit( *pt ) || *pt=='-' ) { val = strtol(pt,&end,0); if ( val>32767 || val<-32768 ) { IVError(iv,_("A value must be between [-32768,32767]"),pt-text); return( NULL ); } pt = end; if ( *pt == '@' ) { /* a delta control byte */ if ( val>8 || val<-8 || val==0 ) { IVError(iv,_("A value must be between [-8,-1] or [1,8]"),pt-text); return( NULL ); } pt++; if ( !isdigit( *pt ) ) { IVError(iv,_("Number expected"),pt-text); return( NULL ); } temp = val; val = strtol(pt,&end,0); if ( val>15 || val<0 ) { IVError(iv,_("A value must be between [0,15]"),pt-text); return( NULL ); } val *= 16; if (temp < 0) temp += 8; else temp += 7; val += temp; pt = end; } numberstack[npos++] = val; } else if ( strnmatch(pt,"cvt",3)==0 ) { pt += 3; while ( *pt==' ' || *pt=='\t' ) ++pt; if ( *pt!='(' ) { IVError(iv,_("Missing left parenthesis in command to get a cvt index"),pt-text); return( NULL ); } temp = strtol(pt+1,&end,0); pt = end; while ( *pt==' ' || *pt=='\t' ) ++pt; if ( *pt!=')' ) { IVError(iv,_("Missing right paren in command to get a cvt index"),pt-text); return( NULL ); } numberstack[npos++] = TTF__getcvtval(sf,temp); ++pt; } else break; } while ( *pt==' ' || *pt=='\t' ) ++pt; if ( npos==0 && (*pt=='\r' || *pt=='\n' || *pt=='\0') ) continue; nread = 0; if ( push_left==-1 ) { /* we need a push count */ if ( npos==0 ) IVError(iv,_("Expected a number for a push count"),pt-text); else if ( numberstack[0]>255 || numberstack[0]<=0 ) { IVError(iv,_("The push count must be a number between 0 and 255"),pt-text); return( NULL ); } 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,_("A value to be pushed by a byte push must be between 0 and 255"),pt-text); return( NULL ); } else instrs[icnt++] = numberstack[nread++]; --push_left; } if ( nread0 ) { IVError(iv,_("Missing pushes"),pt-text); return( NULL ); } 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= pt; *end!='\r' && *end!='\n' && *end!=' ' && *end!='\0'; ++end ) if ( *end=='[' || *end=='_' ) brack=end; for ( i=0; i<256; ++i ) if ( strnmatch(pt,ff_ttf_instrnames[i],end-pt)==0 && end-pt==strlen(ff_ttf_instrnames[i])) break; if ( i==256 && brack!=NULL ) { for ( i=0; i<256; ++i ) if ( strnmatch(pt,ff_ttf_instrnames[i],brack-pt+1)==0 ) break; val = strtol(brack+1,&bend,2); /* Stuff in brackets should be in binary */ while ( *bend==' ' || *bend=='\t' ) ++bend; if ( *bend!=']' ) { IVError(iv,_("Missing right bracket in command (or bad binary value in bracket)"),pt-text); return( NULL ); } if ( val>=32 ) { IVError(iv,_("Bracketted value is too large"),pt-text); return( NULL ); } 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; } *len = icnt; return( realloc(instrs,icnt==0?1:icnt)); /* some versions of realloc abort on 0 */ } dvisvgm-2.8.1/libs/ff-woff/fontforge/ttf.h0000664000175000017500000007426013510660062015356 00000000000000/* Copyright (C) 2001-2012 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 "psfont.h" /* for struct fddata */ #define MAC_DELETED_GLYPH_NAME "" struct taxis { uint32 tag; real min, def, max; /* in user design space */ int nameid; int paircount; real *mapfrom; /* after conversion from [-1,1] */ real *mapto; /* secondary conversiont to [-1,1] */ }; struct tinstance { int nameid; real *coords; /* Location along axes array[axis_count] */ }; struct tuples { real *coords; /* Location along axes array[axis_count] */ SplineChar **chars; /* Varied glyphs, array parallels one in info */ struct ttf_table *cvt; KernClass *khead, *klast, *vkhead, *vklast; /* Varied kern classes */ }; struct variations { int axis_count; struct taxis *axes; /* Array of axis_count entries */ int instance_count; /* Not master designs, but named interpolations in design space */ struct tinstance *instances; int tuple_count; struct tuples *tuples; }; enum gsub_inusetype { git_normal, git_justinuse, git_findnames }; struct macidname { int id; struct macname *head, *last; struct macidname *next; }; struct savetab { uint32 tag; uint32 offset; int len; }; 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 */ unsigned int strokedfont: 1; /* painttype==2 for otf */ unsigned int use_typo_metrics: 1; unsigned int weight_width_slope_only: 1; unsigned int optimized_for_cleartype: 1; unsigned int apply_lsb: 1; int sfntRevision; enum openflags openflags; /* 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 */ real strokewidth; int fstype; struct psdict *private; /* Only for open type cff fonts */ EncMap *map; enum uni_interp uni_interp; struct pfminfo pfminfo; short os2_version; short gasp_version; int dupnamestate; struct ttflangname *names; char *fontcomments, *fontlog; char **cvt_names; 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 */ LayerInfo *layers; int layer_cnt; 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; /* BASE */ uint32 base_start; /* Offset from sof to start of 'BASE' table */ /* CFF */ uint32 cff_start; /* Offset from sof to start of postscript compact font format */ uint32 cff_length; /* cmap */ uint32 encoding_start; /* Offset from sof to start of encoding table */ uint32 vs_start; /* Offset within 'cmap' to variant selector table */ /* gasp */ uint32 gasp_start; /* glyf */ uint32 glyph_start; /* Offset from sof to start of glyph table */ uint32 glyph_length; /* GDEF */ uint32 gdef_start; /* Offset from sof to start of GDEF table (glyph class defn, ligature carets) */ uint32 gdef_length; /* GPOS */ uint32 gpos_start; /* Offset from sof to start of GPOS table */ uint32 gpos_length; /* GSUB */ uint32 gsub_start; /* Offset from sof to start of GSUB table */ uint32 gsub_length; uint32 g_bounds; /* Filled in with g???_start+g???_length */ /* EBDT, bdat */ uint32 bitmapdata_start; /* Offset to start of bitmap data */ uint32 bitmapdata_length; /* EBLT, bloc */ uint32 bitmaploc_start; /* Offset to start of bitmap locator data */ uint32 bitmaploc_length; /* gvar, etc. */ uint32 gvar_start, gvar_len; uint32 fvar_start, fvar_len; uint32 avar_start, avar_len; uint32 cvar_start, cvar_len; /* head */ uint32 head_start; /* hhea */ uint32 hhea_start; /* hmtx */ uint32 hmetrics_start; /* JSTF */ uint32 jstf_start; uint32 jstf_length; /* kern */ uint32 kern_start; /* loca */ uint32 glyphlocations_start;/* there are glyph_cnt of these, from maxp tab */ uint32 loca_length; /* actually glypn_cnt is wrong. Use the table length (divided by size) instead */ /* maxp */ uint32 maxp_start; /* maximum number of glyphs */ uint32 maxp_len; /* name */ uint32 copyright_start; /* copyright and fontname */ /* post */ uint32 postscript_start; /* names for the glyphs, italic angle, etc. */ /* OS/2 */ uint32 os2_start; /* TYP1 */ uint32 typ1_start; /* For Adobe's? Apple's? attempt to stuff a type1 font into an sfnt wrapper */ uint32 typ1_length; /* vhea */ uint32 vhea_start; /* vmtx */ uint32 vmetrics_start; /* VORG */ uint32 vorg_start; /* PfEd -- FontForge/PfaEdit specific info */ uint32 pfed_start; /* TeX -- TeX table, also non-standard */ uint32 tex_start; /* BDF -- BDF properties, also non-standard */ uint32 bdf_start; /* FFTM -- FontForge timestamps */ uint32 fftm_start; /* Apple Advanced Typography Tables */ uint32 prop_start; uint32 lcar_start; uint32 opbd_start; uint32 acnt_start; uint32 feat_start; uint32 mort_start; uint32 morx_start; uint32 bsln_start; /* MATH Table */ uint32 math_start; uint32 math_length; /* Info for instructions */ uint32 cvt_start, cvt_len; uint32 prep_start, prep_len; uint32 fpgm_start, fpgm_len; 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 */ unsigned int wdthcomplain: 1; /* We've complained about advance widths exceding the max */ unsigned int bbcomplain: 1; /* We've complained about glyphs being outside the bounding box */ unsigned int gbbcomplain: 1; /* We've complained about points being outside the bounding box */ 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; OTLookup *gpos_lookups, *gsub_lookups, *cur_lookups; OTLookup *mort_subs_lookup, *mort_pos_lookup2; int mort_r2l, mort_tag_mac, mort_feat, mort_setting, mort_is_nested; uint16 *morx_classes; uint16 *bsln_values; int mort_max; struct ttf_table *tabs; FPST *possub; ASM *sm; MacFeat *features; char *chosenname; int macstyle; int lookup_cnt; /* Max lookup in current GPOS/GSUB table */ int feature_cnt; /* Max feature in current GPOS/GSUB table */ struct variations *variations; struct macidname *macstrids; struct fontdict *fd; /* For reading in Type42 fonts. Glyph names in postscript section must be associated with glyphs in TTF section */ int savecnt; struct savetab *savetab; int32 last_size_pos; uint16 design_size; uint16 fontstyle_id; struct otfname *fontstyle_name; uint16 design_range_bottom, design_range_top; struct texdata texdata; int mark_class_cnt; char **mark_classes; /* glyph name list */ char **mark_class_names; /* used within ff (utf8) */ int mark_set_cnt; char **mark_sets; /* glyph name list */ char **mark_set_names; /* used within ff (utf8) */ uint8 warned_morx_out_of_bounds_glyph; int badgid_cnt, badgid_max; /* Used when parsing apple morx tables*/ SplineChar **badgids; /* which use out of range glyph IDs as temporary flags */ long long creationtime; /* seconds since 1970 */ long long modificationtime; int gasp_cnt; struct gasp *gasp; struct MATH *math; /* Set of errors we found when loading the font */ unsigned int bad_ps_fontname: 1; unsigned int bad_glyph_data: 1; unsigned int bad_cff: 1; unsigned int bad_metrics: 1; unsigned int bad_cmap: 1; unsigned int bad_embedded_bitmap: 1; unsigned int bad_gx: 1; unsigned int bad_ot: 1; unsigned int bad_os2_version: 1; unsigned int bad_sfnt_header: 1; Layer guidelines; struct Base *horiz_base, *vert_base; Justify *justify; int advanceWidthMax; int fbb[4]; /* x,yMin x,yMax*/ int isFixedPitch; uint32 jstf_script; uint32 jstf_lang; int16 jstf_isShrink, jstf_prio, jstf_lcnt; struct otffeatname *feat_names; enum gsub_inusetype justinuse; long ttfFileSize; }; 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; }; #define MAX_TAB 48 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 tabs[MAX_TAB];/* room for all the tables */ /* Not in any particular order. */ struct taboff *ordered[MAX_TAB]; /* Ordered the way the tables should be output in file */ struct taboff *alpha[MAX_TAB]; /* Ordered alphabetically by tag for the ttf header */ }; 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 */ /* not exactly specified, but FontValidator wants this to match italicangle */ int16 mbz[5]; int16 metricformat; /* 0 */ uint16 numMetrics; /* just set to glyph count */ }; 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 */ }; 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 *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 */ }; 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; }; struct os2 { uint16 version; /* 1 */ int16 avgCharWid; /* average all chars (v3) see v2 definition below */ 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 */ /* 2=>underscore, 4=>negative, 8->outlined, 16=>strikeout */ /* version 4 of OS/2 */ /* 128->don't use win_ascent/descent for line spacing */ /* 256=>family varies on weight width slope only */ /* 512=>oblique (as opposed to italic) */ 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; /* V3 of OS/2 has no additional data */ /* V4 of OS/2 has no additional data */ int v1_avgCharWid; /* 1&2 Weighted average of the lower case letters and space */ int v3_avgCharWid; /* 3&4 average over all non-zero width glyphs */ }; 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 dovariations: 1; unsigned int onlybitmaps: 1; unsigned int has_instrs: 1; unsigned int is_ttf: 1; unsigned int ttc_composite_font: 1; SplineFont *sf; int32 *pointcounts; int *bygid; /* glyph list */ int gcnt; int layer; }; 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 */ }; struct feat_name { int strid; struct macname *mn, *smn; }; struct other_names { int strid; struct macname *mn; struct other_names *next; }; 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 *math; int mathlen; FILE *base; int baselen; FILE *jstf; int jstflen; 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 *globalsubrs; 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 *bsln; int bslnlen; FILE *pfed; int pfedlen; FILE *tex; int texlen; FILE *bdf; int bdflen; FILE *gvar; int gvarlen; FILE *fvar; int fvarlen; FILE *cvar; int cvarlen; FILE *avar; int avarlen; FILE *fftmf; int fftmlen; FILE *dsigf; int dsiglen; FILE *hdmxf; int hdmxlen; 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 applebitmaps: 1; unsigned int otbbitmaps: 1; unsigned int isotf: 1; unsigned int dovariations: 1; /* Output Apple *var tables (for mm fonts) */ unsigned int error: 1; struct glyphinfo gi; int isfixed; struct fd2data *fds; int next_strid; struct feat_name *feat_name; struct other_names *other_names; struct macname2 *ordered_feat; int next_lookup; /* for doing nested lookups in contextual features */ short *gn_sid; enum fontformat format; int fontstyle_name_strid; /* For GPOS 'size' */ SplineFont *sf; EncMap *map; struct ttf_table *oldcvt; unsigned oldcvtlen; }; 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 ct_branch { uint16 classnum; struct contexttree *branch; }; struct ct_subs { struct fpst_rule *rule; struct contexttree *branch;/* if the rule ends here this will be null */ uint16 thisclassnum; }; struct contexttree { int depth; int branch_cnt; /* count of subbranches of this node */ struct ct_branch *branches; struct fpst_rule *ends_here; int rule_cnt; /* count of rules which are active here */ struct ct_subs *rules; int pending_pos; OTLookup *applymarkedsubs; OTLookup *applycursubs; uint16 marked_index, cur_index; uint8 markme; int state, next_state; struct contexttree *parent; }; /* TrueType Composite glyph flags */ #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 _USE_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 */ extern int ttfFixupRef(SplineChar **chars,int i); extern const char *cffnames[]; extern const int nStdStrings; /* Open type Advanced Typography Tables */ 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 void otf_dumpbase(struct alltabs *at, SplineFont *sf); extern void otf_dumpjstf(struct alltabs *at, SplineFont *sf); extern void otf_dump_dummydsig(struct alltabs *at, SplineFont *sf); extern int gdefclass(SplineChar *sc); 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 void aat_dumpbsln(struct alltabs *at, SplineFont *sf); extern int LookupHasDefault(OTLookup *otl); extern int scriptsHaveDefault(struct scriptlanglist *sl); extern int FPSTisMacable(SplineFont *sf, FPST *fpst); extern int OTTagToMacFeature(uint32 tag, int *featureType,int *featureSetting); extern uint16 *props_array(SplineFont *sf,struct glyphinfo *gi); extern int haslrbounds(SplineChar *sc, PST **left, PST **right); extern int16 *PerGlyphDefBaseline(SplineFont *sf,int *def_baseline); extern void FigureBaseOffsets(SplineFont *sf,int def_bsln,int offsets[32]); /* Apple variation tables */ extern int ContourPtNumMatch(MMSet *mm, int gid); extern int16 **SCFindDeltas(MMSet *mm, int gid, int *_ptcnt); extern int16 **CvtFindDeltas(MMSet *mm, int *_ptcnt); extern void ttf_dumpvariations(struct alltabs *at, SplineFont *sf); 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 int memushort(uint8 *data,int table_len, 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 int SSAddPoints(SplineSet *ss,int ptcnt,BasePoint *bp, char *flags); extern int Macable(SplineFont *sf, OTLookup *otl); /* Used by both otf and apple */ extern int LigCaretCnt(SplineChar *sc); extern uint16 *ClassesFromNames(SplineFont *sf,char **classnames,int class_cnt, int numGlyphs, SplineChar ***glyphs, int apple_kc); extern SplineChar **SFGlyphsFromNames(SplineFont *sf,char *names); extern SplineChar **EntryExitDecompose(SplineFont *sf,AnchorClass *ac, struct glyphinfo *gi); extern void AnchorClassDecompose(SplineFont *sf,AnchorClass *_ac, int classcnt, int *subcnts, SplineChar ***marks,SplineChar ***base, SplineChar ***lig,SplineChar ***mkmk, struct glyphinfo *gi); extern void cvt_unix_to_1904( long long time, int32 result[2]); /* 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); /* The TeX table, to contain stuff the TeX people want */ extern void tex_dump(struct alltabs *at, SplineFont *sf); extern void tex_read(FILE *ttf,struct ttfinfo *info); extern void ttf_bdf_read(FILE *ttf,struct ttfinfo *info); /* The FFTM table, to some timestamps I'd like */ extern int ttf_fftm_dump(SplineFont *sf,struct alltabs *at); /* The MATH table */ extern void otf_dump_math(struct alltabs *at, SplineFont *sf); /* Known font parameters for 'TeX ' table (fontdims, spacing params, whatever you want to call them) */ /* Used by all fonts */ #define TeX_Slant CHR('S','l','n','t') #define TeX_Space CHR('S','p','a','c') #define TeX_Stretch CHR('S','t','r','e') #define TeX_Shrink CHR('S','h','n','k') #define TeX_XHeight CHR('X','H','g','t') #define TeX_Quad CHR('Q','u','a','d') /* Used by text fonts */ #define TeX_ExtraSp CHR('E','x','S','p') /* Used by all math fonts */ #define TeX_MathSp CHR('M','t','S','p') /* Used by math fonts */ #define TeX_Num1 CHR('N','u','m','1') #define TeX_Num2 CHR('N','u','m','2') #define TeX_Num3 CHR('N','u','m','3') #define TeX_Denom1 CHR('D','n','m','1') #define TeX_Denom2 CHR('D','n','m','2') #define TeX_Sup1 CHR('S','u','p','1') #define TeX_Sup2 CHR('S','u','p','2') #define TeX_Sup3 CHR('S','u','p','3') #define TeX_Sub1 CHR('S','u','b','1') #define TeX_Sub2 CHR('S','u','b','2') #define TeX_SupDrop CHR('S','p','D','p') #define TeX_SubDrop CHR('S','b','D','p') #define TeX_Delim1 CHR('D','l','m','1') #define TeX_Delim2 CHR('D','l','m','2') #define TeX_AxisHeight CHR('A','x','H','t') /* Used by math extension fonts */ #define TeX_DefRuleThick CHR('R','l','T','k') #define TeX_BigOpSpace1 CHR('B','O','S','1') #define TeX_BigOpSpace2 CHR('B','O','S','2') #define TeX_BigOpSpace3 CHR('B','O','S','3') #define TeX_BigOpSpace4 CHR('B','O','S','4') #define TeX_BigOpSpace5 CHR('B','O','S','5') extern void SFDummyUpCIDs(struct glyphinfo *gi,SplineFont *sf); dvisvgm-2.8.1/libs/ff-woff/fontforge/splineutil.c0000664000175000017500000033463213510660062016746 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #include "encoding.h" #include #ifdef HAVE_IEEEFP_H # include /* Solaris defines isnan in ieeefp rather than math.h */ #endif #include "sfd1.h" // This has the extended SplineFont type SplineFont1 for old file versions. #ifdef FF_UTHASH_GLIF_NAMES # include "glif_name_hash.h" #endif /*#define DEBUG 1*/ typedef struct quartic { bigreal 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) calloc(1,size) */ /* #define chunkfree(item,size) free(item) */ /* into splinefont.h after (or instead of) the definition of chunkalloc()*/ #define ALLOC_CHUNK 100 /* Number of small chunks to malloc at a time */ #ifndef FONTFORGE_CONFIG_USE_DOUBLE # define CHUNK_MAX 100 /* Maximum size (in chunk units) that we are prepared to allocate */ /* The size of our data structures */ #else # define CHUNK_MAX 129 #endif # 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; }; #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 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; if ( (sp=chunkalloc(sizeof(SplinePoint)))!=NULL ) { 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; sp->name = NULL; } 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)); free(sp->name); chunkfree(sp,sizeof(SplinePoint)); } void SplinePointsFree(SplinePointList *spl) { Spline *first, *spline, *next; int nonext; if ( spl==NULL ) return; if ( spl->first!=NULL ) { nonext = spl->first->next==NULL; // If there is no spline, we set a flag. first = NULL; // We start on the first spline if it exists. for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = next ) { next = spline->to->next; // Cache the location of the next spline. SplinePointFree(spline->to); // Free the destination point. SplineFree(spline); // Free the spline. if ( first==NULL ) first = spline; // We want to avoid repeating the circuit. } // If the path is open or has no splines, free the starting point. if ( spl->last!=spl->first || nonext ) SplinePointFree(spl->first); } } void SplinePointListFree(SplinePointList *spl) { if ( spl==NULL ) return; SplinePointsFree(spl); free(spl->spiros); free(spl->contour_name); chunkfree(spl,sizeof(SplinePointList)); } void SplinePointListsFree(SplinePointList *spl) { SplinePointList *next; while ( spl!=NULL ) { next = spl->next; SplinePointListFree(spl); spl = next; } } void SplineSetSpirosClear(SplineSet *spl) { free(spl->spiros); spl->spiros = NULL; spl->spiro_cnt = spl->spiro_max = 0; } void RefCharFree(RefChar *ref) { int i; if ( ref==NULL ) return; for ( i=0; ilayer_cnt; ++i ) { SplinePointListsFree(ref->layers[i].splines); GradientFree(ref->layers[i].fill_brush.gradient); GradientFree(ref->layers[i].stroke_pen.brush.gradient); PatternFree(ref->layers[i].fill_brush.pattern); PatternFree(ref->layers[i].stroke_pen.brush.pattern); } free(ref->layers); chunkfree(ref,sizeof(RefChar)); } RefChar *RefCharCreate(void) { RefChar *ref = chunkalloc(sizeof(RefChar)); ref->layer_cnt = 1; ref->layers = calloc(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; ref->round_translation_to_grid = true; return( ref ); } void RefCharsFree(RefChar *ref) { RefChar *rnext; while ( ref!=NULL ) { rnext = ref->next; RefCharFree(ref); ref = rnext; } } typedef struct spline1 { Spline1D sp; real s0, s1; real c0, c1; } Spline1; static void FigureSpline1(Spline1 *sp1,bigreal t0, bigreal t1, Spline1D *sp ) { bigreal 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; } sp1->c0 = sp1->sp.c/3 + sp1->sp.d; sp1->c1 = sp1->c0 + (sp1->sp.b+sp1->sp.c)/3; } static void SplineFindBounds(const Spline *sp, DBounds *bounds) { real t, b2_fourac, v; real min, max; const 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) */ /* (I don't bother fixing up for tiny rounding errors here. they don't matter */ /* But we could call CheckExtremaForSingleBitErrors */ 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(const 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; } } } static void _SplineSetFindClippedBounds(const SplinePointList *spl, DBounds *bounds,DBounds *clipb) { 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 ( !spl->is_clip_path ) { 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; } } else { if ( clipb->minx==0 && clipb->maxx==0 && clipb->miny==0 && clipb->maxy == 0 ) { clipb->minx = clipb->maxx = spl->first->me.x; clipb->miny = clipb->maxy = spl->first->me.y; } else { if ( spl->first->me.xminx ) clipb->minx = spl->first->me.x; if ( spl->first->me.x>clipb->maxx ) clipb->maxx = spl->first->me.x; if ( spl->first->me.yminy ) clipb->miny = spl->first->me.y; if ( spl->first->me.y>clipb->maxy ) clipb->maxy = spl->first->me.y; } for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { SplineFindBounds(spline,clipb); if ( first==NULL ) first = spline; } } } } static void _SplineCharLayerFindBounds(SplineChar *sc,int layer, DBounds *bounds) { RefChar *rf; real e; DBounds b, clipb; for ( rf=sc->layers[layer].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; } } memset(&b,0,sizeof(b)); memset(&clipb,0,sizeof(clipb)); _SplineSetFindClippedBounds(sc->layers[layer].splines,&b,&clipb); if ( sc->layers[layer].dostroke ) { if ( sc->layers[layer].stroke_pen.width!=WIDTH_INHERITED ) e = sc->layers[layer].stroke_pen.width*sc->layers[layer].stroke_pen.trans[0]; else e = sc->layers[layer].stroke_pen.trans[0]; b.minx -= e; b.maxx += e; b.miny -= e; b.maxy += e; } if ( clipb.minx!=0 || clipb.miny!=0 || clipb.maxx!=0 || clipb.maxy!=0 ) { if ( b.minxclipb.maxx ) b.maxx = clipb.maxx; if ( b.maxy>clipb.maxy ) b.maxy = clipb.maxy; } if ( bounds->minx==0 && bounds->maxx==0 && bounds->miny==0 && bounds->maxy == 0 ) *bounds = b; else if ( b.minx!=0 || b.maxx != 0 || b.maxy != 0 || b.miny!=0 ) { if ( b.minx < bounds->minx ) bounds->minx = b.minx; if ( b.miny < bounds->miny ) bounds->miny = b.miny; if ( b.maxx > bounds->maxx ) bounds->maxx = b.maxx; if ( b.maxy > bounds->maxy ) bounds->maxy = b.maxy; } if ( sc->parent!=NULL && sc->parent->strokedfont && (bounds->minx!=bounds->maxx || bounds->miny!=bounds->maxy)) { real sw = sc->parent->strokewidth; bounds->minx -= sw; bounds->miny -= sw; bounds->maxx += sw; bounds->maxy += sw; } } void SplineCharLayerFindBounds(SplineChar *sc,int layer,DBounds *bounds) { if ( sc->parent!=NULL && sc->parent->multilayer ) { SplineCharFindBounds(sc,bounds); return; } /* a char with no splines (ie. a space) must have an lbearing of 0 */ bounds->minx = bounds->maxx = 0; bounds->miny = bounds->maxy = 0; _SplineCharLayerFindBounds(sc,layer,bounds); } void SplineCharFindBounds(SplineChar *sc,DBounds *bounds) { int i; int first,last; /* a char with no splines (ie. a space) must have an lbearing of 0 */ bounds->minx = bounds->maxx = 0; bounds->miny = bounds->maxy = 0; first = last = ly_fore; if ( sc->parent!=NULL && sc->parent->multilayer ) last = sc->layer_cnt-1; for ( i=first; i<=last; ++i ) _SplineCharLayerFindBounds(sc,i,bounds); } void SplineFontLayerFindBounds(SplineFont *sf,int layer,DBounds *bounds) { int i, k, first, last; if ( sf->multilayer ) { SplineFontFindBounds(sf,bounds); return; } bounds->minx = bounds->maxx = 0; bounds->miny = bounds->maxy = 0; for ( i = 0; iglyphcnt; ++i ) { SplineChar *sc = sf->glyphs[i]; if ( sc!=NULL ) { first = last = ly_fore; if ( sc->parent != NULL && sc->parent->multilayer ) last = sc->layer_cnt-1; for ( k=first; k<=last; ++k ) _SplineCharLayerFindBounds(sc,k,bounds); } } } void SplineFontFindBounds(SplineFont *sf,DBounds *bounds) { int i, k, first, last; bounds->minx = bounds->maxx = 0; bounds->miny = bounds->maxy = 0; for ( i = 0; iglyphcnt; ++i ) { SplineChar *sc = sf->glyphs[i]; if ( sc!=NULL ) { first = last = ly_fore; if ( sf->multilayer ) last = sc->layer_cnt-1; for ( k=first; k<=last; ++k ) _SplineCharLayerFindBounds(sc,k,bounds); } } } void CIDLayerFindBounds(SplineFont *cidmaster,int layer,DBounds *bounds) { SplineFont *sf; int i; DBounds b; real factor; if ( cidmaster->cidmaster ) cidmaster = cidmaster->cidmaster; if ( cidmaster->subfonts==NULL ) { SplineFontLayerFindBounds(cidmaster,layer,bounds); return; } sf = cidmaster->subfonts[0]; SplineFontLayerFindBounds(sf,layer,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]; SplineFontLayerFindBounds(sf,layer,&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; } } } 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; // Frank added the control points to the calculation since, // according to Adam Twardoch, // the OpenType values that rely upon this function // expect control points to be included. if ( !sp->noprevcp ) { 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->nonextcp ) { 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->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,first, last; DBounds temp; real e; b->minx = b->miny = 1e10; b->maxx = b->maxy = -1e10; first = last = ly_fore; if ( sc->parent!=NULL && sc->parent->multilayer ) last = sc->layer_cnt-1; for ( i=first; i<=last; ++i ) { SplineSetQuickBounds(sc->layers[i].splines,&temp); if ( sc->layers[i].dostroke && sc->layers[i].splines!=NULL ) { 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]; temp.minx -= e; temp.maxx += e; temp.miny -= e; temp.maxy += e; } if ( temp.minx!=0 || temp.maxx != 0 || temp.maxy != 0 || temp.miny!=0 ) { if ( temp.minx < b->minx ) b->minx = temp.minx; if ( temp.miny < b->miny ) b->miny = temp.miny; if ( temp.maxx > b->maxx ) b->maxx = temp.maxx; if ( temp.maxy > b->maxy ) b->maxy = temp.maxy; } 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; } } } if ( sc->parent!=NULL && sc->parent->strokedfont && (b->minx!=b->maxx || b->miny!=b->maxy)) { real sw = sc->parent->strokewidth; b->minx -= sw; b->miny -= sw; b->maxx += sw; b->maxy += sw; } if ( b->minx>1e9 ) memset(b,0,sizeof(*b)); } void SplineCharLayerQuickBounds(SplineChar *sc,int layer,DBounds *bounds) { RefChar *ref; DBounds temp; if ( sc->parent!=NULL && sc->parent->multilayer ) { SplineCharQuickBounds(sc,bounds); return; } bounds->minx = bounds->miny = 1e10; bounds->maxx = bounds->maxy = -1e10; SplineSetQuickBounds(sc->layers[layer].splines,bounds); for ( ref = sc->layers[layer].refs; ref!=NULL; ref = ref->next ) { SplineSetQuickBounds(ref->layers[0].splines,&temp); if ( bounds->minx==0 && bounds->maxx==0 && bounds->miny==0 && bounds->maxy == 0 ) *bounds = temp; else if ( temp.minx!=0 || temp.maxx != 0 || temp.maxy != 0 || temp.miny!=0 ) { if ( temp.minx < bounds->minx ) bounds->minx = temp.minx; if ( temp.miny < bounds->miny ) bounds->miny = temp.miny; if ( temp.maxx > bounds->maxx ) bounds->maxx = temp.maxx; if ( temp.maxy > bounds->maxy ) bounds->maxy = temp.maxy; } } /* a char with no splines (ie. a space) must have an lbearing of 0 */ if ( bounds->minx>1e9 ) memset(bounds,0,sizeof(*bounds)); } void SplinePointCategorize(SplinePoint *sp) { int oldpointtype = sp->pointtype; 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 { BasePoint ndir, ncdir, ncunit, pdir, pcdir, pcunit; bigreal nlen, nclen, plen, pclen; bigreal cross, bounds; ncdir.x = sp->nextcp.x - sp->me.x; ncdir.y = sp->nextcp.y - sp->me.y; pcdir.x = sp->prevcp.x - sp->me.x; pcdir.y = sp->prevcp.y - sp->me.y; ndir.x = ndir.y = pdir.x = pdir.y = 0; if ( sp->next!=NULL ) { ndir.x = sp->next->to->me.x - sp->me.x; ndir.y = sp->next->to->me.y - sp->me.y; } if ( sp->prev!=NULL ) { pdir.x = sp->prev->from->me.x - sp->me.x; pdir.y = sp->prev->from->me.y - sp->me.y; } nclen = sqrt(ncdir.x*ncdir.x + ncdir.y*ncdir.y); pclen = sqrt(pcdir.x*pcdir.x + pcdir.y*pcdir.y); nlen = sqrt(ndir.x*ndir.x + ndir.y*ndir.y); plen = sqrt(pdir.x*pdir.x + pdir.y*pdir.y); ncunit = ncdir; pcunit = pcdir; if ( nclen!=0 ) { ncunit.x /= nclen; ncunit.y /= nclen; } if ( pclen!=0 ) { pcunit.x /= pclen; pcunit.y /= pclen; } if ( nlen!=0 ) { ndir.x /= nlen; ndir.y /= nlen; } if ( plen!=0 ) { pdir.x /= plen; pdir.y /= plen; } /* find out which side has the shorter control vector. Cross that vector */ /* with the normal of the unit vector on the other side. If the */ /* result is less than 1 em-unit then we've got colinear control points */ /* (within the resolution of the integer grid) */ /* Not quite... they could point in the same direction */ if ( oldpointtype==pt_curve ) bounds = 4.0; else bounds = 1.0; if ( nclen!=0 && pclen!=0 && ((nclen>=pclen && (cross = pcdir.x*ncunit.y - pcdir.y*ncunit.x)-bounds ) || (pclen>nclen && (cross = ncdir.x*pcunit.y - ncdir.y*pcunit.x)-bounds )) && ncdir.x*pcdir.x + ncdir.y*pcdir.y < 0 ) sp->pointtype = pt_curve; /* Cross product of control point with unit vector normal to line in */ /* opposite direction should be less than an em-unit for a tangent */ else if (( nclen==0 && pclen!=0 && (cross = pcdir.x*ndir.y-pcdir.y*ndir.x)-bounds ) || ( pclen==0 && nclen!=0 && (cross = ncdir.x*pdir.y-ncdir.y*pdir.x)-bounds )) sp->pointtype = pt_tangent; /* If a point started out hv, and could still be hv, them make it so */ /* but don't make hv points de novo, Alexey doesn't like change */ /* (this only works because hv isn't a default setting, so if it's */ /* there it was done intentionally) */ if ( sp->pointtype == pt_curve && oldpointtype == pt_hvcurve && ((sp->nextcp.x==sp->me.x && sp->prevcp.x==sp->me.x && sp->nextcp.y!=sp->me.y) || (sp->nextcp.y==sp->me.y && sp->prevcp.y==sp->me.y && sp->nextcp.x!=sp->me.x))) sp->pointtype = pt_hvcurve; } } void SPLCategorizePoints(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 ) { SplinePointCategorize(spline->from); last = spline; if ( first==NULL ) first = spline; } if ( spline==NULL && last!=NULL ) SplinePointCategorize(last->to); } } SplinePointList *SplinePointListCopy1(const SplinePointList *spl) { SplinePointList *cur; const SplinePoint *pt; SplinePoint *cpt; Spline *spline; cur = chunkalloc(sizeof(SplinePointList)); cur->is_clip_path = spl->is_clip_path; cur->spiro_cnt = cur->spiro_max = 0; cur->spiros = 0; if (spl->contour_name != NULL) cur->contour_name = copy(spl->contour_name); for ( pt=spl->first; ; ) { cpt = SplinePointCreate( 0, 0 ); *cpt = *pt; if ( pt->hintmask!=NULL ) { cpt->hintmask = chunkalloc(sizeof(HintMask)); memcpy(cpt->hintmask,pt->hintmask,sizeof(HintMask)); } if ( pt->name!=NULL ) { cpt->name = copy(pt->name); } cpt->next = cpt->prev = NULL; if ( cur->first==NULL ) { cur->first = cur->last = cpt; cur->start_offset = 0; } 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; pt = pt->next->to; if ( pt==spl->first ) break; } if ( spl->first->prev!=NULL ) { 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; } if ( spl->spiro_cnt!=0 ) { cur->spiro_cnt = cur->spiro_max = spl->spiro_cnt; cur->spiros = malloc(cur->spiro_cnt*sizeof(spiro_cp)); memcpy(cur->spiros,spl->spiros,cur->spiro_cnt*sizeof(spiro_cp)); } return( cur ); } SplinePointList *SplinePointListCopy(const 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 ); } void BpTransform(BasePoint *to, BasePoint *from, real transform[6]) { BasePoint p; p.x = transform[0]*from->x + transform[2]*from->y + transform[4]; p.y = transform[1]*from->x + transform[3]*from->y + transform[5]; to->x = rint(1024*p.x)/1024; to->y = rint(1024*p.y)/1024; } static void TransformPointExtended(SplinePoint *sp, real transform[6], enum transformPointMask tpmask ) { /** * If we are to transform selected BCP instead of their base splinepoint * then lets do that. */ if( tpmask & tpmask_operateOnSelectedBCP && (sp->nextcpselected || sp->prevcpselected )) { if( sp->nextcpselected ) { int order2 = sp->next ? sp->next->order2 : 0; BpTransform(&sp->nextcp,&sp->nextcp,transform); SPTouchControl( sp, &sp->nextcp, order2 ); } else if( sp->prevcpselected ) { int order2 = sp->next ? sp->next->order2 : 0; BpTransform(&sp->prevcp,&sp->prevcp,transform); SPTouchControl( sp, &sp->prevcp, order2 ); } } else { /** * Transform the base splinepoints. */ BpTransform(&sp->me,&sp->me,transform); if ( !sp->nonextcp ) { BpTransform(&sp->nextcp,&sp->nextcp,transform); } else { sp->nextcp = sp->me; } if ( !sp->noprevcp ) { BpTransform(&sp->prevcp,&sp->prevcp,transform); } else { sp->prevcp = sp->me; } } if ( sp->pointtype == pt_hvcurve ) { if( ((sp->nextcp.x==sp->me.x && sp->prevcp.x==sp->me.x && sp->nextcp.y!=sp->me.y) || (sp->nextcp.y==sp->me.y && sp->prevcp.y==sp->me.y && sp->nextcp.x!=sp->me.x))) { /* Do Nothing */; } else { sp->pointtype = pt_curve; } } } static void TransformPoint(SplinePoint *sp, real transform[6]) { TransformPointExtended( sp, transform, 0 ); } static void TransformSpiro(spiro_cp *cp, real transform[6]) { bigreal x; x = transform[0]*cp->x + transform[2]*cp->y + transform[4]; cp->y = transform[1]*cp->x + transform[3]*cp->y + transform[5]; cp->x = x; } static void TransformPTsInterpolateCPs(BasePoint *fromorig,Spline *spline, BasePoint *toorig,real transform[6] ) { BasePoint totrans, temp; bigreal fraction; /* Normally the "from" point will already have been translated, and the "to" */ /* point will need to be. But if we have a closed contour then on the */ /* last spline both from and to will have been transform. We can detect */ /* this because toorig will be different from &spline->to->me */ if ( spline->to->selected && toorig==&spline->to->me ) BpTransform(&totrans,&spline->to->me,transform); else totrans = spline->to->me; /* None of the control points will have been transformed yet */ if ( fromorig->x!=toorig->x ) { fraction = (spline->from->nextcp.x-fromorig->x)/( toorig->x-fromorig->x ); spline->from->nextcp.x = spline->from->me.x + fraction*( totrans.x-spline->from->me.x ); fraction = (spline->to->prevcp.x-fromorig->x)/( toorig->x-fromorig->x ); spline->to->prevcp.x = spline->from->me.x + fraction*( totrans.x-spline->from->me.x ); } else { BpTransform(&temp,&spline->from->nextcp,transform); spline->from->nextcp.x = temp.x; BpTransform(&temp,&spline->to->prevcp,transform); spline->to->prevcp.x = temp.x; } if ( fromorig->y!=toorig->y ) { fraction = (spline->from->nextcp.y-fromorig->y)/( toorig->y-fromorig->y ); spline->from->nextcp.y = spline->from->me.y + fraction*( totrans.y-spline->from->me.y ); fraction = (spline->to->prevcp.y-fromorig->y)/( toorig->y-fromorig->y ); spline->to->prevcp.y = spline->from->me.y + fraction*( totrans.y-spline->from->me.y ); } else { BpTransform(&temp,&spline->from->nextcp,transform); spline->from->nextcp.y = temp.y; BpTransform(&temp,&spline->to->prevcp,transform); spline->to->prevcp.y = temp.y; } if ( spline->to->selected ) spline->to->me = totrans; } SplinePointList *SplinePointListTransformExtended(SplinePointList *base, real transform[6], enum transformPointType tpt, enum transformPointMask tpmask ) { Spline *spline, *first; SplinePointList *spl; SplinePoint *spt, *pfirst; int allsel, anysel, alldone=true; BasePoint lastpointorig, firstpointorig, orig; for ( spl = base; spl!=NULL; spl = spl->next ) { pfirst = NULL; first = NULL; allsel = true; anysel=false; if ( tpt==tpt_OnlySelectedInterpCPs && spl->first->next!=NULL && !spl->first->next->order2 ) { lastpointorig = firstpointorig = spl->first->me; printf("SplinePointListTransformExtended() spl->first->selected %d\n", spl->first->selected ); if ( spl->first->selected ) { anysel = true; BpTransform(&spl->first->me,&spl->first->me,transform); } else allsel = false; for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { if ( first==NULL ) first = spline; orig = spline->to->me; if ( spline->from->selected || spline->to->selected ) { TransformPTsInterpolateCPs( &lastpointorig, spline, spl->first==spline->to? &firstpointorig : &spline->to->me, transform ); } lastpointorig = orig; if ( spline->to->selected ) anysel = true; else allsel = false; } } else { for ( spt = spl->first ; spt!=pfirst; spt = spt->next->to ) { if ( pfirst==NULL ) pfirst = spt; if ( tpt==tpt_AllPoints || spt->selected ) { TransformPointExtended(spt,transform,tpmask); if ( tpt!=tpt_AllPoints ) { if ( spt->next!=NULL && spt->next->order2 && !spt->next->to->selected && spt->next->to->ttfindex==0xffff ) { SplinePoint *to = spt->next->to; to->prevcp = spt->nextcp; to->me.x = (to->prevcp.x+to->nextcp.x)/2; to->me.y = (to->prevcp.y+to->nextcp.y)/2; } if ( spt->prev!=NULL && spt->prev->order2 && !spt->prev->from->selected && spt->prev->from->ttfindex==0xffff ) { SplinePoint *from = spt->prev->from; from->nextcp = spt->prevcp; from->me.x = (from->prevcp.x+from->nextcp.x)/2; from->me.y = (from->prevcp.y+from->nextcp.y)/2; } } 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 transform the spiro version too */ /* otherwise if we just changed some points, throw away the spiro */ if ( allsel ) { int i; for ( i=0; ispiro_cnt-1; ++i ) TransformSpiro(&spl->spiros[i], transform); } else SplineSetSpirosClear(spl); /* 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( !(tpmask & tpmask_dontFixControlPoints)) { if ( tpt!=tpt_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->selected && spt->prev!=NULL && !spt->prev->from->selected && spt->prev->from->pointtype == pt_tangent ) SplineCharTangentPrevCP(spt->prev->from); if ( spt->selected && spt->next!=NULL && !spt->next->to->selected && spt->next->to->pointtype == pt_tangent ) SplineCharTangentNextCP(spt->next->to); if ( spt->prev!=NULL && spt->prevcpdef && tpt==tpt_OnlySelected ) SplineCharDefaultPrevCP(spt); if ( spt->next==NULL ) break; if ( spt->nextcpdef && tpt==tpt_OnlySelected ) 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 *SplinePointListTransform( SplinePointList *base, real transform[6], enum transformPointType tpt ) { enum transformPointMask tpmask = 0; return SplinePointListTransformExtended( base, transform, tpt, tpmask ); } HintMask *HintMaskFromTransformedRef(RefChar *ref,BasePoint *trans, SplineChar *basesc,HintMask *hm) { StemInfo *st, *st2; int hst_cnt, bcnt; real start, width; int i; if ( ref->transform[1]!=0 || ref->transform[2]!=0 ) return(NULL); memset(hm,0,sizeof(HintMask)); for ( st = ref->sc->hstem; st!=NULL; st=st->next ) { start = st->start*ref->transform[3] + ref->transform[5] + trans->y; width = st->width*ref->transform[3]; for ( st2=basesc->hstem,bcnt=0; st2!=NULL; st2=st2->next, bcnt++ ) if ( st2->start == start && st2->width == width ) break; if ( st2!=NULL ) (*hm)[bcnt>>3] |= (0x80>>(bcnt&7)); } for ( st2=basesc->hstem,hst_cnt=0; st2!=NULL; st2=st2->next, hst_cnt++ ); for ( st = ref->sc->vstem; st!=NULL; st=st->next ) { start = st->start*ref->transform[0] + ref->transform[4] + trans->x; width = st->width*ref->transform[0]; for ( st2=basesc->vstem,bcnt=hst_cnt; st2!=NULL; st2=st2->next, bcnt++ ) if ( st2->start == start && st2->width == width ) break; if ( st2!=NULL ) (*hm)[bcnt>>3] |= (0x80>>(bcnt&7)); } for ( i=0; ihstem,cnt = 0; st!=NULL; st=st->next, cnt++ ) { if ( (*oldhm)[cnt>>3]&(0x80>>(cnt&7)) ) { start = st->start*transform[3] + transform[5]; width = st->width*transform[3]; for ( st2=basesc->hstem,bcnt=0; st2!=NULL; st2=st2->next, bcnt++ ) if ( st2->start == start && st2->width == width ) break; if ( st2!=NULL ) (*newhm)[bcnt>>3] |= (0x80>>(bcnt&7)); } } for ( st2=basesc->hstem,hst_cnt=0; st2!=NULL; st2=st2->next, hst_cnt++ ); for ( st = subsc->vstem; st!=NULL; st=st->next, cnt++ ) { if ( (*oldhm)[cnt>>3]&(0x80>>(cnt&7)) ) { start = st->start*transform[0] + transform[4]; width = st->width*transform[0]; for ( st2=basesc->vstem,bcnt=hst_cnt; st2!=NULL; st2=st2->next, bcnt++ ) if ( st2->start == start && st2->width == width ) break; if ( st2!=NULL ) (*newhm)[bcnt>>3] |= (0x80>>(bcnt&7)); } } return( newhm ); } SplinePointList *SPLCopyTranslatedHintMasks(SplinePointList *base, SplineChar *basesc, SplineChar *subsc, BasePoint *trans ) { SplinePointList *spl, *spl2, *head; SplinePoint *spt, *spt2, *pfirst; real transform[6]; Spline *s, *first; head = SplinePointListCopy(base); transform[0] = transform[3] = 1; transform[1] = transform[2] = 0; transform[4] = trans->x; transform[5] = trans->y; for ( spl = head, spl2=base; spl!=NULL; spl = spl->next, spl2 = spl2->next ) { pfirst = NULL; for ( spt = spl->first, spt2 = spl2->first ; spt!=pfirst; spt = spt->next->to, spt2 = spt2->next->to ) { if ( pfirst==NULL ) pfirst = spt; TransformPoint(spt,transform); if ( spt2->hintmask ) { chunkfree(spt->hintmask,sizeof(HintMask)); spt->hintmask = HintMaskTransform(spt2->hintmask,transform,basesc,subsc); } if ( spt->next==NULL ) break; } first = NULL; for ( s = spl->first->next; s!=NULL && s!=first; s=s->to->next ) { SplineRefigure(s); if ( first==NULL ) first = s; } } return( head ); } static SplinePointList *_SPLCopyTransformedHintMasks(SplineChar *subsc,int layer, real transform[6], SplineChar *basesc ) { SplinePointList *spl, *spl2, *head, *last=NULL, *cur, *base; SplinePoint *spt, *spt2, *pfirst; Spline *s, *first; real trans[6]; RefChar *rf; base = subsc->layers[layer].splines; head = SplinePointListCopy(base); if ( head!=NULL ) for ( last = head; last->next!=NULL; last=last->next ); for ( spl = head, spl2=base; spl!=NULL; spl = spl->next, spl2=spl2->next ) { pfirst = NULL; for ( spt = spl->first, spt2 = spl2->first ; spt!=pfirst; spt = spt->next->to, spt2 = spt2->next->to ) { if ( pfirst==NULL ) pfirst = spt; TransformPoint(spt,transform); if ( spt2->hintmask ) { chunkfree(spt->hintmask,sizeof(HintMask)); spt->hintmask = HintMaskTransform(spt2->hintmask,transform,basesc,subsc); } if ( spt->next==NULL ) break; } first = NULL; for ( s = spl->first->next; s!=NULL && s!=first; s=s->to->next ) { SplineRefigure(s); if ( first==NULL ) first = s; } } for ( rf=subsc->layers[layer].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]; cur = _SPLCopyTransformedHintMasks(rf->sc,layer,trans,basesc); if ( head==NULL ) head = cur; else last->next = cur; if ( cur!=NULL ) { while ( cur->next!=NULL ) cur = cur->next; last = cur; } } return( head ); } SplinePointList *SPLCopyTransformedHintMasks(RefChar *r, SplineChar *basesc, BasePoint *trans,int layer ) { real transform[6]; memcpy(transform,r->transform,sizeof(transform)); transform[4] += trans->x; transform[5] += trans->y; return( _SPLCopyTransformedHintMasks(r->sc,layer,transform,basesc)); } 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 LayerToRefLayer(struct reflayer *rl,Layer *layer, real transform[6]) { BrushCopy(&rl->fill_brush, &layer->fill_brush,transform); PenCopy(&rl->stroke_pen, &layer->stroke_pen,transform); rl->dofill = layer->dofill; rl->dostroke = layer->dostroke; rl->fillfirst = layer->fillfirst; } int RefLayerFindBaseLayerIndex(RefChar *rf, int layer) { // Note that most of the logic below is copied and lightly modified from SCReinstanciateRefChar. SplineChar *rsc = rf->sc; int i = 0, j = 0, cnt = 0; RefChar *subref; for ( i=ly_fore; ilayer_cnt; ++i ) { if ( rsc->layers[i].splines!=NULL) { if (cnt == layer) return i; ++cnt; } for ( subref=rsc->layers[i].refs; subref!=NULL; subref=subref->next ) { for ( j=0; jlayer_cnt; ++j ) if ( subref->layers[j].splines!=NULL ) { if (cnt == layer) return i; ++cnt; } } } return -1; } void RefCharFindBounds(RefChar *rf) { 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); int baselayer = RefLayerFindBaseLayerIndex(rf, i); if ( baselayer >= 0 && rsc->layers[baselayer].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; } void SCReinstanciateRefChar(SplineChar *sc,RefChar *rf,int layer) { SplinePointList *new, *last; RefChar *refs; int i,j; SplineChar *rsc = rf->sc; real extra=0,e; for ( i=0; ilayer_cnt; ++i ) { SplinePointListsFree(rf->layers[i].splines); GradientFree(rf->layers[i].fill_brush.gradient); PatternFree(rf->layers[i].fill_brush.pattern); GradientFree(rf->layers[i].stroke_pen.brush.gradient); PatternFree(rf->layers[i].stroke_pen.brush.pattern); } 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) ++cnt; for ( subref=rsc->layers[i].refs; subref!=NULL; subref=subref->next ) cnt += subref->layer_cnt; } rf->layer_cnt = cnt; rf->layers = calloc(cnt,sizeof(struct reflayer)); cnt = 0; for ( i=ly_fore; ilayer_cnt; ++i ) { if ( rsc->layers[i].splines!=NULL ) { rf->layers[cnt].splines = SplinePointListTransform( SplinePointListCopy(rsc->layers[i].splines),rf->transform,tpt_AllPoints); LayerToRefLayer(&rf->layers[cnt],&rsc->layers[i],rf->transform); ++cnt; } for ( subref=rsc->layers[i].refs; subref!=NULL; subref=subref->next ) { for ( j=0; jlayer_cnt; ++j ) if ( subref->layers[j].splines!=NULL ) { rf->layers[cnt] = subref->layers[j]; rf->layers[cnt].splines = SplinePointListTransform( SplinePointListCopy(subref->layers[j].splines),rf->transform,tpt_AllPoints); ++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); int baselayer = RefLayerFindBaseLayerIndex(rf, i); if ( baselayer >= 0 && rsc->layers[baselayer].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 { if ( rf->layer_cnt>0 ) { SplinePointListsFree(rf->layers[0].splines); rf->layers[0].splines = NULL; } rf->layers = calloc(1,sizeof(struct reflayer)); rf->layer_cnt = 1; rf->layers[0].dofill = true; new = SplinePointListTransform(SplinePointListCopy(rf->sc->layers[layer].splines),rf->transform,tpt_AllPoints); rf->layers[0].splines = new; last = NULL; if ( new!=NULL ) for ( last = new; last->next!=NULL; last = last->next ); for ( refs = rf->sc->layers[layer].refs; refs!=NULL; refs = refs->next ) { new = SplinePointListTransform(SplinePointListCopy(refs->layers[0].splines),rf->transform,tpt_AllPoints); if ( last!=NULL ) last->next = new; else rf->layers[0].splines = new; if ( new!=NULL ) for ( last = new; last->next!=NULL; last = last->next ); } } RefCharFindBounds(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 */ /* Sigh. When solutions are near 0, the rounding errors are appalling. */ int _CubicSolve(const Spline1D *sp,bigreal sought, extended ts[3]) { extended d, xN, yN, delta2, temp, delta, h, t2, t3, theta; extended sa=sp->a, sb=sp->b, sc=sp->c, sd=sp->d-sought; int i=0; ts[0] = ts[1] = ts[2] = -999999; if ( sd==0 && sa!=0 ) { /* one of the roots is 0, the other two are the soln of a quadratic */ ts[0] = 0; if ( sc==0 ) { ts[1] = -sb/(extended) sa; /* two zero roots */ } else { temp = sb*(extended) sb-4*(extended) sa*sc; if ( RealNear(temp,0)) ts[1] = -sb/(2*(extended) sa); else if ( temp>=0 ) { temp = sqrt(temp); ts[1] = (-sb+temp)/(2*(extended) sa); ts[2] = (-sb-temp)/(2*(extended) sa); } } } else if ( sa!=0 ) { /* http://www.m-a.org.uk/eb/mg/mg077ch.pdf */ /* this nifty solution to the cubic neatly avoids complex arithmatic */ xN = -sb/(3*(extended) sa); yN = ((sa*xN + sb)*xN+sc)*xN + sd; delta2 = (sb*(extended) sb-3*(extended) sa*sc)/(9*(extended) sa*sa); /*if ( RealWithin(delta2,0,.00000001) ) delta2 = 0;*/ /* the descriminant is yN^2-h^2, but delta might be <0 so avoid using h */ d = yN*yN - 4*sa*sa*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*sa); t2 = (t2==0) ? 0 : (t2<0) ? -pow(-t2,1./3.) : pow(t2,1./3.); t3 = (-yN+temp)/(2*sa); 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*sa*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); /* 2*pi/3 */ ts[i++] = xN+2*delta*cos(4.1887902+theta); /* 4*pi/3 */ } } } else if ( /* d==0 && */ delta2!=0 ) { delta = yN/(2*sa); 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 ( sb!=0 ) { extended d = sc*(extended) sc-4*(extended) sb*sd; if ( d<0 && RealNear(d,0)) d=0; if ( d<0 ) return(false); /* All roots imaginary */ d = sqrt(d); ts[0] = (-sc-d)/(2*(extended) sb); ts[1] = (-sc+d)/(2*(extended) sb); } else if ( sc!=0 ) { ts[0] = -sd/(extended) sc; } else { /* If it's a point then either everything is a solution, or nothing */ } return( ts[0]!=-999999 ); } int CubicSolve(const Spline1D *sp,bigreal sought, extended ts[3]) { extended t; extended ts2[3]; int i,j; /* This routine gives us all solutions between [0,1] with -1 as an error flag */ /* http://mathforum.org/dr.math/faq/faq.cubic.equations.html */ ts[0] = ts[1] = ts[2] = -1; if ( !_CubicSolve(sp,sought,ts2)) { return( false ); } for ( i=j=0; i<3; ++i ) { if ( ts2[i]>-.0001 && ts2[i]<1.0001 ) { if ( ts2[i]<0 ) ts[j++] = 0; else if ( ts2[i]>1 ) ts[j++] = 1; else ts[j++] = ts2[i]; } } if ( j==0 ) 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 ); } /* An IEEE double has 52 bits of precision. So one unit of rounding error will be */ /* the number divided by 2^51 */ # define D_RE_Factor (1024.0*1024.0*1024.0*1024.0*1024.0*2.0) /* But that's not going to work near 0, so, since the t values we care about */ /* are [0,1], let's use 1.0/D_RE_Factor */ extended IterateSplineSolve(const Spline1D *sp, extended tmin, extended tmax, extended sought) { extended t, low, high, test; Spline1D temp; /* Now the closed form CubicSolver can have rounding errors so if we know */ /* the spline to be monotonic, an iterative approach is more accurate */ if ( tmin>tmax ) { t=tmin; tmin=tmax; tmax=t; } temp = *sp; temp.d -= sought; if ( temp.a==0 && temp.b==0 && temp.c!=0 ) { t = -temp.d/(extended) temp.c; if ( ttmax ) return( -1 ); return( t ); } 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==0 ) return(tmin); if ( high==0 ) return(tmax); if (( low<0 && high>0 ) || ( low>0 && high<0 )) { for (;;) { t = (tmax+tmin)/2; if ( t==tmax || t==tmin ) return( t ); test = ((temp.a*t+temp.b)*t+temp.c)*t+temp.d; if ( test==0 ) /* someone complained that this test relied on exact arithmetic. In fact this test will almost never be hit, the real exit test is the line above, when tmin/tmax are so close that there is no space between them in the floating representation */ return( t ); if ( (low<0 && test<0) || (low>0 && test>0) ) tmin=t; else tmax = t; } } else if ( low<.0001 && low>-.0001 ) return( tmin ); /* Rounding errors */ else if ( high<.0001 && high>-.0001 ) return( tmax ); return( -1 ); } extended IterateSplineSolveFixup(const Spline1D *sp, extended tmin, extended tmax, extended sought) { // Search between tmin and tmax for a t-value at which the spline outputs sought. extended t; bigreal factor; extended val, valp, valm; if ( tmin>tmax ) { t=tmin; tmin=tmax; tmax=t; } t = IterateSplineSolve(sp,tmin,tmax,sought); if ( t==-1 ) return( -1 ); if ((val = (((sp->a*t+sp->b)*t+sp->c)*t+sp->d) - sought)<0 ) val=-val; if ( val!=0 ) { for ( factor=1024.0*1024.0*1024.0*1024.0*1024.0; factor>.5; factor/=2.0 ) { extended tp = t + (factor*t)/D_RE_Factor; extended tm = t - (factor*t)/D_RE_Factor; if ( tp>tmax ) tp=tmax; if ( tma*tp+sp->b)*tp+sp->c)*tp+sp->d) - sought)<0 ) valp = -valp; if ( (valm = (((sp->a*tm+sp->b)*tm+sp->c)*tm+sp->d) - sought)<0 ) valm = -valm; if ( valpa,sp->a+val) || Within16RoundingErrors(sp->b,sp->b+val) || Within16RoundingErrors(sp->c,sp->c+val) || Within16RoundingErrors(sp->c,sp->c+val) || Within16RoundingErrors(sp->d,sp->d+val)) return( t ); else return( -1 ); } if ( t>=tmin && t<=tmax ) return( t ); /* I don't think this can happen... */ return( -1 ); } double CheckExtremaForSingleBitErrors(const Spline1D *sp, double t, double othert) { double u1, um1; double slope, slope1, slopem1; int err; double diff, factor; if ( t<0 || t>1 ) return( t ); factor = t*0x40000/D_RE_Factor; if ( (diff = t-othert)<0 ) diff= -diff; if ( factor>diff/4 && diff!=0 ) /* This little check is to insure we don't skip beyond the well of this extremum into the next */ factor = diff/4; slope = (3*(double) sp->a*t+2*sp->b)*t+sp->c; if ( slope<0 ) slope = -slope; for ( err = 0x40000; err!=0; err>>=1 ) { u1 = t+factor; slope1 = (3*(double) sp->a*u1+2*sp->b)*u1+sp->c; if ( slope1<0 ) slope1 = -slope1; um1 = t-factor; slopem1 = (3*(double) sp->a*um1+2*sp->b)*um1+sp->c; if ( slopem1<0 ) slopem1 = -slopem1; if ( slope1=0.0 ) { t = um1; } factor /= 2.0; } /* that seems as good as it gets */ return( t ); } void SplineFindExtrema(const Spline1D *sp, extended *_t1, extended *_t2 ) { extended t1= -1, t2= -1; extended 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*(extended) sp->b*sp->b - 12*(extended) 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); t1 = CheckExtremaForSingleBitErrors(sp,t1,t2); t2 = CheckExtremaForSingleBitErrors(sp,t2,t1); if ( t1>t2 ) { extended 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*(extended) sp->b); if ( t1<=0 || t1>=1 ) t1 = -1; } else /*if ( sp->c!=0 )*/ { /* linear, no extrema */ } *_t1 = t1; *_t2 = t2; } bigreal SplineCurvature(Spline *s, bigreal t) { /* Kappa = (x'y'' - y'x'') / (x'^2 + y'^2)^(3/2) */ bigreal dxdt, dydt, d2xdt2, d2ydt2, denom, numer; if ( s==NULL ) return( CURVATURE_ERROR ); dxdt = (3*s->splines[0].a*t+2*s->splines[0].b)*t+s->splines[0].c; dydt = (3*s->splines[1].a*t+2*s->splines[1].b)*t+s->splines[1].c; d2xdt2 = 6*s->splines[0].a*t + 2*s->splines[0].b; d2ydt2 = 6*s->splines[1].a*t + 2*s->splines[1].b; denom = pow( dxdt*dxdt + dydt*dydt, 3.0/2.0 ); numer = dxdt*d2ydt2 - dydt*d2xdt2; if ( numer==0 ) return( 0 ); if ( denom==0 ) return( CURVATURE_ERROR ); return( numer/denom ); } int Spline2DFindExtrema(const Spline *sp, extended extrema[4] ) { int i,j; BasePoint last, cur, mid; /* If the control points are at the end-points then this (1D) spline is */ /* basically a line. But rounding errors can give us very faint extrema */ /* if we look for them */ if ( !Spline1DCantExtremeX(sp) ) SplineFindExtrema(&sp->splines[0],&extrema[0],&extrema[1]); else extrema[0] = extrema[1] = -1; if ( !Spline1DCantExtremeY(sp) ) SplineFindExtrema(&sp->splines[1],&extrema[2],&extrema[3]); else extrema[2] = extrema[3] = -1; for ( i=0; i<3; ++i ) for ( j=i+1; j<4; ++j ) { if ( (extrema[i]==-1 && extrema[j]!=-1) || (extrema[i]>extrema[j] && extrema[j]!=-1) ) { extended 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; } } /* Extrema which are too close together are not interesting */ last = sp->from->me; for ( i=0; i<4 && extrema[i]!=-1; ++i ) { cur.x = ((sp->splines[0].a*extrema[i]+sp->splines[0].b)*extrema[i]+ sp->splines[0].c)*extrema[i]+sp->splines[0].d; cur.y = ((sp->splines[1].a*extrema[i]+sp->splines[1].b)*extrema[i]+ sp->splines[1].c)*extrema[i]+sp->splines[1].d; mid.x = (last.x+cur.x)/2; mid.y = (last.y+cur.y)/2; if ( (mid.x==last.x || mid.x==cur.x) && (mid.y==last.y || mid.y==cur.y)) { for ( j=i; j<3; ++j ) extrema[j] = extrema[j+1]; extrema[3] = -1; --i; } else last = cur; } if ( extrema[0]!=-1 ) { mid.x = (last.x+sp->to->me.x)/2; mid.y = (last.y+sp->to->me.y)/2; if ( (mid.x==last.x || mid.x==cur.x) && (mid.y==last.y || mid.y==cur.y)) extrema[i-1] = -1; } for ( i=0; i<4 && extrema[i]!=-1; ++i ); if ( i!=0 ) { cur = sp->to->me; mid.x = (last.x+cur.x)/2; mid.y = (last.y+cur.y)/2; if ( (mid.x==last.x || mid.x==cur.x) && (mid.y==last.y || mid.y==cur.y)) extrema[--i] = -1; } return( i ); } int Spline2DFindPointsOfInflection(const Spline *sp, extended poi[2] ) { int cnt=0; extended a, b, c, b2_fourac, t; /* A POI happens when d2 y/dx2 is zero. This is not the same as d2y/dt2 / d2x/dt2 */ /* d2 y/dx^2 = d/dt ( dy/dt / dx/dt ) / dx/dt */ /* = ( (dx/dt) * d2 y/dt2 - ((dy/dt) * d2 x/dt2) )/ (dx/dt)^3 */ /* (3ax*t^2+2bx*t+cx) * (6ay*t+2by) - (3ay*t^2+2by*t+cy) * (6ax*t+2bx) == 0 */ /* (3ax*t^2+2bx*t+cx) * (3ay*t+by) - (3ay*t^2+2by*t+cy) * (3ax*t+bx) == 0 */ /* 9*ax*ay*t^3 + (3ax*by+6bx*ay)*t^2 + (2bx*by+3cx*ay)*t + cx*by */ /* -(9*ax*ay*t^3 + (3ay*bx+6by*ax)*t^2 + (2by*bx+3cy*ax)*t + cy*bx)==0 */ /* 3*(ax*by-ay*bx)*t^2 + 3*(cx*ay-cy*ax)*t+ (cx*by-cy*bx) == 0 */ a = 3*((extended) sp->splines[1].a*sp->splines[0].b-(extended) sp->splines[0].a*sp->splines[1].b); b = 3*((extended) sp->splines[0].c*sp->splines[1].a - (extended) sp->splines[1].c*sp->splines[0].a); c = (extended) sp->splines[0].c*sp->splines[1].b-(extended) sp->splines[1].c*sp->splines[0].b; if ( !RealNear(a,0) ) { b2_fourac = b*b - 4*a*c; poi[0] = poi[1] = -1; if ( b2_fourac<0 ) return( 0 ); b2_fourac = sqrt( b2_fourac ); t = (-b+b2_fourac)/(2*a); if ( t>=0 && t<=1.0 ) poi[cnt++] = t; t = (-b-b2_fourac)/(2*a); if ( t>=0 && t<=1.0 ) { if ( cnt==1 && poi[0]>t ) { poi[1] = poi[0]; poi[0] = t; ++cnt; } else poi[cnt++] = t; } } else if ( !RealNear(b,0) ) { t = -c/b; if ( t>=0 && t<=1.0 ) poi[cnt++] = t; } if ( cnt<2 ) poi[cnt] = -1; return( cnt ); } /* Ok, if the above routine finds an extremum that less than 1 unit */ /* from an endpoint or another extremum, 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 SplineRemoveExtremaTooClose(Spline1D *sp, extended *_t1, extended *_t2 ) { extended last, test; extended 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 IntersectLines(BasePoint *inter, BasePoint *line1_1, BasePoint *line1_2, BasePoint *line2_1, BasePoint *line2_2) { // A lot of functions call this with the same address as an input and the output. // In order to avoid unexpected behavior, we delay writing to the output until the end. bigreal s1, s2; BasePoint _output; BasePoint * output = &_output; if ( line1_1->x == line1_2->x ) { // Line 1 is vertical. output->x = line1_1->x; if ( line2_1->x == line2_2->x ) { // Line 2 is vertical. if ( line2_1->x!=line1_1->x ) return( false ); /* Parallel vertical lines */ output->y = (line1_1->y+line2_1->y)/2; } else { output->y = line2_1->y + (output->x-line2_1->x) * (line2_2->y - line2_1->y)/(line2_2->x - line2_1->x); } *inter = *output; return( true ); } else if ( line2_1->x == line2_2->x ) { // Line 2 is vertical, but we know that line 1 is not. output->x = line2_1->x; output->y = line1_1->y + (output->x-line1_1->x) * (line1_2->y - line1_1->y)/(line1_2->x - line1_1->x); *inter = *output; return( true ); } else { // Both lines are oblique. 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 ); output->x = (line1_2->x+line2_2->x)/2; output->y = (line1_2->y+line2_2->y)/2; } else { output->x = (s1*line1_1->x - s2*line2_1->x - line1_1->y + line2_1->y)/(s1-s2); output->y = line1_1->y + (output->x-line1_1->x) * s1; } *inter = *output; return( true ); } } int IntersectLinesClip(BasePoint *inter, BasePoint *line1_1, BasePoint *line1_2, BasePoint *line2_1, BasePoint *line2_2) { BasePoint old = *inter, unit; bigreal 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 ); } static int AddPoint(extended x,extended y,extended t,extended s,BasePoint *pts, extended t1s[3],extended t2s[3], int soln) { int i; for ( i=0; i=9 ) IError( "Too many solutions!\n" ); t1s[soln] = t; t2s[soln] = s; pts[soln].x = x; pts[soln].y = y; return( soln+1 ); } static void IterateSolve(const Spline1D *sp,extended 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 ) { extended 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); if ( ts[j]!=-1 ) ++j; if ( e[i+1]==1.0 ) break; } } else if ( sp->b!=0 ) { extended b2_4ac = sp->c*(extended) sp->c - 4*sp->b*(extended) 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] ) { bigreal t = ts[0]; ts[0] = ts[1]; ts[1] = t; } } } else if ( sp->c!=0 ) { ts[0] = -sp->d/(extended) 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 ( i=0; its[i+1]) { ts[i] = (ts[i]+ts[i+1])/2; --j; for ( ++i; id; extended dt = ((sp->a*ts[0]+sp->b)*ts[0]+sp->c)*ts[0]+sp->d; if ( d0<0 ) d0=-d0; if ( dt<0 ) dt=-dt; if ( d0
a+(extended) sp->b+sp->c+sp->d; extended dt = ((sp->a*ts[j-1]+sp->b)*ts[j-1]+sp->c)*ts[j-1]+sp->d; if ( d1<0 ) d1=-d1; if ( dt<0 ) dt=-dt; if ( d1
splines[major]; int i; /* Calculation for t=1 can yield rounding errors. Insist on the endpoints */ /* (the Spline1D is not a perfectly accurate description of the spline, */ /* but the control points are right -- at least that's my defn.) */ if ( tlow==0 && val==(&spline->from->me.x)[major] ) return( 0 ); if ( thigh==1.0 && val==(&spline->to->me.x)[major] ) return( 1.0 ); temp = *sp; temp.d -= val; IterateSolve(&temp,ts); if ( tlow=tlow && ts[i]<=thigh ) return( ts[i] ); for ( i=0; i<3; ++i ) { if ( ts[i]>=tlow-1./1024. && ts[i]<=tlow ) return( tlow ); if ( ts[i]>=thigh && ts[i]<=thigh+1./1024 ) return( thigh ); } } else { for ( i=0; i<3; ++i ) if ( ts[i]>=thigh && ts[i]<=tlow ) return( ts[i] ); for ( i=0; i<3; ++i ) { if ( ts[i]>=thigh-1./1024. && ts[i]<=thigh ) return( thigh ); if ( ts[i]>=tlow && ts[i]<=tlow+1./1024 ) return( tlow ); } } return( -1 ); } static int ICAddInter(int cnt,BasePoint *foundpos,extended *foundt1,extended *foundt2, const Spline *s1,const Spline *s2,extended t1,extended t2, int maxcnt) { if ( cnt>=maxcnt ) return( cnt ); 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,extended *foundt1,extended *foundt2, int other, const Spline *s1,const Spline *s2,extended t1low,extended t1high,extended t2low,extended t2high, int maxcnt) { int major; extended t1, t2; extended 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; for (;;) { 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,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,maxcnt)); if ( (o1o>o2o && o1no2n)) { t1high = t1; t2high = t2; } else { t1low = t1; t2low = t2; } } } static int CubicsIntersect(const Spline *s1,extended lowt1,extended hight1,BasePoint *min1,BasePoint *max1, const Spline *s2,extended lowt2,extended hight2,BasePoint *min2,BasePoint *max2, BasePoint *foundpos,extended *foundt1,extended *foundt2, int maxcnt) { int major, other; BasePoint max, min; extended t1max, t1min, t2max, t2min, t1, t2, t1diff, oldt2; extended 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,major,(&max.x)[major],lowt1,hight1); t1min = ISolveWithin(s1,major,(&min.x)[major],lowt1,hight1); t2max = ISolveWithin(s2,major,(&max.x)[major],lowt2,hight2); t2min = ISolveWithin(s2,major,(&min.x)[major],lowt2,hight2); if ( t1max==-1 || t1min==-1 || t2max==-1 || t2min==-1 ) return( 0 ); t1diff = (t1max-t1min)/64.0; if (RealNear(t1diff,0)) return( 0 ); t1 = t1min; t2 = t2min; o1o = t1==0 ? (&s1->from->me.x)[other] : t1==1.0 ? (&s1->to->me.x)[other] : ((s1->splines[other].a*t1+s1->splines[other].b)*t1+ s1->splines[other].c)*t1+s1->splines[other].d; o2o = t2==0 ? (&s2->from->me.x)[other] : t2==1.0 ? (&s2->to->me.x)[other] : ((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,maxcnt); for (;;) { if ( cnt>=maxcnt ) break; t1 += t1diff; if (( t1max>t1min && t1>t1max ) || (t1max3 ) break; m = t1==0 ? (&s1->from->me.x)[major] : t1==1.0 ? (&s1->to->me.x)[major] : ((s1->splines[major].a*t1+s1->splines[major].b)*t1+ s1->splines[major].c)*t1+s1->splines[major].d; oldt2 = t2; t2 = ISolveWithin(s2,major,m,lowt2,hight2); if ( t2==-1 ) continue; o1n = t1==0 ? (&s1->from->me.x)[other] : t1==1.0 ? (&s1->to->me.x)[other] : ((s1->splines[other].a*t1+s1->splines[other].b)*t1+ s1->splines[other].c)*t1+s1->splines[other].d; o2n = t2==0 ? (&s2->from->me.x)[other] : t2==1.0 ? (&s2->to->me.x)[other] : ((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,maxcnt); if ( (o1o>o2o && o1no2n)) cnt = ICBinarySearch(cnt,foundpos,foundt1,foundt2,other, s1,s2,t1-t1diff,t1,oldt2,t2,maxcnt); o1o = o1n; o2o = o2n; } return( cnt ); } static int Closer(const Spline *s1,const Spline *s2,extended t1,extended t2,extended t1p,extended t2p) { bigreal x1 = ((s1->splines[0].a*t1+s1->splines[0].b)*t1+s1->splines[0].c)*t1+s1->splines[0].d; bigreal y1 = ((s1->splines[1].a*t1+s1->splines[1].b)*t1+s1->splines[1].c)*t1+s1->splines[1].d; bigreal x2 = ((s2->splines[0].a*t2+s2->splines[0].b)*t2+s2->splines[0].c)*t2+s2->splines[0].d; bigreal y2 = ((s2->splines[1].a*t2+s2->splines[1].b)*t2+s2->splines[1].c)*t2+s2->splines[1].d; bigreal diff = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2); bigreal x1p = ((s1->splines[0].a*t1p+s1->splines[0].b)*t1p+s1->splines[0].c)*t1p+s1->splines[0].d; bigreal y1p = ((s1->splines[1].a*t1p+s1->splines[1].b)*t1p+s1->splines[1].c)*t1p+s1->splines[1].d; bigreal x2p = ((s2->splines[0].a*t2p+s2->splines[0].b)*t2p+s2->splines[0].c)*t2p+s2->splines[0].d; bigreal y2p = ((s2->splines[1].a*t2p+s2->splines[1].b)*t2p+s2->splines[1].c)*t2p+s2->splines[1].d; bigreal diffp = (x1p-x2p)*(x1p-x2p) + (y1p-y2p)*(y1p-y2p); if ( diffno 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(const Spline *s1, const Spline *s2, BasePoint pts[9], extended t1s[10], extended t2s[10]) { /* One extra for a trailing -1 */ BasePoint min1, max1, min2, max2; int soln = 0; extended x,y,t, ac0, ac1; int i,j,found; Spline1D spline; extended tempts[4]; /* 3 solns for cubics, 4 for quartics */ extended extrema1[6], extrema2[6]; int ecnt1, ecnt2; t1s[0] = t1s[1] = t1s[2] = t1s[3] = -1; t2s[0] = t2s[1] = t2s[2] = t2s[3] = -1; if ( s1==s2 && !s1->knownlinear && !s1->isquadratic ) /* Special case see if it doubles back on itself anywhere */; else if ( s1==s2 ) return( 0 ); /* Linear and quadratics can't double back, can't self-intersect */ else 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 */ /* Ignore splines which are just a point */ if ( s1->knownlinear && s1->splines[0].c==0 && s1->splines[1].c==0 ) return( 0 ); if ( s2->knownlinear && s2->splines[0].c==0 && s2->splines[1].c==0 ) return( 0 ); if ( s1->knownlinear ) /* Do Nothing */; else if ( s2->knownlinear || (!s1->isquadratic && s2->isquadratic)) { const Spline *stemp = s1; extended *ts = t1s; t1s = t2s; t2s = ts; s1 = s2; s2 = stemp; } 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 */ if ( s1->knownlinear ) { spline.d = s1->splines[1].c*((bigreal) s2->splines[0].d-(bigreal) s1->splines[0].d)- s1->splines[0].c*((bigreal) s2->splines[1].d-(bigreal) s1->splines[1].d); spline.c = s1->splines[1].c*(bigreal) s2->splines[0].c - s1->splines[0].c*(bigreal) s2->splines[1].c; spline.b = s1->splines[1].c*(bigreal) s2->splines[0].b - s1->splines[0].c*(bigreal) s2->splines[1].b; spline.a = s1->splines[1].c*(bigreal) s2->splines[0].a - s1->splines[0].c*(bigreal) 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 ) x = s1->splines[0].d; if ( s1->splines[1].c==0 ) y = s1->splines[1].d; if ( (ac0 = s1->splines[0].c)<0 ) ac0 = -ac0; if ( (ac1 = s1->splines[1].c)<0 ) ac1 = -ac1; if ( ac0>ac1 ) t = (x-s1->splines[0].d)/s1->splines[0].c; else t = (y-s1->splines[1].d)/s1->splines[1].c; if ( tempts[i]>.99996 && Closer(s1,s2,t,tempts[i],t,1)) { tempts[i] = 1; x = s2->to->me.x; y = s2->to->me.y; } else if ( tempts[i]<.00001 && Closer(s1,s2,t,tempts[i],t,0)) { tempts[i] = 0; x = s2->from->me.x; y = s2->from->me.y; } /* I know we just did this, but we might have changed x,y so redo */ if ( ac0>ac1 ) t = (x-s1->splines[0].d)/s1->splines[0].c; else t = (y-s1->splines[1].d)/s1->splines[1].c; if ( t>.99996 && t<1.001 && Closer(s1,s2,t,tempts[i],1,tempts[i])) { t = 1; x = s1->to->me.x; y = s1->to->me.y; } else if ( t<.00001 && t>-.001 && Closer(s1,s2,t,tempts[i],0,tempts[i])) { t = 0; x = s1->from->me.x; y = s1->from->me.y; } if ( t<-.001 || t>1.001 || xmax1.x+.01 || y>max1.y+.01 ) 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 ); } /* 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 if ( s1!=s2 ) found += CubicsIntersect(s1,extrema1[i],extrema1[i+1],&min1,&max1, s2,extrema2[j],extrema2[j+1],&min2,&max2, &pts[found],&t1s[found],&t2s[found],9-found); else { int k,l; int cnt = CubicsIntersect(s1,extrema1[i],extrema1[i+1],&min1,&max1, s2,extrema2[j],extrema2[j+1],&min2,&max2, &pts[found],&t1s[found],&t2s[found],9-found); for ( k=0; k=8 ) { /* If the splines are colinear then we might get an unbounded */ /* number of intersections */ break; } } } t1s[found] = t2s[found] = -1; return( found!=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) { HintInstance *hi, *n; for ( hi=h->where; hi!=NULL; hi=n ) { n = hi->next; chunkfree(hi,sizeof(HintInstance)); } chunkfree(h,sizeof(DStemInfo)); } void DStemInfosFree(DStemInfo *h) { DStemInfo *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(DStemInfo)); } } void KernPairsFree(KernPair *kp) { KernPair *knext; for ( ; kp!=NULL; kp = knext ) { knext = kp->next; if ( kp->adjust!=NULL ) { free(kp->adjust->corrections); chunkfree(kp->adjust,sizeof(DeviceTable)); } chunkfree(kp,sizeof(KernPair)); } } void AnchorPointsFree(AnchorPoint *ap) { AnchorPoint *anext; for ( ; ap!=NULL; ap = anext ) { anext = ap->next; free(ap->xadjust.corrections); free(ap->yadjust.corrections); chunkfree(ap,sizeof(AnchorPoint)); } } void ValDevFree(ValDevTab *adjust) { if ( adjust==NULL ) return; free( adjust->xadjust.corrections ); free( adjust->yadjust.corrections ); free( adjust->xadv.corrections ); free( adjust->yadv.corrections ); chunkfree(adjust,sizeof(ValDevTab)); } void DeviceTableFree(DeviceTable *dt) { if ( dt==NULL ) return; free(dt->corrections); chunkfree(dt,sizeof(DeviceTable)); } 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); ValDevFree(pst->u.pair.vr[0].adjust); ValDevFree(pst->u.pair.vr[1].adjust); chunkfree(pst->u.pair.vr,sizeof(struct vr [2])); } else if ( pst->type!=pst_position ) { free(pst->u.subs.variant); } else if ( pst->type==pst_position ) { ValDevFree(pst->u.pos.adjust); } chunkfree(pst,sizeof(PST)); } } 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; default:; } free(r->lookups); } void FPSTClassesFree(FPST *fpst) { int i; for ( i=0; inccnt; ++i ) { free(fpst->nclass[i]); free(fpst->nclassnames[i]); } for ( i=0; ibccnt; ++i ) { free(fpst->bclass[i]); free(fpst->bclassnames[i]); } for ( i=0; ifccnt; ++i ) { free(fpst->fclass[i]); free(fpst->fclassnames[i]); } free(fpst->nclass); free(fpst->bclass); free(fpst->fclass); free(fpst->nclassnames); free(fpst->bclassnames); free(fpst->fclassnames); fpst->nccnt = fpst->bccnt = fpst->fccnt = 0; fpst->nclass = fpst->bclass = fpst->fclass = NULL; fpst->nclassnames = fpst->bclassnames = fpst->fclassnames = NULL; } void FPSTFree(FPST *fpst) { FPST *next; int i; while ( fpst!=NULL ) { next = fpst->next; FPSTClassesFree(fpst); for ( i=0; irule_cnt; ++i ) { FPSTRuleContentsFree( &fpst->rules[i],fpst->format ); } free(fpst->rules); chunkfree(fpst,sizeof(FPST)); fpst = next; } } 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]); chunkfree(l,sizeof(*l)); l = next; } } void AltUniFree(struct altuni *altuni) { struct altuni *next; while ( altuni ) { next = altuni->next; chunkfree(altuni,sizeof(struct altuni)); altuni = next; } } void LayerDefault(Layer *layer) { memset(layer,0,sizeof(Layer)); 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 = 10; layer->stroke_pen.linecap = lc_round; layer->stroke_pen.linejoin = lj_round; 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; /* Dashes default to an unbroken line */ } SplineChar *SplineCharCreate(int layer_cnt) { SplineChar *sc = chunkalloc(sizeof(SplineChar)); int i; sc->color = COLOR_DEFAULT; sc->orig_pos = 0xffff; sc->unicodeenc = -1; sc->layer_cnt = layer_cnt; sc->layers = calloc(layer_cnt,sizeof(Layer)); for ( i=0; ilayers[i]); sc->tex_height = sc->tex_depth = sc->italic_correction = sc->top_accent_horiz = TEX_UNDEF; return( sc ); } SplineChar *SFSplineCharCreate(SplineFont *sf) { SplineChar *sc = SplineCharCreate(sf==NULL?2:sf->layer_cnt); int i; if ( sf==NULL ) { sc->layers[ly_back].background = true; sc->layers[ly_fore].background = false; } else { for ( i=0; ilayer_cnt; ++i ) { sc->layers[i].background = sf->layers[i].background; sc->layers[i].order2 = sf->layers[i].order2; } sc->parent = sf; } return( sc ); } void GlyphVariantsFree(struct glyphvariants *gv) { int i; if ( gv==NULL ) return; free(gv->variants); DeviceTableFree(gv->italic_adjusts); for ( i=0; ipart_cnt; ++i ) free( gv->parts[i].component ); free(gv->parts); chunkfree(gv,sizeof(*gv)); } void MathKernVContentsFree(struct mathkernvertex *mk) { int i; for ( i=0; icnt; ++i ) { DeviceTableFree(mk->mkd[i].height_adjusts); DeviceTableFree(mk->mkd[i].kern_adjusts); } free(mk->mkd); } void MathKernFree(struct mathkern *mk) { int i; if ( mk==NULL ) return; for ( i=0; i<4; ++i ) MathKernVContentsFree( &(&mk->top_right)[i] ); chunkfree(mk,sizeof(*mk)); } void SplineCharListsFree(struct splinecharlist *dlist) { struct splinecharlist *dnext; for ( ; dlist!=NULL; dlist = dnext ) { dnext = dlist->next; chunkfree(dlist,sizeof(struct splinecharlist)); } } struct pattern *PatternCopy(struct pattern *old, real transform[6]) { struct pattern *pat; if ( old==NULL ) return( NULL ); pat = chunkalloc(sizeof(struct pattern)); *pat = *old; pat->pattern = copy( old->pattern ); if ( transform!=NULL ) MatMultiply(pat->transform,transform,pat->transform); return( pat ); } void PatternFree(struct pattern *pat) { if ( pat==NULL ) return; free(pat->pattern); chunkfree(pat,sizeof(struct pattern)); } struct gradient *GradientCopy(struct gradient *old,real transform[6]) { struct gradient *grad; if ( old==NULL ) return( NULL ); grad = chunkalloc(sizeof(struct gradient)); *grad = *old; grad->grad_stops = malloc(old->stop_cnt*sizeof(struct grad_stops)); memcpy(grad->grad_stops,old->grad_stops,old->stop_cnt*sizeof(struct grad_stops)); if ( transform!=NULL ) { BpTransform(&grad->start,&grad->start,transform); BpTransform(&grad->stop,&grad->stop,transform); } return( grad ); } void GradientFree(struct gradient *grad) { if ( grad==NULL ) return; free(grad->grad_stops); chunkfree(grad,sizeof(struct gradient)); } void BrushCopy(struct brush *into, struct brush *from, real transform[6]) { *into = *from; into->gradient = GradientCopy(from->gradient,transform); into->pattern = PatternCopy(from->pattern,transform); } void PenCopy(struct pen *into, struct pen *from,real transform[6]) { *into = *from; into->brush.gradient = GradientCopy(from->brush.gradient,transform); into->brush.pattern = PatternCopy(from->brush.pattern,transform); } void LayerFreeContents(SplineChar *sc,int layer) { SplinePointListsFree(sc->layers[layer].splines); GradientFree(sc->layers[layer].fill_brush.gradient); PatternFree(sc->layers[layer].fill_brush.pattern); GradientFree(sc->layers[layer].stroke_pen.brush.gradient); PatternFree(sc->layers[layer].stroke_pen.brush.pattern); RefCharsFree(sc->layers[layer].refs); /* image garbage collection????!!!! */ } void SplineCharFreeContents(SplineChar *sc) { int i; if ( sc==NULL ) return; if (sc->name != NULL) free(sc->name); if (sc->comment != NULL) free(sc->comment); for ( i=0; ilayer_cnt; ++i ) { #if defined(_NO_PYTHON) if (sc->layers[i].python_persistent != NULL) free( sc->layers[i].python_persistent ); /* It's a string of pickled data which we leave as a string */ #else PyFF_FreeSCLayer(sc, i); #endif LayerFreeContents(sc,i); } 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); if (sc->ttf_instrs != NULL) free(sc->ttf_instrs); if (sc->countermasks != NULL) free(sc->countermasks); if (sc->layers != NULL) free(sc->layers); AltUniFree(sc->altuni); GlyphVariantsFree(sc->horiz_variants); GlyphVariantsFree(sc->vert_variants); DeviceTableFree(sc->italic_adjusts); DeviceTableFree(sc->top_accent_adjusts); MathKernFree(sc->mathkern); if (sc->glif_name != NULL) { free(sc->glif_name); sc->glif_name = NULL; } } 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; free(an->name); chunkfree(an,sizeof(AnchorClass)); } } 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 ScriptLangListFree(struct scriptlanglist *sl) { struct scriptlanglist *next; while ( sl!=NULL ) { next = sl->next; free(sl->morelangs); chunkfree(sl,sizeof(*sl)); sl = next; } } void FeatureScriptLangListFree(FeatureScriptLangList *fl) { FeatureScriptLangList *next; while ( fl!=NULL ) { next = fl->next; ScriptLangListFree(fl->scripts); chunkfree(fl,sizeof(*fl)); fl = next; } } void OTLookupFree(OTLookup *lookup) { struct lookup_subtable *st, *stnext; free(lookup->lookup_name); FeatureScriptLangListFree(lookup->features); for ( st=lookup->subtables; st!=NULL; st=stnext ) { stnext = st->next; free(st->subtable_name); free(st->suffix); chunkfree(st,sizeof(struct lookup_subtable)); } chunkfree( lookup,sizeof(OTLookup) ); } void OTLookupListFree(OTLookup *lookup ) { OTLookup *next; for ( ; lookup!=NULL; lookup = next ) { next = lookup->next; OTLookupFree(lookup); } } void KernClassFreeContents(KernClass *kc) { int i; 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); for ( i=kc->first_cnt*kc->second_cnt-1; i>=0 ; --i ) free(kc->adjusts[i].corrections); free(kc->adjusts); if (kc->firsts_flags) free(kc->firsts_flags); if (kc->seconds_flags) free(kc->seconds_flags); if (kc->offsets_flags) free(kc->offsets_flags); if (kc->firsts_names) { for ( i=kc->first_cnt-1; i>=0 ; --i ) free(kc->firsts_names[i]); free(kc->firsts_names); } if (kc->seconds_names) { for ( i=kc->second_cnt-1; i>=0 ; --i ) free(kc->seconds_names[i]); free(kc->seconds_names); } } void KernClassClearSpecialContents(KernClass *kc) { // This frees and zeros special data not handled by the FontForge GUI, // most of which comes from U. F. O.. int i; if (kc->firsts_flags) { free(kc->firsts_flags); kc->firsts_flags = NULL; } if (kc->seconds_flags) { free(kc->seconds_flags); kc->seconds_flags = NULL; } if (kc->offsets_flags) { free(kc->offsets_flags); kc->offsets_flags = NULL; } if (kc->firsts_names) { for ( i=kc->first_cnt-1; i>=0 ; --i ) free(kc->firsts_names[i]); free(kc->firsts_names); kc->firsts_names = NULL; } if (kc->seconds_names) { for ( i=kc->second_cnt-1; i>=0 ; --i ) free(kc->seconds_names[i]); free(kc->seconds_names); kc->seconds_names = NULL; } } void KernClassListFree(KernClass *kc) { KernClass *n; while ( kc ) { KernClassFreeContents(kc); n = kc->next; chunkfree(kc,sizeof(KernClass)); kc = n; } } void KernClassListClearSpecialContents(KernClass *kc) { KernClass *n; while ( kc ) { KernClassClearSpecialContents(kc); n = kc->next; 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 OtfNameListFree(struct otfname *on) { struct otfname *on_next; for ( ; on!=NULL; on = on_next ) { on_next = on->next; free(on->name); chunkfree(on,sizeof(*on)); } } void OtfFeatNameListFree(struct otffeatname *fn) { struct otffeatname *fn_next; for ( ; fn!=NULL; fn = fn_next ) { fn_next = fn->next; OtfNameListFree(fn->names); chunkfree(fn,sizeof(*fn)); } } EncMap *EncMapNew(int enccount,int backmax,Encoding *enc) { /* NOTE: 'enccount' and 'backmax' can sometimes be different map sizes */ EncMap *map; /* Ensure all memory available, otherwise cleanup and exit as NULL */ if ( (map=chunkalloc(sizeof(EncMap)))!=NULL ) { if ( (map->map=malloc(enccount*sizeof(int32)))!=NULL ) { if ( (map->backmap=malloc(backmax*sizeof(int32)))!=NULL ) { map->enccount = map->encmax = enccount; map->backmax = backmax; memset(map->map,-1,enccount*sizeof(int32)); memset(map->backmap,-1,backmax*sizeof(int32)); map->enc = enc; return( map ); } free(map->map); } free(map); } return( NULL ); } EncMap *EncMap1to1(int enccount) { /* Used for CID fonts where CID is same as orig_pos */ /* NOTE: map-enc point to a global variable custom. */ /* TODO: avoid global custom and use passed pointer */ EncMap *map; int i; if ( (map=EncMapNew(enccount,enccount,&custom))!=NULL ) { for ( i=0; imap[i] = map->backmap[i] = i; } return( map ); } void EncMapFree(EncMap *map) { if ( map==NULL ) return; if ( map->enc->is_temporary ) EncodingFree(map->enc); free(map->map); free(map->backmap); free(map->remap); chunkfree(map,sizeof(EncMap)); } void MarkClassFree(int cnt,char **classes,char **names) { int i; for ( i=1; inext ) { cur = chunkalloc(sizeof(struct baselangextent)); *cur = *extent; cur->features = BaseLangCopy(cur->features); if ( head==NULL ) head = cur; else last->next = cur; last = cur; } return( head ); } void BaseLangFree(struct baselangextent *extent) { struct baselangextent *next; while ( extent!=NULL ) { next = extent->next; BaseLangFree(extent->features); chunkfree(extent,sizeof(struct baselangextent)); extent = next; } } void BaseScriptFree(struct basescript *bs) { struct basescript *next; while ( bs!=NULL ) { next = bs->next; if ( bs->baseline_pos ) free(bs->baseline_pos); BaseLangFree(bs->langs); chunkfree(bs,sizeof(struct basescript)); bs = next; } } void BaseFree(struct Base *base) { if ( base==NULL ) return; free(base->baseline_tags); BaseScriptFree(base->scripts); chunkfree(base,sizeof(struct Base)); } void JstfLangFree(struct jstf_lang *jl) { struct jstf_lang *next; int i; while ( jl!=NULL ) { next = jl->next; for ( i=0; icnt; ++i ) { struct jstf_prio *jp = &jl->prios[i]; free(jp->enableShrink); free(jp->disableShrink); free(jp->maxShrink); free(jp->enableExtend); free(jp->disableExtend); free(jp->maxExtend); } free(jl->prios); chunkfree(jl,sizeof(*jl)); jl = next; } } void JustifyFree(Justify *just) { Justify *next; while ( just!=NULL ) { next = just->next; free(just->extenders); JstfLangFree(just->langs); chunkfree(just,sizeof(*just)); just = next; } } void SplineFontFree(SplineFont *sf) { int i; if ( sf==NULL ) return; if ( sf->mm!=NULL ) { MMSetFree(sf->mm); return; } if ( sf->sfd_version>0 && sf->sfd_version<2 ) { // Free special data. SplineFont1* oldsf = (SplineFont1*)sf; // First the script language lists. if (oldsf->script_lang != NULL) { int scripti; for (scripti = 0; oldsf->script_lang[scripti] != NULL; scripti ++) { int scriptj; for (scriptj = 0; oldsf->script_lang[scripti][scriptj].script != 0; scriptj ++) { if (oldsf->script_lang[scripti][scriptj].langs != NULL) free(oldsf->script_lang[scripti][scriptj].langs); } free(oldsf->script_lang[scripti]); oldsf->script_lang[scripti] = NULL; } free(oldsf->script_lang); oldsf->script_lang = NULL; } // Then the table orderings. { struct table_ordering *ord = oldsf->orders; while (ord != NULL) { struct table_ordering *ordtofree = ord; if (ord->ordered_features != NULL) free(ord->ordered_features); ord = ord->next; chunkfree(ordtofree, sizeof(struct table_ordering)); } oldsf->orders = NULL; } } for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) SplineCharFree(sf->glyphs[i]); free(sf->glyphs); free(sf->fontname); free(sf->fullname); free(sf->familyname); free(sf->weight); free(sf->copyright); free(sf->comments); free(sf->filename); free(sf->origname); free(sf->autosavename); free(sf->version); free(sf->xuid); free(sf->cidregistry); free(sf->ordering); if (sf->map != 0) EncMapFree(sf->map); if (sf->MATH) free(sf->MATH); if ( sf->styleMapFamilyName && sf->styleMapFamilyName[0]!='\0' ) { free(sf->styleMapFamilyName); sf->styleMapFamilyName = NULL; } MacFeatListFree(sf->features); /* We don't free the EncMap. That field is only a temporary pointer. Let the FontViewBase free it, that's where it really lives */ // TODO: But that doesn't always get freed. The statement below causes double-frees, so we need to come up with better conditions. #if 0 if (sf->cidmaster == NULL || sf->cidmaster == sf) if (sf->map != NULL) { free(sf->map); sf->map = NULL; } #endif // 0 SplinePointListsFree(sf->grid.splines); AnchorClassesFree(sf->anchor); TtfTablesFree(sf->ttf_tables); TtfTablesFree(sf->ttf_tab_saved); PSDictFree(sf->private); TTFLangNamesFree(sf->names); for ( i=0; isubfontcnt; ++i ) SplineFontFree(sf->subfonts[i]); free(sf->subfonts); GlyphHashFree(sf); OTLookupListFree(sf->gpos_lookups); OTLookupListFree(sf->gsub_lookups); KernClassListFree(sf->kerns); KernClassListFree(sf->vkerns); FPSTFree(sf->possub); ASMFree(sf->sm); OtfNameListFree(sf->fontstyle_name); OtfFeatNameListFree(sf->feat_names); MarkClassFree(sf->mark_class_cnt,sf->mark_classes,sf->mark_class_names); MarkSetFree(sf->mark_set_cnt,sf->mark_sets,sf->mark_set_names); GlyphGroupsFree(sf->groups); GlyphGroupKernsFree(sf->groupkerns); GlyphGroupKernsFree(sf->groupvkerns); free( sf->gasp ); #if defined(_NO_PYTHON) free( sf->python_persistent ); /* It's a string of pickled data which we leave as a string */ #else PyFF_FreeSF(sf); #endif BaseFree(sf->horiz_base); BaseFree(sf->vert_base); JustifyFree(sf->justify); if (sf->layers != NULL) { int layer; for (layer = 0; layer < sf->layer_cnt; layer ++) { if (sf->layers[layer].name != NULL) { free(sf->layers[layer].name); sf->layers[layer].name = NULL; } if (sf->layers[layer].ufo_path != NULL) { free(sf->layers[layer].ufo_path); sf->layers[layer].ufo_path = NULL; } } free(sf->layers); sf->layers = NULL; } free(sf); } void SplineFontClearSpecial(SplineFont *sf) { int i; if ( sf==NULL ) return; if ( sf->mm!=NULL ) { MMSetClearSpecial(sf->mm); return; } for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { struct splinechar *sc = sf->glyphs[i]; if (sc->glif_name != NULL) { free(sc->glif_name); sc->glif_name = NULL; } } for ( i=0; isubfontcnt; ++i ) SplineFontClearSpecial(sf->subfonts[i]); KernClassListClearSpecialContents(sf->kerns); KernClassListClearSpecialContents(sf->vkerns); if (sf->groups) { GlyphGroupsFree(sf->groups); sf->groups = NULL; } if (sf->groupkerns) { GlyphGroupKernsFree(sf->groupkerns); sf->groupkerns = NULL; } if (sf->groupvkerns) { GlyphGroupKernsFree(sf->groupvkerns); sf->groupvkerns = NULL; } if (sf->python_persistent) { #if defined(_NO_PYTHON) free( sf->python_persistent ); /* It's a string of pickled data which we leave as a string */ #else PyFF_FreeSF(sf); #endif sf->python_persistent = NULL; } if (sf->layers != NULL) { int layer; for (layer = 0; layer < sf->layer_cnt; layer ++) { if (sf->layers[layer].ufo_path != NULL) { free(sf->layers[layer].ufo_path); sf->layers[layer].ufo_path = NULL; } } } } #if 0 // These are in splinefont.h. #define GROUP_NAME_KERNING_UFO 1 #define GROUP_NAME_KERNING_FEATURE 2 #define GROUP_NAME_VERTICAL 4 // Otherwise horizontal. #define GROUP_NAME_RIGHT 8 // Otherwise left (or above). #endif // 0 void GlyphGroupFree(struct ff_glyphclasses* group) { if (group->classname != NULL) free(group->classname); if (group->glyphs != NULL) free(group->glyphs); free(group); } void GlyphGroupsFree(struct ff_glyphclasses* root) { struct ff_glyphclasses* current = root; struct ff_glyphclasses* next; while (current != NULL) { next = current->next; GlyphGroupFree(current); current = next; } } void GlyphGroupKernFree(struct ff_rawoffsets* groupkern) { if (groupkern->left != NULL) free(groupkern->left); if (groupkern->right != NULL) free(groupkern->right); free(groupkern); } void GlyphGroupKernsFree(struct ff_rawoffsets* root) { struct ff_rawoffsets* current = root; struct ff_rawoffsets* next; while (current != NULL) { next = current->next; GlyphGroupKernFree(current); current = next; } } #ifdef FF_UTHASH_GLIF_NAMES int HashKerningClassNamesFlex(SplineFont *sf, struct glif_name_index * class_name_hash, int capitalize) { struct kernclass *current_kernclass; int isv; int isr; int i; int absolute_index = 0; // This gives us a unique index for each kerning class. // First we catch the existing names. absolute_index = 0; for (isv = 0; isv < 2; isv++) for (current_kernclass = (isv ? sf->vkerns : sf->kerns); current_kernclass != NULL; current_kernclass = current_kernclass->next) for (isr = 0; isr < 2; isr++) if ( (isr ? current_kernclass->seconds_names : current_kernclass->firsts_names) != NULL ) { for ( i=0; i < (isr ? current_kernclass->second_cnt : current_kernclass->first_cnt); ++i ) if ( (isr ? current_kernclass->seconds_names[i] : current_kernclass->firsts_names[i]) != NULL ) { // Add it to the hash table with its index. if (capitalize) { char * cap_name = upper_case(isr ? current_kernclass->seconds_names[i] : current_kernclass->firsts_names[i]); glif_name_track_new(class_name_hash, absolute_index + i, cap_name); free(cap_name); cap_name = NULL; } else { glif_name_track_new(class_name_hash, absolute_index + i, (isr ? current_kernclass->seconds_names[i] : current_kernclass->firsts_names[i])); } } absolute_index +=i; } return absolute_index; } int HashKerningClassNames(SplineFont *sf, struct glif_name_index * class_name_hash) { return HashKerningClassNamesFlex(sf, class_name_hash, 0); } int HashKerningClassNamesCaps(SplineFont *sf, struct glif_name_index * class_name_hash) { return HashKerningClassNamesFlex(sf, class_name_hash, 1); } #endif 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); MacNameListFree(mm->axismaps[i].axisnames); } free(mm->axismaps); free(mm->cdv); free(mm->ndv); for ( i=0; inamed_instance_count; ++i ) { free(mm->named_instances[i].coords); MacNameListFree(mm->named_instances[i].names); } free(mm->named_instances); } void MMSetFree(MMSet *mm) { int i; for ( i=0; iinstance_count; ++i ) { mm->instances[i]->mm = NULL; mm->instances[i]->map = NULL; SplineFontFree(mm->instances[i]); } mm->normal->mm = NULL; SplineFontFree(mm->normal); /* EncMap gets freed here */ MMSetFreeContents(mm); chunkfree(mm,sizeof(*mm)); } void MMSetClearSpecial(MMSet *mm) { int i; for ( i=0; iinstance_count; ++i ) { SplineFontClearSpecial(mm->instances[i]); } SplineFontClearSpecial(mm->normal); } SplinePoint *SplineBisect(Spline *spline, extended 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 ) IError("Bisection to create a zero length spline"); #endif xstart.s0 = xsp->d; ystart.s0 = ysp->d; xend.s1 = (extended) xsp->a+xsp->b+xsp->c+xsp->d; yend.s1 = (extended) 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 ); } void GrowBuffer(GrowBuf *gb) { if ( gb->base==NULL ) { gb->base = gb->pt = malloc(200); gb->end = gb->base + 200; } else { int len = (gb->end-gb->base) + 400; int off = gb->pt-gb->base; gb->base = realloc(gb->base,len); gb->end = gb->base + len; gb->pt = gb->base+off; } } dvisvgm-2.8.1/libs/ff-woff/fontforge/splinefont.c0000664000175000017500000003255013510660062016731 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" /* Use URW 4 letter abbreviations */ const char *knownweights[] = { "Demi", "Bold", "Regu", "Medi", "Book", "Thin", "Ligh", "Heav", "Blac", "Ultr", "Nord", "Norm", "Gras", "Stan", "Halb", "Fett", "Mage", "Mitt", "Buch", NULL }; const char *realweights[] = { "Demi", "Bold", "Regular", "Medium", "Book", "Thin", "Light", "Heavy", "Black", "Ultra", "Nord", "Normal", "Gras", "Standard", "Halbfett", "Fett", "Mager", "Mittel", "Buchschrift", NULL}; static const char *modifierlist[] = { "Ital", "Obli", "Kursive", "Cursive", "Slanted", "Expa", "Cond", NULL }; static const char *modifierlistfull[] = { "Italic", "Oblique", "Kursive", "Cursive", "Slanted", "Expanded", "Condensed", NULL }; static const char **mods[] = { knownweights, modifierlist, NULL }; static const char **fullmods[] = { realweights, modifierlistfull, NULL }; const char *_GetModifiers(const char *fontname, const char *familyname, const char *weight) { const char *pt, *fpt; static char space[20]; 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)); } enum flatness { mt_flat, mt_round, mt_pointy, mt_unknown }; static bigreal SPLMaxHeight(SplineSet *spl, enum flatness *isflat) { enum flatness f = mt_unknown; bigreal max = -1.0e23; Spline *s, *first; extended ts[2]; int i; for ( ; spl!=NULL; spl=spl->next ) { first = NULL; for ( s = spl->first->next; s!=first && s!=NULL; s=s->to->next ) { if ( first==NULL ) first = s; if ( s->from->me.y >= max || s->to->me.y >= max || s->from->nextcp.y > max || s->to->prevcp.y > max ) { if ( !s->knownlinear ) { if ( s->from->me.y > max ) { f = mt_round; max = s->from->me.y; } if ( s->to->me.y > max ) { f = mt_round; max = s->to->me.y; } SplineFindExtrema(&s->splines[1],&ts[0],&ts[1]); for ( i=0; i<2; ++i ) if ( ts[i]!=-1 ) { bigreal y = ((s->splines[1].a*ts[i]+s->splines[1].b)*ts[i]+s->splines[1].c)*ts[i]+s->splines[1].d; if ( y>max ) { f = mt_round; max = y; } } } else if ( s->from->me.y == s->to->me.y ) { if ( s->from->me.y >= max ) { max = s->from->me.y; f = mt_flat; } } else { if ( s->from->me.y > max ) { f = mt_pointy; max = s->from->me.y; } if ( s->to->me.y > max ) { f = mt_pointy; max = s->to->me.y; } } } } } *isflat = f; return( max ); } static bigreal SCMaxHeight(SplineChar *sc, int layer, enum flatness *isflat) { /* Find the max height of this layer of the glyph. Also find whether that */ /* max is flat (as in "z", curved as in "o" or pointy as in "A") */ enum flatness f = mt_unknown, curf; bigreal max = -1.0e23, test; RefChar *r; max = SPLMaxHeight(sc->layers[layer].splines,&curf); f = curf; for ( r = sc->layers[layer].refs; r!=NULL; r=r->next ) { test = SPLMaxHeight(r->layers[0].splines,&curf); if ( test>max || (test==max && curf==mt_flat)) { max = test; f = curf; } } *isflat = f; return( max ); } static bigreal SPLMinHeight(SplineSet *spl, enum flatness *isflat) { enum flatness f = mt_unknown; bigreal min = 1.0e23; Spline *s, *first; extended ts[2]; int i; for ( ; spl!=NULL; spl=spl->next ) { first = NULL; for ( s = spl->first->next; s!=first && s!=NULL; s=s->to->next ) { if ( first==NULL ) first = s; if ( s->from->me.y <= min || s->to->me.y <= min || s->from->nextcp.y < min || s->to->prevcp.y < min ) { if ( !s->knownlinear ) { if ( s->from->me.y < min ) { f = mt_round; min = s->from->me.y; } if ( s->to->me.y < min ) { f = mt_round; min = s->to->me.y; } SplineFindExtrema(&s->splines[1],&ts[0],&ts[1]); for ( i=0; i<2; ++i ) if ( ts[i]!=-1 ) { bigreal y = ((s->splines[1].a*ts[i]+s->splines[1].b)*ts[i]+s->splines[1].c)*ts[i]+s->splines[1].d; if ( yfrom->me.y == s->to->me.y ) { if ( s->from->me.y <= min ) { min = s->from->me.y; f = mt_flat; } } else { if ( s->from->me.y < min ) { f = mt_pointy; min = s->from->me.y; } if ( s->to->me.y < min ) { f = mt_pointy; min = s->to->me.y; } } } } } *isflat = f; return( min ); } static bigreal SCMinHeight(SplineChar *sc, int layer, enum flatness *isflat) { /* Find the min height of this layer of the glyph. Also find whether that */ /* min is flat (as in "z", curved as in "o" or pointy as in "A") */ enum flatness f = mt_unknown, curf; bigreal min = 1.0e23, test; RefChar *r; min = SPLMinHeight(sc->layers[layer].splines,&curf); f = curf; for ( r = sc->layers[layer].refs; r!=NULL; r=r->next ) { test = SPLMinHeight(r->layers[0].splines,&curf); if ( test1 ) { cnt = 0; for ( i=0; icnt ) cnt = flats[i].cnt; } test = 0; tot = 0; /* find the mode. If multiple values have the same high count, average them */ for ( i=0; iprivate!=NULL && (blues = PSDictHasEntry(sf->private,do_max ? "BlueValues" : "OtherBlues"))!=NULL ) { while ( *blues==' ' || *blues=='[' ) ++blues; /* Must get at least this close, else we'll just use what we found */ bestheight = result; bestdiff = (sf->ascent+sf->descent)/100.0; useit = true; while ( *blues!='\0' && *blues!=']' ) { val = strtod(blues,&end); if ( blues==end ) break; blues = end; while ( *blues==' ' ) ++blues; if ( useit ) { if ( (diff = val-result)<0 ) diff = -diff; if ( diffascent)/10; return( result ); } bigreal SFXHeight(SplineFont *sf, int layer, int return_error) { bigreal result = SFStandardHeight(sf,layer,true,xheight_str); if ( result==-1e23 && !return_error ) result = (6*sf->ascent)/10; return( result ); } void SPLFirstVisitSplines( SplinePoint* splfirst, SPLFirstVisitSplinesVisitor f, void* udata ) { Spline *spline=0; Spline *first=0; Spline *next=0; if ( splfirst!=NULL ) { first = NULL; for ( spline = splfirst->next; spline!=NULL && spline!=first; spline = next ) { next = spline->to->next; // callback f( splfirst, spline, udata ); if ( first==NULL ) { first = spline; } } } } typedef struct SPLFirstVisitorFoundSoughtXYDataS { int use_x; int use_y; real x; real y; // outputs int found; Spline* spline; SplinePoint* sp; } SPLFirstVisitorFoundSoughtXYData; static void SPLFirstVisitorFoundSoughtXY(SplinePoint* splfirst, Spline* spline, void* udata ) { SPLFirstVisitorFoundSoughtXYData* d = (SPLFirstVisitorFoundSoughtXYData*)udata; int found = 0; if( d->found ) return; // printf("SPLFirstVisitorFoundSoughtXY() %f %f %f\n", d->x, spline->from->me.x, spline->to->me.x ); if( d->use_x ) { if( spline->from->me.x == d->x ) { found = 1; d->spline = spline; d->sp = spline->from; } if( spline->to->me.x == d->x ) { found = 1; d->spline = spline; d->sp = spline->to; } } if( d->use_x && found && d->use_y ) { if( d->sp->me.y != d->y ) { found = 0; } } else if( d->use_y ) { if( spline->from->me.y == d->y ) { found = 1; d->spline = spline; d->sp = spline->from; } if( spline->to->me.y == d->y ) { found = 1; d->spline = spline; d->sp = spline->to; } } if( found ) { d->found = found; d->spline = spline; } else { d->sp = 0; } } SplinePoint* SplinePointListContainsPointAtX( SplinePointList* container, real x ) { SplinePointList *spl; for ( spl = container; spl!=NULL; spl = spl->next ) { SPLFirstVisitorFoundSoughtXYData d; d.use_x = 1; d.use_y = 0; d.x = x; d.y = 0; d.found = 0; SPLFirstVisitSplines( spl->first, SPLFirstVisitorFoundSoughtXY, &d ); if( d.found ) return d.sp; } return 0; } dvisvgm-2.8.1/libs/ff-woff/fontforge/mathconstants.c0000664000175000017500000001264313510660062017437 00000000000000/* Copyright (C) 2007-2012 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 "fontforgevw.h" #ifdef __need_size_t /* This is a bug on the mac, someone defines this and leaves it defined */ /* that means when I load stddef.h it only defines size_t and doesn't */ /* do offset_of, which is what I need */ # undef __need_size_t #endif #define MCD(name) { #name, offsetof(struct MATH,name), -1 } #define MCDD(name,devtab_name) { #name, offsetof(struct MATH,name), offsetof(struct MATH,devtab_name) } struct math_constants_descriptor math_constants_descriptor[] = { MCD(ScriptPercentScaleDown), MCD(ScriptScriptPercentScaleDown), MCD(DelimitedSubFormulaMinHeight), MCD(DisplayOperatorMinHeight), MCDD(MathLeading,MathLeading_adjust), MCDD(AxisHeight,AxisHeight_adjust), MCDD(AccentBaseHeight,AccentBaseHeight_adjust), MCDD(FlattenedAccentBaseHeight,FlattenedAccentBaseHeight_adjust), MCDD(SubscriptShiftDown,SubscriptShiftDown_adjust), MCDD(SubscriptTopMax,SubscriptTopMax_adjust), MCDD(SubscriptBaselineDropMin,SubscriptBaselineDropMin_adjust), MCDD(SuperscriptShiftUp,SuperscriptShiftUp_adjust), MCDD(SuperscriptShiftUpCramped,SuperscriptShiftUpCramped_adjust), MCDD(SuperscriptBottomMin,SuperscriptBottomMin_adjust), MCDD(SuperscriptBaselineDropMax,SuperscriptBaselineDropMax_adjust), MCDD(SubSuperscriptGapMin,SubSuperscriptGapMin_adjust), MCDD(SuperscriptBottomMaxWithSubscript,SuperscriptBottomMaxWithSubscript_adjust), MCDD(SpaceAfterScript,SpaceAfterScript_adjust), MCDD(UpperLimitGapMin,UpperLimitGapMin_adjust), MCDD(UpperLimitBaselineRiseMin,UpperLimitBaselineRiseMin_adjust), MCDD(LowerLimitGapMin,LowerLimitGapMin_adjust), MCDD(LowerLimitBaselineDropMin,LowerLimitBaselineDropMin_adjust), MCDD(StackTopShiftUp,StackTopShiftUp_adjust), MCDD(StackTopDisplayStyleShiftUp,StackTopDisplayStyleShiftUp_adjust), MCDD(StackBottomShiftDown,StackBottomShiftDown_adjust), MCDD(StackBottomDisplayStyleShiftDown,StackBottomDisplayStyleShiftDown_adjust), MCDD(StackGapMin,StackGapMin_adjust), MCDD(StackDisplayStyleGapMin,StackDisplayStyleGapMin_adjust), MCDD(StretchStackTopShiftUp,StretchStackTopShiftUp_adjust), MCDD(StretchStackBottomShiftDown,StretchStackBottomShiftDown_adjust), MCDD(StretchStackGapAboveMin,StretchStackGapAboveMin_adjust), MCDD(StretchStackGapBelowMin,StretchStackGapBelowMin_adjust), MCDD(FractionNumeratorShiftUp,FractionNumeratorShiftUp_adjust), MCDD(FractionNumeratorDisplayStyleShiftUp,FractionNumeratorDisplayStyleShiftUp_adjust), MCDD(FractionDenominatorShiftDown,FractionDenominatorShiftDown_adjust), MCDD(FractionDenominatorDisplayStyleShiftDown,FractionDenominatorDisplayStyleShiftDown_adjust), MCDD(FractionNumeratorGapMin,FractionNumeratorGapMin_adjust), MCDD(FractionNumeratorDisplayStyleGapMin,FractionNumeratorDisplayStyleGapMin_adjust), MCDD(FractionRuleThickness,FractionRuleThickness_adjust), MCDD(FractionDenominatorGapMin,FractionDenominatorGapMin_adjust), MCDD(FractionDenominatorDisplayStyleGapMin,FractionDenominatorDisplayStyleGapMin_adjust), MCDD(SkewedFractionHorizontalGap,SkewedFractionHorizontalGap_adjust), MCDD(SkewedFractionVerticalGap,SkewedFractionVerticalGap_adjust), MCDD(OverbarVerticalGap,OverbarVerticalGap_adjust), MCDD(OverbarRuleThickness,OverbarRuleThickness_adjust), MCDD(OverbarExtraAscender,OverbarExtraAscender_adjust), MCDD(UnderbarVerticalGap,UnderbarVerticalGap_adjust), MCDD(UnderbarRuleThickness,UnderbarRuleThickness_adjust), MCDD(UnderbarExtraDescender,UnderbarExtraDescender_adjust), MCDD(RadicalVerticalGap,RadicalVerticalGap_adjust), MCDD(RadicalDisplayStyleVerticalGap,RadicalDisplayStyleVerticalGap_adjust), MCDD(RadicalRuleThickness,RadicalRuleThickness_adjust), MCDD(RadicalExtraAscender,RadicalExtraAscender_adjust), MCDD(RadicalKernBeforeDegree,RadicalKernBeforeDegree_adjust), MCDD(RadicalKernAfterDegree,RadicalKernAfterDegree_adjust), MCD(RadicalDegreeBottomRaisePercent), MCD(MinConnectorOverlap), MATH_CONSTANTS_DESCRIPTOR_EMPTY }; dvisvgm-2.8.1/libs/ff-woff/fontforge/alphabet.c0000664000175000017500000056063013510660062016335 00000000000000#include const unsigned char c_allzeros[256] = { 0 }; const unichar_t unicode_from_i8859_1[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 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 const unsigned char i8859_1_from_unicode_0[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; static const unsigned char * const i8859_1_from_unicode_[] = { i8859_1_from_unicode_0 }; struct charmap i8859_1_from_unicode = { 0, 0, (unsigned char **) i8859_1_from_unicode_, (unichar_t *) unicode_from_i8859_1 }; const unichar_t unicode_from_i8859_2[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 }; static const unsigned char i8859_2_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00 }; static const unsigned char i8859_2_from_unicode_1[] = { 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, 0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, 0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_2_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_2_from_unicode_[] = { i8859_2_from_unicode_0, i8859_2_from_unicode_1, i8859_2_from_unicode_2 }; struct charmap i8859_2_from_unicode = { 0, 2, (unsigned char **) i8859_2_from_unicode_, (unichar_t *) unicode_from_i8859_2 }; const unichar_t unicode_from_i8859_3[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9 }; static const unsigned char i8859_3_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00 }; static const unsigned char i8859_3_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, 0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_3_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_3_from_unicode_[] = { i8859_3_from_unicode_0, i8859_3_from_unicode_1, i8859_3_from_unicode_2 }; struct charmap i8859_3_from_unicode = { 0, 2, (unsigned char **) i8859_3_from_unicode_, (unichar_t *) unicode_from_i8859_3 }; const unichar_t unicode_from_i8859_4[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9 }; static const unsigned char i8859_4_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00 }; static const unsigned char i8859_4_from_unicode_1[] = { 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, 0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, 0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, 0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_4_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_4_from_unicode_[] = { i8859_4_from_unicode_0, i8859_4_from_unicode_1, i8859_4_from_unicode_2 }; struct charmap i8859_4_from_unicode = { 0, 2, (unsigned char **) i8859_4_from_unicode_, (unichar_t *) unicode_from_i8859_4 }; const unichar_t unicode_from_i8859_5[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, 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, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f }; static const unsigned char i8859_5_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_5_from_unicode_4[] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_5_from_unicode_21[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_5_from_unicode_[] = { i8859_5_from_unicode_0, c_allzeros, c_allzeros, c_allzeros, i8859_5_from_unicode_4, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_5_from_unicode_21 }; struct charmap i8859_5_from_unicode = { 0, 33, (unsigned char **) i8859_5_from_unicode_, (unichar_t *) unicode_from_i8859_5 }; const unichar_t unicode_from_i8859_6[] = { 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, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, 0x0000, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; static const unsigned char i8859_6_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_6_from_unicode_6[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_6_from_unicode_[] = { i8859_6_from_unicode_0, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_6_from_unicode_6 }; struct charmap i8859_6_from_unicode = { 0, 6, (unsigned char **) i8859_6_from_unicode_, (unichar_t *) unicode_from_i8859_6 }; const unichar_t unicode_from_i8859_7[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x02bd, 0x02bc, 0x00a3, 0x0000, 0x0000, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x0000, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000 }; static const unsigned char i8859_7_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_7_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_7_from_unicode_3[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_7_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_7_from_unicode_[] = { i8859_7_from_unicode_0, c_allzeros, i8859_7_from_unicode_2, i8859_7_from_unicode_3, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_7_from_unicode_20 }; struct charmap i8859_7_from_unicode = { 0, 32, (unsigned char **) i8859_7_from_unicode_, (unichar_t *) unicode_from_i8859_7 }; const unichar_t unicode_from_i8859_8[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x203e, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; static const unsigned char i8859_8_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_8_from_unicode_5[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_8_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_8_from_unicode_[] = { i8859_8_from_unicode_0, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_8_from_unicode_5, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_8_from_unicode_20 }; struct charmap i8859_8_from_unicode = { 0, 32, (unsigned char **) i8859_8_from_unicode_, (unichar_t *) unicode_from_i8859_8 }; const unichar_t unicode_from_i8859_9[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 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, 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff }; static const unsigned char i8859_9_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff }; static const unsigned char i8859_9_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_9_from_unicode_[] = { i8859_9_from_unicode_0, i8859_9_from_unicode_1 }; struct charmap i8859_9_from_unicode = { 0, 1, (unsigned char **) i8859_9_from_unicode_, (unichar_t *) unicode_from_i8859_9 }; const unichar_t unicode_from_i8859_10[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x0000, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x00af, 0x016b, 0x014b, 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0112, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0113, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138 }; static const unsigned char i8859_10_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xbd, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, 0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, 0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00 }; static const unsigned char i8859_10_from_unicode_1[] = { 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, 0xa9, 0xb9, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, 0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, 0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, 0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_10_from_unicode_[] = { i8859_10_from_unicode_0, i8859_10_from_unicode_1 }; struct charmap i8859_10_from_unicode = { 0, 1, (unsigned char **) i8859_10_from_unicode_, (unichar_t *) unicode_from_i8859_10 }; const unichar_t unicode_from_i8859_11[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 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, 0x0000, 0x0020, 0x0000, 0x0000, 0x0e3f, 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000 }; static const unsigned char i8859_11_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_11_from_unicode_e[] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_11_from_unicode_[] = { i8859_11_from_unicode_0, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_11_from_unicode_e }; struct charmap i8859_11_from_unicode = { 0, 14, (unsigned char **) i8859_11_from_unicode_, (unichar_t *) unicode_from_i8859_11 }; const unichar_t unicode_from_i8859_13[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0157, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0000, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x00da, 0x00db, 0x00dc, 0x017b, 0x017d, 0x00df, 0x0105, 0x012e, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x00fa, 0x00fb, 0x00fc, 0x017c, 0x017e, 0x2019 }; static const unsigned char i8859_13_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, 0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, 0xa8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, 0xb8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00 }; static const unsigned char i8859_13_from_unicode_1[] = { 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_13_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_13_from_unicode_[] = { i8859_13_from_unicode_0, i8859_13_from_unicode_1, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_13_from_unicode_20 }; struct charmap i8859_13_from_unicode = { 0, 32, (unsigned char **) i8859_13_from_unicode_, (unichar_t *) unicode_from_i8859_13 }; const unichar_t unicode_from_i8859_14[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff }; static const unsigned char i8859_14_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff }; static const unsigned char i8859_14_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_14_from_unicode_1e[] = { 0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_14_from_unicode_[] = { i8859_14_from_unicode_0, i8859_14_from_unicode_1, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_14_from_unicode_1e }; struct charmap i8859_14_from_unicode = { 0, 30, (unsigned char **) i8859_14_from_unicode_, (unichar_t *) unicode_from_i8859_14 }; const unichar_t unicode_from_i8859_15[] = { 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, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 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 const unsigned char i8859_15_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, 0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; static const unsigned char i8859_15_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char i8859_15_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const i8859_15_from_unicode_[] = { i8859_15_from_unicode_0, i8859_15_from_unicode_1, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, i8859_15_from_unicode_20 }; struct charmap i8859_15_from_unicode = { 0, 32, (unsigned char **) i8859_15_from_unicode_, (unichar_t *) unicode_from_i8859_15 }; const unichar_t unicode_from_koi8_r[] = { 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, 0x0000, 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a }; static const unsigned char koi8_r_from_unicode_0[] = { 0x7f, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char koi8_r_from_unicode_4[] = { 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char koi8_r_from_unicode_22[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char koi8_r_from_unicode_23[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char koi8_r_from_unicode_25[] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const koi8_r_from_unicode_[] = { koi8_r_from_unicode_0, c_allzeros, c_allzeros, c_allzeros, koi8_r_from_unicode_4, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, koi8_r_from_unicode_22, koi8_r_from_unicode_23, c_allzeros, koi8_r_from_unicode_25 }; struct charmap koi8_r_from_unicode = { 0, 37, (unsigned char **) koi8_r_from_unicode_, (unichar_t *) unicode_from_koi8_r }; const unichar_t unicode_from_jis201[] = { 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, 0x00a5, 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, 0x203e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x0000, 0xff61, 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, 0xff68, 0xff69, 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, 0xff70, 0xff71, 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, 0xff78, 0xff79, 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, 0xff80, 0xff81, 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, 0xff88, 0xff89, 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, 0xff90, 0xff91, 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, 0xff98, 0xff99, 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; static const unsigned char jis201_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x00, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char jis201_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char jis201_from_unicode_ff[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const jis201_from_unicode_[] = { jis201_from_unicode_0, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, jis201_from_unicode_20, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, jis201_from_unicode_ff }; struct charmap jis201_from_unicode = { 0, 255, (unsigned char **) jis201_from_unicode_, (unichar_t *) unicode_from_jis201 }; const unichar_t unicode_from_win[] = { 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, 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178, 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 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 const unsigned char win_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }; static const unsigned char win_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char win_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char win_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char win_from_unicode_21[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const win_from_unicode_[] = { win_from_unicode_0, win_from_unicode_1, win_from_unicode_2, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, win_from_unicode_20, win_from_unicode_21 }; struct charmap win_from_unicode = { 0, 33, (unsigned char **) win_from_unicode_, (unichar_t *) unicode_from_win }; const unichar_t unicode_from_mac[] = { 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 const unsigned char mac_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0xc1, 0xa2, 0xa3, 0x00, 0xb4, 0x00, 0xa4, 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0x00, 0xa8, 0xf8, 0xa1, 0xb1, 0x00, 0x00, 0xab, 0xb5, 0xa6, 0xe1, 0xfc, 0x00, 0xbc, 0xc8, 0x00, 0x00, 0x00, 0xc0, 0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, 0x00, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0x00, 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0x00, 0x00, 0xa7, 0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, 0x00, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0x00, 0x00, 0xd8 }; static const unsigned char mac_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xfa, 0xfb, 0xfe, 0xf7, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_3[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xe2, 0x00, 0xd2, 0xd3, 0xe3, 0x00, 0xa0, 0xe0, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_21[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_22[] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_25[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char mac_from_unicode_f8[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0 }; static const unsigned char mac_from_unicode_fb[] = { 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const mac_from_unicode_[] = { mac_from_unicode_0, mac_from_unicode_1, mac_from_unicode_2, mac_from_unicode_3, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, mac_from_unicode_20, mac_from_unicode_21, mac_from_unicode_22, c_allzeros, c_allzeros, mac_from_unicode_25, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, mac_from_unicode_f8, c_allzeros, c_allzeros, mac_from_unicode_fb }; struct charmap mac_from_unicode = { 0, 251, (unsigned char **) mac_from_unicode_, (unichar_t *) unicode_from_mac }; const unichar_t unicode_from_MacSymbol[] = { 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, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220d, 0x0028, 0x0029, 0x2217, 0x002b, 0x002c, 0x2212, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x2245, 0x0391, 0x0392, 0x03a7, 0x0394, 0x0395, 0x03a6, 0x0393, 0x0397, 0x0399, 0x03d1, 0x039a, 0x039b, 0x039c, 0x039d, 0x039f, 0x03a0, 0x0398, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03c2, 0x03a9, 0x039e, 0x03a8, 0x0396, 0x005b, 0x2234, 0x005d, 0x22a5, 0x005f, 0xf8e5, 0x03b1, 0x03b2, 0x03c7, 0x03b4, 0x03b5, 0x03c6, 0x03b3, 0x03b7, 0x03b9, 0x03d5, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf, 0x03c0, 0x03b8, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03d6, 0x03c9, 0x03be, 0x03c8, 0x03b6, 0x007b, 0x007c, 0x007d, 0x223c, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x0000, 0x03d2, 0x2032, 0x2264, 0x2044, 0x221e, 0x0192, 0x2663, 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193, 0x00b0, 0x00b1, 0x2033, 0x2265, 0x00d7, 0x221d, 0x2202, 0x2022, 0x00f7, 0x2260, 0x2261, 0x2248, 0x2026, 0xf8e6, 0xf8e7, 0x21b5, 0x2135, 0x2111, 0x211c, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229, 0x222a, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209, 0x2220, 0x2207, 0x00ae, 0x00a9, 0x2122, 0x220f, 0x221a, 0x22c5, 0x00ac, 0x2227, 0x2228, 0x21d4, 0x21d0, 0x21d1, 0x21d2, 0x21d3, 0x22c4, 0x2329, 0xf8e8, 0xf8e9, 0xf8ea, 0x2211, 0xf8eb, 0xf8ec, 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0, 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4, 0xf8ff, 0x232a, 0x222b, 0x2320, 0xf8f5, 0x2321, 0xf8f6, 0xf8f7, 0xf8f8, 0xf8f9, 0xf8fa, 0xf8fb, 0xf8fc, 0xf8fd, 0xf8fe, 0x02c7 }; static const unsigned char MacSymbol_from_unicode_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x00, 0x23, 0x00, 0x25, 0x26, 0x00, 0x28, 0x29, 0x00, 0x2b, 0x2c, 0x00, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x5d, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x7c, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0xd8, 0x00, 0xd2, 0x00, 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_1[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_3[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x47, 0x44, 0x45, 0x5a, 0x48, 0x51, 0x49, 0x4b, 0x4c, 0x4d, 0x4e, 0x58, 0x4f, 0x50, 0x52, 0x00, 0x53, 0x54, 0x55, 0x46, 0x43, 0x59, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x62, 0x67, 0x64, 0x65, 0x7a, 0x68, 0x71, 0x69, 0x6b, 0x6c, 0x6d, 0x6e, 0x78, 0x6f, 0x70, 0x72, 0x56, 0x73, 0x74, 0x75, 0x66, 0x63, 0x79, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0xa1, 0x00, 0x00, 0x6a, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_20[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_21[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xad, 0xae, 0xaf, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xdd, 0xde, 0xdf, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_22[] = { 0x22, 0x00, 0xb6, 0x24, 0x00, 0xc6, 0x00, 0xd1, 0xce, 0xcf, 0x00, 0x00, 0x00, 0x27, 0x00, 0xd5, 0x00, 0xe5, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xb5, 0xa5, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xda, 0xc7, 0xc8, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xba, 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xc9, 0xcb, 0x00, 0xcd, 0xca, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_23[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_26[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0xa7, 0x00, 0xa9, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char MacSymbol_from_unicode_f8[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xbd, 0xbe, 0xe2, 0xe3, 0xe4, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf4, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xf0 }; static const unsigned char * const MacSymbol_from_unicode_[] = { MacSymbol_from_unicode_0, MacSymbol_from_unicode_1, MacSymbol_from_unicode_2, MacSymbol_from_unicode_3, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, MacSymbol_from_unicode_20, MacSymbol_from_unicode_21, MacSymbol_from_unicode_22, MacSymbol_from_unicode_23, c_allzeros, c_allzeros, MacSymbol_from_unicode_26, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, c_allzeros, MacSymbol_from_unicode_f8 }; struct charmap MacSymbol_from_unicode = { 0, 248, (unsigned char **) MacSymbol_from_unicode_, (unichar_t *) unicode_from_MacSymbol }; const unichar_t unicode_from_ZapfDingbats[] = { 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, 0x2701, 0x2702, 0x2703, 0x2704, 0x260e, 0x2706, 0x2707, 0x2708, 0x2709, 0x261b, 0x261e, 0x270c, 0x270d, 0x270e, 0x270f, 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, 0x2718, 0x2719, 0x271a, 0x271b, 0x271c, 0x271d, 0x271e, 0x271f, 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727, 0x2605, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b, 0x25cf, 0x274d, 0x25a0, 0x274f, 0x2750, 0x2751, 0x2752, 0x25b2, 0x25bc, 0x25c6, 0x2756, 0x25d7, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, 0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2777, 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, 0x277e, 0x277f, 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787, 0x2788, 0x2789, 0x278a, 0x278b, 0x278c, 0x278d, 0x278e, 0x278f, 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195, 0x2798, 0x2799, 0x279a, 0x279b, 0x279c, 0x279d, 0x279e, 0x279f, 0x27a0, 0x27a1, 0x27a2, 0x27a3, 0x27a4, 0x27a5, 0x27a6, 0x27a7, 0x27a8, 0x27a9, 0x27aa, 0x27ab, 0x27ac, 0x27ad, 0x27ae, 0x27af, 0x0000, 0x27b1, 0x27b2, 0x27b3, 0x27b4, 0x27b5, 0x27b6, 0x27b7, 0x27b8, 0x27b9, 0x27ba, 0x27bb, 0x27bc, 0x27bd, 0x27be, 0x27bf }; static const unsigned char ZapfDingbats_from_unicode_21[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd5, 0x00, 0xd6, 0xd7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char ZapfDingbats_from_unicode_24[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char ZapfDingbats_from_unicode_25[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char ZapfDingbats_from_unicode_26[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0xa8, 0x00, 0xaa, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char ZapfDingbats_from_unicode_27[] = { 0x00, 0x21, 0x22, 0x23, 0x24, 0x00, 0x26, 0x27, 0x28, 0x29, 0x00, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x00, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x00, 0x6d, 0x00, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x76, 0x00, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0x00, 0x00, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static const unsigned char * const ZapfDingbats_from_unicode_[] = { ZapfDingbats_from_unicode_21, c_allzeros, c_allzeros, ZapfDingbats_from_unicode_24, ZapfDingbats_from_unicode_25, ZapfDingbats_from_unicode_26, ZapfDingbats_from_unicode_27 }; struct charmap ZapfDingbats_from_unicode = { 33, 39, (unsigned char **) ZapfDingbats_from_unicode_, (unichar_t *) unicode_from_ZapfDingbats }; unichar_t *unicode_from_alphabets[]={ (unichar_t *) unicode_from_win, 0,0, (unichar_t *) unicode_from_i8859_1, (unichar_t *) unicode_from_i8859_2, (unichar_t *) unicode_from_i8859_3, (unichar_t *) unicode_from_i8859_4, (unichar_t *) unicode_from_i8859_5, (unichar_t *) unicode_from_i8859_6, (unichar_t *) unicode_from_i8859_7, (unichar_t *) unicode_from_i8859_8, (unichar_t *) unicode_from_i8859_9, (unichar_t *) unicode_from_i8859_10, (unichar_t *) unicode_from_i8859_11, (unichar_t *) unicode_from_i8859_13, (unichar_t *) unicode_from_i8859_14, (unichar_t *) unicode_from_i8859_15, (unichar_t *) unicode_from_koi8_r, (unichar_t *) unicode_from_jis201, (unichar_t *) unicode_from_win, (unichar_t *) unicode_from_mac, (unichar_t *) unicode_from_MacSymbol, (unichar_t *) unicode_from_ZapfDingbats, (unichar_t *) unicode_from_i8859_1, /* Place holder for user-defined map */ 0 }; struct charmap *alphabets_from_unicode[]={ 0,0,0, &i8859_1_from_unicode, &i8859_2_from_unicode, &i8859_3_from_unicode, &i8859_4_from_unicode, &i8859_5_from_unicode, &i8859_6_from_unicode, &i8859_7_from_unicode, &i8859_8_from_unicode, &i8859_9_from_unicode, &i8859_10_from_unicode, &i8859_11_from_unicode, &i8859_13_from_unicode, &i8859_14_from_unicode, &i8859_15_from_unicode, &koi8_r_from_unicode, &jis201_from_unicode, &win_from_unicode, &mac_from_unicode, &MacSymbol_from_unicode, &ZapfDingbats_from_unicode, &i8859_1_from_unicode, /* Place holder for user-defined map*/ 0 }; dvisvgm-2.8.1/libs/ff-woff/fontforge/parsettfatt.c0000664000175000017500000000343313510660062017107 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" int memushort(uint8 *data,int len, int offset) { if ( offset>=0 && offset+1>8); data[offset+1] = val&0xff; } dvisvgm-2.8.1/libs/ff-woff/fontforge/ttfspecial.c0000664000175000017500000017273413510660062016717 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #include /* For COLOR_DEFAULT */ #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 ************************* */ /* ************************************************************************** */ #include "PfEd.h" /* This describes the format of the 'PfEd' table */ /* and its many subtables. */ #define MAX_SUBTABLE_TYPES 20 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, uint32 tag ) { FILE *fcmt; char *pt; char *text = tag==fcmt_TAG ? sf->comments : sf->fontlog; if ( text==NULL || *text=='\0' ) return; pfed->subtabs[pfed->next].tag = tag; pfed->subtabs[pfed->next++].data = fcmt = tmpfile2(); putshort(fcmt,1); /* sub-table version number */ putshort(fcmt,strlen(text)); for ( pt = text; *pt; ++pt ) putc(*pt,fcmt); putshort(fcmt,0); if ( ftell(fcmt)&1 ) putc(0,fcmt); if ( ftell(fcmt)&2 ) putshort(fcmt,0); } static void PfEd_GlyphComments(SplineFont *sf, struct PfEd_subtabs *pfed, struct glyphinfo *gi ) { int i, j, k, any, cnt, last, skipped; uint32 offset; SplineChar *sc, *sc2; FILE *cmnt; any = 0; /* We don't need to check in bygid order. We just want to know existance */ for ( i=0; iglyphcnt; ++i ) { if ( sf->glyphs[i]!=NULL && sf->glyphs[i]->ttf_glyph!=-1 && sf->glyphs[i]->comment!=NULL ) { any = true; break; } } if ( !any ) return; pfed->subtabs[pfed->next].tag = cmnt_TAG; pfed->subtabs[pfed->next++].data = cmnt = tmpfile2(); putshort(cmnt,1); /* sub-table version number */ /* Version 0 used ucs2, version 1 uses utf8 */ offset = 0; for ( j=0; j<4; ++j ) { cnt = 0; for ( i=0; igcnt; ++i ) if ( gi->bygid[i]!=-1 ) { sc=sf->glyphs[gi->bygid[i]]; if ( sc!=NULL && sc->comment!=NULL ) { last = i; skipped = false; for ( k=i+1; kgcnt; ++k ) { if ( gi->bygid[k]!=-1 ) sc2 = sf->glyphs[gi->bygid[k]]; if ( (gi->bygid[k]==-1 || sc2->comment==NULL) && skipped ) break; if ( gi->bygid[k]!=-1 && sc2->comment!=NULL ) { last = k; skipped = false; } else skipped = true; } ++cnt; if ( j==1 ) { putshort(cmnt,i); putshort(cmnt,last); putlong(cmnt,offset); offset += sizeof(uint32)*(last-i+2); } else if ( j==2 ) { for ( ; i<=last; ++i ) { if ( gi->bygid[i]==-1 || (sc=sf->glyphs[gi->bygid[i]])->comment==NULL ) putlong(cmnt,0); else { putlong(cmnt,offset); offset += strlen(sc->comment)+1; } } putlong(cmnt,offset); /* Guard data, to let us calculate the string lengths */ } else if ( j==3 ) { for ( ; i<=last; ++i ) { if ( gi->bygid[i]==-1 || (sc=sf->glyphs[gi->bygid[i]])->comment==NULL ) continue; fputs(sc->comment,cmnt); putc('\0',cmnt); } } i = last; } } if ( j==0 ) { putshort(cmnt,cnt); offset = 2*sizeof(short) + cnt*(2*sizeof(short)+sizeof(uint32)); } } if ( ftell(cmnt) & 1 ) putc('\0',cmnt); if ( ftell(cmnt) & 2 ) putshort(cmnt,0); } static void PfEd_CvtComments(SplineFont *sf, struct PfEd_subtabs *pfed ) { FILE *cvtcmt; int i, offset; if ( sf->cvt_names==NULL ) return; pfed->subtabs[pfed->next].tag = cvtc_TAG; pfed->subtabs[pfed->next++].data = cvtcmt = tmpfile2(); for ( i=0; sf->cvt_names[i]!=END_CVT_NAMES; ++i); putshort(cvtcmt,0); /* sub-table version number */ putshort(cvtcmt,i); offset = 2*2 + i*2; for ( i=0; sf->cvt_names[i]!=END_CVT_NAMES; ++i) { if ( sf->cvt_names[i]==NULL ) putshort(cvtcmt,0); else { putshort(cvtcmt,offset); offset += strlen(sf->cvt_names[i])+1; } } for ( i=0; sf->cvt_names[i]!=END_CVT_NAMES; ++i) { if ( sf->cvt_names[i]!=NULL ) { fputs(sf->cvt_names[i],cvtcmt); putc('\0',cvtcmt); } } if ( ftell(cvtcmt)&1 ) putc(0,cvtcmt); if ( ftell(cvtcmt)&2 ) putshort(cvtcmt,0); } static void PfEd_Colours(SplineFont *sf, struct PfEd_subtabs *pfed, struct glyphinfo *gi ) { int i, j, k, any, cnt, last; SplineChar *sc, *sc2; FILE *colr; any = 0; for ( i=0; iglyphcnt; ++i ) { if ( sf->glyphs[i]!=NULL && sf->glyphs[i]->ttf_glyph!=-1 && sf->glyphs[i]->color!=COLOR_DEFAULT ) { any = true; break; } } if ( !any ) return; pfed->subtabs[pfed->next].tag = colr_TAG; pfed->subtabs[pfed->next++].data = colr = tmpfile2(); putshort(colr,0); /* sub-table version number */ for ( j=0; j<2; ++j ) { cnt = 0; for ( i=0; igcnt; ++i ) if ( gi->bygid[i]!=-1 ) { sc = sf->glyphs[gi->bygid[i]]; if ( sc!=NULL && sc->color!=COLOR_DEFAULT ) { last = i; for ( k=i+1; kgcnt; ++k ) { if ( gi->bygid[k]==-1 ) break; sc2 = sf->glyphs[gi->bygid[k]]; if ( sc2->color != sc->color ) break; last = k; } ++cnt; if ( j==1 ) { putshort(colr,i); putshort(colr,last); putlong(colr,sc->color); } i = last; } } if ( j==0 ) putshort(colr,cnt); } if ( ftell(colr) & 2 ) putshort(colr,0); } static void PfEd_Lookups(SplineFont *sf, struct PfEd_subtabs *pfed, OTLookup *lookups, uint32 tag) { OTLookup *otl; int lcnt, scnt, ascnt, acnt, s, a; FILE *lkf; struct lookup_subtable *subs; AnchorClass *ac; int sub_info, ac_info, name_info; if ( lookups==NULL ) return; for ( otl=lookups, lcnt=scnt=acnt=ascnt=0; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { ++lcnt; for ( subs = otl->subtables; subs!=NULL; subs=subs->next ) if ( !subs->unused ) { ++scnt; if ( subs->anchor_classes ) { ++ascnt; for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) if ( ac->subtable==subs && ac->has_base && ac->has_mark ) ++acnt; } } } pfed->subtabs[pfed->next].tag = tag; pfed->subtabs[pfed->next++].data = lkf = tmpfile2(); putshort(lkf,0); /* Subtable version */ putshort(lkf,lcnt); sub_info = 4 + 4*lcnt; ac_info = sub_info + 2*lcnt + 4*scnt; name_info = ac_info + 2*ascnt + 2*acnt; for ( otl=lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { putshort(lkf,name_info); name_info += strlen(otl->lookup_name)+1; putshort(lkf,sub_info); for ( subs = otl->subtables, s=0; subs!=NULL; subs=subs->next ) if ( !subs->unused ) ++s; sub_info += 2 + 4*s; } if ( sub_info!=ac_info ) IError("Lookup name data didn't behave as expected"); for ( otl=lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { for ( subs = otl->subtables, s=0; subs!=NULL; subs=subs->next ) if ( !subs->unused ) ++s; putshort(lkf,s); /* Subtable count */ for ( subs = otl->subtables, s=0; subs!=NULL; subs=subs->next ) if ( !subs->unused ) { putshort(lkf,name_info); name_info += strlen(subs->subtable_name)+1; if ( subs->anchor_classes ) { putshort(lkf,ac_info); for ( ac=sf->anchor, a=0; ac!=NULL; ac=ac->next ) if ( ac->subtable==subs && ac->has_base && ac->has_mark ) ++a; ac_info += 2 + 2*a; } else putshort(lkf,0); } } for ( otl=lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { for ( subs = otl->subtables, s=0; subs!=NULL; subs=subs->next ) if ( !subs->unused ) { if ( subs->anchor_classes ) { for ( ac=sf->anchor, a=0; ac!=NULL; ac=ac->next ) if ( ac->subtable==subs && ac->has_base && ac->has_mark ) ++a; putshort(lkf,a); for ( ac=sf->anchor, a=0; ac!=NULL; ac=ac->next ) if ( ac->subtable==subs && ac->has_base && ac->has_mark ) { putshort(lkf,name_info); name_info += strlen(ac->name)+1; } } } } for ( otl=lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { fputs(otl->lookup_name,lkf); putc('\0',lkf); } for ( otl=lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { for ( subs = otl->subtables, s=0; subs!=NULL; subs=subs->next ) if ( !subs->unused ) { fputs(subs->subtable_name,lkf); putc('\0',lkf); } } for ( otl=lookups; otl!=NULL; otl=otl->next ) if ( !otl->unused ) { for ( subs = otl->subtables, s=0; subs!=NULL; subs=subs->next ) if ( !subs->unused ) { for ( ac=sf->anchor, a=0; ac!=NULL; ac=ac->next ) if ( ac->subtable==subs && ac->has_base && ac->has_mark ) { fputs(ac->name,lkf); putc('\0',lkf); } } } if ( ftell(lkf) & 1 ) putc('\0',lkf); if ( ftell(lkf) & 2 ) putshort(lkf,0); } static int pfed_mod_type(float val,int last_mod) { float ival; if ( last_mod==V_F ) return( V_F ); ival = rint(val); if ( ival!=val || ival<-32768 || ival>32767 ) return( V_F ); if ( last_mod==V_S || ival<-128 || ival>127 ) return( V_S ); return( V_B ); } static void pfed_write_data(FILE *ttf, float val, int mod) { if ( mod==V_F ) putlong(ttf,(int) rint(val*256.0f)); else if ( mod==V_S ) putshort(ttf,(int) rint(val)); else putc(((int) rint(val)), ttf); } static void pfed_glyph_layer(FILE *layr,Layer *layer, int do_spiro) { int contour_cnt, image_cnt, ref_cnt, name_off, i,j; SplineSet *ss; SplinePoint *sp; uint32 base; int mod, was_implicit; RefChar *ref; contour_cnt = 0; for ( ss=layer->splines; ss!=NULL; ss=ss->next ) ++contour_cnt; image_cnt = 0; /* I'm not doing images yet (if ever) but I leave space for them */ ref_cnt = 0; for ( ref=layer->refs; ref!=NULL; ref=ref->next ) ++ref_cnt; base = ftell(layr); putshort(layr,contour_cnt); putshort(layr,ref_cnt); putshort(layr,image_cnt); name_off = 2*3 + 4 * contour_cnt + (4*7+2)* ref_cnt; for ( ss=layer->splines; ss!=NULL; ss=ss->next ) { putshort(layr,0); /* fill in later */ if ( ss->contour_name!=NULL ) { putshort(layr,name_off); name_off += strlen(ss->contour_name)+1; } else { putshort(layr,0); } } for ( ref=layer->refs; ref!=NULL; ref=ref->next ) { for ( j=0; j<6; ++j ) putlong(layr, (int) rint(ref->transform[j]*32768)); putshort(layr,ref->sc->ttf_glyph); } for ( ss=layer->splines; ss!=NULL; ss=ss->next ) { if ( ss->contour_name!=NULL ) { fputs(ss->contour_name,layr); putc('\0',layr); } } contour_cnt=0; for ( ss=layer->splines; ss!=NULL; ss=ss->next, ++contour_cnt ) { uint32 pos = ftell(layr); fseek( layr, base + 6 + 4*contour_cnt, SEEK_SET); putshort( layr, pos-base); fseek( layr, pos, SEEK_SET ); if ( !do_spiro ) { sp = ss->first; mod = pfed_mod_type(sp->me.x, pfed_mod_type(sp->me.y,V_B)); putc( (V_MoveTo|mod),layr); pfed_write_data(layr,sp->me.x,mod); pfed_write_data(layr,sp->me.y,mod); was_implicit = false; while ( sp->next!=NULL ) { SplinePoint *nsp = sp->next->to; float offx = nsp->me.x - sp->me.x; float offy = nsp->me.y - sp->me.y; if ( offx==0 && offy==0 ) /* Do Nothing */; else if ( sp->next->knownlinear ) { mod = pfed_mod_type(offx, pfed_mod_type(offy,V_B)); if ( offx==0 ) { putc( (V_VLineTo|mod), layr); pfed_write_data(layr,offy,mod); } else if ( offy==0 ) { putc( (V_HLineTo|mod), layr); pfed_write_data(layr,offx,mod); } else { putc( (V_LineTo|mod), layr); pfed_write_data(layr,offx,mod); pfed_write_data(layr,offy,mod); } } else if ( sp->next->order2 ) { float offx1, offx2, offy1, offy2; BasePoint *base = was_implicit ? &sp->prevcp : &sp->me; offx1 = sp->nextcp.x - base->x; offy1 = sp->nextcp.y - base->y; mod = pfed_mod_type(offx1, pfed_mod_type(offy1,V_B)); if ( SPInterpolate(nsp) && nsp!=ss->first ) { was_implicit = true; if ( offx1==0 ) { putc( (V_QVImplicit|mod), layr); pfed_write_data(layr,offy1,mod); } else if ( offy1==0 ) { putc( (V_QHImplicit|mod), layr); pfed_write_data(layr,offx1,mod); } else { putc( (V_QImplicit|mod), layr); pfed_write_data(layr,offx1,mod); pfed_write_data(layr,offy1,mod); } } else { offx2 = nsp->me.x - sp->nextcp.x; offy2 = nsp->me.y - sp->nextcp.y; mod = pfed_mod_type(offx2, pfed_mod_type(offy2,mod)); was_implicit = false; putc( (V_QCurveTo|mod), layr); pfed_write_data(layr,offx1,mod); pfed_write_data(layr,offy1,mod); pfed_write_data(layr,offx2,mod); pfed_write_data(layr,offy2,mod); } } else { float offx1 = sp->nextcp.x - sp->me.x; float offy1 = sp->nextcp.y - sp->me.y; float offx2 = nsp->prevcp.x - sp->nextcp.x; float offy2 = nsp->prevcp.y - sp->nextcp.y; float offx3 = nsp->me.x - nsp->prevcp.x; float offy3 = nsp->me.y - nsp->prevcp.y; mod = pfed_mod_type(offx1, pfed_mod_type(offy1,V_B)); mod = pfed_mod_type(offx2, pfed_mod_type(offy2,mod)); mod = pfed_mod_type(offx3, pfed_mod_type(offy3,mod)); if ( offx1==0 && offy3==0 ) { putc((V_VHCurveTo|mod),layr); pfed_write_data(layr,offy1,mod); pfed_write_data(layr,offx2,mod); pfed_write_data(layr,offy2,mod); pfed_write_data(layr,offx3,mod); } else if ( offy1==0 && offx3==0 ) { putc((V_HVCurveTo|mod),layr); pfed_write_data(layr,offx1,mod); pfed_write_data(layr,offx2,mod); pfed_write_data(layr,offy2,mod); pfed_write_data(layr,offy3,mod); } else { putc((V_CurveTo|mod),layr); pfed_write_data(layr,offx1,mod); pfed_write_data(layr,offy1,mod); pfed_write_data(layr,offx2,mod); pfed_write_data(layr,offy2,mod); pfed_write_data(layr,offx3,mod); pfed_write_data(layr,offy3,mod); } } if ( nsp == ss->first ) break; if ( nsp->next!=NULL && nsp->next->to==ss->first && nsp->next->knownlinear ) break; sp = nsp; } if ( sp->next==NULL ) putc(V_End,layr); else putc(V_Close,layr); } else if ( ss->spiro_cnt==0 ) putc(SPIRO_CLOSE_CONTOUR,layr); /* Mark for an empty spiro contour */ else { for ( i=0; ispiro_cnt; ++i ) { if ( i==ss->spiro_cnt-1 && ss->first->prev==NULL ) putc(SPIRO_CLOSE_CONTOUR,layr); else if ( i==0 && ss->first->prev==NULL ) /* Open */ putc(SPIRO_OPEN_CONTOUR,layr); else putc(ss->spiros[i].ty&0x7f,layr); putlong(layr,rint(ss->spiros[i].x*256.0)); putlong(layr,rint(ss->spiros[i].y*256.0)); } putc(SPIRO_END,layr); /* Add the z whether open or not. Might as well */ } } } struct pos_name { real pos; char *name; }; static int pfed_guide_real_comp(const void *_r1, const void *_r2) { const struct pos_name *r1 = _r1, *r2 = _r2; if ( r1->pos>r2->pos ) return( 1 ); else if ( r1->pospos ) return( -1 ); else return( 0 ); } static int pfed_guide_sortuniq( struct pos_name *array, int cnt) { int i,j; qsort(array,cnt,sizeof(struct pos_name),pfed_guide_real_comp); for ( i=j=0; i32767 ) /* Out of bounds, ignore it */; else if ( i!=0 && array[i].pos == array[i-1].pos ) /* Duplicate, ignore it */; else array[j++] = array[i]; } return( j ); } static int pfed_guide_dump_pos_name(FILE *guid, struct pos_name *pn, int namestart ) { putshort(guid,(short) rint(pn->pos)); if ( pn->name!=NULL ) { putshort(guid,namestart); namestart += strlen(pn->name)+1; } else { putshort(guid,0); } return( namestart ); } static void PfEd_Guides(SplineFont *sf, struct PfEd_subtabs *pfed ) { int h,v, i; SplineSet *ss; Spline *s, *first; FILE *guid; struct pos_name hs[100], vs[100]; int nameoff, namelen; if ( sf->grid.splines==NULL ) return; h=v=0; for ( ss=sf->grid.splines; ss!=NULL; ss=ss->next ) { first = NULL; for ( s=ss->first->next; s!=NULL && s!=first; s=s->to->next ) { if ( first==NULL ) first = s; if ( s->from->me.x==s->to->me.x ) { if ( s->from->me.y!=s->to->me.y && v<100 ) { vs[v].name = ss->contour_name; vs[v++].pos = s->from->me.x; } } else if ( s->from->me.y==s->to->me.y ) { if ( h<100 ) { hs[h].name = ss->contour_name; hs[h++].pos = s->from->me.y; } } } } v = pfed_guide_sortuniq(vs,v); h = pfed_guide_sortuniq(hs,h); pfed->subtabs[pfed->next].tag = guid_TAG; pfed->subtabs[pfed->next++].data = guid = tmpfile2(); nameoff = 5*2 + (h+v) * 4; namelen = 0; for ( i=0; igrid,false); if ( ftell(guid) & 1 ) putc('\0',guid); if ( ftell(guid) & 2 ) putshort(guid,0); } static int pfed_has_spiros(Layer *layer) { SplineSet *ss; for ( ss=layer->splines; ss!=NULL; ss=ss->next ) { if ( ss->spiro_cnt>1 ) return( true ); } return( false ); } static void PfEd_Layer(SplineFont *sf, struct glyphinfo *gi, int layer, int dospiro, FILE *layr) { int i, j, k, gid, cnt, last, skipped; SplineChar *sc, *sc2; uint32 offset; uint32 *glyph_data_offset_location; for ( i=0; igcnt; ++i ) if ( gi->bygid[i]!=-1 ) if ( (sc=sf->glyphs[gi->bygid[i]])!=NULL ) { sc->ticked = false; if ( (!dospiro && (sc->layers[layer].splines!=NULL || sc->layers[layer].refs!=NULL) ) || (dospiro && pfed_has_spiros(&sc->layers[layer])) ) sc->ticked=true; } offset = ftell(layr); glyph_data_offset_location = calloc(gi->gcnt,sizeof(uint32)); for ( j=0; j<4; ++j ) { cnt = 0; for ( i=0; igcnt; ++i ) if ( (gid=gi->bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) { if ( sc->ticked ) { last = i; skipped = false; for ( k=i+1; kgcnt; ++k ) { sc2 = NULL; if ( gi->bygid[k]!=-1 ) sc2 = sf->glyphs[gi->bygid[k]]; if ( skipped && (sc2==NULL || !sc2->ticked)) break; if ( sc2!=NULL && sc2->ticked ) { last = k; skipped = false; } else skipped = true; } ++cnt; if ( j==1 ) { putshort(layr,i); putshort(layr,last); putlong(layr,offset); offset += sizeof(uint32)*(last-i+1); } else if ( j==2 ) { for ( ; i<=last; ++i ) { if ( gi->bygid[i]==-1 || !sf->glyphs[gi->bygid[i]]->ticked ) putlong(layr,0); else { glyph_data_offset_location[i] = ftell(layr); putlong(layr,0); } } } else if ( j==3 ) { for ( ; i<=last; ++i ) { if ( gi->bygid[i]!=-1 && (sc=sf->glyphs[gi->bygid[i]])->ticked ) { uint32 pos = ftell(layr); fseek(layr,glyph_data_offset_location[i],SEEK_SET); putlong(layr,pos); /* Offset relative to start of subtable==start of file */ fseek(layr,pos,SEEK_SET); pfed_glyph_layer(layr,&sc->layers[layer],dospiro); } } } i = last; } } if ( j==0 ) { offset += sizeof(short) + cnt*(2*sizeof(short)+sizeof(uint32)); putshort(layr,cnt); } } free(glyph_data_offset_location); } static void PfEd_Layers(SplineFont *sf, struct PfEd_subtabs *pfed, struct glyphinfo *gi ) { /* currently we output the following: */ /* The background layer */ /* And the spiro representation of the foreground */ /* if the foreground is cubic and output is quad then the foreground */ /* Any other layers */ /* Check if any of these data exist */ uint8 has_spiro=0; uint8 *otherlayers; int i, name_off, l, cnt, sofar; SplineChar *sc; FILE *layr; otherlayers = calloc(sf->layer_cnt,sizeof(uint8)); /* We don't need to check in bygid order. We just want to know existance */ /* We don't check for refs because a reference to an empty glyph is empty too */ for ( i=0; iglyphcnt; ++i ) { if ( (sc=sf->glyphs[i])!=NULL && sc->ttf_glyph!=-1 ) { if ( pfed_has_spiros(&sc->layers[ly_fore])) has_spiro = true; for ( l=ly_back ; llayer_cnt; ++l ) if ( sc->layers[l].splines!=NULL ) otherlayers[l] = true; } } otherlayers[gi->layer] = (!sf->layers[gi->layer].order2 && gi->is_ttf) || ( sf->layers[gi->layer].order2 && !gi->is_ttf); for ( l=cnt=0; llayer_cnt; ++l ) if ( otherlayers[l] ) ++cnt; cnt += has_spiro; if ( cnt==0 ) { free(otherlayers); return; } pfed->subtabs[pfed->next].tag = layr_TAG; pfed->subtabs[pfed->next++].data = layr = tmpfile2(); putshort(layr,1); /* sub-table version */ putshort(layr,cnt); /* layer count */ name_off = 4 + 8 * cnt; if ( has_spiro ) { putshort(layr,1); /* spiros */ putshort(layr,name_off); name_off += strlen("Spiro")+1; putlong(layr,0); /* Fill in later */ } for ( l=0; llayer_cnt; ++l ) if ( otherlayers[l]) { putshort(layr,(sf->layers[l].order2?2:3) | /* Quadratic/cubic */ (sf->layers[l].background?0:0x100)); /* Fore/Back */ putshort(layr,name_off); if ( l==ly_fore ) name_off += strlen("Old_"); name_off += strlen(sf->layers[l].name)+1; putlong(layr,0); /* Fill in later */ } if ( has_spiro ) { fputs("Spiro",layr); putc('\0',layr); } for ( l=0; llayer_cnt; ++l ) if ( otherlayers[l]) { if ( l==ly_fore ) fputs("Old_",layr); fputs(sf->layers[l].name,layr); putc('\0',layr); } sofar = 0; if ( has_spiro ) { uint32 pos = ftell(layr); fseek(layr, 4 + 0*8 + 4, SEEK_SET); putlong(layr,pos); fseek(layr, 0, SEEK_END); PfEd_Layer(sf, gi, ly_fore, true, layr); ++sofar; } for ( l=0; llayer_cnt; ++l ) if ( otherlayers[l]) { uint32 pos = ftell(layr); fseek(layr, 4 + sofar*8 + 4, SEEK_SET); putlong(layr,pos); fseek(layr, 0, SEEK_END); PfEd_Layer(sf, gi, l, false, layr); ++sofar; } if ( ftell(layr) & 1 ) putc('\0',layr); if ( ftell(layr) & 2 ) putshort(layr,0); free(otherlayers); } 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, fcmt_TAG ); PfEd_FontComment(sf, &pfed, flog_TAG ); PfEd_GlyphComments(sf, &pfed, &at->gi ); PfEd_CvtComments(sf, &pfed ); } if ( at->gi.flags & ttf_flag_pfed_colors ) PfEd_Colours(sf, &pfed, &at->gi ); if ( (at->gi.flags & ttf_flag_pfed_lookupnames) && at->opentypemode ) { PfEd_Lookups(sf, &pfed, sf->gsub_lookups, GSUB_TAG ); PfEd_Lookups(sf, &pfed, sf->gpos_lookups, GPOS_TAG ); } if ( at->gi.flags & ttf_flag_pfed_guides ) PfEd_Guides(sf, &pfed); if ( at->gi.flags & ttf_flag_pfed_layers ) PfEd_Layers(sf, &pfed, &at->gi); if ( pfed.next==0 ) return; /* No subtables */ at->pfed = file = tmpfile2(); 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, uint32 tag) { int len; char *start, *pt, *end; int use_utf8; fseek(ttf,base,SEEK_SET); use_utf8 = getushort(ttf); if ( use_utf8!=0 && use_utf8!=1 ) return; /* Bad version number */ len = getushort(ttf); start = pt = malloc(len+1); end = pt+len; if ( use_utf8 ) { while ( ptfontcomments); free(start); start = pt; } if ( tag==flog_TAG ) info->fontlog = start; else info->fontcomments = start; } static char *pfed_read_utf8(FILE *ttf, uint32 start) { int ch, len; char *str, *pt; fseek( ttf, start, SEEK_SET); len = 0; while ( (ch=getc(ttf))!='\0' && ch!=EOF ) ++len; fseek( ttf, start, SEEK_SET); str = pt = malloc(len+1); while ( (ch=getc(ttf))!='\0' && ch!=EOF ) *pt++ = ch; *pt = '\0'; return( str ); } static char *pfed_read_ucs2_len(FILE *ttf,uint32 offset,int len) { char *pt, *str; uint32 uch, uch2; int i; if ( len<0 ) return( NULL ); len>>=1; if ( (pt=str=malloc(len>0 ? 3*len:1))==NULL ) return( NULL ); fseek(ttf,offset,SEEK_SET); for ( i=0; i=0xd800 && uch<0xdc00 ) { /* Is this a possible utf16 surrogate value? */ uch2 = getushort(ttf); if ( uch2>=0xdc00 && uch2<0xe000 ) uch = ((uch-0xd800)<<10) | (uch2&0x3ff); else { pt = utf8_idpb(pt,uch,0); uch = uch2; } } pt = utf8_idpb(pt,uch,0); } *pt++ = 0; return( realloc(str,pt-str) ); } static char *pfed_read_utf8_len(FILE *ttf,uint32 offset,int len) { char *pt, *str; int i; if ( len<0 ) return( NULL ); pt = str = malloc(len+1); fseek(ttf,offset,SEEK_SET); for ( i=0; icvt_names = malloc((count+1)*sizeof(char *)); for ( i=0; icvt_names[i] = NULL; else info->cvt_names[i] = pfed_read_utf8(ttf,base+offsets[i]); } free(offsets); } static void pfed_readglyphcomments(FILE *ttf,struct ttfinfo *info,uint32 base) { int n, i, j; struct grange { int start, end; uint32 offset; } *grange; uint32 offset, next; int use_utf8; fseek(ttf,base,SEEK_SET); use_utf8 = getushort(ttf); if ( use_utf8!=0 && use_utf8!=1 ) return; /* Bad version number */ n = getushort(ttf); grange = malloc(n*sizeof(struct grange)); for ( i=0; igrange[i].end || grange[i].end>info->glyph_cnt ) { LogError( _("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 = pfed_read_utf8_len(ttf,base+offset,next-offset); else info->chars[j]->comment = pfed_read_ucs2_len(ttf,base+offset,next-offset); if ( info->chars[j]->comment == NULL ) LogError(_("Invalid comment string (negative length?) in 'PfEd' table for glyph %s."), info->chars[j]->name ); } } 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 ) LogError( _("Bad glyph range specified in color subtable of PfEd table\n") ); else { for ( j=start; j<=end; ++j ) info->chars[j]->color = col; } } } static void pfed_readlookupnames(FILE *ttf,struct ttfinfo *info,uint32 base, OTLookup *lookups) { OTLookup *otl; struct lookup_subtable *sub; AnchorClass *ac; int i, j, k, n, s, a; struct lstruct { int name_off, subs_off; } *ls, *ss, *as; fseek(ttf,base,SEEK_SET); if ( getushort(ttf)!=0 ) return; /* Bad version number */ n = getushort(ttf); ls = malloc(n*sizeof(struct lstruct)); for ( i=0; inext ) { if ( ls[i].name_off!=0 ) { free( otl->lookup_name ); otl->lookup_name = pfed_read_utf8(ttf,base+ls[i].name_off); } if ( ls[i].subs_off!=0 ) { fseek(ttf,base+ls[i].subs_off,SEEK_SET); s = getushort(ttf); ss = malloc(s*sizeof(struct lstruct)); for ( j=0; jsubtables; jnext ) { if ( ss[j].name_off!=0 ) { free( sub->subtable_name ); sub->subtable_name = pfed_read_utf8(ttf,base+ss[j].name_off); } if ( ss[j].subs_off!=0 ) { if ( !sub->anchor_classes ) LogError(_("Whoops, attempt to name anchors in a subtable which doesn't contain any\n")); else { fseek(ttf,base+ss[j].subs_off,SEEK_SET); a = getushort(ttf); as = malloc(a*sizeof(struct lstruct)); for ( k=0; kahead; ac!=NULL; ac=ac->next ) { if ( ac->subtable==sub ) { if ( as[k].name_off!=0 ) { free( ac->name ); ac->name = pfed_read_utf8(ttf,base+as[k].name_off); } ++k; } } free(as); } } } /* I guess it's ok for some subtables to be unnamed, so no check for sub!=NULL */ if ( jlookup_name ); free(ss); } } /* I guess it's ok for some lookups to be unnamed, so no check for otf!=NULL */ if ( ifirst = ss->last = SplinePointCreate(0,0); ss->start_offset = 0; return; } offx = pfed_get_coord(ttf,COM_MOD(verb)); offy = pfed_get_coord(ttf,COM_MOD(verb)); ss->first = current = SplinePointCreate(offx,offy); ss->start_offset = 0; for (;;) { verb = getc(ttf); v = COM_VERB(verb); m = COM_MOD(verb); if ( m==3 ) { LogError(_("Bad data modifier in contour command in 'PfEd'\n") ); break; } if ( verb==V_Close || verb==V_End ) break; else if ( v>=V_LineTo && v<=V_VLineTo ) { offx = offy = 0; if ( v==V_LineTo ) { offx = pfed_get_coord(ttf,m); offy = pfed_get_coord(ttf,m); } else if ( v==V_HLineTo ) offx = pfed_get_coord(ttf,m); else if ( v==V_VLineTo ) offy = pfed_get_coord(ttf,m); sp = SplinePointCreate(current->me.x+offx,current->me.y+offy); } else if ( v>=V_QCurveTo && v<=V_QVImplicit ) { int will_be_implicit = true; offx = offy = 0; offx1 = offy1 = 1; /* else implicit points become straight lines too soon */ if ( v==V_QCurveTo ) { offx = pfed_get_coord(ttf,m); offy = pfed_get_coord(ttf,m); offx1 = pfed_get_coord(ttf,m); offy1 = pfed_get_coord(ttf,m); will_be_implicit = false; } else if ( v==V_QImplicit ) { offx = pfed_get_coord(ttf,m); offy = pfed_get_coord(ttf,m); } else if ( v==V_QHImplicit ) { offx = pfed_get_coord(ttf,m); } else if ( v==V_QVImplicit ) { offy = pfed_get_coord(ttf,m); } current->nextcp.x = current->me.x+offx; current->nextcp.y = current->me.y+offy; current->nonextcp = false; sp = SplinePointCreate(current->nextcp.x+offx1,current->nextcp.y+offy1); sp->prevcp = current->nextcp; sp->noprevcp = false; if ( was_implicit ) { current->me.x = (current->prevcp.x + current->nextcp.x)/2; current->me.y = (current->prevcp.y + current->nextcp.y)/2; SplineRefigure(current->prev); } was_implicit = will_be_implicit; } else if ( v>=V_CurveTo && v<=V_HVCurveTo ) { offx=offy=offx2=offy2=0; if ( v==V_CurveTo ) { offx = pfed_get_coord(ttf,m); offy = pfed_get_coord(ttf,m); offx1 = pfed_get_coord(ttf,m); offy1 = pfed_get_coord(ttf,m); offx2 = pfed_get_coord(ttf,m); offy2 = pfed_get_coord(ttf,m); } else if ( v==V_VHCurveTo ) { offy = pfed_get_coord(ttf,m); offx1 = pfed_get_coord(ttf,m); offy1 = pfed_get_coord(ttf,m); offx2 = pfed_get_coord(ttf,m); } else if ( v==V_HVCurveTo ) { offx = pfed_get_coord(ttf,m); offx1 = pfed_get_coord(ttf,m); offy1 = pfed_get_coord(ttf,m); offy2 = pfed_get_coord(ttf,m); } current->nextcp.x = current->me.x+offx; current->nextcp.y = current->me.y+offy; current->nonextcp = false; sp = SplinePointCreate(current->nextcp.x+offx1+offx2,current->nextcp.y+offy1+offy2); sp->prevcp.x = current->nextcp.x+offx1; sp->prevcp.y = current->nextcp.y+offy1; sp->noprevcp = false; } else { LogError(_("Whoops, unexpected verb in contour %d.%d\n"), v, m ); break; } SplineMake(current,sp,type==2); current = sp; } if ( verb==V_Close ) { if ( was_implicit ) { current->me.x = (current->prevcp.x + ss->first->nextcp.x)/2; current->me.y = (current->prevcp.y + ss->first->nextcp.y)/2; } if ( current->me.x==ss->first->me.x && current->me.y==ss->first->me.y ) { current->prev->to = ss->first; ss->first->prev = current->prev; ss->first->prevcp = current->prevcp; ss->first->noprevcp = current->noprevcp; SplinePointFree(current); } else SplineMake(current,ss->first,type==2); ss->last = ss->first; } else { ss->last = current; } SPLCategorizePoints(ss); } static void pfed_read_spiro_contour(FILE *ttf,SplineSet *ss, uint32 base, int type) { int ch; fseek(ttf,base,SEEK_SET); for (; ; ) { ch = getc(ttf); if ( ch!=SPIRO_OPEN_CONTOUR && ch!=SPIRO_CORNER && ch!=SPIRO_G4 && ch!=SPIRO_G2 && ch!=SPIRO_LEFT && ch!=SPIRO_RIGHT && ch!=SPIRO_END && ch!=SPIRO_CLOSE_CONTOUR ) { LogError(_("Whoops, bad spiro command %d\n"), ch); break; } if ( ss->spiro_cnt>=ss->spiro_max ) ss->spiros = realloc(ss->spiros,(ss->spiro_max+=10)*sizeof(spiro_cp)); ss->spiros[ss->spiro_cnt].ty = ch; if ( ch!=SPIRO_END ) { ss->spiros[ss->spiro_cnt].x = getlong(ttf)/256.0; ss->spiros[ss->spiro_cnt].y = getlong(ttf)/256.0; } else { ss->spiros[ss->spiro_cnt].x = 0; ss->spiros[ss->spiro_cnt].y = 0; } ++(ss->spiro_cnt); if ( ch==SPIRO_END || ch=='}' ) break; } if ( ss->spiro_cnt!=0 && ss->spiros[ss->spiro_cnt-1].ty!= SPIRO_END ) { if ( ss->spiros[ss->spiro_cnt-1].ty==SPIRO_CLOSE_CONTOUR ) ss->spiros[ss->spiro_cnt-1].ty = SPIRO_G4; if ( ss->spiro_cnt>=ss->spiro_max ) ss->spiros = realloc(ss->spiros,(ss->spiro_max+=2)*sizeof(spiro_cp)); ss->spiros[ss->spiro_cnt].ty = SPIRO_END; ss->spiros[ss->spiro_cnt].x = 0; ss->spiros[ss->spiro_cnt].y = 0; } } static void pfed_read_glyph_layer(FILE *ttf,struct ttfinfo *info,Layer *ly, uint32 base, int type, int version) { int cc, rc, i, j; SplineSet *ss; struct contours { int data_off, name_off; SplineSet *ss; } *contours; int gid; RefChar *last, *cur; fseek(ttf,base,SEEK_SET); cc = getushort(ttf); /* Contours */ rc = 0; if ( version==1 ) rc = getushort(ttf); /* References */ contours = malloc(cc*sizeof(struct contours)); for ( i=0; itransform[j] = getlong(ttf)/32768.0; gid = getushort(ttf); if ( gid>=info->glyph_cnt ) { LogError(_("Bad glyph reference in layer info.\n")); break; } cur->sc = info->chars[gid]; cur->orig_pos = gid; cur->unicode_enc = cur->sc->unicodeenc; if ( last==NULL ) ly->refs = cur; else last->next = cur; last = cur; } ss = ly->splines; /* Only relevant for spiros where they live in someone else's layer */ for ( i=0; isplines = contours[i].ss; else contours[i-1].ss->next = contours[i].ss; if ( contours[i].name_off!=0 ) contours[i].ss->contour_name = pfed_read_utf8(ttf,base+contours[i].name_off); pfed_read_normal_contour(ttf,contours[i].ss,base+contours[i].data_off,type); } else { /* Spiros are actually bound to an already existing layer and don't have an independent existance yet */ contours[i].ss = ss; if ( ss!=NULL ) { pfed_read_spiro_contour(ttf,ss,base+contours[i].data_off,type); ss = ss->next; } else LogError(_("Whoops, Ran out of spiros\n")); } } free(contours); } static void pfed_readguidelines(FILE *ttf,struct ttfinfo *info,uint32 base) { int i,v,h,off; int version; SplinePoint *sp, *nsp; SplineSet *ss; fseek(ttf,base,SEEK_SET); version = getushort(ttf); if ( version>1 ) return; /* Bad version number */ v = getushort(ttf); h = getushort(ttf); (void) getushort(ttf); off = getushort(ttf); if ( off!=0 ) { pfed_read_glyph_layer(ttf,info,&info->guidelines,base+off,info->to_order2?2:3,version); } else { struct npos { int pos; int offset; } *vs, *hs; vs = malloc(v*sizeof(struct npos)); hs = malloc(h*sizeof(struct npos)); for ( i=0; iemsize); nsp = SplinePointCreate(vs[i].pos,2*info->emsize); SplineMake(sp,nsp,info->to_order2); ss = chunkalloc(sizeof(SplineSet)); ss->first = sp; ss->last = nsp; if ( vs[i].offset!=0 ) ss->contour_name = pfed_read_utf8(ttf,base+vs[i].offset); ss->next = info->guidelines.splines; info->guidelines.splines = ss; } for ( i=0; iemsize,hs[i].pos); nsp = SplinePointCreate(2*info->emsize,hs[i].pos); SplineMake(sp,nsp,info->to_order2); ss = chunkalloc(sizeof(SplineSet)); ss->first = sp; ss->last = nsp; if ( hs[i].offset!=0 ) ss->contour_name = pfed_read_utf8(ttf,base+hs[i].offset); ss->next = info->guidelines.splines; info->guidelines.splines = ss; } SPLCategorizePoints(info->guidelines.splines); free(vs); free(hs); } } static void pfed_redo_refs(SplineChar *sc,int layer) { RefChar *refs; sc->ticked = true; for ( refs=sc->layers[layer].refs; refs!=NULL; refs=refs->next ) { if ( layer==1 && refs->sc==NULL ) /* If main layer has spiros attached, then we'll get here. Any refs will come from the main ttf reading routines and won't be fixed up yet */ continue; if ( !refs->sc->ticked ) pfed_redo_refs(refs->sc,layer); SCReinstanciateRefChar(sc,refs,layer); } } static void pfed_read_layer(FILE *ttf,struct ttfinfo *info,int layer,int type, uint32 base, uint32 start,int version) { uint32 *loca = calloc(info->glyph_cnt,sizeof(uint32)); int i,j; SplineChar *sc; int rcnt; struct range { int start, last; uint32 offset; } *ranges; fseek(ttf,start,SEEK_SET); rcnt = getushort(ttf); ranges = malloc(rcnt*sizeof(struct range)); for ( i=0; ichars[j]; ly = &sc->layers[layer]; if ( loca[j]!=0 ) pfed_read_glyph_layer(ttf,info,ly,base+loca[j],type,version); } } free(ranges); free(loca); for ( i=0; iglyph_cnt; ++i ) if ( info->chars[i]!=NULL ) info->chars[i]->ticked = false; for ( i=0; iglyph_cnt; ++i ) if ( info->chars[i]!=NULL ) pfed_redo_refs(info->chars[i],layer); } static void pfed_readotherlayers(FILE *ttf,struct ttfinfo *info,uint32 base) { int i, l, lcnt, spiro_index, gid; int version; struct layer_info { int type, name_off, data_off, sf_layer; char *name; } *layers; int non_spiro_cnt=0; SplineChar *sc; fseek(ttf,base,SEEK_SET); version = getushort(ttf); if ( version>1 ) return; /* Bad version number */ lcnt = getushort(ttf); layers = malloc(lcnt*sizeof(struct layer_info)); for ( i=0; ilayer_cnt = non_spiro_cnt+1; info->layers = calloc(info->layer_cnt+1,sizeof(LayerInfo)); info->layers[ly_back].background = true; info->layers[ly_fore].order2 = info->to_order2; info->layers[ly_fore].background = false; l = i = 0; if ( (layers[i].type&0xff)==1 ) ++i; if ( layers[i].type&0x100 ) { /* first layer output is foreground, so it can't replace the background layer */ ++info->layer_cnt; l = 2; info->layers[ly_back].order2 = info->to_order2; } for ( ; ilayers[l].name = layers[i].name; layers[i].name = NULL; layers[i].sf_layer = l; info->layers[l].order2 = (layers[i].type&0xff)==2; info->layers[l].background = (layers[i].type&0x100)?0:1; if ( l==0 ) l=2; else ++l; } if ( info->layer_cnt!=2 ) { for ( gid = 0; gidglyph_cnt; ++gid ) if ((sc=info->chars[gid])!=NULL ) { sc->layers = realloc(sc->layers,info->layer_cnt*sizeof(Layer)); memset(sc->layers+2,0,(info->layer_cnt-2)*sizeof(Layer)); sc->layer_cnt = info->layer_cnt; } } } if ( spiro_index!=-1 ) pfed_read_layer(ttf,info,ly_fore,layers[spiro_index].type,base,base+layers[spiro_index].data_off,version); for ( i=0; ipfed_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, tagoff[i].tag); break; case cvtc_TAG: pfed_readcvtcomments(ttf,info,info->pfed_start+tagoff[i].offset); break; case cmnt_TAG: pfed_readglyphcomments(ttf,info,info->pfed_start+tagoff[i].offset); break; case colr_TAG: pfed_readcolours(ttf,info,info->pfed_start+tagoff[i].offset); break; case GPOS_TAG: pfed_readlookupnames(ttf,info,info->pfed_start+tagoff[i].offset,info->gpos_lookups); break; case GSUB_TAG: pfed_readlookupnames(ttf,info,info->pfed_start+tagoff[i].offset,info->gsub_lookups); break; case layr_TAG: pfed_readotherlayers(ttf,info,info->pfed_start+tagoff[i].offset); break; case guid_TAG: pfed_readguidelines(ttf,info,info->pfed_start+tagoff[i].offset); break; default: LogError( _("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; } } /* 'TeX ' 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 */ /* ... */ /* 'TeX ' 'ftpm' font parameter subtable format */ /* short version number 0 */ /* parameter count */ /* array of { 4chr tag, value } */ /* 'TeX ' 'htdp' per-glyph height/depth subtable format */ /* short version number 0 */ /* short glyph-count */ /* array[glyph-count] of { int16 height,depth } */ /* 'TeX ' 'itlc' per-glyph italic correction subtable */ /* short version number 0 */ /* short glyph-count */ /* array[glyph-count] of int16 italic_correction */ /* !!!!!!!!!!! OBSOLETE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ /* 'TeX ' 'sbsp' per-glyph sub/super script positioning subtable */ /* short version number 0 */ /* short glyph-count */ /* array[glyph-count] of { int16 sub,super } */ #undef MAX_SUBTABLE_TYPES #define MAX_SUBTABLE_TYPES 4 struct TeX_subtabs { int next; struct { FILE *data; uint32 tag; uint32 offset; } subtabs[MAX_SUBTABLE_TYPES]; }; static uint32 tex_text_params[] = { TeX_Slant, TeX_Space, TeX_Stretch, TeX_Shrink, TeX_XHeight, TeX_Quad, TeX_ExtraSp, 0 }; static uint32 tex_math_params[] = { TeX_Slant, TeX_Space, TeX_Stretch, TeX_Shrink, TeX_XHeight, TeX_Quad, TeX_MathSp, TeX_Num1, TeX_Num2, TeX_Num3, TeX_Denom1, TeX_Denom2, TeX_Sup1, TeX_Sup2, TeX_Sup3, TeX_Sub1, TeX_Sub2, TeX_SupDrop, TeX_SubDrop, TeX_Delim1, TeX_Delim2, TeX_AxisHeight, 0}; static uint32 tex_mathext_params[] = { TeX_Slant, TeX_Space, TeX_Stretch, TeX_Shrink, TeX_XHeight, TeX_Quad, TeX_MathSp, TeX_DefRuleThick, TeX_BigOpSpace1, TeX_BigOpSpace2, TeX_BigOpSpace3, TeX_BigOpSpace4, TeX_BigOpSpace5, 0}; /* ************************************************************************** */ /* ************************* The 'TeX ' table ************************* */ /* ************************* Output ************************* */ /* ************************************************************************** */ static void TeX_dumpFontParams(SplineFont *sf, struct TeX_subtabs *tex, struct alltabs *at ) { FILE *fprm; int i,pcnt; uint32 *tags; if ( sf->texdata.type==tex_unset ) return; tex->subtabs[tex->next].tag = CHR('f','t','p','m'); tex->subtabs[tex->next++].data = fprm = tmpfile2(); putshort(fprm,0); /* sub-table version number */ pcnt = sf->texdata.type==tex_math ? 22 : sf->texdata.type==tex_mathext ? 13 : 7; tags = sf->texdata.type==tex_math ? tex_math_params : sf->texdata.type==tex_mathext ? tex_mathext_params : tex_text_params; putshort(fprm,pcnt); for ( i=0; itexdata.params[i]); } /* always aligned */ } static void TeX_dumpHeightDepth(SplineFont *sf, struct TeX_subtabs *tex, struct alltabs *at ) { FILE *htdp; int i,j,k,last_g, gid; DBounds b; for ( i=at->gi.gcnt-1; i>=0; --i ) { gid = at->gi.bygid[i]; if ( gid!=-1 && sf->glyphs[gid]!=NULL && (sf->glyphs[gid]->tex_height!=TEX_UNDEF || sf->glyphs[gid]->tex_depth!=TEX_UNDEF)) break; } if ( i<0 ) /* No height/depth info */ return; tex->subtabs[tex->next].tag = CHR('h','t','d','p'); tex->subtabs[tex->next++].data = htdp = tmpfile2(); putshort(htdp,0); /* sub-table version number */ putshort(htdp,sf->glyphs[gid]->ttf_glyph+1);/* data for this many glyphs */ last_g = -1; for ( j=0; j<=i; ++j ) { gid = at->gi.bygid[j]; if ( gid!=-1 && sf->glyphs[gid]!=NULL ) { SplineChar *sc = sf->glyphs[gid]; for ( k=last_g+1; kttf_glyph; ++k ) { putshort(htdp,0); putshort(htdp,0); } if ( sc->tex_depth==TEX_UNDEF || sc->tex_height==TEX_UNDEF ) SplineCharFindBounds(sc,&b); putshort( htdp, sc->tex_height==TEX_UNDEF ? b.maxy : sc->tex_height ); putshort( htdp, sc->tex_depth==TEX_UNDEF ? -b.miny : sc->tex_depth ); last_g = sc->ttf_glyph; } } /* always aligned */ } static void TeX_dumpItalicCorr(SplineFont *sf, struct TeX_subtabs *tex, struct alltabs *at ) { FILE *itlc; int i,j,k,last_g, gid; for ( i=at->gi.gcnt-1; i>=0; --i ) { gid = at->gi.bygid[i]; if ( gid!=-1 && sf->glyphs[gid]!=NULL && sf->glyphs[gid]->italic_correction!=TEX_UNDEF ) break; } if ( i<0 ) /* No italic_correction info */ return; tex->subtabs[tex->next].tag = CHR('i','t','l','c'); tex->subtabs[tex->next++].data = itlc = tmpfile2(); putshort(itlc,0); /* sub-table version number */ putshort(itlc,sf->glyphs[gid]->ttf_glyph+1);/* data for this many glyphs */ last_g = -1; for ( j=0; j<=i; ++j ) { gid = at->gi.bygid[j]; if ( gid!=-1 && sf->glyphs[gid]!=NULL ) { SplineChar *sc = sf->glyphs[gid]; for ( k=last_g+1; kttf_glyph; ++k ) { putshort(itlc,0); putshort(itlc,0); } putshort( itlc, sc->italic_correction!=TEX_UNDEF ? sc->italic_correction : 0 ); last_g = sc->ttf_glyph; } } /* always aligned */ } void tex_dump(struct alltabs *at, SplineFont *sf) { struct TeX_subtabs tex; FILE *file; int i; uint32 offset; if ( !(at->gi.flags & ttf_flag_TeXtable )) return; memset(&tex,0,sizeof(tex)); TeX_dumpFontParams(sf,&tex,at); TeX_dumpHeightDepth(sf,&tex,at); TeX_dumpItalicCorr(sf,&tex,at); if ( tex.next==0 ) return; /* No subtables */ at->tex = file = tmpfile2(); putlong(file, 0x00010000); /* Version number */ putlong(file, tex.next); /* sub-table count */ offset = 2*sizeof(uint32) + 2*tex.next*sizeof(uint32); for ( i=0; itexlen = ftell(file); } /* ************************* The 'TeX ' table ************************* */ /* ************************* Input ************************* */ static void TeX_readFontParams(FILE *ttf,struct ttfinfo *info,uint32 base) { int i,pcnt; static uint32 *alltags[] = { tex_text_params, tex_math_params, tex_mathext_params }; int j,k; uint32 tag; int32 val; fseek(ttf,base,SEEK_SET); if ( getushort(ttf)!=0 ) /* Don't know how to read this version of the subtable */ return; pcnt = getushort(ttf); if ( pcnt==22 ) info->texdata.type = tex_math; else if ( pcnt==13 ) info->texdata.type = tex_mathext; else if ( pcnt>=7 ) info->texdata.type = tex_text; for ( i=0; itexdata.params[k] = val; } } static void TeX_readHeightDepth(FILE *ttf,struct ttfinfo *info,uint32 base) { int i,gcnt; fseek(ttf,base,SEEK_SET); if ( getushort(ttf)!=0 ) /* Don't know how to read this version of the subtable */ return; gcnt = getushort(ttf); for ( i=0; iglyph_cnt; ++i ) { int h, d; h = getushort(ttf); d = getushort(ttf); if ( info->chars[i]!=NULL ) { info->chars[i]->tex_height = h; info->chars[i]->tex_depth = d; } } } static void TeX_readItalicCorr(FILE *ttf,struct ttfinfo *info,uint32 base) { int i,gcnt; fseek(ttf,base,SEEK_SET); if ( getushort(ttf)!=0 ) /* Don't know how to read this version of the subtable */ return; gcnt = getushort(ttf); for ( i=0; iglyph_cnt; ++i ) { int ital; ital = getushort(ttf); if ( info->chars[i]!=NULL ) { info->chars[i]->italic_correction = ital; } } } void tex_read(FILE *ttf,struct ttfinfo *info) { int n,i; struct tagoff { uint32 tag, offset; } tagoff[MAX_SUBTABLE_TYPES+30]; fseek(ttf,info->tex_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; itex_start+tagoff[i].offset); break; case CHR('h','t','d','p'): TeX_readHeightDepth(ttf,info,info->tex_start+tagoff[i].offset); break; case CHR('i','t','l','c'): TeX_readItalicCorr(ttf,info,info->tex_start+tagoff[i].offset); break; default: LogError( _("Unknown subtable '%c%c%c%c' in 'TeX ' table, ignored\n"), tagoff[i].tag>>24, (tagoff[i].tag>>16)&0xff, (tagoff[i].tag>>8)&0xff, tagoff[i].tag&0xff ); break; } } /* ************************************************************************** */ /* ************************* The 'BDF ' table ************************* */ /* ************************* Output ************************* */ /* ************************************************************************** */ /* the BDF table is used to store BDF properties so that we can do round trip */ /* conversion from BDF->otb->BDF without losing anything. */ /* Format: USHORT version : 'BDF' table version number, must be 0x0001 USHORT strikeCount : number of strikes in table ULONG stringTable : offset (from start of BDF table) to string table followed by an array of 'strikeCount' descriptors that look like: USHORT ppem : vertical pixels-per-EM for this strike USHORT num_items : number of items (properties and atoms), max is 255 this array is followed by 'strikeCount' value sets. Each "value set" is an array of (num_items) items that look like: ULONG item_name : offset in string table to item name USHORT item_type : item type: 0 => non-property string (e.g. COMMENT) 1 => non-property atom (e.g. FONT) 2 => non-property int32 3 => non-property uint32 0x10 => flag for a property, ored with above value types) ULONG item_value : item value. strings => an offset into the string table to the corresponding string, without the surrending double-quotes atoms => an offset into the string table integers => the corresponding 32-bit value Then the string table of null terminated strings. These strings should be in ASCII. */ /* ************************* The 'BDF ' table ************************* */ /* ************************* Input ************************* */ static char *getstring(FILE *ttf,long start) { long here = ftell(ttf); int len, ch; char *str, *pt; if ( here<0 ) return( NULL ); fseek(ttf,start,SEEK_SET); for ( len=1; (ch=getc(ttf))>0 ; ++len ); fseek(ttf,start,SEEK_SET); pt = str = malloc(len); while ( (ch=getc(ttf))>0 ) *pt++ = ch; *pt = '\0'; fseek(ttf,here,SEEK_SET); return( str ); } /* COMMENTS get stored all in one lump by freetype. De-lump them */ static int CheckForNewlines(BDFFont *bdf,int k) { char *pt, *start; int cnt, i; for ( cnt=0, pt = bdf->props[k].u.atom; *pt; ++pt ) if ( *pt=='\n' ) ++cnt; if ( cnt==0 ) return( k ); bdf->prop_cnt += cnt; bdf->props = realloc(bdf->props, bdf->prop_cnt*sizeof( BDFProperties )); pt = strchr(bdf->props[k].u.atom,'\n'); *pt = '\0'; ++pt; for ( i=1; i<=cnt; ++i ) { start = pt; while ( *pt!='\n' && *pt!='\0' ) ++pt; bdf->props[k+i].name = copy(bdf->props[k].name); bdf->props[k+i].type = bdf->props[k].type; bdf->props[k+i].u.atom = copyn(start,pt-start); if ( *pt=='\n' ) ++pt; } pt = copy( bdf->props[k].u.atom ); free( bdf->props[k].u.atom ); bdf->props[k].u.atom = pt; return( k+cnt ); } void ttf_bdf_read(FILE *ttf,struct ttfinfo *info) { int strike_cnt, i,j,k; long string_start; struct bdfinfo { BDFFont *bdf; int cnt; } *bdfinfo; BDFFont *bdf; if ( info->bdf_start==0 ) return; fseek(ttf,info->bdf_start,SEEK_SET); if ( getushort(ttf)!=1 ) return; strike_cnt = getushort(ttf); string_start = getlong(ttf) + info->bdf_start; bdfinfo = malloc(strike_cnt*sizeof(struct bdfinfo)); for ( i=0; ibitmaps; bdf!=NULL; bdf=bdf->next ) if ( bdf->pixelsize==ppem ) break; bdfinfo[i].bdf = bdf; bdfinfo[i].cnt = num_items; } for ( i=0; iprop_cnt = bdfinfo[i].cnt; bdf->props = malloc(bdf->prop_cnt*sizeof(BDFProperties)); for ( j=k=0; jprops[k].type = type; bdf->props[k].name = getstring(ttf,string_start+name); switch ( type&~prt_property ) { case prt_int: case prt_uint: bdf->props[k].u.val = value; if ( strcmp(bdf->props[k].name,"FONT_ASCENT")==0 && value<=bdf->pixelsize ) { bdf->ascent = value; bdf->descent = bdf->pixelsize-value; } break; case prt_string: case prt_atom: bdf->props[k].u.str = getstring(ttf,string_start+value); k = CheckForNewlines(bdf,k); break; } } } } free(bdfinfo); } /* ************************************************************************** */ /* ************************* The 'FFTM' table ************************* */ /* ************************* Output ************************* */ /* ************************************************************************** */ /* FontForge timestamp table */ /* Contains: */ /* date of fontforge sources */ /* date of font's (not file's) creation */ /* date of font's modification */ int ttf_fftm_dump(SplineFont *sf,struct alltabs *at) { int32 results[2]; at->fftmf = tmpfile2(); putlong(at->fftmf,0x00000001); /* Version */ cvt_unix_to_1904(LibFF_ModTime,results); putlong(at->fftmf,results[1]); putlong(at->fftmf,results[0]); cvt_unix_to_1904(sf->creationtime,results); putlong(at->fftmf,results[1]); putlong(at->fftmf,results[0]); cvt_unix_to_1904(sf->modificationtime,results); putlong(at->fftmf,results[1]); putlong(at->fftmf,results[0]); at->fftmlen = ftell(at->fftmf); /* had better be 7*4 */ /* It will never be misaligned */ if ( (at->fftmlen&1)!=0 ) putc(0,at->fftmf); if ( ((at->fftmlen+1)&2)!=0 ) putshort(at->fftmf,0); return( true ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/woff.c0000664000175000017500000002322413510660062015507 00000000000000/* Copyright (C) 2010-2012 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. */ /* Support for woff files */ /* Which are defined here: http://people.mozilla.com/~jkew/woff/woff-2009-09-16.html */ /* Basically sfnts with compressed tables and some more metadata */ #include "fontforge.h" #include #include # include static void copydata(FILE *to,int off_to,FILE *from,int off_from, int len) { int ch, i; fseek(to ,off_to ,SEEK_SET); fseek(from,off_from,SEEK_SET); for ( i=0; iCHUNK ) amount = CHUNK; strm.avail_in = fread(in, 1, amount, from); len -= strm.avail_in; if (ferror(from)) { (void)deflateEnd(&strm); fprintf( stderr, "IO error.\n" ); break; } if (strm.avail_in == 0) break; strm.next_in = (unsigned char*)in; do { strm.avail_out = CHUNK; strm.next_out = (unsigned char*)out; ret = deflate(&strm, len==0 ? Z_FINISH : Z_NO_FLUSH); if ( ret==Z_STREAM_ERROR ) { (void)deflateEnd(&strm); fprintf( stderr, "Compression failed somehow.\n"); err = 1; break; } amount = CHUNK - strm.avail_out; if ( fwrite(out,1,amount,tmp)!= amount || ferror(tmp) ) { (void)deflateEnd(&strm); fprintf( stderr, "IO Error.\n"); err=1; break; } } while ( strm.avail_out==0 ); if ( err ) break; } while ( ret!=Z_STREAM_END ); (void)deflateEnd(&strm); if ( strm.total_out>=uncompLen ) { /* Didn't actually make the data smaller, so store uncompressed */ fclose(tmp); copydata(to,off_to,from,off_from,uncompLen); return( uncompLen ); } else { copydata(to,off_to,tmp,0,strm.total_out); fclose(tmp); return( strm.total_out ); } } typedef struct { int index; int offset; } tableOrderRec; static int compareOffsets(const void * lhs, const void * rhs) { const tableOrderRec * a = (const tableOrderRec *) lhs; const tableOrderRec * b = (const tableOrderRec *) rhs; /* don't simply return a->offset - b->offset because these are unsigned offset values; could convert to int, but possible integer overflow */ return a->offset > b->offset ? 1 : a->offset < b->offset ? -1 : 0; } int _WriteWOFFFont(FILE *woff,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer) { int ret; FILE *sfnt; int major=sf->woffMajor, minor=sf->woffMinor; int flavour, num_tabs; int filelen, len; int i; int compLen, uncompLen, newoffset; int tag, checksum, offset; int tab_start; tableOrderRec *tableOrder = NULL; if ( major==woffUnset ) { struct ttflangname *useng; major = 1; minor = 0; for ( useng=sf->names; useng!=NULL; useng=useng->next ) if ( useng->lang==0x409 ) break; if ( useng!=NULL && useng->names[ttf_version]!=NULL && sscanf(useng->names[ttf_version], "Version %d.%d", &major, &minor)>=1 ) { /* All done */ } else if ( sf->subfontcnt!=0 ) { major = floor(sf->cidversion); minor = floor(1000.*(sf->cidversion-major)); } else if ( sf->version!=NULL ) { char *pt=sf->version; char *end; while ( *pt && !isdigit(*pt) && *pt!='.' ) ++pt; if ( *pt ) { major = strtol(pt,&end,10); if ( *end=='.' ) minor = strtol(end+1,NULL,10); } } } format = sf->subfonts!=NULL ? ff_otfcid : sf->layers[layer].order2 ? ff_ttf : ff_otf; sfnt = tmpfile2(); ret = _WriteTTFFont(sfnt,sf,format,bsizes,bf,flags,enc,layer); if ( !ret ) { fclose(sfnt); return( ret ); } fseek(sfnt,0,SEEK_END); filelen = ftell(sfnt); rewind(sfnt); flavour = getlong(sfnt); /* The woff standard says we should accept all flavours of sfnt, so can't */ /* test flavour to make sure we've got a valid sfnt */ /* But we can test the rest of the header for consistancy */ num_tabs = getushort(sfnt); (void) getushort(sfnt); (void) getushort(sfnt); (void) getushort(sfnt); /* * At this point _WriteTTFFont should have generated an sfnt file with * valid checksums, correct padding and no extra gaps. However, the order * of the font tables in the original sfnt font must also be preserved so * that WOFF consumers can recover the original offsets as well as the * original font. Hence we will compress and write the font tables into * the WOFF file using the original offset order. Note that the order of * tables may not be the same as the one of table directory entries. * See https://github.com/fontforge/fontforge/issues/926 */ tableOrder = (tableOrderRec *) malloc(num_tabs * sizeof(tableOrderRec)); if (!tableOrder) { fclose(sfnt); return false; } for ( i=0; iwoffMetadata!= NULL ) { int uncomplen = strlen(sf->woffMetadata); uLongf complen = 2*uncomplen; char *temp=malloc(complen+1); newoffset = ftell(woff); compress((unsigned char*)temp,&complen,(unsigned char*)sf->woffMetadata,uncomplen); fwrite(temp,1,complen,woff); free(temp); if ( (ftell(woff)&3)!=0 ) { /* Pad to a 4 byte boundary */ if ( ftell(woff)&1 ) putc('\0',woff); if ( ftell(woff)&2 ) putshort(woff,0); } fseek(woff,24,SEEK_SET); putlong(woff,newoffset); putlong(woff,complen); putlong(woff,uncomplen); fseek(woff,0,SEEK_END); } fseek(woff,0,SEEK_END); len = ftell(woff); fseek(woff,8,SEEK_SET); putlong(woff,len); free(tableOrder); return( true ); /* No errors */ } int WriteWOFFFont(char *fontname,SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *enc,int layer) { FILE *woff; int ret; if ( strstr(fontname,"://")!=NULL ) { if (( woff = tmpfile2())==NULL ) return( 0 ); } else { if (( woff=fopen(fontname,"wb+"))==NULL ) return( 0 ); } ret = _WriteWOFFFont(woff,sf,format,bsizes,bf,flags,enc,layer); if ( fclose(woff)==-1 ) return( 0 ); return( ret ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/encoding.h0000664000175000017500000000013213510660062016332 00000000000000#ifndef _ENCODING_H #define _ENCODING_H extern void EncodingFree(Encoding *item); #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/tottf.c0000664000175000017500000065063013510660062015715 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #include #include #ifdef __CygWin #include #include #include #endif #include "ttf.h" char *TTFFoundry=NULL; /* This file produces a ttf file given a splinefont. */ /* ************************************************************************** */ /* Required tables: cmap encoding head header data hhea horizontal metrics 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) MATH MATH (MS proposal, if math data present) Apple variation tables (for distortable (multiple master type) fonts) fvar (font variations) gvar (glyph variations) cvar (cvt variations) avar (axis variations) 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) FontForge PfEd My own table TeX TeX TeX specific info (stuff that used to live in tfm files) */ 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" }; /* Relates Unicode blocks as in http://unicode.org/Public/UNIDATA/Blocks.txt to bit positions in the OpenType standard Unicode Character Range field 'ulUnicodeRange'. Note that the OpenType standard specifies bits for a subset of the Unicode blocks. */ 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 and Coptic */ { 0x400, 0x52f, 9 }, /* Cyrillic / Cyrillic Supplement */ { 0x530, 0x58f, 10 }, /* Armenian */ { 0x590, 0x5ff, 11 }, /* Hebrew */ { 0x600, 0x6ff, 13 }, /* Arabic */ { 0x700, 0x74f, 71 }, /* Syriac */ { 0x750, 0x77f, 13 }, /* Arabic Supplement */ { 0x780, 0x7bf, 72 }, /* Thaana */ { 0x7c0, 0x7ff, 14 }, /* N'Ko */ /* { 0x800, 0x83f, ? }, Samaritan */ /* { 0x840, 0x85f, ? }, Mandaic */ { 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 */ { 0x1380, 0x139f, 75 }, /* Ethiopic Supplement */ { 0x13a0, 0x13ff, 76 }, /* Cherokee */ { 0x1400, 0x167f, 77 }, /* Unified Canadian Aboriginal Symbols */ { 0x1680, 0x169f, 78 }, /* Ogham */ { 0x16a0, 0x16ff, 79 }, /* Runic */ { 0x1700, 0x1714, 84 }, /* Tagalog */ { 0x1720, 0x1736, 84 }, /* Harunoo */ { 0x1740, 0x1753, 84 }, /* Buhid */ { 0x1750, 0x1773, 84 }, /* Tagbanwa */ { 0x1780, 0x17ff, 80 }, /* Khmer */ { 0x1800, 0x18af, 81 }, /* Mongolian */ { 0x18B0, 0x18f5, 77 }, /* Unified Canadian Aboriginal Symbols Extended */ { 0x1900, 0x194f, 93 }, /* Limbu */ { 0x1950, 0x197f, 94 }, /* Tai Le */ { 0x1980, 0x19DF, 95 }, /* New Tai Lue */ { 0x19e0, 0x19ff, 80 }, /* Khmer Symbols */ { 0x1A00, 0x1A1F, 96 }, /* Buginese */ { 0x1B00, 0x1B7f, 27 }, /* Balinese */ { 0x1B80, 0x1BB9, 112 }, /* Sudanese */ /*{ 0x1bc0, 0x1bff, ? }, Batak */ { 0x1C00, 0x1C4F, 113 }, /* Lepcha */ { 0x1C50, 0x1C7F, 114 }, /* Ol Chiki */ /*{ 0x1cd0, 0x1cff, ? }, Vedic Extensions */ { 0x1d00, 0x1dbf, 4 }, /* Phonetic Extensions & Supplement */ { 0x1d80, 0x1dff, 6 }, /* Combining Diacritical Marks Supplement */ { 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 */ { 0x2b00, 0x2bff, 37 }, /* Miscellaneous Symbols and Arrows */ { 0x2C00, 0x2C5E, 97 }, /* Glagolitic */ { 0x2c60, 0x2c7f, 29 }, /* Latin Extended-C */ { 0x2c80, 0x2cff, 8 }, /* Coptic */ { 0x2D00, 0x2D25, 26 }, /* Georgian Supplement */ { 0x2D30, 0x2D6F, 98 }, /* Tifinagh */ { 0x2d80, 0x2ddf, 75 }, /* Ethiopic Extended */ { 0x2de0, 0x2dff, 9 }, /* Cyrillic Extended-A */ { 0x2e00, 0x2e7f, 31 }, /* Supplemental Punctuation */ { 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, 99 }, /* Yijing Hexagram Symbols */ { 0x4e00, 0x9fff, 59 }, /* CJK Unified Ideographs */ { 0xa000, 0xa4cf, 81 }, /* Yi Syllables / Yi Radicals */ /*{ 0xA4d0, 0xA4ff, ? }, Lisu */ { 0xA500, 0xA62b, 12 }, /* Vai */ { 0xa640, 0xa69f, 9 }, /* Cyrillic Extended-B */ /*{ 0xa6a0, 0xa6ff, ? }, Bamum */ { 0xa700, 0xa71f, 5 }, /* Modifier Tone Letters */ { 0xa720, 0xa7ff, 29 }, /* Latin Extended-D */ { 0xA800, 0xA82F, 100 }, /* Syloti Nagri */ /*{ 0xa830, 0xa83f, ? }, Common Indic Number Forms */ { 0xa840, 0xa87f, 53 }, /* Phags-pa */ { 0xA880, 0xA8D9, 115 }, /* Saurashtra */ /*{ 0xA8E0, 0xA8FF, ? }, Devanagari Extended */ { 0xA900, 0xA92F, 116 }, /* Kayah Li */ { 0xA930, 0xA95F, 117 }, /* Rejang */ /*{ 0xA960, 0xA97F, 28? }, Hangul Jamo Extended-A */ /*{ 0xA980, 0xA9DF, ? }, Javanese */ { 0xAA00, 0xAA5F, 118 }, /* Cham */ /*{ 0xAA60, 0xAA7F, 74? }, Myanmar Extended-A */ /*{ 0xAA80, 0xAADF, ? }, Tai Viet */ /*{ 0xab00, 0xab2f, 75? }, Ethiopic Extended-A */ /*{ 0xabc0, 0xabff, ? }, Meetei Mayek */ { 0xac00, 0xd7af, 56 }, /* Hangul Syllables */ { 0xd800, 0xdfff, 57 }, /* Non-Plane 0 */ { 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, 101 }, /* Linear B Syllabary */ { 0x10080, 0x100ff, 101 }, /* Linear B Ideograms */ { 0x10100, 0x1013f, 101 }, /* Aegean Numbers */ { 0x10140, 0x1018F, 102 }, /* Ancient Greek Numbers */ { 0x10190, 0x101CF, 119 }, /* Ancient Symbols */ { 0x101D0, 0x101FF, 120 }, /* Phaistos Disc */ { 0x102A0, 0x102D0, 121 }, /* Carian */ { 0x10280, 0x1029C, 121 }, /* Lycian */ { 0x10300, 0x1032f, 85 }, /* Old Italic */ { 0x10330, 0x1034f, 86 }, /* Gothic */ { 0x10380, 0x1039F, 103 }, /* Ugaritic */ { 0x103A0, 0x103D6, 104 }, /* Old Persian */ { 0x10400, 0x1044f, 87 }, /* Deseret */ { 0x10450, 0x1047f, 105 }, /* Shavian */ { 0x10480, 0x104af, 106 }, /* Osmanya */ { 0x10800, 0x1083f, 107 }, /* Cypriot Syllabary */ /*{ 0x10840, 0x1085f, ? }, Imperial Aramaic */ { 0x10900, 0x1091f, 58 }, /* Phoenician */ { 0x10920, 0x10939, 121 }, /* Lydian */ { 0x10A00, 0x10A5F, 108 }, /* Kharoshthi */ /*{ 0x10A60, 0x10A7F, ? }, Old South Arabian */ /*{ 0x10B00, 0x10B3F, ? }, Avestan */ /*{ 0x10B40, 0x10B5F, ? }, Inscriptional Parthian */ /*{ 0x10B60, 0x10B7F, ? }, Inscriptional Pahlavi */ /*{ 0x10C00, 0x10C4F, ? }, Old Turkic */ /*{ 0x10E60, 0x10E7F, ? }, Rumi Numeral Symbols */ /*{ 0x11000, 0x1107F, ? }, Brahmi */ /*{ 0x11000, 0x1107F, ? }, Kaithi */ { 0x12000, 0x1247F, 110 }, /* Cuneiform; Numbers & Punctuation */ /*{ 0x13000, 0x1342F, ? }, Egyptian Hieroglyphs */ /*{ 0x16800, 0x16A3F, ? }, Bamum Supplement */ /*{ 0x1B000, 0x1B0FF, ? }, Kana Supplement */ { 0x1d000, 0x1d1ff, 88 }, /* Byzantine Musical Symbols / Musical Symbols */ /*{ 0x1D200, 0x1D24F, ? }, Ancient Greek Musical Notation */ { 0x1d300, 0x1d35f, 109 }, /* Tai Xuan Jing Symbols */ { 0x1D360, 0x1D37F, 111 }, /* Counting Rod Numerals */ { 0x1d400, 0x1d7ff, 89 }, /* Mathematical Alphanumeric Symbols */ { 0x1F000, 0x1F02B, 122 }, /* Mahjong Tiles */ { 0x1F030, 0x1F093, 122 }, /* Dominos */ /*{ 0x1F0A0, 0x1F0FF, ? }, Playing Cards */ /*{ 0x1F100, 0x1F1FF, ? }, Enclosed Alphanumeric Supplement */ /*{ 0x1F200, 0x1F2FF, ? }, Enclosed Ideographic Supplement */ /*{ 0x1F300, 0x1F5FF, ? }, Miscellaneous Symbols And Pictographs */ /*{ 0x1F600, 0x1F64F, ? }, Emoticons */ /*{ 0x1F680, 0x1F6FF, ? }, Transport And Map Symbols */ /*{ 0x1F700, 0x1F77F, ? }, Alchemical Symbols */ { 0x20000, 0x2a6df, 59 }, /* CJK Unified Ideographs Extension B */ /*{ 0x2A700, 0x2B73F, 59? }, CJK Unified Ideographs Extension C */ /*{ 0x2B740, 0x2B81F, 59? }, CJK Unified Ideographs Extension D */ { 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 ); } static int short_too_long_warned = 0; void putshort(FILE *file,int sval) { if ( sval<-32768 || sval>65535 ) if (!short_too_long_warned) { IError(_("Attempt to output %d into a 16-bit field. It will be truncated and the file may not be useful."), sval ); short_too_long_warned = 1; } putc((sval>>8)&0xff,file); putc(sval&0xff,file); } static void putu24(FILE *file,int val) { putc((val>>16)&0xff,file); putc((val>>8)&0xff,file); putc(val&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, const char *tab_name) { int ch; int ret = 1; if ( ferror(ttf) || ferror(other)) { IError("Disk error of some nature. Perhaps no space on device?\nGenerated font will be unusable" ); } else if ( pos!=ftell(ttf)) { IError("File Offset wrong for ttf table (%s), %d expected %d", tab_name, 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, int istt ) { /* 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, lasti, lastv, lastdefault = istt ? 3 : 1; int width, vwidth; lasti = lastv = gi->gcnt-1; for ( i=gi->gcnt-1; i>lastdefault && gi->bygid[i]==-1; --i ); if ( i>=lastdefault ) { width = sf->glyphs[gi->bygid[i]]->width; vwidth = sf->glyphs[gi->bygid[i]]->vwidth; lasti = lastv = i; for ( i=lasti-1; i>=lastdefault; --i ) { if ( SCWorthOutputting(sf->glyphs[gi->bygid[i]]) ) { if ( sf->glyphs[gi->bygid[i]]->width!=width ) break; else lasti = i; } } gi->lasthwidth = lasti; if ( sf->hasvmetrics ) { for ( i=lastv-1; i>=lastdefault; --i ) { if ( SCWorthOutputting(sf->glyphs[gi->bygid[i]]) ) { if ( sf->glyphs[gi->bygid[i]]->vwidth!=vwidth ) break; else lastv = i; } } gi->lastvwidth = lastv; } } else { gi->lasthwidth = 0; gi->lastvwidth = 0; } } 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) { int width=sc->width; int vwidth=sc->vwidth; if ( width<0 ) width=0; if ( vwidth<0 ) vwidth=0; if ( sc->ttf_glyph<=gi->lasthwidth ) putshort(gi->hmtx,width); putshort(gi->hmtx,b->minx); if ( sc->parent->hasvmetrics ) { if ( sc->ttf_glyph<=gi->lastvwidth ) putshort(gi->vmtx,vwidth); putshort(gi->vmtx, sc->parent->ascent - b->maxy); } if ( sc->ttf_glyph==gi->lasthwidth ) gi->hfullcnt = sc->ttf_glyph+1; if ( sc->ttf_glyph==gi->lastvwidth ) gi->vfullcnt = sc->ttf_glyph+1; } static SplineSet *SCttfApprox(SplineChar *sc,int layer) { SplineSet *head=NULL, *last, *ss, *tss; RefChar *ref; for ( ss=sc->layers[layer].splines; ss!=NULL; ss=ss->next ) { tss = sc->layers[layer].order2 ? SplinePointListCopy1(ss) : SSttfApprox(ss); if ( head==NULL ) head = tss; else last->next = tss; last = tss; } for ( ref=sc->layers[layer].refs; ref!=NULL; ref=ref->next ) { for ( ss=ref->layers[0].splines; ss!=NULL; ss=ss->next ) { tss = sc->layers[layer].order2 ? SplinePointListCopy1(ss) : SSttfApprox(ss); if ( head==NULL ) head = tss; else last->next = tss; last = tss; } } return( head ); } #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) { SplinePoint *sp, *first, *nextsp; int startcnt = ptcnt; if ( 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 ( ss->first->ttfindex!=ptcnt && ss->first->ttfindex!=0xfffe ) IError("Unexpected point count in SSAddPoints" ); first = NULL; for ( sp=ss->first; sp!=first ; ) { if ( 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 ( !SPInterpolate( sp ) ) { /* 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 ( sp->nextcpindex == startcnt ) /* This control point is actually our first point, not our last */ break; if ( (sp->nextcpindex !=0xffff && sp->nextcpindex!=0xfffe ) || !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) { /* Or .notdef */ struct glyphhead gh; BasePoint bp[10]; uint8 instrs[50]; int stemcvt, stem; char *stempt; stem = 0; if ( sf->private!=NULL && (stempt=PSDictHasEntry(sf->private,"StdVW"))!=NULL ) stem = strtod(stempt,NULL); else if ( sf->private!=NULL && (stempt=PSDictHasEntry(sf->private,"StdHW"))!=NULL ) stem = strtod(stempt,NULL); if ( stem<=0 ) stem = (sf->ascent+sf->descent)/30; gi->pointcounts[gi->next_glyph] = 8; 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 = 5*stem+(sf->ascent+sf->descent)/10; gh.xmin = stem; gh.xmax += stem; if ( gh.ymax>sf->ascent ) gh.ymax = sf->ascent; dumpghstruct(gi,&gh); 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; if ( !gi->ttc_composite_font ) { stemcvt = TTF_getcvtval(gi->sf,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 */ if ( !gi->ttc_composite_font ) dumpinstrs(gi,instrs,46); else dumpinstrs(gi,NULL,0); dumppointarrays(gi,bp,NULL,8); if ( fixedwidth<=0 ) 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<=0?(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->pointcounts[gi->next_glyph] = 0; 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->pointcounts[gi->next_glyph] = 0; gi->loca[gi->next_glyph++] = ftell(gi->glyphs); memset(&b,0,sizeof(b)); ttfdumpmetrics(sc,gi,&b); } static int IsTTFRefable(SplineChar *sc,int layer) { RefChar *ref; if ( sc->layers[layer].refs==NULL || sc->layers[layer].splines!=NULL ) return( false ); for ( ref=sc->layers[layer].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 ); } int RefDepth(RefChar *ref,int layer) { int rd, temp; SplineChar *sc = ref->sc; if ( sc->layers[layer].refs==NULL || sc->layers[layer].splines!=NULL ) return( 1 ); rd = 0; for ( ref = sc->layers[layer].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,layer); if ( temp>rd ) rd = temp; } } return( rd+1 ); } static void CountCompositeMaxPts(SplineChar *sc,struct glyphinfo *gi) { RefChar *ref; int ptcnt = 0, index; for ( ref=sc->layers[gi->layer].refs; ref!=NULL; ref=ref->next ) { if ( ref->sc->ttf_glyph==-1 ) continue; index = ref->sc->ttf_glyph; if ( gi->pointcounts[index]==-1 ) CountCompositeMaxPts(ref->sc,gi); ptcnt += gi->pointcounts[index]; } gi->pointcounts[sc->ttf_glyph] = ptcnt; if ( gi->maxp->maxCompositPtsmaxp->maxCompositPts=ptcnt; } /* In order3 fonts we figure out the composite point counts at the end */ /* when we know how many points are in each sub-glyph */ static void RefigureCompositeMaxPts(SplineFont *sf,struct glyphinfo *gi) { int i; for ( i=0; igcnt; ++i ) if ( gi->bygid[i]!=-1 && sf->glyphs[gi->bygid[i]]->ttf_glyph!=-1 ) { if ( sf->glyphs[gi->bygid[i]]->layers[gi->layer].splines==NULL && sf->glyphs[gi->bygid[i]]->layers[gi->layer].refs!=NULL && gi->pointcounts[i]== -1 ) CountCompositeMaxPts(sf->glyphs[gi->bygid[i]],gi); } } static void dumpcomposite(SplineChar *sc, struct glyphinfo *gi) { struct glyphhead gh; DBounds bb; int i, ptcnt, ctcnt, flags, sptcnt, rd; SplineSet *ss; RefChar *ref; SplineChar *isc = sc->ttf_instrs==NULL && sc->parent->mm!=NULL && sc->parent->mm->apple ? sc->parent->mm->normal->glyphs[sc->orig_pos] : sc; int arg1, arg2; if ( gi->next_glyph!=sc->ttf_glyph ) IError("Glyph count wrong in ttf output"); if ( gi->next_glyph>=gi->maxp->numGlyphs ) IError("max glyph count wrong in ttf output"); gi->loca[gi->next_glyph] = ftell(gi->glyphs); SplineCharLayerQuickBounds(sc,gi->layer,&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[gi->layer].refs; ref!=NULL; ref=ref->next, ++i ) { if ( ref->sc->ttf_glyph==-1 ) { /*if ( sc->layers[gi->layer].refs->next==NULL || any )*/ continue; } flags = 0; if ( ref->round_translation_to_grid ) flags |= _ROUND; if ( ref->use_my_metrics ) flags |= _USE_MY_METRICS; if ( ref->next!=NULL ) flags |= _MORE; /* More components */ else if ( isc->ttf_instrs_len!=0 ) /* Composits also inherit instructions */ flags |= _INSTR; /* Instructions appear after last ref */ if ( ref->transform[1]!=0 || ref->transform[2]!=0 ) flags |= _MATRIX; /* Need a full matrix */ else if ( ref->transform[0]!=ref->transform[3] ) flags |= _XY_SCALE; /* different xy scales */ else if ( ref->transform[0]!=1. ) flags |= _SCALE; /* xy scale is same */ if ( ref->point_match ) { arg1 = ref->match_pt_base; arg2 = ref->match_pt_ref; } else { arg1 = rint(ref->transform[4]); arg2 = rint(ref->transform[5]); flags |= _ARGS_ARE_XY|_UNSCALED_OFFSETS; /* The values I output are the values I want to see */ /* 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 ( arg1<-128 || arg1>127 || arg2<-128 || arg2>127 ) flags |= _ARGS_ARE_WORDS; putshort(gi->glyphs,flags); putshort(gi->glyphs,ref->sc->ttf_glyph==-1?0:ref->sc->ttf_glyph); if ( flags&_ARGS_ARE_WORDS ) { putshort(gi->glyphs,(short)arg1); putshort(gi->glyphs,(short)arg2); } else { putc((char) arg1,gi->glyphs); putc((char) arg2,gi->glyphs); } if ( flags&_MATRIX ) { 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&_XY_SCALE ) { put2d14(gi->glyphs,ref->transform[0]); put2d14(gi->glyphs,ref->transform[3]); } else if ( flags&_SCALE ) { put2d14(gi->glyphs,ref->transform[0]); } sptcnt = SSTtfNumberPoints(ref->layers[0].splines); for ( ss=ref->layers[0].splines; ss!=NULL ; ss=ss->next ) { ++ctcnt; } if ( sc->layers[gi->layer].order2 ) ptcnt += sptcnt; else if ( ptcnt>=0 && gi->pointcounts[ref->sc->ttf_glyph==-1?0:ref->sc->ttf_glyph]>=0 ) ptcnt += gi->pointcounts[ref->sc->ttf_glyph==-1?0:ref->sc->ttf_glyph]; else ptcnt = -1; rd = RefDepth(ref,gi->layer); if ( rd>gi->maxp->maxcomponentdepth ) gi->maxp->maxcomponentdepth = rd; } if ( isc->ttf_instrs_len!=0 ) dumpinstrs(gi,isc->ttf_instrs,isc->ttf_instrs_len); gi->pointcounts[gi->next_glyph++] = ptcnt; 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; SplineChar *isc = sc->ttf_instrs==NULL && sc->parent->mm!=NULL && sc->parent->mm->apple ? sc->parent->mm->normal->glyphs[sc->orig_pos] : sc; /* This must have been an error on my part, can't just remove points */ /* they might be matched to anchors or something */ /* 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[gi->layer].splines==NULL && sc->layers[gi->layer].refs==NULL ) { dumpspace(sc,gi); return; } if ( gi->next_glyph!=sc->ttf_glyph ) IError("Glyph count wrong in ttf output"); if ( gi->next_glyph>=gi->maxp->numGlyphs ) IError("max glyph count wrong in ttf output"); gi->loca[gi->next_glyph] = ftell(gi->glyphs); ttfss = SCttfApprox(sc,gi->layer); ptcnt = SSTtfNumberPoints(ttfss); for ( ss=ttfss, contourcnt=0; ss!=NULL; ss=ss->next ) { ++contourcnt; } origptcnt = ptcnt; SplineSetQuickBounds(ttfss,&bb); 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 = malloc(ptcnt*sizeof(BasePoint)); fs = malloc(ptcnt); ptcnt = contourcnt = 0; for ( ss=ttfss; ss!=NULL; ss=ss->next ) { ptcnt = SSAddPoints(ss,ptcnt,bp,fs); putshort(gi->glyphs,ptcnt-1); } if ( ptcnt!=origptcnt ) IError( "Point count wrong calculated=%d, actual=%d in %.20s", origptcnt, ptcnt, sc->name ); gi->pointcounts[gi->next_glyph++] = ptcnt; dumpinstrs(gi,isc->ttf_instrs,isc->ttf_instrs_len); dumppointarrays(gi,bp,fs,ptcnt); SplinePointListsFree(ttfss); free(bp); free(fs); ttfdumpmetrics(sc,gi,&bb); } void SFDummyUpCIDs(struct glyphinfo *gi,SplineFont *sf) { int i,j,k,max; int *bygid; max = 0; for ( k=0; ksubfontcnt; ++k ) if ( sf->subfonts[k]->glyphcnt>max ) max = sf->subfonts[k]->glyphcnt; if ( max == 0 ) return; sf->glyphs = calloc(max,sizeof(SplineChar *)); sf->glyphcnt = sf->glyphmax = max; for ( k=0; ksubfontcnt; ++k ) for ( i=0; isubfonts[k]->glyphcnt; ++i ) if ( sf->subfonts[k]->glyphs[i]!=NULL ) sf->glyphs[i] = sf->subfonts[k]->glyphs[i]; if ( gi==NULL ) return; bygid = malloc((sf->glyphcnt+3)*sizeof(int)); memset(bygid,0xff, (sf->glyphcnt+3)*sizeof(int)); j=1; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { if ( bygid[0]== -1 && strcmp(sf->glyphs[i]->name,".notdef")==0 ) { sf->glyphs[i]->ttf_glyph = 0; bygid[0] = i; } else if ( SCWorthOutputting(sf->glyphs[i])) { sf->glyphs[i]->ttf_glyph = j; bygid[j++] = i; } } gi->bygid = bygid; gi->gcnt = j; } static void AssignNotdefNull(SplineFont *sf,int *bygid, int iscff) { int i; /* The first three glyphs are magic, glyph 0 is .notdef */ /* glyph 1 is .null and glyph 2 is nonmarking return */ /* We may generate them automagically */ for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { if ( bygid[0]== -1 && strcmp(sf->glyphs[i]->name,".notdef")==0 ) { sf->glyphs[i]->ttf_glyph = 0; bygid[0] = i; } else if ( !iscff && bygid[1]== -1 && (strcmp(sf->glyphs[i]->name,".null")==0 || strcmp(sf->glyphs[i]->name,"uni0000")==0 || (i==1 && strcmp(sf->glyphs[1]->name,"glyph1")==0)) ) { sf->glyphs[i]->ttf_glyph = 1; bygid[1] = i; } else if ( !iscff && bygid[2]== -1 && (strcmp(sf->glyphs[i]->name,"nonmarkingreturn")==0 || strcmp(sf->glyphs[i]->name,"uni000D")==0 || (i==2 && strcmp(sf->glyphs[2]->name,"glyph2")==0)) ) { sf->glyphs[i]->ttf_glyph = 2; bygid[2] = i; } } } static int AssignTTFGlyph(struct glyphinfo *gi,SplineFont *sf,EncMap *map,int iscff) { int *bygid = malloc((sf->glyphcnt+3)*sizeof(int)); int i,j; memset(bygid,0xff, (sf->glyphcnt+3)*sizeof(int)); AssignNotdefNull(sf,bygid,iscff); j = iscff ? 1 : 3; for ( i=0; ienccount; ++i ) if ( map->map[i]!=-1 ) { SplineChar *sc = sf->glyphs[map->map[i]]; if ( SCWorthOutputting(sc) && sc->ttf_glyph==-1 #if HANYANG && (!iscff || !sc->compositionunit) #endif ) { sc->ttf_glyph = j; bygid[j++] = sc->orig_pos; } } for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { SplineChar *sc = sf->glyphs[i]; if ( SCWorthOutputting(sc) && sc->ttf_glyph==-1 #if HANYANG && (!iscff || !sc->compositionunit) #endif ) { sc->ttf_glyph = j; bygid[j++] = i; } } gi->bygid = bygid; gi->gcnt = j; return j; } static int dumpglyphs(SplineFont *sf,struct glyphinfo *gi) { int i; int fixed = gi->fixed_width; ff_progress_change_stages(2+gi->strikecnt); QuickBlues(sf,gi->layer,&gi->bd); /*FindBlues(sf,gi->blues,NULL);*/ ff_progress_next_stage(); if ( !gi->onlybitmaps ) { if ( sf->layers[gi->layer].order2 ) for ( i=0; iglyphcnt; ++i ) { SplineChar *sc = sf->glyphs[i]; if ( SCWorthOutputting(sc) ) if ( !SCPointsNumberedProperly(sc,gi->layer)) { free(sc->ttf_instrs); sc->ttf_instrs = NULL; sc->ttf_instrs_len = 0; SCNumberPoints(sc,gi->layer); } } } gi->maxp->numGlyphs = gi->gcnt; gi->loca = malloc((gi->maxp->numGlyphs+1)*sizeof(uint32)); gi->pointcounts = malloc((gi->maxp->numGlyphs+1)*sizeof(int32)); memset(gi->pointcounts,-1,(gi->maxp->numGlyphs+1)*sizeof(int32)); gi->next_glyph = 0; gi->glyphs = tmpfile2(); gi->hmtx = tmpfile2(); if ( sf->hasvmetrics ) gi->vmtx = tmpfile2(); FigureFullMetricsEnd(sf,gi,true); if ( fixed>0 ) { gi->lasthwidth = 3; gi->hfullcnt = 3; } for ( i=0; igcnt; ++i ) { if ( i==0 ) { if ( gi->bygid[0]!=-1 && (fixed<=0 || sf->glyphs[gi->bygid[0]]->width==fixed)) dumpglyph(sf->glyphs[gi->bygid[0]],gi); else dumpmissingglyph(sf,gi,fixed); } else if ( i<=2 && gi->bygid[i]==-1 ) dumpblankglyph(gi,sf,fixed); else if ( gi->onlybitmaps ) { if ( gi->bygid[i]!=-1 && sf->glyphs[gi->bygid[i]]->ttf_glyph>0 ) dumpspace(sf->glyphs[gi->bygid[i]],gi); } else { if ( gi->bygid[i]!=-1 && sf->glyphs[gi->bygid[i]]->ttf_glyph>0 ) { if ( IsTTFRefable(sf->glyphs[gi->bygid[i]],gi->layer) ) dumpcomposite(sf->glyphs[gi->bygid[i]],gi); else dumpglyph(sf->glyphs[gi->bygid[i]],gi); } } if ( (ftell(gi->glyphs)&3) != 0 ) { /* Apple says glyphs must be 16bit aligned */ if ( ftell(gi->glyphs)&1 ) putc('\0',gi->glyphs); /* MS says glyphs should be 32bit aligned */ if ( ftell(gi->glyphs)&2 ) putshort(gi->glyphs,0); } if ( !ff_progress_next()) 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 (instead of pointing to right after the table)*/ /* Sigh. But if I do that, it complains that there's extra stuff in the */ /* glyph table. There's just no pleasing them */ /* 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); } if ( !sf->layers[gi->layer].order2 ) RefigureCompositeMaxPts(sf,gi); free(gi->pointcounts); return( true ); } static int storesid(struct alltabs *at,const char *str) { int i; FILE *news; const 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 = tmpfile2(); 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; else n = 0; /* Should never happen */ 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; if ( *pt=='[' ) ++pt; /* For StdHW, StdVW */ 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(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 = calloc(at->gi.gcnt,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 */ for ( i=1; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 && SCWorthOutputting(sf->glyphs[at->gi.bygid[i]])) { at->gn_sid[i] = storesid(at,sf->glyphs[at->gi.bygid[i]]->name); putshort(at->charset,at->gn_sid[i]); } } static void dumpcffcidset(struct alltabs *at) { int gid, start; putc(2,at->charset); start = -1; /* Glyph 0 always maps to CID 0, and is omitted */ for ( gid = 1; gidgi.gcnt; ++gid ) { if ( start==-1 ) start = gid; else if ( at->gi.bygid[gid]-at->gi.bygid[start]!=gid-start ) { putshort(at->charset,at->gi.bygid[start]); putshort(at->charset,at->gi.bygid[gid-1]-at->gi.bygid[start]); start = gid; } } if ( start!=-1 ) { putshort(at->charset,at->gi.bygid[start]); putshort(at->charset,at->gi.bygid[gid-1]-at->gi.bygid[start]); } } static void dumpcfffdselect(SplineFont *sf,struct alltabs *at) { int cid, k, lastfd, cnt; int gid; putc(3,at->fdselect); putshort(at->fdselect,0); /* number of ranges, fill in later */ for ( k=0; ksubfontcnt; ++k ) if ( SCWorthOutputting(sf->subfonts[k]->glyphs[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 ( gid = 1; gidgi.gcnt; ++gid ) { cid = at->gi.bygid[gid]; for ( k=0; ksubfontcnt; ++k ) { if ( cidsubfonts[k]->glyphcnt && SCWorthOutputting(sf->subfonts[k]->glyphs[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; } } } 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, cnt, anydups; uint32 start_pos = ftell(at->encoding); SplineChar *sc; EncMap *map = at->map; putc(0,at->encoding); /* I always use a format 0 encoding. ie. an array of glyph indexes */ putc(0xff,at->encoding); /* fixup later */ for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->ticked = false; cnt = 0; anydups = 0; for ( i=0; i<256 && ienccount; ++i ) if ( map->map[i]!=-1 && (sc=sf->glyphs[map->map[i]])!=NULL ) { if ( sc->ttf_glyph>255 ) continue; if ( sc->ticked ) { ++anydups; } else if ( sc->ttf_glyph>0 ) { if ( cnt>=255 ) break; putc(i,at->encoding); ++cnt; sc->ticked = true; } } if ( anydups ) { fseek(at->encoding,start_pos,SEEK_SET); putc(0x80,at->encoding); putc(cnt,at->encoding); fseek(at->encoding,0,SEEK_END); putc(anydups,at->encoding); for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->ticked = false; for ( i=0; i<256 && ienccount; ++i ) if ( map->map[i]!=-1 && (sc=sf->glyphs[map->map[i]])!=NULL ) { if ( sc->ttf_glyph>255 ) continue; if ( sc->ticked ) { putc(i,at->encoding); putshort(at->encoding,at->gn_sid[sc->ttf_glyph]); } sc->ticked = true; } } else { fseek(at->encoding,start_pos+1,SEEK_SET); putc(cnt,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 ) { /* presumably offsets are unsigned. But the docs don't state this in the obvious place */ 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 ( ptglyphcnt; ++i ) if ( SCWorthOutputting(sf->glyphs[i]) ) { if ( maxwglyphs[i]->width ) maxw = sf->glyphs[i]->width; if ( sameval == 0x8000000 ) sameval = sf->glyphs[i]->width; else if ( sameval!=sf->glyphs[i]->width ) allsame = false; } if ( allsame ) { nomwid = defwid = sameval; } else { ++maxw; if ( maxw>65535 ) maxw = 3*(sf->ascent+sf->descent); widths = calloc(maxw,sizeof(uint16)); cumwid = calloc(maxw,sizeof(uint32)); defwid = 0; cnt=0; for ( i=0; iglyphcnt; ++i ) if ( SCWorthOutputting(sf->glyphs[i]) && sf->glyphs[i]->width>=0 && sf->glyphs[i]->widthglyphs[i]->width] > cnt ) { defwid = sf->glyphs[i]->width; cnt = widths[defwid]; } widths[defwid] = 0; for ( i=0; i=0 && i+jdefwid = defwid; else at->fds[subfont].defwid = defwid; if ( subfont==-1 ) at->nomwid = nomwid; else at->fds[subfont].nomwid = nomwid; } static void dumpcffprivate(SplineFont *sf,struct alltabs *at,int subfont, int subrcnt) { char *pt; FILE *private = subfont==-1?at->private: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; EncMap *map = at->map; double bluescale; /* The private dict is not in an index, so no index header. Just the data */ if ( subfont==-1 ) defwid = at->defwid; else defwid = at->fds[subfont].defwid; dumpintoper(private,defwid,20); /* Default Width */ if ( subfont==-1 ) nomwid = at->nomwid; else nomwid = at->fds[subfont].nomwid; dumpintoper(private,nomwid,21); /* Nominative Width */ bs = SplineFontIsFlexible(sf,at->gi.layer,at->gi.flags); hasblue = PSDictHasEntry(sf->private,"BlueValues")!=NULL; hash = PSDictHasEntry(sf->private,"StdHW")!=NULL; hasv = PSDictHasEntry(sf->private,"StdVW")!=NULL; ff_progress_change_stages(2+autohint_before_generate+!hasblue); if ( autohint_before_generate ) { ff_progress_change_line1(_("Auto Hinting Font...")); SplineFontAutoHint(sf,at->gi.layer); ff_progress_next_stage(); } otherblues[0] = otherblues[1] = bluevalues[0] = bluevalues[1] = 0; if ( !hasblue ) { FindBlues(sf,at->gi.layer,bluevalues,otherblues); ff_progress_next_stage(); } stdhw[0] = stdvw[0] = 0; if ( !hash ) { FindHStems(sf,stemsnaph,snapcnt); mi = -1; for ( i=0; i<12 && stemsnaph[i]!=0; ++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; i<12 && stemsnapv[i]!=0; ++i ) if ( mi==-1 ) mi = i; else if ( snapcnt[i]>snapcnt[mi] ) mi = i; if ( mi!=-1 ) stdvw[0] = stemsnapv[mi]; } ff_progress_change_line1(_("Saving OpenType Font")); 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); bluescale = BlueScaleFigure(sf->private,bluevalues,otherblues); if ( (pt=PSDictHasEntry(sf->private,"FamilyOtherBlues"))!=NULL ) DumpStrArray(pt,private,9); if ( (pt=PSDictHasEntry(sf->private,"BlueScale"))!=NULL ) DumpStrDouble(pt,private,(12<<8)+9); else if ( bluescale!=-1 ) dumpdbloper(private,bluescale,(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 ( map==NULL ) /* Do Nothing */; else if ( map->enc->is_japanese || map->enc->is_korean || map->enc->is_tradchinese || map->enc->is_simplechinese ) dumpintoper(private,1,(12<<8)|17); if ( (pt=PSDictHasEntry(sf->private,"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>0 ) 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); if ( sf->strokedfont ) { dumpintoper(cfff,2,(12<<8)|5); dumpdbloper(cfff,sf->strokewidth,(12<<8)|8); } /* 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 && sf->use_uniqueid ) dumpintoper(cfff, sf->uniqueid?sf->uniqueid:4000000 + (rand()&0x3ffff), 13 ); SplineFontLayerFindBounds(sf,at->gi.layer,&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 && sf->use_xuid ) { pt = sf->xuid; if ( *pt=='[' ) ++pt; while ( *pt && *pt!=']' ) { dumpint(cfff,strtol(pt,&end,10)); if ( pt==end ) /* garbage in XUID */ break; 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 ) IError("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]->glyphcnt>cidcnt ) cidcnt = sf->subfonts[k]->glyphcnt; 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); if ( sf->use_uniqueid ) 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, so we omit it */ CIDLayerFindBounds(sf,at->gi.layer,&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 && sf->use_xuid ) { 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); } /* Acrobat doesn't seem to care about a private dict here. Ghostscript */ /* dies. Tech Note: 5176.CFF.PDF, top of page 23 says: */ /* A Private DICT is required, but may be specified as having */ /* a length of 0 if there are no non-default values to be stored*/ /* No indication >where< it is required. I assumed everywhere. Perhaps */ /* just in basefonts? */ /* Omit it. */ /* 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 int isStdEncoding(SplineFont *sf,EncMap *map) { int i; for ( i=0; i<256 && ienccount; ++i ) if ( map->map[i]!=-1 && sf->glyphs[map->map[i]]!=NULL ) if ( sf->glyphs[map->map[i]]->unicodeenc!=-1 ) if ( sf->glyphs[map->map[i]]->unicodeenc!=unicode_from_adobestd[i] ) return( 0 ); return( 1 ); } 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 && !isStdEncoding(sf,at->map)); 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,"CFF-StringBase")) at->error = true; if ( !ttfcopyfile(at->cfff,at->sidf,base+shlen,"CFF-StringData")) at->error = true; } /* Global Subrs */ putshort(at->cfff,0); /* Charset */ if ( !ttfcopyfile(at->cfff,at->charset,base+strlen+glen,"CFF-Charset")) at->error = true; /* Encoding */ if ( !ttfcopyfile(at->cfff,at->encoding,base+strlen+glen+csetlen,"CFF-Encoding")) at->error = true; /* Char Strings */ if ( !ttfcopyfile(at->cfff,at->charstrings,base+strlen+glen+csetlen+enclen,"CFF-CharStrings")) at->error = true; /* Private & Subrs */ if ( !ttfcopyfile(at->cfff,at->private,base+strlen+glen+csetlen+enclen+cstrlen,"CFF-Private")) 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 = ftell(at->globalsubrs); /* 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,"CFF-StringBase")) at->error = true; if ( !ttfcopyfile(at->cfff,at->sidf,base+shlen,"CFF-StringData")) at->error = true; } /* Global Subrs */ if ( !ttfcopyfile(at->cfff,at->globalsubrs,base+strlen,"CFF-GlobalSubrs")) at->error = true; /* Charset */ if ( !ttfcopyfile(at->cfff,at->charset,base+strlen+glen,"CFF-Charset")) at->error = true; /* FDSelect */ if ( !ttfcopyfile(at->cfff,at->fdselect,base+strlen+glen+csetlen,"CFF-FDSelect")) at->error = true; /* Char Strings */ if ( !ttfcopyfile(at->cfff,at->charstrings,base+strlen+glen+csetlen+fdsellen,"CFF-CharStrings")) at->error = true; /* FDArray (DICT Index) */ if ( !ttfcopyfile(at->cfff,at->fdarray,base+strlen+glen+csetlen+fdsellen+cstrlen,"CFF-FDArray")) 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,"CFF-PrivateSubrs")) 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 = tmpfile2(); if ( dovmetrics ) at->gi.vmtx = tmpfile2(); FigureFullMetricsEnd(sf,&at->gi,bitmaps); /* Bitmap fonts use ttf convention of 3 magic glyphs */ if ( at->gi.bygid[0]!=-1 && (sf->glyphs[at->gi.bygid[0]]->width==width || width<=0 )) { putshort(at->gi.hmtx,sf->glyphs[at->gi.bygid[0]]->width); SplineCharLayerFindBounds(sf->glyphs[at->gi.bygid[0]],at->gi.layer,&b); putshort(at->gi.hmtx,b.minx); if ( dovmetrics ) { putshort(at->gi.vmtx,sf->glyphs[at->gi.bygid[0]]->vwidth); putshort(at->gi.vmtx,/*sf->vertical_origin-*/b.miny); } } else { putshort(at->gi.hmtx,width<=0?(sf->ascent+sf->descent)/2: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<=0 ) 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; } for ( i=cnt; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { sc = sf->glyphs[at->gi.bygid[i]]; if ( SCWorthOutputting(sc) ) { if ( i<=at->gi.lasthwidth ) putshort(at->gi.hmtx,sc->width); SplineCharLayerFindBounds(sc,at->gi.layer,&b); putshort(at->gi.hmtx,b.minx); if ( dovmetrics ) { if ( i<=at->gi.lastvwidth ) 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 = tmpfile2(); if ( dovmetrics ) at->gi.vmtx = tmpfile2(); FigureFullMetricsEnd(_sf,&at->gi,false); max = 0; for ( i=0; i<_sf->subfontcnt; ++i ) if ( max<_sf->subfonts[i]->glyphcnt ) max = _sf->subfonts[i]->glyphcnt; for ( cid = 0; cidsubfontcnt; ++i ) { sf = _sf->subfonts[i]; if ( cidglyphcnt && SCWorthOutputting(sf->glyphs[cid])) break; } if ( i!=_sf->subfontcnt ) { sc = sf->glyphs[cid]; if ( sc->ttf_glyph<=at->gi.lasthwidth ) putshort(at->gi.hmtx,sc->width); SplineCharLayerFindBounds(sc,at->gi.layer,&b); putshort(at->gi.hmtx,b.minx); if ( dovmetrics ) { if ( sc->ttf_glyph<=at->gi.lastvwidth ) putshort(at->gi.vmtx,sc->vwidth); putshort(at->gi.vmtx,/*sf->vertical_origin-*/b.maxy); } ++cnt; if ( sc->ttf_glyph==at->gi.lasthwidth ) at->gi.hfullcnt = cnt; if ( sc->ttf_glyph==at->gi.lastvwidth ) at->gi.vfullcnt = cnt; } else if ( cid==0 ) { /* Create a dummy entry for .notdef */ sf = _sf->subfonts[0]; 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, *chrs; at->cfff = tmpfile2(); at->sidf = tmpfile2(); at->sidh = tmpfile2(); at->charset = tmpfile2(); at->encoding = tmpfile2(); at->private = tmpfile2(); dumpcffheader(at->cfff); dumpcffnames(sf,at->cfff); dumpcffcharset(sf,at); ff_progress_change_stages(2+at->gi.strikecnt); ATFigureDefWidth(sf,at,-1); if ((chrs =SplineFont2ChrsSubrs2(sf,at->nomwid,at->defwid,at->gi.bygid,at->gi.gcnt,at->gi.flags,&subrs,at->gi.layer))==NULL ) return( false ); dumpcffprivate(sf,at,-1,subrs->next); if ( subrs->next!=0 ) _dumpcffstrings(at->private,subrs); ff_progress_next_stage(); at->charstrings = dumpcffstrings(chrs); PSCharsFree(subrs); if ( at->charstrings == NULL ) return( false ); if ( at->format==ff_cff && !isStdEncoding(sf,at->map)) 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); free(at->gn_sid); at->gn_sid=NULL; return( true ); } static int dumpcidglyphs(SplineFont *sf,struct alltabs *at) { int i; struct pschars *glbls = NULL, *chrs; at->cfff = tmpfile2(); at->sidf = tmpfile2(); at->sidh = tmpfile2(); at->charset = tmpfile2(); at->fdselect = tmpfile2(); at->fdarray = tmpfile2(); at->globalsubrs = tmpfile2(); at->fds = calloc(sf->subfontcnt,sizeof(struct fd2data)); for ( i=0; isubfontcnt; ++i ) { at->fds[i].private = tmpfile2(); ATFigureDefWidth(sf->subfonts[i],at,i); } if ( (chrs = CID2ChrsSubrs2(sf,at->fds,at->gi.flags,&glbls,at->gi.layer))==NULL ) return( false ); for ( i=0; isubfontcnt; ++i ) { 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); PSCharsFree(at->fds[i].subrs); } _dumpcffstrings(at->globalsubrs,glbls); PSCharsFree(glbls); dumpcffheader(at->cfff); dumpcffnames(sf,at->cfff); dumpcffcidset(at); dumpcfffdselect(sf,at); dumpcffdictindex(sf,at); if ( (at->charstrings = dumpcffstrings(chrs))==NULL ) return( false ); 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 AnyInstructions(SplineFont *sf) { int i; if ( sf->subfontcnt!=0 ) { for ( i=0; isubfontcnt; ++i ) if ( AnyInstructions(sf->subfonts[i])) return( true ); } else { for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { if ( sf->glyphs[i]->ttf_instrs_len!=0 ) return( true ); } } return( false ); } void cvt_unix_to_1904( long long time, int32 result[2]) { uint32 date1970[4], tm[4]; uint32 year[2]; int i; tm[0] = time &0xffff; tm[1] = (time>>16)&0xffff; tm[2] = (time>>32)&0xffff; tm[3] = (time>>48)&0xffff; memset(date1970,0,sizeof(date1970)); year[0] = (60*60*24*365L)&0xffff; year[1] = (60*60*24*365L)>>16; for ( i=1904; i<1970; ++i ) { date1970[0] += year[0]; date1970[1] += year[1]; if ( (i&3)==0 && (i%100!=0 || i%400==0)) date1970[0] += 24*60*60L; /* Leap year */ date1970[1] += (date1970[0]>>16); date1970[0] &= 0xffff; date1970[2] += date1970[1]>>16; date1970[1] &= 0xffff; date1970[3] += date1970[2]>>16; date1970[2] &= 0xffff; } for ( i=0; i<3; ++i ) { tm[i] += date1970[i]; tm[i+1] += tm[i]>>16; tm[i] &= 0xffff; } tm[3] -= date1970[3]; result[0] = (tm[1]<<16) | tm[0]; result[1] = (tm[3]<<16) | tm[2]; } static void sethead(struct head *head,SplineFont *sf,struct alltabs *at, enum fontformat format, int32 *bsizes) { int i, lr, rl, indic_rearrange, arabic; ASM *sm; struct ttflangname *useng; float vn; 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; } head->xmin = at->gi.xmin; head->ymin = at->gi.ymin; head->xmax = at->gi.xmax; head->ymax = at->gi.ymax; lr = rl = arabic = 0; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { SplineChar *sc = sf->glyphs[at->gi.bygid[i]]; int uni = sc->unicodeenc ; if ( SCRightToLeft(sc) ) rl = 1; else if (( uni!=-1 && uni<0x10000 && islefttoright(uni)) || (uni>=0x10300 && uni<0x107ff)) lr = 1; if ( SCScriptFromUnicode(sc)==CHR('a','r','a','b') ) arabic = 1; } head->version = 0x00010000; head->revision = sf->sfntRevision; if ( sf->sfntRevision==sfntRevisionUnset ) { head->revision = 0x00010000; for ( useng=sf->names; useng!=NULL; useng=useng->next ) if ( useng->lang==0x409 ) break; if ( useng!=NULL && useng->names[ttf_version]!=NULL && sscanf(useng->names[ttf_version], "Version %f", &vn)==1 ) { head->revision = vn*65536; } else if ( sf->subfontcnt!=0 ) { int val, mant; val = floor(sf->cidversion); mant = floor(65536.*((double)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 = 8|2|1; /* baseline at 0, lsbline at 0, round ppem */ if ( format>=ff_ttf && format<=ff_ttfdfont ) { if ( AnyInstructions(sf) ) head->flags = 0x10|8|4|2|1; /* baseline at 0, lsbline at 0, round ppem, instructions may depend on point size, instructions change metrics */ } /* If a font contains embedded bitmaps, and if some of those bitmaps have */ /* a different advance width from that expected by scaling, then windows */ /* will only notice the fact if the 0x10 bit is set (even though this has*/ /* nothing to do with instructions) */ /* Apple flags */ if ( sf->hasvmetrics ) head->flags |= (1<<5); /* designed to be layed out vertically */ /* Bit 6 must be zero */ if ( arabic ) head->flags |= (1<<7); if ( sf->sm ) head->flags |= (1<<8); /* has metamorphesis effects */ if ( rl ) head->flags |= (1<<9); indic_rearrange = 0; for ( sm = sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type == asm_indic ) indic_rearrange = true; if ( indic_rearrange ) head->flags |= (1<<10); /* End apple flags */ if ( sf->head_optimized_for_cleartype ) head->flags |= (1<<13); head->emunits = sf->ascent+sf->descent; head->macstyle = MacStyleCode(sf,NULL); head->lowestreadable = 8; head->locais32 = 1; if ( at->gi.glyph_len<0x20000 ) head->locais32 = 0; /* 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 */ cvt_unix_to_1904(sf->creationtime,head->createtime); cvt_unix_to_1904(sf->modificationtime,head->modtime); } 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; DBounds bb; /* 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; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { SplineChar *sc = sf->glyphs[at->gi.bygid[i]]; SplineCharLayerFindBounds(sc,at->gi.layer,&bb); if ( sc->width>width ) width = sc->width; if ( sc->vwidth>height ) height = sc->vwidth; if ( sc->width-bb.maxx < rbearing ) rbearing = sc->width-bb.maxx; if ( sc->vwidth-bb.maxy < bbearing ) bbearing = sc->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; } if ( at->head.ymax>ymax ) ymax = at->head.ymax; /* If generated .notdef glyph is bigger than real glyphs */ if ( at->head.yminhead.ymin; if ( ymax==0 && ymin==0 ) { /* this can happen in a bitmap only font */ ymax = sf->ascent; ymin = -sf->descent; } hhead->version = 0x00010000; if ( sf->pfminfo.hheadascent_add ) hhead->ascender = ymax + sf->pfminfo.hhead_ascent; else hhead->ascender = sf->pfminfo.hhead_ascent; if ( sf->pfminfo.hheaddescent_add ) hhead->descender = ymin + sf->pfminfo.hhead_descent; else hhead->descender = sf->pfminfo.hhead_descent; 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>0; hhead->maxwidth = width; hhead->minlsb = at->head.xmin; hhead->minrsb = rbearing; /* Apple's ftxvalidator says 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; if ( sf->italicangle==0 ) hhead->caretSlopeRise = 1; else { hhead->caretSlopeRise = 100; hhead->caretSlopeRun = (int) rint(100*tan(-sf->italicangle*3.1415926535897/180.)); } vhead->maxwidth = height; vhead->minlsb = at->head.ymin; vhead->minrsb = bbearing; vhead->maxextent = at->head.ymax; vhead->caretSlopeRise = 0; vhead->caretSlopeRun = 1; /* Are there vertical oblique fonts? */ hhead->numMetrics = at->gi.hfullcnt; vhead->numMetrics = at->gi.vfullcnt; } 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; pfminfo->winascent_add = pfminfo->windescent_add = true; pfminfo->hheadascent_add = pfminfo->hheaddescent_add = true; pfminfo->typoascent_add = pfminfo->typodescent_add = true; pfminfo->os2_winascent = pfminfo->os2_windescent = 0; if ( sf->subfonts!=NULL ) sf = sf->subfonts[0]; pfminfo->linegap = pfminfo->vlinegap = pfminfo->os2_typolinegap = rint(.09*(sf->ascent+sf->descent)); } void SFDefaultOS2SubSuper(struct pfminfo *pfminfo,int emsize,double italic_angle) { double s = sin(italic_angle*3.1415926535897932/180.0); pfminfo->os2_supysize = pfminfo->os2_subysize = .7*emsize; pfminfo->os2_supxsize = pfminfo->os2_subxsize = .65*emsize; pfminfo->os2_subyoff = .14*emsize; pfminfo->os2_supyoff = .48*emsize; pfminfo->os2_supxoff = s*pfminfo->os2_supyoff; pfminfo->os2_subxoff = -s*pfminfo->os2_subyoff; pfminfo->os2_strikeysize = 102*emsize/2048; pfminfo->os2_strikeypos = 530*emsize/2048; } void SFDefaultOS2Info(struct pfminfo *pfminfo,SplineFont *sf,char *fontname) { int samewid= -1; char *weight = sf->cidmaster==NULL ? sf->weight : sf->cidmaster->weight; if ( sf->pfminfo.pfmset ) { if ( pfminfo!=&sf->pfminfo ) *pfminfo = sf->pfminfo; if ( !pfminfo->panose_set ) { struct pfminfo info; memset(&info,0,sizeof(info)); sf->pfminfo.pfmset = false; SFDefaultOS2Info(&info,sf,fontname); sf->pfminfo.pfmset = true; memcpy(pfminfo->panose,info.panose,sizeof(info.panose)); } } else { struct pfminfo hold; if ( pfminfo->hheadset || pfminfo->vheadset ) hold = *pfminfo; else hold.hheadset = hold.vheadset = false; memset(pfminfo,'\0',sizeof(*pfminfo)); SFDefaultOS2Simple(pfminfo,sf); samewid = CIDOneWidth(sf); pfminfo->pfmfamily = 0x10; if ( samewid>0 ) { pfminfo->pfmfamily = 0x30; /* pfminfo->panose[3] = 9; */ /* This is done later */ } 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; if ( hold.hheadset ) { pfminfo->hheadset = true; pfminfo->hheadascent_add = hold.hheadascent_add; pfminfo->hheaddescent_add = hold.hheaddescent_add; pfminfo->hhead_ascent = hold.hhead_ascent; pfminfo->hhead_descent = hold.hhead_descent; pfminfo->linegap = hold.linegap; } if ( hold.vheadset ) { pfminfo->vheadset = true; pfminfo->vlinegap = hold.vlinegap; } } if ( !pfminfo->subsuper_set ) SFDefaultOS2SubSuper(pfminfo,sf->ascent+sf->descent,sf->italicangle); } int AlreadyMSSymbolArea(SplineFont *sf,EncMap *map) { int i; int acnt=0, pcnt=0; for ( i=0; ienccount && i<0xffff; ++i ) { if ( map->map[i]!=-1 && sf->glyphs[map->map[i]]!=NULL && sf->glyphs[map->map[i]]->ttf_glyph!=-1 ) { if ( i>=0xf000 && i<=0xf0ff ) ++pcnt; else if ( i>=0x20 && i<=0xff ) ++acnt; } } return( pcnt>acnt ); } void OS2FigureCodePages(SplineFont *sf, uint32 CodePage[2]) { int i; uint32 latin1[8]; int has_ascii, has_lineart=0, has_radical=0, has_summation=0; int cp852=0, cp775=0, cp861=0, cp860=0, cp857=0, cp855=0, cp862=0, cp863=0; int cp864=0, cp865=0, cp866=0, cp869=0, cp737=0, cp708=0, mac=0; int k; SplineChar *sc; SplineFont *sub; memset(latin1,0,sizeof(latin1)); k=0; do { sub = ksubfontcnt? sf->subfonts[k] : sf; for ( i=0; iglyphcnt; ++i ) if ( (sc = sub->glyphs[i])!=NULL ) { if ( sc->unicodeenc<256 && sc->unicodeenc>=0 ) latin1[(sc->unicodeenc>>5)] |= 1<<(sc->unicodeenc&31); } ++k; } while ( ksubfontcnt ); has_ascii = latin1[1]==0xffffffff && latin1[2]==0xffffffff && (latin1[3]&0x7fffffff)==0x7fffffff; /* DEL is not a char */ CodePage[0] = CodePage[1] = 0; k=0; do { sub = ksubfontcnt? sf->subfonts[k] : sf; for ( i=0; iglyphcnt; ++i ) if ( (sc = sub->glyphs[i])!=NULL ) { int uni = sc->unicodeenc; if ( uni==0xde && has_ascii ) CodePage[0] |= 1<<0; /* (ANSI) Latin1 */ else if ( uni==0x255a && has_ascii ) { CodePage[1] |= 1U<<30; /* WE/latin1 */ /* Not latin1 at all */ CodePage[1] |= 1U<<31; /* US */ } else if ( uni==0x13d && has_ascii ) { CodePage[0] |= 1<<1; /* latin2 */ ++cp852; } else if ( uni==0x411 ) { CodePage[0] |= 1<<2; /* cyrillic */ ++cp866; ++cp855; } else if ( uni==0x405 ) { ++cp855; } else if ( uni==0x386 ) { CodePage[0] |= 1<<3; /* greek */ ++cp869; ++cp737; } else if ( uni==0x130 && has_ascii ) { CodePage[0] |= 1<<4; /* turkish */ ++cp857; } else if ( uni==0x5d0 ) { CodePage[0] |= 1<<5; /* hebrew */ ++cp862; } else if ( uni==0x631 ) { CodePage[0] |= 1<<6; /* arabic */ ++cp864; ++cp708; } else if ( uni==0x157 && has_ascii ) { CodePage[0] |= 1<<7; /* baltic */ ++cp775; } else if ( uni==0x20AB && has_ascii ) { CodePage[0] |= 1<<8; /* vietnamese */ } else if ( uni==0xe45 ) CodePage[0] |= 1<<16; /* thai */ else if ( uni==0x30a8 ) CodePage[0] |= 1<<17; /* japanese */ else if ( uni==0x3105 ) CodePage[0] |= 1<<18; /* simplified chinese */ else if ( uni==0x3131 ) CodePage[0] |= 1<<19; /* korean wansung */ else if ( uni==0x592E ) CodePage[0] |= 1<<20; /* traditional chinese */ else if ( uni==0xacf4 ) CodePage[0] |= 1<<21; /* korean Johab */ else if ( uni==0x2030 && has_ascii ) ++mac; else if ( uni==0x2665 && has_ascii ) CodePage[0] |= 1U<<30; /* OEM */ /* the symbol bit doesn't mean it contains the glyphs in symbol */ /* rather that one is using a symbol encoding. Or that there are */ /* glyphs with unicode encoding between 0xf000 and 0xf0ff, in which */ /* case those guys should be given a symbol encoding */ /* There's a bug in the way otf fonts handle this (but not ttf) and */ /* they only seem to list the symbol glyphs. */ /* Hence we don't test uni==0x21d4 */ /* This doesn't work well either. In ttf fonts the bit is ignored */ /* in otf fonts the bit means "ignore all other bits" */ else if ( uni>=0xf000 && uni<=0xf0ff ) CodePage[0] |= 1U<<31; /* symbol */ else if ( uni==0xc5 && has_ascii ) ++cp865; else if ( uni==0xe9 && has_ascii ) ++cp863; else if ( uni==0xf5 && has_ascii ) ++cp860; else if ( uni==0xfe && has_ascii ) ++cp861; else if ( uni==0x2524 ) ++has_lineart; else if ( uni==0x255c ) ++cp866; else if ( uni==0xbd ) ++cp869; else if ( uni==0x221A ) has_radical=true; else if ( uni==0x2211 ) has_summation=true; } ++k; } while ( ksubfontcnt ); if ( cp852 && has_lineart ) CodePage[1] |= 1<<26; /* latin2 */ if ( cp775 && has_lineart ) CodePage[1] |= 1<<27; /* baltic */ if ( cp861 && has_lineart ) CodePage[1] |= 1<<22; /* MS-DOS Icelandic */ if ( cp866==2 && has_lineart ) CodePage[1] |= 1<<17; /* MS DOS Russian */ if ( cp855==2 && has_lineart ) CodePage[1] |= 1<<25; /* IBM Cyrillic */ if ( cp869==2 && has_lineart ) CodePage[1] |= 1<<16; /* IBM Greek */ if ( cp737 && has_lineart && has_radical ) CodePage[1] |= 1<<28; /* Greek, former 437 G */ if ( cp857 && has_lineart ) CodePage[1] |= 1<<24; /* IBM turkish */ if ( cp862 && has_lineart && has_radical ) CodePage[1] |= 1<<21; /* hebrew */ if ( cp864 && has_radical ) CodePage[1] |= 1<<19; /* arabic */ if ( cp708 && has_lineart) CodePage[1] |= 1<<29; /* arabic; ASMO 708 */ if ( cp863 && has_lineart && has_radical ) CodePage[1] |= 1<<20; /* MS-DOS Canadian French */ if ( cp865 && has_lineart && has_radical ) CodePage[1] |= 1<<18; /* MS-DOS Nordic */ if ( cp860 && has_lineart && has_radical ) CodePage[1] |= 1<<23; /* MS-DOS Portuguese */ if ( mac && has_summation ) CodePage[0] |= 1U<<29; /* mac roman */ } void OS2FigureUnicodeRanges(SplineFont *sf, uint32 Ranges[4]) { int i, k; unsigned j; SplineChar *sc; SplineFont *sub; memset(Ranges,0,4*sizeof(uint32)); k=0; do { sub = ksubfontcnt? sf->subfonts[k] : sf; for ( i=0; iglyphcnt; ++i ) if ( (sc = sub->glyphs[i])!=NULL ) { if ( SCWorthOutputting(sc) && sc->unicodeenc!=-1 ) { if ( sc->unicodeenc > 0xffff ) Ranges[57>>5] |= (1<<(57&31)); for ( j=0; junicodeenc>=uniranges[j][0] && sc->unicodeenc<=uniranges[j][1] ) { int bit = uniranges[j][2]; Ranges[bit>>5] |= (1<<(bit&31)); break; } } } ++k; } while ( ksubfontcnt ); } 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 */ /* Well, that's what is documented, but the documentation says contradictory */ /* things. I believe that winAscent should be the same as hhea.ascent */ *winascent = at->head.ymax; *windescent = -at->head.ymin; /* Should be positive */ if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; if ( sf->pfminfo.winascent_add ) *winascent += sf->pfminfo.os2_winascent; else *winascent = sf->pfminfo.os2_winascent; if ( sf->pfminfo.windescent_add ) *windescent += sf->pfminfo.os2_windescent; else *windescent = sf->pfminfo.os2_windescent; } static void redohead(struct alltabs *at); static void setos2(struct os2 *os2,struct alltabs *at, SplineFont *sf, enum fontformat format) { int i,cnt1,cnt2,first,last,avg1,avg2,gid; char *pt; static int const weightFactors[26] = { 64, 14, 27, 35, 100, 20, 14, 42, 63, 3, 6, 35, 20, 56, 56, 17, 4, 49, 56, 71, 31, 10, 18, 3, 18, 2 }; EncMap *map; SplineChar *sc; int modformat = format; os2->version = 1; if ( format==ff_otf || format==ff_otfcid ) os2->version = 3; if ( sf->use_typo_metrics || sf->weight_width_slope_only ) os2->version = 4; if ( sf->os2_version > os2->version ) os2->version = sf->os2_version; if (( format>=ff_ttf && format<=ff_otfdfont) && (at->gi.flags&ttf_flag_symbol)) modformat = ff_ttfsym; os2->weightClass = sf->pfminfo.weight; os2->widthClass = sf->pfminfo.width; os2->fstype = 0x8; if ( sf->pfminfo.fstype!=-1 ) os2->fstype = sf->pfminfo.fstype; if ( !sf->pfminfo.subsuper_set ) SFDefaultOS2SubSuper(&sf->pfminfo,sf->ascent+sf->descent,sf->italicangle); os2->ysupYSize = sf->pfminfo.os2_supysize; os2->ysubXSize = sf->pfminfo.os2_subxsize; os2->ysubYSize = sf->pfminfo.os2_subysize; os2->ysupXSize = sf->pfminfo.os2_supxsize; os2->ysubYOff = sf->pfminfo.os2_subyoff; os2->ysubXOff = sf->pfminfo.os2_subxoff; os2->ysupXOff = sf->pfminfo.os2_supxoff; os2->ysupYOff = sf->pfminfo.os2_supyoff; os2->yStrikeoutSize = sf->pfminfo.os2_strikeysize; os2->yStrikeoutPos = sf->pfminfo.os2_strikeypos; if ( sf->pfminfo.stylemap!=-1 ) { int changed = 0; os2->fsSel = sf->pfminfo.stylemap; /* Make sure fsSel and macStyle don't contradict */ if (at->head.macstyle&1 && !(os2->fsSel&32)) {at->head.macstyle &= 0x7E; changed=1;} if (at->head.macstyle&2 && !(os2->fsSel&1)) {at->head.macstyle &= 0x7D; changed=1;} if (changed) redohead(at); } else { os2->fsSel = (at->head.macstyle&1?32:0)|(at->head.macstyle&2?1:0); if ( os2->fsSel==0 && sf->pfminfo.weight==400 ) os2->fsSel = 64; /* Regular */ } if ( sf->fullname!=NULL && strstrmatch(sf->fullname,"outline")!=NULL ) os2->fsSel |= 8; if ( os2->version>=4 ) { if ( strstrmatch(sf->fontname,"Obli")!=NULL ) { os2->fsSel &= ~1; /* Turn off Italic */ os2->fsSel |= 512; /* Turn on Oblique */ } if ( sf->use_typo_metrics ) os2->fsSel |= 128; /* Don't use win ascent/descent for line spacing */ if ( sf->weight_width_slope_only ) os2->fsSel |= 256; } /* 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: Almost, 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) GWW: That's what's documented. But it means non-ANSI glyphs get clipped. So the docs are wrong. */ if ( sf->pfminfo.typoascent_add ) os2->ascender = sf->ascent + sf->pfminfo.os2_typoascent; else os2->ascender = sf->pfminfo.os2_typoascent; if ( sf->pfminfo.typodescent_add ) os2->descender = -sf->descent + sf->pfminfo.os2_typodescent; /* Should be neg */ else os2->descender = sf->pfminfo.os2_typodescent; WinBB(sf,&os2->winascent,&os2->windescent,at); os2->linegap = sf->pfminfo.os2_typolinegap; os2->sFamilyClass = sf->pfminfo.os2_family_class; avg1 = avg2 = last = 0; first = 0xffff; cnt1 = cnt2 = 0; for ( i=0; iglyphcnt; ++i ) if ( (sc = sf->glyphs[i])!=NULL ) { if ( SCWorthOutputting(sc) && sc->unicodeenc!=-1 ) { /* Don't include the dummy glyphs (.notdef, .null, etc.) they aren't */ /* really encoded. Don't include glyphs out of BMP, OS/2 uses shorts */ /* for the first/last char and can't represent them. */ /* If no BMP glyphs, then first should be 0xffff. If any outside */ /* BMP then last is 0xffff */ /* sc->ttf_glyph>2 is to skip the first few truetype glyphs but */ /* that doesn't work for cff files which only have .notdef to ignore */ if ( ( format>=ff_ttf && format<=ff_otfdfont && sc->ttf_glyph>2) || ( format>=ff_ttf && format<=ff_otfdfont && sc->ttf_glyph>0) ) { if ( sc->unicodeenc<=0xffff ) { if ( sc->unicodeencunicodeenc; if ( sc->unicodeenc>last ) last = sc->unicodeenc; } else { last = 0xffff; } } if ( sc->width!=0 ) { avg2 += sc->width; ++cnt2; } if ( sc->unicodeenc==' ') { avg1 += sc->width * 166; ++cnt1; } else if (sc->unicodeenc>='a' && sc->unicodeenc<='z') { avg1 += sc->width * weightFactors[sc->unicodeenc-'a']; ++cnt1; } } } if ( sf->pfminfo.hasunicoderanges ) memcpy(os2->unicoderange,sf->pfminfo.unicoderanges,sizeof(os2->unicoderange)); else OS2FigureUnicodeRanges(sf,os2->unicoderange); if ( modformat==ff_ttfsym ) /* MS Symbol font has this set to zero. Does it matter? */ memset(os2->unicoderange,0,sizeof(os2->unicoderange)); if ( sf->pfminfo.pfmset ) strncpy(os2->achVendID,sf->pfminfo.os2_vendor,4); else 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 */ /* v1,2 & v3,4 have different ways of calculating avgCharWid. */ /* but I'm told that using the v3 way breaks display of CJK fonts in windows */ os2->avgCharWid = 500; os2->v1_avgCharWid = os2->v3_avgCharWid = 0; if ( cnt1==27 ) os2->v1_avgCharWid = avg1/1000; if ( cnt2!=0 ) os2->v3_avgCharWid = avg2/cnt2; memcpy(os2->panose,sf->pfminfo.panose,sizeof(os2->panose)); map = at->map; if ( modformat==ff_ttfsym ) { if ( sf->pfminfo.hascodepages ) memcpy(os2->ulCodePage,sf->pfminfo.codepages,sizeof(os2->ulCodePage)); else { os2->ulCodePage[0] = 0x80000000; os2->ulCodePage[1] = 0; } if ( AlreadyMSSymbolArea(sf,map)) { first = 0xf0ff; last = 0; for ( i=0xf020; ienccount && i<=0xf0ff; ++i ) if ( (gid=map->map[i])!=-1 && sf->glyphs[gid]!=NULL && sf->glyphs[gid]->ttf_glyph!=-1 ) { if ( ilast ) last = i; } for ( i=0; ienccount && i<=255; ++i ) if ( (gid=map->map[i])!=-1 && sf->glyphs[gid]!=NULL && sf->glyphs[gid]->ttf_glyph!=-1 ) { if ( i+0xf000last ) last = i+0xf000; } os2->firstcharindex = first; /* This gets mapped to space */ os2->lastcharindex = last; } else { first = 255; last = 0; for ( i=0; ienccount && i<=255; ++i ) if ( (gid=map->map[i])!=-1 && sf->glyphs[gid]!=NULL && sf->glyphs[gid]->ttf_glyph!=-1 ) { if ( ilast ) last = i; } for ( i=0xf020; ienccount && i<=0xf0ff; ++i ) if ( (gid=map->map[i])!=-1 && sf->glyphs[gid]!=NULL && sf->glyphs[gid]->ttf_glyph!=-1 ) { if ( i-0xf000last ) last = i-0xf000; } if ( first<' ' ) first = ' '; os2->firstcharindex = 0xf000 + first; /* This gets mapped to space */ os2->lastcharindex = 0xf000 + last; } } else { os2->firstcharindex = first; os2->lastcharindex = last; if ( sf->pfminfo.hascodepages ) memcpy(os2->ulCodePage,sf->pfminfo.codepages,sizeof(os2->ulCodePage)); else OS2FigureCodePages(sf, os2->ulCodePage); /* Herbert Duerr: */ /* Some old versions of Windows do not provide access to all */ /* glyphs in a font if the fonts contains non-PUA symbols */ /* and thus only has sets the codepage flag for symbol */ /* => a workaround for this problem on Windows legacy versions */ /* is to use an OS2-table version without codepage flags */ /* GWW: */ /* This sounds to me like a windows bug rather than one in ff */ /* and this is a work-around for windows. As far as I can tell */ /* ff is setting the codepage field properly, it's just that */ /* windows doesn't interpret that bit correctly */ /* GWW: Things get worse. Windows no longer accepts a version 0 */ /* for OS/2. FontLab simply lies and says we have a latin1 */ /* code page when we don't. */ if( !sf->pfminfo.hascodepages ) if( (os2->ulCodePage[0]&~(1U<<31))==0 && os2->ulCodePage[1]==0 ) os2->ulCodePage[0] |= 1; } if ( os2->version>=2 ) { if ( sf->pfminfo.os2_xheight!=0 ) os2->xHeight = sf->pfminfo.os2_xheight; else { double xh = SFXHeight(sf,at->gi.layer,true); os2->xHeight = (xh >= 0.0 ? xh : 0); } if ( sf->pfminfo.os2_capheight!=0 ) os2->capHeight = sf->pfminfo.os2_capheight; else { double caph = SFCapHeight(sf,at->gi.layer,true); os2->capHeight = (caph >= 0.0 ? caph : 0); } os2->defChar = 0; if ( format==ff_otf || format==ff_otfcid ) os2->defChar = ' '; os2->breakChar = ' '; os2->maxContext = 1; /* Kerning will set this to 2, ligature to whatever */ } if ( os2->version>=3 && os2->v3_avgCharWid!=0 ) os2->avgCharWid = os2->v3_avgCharWid; else if ( os2->v1_avgCharWid!=0 ) os2->avgCharWid = os2->v1_avgCharWid; else if ( os2->v3_avgCharWid!=0 ) os2->avgCharWid = os2->v3_avgCharWid; } static void redoloca(struct alltabs *at) { int i; at->loca = tmpfile2(); 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); } if ( at->format!=ff_type42 && at->format!=ff_type42cid ) { free(at->gi.loca); at->gi.loca = NULL; } } static void dummyloca(struct alltabs *at) { at->loca = tmpfile2(); 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 = tmpfile2(); 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[1]); putlong(at->headf,at->head.createtime[0]); putlong(at->headf,at->head.modtime[1]); putlong(at->headf,at->head.modtime[0]); 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 = tmpfile2(); head = &at->hhead; } else { f = at->vheadf = tmpfile2(); 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 redomaxp(struct alltabs *at,enum fontformat format) { at->maxpf = tmpfile2(); 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 = tmpfile2(); 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); if ( at->os2.version>=1 ) { 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, SplineFont *sf) { int i; at->gaspf = tmpfile2(); if ( sf->gasp_cnt==0 ) { putshort(at->gaspf,0); /* Old version number */ /* For fonts with no instructions always dump a gasp table which */ /* asks for grey and no grid fit */ putshort(at->gaspf,1); 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 */ } else { putshort(at->gaspf,sf->gasp_version); /* New version number, with clear type info */ putshort(at->gaspf,sf->gasp_cnt); for ( i=0; igasp_cnt; ++i ) { putshort(at->gaspf,sf->gasp[i].ppem); putshort(at->gaspf,sf->gasp[i].flags); } } at->gasplen = ftell(at->gaspf); /* This table is always 32 bit aligned */ } static void dumpstr(FILE *file,char *str) { do { putc(*str,file); } while ( *str++!='\0' ); } static void dumpustr(FILE *file,char *utf8_str) { unichar_t *ustr = utf82u_copy(utf8_str), *pt=ustr; do { putc(*pt>>8,file); putc(*pt&0xff,file); } while ( *pt++!='\0' ); free(ustr); } static void dumppstr(FILE *file,const char *str) { putc(strlen(str),file); fwrite(str,sizeof(char),strlen(str),file); } char *utf8_verify_copy(const char *str) { /* When given a postscript string it SHOULD be in ASCII. But it will often*/ /* contain a copyright symbol (sometimes in latin1, sometimes in macroman)*/ /* unfortunately both encodings use 0xa9 for copyright so we can't distinguish */ /* guess that it's latin1 (or that copyright is the only odd char which */ /* means a latin1 conversion will work for macs too). */ if ( str==NULL ) return( NULL ); if ( utf8_valid(str)) return( copy(str)); /* Either in ASCII (good) or appears to be utf8*/ return( latin1_2_utf8_copy(str)); } /* 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] = utf8_verify_copy(sf->copyright); if ( dummy->names[ttf_family]==NULL || *dummy->names[ttf_family]=='\0' ) dummy->names[ttf_family] = utf8_verify_copy(sf->familyname); if ( dummy->names[ttf_subfamily]==NULL || *dummy->names[ttf_subfamily]=='\0' ) dummy->names[ttf_subfamily] = utf8_verify_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", TTFFoundry?TTFFoundry:"FontForge 2.0", sf->fullname!=NULL?sf->fullname:sf->fontname, tm->tm_mday, tm->tm_mon+1, tm->tm_year+1900 ); dummy->names[ttf_uniqueid] = copy(buffer); } if ( dummy->names[ttf_fullname]==NULL || *dummy->names[ttf_fullname]=='\0' ) dummy->names[ttf_fullname] = utf8_verify_copy(sf->fullname); if ( dummy->names[ttf_version]==NULL || *dummy->names[ttf_version]=='\0' ) { if ( sf->subfontcnt!=0 ) sprintf( buffer, "Version %f ", (double)sf->cidversion ); else if ( sf->version!=NULL ) sprintf(buffer,"Version %.20s ", sf->version); else strcpy(buffer,"Version 1.0" ); dummy->names[ttf_version] = copy(buffer); } if ( dummy->names[ttf_postscriptname]==NULL || *dummy->names[ttf_postscriptname]=='\0' ) dummy->names[ttf_postscriptname] = utf8_verify_copy(sf->fontname); } typedef struct { uint16 platform; uint16 specific; uint16 lang; uint16 strid; uint16 len; uint16 offset; } NameEntry; typedef struct { FILE *strings; int cur, max; enum fontformat format; Encoding *encoding_name; NameEntry *entries; int applemode; } NamTab; static int compare_entry(const void *_mn1, const void *_mn2) { const NameEntry *mn1 = _mn1, *mn2 = _mn2; if ( mn1->platform!=mn2->platform ) return( mn1->platform - mn2->platform ); if ( mn1->specific!=mn2->specific ) return( mn1->specific - mn2->specific ); if ( mn1->lang!=mn2->lang ) return( mn1->lang - mn2->lang ); return( mn1->strid-mn2->strid ); } static void AddEncodedName(NamTab *nt,char *utf8name,uint16 lang,uint16 strid) { NameEntry *ne; int maclang, macenc= -1, specific; char *macname = NULL; if ( strid==ttf_postscriptname && lang!=0x409 ) return; /* Should not happen, but it did */ if ( nt->cur+6>=nt->max ) { if ( nt->cur==0 ) nt->entries = malloc((nt->max=100)*sizeof(NameEntry)); else nt->entries = realloc(nt->entries,(nt->max+=100)*sizeof(NameEntry)); } ne = nt->entries + nt->cur; ne->platform = 3; /* Windows */ ne->specific = 1; /* unicode */ ne->lang = lang; ne->strid = strid; ne->offset = ftell(nt->strings); ne->len = 2*utf82u_strlen(utf8name); dumpustr(nt->strings,utf8name); ++ne; if ( nt->format==ff_ttfsym ) { *ne = ne[-1]; ne->specific = 0; /* Windows "symbol" */ ++ne; } maclang = WinLangToMac(lang); if ( !nt->applemode && lang!=0x409 ) maclang = 0xffff; if ( maclang!=0xffff ) { #ifdef FONTFORGE_CONFIG_APPLE_UNICODE_NAMES if ( strid!=ttf_postscriptname ) { *ne = ne[-1]; ne->platform = 0; /* Mac unicode */ ne->specific = 0; /* 3 => Unicode 2.0 semantics */ /* 0 ("default") is also a reasonable value */ ne->lang = maclang; ++ne; } #endif macenc = MacEncFromMacLang(maclang); macname = Utf8ToMacStr(utf8name,macenc,maclang); if ( macname!=NULL ) { ne->platform = 1; /* apple non-unicode encoding */ ne->specific = macenc; /* whatever */ ne->lang = maclang; ne->strid = strid; ne->offset = ftell(nt->strings); ne->len = strlen(macname); dumpstr(nt->strings,macname); ++ne; free(macname); } } specific = nt->encoding_name->is_korean ? 5 : /* Wansung, korean */ nt->encoding_name->is_japanese ? 2 : /* SJIS */ nt->encoding_name->is_simplechinese ? 3 :/* packed gb2312, don't know the real name */ strmatch(nt->encoding_name->enc_name,"EUC-GB12345")==0 ? 3 :/* Lie */ nt->encoding_name->is_tradchinese ? 4 : /* Big5, traditional Chinese */ -1; if ( specific != -1 ) { ne->platform = 3; /* windows */ ne->specific = specific; /* whatever */ ne->lang = lang; ne->strid = strid; if ( macname!=NULL && (( specific== 2 && macenc==1 ) || /* Japanese */ ( specific== 3 && macenc==25 ) || /* simplified chinese */ ( specific== 4 && macenc==2 ) || /* traditional chinese */ ( specific== 5 && macenc==3 )) ) { /* wansung korean */ ne->offset = ne[-1].offset; ne->len = ne[-1].len; } else { char *space, *out; const char *encname; ICONV_CONST char *in; Encoding *enc; size_t inlen, outlen; ne->offset = ftell(nt->strings); encname = nt->encoding_name->is_japanese ? "SJIS" : strmatch(nt->encoding_name->enc_name,"JOHAB")==0 ? "JOHAB" : nt->encoding_name->is_korean ? "EUC-KR" : nt->encoding_name->is_simplechinese ? "EUC-CN" : nt->encoding_name->enc_name; enc = FindOrMakeEncoding(encname); if ( enc==NULL ) --ne; else { unichar_t *uin = utf82u_copy(utf8name); outlen = 3*strlen(utf8name)+10; out = space = malloc(outlen+2); in = (char *) uin; inlen = 2*u_strlen(uin); iconv(enc->fromunicode,NULL,NULL,NULL,NULL); /* should not be needed, but just in case */ iconv(enc->fromunicode,&in,&inlen,&out,&outlen); out[0] = '\0'; out[1] = '\0'; ne->offset = ftell(nt->strings); ne->len = strlen(space); dumpstr(nt->strings,space); free(space); free(uin); } } ++ne; } nt->cur = ne - nt->entries; } static void AddMacName(NamTab *nt,struct macname *mn, int strid) { NameEntry *ne; if ( nt->cur+1>=nt->max ) { if ( nt->cur==0 ) nt->entries = malloc((nt->max=100)*sizeof(NameEntry)); else nt->entries = realloc(nt->entries,(nt->max+=100)*sizeof(NameEntry)); } ne = nt->entries + nt->cur; ne->platform = 1; /* apple non-unicode encoding */ ne->specific = mn->enc; /* whatever */ ne->lang = mn->lang; ne->strid = strid; ne->offset = ftell(nt->strings); ne->len = strlen(mn->name); dumpstr(nt->strings,mn->name); ++nt->cur; } /* 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, and tells me that they don't currently care */ /* So ignore this */ /* Undocumented fact: Windows insists on having a UniqueID string 3,1 */ static void dumpnames(struct alltabs *at, SplineFont *sf,enum fontformat format) { int i,j; struct ttflangname dummy, *cur, *useng = NULL; struct macname *mn; struct other_names *on, *onn; NamTab nt; struct otfname *otfn; struct otffeatname *fn; memset(&nt,0,sizeof(nt)); nt.encoding_name = at->map->enc; nt.format = format; nt.applemode = at->applemode; nt.strings = tmpfile2(); if (( format>=ff_ttf && format<=ff_otfdfont) && (at->gi.flags&ttf_flag_symbol)) nt.format = ff_ttfsym; memset(&dummy,0,sizeof(dummy)); for ( cur=sf->names; cur!=NULL; cur=cur->next ) { if ( cur->lang==0x409 ) { dummy = *cur; useng = cur; break; } } DefaultTTFEnglishNames(&dummy, sf); for ( i=0; inames; cur!=NULL; cur=cur->next ) { if ( cur->lang!=0x409 ) for ( i=0; inames[i]!=NULL ) AddEncodedName(&nt,cur->names[i],cur->lang,i); } /* 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 ) { for ( i=0; at->feat_name[i].strid!=0; ++i ) { for ( mn=at->feat_name[i].mn; mn!=NULL; mn=mn->next ) AddMacName(&nt,mn,at->feat_name[i].strid); /* I'm not sure why I keep track of these alternates (feat_name[i].smn) */ /* Dumping them out is a bad idea. It might be worth */ /* something if we searched through the alternate sets for languages */ /* not found in the main set, but at the moment I don't think so */ /* What happens now if I do it is that I get duplicate names output. */ } } /* And the names used by the fvar table aren't mac unicode either */ for ( on = at->other_names; on!=NULL; on=onn ) { for ( mn = on->mn; mn!=NULL ; mn = mn->next ) AddMacName(&nt,mn,on->strid); onn = on->next; chunkfree(on,sizeof(*on)); } /* Wow, the GPOS 'size' feature uses the name table in a very mac-like way*/ if ( at->fontstyle_name_strid!=0 && sf->fontstyle_name!=NULL ) { for ( otfn = sf->fontstyle_name; otfn!=NULL; otfn = otfn->next ) AddEncodedName(&nt,otfn->name,otfn->lang,at->fontstyle_name_strid); } /* As do some other features now */ for ( fn = sf->feat_names; fn!=NULL; fn=fn->next ) { for ( otfn = fn->names; otfn!=NULL; otfn = otfn->next ) AddEncodedName(&nt,otfn->name,otfn->lang,fn->nid); } qsort(nt.entries,nt.cur,sizeof(NameEntry),compare_entry); at->name = tmpfile2(); putshort(at->name,0); /* format */ putshort(at->name,nt.cur); /* numrec */ putshort(at->name,(3+nt.cur*6)*sizeof(int16)); /* offset to strings */ for ( i=0; iname,nt.entries[i].platform); putshort(at->name,nt.entries[i].specific); putshort(at->name,nt.entries[i].lang); putshort(at->name,nt.entries[i].strid); putshort(at->name,nt.entries[i].len); putshort(at->name,nt.entries[i].offset); } if ( !ttfcopyfile(at->name,nt.strings,(3+nt.cur*6)*sizeof(int16),"name-data")) at->error = true; 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( nt.entries ); free( at->feat_name ); /* Windows at one point refused to load fonts with 'name' tables bigger than 5K (decided they were insecure). */ } 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 = tmpfile2(); putlong(at->post,shorttable?0x00030000:0x00020000); /* formattype */ putfixed(at->post,sf->italicangle); putshort(at->post,sf->upos-sf->uwidth/2); /* 'post' defn says top of rect, while FontInfo def says center of rect */ 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; imaxp.numGlyphs; ++i ) { if ( at->gi.bygid[i]!=-1 && sf->glyphs[at->gi.bygid[i]]!=NULL ) { SplineChar *sc = sf->glyphs[at->gi.bygid[i]]; while ( i>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 .null and cr */ else if ( shouldbe==2 ) putshort(at->post,2); /* or something */ else putshort(at->post,0); ++shouldbe; } if ( strcmp(sc->name,".notdef")==0 ) putshort(at->post,0); else { for ( j=0; j<258; ++j ) if ( strcmp(sc->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; imaxp.numGlyphs; ++i ) if ( at->gi.bygid[i]!=-1 ) { SplineChar *sc = sf->glyphs[at->gi.bygid[i]]; if ( strcmp(sc->name,".notdef")==0 ) /* Do Nothing */; else { for ( j=0; j<258; ++j ) if ( strcmp(sc->name,ttfstandardnames[j])==0 ) break; if ( j!=258 ) /* Do Nothing */; else dumppstr(at->post,sc->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 *_Gen816Enc(SplineFont *sf,int *tlen,EncMap *map) { int i, j, complained, pos, k, subheadindex, jj, isbig5=false; uint16 table[256]; struct subhead subheads[128]; uint16 *glyphs; uint16 tempglyphs[256]; int base, lbase, basebound, subheadcnt, planesize, plane0size; int base2, base2bound; FILE *sub; const char *encname = map->enc->iconv_name!=NULL ? map->enc->iconv_name : map->enc->enc_name; *tlen = 0; base2 = -1; base2bound = -2; if ( map->enc->is_tradchinese && strstrmatch(encname,"hkscs")!=NULL ) { base = 0x81; basebound = 0xfe; subheadcnt = basebound-base+1; lbase = 0x40; planesize = 191; } else if ( map->enc->is_tradchinese || sf->uni_interp==ui_trad_chinese) { 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; isbig5 = true; } else if ( strstrmatch(encname,"euc")!=NULL ) { base = 0xa1; basebound = 0xfd; lbase = 0xa1; subheadcnt = basebound-base+1; planesize = 0xfe - lbase +1; } else if ( strstrmatch(encname,"johab")!=NULL ) { base = 0x84; basebound = 0xf9; lbase = 0x31; subheadcnt = basebound-base+1; planesize = 0xfe -0x31+1; /* Stupid gcc bug, thinks 0xfe- is ambiguous (exponant) */ } else if ( strstrmatch(encname,"sjis")!=NULL || strstrmatch(encname,"cp932")!=NULL ) { 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 ( base2boundenccount && map->map[base2bound]!=-1 && SCWorthOutputting(sf->glyphs[map->map[base2bound]])) break; base2bound >>= 8; subheadcnt = basebound-base + 1 + base2bound-base2 + 1; } else { IError( "Unsupported 8/16 encoding %s\n", map->enc->enc_name ); return( NULL ); } plane0size = base2==-1? base : base2; i=0; if ( base2!=-1 ) { for ( i=basebound; ienccount; ++i ) if ( map->map[i]==-1 ) continue; else if ( SCWorthOutputting(sf->glyphs[map->map[i]])) break; if ( i==base2 || i==map->enccount ) i = 0; } if ( i==0 ) { for ( i=0; ienccount; ++i ) if ( map->map[i]==-1 ) continue; else if ( SCWorthOutputting(sf->glyphs[map->map[i]])) break; } if ( base2!=-1 ) { for ( i=base; i<=basebound && ienccount; ++i ) if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]])) { ff_post_error(_("Bad Encoding"),_("There is a single byte character (%d) using one of the slots needed for double byte characters"),i); break; } if ( i==basebound+1 ) for ( i=base2; i<256 && ienccount; ++i ) if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]])) { ff_post_error(_("Bad Encoding"),_("There is a single byte character (%d) using one of the slots needed for double byte characters"),i); break; } } else { for ( i=base; i<=256 && ienccount; ++i ) if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]])) { ff_post_error(_("Bad Encoding"),_("There is a single byte character (%d) using one of the slots needed for double byte characters"),i); break; } } for ( i=256; i<(base<<8) && ienccount; ++i ) if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]])) { ff_post_error(_("Bad Encoding"),_("There is a character (%d) which cannot be encoded"),i); break; } if ( i==(base<<8) && base2==-1 ) for ( i=((basebound+1)<<8); i<0x10000 && ienccount; ++i ) if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]])) { ff_post_error(_("Bad Encoding"),_("There is a character (%d) which cannot be encoded"),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; ienccount; ++i ) if ( map->map[i]!=-1 && sf->glyphs[map->map[i]]!=NULL && sf->glyphs[map->map[i]]->ttf_glyph!=-1 ) glyphs[i] = sf->glyphs[map->map[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; imap[i+j]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i+j]])) { ff_post_error(_("Bad Encoding"),_("There is a character (%d) which is not normally in the encoding"),i+j); complained = true; } if ( isbig5 ) { /* big5 has a gap here. Does johab? */ for ( i=0x7f; i<0xa1; ++i ) if ( !complained && map->map[i+j]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i+j]])) { ff_post_error(_("Bad Encoding"),_("There is a character (%d) which is not normally in the encoding"),i+j); complained = true; } } memset(tempglyphs,0,sizeof(tempglyphs)); for ( i=0; imap[j+lbase+i]!=-1 && sf->glyphs[map->map[j+lbase+i]]!=NULL && sf->glyphs[map->map[j+lbase+i]]->ttf_glyph!=-1 ) tempglyphs[i] = sf->glyphs[map->map[j+lbase+i]]->ttf_glyph; for ( i=1; ienc->iconv_name!=NULL ? map->enc->iconv_name : map->enc->enc_name; EncMap *oldmap = map; EncMap *applemap = NULL; Encoding *enc; *tlen = 0; if ( apple!=NULL ) { *apple = NULL; *appletlen = 0; } if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) return( NULL ); if ( (strstrmatch(encname,"big")!=NULL && strchr(encname,'5')!=NULL) || strstrmatch(encname,"johab")!=NULL || strstrmatch(encname,"sjis")!=NULL || strstrmatch(encname,"cp932")!=NULL || strstrmatch(encname,"euc-kr")!=NULL || strstrmatch(encname,"euc-cn")!=NULL ) /* Already properly encoded */; else if ( strstrmatch(encname,"2022")!=NULL && (strstrmatch(encname,"JP2")!=NULL || strstrmatch(encname,"JP-2")!=NULL || strstrmatch(encname,"JP-3")!=NULL )) return( NULL ); /* No 8/16 encoding for JP2 nor JP3 */ else if ( sf->uni_interp>=ui_japanese && sf->uni_interp<=ui_korean ) { enc = FindOrMakeEncoding( sf->uni_interp==ui_japanese ? "sjis" : sf->uni_interp==ui_trad_chinese ? "big5" : sf->uni_interp==ui_simp_chinese ? "euc-cn" : "euc-kr"); if ( map->enc!=enc ) { map = EncMapFromEncoding(sf,enc); encname = map->enc->iconv_name!=NULL ? map->enc->iconv_name : map->enc->enc_name; } } else return( NULL ); /* Both MS and Apple extend sjis. I don't know how to get iconv to give me*/ /* apple's encoding though. So I generate one 8/16 table for MS based on */ /* their extension (cp932), and another table based on plain sjis for Apple*/ /* Don't know if this is true of other cjk encodings... for the moment I */ /* will just use standard encodings for them */ if ( strstrmatch(encname,"sjis")!=NULL ) { enc = FindOrMakeEncoding("cp932"); if ( enc!=NULL ) { applemap = map; map = EncMapFromEncoding(sf,enc); } } else if ( strstrmatch(encname,"cp932")!=NULL ) applemap = EncMapFromEncoding(sf,FindOrMakeEncoding("sjis")); if ( applemap!=NULL ) *apple = _Gen816Enc(sf,appletlen,applemap); sub = _Gen816Enc(sf,tlen,map); if ( applemap!=NULL && applemap!=oldmap ) EncMapFree(applemap); if ( map!=oldmap ) EncMapFree(map); return( sub ); } static FILE *NeedsUCS4Table(SplineFont *sf,int *ucs4len,EncMap *map) { int i=0,j,group; FILE *format12; SplineChar *sc; EncMap *freeme = NULL; struct altuni *altuni; if ( map->enc->is_unicodefull ) i=0x10000; else if ( map->enc->is_custom ) i = 0; else i = map->enc->char_cnt; for ( ; ienccount; ++i ) { if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]]) ) { if ( sf->glyphs[map->map[i]]->unicodeenc>=0x10000 ) break; for ( altuni=sf->glyphs[map->map[i]]->altuni; altuni!=NULL && (altuni->unienc<0x10000 || altuni->vs!=-1 || altuni->fid!=0); altuni=altuni->next ); if ( altuni!=NULL ) break; } } if ( i>=map->enccount ) return(NULL); if ( !map->enc->is_unicodefull ) map = freeme = EncMapFromEncoding(sf,FindOrMakeEncoding("ucs4")); format12 = tmpfile2(); 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; ienccount; ++i ) if ( map->map[i]!=-1 && SCWorthOutputting(sf->glyphs[map->map[i]]) && sf->glyphs[map->map[i]]->unicodeenc!=-1 ) { sc = sf->glyphs[map->map[i]]; for ( j=i+1; jenccount && map->map[j]!=-1 && SCWorthOutputting(sf->glyphs[map->map[j]]) && sf->glyphs[map->map[j]]->unicodeenc!=-1 && sf->glyphs[map->map[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 ); if ( freeme!=NULL ) EncMapFree(freeme); return( format12 ); } static FILE *NeedsUCS2Table(SplineFont *sf,int *ucs2len,EncMap *map,int issymbol) { /* We always want a format 4 2byte unicode encoding map */ /* But if it's symbol, only include encodings 0xff20 - 0xffff */ uint32 *avail = malloc(65536*sizeof(uint32)); int i,j,l; int segcnt, cnt=0, delta, rpos; struct cmapseg { uint16 start, end; uint16 delta; uint16 rangeoff; } *cmapseg; uint16 *ranges; SplineChar *sc; FILE *format4 = tmpfile2(); memset(avail,0xff,65536*sizeof(uint32)); if ( map->enc->is_unicodebmp || map->enc->is_unicodefull ) { int gid; for ( i=0; i<65536 && ienccount; ++i ) if ( (gid=map->map[i])!=-1 && sf->glyphs[gid]!=NULL && sf->glyphs[gid]->ttf_glyph!=-1 ) { avail[i] = gid; ++cnt; } } else { struct altuni *altuni; for ( i=0; iglyphcnt; ++i ) { if ( (sc=sf->glyphs[i])!=NULL && sc->ttf_glyph!=-1 ) { if ( sc->unicodeenc>=0 && sc->unicodeenc<=0xffff ) { avail[sc->unicodeenc] = i; ++cnt; } for ( altuni=sc->altuni; altuni!=NULL; altuni = altuni->next ) { if ( altuni->unienc<=0xffff && altuni->vs==-1 && altuni->fid==0 ) { avail[altuni->unienc] = i; ++cnt; } } } } } if ( issymbol ) { /* Clear out all entries we don't want */ memset(avail ,0xff,0xf020*sizeof(uint32)); memset(avail+0xf100,0xff,0x0eff*sizeof(uint32)); } 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 = calloc(segcnt+1,sizeof(struct cmapseg)); ranges = malloc(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; iglyphs[l]; delta = sc->ttf_glyph-cmapseg[i].start; for ( j=cmapseg[i].start; j<=cmapseg[i].end; ++j ) { l = avail[j]; sc = sf->glyphs[l]; 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 = sf->glyphs[l]; ranges[rpos++] = sc->ttf_glyph; } } } free(avail); putshort(format4,4); /* format */ putshort(format4,(8+4*segcnt+rpos)*sizeof(int16)); putshort(format4,0); /* language/version */ putshort(format4,2*segcnt); /* segcnt */ for ( j=0,i=1; i<=segcnt; i<<=1, ++j ); putshort(format4,i); /* 2*2^floor(log2(segcnt)) */ putshort(format4,j-1); putshort(format4,2*segcnt-i); for ( i=0; iglyphcnt; ++gid ) if ( (sc = sf->glyphs[gid])!=NULL ) { for ( altuni = sc->altuni; altuni!=NULL; altuni=altuni->next ) { if ( altuni->unienc!=-1 && (uint32)altuni->uniencvs!=-1 && altuni->fid==0 ) { for ( i=0; ivs ) break; if ( i>=vs_cnt ) { if ( i>=vs_max ) { if ( vses==vsbuf ) { vses = malloc((vs_max*=2)*sizeof(uint32)); memcpy(vses,vsbuf,sizeof(vsbuf)); } else vses = realloc(vses,(vs_max+=512)*sizeof(uint32)); } vses[vs_cnt++] = altuni->vs; } if ( mingid==-1 ) mingid = maxgid = gid; else maxgid = gid; } } } if ( vs_cnt==0 ) { *vslen = 0; return( NULL ); /* No variation selectors */ } /* Sort the variation selectors */ for ( i=0; ivses[j] ) { int temp = vses[i]; vses[i] = vses[j]; vses[j] = temp; } } avail = malloc(unicode4_size*sizeof(uint32)); format14 = tmpfile2(); putshort(format14,14); putlong(format14,0); /* Length, fixup later */ putlong(format14,vs_cnt); /* number of selectors */ /* Variation selector records */ for ( i=0; iglyphs[gid])!=NULL ) { for ( altuni = sc->altuni; altuni!=NULL; altuni=altuni->next ) { if ( altuni->unienc!=-1 && altuni->unienc < (int)unicode4_size && altuni->vs==vses[i] && altuni->fid==0 ) { for ( au=sc->altuni; au!=NULL; au=au->next ) if ( au->unienc==altuni->unienc && au->vs==-1 && au->fid==0 ) break; if ( altuni->unienc==sc->unicodeenc || au!=NULL ) { avail[altuni->unienc] = gid | vs_default; any |= vs_default; } else { avail[altuni->unienc] = gid | vs_nondefault; any |= vs_nondefault; } } } } if ( any&vs_default ) { here = ftell(format14); fseek(format14,10+ i*11 + 3, SEEK_SET); /* Seek to defaultUVSOffset */ putlong(format14,here); fseek(format14,0,SEEK_END); cnt = 0; for ( j=0; (unsigned)j256 ) k=j+256; /* Each range is limited to 255 code points, as the count is a byte */ ++cnt; j = k-1; } putlong(format14,cnt); for ( j=0; (unsigned)j256 ) k=j+256; putu24(format14,j); putc(k-j-1,format14); j = k-1; } } if ( any&vs_nondefault ) { here = ftell(format14); fseek(format14,10+ i*11 + 7, SEEK_SET); /* Seek to nonDefaultUVSOffset */ putlong(format14,here); fseek(format14,0,SEEK_END); cnt = 0; for ( j=0; (unsigned)jglyphs[avail[j]&0xffff]->ttf_glyph); } } } here = ftell(format14); fseek(format14,2,SEEK_SET); putlong(format14,here); fseek(format14,0,SEEK_END); if ( here&1 ) { putc('\0',format14); ++here; } if ( here&2 ) { putshort(format14,0); here += 2; } *vslen = here; free(avail); if ( vses!=vsbuf ) free(vses); return( format14 ); } extern unichar_t MacRomanEnc[]; static void dumpcmap(struct alltabs *at, SplineFont *sf,enum fontformat format) { int i,enccnt, issmall, hasmac; uint16 table[256]; SplineChar *sc; int alreadyprivate = false; int wasotf = format==ff_otf || format==ff_otfcid; EncMap *map = at->map; int ucs4len=0, ucs2len=0, cjklen=0, applecjklen=0, vslen=0; FILE *format12, *format4, *format2, *apple2, *format14; int mspos, ucs4pos, cjkpos, applecjkpos, vspos, start_of_macroman; int modformat = format; if (( format>=ff_ttf && format<=ff_otfdfont) && (at->gi.flags&ttf_flag_symbol)) modformat = ff_ttfsym; at->cmap = tmpfile2(); /* 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)); if ( !wasotf ) { table[29] = table[8] = table[0] = 1; table[9] = table[13] = 2; } for ( i=0; i<256 ; ++i ) { sc = SFGetChar(sf,MacRomanEnc[i],NULL); if ( sc!=NULL && sc->ttf_glyph!=-1 ) table[i] = sc->ttf_glyph; } if ( table[0]==0 ) table[0] = 1; if ( modformat==ff_ttfsym ) { alreadyprivate = AlreadyMSSymbolArea(sf,map); memset(table,'\0',sizeof(table)); if ( !wasotf ) { table[29] = table[8] = table[0] = 1; table[9] = table[13] = 2; } if ( !alreadyprivate ) { for ( i=0; ienccount && i<256; ++i ) { if ( map->map[i]!=-1 && (sc = sf->glyphs[map->map[i]])!=NULL && sc->ttf_glyph!=-1 ) table[i] = sc->ttf_glyph; } for ( i=0xf020; i<=0xf0ff && iglyphcnt; ++i ) { if ( map->map[i]!=-1 && (sc = sf->glyphs[map->map[i]])!=NULL && sc->ttf_glyph!=-1 && table[i-0xf000]==0 ) table[i-0xf000] = sc->ttf_glyph; } } else { for ( i=0xf020; i<=0xf0ff && iglyphcnt; ++i ) { if ( map->map[i]!=-1 && (sc = sf->glyphs[map->map[i]])!=NULL && sc->ttf_glyph!=-1 ) table[i-0xf000] = sc->ttf_glyph; } for ( i=0; ienccount && i<256; ++i ) { if ( map->map[i]!=-1 && (sc = sf->glyphs[map->map[i]])!=NULL && sc->ttf_glyph!=-1 && table[i]==0 ) table[i] = sc->ttf_glyph; } } /* 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; ienccount && i<256; ++i ) { if ( map->map[i]!=-1 && (sc = sf->glyphs[map->map[i]])!=NULL ) { sc->orig_pos = sc->unicodeenc; sc->unicodeenc = 0xf000 + i; } } for ( ; ienccount; ++i ) { if ( map->map[i]!=-1 && (sc = sf->glyphs[map->map[i]])!=NULL ) { sc->orig_pos = sc->unicodeenc; sc->unicodeenc = -1; } } } } format4 = NeedsUCS2Table(sf,&ucs2len,map,modformat==ff_ttfsym); apple2 = NULL; if ( modformat!=ff_ttfsym ) { format12 = NeedsUCS4Table(sf,&ucs4len,map); format2 = Needs816Enc(sf,&cjklen,map,&apple2,&applecjklen); format14 = NeedsVariationSequenceTable(sf,&vslen); } else format12 = format2 = format14 = apple2 = NULL; /* 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... */ /* sometimes the mac will have a slightly different cjk table */ /* Sometimes we want a variation sequence subtable (format=14) for */ /* unicode platform */ if ( modformat==ff_ttfsym ) { enccnt = 2; hasmac = 0; } else { hasmac = 1; enccnt = 3; if ( format12!=NULL ) enccnt = 5; if ( format2!=NULL ) { if ( strstrmatch(map->enc->enc_name,"johab")!=NULL ) { ++enccnt; } else { enccnt+=2; hasmac=3; } } if ( format14!=NULL ) ++enccnt; } putshort(at->cmap,0); /* version */ putshort(at->cmap,enccnt); /* num tables */ mspos = 2*sizeof(uint16)+enccnt*(2*sizeof(uint16)+sizeof(uint32)); ucs4pos = mspos+ucs2len; cjkpos = ucs4pos+ucs4len; if ( apple2==NULL ) { applecjkpos = cjkpos; applecjklen = cjklen; } else applecjkpos = cjkpos + cjklen; /* applecjklen set above */ vspos = applecjkpos + applecjklen; start_of_macroman = vspos + vslen; 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); } if ( format12!=NULL ) { /* full unicode mac table, just a copy of the ms table */ putshort(at->cmap,0); /* mac unicode platform */ if( map->enc->is_unicodefull ) { putshort(at->cmap,10); /* Unicode 2.0, unicode beyond BMP */ } else { putshort(at->cmap,4); /* Unicode 2.0, unicode BMP */ } putlong(at->cmap,ucs4pos); } if ( format14!=NULL ) { /* variation sequence subtable. Only for platform 0. */ putshort(at->cmap,0); /* mac unicode platform */ putshort(at->cmap,5); /* Variation sequence table */ putlong(at->cmap,vspos); } 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,start_of_macroman); /* offset from tab start to sub tab start */ if ( format2!=NULL && (hasmac&2) ) { /* mac cjk table, often a copy of the ms table */ putshort(at->cmap,1); /* mac platform */ putshort(at->cmap, map->enc->is_japanese || sf->uni_interp==ui_japanese ? 1 : /* SJIS */ map->enc->is_korean || sf->uni_interp==ui_korean ? 3 : /* Korean */ map->enc->is_simplechinese || sf->uni_interp==ui_simp_chinese ? 25 :/* Simplified Chinese */ 2 ); /* Big5 */ putlong(at->cmap,applecjkpos); } putshort(at->cmap,3); /* ms platform */ putshort(at->cmap, /* plat specific enc */ modformat==ff_ttfsym ? 0 : /* Symbol */ 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 */ strstrmatch(map->enc->enc_name,"johab")!=NULL ? 6 : map->enc->is_korean || sf->uni_interp==ui_korean ? 5 : map->enc->is_japanese || sf->uni_interp==ui_japanese ? 2 : map->enc->is_simplechinese || sf->uni_interp==ui_simp_chinese ? 3 : 4); /* Big5 */ 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 */ } if ( format4!=NULL ) { if ( !ttfcopyfile(at->cmap,format4,mspos,"cmap-Unicode16")) at->error = true; } if ( format12!=NULL ) { if ( !ttfcopyfile(at->cmap,format12,ucs4pos,"cmap-Unicode32")) at->error = true; } if ( format2!=NULL ) { if ( !ttfcopyfile(at->cmap,format2,cjkpos,"cmap-cjk")) at->error = true; } if ( apple2!=NULL ) { if ( !ttfcopyfile(at->cmap,apple2,applecjkpos,"cmap-applecjk")) at->error = true; } if ( format14!=NULL ) { if ( !ttfcopyfile(at->cmap,format14,vspos,"cmap-uniVariations")) 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 ( modformat==ff_ttfsym ) { if ( !alreadyprivate ) { for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { sf->glyphs[i]->unicodeenc = sf->glyphs[i]->orig_pos; sf->glyphs[i]->orig_pos = i; } } } } int32 filechecksum(FILE *file) { uint32 sum = 0, chunk; rewind(file); while ( 1 ) { chunk = getuint32(file); if ( feof(file) || ferror(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); if ( at->tex!=NULL ) fclose(at->tex); if ( at->gvar!=NULL ) fclose(at->gvar); if ( at->fvar!=NULL ) fclose(at->fvar); if ( at->cvar!=NULL ) fclose(at->cvar); if ( at->avar!=NULL ) fclose(at->avar); for ( i=0; isubfontcnt; ++i ) { if ( at->fds[i].private!=NULL ) fclose(at->fds[i].private); } if ( sf->subfontcnt!=0 ) { free(sf->glyphs); sf->glyphs = NULL; sf->glyphcnt = sf->glyphmax = 0; } free( at->fds ); free( at->gi.bygid ); } int SFHasInstructions(SplineFont *sf) { int i; if ( sf->mm!=NULL && sf->mm->apple ) sf = sf->mm->normal; if ( sf->subfontcnt!=0 ) return( false ); /* Truetype doesn't support cid keyed fonts */ for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { if ( strcmp(sf->glyphs[i]->name,".notdef")==0 ) continue; /* ff produces fonts with instructions in .notdef & not elsewhere. Ignore these */ if ( sf->glyphs[i]->ttf_instrs!=NULL ) return( true ); } return( false ); } static void MaxpFromTable(struct alltabs *at,SplineFont *sf) { struct ttf_table *maxp; maxp = SFFindTable(sf,CHR('m','a','x','p')); if ( maxp==NULL && sf->mm!=NULL && sf->mm->apple ) maxp = SFFindTable(sf->mm->normal,CHR('m','a','x','p')); 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,maxp->len, 7*sizeof(uint16)); at->maxp.maxTwilightPts = memushort(maxp->data,maxp->len, 8*sizeof(uint16)); at->maxp.maxStorage = memushort(maxp->data,maxp->len, 9*sizeof(uint16)); at->maxp.maxFDEFs = memushort(maxp->data,maxp->len, 10*sizeof(uint16)); at->maxp.maxIDEFs = memushort(maxp->data,maxp->len, 11*sizeof(uint16)); at->maxp.maxStack = memushort(maxp->data,maxp->len, 12*sizeof(uint16)); } static FILE *dumpstoredtable(SplineFont *sf,uint32 tag,int *len) { struct ttf_table *tab = SFFindTable(sf,tag); FILE *out; if ( tab==NULL && sf->mm!=NULL && sf->mm->apple ) tab = SFFindTable(sf->mm->normal,tag); if ( tab==NULL ) { *len = 0; return( NULL ); } out = tmpfile2(); 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 FILE *dumpsavedtable(struct ttf_table *tab) { FILE *out; if ( tab==NULL ) return( NULL ); out = tmpfile2(); fwrite(tab->data,1,tab->len,out); if ( (tab->len&1)) putc('\0',out); if ( (tab->len+1)&2 ) putshort(out,0); return( out ); } static int tagcomp(const void *_t1, const void *_t2) { struct taboff *t1 = *((struct taboff **) _t1), *t2 = *((struct taboff **) _t2); return( (int) (t1->tag - t2->tag) ); } 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 void ATmaxpInit(struct alltabs *at,SplineFont *sf, enum fontformat format) { 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,sf); at->gi.maxp = &at->maxp; } static void initATTables(struct alltabs *at, SplineFont *sf, enum fontformat format) { setos2(&at->os2,at,sf,format); /* should precede kern/ligature output */ if ( at->opentypemode ) { SFFindUnusedLookups(sf); otf_dumpgpos(at,sf); otf_dumpgsub(at,sf); otf_dumpgdef(at,sf); otf_dumpjstf(at,sf); otf_dumpbase(at,sf); otf_dump_math(at,sf); /* Not strictly OpenType yet */ if ( at->gi.flags & ttf_flag_dummyDSIG ) otf_dump_dummydsig(at,sf); } if ( at->dovariations ) ttf_dumpvariations(at,sf); if ( at->applemode ) { if ( !at->opentypemode ) SFFindUnusedLookups(sf); 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); aat_dumpbsln(at,sf); } if ( !at->applemode && (!at->opentypemode || (at->gi.flags&ttf_flag_oldkern)) ) ttf_dumpkerns(at,sf); /* everybody supports a mimimal kern table */ dumpnames(at,sf,format); /* Must be after dumpmorx which may create extra names */ /* GPOS 'size' can also create names (so must be after that too) */ redoos2(at); } static struct taboff *findtabindir(struct tabdir *td, uint32 tag ) { int i; for ( i=0; inumtab; ++i ) if ( td->tabs[i].tag == tag ) return( &td->tabs[i] ); return( NULL ); } static void buildtablestructures(struct alltabs *at, SplineFont *sf, enum fontformat format) { int i; int ebdtpos, eblcpos; struct ttf_table *tab; if ( format==ff_otf || format==ff_otfcid ) { at->tabdir.version = CHR('O','T','T','O'); #ifdef FONTFORGE_CONFIG_APPLE_ONLY_TTF /* This means that Windows will reject the font. In general not a good idea */ } else if ( at->applemode && !at->opentypemode ) { at->tabdir.version = CHR('t','r','u','e'); #endif } else { at->tabdir.version = 0x00010000; } i = 0; if ( at->base!=NULL ) { at->tabdir.tabs[i].tag = CHR('B','A','S','E'); at->tabdir.tabs[i].data = at->base; at->tabdir.tabs[i++].length = at->baselen; } if ( at->bsln!=NULL ) { at->tabdir.tabs[i].tag = CHR('b','s','l','n'); at->tabdir.tabs[i].data = at->bsln; at->tabdir.tabs[i++].length = at->bslnlen; } if ( at->bdf!=NULL ) { at->tabdir.tabs[i].tag = CHR('B','D','F',' '); at->tabdir.tabs[i].data = at->bdf; at->tabdir.tabs[i++].length = at->bdflen; } 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->dsigf!=NULL ) { ebdtpos = i; at->tabdir.tabs[i].tag = CHR('D','S','I','G'); at->tabdir.tabs[i].length = at->dsiglen; at->tabdir.tabs[i++].data = at->dsigf; } if ( at->bdat!=NULL && (at->msbitmaps || at->otbbitmaps)) { 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->msbitmaps || at->otbbitmaps)) { 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->fftmf!=NULL ) { at->tabdir.tabs[i].tag = CHR('F','F','T','M'); at->tabdir.tabs[i].data = at->fftmf; at->tabdir.tabs[i++].length = at->fftmlen; } 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; } if ( at->jstf!=NULL ) { at->tabdir.tabs[i].tag = CHR('J','S','T','F'); at->tabdir.tabs[i].data = at->jstf; at->tabdir.tabs[i++].length = at->jstflen; } if ( at->os2f!=NULL ) { 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->tex!=NULL ) { at->tabdir.tabs[i].tag = CHR('T','e','X',' '); at->tabdir.tabs[i].data = at->tex; at->tabdir.tabs[i++].length = at->texlen; } if ( at->math!=NULL ) { at->tabdir.tabs[i].tag = CHR('M','A','T','H'); at->tabdir.tabs[i].data = at->math; at->tabdir.tabs[i++].length = at->mathlen; } if ( at->vorgf!=NULL ) { /* No longer generated */ 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->applebitmaps ) { at->tabdir.tabs[i].tag = CHR('b','d','a','t'); if ( !at->msbitmaps ) { 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->applebitmaps ) { /* 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->applebitmaps ) { at->tabdir.tabs[i].tag = CHR('b','l','o','c'); if ( !at->msbitmaps ) { 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; } } if ( at->cmap!=NULL ) { 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 ( at->hdmxf!=NULL ) { at->tabdir.tabs[i].tag = CHR('h','d','m','x'); at->tabdir.tabs[i].data = at->hdmxf; at->tabdir.tabs[i++].length = at->hdmxlen; } if ( format!=ff_none || !at->applebitmaps ) { at->tabdir.tabs[i].tag = CHR('h','e','a','d'); at->tabdir.tabs[i].data = at->headf; at->tabdir.tabs[i++].length = at->headlen; } if ( format!=ff_none || !at->applemode ) { at->tabdir.tabs[i].tag = CHR('h','h','e','a'); at->tabdir.tabs[i].data = at->hheadf; at->tabdir.tabs[i++].length = at->hheadlen; } else if ( at->hheadf!=NULL ) { fclose(at->hheadf); at->hheadf = NULL; } if ( format!=ff_none || !at->applemode ) { 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; } if ( at->name!=NULL ) { 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; } if ( at->post!=NULL ) { 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 ( at->fvar!=NULL ) { at->tabdir.tabs[i].tag = CHR('f','v','a','r'); at->tabdir.tabs[i].data = at->fvar; at->tabdir.tabs[i++].length = at->fvarlen; } if ( at->gvar!=NULL ) { at->tabdir.tabs[i].tag = CHR('g','v','a','r'); at->tabdir.tabs[i].data = at->gvar; at->tabdir.tabs[i++].length = at->gvarlen; } if ( at->cvar!=NULL ) { at->tabdir.tabs[i].tag = CHR('c','v','a','r'); at->tabdir.tabs[i].data = at->cvar; at->tabdir.tabs[i++].length = at->cvarlen; } if ( at->avar!=NULL ) { at->tabdir.tabs[i].tag = CHR('a','v','a','r'); at->tabdir.tabs[i].data = at->avar; at->tabdir.tabs[i++].length = at->avarlen; } if ( i>=MAX_TAB ) IError("Miscalculation of number of tables needed. Up sizeof tabs array in struct tabdir in ttf.h" ); for ( tab=sf->ttf_tab_saved; tab!=NULL && inext ) { at->tabdir.tabs[i].tag = tab->tag; at->tabdir.tabs[i].data = tab->temp; at->tabdir.tabs[i++].length = tab->len; } if ( tab!=NULL ) IError("Some user supplied tables omitted. 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; } static int initTables(struct alltabs *at, SplineFont *sf, enum fontformat format, int32 *bsizes, enum bitmapformat bf) { int i, aborted, offset; struct ttf_table *tab; if (strmatch(at->map->enc->enc_name, "symbol") == 0 && format == ff_ttf) format = ff_ttfsym; tab = SFFindTable(sf, CHR('c', 'v', 't', ' ')); if (tab != NULL) { at->oldcvt = tab; at->oldcvtlen = tab->len; } SFDefaultOS2Info(&sf->pfminfo, sf, sf->fontname); at->gi.xmin = at->gi.ymin = 15000; at->gi.sf = sf; bsizes = NULL; if (sf->subfonts != NULL) { SFDummyUpCIDs(&at->gi, sf); /* life is easier if we ignore the separate fonts of a cid keyed fonts and treat it as flat */ } else if (format != ff_none) AssignTTFGlyph(&at->gi, sf, at->map, format == ff_otf); else { if (bsizes == NULL) { ff_post_error(_("No bitmap strikes"), _("No bitmap strikes")); AbortTTF(at, sf); return ( false); } // AssignTTFBitGlyph(&at->gi, sf, at->map, bsizes); } if (at->gi.gcnt > 65535) { ff_post_error(_("Too many glyphs"), _("The 'sfnt' format is currently limited to 65535 glyphs, and your font has %d of them."), at->gi.gcnt); AbortTTF(at, sf); return ( false); } else if (at->gi.gcnt == 65535) { /* GID 65535 is used as a "No Glyph" mark in many places (cmap tables, mac substitutions to delete a glyph */ LogError(_("Your font has exactly 65535 glyphs. Encoding 65535 is the limit and is often used as a magic \ value, so it may cause quirks.\n")); } ATmaxpInit(at,sf,format); if ( format==ff_otf ) aborted = !dumptype2glyphs(sf,at); else if ( format==ff_otfcid ) aborted = !dumpcidglyphs(sf,at); else { /* if format==ff_none the following will put out lots of space glyphs */ aborted = !dumpglyphs(sf,&at->gi); } if ( aborted ) { AbortTTF(at,sf); return( false ); } sethead(&at->head,sf,at,format,bsizes); sethhead(&at->hhead,&at->vhead,at,sf); if ( format==ff_none && at->otbbitmaps ) dummyloca(at); else if ( format!=ff_otf && format!=ff_otfcid && bf!=bf_sfnt_dfont && (format!=ff_none || (bsizes!=NULL && !at->applemode && at->opentypemode)) ) redoloca(at); redohead(at); if ( format!=ff_none || !at->applemode ) /* No 'hhea' table for apple bitmap-only fonts */ redohhead(at,false); if ( sf->hasvmetrics ) { redohhead(at,true); } ttf_fftm_dump(sf,at); if ( format!=ff_type42 && format!=ff_type42cid && !sf->internal_temp ) { initATTables(at, sf, format); } redomaxp(at,format); if ( format!=ff_otf && format!=ff_otfcid && format!=ff_none ) { if (( sf->gasp_cnt!=0 || !SFHasInstructions(sf)) && format!=ff_type42 && format!=ff_type42cid ) dumpgasp(at, sf); 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); } for ( tab=sf->ttf_tab_saved; tab!=NULL; tab=tab->next ) tab->temp = dumpsavedtable(tab); if ( format!=ff_type42 && format!=ff_type42cid ) { dumppost(at,sf,format); dumpcmap(at,sf,format); pfed_dump(at,sf); tex_dump(at,sf); } if ( sf->subfonts!=NULL ) { free(sf->glyphs); sf->glyphs = NULL; sf->glyphcnt = sf->glyphmax = 0; } free( at->gi.bygid ); at->gi.gcnt = 0; buildtablestructures(at,sf,format); for ( i=0; itabdir.numtab; ++i ) { struct taboff *tab = &at->tabdir.tabs[i]; at->tabdir.ordered[i] = tab; at->tabdir.alpha[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 */ /* From: http://partners.adobe.com/asn/tech/type/opentype/recom.jsp */ /* TrueType Ordering */ /* head, hhea, maxp, OS/2, hmtx, LTSH, VDMX, hdmx, cmap, fpgm, prep, cvt, */ /* loca, glyf, kern, name, post, gasp, PCLT, DSIG */ /* CFF in OpenType Ordering */ /* head, hhea, maxp, OS/2, name, cmap, post, CFF, (other tables, as convenient) */ if ( format==ff_otf || format==ff_otfcid ) { 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('n','a','m','e')? 5 : tab->tag==CHR('c','m','a','p')? 6 : tab->tag==CHR('p','o','s','t')? 7 : tab->tag==CHR('C','F','F',' ')? 8 : 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; } else { 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('h','m','t','x')? 5 : tab->tag==CHR('L','T','S','H')? 6 : tab->tag==CHR('V','D','M','X')? 7 : tab->tag==CHR('h','d','m','x')? 8 : tab->tag==CHR('c','m','a','p')? 9 : tab->tag==CHR('f','p','g','m')? 10 : tab->tag==CHR('p','r','e','p')? 11 : tab->tag==CHR('c','v','t',' ')? 12 : tab->tag==CHR('l','o','c','a')? 13 : tab->tag==CHR('g','l','y','f')? 14 : tab->tag==CHR('k','e','r','n')? 15 : tab->tag==CHR('n','a','m','e')? 16 : tab->tag==CHR('p','o','s','t')? 17 : tab->tag==CHR('g','a','s','p')? 18 : tab->tag==CHR('P','C','L','T')? 19 : tab->tag==CHR('D','S','I','G')? 20 : tab->tag==CHR('G','D','E','F')? 21 : tab->tag==CHR('G','S','U','B')? 22 : tab->tag==CHR('G','P','O','S')? 23 : 24; } } qsort(at->tabdir.ordered,at->tabdir.numtab,sizeof(struct taboff *),tcomp); qsort(at->tabdir.alpha,i,sizeof(struct taboff *),tagcomp); 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 = filechecksum(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; } tab = SFFindTable(sf,CHR('c','v','t',' ')); if ( tab!=NULL ) { if ( at->oldcvt!=NULL && at->oldcvtlenlen ) tab->len = at->oldcvtlen; else if ( at->oldcvt==NULL ) { /* We created a cvt table when we output the .notdef glyph */ /* now that means AutoInstr thinks it no longer has a blank */ /* slate to work with, and will complain, much to the user's */ /* surprise. So get rid of it */ struct ttf_table *prev = NULL; for ( tab = sf->ttf_tables; tab!=NULL ; prev = tab, tab=tab->next ) if ( tab->tag==CHR('c','v','t',' ') ) break; if ( tab!=NULL ) { if ( prev==NULL ) sf->ttf_tables = tab->next; else prev->next = tab->next; tab->next = NULL; TtfTablesFree(tab); } } } return( true ); } static char *Tag2String(uint32 tag) { static char buffer[8]; buffer[0] = tag>>24; buffer[1] = tag>>16; buffer[2] = tag>>8; buffer[3] = tag; buffer[4] = 0; return( buffer ); } static void dumpttf(FILE *ttf,struct alltabs *at) { 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.alpha[i]->tag==CHR('h','e','a','d') || at->tabdir.alpha[i]->tag==CHR('b','h','e','d') ) head_index = i; putlong(ttf,at->tabdir.alpha[i]->tag); putlong(ttf,at->tabdir.alpha[i]->checksum); putlong(ttf,at->tabdir.alpha[i]->offset); putlong(ttf,at->tabdir.alpha[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,Tag2String(at->tabdir.ordered[i]->tag))) at->error = true; } if ( head_index!=-1 ) { checksum = filechecksum(ttf); checksum = 0xb1b0afba-checksum; fseek(ttf,at->tabdir.alpha[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 = malloc(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 ) { LogError( _("Failed to open glyph to name map file for writing: %s\n"), newname ); free(newname); return; } if ( sf->subfontcnt==0 ) max = sf->glyphcnt; else { for ( k=max=0; ksubfontcnt; ++k ) if ( sf->subfonts[k]->glyphcnt > max ) max = sf->subfonts[k]->glyphcnt; } for ( i=0; isubfontcnt==0 ) sc = sf->glyphs[i]; else { for ( k=0; ksubfontcnt; ++k ) if ( isubfonts[k]->glyphcnt ) if ( (sc=sf->subfonts[k]->glyphs[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 ) { AssignTTFGlyph(&at->gi,sf,at->map,true); ret = dumptype2glyphs(sf,at); } else { SFDummyUpCIDs(&at->gi,sf); /* life is easier if we ignore the separate fonts of a cid keyed fonts and treat it as flat */ ret = dumpcidglyphs(sf,at); free(sf->glyphs); sf->glyphs = NULL; sf->glyphcnt = sf->glyphmax = 0; } free( at->gi.bygid ); if ( !ret ) at->error = true; else if ( at->gi.flags & ps_flag_nocffsugar ) { if ( !ttfcopyfile(cff,at->cfff,0,"CFF")) at->error = true; } else { long len; char buffer[80]; fprintf(cff,"%%!PS-Adobe-3.0 Resource-FontSet\n"); fprintf(cff,"%%%%DocumentNeedResources:ProcSet (FontSetInit)\n"); fprintf(cff,"%%%%Title: (FontSet/%s)\n", sf->fontname); fprintf(cff,"%%%%EndComments\n" ); fprintf(cff,"%%%%IncludeResource: ProcSet(FontSetInit)\n" ); fprintf(cff,"%%%%BeginResource: FontSet(%s)\n", sf->fontname ); fprintf(cff,"/FontSetInit /ProcSet findresource begin\n" ); fseek(at->cfff,0,SEEK_END); len = ftell(at->cfff); rewind(at->cfff); sprintf( buffer, "/%s %ld StartData\n", sf->fontname, len ); fprintf(cff,"%%%%BeginData: %ld Binary Bytes\n", (long) (len+strlen(buffer)) ); fputs(buffer,cff); if ( !ttfcopyfile(cff,at->cfff,ftell(cff),"CFF")) at->error = true; fprintf(cff,"\n%%%%EndData\n" ); fprintf(cff,"%%%%EndResource\n" ); fprintf(cff,"%%%%EOF\n" ); } return( !at->error ); } static void ATinit(struct alltabs *at,SplineFont *sf,EncMap *map,int flags, int layer, enum fontformat format, enum bitmapformat bf,int *bsizes) { at->gi.flags = flags; at->gi.layer = layer; at->gi.is_ttf = format == ff_ttf || format==ff_ttfsym || format==ff_ttfmacbin || format==ff_ttfdfont; at->gi.sf = sf; at->applemode = (flags&ttf_flag_applemode)?1:0; at->opentypemode = (flags&ttf_flag_otmode)?1:0; at->msbitmaps = bsizes!=NULL && at->opentypemode; at->applebitmaps = bsizes!=NULL && at->applemode; at->gi.onlybitmaps = format==ff_none; if ( bf==bf_sfnt_dfont ) { at->msbitmaps = false; at->applebitmaps=true; at->opentypemode=false; at->gi.onlybitmaps=true;} if ( bf==bf_sfnt_ms ) { at->msbitmaps = true; at->applebitmaps=false; at->applemode=false; at->gi.onlybitmaps=true;} if ( bf==bf_otb ) { at->otbbitmaps = true; at->applebitmaps=at->msbitmaps=false; at->applemode=false; at->gi.onlybitmaps=true;} if ( bsizes!=NULL && !at->applebitmaps && !at->otbbitmaps && !at->msbitmaps ) at->msbitmaps = true; /* They asked for bitmaps, but no bitmap type selected */ at->gi.bsizes = bsizes; at->gi.fixed_width = CIDOneWidth(sf); at->isotf = format==ff_otf || format==ff_otfcid; at->format = format; at->next_strid = 256; if ( at->applemode && sf->mm!=NULL && sf->mm->apple && (format==ff_ttf || format==ff_ttfsym || format==ff_ttfmacbin || format==ff_ttfdfont) && MMValid(sf->mm,false)) { at->dovariations = true; at->gi.dovariations = true; sf = sf->mm->normal; } at->sf = sf; at->map = map; } int _WriteTTFFont(FILE *ttf,SplineFont *sf,enum fontformat format, int32 *bsizes, enum bitmapformat bf,int flags,EncMap *map, int layer) { struct alltabs at; int i, anyglyphs; short_too_long_warned = 0; // This is a static variable defined for putshort. /* TrueType probably doesn't need this, but OpenType does for floats in dictionaries */ ff_locale_t tmplocale, oldlocale; // Declare temporary locale storage. switch_to_c_locale(&tmplocale, &oldlocale); // Switch to the C locale temporarily and cache the old locale. if ( format==ff_otfcid || format== ff_cffcid ) { if ( sf->cidmaster ) sf = sf->cidmaster; } else { if ( sf->subfontcnt!=0 ) sf = sf->subfonts[0]; } if ( sf->subfontcnt==0 ) { anyglyphs = false; for ( i=sf->glyphcnt-1; i>=0 ; --i ) { if ( SCWorthOutputting(sf->glyphs[i])) { anyglyphs = true; if ( sf->glyphs[i]->unicodeenc!=-1 ) break; } } if ( !anyglyphs && !sf->internal_temp ) { ff_post_error(_("No Encoded Glyphs"),_("Warning: Font contained no glyphs")); } if ( format!=ff_ttfsym && !(flags&ttf_flag_symbol) && !sf->internal_temp ) { if ( i<0 && anyglyphs ) { if ( map->enccount<=256 ) { char *buts[3]; buts[0] = _("_Yes"); buts[1] = _("_No"); buts[2] = NULL; if ( ff_ask(_("No Encoded Glyphs"),(const char **) buts,0,1,_("This font contains no glyphs with unicode encodings.\nWould you like to use a \"Symbol\" encoding instead of Unicode?"))==0 ) flags |= ttf_flag_symbol; } else ff_post_error(_("No Encoded Glyphs"),_("This font contains no glyphs with unicode encodings.\nYou will probably not be able to use the output.")); } } } for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->ttf_glyph = -1; memset(&at,'\0',sizeof(struct alltabs)); ATinit(&at,sf,map,flags,layer,format,bf,bsizes); if ( format==ff_cff || format==ff_cffcid ) { dumpcff(&at,sf,format,ttf); } else { if ( initTables(&at,sf,format,bsizes,bf)) dumpttf(ttf,&at); } switch_to_old_locale(&tmplocale, &oldlocale); // Switch to the cached locale. 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,EncMap *map, int layer) { FILE *ttf; int ret; if ( strstr(fontname,"://")!=NULL ) { if (( ttf = tmpfile2())==NULL ) return( 0 ); } else { if (( ttf=fopen(fontname,"wb+"))==NULL ) return( 0 ); } ret = _WriteTTFFont(ttf,sf,format,bsizes,bf,flags,map,layer); if ( ret && (flags&ttf_flag_glyphmap) ) DumpGlyphToNameMap(fontname,sf); if ( fclose(ttf)==-1 ) return( 0 ); return( ret ); } /* ************************************************************************** */ /* ****************************** Type42 stuff ****************************** */ /* ************************************************************************** */ /* ******************************* TTC stuff ******************************** */ /* ************************************************************************** */ typedef struct splinecharlist *UHash[65536]; typedef struct splinecharlist *NHash[257]; static unsigned int hashname(const char *name) { unsigned int hash = 0; while ( *name ) { unsigned int extra = (hash>>27); hash<<=5; hash += *name&0x1f; hash ^= extra; ++name; } return( hash % 257 ); } static int glyphmatches(SplineChar *sc,SplineChar *sc2,int layer) { RefChar *r, *r2; SplineSet *ss, *ss2; SplinePoint *sp, *sp2; if ( sc->width!=sc2->width ) return( false ); if ( sc->ttf_instrs_len != sc2->ttf_instrs_len ) return( false ); if ( sc->ttf_instrs_len!=0 && memcmp(sc->ttf_instrs,sc2->ttf_instrs,sc->ttf_instrs_len)!=0 ) return( false ); for ( r=sc->layers[layer].refs, r2=sc2->layers[layer].refs; r!=NULL && r2!=NULL; r = r->next, r2 = r2->next ) { if ( r->transform[0] != r2->transform[0] || r->transform[1] != r2->transform[1] || r->transform[2] != r2->transform[2] || r->transform[3] != r2->transform[3] || r->transform[4] != r2->transform[4] || r->transform[5] != r2->transform[5] ) return( false ); if ( r->sc->unicodeenc!=r2->sc->unicodeenc ) return( false ); if ( r->sc->unicodeenc==-1 && strcmp(r->sc->name,r2->sc->name)!=0 ) return( false ); } if ( r!=NULL || r2!=NULL ) return( false ); for ( ss=sc->layers[layer].splines, ss2=sc2->layers[layer].splines; ss!=NULL && ss2!=NULL; ss = ss->next, ss2 = ss2->next ) { for ( sp=ss->first, sp2=ss2->first; sp!=NULL && sp2!=NULL; ) { if ( sp->me.x != sp2->me.x || sp->me.y != sp2->me.y || sp->nextcp.x != sp2->nextcp.x || sp->nextcp.y != sp2->nextcp.y || sp->prevcp.x != sp2->prevcp.x || sp->prevcp.y != sp2->prevcp.y ) return( false ); sp = (sp->next ? sp->next->to : NULL); sp2 = (sp2->next ? sp2->next->to : NULL); if ( sp==ss->first ) { if ( sp2==ss2->first ) break; return( false ); } else if ( sp2==ss2->first ) return( false ); } if (( sp==NULL && sp2!=NULL ) || ( sp!=NULL && sp2==NULL )) return( false ); } if ( ss==NULL && ss2==NULL ) return( true ); return( false ); } static SplineChar *hashglyphfound(SplineChar *sc,UHash *uhash,NHash *nhash,int layer) { int hash; struct splinecharlist *test; struct altuni *alt; /* the unicodeenc might be unset and we might still have altunis if the */ /* glyph is controlled by a variant selector */ if ( sc->unicodeenc==-1 && sc->altuni==NULL ) { hash = hashname(sc->name); for ( test=(*nhash)[hash]; test!=NULL; test=test->next ) if ( strcmp(test->sc->name,sc->name)==0 && glyphmatches(sc,test->sc,layer)) return( test->sc ); } else if ( sc->unicodeenc!=-1 ) { hash = sc->unicodeenc&0xffff; for ( test=(*uhash)[hash]; test!=NULL; test=test->next ) if ( glyphmatches(sc,test->sc,layer)) return( test->sc ); } for ( alt=sc->altuni; alt!=NULL; alt=alt->next ) { hash = alt->unienc&0xffff; for ( test=(*uhash)[hash]; test!=NULL; test=test->next ) if ( glyphmatches(sc,test->sc,layer)) return( test->sc ); } return( NULL ); } static void hashglyphadd(SplineChar *sc,UHash *uhash,NHash *nhash) { int hash; struct splinecharlist *test; struct altuni *alt; if ( sc->unicodeenc==-1 && sc->altuni==NULL ) { hash = hashname(sc->name); test = chunkalloc(sizeof(struct splinecharlist)); test->sc = sc; test->next = (*nhash)[hash]; (*nhash)[hash] = test; } else if ( sc->unicodeenc!=-1 ) { hash = sc->unicodeenc&0xffff; test = chunkalloc(sizeof(struct splinecharlist)); test->sc = sc; test->next = (*uhash)[hash]; (*uhash)[hash] = test; } for ( alt=sc->altuni; alt!=NULL; alt=alt->next ) { hash = alt->unienc&0xffff; test = chunkalloc(sizeof(struct splinecharlist)); test->sc = sc; test->next = (*uhash)[hash]; (*uhash)[hash] = test; } } static struct alltabs *ttc_prep(struct sflist *sfs, enum fontformat format, enum bitmapformat bf,int flags, int layer,SplineFont *dummysf) { struct alltabs *ret; int fcnt, cnt, gcnt=3; struct sflist *sfitem; int emsize = -1; UHash *uhash; /* hash glyphs by unicode */ NHash *nhash; /* hash glyphs by name if no unicode */ int anyvmetrics = false; int *bygid; SplineFont *sf; SplineChar *sc, *test; int i, aborted; for ( sfitem= sfs, cnt=0; sfitem!=NULL; sfitem=sfitem->next, ++cnt ) { sf = sfitem->sf; /* to share the same 'head' table all must be the same emsize */ if ( emsize==-1 ) emsize = sf->ascent + sf->descent; else if ( emsize != sf->ascent + sf->descent ) return( NULL ); if ( format==ff_otf && !PSDictSame(sf->private,sfs->sf->private)) return( NULL ); if ( sf->hasvmetrics ) anyvmetrics = true; for ( i=0; iglyphcnt; ++i ) if ( (sc = sf->glyphs[i])!=NULL ) sc->ttf_glyph = -1; gcnt += sf->glyphcnt; } if ( cnt==0 ) return( NULL ); fcnt = cnt; uhash = calloc(1,sizeof(UHash)); nhash = calloc(1,sizeof(NHash)); *dummysf = *sfs->sf; dummysf->glyphmax = gcnt; dummysf->glyphs = calloc(gcnt,sizeof(SplineChar *)); dummysf->glyphcnt = 0; dummysf->hasvmetrics = anyvmetrics; bygid = malloc((gcnt+3)*sizeof(int)); memset(bygid,0xff, (gcnt+3)*sizeof(int)); for ( sfitem= sfs; sfitem!=NULL; sfitem=sfitem->next ) { AssignNotdefNull(sfitem->sf,bygid,false); if ( bygid[0]!=-1 && dummysf->glyphs[0]==NULL ) { dummysf->glyphs[0] = sfitem->sf->glyphs[bygid[0]]; bygid[0]=0; } if ( format==ff_ttf ) { if ( bygid[1]!=-1 && dummysf->glyphs[1]==NULL ) { dummysf->glyphs[1] = sfitem->sf->glyphs[bygid[1]]; bygid[1]=1; } if ( bygid[2]!=-1 && dummysf->glyphs[2]==NULL ) { dummysf->glyphs[2] = sfitem->sf->glyphs[bygid[2]]; bygid[2]=2; } if ( bygid[0]!=-1 && bygid[1]!=-1 && bygid[2]!=-1 ) break; } else { if ( bygid[0]!=-1 ) break; } } dummysf->glyphcnt = format==ff_ttf ? 3 : 1; ret = calloc(fcnt+2,sizeof(struct alltabs)); ATinit(&ret[fcnt],dummysf,sfs->map,flags&~ttf_flag_dummyDSIG, layer,format,bf,NULL); ret[fcnt].gi.ttc_composite_font = true; ATmaxpInit(&ret[fcnt],dummysf,format); for ( sfitem= sfs, cnt=0; sfitem!=NULL; sfitem=sfitem->next, ++cnt ) { sf = sfitem->sf; ATinit(&ret[cnt],sf,sfitem->map,flags&~ttf_flag_dummyDSIG, layer,format,bf,sfitem->sizes); ret[cnt].gi.bygid = malloc((gcnt+3)*sizeof(int)); memset(ret[cnt].gi.bygid,-1,(gcnt+3)*sizeof(int)); for ( i=0; iglyphcnt; ++i ) { if ( SCWorthOutputting(sc = sf->glyphs[i])) { if ( sc->ttf_glyph==-1 ) { if ( strcmp(sc->name,".notdef")==0 ) sc->ttf_glyph = bygid[0]; else if ( format==ff_ttf && (strcmp(sf->glyphs[i]->name,".null")==0 || strcmp(sf->glyphs[i]->name,"uni0000")==0 || (i==1 && strcmp(sf->glyphs[1]->name,"glyph1")==0)) ) sc->ttf_glyph = bygid[1]; else if ( format==ff_ttf && (strcmp(sf->glyphs[i]->name,"nonmarkingreturn")==0 || strcmp(sf->glyphs[i]->name,"uni000D")==0 || (i==2 && strcmp(sf->glyphs[2]->name,"glyph2")==0))) sc->ttf_glyph = bygid[2]; else { test = hashglyphfound(sc,uhash,nhash,layer); if ( test!=NULL ) sc->ttf_glyph = test->ttf_glyph; else { sc->ttf_glyph = dummysf->glyphcnt++; bygid[sc->ttf_glyph] = sc->ttf_glyph; dummysf->glyphs[sc->ttf_glyph] = sc; hashglyphadd(sc,uhash,nhash); } } } if ( sc->ttf_glyph!=-1 ) { ret[cnt].gi.bygid[sc->ttf_glyph] = i; if ( sc->ttf_glyph>=ret[cnt].gi.gcnt ) ret[cnt].gi.gcnt = sc->ttf_glyph+1; } } if ( sc!=NULL ) sc->lsidebearing = 0x7fff; } MaxpFromTable(&ret[cnt],sf); if ( ret[cnt].maxp.maxZones > ret[fcnt].maxp.maxZones ) ret[fcnt].maxp.maxZones = ret[cnt].maxp.maxZones; if ( ret[cnt].maxp.maxTwilightPts > ret[fcnt].maxp.maxTwilightPts ) ret[fcnt].maxp.maxTwilightPts = ret[cnt].maxp.maxTwilightPts; if ( ret[cnt].maxp.maxStorage > ret[fcnt].maxp.maxStorage ) ret[fcnt].maxp.maxStorage = ret[cnt].maxp.maxStorage; if ( ret[cnt].maxp.maxFDEFs > ret[fcnt].maxp.maxFDEFs ) ret[fcnt].maxp.maxFDEFs = ret[cnt].maxp.maxFDEFs; if ( ret[cnt].maxp.maxIDEFs > ret[fcnt].maxp.maxIDEFs ) ret[fcnt].maxp.maxIDEFs = ret[cnt].maxp.maxIDEFs; if ( ret[cnt].maxp.maxStack > ret[fcnt].maxp.maxStack ) ret[fcnt].maxp.maxStack = ret[cnt].maxp.maxStack; } free(uhash); free(nhash); if ( dummysf->glyphcnt>0xffff ) { free(dummysf->glyphs); free(bygid); for ( sfitem= sfs, cnt=0; sfitem!=NULL; sfitem=sfitem->next, ++cnt ) free(ret[cnt].gi.bygid); free(ret); return( NULL ); } ret[fcnt].gi.fixed_width = CIDOneWidth(sf); ret[fcnt].gi.bygid = bygid; ret[fcnt].gi.gcnt = ret[fcnt].maxp.numGlyphs = dummysf->glyphcnt; if ( format==ff_ttf ) aborted = !dumpglyphs(dummysf,&ret[cnt].gi); else aborted = !dumptype2glyphs(dummysf,&ret[cnt]); if ( aborted ) { free(dummysf->glyphs); free(bygid); for ( sfitem= sfs, cnt=0; sfitem!=NULL; sfitem=sfitem->next, ++cnt ) free(ret[cnt].gi.bygid); free(ret); return( NULL ); } sethhead(&ret[fcnt].hhead,&ret[fcnt].vhead,&ret[fcnt],dummysf); for ( sfitem= sfs, cnt=0; sfitem!=NULL; sfitem=sfitem->next, ++cnt ) ret[cnt].maxp = ret[fcnt].maxp; /* Just to get a timestamp for all other heads */ /* and to figure out whether 'loca' is 4byte or 2 */ sethead(&ret[fcnt].head,dummysf,&ret[fcnt],format,NULL); if ( format==ff_ttf ) redoloca(&ret[fcnt]); redohhead(&ret[fcnt],false); if ( dummysf->hasvmetrics ) redohhead(&ret[fcnt],true); ttf_fftm_dump(dummysf,&ret[fcnt]); return( ret ); } static FILE *checkdupstoredtable(SplineFont *sf,uint32 tag,int *len, struct alltabs *all, int me) { int i; struct ttf_table *tab = SFFindTable(sf,tag), *test; if ( tab==NULL ) { *len = 0; return( NULL ); } for ( i=0; ilen==tab->len && memcmp(test->data,tab->data,tab->len)==0 ) { *len = i; return( (FILE *) (intpt) -1 ); } } return( dumpstoredtable(sf,tag,len)); } static void ttc_perfonttables(struct alltabs *all, int me, int mainpos, enum fontformat format ) { struct alltabs *at = &all[me]; struct alltabs *tabsmain = &all[mainpos]; SplineFont *sf = at->sf; struct ttf_table *tab; at->gi.xmin = tabsmain->gi.xmin; at->gi.xmax = tabsmain->gi.xmax; at->gi.ymin = tabsmain->gi.ymin; at->gi.ymax = tabsmain->gi.ymax; at->gi.glyph_len = tabsmain->gi.glyph_len; at->gi.gcnt = tabsmain->maxp.numGlyphs; sethead(&at->head,sf,at,format,NULL); memcpy(at->head.modtime,tabsmain->head.modtime,sizeof(at->head.modtime)); memcpy(at->head.createtime,at->head.modtime,sizeof(at->head.modtime)); initATTables(at, sf, format); /* also name and OS/2 */ if ( format==ff_ttf ) { if ( sf->gasp_cnt!=0 || !SFHasInstructions(sf) ) dumpgasp(at, sf); at->fpgmf = checkdupstoredtable(sf,CHR('f','p','g','m'),&at->fpgmlen, all, me); at->prepf = checkdupstoredtable(sf,CHR('p','r','e','p'),&at->preplen, all, me); at->cvtf = checkdupstoredtable(sf,CHR('c','v','t',' '),&at->cvtlen, all, me); } for ( tab=sf->ttf_tab_saved; tab!=NULL; tab=tab->next ) tab->temp = dumpsavedtable(tab); { /* post table is expected to have names for every glyph (or none) even*/ /* those not used in this font. Now it might seem we could just share*/ /* the post table, but it also contains a few font specific things */ /* (italic angle, etc.) so dump one for each font and hope that we'll*/ /* be able to coalesce them later when we check if any tables are the*/ /* same across fonts */ int cnt = sf->glyphcnt; SplineChar **g = sf->glyphs; int *bygid = at->gi.bygid; sf->glyphcnt = tabsmain->sf->glyphcnt; sf->glyphs = tabsmain->sf->glyphs; at->gi.bygid = tabsmain->gi.bygid; dumppost(at,sf,format); sf->glyphcnt = cnt; sf->glyphs = g; at->gi.bygid = bygid; } dumpcmap(at,sf,format); redohead(at); pfed_dump(at,sf); tex_dump(at,sf); /* These tables are always to be shared and are found in the extra structure */ /* called main */ if ( format==ff_ttf ) { at->loca = (void *) (intpt) -1; at->localen = mainpos; at->gi.glyphs = (void *) (intpt) -1; at->gi.glyph_len = mainpos; } else { at->cfff = (void *) (intpt) -1; at->cfflen = mainpos; } at->fftmf = (void *) (intpt) -1; at->fftmlen = mainpos; at->hheadf = (void *) (intpt) -1; at->hheadlen = mainpos; at->gi.hmtx = (void *) (intpt) -1; at->gi.hmtxlen = mainpos; at->maxpf = (void *) (intpt) -1; at->maxplen = mainpos; if ( all[mainpos].vheadf!=NULL ) { at->vheadf = (void *) (intpt) -1; at->vheadlen = mainpos; at->gi.vmtx = (void *) (intpt) -1; at->gi.vmtxlen = mainpos; } free(at->gi.bygid); } static int tablefilematch(struct taboff *tab,FILE *ttc,struct alltabs *all,int pos) { int i, ch1, ch2; struct taboff *test; unsigned len; /* See if this table (which lives in its own file) matches any tables */ /* with the same tag in an earlier font */ for ( i=0; itag); if ( test==NULL || test->data==(void *) (intpt) -1 || test->length!=tab->length ) continue; rewind(tab->data); fseek(ttc,test->offset,SEEK_SET); for ( len=0; lenlength && (ch1=getc(tab->data))!=EOF && (ch2=getc(ttc))!=EOF; ++len ) { if ( ch1!=ch2 ) break; } if ( len==tab->length ) { rewind(tab->data); fseek(ttc,0,SEEK_END); return( i ); } } rewind(tab->data); fseek(ttc,0,SEEK_END); return( -1 ); } static void ttc_dump(FILE *ttc,struct alltabs *all, enum fontformat format, int flags, enum ttc_flags ttc_flags ) { int i,j,cnt,tot,ch,dup; int offset, startoffset; struct taboff *tab; for ( cnt=0; all[cnt].sf!=NULL; ++cnt ); --cnt; /* Last one is dummysf */ putlong(ttc,CHR('t','t','c','f')); if ( flags&ttf_flag_dummyDSIG ) { putlong(ttc,0x00020000); startoffset = 4*(3+cnt+4); } else { putlong(ttc,0x00010000); startoffset = 4*(3+cnt); } putlong(ttc,cnt); offset = startoffset; for ( i=0; ioffset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; tab = findtabindir(&all[cnt].tabdir,CHR('v','h','e','a')); if ( tab!=NULL ) { tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; } tab = findtabindir(&all[cnt].tabdir,CHR('m','a','x','p')); tab->offset = ftell(ttc); for ( i=0; i<64; ++i ) /* maxp table is 64 bytes, fill in later */ putc('\0', ttc); tab = findtabindir(&all[cnt].tabdir,CHR('F','F','T','M')); tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; for ( i=0; iglyphs); free(all[cnt].gi.bygid); /* Now dump the big shared tables */ tab = findtabindir(&all[cnt].tabdir,CHR('h','m','t','x')); tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; tab = findtabindir(&all[cnt].tabdir,CHR('v','m','t','x')); if ( tab!=NULL ) { tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; } if ( format==ff_ttf ) { tab = findtabindir(&all[cnt].tabdir,CHR('l','o','c','a')); tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; tab = findtabindir(&all[cnt].tabdir,CHR('g','l','y','f')); tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; } else { tab = findtabindir(&all[cnt].tabdir,CHR('C','F','F',' ')); tab->offset = ftell(ttc); tab->checksum = filechecksum(tab->data); if ( !ttfcopyfile(ttc,tab->data, tab->offset,Tag2String(tab->tag))) all[cnt].error = true; } /* Do maxp last, in case generating other tables changed it */ redomaxp(&all[cnt],format); tab = findtabindir(&all[cnt].tabdir,CHR('m','a','x','p')); fseek(ttc,tab->offset,SEEK_SET); tab->checksum = filechecksum(all[cnt].maxpf); tab->length = all[cnt].maxplen; rewind(all[cnt].maxpf); while ( (ch=getc(all[cnt].maxpf))!=EOF ) putc(ch,ttc); /* Now output the font headers */ for ( offset=startoffset, i=0; itabdir.numtab; ++j ) { struct taboff *curtab = &at->tabdir.tabs[j]; if ( curtab->data == (void *) (intpt) -1 ) { tab = findtabindir(&all[curtab->length].tabdir,curtab->tag); if ( tab==NULL ) { IError("Failed to find tab"); curtab->length = 0; curtab->offset = 0; curtab->checksum = 0; } else { curtab->offset = tab->offset; curtab->length = tab->length; curtab->checksum = tab->checksum; } } } fseek(ttc,offset,SEEK_SET); /* Put in alphabetic order */ for ( j=0; jtabdir.numtab; ++j ) at->tabdir.alpha[j] = &at->tabdir.tabs[j]; qsort(at->tabdir.alpha,at->tabdir.numtab,sizeof(struct taboff *),tagcomp); putlong(ttc,at->tabdir.version); putshort(ttc,at->tabdir.numtab); putshort(ttc,at->tabdir.searchRange); putshort(ttc,at->tabdir.entrySel); putshort(ttc,at->tabdir.rangeShift); for ( j=0; jtabdir.numtab; ++j ) { putlong(ttc,at->tabdir.alpha[j]->tag); putlong(ttc,at->tabdir.alpha[j]->checksum); putlong(ttc,at->tabdir.alpha[j]->offset); putlong(ttc,at->tabdir.alpha[j]->length); } } tab = findtabindir(&all[0].tabdir,CHR('h','e','a','d')); if ( tab!=NULL ) { /* As far as I can tell the file checksum is ignored */ int checksum; checksum = filechecksum(ttc); checksum = 0xb1b0afba-checksum; fseek(ttc,tab->offset+2*sizeof(int32),SEEK_SET); putlong(ttc,checksum); } } static void CopySFNTAndFixup(FILE *ttc,FILE *ttf) { /* ttf contains a truetype file which we want to copy into ttc */ /* Mostly this is just a dump copy, but the offset table at the */ /* start of the file must be adjusted to reflect the absolute */ /* locations of the tables in the ttc */ int offset = ftell(ttc); int val, table_cnt, i; fseek(ttf,0,SEEK_SET); val = getlong(ttf); putlong(ttc,val); /* sfnt version */ table_cnt = getushort(ttf); putshort(ttc,table_cnt); val = getushort(ttf); putshort(ttc,val); val = getushort(ttf); putshort(ttc,val); val = getushort(ttf); putshort(ttc,val); for ( i=0; inext, ++cnt ) { sfitem->tempttf = tmpfile2(); if ( sfitem->tempttf==NULL ) ok=0; else ok = _WriteTTFFont(sfitem->tempttf,sfitem->sf,format,sfitem->sizes, bf,flags&~ttf_flag_dummyDSIG,sfitem->map,layer); if ( !ok ) { for ( sfi2=sfs; sfi2!=NULL; sfi2 = sfi2->next ) if ( sfi2->tempttf!=NULL ) fclose(sfi2->tempttf ); fclose(ttc); return( true ); } fseek(sfitem->tempttf,0,SEEK_END); sfitem->len = ftell(sfitem->tempttf); } putlong(ttc,CHR('t','t','c','f')); if ( flags&ttf_flag_dummyDSIG ) { putlong(ttc,0x00020000); offset = 4*(3+cnt+4); } else { putlong(ttc,0x00010000); offset = 4*(3+cnt); } putlong(ttc,cnt); for ( sfitem= sfs; sfitem!=NULL; sfitem=sfitem->next ) { putlong(ttc,offset); offset += ((sfitem->len+3)>>2)<<2; /* Align on 4 byte boundary */ } if ( flags&ttf_flag_dummyDSIG ) { putlong(ttc,CHR('D','S','I','G')); putlong(ttc,8); /* Length of dummy DSIG table */ putlong(ttc,0x00000001); /* Standard DSIG version */ putlong(ttc,0); /* No Signatures, no flags */ } for ( sfitem= sfs; sfitem!=NULL; sfitem=sfitem->next ) CopySFNTAndFixup(ttc,sfitem->tempttf); if ( ftell(ttc)!=offset ) IError("Miscalculated offsets in ttc"); } else if ( ferror(ttc)) ok = false; if ( fclose(ttc)==-1 ) ok = false; if ( !ok ) LogError(_("Something went wrong")); return( ok ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/psfont.h0000664000175000017500000001720013510660062016061 00000000000000/* Copyright (C) 2000-2012 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) */ /* 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 *\/ */ }; 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; Encoding *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; long long creationtime; /* seconds since 1970 */ long long modificationtime; } FontDict; struct fddata { int leniv; int subrmapoff, sdbytes, subrcnt; int flexmax; unsigned int iscjk:1; struct pschars *subrs; }; struct cidbytes { int fdbytes, gdbytes, cidcnt; int cidmapoffset; int fdcnt; struct fddata *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 const char (*AdobeStandardEncoding[256]); extern const char (*AdobeExpertEncoding[256]); extern int copymetadata, copyttfinstr; extern FontDict *_ReadPSFont(FILE *ps); extern FontDict *ReadPSFont(char *fontname); extern void PSFontFree(FontDict *fd); #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/splineoverlap.c0000664000175000017500000003643313510660062017437 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include "edgelist2.h" #ifdef HAVE_IEEEFP_H # include /* Solaris defines isnan in ieeefp rather than math.h */ #endif /* First thing we do is divide each spline into a set of sub-splines each of */ /* which is monotonic in both x and y (always increasing or decreasing) */ /* Then we compare each monotonic spline with every other one and see if they*/ /* intersect. If they do, split each up into sub-sub-segments and create an*/ /* intersection point (note we need to be a little careful if an intersec- */ /* tion happens at an end point. We don't need to create a intersection for */ /* two adjacent splines, there isn't a real intersection... but if a third */ /* spline crosses that point (or ends there) then all three (four) splines */ /* need to be joined into an intersection point) */ /* Nasty things happen if splines are coincident. They will almost never be */ /* perfectly coincident and will keep crossing and recrossing as rounding */ /* errors suggest one is before the other. Look for coincident splines and */ /* treat the places they start and stop being coincident as intersections */ /* then when we find needed splines below look for these guys and ignore */ /* recrossings of splines which are close together */ /* Figure out if each monotonic sub-spline is needed or not */ /* (Note: It was tempting to split the bits up into real splines rather */ /* than keeping them as sub-sections of the original. Unfortunately this */ /* splitting introduced rounding errors which meant that we got more */ /* intersections, which meant that splines could be both needed and un. */ /* so I don't do that until later) */ /* if the spline hasn't been tagged yet: */ /* does the spline change greater in x or y? */ /* draw a line parallel to the OTHER axis which hits our spline and doesn't*/ /* hit any endpoints (or intersections, which are end points too now) */ /* count the winding number (as we do this we can mark other splines as */ /* needed or not) and figure out if our spline is needed */ /* So run through the list of intersections */ /* At an intersection there should be an even number of needed monos. */ /* Use this as the basis of a new splineset, trace it around until */ /* we get back to the start intersection (should happen) */ /* (Note: We may need to reverse a monotonic sub-spline or two) */ /* As we go, mark each monotonic as having been used */ /* Keep doing this until all needed exits from all intersections have been */ /* used. */ /* The free up our temporary data structures, merge in any open splinesets */ /* free the old closed splinesets */ // Frank recommends using the following macro whenever making changes // to this code and capturing and diffing output in order to track changes // in errors and reports. // (The pointers tend to clutter the diff a bit.) // #define FF_OVERLAP_VERBOSE static char *glyphname=NULL; static void SOError(const char *format,...) { va_list ap; va_start(ap,format); if ( glyphname==NULL ) fprintf(stderr, "Internal Error (overlap): " ); else fprintf(stderr, "Internal Error (overlap) in %s: ", glyphname ); vfprintf(stderr,format,ap); va_end(ap); } #ifdef FF_OVERLAP_VERBOSE #define ValidateMListTs_IF_VERBOSE(input) ValidateMListTs(input); #else #define ValidateMListTs_IF_VERBOSE(input) #endif static void Validate(Monotonic *ms, Intersection *ilist) { MList *ml; int mcnt; while ( ilist!=NULL ) { // For each listed intersection, verify that each connected monotonic // starts or ends at the intersection (identified by pointer, not geography). for ( mcnt=0, ml=ilist->monos; ml!=NULL; ml=ml->next ) { if ( ml->m->isneeded ) ++mcnt; if ( ml->m->start!=ilist && ml->m->end!=ilist ) SOError( "Intersection (%g,%g) not on a monotonic which should contain it.\n", (double) ilist->inter.x, (double) ilist->inter.y ); } if ( mcnt&1 ) SOError( "Odd number of needed monotonic sections at intersection. (%g,%g)\n", (double) ilist->inter.x,(double) ilist->inter.y ); ilist = ilist->next; } while ( ms!=NULL ) { if ( ms->prev == NULL ) SOError( "Open monotonic loop.\n" ); else if ( ms->prev->end!=ms->start ) SOError( "Mismatched intersection.\n (%g,%g)->(%g,%g) ends at (%g,%g) while (%g,%g)->(%g,%g) starts at (%g,%g)\n", (double) ms->prev->s->from->me.x,(double) ms->prev->s->from->me.y, (double) ms->prev->s->to->me.x,(double) ms->prev->s->to->me.y, (double) (ms->prev->end!=NULL?ms->prev->end->inter.x:-999999), (double) (ms->prev->end!=NULL?ms->prev->end->inter.y:-999999), (double) ms->s->from->me.x,(double) ms->s->from->me.y, (double) ms->s->to->me.x,(double) ms->s->to->me.y, (double) (ms->start!=NULL?ms->start->inter.x:-999999), (double) (ms->start!=NULL?ms->start->inter.y:-999999) ); ms = ms->linked; } } static Monotonic *SplineToMonotonic(Spline *s,extended startt,extended endt, Monotonic *last,int exclude) { Monotonic *m; BasePoint start, end; if ( startt==0 ) start = s->from->me; else { start.x = ((s->splines[0].a*startt+s->splines[0].b)*startt+s->splines[0].c)*startt + s->splines[0].d; start.y = ((s->splines[1].a*startt+s->splines[1].b)*startt+s->splines[1].c)*startt + s->splines[1].d; } if ( endt==1.0 ) end = s->to->me; else { end.x = ((s->splines[0].a*endt+s->splines[0].b)*endt+s->splines[0].c)*endt + s->splines[0].d; end.y = ((s->splines[1].a*endt+s->splines[1].b)*endt+s->splines[1].c)*endt + s->splines[1].d; } if ( ( (real) (((start.x+end.x)/2)==start.x || (real) ((start.x+end.x)/2)==end.x) && (real) (((start.y+end.y)/2)==start.y || (real) ((start.y+end.y)/2)==end.y) ) || (endt <= startt) || Within4RoundingErrors(startt, endt)) { /* The distance between the two extrema is so small */ /* as to be unobservable. In other words we'd end up with a zero*/ /* length spline */ if ( endt==1.0 && last!=NULL && last->s==s ) last->tend = endt; return( last ); } m = chunkalloc(sizeof(Monotonic)); m->s = s; m->tstart = startt; m->tend = endt; #ifdef FF_RELATIONAL_GEOM m->otstart = startt; m->otend = endt; #endif m->exclude = exclude; if ( end.x>start.x ) { m->xup = true; m->b.minx = start.x; m->b.maxx = end.x; } else { m->b.minx = end.x; m->b.maxx = start.x; } if ( end.y>start.y ) { m->yup = true; m->b.miny = start.y; m->b.maxy = end.y; } else { m->b.miny = end.y; m->b.maxy = start.y; } if ( last!=NULL ) { // Validate(last, NULL); last->next = m; last->linked = m; m->prev = last; // Validate(last, NULL); } return( m ); } static int BpSame(BasePoint *bp1, BasePoint *bp2) { BasePoint mid; mid.x = (bp1->x+bp2->x)/2; mid.y = (bp1->y+bp2->y)/2; if ( (bp1->x==mid.x || bp2->x==mid.x) && (bp1->y==mid.y || bp2->y==mid.y)) return( true ); return( false ); } static int SSRmNullSplines(SplineSet *spl) { Spline *s, *first, *next; first = NULL; for ( s=spl->first->next ; s!=first; s=next ) { next = s->to->next; if ( ((s->splines[0].a>-.01 && s->splines[0].a<.01 && s->splines[0].b>-.01 && s->splines[0].b<.01 && s->splines[1].a>-.01 && s->splines[1].a<.01 && s->splines[1].b>-.01 && s->splines[1].b<.01) || /* That describes a null spline (a line between the same end-point) */ RealNear((s->from->nextcp.x-s->from->me.x)*(s->to->me.y-s->to->prevcp.y)- (s->from->nextcp.y-s->from->me.y)*(s->to->me.x-s->to->prevcp.x),0)) && /* And the above describes a point with a spline between it */ /* and itself where the spline covers no area (the two cps */ /* point in the same direction) */ BpSame(&s->from->me,&s->to->me)) { if ( next==s ) return( true ); if ( next->from->selected ) s->from->selected = true; s->from->next = next; s->from->nextcp = next->from->nextcp; s->from->nonextcp = next->from->nonextcp; s->from->nextcpdef = next->from->nextcpdef; SplinePointFree(next->from); if ( spl->first==next->from ) spl->last = spl->first = s->from; next->from = s->from; SplineFree(s); } else { if ( first==NULL ) first = s; } } return( false ); } static Monotonic *SSToMContour(SplineSet *spl, Monotonic *start, Monotonic **end, enum overlap_type ot) { extended ts[4]; Spline *first, *s; Monotonic *head=NULL, *last=NULL; int cnt, i, selected = false; extended lastt; if ( spl->first->prev==NULL ) return( start ); /* Open contours have no interior, ignore 'em */ if ( spl->first->prev->from==spl->first && spl->first->noprevcp && spl->first->nonextcp ) return( start ); /* Let's just remove single points */ if ( ot==over_rmselected || ot==over_intersel || ot==over_fisel ) { if ( !selected ) return( start ); } /* We blow up on zero length splines. And a zero length contour is nasty */ if ( SSRmNullSplines(spl)) return( start ); first = NULL; for ( s=spl->first->next; s!=first; s=s->to->next ) { if ( first==NULL ) first = s; cnt = Spline2DFindExtrema(s,ts); lastt = 0; for ( i=0; iprev = last; last->next = head; if ( start==NULL ) start = head; else (*end)->linked = head; *end = last; Validate(start, NULL); return( start ); } Monotonic *SSsToMContours(SplineSet *spl, enum overlap_type ot) { Monotonic *head=NULL, *last = NULL; while ( spl!=NULL ) { if ( spl->first->prev!=NULL ) head = SSToMContour(spl,head,&last,ot); spl = spl->next; } return( head ); } /* An IEEE double has 52 bits of precision. So one unit of rounding error will be */ /* the number divided by 2^51 */ # define BR_RE_Factor (1024.0*1024.0*1024.0*1024.0*1024.0*2.0) /* But that's not going to work near 0, so, since the t values we care about */ /* are [0,1], let's use 1.0/D_RE_Factor */ #ifdef FF_OVERLAP_VERBOSE #define FF_DUMP_MONOTONIC_IF_VERBOSE(m) DumpMonotonic(m); #else #define FF_DUMP_MONOTONIC_IF_VERBOSE(m) #endif static int mcmp(const void *_p1, const void *_p2) { const Monotonic * const *mpt1 = _p1, * const *mpt2 = _p2; if ( (*mpt1)->other>(*mpt2)->other ) return( 1 ); else if ( (*mpt1)->other<(*mpt2)->other ) return( -1 ); return( 0 ); } int CheckMonotonicClosed(struct monotonic *ms) { struct monotonic * current; if (ms == NULL) return 0; current = ms->next; while (current != ms && current != NULL) { current = current->next; } if (current == NULL) return 0; return 1; } int MonotonicFindAt(Monotonic *ms,int which, extended test, Monotonic **space ) { /* Find all monotonic sections which intersect the line (x,y)[which] == test */ /* find the value of the other coord on that line */ /* Order them (by the other coord) */ /* then run along that line figuring out which monotonics are needed */ extended t; Monotonic *m, *mm; int i, j, k, cnt; int nw = !which; for ( m=ms, i=0; m!=NULL; m=m->linked ) { if (CheckMonotonicClosed(m) == 0) continue; // Open monotonics break things. if (( which==0 && test >= m->b.minx && test <= m->b.maxx ) || ( which==1 && test >= m->b.miny && test <= m->b.maxy )) { /* Lines parallel to the direction we are testing just get in the */ /* way and don't add any useful info */ if ( m->s->knownlinear && (( which==1 && m->s->from->me.y==m->s->to->me.y ) || (which==0 && m->s->from->me.x==m->s->to->me.x))) continue; t = IterateSplineSolveFixup(&m->s->splines[which],m->tstart,m->tend,test); if ( t==-1 ) { if ( which==0 ) { if (( test-m->b.minx > m->b.maxx-test && m->xup ) || ( test-m->b.minx < m->b.maxx-test && !m->xup )) t = m->tstart; else t = m->tend; } else { if (( test-m->b.miny > m->b.maxy-test && m->yup ) || ( test-m->b.miny < m->b.maxy-test && !m->yup )) t = m->tstart; else t = m->tend; } } m->t = t; if ( t==m->tend ) t -= (m->tend-m->tstart)/100; else if ( t==m->tstart ) t += (m->tend-m->tstart)/100; m->other = ((m->s->splines[nw].a*t+m->s->splines[nw].b)*t+ m->s->splines[nw].c)*t+m->s->splines[nw].d; space[i++] = m; } } cnt = i; /* Things get a little tricky at end-points */ for ( i=0; it==m->tend ) { /* Ignore horizontal/vertical lines (as appropriate) */ for ( mm=m->next; mm!=m && mm !=NULL; mm=mm->next ) { if ( !mm->s->knownlinear ) break; if (( which==1 && mm->s->from->me.y!=m->s->to->me.y ) || (which==0 && mm->s->from->me.x!=m->s->to->me.x)) break; } } else if ( m->t==m->tstart ) { for ( mm=m->prev; mm!=m && mm !=NULL; mm=mm->prev ) { if ( !mm->s->knownlinear ) break; if (( which==1 && mm->s->from->me.y!=m->s->to->me.y ) || (which==0 && mm->s->from->me.x!=m->s->to->me.x)) break; } } else break; /* If the next monotonic continues in the same direction, and we found*/ /* it too, then don't count both. They represent the same intersect */ /* If they are in oposite directions then they cancel each other out */ /* and that is correct */ if ( mm!=m && /* Should always be true */ (&mm->xup)[which]==(&m->xup)[which] ) { for ( j=cnt-1; j>=0; --j ) if ( space[j]==mm ) break; if ( j!=-1 ) { /* remove mm */ for ( k=j+1; kj ) --i; } } } space[cnt] = NULL; space[cnt+1] = NULL; qsort(space,cnt,sizeof(Monotonic *),mcmp); return(cnt); } void FreeMonotonics(Monotonic *m) { Monotonic *next; while ( m!=NULL ) { next = m->linked; chunkfree(m,sizeof(*m)); m = next; } } dvisvgm-2.8.1/libs/ff-woff/fontforge/nouiutil.c0000664000175000017500000001065013510660062016415 00000000000000/* Copyright (C) 2000-2012 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 "uiinterface.h" #include "splinefont.h" static void NOUI_IError(const char *format,...) { va_list ap; char buffer[400], *str; va_start(ap,format); fprintf(stderr, "Internal Error: " ); vsnprintf(buffer,sizeof(buffer),format,ap); str = buffer; fprintf(stderr,"%s",str); if ( str[strlen(str)-1]!='\n' ) putc('\n',stderr); va_end(ap); } static void NOUI__LogError(const char *format,va_list ap) { char buffer[400], *str; vsnprintf(buffer,sizeof(buffer),format,ap); str = buffer; fprintf(stderr,"%s",str); if ( str[strlen(str)-1]!='\n' ) putc('\n',stderr); } static void NOUI_LogError(const char *format,...) { va_list ap; va_start(ap,format); NOUI__LogError(format,ap); va_end(ap); } static void NOUI_post_notice(const char *title,const char *statement,...) { va_list ap; va_start(ap,statement); NOUI__LogError(statement,ap); va_end(ap); } static void NOUI_post_error(const char *title,const char *statement,...) { va_list ap; va_start(ap,statement); NOUI__LogError(statement,ap); va_end(ap); } static int NOUI_ask(const char *title, const char **answers, int def, int cancel,const char *question,...) { return( def ); } static int NOUI_choose(const char *title, const char **choices,int cnt, int def, const char *question,...) { return( def ); } static int NOUI_choose_multiple(char *title, const char **choices,char *sel, int cnt, char *buts[2], const char *question,...) { return( -1 ); } static char *NOUI_ask_string(const char *title, const char *def, const char *question,...) { return( (char *) def ); } static char *NOUI_open_file(const char *title, const char *defaultfile, const char *initial_filter) { return( NULL ); } static char *NOUI_saveas_file(const char *title, const char *defaultfile, const char *initial_filter) { return( copy(defaultfile) ); } static void NOUI_progress_start(int delay, const char *title, const char *line1, const char *line2, int tot, int stages) { } static void NOUI_void_void_noop(void) { } static void NOUI_void_int_noop(int useless) { } static int NOUI_int_int_noop(int useless) { return( true ); } static void NOUI_void_str_noop(const char * useless) { } static int NOUI_alwaystrue(void) { return( true ); } static int NOUI_DefaultStrokeFlags(void) { return( sf_correctdir ); } static struct ui_interface noui_interface = { NOUI_IError, NOUI_post_error, NOUI_LogError, NOUI_post_notice, NOUI_ask, NOUI_choose, NOUI_choose_multiple, NOUI_ask_string, NOUI_ask_string, /* password */ NOUI_open_file, NOUI_saveas_file, NOUI_progress_start, NOUI_void_void_noop, NOUI_void_void_noop, NOUI_void_int_noop, NOUI_alwaystrue, NOUI_alwaystrue, NOUI_int_int_noop, NOUI_void_str_noop, NOUI_void_str_noop, NOUI_void_void_noop, NOUI_void_void_noop, NOUI_void_int_noop, NOUI_void_int_noop, NOUI_alwaystrue, NOUI_void_void_noop, NOUI_DefaultStrokeFlags }; struct ui_interface *ui_interface = &noui_interface; dvisvgm-2.8.1/libs/ff-woff/fontforge/ustring.c0000664000175000017500000001444313510660062016244 00000000000000/* Copyright (C) 2000-2012 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 "ustring.h" int u_strlen(register const unichar_t *str) { register int len = 0; while ( *str++!='\0' ) ++len; return( len ); } unichar_t *utf82u_strncpy(unichar_t *ubuf,const char *utf8buf,int len) { unichar_t *upt=ubuf, *uend=ubuf+len-1; const uint8 *pt = (const uint8 *) utf8buf, *end = pt+strlen(utf8buf); int w, w2; while ( pt>4) )-1; w = (w<<6) | ((pt[1]&0xf)<<2) | ((pt[2]&0x30)>>4); w2 = ((pt[2]&0xf)<<6) | (pt[3]&0x3f); *upt = w*0x400 + w2 + 0x10000; pt += 4; } ++upt; } *upt = '\0'; return( ubuf ); } unichar_t *utf82u_copy(const char *utf8buf) { int len; unichar_t *ubuf; if ( utf8buf==NULL ) return( NULL ); len = strlen(utf8buf); ubuf = (unichar_t *) malloc((len+1)*sizeof(unichar_t)); return( utf82u_strncpy(ubuf,utf8buf,len+1)); } char *latin1_2_utf8_strcpy(char *utf8buf,const char *lbuf) { char *pt = utf8buf; const unsigned char *lpt = (const unsigned char *) lbuf; while ( *lpt ) { if ( *lpt<0x80 ) *pt++ = *lpt; else { *pt++ = 0xc0 | (*lpt>>6); *pt++ = 0x80 | (*lpt&0x3f); } ++lpt; } *pt = '\0'; return( utf8buf ); } char *latin1_2_utf8_copy(const char *lbuf) { int len; char *utf8buf; if ( lbuf==NULL ) return( NULL ); len = strlen(lbuf); utf8buf = (char *) malloc(2*len+1); return( latin1_2_utf8_strcpy(utf8buf,lbuf)); } int32 utf8_ildb(const char **_text) { int32 val= -1; int ch; const uint8 *text = (const uint8 *) *_text; /* Increment and load character */ if ( text==NULL ) return( val ); else if ( (ch = *text++)<0x80 ) { val = ch; } else if ( ch<=0xbf ) { /* error */ } else if ( ch<=0xdf ) { if ( *text>=0x80 && *text<0xc0 ) val = ((ch&0x1f)<<6) | (*text++&0x3f); } else if ( ch<=0xef ) { if ( *text>=0x80 && *text<0xc0 && text[1]>=0x80 && text[1]<0xc0 ) { val = ((ch&0xf)<<12) | ((text[0]&0x3f)<<6) | (text[1]&0x3f); text += 2; } } else { int w = ( ((ch&0x7)<<2) | ((text[0]&0x30)>>4) )-1, w2; w = (w<<6) | ((text[0]&0xf)<<2) | ((text[1]&0x30)>>4); w2 = ((text[1]&0xf)<<6) | (text[2]&0x3f); val = w*0x400 + w2 + 0x10000; if ( *text<0x80 || text[1]<0x80 || text[2]<0x80 || *text>=0xc0 || text[1]>=0xc0 || text[2]>=0xc0 ) val = -1; else text += 3; } *_text = (const char *) text; return( val ); } char *utf8_idpb(char *utf8_text,uint32 ch,int flags) { /* Increment and deposit character, no '\0' appended */ /* NOTE: Unicode only needs range of 17x65535 values */ /* and strings must be long enough to hold +4 chars. */ /* ISO/IEC 10646 description of UTF8 allows encoding */ /* character values up to U+7FFFFFFF before RFC3629. */ if ( ch>0x7fffffff || \ (!(flags&UTF8IDPB_OLDLIMIT) && ((ch>=0xd800 && ch<=0xdfff) || ch>=17*65536)) ) return( 0 ); /* Error, ch is out of range */ if ( (flags&(UTF8IDPB_UCS2|UTF8IDPB_UTF16|UTF8IDPB_UTF32)) ) { if ( (flags&UTF8IDPB_UCS2) && ch>0xffff ) return( 0 ); /* Error, ch is out of range */ if ( (flags&UTF8IDPB_UTF32) ) { *utf8_text++ = ((ch>>24)&0xff); *utf8_text++ = ((ch>>16)&0xff); ch &= 0xffff; } if ( ch>0xffff ) { /* ...here if a utf16 encoded value */ unsigned long us; ch -= 0x10000; us = (ch>>10)+0xd800; *utf8_text++ = us>>8; *utf8_text++ = us&0xff; ch = (ch&0x3ff)+0xdc00; } *utf8_text++ = ch>>8; ch &= 0xff; } else if ( ch>127 || (ch==0 && (flags&UTF8IDPB_NOZERO)) ) { if ( ch<=0x7ff ) /* ch>=0x80 && ch<=0x7ff */ *utf8_text++ = 0xc0 | (ch>>6); else { if ( ch<=0xffff ) /* ch>=0x800 && ch<=0xffff */ *utf8_text++ = 0xe0 | (ch>>12); else { if ( ch<=0x1fffff ) /* ch>=0x10000 && ch<=0x1fffff */ *utf8_text++ = 0xf0 | (ch>>18); else { if ( ch<=0x3ffffff ) /* ch>=0x200000 && ch<=0x3ffffff */ *utf8_text++ = 0xf8 | (ch>>24); else { /* ch>=0x4000000 && ch<=0x7fffffff */ *utf8_text++ = 0xfc | (ch>>30); *utf8_text++ = 0x80 | ((ch>>24)&0x3f); } *utf8_text++ = 0x80 | ((ch>>18)&0x3f); } *utf8_text++ = 0x80 | ((ch>>12)&0x3f); } *utf8_text++ = 0x80 | ((ch>>6)&0x3f); } ch = 0x80 | (ch&0x3f); } *utf8_text++ = ch; return( utf8_text ); } int utf8_valid(const char *str) { /* Is this a valid utf8 string? */ int ch; while ( (ch=utf8_ildb(&str))!='\0' ) if ( ch==-1 ) return( false ); return( true ); } long utf82u_strlen(const char *utf8_str) { /* Count how many shorts needed to represent in UCS2 */ int32 ch; long len = 0; while ( (ch = utf8_ildb(&utf8_str))>0 && ++len>0 ) if ( ch>=0x10000 ) ++len; return( len ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/configure-fontforge.h0000664000175000017500000001157013510660062020524 00000000000000/* Copyright (C) 2002-2012 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_ /* Apple suggests using a sfnt version of 'true' for fonts designed for use */ /* only on a mac (windows refuses such fonts). I generally prefer to have a */ /* font work everywhere, so normally ff produces fonts with version 1.0 */ /* Set this if you want Apple only fonts (produced when Apple mode is set and*/ /* Opentype mode is unset in the Generate Fonts-Options dialog). */ /* */ /* #define FONTFORGE_CONFIG_APPLE_ONLY_TTF */ /* */ /* Nobody else puts apple unicode encodings into the name table. So I probably*/ /* shouldn't either. But if someone wants them... */ /* */ /* #define FONTFORGE_CONFIG_APPLE_UNICODE_NAMES */ /* */ /* I used to use an approximation method when converting cubic to quadratic */ /* splines which was non-symmetric. In some cases it produced better results */ /* than the current approach. This flag restores the old algorithm. */ /* */ /* #define FONTFORGE_CONFIG_NON_SYMMETRIC_QUADRATIC_CONVERSION */ /* */ /* 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 */ /* */ /* In addition to placing snippets of charstrings into subrs, I tried adding */ /* whole glyphs (when that was possible). To my surprise, it made things */ /* worse in one of my test cases, and barely registered an improvement in */ /* another. So I think we're better off without it. But I don't understand */ /* why things are worse so I'm leaving the code in to play with */ /* */ /* #define FONTFORGE_CONFIG_PS_REFS_GET_SUBRS */ /* */ /* Werner wants to be able to see the raw (unscaled) data for the location of */ /* points (in the points window of the debugger). I'm not sure that is */ /* generally a good idea (I think it makes the dlg look unsymetric). */ /* */ /* #define FONTFORGE_CONFIG_SHOW_RAW_POINTS */ /* */ /* ************************************************************************** */ /* **************************** Numeric Settings **************************** */ /* ************************************************************************** */ /* The number of files displayed in the "File->Recent" menu */ #define RECENT_MAX 10 /* The number of tabs allowed in the outline glyph view of former glyphs */ #define FORMER_MAX 10 /* The maximum number of layers allowed in a normal font (this includes the */ /* default foreground and background layers) -- this does not limit type3 */ /* fonts */ #define BACK_LAYER_MAX 256 #endif dvisvgm-2.8.1/libs/ff-woff/fontforge/namelist.c0000664000175000017500000110267013510660062016366 00000000000000/* -*- coding: utf-8 -*- */ /* Copyright (C) 2000-2012 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 "fontforgevw.h" #include "namehash.h" #include "tables.h" int recognizePUA = false; #ifndef _MSC_VER static #endif struct psaltnames { const char *name; int unicode; int provenance; /* 1=> Adobe PUA, 2=>AMS PUA, 3=>TeX */ } psaltnames[]; static NameList agl_sans, agl, agl_nf, adobepua, greeksc, tex, ams; NameList *namelist_for_new_fonts = &agl_nf; /* Adobe's standard names are wrong for: */ /* 0x2206 is named Delta, 0x394 should be */ /* 0x2126 is named Omega, 0x3A9 should be */ /* 0x00b5 is named mu, 0x3BC should be */ /* The following have been corrected removed from AGL For New Fonts: */ /* 0x0162 is named Tcommaaccent, 0x21A should be */ /* 0x0163 is named tcommaaccent, 0x21B should be */ /* 0xf6be is named dotlessj, 0x237 should be */ static int psnamesinited=false; #define HASH_SIZE 257 struct psbucket { const char *name; int uni; struct psbucket *prev; } *psbuckets[HASH_SIZE]; static void psaddbucket(const char *name, int uni) { int hash = hashname(name); struct psbucket *buck = calloc(1,sizeof(struct psbucket)); buck->name = name; buck->uni = uni; buck->prev = psbuckets[hash]; psbuckets[hash] = buck; } static void NameListHash(NameList *nl) { int i,j,k; for ( i=0; i<17; ++i ) if ( nl->unicode[i]!=NULL ) { for ( j=0; j<256; ++j ) if ( nl->unicode[i][j]!=NULL ) { for ( k=0; k<256; ++k ) if ( nl->unicode[i][j][k]!=NULL ) psaddbucket(nl->unicode[i][j][k],(i<<16)|(j<<8)|k ); } } } static void psinitnames(void) { int i; NameList *nl; agl.next = &agl_nf; agl_nf.next = &agl_sans; agl_sans.next = &adobepua; adobepua.next = &greeksc; greeksc.next = &tex; tex.next = &ams; for ( i=0; psaltnames[i].name!=NULL ; ++i ) psaddbucket(psaltnames[i].name,psaltnames[i].unicode); for ( nl=&agl; nl!=NULL; nl=nl->next ) NameListHash(nl); psnamesinited = true; } int UniFromName(const char *name,enum uni_interp interp,Encoding *encname) { int i = -1; char *end; struct psbucket *buck; int _recognizePUA = recognizePUA; 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; _recognizePUA = true; } else if ( (name[0]=='U' || name[0]=='u') && name[1]=='+' && (strlen(name)==6 || strlen(name)==7)) { /* Unifont uses this convention */ i = strtol(name+2,&end,16); if ( *end ) i = -1; _recognizePUA = true; } else if ( name[0]=='u' && strlen(name)>=5 ) { i = strtol(name+1,&end,16); if ( *end ) i = -1; else if ( encname!=NULL && !encname->is_unicodefull && (interp==ui_ams || interp==ui_trad_chinese)) { int j; const int *pua = interp==ui_ams ? amspua : cns14pua; for ( j=0xf8ff-0xe000; j>=0; --j ) if ( pua[j]==i ) { i = j+0xe000; break; } } if ( i!=-1 ) _recognizePUA = true; } else if ( name[0]!='\0' && name[1]=='\0' ) i = ((unsigned char *) name)[0]; 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; } if ( !_recognizePUA && i>=0xe000 && i<=0xf8ff ) i = -1; return( i ); } #define RefMax 40 NameList *DefaultNameListForNewFonts(void) { return( namelist_for_new_fonts ); } NameList *NameListByName(const char *name) { const char *nameTex = "ΤεΧ Names"; NameList *nl; /* ΤεΧ is hard tp type e.g. from scripting, so accept TeX as alias */ if (strcmp(name,"TeX Names")==0) name = (char *)nameTex; for ( nl = &agl; nl!=NULL; nl=nl->next ) { if ( strcmp(_(nl->title),name)==0 || strcmp(nl->title,name)==0 ) return( nl ); } return( NULL ); } struct bits { char *start, *end; SplineChar *rpl; }; /* ************************************************************************** */ static const char *agl_sans_p0_b0[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quotesingle", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "grave", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section", "dieresis", "copyright", "ordfeminine", "guillemotleft", "logicalnot", NULL, "registered", "macron", "degree", "plusminus", NULL, NULL, "acute", "mu", "paragraph", "periodcentered", "cedilla", NULL, "ordmasculine", "guillemotright", "onequarter", "onehalf", "threequarters", "questiondown", "Agrave", "Aacute", "Acircumflex", "Atilde", "Adieresis", "Aring", "AE", "Ccedilla", "Egrave", "Eacute", "Ecircumflex", "Edieresis", "Igrave", "Iacute", "Icircumflex", "Idieresis", "Eth", "Ntilde", "Ograve", "Oacute", "Ocircumflex", "Otilde", "Odieresis", "multiply", "Oslash", "Ugrave", "Uacute", "Ucircumflex", "Udieresis", "Yacute", "Thorn", "germandbls", "agrave", "aacute", "acircumflex", "atilde", "adieresis", "aring", "ae", "ccedilla", "egrave", "eacute", "ecircumflex", "edieresis", "igrave", "iacute", "icircumflex", "idieresis", "eth", "ntilde", "ograve", "oacute", "ocircumflex", "otilde", "odieresis", "divide", "oslash", "ugrave", "uacute", "ucircumflex", "udieresis", "yacute", "thorn", "ydieresis" }; static const char *agl_sans_p0_b1[] = { "Amacron", "amacron", "Abreve", "abreve", "Aogonek", "aogonek", "Cacute", "cacute", "Ccircumflex", "ccircumflex", "Cdotaccent", "cdotaccent", "Ccaron", "ccaron", "Dcaron", "dcaron", "Dcroat", "dcroat", "Emacron", "emacron", "Ebreve", "ebreve", "Edotaccent", "edotaccent", "Eogonek", "eogonek", "Ecaron", "ecaron", "Gcircumflex", "gcircumflex", "Gbreve", "gbreve", "Gdotaccent", "gdotaccent", "Gcommaaccent", "gcommaaccent", "Hcircumflex", "hcircumflex", "Hbar", "hbar", "Itilde", "itilde", "Imacron", "imacron", "Ibreve", "ibreve", "Iogonek", "iogonek", "Idotaccent", "dotlessi", "IJ", "ij", "Jcircumflex", "jcircumflex", "Kcommaaccent", "kcommaaccent", "kgreenlandic", "Lacute", "lacute", "Lcommaaccent", "lcommaaccent", "Lcaron", "lcaron", "Ldot", "ldot", "Lslash", "lslash", "Nacute", "nacute", "Ncommaaccent", "ncommaaccent", "Ncaron", "ncaron", "napostrophe", "Eng", "eng", "Omacron", "omacron", "Obreve", "obreve", "Ohungarumlaut", "ohungarumlaut", "OE", "oe", "Racute", "racute", "Rcommaaccent", "rcommaaccent", "Rcaron", "rcaron", "Sacute", "sacute", "Scircumflex", "scircumflex", "Scedilla", "scedilla", "Scaron", "scaron", NULL, NULL, "Tcaron", "tcaron", "Tbar", "tbar", "Utilde", "utilde", "Umacron", "umacron", "Ubreve", "ubreve", "Uring", "uring", "Uhungarumlaut", "uhungarumlaut", "Uogonek", "uogonek", "Wcircumflex", "wcircumflex", "Ycircumflex", "ycircumflex", "Ydieresis", "Zacute", "zacute", "Zdotaccent", "zdotaccent", "Zcaron", "zcaron", "longs", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "florin", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Ohorn", "ohorn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Uhorn", "uhorn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Gcaron", "gcaron", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Aringacute", "aringacute", "AEacute", "aeacute", "Oslashacute", "oslashacute" }; static const char *agl_sans_p0_b2[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Scommaaccent", "scommaaccent", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "circumflex", "caron", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "breve", "dotaccent", "ring", "ogonek", "tilde", "hungarumlaut", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_sans_p0_b3[] = { "gravecomb", "acutecomb", NULL, "tildecomb", NULL, NULL, NULL, NULL, NULL, "hookabovecomb", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "dotbelowcomb", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "tonos", "dieresistonos", "Alphatonos", "anoteleia", "Epsilontonos", "Etatonos", "Iotatonos", NULL, "Omicrontonos", NULL, "Upsilontonos", "Omegatonos", "iotadieresistonos", "Alpha", "Beta", "Gamma", NULL, "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mu", "Nu", "Xi", "Omicron", "Pi", "Rho", NULL, "Sigma", "Tau", "Upsilon", "Phi", "Chi", "Psi", NULL, "Iotadieresis", "Upsilondieresis", "alphatonos", "epsilontonos", "etatonos", "iotatonos", "upsilondieresistonos", "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota", "kappa", "lambda", NULL, "nu", "xi", "omicron", "pi", "rho", "sigma1", "sigma", "tau", "upsilon", "phi", "chi", "psi", "omega", "iotadieresis", "upsilondieresis", "omicrontonos", "upsilontonos", "omegatonos", NULL, NULL, "theta1", "Upsilon1", NULL, NULL, "phi1", "omega1", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_sans_p0_b1e[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Wgrave", "wgrave", "Wacute", "wacute", "Wdieresis", "wdieresis", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Ygrave", "ygrave", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const char *agl_sans_p0_b20[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "figuredash", "endash", "emdash", NULL, NULL, "underscoredbl", "quoteleft", "quoteright", "quotesinglbase", "quotereversed", "quotedblleft", "quotedblright", "quotedblbase", NULL, "dagger", "daggerdbl", "bullet", NULL, "onedotenleader", "twodotenleader", "ellipsis", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "perthousand", NULL, "minute", "second", NULL, NULL, NULL, NULL, NULL, "guilsinglleft", "guilsinglright", NULL, "exclamdbl", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "fraction", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "colonmonetary", NULL, "franc", "lira", NULL, NULL, "peseta", NULL, NULL, NULL, "dong", "Euro", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_sans_p0_b21[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Ifraktur", NULL, NULL, NULL, NULL, NULL, NULL, "weierstrass", NULL, NULL, NULL, "Rfraktur", NULL, "prescription", NULL, NULL, NULL, "trademark", NULL, NULL, NULL, "Omega", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "estimated", NULL, NULL, NULL, NULL, NULL, NULL, "aleph", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "onethird", "twothirds", NULL, NULL, NULL, NULL, NULL, NULL, "oneeighth", "threeeighths", "fiveeighths", "seveneighths", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "arrowleft", "arrowup", "arrowright", "arrowdown", "arrowboth", "arrowupdn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "arrowupdnbse", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "carriagereturn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "arrowdblleft", "arrowdblup", "arrowdblright", "arrowdbldown", "arrowdblboth", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_sans_p0_b22[] = { "universal", NULL, "partialdiff", "existential", NULL, "emptyset", "Delta", "gradient", "element", "notelement", NULL, "suchthat", NULL, NULL, NULL, "product", NULL, "summation", "minus", NULL, NULL, NULL, NULL, "asteriskmath", NULL, NULL, "radical", NULL, NULL, "proportional", "infinity", "orthogonal", "angle", NULL, NULL, NULL, NULL, NULL, NULL, "logicaland", "logicalor", "intersection", "union", "integral", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "therefore", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "similar", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "congruent", NULL, NULL, "approxequal", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "notequal", "equivalence", NULL, NULL, "lessequal", "greaterequal", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "propersubset", "propersuperset", "notsubset", NULL, "reflexsubset", "reflexsuperset", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "circleplus", NULL, "circlemultiply", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "perpendicular", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "dotmath", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_sans_p0_b23[] = { NULL, NULL, "house", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "revlogicalnot", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "integraltp", "integralbt", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "angleleft", "angleright", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_sans_p0_b25[] = { "SF100000", NULL, "SF110000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SF010000", NULL, NULL, NULL, "SF030000", NULL, NULL, NULL, "SF020000", NULL, NULL, NULL, "SF040000", NULL, NULL, NULL, "SF080000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SF090000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SF060000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SF070000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SF050000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SF430000", "SF240000", "SF510000", "SF520000", "SF390000", "SF220000", "SF210000", "SF250000", "SF500000", "SF490000", "SF380000", "SF280000", "SF270000", "SF260000", "SF360000", "SF370000", "SF420000", "SF190000", "SF200000", "SF230000", "SF470000", "SF480000", "SF410000", "SF450000", "SF460000", "SF400000", "SF540000", "SF530000", "SF440000", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "upblock", NULL, NULL, NULL, "dnblock", NULL, NULL, NULL, "block", NULL, NULL, NULL, "lfblock", NULL, NULL, NULL, "rtblock", "ltshade", "shade", "dkshade", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "filledbox", "H22073", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "H18543", "H18551", "filledrect", NULL, NULL, NULL, NULL, NULL, "triagup", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "triagrt", NULL, "triagdn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "triaglf", NULL, NULL, NULL, NULL, NULL, "lozenge", "circle", NULL, NULL, NULL, "H18533", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "invbullet", "invcircle", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "openbullet", NULL, 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 const char *agl_sans_p0_b26[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "smileface", "invsmileface", "sun", NULL, NULL, NULL, "female", NULL, "male", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "spade", NULL, NULL, "club", NULL, "heart", "diamond", NULL, NULL, NULL, "musicalnote", "musicalnotedbl", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **agl_sans_p0[] = { agl_sans_p0_b0, agl_sans_p0_b1, agl_sans_p0_b2, agl_sans_p0_b3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, agl_sans_p0_b1e, NULL, agl_sans_p0_b20, agl_sans_p0_b21, agl_sans_p0_b22, agl_sans_p0_b23, NULL, agl_sans_p0_b25, agl_sans_p0_b26, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 NameList agl_sans = { NULL, N_("AGL without afii"), { agl_sans_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static const char *agl_nf_p0_b1[] = { "Amacron", "amacron", "Abreve", "abreve", "Aogonek", "aogonek", "Cacute", "cacute", "Ccircumflex", "ccircumflex", "Cdotaccent", "cdotaccent", "Ccaron", "ccaron", "Dcaron", "dcaron", "Dcroat", "dcroat", "Emacron", "emacron", "Ebreve", "ebreve", "Edotaccent", "edotaccent", "Eogonek", "eogonek", "Ecaron", "ecaron", "Gcircumflex", "gcircumflex", "Gbreve", "gbreve", "Gdotaccent", "gdotaccent", NULL, NULL, "Hcircumflex", "hcircumflex", "Hbar", "hbar", "Itilde", "itilde", "Imacron", "imacron", "Ibreve", "ibreve", "Iogonek", "iogonek", "Idotaccent", "dotlessi", "IJ", "ij", "Jcircumflex", "jcircumflex", NULL, NULL, "kgreenlandic", "Lacute", "lacute", NULL, NULL, "Lcaron", "lcaron", "Ldot", "ldot", "Lslash", "lslash", "Nacute", "nacute", NULL, NULL, "Ncaron", "ncaron", "napostrophe", "Eng", "eng", "Omacron", "omacron", "Obreve", "obreve", "Ohungarumlaut", "ohungarumlaut", "OE", "oe", "Racute", "racute", NULL, NULL, "Rcaron", "rcaron", "Sacute", "sacute", "Scircumflex", "scircumflex", "Scedilla", "scedilla", "Scaron", "scaron", NULL, NULL, "Tcaron", "tcaron", "Tbar", "tbar", "Utilde", "utilde", "Umacron", "umacron", "Ubreve", "ubreve", "Uring", "uring", "Uhungarumlaut", "uhungarumlaut", "Uogonek", "uogonek", "Wcircumflex", "wcircumflex", "Ycircumflex", "ycircumflex", "Ydieresis", "Zacute", "zacute", "Zdotaccent", "zdotaccent", "Zcaron", "zcaron", "longs", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "florin", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Ohorn", "ohorn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Uhorn", "uhorn", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Gcaron", "gcaron", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Aringacute", "aringacute", "AEacute", "aeacute", "Oslashacute", "oslashacute" }; static const char *agl_nf_p0_b2[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "circumflex", "caron", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "breve", "dotaccent", "ring", "ogonek", "tilde", "hungarumlaut", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **agl_nf_p0[] = { agl_sans_p0_b0, agl_nf_p0_b1, agl_nf_p0_b2, agl_sans_p0_b3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, agl_sans_p0_b1e, NULL, agl_sans_p0_b20, agl_sans_p0_b21, agl_sans_p0_b22, agl_sans_p0_b23, NULL, agl_sans_p0_b25, agl_sans_p0_b26, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 NameList agl_nf = { NULL, N_("AGL For New Fonts"), { agl_nf_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static const char *agl_p0_b1[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Tcommaaccent", "tcommaaccent", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_p0_b2[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57929", "afii64937", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_p0_b4[] = { NULL, "afii10023", "afii10051", "afii10052", "afii10053", "afii10054", "afii10055", "afii10056", "afii10057", "afii10058", "afii10059", "afii10060", "afii10061", NULL, "afii10062", "afii10145", "afii10017", "afii10018", "afii10019", "afii10020", "afii10021", "afii10022", "afii10024", "afii10025", "afii10026", "afii10027", "afii10028", "afii10029", "afii10030", "afii10031", "afii10032", "afii10033", "afii10034", "afii10035", "afii10036", "afii10037", "afii10038", "afii10039", "afii10040", "afii10041", "afii10042", "afii10043", "afii10044", "afii10045", "afii10046", "afii10047", "afii10048", "afii10049", "afii10065", "afii10066", "afii10067", "afii10068", "afii10069", "afii10070", "afii10072", "afii10073", "afii10074", "afii10075", "afii10076", "afii10077", "afii10078", "afii10079", "afii10080", "afii10081", "afii10082", "afii10083", "afii10084", "afii10085", "afii10086", "afii10087", "afii10088", "afii10089", "afii10090", "afii10091", "afii10092", "afii10093", "afii10094", "afii10095", "afii10096", "afii10097", NULL, "afii10071", "afii10099", "afii10100", "afii10101", "afii10102", "afii10103", "afii10104", "afii10105", "afii10106", "afii10107", "afii10108", "afii10109", NULL, "afii10110", "afii10193", NULL, NULL, "afii10146", "afii10194", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii10147", "afii10195", "afii10148", "afii10196", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii10050", "afii10098", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii10846", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_p0_b5[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57799", "afii57801", "afii57800", "afii57802", "afii57793", "afii57794", "afii57795", "afii57798", "afii57797", "afii57806", NULL, "afii57796", "afii57807", "afii57839", "afii57645", "afii57841", "afii57842", "afii57804", "afii57803", "afii57658", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57664", "afii57665", "afii57666", "afii57667", "afii57668", "afii57669", "afii57670", "afii57671", "afii57672", "afii57673", "afii57674", "afii57675", "afii57676", "afii57677", "afii57678", "afii57679", "afii57680", "afii57681", "afii57682", "afii57683", "afii57684", "afii57685", "afii57686", "afii57687", "afii57688", "afii57689", "afii57690", NULL, NULL, NULL, NULL, NULL, "afii57716", "afii57717", "afii57718", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const char *agl_p0_b6[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57388", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57403", NULL, NULL, NULL, "afii57407", NULL, "afii57409", "afii57410", "afii57411", "afii57412", "afii57413", "afii57414", "afii57415", "afii57416", "afii57417", "afii57418", "afii57419", "afii57420", "afii57421", "afii57422", "afii57423", "afii57424", "afii57425", "afii57426", "afii57427", "afii57428", "afii57429", "afii57430", "afii57431", "afii57432", "afii57433", "afii57434", NULL, NULL, NULL, NULL, NULL, "afii57440", "afii57441", "afii57442", "afii57443", "afii57444", "afii57445", "afii57446", "afii57470", "afii57448", "afii57449", "afii57450", "afii57451", "afii57452", "afii57453", "afii57454", "afii57455", "afii57456", "afii57457", "afii57458", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57392", "afii57393", "afii57394", "afii57395", "afii57396", "afii57397", "afii57398", "afii57399", "afii57400", "afii57401", "afii57381", NULL, NULL, "afii63167", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57511", NULL, NULL, NULL, NULL, "afii57506", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57507", NULL, "afii57512", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57513", NULL, NULL, NULL, NULL, NULL, NULL, "afii57508", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57505", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57509", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57514", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57519", NULL, NULL, "afii57534", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_p0_b20[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii61664", "afii301", "afii299", "afii300", NULL, NULL, NULL, NULL, NULL, "afii00208", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii61573", "afii61574", "afii61575", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii57636", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *agl_p0_b21[] = { NULL, NULL, NULL, NULL, NULL, "afii61248", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "afii61289", NULL, NULL, "afii61352", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **agl_p0[] = { NULL, agl_p0_b1, agl_p0_b2, NULL, agl_p0_b4, agl_p0_b5, agl_p0_b6, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, agl_p0_b20, agl_p0_b21, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 NameList agl = { &agl_sans, N_("Adobe Glyph List"), { agl_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static const char *adobepua_p0_bf6[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "perthousand.oldstyle", "cent.denominator", "dollar.denominator", "hyphen.denominator", "parenleft.denominator", "parenright.denominator", "cent.numerator", "dollar.numerator", "hyphen.numerator", "parenleft.numerator", "parenright.numerator", "at.cap", "commaaccent.cap", "commaaccent.small", "pi.math", "h.superior", "zero.slash", "zero.fitted", "two.fitted", "three.fitted", "four.fitted", "five.fitted", "six.fitted", "seven.fitted", "eight.fitted", "nine.fitted", "percent.oldstyle", "zero.taboldstyle", "one.taboldstyle", "two.taboldstyle", "three.taboldstyle", "four.taboldstyle", "five.taboldstyle", "six.taboldstyle", "seven.taboldstyle", "eight.taboldstyle", "nine.taboldstyle", "colonmonetary.taboldstyle", "Euro.taboldstyle", "florin.taboldstyle", "numbersign.taboldstyle", "sterling.taboldstyle", "yen.taboldstyle", "dollar.taboldstyle", "cent.taboldstyle", "zero.denominator", "one.denominator", "two.denominator", "three.denominator", "four.denominator", "five.denominator", "six.denominator", "seven.denominator", "eight.denominator", "nine.denominator", "comma.denominator", "period.denominator", "zero.numerator", "one.numerator", "two.numerator", "three.numerator", "four.numerator", "five.numerator", "six.numerator", "seven.numerator", "eight.numerator", "nine.numerator", "comma.numerator", "period.numerator", "Abreve.small", "Amacron.small", "Aogonek.small", "AEacute.small", "Cacute.small", "Ccaron.small", "Ccircumflex.small", "Cdotaccent.small", "Dcaron.small", "Dcroat.small", "Ebreve.small", "Ecaron.small", "Edotaccent.small", "Emacron.small", "Eng.small", "Eogonek.small", "Gbreve.small", "Gcircumflex.small", "Gcommaaccent.small", "Gdotaccent.small", "Hbar.small", "Hcircumflex.small", "Ibreve.small", "IJ.small", "Imacron.small", "Iogonek.small", "Itilde.small", "Jcircumflex.small", "Kcommaaccent.small", "Lacute.small", "Lcaron.small", "Lcommaaccent.small", "Ldot.small", "Nacute.small", "Ncaron.small", "Ncommaaccent.small", "Obreve.small", "Ohungarumlaut.small", "Omacron.small", "Oslashacute.small", "Racute.small", "Rcaron.small", "Rcommaaccent.small", "Sacute.small", "Scedilla.small", "Scircumflex.small", "Scommaaccent.small", "Tbar.small", "Tcaron.small", "Tcommaaccent.small", "Ubreve.small", "Uhungarumlaut.small", "Umacron.small", "Uogonek.small", "Uring.small", "Utilde.small", "Wacute.small", "Wcircumflex.small", "Wdieresis.small", "Wgrave.small", "Ycircumflex.small", "Ygrave.small", "Zacute.small", "Zdotaccent.small", "Idotaccent.small", "parenleft.cap", "parenright.cap", "bracketleft.cap", "bracketright.cap", "braceleft.cap", "braceright.cap", "exclamdown.cap", "questiondown.cap", "guillemotleft.cap", "guillemotright.cap", "guilsinglleft.cap", "guilsinglright.cap", "hyphen.cap", "endash.cap", "emdash.cap", "periodcentered.cap", "j.dotless", NULL, NULL, NULL, NULL, NULL, "afii10068.ital", "afii10066.ital", "afii10069.ital", "afii10081.ital", "afii10084.ital", "acute.cap", "caron.cap", "dieresis.cap", "space_uni0308_uni0301.cap", "space_uni0308_uni0300.cap", "grave.cap", "hungarumlaut.cap", "macron.cap", "breve.cyrcap", "circumflex.cyrcap", "space_uni030F.cap", "breve.cyr", "circumflex.cyr", "space_uni030F", "space_uni0308_uni0301", "space_uni0308_uni0300", "copyright.serif", "registered.serif", "trademark.serif", "one.fitted", "R_p", "uni2014.alt", "cent.inferior", "cent.superior", "comma.inferior", "comma.superior", "dollar.inferior", "dollar.superior", "hyphen.inferior", "hyphen.superior", "period.inferior", "period.superior", "a.superior", "b.superior", "d.superior", "e.superior", "i.superior", "l.superior", "m.superior", "o.superior", "r.superior", "s.superior", "t.superior", "breve.sc", "caron.sc", "circumflex.sc", "dotaccent.sc", "hungarumlaut.sc", "lslash.sc", "oe.sc", "ogonek.sc", "ring.sc", "scaron.sc", "tilde.sc", "zcaron.sc" }; static const char *adobepua_p0_bf7[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "exclam.sc", NULL, NULL, "dollar.oldstyle", NULL, "ampersand.sc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "zero.oldstyle", "one.oldstyle", "two.oldstyle", "three.oldstyle", "four.oldstyle", "five.oldstyle", "six.oldstyle", "seven.oldstyle", "eight.oldstyle", "nine.oldstyle", NULL, NULL, NULL, NULL, NULL, "question.sc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "grave.sc", "a.sc", "b.sc", "c.sc", "d.sc", "e.sc", "f.sc", "g.sc", "h.sc", "i.sc", "j.sc", "k.sc", "l.sc", "m.sc", "n.sc", "o.sc", "p.sc", "q.sc", "r.sc", "s.sc", "t.sc", "u.sc", "v.sc", "w.sc", "x.sc", "y.sc", "z.sc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "exclamdown.sc", "cent.oldstyle", NULL, NULL, NULL, NULL, NULL, "dieresis.sc", NULL, NULL, NULL, NULL, NULL, NULL, "macron.sc", NULL, NULL, NULL, NULL, "acute.sc", NULL, NULL, NULL, "cedilla.sc", NULL, NULL, NULL, NULL, NULL, NULL, "questiondown.sc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "agrave.sc", "aacute.sc", "acircumflex.sc", "atilde.sc", "adieresis.sc", "aring.sc", "ae.sc", "ccedilla.sc", "egrave.sc", "eacute.sc", "ecircumflex.sc", "edieresis.sc", "igrave.sc", "iacute.sc", "icircumflex.sc", "idieresis.sc", "eth.sc", "ntilde.sc", "ograve.sc", "oacute.sc", "ocircumflex.sc", "otilde.sc", "odieresis.sc", NULL, "oslash.sc", "ugrave.sc", "uacute.sc", "ucircumflex.sc", "udieresis.sc", "yacute.sc", "thorn.sc", "ydieresis.sc" }; static const char *adobepua_p0_bf8[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "registered.sans", "copyright.sans", "trademark.sans", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const char *adobepua_p0_bfb[] = { "f_f", "f_i", "f_l", "f_f_i", "f_f_l", "longs_t", "s_t", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **adobepua_p0[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, adobepua_p0_bf6, adobepua_p0_bf7, adobepua_p0_bf8, NULL, NULL, adobepua_p0_bfb, NULL, NULL, NULL, NULL }; static NameList adobepua = { &agl, N_("AGL with PUA"), { adobepua_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static const char *greeksc_p0_bf5[] = { "alpha.sc", "beta.sc", "gamma.sc", "delta.sc", "epsilon.sc", "zeta.sc", "eta.sc", "theta.sc", "iota.sc", "kappa.sc", "lambda.sc", "mu.sc", "nu.sc", "xi.sc", "omicron.sc", "pi.sc", "rho.sc", NULL, "sigma.sc", "tau.sc", "upsilon.sc", "phi.sc", "chi.sc", "psi.sc", "omega.sc", "iotadieresis.sc", "upsilondieresis.sc", "alphaiota.sc", "etaiota.sc", "omegaiota.sc", "prosgegrammeni.sc", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **greeksc_p0[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, greeksc_p0_bf5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static NameList greeksc = { &adobepua, N_("Greek small caps"), { greeksc_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static const char *tex_p0_b20[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "closure", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "leftharpoonaccent", "rightharpoonaccent", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *tex_p0_b21[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "shortleftarrow", "shortuparrow", "shortrightarrow", "shortdownarrow", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "leftwavyarrow", "rightwavyarrow", NULL, "twoheaduparrow", NULL, "twoheaddownarrow", NULL, NULL, NULL, "mapsup", NULL, "mapsdown", "updownarrowbar", NULL, NULL, NULL, NULL, "leftrightwavyarrow", NULL, "downzigzagarrow", NULL, NULL, "Ldsh", "Rdsh", NULL, NULL, NULL, NULL, NULL, NULL, "acwopencirclearrow", "cwopencirclearrow", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "updownarrows", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Nwarrow", "Nearrow", "Searrow", "Swarrow", NULL, NULL, "longleftzigzagarrow", "rightzigzagarrow", NULL, NULL, NULL, NULL, NULL, NULL, "barleftarrow", "rightarrowbar", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "downuparrows", "rightthreearrows", "nvleftarrow", "nvrightarrow", "nvleftrightarrow", NULL, NULL, NULL, NULL, NULL, NULL }; static const char *tex_p0_b22[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "ltrpar", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "difference", NULL, "ac", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "approxident", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "arceq", NULL, "veeeq", "stareq", NULL, "eqdef", "measeq", NULL, NULL, NULL, NULL, "Equiv", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "prurel", "scurel", NULL, NULL, NULL, NULL, "origof", "imageof", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "eqless", "eqgtr", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "disin", NULL, "isins", "isindot", NULL, NULL, "isinvb", "isinE", "nisd", NULL, "nis", NULL, NULL, NULL }; static const char *tex_p0_b23[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "invnot", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "turnednot", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "solbar", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rangledownzigzagarrow", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *tex_p0_b27[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "longrightzigzagarrow" }; static const char *tex_p0_b29[] = { NULL, NULL, "nvLeftarrow", "nvRightarrow", "nvLeftrightarrow", "twoheadmapsto", NULL, NULL, "downarrowbarred", "uparrowbarred", "Uuparrow", "Ddownarrow", "leftbkarrow", "rightbkarrow", "leftdbkarrow", NULL, NULL, "rightdotarrow", "baruparrow", "downarrowbar", NULL, NULL, "twoheadrightarrowtail", NULL, NULL, "lefttail", "righttail", "leftdbltail", "rightdbltail", "diamondleftarrow", "rightarrowdiamond", "diamondleftarrowbar", "barrightarrowdiamond", "nwsearrow", "neswarrow", "hknwarrow", "hknearrow", "hksearrow", "hkswarrow", NULL, NULL, NULL, NULL, "rdiagovfdiag", "fdiagovrdiag", "seovnearrow", "neovsearrow", "fdiagovnearrow", "rdiagovsearrow", "neovnwarrow", "nwovnearrow", "rightcurvedarrow", NULL, NULL, "leftdowncurvedarrow", "rightdowncurvedarrow", "cwhalfcirclearrow", "acwhalfcirclearrow", NULL, "acwundercurvearrow", "curvearrowrightminus", "curvearrowleftplus", "cwundercurvearrow", NULL, NULL, NULL, "rightarrowshortleftarrow", "leftarrowshortrightarrow", "shortrightarrowleftarrow", "rightarrowplus", "leftarrowplus", "rightarrowx", "leftrightarrowcircle", "twoheaduparrowcircle", "leftrightharpoonupdown", "leftrightharpoondownup", "updownharpoonrightleft", "updownharpoonleftright", "leftrightharpoonupup", "updownharpoonrightright", "leftrightharpoondowndown", "updownharpoonleftleft", "barleftharpoonup", "rightharpoonupbar", "barupharpoonright", "downharpoonrightbar", "barleftharpoondown", "rightharpoondownbar", "barupharpoonleft", "downharpoonleftbar", "leftharpoonupbar", "barrightharpoonup", "upharpoonrightbar", "bardownharpoonright", "leftharpoondownbar", "barrightharpoondown", "upharpoonleftbar", "bardownharpoonleft", "leftharpoonsupdown", "upharpoonsleftright", "rightharpoonsupdown", "downharpoonsleftright", "leftrightharpoonsup", "leftrightharpoonsdown", "rightleftharpoonsup", "rightleftharpoonsdown", "leftharpoonupdash", "dashleftharpoondown", "rightharpoonupdash", "dashrightharpoondown", "updownharpoonsleftright", "downupharpoonsleftright", "rightimply", "equalrightarrow", "similarrightarrow", "leftarrowsimilar", "rightarrowsimilar", "rightarrowapprox", "ltlarr", "leftarrowless", "gtrarr", "subrarr", "leftarrowsubset", "suplarr", "leftfishtail", "rightfishtail", "upfishtail", "downfishtail", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rtriltri", "ltrivb", "vbrtri", "lfbowtie", "rfbowtie", "fbowtie", "lftimes", "rftimes", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "eqvparsl", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "ruledelayed", NULL, "dsol", "rsolbar", "xsol", "xbsol", NULL, NULL, NULL, NULL, NULL, NULL }; static const char *tex_p0_b2a[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "congdot", NULL, NULL, "approxeqq", NULL, NULL, "eqqsim", "Coloneq", "eqeq", NULL, NULL, "equivDD", "ltcir", "gtcir", "ltquest", "gtquest", NULL, NULL, "lesdot", "gesdot", "lesdoto", "gesdoto", "lesdotor", "gesdotol", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "lsime", "gsime", "lsimg", "gsiml", "lgE", "glE", "lesges", "gesles", NULL, NULL, "elsdot", "egsdot", NULL, NULL, NULL, NULL, "simless", "simgtr", "simlE", "simgE", "Lt", "Gt", NULL, "glj", "gla", "ltcc", "gtcc", "lescc", "gescc", "smt", "lat", "smte", "late", "bumpeqq", NULL, NULL, NULL, NULL, "prE", "scE", NULL, NULL, NULL, NULL, NULL, NULL, "Pr", "Sc", "subsetdot", "supsetdot", "subsetplus", "supsetplus", "submult", "supmult", "subedot", "supedot", NULL, NULL, "subsim", "supsim", NULL, NULL, NULL, NULL, NULL, NULL, "csub", "csup", "csube", "csupe", "subsup", "supsub", "subsub", "supsup", "suphsub", "supdsub", "forkv", "topfork", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "Barv", "vBar", "vBarv", "barV", "Vbar", "Not", "bNot", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const char *tex_p0_be2[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rightdbkarrow", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "nrightwavyarrow", NULL, "nrightcurvedarrow", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "race", "acE", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *tex_p0_be3[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "lesg", "gesl", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "smtes", "lates", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "bsolhsub", "suphsol", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "congruence", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *tex_p0_be4[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, "mostpos", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *tex_p0_be6[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "varrightfishtail", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **tex_p0[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tex_p0_b20, tex_p0_b21, tex_p0_b22, tex_p0_b23, NULL, NULL, NULL, tex_p0_b27, NULL, tex_p0_b29, tex_p0_b2a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tex_p0_be2, tex_p0_be3, tex_p0_be4, NULL, tex_p0_be6, NULL, 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 NameList tex = { &agl, NU_("ΤεΧ Names"), { tex_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static const char *ams_p0_be2[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni219D0338", NULL, "uni29330338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2192.short", "uni2190.short", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni222AFE00", "uni2229FE00", "uni2294FE00", "uni2293FE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni223E0332.reversed", "uni223E0333", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2269FE00", NULL, NULL, "uni2268FE00", "uni22670338", "uni2A7E0338", "uni2A7D0338", "uni22660338", NULL, "uni2224.short", "uni2226.short", "uni228220D2", "uni228620D2", "uni2AC50338", "uni228320D2", "uni2AC60338", "uni228720D2", NULL, NULL, NULL, NULL, NULL, NULL, "uni2ACBFE00", "uni228AFE00", "uni228BFE00", "uni2ACCFE00", "uni224B0338", NULL, NULL, NULL, NULL, "uni226420D2", "uni226520D2", "uni003C20D2", "uni003E20D2", "uni2A6D0338", "uni224820D2", "uni2A700338", NULL, "uni2AA120D2", "uni2AA220D2", "uni226A0338", "uni226B0338", "uni22D80338", "uni22D90338", "uni22B520D2", "uni22B420D2", NULL, NULL, NULL, "uni006A.dotless", "uni210F.var", NULL, NULL, "uni222020D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_be3[] = { NULL, "uni2223.short", "uni2225.short", NULL, NULL, NULL, "uni2248.bold", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni22DAFE00", "uni22DBFE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2AACFE00", "uni2AADFE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni220B20D2", "uni220D0338", NULL, NULL, "uni220820D2", NULL, NULL, NULL, NULL, NULL, "uni2A15.up", "uni2A16.up", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni226120E5", "uni003D20E5", "uni2AFD20E5", "uni22500338", NULL, NULL, NULL, NULL, NULL, "uni22020338", NULL, NULL, NULL, NULL, "uni2A10.up", NULL, "uni2A12.up", "uni2A13.up", "uni2A14.up", "uni2A17.up", "uni2A11.up", NULL, "uni22F50338", NULL, "uni22F90338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2026.em", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni220A0338", "uni227320D2", "uni227220D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni223E.reversed", NULL, NULL, NULL, NULL, "uni0265.superscript", "uni0252.superscript", NULL, NULL, NULL, "uni2A0F.up", NULL, NULL, NULL, NULL, "uni2A9B20D2", "uni2A9C20D2", "uni2A9B0338", "uni2A9C0338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_be4[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni223E.var", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni223C20D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_be5[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2A3CFE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2AAF0338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni224220D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2AB00338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const char *ams_p0_be6[] = { NULL, NULL, NULL, NULL, "uni228F0338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni22900338", "uni224E0338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2205.var", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni0077.subscript", NULL, NULL, NULL, NULL, NULL, "uni1D0B.reversed", NULL, NULL, NULL, NULL, NULL, "uni025102DE", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni025B02DE", "uni025402DE", NULL, "uni03C9.inverted", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni297D.var", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni223C.bold", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_be8[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni227E0338", "uni227F0338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2216.var", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni224F0338", "uni22420338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_bea[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni00730336", NULL, "uni006C0321", NULL, NULL, "uni03040304", NULL, NULL, "uni229CFE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni03020302", NULL, "uni03030303", "uni033103310331", "uni0331033103310331", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni03070302", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni03040303", "uni03310330", "uni03040308", "uni03300331", NULL, "uni00640321", "uni00680321", "uni006B0321", "uni00780321", NULL, NULL, NULL, NULL, NULL, "uni00730321", "uni007A0321", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2034.notsup", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2A0B.up", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni227620D2", "uni227720D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_bec[] = { NULL, NULL, "uni2A3DFE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_bed[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni220A20D2", "uni220D20D2", "uni22F60338", "uni22FD0338", "uni22F620D2", "uni22FD20D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2295FE00", "uni2297FE00", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni224320D2", "uni224520D2", NULL, "uni2A6C0338", "uni2A6C20D2", "uni2A7020D2", "uni224D20D2", "uni223F.reversed", "uni003D20D2", NULL, "uni226120D2", "uni22630338", "uni226320D2", NULL, NULL, "uni2A7D20D2", "uni2A7E20D2", "uni226620D2", "uni226720D2", "uni2A950338", "uni2A960338", "uni2A9520D2", "uni2A9620D2", NULL, NULL, NULL, NULL, "uni2A990338", "uni2A9A0338", "uni2A9920D2", "uni2A9A20D2", "uni2272FE00", "uni2273FE00", "uni2A9DFE00", "uni2A9EFE00", NULL, NULL, "uni227A20D2", "uni227B20D2", "uni227C20D2", "uni227D20D2", "uni22DE20D2", "uni22DF20D2", "uni22DE0338", "uni22DF0338", NULL, NULL, NULL, NULL, "uni2AC520D2", "uni2AC620D2", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2AF40338", NULL, NULL, NULL, NULL, NULL, "uni2A0A.lgdisplay", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni220A.narrow", "uni220D.narrow", NULL, "u1D6FB.narrow", "uni002820090029", "uni002822C50029", NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static const char *ams_p0_bee[] = { "stixEE00", "stixEE01", "stixEE02", "stixEE03", "stixEE04", "stixEE05", "stixEE06", "stixEE07", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "stixEE10", "stixEE11", "stixEE12", "stixEE13", "stixEE14", "stixEE15", "stixEE16", "stixEE17", "stixEE18", "stixEE19", "stixEE1A", "stixEE1B", "stixEE1C", "stixEE1D", "stixEE1E", "stixEE1F", "stixEE20", "stixEE21", "stixEE22", "stixEE23", "stixEE24", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "stixEE30", "stixEE31", "stixEE32", "stixEE33", "stixEE34", "stixEE35", "stixEE36", "stixEE37", "stixEE38", "stixEE39", "stixEE3A", "stixEE3B", "stixEE3C", "stixEE3D", "stixEE3E", NULL, "stixEE40", "stixEE41", "stixEE42", "stixEE43", "stixEE44", "stixEE45", "stixEE46", "stixEE47", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "stixEE50", "stixEE51", "stixEE52", "stixEE53", "stixEE54", "stixEE55", "stixEE56", "stixEE57", "stixEE58", "stixEE59", "stixEE5A", "stixEE5B", "stixEE5C", "stixEE5D", "stixEE5E", "stixEE5F", "stixEE60", "stixEE61", "stixEE62", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "stixEE70", "stixEE71", "stixEE72", "stixEE73", "stixEE74", "stixEE75", "stixEE76", "stixEE77", "stixEE78", "stixEE79", "stixEE7A", "stixEE7B", "stixEE7C", "stixEE7D", "stixEE7E", "stixEE7F", "stixEE80", "stixEE81", "stixEE82", "stixEE83", "stixEE84", "stixEE85", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "stixEE90", "stixEE91", "stixEE92", "stixEE93", "stixEE94", "stixEE95", "stixEE96", "stixEE97", "stixEE98", "stixEE99", "stixEE9A", "stixEE9B", "stixEE9C", "stixEE9D", "stixEE9E", "stixEE9F", "stixEEA0", "stixEEA1", "stixEEA2", "stixEEA3", "stixEEA4", "stixEEA5", "stixEEA6", "stixEEA7", "stixEEA8", "stixEEA9", "stixEEAA", "stixEEAB", "stixEEAC", NULL, NULL, NULL, "stixEEB0", "stixEEB1", "stixEEB2", "stixEEB3", "stixEEB4", "stixEEB5", "stixEEB6", "stixEEB7", "stixEEB8", "stixEEB9", "stixEEBA", "stixEEBB", "stixEEBC", "stixEEBD", "stixEEBE", "stixEEBF", "stixEEC0", "stixEEC1", "stixEEC2", "stixEEC3", "stixEEC4", "stixEEC5", "stixEEC6", "stixEEC7", "stixEEC8", "stixEEC9", "stixEECA", "stixEECB", NULL, "stixEECD", "stixEECE", "stixEECF", "stixEED0", "stixEED1", "stixEED2", "stixEED3", "stixEED4", "stixEED5", "stixEED6", "stixEED7", "stixEED8", "stixEED9", "stixEEDA", "stixEEDB", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_bf4[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni29CF0338", "uni29D00338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2AA10338", NULL, NULL, NULL, NULL, "uni2AA20338", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char *ams_p0_bf5[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "uni2191.short", "uni2193.short", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 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 const char **ams_p0[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, ams_p0_be2, ams_p0_be3, ams_p0_be4, ams_p0_be5, ams_p0_be6, NULL, ams_p0_be8, NULL, ams_p0_bea, NULL, ams_p0_bec, ams_p0_bed, ams_p0_bee, NULL, NULL, NULL, NULL, NULL, ams_p0_bf4, ams_p0_bf5, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static NameList ams = { &tex, N_("AMS Names"), { ams_p0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }, NULL, NULL, 0, NULL }; /* ************************************************************************** */ static struct psaltnames psaltnames[] = { { "AEmacron", 0x01e2, 0 }, { "AEsmall", 0xf7e6, 0 }, { "Aacutesmall", 0xf7e1, 0 }, { "Abreveacute", 0x1eae, 0 }, { "Abrevecyrillic", 0x04d0, 0 }, { "Abrevedotbelow", 0x1eb6, 0 }, { "Abrevegrave", 0x1eb0, 0 }, { "Abrevehookabove", 0x1eb2, 0 }, { "Abrevetilde", 0x1eb4, 0 }, { "Acaron", 0x01cd, 0 }, { "Acircle", 0x24b6, 0 }, { "Acircumflexacute", 0x1ea4, 0 }, { "Acircumflexdotbelow", 0x1eac, 0 }, { "Acircumflexgrave", 0x1ea6, 0 }, { "Acircumflexhookabove", 0x1ea8, 0 }, { "Acircumflexsmall", 0xf7e2, 0 }, { "Acircumflextilde", 0x1eaa, 0 }, { "Acute", 0xf6c9, 0 }, { "Acutesmall", 0xf7b4, 0 }, { "Acyrillic", 0x0410, 0 }, { "Adblgrave", 0x0200, 0 }, { "Adieresiscyrillic", 0x04d2, 0 }, { "Adieresismacron", 0x01de, 0 }, { "Adieresissmall", 0xf7e4, 0 }, { "Adotbelow", 0x1ea0, 0 }, { "Adotmacron", 0x01e0, 0 }, { "Agravesmall", 0xf7e0, 0 }, { "Ahookabove", 0x1ea2, 0 }, { "Aiecyrillic", 0x04d4, 0 }, { "Ainvertedbreve", 0x0202, 0 }, { "Amonospace", 0xff21, 0 }, { "Aringbelow", 0x1e00, 0 }, { "Aringsmall", 0xf7e5, 0 }, { "Asmall", 0xf761, 0 }, { "Atildesmall", 0xf7e3, 0 }, { "Aybarmenian", 0x0531, 0 }, { "Bcircle", 0x24b7, 0 }, { "Bdotaccent", 0x1e02, 0 }, { "Bdotbelow", 0x1e04, 0 }, { "Becyrillic", 0x0411, 0 }, { "Benarmenian", 0x0532, 0 }, { "Bhook", 0x0181, 0 }, { "Blinebelow", 0x1e06, 0 }, { "Bmonospace", 0xff22, 0 }, { "Brevesmall", 0xf6f4, 0 }, { "Bsmall", 0xf762, 0 }, { "Btopbar", 0x0182, 0 }, { "Caarmenian", 0x053e, 0 }, { "Caron", 0xf6ca, 0 }, { "Caronsmall", 0xf6f5, 0 }, { "Ccedillaacute", 0x1e08, 0 }, { "Ccedillasmall", 0xf7e7, 0 }, { "Ccircle", 0x24b8, 0 }, { "Cdot", 0x010a, 0 }, { "Cedillasmall", 0xf7b8, 0 }, { "Chaarmenian", 0x0549, 0 }, { "Cheabkhasiancyrillic", 0x04bc, 0 }, { "Checyrillic", 0x0427, 0 }, { "Chedescenderabkhasiancyrillic", 0x04be, 0 }, { "Chedescendercyrillic", 0x04b6, 0 }, { "Chedieresiscyrillic", 0x04f4, 0 }, { "Cheharmenian", 0x0543, 0 }, { "Chekhakassiancyrillic", 0x04cb, 0 }, { "Cheverticalstrokecyrillic", 0x04b8, 0 }, { "Chook", 0x0187, 0 }, { "Circumflexsmall", 0xf6f6, 0 }, { "Cmonospace", 0xff23, 0 }, { "Coarmenian", 0x0551, 0 }, { "Csmall", 0xf763, 0 }, { "DZ", 0x01f1, 0 }, { "DZcaron", 0x01c4, 0 }, { "Daarmenian", 0x0534, 0 }, { "Dafrican", 0x0189, 0 }, { "Dcedilla", 0x1e10, 0 }, { "Dcircle", 0x24b9, 0 }, { "Dcircumflexbelow", 0x1e12, 0 }, { "Ddotaccent", 0x1e0a, 0 }, { "Ddotbelow", 0x1e0c, 0 }, { "Decyrillic", 0x0414, 0 }, { "Deicoptic", 0x03ee, 0 }, { "Deltagreek", 0x0394, 0 }, { "Dhook", 0x018a, 0 }, { "Dieresis", 0xf6cb, 0 }, { "diaeresis", 0x00a8, 0 }, { "Diaeresis", 0xf6cb, 0 }, { "DieresisAcute", 0xf6cc, 0 }, { "DieresisGrave", 0xf6cd, 0 }, { "Dieresissmall", 0xf7a8, 0 }, { "Digammagreek", 0x03dc, 0 }, { "Djecyrillic", 0x0402, 0 }, { "Dlinebelow", 0x1e0e, 0 }, { "Dmonospace", 0xff24, 0 }, { "Dotaccentsmall", 0xf6f7, 0 }, { "Dslash", 0x0110, 0 }, { "Dsmall", 0xf764, 0 }, { "Dtopbar", 0x018b, 0 }, { "Dz", 0x01f2, 0 }, { "Dzcaron", 0x01c5, 0 }, { "Dzeabkhasiancyrillic", 0x04e0, 0 }, { "Dzecyrillic", 0x0405, 0 }, { "Dzhecyrillic", 0x040f, 0 }, { "Eacutesmall", 0xf7e9, 0 }, { "Ecedillabreve", 0x1e1c, 0 }, { "Echarmenian", 0x0535, 0 }, { "Ecircle", 0x24ba, 0 }, { "Ecircumflexacute", 0x1ebe, 0 }, { "Ecircumflexbelow", 0x1e18, 0 }, { "Ecircumflexdotbelow", 0x1ec6, 0 }, { "Ecircumflexgrave", 0x1ec0, 0 }, { "Ecircumflexhookabove", 0x1ec2, 0 }, { "Ecircumflexsmall", 0xf7ea, 0 }, { "Ecircumflextilde", 0x1ec4, 0 }, { "Ecyrillic", 0x0404, 0 }, { "Edblgrave", 0x0204, 0 }, { "Edieresissmall", 0xf7eb, 0 }, { "Edot", 0x0116, 0 }, { "Edotbelow", 0x1eb8, 0 }, { "Efcyrillic", 0x0424, 0 }, { "Egravesmall", 0xf7e8, 0 }, { "Eharmenian", 0x0537, 0 }, { "Ehookabove", 0x1eba, 0 }, { "Eightroman", 0x2167, 0 }, { "Einvertedbreve", 0x0206, 0 }, { "Eiotifiedcyrillic", 0x0464, 0 }, { "Elcyrillic", 0x041b, 0 }, { "Elevenroman", 0x216a, 0 }, { "Emacronacute", 0x1e16, 0 }, { "Emacrongrave", 0x1e14, 0 }, { "Emcyrillic", 0x041c, 0 }, { "Emonospace", 0xff25, 0 }, { "Encyrillic", 0x041d, 0 }, { "Endescendercyrillic", 0x04a2, 0 }, { "Enghecyrillic", 0x04a4, 0 }, { "Enhookcyrillic", 0x04c7, 0 }, { "Eopen", 0x0190, 0 }, { "Ercyrillic", 0x0420, 0 }, { "Ereversed", 0x018e, 0 }, { "Ereversedcyrillic", 0x042d, 0 }, { "Escyrillic", 0x0421, 0 }, { "Esdescendercyrillic", 0x04aa, 0 }, { "Esh", 0x01a9, 0 }, { "Esmall", 0xf765, 0 }, { "Etarmenian", 0x0538, 0 }, { "Ethsmall", 0xf7f0, 0 }, { "Etilde", 0x1ebc, 0 }, { "Etildebelow", 0x1e1a, 0 }, { "Ezh", 0x01b7, 0 }, { "Ezhcaron", 0x01ee, 0 }, { "Ezhreversed", 0x01b8, 0 }, { "Fcircle", 0x24bb, 0 }, { "Fdotaccent", 0x1e1e, 0 }, { "Feharmenian", 0x0556, 0 }, { "Feicoptic", 0x03e4, 0 }, { "Fhook", 0x0191, 0 }, { "Fitacyrillic", 0x0472, 0 }, { "Fiveroman", 0x2164, 0 }, { "Fmonospace", 0xff26, 0 }, { "Fourroman", 0x2163, 0 }, { "Fsmall", 0xf766, 0 }, { "GBsquare", 0x3387, 0 }, { "Gacute", 0x01f4, 0 }, { "Gammaafrican", 0x0194, 0 }, { "Gangiacoptic", 0x03ea, 0 }, { "Gcedilla", 0x0122, 0 }, { "Gcircle", 0x24bc, 0 }, { "Gdot", 0x0120, 0 }, { "Gecyrillic", 0x0413, 0 }, { "Ghadarmenian", 0x0542, 0 }, { "Ghemiddlehookcyrillic", 0x0494, 0 }, { "Ghestrokecyrillic", 0x0492, 0 }, { "Gheupturncyrillic", 0x0490, 0 }, { "Ghook", 0x0193, 0 }, { "Gimarmenian", 0x0533, 0 }, { "Gjecyrillic", 0x0403, 0 }, { "Gmacron", 0x1e20, 0 }, { "Gmonospace", 0xff27, 0 }, { "Grave", 0xf6ce, 0 }, { "Gravesmall", 0xf760, 0 }, { "Gsmall", 0xf767, 0 }, { "Gsmallhook", 0x029b, 0 }, { "Gstroke", 0x01e4, 0 }, { "HPsquare", 0x33cb, 0 }, { "Haabkhasiancyrillic", 0x04a8, 0 }, { "Hadescendercyrillic", 0x04b2, 0 }, { "Hardsigncyrillic", 0x042a, 0 }, { "Hbrevebelow", 0x1e2a, 0 }, { "Hcedilla", 0x1e28, 0 }, { "Hcircle", 0x24bd, 0 }, { "Hdieresis", 0x1e26, 0 }, { "Hdotaccent", 0x1e22, 0 }, { "Hdotbelow", 0x1e24, 0 }, { "Hmonospace", 0xff28, 0 }, { "Hoarmenian", 0x0540, 0 }, { "Horicoptic", 0x03e8, 0 }, { "Hsmall", 0xf768, 0 }, { "Hungarumlaut", 0xf6cf, 0 }, { "Hungarumlautsmall", 0xf6f8, 0 }, { "Hzsquare", 0x3390, 0 }, { "IAcyrillic", 0x042f, 0 }, { "IUcyrillic", 0x042e, 0 }, { "Iacutesmall", 0xf7ed, 0 }, { "Icaron", 0x01cf, 0 }, { "Icircle", 0x24be, 0 }, { "Icircumflexsmall", 0xf7ee, 0 }, { "Icyrillic", 0x0406, 0 }, { "Idblgrave", 0x0208, 0 }, { "Idieresisacute", 0x1e2e, 0 }, { "Idieresiscyrillic", 0x04e4, 0 }, { "Idieresissmall", 0xf7ef, 0 }, { "Idot", 0x0130, 0 }, { "Idotbelow", 0x1eca, 0 }, { "Iebrevecyrillic", 0x04d6, 0 }, { "Iecyrillic", 0x0415, 0 }, { "Igravesmall", 0xf7ec, 0 }, { "Ihookabove", 0x1ec8, 0 }, { "Iicyrillic", 0x0418, 0 }, { "Iinvertedbreve", 0x020a, 0 }, { "Iishortcyrillic", 0x0419, 0 }, { "Imacroncyrillic", 0x04e2, 0 }, { "Imonospace", 0xff29, 0 }, { "Iniarmenian", 0x053b, 0 }, { "Iocyrillic", 0x0401, 0 }, { "Iotaafrican", 0x0196, 0 }, { "Ismall", 0xf769, 0 }, { "Istroke", 0x0197, 0 }, { "Itildebelow", 0x1e2c, 0 }, { "Izhitsacyrillic", 0x0474, 0 }, { "Izhitsadblgravecyrillic", 0x0476, 0 }, { "Jaarmenian", 0x0541, 0 }, { "Jcircle", 0x24bf, 0 }, { "Jecyrillic", 0x0408, 0 }, { "Jheharmenian", 0x054b, 0 }, { "Jmonospace", 0xff2a, 0 }, { "Jsmall", 0xf76a, 0 }, { "KBsquare", 0x3385, 0 }, { "KKsquare", 0x33cd, 0 }, { "Kabashkircyrillic", 0x04a0, 0 }, { "Kacute", 0x1e30, 0 }, { "Kacyrillic", 0x041a, 0 }, { "Kadescendercyrillic", 0x049a, 0 }, { "Kahookcyrillic", 0x04c3, 0 }, { "Kastrokecyrillic", 0x049e, 0 }, { "Kaverticalstrokecyrillic", 0x049c, 0 }, { "Kcaron", 0x01e8, 0 }, { "Kcedilla", 0x0136, 0 }, { "Kcircle", 0x24c0, 0 }, { "Kdotbelow", 0x1e32, 0 }, { "Keharmenian", 0x0554, 0 }, { "Kenarmenian", 0x053f, 0 }, { "Khacyrillic", 0x0425, 0 }, { "Kheicoptic", 0x03e6, 0 }, { "Khook", 0x0198, 0 }, { "Kjecyrillic", 0x040c, 0 }, { "Klinebelow", 0x1e34, 0 }, { "Kmonospace", 0xff2b, 0 }, { "Koppacyrillic", 0x0480, 0 }, { "Koppagreek", 0x03de, 0 }, { "Ksicyrillic", 0x046e, 0 }, { "Ksmall", 0xf76b, 0 }, { "LJ", 0x01c7, 0 }, { "LL", 0xf6bf, 0 }, { "Lcedilla", 0x013b, 0 }, { "Lcircle", 0x24c1, 0 }, { "Lcircumflexbelow", 0x1e3c, 0 }, { "Ldotaccent", 0x013f, 0 }, { "Ldotbelow", 0x1e36, 0 }, { "Ldotbelowmacron", 0x1e38, 0 }, { "Liwnarmenian", 0x053c, 0 }, { "Lj", 0x01c8, 0 }, { "Ljecyrillic", 0x0409, 0 }, { "Llinebelow", 0x1e3a, 0 }, { "Lmonospace", 0xff2c, 0 }, { "Lslashsmall", 0xf6f9, 0 }, { "Lsmall", 0xf76c, 0 }, { "MBsquare", 0x3386, 0 }, { "Macron", 0xf6d0, 0 }, { "Macronsmall", 0xf7af, 0 }, { "Macute", 0x1e3e, 0 }, { "Mcircle", 0x24c2, 0 }, { "Mdotaccent", 0x1e40, 0 }, { "Mdotbelow", 0x1e42, 0 }, { "Menarmenian", 0x0544, 0 }, { "Mmonospace", 0xff2d, 0 }, { "Msmall", 0xf76d, 0 }, { "Mturned", 0x019c, 0 }, { "NJ", 0x01ca, 0 }, { "Ncedilla", 0x0145, 0 }, { "Ncircle", 0x24c3, 0 }, { "Ncircumflexbelow", 0x1e4a, 0 }, { "Ndotaccent", 0x1e44, 0 }, { "Ndotbelow", 0x1e46, 0 }, { "Nhookleft", 0x019d, 0 }, { "Nineroman", 0x2168, 0 }, { "Nj", 0x01cb, 0 }, { "Njecyrillic", 0x040a, 0 }, { "Nlinebelow", 0x1e48, 0 }, { "Nmonospace", 0xff2e, 0 }, { "Nowarmenian", 0x0546, 0 }, { "Nsmall", 0xf76e, 0 }, { "Ntildesmall", 0xf7f1, 0 }, { "OEsmall", 0xf6fa, 0 }, { "Oacutesmall", 0xf7f3, 0 }, { "Obarredcyrillic", 0x04e8, 0 }, { "Obarreddieresiscyrillic", 0x04ea, 0 }, { "Ocaron", 0x01d1, 0 }, { "Ocenteredtilde", 0x019f, 0 }, { "Ocircle", 0x24c4, 0 }, { "Ocircumflexacute", 0x1ed0, 0 }, { "Ocircumflexdotbelow", 0x1ed8, 0 }, { "Ocircumflexgrave", 0x1ed2, 0 }, { "Ocircumflexhookabove", 0x1ed4, 0 }, { "Ocircumflexsmall", 0xf7f4, 0 }, { "Ocircumflextilde", 0x1ed6, 0 }, { "Ocyrillic", 0x041e, 0 }, { "Odblacute", 0x0150, 0 }, { "Odblgrave", 0x020c, 0 }, { "Odieresiscyrillic", 0x04e6, 0 }, { "Odieresissmall", 0xf7f6, 0 }, { "Odotbelow", 0x1ecc, 0 }, { "Ogoneksmall", 0xf6fb, 0 }, { "Ogravesmall", 0xf7f2, 0 }, { "Oharmenian", 0x0555, 0 }, { "Ohm", 0x2126, 0 }, { "Ohookabove", 0x1ece, 0 }, { "Ohornacute", 0x1eda, 0 }, { "Ohorndotbelow", 0x1ee2, 0 }, { "Ohorngrave", 0x1edc, 0 }, { "Ohornhookabove", 0x1ede, 0 }, { "Ohorntilde", 0x1ee0, 0 }, { "Oi", 0x01a2, 0 }, { "Oinvertedbreve", 0x020e, 0 }, { "Omacronacute", 0x1e52, 0 }, { "Omacrongrave", 0x1e50, 0 }, { "Omegacyrillic", 0x0460, 0 }, { "Omegagreek", 0x03a9, 0 }, { "Omegaroundcyrillic", 0x047a, 0 }, { "Omegatitlocyrillic", 0x047c, 0 }, { "Omonospace", 0xff2f, 0 }, { "Oneroman", 0x2160, 0 }, { "Oogonek", 0x01ea, 0 }, { "Oogonekmacron", 0x01ec, 0 }, { "Oopen", 0x0186, 0 }, { "Oslashsmall", 0xf7f8, 0 }, { "Osmall", 0xf76f, 0 }, { "Ostrokeacute", 0x01fe, 0 }, { "Otcyrillic", 0x047e, 0 }, { "Otildeacute", 0x1e4c, 0 }, { "Otildedieresis", 0x1e4e, 0 }, { "Otildesmall", 0xf7f5, 0 }, { "Pacute", 0x1e54, 0 }, { "Pcircle", 0x24c5, 0 }, { "Pdotaccent", 0x1e56, 0 }, { "Pecyrillic", 0x041f, 0 }, { "Peharmenian", 0x054a, 0 }, { "Pemiddlehookcyrillic", 0x04a6, 0 }, { "Phook", 0x01a4, 0 }, { "Piwrarmenian", 0x0553, 0 }, { "Pmonospace", 0xff30, 0 }, { "Psicyrillic", 0x0470, 0 }, { "Psmall", 0xf770, 0 }, { "Qcircle", 0x24c6, 0 }, { "Qmonospace", 0xff31, 0 }, { "Qsmall", 0xf771, 0 }, { "Raarmenian", 0x054c, 0 }, { "Rcedilla", 0x0156, 0 }, { "Rcircle", 0x24c7, 0 }, { "Rdblgrave", 0x0210, 0 }, { "Rdotaccent", 0x1e58, 0 }, { "Rdotbelow", 0x1e5a, 0 }, { "Rdotbelowmacron", 0x1e5c, 0 }, { "Reharmenian", 0x0550, 0 }, { "Ringsmall", 0xf6fc, 0 }, { "Rinvertedbreve", 0x0212, 0 }, { "Rlinebelow", 0x1e5e, 0 }, { "Rmonospace", 0xff32, 0 }, { "Rsmall", 0xf772, 0 }, { "Rsmallinverted", 0x0281, 0 }, { "Rsmallinvertedsuperior", 0x02b6, 0 }, { "Sacutedotaccent", 0x1e64, 0 }, { "Sampigreek", 0x03e0, 0 }, { "Scarondotaccent", 0x1e66, 0 }, { "Scaronsmall", 0xf6fd, 0 }, { "Schwa", 0x018f, 0 }, { "Schwacyrillic", 0x04d8, 0 }, { "Schwadieresiscyrillic", 0x04da, 0 }, { "Scircle", 0x24c8, 0 }, { "Sdotaccent", 0x1e60, 0 }, { "Sdotbelow", 0x1e62, 0 }, { "Sdotbelowdotaccent", 0x1e68, 0 }, { "Seharmenian", 0x054d, 0 }, { "Sevenroman", 0x2166, 0 }, { "Shaarmenian", 0x0547, 0 }, { "Shacyrillic", 0x0428, 0 }, { "Shchacyrillic", 0x0429, 0 }, { "Sheicoptic", 0x03e2, 0 }, { "Shhacyrillic", 0x04ba, 0 }, { "Shimacoptic", 0x03ec, 0 }, { "Sixroman", 0x2165, 0 }, { "Smonospace", 0xff33, 0 }, { "Softsigncyrillic", 0x042c, 0 }, { "Ssmall", 0xf773, 0 }, { "Stigmagreek", 0x03da, 0 }, { "Tcedilla", 0x0162, 0 }, { "Tcircle", 0x24c9, 0 }, { "Tcircumflexbelow", 0x1e70, 0 }, { "Tdotaccent", 0x1e6a, 0 }, { "Tdotbelow", 0x1e6c, 0 }, { "Tecyrillic", 0x0422, 0 }, { "Tedescendercyrillic", 0x04ac, 0 }, { "Tenroman", 0x2169, 0 }, { "Tetsecyrillic", 0x04b4, 0 }, { "Thook", 0x01ac, 0 }, { "Thornsmall", 0xf7fe, 0 }, { "Threeroman", 0x2162, 0 }, { "Tildesmall", 0xf6fe, 0 }, { "Tiwnarmenian", 0x054f, 0 }, { "Tlinebelow", 0x1e6e, 0 }, { "Tmonospace", 0xff34, 0 }, { "Toarmenian", 0x0539, 0 }, { "Tonefive", 0x01bc, 0 }, { "Tonesix", 0x0184, 0 }, { "Tonetwo", 0x01a7, 0 }, { "Tretroflexhook", 0x01ae, 0 }, { "Tsecyrillic", 0x0426, 0 }, { "Tshecyrillic", 0x040b, 0 }, { "Tsmall", 0xf774, 0 }, { "Twelveroman", 0x216b, 0 }, { "Tworoman", 0x2161, 0 }, { "Uacutesmall", 0xf7fa, 0 }, { "Ucaron", 0x01d3, 0 }, { "Ucircle", 0x24ca, 0 }, { "Ucircumflexbelow", 0x1e76, 0 }, { "Ucircumflexsmall", 0xf7fb, 0 }, { "Ucyrillic", 0x0423, 0 }, { "Udblacute", 0x0170, 0 }, { "Udblgrave", 0x0214, 0 }, { "Udieresisacute", 0x01d7, 0 }, { "Udieresisbelow", 0x1e72, 0 }, { "Udieresiscaron", 0x01d9, 0 }, { "Udieresiscyrillic", 0x04f0, 0 }, { "Udieresisgrave", 0x01db, 0 }, { "Udieresismacron", 0x01d5, 0 }, { "Udieresissmall", 0xf7fc, 0 }, { "Udotbelow", 0x1ee4, 0 }, { "Ugravesmall", 0xf7f9, 0 }, { "Uhookabove", 0x1ee6, 0 }, { "Uhornacute", 0x1ee8, 0 }, { "Uhorndotbelow", 0x1ef0, 0 }, { "Uhorngrave", 0x1eea, 0 }, { "Uhornhookabove", 0x1eec, 0 }, { "Uhorntilde", 0x1eee, 0 }, { "Uhungarumlautcyrillic", 0x04f2, 0 }, { "Uinvertedbreve", 0x0216, 0 }, { "Ukcyrillic", 0x0478, 0 }, { "Umacroncyrillic", 0x04ee, 0 }, { "Umacrondieresis", 0x1e7a, 0 }, { "Umonospace", 0xff35, 0 }, { "Upsilonacutehooksymbolgreek", 0x03d3, 0 }, { "Upsilonafrican", 0x01b1, 0 }, { "Upsilondieresishooksymbolgreek", 0x03d4, 0 }, { "Upsilonhooksymbol", 0x03d2, 0 }, { "Ushortcyrillic", 0x040e, 0 }, { "Usmall", 0xf775, 0 }, { "Ustraightcyrillic", 0x04ae, 0 }, { "Ustraightstrokecyrillic", 0x04b0, 0 }, { "Utildeacute", 0x1e78, 0 }, { "Utildebelow", 0x1e74, 0 }, { "Vcircle", 0x24cb, 0 }, { "Vdotbelow", 0x1e7e, 0 }, { "Vecyrillic", 0x0412, 0 }, { "Vewarmenian", 0x054e, 0 }, { "Vhook", 0x01b2, 0 }, { "Vmonospace", 0xff36, 0 }, { "Voarmenian", 0x0548, 0 }, { "Vsmall", 0xf776, 0 }, { "Vtilde", 0x1e7c, 0 }, { "Wcircle", 0x24cc, 0 }, { "Wdotaccent", 0x1e86, 0 }, { "Wdotbelow", 0x1e88, 0 }, { "Wmonospace", 0xff37, 0 }, { "Wsmall", 0xf777, 0 }, { "Xcircle", 0x24cd, 0 }, { "Xdieresis", 0x1e8c, 0 }, { "Xdotaccent", 0x1e8a, 0 }, { "Xeharmenian", 0x053d, 0 }, { "Xmonospace", 0xff38, 0 }, { "Xsmall", 0xf778, 0 }, { "Yacutesmall", 0xf7fd, 0 }, { "Yatcyrillic", 0x0462, 0 }, { "Ycircle", 0x24ce, 0 }, { "Ydieresissmall", 0xf7ff, 0 }, { "Ydotaccent", 0x1e8e, 0 }, { "Ydotbelow", 0x1ef4, 0 }, { "Yericyrillic", 0x042b, 0 }, { "Yerudieresiscyrillic", 0x04f8, 0 }, { "Yhook", 0x01b3, 0 }, { "Yhookabove", 0x1ef6, 0 }, { "Yiarmenian", 0x0545, 0 }, { "Yicyrillic", 0x0407, 0 }, { "Yiwnarmenian", 0x0552, 0 }, { "Ymonospace", 0xff39, 0 }, { "Ysmall", 0xf779, 0 }, { "Ytilde", 0x1ef8, 0 }, { "Yusbigcyrillic", 0x046a, 0 }, { "Yusbigiotifiedcyrillic", 0x046c, 0 }, { "Yuslittlecyrillic", 0x0466, 0 }, { "Yuslittleiotifiedcyrillic", 0x0468, 0 }, { "Zaarmenian", 0x0536, 0 }, { "Zcaronsmall", 0xf6ff, 0 }, { "Zcircle", 0x24cf, 0 }, { "Zcircumflex", 0x1e90, 0 }, { "Zdot", 0x017b, 0 }, { "Zdotbelow", 0x1e92, 0 }, { "Zecyrillic", 0x0417, 0 }, { "Zedescendercyrillic", 0x0498, 0 }, { "Zedieresiscyrillic", 0x04de, 0 }, { "Zhearmenian", 0x053a, 0 }, { "Zhebrevecyrillic", 0x04c1, 0 }, { "Zhecyrillic", 0x0416, 0 }, { "Zhedescendercyrillic", 0x0496, 0 }, { "Zhedieresiscyrillic", 0x04dc, 0 }, { "Zlinebelow", 0x1e94, 0 }, { "Zmonospace", 0xff3a, 0 }, { "Zsmall", 0xf77a, 0 }, { "Zstroke", 0x01b5, 0 }, { "aabengali", 0x0986, 0 }, { "aadeva", 0x0906, 0 }, { "aagujarati", 0x0a86, 0 }, { "aagurmukhi", 0x0a06, 0 }, { "aamatragurmukhi", 0x0a3e, 0 }, { "aarusquare", 0x3303, 0 }, { "aavowelsignbengali", 0x09be, 0 }, { "aavowelsigndeva", 0x093e, 0 }, { "aavowelsigngujarati", 0x0abe, 0 }, { "abbreviationmarkarmenian", 0x055f, 0 }, { "abbreviationsigndeva", 0x0970, 0 }, { "abengali", 0x0985, 0 }, { "abopomofo", 0x311a, 0 }, { "abreveacute", 0x1eaf, 0 }, { "abrevecyrillic", 0x04d1, 0 }, { "abrevedotbelow", 0x1eb7, 0 }, { "abrevegrave", 0x1eb1, 0 }, { "abrevehookabove", 0x1eb3, 0 }, { "abrevetilde", 0x1eb5, 0 }, { "acaron", 0x01ce, 0 }, { "acircle", 0x24d0, 0 }, { "acircumflexacute", 0x1ea5, 0 }, { "acircumflexdotbelow", 0x1ead, 0 }, { "acircumflexgrave", 0x1ea7, 0 }, { "acircumflexhookabove", 0x1ea9, 0 }, { "acircumflextilde", 0x1eab, 0 }, { "acutebelowcmb", 0x0317, 0 }, { "acutecmb", 0x0301, 0 }, { "acutedeva", 0x0954, 0 }, { "acutelowmod", 0x02cf, 0 }, { "acutetonecmb", 0x0341, 0 }, { "acyrillic", 0x0430, 0 }, { "adblgrave", 0x0201, 0 }, { "addakgurmukhi", 0x0a71, 0 }, { "adeva", 0x0905, 0 }, { "adieresiscyrillic", 0x04d3, 0 }, { "adieresismacron", 0x01df, 0 }, { "adotbelow", 0x1ea1, 0 }, { "adotmacron", 0x01e1, 0 }, { "aekorean", 0x3150, 0 }, { "aemacron", 0x01e3, 0 }, { "afii08941", 0x20a4, 0 }, { "afii10063", 0xf6c4, 0 }, { "afii10064", 0xf6c5, 0 }, { "afii10192", 0xf6c6, 0 }, { "afii10831", 0xf6c7, 0 }, { "afii10832", 0xf6c8, 0 }, { "afii57694", 0xfb2a, 0 }, { "afii57695", 0xfb2b, 0 }, { "afii57700", 0xfb4b, 0 }, { "afii57705", 0xfb1f, 0 }, { "afii57723", 0xfb35, 0 }, { "agujarati", 0x0a85, 0 }, { "agurmukhi", 0x0a05, 0 }, { "ahiragana", 0x3042, 0 }, { "ahookabove", 0x1ea3, 0 }, { "aibengali", 0x0990, 0 }, { "aibopomofo", 0x311e, 0 }, { "aideva", 0x0910, 0 }, { "aiecyrillic", 0x04d5, 0 }, { "aigujarati", 0x0a90, 0 }, { "aigurmukhi", 0x0a10, 0 }, { "aimatragurmukhi", 0x0a48, 0 }, { "ainarabic", 0x0639, 0 }, { "ainfinalarabic", 0xfeca, 0 }, { "aininitialarabic", 0xfecb, 0 }, { "ainmedialarabic", 0xfecc, 0 }, { "ainvertedbreve", 0x0203, 0 }, { "aivowelsignbengali", 0x09c8, 0 }, { "aivowelsigndeva", 0x0948, 0 }, { "aivowelsigngujarati", 0x0ac8, 0 }, { "akatakana", 0x30a2, 0 }, { "akatakanahalfwidth", 0xff71, 0 }, { "akorean", 0x314f, 0 }, { "alef", 0x05d0, 0 }, { "alefarabic", 0x0627, 0 }, { "alefdageshhebrew", 0xfb30, 0 }, { "aleffinalarabic", 0xfe8e, 0 }, { "alefhamzaabovearabic", 0x0623, 0 }, { "alefhamzaabovefinalarabic", 0xfe84, 0 }, { "alefhamzabelowarabic", 0x0625, 0 }, { "alefhamzabelowfinalarabic", 0xfe88, 0 }, { "alefhebrew", 0x05d0, 0 }, { "aleflamedhebrew", 0xfb4f, 0 }, { "alefmaddaabovearabic", 0x0622, 0 }, { "alefmaddaabovefinalarabic", 0xfe82, 0 }, { "alefmaksuraarabic", 0x0649, 0 }, { "alefmaksurafinalarabic", 0xfef0, 0 }, { "alefmaksurainitialarabic", 0xfef3, 0 }, { "alefmaksuramedialarabic", 0xfef4, 0 }, { "alefpatahhebrew", 0xfb2e, 0 }, { "alefqamatshebrew", 0xfb2f, 0 }, { "allequal", 0x224c, 0 }, { "amonospace", 0xff41, 0 }, { "ampersandmonospace", 0xff06, 0 }, { "ampersandsmall", 0xf726, 0 }, { "amsquare", 0x33c2, 0 }, { "anbopomofo", 0x3122, 0 }, { "angbopomofo", 0x3124, 0 }, { "angkhankhuthai", 0x0e5a, 0 }, { "anglebracketleft", 0x3008, 0 }, { "anglebracketleftvertical", 0xfe3f, 0 }, { "anglebracketright", 0x3009, 0 }, { "anglebracketrightvertical", 0xfe40, 0 }, { "angstrom", 0x212b, 0 }, { "anudattadeva", 0x0952, 0 }, { "anusvarabengali", 0x0982, 0 }, { "anusvaradeva", 0x0902, 0 }, { "anusvaragujarati", 0x0a82, 0 }, { "apaatosquare", 0x3300, 0 }, { "aparen", 0x249c, 0 }, { "apostrophearmenian", 0x055a, 0 }, { "apostrophemod", 0x02bc, 0 }, { "apple", 0xf8ff, 0 }, { "approaches", 0x2250, 0 }, { "approxequalorimage", 0x2252, 0 }, { "approximatelyequal", 0x2245, 0 }, { "araeaekorean", 0x318e, 0 }, { "araeakorean", 0x318d, 0 }, { "arc", 0x2312, 0 }, { "arighthalfring", 0x1e9a, 0 }, { "aringbelow", 0x1e01, 0 }, { "arrowdashdown", 0x21e3, 0 }, { "arrowdashleft", 0x21e0, 0 }, { "arrowdashright", 0x21e2, 0 }, { "arrowdashup", 0x21e1, 0 }, { "arrowdownleft", 0x2199, 0 }, { "arrowdownright", 0x2198, 0 }, { "arrowdownwhite", 0x21e9, 0 }, { "arrowheaddownmod", 0x02c5, 0 }, { "arrowheadleftmod", 0x02c2, 0 }, { "arrowheadrightmod", 0x02c3, 0 }, { "arrowheadupmod", 0x02c4, 0 }, { "arrowhorizex", 0xf8e7, 0 }, { "arrowleftdbl", 0x21d0, 0 }, { "arrowleftdblstroke", 0x21cd, 0 }, { "arrowleftoverright", 0x21c6, 0 }, { "arrowleftwhite", 0x21e6, 0 }, { "arrowrightdblstroke", 0x21cf, 0 }, { "arrowrightheavy", 0x279e, 0 }, { "arrowrightoverleft", 0x21c4, 0 }, { "arrowrightwhite", 0x21e8, 0 }, { "arrowtableft", 0x21e4, 0 }, { "arrowtabright", 0x21e5, 0 }, { "arrowupdownbase", 0x21a8, 0 }, { "arrowupleft", 0x2196, 0 }, { "arrowupleftofdown", 0x21c5, 0 }, { "arrowupright", 0x2197, 0 }, { "arrowupwhite", 0x21e7, 0 }, { "arrowvertex", 0xf8e6, 0 }, { "asciicircummonospace", 0xff3e, 0 }, { "asciitildemonospace", 0xff5e, 0 }, { "ascript", 0x0251, 0 }, { "ascriptturned", 0x0252, 0 }, { "asmallhiragana", 0x3041, 0 }, { "asmallkatakana", 0x30a1, 0 }, { "asmallkatakanahalfwidth", 0xff67, 0 }, { "asteriskaltonearabic", 0x066d, 0 }, { "asteriskarabic", 0x066d, 0 }, { "asteriskmonospace", 0xff0a, 0 }, { "asterisksmall", 0xfe61, 0 }, { "asterism", 0x2042, 0 }, { "asuperior", 0xf6e9, 0 }, { "asymptoticallyequal", 0x2243, 0 }, { "atmonospace", 0xff20, 0 }, { "atsmall", 0xfe6b, 0 }, { "aturned", 0x0250, 0 }, { "aubengali", 0x0994, 0 }, { "aubopomofo", 0x3120, 0 }, { "audeva", 0x0914, 0 }, { "augujarati", 0x0a94, 0 }, { "augurmukhi", 0x0a14, 0 }, { "aulengthmarkbengali", 0x09d7, 0 }, { "aumatragurmukhi", 0x0a4c, 0 }, { "auvowelsignbengali", 0x09cc, 0 }, { "auvowelsigndeva", 0x094c, 0 }, { "auvowelsigngujarati", 0x0acc, 0 }, { "avagrahadeva", 0x093d, 0 }, { "aybarmenian", 0x0561, 0 }, { "ayin", 0x05e2, 0 }, { "ayinaltonehebrew", 0xfb20, 0 }, { "ayinhebrew", 0x05e2, 0 }, { "babengali", 0x09ac, 0 }, { "backslashmonospace", 0xff3c, 0 }, { "badeva", 0x092c, 0 }, { "bagujarati", 0x0aac, 0 }, { "bagurmukhi", 0x0a2c, 0 }, { "bahiragana", 0x3070, 0 }, { "bahtthai", 0x0e3f, 0 }, { "bakatakana", 0x30d0, 0 }, { "barmonospace", 0xff5c, 0 }, { "bbopomofo", 0x3105, 0 }, { "bcircle", 0x24d1, 0 }, { "bdotaccent", 0x1e03, 0 }, { "bdotbelow", 0x1e05, 0 }, { "beamedsixteenthnotes", 0x266c, 0 }, { "because", 0x2235, 0 }, { "becyrillic", 0x0431, 0 }, { "beharabic", 0x0628, 0 }, { "behfinalarabic", 0xfe90, 0 }, { "behinitialarabic", 0xfe91, 0 }, { "behiragana", 0x3079, 0 }, { "behmedialarabic", 0xfe92, 0 }, { "behmeeminitialarabic", 0xfc9f, 0 }, { "behmeemisolatedarabic", 0xfc08, 0 }, { "behnoonfinalarabic", 0xfc6d, 0 }, { "bekatakana", 0x30d9, 0 }, { "benarmenian", 0x0562, 0 }, { "bet", 0x05d1, 0 }, { "betasymbolgreek", 0x03d0, 0 }, { "betdagesh", 0xfb31, 0 }, { "betdageshhebrew", 0xfb31, 0 }, { "bethebrew", 0x05d1, 0 }, { "betrafehebrew", 0xfb4c, 0 }, { "bhabengali", 0x09ad, 0 }, { "bhadeva", 0x092d, 0 }, { "bhagujarati", 0x0aad, 0 }, { "bhagurmukhi", 0x0a2d, 0 }, { "bhook", 0x0253, 0 }, { "bihiragana", 0x3073, 0 }, { "bikatakana", 0x30d3, 0 }, { "bilabialclick", 0x0298, 0 }, { "bindigurmukhi", 0x0a02, 0 }, { "birusquare", 0x3331, 0 }, { "blackcircle", 0x25cf, 0 }, { "blackdiamond", 0x25c6, 0 }, { "blackdownpointingtriangle", 0x25bc, 0 }, { "blackleftpointingpointer", 0x25c4, 0 }, { "blackleftpointingtriangle", 0x25c0, 0 }, { "blacklenticularbracketleft", 0x3010, 0 }, { "blacklenticularbracketleftvertical", 0xfe3b, 0 }, { "blacklenticularbracketright", 0x3011, 0 }, { "blacklenticularbracketrightvertical", 0xfe3c, 0 }, { "blacklowerlefttriangle", 0x25e3, 0 }, { "blacklowerrighttriangle", 0x25e2, 0 }, { "blackrectangle", 0x25ac, 0 }, { "blackrightpointingpointer", 0x25ba, 0 }, { "blackrightpointingtriangle", 0x25b6, 0 }, { "blacksmallsquare", 0x25aa, 0 }, { "blacksmilingface", 0x263b, 0 }, { "blacksquare", 0x25a0, 0 }, { "blackstar", 0x2605, 0 }, { "blackupperlefttriangle", 0x25e4, 0 }, { "blackupperrighttriangle", 0x25e5, 0 }, { "blackuppointingsmalltriangle", 0x25b4, 0 }, { "blackuppointingtriangle", 0x25b2, 0 }, { "blank", 0x2423, 0 }, { "blinebelow", 0x1e07, 0 }, { "bmonospace", 0xff42, 0 }, { "bobaimaithai", 0x0e1a, 0 }, { "bohiragana", 0x307c, 0 }, { "bokatakana", 0x30dc, 0 }, { "bparen", 0x249d, 0 }, { "bqsquare", 0x33c3, 0 }, { "braceex", 0xf8f4, 0 }, { "braceleftbt", 0xf8f3, 0 }, { "braceleftmid", 0xf8f2, 0 }, { "braceleftmonospace", 0xff5b, 0 }, { "braceleftsmall", 0xfe5b, 0 }, { "bracelefttp", 0xf8f1, 0 }, { "braceleftvertical", 0xfe37, 0 }, { "bracerightbt", 0xf8fe, 0 }, { "bracerightmid", 0xf8fd, 0 }, { "bracerightmonospace", 0xff5d, 0 }, { "bracerightsmall", 0xfe5c, 0 }, { "bracerighttp", 0xf8fc, 0 }, { "bracerightvertical", 0xfe38, 0 }, { "bracketleftbt", 0xf8f0, 0 }, { "bracketleftex", 0xf8ef, 0 }, { "bracketleftmonospace", 0xff3b, 0 }, { "bracketlefttp", 0xf8ee, 0 }, { "bracketrightbt", 0xf8fb, 0 }, { "bracketrightex", 0xf8fa, 0 }, { "bracketrightmonospace", 0xff3d, 0 }, { "bracketrighttp", 0xf8f9, 0 }, { "brevebelowcmb", 0x032e, 0 }, { "brevecmb", 0x0306, 0 }, { "breveinvertedbelowcmb", 0x032f, 0 }, { "breveinvertedcmb", 0x0311, 0 }, { "breveinverteddoublecmb", 0x0361, 0 }, { "bridgebelowcmb", 0x032a, 0 }, { "bridgeinvertedbelowcmb", 0x033a, 0 }, { "bstroke", 0x0180, 0 }, { "bsuperior", 0xf6ea, 0 }, { "btopbar", 0x0183, 0 }, { "buhiragana", 0x3076, 0 }, { "bukatakana", 0x30d6, 0 }, { "bulletinverse", 0x25d8, 0 }, { "bulletoperator", 0x2219, 0 }, { "bullseye", 0x25ce, 0 }, { "caarmenian", 0x056e, 0 }, { "cabengali", 0x099a, 0 }, { "cadeva", 0x091a, 0 }, { "cagujarati", 0x0a9a, 0 }, { "cagurmukhi", 0x0a1a, 0 }, { "calsquare", 0x3388, 0 }, { "candrabindubengali", 0x0981, 0 }, { "candrabinducmb", 0x0310, 0 }, { "candrabindudeva", 0x0901, 0 }, { "candrabindugujarati", 0x0a81, 0 }, { "capslock", 0x21ea, 0 }, { "careof", 0x2105, 0 }, { "caronbelowcmb", 0x032c, 0 }, { "caroncmb", 0x030c, 0 }, { "cbopomofo", 0x3118, 0 }, { "ccedillaacute", 0x1e09, 0 }, { "ccircle", 0x24d2, 0 }, { "ccurl", 0x0255, 0 }, { "cdot", 0x010b, 0 }, { "cdsquare", 0x33c5, 0 }, { "cedillacmb", 0x0327, 0 }, { "centigrade", 0x2103, 0 }, { "centinferior", 0xf6df, 0 }, { "centmonospace", 0xffe0, 0 }, { "centoldstyle", 0xf7a2, 0 }, { "centsuperior", 0xf6e0, 0 }, { "chaarmenian", 0x0579, 0 }, { "chabengali", 0x099b, 0 }, { "chadeva", 0x091b, 0 }, { "chagujarati", 0x0a9b, 0 }, { "chagurmukhi", 0x0a1b, 0 }, { "chbopomofo", 0x3114, 0 }, { "cheabkhasiancyrillic", 0x04bd, 0 }, { "checkmark", 0x2713, 0 }, { "checyrillic", 0x0447, 0 }, { "chedescenderabkhasiancyrillic", 0x04bf, 0 }, { "chedescendercyrillic", 0x04b7, 0 }, { "chedieresiscyrillic", 0x04f5, 0 }, { "cheharmenian", 0x0573, 0 }, { "chekhakassiancyrillic", 0x04cc, 0 }, { "cheverticalstrokecyrillic", 0x04b9, 0 }, { "chieuchacirclekorean", 0x3277, 0 }, { "chieuchaparenkorean", 0x3217, 0 }, { "chieuchcirclekorean", 0x3269, 0 }, { "chieuchkorean", 0x314a, 0 }, { "chieuchparenkorean", 0x3209, 0 }, { "chochangthai", 0x0e0a, 0 }, { "chochanthai", 0x0e08, 0 }, { "chochingthai", 0x0e09, 0 }, { "chochoethai", 0x0e0c, 0 }, { "chook", 0x0188, 0 }, { "cieucacirclekorean", 0x3276, 0 }, { "cieucaparenkorean", 0x3216, 0 }, { "cieuccirclekorean", 0x3268, 0 }, { "cieuckorean", 0x3148, 0 }, { "cieucparenkorean", 0x3208, 0 }, { "cieucuparenkorean", 0x321c, 0 }, { "circleot", 0x2299, 0 }, /* Typo in Adobe's glyphlist */ { "circledot", 0x2299, 0 }, /* But same typo exists in acrobat */ { "circlepostalmark", 0x3036, 0 }, { "circlewithlefthalfblack", 0x25d0, 0 }, { "circlewithrighthalfblack", 0x25d1, 0 }, { "circumflexbelowcmb", 0x032d, 0 }, { "circumflexcmb", 0x0302, 0 }, { "clear", 0x2327, 0 }, { "clickalveolar", 0x01c2, 0 }, { "clickdental", 0x01c0, 0 }, { "clicklateral", 0x01c1, 0 }, { "clickretroflex", 0x01c3, 0 }, { "clubsuitblack", 0x2663, 0 }, { "clubsuitwhite", 0x2667, 0 }, { "cmcubedsquare", 0x33a4, 0 }, { "cmonospace", 0xff43, 0 }, { "cmsquaredsquare", 0x33a0, 0 }, { "coarmenian", 0x0581, 0 }, { "colonmonospace", 0xff1a, 0 }, { "colonsign", 0x20a1, 0 }, { "colonsmall", 0xfe55, 0 }, { "colontriangularhalfmod", 0x02d1, 0 }, { "colontriangularmod", 0x02d0, 0 }, { "commaabovecmb", 0x0313, 0 }, { "commaaboverightcmb", 0x0315, 0 }, { "commaaccent", 0xf6c3, 0 }, { "commaarabic", 0x060c, 0 }, { "commaarmenian", 0x055d, 0 }, { "commainferior", 0xf6e1, 0 }, { "commamonospace", 0xff0c, 0 }, { "commareversedabovecmb", 0x0314, 0 }, { "commareversedmod", 0x02bd, 0 }, { "commasmall", 0xfe50, 0 }, { "commasuperior", 0xf6e2, 0 }, { "commaturnedabovecmb", 0x0312, 0 }, { "commaturnedmod", 0x02bb, 0 }, { "compass", 0x263c, 0 }, { "contourintegral", 0x222e, 0 }, { "control", 0x2303, 0 }, { "controlACK", 0x0006, 0 }, { "controlBEL", 0x0007, 0 }, { "controlBS", 0x0008, 0 }, { "controlCAN", 0x0018, 0 }, { "controlCR", 0x000d, 0 }, { "controlDC1", 0x0011, 0 }, { "controlDC2", 0x0012, 0 }, { "controlDC3", 0x0013, 0 }, { "controlDC4", 0x0014, 0 }, { "controlDEL", 0x007f, 0 }, { "controlDLE", 0x0010, 0 }, { "controlEM", 0x0019, 0 }, { "controlENQ", 0x0005, 0 }, { "controlEOT", 0x0004, 0 }, { "controlESC", 0x001b, 0 }, { "controlETB", 0x0017, 0 }, { "controlETX", 0x0003, 0 }, { "controlFF", 0x000c, 0 }, { "controlFS", 0x001c, 0 }, { "controlGS", 0x001d, 0 }, { "controlHT", 0x0009, 0 }, { "controlLF", 0x000a, 0 }, { "controlNAK", 0x0015, 0 }, { "controlRS", 0x001e, 0 }, { "controlSI", 0x000f, 0 }, { "controlSO", 0x000e, 0 }, { "controlSOT", 0x0002, 0 }, { "controlSTX", 0x0001, 0 }, { "controlSUB", 0x001a, 0 }, { "controlSYN", 0x0016, 0 }, { "controlUS", 0x001f, 0 }, { "controlVT", 0x000b, 0 }, { "copyrightsans", 0xf8e9, 0 }, { "copyrightserif", 0xf6d9, 0 }, { "cornerbracketleft", 0x300c, 0 }, { "cornerbracketlefthalfwidth", 0xff62, 0 }, { "cornerbracketleftvertical", 0xfe41, 0 }, { "cornerbracketright", 0x300d, 0 }, { "cornerbracketrighthalfwidth", 0xff63, 0 }, { "cornerbracketrightvertical", 0xfe42, 0 }, { "corporationsquare", 0x337f, 0 }, { "cosquare", 0x33c7, 0 }, { "coverkgsquare", 0x33c6, 0 }, { "cparen", 0x249e, 0 }, { "cruzeiro", 0x20a2, 0 }, { "cstretched", 0x0297, 0 }, { "curlyand", 0x22cf, 0 }, { "curlyor", 0x22ce, 0 }, { "cyrBreve", 0xf6d1, 0 }, { "cyrFlex", 0xf6d2, 0 }, { "cyrbreve", 0xf6d4, 0 }, { "cyrflex", 0xf6d5, 0 }, { "daarmenian", 0x0564, 0 }, { "dabengali", 0x09a6, 0 }, { "dadarabic", 0x0636, 0 }, { "dadeva", 0x0926, 0 }, { "dadfinalarabic", 0xfebe, 0 }, { "dadinitialarabic", 0xfebf, 0 }, { "dadmedialarabic", 0xfec0, 0 }, { "dagesh", 0x05bc, 0 }, { "dageshhebrew", 0x05bc, 0 }, { "dagujarati", 0x0aa6, 0 }, { "dagurmukhi", 0x0a26, 0 }, { "dahiragana", 0x3060, 0 }, { "dakatakana", 0x30c0, 0 }, { "dalarabic", 0x062f, 0 }, { "dalet", 0x05d3, 0 }, { "daletdagesh", 0xfb33, 0 }, { "daletdageshhebrew", 0xfb33, 0 }, { "dalethatafpatah", 0x05d3, 0 }, { "dalethatafpatahhebrew", 0x05d3, 0 }, { "dalethatafsegol", 0x05d3, 0 }, { "dalethatafsegolhebrew", 0x05d3, 0 }, { "dalethebrew", 0x05d3, 0 }, { "dalethiriq", 0x05d3, 0 }, { "dalethiriqhebrew", 0x05d3, 0 }, { "daletholam", 0x05d3, 0 }, { "daletholamhebrew", 0x05d3, 0 }, { "daletpatah", 0x05d3, 0 }, { "daletpatahhebrew", 0x05d3, 0 }, { "daletqamats", 0x05d3, 0 }, { "daletqamatshebrew", 0x05d3, 0 }, { "daletqubuts", 0x05d3, 0 }, { "daletqubutshebrew", 0x05d3, 0 }, { "daletsegol", 0x05d3, 0 }, { "daletsegolhebrew", 0x05d3, 0 }, { "daletsheva", 0x05d3, 0 }, { "daletshevahebrew", 0x05d3, 0 }, { "dalettsere", 0x05d3, 0 }, { "dalettserehebrew", 0x05d3, 0 }, { "dalfinalarabic", 0xfeaa, 0 }, { "dammaarabic", 0x064f, 0 }, { "dammalowarabic", 0x064f, 0 }, { "dammatanaltonearabic", 0x064c, 0 }, { "dammatanarabic", 0x064c, 0 }, { "danda", 0x0964, 0 }, { "dargahebrew", 0x05a7, 0 }, { "dargalefthebrew", 0x05a7, 0 }, { "dasiapneumatacyrilliccmb", 0x0485, 0 }, { "dblGrave", 0xf6d3, 0 }, { "dblanglebracketleft", 0x300a, 0 }, { "dblanglebracketleftvertical", 0xfe3d, 0 }, { "dblanglebracketright", 0x300b, 0 }, { "dblanglebracketrightvertical", 0xfe3e, 0 }, { "dblarchinvertedbelowcmb", 0x032b, 0 }, { "dblarrowleft", 0x21d4, 0 }, { "dblarrowright", 0x21d2, 0 }, { "dbldanda", 0x0965, 0 }, { "dblgrave", 0xf6d6, 0 }, { "dblgravecmb", 0x030f, 0 }, { "dblintegral", 0x222c, 0 }, { "dbllowline", 0x2017, 0 }, { "dbllowlinecmb", 0x0333, 0 }, { "dbloverlinecmb", 0x033f, 0 }, { "dblprimemod", 0x02ba, 0 }, { "dblverticalbar", 0x2016, 0 }, { "dblverticallineabovecmb", 0x030e, 0 }, { "dbopomofo", 0x3109, 0 }, { "dbsquare", 0x33c8, 0 }, { "dcedilla", 0x1e11, 0 }, { "dcircle", 0x24d3, 0 }, { "dcircumflexbelow", 0x1e13, 0 }, { "ddabengali", 0x09a1, 0 }, { "ddadeva", 0x0921, 0 }, { "ddagujarati", 0x0aa1, 0 }, { "ddagurmukhi", 0x0a21, 0 }, { "ddalarabic", 0x0688, 0 }, { "ddalfinalarabic", 0xfb89, 0 }, { "dddhadeva", 0x095c, 0 }, { "ddhabengali", 0x09a2, 0 }, { "ddhadeva", 0x0922, 0 }, { "ddhagujarati", 0x0aa2, 0 }, { "ddhagurmukhi", 0x0a22, 0 }, { "ddotaccent", 0x1e0b, 0 }, { "ddotbelow", 0x1e0d, 0 }, { "decimalseparatorarabic", 0x066b, 0 }, { "decimalseparatorpersian", 0x066b, 0 }, { "decyrillic", 0x0434, 0 }, { "dehihebrew", 0x05ad, 0 }, { "dehiragana", 0x3067, 0 }, { "deicoptic", 0x03ef, 0 }, { "dekatakana", 0x30c7, 0 }, { "deleteleft", 0x232b, 0 }, { "deleteright", 0x2326, 0 }, { "deltaturned", 0x018d, 0 }, { "denominatorminusonenumeratorbengali", 0x09f8, 0 }, { "dezh", 0x02a4, 0 }, { "dhabengali", 0x09a7, 0 }, { "dhadeva", 0x0927, 0 }, { "dhagujarati", 0x0aa7, 0 }, { "dhagurmukhi", 0x0a27, 0 }, { "dhook", 0x0257, 0 }, { "dialytikatonos", 0x0385, 0 }, { "dialytikatonoscmb", 0x0344, 0 }, { "diamondsuitwhite", 0x2662, 0 }, { "dieresisacute", 0xf6d7, 0 }, { "dieresisbelowcmb", 0x0324, 0 }, { "dieresiscmb", 0x0308, 0 }, { "dieresisgrave", 0xf6d8, 0 }, { "dihiragana", 0x3062, 0 }, { "dikatakana", 0x30c2, 0 }, { "dittomark", 0x3003, 0 }, { "divides", 0x2223, 0 }, { "divisionslash", 0x2215, 0 }, { "djecyrillic", 0x0452, 0 }, { "dlinebelow", 0x1e0f, 0 }, { "dlsquare", 0x3397, 0 }, { "dmacron", 0x0111, 0 }, { "dmonospace", 0xff44, 0 }, { "dochadathai", 0x0e0e, 0 }, { "dodekthai", 0x0e14, 0 }, { "dohiragana", 0x3069, 0 }, { "dokatakana", 0x30c9, 0 }, { "dollarinferior", 0xf6e3, 0 }, { "dollarmonospace", 0xff04, 0 }, { "dollaroldstyle", 0xf724, 0 }, { "dollarsmall", 0xfe69, 0 }, { "dollarsuperior", 0xf6e4, 0 }, { "dorusquare", 0x3326, 0 }, { "dotaccentcmb", 0x0307, 0 }, { "dotbelowcmb", 0x0323, 0 }, { "dotkatakana", 0x30fb, 0 }, { "dotlessj", 0x0237, 0 }, /* !!!! AGL Still says this is 0xf6be */ { "dotlessjstrokehook", 0x0284, 0 }, { "dottedcircle", 0x25cc, 0 }, { "doubleyodpatah", 0xfb1f, 0 }, { "doubleyodpatahhebrew", 0xfb1f, 0 }, { "downtackbelowcmb", 0x031e, 0 }, { "downtackmod", 0x02d5, 0 }, { "dparen", 0x249f, 0 }, { "dsuperior", 0xf6eb, 0 }, { "dtail", 0x0256, 0 }, { "dtopbar", 0x018c, 0 }, { "duhiragana", 0x3065, 0 }, { "dukatakana", 0x30c5, 0 }, { "dz", 0x01f3, 0 }, { "dzaltone", 0x02a3, 0 }, { "dzcaron", 0x01c6, 0 }, { "dzcurl", 0x02a5, 0 }, { "dzeabkhasiancyrillic", 0x04e1, 0 }, { "dzecyrillic", 0x0455, 0 }, { "dzhecyrillic", 0x045f, 0 }, { "earth", 0x2641, 0 }, { "ebengali", 0x098f, 0 }, { "ebopomofo", 0x311c, 0 }, { "ecandradeva", 0x090d, 0 }, { "ecandragujarati", 0x0a8d, 0 }, { "ecandravowelsigndeva", 0x0945, 0 }, { "ecandravowelsigngujarati", 0x0ac5, 0 }, { "ecedillabreve", 0x1e1d, 0 }, { "echarmenian", 0x0565, 0 }, { "echyiwnarmenian", 0x0587, 0 }, { "ecircle", 0x24d4, 0 }, { "ecircumflexacute", 0x1ebf, 0 }, { "ecircumflexbelow", 0x1e19, 0 }, { "ecircumflexdotbelow", 0x1ec7, 0 }, { "ecircumflexgrave", 0x1ec1, 0 }, { "ecircumflexhookabove", 0x1ec3, 0 }, { "ecircumflextilde", 0x1ec5, 0 }, { "ecyrillic", 0x0454, 0 }, { "edblgrave", 0x0205, 0 }, { "edeva", 0x090f, 0 }, { "edot", 0x0117, 0 }, { "edotbelow", 0x1eb9, 0 }, { "eegurmukhi", 0x0a0f, 0 }, { "eematragurmukhi", 0x0a47, 0 }, { "efcyrillic", 0x0444, 0 }, { "egujarati", 0x0a8f, 0 }, { "eharmenian", 0x0567, 0 }, { "ehbopomofo", 0x311d, 0 }, { "ehiragana", 0x3048, 0 }, { "ehookabove", 0x1ebb, 0 }, { "eibopomofo", 0x311f, 0 }, { "eightarabic", 0x0668, 0 }, { "eightbengali", 0x09ee, 0 }, { "eightcircle", 0x2467, 0 }, { "eightcircleinversesansserif", 0x2791, 0 }, { "eightdeva", 0x096e, 0 }, { "eighteencircle", 0x2471, 0 }, { "eighteenparen", 0x2485, 0 }, { "eighteenperiod", 0x2499, 0 }, { "eightgujarati", 0x0aee, 0 }, { "eightgurmukhi", 0x0a6e, 0 }, { "eighthackarabic", 0x0668, 0 }, { "eighthangzhou", 0x3028, 0 }, { "eighthnotebeamed", 0x266b, 0 }, { "eightideographicparen", 0x3227, 0 }, { "eightinferior", 0x2088, 0 }, { "eightmonospace", 0xff18, 0 }, { "eightoldstyle", 0xf738, 0 }, { "eightparen", 0x247b, 0 }, { "eightperiod", 0x248f, 0 }, { "eightpersian", 0x06f8, 0 }, { "eightroman", 0x2177, 0 }, { "eightsuperior", 0x2078, 0 }, { "eightthai", 0x0e58, 0 }, { "einvertedbreve", 0x0207, 0 }, { "eiotifiedcyrillic", 0x0465, 0 }, { "ekatakana", 0x30a8, 0 }, { "ekatakanahalfwidth", 0xff74, 0 }, { "ekonkargurmukhi", 0x0a74, 0 }, { "ekorean", 0x3154, 0 }, { "elcyrillic", 0x043b, 0 }, { "elevencircle", 0x246a, 0 }, { "elevenparen", 0x247e, 0 }, { "elevenperiod", 0x2492, 0 }, { "elevenroman", 0x217a, 0 }, { "ellipsisvertical", 0x22ee, 0 }, { "emacronacute", 0x1e17, 0 }, { "emacrongrave", 0x1e15, 0 }, { "emcyrillic", 0x043c, 0 }, { "emdashvertical", 0xfe31, 0 }, { "emonospace", 0xff45, 0 }, { "emphasismarkarmenian", 0x055b, 0 }, { "enbopomofo", 0x3123, 0 }, { "encyrillic", 0x043d, 0 }, { "endashvertical", 0xfe32, 0 }, { "endescendercyrillic", 0x04a3, 0 }, { "engbopomofo", 0x3125, 0 }, { "enghecyrillic", 0x04a5, 0 }, { "enhookcyrillic", 0x04c8, 0 }, { "enspace", 0x2002, 0 }, { "eokorean", 0x3153, 0 }, { "eopen", 0x025b, 0 }, { "eopenclosed", 0x029a, 0 }, { "eopenreversed", 0x025c, 0 }, { "eopenreversedclosed", 0x025e, 0 }, { "eopenreversedhook", 0x025d, 0 }, { "eparen", 0x24a0, 0 }, { "equalmonospace", 0xff1d, 0 }, { "equalsmall", 0xfe66, 0 }, { "equalsuperior", 0x207c, 0 }, { "erbopomofo", 0x3126, 0 }, { "ercyrillic", 0x0440, 0 }, { "ereversed", 0x0258, 0 }, { "ereversedcyrillic", 0x044d, 0 }, { "escyrillic", 0x0441, 0 }, { "esdescendercyrillic", 0x04ab, 0 }, { "esh", 0x0283, 0 }, { "eshcurl", 0x0286, 0 }, { "eshortdeva", 0x090e, 0 }, { "eshortvowelsigndeva", 0x0946, 0 }, { "eshreversedloop", 0x01aa, 0 }, { "eshsquatreversed", 0x0285, 0 }, { "esmallhiragana", 0x3047, 0 }, { "esmallkatakana", 0x30a7, 0 }, { "esmallkatakanahalfwidth", 0xff6a, 0 }, { "esuperior", 0xf6ec, 0 }, { "etarmenian", 0x0568, 0 }, { "etilde", 0x1ebd, 0 }, { "etildebelow", 0x1e1b, 0 }, { "etnahtafoukhhebrew", 0x0591, 0 }, { "etnahtafoukhlefthebrew", 0x0591, 0 }, { "etnahtahebrew", 0x0591, 0 }, { "etnahtalefthebrew", 0x0591, 0 }, { "eturned", 0x01dd, 0 }, { "eukorean", 0x3161, 0 }, { "euro", 0x20ac, 0 }, { "evowelsignbengali", 0x09c7, 0 }, { "evowelsigndeva", 0x0947, 0 }, { "evowelsigngujarati", 0x0ac7, 0 }, { "exclamarmenian", 0x055c, 0 }, { "exclamdownsmall", 0xf7a1, 0 }, { "exclammonospace", 0xff01, 0 }, { "exclamsmall", 0xf721, 0 }, { "ezh", 0x0292, 0 }, { "ezhcaron", 0x01ef, 0 }, { "ezhcurl", 0x0293, 0 }, { "ezhreversed", 0x01b9, 0 }, { "ezhtail", 0x01ba, 0 }, { "fadeva", 0x095e, 0 }, { "fagurmukhi", 0x0a5e, 0 }, { "fahrenheit", 0x2109, 0 }, { "fathaarabic", 0x064e, 0 }, { "fathalowarabic", 0x064e, 0 }, { "fathatanarabic", 0x064b, 0 }, { "fbopomofo", 0x3108, 0 }, { "fcircle", 0x24d5, 0 }, { "fdotaccent", 0x1e1f, 0 }, { "feharabic", 0x0641, 0 }, { "feharmenian", 0x0586, 0 }, { "fehfinalarabic", 0xfed2, 0 }, { "fehinitialarabic", 0xfed3, 0 }, { "fehmedialarabic", 0xfed4, 0 }, { "feicoptic", 0x03e5, 0 }, { "ff", 0xfb00, 0 }, { "ffi", 0xfb03, 0 }, { "ffl", 0xfb04, 0 }, { "fi", 0xfb01, 0 }, { "fifteencircle", 0x246e, 0 }, { "fifteenparen", 0x2482, 0 }, { "fifteenperiod", 0x2496, 0 }, { "finalkaf", 0x05da, 0 }, { "finalkafdagesh", 0xfb3a, 0 }, { "finalkafdageshhebrew", 0xfb3a, 0 }, { "finalkafhebrew", 0x05da, 0 }, { "finalkafqamats", 0x05da, 0 }, { "finalkafqamatshebrew", 0x05da, 0 }, { "finalkafsheva", 0x05da, 0 }, { "finalkafshevahebrew", 0x05da, 0 }, { "finalmem", 0x05dd, 0 }, { "finalmemhebrew", 0x05dd, 0 }, { "finalnun", 0x05df, 0 }, { "finalnunhebrew", 0x05df, 0 }, { "finalpe", 0x05e3, 0 }, { "finalpehebrew", 0x05e3, 0 }, { "finaltsadi", 0x05e5, 0 }, { "finaltsadihebrew", 0x05e5, 0 }, { "firsttonechinese", 0x02c9, 0 }, { "fisheye", 0x25c9, 0 }, { "fitacyrillic", 0x0473, 0 }, { "fivearabic", 0x0665, 0 }, { "fivebengali", 0x09eb, 0 }, { "fivecircle", 0x2464, 0 }, { "fivecircleinversesansserif", 0x278e, 0 }, { "fivedeva", 0x096b, 0 }, { "fivegujarati", 0x0aeb, 0 }, { "fivegurmukhi", 0x0a6b, 0 }, { "fivehackarabic", 0x0665, 0 }, { "fivehangzhou", 0x3025, 0 }, { "fiveideographicparen", 0x3224, 0 }, { "fiveinferior", 0x2085, 0 }, { "fivemonospace", 0xff15, 0 }, { "fiveoldstyle", 0xf735, 0 }, { "fiveparen", 0x2478, 0 }, { "fiveperiod", 0x248c, 0 }, { "fivepersian", 0x06f5, 0 }, { "fiveroman", 0x2174, 0 }, { "fivesuperior", 0x2075, 0 }, { "fivethai", 0x0e55, 0 }, { "fl", 0xfb02, 0 }, { "fmonospace", 0xff46, 0 }, { "fmsquare", 0x3399, 0 }, { "fofanthai", 0x0e1f, 0 }, { "fofathai", 0x0e1d, 0 }, { "fongmanthai", 0x0e4f, 0 }, { "forall", 0x2200, 0 }, { "fourarabic", 0x0664, 0 }, { "fourbengali", 0x09ea, 0 }, { "fourcircle", 0x2463, 0 }, { "fourcircleinversesansserif", 0x278d, 0 }, { "fourdeva", 0x096a, 0 }, { "fourgujarati", 0x0aea, 0 }, { "fourgurmukhi", 0x0a6a, 0 }, { "fourhackarabic", 0x0664, 0 }, { "fourhangzhou", 0x3024, 0 }, { "fourideographicparen", 0x3223, 0 }, { "fourinferior", 0x2084, 0 }, { "fourmonospace", 0xff14, 0 }, { "fournumeratorbengali", 0x09f7, 0 }, { "fouroldstyle", 0xf734, 0 }, { "fourparen", 0x2477, 0 }, { "fourperiod", 0x248b, 0 }, { "fourpersian", 0x06f4, 0 }, { "fourroman", 0x2173, 0 }, { "foursuperior", 0x2074, 0 }, { "fourteencircle", 0x246d, 0 }, { "fourteenparen", 0x2481, 0 }, { "fourteenperiod", 0x2495, 0 }, { "fourthai", 0x0e54, 0 }, { "fourthtonechinese", 0x02cb, 0 }, { "fparen", 0x24a1, 0 }, { "gabengali", 0x0997, 0 }, { "gacute", 0x01f5, 0 }, { "gadeva", 0x0917, 0 }, { "gafarabic", 0x06af, 0 }, { "gaffinalarabic", 0xfb93, 0 }, { "gafinitialarabic", 0xfb94, 0 }, { "gafmedialarabic", 0xfb95, 0 }, { "gagujarati", 0x0a97, 0 }, { "gagurmukhi", 0x0a17, 0 }, { "gahiragana", 0x304c, 0 }, { "gakatakana", 0x30ac, 0 }, { "gammalatinsmall", 0x0263, 0 }, { "gammasuperior", 0x02e0, 0 }, { "gangiacoptic", 0x03eb, 0 }, { "gbopomofo", 0x310d, 0 }, { "gcedilla", 0x0123, 0 }, { "gcircle", 0x24d6, 0 }, { "gdot", 0x0121, 0 }, { "gecyrillic", 0x0433, 0 }, { "gehiragana", 0x3052, 0 }, { "gekatakana", 0x30b2, 0 }, { "geometricallyequal", 0x2251, 0 }, { "gereshaccenthebrew", 0x059c, 0 }, { "gereshhebrew", 0x05f3, 0 }, { "gereshmuqdamhebrew", 0x059d, 0 }, { "gershayimaccenthebrew", 0x059e, 0 }, { "gershayimhebrew", 0x05f4, 0 }, { "getamark", 0x3013, 0 }, { "ghabengali", 0x0998, 0 }, { "ghadarmenian", 0x0572, 0 }, { "ghadeva", 0x0918, 0 }, { "ghagujarati", 0x0a98, 0 }, { "ghagurmukhi", 0x0a18, 0 }, { "ghainarabic", 0x063a, 0 }, { "ghainfinalarabic", 0xfece, 0 }, { "ghaininitialarabic", 0xfecf, 0 }, { "ghainmedialarabic", 0xfed0, 0 }, { "ghemiddlehookcyrillic", 0x0495, 0 }, { "ghestrokecyrillic", 0x0493, 0 }, { "gheupturncyrillic", 0x0491, 0 }, { "ghhadeva", 0x095a, 0 }, { "ghhagurmukhi", 0x0a5a, 0 }, { "ghook", 0x0260, 0 }, { "ghzsquare", 0x3393, 0 }, { "gihiragana", 0x304e, 0 }, { "gikatakana", 0x30ae, 0 }, { "gimarmenian", 0x0563, 0 }, { "gimel", 0x05d2, 0 }, { "gimeldagesh", 0xfb32, 0 }, { "gimeldageshhebrew", 0xfb32, 0 }, { "gimelhebrew", 0x05d2, 0 }, { "gjecyrillic", 0x0453, 0 }, { "glottalinvertedstroke", 0x01be, 0 }, { "glottalstop", 0x0294, 0 }, { "glottalstopinverted", 0x0296, 0 }, { "glottalstopmod", 0x02c0, 0 }, { "glottalstopreversed", 0x0295, 0 }, { "glottalstopreversedmod", 0x02c1, 0 }, { "glottalstopreversedsuperior", 0x02e4, 0 }, { "glottalstopstroke", 0x02a1, 0 }, { "glottalstopstrokereversed", 0x02a2, 0 }, { "gmacron", 0x1e21, 0 }, { "gmonospace", 0xff47, 0 }, { "gohiragana", 0x3054, 0 }, { "gokatakana", 0x30b4, 0 }, { "gparen", 0x24a2, 0 }, { "gpasquare", 0x33ac, 0 }, { "gravebelowcmb", 0x0316, 0 }, { "gravecmb", 0x0300, 0 }, { "gravedeva", 0x0953, 0 }, { "gravelowmod", 0x02ce, 0 }, { "gravemonospace", 0xff40, 0 }, { "gravetonecmb", 0x0340, 0 }, { "greaterequalorless", 0x22db, 0 }, { "greatermonospace", 0xff1e, 0 }, { "greaterorequivalent", 0x2273, 0 }, { "greaterorless", 0x2277, 0 }, { "greateroverequal", 0x2267, 0 }, { "greatersmall", 0xfe65, 0 }, { "gscript", 0x0261, 0 }, { "gstroke", 0x01e5, 0 }, { "guhiragana", 0x3050, 0 }, { "gukatakana", 0x30b0, 0 }, { "guramusquare", 0x3318, 0 }, { "gysquare", 0x33c9, 0 }, { "haabkhasiancyrillic", 0x04a9, 0 }, { "haaltonearabic", 0x06c1, 0 }, { "habengali", 0x09b9, 0 }, { "hadescendercyrillic", 0x04b3, 0 }, { "hadeva", 0x0939, 0 }, { "hagujarati", 0x0ab9, 0 }, { "hagurmukhi", 0x0a39, 0 }, { "haharabic", 0x062d, 0 }, { "hahfinalarabic", 0xfea2, 0 }, { "hahinitialarabic", 0xfea3, 0 }, { "hahiragana", 0x306f, 0 }, { "hahmedialarabic", 0xfea4, 0 }, { "haitusquare", 0x332a, 0 }, { "hakatakana", 0x30cf, 0 }, { "hakatakanahalfwidth", 0xff8a, 0 }, { "halantgurmukhi", 0x0a4d, 0 }, { "hamzaarabic", 0x0621, 0 }, { "hamzadammaarabic", 0x0621, 0 }, { "hamzadammatanarabic", 0x0621, 0 }, { "hamzafathaarabic", 0x0621, 0 }, { "hamzafathatanarabic", 0x0621, 0 }, { "hamzalowarabic", 0x0621, 0 }, { "hamzalowkasraarabic", 0x0621, 0 }, { "hamzalowkasratanarabic", 0x0621, 0 }, { "hamzasukunarabic", 0x0621, 0 }, { "hangulfiller", 0x3164, 0 }, { "hardsigncyrillic", 0x044a, 0 }, { "harpoonleftbarbup", 0x21bc, 0 }, { "harpoonrightbarbup", 0x21c0, 0 }, { "hasquare", 0x33ca, 0 }, { "hatafpatah", 0x05b2, 0 }, { "hatafpatah16", 0x05b2, 0 }, { "hatafpatah23", 0x05b2, 0 }, { "hatafpatah2f", 0x05b2, 0 }, { "hatafpatahhebrew", 0x05b2, 0 }, { "hatafpatahnarrowhebrew", 0x05b2, 0 }, { "hatafpatahquarterhebrew", 0x05b2, 0 }, { "hatafpatahwidehebrew", 0x05b2, 0 }, { "hatafqamats", 0x05b3, 0 }, { "hatafqamats1b", 0x05b3, 0 }, { "hatafqamats28", 0x05b3, 0 }, { "hatafqamats34", 0x05b3, 0 }, { "hatafqamatshebrew", 0x05b3, 0 }, { "hatafqamatsnarrowhebrew", 0x05b3, 0 }, { "hatafqamatsquarterhebrew", 0x05b3, 0 }, { "hatafqamatswidehebrew", 0x05b3, 0 }, { "hatafsegol", 0x05b1, 0 }, { "hatafsegol17", 0x05b1, 0 }, { "hatafsegol24", 0x05b1, 0 }, { "hatafsegol30", 0x05b1, 0 }, { "hatafsegolhebrew", 0x05b1, 0 }, { "hatafsegolnarrowhebrew", 0x05b1, 0 }, { "hatafsegolquarterhebrew", 0x05b1, 0 }, { "hatafsegolwidehebrew", 0x05b1, 0 }, { "hbopomofo", 0x310f, 0 }, { "hbrevebelow", 0x1e2b, 0 }, { "hcedilla", 0x1e29, 0 }, { "hcircle", 0x24d7, 0 }, { "hdieresis", 0x1e27, 0 }, { "hdotaccent", 0x1e23, 0 }, { "hdotbelow", 0x1e25, 0 }, { "he", 0x05d4, 0 }, { "heartsuitblack", 0x2665, 0 }, { "heartsuitwhite", 0x2661, 0 }, { "hedagesh", 0xfb34, 0 }, { "hedageshhebrew", 0xfb34, 0 }, { "hehaltonearabic", 0x06c1, 0 }, { "heharabic", 0x0647, 0 }, { "hehebrew", 0x05d4, 0 }, { "hehfinalaltonearabic", 0xfba7, 0 }, { "hehfinalalttwoarabic", 0xfeea, 0 }, { "hehfinalarabic", 0xfeea, 0 }, { "hehhamzaabovefinalarabic", 0xfba5, 0 }, { "hehhamzaaboveisolatedarabic", 0xfba4, 0 }, { "hehinitialaltonearabic", 0xfba8, 0 }, { "hehinitialarabic", 0xfeeb, 0 }, { "hehiragana", 0x3078, 0 }, { "hehmedialaltonearabic", 0xfba9, 0 }, { "hehmedialarabic", 0xfeec, 0 }, { "heiseierasquare", 0x337b, 0 }, { "hekatakana", 0x30d8, 0 }, { "hekatakanahalfwidth", 0xff8d, 0 }, { "hekutaarusquare", 0x3336, 0 }, { "henghook", 0x0267, 0 }, { "herutusquare", 0x3339, 0 }, { "het", 0x05d7, 0 }, { "hethebrew", 0x05d7, 0 }, { "hhook", 0x0266, 0 }, { "hhooksuperior", 0x02b1, 0 }, { "hieuhacirclekorean", 0x327b, 0 }, { "hieuhaparenkorean", 0x321b, 0 }, { "hieuhcirclekorean", 0x326d, 0 }, { "hieuhkorean", 0x314e, 0 }, { "hieuhparenkorean", 0x320d, 0 }, { "hihiragana", 0x3072, 0 }, { "hikatakana", 0x30d2, 0 }, { "hikatakanahalfwidth", 0xff8b, 0 }, { "hiriq", 0x05b4, 0 }, { "hiriq14", 0x05b4, 0 }, { "hiriq21", 0x05b4, 0 }, { "hiriq2d", 0x05b4, 0 }, { "hiriqhebrew", 0x05b4, 0 }, { "hiriqnarrowhebrew", 0x05b4, 0 }, { "hiriqquarterhebrew", 0x05b4, 0 }, { "hiriqwidehebrew", 0x05b4, 0 }, { "hlinebelow", 0x1e96, 0 }, { "hmonospace", 0xff48, 0 }, { "hoarmenian", 0x0570, 0 }, { "hohipthai", 0x0e2b, 0 }, { "hohiragana", 0x307b, 0 }, { "hokatakana", 0x30db, 0 }, { "hokatakanahalfwidth", 0xff8e, 0 }, { "holam", 0x05b9, 0 }, { "holam19", 0x05b9, 0 }, { "holam26", 0x05b9, 0 }, { "holam32", 0x05b9, 0 }, { "holamhebrew", 0x05b9, 0 }, { "holamnarrowhebrew", 0x05b9, 0 }, { "holamquarterhebrew", 0x05b9, 0 }, { "holamwidehebrew", 0x05b9, 0 }, { "honokhukthai", 0x0e2e, 0 }, { "hookcmb", 0x0309, 0 }, { "hookpalatalizedbelowcmb", 0x0321, 0 }, { "hookretroflexbelowcmb", 0x0322, 0 }, { "hoonsquare", 0x3342, 0 }, { "horicoptic", 0x03e9, 0 }, { "horizontalbar", 0x2015, 0 }, { "horncmb", 0x031b, 0 }, { "hotsprings", 0x2668, 0 }, { "hparen", 0x24a3, 0 }, { "hsuperior", 0x02b0, 0 }, { "hturned", 0x0265, 0 }, { "huhiragana", 0x3075, 0 }, { "huiitosquare", 0x3333, 0 }, { "hukatakana", 0x30d5, 0 }, { "hukatakanahalfwidth", 0xff8c, 0 }, { "hungarumlautcmb", 0x030b, 0 }, { "hv", 0x0195, 0 }, { "hypheninferior", 0xf6e5, 0 }, { "hyphenmonospace", 0xff0d, 0 }, { "hyphensmall", 0xfe63, 0 }, { "hyphensuperior", 0xf6e6, 0 }, { "hyphentwo", 0x2010, 0 }, { "iacyrillic", 0x044f, 0 }, { "ibengali", 0x0987, 0 }, { "ibopomofo", 0x3127, 0 }, { "icaron", 0x01d0, 0 }, { "icircle", 0x24d8, 0 }, { "icyrillic", 0x0456, 0 }, { "idblgrave", 0x0209, 0 }, { "ideographearthcircle", 0x328f, 0 }, { "ideographfirecircle", 0x328b, 0 }, { "ideographicallianceparen", 0x323f, 0 }, { "ideographiccallparen", 0x323a, 0 }, { "ideographiccentrecircle", 0x32a5, 0 }, { "ideographicclose", 0x3006, 0 }, { "ideographiccomma", 0x3001, 0 }, { "ideographiccommaleft", 0xff64, 0 }, { "ideographiccongratulationparen", 0x3237, 0 }, { "ideographiccorrectcircle", 0x32a3, 0 }, { "ideographicearthparen", 0x322f, 0 }, { "ideographicenterpriseparen", 0x323d, 0 }, { "ideographicexcellentcircle", 0x329d, 0 }, { "ideographicfestivalparen", 0x3240, 0 }, { "ideographicfinancialcircle", 0x3296, 0 }, { "ideographicfinancialparen", 0x3236, 0 }, { "ideographicfireparen", 0x322b, 0 }, { "ideographichaveparen", 0x3232, 0 }, { "ideographichighcircle", 0x32a4, 0 }, { "ideographiciterationmark", 0x3005, 0 }, { "ideographiclaborcircle", 0x3298, 0 }, { "ideographiclaborparen", 0x3238, 0 }, { "ideographicleftcircle", 0x32a7, 0 }, { "ideographiclowcircle", 0x32a6, 0 }, { "ideographicmedicinecircle", 0x32a9, 0 }, { "ideographicmetalparen", 0x322e, 0 }, { "ideographicmoonparen", 0x322a, 0 }, { "ideographicnameparen", 0x3234, 0 }, { "ideographicperiod", 0x3002, 0 }, { "ideographicprintcircle", 0x329e, 0 }, { "ideographicreachparen", 0x3243, 0 }, { "ideographicrepresentparen", 0x3239, 0 }, { "ideographicresourceparen", 0x323e, 0 }, { "ideographicrightcircle", 0x32a8, 0 }, { "ideographicsecretcircle", 0x3299, 0 }, { "ideographicselfparen", 0x3242, 0 }, { "ideographicsocietyparen", 0x3233, 0 }, { "ideographicspace", 0x3000, 0 }, { "ideographicspecialparen", 0x3235, 0 }, { "ideographicstockparen", 0x3231, 0 }, { "ideographicstudyparen", 0x323b, 0 }, { "ideographicsunparen", 0x3230, 0 }, { "ideographicsuperviseparen", 0x323c, 0 }, { "ideographicwaterparen", 0x322c, 0 }, { "ideographicwoodparen", 0x322d, 0 }, { "ideographiczero", 0x3007, 0 }, { "ideographmetalcircle", 0x328e, 0 }, { "ideographmooncircle", 0x328a, 0 }, { "ideographnamecircle", 0x3294, 0 }, { "ideographsuncircle", 0x3290, 0 }, { "ideographwatercircle", 0x328c, 0 }, { "ideographwoodcircle", 0x328d, 0 }, { "ideva", 0x0907, 0 }, { "idieresisacute", 0x1e2f, 0 }, { "idieresiscyrillic", 0x04e5, 0 }, { "idotbelow", 0x1ecb, 0 }, { "iebrevecyrillic", 0x04d7, 0 }, { "iecyrillic", 0x0435, 0 }, { "ieungacirclekorean", 0x3275, 0 }, { "ieungaparenkorean", 0x3215, 0 }, { "ieungcirclekorean", 0x3267, 0 }, { "ieungkorean", 0x3147, 0 }, { "ieungparenkorean", 0x3207, 0 }, { "igujarati", 0x0a87, 0 }, { "igurmukhi", 0x0a07, 0 }, { "ihiragana", 0x3044, 0 }, { "ihookabove", 0x1ec9, 0 }, { "iibengali", 0x0988, 0 }, { "iicyrillic", 0x0438, 0 }, { "iideva", 0x0908, 0 }, { "iigujarati", 0x0a88, 0 }, { "iigurmukhi", 0x0a08, 0 }, { "iimatragurmukhi", 0x0a40, 0 }, { "iinvertedbreve", 0x020b, 0 }, { "iishortcyrillic", 0x0439, 0 }, { "iivowelsignbengali", 0x09c0, 0 }, { "iivowelsigndeva", 0x0940, 0 }, { "iivowelsigngujarati", 0x0ac0, 0 }, { "ikatakana", 0x30a4, 0 }, { "ikatakanahalfwidth", 0xff72, 0 }, { "ikorean", 0x3163, 0 }, { "ilde", 0x02dc, 0 }, { "iluyhebrew", 0x05ac, 0 }, { "imacroncyrillic", 0x04e3, 0 }, { "imageorapproximatelyequal", 0x2253, 0 }, { "imatragurmukhi", 0x0a3f, 0 }, { "imonospace", 0xff49, 0 }, { "increment", 0x2206, 0 }, { "iniarmenian", 0x056b, 0 }, { "integralbottom", 0x2321, 0 }, { "integralex", 0xf8f5, 0 }, { "integraltop", 0x2320, 0 }, { "intisquare", 0x3305, 0 }, { "iocyrillic", 0x0451, 0 }, { "iotalatin", 0x0269, 0 }, { "iparen", 0x24a4, 0 }, { "irigurmukhi", 0x0a72, 0 }, { "ismallhiragana", 0x3043, 0 }, { "ismallkatakana", 0x30a3, 0 }, { "ismallkatakanahalfwidth", 0xff68, 0 }, { "issharbengali", 0x09fa, 0 }, { "istroke", 0x0268, 0 }, { "isuperior", 0xf6ed, 0 }, { "iterationhiragana", 0x309d, 0 }, { "iterationkatakana", 0x30fd, 0 }, { "itildebelow", 0x1e2d, 0 }, { "iubopomofo", 0x3129, 0 }, { "iucyrillic", 0x044e, 0 }, { "ivowelsignbengali", 0x09bf, 0 }, { "ivowelsigndeva", 0x093f, 0 }, { "ivowelsigngujarati", 0x0abf, 0 }, { "izhitsacyrillic", 0x0475, 0 }, { "izhitsadblgravecyrillic", 0x0477, 0 }, { "jaarmenian", 0x0571, 0 }, { "jabengali", 0x099c, 0 }, { "jadeva", 0x091c, 0 }, { "jagujarati", 0x0a9c, 0 }, { "jagurmukhi", 0x0a1c, 0 }, { "jbopomofo", 0x3110, 0 }, { "jcaron", 0x01f0, 0 }, { "jcircle", 0x24d9, 0 }, { "jcrossedtail", 0x029d, 0 }, { "jdotlessstroke", 0x025f, 0 }, { "jecyrillic", 0x0458, 0 }, { "jeemarabic", 0x062c, 0 }, { "jeemfinalarabic", 0xfe9e, 0 }, { "jeeminitialarabic", 0xfe9f, 0 }, { "jeemmedialarabic", 0xfea0, 0 }, { "jeharabic", 0x0698, 0 }, { "jehfinalarabic", 0xfb8b, 0 }, { "jhabengali", 0x099d, 0 }, { "jhadeva", 0x091d, 0 }, { "jhagujarati", 0x0a9d, 0 }, { "jhagurmukhi", 0x0a1d, 0 }, { "jheharmenian", 0x057b, 0 }, { "jis", 0x3004, 0 }, { "jmonospace", 0xff4a, 0 }, { "jparen", 0x24a5, 0 }, { "jsuperior", 0x02b2, 0 }, { "kabashkircyrillic", 0x04a1, 0 }, { "kabengali", 0x0995, 0 }, { "kacute", 0x1e31, 0 }, { "kacyrillic", 0x043a, 0 }, { "kadescendercyrillic", 0x049b, 0 }, { "kadeva", 0x0915, 0 }, { "kaf", 0x05db, 0 }, { "kafarabic", 0x0643, 0 }, { "kafdagesh", 0xfb3b, 0 }, { "kafdageshhebrew", 0xfb3b, 0 }, { "kaffinalarabic", 0xfeda, 0 }, { "kafhebrew", 0x05db, 0 }, { "kafinitialarabic", 0xfedb, 0 }, { "kafmedialarabic", 0xfedc, 0 }, { "kafrafehebrew", 0xfb4d, 0 }, { "kagujarati", 0x0a95, 0 }, { "kagurmukhi", 0x0a15, 0 }, { "kahiragana", 0x304b, 0 }, { "kahookcyrillic", 0x04c4, 0 }, { "kakatakana", 0x30ab, 0 }, { "kakatakanahalfwidth", 0xff76, 0 }, { "kappasymbolgreek", 0x03f0, 0 }, { "kapyeounmieumkorean", 0x3171, 0 }, { "kapyeounphieuphkorean", 0x3184, 0 }, { "kapyeounpieupkorean", 0x3178, 0 }, { "kapyeounssangpieupkorean", 0x3179, 0 }, { "karoriisquare", 0x330d, 0 }, { "kashidaautoarabic", 0x0640, 0 }, { "kashidaautonosidebearingarabic", 0x0640, 0 }, { "kasmallkatakana", 0x30f5, 0 }, { "kasquare", 0x3384, 0 }, { "kasraarabic", 0x0650, 0 }, { "kasratanarabic", 0x064d, 0 }, { "kastrokecyrillic", 0x049f, 0 }, { "katahiraprolongmarkhalfwidth", 0xff70, 0 }, { "kaverticalstrokecyrillic", 0x049d, 0 }, { "kbopomofo", 0x310e, 0 }, { "kcalsquare", 0x3389, 0 }, { "kcaron", 0x01e9, 0 }, { "kcedilla", 0x0137, 0 }, { "kcircle", 0x24da, 0 }, { "kdotbelow", 0x1e33, 0 }, { "keharmenian", 0x0584, 0 }, { "kehiragana", 0x3051, 0 }, { "kekatakana", 0x30b1, 0 }, { "kekatakanahalfwidth", 0xff79, 0 }, { "kenarmenian", 0x056f, 0 }, { "kesmallkatakana", 0x30f6, 0 }, { "khabengali", 0x0996, 0 }, { "khacyrillic", 0x0445, 0 }, { "khadeva", 0x0916, 0 }, { "khagujarati", 0x0a96, 0 }, { "khagurmukhi", 0x0a16, 0 }, { "khaharabic", 0x062e, 0 }, { "khahfinalarabic", 0xfea6, 0 }, { "khahinitialarabic", 0xfea7, 0 }, { "khahmedialarabic", 0xfea8, 0 }, { "kheicoptic", 0x03e7, 0 }, { "khhadeva", 0x0959, 0 }, { "khhagurmukhi", 0x0a59, 0 }, { "khieukhacirclekorean", 0x3278, 0 }, { "khieukhaparenkorean", 0x3218, 0 }, { "khieukhcirclekorean", 0x326a, 0 }, { "khieukhkorean", 0x314b, 0 }, { "khieukhparenkorean", 0x320a, 0 }, { "khokhaithai", 0x0e02, 0 }, { "khokhonthai", 0x0e05, 0 }, { "khokhuatthai", 0x0e03, 0 }, { "khokhwaithai", 0x0e04, 0 }, { "khomutthai", 0x0e5b, 0 }, { "khook", 0x0199, 0 }, { "khorakhangthai", 0x0e06, 0 }, { "khzsquare", 0x3391, 0 }, { "kihiragana", 0x304d, 0 }, { "kikatakana", 0x30ad, 0 }, { "kikatakanahalfwidth", 0xff77, 0 }, { "kiroguramusquare", 0x3315, 0 }, { "kiromeetorusquare", 0x3316, 0 }, { "kirosquare", 0x3314, 0 }, { "kiyeokacirclekorean", 0x326e, 0 }, { "kiyeokaparenkorean", 0x320e, 0 }, { "kiyeokcirclekorean", 0x3260, 0 }, { "kiyeokkorean", 0x3131, 0 }, { "kiyeokparenkorean", 0x3200, 0 }, { "kiyeoksioskorean", 0x3133, 0 }, { "kjecyrillic", 0x045c, 0 }, { "klinebelow", 0x1e35, 0 }, { "klsquare", 0x3398, 0 }, { "kmcubedsquare", 0x33a6, 0 }, { "kmonospace", 0xff4b, 0 }, { "kmsquaredsquare", 0x33a2, 0 }, { "kohiragana", 0x3053, 0 }, { "kohmsquare", 0x33c0, 0 }, { "kokaithai", 0x0e01, 0 }, { "kokatakana", 0x30b3, 0 }, { "kokatakanahalfwidth", 0xff7a, 0 }, { "kooposquare", 0x331e, 0 }, { "koppacyrillic", 0x0481, 0 }, { "koreanstandardsymbol", 0x327f, 0 }, { "koroniscmb", 0x0343, 0 }, { "kparen", 0x24a6, 0 }, { "kpasquare", 0x33aa, 0 }, { "ksicyrillic", 0x046f, 0 }, { "ktsquare", 0x33cf, 0 }, { "kturned", 0x029e, 0 }, { "kuhiragana", 0x304f, 0 }, { "kukatakana", 0x30af, 0 }, { "kukatakanahalfwidth", 0xff78, 0 }, { "kvsquare", 0x33b8, 0 }, { "kwsquare", 0x33be, 0 }, { "labengali", 0x09b2, 0 }, { "ladeva", 0x0932, 0 }, { "lagujarati", 0x0ab2, 0 }, { "lagurmukhi", 0x0a32, 0 }, { "lakkhangyaothai", 0x0e45, 0 }, { "lamaleffinalarabic", 0xfefc, 0 }, { "lamalefhamzaabovefinalarabic", 0xfef8, 0 }, { "lamalefhamzaaboveisolatedarabic", 0xfef7, 0 }, { "lamalefhamzabelowfinalarabic", 0xfefa, 0 }, { "lamalefhamzabelowisolatedarabic", 0xfef9, 0 }, { "lamalefisolatedarabic", 0xfefb, 0 }, { "lamalefmaddaabovefinalarabic", 0xfef6, 0 }, { "lamalefmaddaaboveisolatedarabic", 0xfef5, 0 }, { "lamarabic", 0x0644, 0 }, { "lambdastroke", 0x019b, 0 }, { "lamed", 0x05dc, 0 }, { "lameddagesh", 0xfb3c, 0 }, { "lameddageshhebrew", 0xfb3c, 0 }, { "lamedhebrew", 0x05dc, 0 }, { "lamedholam", 0x05dc, 0 }, { "lamedholamdagesh", 0x05dc, 0 }, { "lamedholamdageshhebrew", 0x05dc, 0 }, { "lamedholamhebrew", 0x05dc, 0 }, { "lamfinalarabic", 0xfede, 0 }, { "lamhahinitialarabic", 0xfcca, 0 }, { "laminitialarabic", 0xfedf, 0 }, { "lamjeeminitialarabic", 0xfcc9, 0 }, { "lamkhahinitialarabic", 0xfccb, 0 }, { "lamlamhehisolatedarabic", 0xfdf2, 0 }, { "lammedialarabic", 0xfee0, 0 }, { "lammeemhahinitialarabic", 0xfd88, 0 }, { "lammeeminitialarabic", 0xfccc, 0 }, { "lammeemjeeminitialarabic", 0xfedf, 0 }, { "lammeemkhahinitialarabic", 0xfedf, 0 }, { "largecircle", 0x25ef, 0 }, { "lbar", 0x019a, 0 }, { "lbelt", 0x026c, 0 }, { "lbopomofo", 0x310c, 0 }, { "lcedilla", 0x013c, 0 }, { "lcircle", 0x24db, 0 }, { "lcircumflexbelow", 0x1e3d, 0 }, { "ldotaccent", 0x0140, 0 }, { "ldotbelow", 0x1e37, 0 }, { "ldotbelowmacron", 0x1e39, 0 }, { "leftangleabovecmb", 0x031a, 0 }, { "lefttackbelowcmb", 0x0318, 0 }, { "lessequalorgreater", 0x22da, 0 }, { "lessmonospace", 0xff1c, 0 }, { "lessorequivalent", 0x2272, 0 }, { "lessorgreater", 0x2276, 0 }, { "lessoverequal", 0x2266, 0 }, { "lesssmall", 0xfe64, 0 }, { "lezh", 0x026e, 0 }, { "lhookretroflex", 0x026d, 0 }, { "liwnarmenian", 0x056c, 0 }, { "lj", 0x01c9, 0 }, { "ljecyrillic", 0x0459, 0 }, { "ll", 0xf6c0, 0 }, { "lladeva", 0x0933, 0 }, { "llagujarati", 0x0ab3, 0 }, { "llinebelow", 0x1e3b, 0 }, { "llladeva", 0x0934, 0 }, { "llvocalicbengali", 0x09e1, 0 }, { "llvocalicdeva", 0x0961, 0 }, { "llvocalicvowelsignbengali", 0x09e3, 0 }, { "llvocalicvowelsigndeva", 0x0963, 0 }, { "lmiddletilde", 0x026b, 0 }, { "lmonospace", 0xff4c, 0 }, { "lmsquare", 0x33d0, 0 }, { "lochulathai", 0x0e2c, 0 }, { "logicalnotreversed", 0x2310, 0 }, { "lolingthai", 0x0e25, 0 }, { "lowlinecenterline", 0xfe4e, 0 }, { "lowlinecmb", 0x0332, 0 }, { "lowlinedashed", 0xfe4d, 0 }, { "lparen", 0x24a7, 0 }, { "lsquare", 0x2113, 0 }, { "lsuperior", 0xf6ee, 0 }, { "luthai", 0x0e26, 0 }, { "lvocalicbengali", 0x098c, 0 }, { "lvocalicdeva", 0x090c, 0 }, { "lvocalicvowelsignbengali", 0x09e2, 0 }, { "lvocalicvowelsigndeva", 0x0962, 0 }, { "lxsquare", 0x33d3, 0 }, { "mabengali", 0x09ae, 0 }, { "macronbelowcmb", 0x0331, 0 }, { "macroncmb", 0x0304, 0 }, { "macronlowmod", 0x02cd, 0 }, { "macronmonospace", 0xffe3, 0 }, { "macute", 0x1e3f, 0 }, { "madeva", 0x092e, 0 }, { "magujarati", 0x0aae, 0 }, { "magurmukhi", 0x0a2e, 0 }, { "mahapakhhebrew", 0x05a4, 0 }, { "mahapakhlefthebrew", 0x05a4, 0 }, { "mahiragana", 0x307e, 0 }, { "maichattawalowleftthai", 0xf895, 0 }, { "maichattawalowrightthai", 0xf894, 0 }, { "maichattawathai", 0x0e4b, 0 }, { "maichattawaupperleftthai", 0xf893, 0 }, { "maieklowleftthai", 0xf88c, 0 }, { "maieklowrightthai", 0xf88b, 0 }, { "maiekthai", 0x0e48, 0 }, { "maiekupperleftthai", 0xf88a, 0 }, { "maihanakatleftthai", 0xf884, 0 }, { "maihanakatthai", 0x0e31, 0 }, { "maitaikhuleftthai", 0xf889, 0 }, { "maitaikhuthai", 0x0e47, 0 }, { "maitholowleftthai", 0xf88f, 0 }, { "maitholowrightthai", 0xf88e, 0 }, { "maithothai", 0x0e49, 0 }, { "maithoupperleftthai", 0xf88d, 0 }, { "maitrilowleftthai", 0xf892, 0 }, { "maitrilowrightthai", 0xf891, 0 }, { "maitrithai", 0x0e4a, 0 }, { "maitriupperleftthai", 0xf890, 0 }, { "maiyamokthai", 0x0e46, 0 }, { "makatakana", 0x30de, 0 }, { "makatakanahalfwidth", 0xff8f, 0 }, { "mansyonsquare", 0x3347, 0 }, { "maqafhebrew", 0x05be, 0 }, { "mars", 0x2642, 0 }, { "masoracirclehebrew", 0x05af, 0 }, { "masquare", 0x3383, 0 }, { "mbopomofo", 0x3107, 0 }, { "mbsquare", 0x33d4, 0 }, { "mcircle", 0x24dc, 0 }, { "mcubedsquare", 0x33a5, 0 }, { "mdotaccent", 0x1e41, 0 }, { "mdotbelow", 0x1e43, 0 }, { "meemarabic", 0x0645, 0 }, { "meemfinalarabic", 0xfee2, 0 }, { "meeminitialarabic", 0xfee3, 0 }, { "meemmedialarabic", 0xfee4, 0 }, { "meemmeeminitialarabic", 0xfcd1, 0 }, { "meemmeemisolatedarabic", 0xfc48, 0 }, { "meetorusquare", 0x334d, 0 }, { "mehiragana", 0x3081, 0 }, { "meizierasquare", 0x337e, 0 }, { "mekatakana", 0x30e1, 0 }, { "mekatakanahalfwidth", 0xff92, 0 }, { "mem", 0x05de, 0 }, { "memdagesh", 0xfb3e, 0 }, { "memdageshhebrew", 0xfb3e, 0 }, { "memhebrew", 0x05de, 0 }, { "menarmenian", 0x0574, 0 }, { "merkhahebrew", 0x05a5, 0 }, { "merkhakefulahebrew", 0x05a6, 0 }, { "merkhakefulalefthebrew", 0x05a6, 0 }, { "merkhalefthebrew", 0x05a5, 0 }, { "mhook", 0x0271, 0 }, { "mhzsquare", 0x3392, 0 }, { "middledotkatakanahalfwidth", 0xff65, 0 }, { "middot", 0x00b7, 0 }, { "mieumacirclekorean", 0x3272, 0 }, { "mieumaparenkorean", 0x3212, 0 }, { "mieumcirclekorean", 0x3264, 0 }, { "mieumkorean", 0x3141, 0 }, { "mieumpansioskorean", 0x3170, 0 }, { "mieumparenkorean", 0x3204, 0 }, { "mieumpieupkorean", 0x316e, 0 }, { "mieumsioskorean", 0x316f, 0 }, { "mihiragana", 0x307f, 0 }, { "mikatakana", 0x30df, 0 }, { "mikatakanahalfwidth", 0xff90, 0 }, { "minusbelowcmb", 0x0320, 0 }, { "minuscircle", 0x2296, 0 }, { "minusmod", 0x02d7, 0 }, { "minusplus", 0x2213, 0 }, { "miribaarusquare", 0x334a, 0 }, { "mirisquare", 0x3349, 0 }, { "mlonglegturned", 0x0270, 0 }, { "mlsquare", 0x3396, 0 }, { "mmcubedsquare", 0x33a3, 0 }, { "mmonospace", 0xff4d, 0 }, { "mmsquaredsquare", 0x339f, 0 }, { "mohiragana", 0x3082, 0 }, { "mohmsquare", 0x33c1, 0 }, { "mokatakana", 0x30e2, 0 }, { "mokatakanahalfwidth", 0xff93, 0 }, { "molsquare", 0x33d6, 0 }, { "momathai", 0x0e21, 0 }, { "moverssquare", 0x33a7, 0 }, { "moverssquaredsquare", 0x33a8, 0 }, { "mparen", 0x24a8, 0 }, { "mpasquare", 0x33ab, 0 }, { "mssquare", 0x33b3, 0 }, { "msuperior", 0xf6ef, 0 }, { "mturned", 0x026f, 0 }, { "mu1", 0x00b5, 0 }, { "muasquare", 0x3382, 0 }, { "muchgreater", 0x226b, 0 }, { "muchless", 0x226a, 0 }, { "mufsquare", 0x338c, 0 }, { "mugreek", 0x03bc, 0 }, { "mugsquare", 0x338d, 0 }, { "muhiragana", 0x3080, 0 }, { "mukatakana", 0x30e0, 0 }, { "mukatakanahalfwidth", 0xff91, 0 }, { "mulsquare", 0x3395, 0 }, { "mumsquare", 0x339b, 0 }, { "munahhebrew", 0x05a3, 0 }, { "munahlefthebrew", 0x05a3, 0 }, { "musicflatsign", 0x266d, 0 }, { "musicsharpsign", 0x266f, 0 }, { "mussquare", 0x33b2, 0 }, { "muvsquare", 0x33b6, 0 }, { "muwsquare", 0x33bc, 0 }, { "mvmegasquare", 0x33b9, 0 }, { "mvsquare", 0x33b7, 0 }, { "mwmegasquare", 0x33bf, 0 }, { "mwsquare", 0x33bd, 0 }, { "nabengali", 0x09a8, 0 }, { "nabla", 0x2207, 0 }, { "nadeva", 0x0928, 0 }, { "nagujarati", 0x0aa8, 0 }, { "nagurmukhi", 0x0a28, 0 }, { "nahiragana", 0x306a, 0 }, { "nakatakana", 0x30ca, 0 }, { "nakatakanahalfwidth", 0xff85, 0 }, { "nasquare", 0x3381, 0 }, { "nbopomofo", 0x310b, 0 }, { "nbspace", 0x00a0, 0 }, { "ncedilla", 0x0146, 0 }, { "ncircle", 0x24dd, 0 }, { "ncircumflexbelow", 0x1e4b, 0 }, { "ndotaccent", 0x1e45, 0 }, { "ndotbelow", 0x1e47, 0 }, { "nehiragana", 0x306d, 0 }, { "nekatakana", 0x30cd, 0 }, { "nekatakanahalfwidth", 0xff88, 0 }, { "newsheqelsign", 0x20aa, 0 }, { "nfsquare", 0x338b, 0 }, { "ngabengali", 0x0999, 0 }, { "ngadeva", 0x0919, 0 }, { "ngagujarati", 0x0a99, 0 }, { "ngagurmukhi", 0x0a19, 0 }, { "ngonguthai", 0x0e07, 0 }, { "nhiragana", 0x3093, 0 }, { "nhookleft", 0x0272, 0 }, { "nhookretroflex", 0x0273, 0 }, { "nieunacirclekorean", 0x326f, 0 }, { "nieunaparenkorean", 0x320f, 0 }, { "nieuncieuckorean", 0x3135, 0 }, { "nieuncirclekorean", 0x3261, 0 }, { "nieunhieuhkorean", 0x3136, 0 }, { "nieunkorean", 0x3134, 0 }, { "nieunpansioskorean", 0x3168, 0 }, { "nieunparenkorean", 0x3201, 0 }, { "nieunsioskorean", 0x3167, 0 }, { "nieuntikeutkorean", 0x3166, 0 }, { "nihiragana", 0x306b, 0 }, { "nikatakana", 0x30cb, 0 }, { "nikatakanahalfwidth", 0xff86, 0 }, { "nikhahitleftthai", 0xf899, 0 }, { "nikhahitthai", 0x0e4d, 0 }, { "ninearabic", 0x0669, 0 }, { "ninebengali", 0x09ef, 0 }, { "ninecircle", 0x2468, 0 }, { "ninecircleinversesansserif", 0x2792, 0 }, { "ninedeva", 0x096f, 0 }, { "ninegujarati", 0x0aef, 0 }, { "ninegurmukhi", 0x0a6f, 0 }, { "ninehackarabic", 0x0669, 0 }, { "ninehangzhou", 0x3029, 0 }, { "nineideographicparen", 0x3228, 0 }, { "nineinferior", 0x2089, 0 }, { "ninemonospace", 0xff19, 0 }, { "nineoldstyle", 0xf739, 0 }, { "nineparen", 0x247c, 0 }, { "nineperiod", 0x2490, 0 }, { "ninepersian", 0x06f9, 0 }, { "nineroman", 0x2178, 0 }, { "ninesuperior", 0x2079, 0 }, { "nineteencircle", 0x2472, 0 }, { "nineteenparen", 0x2486, 0 }, { "nineteenperiod", 0x249a, 0 }, { "ninethai", 0x0e59, 0 }, { "nj", 0x01cc, 0 }, { "njecyrillic", 0x045a, 0 }, { "nkatakana", 0x30f3, 0 }, { "nkatakanahalfwidth", 0xff9d, 0 }, { "nlegrightlong", 0x019e, 0 }, { "nlinebelow", 0x1e49, 0 }, { "nmonospace", 0xff4e, 0 }, { "nmsquare", 0x339a, 0 }, { "nnabengali", 0x09a3, 0 }, { "nnadeva", 0x0923, 0 }, { "nnagujarati", 0x0aa3, 0 }, { "nnagurmukhi", 0x0a23, 0 }, { "nnnadeva", 0x0929, 0 }, { "nohiragana", 0x306e, 0 }, { "nokatakana", 0x30ce, 0 }, { "nokatakanahalfwidth", 0xff89, 0 }, { "nonbreakingspace", 0x00a0, 0 }, { "nonenthai", 0x0e13, 0 }, { "nonuthai", 0x0e19, 0 }, { "noonarabic", 0x0646, 0 }, { "noonfinalarabic", 0xfee6, 0 }, { "noonghunnaarabic", 0x06ba, 0 }, { "noonghunnafinalarabic", 0xfb9f, 0 }, { "noonhehinitialarabic", 0xfee7, 0 }, { "nooninitialarabic", 0xfee7, 0 }, { "noonjeeminitialarabic", 0xfcd2, 0 }, { "noonjeemisolatedarabic", 0xfc4b, 0 }, { "noonmedialarabic", 0xfee8, 0 }, { "noonmeeminitialarabic", 0xfcd5, 0 }, { "noonmeemisolatedarabic", 0xfc4e, 0 }, { "noonnoonfinalarabic", 0xfc8d, 0 }, { "notcontains", 0x220c, 0 }, { "notelementof", 0x2209, 0 }, { "notgreater", 0x226f, 0 }, { "notgreaternorequal", 0x2271, 0 }, { "notgreaternorless", 0x2279, 0 }, { "notidentical", 0x2262, 0 }, { "notless", 0x226e, 0 }, { "notlessnorequal", 0x2270, 0 }, { "notparallel", 0x2226, 0 }, { "notprecedes", 0x2280, 0 }, { "notsucceeds", 0x2281, 0 }, { "notsuperset", 0x2285, 0 }, { "nowarmenian", 0x0576, 0 }, { "nparen", 0x24a9, 0 }, { "nssquare", 0x33b1, 0 }, { "nsuperior", 0x207f, 0 }, { "nuhiragana", 0x306c, 0 }, { "nukatakana", 0x30cc, 0 }, { "nukatakanahalfwidth", 0xff87, 0 }, { "nuktabengali", 0x09bc, 0 }, { "nuktadeva", 0x093c, 0 }, { "nuktagujarati", 0x0abc, 0 }, { "nuktagurmukhi", 0x0a3c, 0 }, { "numbersignmonospace", 0xff03, 0 }, { "numbersignsmall", 0xfe5f, 0 }, { "numeralsigngreek", 0x0374, 0 }, { "numeralsignlowergreek", 0x0375, 0 }, { "numero", 0x2116, 0 }, { "nun", 0x05e0, 0 }, { "nundagesh", 0xfb40, 0 }, { "nundageshhebrew", 0xfb40, 0 }, { "nunhebrew", 0x05e0, 0 }, { "nvsquare", 0x33b5, 0 }, { "nwsquare", 0x33bb, 0 }, { "nyabengali", 0x099e, 0 }, { "nyadeva", 0x091e, 0 }, { "nyagujarati", 0x0a9e, 0 }, { "nyagurmukhi", 0x0a1e, 0 }, { "oangthai", 0x0e2d, 0 }, { "obarred", 0x0275, 0 }, { "obarredcyrillic", 0x04e9, 0 }, { "obarreddieresiscyrillic", 0x04eb, 0 }, { "obengali", 0x0993, 0 }, { "obopomofo", 0x311b, 0 }, { "ocandradeva", 0x0911, 0 }, { "ocandragujarati", 0x0a91, 0 }, { "ocandravowelsigndeva", 0x0949, 0 }, { "ocandravowelsigngujarati", 0x0ac9, 0 }, { "ocaron", 0x01d2, 0 }, { "ocircle", 0x24de, 0 }, { "ocircumflexacute", 0x1ed1, 0 }, { "ocircumflexdotbelow", 0x1ed9, 0 }, { "ocircumflexgrave", 0x1ed3, 0 }, { "ocircumflexhookabove", 0x1ed5, 0 }, { "ocircumflextilde", 0x1ed7, 0 }, { "ocyrillic", 0x043e, 0 }, { "odblacute", 0x0151, 0 }, { "odblgrave", 0x020d, 0 }, { "odeva", 0x0913, 0 }, { "odieresiscyrillic", 0x04e7, 0 }, { "odotbelow", 0x1ecd, 0 }, { "oekorean", 0x315a, 0 }, { "ogonekcmb", 0x0328, 0 }, { "ogujarati", 0x0a93, 0 }, { "oharmenian", 0x0585, 0 }, { "ohiragana", 0x304a, 0 }, { "ohookabove", 0x1ecf, 0 }, { "ohornacute", 0x1edb, 0 }, { "ohorndotbelow", 0x1ee3, 0 }, { "ohorngrave", 0x1edd, 0 }, { "ohornhookabove", 0x1edf, 0 }, { "ohorntilde", 0x1ee1, 0 }, { "oi", 0x01a3, 0 }, { "oinvertedbreve", 0x020f, 0 }, { "okatakana", 0x30aa, 0 }, { "okatakanahalfwidth", 0xff75, 0 }, { "okorean", 0x3157, 0 }, { "olehebrew", 0x05ab, 0 }, { "omacronacute", 0x1e53, 0 }, { "omacrongrave", 0x1e51, 0 }, { "omdeva", 0x0950, 0 }, { "omegacyrillic", 0x0461, 0 }, { "omegalatinclosed", 0x0277, 0 }, { "omegaroundcyrillic", 0x047b, 0 }, { "omegatitlocyrillic", 0x047d, 0 }, { "omgujarati", 0x0ad0, 0 }, { "omonospace", 0xff4f, 0 }, { "onearabic", 0x0661, 0 }, { "onebengali", 0x09e7, 0 }, { "onecircle", 0x2460, 0 }, { "onecircleinversesansserif", 0x278a, 0 }, { "onedeva", 0x0967, 0 }, { "onefitted", 0xf6dc, 0 }, { "onegujarati", 0x0ae7, 0 }, { "onegurmukhi", 0x0a67, 0 }, { "onehackarabic", 0x0661, 0 }, { "onehangzhou", 0x3021, 0 }, { "oneideographicparen", 0x3220, 0 }, { "oneinferior", 0x2081, 0 }, { "onemonospace", 0xff11, 0 }, { "onenumeratorbengali", 0x09f4, 0 }, { "oneoldstyle", 0xf731, 0 }, { "oneparen", 0x2474, 0 }, { "oneperiod", 0x2488, 0 }, { "onepersian", 0x06f1, 0 }, { "oneroman", 0x2170, 0 }, { "onesuperior", 0x00b9, 0 }, { "onethai", 0x0e51, 0 }, { "oogonek", 0x01eb, 0 }, { "oogonekmacron", 0x01ed, 0 }, { "oogurmukhi", 0x0a13, 0 }, { "oomatragurmukhi", 0x0a4b, 0 }, { "oopen", 0x0254, 0 }, { "oparen", 0x24aa, 0 }, { "option", 0x2325, 0 }, { "oshortdeva", 0x0912, 0 }, { "oshortvowelsigndeva", 0x094a, 0 }, { "osmallhiragana", 0x3049, 0 }, { "osmallkatakana", 0x30a9, 0 }, { "osmallkatakanahalfwidth", 0xff6b, 0 }, { "ostrokeacute", 0x01ff, 0 }, { "osuperior", 0xf6f0, 0 }, { "otcyrillic", 0x047f, 0 }, { "otildeacute", 0x1e4d, 0 }, { "otildedieresis", 0x1e4f, 0 }, { "oubopomofo", 0x3121, 0 }, { "overline", 0x203e, 0 }, { "overlinecenterline", 0xfe4a, 0 }, { "overlinecmb", 0x0305, 0 }, { "overlinedashed", 0xfe49, 0 }, { "overlinedblwavy", 0xfe4c, 0 }, { "overlinewavy", 0xfe4b, 0 }, { "overscore", 0x00af, 0 }, { "ovowelsignbengali", 0x09cb, 0 }, { "ovowelsigndeva", 0x094b, 0 }, { "ovowelsigngujarati", 0x0acb, 0 }, { "paampssquare", 0x3380, 0 }, { "paasentosquare", 0x332b, 0 }, { "pabengali", 0x09aa, 0 }, { "pacute", 0x1e55, 0 }, { "padeva", 0x092a, 0 }, { "pagedown", 0x21df, 0 }, { "pageup", 0x21de, 0 }, { "pagujarati", 0x0aaa, 0 }, { "pagurmukhi", 0x0a2a, 0 }, { "pahiragana", 0x3071, 0 }, { "paiyannoithai", 0x0e2f, 0 }, { "pakatakana", 0x30d1, 0 }, { "palatalizationcyrilliccmb", 0x0484, 0 }, { "palochkacyrillic", 0x04c0, 0 }, { "pansioskorean", 0x317f, 0 }, { "parallel", 0x2225, 0 }, { "parenleftaltonearabic", 0xfd3e, 0 }, { "parenleftbt", 0xf8ed, 0 }, { "parenleftex", 0xf8ec, 0 }, { "parenleftinferior", 0x208d, 0 }, { "parenleftmonospace", 0xff08, 0 }, { "parenleftsmall", 0xfe59, 0 }, { "parenleftsuperior", 0x207d, 0 }, { "parenlefttp", 0xf8eb, 0 }, { "parenleftvertical", 0xfe35, 0 }, { "parenrightaltonearabic", 0xfd3f, 0 }, { "parenrightbt", 0xf8f8, 0 }, { "parenrightex", 0xf8f7, 0 }, { "parenrightinferior", 0x208e, 0 }, { "parenrightmonospace", 0xff09, 0 }, { "parenrightsmall", 0xfe5a, 0 }, { "parenrightsuperior", 0x207e, 0 }, { "parenrighttp", 0xf8f6, 0 }, { "parenrightvertical", 0xfe36, 0 }, { "paseqhebrew", 0x05c0, 0 }, { "pashtahebrew", 0x0599, 0 }, { "pasquare", 0x33a9, 0 }, { "patah", 0x05b7, 0 }, { "patah11", 0x05b7, 0 }, { "patah1d", 0x05b7, 0 }, { "patah2a", 0x05b7, 0 }, { "patahhebrew", 0x05b7, 0 }, { "patahnarrowhebrew", 0x05b7, 0 }, { "patahquarterhebrew", 0x05b7, 0 }, { "patahwidehebrew", 0x05b7, 0 }, { "pazerhebrew", 0x05a1, 0 }, { "pbopomofo", 0x3106, 0 }, { "pcircle", 0x24df, 0 }, { "pdotaccent", 0x1e57, 0 }, { "pe", 0x05e4, 0 }, { "pecyrillic", 0x043f, 0 }, { "pedagesh", 0xfb44, 0 }, { "pedageshhebrew", 0xfb44, 0 }, { "peezisquare", 0x333b, 0 }, { "pefinaldageshhebrew", 0xfb43, 0 }, { "peharabic", 0x067e, 0 }, { "peharmenian", 0x057a, 0 }, { "pehebrew", 0x05e4, 0 }, { "pehfinalarabic", 0xfb57, 0 }, { "pehinitialarabic", 0xfb58, 0 }, { "pehiragana", 0x307a, 0 }, { "pehmedialarabic", 0xfb59, 0 }, { "pekatakana", 0x30da, 0 }, { "pemiddlehookcyrillic", 0x04a7, 0 }, { "perafehebrew", 0xfb4e, 0 }, { "percentarabic", 0x066a, 0 }, { "percentmonospace", 0xff05, 0 }, { "percentsmall", 0xfe6a, 0 }, { "periodarmenian", 0x0589, 0 }, { "periodhalfwidth", 0xff61, 0 }, { "periodinferior", 0xf6e7, 0 }, { "periodmonospace", 0xff0e, 0 }, { "periodsmall", 0xfe52, 0 }, { "periodsuperior", 0xf6e8, 0 }, { "perispomenigreekcmb", 0x0342, 0 }, { "pfsquare", 0x338a, 0 }, { "phabengali", 0x09ab, 0 }, { "phadeva", 0x092b, 0 }, { "phagujarati", 0x0aab, 0 }, { "phagurmukhi", 0x0a2b, 0 }, { "phieuphacirclekorean", 0x327a, 0 }, { "phieuphaparenkorean", 0x321a, 0 }, { "phieuphcirclekorean", 0x326c, 0 }, { "phieuphkorean", 0x314d, 0 }, { "phieuphparenkorean", 0x320c, 0 }, { "philatin", 0x0278, 0 }, { "phinthuthai", 0x0e3a, 0 }, { "phisymbolgreek", 0x03d5, 0 }, { "phook", 0x01a5, 0 }, { "phophanthai", 0x0e1e, 0 }, { "phophungthai", 0x0e1c, 0 }, { "phosamphaothai", 0x0e20, 0 }, { "pieupacirclekorean", 0x3273, 0 }, { "pieupaparenkorean", 0x3213, 0 }, { "pieupcieuckorean", 0x3176, 0 }, { "pieupcirclekorean", 0x3265, 0 }, { "pieupkiyeokkorean", 0x3172, 0 }, { "pieupkorean", 0x3142, 0 }, { "pieupparenkorean", 0x3205, 0 }, { "pieupsioskiyeokkorean", 0x3174, 0 }, { "pieupsioskorean", 0x3144, 0 }, { "pieupsiostikeutkorean", 0x3175, 0 }, { "pieupthieuthkorean", 0x3177, 0 }, { "pieuptikeutkorean", 0x3173, 0 }, { "pihiragana", 0x3074, 0 }, { "pikatakana", 0x30d4, 0 }, { "pisymbolgreek", 0x03d6, 0 }, { "piwrarmenian", 0x0583, 0 }, { "plusbelowcmb", 0x031f, 0 }, { "pluscircle", 0x2295, 0 }, { "plusmod", 0x02d6, 0 }, { "plusmonospace", 0xff0b, 0 }, { "plussmall", 0xfe62, 0 }, { "plussuperior", 0x207a, 0 }, { "pmonospace", 0xff50, 0 }, { "pmsquare", 0x33d8, 0 }, { "pohiragana", 0x307d, 0 }, { "pointingindexdownwhite", 0x261f, 0 }, { "pointingindexleftwhite", 0x261c, 0 }, { "pointingindexrightwhite", 0x261e, 0 }, { "pointingindexupwhite", 0x261d, 0 }, { "pokatakana", 0x30dd, 0 }, { "poplathai", 0x0e1b, 0 }, { "postalmark", 0x3012, 0 }, { "postalmarkface", 0x3020, 0 }, { "pparen", 0x24ab, 0 }, { "precedes", 0x227a, 0 }, { "primemod", 0x02b9, 0 }, { "primereversed", 0x2035, 0 }, { "projective", 0x2305, 0 }, { "prolongedkana", 0x30fc, 0 }, { "propellor", 0x2318, 0 }, { "proportion", 0x2237, 0 }, { "psicyrillic", 0x0471, 0 }, { "psilipneumatacyrilliccmb", 0x0486, 0 }, { "pssquare", 0x33b0, 0 }, { "puhiragana", 0x3077, 0 }, { "pukatakana", 0x30d7, 0 }, { "pvsquare", 0x33b4, 0 }, { "pwsquare", 0x33ba, 0 }, { "qadeva", 0x0958, 0 }, { "qadmahebrew", 0x05a8, 0 }, { "qafarabic", 0x0642, 0 }, { "qaffinalarabic", 0xfed6, 0 }, { "qafinitialarabic", 0xfed7, 0 }, { "qafmedialarabic", 0xfed8, 0 }, { "qamats", 0x05b8, 0 }, { "qamats10", 0x05b8, 0 }, { "qamats1a", 0x05b8, 0 }, { "qamats1c", 0x05b8, 0 }, { "qamats27", 0x05b8, 0 }, { "qamats29", 0x05b8, 0 }, { "qamats33", 0x05b8, 0 }, { "qamatsde", 0x05b8, 0 }, { "qamatshebrew", 0x05b8, 0 }, { "qamatsnarrowhebrew", 0x05b8, 0 }, { "qamatsqatanhebrew", 0x05b8, 0 }, { "qamatsqatannarrowhebrew", 0x05b8, 0 }, { "qamatsqatanquarterhebrew", 0x05b8, 0 }, { "qamatsqatanwidehebrew", 0x05b8, 0 }, { "qamatsquarterhebrew", 0x05b8, 0 }, { "qamatswidehebrew", 0x05b8, 0 }, { "qarneyparahebrew", 0x059f, 0 }, { "qbopomofo", 0x3111, 0 }, { "qcircle", 0x24e0, 0 }, { "qhook", 0x02a0, 0 }, { "qmonospace", 0xff51, 0 }, { "qof", 0x05e7, 0 }, { "qofdagesh", 0xfb47, 0 }, { "qofdageshhebrew", 0xfb47, 0 }, { "qofhatafpatah", 0x05e7, 0 }, { "qofhatafpatahhebrew", 0x05e7, 0 }, { "qofhatafsegol", 0x05e7, 0 }, { "qofhatafsegolhebrew", 0x05e7, 0 }, { "qofhebrew", 0x05e7, 0 }, { "qofhiriq", 0x05e7, 0 }, { "qofhiriqhebrew", 0x05e7, 0 }, { "qofholam", 0x05e7, 0 }, { "qofholamhebrew", 0x05e7, 0 }, { "qofpatah", 0x05e7, 0 }, { "qofpatahhebrew", 0x05e7, 0 }, { "qofqamats", 0x05e7, 0 }, { "qofqamatshebrew", 0x05e7, 0 }, { "qofqubuts", 0x05e7, 0 }, { "qofqubutshebrew", 0x05e7, 0 }, { "qofsegol", 0x05e7, 0 }, { "qofsegolhebrew", 0x05e7, 0 }, { "qofsheva", 0x05e7, 0 }, { "qofshevahebrew", 0x05e7, 0 }, { "qoftsere", 0x05e7, 0 }, { "qoftserehebrew", 0x05e7, 0 }, { "qparen", 0x24ac, 0 }, { "quarternote", 0x2669, 0 }, { "qubuts", 0x05bb, 0 }, { "qubuts18", 0x05bb, 0 }, { "qubuts25", 0x05bb, 0 }, { "qubuts31", 0x05bb, 0 }, { "qubutshebrew", 0x05bb, 0 }, { "qubutsnarrowhebrew", 0x05bb, 0 }, { "qubutsquarterhebrew", 0x05bb, 0 }, { "qubutswidehebrew", 0x05bb, 0 }, { "questionarabic", 0x061f, 0 }, { "questionarmenian", 0x055e, 0 }, { "questiondownsmall", 0xf7bf, 0 }, { "questiongreek", 0x037e, 0 }, { "questionmonospace", 0xff1f, 0 }, { "questionsmall", 0xf73f, 0 }, { "quotedblmonospace", 0xff02, 0 }, { "quotedblprime", 0x301e, 0 }, { "quotedblprimereversed", 0x301d, 0 }, { "quoteleftreversed", 0x201b, 0 }, { "quoterightn", 0x0149, 0 }, { "quotesinglemonospace", 0xff07, 0 }, { "raarmenian", 0x057c, 0 }, { "rabengali", 0x09b0, 0 }, { "radeva", 0x0930, 0 }, { "radicalex", 0xf8e5, 0 }, { "radoverssquare", 0x33ae, 0 }, { "radoverssquaredsquare", 0x33af, 0 }, { "radsquare", 0x33ad, 0 }, { "rafe", 0x05bf, 0 }, { "rafehebrew", 0x05bf, 0 }, { "ragujarati", 0x0ab0, 0 }, { "ragurmukhi", 0x0a30, 0 }, { "rahiragana", 0x3089, 0 }, { "rakatakana", 0x30e9, 0 }, { "rakatakanahalfwidth", 0xff97, 0 }, { "ralowerdiagonalbengali", 0x09f1, 0 }, { "ramiddlediagonalbengali", 0x09f0, 0 }, { "ramshorn", 0x0264, 0 }, { "ratio", 0x2236, 0 }, { "rbopomofo", 0x3116, 0 }, { "rcedilla", 0x0157, 0 }, { "rcircle", 0x24e1, 0 }, { "rdblgrave", 0x0211, 0 }, { "rdotaccent", 0x1e59, 0 }, { "rdotbelow", 0x1e5b, 0 }, { "rdotbelowmacron", 0x1e5d, 0 }, { "referencemark", 0x203b, 0 }, { "registersans", 0xf8e8, 0 }, { "registerserif", 0xf6da, 0 }, { "reharabic", 0x0631, 0 }, { "reharmenian", 0x0580, 0 }, { "rehfinalarabic", 0xfeae, 0 }, { "rehiragana", 0x308c, 0 }, { "rehyehaleflamarabic", 0x0631, 0 }, { "rekatakana", 0x30ec, 0 }, { "rekatakanahalfwidth", 0xff9a, 0 }, { "resh", 0x05e8, 0 }, { "reshdageshhebrew", 0xfb48, 0 }, { "reshhatafpatah", 0x05e8, 0 }, { "reshhatafpatahhebrew", 0x05e8, 0 }, { "reshhatafsegol", 0x05e8, 0 }, { "reshhatafsegolhebrew", 0x05e8, 0 }, { "reshhebrew", 0x05e8, 0 }, { "reshhiriq", 0x05e8, 0 }, { "reshhiriqhebrew", 0x05e8, 0 }, { "reshholam", 0x05e8, 0 }, { "reshholamhebrew", 0x05e8, 0 }, { "reshpatah", 0x05e8, 0 }, { "reshpatahhebrew", 0x05e8, 0 }, { "reshqamats", 0x05e8, 0 }, { "reshqamatshebrew", 0x05e8, 0 }, { "reshqubuts", 0x05e8, 0 }, { "reshqubutshebrew", 0x05e8, 0 }, { "reshsegol", 0x05e8, 0 }, { "reshsegolhebrew", 0x05e8, 0 }, { "reshsheva", 0x05e8, 0 }, { "reshshevahebrew", 0x05e8, 0 }, { "reshtsere", 0x05e8, 0 }, { "reshtserehebrew", 0x05e8, 0 }, { "reversedtilde", 0x223d, 0 }, { "reviahebrew", 0x0597, 0 }, { "reviamugrashhebrew", 0x0597, 0 }, { "rfishhook", 0x027e, 0 }, { "rfishhookreversed", 0x027f, 0 }, { "rhabengali", 0x09dd, 0 }, { "rhadeva", 0x095d, 0 }, { "rhook", 0x027d, 0 }, { "rhookturned", 0x027b, 0 }, { "rhookturnedsuperior", 0x02b5, 0 }, { "rhosymbolgreek", 0x03f1, 0 }, { "rhotichookmod", 0x02de, 0 }, { "rieulacirclekorean", 0x3271, 0 }, { "rieulaparenkorean", 0x3211, 0 }, { "rieulcirclekorean", 0x3263, 0 }, { "rieulhieuhkorean", 0x3140, 0 }, { "rieulkiyeokkorean", 0x313a, 0 }, { "rieulkiyeoksioskorean", 0x3169, 0 }, { "rieulkorean", 0x3139, 0 }, { "rieulmieumkorean", 0x313b, 0 }, { "rieulpansioskorean", 0x316c, 0 }, { "rieulparenkorean", 0x3203, 0 }, { "rieulphieuphkorean", 0x313f, 0 }, { "rieulpieupkorean", 0x313c, 0 }, { "rieulpieupsioskorean", 0x316b, 0 }, { "rieulsioskorean", 0x313d, 0 }, { "rieulthieuthkorean", 0x313e, 0 }, { "rieultikeutkorean", 0x316a, 0 }, { "rieulyeorinhieuhkorean", 0x316d, 0 }, { "rightangle", 0x221f, 0 }, { "righttackbelowcmb", 0x0319, 0 }, { "righttriangle", 0x22bf, 0 }, { "rihiragana", 0x308a, 0 }, { "rikatakana", 0x30ea, 0 }, { "rikatakanahalfwidth", 0xff98, 0 }, { "ringbelowcmb", 0x0325, 0 }, { "ringcmb", 0x030a, 0 }, { "ringhalfleft", 0x02bf, 0 }, { "ringhalfleftarmenian", 0x0559, 0 }, { "ringhalfleftbelowcmb", 0x031c, 0 }, { "ringhalfleftcentered", 0x02d3, 0 }, { "ringhalfright", 0x02be, 0 }, { "ringhalfrightbelowcmb", 0x0339, 0 }, { "ringhalfrightcentered", 0x02d2, 0 }, { "rinvertedbreve", 0x0213, 0 }, { "rittorusquare", 0x3351, 0 }, { "rlinebelow", 0x1e5f, 0 }, { "rlongleg", 0x027c, 0 }, { "rlonglegturned", 0x027a, 0 }, { "rmonospace", 0xff52, 0 }, { "rohiragana", 0x308d, 0 }, { "rokatakana", 0x30ed, 0 }, { "rokatakanahalfwidth", 0xff9b, 0 }, { "roruathai", 0x0e23, 0 }, { "rparen", 0x24ad, 0 }, { "rrabengali", 0x09dc, 0 }, { "rradeva", 0x0931, 0 }, { "rragurmukhi", 0x0a5c, 0 }, { "rreharabic", 0x0691, 0 }, { "rrehfinalarabic", 0xfb8d, 0 }, { "rrvocalicbengali", 0x09e0, 0 }, { "rrvocalicdeva", 0x0960, 0 }, { "rrvocalicgujarati", 0x0ae0, 0 }, { "rrvocalicvowelsignbengali", 0x09c4, 0 }, { "rrvocalicvowelsigndeva", 0x0944, 0 }, { "rrvocalicvowelsigngujarati", 0x0ac4, 0 }, { "rsuperior", 0xf6f1, 0 }, { "rturned", 0x0279, 0 }, { "rturnedsuperior", 0x02b4, 0 }, { "ruhiragana", 0x308b, 0 }, { "rukatakana", 0x30eb, 0 }, { "rukatakanahalfwidth", 0xff99, 0 }, { "rupeemarkbengali", 0x09f2, 0 }, { "rupeesignbengali", 0x09f3, 0 }, { "rupiah", 0xf6dd, 0 }, { "ruthai", 0x0e24, 0 }, { "rvocalicbengali", 0x098b, 0 }, { "rvocalicdeva", 0x090b, 0 }, { "rvocalicgujarati", 0x0a8b, 0 }, { "rvocalicvowelsignbengali", 0x09c3, 0 }, { "rvocalicvowelsigndeva", 0x0943, 0 }, { "rvocalicvowelsigngujarati", 0x0ac3, 0 }, { "sabengali", 0x09b8, 0 }, { "sacutedotaccent", 0x1e65, 0 }, { "sadarabic", 0x0635, 0 }, { "sadeva", 0x0938, 0 }, { "sadfinalarabic", 0xfeba, 0 }, { "sadinitialarabic", 0xfebb, 0 }, { "sadmedialarabic", 0xfebc, 0 }, { "sagujarati", 0x0ab8, 0 }, { "sagurmukhi", 0x0a38, 0 }, { "sahiragana", 0x3055, 0 }, { "sakatakana", 0x30b5, 0 }, { "sakatakanahalfwidth", 0xff7b, 0 }, { "sallallahoualayhewasallamarabic", 0xfdfa, 0 }, { "samekh", 0x05e1, 0 }, { "samekhdagesh", 0xfb41, 0 }, { "samekhdageshhebrew", 0xfb41, 0 }, { "samekhhebrew", 0x05e1, 0 }, { "saraaathai", 0x0e32, 0 }, { "saraaethai", 0x0e41, 0 }, { "saraaimaimalaithai", 0x0e44, 0 }, { "saraaimaimuanthai", 0x0e43, 0 }, { "saraamthai", 0x0e33, 0 }, { "saraathai", 0x0e30, 0 }, { "saraethai", 0x0e40, 0 }, { "saraiileftthai", 0xf886, 0 }, { "saraiithai", 0x0e35, 0 }, { "saraileftthai", 0xf885, 0 }, { "saraithai", 0x0e34, 0 }, { "saraothai", 0x0e42, 0 }, { "saraueeleftthai", 0xf888, 0 }, { "saraueethai", 0x0e37, 0 }, { "saraueleftthai", 0xf887, 0 }, { "sarauethai", 0x0e36, 0 }, { "sarauthai", 0x0e38, 0 }, { "sarauuthai", 0x0e39, 0 }, { "sbopomofo", 0x3119, 0 }, { "scarondotaccent", 0x1e67, 0 }, { "schwa", 0x0259, 0 }, { "schwacyrillic", 0x04d9, 0 }, { "schwadieresiscyrillic", 0x04db, 0 }, { "schwahook", 0x025a, 0 }, { "scircle", 0x24e2, 0 }, { "sdotaccent", 0x1e61, 0 }, { "sdotbelow", 0x1e63, 0 }, { "sdotbelowdotaccent", 0x1e69, 0 }, { "seagullbelowcmb", 0x033c, 0 }, { "secondtonechinese", 0x02ca, 0 }, { "seenarabic", 0x0633, 0 }, { "seenfinalarabic", 0xfeb2, 0 }, { "seeninitialarabic", 0xfeb3, 0 }, { "seenmedialarabic", 0xfeb4, 0 }, { "segol", 0x05b6, 0 }, { "segol13", 0x05b6, 0 }, { "segol1f", 0x05b6, 0 }, { "segol2c", 0x05b6, 0 }, { "segolhebrew", 0x05b6, 0 }, { "segolnarrowhebrew", 0x05b6, 0 }, { "segolquarterhebrew", 0x05b6, 0 }, { "segoltahebrew", 0x0592, 0 }, { "segolwidehebrew", 0x05b6, 0 }, { "seharmenian", 0x057d, 0 }, { "sehiragana", 0x305b, 0 }, { "sekatakana", 0x30bb, 0 }, { "sekatakanahalfwidth", 0xff7e, 0 }, { "semicolonarabic", 0x061b, 0 }, { "semicolonmonospace", 0xff1b, 0 }, { "semicolonsmall", 0xfe54, 0 }, { "semivoicedmarkkana", 0x309c, 0 }, { "semivoicedmarkkanahalfwidth", 0xff9f, 0 }, { "sentisquare", 0x3322, 0 }, { "sentosquare", 0x3323, 0 }, { "sevenarabic", 0x0667, 0 }, { "sevenbengali", 0x09ed, 0 }, { "sevencircle", 0x2466, 0 }, { "sevencircleinversesansserif", 0x2790, 0 }, { "sevendeva", 0x096d, 0 }, { "sevengujarati", 0x0aed, 0 }, { "sevengurmukhi", 0x0a6d, 0 }, { "sevenhackarabic", 0x0667, 0 }, { "sevenhangzhou", 0x3027, 0 }, { "sevenideographicparen", 0x3226, 0 }, { "seveninferior", 0x2087, 0 }, { "sevenmonospace", 0xff17, 0 }, { "sevenoldstyle", 0xf737, 0 }, { "sevenparen", 0x247a, 0 }, { "sevenperiod", 0x248e, 0 }, { "sevenpersian", 0x06f7, 0 }, { "sevenroman", 0x2176, 0 }, { "sevensuperior", 0x2077, 0 }, { "seventeencircle", 0x2470, 0 }, { "seventeenparen", 0x2484, 0 }, { "seventeenperiod", 0x2498, 0 }, { "seventhai", 0x0e57, 0 }, { "sfthyphen", 0x00ad, 0 }, { "shaarmenian", 0x0577, 0 }, { "shabengali", 0x09b6, 0 }, { "shacyrillic", 0x0448, 0 }, { "shaddaarabic", 0x0651, 0 }, { "shaddadammaarabic", 0xfc61, 0 }, { "shaddadammatanarabic", 0xfc5e, 0 }, { "shaddafathaarabic", 0xfc60, 0 }, { "shaddafathatanarabic", 0x0651, 0 }, { "shaddakasraarabic", 0xfc62, 0 }, { "shaddakasratanarabic", 0xfc5f, 0 }, { "shadedark", 0x2593, 0 }, { "shadelight", 0x2591, 0 }, { "shademedium", 0x2592, 0 }, { "shadeva", 0x0936, 0 }, { "shagujarati", 0x0ab6, 0 }, { "shagurmukhi", 0x0a36, 0 }, { "shalshelethebrew", 0x0593, 0 }, { "shbopomofo", 0x3115, 0 }, { "shchacyrillic", 0x0449, 0 }, { "sheenarabic", 0x0634, 0 }, { "sheenfinalarabic", 0xfeb6, 0 }, { "sheeninitialarabic", 0xfeb7, 0 }, { "sheenmedialarabic", 0xfeb8, 0 }, { "sheicoptic", 0x03e3, 0 }, { "sheqel", 0x20aa, 0 }, { "sheqelhebrew", 0x20aa, 0 }, { "sheva", 0x05b0, 0 }, { "sheva115", 0x05b0, 0 }, { "sheva15", 0x05b0, 0 }, { "sheva22", 0x05b0, 0 }, { "sheva2e", 0x05b0, 0 }, { "shevahebrew", 0x05b0, 0 }, { "shevanarrowhebrew", 0x05b0, 0 }, { "shevaquarterhebrew", 0x05b0, 0 }, { "shevawidehebrew", 0x05b0, 0 }, { "shhacyrillic", 0x04bb, 0 }, { "shimacoptic", 0x03ed, 0 }, { "shin", 0x05e9, 0 }, { "shindagesh", 0xfb49, 0 }, { "shindageshhebrew", 0xfb49, 0 }, { "shindageshshindot", 0xfb2c, 0 }, { "shindageshshindothebrew", 0xfb2c, 0 }, { "shindageshsindot", 0xfb2d, 0 }, { "shindageshsindothebrew", 0xfb2d, 0 }, { "shindothebrew", 0x05c1, 0 }, { "shinhebrew", 0x05e9, 0 }, { "shinshindot", 0xfb2a, 0 }, { "shinshindothebrew", 0xfb2a, 0 }, { "shinsindot", 0xfb2b, 0 }, { "shinsindothebrew", 0xfb2b, 0 }, { "shook", 0x0282, 0 }, { "sigmafinal", 0x03c2, 0 }, { "sigmalunatesymbolgreek", 0x03f2, 0 }, { "sihiragana", 0x3057, 0 }, { "sikatakana", 0x30b7, 0 }, { "sikatakanahalfwidth", 0xff7c, 0 }, { "siluqhebrew", 0x05bd, 0 }, { "siluqlefthebrew", 0x05bd, 0 }, { "sindothebrew", 0x05c2, 0 }, { "siosacirclekorean", 0x3274, 0 }, { "siosaparenkorean", 0x3214, 0 }, { "sioscieuckorean", 0x317e, 0 }, { "sioscirclekorean", 0x3266, 0 }, { "sioskiyeokkorean", 0x317a, 0 }, { "sioskorean", 0x3145, 0 }, { "siosnieunkorean", 0x317b, 0 }, { "siosparenkorean", 0x3206, 0 }, { "siospieupkorean", 0x317d, 0 }, { "siostikeutkorean", 0x317c, 0 }, { "sixarabic", 0x0666, 0 }, { "sixbengali", 0x09ec, 0 }, { "sixcircle", 0x2465, 0 }, { "sixcircleinversesansserif", 0x278f, 0 }, { "sixdeva", 0x096c, 0 }, { "sixgujarati", 0x0aec, 0 }, { "sixgurmukhi", 0x0a6c, 0 }, { "sixhackarabic", 0x0666, 0 }, { "sixhangzhou", 0x3026, 0 }, { "sixideographicparen", 0x3225, 0 }, { "sixinferior", 0x2086, 0 }, { "sixmonospace", 0xff16, 0 }, { "sixoldstyle", 0xf736, 0 }, { "sixparen", 0x2479, 0 }, { "sixperiod", 0x248d, 0 }, { "sixpersian", 0x06f6, 0 }, { "sixroman", 0x2175, 0 }, { "sixsuperior", 0x2076, 0 }, { "sixteencircle", 0x246f, 0 }, { "sixteencurrencydenominatorbengali", 0x09f9, 0 }, { "sixteenparen", 0x2483, 0 }, { "sixteenperiod", 0x2497, 0 }, { "sixthai", 0x0e56, 0 }, { "slashmonospace", 0xff0f, 0 }, { "slong", 0x017f, 0 }, { "slongdotaccent", 0x1e9b, 0 }, { "smonospace", 0xff53, 0 }, { "sofpasuqhebrew", 0x05c3, 0 }, { "softhyphen", 0x00ad, 0 }, { "softsigncyrillic", 0x044c, 0 }, { "sohiragana", 0x305d, 0 }, { "sokatakana", 0x30bd, 0 }, { "sokatakanahalfwidth", 0xff7f, 0 }, { "soliduslongoverlaycmb", 0x0338, 0 }, { "solidusshortoverlaycmb", 0x0337, 0 }, { "sorusithai", 0x0e29, 0 }, { "sosalathai", 0x0e28, 0 }, { "sosothai", 0x0e0b, 0 }, { "sosuathai", 0x0e2a, 0 }, { "spacehackarabic", 0x0020, 0 }, { "spadesuitblack", 0x2660, 0 }, { "spadesuitwhite", 0x2664, 0 }, { "sparen", 0x24ae, 0 }, { "squarebelowcmb", 0x033b, 0 }, { "squarecc", 0x33c4, 0 }, { "squarecm", 0x339d, 0 }, { "squarediagonalcrosshatchfill", 0x25a9, 0 }, { "squarehorizontalfill", 0x25a4, 0 }, { "squarekg", 0x338f, 0 }, { "squarekm", 0x339e, 0 }, { "squarekmcapital", 0x33ce, 0 }, { "squareln", 0x33d1, 0 }, { "squarelog", 0x33d2, 0 }, { "squaremg", 0x338e, 0 }, { "squaremil", 0x33d5, 0 }, { "squaremm", 0x339c, 0 }, { "squaremsquared", 0x33a1, 0 }, { "squareorthogonalcrosshatchfill", 0x25a6, 0 }, { "squareupperlefttolowerrightfill", 0x25a7, 0 }, { "squareupperrighttolowerleftfill", 0x25a8, 0 }, { "squareverticalfill", 0x25a5, 0 }, { "squarewhitewithsmallblack", 0x25a3, 0 }, { "srsquare", 0x33db, 0 }, { "ssabengali", 0x09b7, 0 }, { "ssadeva", 0x0937, 0 }, { "ssagujarati", 0x0ab7, 0 }, { "ssangcieuckorean", 0x3149, 0 }, { "ssanghieuhkorean", 0x3185, 0 }, { "ssangieungkorean", 0x3180, 0 }, { "ssangkiyeokkorean", 0x3132, 0 }, { "ssangnieunkorean", 0x3165, 0 }, { "ssangpieupkorean", 0x3143, 0 }, { "ssangsioskorean", 0x3146, 0 }, { "ssangtikeutkorean", 0x3138, 0 }, { "ssuperior", 0xf6f2, 0 }, { "sterlingmonospace", 0xffe1, 0 }, { "strokelongoverlaycmb", 0x0336, 0 }, { "strokeshortoverlaycmb", 0x0335, 0 }, { "subset", 0x2282, 0 }, { "subsetnotequal", 0x228a, 0 }, { "subsetorequal", 0x2286, 0 }, { "succeeds", 0x227b, 0 }, { "suhiragana", 0x3059, 0 }, { "sukatakana", 0x30b9, 0 }, { "sukatakanahalfwidth", 0xff7d, 0 }, { "sukunarabic", 0x0652, 0 }, { "superset", 0x2283, 0 }, { "supersetnotequal", 0x228b, 0 }, { "supersetorequal", 0x2287, 0 }, { "svsquare", 0x33dc, 0 }, { "syouwaerasquare", 0x337c, 0 }, { "tabengali", 0x09a4, 0 }, { "tackdown", 0x22a4, 0 }, { "tackleft", 0x22a3, 0 }, { "tadeva", 0x0924, 0 }, { "tagujarati", 0x0aa4, 0 }, { "tagurmukhi", 0x0a24, 0 }, { "taharabic", 0x0637, 0 }, { "tahfinalarabic", 0xfec2, 0 }, { "tahinitialarabic", 0xfec3, 0 }, { "tahiragana", 0x305f, 0 }, { "tahmedialarabic", 0xfec4, 0 }, { "taisyouerasquare", 0x337d, 0 }, { "takatakana", 0x30bf, 0 }, { "takatakanahalfwidth", 0xff80, 0 }, { "tatweelarabic", 0x0640, 0 }, { "tav", 0x05ea, 0 }, { "tavdages", 0xfb4a, 0 }, { "tavdagesh", 0xfb4a, 0 }, { "tavdageshhebrew", 0xfb4a, 0 }, { "tavhebrew", 0x05ea, 0 }, { "tbopomofo", 0x310a, 0 }, { "tccurl", 0x02a8, 0 }, { "tcedilla", 0x0163, 0 }, { "tcheharabic", 0x0686, 0 }, { "tchehfinalarabic", 0xfb7b, 0 }, { "tchehinitialarabic", 0xfb7c, 0 }, { "tchehmedialarabic", 0xfb7d, 0 }, { "tchehmeeminitialarabic", 0xfb7c, 0 }, { "tcircle", 0x24e3, 0 }, { "tcircumflexbelow", 0x1e71, 0 }, { "tdieresis", 0x1e97, 0 }, { "tdotaccent", 0x1e6b, 0 }, { "tdotbelow", 0x1e6d, 0 }, { "tecyrillic", 0x0442, 0 }, { "tedescendercyrillic", 0x04ad, 0 }, { "teharabic", 0x062a, 0 }, { "tehfinalarabic", 0xfe96, 0 }, { "tehhahinitialarabic", 0xfca2, 0 }, { "tehhahisolatedarabic", 0xfc0c, 0 }, { "tehinitialarabic", 0xfe97, 0 }, { "tehiragana", 0x3066, 0 }, { "tehjeeminitialarabic", 0xfca1, 0 }, { "tehjeemisolatedarabic", 0xfc0b, 0 }, { "tehmarbutaarabic", 0x0629, 0 }, { "tehmarbutafinalarabic", 0xfe94, 0 }, { "tehmedialarabic", 0xfe98, 0 }, { "tehmeeminitialarabic", 0xfca4, 0 }, { "tehmeemisolatedarabic", 0xfc0e, 0 }, { "tehnoonfinalarabic", 0xfc73, 0 }, { "tekatakana", 0x30c6, 0 }, { "tekatakanahalfwidth", 0xff83, 0 }, { "telephone", 0x2121, 0 }, { "telephoneblack", 0x260e, 0 }, { "telishagedolahebrew", 0x05a0, 0 }, { "telishaqetanahebrew", 0x05a9, 0 }, { "tencircle", 0x2469, 0 }, { "tenideographicparen", 0x3229, 0 }, { "tenparen", 0x247d, 0 }, { "tenperiod", 0x2491, 0 }, { "tenroman", 0x2179, 0 }, { "tesh", 0x02a7, 0 }, { "tet", 0x05d8, 0 }, { "tetdagesh", 0xfb38, 0 }, { "tetdageshhebrew", 0xfb38, 0 }, { "tethebrew", 0x05d8, 0 }, { "tetsecyrillic", 0x04b5, 0 }, { "tevirhebrew", 0x059b, 0 }, { "tevirlefthebrew", 0x059b, 0 }, { "thabengali", 0x09a5, 0 }, { "thadeva", 0x0925, 0 }, { "thagujarati", 0x0aa5, 0 }, { "thagurmukhi", 0x0a25, 0 }, { "thalarabic", 0x0630, 0 }, { "thalfinalarabic", 0xfeac, 0 }, { "thanthakhatlowleftthai", 0xf898, 0 }, { "thanthakhatlowrightthai", 0xf897, 0 }, { "thanthakhatthai", 0x0e4c, 0 }, { "thanthakhatupperleftthai", 0xf896, 0 }, { "theharabic", 0x062b, 0 }, { "thehfinalarabic", 0xfe9a, 0 }, { "thehinitialarabic", 0xfe9b, 0 }, { "thehmedialarabic", 0xfe9c, 0 }, { "thereexists", 0x2203, 0 }, { "thetasymbolgreek", 0x03d1, 0 }, { "thieuthacirclekorean", 0x3279, 0 }, { "thieuthaparenkorean", 0x3219, 0 }, { "thieuthcirclekorean", 0x326b, 0 }, { "thieuthkorean", 0x314c, 0 }, { "thieuthparenkorean", 0x320b, 0 }, { "thirteencircle", 0x246c, 0 }, { "thirteenparen", 0x2480, 0 }, { "thirteenperiod", 0x2494, 0 }, { "thonangmonthothai", 0x0e11, 0 }, { "thook", 0x01ad, 0 }, { "thophuthaothai", 0x0e12, 0 }, { "thothahanthai", 0x0e17, 0 }, { "thothanthai", 0x0e10, 0 }, { "thothongthai", 0x0e18, 0 }, { "thothungthai", 0x0e16, 0 }, { "thousandcyrillic", 0x0482, 0 }, { "thousandsseparatorarabic", 0x066c, 0 }, { "thousandsseparatorpersian", 0x066c, 0 }, { "threearabic", 0x0663, 0 }, { "threebengali", 0x09e9, 0 }, { "threecircle", 0x2462, 0 }, { "threecircleinversesansserif", 0x278c, 0 }, { "threedeva", 0x0969, 0 }, { "threegujarati", 0x0ae9, 0 }, { "threegurmukhi", 0x0a69, 0 }, { "threehackarabic", 0x0663, 0 }, { "threehangzhou", 0x3023, 0 }, { "threeideographicparen", 0x3222, 0 }, { "threeinferior", 0x2083, 0 }, { "threemonospace", 0xff13, 0 }, { "threenumeratorbengali", 0x09f6, 0 }, { "threeoldstyle", 0xf733, 0 }, { "threeparen", 0x2476, 0 }, { "threeperiod", 0x248a, 0 }, { "threepersian", 0x06f3, 0 }, { "threequartersemdash", 0xf6de, 0 }, { "threeroman", 0x2172, 0 }, { "threesuperior", 0x00b3, 0 }, { "threethai", 0x0e53, 0 }, { "thzsquare", 0x3394, 0 }, { "tihiragana", 0x3061, 0 }, { "tikatakana", 0x30c1, 0 }, { "tikatakanahalfwidth", 0xff81, 0 }, { "tikeutacirclekorean", 0x3270, 0 }, { "tikeutaparenkorean", 0x3210, 0 }, { "tikeutcirclekorean", 0x3262, 0 }, { "tikeutkorean", 0x3137, 0 }, { "tikeutparenkorean", 0x3202, 0 }, { "tildebelowcmb", 0x0330, 0 }, { "tildecmb", 0x0303, 0 }, { "tildedoublecmb", 0x0360, 0 }, { "tildeoperator", 0x223c, 0 }, { "tildeoverlaycmb", 0x0334, 0 }, { "tildeverticalcmb", 0x033e, 0 }, { "timescircle", 0x2297, 0 }, { "tipehahebrew", 0x0596, 0 }, { "tipehalefthebrew", 0x0596, 0 }, { "tippigurmukhi", 0x0a70, 0 }, { "titlocyrilliccmb", 0x0483, 0 }, { "tiwnarmenian", 0x057f, 0 }, { "tlinebelow", 0x1e6f, 0 }, { "tmonospace", 0xff54, 0 }, { "toarmenian", 0x0569, 0 }, { "tohiragana", 0x3068, 0 }, { "tokatakana", 0x30c8, 0 }, { "tokatakanahalfwidth", 0xff84, 0 }, { "tonebarextrahighmod", 0x02e5, 0 }, { "tonebarextralowmod", 0x02e9, 0 }, { "tonebarhighmod", 0x02e6, 0 }, { "tonebarlowmod", 0x02e8, 0 }, { "tonebarmidmod", 0x02e7, 0 }, { "tonefive", 0x01bd, 0 }, { "tonesix", 0x0185, 0 }, { "tonetwo", 0x01a8, 0 }, { "tonsquare", 0x3327, 0 }, { "topatakthai", 0x0e0f, 0 }, { "tortoiseshellbracketleft", 0x3014, 0 }, { "tortoiseshellbracketleftsmall", 0xfe5d, 0 }, { "tortoiseshellbracketleftvertical", 0xfe39, 0 }, { "tortoiseshellbracketright", 0x3015, 0 }, { "tortoiseshellbracketrightsmall", 0xfe5e, 0 }, { "tortoiseshellbracketrightvertical", 0xfe3a, 0 }, { "totaothai", 0x0e15, 0 }, { "tpalatalhook", 0x01ab, 0 }, { "tparen", 0x24af, 0 }, { "trademarksans", 0xf8ea, 0 }, { "trademarkserif", 0xf6db, 0 }, { "tretroflexhook", 0x0288, 0 }, { "ts", 0x02a6, 0 }, { "tsadi", 0x05e6, 0 }, { "tsadidagesh", 0xfb46, 0 }, { "tsadidageshhebrew", 0xfb46, 0 }, { "tsadihebrew", 0x05e6, 0 }, { "tsecyrillic", 0x0446, 0 }, { "tsere", 0x05b5, 0 }, { "tsere12", 0x05b5, 0 }, { "tsere1e", 0x05b5, 0 }, { "tsere2b", 0x05b5, 0 }, { "tserehebrew", 0x05b5, 0 }, { "tserenarrowhebrew", 0x05b5, 0 }, { "tserequarterhebrew", 0x05b5, 0 }, { "tserewidehebrew", 0x05b5, 0 }, { "tshecyrillic", 0x045b, 0 }, { "tsuperior", 0xf6f3, 0 }, { "ttabengali", 0x099f, 0 }, { "ttadeva", 0x091f, 0 }, { "ttagujarati", 0x0a9f, 0 }, { "ttagurmukhi", 0x0a1f, 0 }, { "tteharabic", 0x0679, 0 }, { "ttehfinalarabic", 0xfb67, 0 }, { "ttehinitialarabic", 0xfb68, 0 }, { "ttehmedialarabic", 0xfb69, 0 }, { "tthabengali", 0x09a0, 0 }, { "tthadeva", 0x0920, 0 }, { "tthagujarati", 0x0aa0, 0 }, { "tthagurmukhi", 0x0a20, 0 }, { "tturned", 0x0287, 0 }, { "tuhiragana", 0x3064, 0 }, { "tukatakana", 0x30c4, 0 }, { "tukatakanahalfwidth", 0xff82, 0 }, { "tusmallhiragana", 0x3063, 0 }, { "tusmallkatakana", 0x30c3, 0 }, { "tusmallkatakanahalfwidth", 0xff6f, 0 }, { "twelvecircle", 0x246b, 0 }, { "twelveparen", 0x247f, 0 }, { "twelveperiod", 0x2493, 0 }, { "twelveroman", 0x217b, 0 }, { "twentycircle", 0x2473, 0 }, { "twentyhangzhou", 0x5344, 0 }, { "twentyparen", 0x2487, 0 }, { "twentyperiod", 0x249b, 0 }, { "twoarabic", 0x0662, 0 }, { "twobengali", 0x09e8, 0 }, { "twocircle", 0x2461, 0 }, { "twocircleinversesansserif", 0x278b, 0 }, { "twodeva", 0x0968, 0 }, { "twodotleader", 0x2025, 0 }, { "twodotleadervertical", 0xfe30, 0 }, { "twogujarati", 0x0ae8, 0 }, { "twogurmukhi", 0x0a68, 0 }, { "twohackarabic", 0x0662, 0 }, { "twohangzhou", 0x3022, 0 }, { "twoideographicparen", 0x3221, 0 }, { "twoinferior", 0x2082, 0 }, { "twomonospace", 0xff12, 0 }, { "twonumeratorbengali", 0x09f5, 0 }, { "twooldstyle", 0xf732, 0 }, { "twoparen", 0x2475, 0 }, { "twoperiod", 0x2489, 0 }, { "twopersian", 0x06f2, 0 }, { "tworoman", 0x2171, 0 }, { "twostroke", 0x01bb, 0 }, { "twosuperior", 0x00b2, 0 }, { "twothai", 0x0e52, 0 }, { "ubar", 0x0289, 0 }, { "ubengali", 0x0989, 0 }, { "ubopomofo", 0x3128, 0 }, { "ucaron", 0x01d4, 0 }, { "ucircle", 0x24e4, 0 }, { "ucircumflexbelow", 0x1e77, 0 }, { "ucyrillic", 0x0443, 0 }, { "udattadeva", 0x0951, 0 }, { "udblacute", 0x0171, 0 }, { "udblgrave", 0x0215, 0 }, { "udeva", 0x0909, 0 }, { "udieresisacute", 0x01d8, 0 }, { "udieresisbelow", 0x1e73, 0 }, { "udieresiscaron", 0x01da, 0 }, { "udieresiscyrillic", 0x04f1, 0 }, { "udieresisgrave", 0x01dc, 0 }, { "udieresismacron", 0x01d6, 0 }, { "udotbelow", 0x1ee5, 0 }, { "ugujarati", 0x0a89, 0 }, { "ugurmukhi", 0x0a09, 0 }, { "uhiragana", 0x3046, 0 }, { "uhookabove", 0x1ee7, 0 }, { "uhornacute", 0x1ee9, 0 }, { "uhorndotbelow", 0x1ef1, 0 }, { "uhorngrave", 0x1eeb, 0 }, { "uhornhookabove", 0x1eed, 0 }, { "uhorntilde", 0x1eef, 0 }, { "uhungarumlautcyrillic", 0x04f3, 0 }, { "uinvertedbreve", 0x0217, 0 }, { "ukatakana", 0x30a6, 0 }, { "ukatakanahalfwidth", 0xff73, 0 }, { "ukcyrillic", 0x0479, 0 }, { "ukorean", 0x315c, 0 }, { "umacroncyrillic", 0x04ef, 0 }, { "umacrondieresis", 0x1e7b, 0 }, { "umatragurmukhi", 0x0a41, 0 }, { "umonospace", 0xff55, 0 }, { "underscoremonospace", 0xff3f, 0 }, { "underscorevertical", 0xfe33, 0 }, { "underscorewavy", 0xfe4f, 0 }, { "uparen", 0x24b0, 0 }, { "upperdothebrew", 0x05c4, 0 }, { "upsilonlatin", 0x028a, 0 }, { "uptackbelowcmb", 0x031d, 0 }, { "uptackmod", 0x02d4, 0 }, { "uragurmukhi", 0x0a73, 0 }, { "ushortcyrillic", 0x045e, 0 }, { "usmallhiragana", 0x3045, 0 }, { "usmallkatakana", 0x30a5, 0 }, { "usmallkatakanahalfwidth", 0xff69, 0 }, { "ustraightcyrillic", 0x04af, 0 }, { "ustraightstrokecyrillic", 0x04b1, 0 }, { "utildeacute", 0x1e79, 0 }, { "utildebelow", 0x1e75, 0 }, { "uubengali", 0x098a, 0 }, { "uudeva", 0x090a, 0 }, { "uugujarati", 0x0a8a, 0 }, { "uugurmukhi", 0x0a0a, 0 }, { "uumatragurmukhi", 0x0a42, 0 }, { "uuvowelsignbengali", 0x09c2, 0 }, { "uuvowelsigndeva", 0x0942, 0 }, { "uuvowelsigngujarati", 0x0ac2, 0 }, { "uvowelsignbengali", 0x09c1, 0 }, { "uvowelsigndeva", 0x0941, 0 }, { "uvowelsigngujarati", 0x0ac1, 0 }, { "vadeva", 0x0935, 0 }, { "vagujarati", 0x0ab5, 0 }, { "vagurmukhi", 0x0a35, 0 }, { "vakatakana", 0x30f7, 0 }, { "vav", 0x05d5, 0 }, { "vavdagesh", 0xfb35, 0 }, { "vavdagesh65", 0xfb35, 0 }, { "vavdageshhebrew", 0xfb35, 0 }, { "vavhebrew", 0x05d5, 0 }, { "vavholam", 0xfb4b, 0 }, { "vavholamhebrew", 0xfb4b, 0 }, { "vavvavhebrew", 0x05f0, 0 }, { "vavyodhebrew", 0x05f1, 0 }, { "vcircle", 0x24e5, 0 }, { "vdotbelow", 0x1e7f, 0 }, { "vecyrillic", 0x0432, 0 }, { "veharabic", 0x06a4, 0 }, { "vehfinalarabic", 0xfb6b, 0 }, { "vehinitialarabic", 0xfb6c, 0 }, { "vehmedialarabic", 0xfb6d, 0 }, { "vekatakana", 0x30f9, 0 }, { "venus", 0x2640, 0 }, { "verticalbar", 0x007c, 0 }, { "verticallineabovecmb", 0x030d, 0 }, { "verticallinebelowcmb", 0x0329, 0 }, { "verticallinelowmod", 0x02cc, 0 }, { "verticallinemod", 0x02c8, 0 }, { "vewarmenian", 0x057e, 0 }, { "vhook", 0x028b, 0 }, { "vikatakana", 0x30f8, 0 }, { "viramabengali", 0x09cd, 0 }, { "viramadeva", 0x094d, 0 }, { "viramagujarati", 0x0acd, 0 }, { "visargabengali", 0x0983, 0 }, { "visargadeva", 0x0903, 0 }, { "visargagujarati", 0x0a83, 0 }, { "vmonospace", 0xff56, 0 }, { "voarmenian", 0x0578, 0 }, { "voicediterationhiragana", 0x309e, 0 }, { "voicediterationkatakana", 0x30fe, 0 }, { "voicedmarkkana", 0x309b, 0 }, { "voicedmarkkanahalfwidth", 0xff9e, 0 }, { "vokatakana", 0x30fa, 0 }, { "vparen", 0x24b1, 0 }, { "vtilde", 0x1e7d, 0 }, { "vturned", 0x028c, 0 }, { "vuhiragana", 0x3094, 0 }, { "vukatakana", 0x30f4, 0 }, { "waekorean", 0x3159, 0 }, { "wahiragana", 0x308f, 0 }, { "wakatakana", 0x30ef, 0 }, { "wakatakanahalfwidth", 0xff9c, 0 }, { "wakorean", 0x3158, 0 }, { "wasmallhiragana", 0x308e, 0 }, { "wasmallkatakana", 0x30ee, 0 }, { "wattosquare", 0x3357, 0 }, { "wavedash", 0x301c, 0 }, { "wavyunderscorevertical", 0xfe34, 0 }, { "wawarabic", 0x0648, 0 }, { "wawfinalarabic", 0xfeee, 0 }, { "wawhamzaabovearabic", 0x0624, 0 }, { "wawhamzaabovefinalarabic", 0xfe86, 0 }, { "wbsquare", 0x33dd, 0 }, { "wcircle", 0x24e6, 0 }, { "wdotaccent", 0x1e87, 0 }, { "wdotbelow", 0x1e89, 0 }, { "wehiragana", 0x3091, 0 }, { "wekatakana", 0x30f1, 0 }, { "wekorean", 0x315e, 0 }, { "weokorean", 0x315d, 0 }, { "whitebullet", 0x25e6, 0 }, { "whitecircle", 0x25cb, 0 }, { "whitecircleinverse", 0x25d9, 0 }, { "whitecornerbracketleft", 0x300e, 0 }, { "whitecornerbracketleftvertical", 0xfe43, 0 }, { "whitecornerbracketright", 0x300f, 0 }, { "whitecornerbracketrightvertical", 0xfe44, 0 }, { "whitediamond", 0x25c7, 0 }, { "whitediamondcontainingblacksmalldiamond", 0x25c8, 0 }, { "whitedownpointingsmalltriangle", 0x25bf, 0 }, { "whitedownpointingtriangle", 0x25bd, 0 }, { "whiteleftpointingsmalltriangle", 0x25c3, 0 }, { "whiteleftpointingtriangle", 0x25c1, 0 }, { "whitelenticularbracketleft", 0x3016, 0 }, { "whitelenticularbracketright", 0x3017, 0 }, { "whiterightpointingsmalltriangle", 0x25b9, 0 }, { "whiterightpointingtriangle", 0x25b7, 0 }, { "whitesmallsquare", 0x25ab, 0 }, { "whitesmilingface", 0x263a, 0 }, { "whitesquare", 0x25a1, 0 }, { "whitestar", 0x2606, 0 }, { "whitetelephone", 0x260f, 0 }, { "whitetortoiseshellbracketleft", 0x3018, 0 }, { "whitetortoiseshellbracketright", 0x3019, 0 }, { "whiteuppointingsmalltriangle", 0x25b5, 0 }, { "whiteuppointingtriangle", 0x25b3, 0 }, { "wihiragana", 0x3090, 0 }, { "wikatakana", 0x30f0, 0 }, { "wikorean", 0x315f, 0 }, { "wmonospace", 0xff57, 0 }, { "wohiragana", 0x3092, 0 }, { "wokatakana", 0x30f2, 0 }, { "wokatakanahalfwidth", 0xff66, 0 }, { "won", 0x20a9, 0 }, { "wonmonospace", 0xffe6, 0 }, { "wowaenthai", 0x0e27, 0 }, { "wparen", 0x24b2, 0 }, { "wring", 0x1e98, 0 }, { "wsuperior", 0x02b7, 0 }, { "wturned", 0x028d, 0 }, { "wynn", 0x01bf, 0 }, { "xabovecmb", 0x033d, 0 }, { "xbopomofo", 0x3112, 0 }, { "xcircle", 0x24e7, 0 }, { "xdieresis", 0x1e8d, 0 }, { "xdotaccent", 0x1e8b, 0 }, { "xeharmenian", 0x056d, 0 }, { "xmonospace", 0xff58, 0 }, { "xparen", 0x24b3, 0 }, { "xsuperior", 0x02e3, 0 }, { "yaadosquare", 0x334e, 0 }, { "yabengali", 0x09af, 0 }, { "yadeva", 0x092f, 0 }, { "yaekorean", 0x3152, 0 }, { "yagujarati", 0x0aaf, 0 }, { "yagurmukhi", 0x0a2f, 0 }, { "yahiragana", 0x3084, 0 }, { "yakatakana", 0x30e4, 0 }, { "yakatakanahalfwidth", 0xff94, 0 }, { "yakorean", 0x3151, 0 }, { "yamakkanthai", 0x0e4e, 0 }, { "yasmallhiragana", 0x3083, 0 }, { "yasmallkatakana", 0x30e3, 0 }, { "yasmallkatakanahalfwidth", 0xff6c, 0 }, { "yatcyrillic", 0x0463, 0 }, { "ycircle", 0x24e8, 0 }, { "ydotaccent", 0x1e8f, 0 }, { "ydotbelow", 0x1ef5, 0 }, { "yeharabic", 0x064a, 0 }, { "yehbarreearabic", 0x06d2, 0 }, { "yehbarreefinalarabic", 0xfbaf, 0 }, { "yehfinalarabic", 0xfef2, 0 }, { "yehhamzaabovearabic", 0x0626, 0 }, { "yehhamzaabovefinalarabic", 0xfe8a, 0 }, { "yehhamzaaboveinitialarabic", 0xfe8b, 0 }, { "yehhamzaabovemedialarabic", 0xfe8c, 0 }, { "yehinitialarabic", 0xfef3, 0 }, { "yehmedialarabic", 0xfef4, 0 }, { "yehmeeminitialarabic", 0xfcdd, 0 }, { "yehmeemisolatedarabic", 0xfc58, 0 }, { "yehnoonfinalarabic", 0xfc94, 0 }, { "yehthreedotsbelowarabic", 0x06d1, 0 }, { "yekorean", 0x3156, 0 }, { "yenmonospace", 0xffe5, 0 }, { "yeokorean", 0x3155, 0 }, { "yeorinhieuhkorean", 0x3186, 0 }, { "yerahbenyomohebrew", 0x05aa, 0 }, { "yerahbenyomolefthebrew", 0x05aa, 0 }, { "yericyrillic", 0x044b, 0 }, { "yerudieresiscyrillic", 0x04f9, 0 }, { "yesieungkorean", 0x3181, 0 }, { "yesieungpansioskorean", 0x3183, 0 }, { "yesieungsioskorean", 0x3182, 0 }, { "yetivhebrew", 0x059a, 0 }, { "yhook", 0x01b4, 0 }, { "yhookabove", 0x1ef7, 0 }, { "yiarmenian", 0x0575, 0 }, { "yicyrillic", 0x0457, 0 }, { "yikorean", 0x3162, 0 }, { "yinyang", 0x262f, 0 }, { "yiwnarmenian", 0x0582, 0 }, { "ymonospace", 0xff59, 0 }, { "yod", 0x05d9, 0 }, { "yoddagesh", 0xfb39, 0 }, { "yoddageshhebrew", 0xfb39, 0 }, { "yodhebrew", 0x05d9, 0 }, { "yodyodhebrew", 0x05f2, 0 }, { "yodyodpatahhebrew", 0xfb1f, 0 }, { "yohiragana", 0x3088, 0 }, { "yoikorean", 0x3189, 0 }, { "yokatakana", 0x30e8, 0 }, { "yokatakanahalfwidth", 0xff96, 0 }, { "yokorean", 0x315b, 0 }, { "yosmallhiragana", 0x3087, 0 }, { "yosmallkatakana", 0x30e7, 0 }, { "yosmallkatakanahalfwidth", 0xff6e, 0 }, { "yotgreek", 0x03f3, 0 }, { "yoyaekorean", 0x3188, 0 }, { "yoyakorean", 0x3187, 0 }, { "yoyakthai", 0x0e22, 0 }, { "yoyingthai", 0x0e0d, 0 }, { "yparen", 0x24b4, 0 }, { "ypogegrammeni", 0x037a, 0 }, { "ypogegrammenigreekcmb", 0x0345, 0 }, { "yr", 0x01a6, 0 }, { "yring", 0x1e99, 0 }, { "ysuperior", 0x02b8, 0 }, { "ytilde", 0x1ef9, 0 }, { "yturned", 0x028e, 0 }, { "yuhiragana", 0x3086, 0 }, { "yuikorean", 0x318c, 0 }, { "yukatakana", 0x30e6, 0 }, { "yukatakanahalfwidth", 0xff95, 0 }, { "yukorean", 0x3160, 0 }, { "yusbigcyrillic", 0x046b, 0 }, { "yusbigiotifiedcyrillic", 0x046d, 0 }, { "yuslittlecyrillic", 0x0467, 0 }, { "yuslittleiotifiedcyrillic", 0x0469, 0 }, { "yusmallhiragana", 0x3085, 0 }, { "yusmallkatakana", 0x30e5, 0 }, { "yusmallkatakanahalfwidth", 0xff6d, 0 }, { "yuyekorean", 0x318b, 0 }, { "yuyeokorean", 0x318a, 0 }, { "yyabengali", 0x09df, 0 }, { "yyadeva", 0x095f, 0 }, { "zaarmenian", 0x0566, 0 }, { "zadeva", 0x095b, 0 }, { "zagurmukhi", 0x0a5b, 0 }, { "zaharabic", 0x0638, 0 }, { "zahfinalarabic", 0xfec6, 0 }, { "zahinitialarabic", 0xfec7, 0 }, { "zahiragana", 0x3056, 0 }, { "zahmedialarabic", 0xfec8, 0 }, { "zainarabic", 0x0632, 0 }, { "zainfinalarabic", 0xfeb0, 0 }, { "zakatakana", 0x30b6, 0 }, { "zaqefgadolhebrew", 0x0595, 0 }, { "zaqefqatanhebrew", 0x0594, 0 }, { "zarqahebrew", 0x0598, 0 }, { "zayin", 0x05d6, 0 }, { "zayindagesh", 0xfb36, 0 }, { "zayindageshhebrew", 0xfb36, 0 }, { "zayinhebrew", 0x05d6, 0 }, { "zbopomofo", 0x3117, 0 }, { "zcircle", 0x24e9, 0 }, { "zcircumflex", 0x1e91, 0 }, { "zcurl", 0x0291, 0 }, { "zdot", 0x017c, 0 }, { "zdotbelow", 0x1e93, 0 }, { "zecyrillic", 0x0437, 0 }, { "zedescendercyrillic", 0x0499, 0 }, { "zedieresiscyrillic", 0x04df, 0 }, { "zehiragana", 0x305c, 0 }, { "zekatakana", 0x30bc, 0 }, { "zeroarabic", 0x0660, 0 }, { "zerobengali", 0x09e6, 0 }, { "zerodeva", 0x0966, 0 }, { "zerogujarati", 0x0ae6, 0 }, { "zerogurmukhi", 0x0a66, 0 }, { "zerohackarabic", 0x0660, 0 }, { "zeroinferior", 0x2080, 0 }, { "zeromonospace", 0xff10, 0 }, { "zerooldstyle", 0xf730, 0 }, { "zeropersian", 0x06f0, 0 }, { "zerosuperior", 0x2070, 0 }, { "zerothai", 0x0e50, 0 }, { "zerowidthjoiner", 0xfeff, 0 }, { "zerowidthnonjoiner", 0x200c, 0 }, { "zerowidthspace", 0x200b, 0 }, { "zhbopomofo", 0x3113, 0 }, { "zhearmenian", 0x056a, 0 }, { "zhebrevecyrillic", 0x04c2, 0 }, { "zhecyrillic", 0x0436, 0 }, { "zhedescendercyrillic", 0x0497, 0 }, { "zhedieresiscyrillic", 0x04dd, 0 }, { "zihiragana", 0x3058, 0 }, { "zikatakana", 0x30b8, 0 }, { "zinorhebrew", 0x05ae, 0 }, { "zlinebelow", 0x1e95, 0 }, { "zmonospace", 0xff5a, 0 }, { "zohiragana", 0x305e, 0 }, { "zokatakana", 0x30be, 0 }, { "zparen", 0x24b5, 0 }, { "zretroflexhook", 0x0290, 0 }, { "zstroke", 0x01b6, 0 }, { "zuhiragana", 0x305a, 0 }, { "zukatakana", 0x30ba, 0 }, { "dotaccent.cap", 0xefed, 0 }, { "breve.cap", 0xefee, 0 }, { "ogonek.cap", 0xeff1, 0 }, { "cedilla.cap", 0xeff2, 0 }, { "ring.cap", 0xeff3, 0 }, { "tilde.cap", 0xeff5, 0 }, { "circumflex.cap", 0xeff7, 0 }, { "a1", 0x2701, 0 }, { "a2", 0x2702, 0 }, { "a202", 0x2703, 0 }, { "a3", 0x2704, 0 }, { "a4", 0x260e, 0 }, { "a5", 0x2706, 0 }, { "a119", 0x2707, 0 }, { "a118", 0x2708, 0 }, { "a117", 0x2709, 0 }, { "a11", 0x261b, 0 }, { "a12", 0x261e, 0 }, { "a13", 0x270c, 0 }, { "a14", 0x270d, 0 }, { "a15", 0x270e, 0 }, { "a16", 0x270f, 0 }, { "a105", 0x2710, 0 }, { "a17", 0x2711, 0 }, { "a18", 0x2712, 0 }, { "a19", 0x2713, 0 }, { "a20", 0x2714, 0 }, { "a21", 0x2715, 0 }, { "a22", 0x2716, 0 }, { "a23", 0x2717, 0 }, { "a24", 0x2718, 0 }, { "a25", 0x2719, 0 }, { "a26", 0x271a, 0 }, { "a27", 0x271b, 0 }, { "a28", 0x271c, 0 }, { "a6", 0x271d, 0 }, { "a7", 0x271e, 0 }, { "a8", 0x271f, 0 }, { "a9", 0x2720, 0 }, { "a10", 0x2721, 0 }, { "a29", 0x2722, 0 }, { "a30", 0x2723, 0 }, { "a31", 0x2724, 0 }, { "a32", 0x2725, 0 }, { "a33", 0x2726, 0 }, { "a34", 0x2727, 0 }, { "a35", 0x2605, 0 }, { "a36", 0x2729, 0 }, { "a37", 0x272a, 0 }, { "a38", 0x272b, 0 }, { "a39", 0x272c, 0 }, { "a40", 0x272d, 0 }, { "a41", 0x272e, 0 }, { "a42", 0x272f, 0 }, { "a43", 0x2730, 0 }, { "a44", 0x2731, 0 }, { "a45", 0x2732, 0 }, { "a46", 0x2733, 0 }, { "a47", 0x2734, 0 }, { "a48", 0x2735, 0 }, { "a49", 0x2736, 0 }, { "a50", 0x2737, 0 }, { "a51", 0x2738, 0 }, { "a52", 0x2739, 0 }, { "a53", 0x273a, 0 }, { "a54", 0x273b, 0 }, { "a55", 0x273c, 0 }, { "a56", 0x273d, 0 }, { "a57", 0x273e, 0 }, { "a58", 0x273f, 0 }, { "a59", 0x2740, 0 }, { "a60", 0x2741, 0 }, { "a61", 0x2742, 0 }, { "a62", 0x2743, 0 }, { "a63", 0x2744, 0 }, { "a64", 0x2745, 0 }, { "a65", 0x2746, 0 }, { "a66", 0x2747, 0 }, { "a67", 0x2748, 0 }, { "a68", 0x2749, 0 }, { "a69", 0x274a, 0 }, { "a70", 0x274b, 0 }, { "a71", 0x25cf, 0 }, { "a72", 0x274d, 0 }, { "a73", 0x25a0, 0 }, { "a74", 0x274f, 0 }, { "a203", 0x2750, 0 }, { "a75", 0x2751, 0 }, { "a204", 0x2752, 0 }, { "a76", 0x25b2, 0 }, { "a77", 0x25bc, 0 }, { "a78", 0x25c6, 0 }, { "a79", 0x2756, 0 }, { "a81", 0x25d7, 0 }, { "a82", 0x2758, 0 }, { "a83", 0x2759, 0 }, { "a84", 0x275a, 0 }, { "a97", 0x275b, 0 }, { "a98", 0x275c, 0 }, { "a99", 0x275d, 0 }, { "a100", 0x275e, 0 }, { "a89", 0x2768, 0 }, { "a90", 0x2769, 0 }, { "a93", 0x276a, 0 }, { "a94", 0x276b, 0 }, { "a91", 0x276c, 0 }, { "a92", 0x276d, 0 }, { "a205", 0x276e, 0 }, { "a85", 0x276f, 0 }, { "a206", 0x2770, 0 }, { "a86", 0x2771, 0 }, { "a87", 0x2772, 0 }, { "a88", 0x2773, 0 }, { "a95", 0x2774, 0 }, { "a96", 0x2775, 0 }, { "a101", 0x2761, 0 }, { "a102", 0x2762, 0 }, { "a103", 0x2763, 0 }, { "a104", 0x2764, 0 }, { "a106", 0x2765, 0 }, { "a107", 0x2766, 0 }, { "a108", 0x2767, 0 }, { "a112", 0x2663, 0 }, { "a111", 0x2666, 0 }, { "a110", 0x2665, 0 }, { "a109", 0x2660, 0 }, { "a120", 0x2460, 0 }, { "a121", 0x2461, 0 }, { "a122", 0x2462, 0 }, { "a123", 0x2463, 0 }, { "a124", 0x2464, 0 }, { "a125", 0x2465, 0 }, { "a126", 0x2466, 0 }, { "a127", 0x2467, 0 }, { "a128", 0x2468, 0 }, { "a129", 0x2469, 0 }, { "a130", 0x2776, 0 }, { "a131", 0x2777, 0 }, { "a132", 0x2778, 0 }, { "a133", 0x2779, 0 }, { "a134", 0x277a, 0 }, { "a135", 0x277b, 0 }, { "a136", 0x277c, 0 }, { "a137", 0x277d, 0 }, { "a138", 0x277e, 0 }, { "a139", 0x277f, 0 }, { "a140", 0x2780, 0 }, { "a141", 0x2781, 0 }, { "a142", 0x2782, 0 }, { "a143", 0x2783, 0 }, { "a144", 0x2784, 0 }, { "a145", 0x2785, 0 }, { "a146", 0x2786, 0 }, { "a147", 0x2787, 0 }, { "a148", 0x2788, 0 }, { "a149", 0x2789, 0 }, { "a150", 0x278a, 0 }, { "a151", 0x278b, 0 }, { "a152", 0x278c, 0 }, { "a153", 0x278d, 0 }, { "a154", 0x278e, 0 }, { "a155", 0x278f, 0 }, { "a156", 0x2790, 0 }, { "a157", 0x2791, 0 }, { "a158", 0x2792, 0 }, { "a159", 0x2793, 0 }, { "a160", 0x2794, 0 }, { "a161", 0x2192, 0 }, { "a163", 0x2194, 0 }, { "a164", 0x2195, 0 }, { "a196", 0x2798, 0 }, { "a165", 0x2799, 0 }, { "a192", 0x279a, 0 }, { "a166", 0x279b, 0 }, { "a167", 0x279c, 0 }, { "a168", 0x279d, 0 }, { "a169", 0x279e, 0 }, { "a170", 0x279f, 0 }, { "a171", 0x27a0, 0 }, { "a172", 0x27a1, 0 }, { "a173", 0x27a2, 0 }, { "a162", 0x27a3, 0 }, { "a174", 0x27a4, 0 }, { "a175", 0x27a5, 0 }, { "a176", 0x27a6, 0 }, { "a177", 0x27a7, 0 }, { "a178", 0x27a8, 0 }, { "a179", 0x27a9, 0 }, { "a193", 0x27aa, 0 }, { "a180", 0x27ab, 0 }, { "a199", 0x27ac, 0 }, { "a181", 0x27ad, 0 }, { "a200", 0x27ae, 0 }, { "a182", 0x27af, 0 }, { "a201", 0x27b1, 0 }, { "a183", 0x27b2, 0 }, { "a184", 0x27b3, 0 }, { "a197", 0x27b4, 0 }, { "a185", 0x27b5, 0 }, { "a194", 0x27b6, 0 }, { "a198", 0x27b7, 0 }, { "a186", 0x27b8, 0 }, { "a195", 0x27b9, 0 }, { "a187", 0x27ba, 0 }, { "a188", 0x27bb, 0 }, { "a189", 0x27bc, 0 }, { "a190", 0x27bd, 0 }, { "a191", 0x27be, 0 }, { "register.sans", 0xf8e8, 0 }, { "register.serif", 0xf6da, 0 }, { "one.superior", 0x00b9, 0 }, { "two.superior", 0x00b2, 0 }, { "three.superior", 0x00b3, 0 }, { "parenleft.superior", 0x207d, 0 }, { "parenright.superior", 0x207e, 0 }, { "n.superior", 0x207f, 0 }, { "parenleft.inferior", 0x208d, 0 }, { "parenright.inferior", 0x208e, 0 }, { "zero.superior", 0x2070, 0 }, { "four.superior", 0x2074, 0 }, { "five.superior", 0x2075, 0 }, { "six.superior", 0x2076, 0 }, { "seven.superior", 0x2077, 0 }, { "eight.superior", 0x2078, 0 }, { "nine.superior", 0x2079, 0 }, { "zero.inferior", 0x2080, 0 }, { "one.inferior", 0x2081, 0 }, { "two.inferior", 0x2082, 0 }, { "three.inferior", 0x2083, 0 }, { "four.inferior", 0x2084, 0 }, { "five.inferior", 0x2085, 0 }, { "six.inferior", 0x2086, 0 }, { "seven.inferior", 0x2087, 0 }, { "eight.inferior", 0x2088, 0 }, { "nine.inferior", 0x2089, 0 }, { "mu.greek", 0x03bc, 0 }, { "Delta.greek", 0x0394, 0 }, { "Omega.greek", 0x03a9, 0 }, { "sigma.end", 0x03c2, 0 }, { "beta.alt", 0x03d0, 0 }, { "kappa.alt", 0x03f0, 0 }, { "theta.alt", 0x03d1, 0 }, { "Upsilon.alt", 0x03d2, 0 }, { "phi.alt", 0x03d5, 0 }, { "pi.alt", 0x03d6, 0 }, { "A.cyr", 0x0410, 0 }, { "Ghe.up", 0x0490, 0 }, { "I.cyr", 0x0418, 0 }, { "I.short", 0x0419, 0 }, { "O.cyr", 0x041e, 0 }, { "U.cyr", 0x0423, 0 }, { "E.cyr", 0x042d, 0 }, { "Ie.ukran", 0x0404, 0 }, { "I.ukran", 0x0406, 0 }, { "U.short", 0x040e, 0 }, { "a.cyr", 0x0430, 0 }, { "ghe.up", 0x0491, 0 }, { "i.cyr", 0x0438, 0 }, { "i.short", 0x0439, 0 }, { "o.cyr", 0x043e, 0 }, { "u.cyr", 0x0443, 0 }, { "e.cyr", 0x044d, 0 }, { "ie.ukran", 0x0454, 0 }, { "i.ukran", 0x0456, 0 }, { "u.short", 0x045e, 0 }, { "ghe.ital", 0xf6c4, 0 }, { "afii10068.ital", 0xf6c4, 0 }, { "afii10066.ital", 0xf6c5, 0 }, { "be.alt", 0xf6c5, 0 }, { "afii10069.ital", 0xf6c6, 0 }, { "de.ital", 0xf6c6, 0 }, { "afii10081.ital", 0xf6c7, 0 }, { "pe.ital", 0xf6c7, 0 }, { "afii10084.ital", 0xf6c8, 0 }, { "te.ital", 0xf6c8, 0 }, { "Omega.math", 0x2126, 0 }, { "Delta.math", 0x2206, 0 }, { "afii57689_afii57804", 0xfb2a, 0 }, { "afii57689_afii57803", 0xfb2b, 0 }, { "afii57669_afii57806", 0xfb4b, 0 }, { "afii57718_afii57798", 0xfb1f, 0 }, { "afii57669_afii57807", 0xfb35, 0 }, { ".null", 0x0000, 0 }, { "dialytika_perispomeni", 0x1fc1, 0 }, { "psili_varia", 0x1fcd, 0 }, { "psili_oxia", 0x1fce, 0 }, { "psili_perispomeni", 0x1fcf, 0 }, { "dasia_varia", 0x1fdd, 0 }, { "dasia_oxia", 0x1fde, 0 }, { "dasia_perispomeni", 0x1fdf, 0 }, { "dialytika_varia", 0x1fed, 0 }, { "dialytika_oxia", 0x1fee, 0 }, { "Alphaacute", 0x1fbb, 0 }, { "Alphaasper", 0x1f09, 0 }, { "Alphaasperacute", 0x1f0d, 0 }, { "Alphaaspergrave", 0x1f0b, 0 }, { "Alphaaspertilde", 0x1f0f, 0 }, { "Alphabreve", 0x1fb8, 0 }, { "Alphagrave", 0x1fba, 0 }, { "Alphaiotasub", 0x1fbc, 0 }, { "Alphaiotasubasper", 0x1f89, 0 }, { "Alphaiotasubasperacute", 0x1f8d, 0 }, { "Alphaiotasubaspergrave", 0x1f8b, 0 }, { "Alphaiotasubaspertilde", 0x1f8f, 0 }, { "Alphaiotasublenis", 0x1f88, 0 }, { "Alphaiotasublenisacute", 0x1f8c, 0 }, { "Alphaiotasublenisgrave", 0x1f8a, 0 }, { "Alphaiotasublenistilde", 0x1f8e, 0 }, { "Alphalenis", 0x1f08, 0 }, { "Alphalenisacute", 0x1f0c, 0 }, { "Alphalenisgrave", 0x1f0a, 0 }, { "Alphalenistilde", 0x1f0e, 0 }, { "Alphamacron", 0x1fb9, 0 }, { "Epsilonacute", 0x1fc9, 0 }, { "Epsilonasper", 0x1f19, 0 }, { "Epsilonasperacute", 0x1f1d, 0 }, { "Epsilonaspergrave", 0x1f1b, 0 }, { "Epsilongrave", 0x1fc8, 0 }, { "Epsilonlenis", 0x1f18, 0 }, { "Epsilonlenisacute", 0x1f1c, 0 }, { "Epsilonlenisgrave", 0x1f1a, 0 }, { "Etaacute", 0x1fcb, 0 }, { "Etaasper", 0x1f29, 0 }, { "Etaasperacute", 0x1f2d, 0 }, { "Etaaspergrave", 0x1f2b, 0 }, { "Etaaspertilde", 0x1f2f, 0 }, { "Etagrave", 0x1fca, 0 }, { "Etaiotasub", 0x1fcc, 0 }, { "Etaiotasubasper", 0x1f99, 0 }, { "Etaiotasubasperacute", 0x1f9d, 0 }, { "Etaiotasubaspergrave", 0x1f9b, 0 }, { "Etaiotasubaspertilde", 0x1f9f, 0 }, { "Etaiotasublenis", 0x1f98, 0 }, { "Etaiotasublenisacute", 0x1f9c, 0 }, { "Etaiotasublenisgrave", 0x1f9a, 0 }, { "Etaiotasublenistilde", 0x1f9e, 0 }, { "Etalenis", 0x1f28, 0 }, { "Etalenisacute", 0x1f2c, 0 }, { "Etalenisgrave", 0x1f2a, 0 }, { "Etalenistilde", 0x1f2e, 0 }, { "Iotaacute", 0x1fdb, 0 }, { "Iotaasper", 0x1f39, 0 }, { "Iotaasperacute", 0x1f3d, 0 }, { "Iotaaspergrave", 0x1f3b, 0 }, { "Iotaaspertilde", 0x1f3f, 0 }, { "Iotabreve", 0x1fd8, 0 }, { "Iotagrave", 0x1fda, 0 }, { "Iotalenis", 0x1f38, 0 }, { "Iotalenisacute", 0x1f3c, 0 }, { "Iotalenisgrave", 0x1f3a, 0 }, { "Iotalenistilde", 0x1f3e, 0 }, { "Iotamacron", 0x1fd9, 0 }, { "Omegaacute", 0x1ffb, 0 }, { "Omegaasper", 0x1f69, 0 }, { "Omegaasperacute", 0x1f6d, 0 }, { "Omegaaspergrave", 0x1f6b, 0 }, { "Omegaaspertilde", 0x1f6f, 0 }, { "Omegagrave", 0x1ffa, 0 }, { "Omegaiotasub", 0x1ffc, 0 }, { "Omegaiotasubasper", 0x1fa9, 0 }, { "Omegaiotasubasperacute", 0x1fad, 0 }, { "Omegaiotasubaspergrave", 0x1fab, 0 }, { "Omegaiotasubaspertilde", 0x1faf, 0 }, { "Omegaiotasublenis", 0x1fa8, 0 }, { "Omegaiotasublenisacute", 0x1fac, 0 }, { "Omegaiotasublenisgrave", 0x1faa, 0 }, { "Omegaiotasublenistilde", 0x1fae, 0 }, { "Omegalenis", 0x1f68, 0 }, { "Omegalenisacute", 0x1f6c, 0 }, { "Omegalenisgrave", 0x1f6a, 0 }, { "Omegalenistilde", 0x1f6e, 0 }, { "Omicronacute", 0x1ff9, 0 }, { "Omicronasper", 0x1f49, 0 }, { "Omicronasperacute", 0x1f4d, 0 }, { "Omicronaspergrave", 0x1f4b, 0 }, { "Omicrongrave", 0x1ff8, 0 }, { "Omicronlenis", 0x1f48, 0 }, { "Omicronlenisacute", 0x1f4c, 0 }, { "Omicronlenisgrave", 0x1f4a, 0 }, { "Rhoasper", 0x1fec, 0 }, { "Upsilonacute", 0x1feb, 0 }, { "Upsilonasper", 0x1f59, 0 }, { "Upsilonasperacute", 0x1f5d, 0 }, { "Upsilonaspergrave", 0x1f5b, 0 }, { "Upsilonaspertilde", 0x1f5f, 0 }, { "Upsilonbreve", 0x1fe8, 0 }, { "Upsilongrave", 0x1fea, 0 }, { "Upsilonmacron", 0x1fe9, 0 }, { "numeralsign", 0x0374, 0 }, { "lownumeralsign", 0x0375, 0 }, { "lowcomma", 0x037a, 0 }, { "stigma", 0x03da, 0 }, { "koppa", 0x03de, 0 }, { "sampi", 0x03e0, 0 }, { "lenis", 0x1fbd, 0 }, { "iotasubscript", 0x1fbe, 0 }, { "dieresistilde", 0x1fc1, 0 }, { "lenisgrave", 0x1fcd, 0 }, { "lenisacute", 0x1fce, 0 }, { "lenistilde", 0x1fcf, 0 }, { "aspergrave", 0x1fdd, 0 }, { "asperacute", 0x1fde, 0 }, { "aspertilde", 0x1fdf, 0 }, { "dialytikagrave", 0x1fed, 0 }, { "dialytikaacute", 0x1fee, 0 }, { "asper", 0x1ffe, 0 }, { "alphalenis", 0x1f00, 0 }, { "alphaasper", 0x1f01, 0 }, { "alphalenisgrave", 0x1f02, 0 }, { "alphaaspergrave", 0x1f03, 0 }, { "alphalenisacute", 0x1f04, 0 }, { "alphaasperacute", 0x1f05, 0 }, { "alphalenistilde", 0x1f06, 0 }, { "alphaaspertilde", 0x1f07, 0 }, { "epsilonlenis", 0x1f10, 0 }, { "epsilonasper", 0x1f11, 0 }, { "epsilonlenisgrave", 0x1f12, 0 }, { "epsilonaspergrave", 0x1f13, 0 }, { "epsilonlenisacute", 0x1f14, 0 }, { "epsilonasperacute", 0x1f15, 0 }, { "etalenis", 0x1f20, 0 }, { "etaasper", 0x1f21, 0 }, { "etalenisgrave", 0x1f22, 0 }, { "etaaspergrave", 0x1f23, 0 }, { "etalenisacute", 0x1f24, 0 }, { "etaasperacute", 0x1f25, 0 }, { "etalenistilde", 0x1f26, 0 }, { "etaaspertilde", 0x1f27, 0 }, { "iotalenis", 0x1f30, 0 }, { "iotaasper", 0x1f31, 0 }, { "iotalenisgrave", 0x1f32, 0 }, { "iotaaspergrave", 0x1f33, 0 }, { "iotalenisacute", 0x1f34, 0 }, { "iotaasperacute", 0x1f35, 0 }, { "iotalenistilde", 0x1f36, 0 }, { "iotaaspertilde", 0x1f37, 0 }, { "omicronlenis", 0x1f40, 0 }, { "omicronasper", 0x1f41, 0 }, { "omicronlenisgrave", 0x1f42, 0 }, { "omicronaspergrave", 0x1f43, 0 }, { "omicronlenisacute", 0x1f44, 0 }, { "omicronasperacute", 0x1f45, 0 }, { "upsilonlenis", 0x1f50, 0 }, { "upsilonasper", 0x1f51, 0 }, { "upsilonlenisgrave", 0x1f52, 0 }, { "upsilonaspergrave", 0x1f53, 0 }, { "upsilonlenisacute", 0x1f54, 0 }, { "upsilonasperacute", 0x1f55, 0 }, { "upsilonlenistilde", 0x1f56, 0 }, { "upsilonaspertilde", 0x1f57, 0 }, { "omegalenis", 0x1f60, 0 }, { "omegaasper", 0x1f61, 0 }, { "omegalenisgrave", 0x1f62, 0 }, { "omegaaspergrave", 0x1f63, 0 }, { "omegalenisacute", 0x1f64, 0 }, { "omegaasperacute", 0x1f65, 0 }, { "omegalenistilde", 0x1f66, 0 }, { "omegaaspertilde", 0x1f67, 0 }, { "alphagrave", 0x1f70, 0 }, { "alphaacute", 0x1f71, 0 }, { "epsilongrave", 0x1f72, 0 }, { "epsilonacute", 0x1f73, 0 }, { "etagrave", 0x1f74, 0 }, { "etaacute", 0x1f75, 0 }, { "iotagrave", 0x1f76, 0 }, { "iotaacute", 0x1f77, 0 }, { "omicrongrave", 0x1f78, 0 }, { "omicronacute", 0x1f79, 0 }, { "upsilongrave", 0x1f7a, 0 }, { "upsilonacute", 0x1f7b, 0 }, { "omegagrave", 0x1f7c, 0 }, { "omegaacute", 0x1f7d, 0 }, { "alphaiotasublenis", 0x1f80, 0 }, { "alphaiotasubasper", 0x1f81, 0 }, { "alphaiotasublenisgrave", 0x1f82, 0 }, { "alphaiotasubaspergrave", 0x1f83, 0 }, { "alphaiotasublenisacute", 0x1f84, 0 }, { "alphaiotasubasperacute", 0x1f85, 0 }, { "alphaiotasublenistilde", 0x1f86, 0 }, { "alphaiotasubaspertilde", 0x1f87, 0 }, { "etaiotasublenis", 0x1f90, 0 }, { "etaiotasubasper", 0x1f91, 0 }, { "etaiotasublenisgrave", 0x1f92, 0 }, { "etaiotasubaspergrave", 0x1f93, 0 }, { "etaiotasublenisacute", 0x1f94, 0 }, { "etaiotasubasperacute", 0x1f95, 0 }, { "etaiotasublenistilde", 0x1f96, 0 }, { "etaiotasubaspertilde", 0x1f97, 0 }, { "omegaiotasublenis", 0x1fa0, 0 }, { "omegaiotasubasper", 0x1fa1, 0 }, { "omegaiotasublenisgrave", 0x1fa2, 0 }, { "omegaiotasubaspergrave", 0x1fa3, 0 }, { "omegaiotasublenisacute", 0x1fa4, 0 }, { "omegaiotasubasperacute", 0x1fa5, 0 }, { "omegaiotasublenistilde", 0x1fa6, 0 }, { "omegaiotasubaspertilde", 0x1fa7, 0 }, { "alphabreve", 0x1fb0, 0 }, { "alphamacron", 0x1fb1, 0 }, { "alphaiotasubgrave", 0x1fb2, 0 }, { "alphaiotasub", 0x1fb3, 0 }, { "alphatilde", 0x1fb6, 0 }, { "alphaiotasubtilde", 0x1fb7, 0 }, { "etaiotasubgrave", 0x1fc2, 0 }, { "etaiotasub", 0x1fc3, 0 }, { "etaiotasubacute", 0x1fc4, 0 }, { "etatilde", 0x1fc6, 0 }, { "etaiotasubtilde", 0x1fc7, 0 }, { "iotabreve", 0x1fd0, 0 }, { "iotamacron", 0x1fd1, 0 }, { "iotadieresisgrave", 0x1fd2, 0 }, { "iotadieresisacute", 0x1fd3, 0 }, { "iotatilde", 0x1fd6, 0 }, { "iotadieresistilde", 0x1fd7, 0 }, { "upsilonbreve", 0x1fe0, 0 }, { "upsilonmacron", 0x1fe1, 0 }, { "upsilondieresisgrave", 0x1fe2, 0 }, { "upsilondieresisacute", 0x1fe3, 0 }, { "rholenis", 0x1fe4, 0 }, { "rhoasper", 0x1fe5, 0 }, { "upsilontilde", 0x1fe6, 0 }, { "omegaiotasubgrave", 0x1ff2, 0 }, { "omegaiotasub", 0x1ff3, 0 }, { "omegaiotasubacute", 0x1ff4, 0 }, { "omegatilde", 0x1ff6, 0 }, { "omegaiotasubtilde", 0x1ff7, 0 }, { "alphaiotasubacute", 0x1fb4, 0 }, { "upsilondieresistilde", 0x1fe7, 0 }, { "digamma", 0xefd5, 0 }, { "Be", 0x0411, 0 }, { "Ve", 0x0412, 0 }, { "Ghe", 0x0413, 0 }, { "De", 0x0414, 0 }, { "Ie", 0x0415, 0 }, { "Zhe", 0x0416, 0 }, { "Ze", 0x0417, 0 }, { "Ka", 0x041a, 0 }, { "El", 0x041b, 0 }, { "Em", 0x041c, 0 }, { "En", 0x041d, 0 }, { "Pe", 0x041f, 0 }, { "Er", 0x0420, 0 }, { "Es", 0x0421, 0 }, { "Te", 0x0422, 0 }, { "Ef", 0x0424, 0 }, { "Ha", 0x0425, 0 }, { "Tse", 0x0426, 0 }, { "Che", 0x0427, 0 }, { "Sha", 0x0428, 0 }, { "Shcha", 0x0429, 0 }, { "Hard", 0x042a, 0 }, { "Yeru", 0x042b, 0 }, { "Soft", 0x042c, 0 }, { "Yu", 0x042e, 0 }, { "Ya", 0x042f, 0 }, { "Io", 0x0401, 0 }, { "Dje", 0x0402, 0 }, { "Gje", 0x0403, 0 }, { "Dze", 0x0405, 0 }, { "Yi", 0x0407, 0 }, { "Je", 0x0408, 0 }, { "Lje", 0x0409, 0 }, { "Nje", 0x040a, 0 }, { "Tshe", 0x040b, 0 }, { "Kje", 0x040c, 0 }, { "Dzhe", 0x040f, 0 }, { "Yat", 0x0462, 0 }, { "Fita", 0x0472, 0 }, { "Izhitsa", 0x0474, 0 }, { "be", 0x0431, 0 }, { "ve", 0x0432, 0 }, { "ghe", 0x0433, 0 }, { "de", 0x0434, 0 }, { "ie", 0x0435, 0 }, { "zhe", 0x0436, 0 }, { "ze", 0x0437, 0 }, { "ka", 0x043a, 0 }, { "el", 0x043b, 0 }, { "em", 0x043c, 0 }, { "en", 0x043d, 0 }, { "er", 0x0440, 0 }, { "es", 0x0441, 0 }, { "te", 0x0442, 0 }, { "ef", 0x0444, 0 }, { "ha", 0x0445, 0 }, { "tse", 0x0446, 0 }, { "che", 0x0447, 0 }, { "sha", 0x0448, 0 }, { "shcha", 0x0449, 0 }, { "hard", 0x044a, 0 }, { "yeru", 0x044b, 0 }, { "soft", 0x044c, 0 }, { "yu", 0x044e, 0 }, { "ya", 0x044f, 0 }, { "io", 0x0451, 0 }, { "dje", 0x0452, 0 }, { "gje", 0x0453, 0 }, { "dze", 0x0455, 0 }, { "yi", 0x0457, 0 }, { "je", 0x0458, 0 }, { "lje", 0x0459, 0 }, { "nje", 0x045a, 0 }, { "tshe", 0x045b, 0 }, { "kje", 0x045c, 0 }, { "dzhe", 0x045f, 0 }, { "yat", 0x0463, 0 }, { "fita", 0x0473, 0 }, { "izhitsa", 0x0475, 0 }, { "litre", 0x2113, 0 }, { "Dotaccent", 0xefed, 0 }, { "Breve", 0xefee, 0 }, { "Ogonek", 0xeff1, 0 }, { "Cedilla", 0xeff2, 0 }, { "Ring", 0xeff3, 0 }, { "Tilde", 0xeff5, 0 }, { "Circumflex", 0xeff7, 0 }, { "dbar", 0x0111, 0 }, { "st", 0xfb06, 0 }, { "TeXtext32", 0x0337, 0 }, { "DD070", 0x2014, 0 }, { "monospacedash", 0x2014, 0 }, { "Dash1cent", 0x2015, 0 }, { "apostrophereverse", 0x201b, 0 }, { "Pts", 0x20a7, 0 }, { "SM760000", 0x2195, 0 }, { "SM770000", 0x21a8, 0 }, { "SP320000", 0x2219, 0 }, { "SD630000", 0x22c5, 0 }, { "SM790000", 0x2302, 0 }, { "caretinverted", 0x2304, 0 }, { "SM680000", 0x2310, 0 }, { "SA420000", 0x2319, 0 }, { "BorderULCorner1", 0x231c, 0 }, { "DD010", 0x231c, 0 }, { "DD101", 0x231c, 0 }, { "BorderURCorner1", 0x231d, 0 }, { "DD012", 0x231d, 0 }, { "DD104", 0x231d, 0 }, { "BorderLLCorner1", 0x231e, 0 }, { "DD014", 0x231e, 0 }, { "DD109", 0x231e, 0 }, { "BorderLRCorner1", 0x231f, 0 }, { "DD015", 0x231f, 0 }, { "DD112", 0x231f, 0 }, { "SS260000", 0x2320, 0 }, { "SS270000", 0x2321, 0 }, { "hook", 0x2440, 0 }, { "chair", 0x2441, 0 }, { "fork", 0x2442, 0 }, { "SF600000", 0x2580, 0 }, { "BorderLower1", 0x2581, 0 }, { "DD011", 0x2581, 0 }, { "DD021", 0x2581, 0 }, { "DD110", 0x2581, 0 }, { "Flower1l", 0x2581, 0 }, { "SF570000", 0x2584, 0 }, { "SF610000", 0x2588, 0 }, { "Tile", 0x2588, 0 }, { "HalfTile", 0x258c, 0 }, { "SF580000", 0x258c, 0 }, { "BorderLeftVertical1", 0x258f, 0 }, { "DD013", 0x258f, 0 }, { "DD034", 0x258f, 0 }, { "DD105", 0x258f, 0 }, { "Flower1d", 0x258f, 0 }, { "SF590000", 0x2590, 0 }, { "SF140000", 0x2591, 0 }, { "SF150000", 0x2592, 0 }, { "SF160000", 0x2593, 0 }, { "BorderUpper1", 0x2594, 0 }, { "DD024", 0x2594, 0 }, { "DD102", 0x2594, 0 }, { "BorderRightVertical1", 0x2595, 0 }, { "DD031", 0x2595, 0 }, { "DD106", 0x2595, 0 }, { "Flower2dr", 0x2595, 0 }, { "SM600000", 0x25b2, 0 }, { "SM590000", 0x25b6, 0 }, { "SV040000", 0x25bc, 0 }, { "SM630000", 0x25c0, 0 }, { "SM750000", 0x25cb, 0 }, { "SM570001", 0x25d8, 0 }, { "SM750002", 0x25d9, 0 }, { "ShootingStar", 0x2604, 0 }, { "DD130", 0x2605, 0 }, { "StarDingbat1", 0x2605, 0 }, { "TheSun", 0x2609, 0 }, { "FleuronLeft", 0x2619, 0 }, { "cross", 0x2629, 0 }, { "SS000000", 0x263a, 0 }, { "SS010000", 0x263b, 0 }, { "SM690000", 0x263c, 0 }, { "TheMoon", 0x263d, 0 }, { "Moon", 0x263e, 0 }, { "Mercury", 0x263f, 0 }, { "Venus", 0x2640, 0 }, { "Earth", 0x2641, 0 }, { "Mars", 0x2642, 0 }, { "Jupiter", 0x2643, 0 }, { "Saturn", 0x2644, 0 }, { "Uranus", 0x2645, 0 }, { "Neptune", 0x2646, 0 }, { "Pluto", 0x2647, 0 }, { "Aries", 0x2648, 0 }, { "Taurus", 0x2649, 0 }, { "Gemini", 0x264a, 0 }, { "Cancer", 0x264b, 0 }, { "Leo", 0x264c, 0 }, { "Virgo", 0x264d, 0 }, { "Libra", 0x264e, 0 }, { "Scorpio", 0x264f, 0 }, { "Sagittarius", 0x2650, 0 }, { "Capricorn", 0x2651, 0 }, { "Aquarius", 0x2652, 0 }, { "Pisces", 0x2653, 0 }, { "diamondopen", 0x2662, 0 }, { "FleuronCenter", 0x2766, 0 }, { "FleuronRight", 0x2767, 0 }, { "st1", 0xfb06, 0 }, { "zeroslash", 0xf638, 0 }, { "pi1", 0x03d6, 0 }, { "hyphen-minus", 0x002d, 0 }, { "hyphenminus", 0x002d, 0 }, { "nonmarkingreturn", 0x000d, 0 }, { "micro", 0x00b5, 0 }, { "Dmacron", 0x0110, 0 }, { "kra", 0x0138, 0 }, { "bbar", 0x0180, 0 }, { "Dbar", 0x0189, 0 }, { "deltaturn", 0x018d, 0 }, { "Eturn", 0x018e, 0 }, { "Epsilonlatin", 0x0190, 0 }, { "Gammalatin", 0x0194, 0 }, { "Iotalatin", 0x0196, 0 }, { "Ibar", 0x0197, 0 }, { "lambdabar", 0x019b, 0 }, { "mcapturn", 0x019c, 0 }, { "Nhook", 0x019d, 0 }, { "nleg", 0x019e, 0 }, { "Obar", 0x019f, 0 }, { "OI", 0x01a2, 0 }, { "YR", 0x01a6, 0 }, { "eshlooprev", 0x01aa, 0 }, { "Trthook", 0x01ae, 0 }, { "Upsilonlatin", 0x01b1, 0 }, { "Vcursive", 0x01b2, 0 }, { "Zbar", 0x01b5, 0 }, { "zbar", 0x01b6, 0 }, { "Yogh", 0x01b7, 0 }, { "Yoghrev", 0x01b8, 0 }, { "yoghrev", 0x01b9, 0 }, { "yoghtail", 0x01ba, 0 }, { "twobar", 0x01bb, 0 }, { "glottalstopbarinv", 0x01be, 0 }, { "pipe", 0x01c0, 0 }, { "pipedbl", 0x01c1, 0 }, { "pipedblbar", 0x01c2, 0 }, { "exclamlatin", 0x01c3, 0 }, { "DZhacek", 0x01c4, 0 }, { "Dzhacek", 0x01c5, 0 }, { "dzhacek", 0x01c6, 0 }, { "Ahacek", 0x01cd, 0 }, { "ahacek", 0x01ce, 0 }, { "Ihacek", 0x01cf, 0 }, { "ihacek", 0x01d0, 0 }, { "Ohacek", 0x01d1, 0 }, { "ohacek", 0x01d2, 0 }, { "Uhacek", 0x01d3, 0 }, { "uhacek", 0x01d4, 0 }, { "Udieresishacek", 0x01d9, 0 }, { "udieresishacek", 0x01da, 0 }, { "eturn", 0x01dd, 0 }, { "Gbar", 0x01e4, 0 }, { "gbar", 0x01e5, 0 }, { "Ghacek", 0x01e6, 0 }, { "ghacek", 0x01e7, 0 }, { "Khacek", 0x01e8, 0 }, { "khacek", 0x01e9, 0 }, { "Yoghhacek", 0x01ee, 0 }, { "yoghhacek", 0x01ef, 0 }, { "jhacek", 0x01f0, 0 }, { "aturn", 0x0250, 0 }, { "ascriptturn", 0x0252, 0 }, { "cturn", 0x0254, 0 }, { "drthook", 0x0256, 0 }, { "erev", 0x0258, 0 }, { "epsilonlatin", 0x025b, 0 }, { "epsilonlatinrev", 0x025c, 0 }, { "epsilonlatinrevhook", 0x025d, 0 }, { "epsilonlatinrevclosed", 0x025e, 0 }, { "jdotlessbar", 0x025f, 0 }, { "gcursive", 0x0261, 0 }, { "Gsmallcap", 0x0262, 0 }, { "gammalatin", 0x0263, 0 }, { "babygamma", 0x0264, 0 }, { "hturn", 0x0265, 0 }, { "ibar", 0x0268, 0 }, { "Ismallcap", 0x026a, 0 }, { "lmidtilde", 0x026b, 0 }, { "lrthook", 0x026d, 0 }, { "lyogh", 0x026e, 0 }, { "mturn", 0x026f, 0 }, { "mturndescend", 0x0270, 0 }, { "nlftlfthook", 0x0272, 0 }, { "nrthook", 0x0273, 0 }, { "Nsmallcap", 0x0274, 0 }, { "obar", 0x0275, 0 }, { "OEsmallcap", 0x0276, 0 }, { "omegaclosed", 0x0277, 0 }, { "rturn", 0x0279, 0 }, { "rturnascend", 0x027a, 0 }, { "rturnrthook", 0x027b, 0 }, { "rdescend", 0x027c, 0 }, { "rrthook", 0x027d, 0 }, { "rfishhookrev", 0x027f, 0 }, { "Rsmallcap", 0x0280, 0 }, { "Rsmallcapinv", 0x0281, 0 }, { "srthook", 0x0282, 0 }, { "jhookdblbar", 0x0284, 0 }, { "eshshortrev", 0x0285, 0 }, { "tturn", 0x0287, 0 }, { "trthook", 0x0288, 0 }, { "vscript", 0x028b, 0 }, { "vturn", 0x028c, 0 }, { "wturn", 0x028d, 0 }, { "yturn", 0x028e, 0 }, { "Ysmallcap", 0x028f, 0 }, { "zrthook", 0x0290, 0 }, { "yogh", 0x0292, 0 }, { "yoghcurl", 0x0293, 0 }, { "glottalstoprevinv", 0x0295, 0 }, { "glottalstopinv", 0x0296, 0 }, { "cstretch", 0x0297, 0 }, { "kiss", 0x0298, 0 }, { "Bsmallcap", 0x0299, 0 }, { "epsilonclosed", 0x029a, 0 }, { "Gsmallcaphook", 0x029b, 0 }, { "Hsmallcap", 0x029c, 0 }, { "jcrosstail", 0x029d, 0 }, { "kturn", 0x029e, 0 }, { "Lsmallcap", 0x029f, 0 }, { "glottalstopbar", 0x02a1, 0 }, { "glottalstopbarrev", 0x02a2, 0 }, { "dyogh", 0x02a4, 0 }, { "hsuper", 0x02b0, 0 }, { "hhooksuper", 0x02b1, 0 }, { "jsuper", 0x02b2, 0 }, { "rsuper", 0x02b3, 0 }, { "rturnsuper", 0x02b4, 0 }, { "rturnrthooksuper", 0x02b5, 0 }, { "Rturnsuper", 0x02b6, 0 }, { "wsuper", 0x02b7, 0 }, { "ysuper", 0x02b8, 0 }, { "primedblmod", 0x02ba, 0 }, { "quoteleftmod", 0x02bb, 0 }, { "apostrophe", 0x02bc, 0 }, { "apostropherev", 0x02bd, 0 }, { "ringrighthalfsuper", 0x02be, 0 }, { "ringlefthalfsuper", 0x02bf, 0 }, { "glottal", 0x02c0, 0 }, { "glottalrev", 0x02c1, 0 }, { "fronted", 0x02c2, 0 }, { "backed", 0x02c3, 0 }, { "raised", 0x02c4, 0 }, { "lowered", 0x02c5, 0 }, { "linevert", 0x02c8, 0 }, { "macronmodifier", 0x02c9, 0 }, { "acutemodifier", 0x02ca, 0 }, { "gravemodifier", 0x02cb, 0 }, { "linevertsub", 0x02cc, 0 }, { "macronsub", 0x02cd, 0 }, { "gravesub", 0x02ce, 0 }, { "acutesub", 0x02cf, 0 }, { "length", 0x02d0, 0 }, { "halflength", 0x02d1, 0 }, { "ringrighthalfcenter", 0x02d2, 0 }, { "ringlefthalfsup", 0x02d3, 0 }, { "tackupmid", 0x02d4, 0 }, { "tackdownmid", 0x02d5, 0 }, { "rhotichook", 0x02de, 0 }, { "gammasuper", 0x02e0, 0 }, { "lsuper", 0x02e1, 0 }, { "ssuper", 0x02e2, 0 }, { "xsuper", 0x02e3, 0 }, { "glottalrevsuper", 0x02e4, 0 }, { "toneextrahigh", 0x02e5, 0 }, { "tonehigh", 0x02e6, 0 }, { "tonemid", 0x02e7, 0 }, { "tonelow", 0x02e8, 0 }, { "toneextralow", 0x02e9, 0 }, { "gravenosp", 0x0300, 0 }, { "acutenosp", 0x0301, 0 }, { "circumflexnosp", 0x0302, 0 }, { "tildenosp", 0x0303, 0 }, { "macronnosp", 0x0304, 0 }, { "overscorenosp", 0x0305, 0 }, { "brevenosp", 0x0306, 0 }, { "dotnosp", 0x0307, 0 }, { "dieresisnosp", 0x0308, 0 }, { "hooksupnosp", 0x0309, 0 }, { "ringnosp", 0x030a, 0 }, { "acutedblnosp", 0x030b, 0 }, { "haceknosp", 0x030c, 0 }, { "linevertnosp", 0x030d, 0 }, { "linevertdblnosp", 0x030e, 0 }, { "gravedblnosp", 0x030f, 0 }, { "candrabindunosp", 0x0310, 0 }, { "breveinvnosp", 0x0311, 0 }, { "commaturnsupnosp", 0x0312, 0 }, { "apostrophesupnosp", 0x0313, 0 }, { "commasuprevnosp", 0x0314, 0 }, { "commasuprightnosp", 0x0315, 0 }, { "gravesubnosp", 0x0316, 0 }, { "acutesubnosp", 0x0317, 0 }, { "tackleftsubnosp", 0x0318, 0 }, { "tackrightsubnosp", 0x0319, 0 }, { "anglesupnosp", 0x031a, 0 }, { "hornnosp", 0x031b, 0 }, { "ringlefthalfsubnosp", 0x031c, 0 }, { "tackupsubnosp", 0x031d, 0 }, { "tackdownsubnosp", 0x031e, 0 }, { "plussubnosp", 0x031f, 0 }, { "minussubnosp", 0x0320, 0 }, { "hooksubpalatnosp", 0x0321, 0 }, { "hooksubretronosp", 0x0322, 0 }, { "dotsubnosp", 0x0323, 0 }, { "dotdblsubnosp", 0x0324, 0 }, { "ringsubnosp", 0x0325, 0 }, { "commasubnosp", 0x0326, 0 }, { "cedillanosp", 0x0327, 0 }, { "ogoneknosp", 0x0328, 0 }, { "linevertsubnosp", 0x0329, 0 }, { "bridgesubnosp", 0x032a, 0 }, { "archdblsubnosp", 0x032b, 0 }, { "haceksubnosp", 0x032c, 0 }, { "circumflexsubnosp", 0x032d, 0 }, { "brevesubnosp", 0x032e, 0 }, { "breveinvsubnosp", 0x032f, 0 }, { "tildesubnosp", 0x0330, 0 }, { "macronsubnosp", 0x0331, 0 }, { "underscorenosp", 0x0332, 0 }, { "underscoredblnosp", 0x0333, 0 }, { "tildemidnosp", 0x0334, 0 }, { "barmidshortnosp", 0x0335, 0 }, { "barmidlongnosp", 0x0336, 0 }, { "slashshortnosp", 0x0337, 0 }, { "slashlongnosp", 0x0338, 0 }, { "ringrighthalfsubnosp", 0x0339, 0 }, { "bridgeinvsubnosp", 0x033a, 0 }, { "squaresubnosp", 0x033b, 0 }, { "seagullsubnosp", 0x033c, 0 }, { "xsupnosp", 0x033d, 0 }, { "tildevertsupnosp", 0x033e, 0 }, { "overscoredblnosp", 0x033f, 0 }, { "graveleftnosp", 0x0340, 0 }, { "acuterightnosp", 0x0341, 0 }, { "wavyoverscorenosp", 0x0342, 0 }, { "zigzagoverscorenosp", 0x0343, 0 }, { "diaeresistonosnosp", 0x0344, 0 }, { "iotasubnosp", 0x0345, 0 }, { "iotasub", 0x037a, 0 }, { "diaeresistonos", 0x0385, 0 }, { "iotadiaeresistonos", 0x0390, 0 }, { "Iotadiaeresis", 0x03aa, 0 }, { "Upsilondiaeresis", 0x03ab, 0 }, { "upsilondiaeresistonos", 0x03b0, 0 }, { "iotadiaeresis", 0x03ca, 0 }, { "upsilondiaeresis", 0x03cb, 0 }, { "betacurled", 0x03d0, 0 }, { "thetascript", 0x03d1, 0 }, { "Upsilonhook", 0x03d2, 0 }, { "Upsilonhooktonos", 0x03d3, 0 }, { "Upsilonhookdiaeresis", 0x03d4, 0 }, { "phiscript", 0x03d5, 0 }, { "omegapi", 0x03d6, 0 }, { "Stigma", 0x03da, 0 }, { "stigma", 0x03db, 0 }, { "Digamma", 0x03dc, 0 }, { "digamma", 0x03dd, 0 }, { "Koppa", 0x03de, 0 }, { "koppa", 0x03df, 0 }, { "Sampi", 0x03e0, 0 }, { "sampi", 0x03e1, 0 }, { "Shei", 0x03e2, 0 }, { "shei", 0x03e3, 0 }, { "Fei", 0x03e4, 0 }, { "fei", 0x03e5, 0 }, { "Khei", 0x03e6, 0 }, { "khei", 0x03e7, 0 }, { "Hori", 0x03e8, 0 }, { "hori", 0x03e9, 0 }, { "Gangia", 0x03ea, 0 }, { "gangia", 0x03eb, 0 }, { "Shima", 0x03ec, 0 }, { "shima", 0x03ed, 0 }, { "Dei", 0x03ee, 0 }, { "dei", 0x03ef, 0 }, { "kappascript", 0x03f0, 0 }, { "sigmalunate", 0x03f2, 0 }, { "Io", 0x0401, 0 }, { "Dje", 0x0402, 0 }, { "Gje", 0x0403, 0 }, { "Ecyril", 0x0404, 0 }, { "Dze", 0x0405, 0 }, { "Icyril", 0x0406, 0 }, { "Yi", 0x0407, 0 }, { "Je", 0x0408, 0 }, { "Lje", 0x0409, 0 }, { "Nje", 0x040a, 0 }, { "Tshe", 0x040b, 0 }, { "Kje", 0x040c, 0 }, { "Ucyrilbreve", 0x040e, 0 }, { "Dzhe", 0x040f, 0 }, { "Acyril", 0x0410, 0 }, { "Be", 0x0411, 0 }, { "Ve", 0x0412, 0 }, { "Ge", 0x0413, 0 }, { "De", 0x0414, 0 }, { "Ie", 0x0415, 0 }, { "Zhe", 0x0416, 0 }, { "Ze", 0x0417, 0 }, { "Ii", 0x0418, 0 }, { "Iibreve", 0x0419, 0 }, { "Ka", 0x041a, 0 }, { "El", 0x041b, 0 }, { "Em", 0x041c, 0 }, { "En", 0x041d, 0 }, { "Ocyril", 0x041e, 0 }, { "Pecyril", 0x041f, 0 }, { "Er", 0x0420, 0 }, { "Es", 0x0421, 0 }, { "Te", 0x0422, 0 }, { "Ucyril", 0x0423, 0 }, { "Ef", 0x0424, 0 }, { "Kha", 0x0425, 0 }, { "Tse", 0x0426, 0 }, { "Che", 0x0427, 0 }, { "Sha", 0x0428, 0 }, { "Shcha", 0x0429, 0 }, { "Hard", 0x042a, 0 }, { "Yeri", 0x042b, 0 }, { "Soft", 0x042c, 0 }, { "Ecyrilrev", 0x042d, 0 }, { "Iu", 0x042e, 0 }, { "Ia", 0x042f, 0 }, { "acyril", 0x0430, 0 }, { "be", 0x0431, 0 }, { "ve", 0x0432, 0 }, { "ge", 0x0433, 0 }, { "de", 0x0434, 0 }, { "ie", 0x0435, 0 }, { "zhe", 0x0436, 0 }, { "ze", 0x0437, 0 }, { "ii", 0x0438, 0 }, { "iibreve", 0x0439, 0 }, { "ka", 0x043a, 0 }, { "el", 0x043b, 0 }, { "em", 0x043c, 0 }, { "en", 0x043d, 0 }, { "ocyril", 0x043e, 0 }, { "pecyril", 0x043f, 0 }, { "er", 0x0440, 0 }, { "es", 0x0441, 0 }, { "te", 0x0442, 0 }, { "ucyril", 0x0443, 0 }, { "ef", 0x0444, 0 }, { "kha", 0x0445, 0 }, { "tse", 0x0446, 0 }, { "che", 0x0447, 0 }, { "sha", 0x0448, 0 }, { "shcha", 0x0449, 0 }, { "hard", 0x044a, 0 }, { "yeri", 0x044b, 0 }, { "soft", 0x044c, 0 }, { "ecyrilrev", 0x044d, 0 }, { "iu", 0x044e, 0 }, { "ia", 0x044f, 0 }, { "io", 0x0451, 0 }, { "dje", 0x0452, 0 }, { "gje", 0x0453, 0 }, { "ecyril", 0x0454, 0 }, { "dze", 0x0455, 0 }, { "icyril", 0x0456, 0 }, { "yi", 0x0457, 0 }, { "je", 0x0458, 0 }, { "lje", 0x0459, 0 }, { "nje", 0x045a, 0 }, { "tshe", 0x045b, 0 }, { "kje", 0x045c, 0 }, { "ucyrilbreve", 0x045e, 0 }, { "dzhe", 0x045f, 0 }, { "Yat", 0x0462, 0 }, { "yat", 0x0463, 0 }, { "Yusbig", 0x046a, 0 }, { "yusbig", 0x046b, 0 }, { "Psicyril", 0x0470, 0 }, { "psicyril", 0x0471, 0 }, { "Fita", 0x0472, 0 }, { "fita", 0x0473, 0 }, { "Izhitsa", 0x0474, 0 }, { "izhitsa", 0x0475, 0 }, { "Izhitsagravedbl", 0x0476, 0 }, { "izhitsagravedbl", 0x0477, 0 }, { "Digraphuk", 0x0478, 0 }, { "digraphuk", 0x0479, 0 }, { "Omegaround", 0x047a, 0 }, { "omegaround", 0x047b, 0 }, { "Omegatitlo", 0x047c, 0 }, { "omegatitlo", 0x047d, 0 }, { "OT", 0x047e, 0 }, { "ot", 0x047f, 0 }, { "Geupturn", 0x0490, 0 }, { "geupturn", 0x0491, 0 }, { "Gebar", 0x0492, 0 }, { "gebar", 0x0493, 0 }, { "Gehook", 0x0494, 0 }, { "gehook", 0x0495, 0 }, { "Zhertdes", 0x0496, 0 }, { "zhertdes", 0x0497, 0 }, { "Zecedilla", 0x0498, 0 }, { "zecedilla", 0x0499, 0 }, { "Kartdes", 0x049a, 0 }, { "kartdes", 0x049b, 0 }, { "Kavertbar", 0x049c, 0 }, { "kavertbar", 0x049d, 0 }, { "Kabar", 0x049e, 0 }, { "kabar", 0x049f, 0 }, { "GeKarev", 0x04a0, 0 }, { "gekarev", 0x04a1, 0 }, { "Enrtdes", 0x04a2, 0 }, { "enrtdes", 0x04a3, 0 }, { "EnGe", 0x04a4, 0 }, { "enge", 0x04a5, 0 }, { "Pehook", 0x04a6, 0 }, { "pehook", 0x04a7, 0 }, { "Ohook", 0x04a8, 0 }, { "ohook", 0x04a9, 0 }, { "Escedilla", 0x04aa, 0 }, { "escedilla", 0x04ab, 0 }, { "Tertdes", 0x04ac, 0 }, { "tertdes", 0x04ad, 0 }, { "Ustrt", 0x04ae, 0 }, { "ustrt", 0x04af, 0 }, { "Ustrtbar", 0x04b0, 0 }, { "ustrtbar", 0x04b1, 0 }, { "Khartdes", 0x04b2, 0 }, { "khartdes", 0x04b3, 0 }, { "TeTse", 0x04b4, 0 }, { "tetse", 0x04b5, 0 }, { "Chertdes", 0x04b6, 0 }, { "chertdes", 0x04b7, 0 }, { "Chevertbar", 0x04b8, 0 }, { "chevertbar", 0x04b9, 0 }, { "Hcyril", 0x04ba, 0 }, { "hcyril", 0x04bb, 0 }, { "Iehook", 0x04bc, 0 }, { "iehook", 0x04bd, 0 }, { "Iehookogonek", 0x04be, 0 }, { "iehookogonek", 0x04bf, 0 }, { "Icyril1", 0x04c0, 0 }, { "Zhebreve", 0x04c1, 0 }, { "zhebreve", 0x04c2, 0 }, { "Kahook", 0x04c3, 0 }, { "kahook", 0x04c4, 0 }, { "Enhook", 0x04c7, 0 }, { "enhook", 0x04c8, 0 }, { "Cheleftdes", 0x04cb, 0 }, { "cheleftdes", 0x04cc, 0 }, { "qibuts", 0x05bb, 0 }, { "meteg", 0x05bd, 0 }, { "maqaf", 0x05be, 0 }, { "paseq", 0x05c0, 0 }, { "shindot", 0x05c1, 0 }, { "sindot", 0x05c2, 0 }, { "sofpasuq", 0x05c3, 0 }, { "kaffinal", 0x05da, 0 }, { "memfinal", 0x05dd, 0 }, { "nunfinal", 0x05df, 0 }, { "pefinal", 0x05e3, 0 }, { "tsadifinal", 0x05e5, 0 }, { "vavdbl", 0x05f0, 0 }, { "vavyod", 0x05f1, 0 }, { "yoddbl", 0x05f2, 0 }, { "geresh", 0x05f3, 0 }, { "gershayim", 0x05f4, 0 }, { "varika", 0x05f5, 0 }, { "enquad", 0x2000, 0 }, { "emquad", 0x2001, 0 }, { "emspace", 0x2003, 0 }, { "threeperemspace", 0x2004, 0 }, { "fourperemspace", 0x2005, 0 }, { "sixperemspace", 0x2006, 0 }, { "figurespace", 0x2007, 0 }, { "punctuationspace", 0x2008, 0 }, { "thinspace", 0x2009, 0 }, { "hairspace", 0x200a, 0 }, { "zerospace", 0x200b, 0 }, { "zeronojoin", 0x200c, 0 }, { "zerojoin", 0x200d, 0 }, { "hyphennobreak", 0x2011, 0 }, { "quotedash", 0x2015, 0 }, { "dashdbl", 0x2016, 0 }, { "quotesinglrev", 0x201b, 0 }, { "quotedblrev", 0x201f, 0 }, { "trianglebullet", 0x2023, 0 }, { "onedotlead", 0x2024, 0 }, { "twodotlead", 0x2025, 0 }, { "hyphendot", 0x2027, 0 }, { "lineseparator", 0x2028, 0 }, { "paragraphseparator", 0x2029, 0 }, { "lre", 0x202a, 0 }, { "rle", 0x202b, 0 }, { "pdf", 0x202c, 0 }, { "lro", 0x202d, 0 }, { "rlo", 0x202e, 0 }, { "pertenthousand", 0x2031, 0 }, { "prime", 0x2032, 0 }, { "primedbl", 0x2033, 0 }, { "primetriple", 0x2034, 0 }, { "primerev", 0x2035, 0 }, { "primedblrev", 0x2036, 0 }, { "primetriplerev", 0x2037, 0 }, { "caret", 0x2038, 0 }, { "refmark", 0x203b, 0 }, { "interrobang", 0x203d, 0 }, { "tie", 0x2040, 0 }, { "caretinsert", 0x2041, 0 }, { "hyphenbullet", 0x2043, 0 }, { "minussuperior", 0x207b, 0 }, { "plusinferior", 0x208a, 0 }, { "equalinferior", 0x208c, 0 }, { "eurocurrency", 0x20a0, 0 }, { "coloncurrency", 0x20a1, 0 }, { "mill", 0x20a5, 0 }, { "naira", 0x20a6, 0 }, { "pesetas", 0x20a7, 0 }, { "rupee", 0x20a8, 0 }, { "newsheqel", 0x20aa, 0 }, { "accountof", 0x2100, 0 }, { "addresssubject", 0x2101, 0 }, { "Cbb", 0x2102, 0 }, { "degreecentigrade", 0x2103, 0 }, { "CL", 0x2104, 0 }, { "cadauna", 0x2106, 0 }, { "Euler", 0x2107, 0 }, { "scruple", 0x2108, 0 }, { "degreefarenheit", 0x2109, 0 }, { "Hscript", 0x210b, 0 }, { "Hblackletter", 0x210c, 0 }, { "Hbb", 0x210d, 0 }, { "planck", 0x210e, 0 }, { "planckover2pi", 0x210f, 0 }, { "Iscript", 0x2110, 0 }, { "Lscript", 0x2112, 0 }, { "lscript", 0x2113, 0 }, { "lbbar", 0x2114, 0 }, { "Nbb", 0x2115, 0 }, { "recordright", 0x2117, 0 }, { "Pbb", 0x2119, 0 }, { "Qbb", 0x211a, 0 }, { "Rscript", 0x211b, 0 }, { "Rfractur", 0x211c, 0 }, { "Rbb", 0x211d, 0 }, { "Rx", 0x211e, 0 }, { "response", 0x211f, 0 }, { "servicemark", 0x2120, 0 }, { "tel", 0x2121, 0 }, { "versicle", 0x2123, 0 }, { "Zbb", 0x2124, 0 }, { "ounce", 0x2125, 0 }, { "ohm", 0x2126, 0 }, { "mho", 0x2127, 0 }, { "Zblackletter", 0x2128, 0 }, { "iotaturn", 0x2129, 0 }, { "degreekelvin", 0x212a, 0 }, { "Bscript", 0x212c, 0 }, { "Cblackletter", 0x212d, 0 }, { "escript", 0x212f, 0 }, { "Escript", 0x2130, 0 }, { "Fscript", 0x2131, 0 }, { "Fturn", 0x2132, 0 }, { "Mscript", 0x2133, 0 }, { "u0scrip", 0x2134, 0 }, { "alephmath", 0x2135, 0 }, { "gimelmath", 0x2137, 0 }, { "dalethmath", 0x2138, 0 }, { "twothird", 0x2154, 0 }, { "onefifth", 0x2155, 0 }, { "twofifths", 0x2156, 0 }, { "threefifths", 0x2157, 0 }, { "fourfifths", 0x2158, 0 }, { "onesixth", 0x2159, 0 }, { "fivesixths", 0x215a, 0 }, { "onenumerator", 0x215f, 0 }, { "arrowlongboth", 0x2194, 0 }, { "arrowlongbothv", 0x2195, 0 }, { "arrownorthwest", 0x2196, 0 }, { "arrownortheast", 0x2197, 0 }, { "arrowsoutheast", 0x2198, 0 }, { "arrowsouthwest", 0x2199, 0 }, { "arrowleftnot", 0x219a, 0 }, { "arrowrightnot", 0x219b, 0 }, { "arrowwaveleft", 0x219c, 0 }, { "arrowwaveright", 0x219d, 0 }, { "dblarrowheadleft", 0x219e, 0 }, { "dblarrowheadup", 0x219f, 0 }, { "dblarrowheadright", 0x21a0, 0 }, { "dblarrowheaddown", 0x21a1, 0 }, { "arrowtailleft", 0x21a2, 0 }, { "arrowtailright", 0x21a3, 0 }, { "arrowbarleft", 0x21a4, 0 }, { "arrowbarup", 0x21a5, 0 }, { "arrowbarright", 0x21a6, 0 }, { "arrowbardown", 0x21a7, 0 }, { "arrowbothvbase", 0x21a8, 0 }, { "arrowhookleft", 0x21a9, 0 }, { "arrowhookright", 0x21aa, 0 }, { "arrowloopleft", 0x21ab, 0 }, { "arrowloopright", 0x21ac, 0 }, { "arrowwaveboth", 0x21ad, 0 }, { "arrowlongbothnot", 0x21ae, 0 }, { "arrowzigzag", 0x21af, 0 }, { "arrowrightdown", 0x21b4, 0 }, { "carriagerreturn", 0x21b5, 0 }, { "arrowsemanticlockw", 0x21b6, 0 }, { "arrowsemclockw", 0x21b7, 0 }, { "home", 0x21b8, 0 }, { "tableftright", 0x21b9, 0 }, { "arrowanticlockw", 0x21ba, 0 }, { "arrowclockw", 0x21bb, 0 }, { "arrowlefttophalf", 0x21bc, 0 }, { "arrowleftbothalf", 0x21bd, 0 }, { "harpoonupright", 0x21be, 0 }, { "harpoonupleft", 0x21bf, 0 }, { "arrowrighttophalf", 0x21c0, 0 }, { "arrowrightbothalf", 0x21c1, 0 }, { "harpoondownright", 0x21c2, 0 }, { "harpoondownleft", 0x21c3, 0 }, { "arrowparrrightleft", 0x21c4, 0 }, { "dblarrowupdown", 0x21c5, 0 }, { "arrowparrleftright", 0x21c6, 0 }, { "dblarrowup", 0x21c8, 0 }, { "dblarrowdown", 0x21ca, 0 }, { "harpoonleftright", 0x21cb, 0 }, { "harpoonrightleft", 0x21cc, 0 }, { "arrowdblleftnot", 0x21cd, 0 }, { "arrowdbllongbothnot", 0x21ce, 0 }, { "arrowdblrightnot", 0x21cf, 0 }, { "arrowdbllongboth", 0x21d4, 0 }, { "arrowdbllongbothv", 0x21d5, 0 }, { "arrowdblnw", 0x21d6, 0 }, { "arrowdblne", 0x21d7, 0 }, { "arrowdblse", 0x21d8, 0 }, { "arrowdblsw", 0x21d9, 0 }, { "arrowtripleleft", 0x21da, 0 }, { "arrowtripleright", 0x21db, 0 }, { "arrowsquiggleleft", 0x21dc, 0 }, { "arrowsquiggleright", 0x21dd, 0 }, { "arrowopenleft", 0x21e6, 0 }, { "arrowopenup", 0x21e7, 0 }, { "arrowopenright", 0x21e8, 0 }, { "arrowopendown", 0x21e9, 0 }, { "complement", 0x2201, 0 }, { "notexistential", 0x2204, 0 }, { "elementsmall", 0x220a, 0 }, { "owner", 0x220b, 0 }, { "notowner", 0x220c, 0 }, { "ownersmall", 0x220d, 0 }, { "eop", 0x220e, 0 }, { "coproduct", 0x2210, 0 }, { "dotplus", 0x2214, 0 }, { "slashmath", 0x2215, 0 }, { "backslashmath", 0x2216, 0 }, { "ringoperator", 0x2218, 0 }, { "bulletmath", 0x2219, 0 }, { "cuberoot", 0x221b, 0 }, { "fourthroot", 0x221c, 0 }, { "measuredangle", 0x2221, 0 }, { "sphericalangle", 0x2222, 0 }, { "notbar", 0x2224, 0 }, { "parallelto", 0x2225, 0 }, { "notbardbl", 0x2226, 0 }, { "integraldbl", 0x222c, 0 }, { "integraltrpl", 0x222d, 0 }, { "contintegral", 0x222e, 0 }, { "surfintegral", 0x222f, 0 }, { "volintegral", 0x2230, 0 }, { "clwintegral", 0x2231, 0 }, { "clwcontintegral", 0x2232, 0 }, { "cclwcontintegral", 0x2233, 0 }, { "dotminus", 0x2238, 0 }, { "excess", 0x2239, 0 }, { "geomproportion", 0x223a, 0 }, { "homothetic", 0x223b, 0 }, { "revsimilar", 0x223d, 0 }, { "lazysinv", 0x223e, 0 }, { "sine", 0x223f, 0 }, { "wreathproduct", 0x2240, 0 }, { "notsimilar", 0x2241, 0 }, { "minustilde", 0x2242, 0 }, { "asymptequal", 0x2243, 0 }, { "notasymptequal", 0x2244, 0 }, { "approxorequal", 0x2245, 0 }, { "approxnotequal", 0x2246, 0 }, { "notapproxequal", 0x2247, 0 }, { "almostequal", 0x2248, 0 }, { "notalmostequal", 0x2249, 0 }, { "almostorequal", 0x224a, 0 }, { "tildetrpl", 0x224b, 0 }, { "equivasymptotic", 0x224d, 0 }, { "geomequivalent", 0x224e, 0 }, { "difference", 0x224f, 0 }, { "approachlimit", 0x2250, 0 }, { "geomequal", 0x2251, 0 }, { "imageorapproxequal", 0x2253, 0 }, { "colonequal", 0x2254, 0 }, { "equalcolon", 0x2255, 0 }, { "ringinequal", 0x2256, 0 }, { "ringequal", 0x2257, 0 }, { "corresponds", 0x2258, 0 }, { "estimates", 0x2259, 0 }, { "equiangular", 0x225a, 0 }, { "starequal", 0x225b, 0 }, { "deltaequal", 0x225c, 0 }, { "definequal", 0x225d, 0 }, { "measurequal", 0x225e, 0 }, { "questionequal", 0x225f, 0 }, { "notequivalence", 0x2262, 0 }, { "strictequivalence", 0x2263, 0 }, { "lessdblequal", 0x2266, 0 }, { "greaterdblequal", 0x2267, 0 }, { "lessnotdblequal", 0x2268, 0 }, { "greaternotdblequal", 0x2269, 0 }, { "lessmuch", 0x226a, 0 }, { "greatermuch", 0x226b, 0 }, { "between", 0x226c, 0 }, { "notequivasymptotic", 0x226d, 0 }, { "notlessequal", 0x2270, 0 }, { "notgreaterequal", 0x2271, 0 }, { "lessequivlnt", 0x2272, 0 }, { "greaterequivlnt", 0x2273, 0 }, { "notlessequivlnt", 0x2274, 0 }, { "notgreaterequivlnt", 0x2275, 0 }, { "notlessgreater", 0x2278, 0 }, { "notgreaterless", 0x2279, 0 }, { "follows", 0x227b, 0 }, { "precedesequal", 0x227c, 0 }, { "followsequal", 0x227d, 0 }, { "precedequivlnt", 0x227e, 0 }, { "followsequivlnt", 0x227f, 0 }, { "notpreceeds", 0x2280, 0 }, { "notfollows", 0x2281, 0 }, { "notpropersubset", 0x2284, 0 }, { "notpropersuperset", 0x2285, 0 }, { "notreflexsubset", 0x2288, 0 }, { "notreflexsuperset", 0x2289, 0 }, { "multiset", 0x228c, 0 }, { "multiplymultiset", 0x228d, 0 }, { "unionmulti", 0x228e, 0 }, { "squareimage", 0x228f, 0 }, { "squareoriginal", 0x2290, 0 }, { "subsetsqequal", 0x2291, 0 }, { "supersetsqequal", 0x2292, 0 }, { "intersectionsq", 0x2293, 0 }, { "unionsq", 0x2294, 0 }, { "circleminus", 0x2296, 0 }, { "circledivide", 0x2298, 0 }, { "circledot", 0x2299, 0 }, { "circlering", 0x229a, 0 }, { "circleasterisk", 0x229b, 0 }, { "circleequal", 0x229c, 0 }, { "circlevertbar", 0x229d, 0 }, { "squareplus", 0x229e, 0 }, { "squareminus", 0x229f, 0 }, { "squaremultiply", 0x22a0, 0 }, { "squaredot", 0x22a1, 0 }, { "turnstileleft", 0x22a2, 0 }, { "turnstileright", 0x22a3, 0 }, { "latticetop", 0x22a4, 0 }, { "assertion", 0x22a6, 0 }, { "truestate", 0x22a7, 0 }, { "satisfy", 0x22a8, 0 }, { "force", 0x22a9, 0 }, { "tacktrpl", 0x22aa, 0 }, { "forceextr", 0x22ab, 0 }, { "notturnstileleft", 0x22ac, 0 }, { "notsatisfy", 0x22ad, 0 }, { "notforce", 0x22ae, 0 }, { "notforceextr", 0x22af, 0 }, { "lowerrank", 0x22b0, 0 }, { "higherrank", 0x22b1, 0 }, { "triangleright", 0x22b2, 0 }, { "triangleleft", 0x22b3, 0 }, { "triangleftequal", 0x22b4, 0 }, { "triangrightequal", 0x22b5, 0 }, { "original", 0x22b6, 0 }, { "image", 0x22b7, 0 }, { "multimap", 0x22b8, 0 }, { "hermitconjmatrix", 0x22b9, 0 }, { "intercal", 0x22ba, 0 }, { "xor", 0x22bb, 0 }, { "nand", 0x22bc, 0 }, { "nor", 0x22bd, 0 }, { "rightanglearc", 0x22be, 0 }, { "narylogicaland", 0x22c0, 0 }, { "narylogicalor", 0x22c1, 0 }, { "naryintersection", 0x22c2, 0 }, { "naryunion", 0x22c3, 0 }, { "diamondmath", 0x22c4, 0 }, { "divideonmultiply", 0x22c7, 0 }, { "bowtie", 0x22c8, 0 }, { "multicloseleft", 0x22c9, 0 }, { "multicloseright", 0x22ca, 0 }, { "multiopenleft", 0x22cb, 0 }, { "multiopenright", 0x22cc, 0 }, { "revasymptequal", 0x22cd, 0 }, { "curlor", 0x22ce, 0 }, { "curland", 0x22cf, 0 }, { "subsetdbl", 0x22d0, 0 }, { "supersetdbl", 0x22d1, 0 }, { "uniondbl", 0x22d2, 0 }, { "intersectiondbl", 0x22d3, 0 }, { "fork", 0x22d4, 0 }, { "equalparallel", 0x22d5, 0 }, { "lessdot", 0x22d6, 0 }, { "greaterdot", 0x22d7, 0 }, { "verymuchless", 0x22d8, 0 }, { "verymuchgreater", 0x22d9, 0 }, { "lessequalgreater", 0x22da, 0 }, { "greaterequalless", 0x22db, 0 }, { "equalless", 0x22dc, 0 }, { "equalgreater", 0x22dd, 0 }, { "equalprecedes", 0x22de, 0 }, { "equalfollows", 0x22df, 0 }, { "preceedsnotequal", 0x22e0, 0 }, { "followsnotequal", 0x22e1, 0 }, { "notsubsetsqequal", 0x22e2, 0 }, { "notsupersetsqequal", 0x22e3, 0 }, { "sqimageornotequal", 0x22e4, 0 }, { "sqoriginornotequal", 0x22e5, 0 }, { "lessnotequivlnt", 0x22e6, 0 }, { "greaternotequivlnt", 0x22e7, 0 }, { "preceedsnotsimilar", 0x22e8, 0 }, { "followsnotequivlnt", 0x22e9, 0 }, { "nottriangleleft", 0x22ea, 0 }, { "nottriangleright", 0x22eb, 0 }, { "nottriangleleftequal", 0x22ec, 0 }, { "nottrianglerightequal", 0x22ed, 0 }, { "vertellipsis", 0x22ee, 0 }, { "midhorizellipsis", 0x22ef, 0 }, { "upslopeellipsis", 0x22f0, 0 }, { "downslopeellipsis", 0x22f1, 0 }, { "perspcorrespond", 0x2306, 0 }, { "ceilingleft", 0x2308, 0 }, { "ceilingright", 0x2309, 0 }, { "floorleft", 0x230a, 0 }, { "floorright", 0x230b, 0 }, { "slurabove", 0x2322, 0 }, { "slurbelow", 0x2323, 0 }, { "null", 0x2400, 0 }, { "startofhead", 0x2401, 0 }, { "starttext", 0x2402, 0 }, { "endtext", 0x2403, 0 }, { "endtrans", 0x2404, 0 }, { "enquiry", 0x2405, 0 }, { "acknowledge", 0x2406, 0 }, { "bell", 0x2407, 0 }, { "backspace", 0x2408, 0 }, { "horiztab", 0x2409, 0 }, { "linefeed", 0x240a, 0 }, { "verttab", 0x240b, 0 }, { "formfeed", 0x240c, 0 }, { "shiftout", 0x240e, 0 }, { "shiftin", 0x240f, 0 }, { "datalinkescape", 0x2410, 0 }, { "devcon1", 0x2411, 0 }, { "devcon2", 0x2412, 0 }, { "devcon3", 0x2413, 0 }, { "devcon4", 0x2414, 0 }, { "negacknowledge", 0x2415, 0 }, { "synch", 0x2416, 0 }, { "endtransblock", 0x2417, 0 }, { "cancel", 0x2418, 0 }, { "endmedium", 0x2419, 0 }, { "substitute", 0x241a, 0 }, { "escape", 0x241b, 0 }, { "fileseparator", 0x241c, 0 }, { "groupseparator", 0x241d, 0 }, { "recordseparator", 0x241e, 0 }, { "unitseparator", 0x241f, 0 }, { "spaceliteral", 0x2420, 0 }, { "delete", 0x2421, 0 }, { "blankb", 0x2422, 0 }, { "spaceopenbox", 0x2423, 0 }, { "newline", 0x2424, 0 }, { "lthorizform", 0x2500, 0 }, { "hvhorizform", 0x2501, 0 }, { "ltvertform", 0x2502, 0 }, { "hvvertform", 0x2503, 0 }, { "ltdashtriphorizform", 0x2504, 0 }, { "hvdashtriphorizform", 0x2505, 0 }, { "ltdashtripvertform", 0x2506, 0 }, { "hvdashtripvertform", 0x2507, 0 }, { "ltdashquadhorizform", 0x2508, 0 }, { "hvdashquadhorizform", 0x2509, 0 }, { "ltdashquadvertform", 0x250a, 0 }, { "hvdashquadvertform", 0x250b, 0 }, { "ltdnrtform", 0x250c, 0 }, { "dnltrthvform", 0x250d, 0 }, { "dnhvrtltform", 0x250e, 0 }, { "hvdnrtform", 0x250f, 0 }, { "ltdnleftform", 0x2510, 0 }, { "dnltlefthvform", 0x2511, 0 }, { "dnhvleftltform", 0x2512, 0 }, { "hvdnleftform", 0x2513, 0 }, { "ltuprtform", 0x2514, 0 }, { "upltrthvform", 0x2515, 0 }, { "uphvrtltform", 0x2516, 0 }, { "hvuprtform", 0x2517, 0 }, { "ltupleftform", 0x2518, 0 }, { "upltlefthvform", 0x2519, 0 }, { "uphvleftltform", 0x251a, 0 }, { "hvupleftform", 0x251b, 0 }, { "ltvertrightform", 0x251c, 0 }, { "vertltrthvform", 0x251d, 0 }, { "uphvrtdnltform", 0x251e, 0 }, { "dnhvrtupltform", 0x251f, 0 }, { "verthvrtltform", 0x2520, 0 }, { "dnltrtuphvform", 0x2521, 0 }, { "upltrtdnhvform", 0x2522, 0 }, { "hvvertrtform", 0x2523, 0 }, { "ltvertleftform", 0x2524, 0 }, { "vtltlefthvform", 0x2525, 0 }, { "uphvleftdnltform", 0x2526, 0 }, { "dnhvleftupltform", 0x2527, 0 }, { "verthvleftltform", 0x2528, 0 }, { "dnltleftuphvform", 0x2529, 0 }, { "upltleftdnhvform", 0x252a, 0 }, { "hvvertleftform", 0x252b, 0 }, { "ltdnhorizform", 0x252c, 0 }, { "lefthvrtdnltform", 0x252d, 0 }, { "rthvleftdnltform", 0x252e, 0 }, { "dnlthorizhvform", 0x252f, 0 }, { "dnhvhorizltform", 0x2530, 0 }, { "rtltrtdnhvform", 0x2531, 0 }, { "leftltrtdnhvform", 0x2532, 0 }, { "hvdnhorizform", 0x2533, 0 }, { "ltuphorizform", 0x2534, 0 }, { "lefthvrtupltform", 0x2535, 0 }, { "rthvleftupltform", 0x2536, 0 }, { "uplthorizhvform", 0x2537, 0 }, { "uphvhorizltform", 0x2538, 0 }, { "rtltleftuphvform", 0x2539, 0 }, { "leftltrtuphvform", 0x253a, 0 }, { "hvuphorizform", 0x253b, 0 }, { "ltverthorizform", 0x253c, 0 }, { "lefthvrtvertltform", 0x253d, 0 }, { "rthvleftvertltform", 0x253e, 0 }, { "vertlthorizhvform", 0x253f, 0 }, { "uphvdnhorizltform", 0x2540, 0 }, { "dnhvuphorizltform", 0x2541, 0 }, { "verthvhorizltform", 0x2542, 0 }, { "leftuphvrtdnltform", 0x2543, 0 }, { "rtuphvleftdnltform", 0x2544, 0 }, { "leftdnhvrtupltform", 0x2545, 0 }, { "rtdnhvleftupltform", 0x2546, 0 }, { "dnltuphorizhvform", 0x2547, 0 }, { "upltdnhorizhvform", 0x2548, 0 }, { "rtltleftverthvform", 0x2549, 0 }, { "leftltrtverthvform", 0x254a, 0 }, { "hvverthorizform", 0x254b, 0 }, { "ltdashdblhorizform", 0x254c, 0 }, { "hvdashdblhorizform", 0x254d, 0 }, { "ltdashdblvertform", 0x254e, 0 }, { "hvdashdblvertform", 0x254f, 0 }, { "horizdblbar", 0x2550, 0 }, { "vertdblbar", 0x2551, 0 }, { "dnrtdblform", 0x2552, 0 }, { "dndblrtform", 0x2553, 0 }, { "dbldnrtform", 0x2554, 0 }, { "dnleftdblform", 0x2555, 0 }, { "dndblleftform", 0x2556, 0 }, { "dbldnleftform", 0x2557, 0 }, { "uprtdblform", 0x2558, 0 }, { "updblrtform", 0x2559, 0 }, { "dbluprtform", 0x255a, 0 }, { "upleftdblform", 0x255b, 0 }, { "updblleftform", 0x255c, 0 }, { "dblupleftform", 0x255d, 0 }, { "vertrtdblform", 0x255e, 0 }, { "vertdblrtform", 0x255f, 0 }, { "dblvertrtform", 0x2560, 0 }, { "vertleftdblform", 0x2561, 0 }, { "vertdblleftform", 0x2562, 0 }, { "dblvertleftform", 0x2563, 0 }, { "dnhorizdblform", 0x2564, 0 }, { "dndblhorizform", 0x2565, 0 }, { "dbldnhorizform", 0x2566, 0 }, { "uphorizdblform", 0x2567, 0 }, { "updblhorizform", 0x2568, 0 }, { "dbluphorizform", 0x2569, 0 }, { "verthorizdblform", 0x256a, 0 }, { "vertdblhorizform", 0x256b, 0 }, { "dblverthorizform", 0x256c, 0 }, { "ltarcdnrtform", 0x256d, 0 }, { "ltarcdnleftform", 0x256e, 0 }, { "ltarcupleftform", 0x256f, 0 }, { "ltarcuprtform", 0x2570, 0 }, { "forwarddiagonal", 0x2571, 0 }, { "backwarddiagonal", 0x2572, 0 }, { "ltdiagonalcross", 0x2573, 0 }, { "dneighthblock", 0x2581, 0 }, { "dnquarterblock", 0x2582, 0 }, { "dnthreeeighthblock", 0x2583, 0 }, { "dnfiveeighthblock", 0x2585, 0 }, { "dnthreequarterblock", 0x2586, 0 }, { "dnseveneighthblock", 0x2587, 0 }, { "lfseveneighthblock", 0x2589, 0 }, { "lfthreequarterblock", 0x258a, 0 }, { "lffiveeighthblock", 0x258b, 0 }, { "lfthreeeighthblock", 0x258d, 0 }, { "lfquarterblock", 0x258e, 0 }, { "lfeighthblock", 0x258f, 0 }, { "upeighthblock", 0x2594, 0 }, { "rteighthblock", 0x2595, 0 }, { "box", 0x25a1, 0 }, { "boxrounded", 0x25a2, 0 }, { "boxnested", 0x25a3, 0 }, { "boxhorizhatch", 0x25a4, 0 }, { "boxverthatch", 0x25a5, 0 }, { "boxcrosshatch", 0x25a6, 0 }, { "boxleftdiaghatch", 0x25a7, 0 }, { "boxrtdiaghatch", 0x25a8, 0 }, { "boxcrossdiaghatch", 0x25a9, 0 }, { "smallboxfilled", 0x25aa, 0 }, { "smallbox", 0x25ab, 0 }, { "rectangle", 0x25ad, 0 }, { "filledvertrect", 0x25ae, 0 }, { "vertrectangle", 0x25af, 0 }, { "filledparallelogram", 0x25b0, 0 }, { "parallelogram", 0x25b1, 0 }, { "triangle", 0x25b3, 0 }, { "smalltrianglesld", 0x25b4, 0 }, { "smalltriangle", 0x25b5, 0 }, { "trianglerightsld1", 0x25b6, 0 }, { "triangleright1", 0x25b7, 0 }, { "smalltrianglerightsld", 0x25b8, 0 }, { "smalltriangleright", 0x25b9, 0 }, { "triagrtopen", 0x25bb, 0 }, { "triangleinv", 0x25bd, 0 }, { "smalltriangleinvsld", 0x25be, 0 }, { "smalltriangleinv", 0x25bf, 0 }, { "triangleleftsld1", 0x25c0, 0 }, { "triangleleft1", 0x25c1, 0 }, { "smalltriangleleftsld", 0x25c2, 0 }, { "smalltriangleleft", 0x25c3, 0 }, { "triaglfopen", 0x25c5, 0 }, { "diamondrhombsolid", 0x25c6, 0 }, { "diamondrhomb", 0x25c7, 0 }, { "diamondrhombnested", 0x25c8, 0 }, { "circledash", 0x25cc, 0 }, { "circleverthatch", 0x25cd, 0 }, { "circlesolid", 0x25cf, 0 }, { "circleleftsld", 0x25d0, 0 }, { "circlerightsld", 0x25d1, 0 }, { "circlebottomsld", 0x25d2, 0 }, { "circletopsld", 0x25d3, 0 }, { "circlenesld", 0x25d4, 0 }, { "circlenwopen", 0x25d5, 0 }, { "semicircleleftsld", 0x25d6, 0 }, { "semicirclelertsld", 0x25d7, 0 }, { "invsemicircleup", 0x25da, 0 }, { "invsemicircledn", 0x25db, 0 }, { "nwquadarc", 0x25dc, 0 }, { "nequadarc", 0x25dd, 0 }, { "sequadarc", 0x25de, 0 }, { "swquadarc", 0x25df, 0 }, { "toparc", 0x25e0, 0 }, { "bottomarc", 0x25e1, 0 }, { "trianglesesld", 0x25e2, 0 }, { "triangleswsld", 0x25e3, 0 }, { "tranglenwsld", 0x25e4, 0 }, { "trianglenesld", 0x25e5, 0 }, { "squareleftsld", 0x25e7, 0 }, { "squarerightsld", 0x25e8, 0 }, { "squarenwsld", 0x25e9, 0 }, { "squaresesld", 0x25ea, 0 }, { "squarevertbisect", 0x25eb, 0 }, { "triangledot", 0x25ec, 0 }, { "triangleleftsld", 0x25ed, 0 }, { "trianglerightsld", 0x25ee, 0 }, { "heartopen", 0x2661, 0 }, { "diamondopen", 0x2662, 0 }, { "spadeopen", 0x2664, 0 }, { "Omegaiotasubleniscircumflex", 0x1fae, 0 }, { "Omegaleniscircumflex", 0x1f6e, 0 }, { "Upsilonaspercircumflex", 0x1f5f, 0 }, { "dieresiscircumflex", 0x1fc1, 0 }, { "leniscircumflex", 0x1fcf, 0 }, { "aspercircumflex", 0x1fdf, 0 }, { "alphaleniscircumflex", 0x1f06, 0 }, { "alphaaspercircumflex", 0x1f07, 0 }, { "etaleniscircumflex", 0x1f26, 0 }, { "etaaspercircumflex", 0x1f27, 0 }, { "iotaleniscircumflex", 0x1f36, 0 }, { "iotaaspercircumflex", 0x1f37, 0 }, { "upsilonleniscircumflex", 0x1f56, 0 }, { "upsilonaspercircumflex", 0x1f57, 0 }, { "omegaleniscircumflex", 0x1f66, 0 }, { "omegaaspercircumflex", 0x1f67, 0 }, { "alphaiotasubleniscircumflex", 0x1f86, 0 }, { "alphaiotasubaspercircumflex", 0x1f87, 0 }, { "etaiotasubleniscircumflex", 0x1f96, 0 }, { "etaiotasubaspercircumflex", 0x1f97, 0 }, { "omegaiotasubleniscircumflex", 0x1fa6, 0 }, { "omegaiotasubaspercircumflex", 0x1fa7, 0 }, { "alphacircumflex", 0x1fb6, 0 }, { "alphaiotasubcircumflex", 0x1fb7, 0 }, { "etacircumflex", 0x1fc6, 0 }, { "etaiotasubcircumflex", 0x1fc7, 0 }, { "iotacircumflex", 0x1fd6, 0 }, { "iotadieresiscircumflex", 0x1fd7, 0 }, { "upsiloncircumflex", 0x1fe6, 0 }, { "omegacircumflex", 0x1ff6, 0 }, { "omegaiotasubcircumflex", 0x1ff7, 0 }, { "upsilondieresiscircumflex", 0x1fe7, 0 }, { "dialytika", 0x0308, 0 }, { "koronis", 0x1fbd, 0 }, { "prosgegrammeni", 0x1fbe, 0 }, { "psili", 0x1fbf, 0 }, { "perispomeni", 0x1fc0, 0 }, { "varia", 0x1fef, 0 }, { "oxia", 0x1ffd, 0 }, { "dasia", 0x1ffe, 0 }, { "Alphasmall", 0xf500, 0 }, { "Betasmall", 0xf501, 0 }, { "Gammasmall", 0xf502, 0 }, { "Deltasmall", 0xf503, 0 }, { "Epsilonsmall", 0xf504, 0 }, { "Zetasmall", 0xf505, 0 }, { "Etasmall", 0xf506, 0 }, { "Thetasmall", 0xf507, 0 }, { "Iotasmall", 0xf508, 0 }, { "Kappasmall", 0xf509, 0 }, { "Lambdasmall", 0xf50a, 0 }, { "Musmall", 0xf50b, 0 }, { "Nusmall", 0xf50c, 0 }, { "Xismall", 0xf50d, 0 }, { "Omicronsmall", 0xf50e, 0 }, { "Pismall", 0xf50f, 0 }, { "Rhosmall", 0xf510, 0 }, { "Sigmasmall", 0xf512, 0 }, { "Tausmall", 0xf513, 0 }, { "Upsilonsmall", 0xf514, 0 }, { "Phismall", 0xf515, 0 }, { "Chismall", 0xf516, 0 }, { "Psismall", 0xf517, 0 }, { "Omegasmall", 0xf518, 0 }, { "Iotadieresissmall", 0xf519, 0 }, { "Upsilondieresissmall", 0xf51a, 0 }, { "uni2A0B.lgdisplay", 0xea57, 0 }, { "uni2A0B.uplgdisplay", 0xea57, 0 }, { "uni2A15.lgdisplay", 0xe376, 0 }, { "uni2A15.uplgdisplay", 0xe376, 0 }, { "uni2A16.lgdisplay", 0xe377, 0 }, { "uni2A16.uplgdisplay", 0xe377, 0 }, { "uni2A10.lgdisplay", 0xe395, 0 }, { "uni2A10.uplgdisplay", 0xe395, 0 }, { "uni2A12.lgdisplay", 0xe397, 0 }, { "uni2A12.uplgdisplay", 0xe397, 0 }, { "uni2A13.lgdisplay", 0xe398, 0 }, { "uni2A13.uplgdisplay", 0xe398, 0 }, { "uni2A14.lgdisplay", 0xe399, 0 }, { "uni2A14.uplgdisplay", 0xe399, 0 }, { "uni2A17.lgdisplay", 0xe39a, 0 }, { "uni2A17.uplgdisplay", 0xe39a, 0 }, { "uni2A11.uplgdisplay", 0xe39b, 0 }, { "uni2A11.lgdisplay", 0xe39b, 0 }, { "uni2A0F.lgdisplay", 0xe3d3, 0 }, { "uni2A0F.uplgdisplay", 0xe3d3, 0 }, /* From Richard Kinch's TeX list of glyph aliases */ { "fscript", 0x192, 0 }, { "fraction1", 0x2215, 0 }, { "negationslash", 0x2215, 0 }, { "circleR", 0xae, 0 }, { "circlecopyrt", 0xa9, 0 }, { "smile", 0x263a, 0 }, { "Ifractur", 0x2111, 0 }, { "Rfractur", 0x211C, 0 }, { "Omegainv", 0x2127, 0 }, { "mho", 0x2127, 0 }, { "alephmath", 0x2135, 0 }, { "beth", 0x2136, 0 }, { "bethmath", 0x2136, 0 }, { "gimelmath", 0x2137, 0 }, { "daleth", 0x2138, 0 }, { "daletmath", 0x2138, 0 }, { "arrowbothv", 0x2195, 0 }, { "prime1", 0x2032, 0 }, { "primerev1", 0x2035, 0 }, { "primereverse", 0x2035, 0 }, { "followsequal1", 0x227d, 0 }, { "similarequal", 0x2243, 0 }, { "square", 0x25a1, 0 }, { "squaresolid", 0x25a0, 0 }, { "squaresmallsolid", 0x25aa, 0 }, { "diamondsolid", 0x25c6, 0 }, { "clockwise", 0x21bb, 0 }, { "anticlockwise", 0x21ba, 0 }, { "forces", 0x22a9, 0 }, { "forcesbar", 0x22aa, 0 }, { "satisfies", 0x22a8, 0 }, { "dblarrowdwn", 0x21ca, 0 }, { "shiftleft", 0x2196, 0 }, { "shiftright", 0x2197, 0 }, { "squiggleright", 0x21dd, 0 }, { "squiggleleft", 0x21dc, 0 }, { "squiggleleftright", 0x21ad, 0 }, { "curlyleft", 0x21ab, 0 }, { "curlyright", 0x21ac, 0 }, { "followsorequal", 0x227d, 0 }, { "equalsdots", 0x2251, 0 }, { "defines", 0x225c, 0 }, { "ng", 0x014b, 0 }, { "Ng", 0x014a, 0 }, { "visiblespace", 0x2420, 0 }, { "dslash", 0x0111, 0 }, { "tie1", 0x2040, 0 }, { "arrowdblbothv", 0x21d5, 0 }, { "precedesequal1", 0x227c, 0 }, { "greaterorsimilar", 0x2273, 0 }, { "precedesorequal", 0x227e, 0 }, { "lessorsimilar", 0x2272, 0 }, { "equalorgreater", 0x22dd, 0 }, { "lessorequalslant", 0x2264, 0 }, { "equaldotrightleft", 0x2253, 0 }, { "equaldotleftright", 0x2252, 0 }, { "followsorcurly", 0x227d, 0 }, { "greaterorequalslant", 0x2265, 0 }, { "trianglerightequal", 0x22b5, 0 }, { "triangleleftequal", 0x22b4, 0 }, { "triangledownsld", 0x25bc, 0 }, { "arrowaxisright", 0x2192, 0 }, { "arrowaxisleft", 0x2190, 0 }, { "trianglesolid", 0x25b2, 0 }, { "greaterlessequal", 0x22db, 0 }, { "orunderscore", 0x22bb, 0 }, { "frown", 0x2322, 0 }, { "uprise", 0x22cf, 0 }, { "downfall", 0x22ce, 0 }, { "subsetdblequal", 0x2286, 0 }, { "supersetdblequal", 0x2287, 0 }, { "Finv", 0x2132, 0 }, { "notarrowboth", 0x21ae, 0 }, { "archleftdown", 0x21b6, 0 }, { "archrightdown", 0x21b7, 0 }, { "notdblarrowleft", 0x21cd, 0 }, { "notdblarrowboth", 0x21ce, 0 }, { "notdblarrowright", 0x21cf, 0 }, { "epsiloninv", 0x220a, 0 }, { "equalorsimilar", 0x2242, 0 }, { "notprecedes", 0x2280, 0 }, { "notsubseteql", 0x2288, 0 }, { "notsuperseteql", 0x2289, 0 }, { "subsetnoteql", 0x228a, 0 }, { "supersetnoteql", 0x228b, 0 }, { "notturnstile", 0x22ac, 0 }, { "notforcesextra", 0x22af, 0 }, { "dividemultiply", 0x22c7, 0 }, { "notprecedesoreql", 0x22e0, 0 }, { "notfollowsoreql", 0x22e1, 0 }, { "lessornotsimilar", 0x22e6, 0 }, { "greaterornotsimilar", 0x22e7, 0 }, { "precedeornoteqvlnt", 0x22e8, 0 }, { "followornoteqvlnt", 0x22e9, 0 }, { "nottriangeqlleft", 0x22ec, 0 }, { "nottriangeqlright", 0x22ed, 0 }, { "angbracketleft", 0x3008, 0 }, { "angbracketright", 0x3009, 0 }, { "check", 0x2713, 0 }, { "circleS", 0x24c8, 0 }, { "rightanglenw", 0x250c, 0 }, { "rightanglene", 0x2510, 0 }, { "rightanglesw", 0x2514, 0 }, { "rightanglese", 0x2518, 0 }, { "Yen", 0x00a5, 0 }, { "permill", 0x2030, 0 }, { "recipe", 0x211e, 0 }, { "pertenmill", 0x2031, 0 }, { "lnot", 0x00ac, 0 }, { "circleP", 0x2117, 0 }, { "surd", 0x221a, 0 }, { "asciigrave", 0x60, 0 }, { "asciigrave", 0x60, 0 }, { "asciiacute", 0xb4, 0 }, { "asciidieresis", 0xa8, 0 }, { "pilcrow", 0xb6, 0 }, /* Useful names to use to find glyphs */ { "circumflexcomb", 0x302, 0 }, { "macroncomb", 0x304, 0 }, { "brevecomb", 0x306, 0 }, { "diaeresiscomb", 0x308, 0 }, { "caroncomb", 0x30c, 0 }, { "vrachycomb", 0x306, 0 }, { "psilicomb", 0x313, 0 }, { "dasiacomb", 0x314, 0 }, { "psilivaria", 0x1fcd, 0 }, { "psilioxia", 0x1fce, 0 }, { "psiliperispomeni", 0x1fcf, 0 }, { "dasiavaria", 0x1fdd, 0 }, { "dasiaoxia", 0x1fde, 0 }, { "dasiaperispomeni", 0x1fdf, 0 }, { "dialytikavaria", 0x1fed, 0 }, { "dialytikaoxia", 0x1fee, 0 }, { "dialytikaperispomeni", 0x1fc1, 0 }, /* Adobe spells diaeresis the American way, as dieresis */ { "diaeresis", 0xa8, 0 }, { "Adiaeresis", 0xC4, 0 }, { "Ediaeresis", 0xCB, 0 }, { "Idiaeresis", 0xCF, 0 }, { "Odiaeresis", 0xD6, 0 }, { "Udiaeresis", 0xDC, 0 }, { "adiaeresis", 0xE4, 0 }, { "ediaeresis", 0xEB, 0 }, { "idiaeresis", 0xEF, 0 }, { "odiaeresis", 0xF6, 0 }, { "udiaeresis", 0xFC, 0 }, { "Ydiaeresis", 0x178, 0 }, { "diaeresistonos", 0x385, 0 }, { "iotadiaeresistonos", 0x390, 0 }, { "Iotadiaeresis", 0x3AA, 0 }, { "Upsilondiaeresis", 0x3AB, 0 }, { "upsilondiaeresistonos", 0x3B0, 0 }, { "iotadiaeresis", 0x3CA, 0 }, { "upsilondiaeresis", 0x3CB, 0 }, { "Wdiaeresis", 0x1e84, 0 }, { "wdiaeresis", 0x1e85, 0 }, { "ETH", 0xd0, 0 }, { "THORN", 0xde, 0 }, { "ssharp", 0xdf, 0 }, { "Ooblique", 0xd8, 0 }, { "notsign", 0xac, 0 }, /* Sun has used "masculine" for ordmasculine */ { NULL, 0, 0 } }; dvisvgm-2.8.1/libs/ff-woff/fontforge/libffstamp.h0000664000175000017500000000065413510660062016704 00000000000000/* This file was generated using stamper.c to create the next version release. */ /* If you need to update this to the next release version, see fontforge/GNUmakefile.in */ #include "fontforge-config.h" #define LibFF_ModTime FONTFORGE_MODTIME_RAW /* Seconds since 1970 (standard unix time) */ #define LibFF_ModTime_Str FONTFORGE_MODTIME_STR #define LibFF_VersionDate FONTFORGE_VERSIONDATE_RAW /* Year, month, day */ dvisvgm-2.8.1/libs/ff-woff/fontforge/PfEd.h0000664000175000017500000002342113510660062015370 00000000000000/* Copyright (C) 2008-2012 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 _PFED_H # define _PFED_H /* The PfEd table (from PfaEdit, former name of FontForge) is designed to */ /* store information useful for editing the font. This includes stuff like */ /* guidelines, background layers, spiro layers, comments, lookup names, etc*/ /* The idea is that much useful information can be retrieved even after the */ /* font has been generated into its final form: ttf/otf */ /* It is something of a catch all table composed of many subtables, each of */ /* which preserves one particular item. I expect more subtables will be */ /* added as I, or others, think of more things worth preserving. */ # ifndef CHR # define CHR(ch1,ch2,ch3,ch4) (((ch1)<<24)|((ch2)<<16)|((ch3)<<8)|(ch4)) # endif /* '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/1 */ /* short string length */ /* version 0=>String in latin1 (should be ASCII), version 1=>utf8*/ /* 'PfEd' 'cmnt' glyph comment subtable format */ /* THIS VERSION IS DEPRECATED IN FAVOR OF VERSION 1 DESCRIBED BELOW */ /* 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' 'cmnt' glyph comment subtable format */ /* New version of 'cmnt' which uses utf8 rather than UCS2 */ /* short version number 1 */ /* 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 utf8)*/ /* ... */ /* And one last offset pointing beyong the end of the last string to enable length calculations */ /* String table in utf8 (NUL terminated). All offsets from start*/ /* of subtable */ /* 'PfEd' 'cvt ' cvt comment subtable format */ /* short version number 0 */ /* short size of cvt comment array (might be less that cvt) */ /* ushort offset[size] to utf8 strings describing cvt entries */ /* (strings are NUL terminated) */ /* String table in utf8 (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) } */ /* 'PfEd' 'GPOS' GPOS lookup/subtable/anchor names */ /* short version number 0 */ /* short count-of-lookups */ /* struct { short offset name, offset subtables; } */ /* A subtable: */ /* short count-of-subtables */ /* struct { short offset name, offset anchors; } */ /* An anchor */ /* short count-of-anchors */ /* struct { short offset name; } */ /* string data (utf8, nul terminated) */ /* (all offsets from start of subtable) */ /* 'PfEd' 'GSUB' GSUB lookup/subtable names */ /* Same as GPOS (anchors will always be NULL) */ /* The next two tables 'guid' and 'layr' will make use of the */ /* following data type. The glyph_layer. */ /* short contour-count */ /* short image-count (always 0 for now) */ /* struct { ushort offset; ushort name-off}[contour-count] */ /* struct { ??? }[image-count] */ /* Each contour consists of one byte of command and a random */ /* amount of data dependant on the command. */ /* See below for a description of the command verbs */ /* string data in utf8 */ /* (offsets relative to start of glyph_layer structure ) */ /* 'PfEd' 'guid' Horizontal/Vertical guideline data */ /* short version number 0 */ /* short # vertical guidelines */ /* short # horizontal guidelines */ /* short mbz */ /* offset guide spline data -- specifies all guides as splines */ /* May be NULL */ /* struct[# vert guidelines] { short x; short offset name} */ /* struct[# h guidelines] { short y; short offset name} */ /* a glyph_layer (includes all guides, even those listed above) */ /* (all offsets, except those in the glyph_layer, relative to start of subtable) */ /* 'PfEd' 'layr' layer data */ /* short version number 0 */ /* short layer-count */ /* struct { short typeflags; short offset-name; uint32 offset-to-layer-data; } */ /* the layer type is 2=>quadratic, 3=>PostScript, 1=>spiro */ /* 0x102=>quadratic fore, 0x103=>PS fore */ /* A layer: */ /* short count-of-ranges */ /* struct { short start-glyph, end-glyph, uint32 offset } */ /* ... */ /* foreach glyph >=start-glyph, <=end-glyph */ /* uint32 offset to per-glyph outline data */ /* many glyph_layers */ /* (all offsets, except those in the glyph_layers, relative to start of subtable) */ /* Main table tag */ # define PfEd_TAG CHR('P','f','E','d') /* Subtable tags */ # define fcmt_TAG CHR('f','c','m','t') /* Font Comment */ # define flog_TAG CHR('f','l','o','g') /* FONTLOG */ # define cmnt_TAG CHR('c','m','n','t') /* Glyph Comments */ # define cvtc_TAG CHR('c','v','t','c') /* Comments for each cvt entry */ # define colr_TAG CHR('c','o','l','r') /* Glyph color flags */ # ifndef GPOS_TAG # define GPOS_TAG CHR('G','P','O','S') /* Names for GPOS lookups */ # define GSUB_TAG CHR('G','S','U','B') /* Names for GSUB lookups */ # endif # define guid_TAG CHR('g','u','i','d') /* Guideline data */ # define layr_TAG CHR('l','a','y','r') /* Any layers which aren't part of the font */ /* Backgrounds, spiros, etc. */ /* The layer commands used to draw quadratic and cubic layers have two */ /* componants: A verb, which says what to do, and a modifier which says */ /* how the data are stored. So a command looks like (verb)|(modifier) */ /* A moveto command with byte data looks like (V_MoveTo|V_B) */ /* The two commands to end a contour (V_Close and V_End) take no data */ /* and use no modifier */ /* layr subtable contour construction verb modifiers specifying data types */ # define V_B 0 /* data are signed bytes */ # define V_S 1 /* data are signed shorts */ # define V_F 2 /* data are fixed longs, divide by 256.0 */ /* layr subtable contour construction verbs */ # define V_MoveTo 0 /* Start contour, absolute data (2 coords) */ # define V_LineTo 4 /* Straight line, relative data (2 coords) */ # define V_HLineTo 8 /* Horizontal line, relative (1 coord, x-off) */ # define V_VLineTo 12 /* Vertical line, relative (1 coord, y-off) */ # define V_QCurveTo 16 /* Quadratic spline, rel, rel (4 coords, cp, p) */ # define V_QImplicit 20 /* Quadratic spline, rel (2 coords, cp) */ /* May only occur after a V_QCurveTo or V_QImplicit (may not start contour) */ /* Must be followed by a V_QCurveTo or V_QImplicit (this may end contour) */ /* The on-curve point is implicit by averaging the given cp with the cp in the next verb */ # define V_QHImplicit 24 /* Quadratic spline, rel (1 coord, cp.x) */ # define V_QVImplicit 28 /* Quadratic spline, rel (1 coord, cp.y) */ # define V_CurveTo 32 /* Cubic spline, rel, rel (6 coords, cp1, cp2, p) */ # define V_VHCurveTo 36 /* Cubic spline, rel, rel (4 coords, cp1.y cp2.* p.x) */ /* cp1.x == current.y, p.y == cp2.y */ # define V_HVCurveTo 40 /* Cubic spline, rel, rel (4 coords, cp1.x cp2.* p.y) */ # define V_Close 44 /* Close path (optionally adding a line) no data */ # define V_End 45 /* End path (leave open) no data */ #define COM_MOD(com) ((com)&3) #define COM_VERB(com) ((com)&~3) /* the layer commands used to draw spiro layers are the standard spiro verbs */ /* these will always take fixed long data (V_L) as described above */ # ifndef SPIRO_OPEN_CONTOUR # define SPIRO_OPEN_CONTOUR '{' # define SPIRO_CORNER 'v' # define SPIRO_G4 'o' # define SPIRO_G2 'c' # define SPIRO_LEFT '[' # define SPIRO_RIGHT ']' # define SPIRO_END 'z' # endif # define SPIRO_CLOSE_CONTOUR '}' #endif /* _PFED_H */ dvisvgm-2.8.1/libs/ff-woff/fontforge/fflocale.h0000664000175000017500000000070413510660062016324 00000000000000#ifndef FFLOCALE_H #define FFLOCALE_H #ifdef HAVE_CONFIG_H #include #endif #include #ifdef HAVE_XLOCALE_H #include #endif #ifdef HAVE_USELOCALE typedef locale_t ff_locale_t; #else typedef char* ff_locale_t; #endif // HAVE_USELOCALE void switch_to_c_locale(ff_locale_t *tmplocale_p, ff_locale_t *oldlocale_p); void switch_to_old_locale(ff_locale_t *tmplocale_p, ff_locale_t *oldlocale_p); #endif /* FFLOCALE_H */ dvisvgm-2.8.1/libs/ff-woff/fontforge/memory.c0000664000175000017500000000400413510660062016051 00000000000000/* Copyright (C) 2000-2012 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 "ustring.h" char *copy(const char *str) { return str ? strdup(str) : NULL; } char *copyn(const char *str,long n) { /** * MIQ: Note that there is at least one site that relies on * copyn copying up to n bytes including embedded nulls. * So using strndup() doesn't provide the same outcomes * to that code. * https://github.com/fontforge/fontforge/issues/1239 */ char *ret; if ( str==NULL ) return( NULL ); ret = (char *) malloc(n+1); memcpy(ret,str,n); ret[n]='\0'; return( ret ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/fvfonts.c0000664000175000017500000001654213510660062016240 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #include "namehash.h" static int _SFFindExistingSlot(SplineFont *sf, int unienc, const char *name ); void __GlyphHashFree(struct glyphnamehash *hash) { struct glyphnamebucket *test, *next; int i; if ( hash==NULL ) return; for ( i=0; itable[i]; test!=NULL; test = next ) { next = test->next; chunkfree(test,sizeof(struct glyphnamebucket)); } } } static void _GlyphHashFree(SplineFont *sf) { if ( sf->glyphnames==NULL ) return; __GlyphHashFree(sf->glyphnames); 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 = calloc(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->glyphcnt-1; i>=0; --i ) if ( _sf->glyphs[i]!=NULL ) { new = chunkalloc(sizeof(struct glyphnamebucket)); new->sc = _sf->glyphs[i]; hash = hashname(new->sc->name); new->next = gnh->table[hash]; gnh->table[hash] = new; } ++k; } while ( ksubfontcnt ); } SplineChar *SFHashName(SplineFont *sf,const 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 SCUniMatch(SplineChar *sc,int unienc) { struct altuni *alt; if ( sc->unicodeenc==unienc ) return( true ); for ( alt=sc->altuni; alt!=NULL; alt=alt->next ) if ( alt->unienc==unienc ) return( true ); return( false ); } /* Find the position in the glyph list where this code point/name is found. */ /* Returns -1 else on error */ int SFFindGID(SplineFont *sf, int unienc, const char *name ) { int gid; SplineChar *sc; if ( unienc!=-1 ) { for ( gid=0; gidglyphcnt; ++gid ) if ( sf->glyphs[gid]!=NULL ) { if ( SCUniMatch(sf->glyphs[gid],unienc) ) return( gid ); } } if ( name!=NULL ) { sc = SFHashName(sf,name); if ( sc!=NULL ) return( sc->orig_pos ); } return ( -1 ); } int SFCIDFindCID(SplineFont *sf, int unienc, const char *name ) { // For a given SplineFont *sf, find the index of the SplineChar with code unienc or name *name. int j,ret; // If there is a cidmap or if there are multiple subfonts, do complicated things. if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { if ( sf->cidmaster!=NULL ) sf=sf->cidmaster; } // If things are simple, perform a flat map. if ( sf->subfonts==NULL && sf->cidmaster==NULL ) return( SFFindGID(sf,unienc,name)); // If the cid lookup from before failed, look through subfonts. if ( sf->cidmaster!=NULL ) sf=sf->cidmaster; for ( j=0; jsubfontcnt; ++j ) if (( ret = SFFindGID(sf,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]->glyphcnt && SCWorthOutputting(sf->subfonts[i]->glyphs[cid]) ) return( i ); for ( i=0; isubfontcnt; ++i ) if ( cidsubfonts[i]->glyphcnt && sf->subfonts[i]->glyphs[cid]!=NULL ) return( i ); return( -1 ); } SplineChar *SFGetChar(SplineFont *sf, int unienc, const char *name ) { // This function presumably finds a glyph matching the code or name supplied. Undefined code is unienc = -1. Undefined name is name = NULL. int ind = -1; int j; char *pt, *start; int ch; if ( name==NULL ) ind = SFCIDFindCID(sf,unienc,NULL); else { for ( start=(char *) name; *start==' '; ++start ); for ( pt=start; *pt!='\0' && *pt!='('; ++pt ); ch = *pt; // We truncate any glyph name before parentheses. if ( ch=='\0' ) ind = SFCIDFindCID(sf,unienc,start); else { char *tmp; if ( (tmp = copy(name)) ) { tmp[pt-name] = '\0'; ind = SFCIDFindCID(sf,unienc,tmp+(start-name)); tmp[pt-name] = ch; free(tmp); } } } if ( ind==-1 ) return( NULL ); // If the typeface is simple, return the result from the flat glyph collection. if ( sf->subfonts==NULL && sf->cidmaster==NULL ) return( sf->glyphs[ind]); if ( sf->cidmaster!=NULL ) sf=sf->cidmaster; // Find a subfont that contains the glyph in question. j = SFHasCID(sf,ind); if ( j==-1 ) return( NULL ); return( sf->subfonts[j]->glyphs[ind] ); } static int _SFFindExistingSlot(SplineFont *sf, int unienc, const char *name ) { int gid = -1; struct altuni *altuni; if ( unienc!=-1 ) { for ( gid=sf->glyphcnt-1; gid>=0; --gid ) if ( sf->glyphs[gid]!=NULL ) { if ( sf->glyphs[gid]->unicodeenc==unienc ) break; for ( altuni=sf->glyphs[gid]->altuni ; altuni!=NULL && (altuni->unienc!=unienc || altuni->vs!=-1 || altuni->fid!=0); altuni=altuni->next ); if ( altuni!=NULL ) break; } } if ( gid==-1 && name!=NULL ) { SplineChar *sc = SFHashName(sf,name); if ( sc==NULL ) return( -1 ); gid = sc->orig_pos; if ( gid<0 || gid>=sf->glyphcnt ) { IError("Invalid glyph location when searching for %s", name ); return( -1 ); } } return( gid ); } int SFFindExistingSlot(SplineFont *sf, int unienc, const char *name ) { int gid = _SFFindExistingSlot(sf,unienc,name); if ( gid==-1 || !SCWorthOutputting(sf->glyphs[gid]) ) return( -1 ); return( gid ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/char.c0000664000175000017500000000444413510660062015466 00000000000000/* Copyright (C) 2000-2002 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 "ustring.h" int strmatch(const char *str1, const char *str2) { int ch1, ch2; for (;;) { ch1 = *str1++; ch2 = *str2++ ; ch1 = tolower(ch1); ch2 = tolower(ch2); if ( ch1!=ch2 || ch1=='\0' ) return(ch1-ch2); } } int strnmatch(const char *str1, const char *str2, int n) { int ch1, ch2; for (;n-->0;) { ch1 = *str1++; ch2 = *str2++ ; ch1 = tolower(ch1); ch2 = tolower(ch2); if ( ch1!=ch2 || ch1=='\0' ) return(ch1-ch2); } return(0); } char *strstrmatch(const char *longer, const char *substr) { int ch1, ch2; const char *lpt, *str1, *str2; for ( lpt=longer; *lpt!='\0'; ++lpt ) { str1 = lpt; str2 = substr; for (;;) { ch1 = *str1++; ch2 = *str2++ ; ch1 = tolower(ch1); ch2 = tolower(ch2); if ( ch2=='\0' ) return((char *) lpt); if ( ch1!=ch2 ) break; } } return( NULL ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/start.c0000664000175000017500000000363613510660062015710 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #ifdef __Mac # include /* getenv,setenv */ #endif #include "psfont.h" int32 unicode_from_adobestd[256]; 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],ui_none,&custom); if ( j==-1 ) j = 0xfffd; unicode_from_adobestd[i] = j; } } } void InitSimpleStuff(void) { initadobeenc(); } dvisvgm-2.8.1/libs/ff-woff/fontforge/autohint.c0000664000175000017500000023741313510660062016410 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #include "stemdb.h" #include #include #include "edgelist.h" float OpenTypeLoadHintEqualityTolerance = 0.0; /* 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, int layer, real blues[14], real otherblues[10]) { real caph[5], xh[5], ascenth[5], digith[5], descenth[5], base[5]; real otherdigits[5]; int i, j, k; DBounds b; /* Go through once to get some idea of the average value so we can weed */ /* out undesirables */ 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; iglyphcnt; ++i ) { if ( sf->glyphs[i]!=NULL && sf->glyphs[i]->layers[layer].splines!=NULL ) { int enc = sf->glyphs[i]->unicodeenc; const unichar_t *upt; if ( enc<0x10000 && 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; SplineCharFindBounds(sf->glyphs[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 ( enc<0x10000 && isdigit(enc) ) { otherdigits[0] += b.maxy; otherdigits[1] += b.maxy*b.maxy; ++otherdigits[2]; } else if ( enc<0x10000 && isupper(enc) && enc!=0x462 && enc!=0x490 ) { 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=='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 ( !ff_progress_next()) 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 */ if ( base[0]+base[1]<0 ) base[1] = -base[0]; /* Make sure 0 is within the base bluezone */ 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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { int enc = sf->glyphs[i]->unicodeenc; const unichar_t *upt; if ( enc<0x10000 && 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; SplineCharFindBounds(sf->glyphs[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 ( enc<0x10000 && isdigit(enc)) { AddBlue(b.maxy,digith,false); } else if ( enc<0x10000 && 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=='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,unsigned bcnt,char *pt) { char *end; real val1, val2; unsigned 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, int layer, 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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { int enc = sf->glyphs[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->glyphs[i]; while ( t->layers[layer].splines==NULL && t->layers[layer].refs!=NULL ) t = t->layers[layer].refs->sc; max = -1e10; min = 1e10; if ( t->layers[layer].splines!=NULL ) { for ( spl=t->layers[layer].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 = calloc(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) { extended 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 */ SplineRemoveExtremaTooClose(&spline->splines[0],&ts[1],&ts[2]); SplineRemoveExtremaTooClose(&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[el->layer].splines==NULL ) return; el->coordmin[0] = el->coordmax[0] = sc->layers[el->layer].splines->first->me.x; el->coordmin[1] = el->coordmax[1] = sc->layers[el->layer].splines->first->me.y; for ( spl = sc->layers[el->layer].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; el->low = floor(el->coordmin[major]); el->high = ceil(el->coordmax[major]); el->cnt = el->high-el->low+1; el->ordered = calloc(el->cnt,sizeof(EI *)); el->ends = calloc(el->cnt,1); for ( ei = el->edges; ei!=NULL ; ei=ei->next ) { 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; } } } static HintInstance *HIMerge(HintInstance *into, HintInstance *hi) { HintInstance *n, *first = NULL, *last = NULL; 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 ); } 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; if ( msp->a==0 && msp->b==0 ) { if ( msp->c == 0 ) { IError("Hor/Vert line when not expected"); return( 0 ); } new_t = (sought_m-msp->d)/(msp->c); return( new_t ); } t_mmax = e->up?e->tmax:e->tmin; 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 ) { t_mmax = new_t; } else { t_mmin = new_t; } if ( t_mmax==t_mmin ) { IError("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 separated 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 ); } 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 separated 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 ); } static StemInfo *StemRemoveFlexCandidates(StemInfo *stems) { StemInfo *s, *t, *sn; const real BlueShift = 7; /* Suppose we have something that is a flex candidate */ /* We might get two hints from it... one from the two end points */ /* and one from the internal point */ if ( stems==NULL ) return( NULL ); for ( s=stems; (sn = s->next)!=NULL; s = sn ) { if ( s->start+BlueShift > sn->start && s->width>0 && sn->width>0 && s->start+s->width-BlueShift < sn->start+sn->width && s->start+s->width+BlueShift > sn->start+sn->width && s->where != NULL && sn->where != NULL && s->where->next!=NULL && sn->where->next==NULL ) { t = sn->next; sn->next = NULL; StemInfoFree(sn); s->next = t; sn = t; if ( t==NULL ) break; } } 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 ( enext ) 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)<=end; s=s->next ) { stems->hasconflicts = true; s->hasconflicts = true; any = true; } stems = stems->next; } return( any ); } 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 HintInstance *StemAddHIFromActive(struct stemdata *stem,int major) { int i; HintInstance *head = NULL, *cur, *t; double mino, maxo; double dir = ((real *) &stem->unit.x)[major]<0 ? -1 : 1; for ( i=0; iactivecnt; ++i ) { mino = dir*stem->active[i].start + ((real *) &stem->left.x)[major]; maxo = dir*stem->active[i].end + ((real *) &stem->left.x)[major]; cur = chunkalloc(sizeof(HintInstance)); if ( dir>0 ) { cur->begin = mino; cur->end = maxo; if ( head==NULL ) head = cur; else t->next = cur; t = cur; } else { cur->begin = maxo; cur->end = mino; cur->next = head; head = cur; } } return( head ); } static HintInstance *DStemAddHIFromActive( struct stemdata *stem ) { int i; HintInstance *head = NULL, *cur, *t; for ( i=0; iactivecnt; ++i ) { cur = chunkalloc( sizeof( HintInstance )); cur->begin = stem->active[i].start; cur->end = stem->active[i].end; if ( head == NULL ) head = cur; else t->next = cur; t = cur; } return( head ); } void SCGuessHintInstancesList( SplineChar *sc,int layer,StemInfo *hstem,StemInfo *vstem,DStemInfo *dstem, int hvforce,int dforce ) { struct glyphdata *gd; struct stemdata *sd; int i, cnt=0, hneeds_gd=false, vneeds_gd=false, dneeds_gd=false; StemInfo *test; DStemInfo *dtest; double em_size = ( sc->parent != NULL ) ? sc->parent->ascent + sc->parent->descent : 1000; if ( hstem == NULL && vstem == NULL && dstem == NULL ) return; /* If all stems already have active zones assigned (actual for .sfd */ /* files), then there is no need to wast time generating glyph data for */ /* this glyph */ test = hstem; while ( !hneeds_gd && test != NULL ) { if ( test->where == NULL || hvforce ) hneeds_gd = true; test = test->next; } test = vstem; while ( !vneeds_gd && test != NULL ) { if ( test->where == NULL || hvforce ) vneeds_gd = true; test = test->next; } dtest = dstem; while ( !dneeds_gd && dtest != NULL ) { if ( dtest->where == NULL || dforce ) dneeds_gd = true; dtest = dtest->next; } if ( !hneeds_gd && !vneeds_gd && !dneeds_gd ) return; gd = GlyphDataInit( sc,layer,em_size,!dneeds_gd ); if ( gd == NULL ) return; cnt = 0; if ( hstem != NULL && hneeds_gd ) { gd = StemInfoToStemData( gd,hstem,false ); for ( i=cnt; istemcnt; i++ ) { sd = &gd->stems[i]; if ( hstem == NULL ) break; if ( hstem->where == NULL || hvforce ) hstem->where = StemAddHIFromActive( sd,false ); hstem = hstem->next; } } cnt = gd->stemcnt; if ( vstem != NULL && vneeds_gd ) { gd = StemInfoToStemData( gd,vstem,true ); for ( i=cnt; istemcnt; i++ ) { sd = &gd->stems[i]; if ( vstem == NULL ) break; if ( vstem->where == NULL || hvforce ) vstem->where = StemAddHIFromActive( sd,true ); vstem = vstem->next; } } cnt = gd->stemcnt; if ( dstem != NULL && dneeds_gd ) { gd = DStemInfoToStemData( gd,dstem ); for ( i=cnt; istemcnt; i++ ) { sd = &gd->stems[i]; if ( dstem == NULL ) break; dstem->left = sd->left; dstem->right = sd->right; if ( dstem->where == NULL || dforce ) dstem->where = DStemAddHIFromActive( sd ); dstem = dstem->next; } } GlyphDataFree( gd ); return; } /* We have got (either from a file or user specified) a diagonal stem, described by 4 base points (pairs of x and y coordinates). Some additional tests are required before we can add this stem to the given glyph. */ int MergeDStemInfo( SplineFont *sf,DStemInfo **ds,DStemInfo *test ) { DStemInfo *dn, *cur, *prev, *next, *temp; double dot, loff, roff, soff, dist_error_diag ; double ibegin, iend; int overlap; BasePoint *base, *nbase, *pbase; HintInstance *hi; if ( *ds == NULL ) { *ds = test; return( true ); } dist_error_diag = ( sf->ascent + sf->descent ) * 0.0065; cur = prev = NULL; for ( dn=*ds ; dn!=NULL ; dn=dn->next ) { prev = cur; cur = dn; /* Compare the given stem with each of the existing diagonal stem * hints. First ensure that it is not an exact duplicate of an already * added stem. Then test if unit vectors are parallel and edges colinear. * In this case we should either preserve the existing stem or replace * it with the new one, but not keep them both */ if (test->unit.x == dn->unit.x && test->unit.y == dn->unit.y && test->left.x == dn->left.x && test->left.y == dn->left.y && test->right.x == dn->right.x && test->right.y == dn->right.y ) { DStemInfoFree( test ); return( false ); } dot = ( test->unit.x * dn->unit.y ) - ( test->unit.y * dn->unit.x ); if ( dot <= -0.5 || dot >= 0.5 ) continue; loff = ( test->left.x - dn->left.x ) * dn->unit.y - ( test->left.y - dn->left.y ) * dn->unit.x; roff = ( test->right.x - dn->right.x ) * dn->unit.y - ( test->right.y - dn->right.y ) * dn->unit.x; if (loff <= -dist_error_diag || loff >= dist_error_diag || roff <= -dist_error_diag || roff >= dist_error_diag ) continue; soff = ( test->left.x - dn->left.x ) * dn->unit.x + ( test->left.y - dn->left.y ) * dn->unit.y; overlap = false; if ( dn->where != NULL && test->where != NULL && test->where->next == NULL ) { ibegin = test->where->begin + soff; iend = test->where->end + soff; for ( hi = dn->where; hi != NULL; hi = hi->next ) { if (( hi->begin <= ibegin && ibegin <= hi->end ) || ( hi->begin <= iend && iend <= hi->end ) || ( ibegin <= hi->begin && hi->end <= iend )) { overlap = true; break; } } } else overlap = true; /* It's probably a colinear dstem, as in older SFD files. Treat */ /* it as one more instance for the already added stem */ if ( !overlap ) { for ( hi=dn->where; hi->next != NULL; hi = hi->next ) ; hi->next = chunkalloc( sizeof( HintInstance )); hi->next->begin = ibegin; hi->next->end = iend; DStemInfoFree( test ); return( false ); /* The found stem is close but not identical to the stem we */ /* are going to add. So just replace the older stem with the */ /* new one */ } else { test->next = dn->next; if ( prev == NULL ) *ds = test; else prev->next = test; DStemInfoFree( dn ); return( true ); } } /* Insert the given stem to the list by such a way that diagonal * stems are ordered by the X coordinate of the left edge key point, and * by Y if X is the same. The order is arbitrary, but may be essential for * things like "W". So we should be sure that the autoinstructor will * process diagonals from left to right. */ base = ( test->unit.y < 0 ) ? &test->right : &test->left; nbase = ( (*ds)->unit.y < 0 ) ? &(*ds)->right : &(*ds)->left; if ( base->x < nbase->x || ( base->x == nbase->x && base->y >= nbase->y )) { temp = *ds; *ds = test; (*ds)->next = temp; } else { for ( dn=*ds ; dn!=NULL && dn!=test ; dn=dn->next ) { next = dn->next; pbase = ( dn->unit.y < 0 ) ? &dn->right : &dn->left; if ( next != NULL ) nbase = ( next->unit.y < 0 ) ? &next->right : &next->left; if (( pbase->x < base->x || ( pbase->x == base->x && pbase->y >= base->y )) && ( next == NULL || base->x < nbase->x || ( base->x == nbase->x && base->y >= nbase->y ))) { test->next = next; dn->next = test; break; } } } return( true ); } 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->ghost = rh->ghost; 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( SplineFont *sf,DStemInfo *into,DStemInfo *rh, real xmul,real xoffset,real ymul,real yoffset ) { DStemInfo *new; double dmul; for ( ; rh!=NULL; rh=rh->next ) { new = chunkalloc( sizeof( DStemInfo )); *new = *rh; new->left.x = xmul*new->left.x + xoffset; new->right.x = xmul*new->right.x + xoffset; new->left.y = ymul*new->left.y + yoffset; new->right.y = ymul*new->right.y + yoffset; new->next = NULL; if (( xmul < 0 && ymul > 0 ) || ( xmul > 0 && ymul < 0 )) new->unit.y = -new->unit.y; new->unit.x *= fabs( xmul ); new->unit.y *= fabs( ymul ); dmul = sqrt( pow( new->unit.x,2 ) + pow( new->unit.y,2 )); new->unit.x /= dmul; new->unit.y /= dmul; if ( xmul < 0 ) dmul = -dmul; new->where = HICopyTrans( rh->where,dmul,0 ); MergeDStemInfo( sf,&into,new ); } return( into ); } static void __SplineCharAutoHint( SplineChar *sc, int layer, BlueData *bd, int gen_undoes ); static void AutoHintRefs(SplineChar *sc,int layer, BlueData *bd, int picky, int gen_undoes) { RefChar *ref; /* Add hints for base characters before accent hints => if there are any */ /* conflicts, the base characters win */ for ( ref=sc->layers[layer].refs; ref!=NULL; ref=ref->next ) { if ( ref->transform[1]==0 && ref->transform[2]==0 ) { if ( picky ) { if ( !ref->sc->manualhints && ref->sc->changedsincelasthinted && (ref->sc->layers[layer].refs!=NULL && ref->sc->layers[layer].splines==NULL)) AutoHintRefs(ref->sc,layer,bd,true,gen_undoes); } else if ( !ref->sc->manualhints && ref->sc->changedsincelasthinted ) __SplineCharAutoHint(ref->sc,layer,bd,gen_undoes); if ( ref->sc->unicodeenc!=-1 && ref->sc->unicodeenc<0x10000 && 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->parent,sc->dstem,ref->sc->dstem,ref->transform[0], ref->transform[4], ref->transform[3], ref->transform[5]); } } } for ( ref=sc->layers[layer].refs; ref!=NULL; ref=ref->next ) { if ( ref->transform[1]==0 && ref->transform[2]==0 && (ref->sc->unicodeenc==-1 || ref->sc->unicodeenc>=0x10000 || !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->parent,sc->dstem,ref->sc->dstem,ref->transform[0], ref->transform[4], ref->transform[3], ref->transform[5]); } } sc->vconflicts = StemListAnyConflicts(sc->vstem); sc->hconflicts = StemListAnyConflicts(sc->hstem); } static void _SCClearHintMasks(SplineChar *sc,int layer, int counterstoo) { SplineSet *spl; SplinePoint *sp; RefChar *ref; if ( layer<0 || layer>=sc->layer_cnt ) return; if ( counterstoo ) { free(sc->countermasks); sc->countermasks = NULL; sc->countermask_cnt = 0; } for ( spl = sc->layers[layer].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[layer].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, vbase; HintMask mask; StemInfo *h; 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 ( h=sc->hstem, vbase=0; h!=NULL; h=h->next, ++vbase ); for ( i=0; i<3 ; ++i ) { int j = i+vbase; mask[j>>3] |= (0x80>>(j&7)); } } sc->countermask_cnt = 1; sc->countermasks = malloc(sizeof(HintMask)); memcpy(sc->countermasks[0],mask,sizeof(HintMask)); return; } } void SCClearHintMasks(SplineChar *sc,int layer,int counterstoo) { MMSet *mm = sc->parent->mm; int i; if ( mm==NULL ) _SCClearHintMasks(sc,layer,counterstoo); else { for ( i=0; iinstance_count; ++i ) { if ( sc->orig_posinstances[i]->glyphcnt ) _SCClearHintMasks(mm->instances[i]->glyphs[sc->orig_pos],layer,counterstoo); } if ( sc->orig_posnormal->glyphcnt ) _SCClearHintMasks(mm->normal->glyphs[sc->orig_pos],layer,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->start<=h->start+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,sizeof(HintMask)); to[i]->hintmask = 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; for (;;) { for ( i=0; ifirst; else to[i] = NULL; } for (;;) { 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 layer,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[layer].splines; } if ( hmax==0 ) return; SplResolveSplitHints(scs,spl,instance_count,&hs,&vs); anymore = false; for ( i=0; ilayers[layer].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; } for (;;) { for ( i=0; ifirst; else to[i] = NULL; } for (;;) { 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; SplineSetReverse(spl[i]); } } if ( !anymore ) break; } return( inited ); } void SCFigureHintMasks(SplineChar *sc,int layer) { 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,layer,false); } else { if ( mm->apple ) return; instance_count = mm->instance_count; for ( i=0; iorig_pos < mm->instances[i]->glyphcnt ) { scs[i] = mm->instances[i]->glyphs[sc->orig_pos]; SCClearHintMasks(scs[i],layer,false); } ResolveSplitHints(scs,layer,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[layer].splines; ref[i] = scs[i]->layers[layer].refs; } inited = SplFigureHintMasks(scs,spl,instance_count,mask,false); for (;;) { 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 StemInfo *GDFindStems(struct glyphdata *gd, int major) { int i; StemInfo *head = NULL, *cur, *p, *t; StemBundle *bundle = major ? gd->vbundle : gd->hbundle; StemData *stem; int other = !major; double l, r; for ( i=0; icnt; ++i ) { stem = bundle->stemlist[i]; l = (&stem->left.x)[other]; r = (&stem->right.x)[other]; cur = chunkalloc( sizeof( StemInfo )); if ( lstart = l; cur->width = r - l; cur->haspointleft = stem->lpcnt > 0; cur->haspointright = stem->rpcnt > 0; } else { cur->start = r; cur->width = l - r; cur->haspointleft = stem->rpcnt > 0; cur->haspointright = stem->lpcnt > 0; } cur->ghost = stem->ghost; for ( p=NULL, t=head; t!=NULL ; p=t, t=t->next ) { if ( cur->start<=t->start ) break; } cur->next = t; if ( p==NULL ) head = cur; else p->next = cur; cur->where = StemAddHIFromActive(stem,major); } head = StemRemoveFlexCandidates(head); return( head ); } static DStemInfo *GDFindDStems(struct glyphdata *gd) { int i; DStemInfo *head = NULL, *cur ; struct stemdata *stem; for ( i=0; istemcnt; ++i ) { stem = &gd->stems[i]; /* A real diagonal stem should consist of one or more continuous * ranges. Thus the number of active zones should be less then the * number of stem chunks (i. e. pairs of the opposite points). If * each chunk has its own active zone, then we probably have got * not a real stem, but rather two (or more) separate point pairs, * which occasionally happened to have nearly the same vectors and * to be positioned on the same lines */ if ( stem->toobig ) continue; if (( stem->unit.y > -.05 && stem->unit.y < .05 ) || ( stem->unit.x > -.05 && stem->unit.x < .05 )) continue; if ( stem->lpcnt < 2 || stem->rpcnt < 2 ) continue; cur = chunkalloc( sizeof(DStemInfo) ); cur->left = stem->left; cur->right = stem->right; cur->unit = stem->unit; cur->where = DStemAddHIFromActive( stem ); MergeDStemInfo(gd->sf, &head, cur); } return( head ); } static bool inorder( real a, real b, real c ) { return a < b && b < c; } /** * If fluffy is near enough to exact then clamp to exact. * If fluffy is more than Tolerance away from exact then * just return fluffy (no change). */ static real clampToIfNear( real exact, real fluffy, real Tolerance ) { if( inorder( exact - Tolerance, fluffy, exact + Tolerance )) return exact; return fluffy; } void _SplineCharAutoHint( SplineChar *sc, int layer, BlueData *bd, struct glyphdata *gd2, int gen_undoes ) { struct glyphdata *gd; 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 */ sc->changedsincelasthinted = false; sc->manualhints = false; if ( (gd=gd2)==NULL ) gd = GlyphDataBuild( sc,layer,bd,false ); if ( gd!=NULL ) { sc->vstem = GDFindStems(gd,1); sc->hstem = GDFindStems(gd,0); if ( !gd->only_hv ) sc->dstem = GDFindDStems(gd); if ( gd2==NULL ) GlyphDataFree(gd); } real AutohintRoundingTolerance = 0.005; StemInfo* s = sc->hstem; for( ; s; s = s->next ) { s->width = clampToIfNear( 20.0, s->width, AutohintRoundingTolerance ); s->width = clampToIfNear( 21.0, s->width, AutohintRoundingTolerance ); } AutoHintRefs(sc,layer,bd,false,gen_undoes); } static void __SplineCharAutoHint( SplineChar *sc, int layer, BlueData *bd, int gen_undoes ) { MMSet *mm = sc->parent->mm; int i; if ( mm==NULL ) _SplineCharAutoHint(sc,layer,bd,NULL,gen_undoes); else { for ( i=0; iinstance_count; ++i ) if ( sc->orig_pos < mm->instances[i]->glyphcnt ) _SplineCharAutoHint(mm->instances[i]->glyphs[sc->orig_pos],layer,NULL,NULL,gen_undoes); if ( sc->orig_pos < mm->normal->glyphcnt ) _SplineCharAutoHint(mm->normal->glyphs[sc->orig_pos],layer,NULL,NULL,gen_undoes); } SCFigureHintMasks(sc,layer); } void SplineCharAutoHint( SplineChar *sc, int layer, BlueData *bd ) { __SplineCharAutoHint(sc,layer,bd,true); } void SFSCAutoHint( SplineChar *sc, int layer, BlueData *bd ) { RefChar *ref; if ( sc->ticked ) return; for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { if ( !ref->sc->ticked ) SFSCAutoHint(ref->sc,layer,bd); } sc->ticked = true; SplineCharAutoHint(sc,layer,bd); } void SplineFontAutoHint( SplineFont *_sf,int layer) { int i,k; SplineFont *sf; BlueData *bd = NULL, _bd; SplineChar *sc; if ( _sf->mm==NULL ) { QuickBlues(_sf,layer,&_bd); bd = &_bd; } /* Tick the ones we don't want to AH, untick the ones that need AH */ k=0; do { sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k]; for ( i=0; iglyphcnt; ++i ) if ( (sc = sf->glyphs[i])!=NULL ) sc->ticked = ( !sc->changedsincelasthinted || sc->manualhints ); ++k; } while ( k<_sf->subfontcnt ); k=0; do { sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k]; for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { if ( sf->glyphs[i]->changedsincelasthinted && !sf->glyphs[i]->manualhints ) SFSCAutoHint(sf->glyphs[i],layer,bd); if ( !ff_progress_next()) { k = _sf->subfontcnt+1; break; } } ++k; } while ( k<_sf->subfontcnt ); } void SplineFontAutoHintRefs( SplineFont *_sf,int layer) { int i,k; SplineFont *sf; BlueData *bd = NULL, _bd; SplineChar *sc; if ( _sf->mm==NULL ) { QuickBlues(_sf,layer,&_bd); bd = &_bd; } k=0; do { sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k]; for ( i=0; iglyphcnt; ++i ) if ( (sc = sf->glyphs[i])!=NULL ) { if ( sc->changedsincelasthinted && !sc->manualhints && (sc->layers[layer].refs!=NULL && sc->layers[layer].splines==NULL)) { StemInfosFree(sc->vstem); sc->vstem=NULL; StemInfosFree(sc->hstem); sc->hstem=NULL; AutoHintRefs(sc,layer,bd,true,true); } } ++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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) { stems = which?sf->glyphs[i]->hstem:sf->glyphs[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 IsFlexSmooth(SplinePoint *sp) { BasePoint nvec, pvec; double proj_same, proj_normal; if ( sp->nonextcp || sp->noprevcp ) return( false ); /* No continuity of slopes */ nvec.x = sp->nextcp.x - sp->me.x; nvec.y = sp->nextcp.y - sp->me.y; pvec.x = sp->me.x - sp->prevcp.x; pvec.y = sp->me.y - sp->prevcp.y; /* Avoid cases where the slopes are 180 out of phase */ if ( (proj_same = nvec.x*pvec.x + nvec.y*pvec.y)<=0 ) return( false ); if ( (proj_normal = nvec.x*pvec.y - nvec.y*pvec.x)<0 ) proj_normal = -proj_normal; /* Something is smooth if the normal projection is 0. Let's allow for */ /* some rounding errors */ if ( proj_same >= 16*proj_normal ) return( true ); return( false ); } static int _SplineCharIsFlexible(SplineChar *sc, int layer, 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 the inner point's cps must be at the x (or y) value as the extremum (I think) */ /* We want long, nearly straight stems. If the end-points should not have continuous slopes, or if they do, they must be horizontal/vertical. This is an heuristic requirement, not part of Adobe's spec. */ SplineSet *spl; SplinePoint *sp, *np, *pp; int max=0, val; RefChar *r; if ( sc==NULL ) return(false); for ( spl = sc->layers[layer].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) && (!IsFlexSmooth(pp) || RealNear(pp->nextcp.x,pp->me.x)) && (!IsFlexSmooth(np) || RealNear(np->prevcp.x,np->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) && (!IsFlexSmooth(pp) || RealNear(pp->nextcp.y,pp->me.y)) && (!IsFlexSmooth(np) || RealNear(np->prevcp.y,np->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->layers[layer].anyflexes = max>0; if ( max==0 ) for ( r = sc->layers[layer].refs; r!=NULL ; r=r->next ) if ( r->sc->layers[layer].anyflexes ) { sc->layers[layer].anyflexes = true; break; } return( max ); } static void SCUnflex(SplineChar *sc, int layer) { SplineSet *spl; SplinePoint *sp; for ( spl = sc->layers[layer].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->layers[layer].anyflexes = false; } static void FlexDependents(SplineChar *sc,int layer) { struct splinecharlist *scl; sc->layers[layer].anyflexes = true; for ( scl = sc->dependents; scl!=NULL; scl=scl->next ) FlexDependents(scl->sc,layer); } int SplineFontIsFlexible(SplineFont *sf,int layer, 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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) SCUnflex(sf->glyphs[i],layer); 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; iglyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) if ( sf->glyphs[i]!=NULL ) { val = _SplineCharIsFlexible(sf->glyphs[i],layer,blueshift); if ( val>max ) max = val; if ( sf->glyphs[i]->layers[layer].anyflexes ) FlexDependents(sf->glyphs[i],layer); } return( max ); } dvisvgm-2.8.1/libs/ff-woff/fontforge/dumppfa.c0000664000175000017500000001021113510660062016172 00000000000000/* Copyright (C) 2000-2012 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 "fontforge.h" #include #ifdef __CygWin #include #include #include #endif char *PSDictHasEntry(struct psdict *dict, const 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 PSDictSame(struct psdict *dict1, struct psdict *dict2) { int i; if ( (dict1==NULL || dict1->cnt==0) && (dict2==NULL || dict2->cnt==0)) return( true ); if ( dict1==NULL || dict2==NULL || dict1->cnt!=dict2->cnt ) return( false ); for ( i=0; icnt; ++i ) { char *val = PSDictHasEntry(dict2,dict1->keys[i]); if ( val==NULL || strcmp(val,dict1->values[i])!=0 ) return( false ); } return( true ); } /* Inside a font, I can't use a as a data source. Probably because */ /* the parser doesn't know what to do with those data when building the char */ /* proc (as opposed to executing) */ /* So I can't use run length filters or other compression technique */ static double FindMaxDiffOfBlues(char *pt, double max_diff) { char *end; double p1, p2; while ( *pt==' ' || *pt=='[' ) ++pt; for (;;) { p1 = strtod(pt,&end); if ( end==pt ) break; pt = end; p2 = strtod(pt,&end); if ( end==pt ) break; if ( p2-p1 >max_diff ) max_diff = p2-p1; pt = end; } return( max_diff ); } double BlueScaleFigureForced(struct psdict *private_,real bluevalues[], real otherblues[]) { double max_diff=0; char *pt; int i; pt = PSDictHasEntry(private_,"BlueValues"); if ( pt!=NULL ) { max_diff = FindMaxDiffOfBlues(pt,max_diff); } else if ( bluevalues!=NULL ) { for ( i=0; i<14 && (bluevalues[i]!=0 || bluevalues[i+1])!=0; i+=2 ) { if ( bluevalues[i+1] - bluevalues[i]>=max_diff ) max_diff = bluevalues[i+1] - bluevalues[i]; } } pt = PSDictHasEntry(private_,"FamilyBlues"); if ( pt!=NULL ) max_diff = FindMaxDiffOfBlues(pt,max_diff); pt = PSDictHasEntry(private_,"OtherBlues"); if ( pt!=NULL ) max_diff = FindMaxDiffOfBlues(pt,max_diff); else if ( otherblues!=NULL ) { for ( i=0; i<10 && (otherblues[i]!=0 || otherblues[i+1]!=0); i+=2 ) { if ( otherblues[i+1] - otherblues[i]>=max_diff ) max_diff = otherblues[i+1] - otherblues[i]; } } pt = PSDictHasEntry(private_,"FamilyOtherBlues"); if ( pt!=NULL ) max_diff = FindMaxDiffOfBlues(pt,max_diff); if ( max_diff<=0 ) return( -1 ); if ( 1/max_diff > .039625 ) return( -1 ); return rint(240.0*0.99/max_diff)/240.0; } double BlueScaleFigure(struct psdict *private_,real bluevalues[], real otherblues[]) { if ( PSDictHasEntry(private_,"BlueScale")!=NULL ) return( -1 ); return BlueScaleFigureForced(private_, bluevalues, otherblues); } dvisvgm-2.8.1/libs/ff-woff/fontforge/tottfgpos.c0000664000175000017500000044407413510660062016611 00000000000000/* Copyright (C) 2000-2012 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 "fontforgevw.h" #include int coverageformatsallowed=3; int use_second_indic_scripts = false; #include "ttf.h" /* This file contains routines to create the otf gpos and gsub tables and their */ /* attendant subtables */ /* Undocumented fact: ATM (which does kerning for otf fonts in Word) can't handle features with multiple lookups */ /* 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 */ /* scripts (for opentype) that I understand */ /* see also list in lookups.c mapping script tags to friendly names */ static uint32 scripts[][15] = { /* Arabic */ { CHR('a','r','a','b'), 0x0600, 0x06ff, 0xfb50, 0xfdff, 0xfe70, 0xfefe }, /* Aramaic */ { CHR('a','r','a','m'), 0x820, 0x83f }, /* Armenian */ { CHR('a','r','m','n'), 0x0530, 0x058f, 0xfb13, 0xfb17 }, /* Balinese */ { CHR('b','a','l','i'), 0x1b00, 0x1b7f }, /* 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 }, /* Buginese */ { CHR('b','u','g','i'), 0x1a00, 0x1a1f }, /* 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 }, /* Carian */ {CHR('c','a','r','i'), 0x0, 0x0 }, /* Cham */ {CHR('c','h','a','m'), 0x0, 0x0 }, /* Cherokee */ { CHR('c','h','e','r'), 0x13a0, 0x13ff }, /* Cirth */ { CHR('c','i','r','t'), 0x12080, 0x120ff }, /* CJKIdeogra */{ CHR('h','a','n','i'), 0x3300, 0x9fff, 0xf900, 0xfaff, 0x020000, 0x02ffff }, /* Coptic */ { CHR('c','o','p','t'), 0x2c80, 0x2cff }, /* Cypriot */ { CHR('c','p','m','n'), 0x10800, 0x1083f }, /* Cyrillic */ { CHR('c','y','r','l'), 0x0400, 0x052f, 0x1d2b, 0x1d2b, 0x1d78, 0x1d78, 0x2de0, 0x2dff, 0xa640, 0xa6ff }, /* 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 }, /* Glagolitic */{ CHR('g','l','a','g'), 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'? */ /* Hebrew */ { CHR('h','e','b','r'), 0x0590, 0x05ff, 0xfb1e, 0xfb4f }, /* Hiragana used to have its own tag 'hira', but has since been merged with katakana */ /* Hangul Jamo*/{ CHR('j','a','m','o'), 0x1100, 0x11ff, 0x3130, 0x319f, 0xffa0, 0xffdf }, /* Javanese */ { CHR('j','a','v','a'), 0 }, /* MS has a tag, but there is no unicode range */ /* Katakana */ { CHR('k','a','n','a'), 0x3040, 0x30ff, 0xff60, 0xff9f }, /* Kayah Li */ { CHR('k','a','l','i'), 0 }, /* Kannada */ { CHR('k','n','d','a'), 0x0c80, 0x0cff }, /* Kharosthi */ { CHR('k','h','a','r'), 0x10a00, 0x10a5f }, /* Khmer */ { CHR('k','h','m','r'), 0x1780, 0x17ff }, /* Latin */ { CHR('l','a','t','n'), 0x0041, 0x005a, 0x0061, 0x007a, 0x00c0, 0x02af, 0x1d00, 0x1eff, 0xfb00, 0xfb0f, 0xff00, 0xff5f, 0xa770, 0xa7ff }, /* Lao */ { CHR('l','a','o',' '), 0x0e80, 0x0eff }, /* Lepcha */ { CHR('l','e','p','c'), 0 }, /* Limbu */ { CHR('l','i','m','b'), 0x1900, 0x194f }, /* Linear A */ /*{ CHR('l','i','n','a'), 0x10180, 0x102cf },*/ /* What happened to linear A? */ /* Linear B */ { CHR('l','i','n','b'), 0x10000, 0x100fa }, /* Lycian */ { CHR('l','y','c','i'), 0 }, /* Lydian */ { CHR('l','y','d','i'), 0 }, /* Malayalam */ { CHR('m','l','y','m'), 0x0d00, 0x0d7f }, /* Mathematical Alphanumeric Symbols */ { CHR('m','a','t','h'), 0x1d400, 0x1d7ff }, /* Mongolian */ { CHR('m','o','n','g'), 0x1800, 0x18af }, /* Musical */ { CHR('m','u','s','c'), 0x1d100, 0x1d1ff }, /* Myanmar */ { CHR('m','y','m','r'), 0x1000, 0x107f }, /* New Tai Lue*/{ CHR('t','a','l','u'), 0 }, /* N'Ko */ { CHR('n','k','o',' '), 0x07c0, 0x07fa }, /* Ogham */ { CHR('o','g','a','m'), 0x1680, 0x169f }, /* Ol Chiki */ { CHR('o','l','c','k'), 0 }, /* Old Italic */{ CHR('i','t','a','l'), 0x10300, 0x1031e }, /* Old Permic */{ CHR('p','e','r','m'), 0x10350, 0x1037f }, /* Old Persian cuneiform */ { CHR('x','p','e','o'), 0x103a0, 0x103df }, /* Oriya */ { CHR('o','r','y','a'), 0x0b00, 0x0b7f }, /* Osmanya */ { CHR('o','s','m','a'), 0x10480, 0x104a9 }, /* Phags-pa */ { CHR('p','h','a','g'), 0xa840, 0xa87f }, /* Phoenician */{ CHR('p','h','n','x'), 0x10900, 0x1091f }, /* Pollard */ { CHR('p','l','r','d'), 0x104b0, 0x104d9 }, /* Rejang */ { CHR('r','j','n','g'), 0 }, /* Rongorongo */{ CHR('r','o','r','o'), 0 }, /* Runic */ { CHR('r','u','n','r'), 0x16a0, 0x16ff }, /* Saurashtra*/ { CHR('s','a','u','r'), 0 }, /* Shavian */ { CHR('s','h','a','w'), 0x10450, 0x1047f }, /* Sinhala */ { CHR('s','i','n','h'), 0x0d80, 0x0dff }, /* Sumero-Akkadian Cuneiform */ { CHR('x','s','u','x'), 0x12000, 0x1236e }, /* Sundanese */ { CHR('s','u','n','d'), 0 }, /* Syloti Nagri */ { CHR('s','y','l','o'), 0xa800, 0xa82f }, /* 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','l','e'), 0x1950, 0x1974 }, /* Tai Lu */ { CHR('t','a','l','u'), 0x1980, 0x19df }, /* 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 }, /* Tifinagh */ { CHR('t','f','n','g'), 0x2d30, 0x2d7f }, /* Ugaritic */ { CHR('u','g','a','r'), 0x10380, 0x1039d }, /* Yi */ { CHR('y','i',' ',' '), 0xa000, 0xa4c6 }, { 0 } }; static SplineChar **SFOrderedGlyphs(SplineChar **glyphs); 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') || script==CHR('s','y','r','c') || script==CHR('t','h','a','a') || script==CHR('n','k','o',' ')) return( true ); return( false ); } uint32 ScriptFromUnicode(uint32 u,SplineFont *sf) { int s, k; if ( (int32)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 ) { uint32 script = scripts[s][0]; if ( use_second_indic_scripts ) { /* MS has a parallel set of script tags for their new */ /* Indic font shaper */ if ( script == CHR('b','e','n','g' )) script = CHR('b','n','g','2'); else if ( script == CHR('d','e','v','a' )) script = CHR('d','e','v','2'); else if ( script == CHR('g','u','j','r' )) script = CHR('g','j','r','2'); else if ( script == CHR('g','u','r','u' )) script = CHR('g','u','r','2'); else if ( script == CHR('k','n','d','a' )) script = CHR('k','n','d','2'); else if ( script == CHR('m','l','y','m' )) script = CHR('m','l','m','2'); else if ( script == CHR('o','r','y','a' )) script = CHR('o','r','y','2'); else if ( script == CHR('t','a','m','l' )) script = CHR('t','m','l','2'); else if ( script == CHR('t','e','l','u' )) script = CHR('t','e','l','2'); } return( script ); } } else if ( sf!=NULL ) { if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; if ( strmatch(sf->ordering,"Identity")==0 ) return( DEFAULT_SCRIPT ); else if ( strmatch(sf->ordering,"Korean")==0 ) return( CHR('h','a','n','g')); else return( CHR('h','a','n','i') ); } } return( DEFAULT_SCRIPT ); } uint32 SCScriptFromUnicode(SplineChar *sc) { const char *pt; PST *pst; SplineFont *sf; int i; unsigned uni; FeatureScriptLangList *features; if ( sc==NULL ) return( DEFAULT_SCRIPT ); sf = sc->parent; if ( sc->unicodeenc!=-1 && !(sc->unicodeenc>=0xe000 && sc->unicodeenc<0xf8ff) && !(sc->unicodeenc>=0xf0000 && sc->unicodeenc<0x10ffff)) return( ScriptFromUnicode( sc->unicodeenc,sf )); pt = sc->name; if ( *pt ) for ( ++pt; *pt!='\0' && *pt!='_' && *pt!='.'; ++pt ); if ( *pt!='\0' ) { char *str = copyn(sc->name,pt-sc->name); int uni = UniFromName(str,ui_none,&custom); 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; else if ( sf->mm!=NULL ) sf=sf->mm->normal; for ( i=0; i<2; ++i ) { for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->type == pst_lcaret ) continue; for ( features = pst->subtable->lookup->features; features!=NULL; features=features->next ) { if ( features->scripts!=NULL ) return( features->scripts->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))); } 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 lookup_subtable *sub) { SplineChar *spc[30], **space = spc; int max = sizeof(spc)/sizeof(spc[0]); int cnt=0; char *pt, *start; SplineChar *subssc, **ret; PST *pst; for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable==sub ) { pt = pst->u.subs.variant; while ( 1 ) { while ( *pt==' ' ) ++pt; // Burn leading spaces. // Start tokenizing the space-delimited list of references. start = pt; // Note the beginning of the current item. pt = strchr(start,' '); // Find the end of the current item. if ( pt!=NULL ) *pt = '\0'; // Temporarily terminate the item. subssc = SFGetChar(sc->parent,-1,start); // Find the corresponding SplineChar. if ( subssc!=NULL && subssc->ttf_glyph!=-1 ) { // Extend the list if necessary. if ( cnt>=max ) { if ( spc==space ) { space = malloc((max+=30)*sizeof(SplineChar *)); memcpy(space,spc,(max-30)*sizeof(SplineChar *)); } else space = realloc(space,(max+=30)*sizeof(SplineChar *)); } // Write the SplineChar to the list. space[cnt++] = subssc; } if ( pt==NULL ) break; // No more items. *pt=' '; // Repair the string from the tokenization process. } } } // Returning NULL causes problems and seems to be unnecessary for now. ret = malloc((cnt+1)*sizeof(SplineChar *)); memcpy(ret,space,cnt*sizeof(SplineChar *)); ret[cnt] = NULL; if ( space!=spc ) free(space); // Free the temp space only if it is dynamically allocated. return( ret ); } static SplineChar ***generateMapList(SplineChar **glyphs, struct lookup_subtable *sub) { int cnt; SplineChar *sc; int i; SplineChar ***maps=NULL; for ( cnt=0; glyphs[cnt]!=NULL; ++cnt ); maps = malloc((cnt+1)*sizeof(SplineChar **)); for ( i=0; iname ? glyphs[i]->name : ""), sub->subtable_name) ; } } maps[cnt] = NULL; return( maps ); } void AnchorClassDecompose(SplineFont *sf,AnchorClass *_ac, int classcnt, int *subcnts, SplineChar ***marks,SplineChar ***base, SplineChar ***lig,SplineChar ***mkmk, struct glyphinfo *gi) { /* 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,gid, gmax; 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 **)); gmax = gi==NULL ? sf->glyphcnt : gi->gcnt; for ( j=0; j<2; ++j ) { for ( i=0; ibygid[i])!=-1 && gid < sf->glyphcnt && sf->glyphs[gid]!=NULL ) { for ( ac = _ac, k=0; knext ) if ( ac->matches ) { for ( test=sf->glyphs[gid]->anchor; test!=NULL ; test=test->next ) { if ( test->anchor==ac ) { if ( test->type==at_mark ) { if ( j ) marks[k][subcnts[k]] = sf->glyphs[gid]; ++subcnts[k]; if ( ac->type!=act_mkmk ) break; } else if ( test->type!=at_centry && test->type!=at_cexit ) { if ( heads[test->type].glyphs!=NULL ) { /* If we have multiple mark classes, we may use the same base glyph */ /* with more than one mark class. But it should only appear once in */ /* the output */ if ( heads[test->type].cnt==0 || heads[test->type].glyphs[heads[test->type].cnt-1]!=sf->glyphs[gid] ) { heads[test->type].glyphs[heads[test->type].cnt] = sf->glyphs[gid]; ++heads[test->type].cnt; } } else ++heads[test->type].cnt; if ( ac->type!=act_mkmk ) break; } } } ++k; } } if ( j==1 ) break; for ( i=0; i<4; ++i ) if ( heads[i].cnt!=0 ) { heads[i].glyphs = malloc((heads[i].cnt+1)*sizeof(SplineChar *)); /* I used to set glyphs[cnt] to NULL here. But it turns out */ /* cnt may be an overestimate on the first pass. So we can */ /* only set it at the end of the second pass */ heads[i].cnt = 0; } for ( k=0; kglyphcnt : gi->gcnt; for ( j=0; j<2; ++j ) { cnt = 0; for ( i=0; ibygid[i])!=-1 && sf->glyphs[gid]!=NULL ) { for ( test=sf->glyphs[gid]->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->glyphs[gid]; ++cnt; } } if ( cnt==0 ) return( NULL ); if ( j==1 ) break; array = malloc((cnt+1)*sizeof(SplineChar *)); array[cnt] = NULL; } return( array ); } static void AnchorGuessContext(SplineFont *sf,struct alltabs *at) { int i; int maxbase=0, maxmark=0, basec, markc; AnchorPoint *ap; int hascursive = 0; /* the order in which we examine the glyphs does not matter here, so */ /* we needn't add the complexity running though in gid order */ for ( i=0; iglyphcnt; ++i ) if ( sf->glyphs[i] ) { basec = markc = 0; for ( ap = sf->glyphs[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, r; /* 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 ) IError("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 */ r = 0; 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 */ ++r; } 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 */ ++r; } if ( r!=range_cnt ) IError("Miscounted ranges in format 2 coverage table output"); } } static int sc_ttf_order( const void *_sc1, const void *_sc2) { const SplineChar *sc1 = *(const SplineChar **) _sc1, *sc2 = *(const SplineChar **) _sc2; return( sc1->ttf_glyph - sc2->ttf_glyph ); } static SplineChar **SFOrderedGlyphs(SplineChar **glyphs) { int cnt, i, k; if ( glyphs==NULL ) return( NULL ); for ( cnt=0; glyphs[cnt]!=NULL; ++cnt); qsort(glyphs,cnt,sizeof(SplineChar *),sc_ttf_order); if ( glyphs[0]->ttf_glyph==-1 ) { /* Not sure if this can happen, but it's easy to fix */ for ( k=0; kttf_glyph==-1; ++k); for ( i=0; i<=cnt-k; ++i ) glyphs[i] = glyphs[i+k]; } for ( i=0; ittf_glyph==glyphs[i+1]->ttf_glyph) { memmove(glyphs+i, glyphs+i+1, (cnt-i)*sizeof(SplineChar *)); --cnt; } return( glyphs ); } static SplineChar **SFOrderedGlyphsWithPSTinSubtable(SplineFont *sf,struct lookup_subtable *sub) { SplineChar **glyphs = SFGlyphsWithPSTinSubtable(sf,sub); return SFOrderedGlyphs(glyphs); } SplineChar **SFGlyphsFromNames(SplineFont *sf,char *names) { int cnt, ch; char *pt, *end; SplineChar *sc, **glyphs; if ( names==NULL ) return( calloc(1,sizeof(SplineChar *)) ); cnt = 0; for ( pt = names; *pt; pt = end+1 ) { ++cnt; end = strchr(pt,' '); if ( end==NULL ) break; } glyphs = malloc((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 = SFGetChar(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; } } if ( glyphs[0]!=NULL ) { /* Glyphs should not appear twice in the name list, just just in case they do... */ for ( i=0; glyphs[i+1]!=NULL; ++i ) { if ( glyphs[i]==glyphs[i+1] ) { for ( j=i+1; glyphs[j]!=NULL; ++j ) glyphs[j] = glyphs[j+1]; } } } return( glyphs ); } static void gposvrmaskeddump(FILE *gpos,int vf1,int mask,int offset) { if ( vf1&1 ) putshort(gpos,mask&1 ? offset : 0 ); if ( vf1&2 ) putshort(gpos,mask&2 ? offset : 0 ); if ( vf1&4 ) putshort(gpos,mask&4 ? offset : 0 ); if ( vf1&8 ) putshort(gpos,mask&8 ? offset : 0 ); } static int devtaboffsetsize(DeviceTable *dt) { int type = 1, i; for ( i=dt->last_pixel_size-dt->first_pixel_size; i>=0; --i ) { if ( dt->corrections[i]>=8 || dt->corrections[i]<-8 ) return( 3 ); else if ( dt->corrections[i]>=2 || dt->corrections[i]<-2 ) type = 2; } return( type ); } static void dumpgposdevicetable(FILE *gpos,DeviceTable *dt) { int type; int i,cnt,b; if ( dt==NULL || dt->corrections==NULL ) return; type = devtaboffsetsize(dt); putshort(gpos,dt->first_pixel_size); putshort(gpos,dt->last_pixel_size ); putshort(gpos,type); cnt = dt->last_pixel_size - dt->first_pixel_size + 1; if ( type==3 ) { for ( i=0; icorrections[i],gpos); if ( cnt&1 ) putc(0,gpos); } else if ( type==2 ) { for ( i=0; icorrections[i+b]&0x000f)<<(12-b*4); putshort(gpos,val); } } else { for ( i=0; icorrections[i+b]&0x0003)<<(14-b*2); putshort(gpos,val); } } } static int DevTabLen(DeviceTable *dt) { int type; int cnt; if ( dt==NULL || dt->corrections==NULL ) return( 0 ); cnt = dt->last_pixel_size - dt->first_pixel_size + 1; type = devtaboffsetsize(dt); if ( type==3 ) cnt = (cnt+1)/2; else if ( type==2 ) cnt = (cnt+3)/4; else cnt = (cnt+7)/8; cnt += 3; /* first, last, type */ return( sizeof(uint16)*cnt ); } static int ValDevTabLen(ValDevTab *vdt) { if ( vdt==NULL ) return( 0 ); return( DevTabLen(&vdt->xadjust) + DevTabLen(&vdt->yadjust) + DevTabLen(&vdt->xadv) + DevTabLen(&vdt->yadv) ); } static int gposdumpvaldevtab(FILE *gpos,ValDevTab *vdt,int bits,int next_dev_tab ) { if ( bits&0x10 ) { if ( vdt==NULL || vdt->xadjust.corrections==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&vdt->xadjust); } } if ( bits&0x20 ) { if ( vdt==NULL || vdt->yadjust.corrections==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&vdt->yadjust); } } if ( bits&0x40 ) { if ( vdt==NULL || vdt->xadv.corrections==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&vdt->xadv); } } if ( bits&0x80 ) { if ( vdt==NULL || vdt->yadv.corrections==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&vdt->yadv); } } return( next_dev_tab ); } static int gposmaskeddumpdevtab(FILE *gpos,DeviceTable *dt,int bits,int mask, int next_dev_tab ) { if ( bits&0x10 ) { if ( !(mask&0x10) || dt==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(dt); } } if ( bits&0x20 ) { if ( !(mask&0x20) || dt==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(dt); } } if ( bits&0x40 ) { if ( !(mask&0x40) || dt==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(dt); } } if ( bits&0x80 ) { if ( !(mask&0x80) || dt==NULL ) putshort(gpos,0); else { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(dt); } } return( next_dev_tab ); } static int DevTabsSame(DeviceTable *dt1, DeviceTable *dt2) { DeviceTable _dt; int i; if ( dt1==NULL && dt2==NULL ) return( true ); if ( dt1==NULL ) { memset(&_dt,0,sizeof(_dt)); dt1 = &_dt; } if ( dt2==NULL ) { memset(&_dt,0,sizeof(_dt)); dt2 = &_dt; } if ( dt1->corrections==NULL && dt2->corrections==NULL ) return( true ); if ( dt1->corrections==NULL || dt2->corrections==NULL ) return( false ); if ( dt1->first_pixel_size!=dt2->first_pixel_size || dt1->last_pixel_size!=dt2->last_pixel_size ) return( false ); for ( i=dt2->last_pixel_size-dt1->first_pixel_size; i>=0; --i ) if ( dt1->corrections[i]!=dt2->corrections[i] ) return( false ); return( true ); } static int ValDevTabsSame(ValDevTab *vdt1, ValDevTab *vdt2) { ValDevTab _vdt; if ( vdt1==NULL && vdt2==NULL ) return( true ); if ( vdt1==NULL ) { memset(&_vdt,0,sizeof(_vdt)); vdt1 = &_vdt; } if ( vdt2==NULL ) { memset(&_vdt,0,sizeof(_vdt)); vdt2 = &_vdt; } return( DevTabsSame(&vdt1->xadjust,&vdt2->xadjust) && DevTabsSame(&vdt1->yadjust,&vdt2->yadjust) && DevTabsSame(&vdt1->xadv,&vdt2->xadv) && DevTabsSame(&vdt1->yadv,&vdt2->yadv) ); } static void dumpGPOSsimplepos(FILE *gpos,SplineFont *sf,struct lookup_subtable *sub ) { int cnt, cnt2; int32 coverage_pos, end; PST *pst, *first=NULL; int bits = 0, same=true; SplineChar **glyphs; glyphs = SFOrderedGlyphsWithPSTinSubtable(sf,sub); for ( cnt=cnt2=0; glyphs[cnt]!=NULL; ++cnt) { for ( pst=glyphs[cnt]->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable==sub && 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 ( !ValDevTabsSame(pst->u.pos.adjust,first->u.pos.adjust)) 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; if ( pst->u.pos.adjust!=NULL ) { if ( pst->u.pos.adjust->xadjust.corrections!=NULL ) bits |= 0x10; if ( pst->u.pos.adjust->yadjust.corrections!=NULL ) bits |= 0x20; if ( pst->u.pos.adjust->xadv.corrections!=NULL ) bits |= 0x40; if ( pst->u.pos.adjust->yadv.corrections!=NULL ) bits |= 0x80; } ++cnt2; break; } } } if ( bits==0 ) bits=1; if ( cnt!=cnt2 ) IError( "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); if ( bits&0xf0 ) { int next_dev_tab = ftell(gpos)-coverage_pos+2+ sizeof(int16)*((bits&0x10?1:0) + (bits&0x20?1:0) + (bits&0x40?1:0) + (bits&0x80?1:0)); if ( bits&0x10 ) { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&first->u.pos.adjust->xadjust); } if ( bits&0x20 ) { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&first->u.pos.adjust->yadjust); } if ( bits&0x40 ) { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&first->u.pos.adjust->xadv); } if ( bits&0x80 ) { putshort(gpos,next_dev_tab); next_dev_tab += DevTabLen(&first->u.pos.adjust->yadv); } if ( bits&0x10 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->xadjust); if ( bits&0x20 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->yadjust); if ( bits&0x40 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->xadv); if ( bits&0x80 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->yadv); if ( next_dev_tab!=ftell(gpos)-coverage_pos+2 ) IError( "Device Table offsets wrong in simple positioning 2"); } } else { int vr_size = sizeof(int16)*((bits&0x1?1:0) + (bits&0x2?1:0) + (bits&0x4?1:0) + (bits&0x8?1:0) + (bits&0x10?1:0) + (bits&0x20?1:0) + (bits&0x40?1:0) + (bits&0x80?1:0)); int next_dev_tab = ftell(gpos)-coverage_pos+2+2+vr_size*cnt; putshort(gpos,cnt); for ( cnt2 = 0; glyphs[cnt2]!=NULL; ++cnt2 ) { for ( pst=glyphs[cnt2]->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable==sub && 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); next_dev_tab = gposdumpvaldevtab(gpos,pst->u.pos.adjust,bits, next_dev_tab); break; } } } if ( cnt!=cnt2 ) IError( "Count mismatch in dumpGPOSsimplepos#3 %d vs %d\n", cnt, cnt2 ); if ( bits&0xf0 ) { for ( cnt2 = 0; glyphs[cnt2]!=NULL; ++cnt2 ) { for ( pst=glyphs[cnt2]->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable==sub && pst->type==pst_position ) { if ( bits&0x10 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->xadjust); if ( bits&0x20 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->yadjust); if ( bits&0x40 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->xadv); if ( bits&0x80 ) dumpgposdevicetable(gpos,&first->u.pos.adjust->yadv); } } } } if ( next_dev_tab!=ftell(gpos)-coverage_pos+2 ) IError( "Device Table offsets wrong in simple positioning 2"); } 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); } struct sckppst { uint16 samewas; uint16 devtablen; uint16 tot; uint8 isv; uint8 subtable_too_big; /* The first few fields are only meaningful in the first structure in the array*/ /* and provide information about the entire rest of the array */ uint16 other_gid; SplineChar *sc; KernPair *kp; PST *pst; }; static int cmp_gid( const void *_s1, const void *_s2 ) { const struct sckppst *s1 = _s1, *s2 = _s2; return( ((int) s1->other_gid) - ((int) s2->other_gid) ); } static void dumpGPOSpairpos(FILE *gpos,SplineFont *sf,struct lookup_subtable *sub) { int cnt; int32 coverage_pos, offset_pos, end, start, pos; PST *pst; KernPair *kp; int vf1 = 0, vf2=0, i, j, k, tot, bit_cnt, v; int start_cnt, end_cnt; int chunk_cnt, chunk_max; SplineChar *sc, **glyphs, *gtemp; struct sckppst **seconds; int devtablen; int next_dev_tab; /* Figure out all the data we need. First the glyphs with kerning info */ /* then the glyphs to which they kern, and by how much */ glyphs = SFOrderedGlyphsWithPSTinSubtable(sf,sub); for ( cnt=0; glyphs[cnt]!=NULL; ++cnt); seconds = malloc(cnt*sizeof(struct sckppst *)); for ( cnt=0; glyphs[cnt]!=NULL; ++cnt) { for ( k=0; k<2; ++k ) { devtablen = 0; tot = 0; for ( pst=glyphs[cnt]->possub; pst!=NULL; pst=pst->next ) { if ( pst->subtable==sub && pst->type==pst_pair && (sc = SFGetChar(sf,-1,pst->u.pair.paired))!=NULL && sc->ttf_glyph!=-1 ) { if ( k ) { seconds[cnt][tot].sc = sc; seconds[cnt][tot].other_gid = sc->ttf_glyph; seconds[cnt][tot].pst = pst; devtablen += ValDevTabLen(pst->u.pair.vr[0].adjust) + ValDevTabLen(pst->u.pair.vr[1].adjust); } ++tot; } } for ( v=0; v<2; ++v ) { for ( kp = v ? glyphs[cnt]->vkerns : glyphs[cnt]->kerns; kp!=NULL; kp=kp->next ) { if( kp->subtable!=sub ) continue; // process only glyphs from the current subtable if ( kp->sc->ttf_glyph!=-1 ) { if ( k ) { seconds[cnt][tot].other_gid = kp->sc->ttf_glyph; seconds[cnt][tot].sc = kp->sc; seconds[cnt][tot].kp = kp; seconds[cnt][tot].isv = v; devtablen += DevTabLen(kp->adjust); } ++tot; } } } if ( k==0 ) { seconds[cnt] = calloc(tot+1,sizeof(struct sckppst)); } else { qsort(seconds[cnt],tot,sizeof(struct sckppst),cmp_gid); seconds[cnt][0].tot = tot; /* Devtablen is 0 unless we are configured for device tables */ seconds[cnt][0].devtablen = devtablen; seconds[cnt][0].samewas = 0xffff; } } } /* Some fonts do a primitive form of class based kerning, several glyphs */ /* can share the same list of second glyphs & offsets */ for ( cnt=0; glyphs[cnt]!=NULL; ++cnt) { struct sckppst *test = seconds[cnt], *test2; for ( i=cnt-1; i>=0; --i ) { test2 = seconds[i]; if ( test[0].tot != test2[0].tot || test2[0].samewas!=0xffff ) continue; for ( j=test[0].tot-1; j>=0; --j ) { if ( test[j].other_gid != test2[j].other_gid ) break; if ( test[j].kp!=NULL && test2[j].kp!=NULL && test[j].kp->off == test2[j].kp->off && DevTabsSame(test[j].kp->adjust,test2[j].kp->adjust) ) /* So far, so good */; else if ( test[j].pst!=NULL && test2[j].pst!=NULL && test[j].pst->u.pair.vr[0].xoff == test2[j].pst->u.pair.vr[0].xoff && test[j].pst->u.pair.vr[0].yoff == test2[j].pst->u.pair.vr[0].yoff && test[j].pst->u.pair.vr[0].h_adv_off == test2[j].pst->u.pair.vr[0].h_adv_off && test[j].pst->u.pair.vr[0].v_adv_off == test2[j].pst->u.pair.vr[0].v_adv_off && test[j].pst->u.pair.vr[1].xoff == test2[j].pst->u.pair.vr[1].xoff && test[j].pst->u.pair.vr[1].yoff == test2[j].pst->u.pair.vr[1].yoff && test[j].pst->u.pair.vr[1].h_adv_off == test2[j].pst->u.pair.vr[1].h_adv_off && test[j].pst->u.pair.vr[1].v_adv_off == test2[j].pst->u.pair.vr[1].v_adv_off && ValDevTabsSame(test[j].pst->u.pair.vr[0].adjust,test2[j].pst->u.pair.vr[0].adjust) && ValDevTabsSame(test[j].pst->u.pair.vr[1].adjust,test2[j].pst->u.pair.vr[1].adjust) ) /* That's ok too. */; else break; } if ( j>=0 ) continue; test[0].samewas = i; break; } } /* Ok, how many offsets must we output? Normal kerning will just use */ /* one offset (with perhaps a device table), but the standard allows */ /* us to adjust 8 different values (with 8 different device tables) */ /* Find out which we need */ for ( cnt=0; glyphs[cnt]!=NULL; ++cnt) { for ( tot=0 ; totsubtable==sub && 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[0].adjust!=NULL ) { if ( pst->u.pair.vr[0].adjust->xadjust.corrections!=NULL ) vf1 |= 0x10; if ( pst->u.pair.vr[0].adjust->yadjust.corrections!=NULL ) vf1 |= 0x20; if ( pst->u.pair.vr[0].adjust->xadv.corrections!=NULL ) vf1 |= 0x40; if ( pst->u.pair.vr[0].adjust->yadv.corrections!=NULL ) vf1 |= 0x80; } 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 ( pst->u.pair.vr[1].adjust!=NULL ) { if ( pst->u.pair.vr[1].adjust->xadjust.corrections!=NULL ) vf2 |= 0x10; if ( pst->u.pair.vr[1].adjust->yadjust.corrections!=NULL ) vf2 |= 0x20; if ( pst->u.pair.vr[1].adjust->xadv.corrections!=NULL ) vf2 |= 0x40; if ( pst->u.pair.vr[1].adjust->yadv.corrections!=NULL ) vf2 |= 0x80; } } } if ( (kp = seconds[cnt][tot].kp)!=NULL ) { int mask = 0, mask2=0; if ( seconds[cnt][tot].isv ) mask = 0x0008; else mask = 0x0004; if ( kp->adjust!=NULL ) { mask |= mask<<4; mask2 |= mask2<<4; } vf1 |= mask; vf2 |= mask2; } } } if ( vf1==0 && vf2==0 ) vf1=1; bit_cnt = 0; for ( i=0; i<8; ++i ) { if ( vf1&(1<65535 && end_cnt==start_cnt ) { LogError(_("Lookup subtable %s contains a glyph %s whose kerning information takes up more than 64k bytes\n"), sub->subtable_name, glyphs[start_cnt]->name ); len += glyph_len; } else if ( len+glyph_len>65535 ) { if( start_cnt==0 ) LogError(_("Lookup subtable %s had to be split into several subtables\nbecause it was too big.\n"), sub->subtable_name ); break; } else len += glyph_len; } if ( start_cnt!=0 || end_cnt!=cnt ) { if ( chunk_cnt>=chunk_max ) sub->extra_subtables = realloc(sub->extra_subtables,((chunk_max+=10)+1)*sizeof(uint32)); sub->extra_subtables[chunk_cnt++] = ftell(gpos); sub->extra_subtables[chunk_cnt] = -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,end_cnt-start_cnt); offset_pos = ftell(gpos); for ( i=start_cnt; i= start_cnt && seconds[i][0].samewas!=0xffff ) { /* It's the same as the glyph at samewas, so just copy the */ /* offset from there. We don't need to do anything else */ int offset; fseek(gpos,offset_pos+(seconds[i][0].samewas-start_cnt)*sizeof(uint16),SEEK_SET); offset = getushort(gpos); fseek(gpos,offset_pos+(i-start_cnt)*sizeof(uint16),SEEK_SET); putshort(gpos,offset); fseek(gpos,0,SEEK_END); continue; } next_dev_tab = ftell(gpos)-start; if ( (vf1&0xf0) || (vf2&0xf0) ) { for ( tot=0 ; totu.pair.vr[0].adjust!=NULL ) { dumpgposdevicetable(gpos,&pst->u.pair.vr[0].adjust->xadjust); dumpgposdevicetable(gpos,&pst->u.pair.vr[0].adjust->yadjust); dumpgposdevicetable(gpos,&pst->u.pair.vr[0].adjust->xadv); dumpgposdevicetable(gpos,&pst->u.pair.vr[0].adjust->yadv); } if ( pst->u.pair.vr[1].adjust!=NULL ) { dumpgposdevicetable(gpos,&pst->u.pair.vr[1].adjust->xadjust); dumpgposdevicetable(gpos,&pst->u.pair.vr[1].adjust->yadjust); dumpgposdevicetable(gpos,&pst->u.pair.vr[1].adjust->xadv); dumpgposdevicetable(gpos,&pst->u.pair.vr[1].adjust->yadv); } } if ( (kp=seconds[i][tot].kp)!=NULL && kp->adjust!=NULL ) dumpgposdevicetable(gpos,kp->adjust); } } pos = ftell(gpos); fseek(gpos,offset_pos+(i-start_cnt)*sizeof(uint16),SEEK_SET); putshort(gpos,pos-start); fseek(gpos,pos,SEEK_SET); putshort(gpos,seconds[i][0].tot); for ( tot=0 ; totu.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); next_dev_tab = gposdumpvaldevtab(gpos,pst->u.pair.vr[0].adjust,vf1, next_dev_tab); 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); next_dev_tab = gposdumpvaldevtab(gpos,pst->u.pair.vr[1].adjust,vf2, next_dev_tab); } else if ( (kp=seconds[i][tot].kp)!=NULL ) { int mask=0, mask2=0; if ( seconds[i][tot].isv ) mask = 0x8; else mask = 0x4; gposvrmaskeddump(gpos,vf1,mask,kp->off); next_dev_tab = gposmaskeddumpdevtab(gpos,kp->adjust,vf1,mask<<4, next_dev_tab); gposvrmaskeddump(gpos,vf2,mask2,kp->off); next_dev_tab = gposmaskeddumpdevtab(gpos,kp->adjust,vf2,mask2<<4, next_dev_tab); } } } end = ftell(gpos); fseek(gpos,coverage_pos,SEEK_SET); if ( end-start>65535 ) IError(_("I miscalculated the size of subtable %s, this means the kerning output is wrong."), sub->subtable_name ); putshort(gpos,end-start); fseek(gpos,end,SEEK_SET); gtemp = glyphs[end_cnt]; glyphs[end_cnt] = NULL; dumpcoveragetable(gpos,glyphs+start_cnt); glyphs[end_cnt] = gtemp; } for ( i=0; ittf_glyph!=-1 ) { class[sc->ttf_glyph] = i+offset; 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; ikc, *test; SplineChar **glyphs; int i, isv; int anydevtab = false; int next_devtab; putshort(gpos,2); /* format 2 of the pair adjustment subtable */ putshort(gpos,0); /* offset to coverage table */ for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) { if ( kc->adjusts[i].corrections!=NULL ) { anydevtab = true; break; } } for ( test=sf->vkerns; test!=NULL && test!=kc; test=test->next ); isv = test==kc; if ( isv ) { /* As far as I know there is no "bottom to top" writing direction */ /* Oh. There is. Ogham, Runic */ putshort(gpos,anydevtab?0x0088:0x0008); /* Alter YAdvance of first character */ putshort(gpos,0x0000); /* leave second char alone */ } else { putshort(gpos,anydevtab?0x0044: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,false); glyphs = GlyphsFromClasses(glyphs,at->maxp.numGlyphs); class2 = ClassesFromNames(sf,kc->seconds,kc->second_cnt,at->maxp.numGlyphs,NULL,false); 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); next_devtab = ftell(gpos)-begin_off + kc->first_cnt*kc->second_cnt*2*sizeof(uint16); for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) { putshort(gpos,kc->offsets[i]); if ( anydevtab && kc->adjusts[i].corrections!=NULL ) { putshort(gpos,next_devtab); next_devtab += DevTabLen(&kc->adjusts[i]); } else if ( anydevtab ) putshort(gpos,0); } if ( anydevtab ) { for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) { if ( kc->adjusts[i].corrections!=NULL ) dumpgposdevicetable(gpos,&kc->adjusts[i]); } if ( next_devtab!=ftell(gpos)-begin_off ) IError("Device table offsets screwed up in kerning class"); } 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 void dumpanchor(FILE *gpos,AnchorPoint *ap, int is_ttf ) { int base = ftell(gpos); if ( ap->xadjust.corrections!=NULL || ap->yadjust.corrections!=NULL ) putshort(gpos,3); /* format 3 w/ device tables */ else if ( ap->has_ttf_pt && is_ttf ) putshort(gpos,2); /* format 2 w/ a matching ttf point index */ else putshort(gpos,1); /* Anchor format 1 just location*/ putshort(gpos,ap->me.x); /* X coord of attachment */ putshort(gpos,ap->me.y); /* Y coord of attachment */ if ( ap->xadjust.corrections!=NULL || ap->yadjust.corrections!=NULL ) { putshort(gpos,ap->xadjust.corrections==NULL?0: ftell(gpos)-base+4); putshort(gpos,ap->yadjust.corrections==NULL?0: ftell(gpos)-base+2+DevTabLen(&ap->xadjust)); dumpgposdevicetable(gpos,&ap->xadjust); dumpgposdevicetable(gpos,&ap->yadjust); } else if ( ap->has_ttf_pt && is_ttf ) putshort(gpos,ap->ttf_pt_index); } static void dumpgposCursiveAttach(FILE *gpos, SplineFont *sf, struct lookup_subtable *sub,struct glyphinfo *gi) { AnchorClass *ac, *testac; SplineChar **entryexit; int cnt, offset,j; AnchorPoint *ap, *entry, *exit; uint32 coverage_offset, start; ac = NULL; for ( testac=sf->anchor; testac!=NULL; testac = testac->next ) { if ( testac->subtable == sub ) { if ( ac==NULL ) ac = testac; else { ff_post_error(_("Two cursive anchor classes"),_("Two cursive anchor classes in the same subtable, %s"), sub->subtable_name); break; } } } if ( ac==NULL ) { IError( "Missing anchor class for %s", sub->subtable_name ); return; } entryexit = EntryExitDecompose(sf,ac,gi); if ( entryexit==NULL ) return; for ( cnt=0; entryexit[cnt]!=NULL; ++cnt ); start = ftell(gpos); 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; if ( entry->xadjust.corrections!=NULL || entry->yadjust.corrections!=NULL ) offset += 4 + DevTabLen(&entry->xadjust) + DevTabLen(&entry->yadjust); if ( gi->is_ttf && entry->has_ttf_pt ) offset += 2; } else putshort(gpos,0); if ( exit!=NULL ) { putshort(gpos,offset); offset += 6; if ( exit->xadjust.corrections!=NULL || exit->yadjust.corrections!=NULL ) offset += 4 + DevTabLen(&exit->xadjust) + DevTabLen(&exit->yadjust); else if ( gi->is_ttf && exit->has_ttf_pt ) offset += 2; } 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 ) dumpanchor(gpos,entry,gi->is_ttf); if ( exit!=NULL ) dumpanchor(gpos,exit,gi->is_ttf); } coverage_offset = ftell(gpos); dumpcoveragetable(gpos,entryexit); fseek(gpos,start+2,SEEK_SET); putshort(gpos,coverage_offset-start); fseek(gpos,0,SEEK_END); free(entryexit); } 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( SFOrderedGlyphs(glyphlist[0])); for ( i=tot=0; inext ) if ( ac->matches ) { if ( !ac->has_mark || !ac->has_base ) continue; for ( ap=base[j]->anchor; ap!=NULL && (ap->anchor!=ac || ap->type!=at); ap=ap->next ); switch ( l ) { case 0: offset += 2; break; case 1: if ( ap==NULL ) putshort(gpos,0); else { putshort(gpos,offset); offset += 6; if ( ap->xadjust.corrections!=NULL || ap->yadjust.corrections!=NULL ) offset += 4 + DevTabLen(&ap->xadjust) + DevTabLen(&ap->yadjust); else if ( gi->is_ttf && ap->has_ttf_pt ) offset += 2; } break; case 2: if ( ap!=NULL ) dumpanchor(gpos,ap,gi->is_ttf); break; } ++k; } } } } else { offset = 2+2*cnt; max = 0; for ( j=0; janchor; ap!=NULL ; ap=ap->next ) for ( k=0, ac=_ac; knext ) if ( ac->matches ) { if ( ap->anchor==ac ) { if ( ap->lig_index>pos ) pos = ap->lig_index; ++tot; } ++k; } 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; int special_ceiling = classcnt*max; aps = malloc((classcnt*max+max)*sizeof(AnchorPoint *)); for ( j=0; janchor; ap!=NULL ; ap=ap->next ) for ( k=0, ac=_ac; knext ) if ( ac->matches ) { if ( ap->anchor==ac ) { if ( ap->lig_index>pos ) pos = ap->lig_index; if (k*max+ap->lig_index > special_ceiling || k*max+ap->lig_index < 0) { fprintf(stderr, "A ligature index is invalid.\n"); } else { aps[k*max+ap->lig_index] = ap; } } ++k; } ++pos; putshort(gpos,pos); offset = 2+2*pos*classcnt; for ( l=0; lxadjust.corrections!=NULL || aps[k*max+l]->yadjust.corrections!=NULL ) offset += 4 + DevTabLen(&aps[k*max+l]->xadjust) + DevTabLen(&aps[k*max+l]->yadjust); else if ( gi->is_ttf && aps[k*max+l]->has_ttf_pt ) offset += 2; } } } for ( l=0; lis_ttf); } } } } free(aps); aps = NULL; } coverage_offset = ftell(gpos); fseek(gpos,subtable_start+4,SEEK_SET); putshort(gpos,coverage_offset-subtable_start); 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 ) { if ( ac->matches ) { for ( ap = markglyphs[j]->anchor; ap!=NULL && (ap->anchor!=ac || ap->type!=at_mark); ap=ap->next ); if ( ap!=NULL ) break; ++k; } } putshort(gpos,k); } putshort(gpos,offset); offset += 6; if ( ap!=NULL && (ap->xadjust.corrections!=NULL || ap->yadjust.corrections!=NULL )) offset += 4 + DevTabLen(&ap->xadjust) + DevTabLen(&ap->yadjust); else if ( gi->is_ttf && ap->has_ttf_pt ) offset += 2; } for ( j=0; jnext ) { if ( ac->matches ) { for ( ap = markglyphs[j]->anchor; ap!=NULL && (ap->anchor!=ac || ap->type!=at_mark); ap=ap->next ); if ( ap!=NULL ) break; ++k; } } dumpanchor(gpos,ap,gi->is_ttf); } if ( markglyphs!=marks[0] ) free(markglyphs); fseek(gpos,subtable_start+2,SEEK_SET); /* mark coverage table offset */ putshort(gpos,coverage_offset-subtable_start); fseek(gpos,4,SEEK_CUR); putshort(gpos,markarray_offset-subtable_start); fseek(gpos,0,SEEK_END); } static void dumpGSUBsimplesubs(FILE *gsub,SplineFont *sf,struct lookup_subtable *sub) { int cnt, diff, ok = true; int32 coverage_pos, end; SplineChar **glyphs, ***maps; glyphs = SFOrderedGlyphsWithPSTinSubtable(sf,sub); maps = generateMapList(glyphs,sub); diff = (*maps[0])->ttf_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); free(glyphs); GlyphMapFree(maps); } static void dumpGSUBmultiplesubs(FILE *gsub,SplineFont *sf,struct lookup_subtable *sub) { int cnt, offset; int32 coverage_pos, end; int gc; SplineChar **glyphs, ***maps; glyphs = SFOrderedGlyphsWithPSTinSubtable(sf,sub); maps = generateMapList(glyphs,sub); 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); if (maps[cnt] == NULL) { fprintf( stderr, "maps[%d] is null; glyphs[%d] is \"%s\"; lookup name is \"%s\".\n" , cnt , cnt , (glyphs[cnt]->name ? glyphs[cnt]->name : ""), sub->subtable_name) ; } 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); free(glyphs); GlyphMapFree(maps); } 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 void dumpGSUBligdata(FILE *gsub,SplineFont *sf, struct lookup_subtable *sub, 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=malloc(max*sizeof(uint16)); SplineChar **glyphs; LigList *ll; struct splinecharlist *scl; glyphs = SFOrderedGlyphsWithPSTinSubtable(sf,sub); 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 = malloc(cnt*sizeof(int16)); for ( i=0; iligofme; ll!=NULL; ll=ll->next ) if ( ll->lig->subtable==sub && AllToBeOutput(ll)) ++pcnt; putshort(gsub,pcnt); if ( pcnt>=max ) { max = pcnt+100; ligoffsets = realloc(ligoffsets,max*sizeof(int)); } lig_list_start = ftell(gsub); for ( j=0; jligofme; ll!=NULL; ll=ll->next ) { if ( ll->lig->subtable==sub && 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; j *(const uint16 *) _i2 ) return( 1 ); if ( *(const uint16 *) _i1 < *(const uint16 *) _i2 ) return( -1 ); return( 0 ); } static uint16 *FigureInitialClasses(FPST *fpst) { uint16 *initial = malloc((fpst->nccnt+1)*sizeof(uint16)); int i, cnt, j; initial[fpst->nccnt] = 0xffff; 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]; } qsort(initial,cnt,sizeof(uint16),ui16cmp); initial[cnt] = 0xffff; return( initial ); } static SplineChar **OrderedInitialGlyphs(SplineFont *sf,FPST *fpst) { SplineChar **glyphs, *sc; int i, j, cnt, ch; char *pt, *names; glyphs = malloc((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 = SFGetChar(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 void dumpg___ContextChainGlyphs(FILE *lfile,SplineFont *sf, struct lookup_subtable *sub, struct alltabs *at) { FPST *fpst = sub->fpst; 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; int lc; 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); for ( l=lc=0; lrules[k].lookup_cnt; ++l ) if ( fpst->rules[k].lookups[l].lookup->lookup_index!=-1 ) ++lc; 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 ( fpst->rules[k].lookups[l].lookup->lookup_index!=-1 ) { putshort(lfile,fpst->rules[k].lookups[l].seq); putshort(lfile,fpst->rules[k].lookups[l].lookup->lookup_index); } ++j; if ( curcontext>maxcontext ) maxcontext = curcontext; } } free(glyphs); if ( maxcontext>at->os2.maxContext ) at->os2.maxContext = maxcontext; } static void dumpg___ContextChainClass(FILE *lfile,SplineFont *sf, struct lookup_subtable *sub, struct alltabs *at) { FPST *fpst = sub->fpst; 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; int lc; 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,false); lglyphs = bglyphs = NULL; bclass = lclass = NULL; if ( !iscontext ) { bclass = ClassesFromNames(sf,fpst->bclass,fpst->bccnt,at->maxp.numGlyphs,&bglyphs,false); lclass = ClassesFromNames(sf,fpst->fclass,fpst->fccnt,at->maxp.numGlyphs,&lglyphs,false); } pos = ftell(lfile); fseek(lfile,base+sizeof(uint16),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); for ( l=lc=0; lrules[k].lookup_cnt; ++l ) if ( fpst->rules[k].lookups[l].lookup->lookup_index!=-1 ) ++lc; 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 ( fpst->rules[k].lookups[l].lookup->lookup_index!=-1 ) { putshort(lfile,fpst->rules[k].lookups[l].seq); putshort(lfile,fpst->rules[k].lookups[l].lookup->lookup_index); } ++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,SplineFont *sf, struct lookup_subtable *sub, struct alltabs *at) { FPST *fpst = sub->fpst; int iscontext = fpst->type==pst_contextpos || fpst->type==pst_contextsub; uint32 base = ftell(lfile), ibase, lbase, bbase; int i, l; SplineChar **glyphs; int curcontext; int lc; if ( fpst->rule_cnt!=1 ) IError("Bad rule cnt in coverage context lookup"); if ( fpst->format==pst_reversecoverage && fpst->rules[0].u.rcoverage.always1!=1 ) IError("Bad input count in reverse coverage lookup" ); putshort(lfile,3); /* Sub format 3 => coverage */ for ( l=lc=0; lrules[0].lookup_cnt; ++l ) if ( fpst->rules[0].lookups[l].lookup->lookup_index!=-1 ) ++lc; 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 ( fpst->rules[0].lookups[i].lookup->lookup_index!=-1 ) { putshort(lfile,fpst->rules[0].lookups[i].seq); putshort(lfile,fpst->rules[0].lookups[i].lookup->lookup_index); } for ( i=0; irules[0].u.coverage.ncnt; ++i ) { uint32 pos = ftell(lfile); fseek(lfile,base+6+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 ( fpst->rules[0].lookups[i].lookup->lookup_index!=-1 ) { putshort(lfile,fpst->rules[0].lookups[i].seq); putshort(lfile,fpst->rules[0].lookups[i].lookup->lookup_index); } } 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 dumpg___ContextChain(FILE *lfile,SplineFont *sf, struct lookup_subtable *sub, struct alltabs *at) { FPST *fpst = sub->fpst; switch ( fpst->format ) { case pst_glyphs: dumpg___ContextChainGlyphs(lfile,sf,sub,at); break; case pst_class: dumpg___ContextChainClass(lfile,sf,sub,at); break; case pst_coverage: case pst_reversecoverage: dumpg___ContextChainCoverage(lfile,sf,sub,at); break; } fseek(lfile,0,SEEK_END); } static void AnchorsAway(FILE *lfile,SplineFont *sf, struct lookup_subtable *sub, struct glyphinfo *gi ) { SplineChar **base, **lig, **mkmk; AnchorClass *ac, *acfirst; SplineChar ***marks; int *subcnts; int cmax, classcnt; int i; marks = malloc((cmax=20)*sizeof(SplineChar **)); subcnts = malloc(cmax*sizeof(int)); classcnt = 0; acfirst = NULL; for ( ac=sf->anchor; ac!=NULL; ac = ac->next ) { ac->matches = false; if ( ac->subtable==sub && !ac->processed ) { if ( acfirst == NULL ) acfirst = ac; if ( ac->type==act_curs ) continue; else if ( ac->has_mark && ac->has_base ) { ac->matches = ac->processed = true; ++classcnt; } } } if ( classcnt>cmax ) { marks = realloc(marks,(cmax=classcnt+10)*sizeof(SplineChar **)); subcnts = realloc(subcnts,cmax*sizeof(int)); } AnchorClassDecompose(sf,acfirst,classcnt,subcnts,marks,&base,&lig,&mkmk,gi); switch ( sub->lookup->lookup_type ) { case gpos_mark2base: if ( marks[0]!=NULL && base!=NULL ) dumpgposAnchorData(lfile,acfirst,at_basechar,marks,base,classcnt,gi); break; case gpos_mark2ligature: if ( marks[0]!=NULL && lig!=NULL ) dumpgposAnchorData(lfile,acfirst,at_baselig,marks,lig,classcnt,gi); break; case gpos_mark2mark: if ( marks[0]!=NULL && mkmk!=NULL ) dumpgposAnchorData(lfile,acfirst,at_basemark,marks,mkmk,classcnt,gi); break; default:; } for ( i=0; ilookup_length-l2->lookup_length ); } static int FPSTRefersToOTL(FPST *fpst,OTLookup *otl) { int i, j; if ( fpst==NULL || fpst->type == pst_reversesub ) return( false ); for ( i=0; irule_cnt; ++i ) { for ( j=0; j< fpst->rules[i].lookup_cnt; ++j ) if ( fpst->rules[i].lookups[j].lookup == otl ) return( true ); } return( false ); } static int OnlyMac(OTLookup *otl, OTLookup *all) { FeatureScriptLangList *features = otl->features; int anymac = 0; struct lookup_subtable *sub; switch ( otl->lookup_type ) { /* These two lookup types are mac only */ case kern_statemachine: case morx_indic: case morx_context: case morx_insert: return( true ); /* These lookup types are OpenType only */ case gsub_multiple: case gsub_alternate: case gsub_context: case gsub_contextchain: case gsub_reversecchain: case gpos_single: case gpos_cursive: case gpos_mark2base: case gpos_mark2ligature: case gpos_mark2mark: case gpos_context: case gpos_contextchain: return( false ); /* These two can be expressed in both, and might be either */ case gpos_pair: case gsub_single: case gsub_ligature: for ( features = otl->features; features!=NULL; features = features->next ) { if ( !features->ismac ) return( false ); else anymac = true; } /* Either it has no features at all (nested), or all its features */ /* are mac feature settings. Even if all are mac feature settings it */ /* might still be used as under control of a contextual feature */ /* so in both cases check for nested */ while ( all!=NULL ) { if ( all!=otl && !all->unused && (all->lookup_type==gpos_context || all->lookup_type==gpos_contextchain || all->lookup_type==gsub_context || all->lookup_type==gsub_contextchain /*|| all->lookup_type==gsub_reversecchain*/ )) { for ( sub=all->subtables; sub!=NULL; sub=sub->next ) if ( !sub->unused && sub->fpst!=NULL ) { if ( FPSTRefersToOTL(sub->fpst,otl) ) return( false ); } } all = all->next; } if ( anymac ) return( true ); /* As far as I can tell, this lookup isn't used at all */ /* Let's output it anyway, just in case we ever support some other */ /* table that uses GPOS/GSUB lookups (I think JUST) */ return( false ); default:; } /* Should never get here, but gcc probably thinks we might */ return( true ); } static void otf_dumpALookup(FILE *lfile, OTLookup *otl, SplineFont *sf, struct alltabs *at) { struct lookup_subtable *sub; int lookup_sub_table_contains_no_data_count = 0; int lookup_sub_table_is_too_big_count = 0; otl->lookup_offset = ftell(lfile); for ( sub = otl->subtables; sub!=NULL; sub=sub->next ) { sub->extra_subtables = NULL; if ( sub->unused ) sub->subtable_offset = -1; else { sub->subtable_offset = ftell(lfile); switch ( otl->lookup_type ) { /* GPOS lookup types */ case gpos_single: dumpGPOSsimplepos(lfile,sf,sub); break; case gpos_pair: if ( at->os2.maxContext<2 ) at->os2.maxContext = 2; if ( sub->kc!=NULL ) dumpgposkernclass(lfile,sf,sub,at); else dumpGPOSpairpos(lfile,sf,sub); break; case gpos_cursive: dumpgposCursiveAttach(lfile,sf,sub,&at->gi); break; case gpos_mark2base: case gpos_mark2ligature: case gpos_mark2mark: AnchorsAway(lfile,sf,sub,&at->gi); break; case gpos_contextchain: case gpos_context: dumpg___ContextChain(lfile,sf,sub,at); break; /* GSUB lookup types */ case gsub_single: dumpGSUBsimplesubs(lfile,sf,sub); break; case gsub_multiple: case gsub_alternate: dumpGSUBmultiplesubs(lfile,sf,sub); break; case gsub_ligature: dumpGSUBligdata(lfile,sf,sub,at); break; case gsub_contextchain: case gsub_context: case gsub_reversecchain: dumpg___ContextChain(lfile,sf,sub,at); break; default:; } if ( ftell(lfile)-sub->subtable_offset==0 ) { if ( lookup_sub_table_contains_no_data_count < 32 ) { IError( "Lookup sub table, %s in %s, contains no data.\n", sub->subtable_name, sub->lookup->lookup_name ); lookup_sub_table_contains_no_data_count ++; } sub->unused = true; sub->subtable_offset = -1; } else if ( sub->extra_subtables==NULL && ftell(lfile)-sub->subtable_offset>65535 ) if ( lookup_sub_table_is_too_big_count < 32 ) { IError( "Lookup sub table, %s in %s, is too big. Will not be useable.\n", sub->subtable_name, sub->lookup->lookup_name ); lookup_sub_table_is_too_big_count ++; } } } otl->lookup_length = ftell(lfile)-otl->lookup_offset; } static FILE *G___figureLookups(SplineFont *sf,int is_gpos, struct alltabs *at) { OTLookup *otl; struct lookup_subtable *sub; int index, i,j; FILE *final; FILE *lfile = tmpfile2(); OTLookup **sizeordered; OTLookup *all = is_gpos ? sf->gpos_lookups : sf->gsub_lookups; char *buffer; int len; index = 0; for ( otl=all; otl!=NULL; otl=otl->next ) { if ( otl->unused || OnlyMac(otl,all) || otl->only_jstf || otl->temporary_kern ) otl->lookup_index = -1; else otl->lookup_index = index++; } for ( otl=all; otl!=NULL; otl=otl->next ) { if ( otl->lookup_index!=-1 ) { otf_dumpALookup(lfile, otl, sf, at ); } } if ( is_gpos ) AnchorGuessContext(sf,at); /* We don't need to reorder short files */ if ( ftell(lfile)<65536 ) return( lfile ); /* Order the lookups so that the smallest ones come first */ /* thus we are less likely to need extension tables */ /* I think it's better to order the entire lookup rather than ordering the*/ /* subtables -- since the extension subtable would be required for all */ /* subtables in the lookup, so might as well keep them all together */ sizeordered = malloc(index*sizeof(OTLookup *)); for ( otl=is_gpos ? sf->gpos_lookups : sf->gsub_lookups; otl!=NULL; otl=otl->next ) if ( otl->lookup_index!=-1 ) sizeordered[ otl->lookup_index ] = otl; qsort(sizeordered,index,sizeof(OTLookup *),lookup_size_cmp); final = tmpfile2(); buffer = malloc(32768); for ( i=0; ilookup_offset,SEEK_SET); diff = ftell(final) - otl->lookup_offset; otl->lookup_offset = ftell(final); len = otl->lookup_length; while ( len>=32768 ) { int done = fread(buffer,1,32768,lfile); if ( done==0 ) /* fread returns 0 on error, not EOF */ break; fwrite(buffer,1,done,final); len -= done; } if ( len>0 && len<=32768 ) { int done = fread(buffer,1,len,lfile); if ( done==0 ) break; fwrite(buffer,1,done,final); } for ( sub = otl->subtables; sub!=NULL; sub=sub->next ) { if ( !sub->unused ) { sub->subtable_offset += diff; if ( sub->extra_subtables!=NULL ) { for ( j=0; sub->extra_subtables[j]!=-1; ++j ) sub->extra_subtables[j] += diff; } } } } free(buffer); free(sizeordered); fclose(lfile); return( final ); } struct feat_lookups { uint32 tag; int lcnt; OTLookup **lookups; int feature_id; /* Initially consecutive, but may be rearranged by sorting */ uint32 name_param_ptr; }; struct langsys { uint32 lang; int fc; int *feature_id; int same_as; int32 offset; }; struct scriptset { uint32 script; int lc; struct langsys *langsys; }; struct ginfo { int fmax, fcnt; struct feat_lookups *feat_lookups; int sc; struct scriptset *scripts; }; static int FindOrMakeNewFeatureLookup(struct ginfo *ginfo,OTLookup **lookups, uint32 tag) { int i, j; for ( i=0; ifcnt; ++i ) { if ( ginfo->feat_lookups[i].tag!= tag ) continue; if ( lookups==NULL && ginfo->feat_lookups[i].lookups==NULL ) /* 'size' feature */ return( i ); if ( lookups==NULL || ginfo->feat_lookups[i].lookups==NULL ) continue; for ( j=0; lookups[j]!=NULL && ginfo->feat_lookups[i].lookups[j]!=NULL; ++j ) if ( ginfo->feat_lookups[i].lookups[j]!=lookups[j] ) break; if ( ginfo->feat_lookups[i].lookups[j]==lookups[j] ) { free(lookups); return( i ); } } if ( ginfo->fcnt>=ginfo->fmax ) ginfo->feat_lookups = realloc(ginfo->feat_lookups,(ginfo->fmax+=20)*sizeof(struct feat_lookups)); ginfo->feat_lookups[i].feature_id = i; ginfo->feat_lookups[i].tag = tag; ginfo->feat_lookups[i].lookups = lookups; j=0; if ( lookups!=NULL ) for ( ; lookups[j]!=NULL; ++j ); ginfo->feat_lookups[i].lcnt = j; ++ginfo->fcnt; return( i ); } static int feat_alphabetize(const void *_fl1, const void *_fl2) { const struct feat_lookups *fl1 = _fl1, *fl2 = _fl2; if ( fl1->tagtag ) return( -1 ); if ( fl1->tag>fl2->tag ) return( 1 ); return( 0 ); } static int numeric_order(const void *_i1, const void *_i2) { int i1 = *(const int *) _i1, i2 = *(const int *) _i2; if ( i1i2 ) return( 1 ); return( 0 ); } static int LangSysMatch(struct scriptset *s,int ils1, int ils2 ) { struct langsys *ls1 = &s->langsys[ils1], *ls2 = &s->langsys[ils2]; int i; if ( ls1->fc!=ls2->fc ) return( false ); for ( i=0; ifc; ++i ) if ( ls1->feature_id[i]!=ls2->feature_id[i] ) return( false ); return( true ); } static void FindFeatures(SplineFont *sf,int is_gpos,struct ginfo *ginfo) { uint32 *scripts, *langs, *features; OTLookup **lookups; int sc, lc, fc, j; memset(ginfo,0,sizeof(struct ginfo)); scripts = SFScriptsInLookups(sf,is_gpos); if ( scripts==NULL ) /* All lookups unused */ return; for ( sc=0; scripts[sc]!=0; ++sc ); ginfo->scripts = malloc(sc*sizeof(struct scriptset)); ginfo->sc = sc; for ( sc=0; scripts[sc]!=0; ++sc ) { langs = SFLangsInScript(sf,is_gpos,scripts[sc]); for ( lc=0; langs[lc]!=0; ++lc ); ginfo->scripts[sc].script = scripts[sc]; ginfo->scripts[sc].lc = lc; ginfo->scripts[sc].langsys = malloc(lc*sizeof(struct langsys)); for ( lc=0; langs[lc]!=0; ++lc ) { features = SFFeaturesInScriptLang(sf,is_gpos,scripts[sc],langs[lc]); for ( fc=0; features[fc]!=0; ++fc ); ginfo->scripts[sc].langsys[lc].lang = langs[lc]; ginfo->scripts[sc].langsys[lc].fc = fc; ginfo->scripts[sc].langsys[lc].feature_id = malloc(fc*sizeof(int)); ginfo->scripts[sc].langsys[lc].same_as = -1; for ( fc=0; features[fc]!=0; ++fc ) { lookups = SFLookupsInScriptLangFeature(sf,is_gpos,scripts[sc],langs[lc],features[fc]); ginfo->scripts[sc].langsys[lc].feature_id[fc] = FindOrMakeNewFeatureLookup(ginfo,lookups,features[fc]); /* lookups is freed or used by FindOrMakeNewFeatureLookup */ } free(features); } free(langs); } free(scripts); qsort(ginfo->feat_lookups,ginfo->fcnt,sizeof(struct feat_lookups),feat_alphabetize); /* Now we've disordered the features. Find each feature_id and turn it back*/ /* into a feature number */ for ( sc=0; scsc; ++sc ) { for ( lc=0; lcscripts[sc].lc; ++lc ) { int fcmax = ginfo->scripts[sc].langsys[lc].fc; int *feature_id = ginfo->scripts[sc].langsys[lc].feature_id; for ( fc=0; fcfcnt; ++j ) if ( id==ginfo->feat_lookups[j].feature_id ) break; feature_id[fc] = j; } qsort(feature_id,fcmax,sizeof(int),numeric_order); } /* See if there are langsys tables which use exactly the same features*/ /* They can use the same entry in the file. This optimization seems */ /* to be required for Japanese vertical writing to work in Uniscribe.*/ for ( lc=0; lcscripts[sc].lc; ++lc ) { for ( j=0; jscripts[sc],j,lc) ) { ginfo->scripts[sc].langsys[lc].same_as = j; break; } } } } static void dump_script_table(FILE *g___,struct scriptset *ss,struct ginfo *ginfo) { int i, lcnt, dflt_lang = -1; uint32 base; int j, req_index; uint32 offset; /* Count the languages, and find default */ for ( lcnt=0; lcntlc; ++lcnt ) if ( ss->langsys[lcnt].lang==DEFAULT_LANG ) dflt_lang = lcnt; if ( dflt_lang != -1 ) --lcnt; base = ftell(g___); putshort(g___, 0 ); /* fill in later, Default Lang Sys */ putshort(g___,lcnt); for ( i=0; ilc; ++i ) if ( i!=dflt_lang ) { putlong(g___,ss->langsys[i].lang); /* Language tag */ putshort(g___,0); /* Fill in later, offset to langsys */ } for ( lcnt=0; lcntlc; ++lcnt ) { if ( ss->langsys[lcnt].same_as!=-1 ) offset = ss->langsys[ ss->langsys[lcnt].same_as ].offset; else { offset = ftell(g___); ss->langsys[lcnt].offset = offset; } fseek(g___,lcnt==dflt_lang ? base : lcntlangsys[lcnt].same_as==-1 ) { req_index = -1; for ( j=0; jlangsys[lcnt].fc; ++j ) { if ( ginfo->feat_lookups[ ss->langsys[lcnt].feature_id[j] ].tag == REQUIRED_FEATURE ) { req_index = ss->langsys[lcnt].feature_id[j]; break; } } putshort(g___,0); /* LookupOrder, always NULL */ putshort(g___,req_index); /* index of required feature, if any */ putshort(g___,ss->langsys[lcnt].fc - (req_index!=-1)); /* count of non-required features */ for ( j=0; jlangsys[lcnt].fc; ++j ) if (ss->langsys[lcnt].feature_id[j]!=req_index ) putshort(g___,ss->langsys[lcnt].feature_id[j]); } } } static FILE *g___FigureExtensionSubTables(OTLookup *all,int startoffset,int is_gpos) { OTLookup *otf; struct lookup_subtable *sub; int len, len2, gotmore; FILE *efile; int i, offset, cnt; int any= false; if ( all==NULL ) return( NULL ); gotmore = true; cnt=len=0; while ( gotmore ) { gotmore = false; offset = startoffset + 8*cnt; for ( otf=all; otf!=NULL; otf=otf->next ) if ( otf->lookup_index!=-1 ) { if ( otf->needs_extension ) continue; for ( sub = otf->subtables; sub!=NULL; sub=sub->next ) { if ( sub->subtable_offset==-1 ) continue; if ( sub->extra_subtables!=NULL ) { for ( i=0; sub->extra_subtables[i]!=-1; ++i ) { if ( sub->extra_subtables[i]+offset>65535 ) break; } if ( sub->extra_subtables[i]!=-1 ) break; } else if ( sub->subtable_offset+offset>65535 ) break; } if ( sub!=NULL ) { if ( !any ) { ff_post_notice(_("Lookup potentially too big"), _("Lookup %s has an\noffset bigger than 65535 bytes. This means\nFontForge must use an extension lookup to output it.\nNot all applications support extension lookups."), otf->lookup_name ); any = true; } otf->needs_extension = true; gotmore = true; len += 8*otf->subcnt; ++cnt; } offset -= 6+2*otf->subcnt; } } if ( cnt==0 ) /* No offset overflows */ return( NULL ); /* Now we've worked out which lookups need extension tables and marked them*/ /* Generate the extension tables, and update the offsets to reflect the size */ /* of the extensions */ efile = tmpfile2(); len2 = 0; for ( otf=all; otf!=NULL; otf=otf->next ) if ( otf->lookup_index!=-1 ) { for ( sub = otf->subtables; sub!=NULL; sub=sub->next ) { if ( sub->subtable_offset==-1 ) continue; if ( sub->extra_subtables!=NULL ) { for ( i=0; sub->extra_subtables[i]!=-1; ++i ) { sub->extra_subtables[i] += len; if ( otf->needs_extension ) { int off = ftell(efile); putshort(efile,1); /* exten subtable format (there's only one) */ putshort(efile,otf->lookup_type&0xff); putlong(efile,sub->extra_subtables[i]-len2); sub->extra_subtables[i] = off; len2+=8; } } } else { sub->subtable_offset += len; if ( otf->needs_extension ) { int off = ftell(efile); putshort(efile,1); /* exten subtable format (there's only one) */ putshort(efile,otf->lookup_type&0xff); putlong(efile,sub->subtable_offset-len2); sub->subtable_offset = off; len2+=8; } } } } return( efile ); } struct otffeatname *findotffeatname(uint32 tag,SplineFont *sf) { struct otffeatname *fn; for ( fn=sf->feat_names; fn!=NULL && fn->tag!=tag; fn=fn->next ); return( fn ); } 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 */ /* we assume that SFFindUnusedLookups has been called */ FILE *lfile, *g___, *efile; uint32 lookup_list_table_start, feature_list_table_start, here, scripts_start_offset; struct ginfo ginfo; int32 size_params_loc, size_params_ptr; int i,j, cnt, scnt, offset; OTLookup *otf, *all; struct lookup_subtable *sub; char *buf; struct otffeatname *fn; for ( fn=sf->feat_names; fn!=NULL; fn=fn->next ) fn->nid = 0; FindFeatures(sf,is_gpos,&ginfo); if ( ginfo.sc==0 ) return( NULL ); lfile = G___figureLookups(sf,is_gpos,at); if ( ginfo.sc==0 && ftell(lfile)==0 ) { /* ftell(lfile)==0 => There are no lookups for this table */ /* ginfo.sc==0 => There are no scripts. */ /* If both are true then we don't need to output the table */ /* It is perfectly possible to have lookups without scripts */ /* (if some other table refered to them -- we don't currently */ /* support this, but we might some day). */ /* It is also possible to have scripts without lookups (to get */ /* around a bug in Uniscribe which only processes some scripts */ /* if both GPOS and GSUB entries are present. So we share scripts */ /* between the two tables */ fclose(lfile); /* if ginfo.sc==0 then there will be nothing to free in the ginfo struct*/ return( NULL ); } g___ = tmpfile2(); 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___,ginfo.sc); for ( i=0; i=CHR('s','s','0','1') && ginfo.feat_lookups[i].tag<=CHR('s','s','2','0')) ginfo.feat_lookups[i].name_param_ptr = ftell(g___); putshort(g___,0); /* No feature params (we'll come back for 'size') */ putshort(g___,ginfo.feat_lookups[i].lcnt);/* this many lookups */ for ( j=0; jlookup_index ); /* index of each lookup */ } if ( size_params_ptr!=0 ) { size_params_loc = ftell(g___); fseek(g___,size_params_ptr,SEEK_SET); putshort(g___,size_params_loc-size_params_ptr); fseek(g___,size_params_loc,SEEK_SET); putshort(g___,sf->design_size); if ( sf->fontstyle_id!=0 || sf->fontstyle_name!=NULL ) { putshort(g___,sf->fontstyle_id); at->fontstyle_name_strid = at->next_strid++; putshort(g___,at->fontstyle_name_strid); } else { putshort(g___,0); putshort(g___,0); } putshort(g___,sf->design_range_bottom); putshort(g___,sf->design_range_top); } for ( i=0; inid==0 ) fn->nid = at->next_strid++; uint32 name_param_loc = ftell(g___); fseek(g___,ginfo.feat_lookups[i].name_param_ptr,SEEK_SET); putshort(g___,name_param_loc-ginfo.feat_lookups[i].name_param_ptr); fseek(g___,name_param_loc,SEEK_SET); putshort(g___,0); /* Minor version number */ putshort(g___,fn->nid); } } /* And that should finish all the features */ /* so free the ginfo feature data */ for ( i=0; igpos_lookups : sf->gsub_lookups; for ( cnt=0, otf = all; otf!=NULL; otf=otf->next ) { if ( otf->lookup_index!=-1 ) ++cnt; } 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 lookup table from beginning of lookup list */ for ( otf = all; otf!=NULL; otf=otf->next ) if ( otf->lookup_index!=-1 ) { putshort(g___,offset); for ( scnt=0, sub = otf->subtables; sub!=NULL; sub=sub->next ) { if ( sub->subtable_offset==-1 ) continue; else if ( sub->extra_subtables!=NULL ) { for ( i=0; sub->extra_subtables[i]!=-1; ++i ) ++scnt; } else ++scnt; } otf->subcnt = scnt; offset += 6+2*scnt; /* 6 bytes header +2 per lookup */ if ( otf->lookup_flags & pst_usemarkfilteringset ) offset += 2; /* For mark filtering set, if used */ } offset -= 2+2*cnt; /* now the lookup tables */ /* do we need any extension sub-tables? */ efile=g___FigureExtensionSubTables(all,offset,is_gpos); for ( otf = all; otf!=NULL; otf=otf->next ) if ( otf->lookup_index!=-1 ) { putshort(g___,!otf->needs_extension ? (otf->lookup_type&0xff) : is_gpos ? 9 : 7); putshort(g___,(otf->lookup_flags&0xffff)); putshort(g___,otf->subcnt); for ( sub = otf->subtables; sub!=NULL; sub=sub->next ) { if ( sub->subtable_offset==-1 ) continue; else if ( sub->extra_subtables!=NULL ) { for ( i=0; sub->extra_subtables[i]!=-1; ++i ) putshort(g___,offset+sub->extra_subtables[i]); } else putshort(g___,offset+sub->subtable_offset); /* Offset to lookup data which is in the temp file */ /* we keep adjusting offset so it reflects the distance 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 */ } offset -= 6+2*otf->subcnt; if ( otf->lookup_flags & pst_usemarkfilteringset ) { putshort(g___,otf->lookup_flags>>16); offset -= 2; } } buf = malloc(8096); if ( efile!=NULL ) { rewind(efile); while ( (i=fread(buf,1,8096,efile))>0 ) fwrite(buf,1,i,g___); fclose(efile); } rewind(lfile); while ( (i=fread(buf,1,8096,lfile))>0 ) fwrite(buf,1,i,g___); fclose(lfile); free(buf); for ( otf = all; otf!=NULL; otf=otf->next ) if ( otf->lookup_index!=-1 ) { for ( sub = otf->subtables; sub!=NULL; sub=sub->next ) { free(sub->extra_subtables); sub->extra_subtables = NULL; } otf->needs_extension = false; } 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 */ AnchorClass *ac; for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) ac->processed = false; 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); } int LigCaretCnt(SplineChar *sc) { PST *pst; int j, cnt; for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->type == pst_lcaret ) { if ( sc->lig_caret_cnt_fixed ) return( pst->u.lcaret.cnt ); else { /* only output non-zero carets */ cnt=0; for ( j=pst->u.lcaret.cnt-1; j>=0 ; --j ) if ( pst->u.lcaret.carets[j]!=0 ) ++cnt; return( cnt ); } } } return( 0 ); } static void DumpLigCarets(FILE *gdef,SplineChar *sc) { PST *pst; int i, j, offset, cnt; for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->type == pst_lcaret ) break; } if ( pst==NULL ) return; cnt = LigCaretCnt(sc); if ( cnt==0 ) 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,cnt); /* this many carets */ offset = sizeof(uint16) + sizeof(uint16)*cnt; for ( i=0; iu.lcaret.cnt; ++i ) { if ( sc->lig_caret_cnt_fixed || pst->u.lcaret.carets[i]!=0 ) { putshort(gdef,1); /* Format 1 */ putshort(gdef,pst->u.lcaret.carets[i]); } } } static int glyphnameinlist(char *haystack,char *name) { char *start, *pt; int ch, match, slen = strlen(name); for ( pt=haystack ; ; ) { while ( *pt==' ' ) ++pt; if ( *pt=='\0' ) return( false ); start=pt; while ( *pt!=' ' && *pt!='\0' ) ++pt; if ( pt-start==slen ) { ch = *pt; *pt='\0'; match = strcmp(start,name); *pt = ch; if ( match==0 ) return( true ); } } } static int ReferencedByGSUB(SplineChar *sc) { PST *pst; SplineFont *sf = sc->parent; int gid; SplineChar *testsc; char *name = sc->name; /* If it is itself a ligature it will be referenced by GSUB */ /* (because we store ligatures on the glyph generated) */ for ( pst=sc->possub; pst!=NULL; pst=pst->next ) if ( pst->type == pst_ligature ) return( true ); for ( gid=0; gidglyphcnt; ++gid ) if ( (testsc=sf->glyphs[gid])!=NULL ) { for ( pst=testsc->possub; pst!=NULL; pst=pst->next ) { if ( pst->type==pst_substitution || pst->type==pst_alternate || pst->type==pst_multiple ) { if ( glyphnameinlist(pst->u.mult.components,name) ) return( true ); } } } return( false ); } 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 ); /* It isn't clear to me what should be done if a glyph is both a ligature */ /* and a mark (There are some greek accent ligatures, it is probably more*/ /* important that they be indicated as marks). Here I chose mark rather */ /* than ligature as the mark class is far more likely to be used */ 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 ); for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { if ( pst->type == pst_ligature ) return( 2 ); /* Ligature */ } /* I not quite sure what a componant glyph is. Probably something */ /* that is not in the cmap table and is referenced in other glyphs */ /* (I've never seen it used by others) */ /* (Note: No glyph in a CID font can be components as all CIDs mean */ /* something) (I think) */ if ( sc->unicodeenc==-1 && sc->dependents!=NULL && sc->parent->cidmaster!=NULL && !ReferencedByGSUB(sc)) return( 4 ); else return( 1 ); } 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 */ /* Ah. Some indic fonts need the mark attach class subtable for greater */ /* control of lookup flags */ /* All my example fonts contain a ligature caret list subtable, which is */ /* empty. Odd, but perhaps important */ int i,j,k, lcnt, needsclass; int pos, offset; int cnt, start, last, lastval; SplineChar **glyphs, *sc; /* Don't look in the cidmaster if we are only dumping one subfont */ if ( sf->cidmaster && sf->cidmaster->glyphs!=NULL ) sf = sf->cidmaster; else if ( sf->mm!=NULL ) sf=sf->mm->normal; glyphs = NULL; for ( k=0; k<2; ++k ) { lcnt = 0; needsclass = false; for ( i=0; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { SplineChar *sc = sf->glyphs[at->gi.bygid[i]]; if ( sc->glyph_class!=0 || gdefclass(sc)!=1 ) needsclass = true; if ( LigCaretCnt(sc)!=0 ) { if ( glyphs!=NULL ) glyphs[lcnt] = sc; ++lcnt; } } if ( lcnt==0 ) break; if ( glyphs!=NULL ) break; glyphs = malloc((lcnt+1)*sizeof(SplineChar *)); glyphs[lcnt] = NULL; } if ( !needsclass && lcnt==0 && sf->mark_class_cnt==0 && sf->mark_set_cnt==0 ) return; /* No anchor positioning, no ligature carets */ at->gdef = tmpfile2(); if ( sf->mark_set_cnt==0 ) { putlong(at->gdef,0x00010000); /* Version */ putshort(at->gdef, needsclass ? 12 : 0 ); /* glyph class defn table */ } else { putlong(at->gdef,0x00010002); /* Version with mark sets */ putshort(at->gdef, needsclass ? 14 : 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 ( sf->mark_set_cnt>0 ) { putshort(at->gdef, 0 ); /* mark attachment set table only meaningful if version is 0x10002*/ } /* Glyph class subtable */ if ( needsclass ) { /* Mark shouldn't conflict with anything */ /* Ligature is more important than Base */ /* Component is not used */ /* 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; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { sc = sf->glyphs[at->gi.bygid[i]]; if ( sc!=NULL && sc->ttf_glyph!=-1 ) { lastval = gdefclass(sc); start = last = i; for ( ; igi.gcnt; ++i ) if ( at->gi.bygid[i]!=-1 ) { sc = sf->glyphs[at->gi.bygid[i]]; if ( gdefclass(sc)!=lastval ) break; last = i; } --i; if ( lastval!=0 ) { if ( j==1 ) { putshort(at->gdef,start); putshort(at->gdef,last); putshort(at->gdef,lastval); } ++cnt; } } } if ( j==0 ) { putshort(at->gdef,2); /* class format 2, range list by class */ putshort(at->gdef,cnt); } } } /* Ligature caret subtable. Always include this if we have a GDEF */ 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); } /* Mark Attachment Class Subtable */ if ( sf->mark_class_cnt>0 ) { uint16 *mclasses = ClassesFromNames(sf,sf->mark_classes,sf->mark_class_cnt,at->maxp.numGlyphs,NULL,false); pos = ftell(at->gdef); fseek(at->gdef,10,SEEK_SET); /* location of mark attach table offset */ putshort(at->gdef,pos); fseek(at->gdef,0,SEEK_END); DumpClass(at->gdef,mclasses,at->maxp.numGlyphs); free(mclasses); } /* Mark Attachment Class Subtable */ if ( sf->mark_set_cnt>0 ) { pos = ftell(at->gdef); fseek(at->gdef,12,SEEK_SET); /* location of mark attach table offset */ putshort(at->gdef,pos); fseek(at->gdef,0,SEEK_END); putshort(at->gdef,1); /* Version number */ putshort(at->gdef,sf->mark_set_cnt); for ( i=0; imark_set_cnt; ++i ) putlong(at->gdef,0); for ( i=0; imark_set_cnt; ++i ) { int here = ftell(at->gdef); fseek(at->gdef,pos+4+4*i,SEEK_SET); putlong(at->gdef,here-pos); fseek(at->gdef,0,SEEK_END); glyphs = OrderedGlyphsFromNames(sf,sf->mark_sets[i]); dumpcoveragetable(at->gdef,glyphs); free(glyphs); } } at->gdeflen = ftell(at->gdef); if ( at->gdeflen&1 ) putc('\0',at->gdef); if ( (at->gdeflen+1)&2 ) putshort(at->gdef,0); } /******************************************************************************/ /* ******************************* MATH Table ******************************* */ /* ********************** (Not strictly OpenType yet) *********************** */ /******************************************************************************/ enum math_bits { mb_constants=0x01, mb_italic=0x02, mb_topaccent=0x04, mb_extended=0x08, mb_mathkern=0x10, mb_vertvariant=0x20, mb_horizvariant=0x40, mb_all = 0x7f, mb_gi=(mb_italic|mb_topaccent|mb_extended|mb_mathkern), mb_gv=(mb_vertvariant|mb_horizvariant) }; static int MathBits(struct alltabs *at, SplineFont *sf) { int i, gid, ret; SplineChar *sc; ret = sf->MATH ? mb_constants : 0; for ( i=0; igi.gcnt; ++i ) { if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) { if ( sc->italic_correction!=TEX_UNDEF ) ret |= mb_italic; if ( sc->top_accent_horiz!=TEX_UNDEF ) ret |= mb_topaccent; if ( sc->is_extended_shape ) ret |= mb_extended; if ( sc->mathkern!=NULL ) ret |= mb_mathkern; if ( sc->vert_variants!=NULL ) ret |= mb_vertvariant; if ( sc->horiz_variants!=NULL ) ret |= mb_horizvariant; if ( ret==mb_all ) return( mb_all ); } } return( ret ); } static void ttf_math_dump_italic_top(FILE *mathf,struct alltabs *at, SplineFont *sf, int is_italic) { int i, gid, len; SplineChar *sc, **glyphs; uint32 coverage_pos, coverage_table; uint32 devtab_offset; DeviceTable *devtab; /* Figure out our glyph list (and count) */ for ( i=len=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) if ( (is_italic && sc->italic_correction!=TEX_UNDEF) || (!is_italic && sc->top_accent_horiz!=TEX_UNDEF)) ++len; glyphs = malloc((len+1)*sizeof(SplineChar *)); for ( i=len=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) if ( (is_italic && sc->italic_correction!=TEX_UNDEF) || (!is_italic && sc->top_accent_horiz!=TEX_UNDEF)) glyphs[len++] = sc; glyphs[len] = NULL; coverage_pos = ftell(mathf); putshort(mathf,0); /* Coverage table, return to this */ putshort(mathf,len); devtab_offset = 4 + 4*len; for ( i=0; iitalic_correction : glyphs[i]->top_accent_horiz ); devtab = is_italic ? glyphs[i]->italic_adjusts : glyphs[i]->top_accent_adjusts; if ( devtab!=NULL ) { putshort(mathf,devtab_offset); devtab_offset += DevTabLen(devtab); } else putshort(mathf,0); } for ( i=0; iitalic_adjusts : glyphs[i]->top_accent_adjusts; if ( devtab!=NULL ) dumpgposdevicetable(mathf,devtab); } if ( devtab_offset!=ftell(mathf)-coverage_pos ) IError("Actual end did not match expected end in %s table, expected=%d, actual=%d", is_italic ? "italic" : "top accent", devtab_offset, ftell(mathf)-coverage_pos ); coverage_table = ftell(mathf); fseek( mathf, coverage_pos, SEEK_SET); putshort(mathf,coverage_table-coverage_pos); fseek(mathf,coverage_table,SEEK_SET); dumpcoveragetable(mathf,glyphs); free(glyphs); } static void ttf_math_dump_extended(FILE *mathf,struct alltabs *at, SplineFont *sf) { int i, gid, len; SplineChar *sc, **glyphs; for ( i=len=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) if ( sc->is_extended_shape ) ++len; glyphs = malloc((len+1)*sizeof(SplineChar *)); for ( i=len=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) if ( sc->is_extended_shape ) glyphs[len++] = sc; glyphs[len] = NULL; dumpcoveragetable(mathf,glyphs); free(glyphs); } static int mkv_len(struct mathkernvertex *mkv) { return( 2+8*mkv->cnt-4 ); } static int ttf_math_dump_mathkernvertex(FILE *mathf,struct mathkernvertex *mkv, int devtab_pos) { int i; uint32 here = ftell(mathf); putshort(mathf,mkv->cnt-1); for ( i=0; icnt-1; ++i ) { putshort(mathf,mkv->mkd[i].height); if ( mkv->mkd[i].height_adjusts!=NULL ) { putshort(mathf,devtab_pos-here); devtab_pos += DevTabLen(mkv->mkd[i].height_adjusts); } else putshort(mathf,0); } for ( i=0; icnt; ++i ) { putshort(mathf,mkv->mkd[i].kern); if ( mkv->mkd[i].kern_adjusts!=NULL ) { putshort(mathf,devtab_pos-here); devtab_pos += DevTabLen(mkv->mkd[i].kern_adjusts); } else putshort(mathf,0); } return( devtab_pos ); } static void ttf_math_dump_mathkerndevtab(FILE *mathf,struct mathkernvertex *mkv) { int i; for ( i=0; icnt-1; ++i ) if ( mkv->mkd[i].height_adjusts!=NULL ) dumpgposdevicetable(mathf,mkv->mkd[i].height_adjusts); for ( i=0; icnt; ++i ) if ( mkv->mkd[i].kern_adjusts!=NULL ) dumpgposdevicetable(mathf,mkv->mkd[i].kern_adjusts); } static void ttf_math_dump_mathkern(FILE *mathf,struct alltabs *at, SplineFont *sf) { int i, gid, len; SplineChar *sc, **glyphs; uint32 coverage_pos, coverage_table, kr_pos, midpos2; /* Figure out our glyph list (and count) */ for ( i=len=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) if ( sc->mathkern!=NULL ) ++len; glyphs = malloc((len+1)*sizeof(SplineChar *)); for ( i=len=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) if ( sc->mathkern!=NULL ) glyphs[len++] = sc; glyphs[len] = NULL; coverage_pos = ftell(mathf); putshort(mathf,0); /* Coverage table, return to this */ putshort(mathf,len); kr_pos = coverage_pos + 4 + 8*len; for ( i=0; imathkern; if ( mk->top_right.cnt==0 ) putshort(mathf,0); else { putshort(mathf,kr_pos-coverage_pos); kr_pos += mkv_len(&mk->top_right); } if ( mk->top_left.cnt==0 ) putshort(mathf,0); else { putshort(mathf,kr_pos-coverage_pos); kr_pos += mkv_len(&mk->top_left); } if ( mk->bottom_right.cnt==0 ) putshort(mathf,0); else { putshort(mathf,kr_pos-coverage_pos); kr_pos += mkv_len(&mk->bottom_right); } if ( mk->bottom_left.cnt==0 ) putshort(mathf,0); else { putshort(mathf,kr_pos-coverage_pos); kr_pos += mkv_len(&mk->bottom_left); } } if ( ftell(mathf)!=coverage_pos + 4 + 8*len ) IError("Actual midpoint1 did not match expected midpoint1 in mathkern table, expected=%d, actual=%d", coverage_pos + 4 + 8*len, ftell(mathf) ); midpos2 = kr_pos; for ( i=0; imathkern; if ( mk->top_right.cnt!=0 ) kr_pos = ttf_math_dump_mathkernvertex(mathf,&mk->top_right,kr_pos); if ( mk->top_left.cnt!=0 ) kr_pos = ttf_math_dump_mathkernvertex(mathf,&mk->top_left,kr_pos); if ( mk->bottom_right.cnt!=0 ) kr_pos = ttf_math_dump_mathkernvertex(mathf,&mk->bottom_right,kr_pos); if ( mk->bottom_left.cnt!=0 ) kr_pos = ttf_math_dump_mathkernvertex(mathf,&mk->bottom_left,kr_pos); } if ( ftell(mathf)!=midpos2) IError("Actual midpoint2 did not match expected midpoint2 in mathkern table, expected=%d, actual=%d", midpos2, ftell(mathf) ); for ( i=0; imathkern; if ( mk->top_right.cnt!=0 ) ttf_math_dump_mathkerndevtab(mathf,&mk->top_right); if ( mk->top_left.cnt!=0 ) ttf_math_dump_mathkerndevtab(mathf,&mk->top_left); if ( mk->bottom_right.cnt!=0 ) ttf_math_dump_mathkerndevtab(mathf,&mk->bottom_right); if ( mk->bottom_left.cnt!=0 ) ttf_math_dump_mathkerndevtab(mathf,&mk->bottom_left); } if ( kr_pos!=ftell(mathf) ) IError("Actual end did not match expected end in mathkern table, expected=%d, actual=%d", kr_pos, ftell(mathf) ); coverage_table = ftell(mathf); fseek( mathf, coverage_pos, SEEK_SET); putshort(mathf,coverage_table-coverage_pos); fseek(mathf,coverage_table,SEEK_SET); dumpcoveragetable(mathf,glyphs); free(glyphs); } static int gv_len(SplineFont *sf, struct glyphvariants *gv) { char *pt, *start; int ch, cnt; SplineChar *sc; if ( gv==NULL || (gv->variants==NULL && gv->part_cnt==0)) return( 0 ); if ( gv->variants==NULL ) return( 4 ); /* No variants, but we've got parts to assemble */ cnt = 0; for ( start=gv->variants ;; ) { while ( *start==' ' ) ++start; if ( *start=='\0' ) return( 4+4*cnt ); /* MathGlyphConstructionTable */ for ( pt = start ; *pt!=' ' && *pt!='\0'; ++pt ); ch = *pt; *pt = '\0'; sc = SFGetChar(sf,-1,start); *pt = ch; if ( sc!=NULL ) ++cnt; start = pt; } } static int gvc_len(struct glyphvariants *gv) { if ( gv->part_cnt==0 ) return( 0 ); return( 6+10*gv->part_cnt ); } static uint32 ttf_math_dump_mathglyphconstructiontable(FILE *mathf, struct glyphvariants *gv,SplineFont *sf, uint32 pos,int is_v) { char *pt, *start; int ch, cnt; SplineChar *sc; uint32 here = ftell(mathf); DBounds b; putshort(mathf,gv->part_cnt==0? 0 : pos-here); if ( gv->variants==NULL ) { putshort(mathf,0); } else { cnt = 0; for ( start=gv->variants ;; ) { while ( *start==' ' ) ++start; if ( *start=='\0' ) break; for ( pt = start ; *pt!=' ' && *pt!='\0'; ++pt ); ch = *pt; *pt = '\0'; sc = SFGetChar(sf,-1,start); *pt = ch; if ( sc!=NULL ) ++cnt; start = pt; } putshort(mathf,cnt); for ( start=gv->variants ;; ) { while ( *start==' ' ) ++start; if ( *start=='\0' ) break; for ( pt = start ; *pt!=' ' && *pt!='\0'; ++pt ); ch = *pt; *pt = '\0'; sc = SFGetChar(sf,-1,start); *pt = ch; if ( sc!=NULL ) { putshort(mathf,sc->ttf_glyph); SplineCharFindBounds(sc,&b); /* Don't ask me why I have a plus one here. In the MS font */ /* CambriaMath all of these values are one more than I would */ /* expect */ if ( is_v ) putshort(mathf,b.maxy-b.miny +1); else putshort(mathf,b.maxx-b.minx +1); } start=pt; } } return( pos + gvc_len(gv)); } static uint32 ttf_math_dump_mathglyphassemblytable(FILE *mathf, struct glyphvariants *gv,SplineFont *sf, uint32 devtab_pos) { SplineChar *sc; uint32 here = ftell(mathf); int i; if ( gv->part_cnt==0 ) return( devtab_pos ); putshort(mathf,gv->italic_correction); if ( gv->italic_adjusts!=NULL ) { putshort(mathf,devtab_pos-here); devtab_pos += DevTabLen(gv->italic_adjusts); } else putshort(mathf,0); putshort(mathf,gv->part_cnt); for ( i=0; ipart_cnt; ++i ) { sc = SFGetChar(sf,-1,gv->parts[i].component); if ( sc==NULL ) putshort(mathf,0); /* .notdef */ else putshort(mathf,sc->ttf_glyph); putshort(mathf,gv->parts[i].startConnectorLength); putshort(mathf,gv->parts[i].endConnectorLength); putshort(mathf,gv->parts[i].fullAdvance); putshort(mathf,gv->parts[i].is_extender); } return(devtab_pos); } static void ttf_math_dump_glyphvariant(FILE *mathf,struct alltabs *at, SplineFont *sf) { int i, gid, vlen, hlen; SplineChar *sc, **vglyphs, **hglyphs; uint32 coverage_pos, coverage_table, offset, pos, assembly_pos; /* Figure out our glyph list (and count) */ for ( i=vlen=hlen=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) { if ( sc->vert_variants!=NULL ) ++vlen; if ( sc->horiz_variants!=NULL ) ++hlen; } vglyphs = malloc((vlen+1)*sizeof(SplineChar *)); hglyphs = malloc((hlen+1)*sizeof(SplineChar *)); for ( i=vlen=hlen=0; igi.gcnt; ++i ) if ( (gid=at->gi.bygid[i])!=-1 && (sc=sf->glyphs[gid])!=NULL ) { if ( sc->vert_variants!=NULL ) vglyphs[vlen++] = sc; if ( sc->horiz_variants!=NULL ) hglyphs[hlen++] = sc; } vglyphs[vlen] = NULL; hglyphs[hlen] = NULL; putshort(mathf,sf->MATH==NULL?(sf->ascent+sf->descent)/50 : sf->MATH->MinConnectorOverlap ); coverage_pos = ftell(mathf); putshort(mathf,0); /* Vertical Coverage table, return to this */ putshort(mathf,0); /* Horizontal Coverage table, return to this */ putshort(mathf,vlen); putshort(mathf,hlen); offset = 5*2+vlen*2+hlen*2; for ( i=0; ivert_variants); } for ( i=0; ihoriz_variants); } assembly_pos = pos = (coverage_pos-2)+offset; for ( i=0; ivert_variants,sf,pos,true); /*if ( ftell(mathf)-start != gv_len(sf,vglyphs[i]->vert_variants))*/ /*IError("v gv_len incorrect");*/ } for ( i=0; ihoriz_variants,sf,pos,false); /*if ( ftell(mathf)-start != gv_len(sf,hglyphs[i]->horiz_variants))*/ /*IError("h gv_len incorrect: %s", hglyphs[i]->name);*/ } if ( ftell(mathf)!=assembly_pos ) IError("assembly tables at wrong place"); for ( i=0; ivert_variants,sf,pos); for ( i=0; ihoriz_variants,sf,pos); for ( i=0; ivert_variants->part_cnt!=0 && vglyphs[i]->vert_variants->italic_adjusts!=NULL ) dumpgposdevicetable(mathf,vglyphs[i]->vert_variants->italic_adjusts); for ( i=0; ihoriz_variants->part_cnt!=0 && hglyphs[i]->horiz_variants->italic_adjusts!=NULL ) dumpgposdevicetable(mathf,hglyphs[i]->horiz_variants->italic_adjusts); if ( vlen!=0 ) { coverage_table = ftell(mathf); fseek( mathf, coverage_pos, SEEK_SET); putshort(mathf,coverage_table-(coverage_pos-2)); fseek(mathf,coverage_table,SEEK_SET); dumpcoveragetable(mathf,vglyphs); } free(vglyphs); if ( hlen!=0 ) { coverage_table = ftell(mathf); fseek( mathf, coverage_pos+2, SEEK_SET); putshort(mathf,coverage_table-(coverage_pos-2)); fseek(mathf,coverage_table,SEEK_SET); dumpcoveragetable(mathf,hglyphs); } free(hglyphs); } void otf_dump_math(struct alltabs *at, SplineFont *sf) { FILE *mathf; int i; uint32 devtab_offsets[60], const_start, gi_start, v_start; int bits = MathBits(at,sf); if ( sf->MATH==NULL ) return; at->math = mathf = tmpfile2(); putlong(mathf, 0x00010000 ); /* Version 1 */ putshort(mathf, 10); /* Offset to constants */ putshort(mathf, 0); /* GlyphInfo, fix later */ putshort(mathf, 0); /* Variants, fix later */ /* Start on constants */ memset(devtab_offsets,0,sizeof(devtab_offsets)); const_start = ftell(mathf); for ( i=0; math_constants_descriptor[i].script_name!=NULL; ++i ) { int16 *pos = (int16 *) (((char *) (sf->MATH)) + math_constants_descriptor[i].offset ); if ( pos == (int16 *) &sf->MATH->MinConnectorOverlap ) continue; /* Actually lives in the Variant table, not here */ putshort(mathf, *pos); if ( math_constants_descriptor[i].devtab_offset != -1 ) { devtab_offsets[i] = ftell(mathf); putshort(mathf, 0); /* Fix up later if we support device tables */ } } for ( i=0; math_constants_descriptor[i].script_name!=NULL; ++i ) { int16 *pos = (int16 *) (((char *) (sf->MATH)) + math_constants_descriptor[i].offset ); DeviceTable **devtab = (DeviceTable **) (((char *) (sf->MATH)) + math_constants_descriptor[i].devtab_offset ); if ( pos == (int16 *) &sf->MATH->MinConnectorOverlap ) continue; /* Actually lives in the Variant table, not here */ if ( math_constants_descriptor[i].devtab_offset >= 0 && *devtab!=NULL ) { uint32 here = ftell(mathf); fseek(mathf,devtab_offsets[i],SEEK_SET); putshort(mathf, here-const_start); fseek(mathf,here,SEEK_SET); dumpgposdevicetable(mathf,*devtab); } } /* The spec does not say this can be NULL */ if ( 1 /* bits&mb_gi*/ ) { gi_start = ftell(mathf); fseek(mathf,6,SEEK_SET); putshort(mathf,gi_start); fseek(mathf,gi_start,SEEK_SET); putshort(mathf,0); /* Italics correction */ putshort(mathf,0); /* top accent */ putshort(mathf,0); /* is extended shape */ putshort(mathf,0); /* math kern info */ if ( bits&mb_italic ) { v_start = ftell(mathf); fseek(mathf,gi_start,SEEK_SET); putshort(mathf,v_start-gi_start); fseek(mathf,v_start,SEEK_SET); ttf_math_dump_italic_top(mathf,at,sf,true); } if ( bits&mb_topaccent ) { v_start = ftell(mathf); fseek(mathf,gi_start+2,SEEK_SET); putshort(mathf,v_start-gi_start); fseek(mathf,v_start,SEEK_SET); ttf_math_dump_italic_top(mathf,at,sf,false); } if ( bits&mb_extended ) { v_start = ftell(mathf); fseek(mathf,gi_start+4,SEEK_SET); putshort(mathf,v_start-gi_start); fseek(mathf,v_start,SEEK_SET); ttf_math_dump_extended(mathf,at,sf); } if ( bits&mb_mathkern ) { v_start = ftell(mathf); fseek(mathf,gi_start+6,SEEK_SET); putshort(mathf,v_start-gi_start); fseek(mathf,v_start,SEEK_SET); ttf_math_dump_mathkern(mathf,at,sf); } } /* The spec does not say this can be NULL */ if ( 1 /* bits&mb_gv*/ ) { v_start = ftell(mathf); fseek(mathf,8,SEEK_SET); putshort(mathf,v_start); fseek(mathf,v_start,SEEK_SET); ttf_math_dump_glyphvariant(mathf,at,sf); } at->mathlen = ftell(mathf); if ( ftell(mathf)&1 ) putc('\0',mathf); if ( ftell(mathf)&2 ) putshort(mathf,0); } struct taglist { uint32 tag; struct taglist *next; }; static int taglistcompar(const void *_cv1, const void *_cv2) { const struct taglist *const *tl1 = _cv1, *const *tl2 = _cv2; if ( (*tl1)->tag==(*tl2)->tag ) return( 0 ); if ( (*tl1)->tag>(*tl2)->tag ) return( 1 ); return( -1 ); } static int langlistcompar(const void *_cv1, const void *_cv2) { const struct taglist *const *tl1 = _cv1, *const *tl2 = _cv2; if ( (*tl1)->tag==(*tl2)->tag ) return( 0 ); if ( (*tl1)->tag == DEFAULT_LANG ) return( -1 ); if ( (*tl2)->tag == DEFAULT_LANG ) return( 1 ); if ( (*tl1)->tag>(*tl2)->tag ) return( 1 ); return( -1 ); } static struct taglist *sorttaglist(struct taglist *list,int (*compar)(const void *,const void*)) { struct taglist *t, **array; int i,cnt; if ( list==NULL || list->next==NULL ) return( list ); for ( t=list, cnt=0; t!=NULL; t=t->next, ++cnt ); array = malloc(cnt*sizeof(struct taglist *)); for ( t=list, cnt=0; t!=NULL; t=t->next, ++cnt ) array[cnt] = t; qsort(array,cnt,sizeof(struct taglist *),compar); for ( i=1; inext = array[i]; array[cnt-1]->next = NULL; list = array[0]; free( array ); return( list ); } static void _base_sort(struct Base *base) { /* Sort the base lines. Which can reorder the def_baseline index in the */ /* script, and the baseline_pos lists */ /* Sort the script list */ /* Sort the language lists in each script */ /* Sort the feature lists in each language */ int i,j,pos, tag; struct basescript *bs; struct baselangextent *langs; if ( base==NULL ) return; if ( base->baseline_cnt!=0 ) { for ( i=0; ibaseline_cnt; ++i ) for ( j=i+1; jbaseline_cnt; ++j ) { if ( base->baseline_tags[i]>base->baseline_tags[j] ) { tag = base->baseline_tags[i]; base->baseline_tags[i] = base->baseline_tags[j]; base->baseline_tags[j] = tag; for ( bs=base->scripts ; bs!=NULL; bs=bs->next ) { if ( bs->def_baseline==i ) bs->def_baseline = j; else if ( bs->def_baseline==j ) bs->def_baseline = i; pos = bs->baseline_pos[i]; bs->baseline_pos[i] = bs->baseline_pos[j]; bs->baseline_pos[j] = pos; } } } } base->scripts = (struct basescript *) sorttaglist((struct taglist *) base->scripts,taglistcompar); for ( bs=base->scripts ; bs!=NULL; bs=bs->next ) { bs->langs = (struct baselangextent *) sorttaglist((struct taglist *) bs->langs,langlistcompar); for ( langs = bs->langs; langs!=NULL; langs = langs->next ) langs->features = (struct baselangextent *) sorttaglist((struct taglist *) langs->features,taglistcompar); } } void SFBaseSort(SplineFont *sf) { _base_sort(sf->horiz_base); _base_sort(sf->vert_base); } static void dump_minmax(FILE *basef,struct baselangextent *bl) { struct baselangextent *fl; int fcnt; putshort(basef,bl->descent); putshort(basef,bl->ascent); for ( fl=bl->features, fcnt=0; fl!=NULL; fl=fl->next, ++fcnt ); putshort(basef,fcnt); for ( fl=bl->features; fl!=NULL; fl=fl->next ) { putlong(basef,fl->lang); /* feature tag really */ putshort(basef,fl->descent); putshort(basef,fl->ascent); } } void otf_dumpbase(struct alltabs *at, SplineFont *sf) { FILE *basef; int i,j, cnt, lcnt; uint32 here, bsl; struct basescript *bs; struct baselangextent *bl, *dflt; int offset; if ( sf->horiz_base==NULL && sf->vert_base==NULL ) return; SFBaseSort(sf); at->base = basef = tmpfile2(); putlong(basef, 0x00010000 ); /* Version 1 */ putshort(basef, 0 ); /* offset to horizontal baselines, fill in later */ putshort(basef, 0 ); /* offset to vertical baselines, fill in later */ for ( i=0; i<2; ++i ) { struct Base *base = i==0 ? sf->horiz_base : sf->vert_base; if ( base==NULL ) continue; here = ftell(basef); fseek(basef,4+2*i,SEEK_SET); putshort(basef,here-0); fseek(basef,here,SEEK_SET); /* axis table */ putshort(basef,base->baseline_cnt==0 ? 0 : 4 ); putshort(basef,base->baseline_cnt==0 ? 4 : 4+2+4*base->baseline_cnt ); if ( base->baseline_cnt!=0 ) { /* BaseTagList table */ putshort(basef,base->baseline_cnt); for ( j=0; jbaseline_cnt; ++j ) putlong(basef,base->baseline_tags[j]); } /* BaseScriptList table */ bsl = ftell(basef); for ( bs=base->scripts, cnt=0; bs!=NULL; bs=bs->next, ++cnt ); putshort(basef,cnt); for ( bs=base->scripts; bs!=NULL; bs=bs->next ) { putlong(basef,bs->script); putshort(basef,0); } /* BaseScript table */ for ( bs=base->scripts, cnt=0; bs!=NULL; bs=bs->next, ++cnt ) { uint32 bst = ftell(basef); fseek(basef,bsl+2+6*cnt+4,SEEK_SET); putshort(basef,bst-bsl); fseek(basef,bst,SEEK_SET); for ( bl=bs->langs, dflt=NULL, lcnt=0; bl!=NULL; bl=bl->next ) { if ( bl->lang==DEFAULT_LANG ) dflt = bl; else ++lcnt; } offset = 6+6*lcnt; putshort(basef,base->baseline_cnt==0?0:offset); if ( base->baseline_cnt!=0 ) offset += 4+2*base->baseline_cnt+4*base->baseline_cnt; putshort(basef,dflt==NULL ? 0 : offset); putshort(basef,lcnt); for ( bl=bs->langs; bl!=NULL; bl=bl->next ) if ( bl->lang!=DEFAULT_LANG ) { putlong(basef,bl->lang); putshort(basef,0); } /* Base Values table */ if ( base->baseline_cnt!=0 ) { offset = 4+2*base->baseline_cnt; putshort(basef,bs->def_baseline); putshort(basef,base->baseline_cnt); for ( j=0; jbaseline_cnt; ++j ) { putshort(basef,offset); offset += 2*2; } for ( j=0; jbaseline_cnt; ++j ) { putshort(basef,1); /* format 1 */ putshort(basef,bs->baseline_pos[j]); } } if ( dflt!=NULL ) dump_minmax(basef,dflt); for ( bl=bs->langs, dflt=NULL, lcnt=0; bl!=NULL; bl=bl->next ) if ( bl->lang!=DEFAULT_LANG ) { uint32 here = ftell(basef); fseek(basef,bst+6+6*lcnt+4,SEEK_SET); putshort(basef,here-bst); fseek(basef,here,SEEK_SET); dump_minmax(basef,bl); } } } at->baselen = ftell(basef); if ( ftell(basef)&1 ) putc('\0',basef); if ( ftell(basef)&2 ) putshort(basef,0); } static int jscriptsort(const void *_s1,const void *_s2) { const Justify * const * __s1 = (const Justify * const *) _s1; const Justify * const * __s2 = (const Justify * const *) _s2; const Justify *s1 = *__s1; const Justify *s2 = *__s2; if ( s1->script>s2->script ) return( 1 ); else if ( s1->scriptscript ) return( -1 ); else return( 0 ); } static int jlangsort(const void *_s1,const void *_s2) { const struct jstf_lang * const * __s1 = (const struct jstf_lang * const *) _s1; const struct jstf_lang * const * __s2 = (const struct jstf_lang * const *) _s2; const struct jstf_lang *s1 = *__s1; const struct jstf_lang *s2 = *__s2; if ( s1->lang==s2->lang ) return( 0 ); if ( s1->lang==DEFAULT_LANG ) return( -1 ); if ( s2->lang==DEFAULT_LANG ) return( 1 ); if ( s1->lang>s2->lang ) return( 1 ); else return( -1 ); } static int lookup_order(const void *_s1,const void *_s2) { const OTLookup * const * __s1 = (const OTLookup * const *) _s1; const OTLookup * const * __s2 = (const OTLookup * const *) _s2; const OTLookup *s1 = *__s1; const OTLookup *s2 = *__s2; if ( s1->lookup_index>s2->lookup_index ) return( 1 ); else if ( s1->lookup_indexlookup_index ) return( -1 ); else return( 0 ); } static void SFJstfSort(SplineFont *sf) { /* scripts must be ordered */ /* languages must be ordered within scripts */ /* lookup lists must be ordered */ Justify *jscript, **scripts; int i,cnt,lmax; struct jstf_lang **langs; for ( cnt=0, jscript= sf->justify; jscript!=NULL; ++cnt, jscript=jscript->next ); if ( cnt>1 ) { scripts = malloc(cnt*sizeof(Justify *)); for ( i=0, jscript= sf->justify; jscript!=NULL; ++i, jscript=jscript->next ) scripts[i] = jscript; qsort(scripts,cnt,sizeof(Justify *),jscriptsort); for ( i=1; inext = scripts[i]; scripts[cnt-1]->next = NULL; sf->justify = scripts[0]; free(scripts); } langs = NULL; lmax=0; for ( jscript= sf->justify; jscript!=NULL; jscript=jscript->next ) { struct jstf_lang *jlang; for ( cnt=0, jlang=jscript->langs; jlang!=NULL; ++cnt, jlang=jlang->next ); if ( cnt>1 ) { if ( cnt>lmax ) langs = realloc(langs,(lmax=cnt+10)*sizeof(struct jstf_lang *)); for ( i=0, jlang=jscript->langs; jlang!=NULL; ++i, jlang=jlang->next ) langs[i] = jlang; qsort(langs,cnt,sizeof(Justify *),jlangsort); for ( i=1; inext = langs[i]; langs[cnt-1]->next = NULL; jscript->langs = langs[0]; } } free(langs); /* don't bother to sort the lookup lists yet. We need to separate them into*/ /* GPOS/GSUB first, might as well do it all at once later */ } static void jstf_SplitTables(OTLookup **mixed,OTLookup ***_SUB,OTLookup ***_POS) { /* (later is now, see comment above) */ /* mixed contains both gsub and gpos lookups. put them into their own */ /* lists, and then sort them */ int cnt, s, p; OTLookup **SUB, **POS; if ( mixed==NULL || mixed[0]==NULL ) { *_SUB = NULL; *_POS = NULL; return; } for ( cnt=0; mixed[cnt]!=NULL; ++cnt); SUB = malloc((cnt+1)*sizeof(OTLookup *)); POS = malloc((cnt+1)*sizeof(OTLookup *)); for ( cnt=s=p=0; mixed[cnt]!=NULL; ++cnt) { if ( mixed[cnt]->lookup_index==-1 ) /* Not actually used */ continue; if ( mixed[cnt]->lookup_type>=gpos_start ) POS[p++] = mixed[cnt]; else SUB[s++] = mixed[cnt]; } POS[p] = SUB[s] = NULL; if ( p>1 ) qsort(POS,p,sizeof(OTLookup *),lookup_order); if ( s>1 ) qsort(SUB,s,sizeof(OTLookup *),lookup_order); if ( p==0 ) { free(POS); POS=NULL; } if ( s==0 ) { free(SUB); SUB=NULL; } *_SUB = SUB; *_POS = POS; } static uint32 jstf_dumplklist(FILE *jstf,OTLookup **PS,uint32 base) { uint32 here; int i; if ( PS==NULL ) return( 0 ); here = ftell(jstf); for ( i=0; PS[i]!=NULL; ++i ); putshort(jstf,i); /* Lookup cnt */ for ( i=0; PS[i]!=NULL; ++i ) putshort( jstf, PS[i]->lookup_index ); free(PS); return( here - base ); } static uint32 jstf_dumpmaxlookups(FILE *jstf,SplineFont *sf,struct alltabs *at, OTLookup **maxes,uint32 base) { uint32 here, lbase; int cnt,i; int scnt, j; struct lookup_subtable *sub; if ( maxes==NULL ) return( 0 ); for ( cnt=i=0; maxes[i]!=NULL; ++i ) if ( !maxes[i]->unused ) ++cnt; if ( cnt==0 ) return( 0 ); if ( (here=ftell(jstf))<0 ) return( 0 ); putshort( jstf,cnt ); for ( i=0; maxes[i]!=NULL; ++i ) if ( !maxes[i]->unused ) putshort( jstf,0 ); for ( cnt=i=0; maxes[i]!=NULL; ++i ) if ( !maxes[i]->unused ) { if ( (lbase=ftell(jstf))<0 ) return( 0 ); fseek(jstf,here+2+2*cnt,SEEK_SET); putshort(jstf,lbase-here); fseek(jstf,lbase,SEEK_SET); putshort(jstf,maxes[i]->lookup_type - gpos_start ); putshort(jstf,maxes[i]->lookup_flags); for ( scnt=0, sub=maxes[i]->subtables; sub!=NULL; sub=sub->next ) if ( !sub->unused ) ++scnt; putshort( jstf,scnt ); for ( j=0; jsubtables; sub!=NULL; sub=sub->next ) if ( !sub->unused ) putshort(jstf,sub->subtable_offset-lbase); ++cnt; } return( here - base ); } void otf_dumpjstf(struct alltabs *at, SplineFont *sf) { FILE *jstf; int i, cnt, lcnt, offset; uint32 here, base; Justify *jscript; struct jstf_lang *jlang; if ( sf->justify==NULL ) return; SFJstfSort(sf); for ( jscript=sf->justify, cnt=0; jscript!=NULL; jscript=jscript->next, ++cnt ); at->jstf = jstf = tmpfile2(); putlong(jstf, 0x00010000 ); /* Version 1 */ putshort(jstf, cnt ); /* script count */ for ( jscript=sf->justify; jscript!=NULL; jscript=jscript->next ) { putlong(jstf, jscript->script); putshort(jstf, 0); /* Come back to this later */ } for ( jscript=sf->justify, cnt=0; jscript!=NULL; jscript=jscript->next, ++cnt ) { base = ftell(jstf); if ( base>0xffff ) ff_post_error(_("Failure"),_("Offset in JSTF table is too big. The resultant font will not work.")); fseek(jstf, 6+6*cnt+4,SEEK_SET); putshort(jstf,base); fseek(jstf, base, SEEK_SET); putshort(jstf,0); /* extender glyphs */ putshort(jstf,0); /* default lang */ for ( jlang=jscript->langs, lcnt=0; jlang!=NULL; jlang=jlang->next, ++lcnt ); if ( lcnt>0 && jscript->langs->lang==DEFAULT_LANG ) --lcnt; putshort(jstf,lcnt); /* count of non-default languages */ jlang = jscript->langs; if ( jlang!=NULL && jlang->lang==DEFAULT_LANG ) jlang=jlang->next; for ( ; jlang!=NULL; jlang=jlang->next ) { putlong(jstf, jlang->lang); putshort(jstf, 0); /* Come back to this later */ } if ( jscript->extenders!=NULL ) { SplineChar **glyphs; int gcnt,g; here = ftell(jstf); fseek(jstf,base,SEEK_SET); putshort(jstf,here-base); fseek(jstf,here,SEEK_SET); glyphs = OrderedGlyphsFromNames(sf,jscript->extenders); if ( glyphs==NULL ) gcnt=0; else for ( gcnt=0; glyphs[gcnt]!=NULL; ++gcnt); putshort(jstf,gcnt); for ( g=0; gttf_glyph); free(glyphs); } offset=0; for ( jlang=jscript->langs, lcnt=0; jlang!=NULL; jlang=jlang->next, ++lcnt ) { here = ftell(jstf); if ( jlang->lang==DEFAULT_LANG ) { fseek(jstf,base+2,SEEK_SET); offset = -6; } else fseek(jstf,base+offset+10+lcnt*6,SEEK_SET); putshort(jstf,here-base); fseek(jstf,here,SEEK_SET); putshort(jstf,jlang->cnt); for ( i=0; icnt; ++i ) putshort(jstf,0); for ( i=0; icnt; ++i ) { OTLookup **enSUB, **enPOS, **disSUB, **disPOS; uint32 enSUBoff, enPOSoff, disSUBoff, disPOSoff, maxOff; uint32 pbase; pbase = ftell(jstf); fseek(jstf,here+2+i*2,SEEK_SET); putshort(jstf,pbase-here); fseek(jstf,pbase,SEEK_SET); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); putshort(jstf,0); jstf_SplitTables(jlang->prios[i].enableShrink,&enSUB,&enPOS); jstf_SplitTables(jlang->prios[i].disableShrink,&disSUB,&disPOS); enSUBoff = jstf_dumplklist(jstf,enSUB, pbase); disSUBoff = jstf_dumplklist(jstf,disSUB,pbase); enPOSoff = jstf_dumplklist(jstf,enPOS, pbase); disPOSoff = jstf_dumplklist(jstf,disPOS,pbase); maxOff = jstf_dumpmaxlookups(jstf,sf,at,jlang->prios[i].maxShrink,pbase); fseek(jstf,pbase,SEEK_SET); putshort(jstf,enSUBoff); putshort(jstf,disSUBoff); putshort(jstf,enPOSoff); putshort(jstf,disPOSoff); putshort(jstf,maxOff); fseek(jstf,0,SEEK_END); jstf_SplitTables(jlang->prios[i].enableExtend,&enSUB,&enPOS); jstf_SplitTables(jlang->prios[i].disableExtend,&disSUB,&disPOS); enSUBoff = jstf_dumplklist(jstf,enSUB, pbase); disSUBoff = jstf_dumplklist(jstf,disSUB,pbase); enPOSoff = jstf_dumplklist(jstf,enPOS, pbase); disPOSoff = jstf_dumplklist(jstf,disPOS,pbase); maxOff = jstf_dumpmaxlookups(jstf,sf,at,jlang->prios[i].maxExtend,pbase); fseek(jstf,pbase+10,SEEK_SET); putshort(jstf,enSUBoff); putshort(jstf,disSUBoff); putshort(jstf,enPOSoff); putshort(jstf,disPOSoff); putshort(jstf,maxOff); fseek(jstf,0,SEEK_END); } } } fseek(jstf,0,SEEK_END); at->jstflen = ftell(jstf); if ( ftell(jstf)&1 ) putc('\0',jstf); if ( ftell(jstf)&2 ) putshort(jstf,0); } void otf_dump_dummydsig(struct alltabs *at, SplineFont *sf) { FILE *dsigf; /* I think the DSIG table is a big crock. At best the most it can do is */ /* tell you that the font hasn't changed since it was signed. It gives */ /* no guarantee that the data are reasonable. I think it's stupid. */ /* I think it is even more stupid that MS choses this useless table as a*/ /* mark of whether a ttf font is OpenType or not. */ /* But users want their fonts to show up as OpenType under MS. And I'm */ /* told an empty DSIG table works for that. So... a truely pointless */ /* instance of a pointless table. I suppose that's a bit ironic. */ at->dsigf = dsigf = tmpfile2(); putlong(dsigf,0x00000001); /* Standard version (and why isn't it 0x10000 like everything else?) */ putshort(dsigf,0); /* No signatures in my signature table*/ putshort(dsigf,0); /* No flags */ at->dsiglen = ftell(dsigf); if ( ftell(dsigf)&1 ) putc('\0',dsigf); if ( ftell(dsigf)&2 ) putshort(dsigf,0); } dvisvgm-2.8.1/libs/ff-woff/LICENSE0000664000175000017500000002326113510660062013417 00000000000000# FontForge Licensing FontForge is available as a whole under the terms of the [GNU GPL](http://www.gnu.org/copyleft/gpl.html), version 3 or any later version. However, almost all of its parts are available under the "revised BSD license" ([pdf](http://www.law.yi.org/~sfllaw/talks/bsd.pdf)) because FontForge was mostly written by George Williams, using that license. The Revised BSD License is very permissive, and allows for code to be combined with other code under other licenses. There are many useful libraries available under copyleft libre licenses, such as the LGPL and GPL, which FontForge started to use in 2012. For example, Pango and Cairo are available under the LGPL, and gnulib is available under the GPL. Advanced features added since 2012 are licensed by their individual developers under the GPLv3. ## How To License Contributions - Contributions to existing files must be made under the existing license for that file - Contributions in new files should be made under the original Revised BSD License, but any license compatible with the GPLv3 is fine The majority of FontForge was written by George Williams and published under the revised BSD license. This license is permitted to be compiled with added GNU GPL source code to build a FontForge executable program. FontForge was known from 2000 to 2004 as PfaEdit, and was written and developed primarily by George Williams from 2000 until 2012. It is published as free/libre software and distributed under the 3-clause BSD license. Later, when development slowed down and then stopped in 2012, the FontForge community began to take an interest in improving FontForge further with fixes, modifications, libraries, patches, and other additions which have been introduced under the same, or different, yet, compatible licenses. ## Copyright Notices, Contributors, Translators See [`AUTHORS`](https://github.com/fontforge/fontforge/blob/master/AUTHORS) ## The Revised BSD License used by FontForge ``` 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. ``` ## LGPL and GPL FontForge includes the GPLv3 in the source tree as [COPYING.gplv3](https://github.com/fontforge/fontforge/blob/master/COPYING.gplv3) You can read the [LGPL](http://www.gnu.org/licenses/lgpl.html) and [GPL](http://www.gnu.org/copyleft/gpl.html) on the GNU website. ## Source Files ### FontForge Files Using The Revised BSD License These files were created under the Revised BSD License: ``` fontforge-20120731-b/ install-sh fontforge-20120731-b/fontforge: alignment.c fontinfo.c savefont.h anchorsaway.c fontview.c savefontdlg.c asmfpst.c fontviewbase.c scriptfuncs.h autohint.c freetype.c scripting.c autosave.c freetypeui.c scripting.h autotrace.c ftdelta.c scriptingdlg.c autowidth.c fvcomposite.c scstyles.c autowidth2.c fvfonts.c scstylesui.c autowidth2.h fvfontsdlg.c sd.h autowidth2dlg.c fvmetrics.c search.c basedlg.c fvmetrics.h search.h baseviews.h fvmetricsdlg.c searchview.c bdfinfo.c glyphcomp.c sfd.c bitmapchar.c gotodlg.c sfd1.c bitmapcontrol.c groups.c sfd1.h bitmapcontrol.h groups.h sfddiff.c bitmapdlg.c groupsdlg.c sflayout.c bitmapview.c histograms.c sflayoutP.h bvedit.c http.c sftextfield.c charinfo.c ikarus.c sftextfieldP.h charview.c images.c showatt.c clipnoui.c justifydlg.c simplifydlg.c clipui.c kernclass.c spiro.c combinations.c layer2layer.c splashimage.c configure-fontforge.h lookups.c splinechar.c contextchain.c lookupui.c splinefill.c cursors.c macbinary.c splinefont.c cvaddpoints.c macenc.c splinefont.h cvdebug.c macencui.c splineorder2.c cvdgloss.c math.c splineoverlap.c cvexport.c mathconstants.c splinerefigure.c cvexportdlg.c metricsview.c splinesaveafm.c cvfreehand.c mm.c splinesave.c cvgetinfo.c mm.h splinestroke.c cvgridfit.c mmdlg.c splineutil.c cvhand.c namehash.h splineutil2.c cvhints.c namelist.c start.c cvimages.c nonlineartrans.c startnoui.c cvimportdlg.c nonlineartrans.h startui.c cvknife.c nonlineartransui.c statemachine.c cvpalettes.c noprefs.c stemdb.c cvpointer.c nouiutil.c stemdb.h cvruler.c nowakowskittfinstr.c svg.c cvshapes.c tilepath.c cvstroke.c openfontdlg.c tottf.c cvtranstools.c palmfonts.c tottfaat.c cvundoes.c parsepdf.c tottfgpos.c delta.h parsepfa.c tottfvar.c deltaui.c parsettf.c transform.c displayfonts.c parsettfatt.c ttf.h dumpbdf.c parsettfbmf.c ttfinstrs.c dumppfa.c parsettfvar.c ttfinstrs.h edgelist.h PfEd.h ttfinstrsui.c edgelist2.h plugins.c ttfspecial.c effects.c plugins.h ufo.c effectsui.c prefs.c uiinterface.h encoding.c print.c uiutil.c encodingui.c print.h unicoderange.c featurefile.c problems.c unicoderange.h fffreetype.h psfont.h utils.c ffpython.h psread.c views.h fontforge.h python.c windowmenu.c fontforgeui.h pythonui.c winfonts.c fontforgevw.h savefont.c woff.c fontforge-20120731-b/gdraw: choosericons.c gfiledlg.c gradio.c colorP.h ggadgetP.h gresedit.c ctlvalues.c ggadgets.c gresource.c drawboxborder.c ggroupbox.c gresourceimage.c gaskdlg.c ghvbox.c gresourceP.h gbuttons.c gimagebmpP.h growcol.c gchardlg.c gimageclut.c gsavefiledlg.c gcolor.c gimagecvt.c gscrollbar.c gcontainer.c gimagepsdraw.c gspacer.c gdraw.c gimagewriteeps.c gtabset.c gdrawable.c gimagexdraw.c gtextfield.c gdrawbuildchars.c gkeysym.c gtextinfo.c gdrawerror.c glist.c gwidgetP.h gdrawgimage.c gmatrixedit.c gwidgets.c gdrawP.h gmenu.c gxcdraw.c gdrawtxt.c gprogress.c gxcdrawP.h gdrawtxtinit.c gpsdraw.c gxdrawP.h gdrawwacomdriver.c gpsdrawP.h hotkeys.c gfilechooser.c gpstxtinit.c hotkeys.h fontforge-20120731-b/gutils: dynamic.c gimagereadrgb.c giofile.c fsys.c gimagereadtiff.c gioftp.c gcol.c gimagereadxbm.c gioftpP.h gimage.c gimagereadxpm.c giofuncP.h gimagebmpP.h gimagewritebmp.c giohosts.c gimageread.c gimagewritegimage.c giomime.c gimagereadbmp.c gimagewritejpeg.c gioP.h gimagereadgif.c gimagewritepng.c giothread.c gimagereadjpeg.c gimagewritexbm.c giotrans.c gimagereadpng.c gimagewritexpm.c gwwintl.c gimagereadras.c gio.c fontforge-20120731-b/inc: basics.h gfile.h gio.h gwidget.h charset.h ggadget.h gprogress.h gwwiconv.h fileutil.h gicons.h gresedit.h intl.h gdraw.h gimage.h gresource.h ustring.h fontforge-20120731-b/Packaging: fontforge.desktop FontForge.spec fontforge.xml FontForge-doc.spec FontForge.static.spec fontforge-20120731-b/pycontrib: excepthook.py fontforge-20120731-b/Unicode: char.c makebuildtables.c ucharmap.c dump.c makeutype.c usprintf.c gwwiconv.c memory.c ustring.c ``` ### FontForge Files Using The GPL Licenses These files were created under the GPL License: ``` fontforge-20120731-b/ aclocal.m4 configure.dynamic configure.static.in config.guess configure.dynamic.in ltmain.sh config.sub configure.in Makefile.dynamic.in configure configure.static Makefile.static.in fontforge-20120731-b/fontforge: Makefile.dynamic.in Makefile.static.in fontforge-20120731-b/gdraw: Makefile.dynamic.in Makefile.static.in fontforge-20120731-b/gutils: giomime.c Makefile.dynamic.in Makefile.static.in fontforge-20120731-b/inc: fontforge-config.h.in fontforge-20120731-b/plugins: ANALYZE_MAP.COM Makefile.in fontforge-20120731-b/Unicode: Makefile.dynamic.in Makefile.static.in ``` ### FontForge Files Using The Open Group License ``` fontforge-20120731-b/fontforge: fvimportbdf.c fontforge-20120731-b/gdraw: fontP.h fontforge-20120731-b/inc: gkeysym.h ### Other Files These are generated files, or do not have a license specified: ``` fontforge-20120731-b/ LICENSE README-Unix.html fontforge.pc.in README-Mac.html systemspecific.in INSTALL README-unix VERSION fontforge-20120731-b/fontforge: acorn2sfd.c fontimage.pe pottitle.patch autowidth.h fontlint.1 pua.c bezctx_ff.c fontlint.pe sfddiff.1 bezctx_ff.h langfreq.c sfddiff.pe crctab.c libffstamp.h stamp.c libstamp.pre stamper.c diffstubs.c threaddummy.c encoding.h lookups.h utf8.pot exelibstamp.pre MacFontForgeApp.zip fontforge.1 othersubrs.c zapfnomen.c fontimage.1 potmstitle.patch fontforge-20120731-b/gdraw: genkeysym.c gxdraw.c xkeysyms_unicode.c fontforge-20120731-b/inc: chardata.h dynamic.h utype.h fontforge-20120731-b/gutils: divisors.c fontforge-20120731-b/plugins: gb12345.c fontforge-20120731-b/po: ca.po el.po es.po it.po ml.po ru.po uk.po zh_CN.po de.po en_GB.po fr.po ja.po pl.po toengb.c vi.po zh_TW.po fontforge-20120731-b/pyhook: fontforgepyhook.c psMatpyhook.c setup.py.in loadfontforge.h README fontforge-20120731-b/Unicode: alphabet.c cjk.c README.TXT ArabicForms.c combiners.h unialt.c backtrns.c utype.c ``` dvisvgm-2.8.1/libs/ff-woff/inc/0000775000175000017500000000000013563265646013260 500000000000000dvisvgm-2.8.1/libs/ff-woff/inc/gnetwork.h0000664000175000017500000000652513510660062015200 00000000000000/* Copyright (C) 2013 by Ben Martin */ /* * 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 _ALREADY_INCLUDED_GNETWORK_H_ #define _ALREADY_INCLUDED_GNETWORK_H_ #include #define IPADDRESS_STRING_LENGTH_T 100 /** * Get a string that describes this host. It may be something * like "foobar" if the user has decided to call their laptop that name. * So you might not be able to resolve the returned hostname on a remote * computer. Data is copied to outstring and outstring is returned. */ char* ff_gethostname( char* outstring, int outstring_sz ); /** * Get the network accessible IP address of the local machine. * * If the machine is multihomed you had better hope that traffic * from the network can reach all NICs on the host. * * The output is copied to outstring which is assumed to be * at least ipaddress_string_length_t bytes long. The outstring is * also returned. */ extern char* getNetworkAddress( char* outstring ); extern char* HostPortPack( char* hostname, int port ); extern char* HostPortUnpack( char* packed, int* port, int port_default ); /** * This is ZUUID_LEN. Because that length is stable and to avoid bringing in * the czmq header file it is redeclared from base form here. */ #define FF_UUID_BINARY_SIZE 16 /** * min length of a buffer that will contain an ascii string serialiation of a uuid */ #define FF_UUID_STRING_SIZE 33 /** * generate a new uuid and stringify it into the target area provided * after the call target should contain something like * 1b4e28ba-2fa1-11d2-883f-0016d3cca427 * with the trailing NUL. Before the call target needs to be at least * FF_UUID_STRING_SIZE bytes long. * the 'target' is also the return value. */ char* ff_uuid_generate( char* target ); /** * This test might be improved in the future. * You pass a string which might have the form of a UUID (or be "\0 whatever") or * just be a null pointer, and the function returns true if the uuid string * you passed in conforms to being a uuid. */ extern int ff_uuid_isValid( char* uuid ); #endif dvisvgm-2.8.1/libs/ff-woff/inc/chardata.h0000664000175000017500000000575313510660062015111 00000000000000#include struct charmap { int first, last; unsigned char **table; unichar_t *totable; }; struct charmap2 { int first, last; unsigned short **table; unichar_t *totable; }; extern const unichar_t unicode_from_i8859_1[]; extern struct charmap i8859_1_from_unicode; extern const unichar_t unicode_from_i8859_2[]; extern struct charmap i8859_2_from_unicode; extern const unichar_t unicode_from_i8859_3[]; extern struct charmap i8859_3_from_unicode; extern const unichar_t unicode_from_i8859_4[]; extern struct charmap i8859_4_from_unicode; extern const unichar_t unicode_from_i8859_5[]; extern struct charmap i8859_5_from_unicode; extern const unichar_t unicode_from_i8859_6[]; extern struct charmap i8859_6_from_unicode; extern const unichar_t unicode_from_i8859_7[]; extern struct charmap i8859_7_from_unicode; extern const unichar_t unicode_from_i8859_8[]; extern struct charmap i8859_8_from_unicode; extern const unichar_t unicode_from_i8859_9[]; extern struct charmap i8859_9_from_unicode; extern const unichar_t unicode_from_i8859_10[]; extern struct charmap i8859_10_from_unicode; extern const unichar_t unicode_from_i8859_11[]; extern struct charmap i8859_11_from_unicode; extern const unichar_t unicode_from_i8859_13[]; extern struct charmap i8859_13_from_unicode; extern const unichar_t unicode_from_i8859_14[]; extern struct charmap i8859_14_from_unicode; extern const unichar_t unicode_from_i8859_15[]; extern struct charmap i8859_15_from_unicode; extern const unichar_t unicode_from_koi8_r[]; extern struct charmap koi8_r_from_unicode; extern const unichar_t unicode_from_jis201[]; extern struct charmap jis201_from_unicode; extern const unichar_t unicode_from_win[]; extern struct charmap win_from_unicode; extern const unichar_t unicode_from_mac[]; extern struct charmap mac_from_unicode; extern const unichar_t unicode_from_MacSymbol[]; extern struct charmap MacSymbol_from_unicode; extern const unichar_t unicode_from_ZapfDingbats[]; extern struct charmap ZapfDingbats_from_unicode; extern unichar_t *unicode_from_alphabets[]; extern struct charmap *alphabets_from_unicode[]; extern const unichar_t unicode_from_jis208[]; extern const unichar_t unicode_from_jis212[]; extern struct charmap2 jis_from_unicode; /* Subtract 0xa100 before indexing this array */ extern const unichar_t unicode_from_big5[]; extern struct charmap2 big5_from_unicode; /* Subtract 0x8100 before indexing this array */ extern const unichar_t unicode_from_big5hkscs[]; extern struct charmap2 big5hkscs_from_unicode; extern const unichar_t unicode_from_ksc5601[]; extern struct charmap2 ksc5601_from_unicode; /* Subtract 0x8400 before indexing this array */ extern const unichar_t unicode_from_johab[]; extern struct charmap2 johab_from_unicode; extern const unichar_t unicode_from_gb2312[]; extern struct charmap2 gb2312_from_unicode; /* a mask for each character saying what charset(s) it may be found in */ extern const unsigned long * const unicode_backtrans[]; extern const unichar_t *const * const unicode_alternates[]; dvisvgm-2.8.1/libs/ff-woff/inc/ffintl.h0000664000175000017500000000314613510660062014616 00000000000000/* Copyright (C) 2005-2012 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 FFINTL_H #define FFINTL_H #define _(str) (str) /* For messages including utf8 sequences that need gettext_noop treatment */ #define NU_(str) (str) #define N_(str) (str) #endif /* FFINTL_H */ dvisvgm-2.8.1/libs/ff-woff/inc/utype.h0000664000175000017500000001210113510660062014471 00000000000000#ifndef _UTYPE_H #define _UTYPE_H /* Copyright: 2001 George Williams */ /* License: BSD-3-clause */ /* Contributions: Joe Da Silva */ /* This file was generated using the program 'makeutype' */ #include /* Include here so we can control it. If a system header includes it later bad things happen */ #include /* Include here so we can use pre-defined int types to correctly size constant data arrays. */ #ifdef tolower # undef tolower #endif #ifdef toupper # undef toupper #endif #ifdef islower # undef islower #endif #ifdef isupper # undef isupper #endif #ifdef isalpha # undef isalpha #endif #ifdef isdigit # undef isdigit #endif #ifdef isalnum # undef isalnum #endif #ifdef isspace # undef isspace #endif #ifdef ispunct # undef ispunct #endif #ifdef ishexdigit # undef ishexdigit #endif extern const unsigned short ____tolower[]; extern const unsigned short ____toupper[]; extern const unsigned short ____totitle[]; extern const unsigned short ____tomirror[]; extern const unsigned char ____digitval[]; /* utype[] holds binary flags used for features of each unicode.org character */ #define ____L 0x1 #define ____U 0x2 #define ____TITLE 0x4 #define ____D 0x8 #define ____S 0x10 #define ____P 0x20 #define ____X 0x40 #define ____ZW 0x80 #define ____L2R 0x100 #define ____R2L 0x200 #define ____ENUM 0x400 #define ____ANUM 0x800 #define ____ENS 0x1000 #define ____CS 0x2000 #define ____ENT 0x4000 #define ____COMBINE 0x8000 #define ____BB 0x10000 #define ____BA 0x20000 #define ____NS 0x40000 #define ____NE 0x80000 #define ____UB 0x100000 #define ____NB 0x8000000 #define ____AL 0x200000 #define ____ID 0x400000 #define ____INITIAL 0x800000 #define ____MEDIAL 0x1000000 #define ____FINAL 0x2000000 #define ____ISOLATED 0x4000000 #define ____DECOMPNORM 0x10000000 #define islower(ch) (____utype[(ch)+1]&____L) #define isupper(ch) (____utype[(ch)+1]&____U) #define istitle(ch) (____utype[(ch)+1]&____TITLE) #define isalpha(ch) (____utype[(ch)+1]&(____L|____U|____TITLE|____AL)) #define isdigit(ch) (____utype[(ch)+1]&____D) #define isalnum(ch) (____utype[(ch)+1]&(____L|____U|____TITLE|____AL|____D)) #define isideographic(ch) (____utype[(ch)+1]&____ID) #define isideoalpha(ch) (____utype[(ch)+1]&(____ID|____L|____U|____TITLE|____AL)) #define isspace(ch) (____utype[(ch)+1]&____S) #define ispunct(ch) (____utype[(ch)+1]&_____P) #define ishexdigit(ch) (____utype[(ch)+1]&____X) #define iszerowidth(ch) (____utype[(ch)+1]&____ZW) #define islefttoright(ch) (____utype[(ch)+1]&____L2R) #define isrighttoleft(ch) (____utype[(ch)+1]&____R2L) #define iseuronumeric(ch) (____utype[(ch)+1]&____ENUM) #define isarabnumeric(ch) (____utype[(ch)+1]&____ANUM) #define iseuronumsep(ch) (____utype[(ch)+1]&____ENS) #define iscommonsep(ch) (____utype[(ch)+1]&____CS) #define iseuronumterm(ch) (____utype[(ch)+1]&____ENT) #define iscombining(ch) (____utype[(ch)+1]&____COMBINE) #define isbreakbetweenok(ch1,ch2) (((____utype[(ch1)+1]&____BA) && !(____utype[(ch2)+1]&____NS)) || ((____utype[(ch2)+1]&____BB) && !(____utype[(ch1)+1]&____NE)) || (!(____utype[(ch2)+1]&____D) && ch1=='/')) #define isnobreak(ch) (____utype[(ch)+1]&____NB) #define isarabinitial(ch) (____utype[(ch)+1]&____INITIAL) #define isarabmedial(ch) (____utype[(ch)+1]&____MEDIAL) #define isarabfinal(ch) (____utype[(ch)+1]&____FINAL) #define isarabisolated(ch) (____utype[(ch)+1]&____ISOLATED) #define isdecompositionnormative(ch) (____utype[(ch)+1]&____DECOMPNORM) extern const uint32 ____utype[]; /* hold character type features for each Unicode.org defined character */ /* utype2[] binary flags used for position/layout of each unicode.org character */ #define ____COMBININGCLASS 0xff #define ____ABOVE 0x100 #define ____BELOW 0x200 #define ____OVERSTRIKE 0x400 #define ____LEFT 0x800 #define ____RIGHT 0x1000 #define ____JOINS2 0x2000 #define ____CENTERLEFT 0x4000 #define ____CENTERRIGHT 0x8000 #define ____CENTEREDOUTSIDE 0x10000 #define ____OUTSIDE 0x20000 #define ____LEFTEDGE 0x80000 #define ____RIGHTEDGE 0x40000 #define ____TOUCHING 0x100000 #define ____COMBININGPOSMASK 0x1fff00 #define ____NOPOSDATAGIVEN (uint32)(-1) /* -1 == no position data given */ #define combiningclass(ch) (____utype2[(ch)+1]&____COMBININGCLASS) #define combiningposmask(ch) (____utype2[(ch)+1]&____COMBININGPOSMASK) extern const uint32 ____utype2[]; /* hold position boolean flags for each Unicode.org defined character */ #define isunicodepointassigned(ch) (____codepointassigned[(ch)/32]&(1<<((ch)%32))) extern const uint32 ____codepointassigned[]; /* 1bit_boolean_flag x 32 = exists in Unicode.org character chart list. */ #define tolower(ch) (____tolower[(ch)+1]) #define toupper(ch) (____toupper[(ch)+1]) #define totitle(ch) (____totitle[(ch)+1]) #define tomirror(ch) (____tomirror[(ch)+1]) #define tovalue(ch) (____digitval[(ch)+1]) extern struct arabicforms { unsigned short initial, medial, final, isolated; unsigned int isletter: 1; unsigned int joindual: 1; unsigned int required_lig_with_alef: 1; } ArabicForms[256]; /* for chars 0x600-0x6ff, subtract 0x600 to use array */ #define _SOFT_HYPHEN 0xad #define _DOUBLE_S 0xdf #endif dvisvgm-2.8.1/libs/ff-woff/inc/dlist.h0000664000175000017500000001350413510660062014452 00000000000000/* Copyright (C) 2012 by Ben Martin */ /* * 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 _DLIST_H #define _DLIST_H /** * Doubly linked list abstraction. Putting a full member of this * struct first in another struct means you can treat it as a * dlinkedlist. You can have a struct in many lists simply by * embedding another dlistnode member and handing a pointer to that * member to the dlist() helper functions. Double linking has big * advantages in removal of single elements where you do not need to * rescan to find removeme->prev; */ struct dlistnode { struct dlistnode* next; struct dlistnode* prev; }; /** * DEVELOPERS: make sure the start of this struct is compatible with * dlistnode. While I could use the dlistnode as a first member, using * a copy of the members in the same order as dlistnode has them * allows callers using this struct a bit simpler access. * * While one can embed a dlistnode member into a struct to create * linked lists, sometimes you want to return a splice of one of those * lists. For example, if you have a double linked list of all your * hotkeys, you might like to return only the ones that have a * modifier of the Control key. You want to leave the hotkey structs * in their original list, but create a new kust that references just * a desired selection of objects. * * In other words, if you have some data you want to return in a * double linked list, then use this node type. You can build one up * using dlist_pushfront_external() and the caller can free that list * using dlist_free_external(). Any of the foreach() functions will * work to iterate a list of dlistnodeExternal as this list is * identical to a dlistnode with an extra ptr payload. */ struct dlistnodeExternal { struct dlistnode* next; struct dlistnode* prev; void* ptr; }; /** * Push the node onto the head of the list */ extern void dlist_pushfront( struct dlistnode** list, struct dlistnode* node ); /** * Take the last node off the list and return it. If the list is empty, return 0. */ struct dlistnode* dlist_popback( struct dlistnode** list ); /** * the number of nodes in the list */ extern int dlist_size( struct dlistnode** list ); /** * is the list empty */ extern int dlist_isempty( struct dlistnode** list ); /** * Remove the node from the list. The node itself is not free()ed. * That is still up to the caller. All this function does is preserve * the list structure without the node being in it. */ extern void dlist_erase( struct dlistnode** list, struct dlistnode* node ); typedef void (*dlist_foreach_func_type)( struct dlistnode* ); /** * Call func for every node in the list. This is a defensive * implementation, if you want to remove a node from the list inside * func() that is perfectly fine. */ extern void dlist_foreach( struct dlistnode** list, dlist_foreach_func_type func ); typedef void (*dlist_foreach_udata_func_type)( struct dlistnode*, void* udata ); /** * Like dlist_foreach(), defensive coding still, but the udata pointer * is passed back to your visitor function. */ extern void dlist_foreach_udata( struct dlistnode** list, dlist_foreach_udata_func_type func, void* udata ); /** * Like dlist_foreach_udata() but nodes are visited in reverse order. */ extern void dlist_foreach_reverse_udata( struct dlistnode** list, dlist_foreach_udata_func_type func, void* udata ); /** * Assuming list is an externalNode list, push a newly allocated list node with * a dlistnodeExternal.ptr = ptr passed. */ extern void dlist_pushfront_external( struct dlistnode** list, void* ptr ); /** * Free a list of externalNode type. The externalNode memory is * free()ed, whatever externalNode.ptr is pointing to is not free()ed. */ extern void dlist_free_external( struct dlistnode** list ); typedef void (*dlist_visitor_func_type)( struct dlistnode* ); /** * To create a list of bounded length, use this function. Limit is the * maximum length the list can reach. If list nodes have to be removed * to be under this limit then "f" is used as a callback to free list * nodes. This allows application specific freeing of a list node, and * the ability to maintain a limit on the length of a list as a simple * one line call. * * The current implementation expects you to only be trimming one or * two entries at a time. It will still work for trimming 100 entries * at a single time, but might not be quite as optimized for that case * as it could be. */ extern void dlist_trim_to_limit( struct dlistnode** list, int limit, dlist_visitor_func_type f ); #endif // _DLIST_H dvisvgm-2.8.1/libs/ff-woff/inc/gwwiconv.h0000664000175000017500000000372213510660062015177 00000000000000/* Copyright (C) 2004-2012 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 _GWWICONV_H #define _GWWICONV_H # ifndef HAVE_ICONV # define __need_size_t # include /* For size_t */ typedef void *gww_iconv_t; extern gww_iconv_t gww_iconv_open(const char *toenc,const char *fromenc); extern void gww_iconv_close( gww_iconv_t cd); extern size_t gww_iconv( gww_iconv_t cd, char **inbuf, size_t *inlen, char **outbuf, size_t *outlen); #define iconv_t gww_iconv_t #define iconv_open gww_iconv_open #define iconv_close gww_iconv_close #define iconv gww_iconv # endif /* HAVE_ICONV */ #endif /* _GWWICONV_H */ dvisvgm-2.8.1/libs/ff-woff/inc/gimage.h0000664000175000017500000002064313510660062014566 00000000000000/* Copyright (C) 2000-2012 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 _GIMAGE_H #define _GIMAGE_H #include typedef uint32 Color; #define COLOR_UNKNOWN ((Color) 0xffffffff) #define COLOR_TRANSPARENT ((Color) 0xffffffff) #define COLOR_DEFAULT ((Color) 0xfffffffe) #define COLOR_CREATE(r,g,b) (((r)<<16) | ((g)<<8) | (b)) #define COLOR_ALPHA(col) (((col)>>24)) #define COLOR_RED(col) (((col)>>16) & 0xff) #define COLOR_GREEN(col) (((col)>>8) & 0xff) #define COLOR_BLUE(col) ((col)&0xff) struct hslrgb { double h,s,l,v; double r,g,b; uint8 rgb, hsl, hsv; }; struct hslrgba { double h,s,l,v; double r,g,b; uint8 rgb, hsl, hsv, has_alpha; double alpha; }; typedef struct clut { int16 clut_len; unsigned int is_grey: 1; uint32 trans_index; /* will be ignored for cluts in images, use base->trans instead */ Color clut[256]; } GClut; #define GCLUT_CLUT_EMPTY \ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \ } typedef struct revcmap RevCMap; enum image_type { it_mono, it_bitmap=it_mono, it_index, it_true, it_rgba }; struct _GImage { /* Format: bitmaps are stored with the most significant bit first in byte units indexed images are stored in byte units true color images are stored in 4 byte units, 0,red,green,blue rgba images are stored in 4 byte units, alpha,red,green blue */ enum image_type image_type: 2; int16 delay; /* for animated GIFs, delay to next frame */ int32 width, height; int32 bytes_per_line; uint8 *data; GClut *clut; Color trans; /* PNG supports more than one transparent color, we don't */ /* for non-true color images this is the index, not a color */ }; /* We deal with 1 bit, 8 bit and 32 bit images internal. 1 bit images may have*/ /* a clut (if they don't assume bw, 0==black, 1==white), 8 bit must have a */ /* clut, 32bit are actually 24 bit RGB images, but we pad them for easy */ /* accessing. it_screen means that we've got an image that can be drawn */ /* directly on the screen */ typedef struct gimage { short list_len; /* length of list */ union { /* depends on whether has_list is set */ struct _GImage *image; struct _GImage **images; } u; void *userdata; } GImage; enum pastetrans_type { ptt_paste_trans_to_trans, ptt_old_shines_through}; typedef struct grect { int32 x,y,width,height; } GRect; #define GRECT_EMPTY { 0, 0, 0, 0 } typedef struct gpoint { int16 x,y; } GPoint; #define GPOINT_EMPTY { 0, 0 } extern GImage *GImageCreate(enum image_type type, int32 width, int32 height); extern GImage *_GImage_Create(enum image_type type, int32 width, int32 height); extern void GImageDestroy(GImage *gi); extern GImage *GImageCreateAnimation(GImage **images, int n); extern GImage *GImageAddImageBefore(GImage *dest, GImage *src, int pos); extern GImage *GImageBaseGetSub(struct _GImage *base, enum image_type it, GRect *src, GClut *nclut, RevCMap *rev); extern GImage *GImageGetSub(GImage *image,enum image_type it, GRect *src, GClut *nclut, RevCMap *rev); extern int GImageInsertToBase(struct _GImage *tobase, GImage *from, GRect *src, RevCMap *rev, int to_x, int to_y, enum pastetrans_type ptt ); extern int GImageInsert(GImage *to, GImage *from, GRect *src, RevCMap *rev, int to_x, int to_y, enum pastetrans_type ptt ); extern Color _GImageGetPixelColor(struct _GImage *base,int x, int y); /* Obsolete */ extern Color GImageGetPixelColor(GImage *base,int x, int y); /* Obsolete */ extern Color GImageGetPixelRGBA(GImage *base,int x, int y); extern int GImageGetWidth(GImage *); extern int GImageGetHeight(GImage *); extern void *GImageGetUserData(GImage *img); extern void GImageSetUserData(GImage *img,void *userdata); extern void GImageResize(struct _GImage *tobase, struct _GImage *fbase, GRect *src, RevCMap *rev); extern GImage *GImageResize32(GImage *from, GRect *src, int width, int height, Color trans); extern GImage *GImageResizeSame(GImage *from, GRect *src, int width, int height, RevCMap *rev); extern RevCMap *GClutReverse(GClut *clut,int side_size); void GClut_RevCMapFree(RevCMap *rev); extern GClut *GImageFindCLUT(GImage *image,GClut *clut,int clutmax); extern int GImageSameClut(GClut *clut,GClut *nclut); extern int GImageGreyClut(GClut *clut); extern Color GImageColourFName(unichar_t *name); extern Color _GImage_ColourFName(char *name); extern char *GImageNameFColour(Color col); extern Color GDrawColorDarken(Color col, int by); extern Color GDrawColorBrighten(Color col, int by); extern int GImageWriteGImage(GImage *gi, char *filename); extern int GImageWrite_Bmp(GImage *gi, FILE *fp); extern int GImageWriteBmp(GImage *gi, char *filename); extern GImage *GImageRead_Bmp(FILE *file); extern GImage *GImageReadBmp(char *filename); extern int GImageWriteXbm(GImage *gi, char *filename); extern GImage *GImageReadXbm(char *filename); extern int GImageWriteXpm(GImage *gi, char *filename); extern GImage *GImageReadXpm(char *filename); extern int GImageWriteEps(GImage *gi, char *filename); extern GImage *GImageReadTiff(char *filename); extern GImage *GImageReadJpeg(char *filename); extern GImage *GImageRead_Jpeg(FILE *fp); extern int GImageWrite_Jpeg(GImage *gi, FILE *outfile, int quality, int progressive); extern int GImageWriteJpeg(GImage *gi, char *filename, int quality, int progressive); extern GImage *GImageRead_Png(FILE *fp); extern GImage *GImageReadPng(char *filename); extern int GImageWrite_Png(GImage *gi, FILE *fp, int progressive); extern int GImageWritePng(GImage *gi, char *filename, int progressive); extern GImage *GImageReadGif(char *filename); extern int GImageWriteGif(GImage *gi,char *filename,int progressive); extern GImage *GImageReadRas(char *filename); /* Sun Raster */ extern GImage *GImageReadRgb(char *filename); /* SGI */ extern GImage *GImageRead(char *filename); extern void GImageDrawRect(GImage *img,GRect *r,Color col); extern void GImageDrawImage(GImage *dest,GImage *src,GRect *junk,int x, int y); extern void GImageBlendOver(GImage *dest,GImage *src,GRect *from,int x, int y); extern void gRGB2HSL(struct hslrgb *col); extern void gHSL2RGB(struct hslrgb *col); extern void gRGB2HSV(struct hslrgb *col); extern void gHSV2RGB(struct hslrgb *col); extern void gColor2Hslrgb(struct hslrgb *col,Color from); extern void gColor2Hslrgba(struct hslrgba *col,Color from); extern Color gHslrgb2Color(struct hslrgb *col); extern Color gHslrgba2Color(struct hslrgba *col); #endif dvisvgm-2.8.1/libs/ff-woff/inc/basics.h0000664000175000017500000000750513510660062014603 00000000000000/* Copyright (C) 2000-2012 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 _BASICS_H #define _BASICS_H #include #include /* for NULL */ #ifdef HAVE_STDINT_H #include #else #include #endif #include /* for free */ #include #include typedef int32_t int32; typedef uint32_t uint32; typedef int16_t int16; typedef uint16_t uint16; typedef int8_t int8; typedef uint8_t uint8; /* An integral type which can hold a pointer */ typedef intptr_t intpt; typedef uint32 unichar_t; /* A macro to mark unused function parameters with. We often * have such parameters, because of extensive use of callbacks. */ #ifdef UNUSED #elif defined(__GNUC__) # define UNUSED(x) UNUSED_ ## x __attribute__((unused)) #elif defined(__LCLINT__) # define UNUSED(x) /*@unused@*/ x #else # define UNUSED(x) x #endif /* A macro to print a string for debug purposes */ #ifdef FONTFORGE_DEBUG #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif extern void NoMoreMemMessage(void); static inline int imin(int a, int b) { return (a < b) ? a : b; } static inline int imax(int a, int b) { return (a < b) ? b : a; } #define IS_IN_ORDER3( a, b, c ) ( ((a)<=(b)) && ((b)<=(c)) ) /** * Many lists in FontForge are singly linked. At times you might want * to append to the list which, when you only have a pointer to the * start of the list can be more verbose than one would like. To use * this macro you must defined a null initialized variable 'last' * outside of any loop that traverses the source list. The last * variable is used used by this macro to quickly append to the list * as you go. This macro also assumes that the 'last' and 'newitem' * types have a member "->next" which contains the single linked list * pointer to the next element. * * Efficient list append should really be a one line call in the bulk * of the code :) * * example: * MyListObjectType* newfoolast = 0; * MyListObjectType* newfoolist = 0; * * for( ... iterate a source collection of foos ... ) * { * MyListObjectType* foocopy = CopyIt( foo ); * FFLIST_SINGLE_LINKED_APPEND( newfoolist, newfoolast, foocopy ); * } */ #define FFLIST_SINGLE_LINKED_APPEND( head, last, newitem ) \ if ( !last ) \ { \ newitem->next = 0; \ head = last = newitem; \ } \ else \ { \ last->next = newitem; \ last = newitem; \ } #endif dvisvgm-2.8.1/libs/ff-woff/inc/ustring.h0000664000175000017500000002310213510660062015021 00000000000000/* Copyright (C) 2000-2012 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 _UCHAR_H # define _UCHAR_H #include #include #include #include #include extern char *copy(const char *); extern char *copyn(const char *,long); extern unichar_t *u_copy(const unichar_t*); extern unichar_t *u_copyn(const unichar_t*, long); extern unichar_t *u_copynallocm(const unichar_t *pt, long n, long m); extern unichar_t *uc_copyn(const char *, int); extern unichar_t *uc_copy(const char*); extern unichar_t *u_concat(const unichar_t*,const unichar_t*); extern char *cu_copyn(const unichar_t *pt,int len); extern char *cu_copy(const unichar_t*); extern long uc_strcmp(const unichar_t *,const char *); extern long u_strcmp(const unichar_t *, const unichar_t *); extern long uc_strncmp(const unichar_t *,const char *,int); extern long u_strncmp(const unichar_t *, const unichar_t *,int); extern long uc_strmatch(const unichar_t *,const char *); extern long uc_strnmatch(const unichar_t *,const char *,int); extern long u_strnmatch(const unichar_t *str1, const unichar_t *str2, int len); extern long u_strmatch(const unichar_t *, const unichar_t *); extern int strmatch(const char *,const char *); extern int strnmatch(const char *str1, const char *str2, int n); extern void uc_strcpy(unichar_t *, const char *); extern void cu_strcpy(char *, const unichar_t *); extern void u_strcpy(unichar_t *, const unichar_t *); extern void u_strncpy(unichar_t *, const unichar_t *,int); extern void cu_strncpy(char *to, const unichar_t *from, int len); extern void uc_strncpy(unichar_t *to, const char *from, int len); /** * Like strncpy but passing a null 'from' will simply null terminate * to[0] to give a blank result rather than a crash. */ extern char *cc_strncpy(char *to, const char *from, int len); extern void uc_strcat(unichar_t *, const char *); extern void uc_strncat(unichar_t *, const char *,int len); extern void cu_strcat(char *, const unichar_t *); extern void cu_strncat(char *, const unichar_t *,int len); extern void u_strcat(unichar_t *, const unichar_t *); extern void u_strncat(unichar_t *, const unichar_t *, int len); extern int u_strlen(const unichar_t *); /** * Like strlen() but passing a null pointer gets a 0 length */ extern int c_strlen(const char *); extern unichar_t *u_strchr(const unichar_t *,unichar_t); extern unichar_t *u_strrchr(const unichar_t *,unichar_t); extern unichar_t *uc_strstr(const unichar_t *,const char *); extern unichar_t *u_strstr(const unichar_t *,const unichar_t *); extern unichar_t *uc_strstrmatch(const unichar_t *,const char *); extern unichar_t *u_strstrmatch(const unichar_t *,const unichar_t *); extern char * strstrmatch(const char *,const char *); extern char *u_to_c(const unichar_t *); extern unichar_t *c_to_u(const char *); extern unsigned long u_strtoul(const unichar_t *,unichar_t **,int); extern long u_strtol(const unichar_t *,unichar_t **,int); extern double u_strtod(const unichar_t *,unichar_t **); /* * Convert the integer 'v' to a string and return it. * You do not own the return value, it is an internal buffer * so you should copy it before using the function again */ extern char* c_itostr( int v ); extern char *strstart(const char *initial,const char *full); extern char *strstartmatch(const char *initial,const char *full); extern unichar_t *u_strstartmatch(const unichar_t *initial, const unichar_t *full); extern unichar_t *cu_strstartmatch(const char *initial, const unichar_t *full); #define utf82u_strncpy utf82U_strncpy extern int32 utf8_ildb(const char **utf8_text); #define UTF8IDPB_NOZERO 1 /* Allow for 0 encoded as a non-zero utf8 0xc0:0x80 char */ #define UTF8IDPB_OLDLIMIT 2 /* Today's utf8 is agreed to be limited to {0..0x10FFFF} */ #define UTF8IDPB_UCS2 8 /* Encode {0...0xffff} as 16bit ucs2 type values */ #define UTF8IDPB_UTF16 16 /* Encode {0...0x10ffff} as 16bit utf16 type values */ #define UTF8IDPB_UTF32 32 /* Encode {0...0x10ffff} as 32bit utf32 type values */ extern char *utf8_idpb(char *utf8_text,uint32 ch,int flags); extern char *utf8_db(char *utf8_text); extern char *utf8_ib(char *utf8_text); extern int utf8_valid(const char *str); extern void utf8_truncatevalid(char *str); extern char *latin1_2_utf8_strcpy(char *utf8buf,const char *lbuf); extern char *latin1_2_utf8_copy(const char *lbuf); extern char *utf8_2_latin1_copy(const char *utf8buf); extern long utf8_strlen(const char *utf8_str); /* Count how many characters in the string NOT bytes */ extern long utf82u_strlen(const char *utf8_str); /* Count how many shorts needed to represent in UCS2 */ extern void utf8_strncpy(register char *to, const char *from, int len); /* copy n characters NOT bytes */ extern char *def2utf8_copy(const char *from); extern char *utf82def_copy(const char *ufrom); extern char *utf8_strchr(const char *utf8_str, int search_char); extern unichar_t *utf82u_strncpy(unichar_t *ubuf,const char *utf8buf,int len); extern unichar_t *utf82u_strcpy(unichar_t *ubuf,const char *utf8buf); extern void utf82u_strcat(unichar_t *ubuf,const char *utf8buf); extern unichar_t *utf82u_copyn(const char *utf8buf,int len); extern unichar_t *utf82u_copy(const char *utf8buf); extern char *u2utf8_strcpy(char *utf8buf,const unichar_t *ubuf); extern char *u2utf8_copy(const unichar_t *ubuf); extern char *u2utf8_copyn(const unichar_t *ubuf,int len); extern unichar_t *encoding2u_strncpy(unichar_t *uto, const char *from, int n, enum encoding cs); extern char *u2encoding_strncpy(char *to, const unichar_t *ufrom, size_t n, enum encoding cs); extern unichar_t *def2u_strncpy(unichar_t *uto, const char *from, size_t n); extern char *u2def_strncpy(char *to, const unichar_t *ufrom, size_t n); extern unichar_t *def2u_copy(const char *from); extern char *u2def_copy(const unichar_t *ufrom); extern int uAllAscii(const unichar_t *str); extern int AllAscii(const char *); extern char *StripToASCII(const char *utf8_str); extern char *copytolower(const char *); extern int endswith(const char *haystack,const char *needle); extern int endswithi(const char *haystack,const char *needle); extern int endswithi_partialExtension( const char *haystack,const char *needle); /** * Remove trailing \n or \r from the given string. No memory * allocations are performed, null is injected over these terminators * to trim the string. * * This function is designed to be impotent if called with a string * that does not end with \n or \r. ie, you don't need to redundantly * check if there is a newline at the end of string and not call here * if there is no newline. You can just call here with any string and * be assured that afterwards there will be no trailing newline or * carrage return character found at the end of the string pointed to * by 'p'. */ extern char* chomp( char* p ); /** * Return true if the haystack plain string ends with the string * needle. Return 0 otherwise. * * Needles which are larger than the haystack are handled. * * No new strings are allocated, freed, or returned. */ int endswith(const char *haystack,const char *needle); /** * Return true if the haystack unicode string ends with the string needle. * Return 0 otherwise. * * Needles which are larger than the haystack are handled. * * No new strings are allocated, freed, or returned. */ extern int u_endswith(const unichar_t *haystack,const unichar_t *needle); extern int u_startswith(const unichar_t *haystack,const unichar_t *needle); extern int uc_startswith(const unichar_t *haystack,const char* needle); /** * In the string 's' replace all occurances of 'orig' with 'replacement'. * If you set free_s to true then the string 's' will be freed by this function. * Normally you want to set free_s to 0 to avoid that. The case you will want to * use free_s to 1 is chaining many calls like: * * char* s = copy( input ); * s = str_replace_all( s, "foo", "bar", 1 ); * s = str_replace_all( s, "baz", "gah", 1 ); * // use s * free(s); * // no leaks in the above. * * Note that 's' is first copied before the first call to replace_all in the above * so it can be freed without concern. This also allows the ordering of replace_all * in the above to be changed without having to worry about the free_s flag. */ extern char* str_replace_all( char* s, char* orig, char* replacement, int free_s ); int toint( char* v ); char* tostr( int v ); #endif dvisvgm-2.8.1/libs/ff-woff/inc/charset.h0000664000175000017500000000641013510660062014762 00000000000000/* Copyright (C) 2000-2012 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 _CHARSET_H #define _CHARSET_H /* ASCII is ISO 646, except the ISO version admits national alternatives */ enum encoding { e_usascii, e_iso646_no, e_iso646_se, e_iso8859_1, e_iso8859_2, e_iso8859_3, e_iso8859_4, e_iso8859_5, e_iso8859_6, e_iso8859_7, e_iso8859_8, e_iso8859_9, e_iso8859_10, e_iso8859_11/* same as TIS */, e_iso8859_13, e_iso8859_14, e_iso8859_15, e_koi8_r, /* RFC 1489 */ e_jis201, /* 8 bit, ascii & katakana */ e_win, e_mac, e_user, /* korean appears to fit into the jis/euc encoding schemes */ /* the difference between jis & jis2 is what the output encoding should be (presence of '(') */ e_jis, e_jis2, e_jiskorean, e_jisgb, e_sjis, /* multi-byte */ e_euc, e_euckorean, e_eucgb, e_wansung, e_johab, e_big5, e_big5hkscs, e_unicode, e_unicode_backwards, /* wide chars */ e_utf7, e_utf8, /* unicode encodings */ e_ucs4, /* 4 byte chars */ e_notrans, /* _inch returns 16bits */ e_encodingmax, e_unknown=-1, e_first2byte=e_jis }; enum charset { em_none = -1, em_iso8859_1, em_iso8859_2, em_iso8859_3, em_iso8859_4, em_iso8859_5, em_iso8859_6, em_iso8859_7, em_iso8859_8, em_iso8859_9, em_iso8859_10, em_iso8859_11/* same as TIS */, em_iso8859_13, em_iso8859_14, em_iso8859_15, em_koi8_r, em_jis201, em_win, em_mac, em_symbol, em_zapfding, em_user, em_adobestandard=em_user, em_jis208, em_jis212, em_ksc5601, em_gb2312, em_big5, em_big5hkscs, em_johab /* Korean*/, /* 28 */ em_unicode, em_unicode4, em_gb18030 , em_max, em_first2byte=em_jis208, em_last94x94=em_gb2312 }; extern int /*enum charset*/ local_encoding; #if HAVE_ICONV # include extern char *iconv_local_encoding_name; #else # include "gwwiconv.h" /* My fake iconv based on encodings in gdraw/gunicode */ #endif extern struct namemap { const char *name; int map; } encodingnames[]; #endif dvisvgm-2.8.1/libs/xxHash/0000775000175000017500000000000013563265646012420 500000000000000dvisvgm-2.8.1/libs/xxHash/xxhash.h0000664000175000017500000006516213553267757014032 00000000000000/* xxHash - Extremely Fast Hash algorithm Header File Copyright (C) 2012-2016, Yann Collet. BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - xxHash source repository : https://github.com/Cyan4973/xxHash */ /* Notice extracted from xxHash homepage : xxHash is an extremely fast Hash algorithm, running at RAM speed limits. It also successfully passes all tests from the SMHasher suite. Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz) Name Speed Q.Score Author xxHash 5.4 GB/s 10 CrapWow 3.2 GB/s 2 Andrew MumurHash 3a 2.7 GB/s 10 Austin Appleby SpookyHash 2.0 GB/s 10 Bob Jenkins SBox 1.4 GB/s 9 Bret Mulvey Lookup3 1.2 GB/s 9 Bob Jenkins SuperFastHash 1.2 GB/s 1 Paul Hsieh CityHash64 1.05 GB/s 10 Pike & Alakuijala FNV 0.55 GB/s 5 Fowler, Noll, Vo CRC32 0.43 GB/s † 9 MD5-32 0.33 GB/s 10 Ronald L. Rivest SHA1-32 0.28 GB/s 10 Note †: other CRC32 implementations can be over 40x faster than SMHasher's: http://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735 Q.Score is a measure of quality of the hash function. It depends on successfully passing SMHasher test set. 10 is a perfect score. A 64-bit version, named XXH64, is available since r35. It offers much better speed, but for 64-bit applications only. Name Speed on 64 bits Speed on 32 bits XXH64 13.8 GB/s 1.9 GB/s XXH32 6.8 GB/s 6.0 GB/s */ #ifndef XXHASH_H_5627135585666179 #define XXHASH_H_5627135585666179 1 #if defined (__cplusplus) extern "C" { #endif /* **************************** * Definitions ******************************/ #include /* size_t */ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; #define XXH_STATIC_LINKING_ONLY /* **************************** * API modifier ******************************/ /** XXH_INLINE_ALL (and XXH_PRIVATE_API) * This build macro includes xxhash functions in `static` mode * in order to inline them, and remove their symbol from the public list. * Inlining offers great performance improvement on small keys, * and dramatic ones when length is expressed as a compile-time constant. * See https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html . * Methodology : * #define XXH_INLINE_ALL * #include "xxhash.h" * `xxhash.c` is automatically included. * It's not useful to compile and link it as a separate object. */ #if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) # ifndef XXH_STATIC_LINKING_ONLY # define XXH_STATIC_LINKING_ONLY # endif # if defined(__GNUC__) # define XXH_PUBLIC_API static __inline __attribute__((unused)) # elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) # define XXH_PUBLIC_API static inline # elif defined(_MSC_VER) # define XXH_PUBLIC_API static __inline # else /* this version may generate warnings for unused static functions */ # define XXH_PUBLIC_API static # endif #else # if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) # ifdef XXH_EXPORT # define XXH_PUBLIC_API __declspec(dllexport) # elif XXH_IMPORT # define XXH_PUBLIC_API __declspec(dllimport) # endif # else # define XXH_PUBLIC_API /* do nothing */ # endif #endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */ /*! XXH_NAMESPACE, aka Namespace Emulation : * * If you want to include _and expose_ xxHash functions from within your own library, * but also want to avoid symbol collisions with other libraries which may also include xxHash, * * you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library * with the value of XXH_NAMESPACE (therefore, avoid NULL and numeric values). * * Note that no change is required within the calling program as long as it includes `xxhash.h` : * regular symbol name will be automatically translated by this header. */ #ifdef XXH_NAMESPACE # define XXH_CAT(A,B) A##B # define XXH_NAME2(A,B) XXH_CAT(A,B) # define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber) # define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32) # define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState) # define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState) # define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset) # define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update) # define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest) # define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState) # define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash) # define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical) # define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64) # define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState) # define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState) # define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset) # define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update) # define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest) # define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState) # define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash) # define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical) #endif /* ************************************* * Version ***************************************/ #define XXH_VERSION_MAJOR 0 #define XXH_VERSION_MINOR 7 #define XXH_VERSION_RELEASE 2 #define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) XXH_PUBLIC_API unsigned XXH_versionNumber (void); /*-********************************************************************** * 32-bit hash ************************************************************************/ #if !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) # include typedef uint32_t XXH32_hash_t; #else # include # if UINT_MAX == 0xFFFFFFFFUL typedef unsigned int XXH32_hash_t; # else # if ULONG_MAX == 0xFFFFFFFFUL typedef unsigned long XXH32_hash_t; # else # error "unsupported platform : need a 32-bit type" # endif # endif #endif /*! XXH32() : Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input". The memory between input & input+length must be valid (allocated and read-accessible). "seed" can be used to alter the result predictably. Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s */ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); /*====== Streaming ======*/ /* * Streaming functions generate the xxHash value from an incrememtal input. * This method is slower than single-call functions, due to state management. * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. * * XXH state must first be allocated, using XXH*_createState() . * * Start a new hash by initializing state with a seed, using XXH*_reset(). * * Then, feed the hash state by calling XXH*_update() as many times as necessary. * The function returns an error code, with 0 meaning OK, and any other value meaning there is an error. * * Finally, a hash value can be produced anytime, by using XXH*_digest(). * This function returns the nn-bits hash as an int or long long. * * It's still possible to continue inserting input into the hash state after a digest, * and generate some new hash values later on, by invoking again XXH*_digest(). * * When done, release the state, using XXH*_freeState(). */ typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); /*====== Canonical representation ======*/ /* Default return values from XXH functions are basic unsigned 32 and 64 bits. * This the simplest and fastest format for further post-processing. * However, this leaves open the question of what is the order of bytes, * since little and big endian conventions will write the same number differently. * * The canonical representation settles this issue, * by mandating big-endian convention, * aka, the same convention as human-readable numbers (large digits first). * When writing hash values to storage, sending them over a network, or printing them, * it's highly recommended to use the canonical representation, * to ensure portability across a wider range of systems, present and future. * * The following functions allow transformation of hash values into and from canonical format. */ typedef struct { unsigned char digest[4]; } XXH32_canonical_t; XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); #ifndef XXH_NO_LONG_LONG /*-********************************************************************** * 64-bit hash ************************************************************************/ #if !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) # include typedef uint64_t XXH64_hash_t; #else /* the following type must have a width of 64-bit */ typedef unsigned long long XXH64_hash_t; #endif /*! XXH64() : Calculate the 64-bit hash of sequence of length "len" stored at memory address "input". "seed" can be used to alter the result predictably. This function runs faster on 64-bit systems, but slower on 32-bit systems (see benchmark). */ XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, XXH64_hash_t seed); /*====== Streaming ======*/ typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state); XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed); XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length); XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr); /*====== Canonical representation ======*/ typedef struct { unsigned char digest[8]; } XXH64_canonical_t; XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); #endif /* XXH_NO_LONG_LONG */ #ifdef XXH_STATIC_LINKING_ONLY /* ================================================================================================ This section contains declarations which are not guaranteed to remain stable. They may change in future versions, becoming incompatible with a different version of the library. These declarations should only be used with static linking. Never use them in association with dynamic linking ! =================================================================================================== */ /* These definitions are only present to allow * static allocation of XXH state, on stack or in a struct for example. * Never **ever** use members directly. */ struct XXH32_state_s { XXH32_hash_t total_len_32; XXH32_hash_t large_len; XXH32_hash_t v1; XXH32_hash_t v2; XXH32_hash_t v3; XXH32_hash_t v4; XXH32_hash_t mem32[4]; XXH32_hash_t memsize; XXH32_hash_t reserved; /* never read nor write, might be removed in a future version */ }; /* typedef'd to XXH32_state_t */ #ifndef XXH_NO_LONG_LONG /* remove 64-bit support */ struct XXH64_state_s { XXH64_hash_t total_len; XXH64_hash_t v1; XXH64_hash_t v2; XXH64_hash_t v3; XXH64_hash_t v4; XXH64_hash_t mem64[4]; XXH32_hash_t memsize; XXH32_hash_t reserved32; /* required for padding anyway */ XXH64_hash_t reserved64; /* never read nor write, might be removed in a future version */ }; /* typedef'd to XXH64_state_t */ #endif /* XXH_NO_LONG_LONG */ /*-********************************************************************** * XXH3 * New experimental hash ************************************************************************/ #ifndef XXH_NO_LONG_LONG /* ============================================ * XXH3 is a new hash algorithm, * featuring improved speed performance for both small and large inputs. * See full speed analysis at : http://fastcompression.blogspot.com/2019/03/presenting-xxh3.html * In general, expect XXH3 to run about ~2x faster on large inputs, * and >3x faster on small ones, though exact differences depend on platform. * * The algorithm is portable, will generate the same hash on all platforms. * It benefits greatly from vectorization units, but does not require it. * * XXH3 offers 2 variants, _64bits and _128bits. * When only 64 bits are needed, prefer calling the _64bits variant : * it reduces the amount of mixing, resulting in faster speed on small inputs. * It's also generally simpler to manipulate a scalar return type than a struct. * * The XXH3 algorithm is still considered experimental. * Produced results can still change between versions. * Results produced by v0.7.x are not comparable with results from v0.7.y . * It's nonetheless possible to use XXH3 for ephemeral data (local sessions), * but avoid storing values in long-term storage for later reads. * * The API supports one-shot hashing, streaming mode, and custom secrets. * * There are still a number of opened questions that community can influence during the experimental period. * I'm trying to list a few of them below, though don't consider this list as complete. * * - 128-bits output type : currently defined as a structure of two 64-bits fields. * That's because 128-bit values do not exist in C standard. * Note that it means that, at byte level, result is not identical depending on endianess. * However, at field level, they are identical on all platforms. * The canonical representation solves the issue of identical byte-level representation across platforms, * which is necessary for serialization. * Q1 : Would there be a better representation for a 128-bit hash result ? * Q2 : Are the names of the inner 64-bit fields important ? Should they be changed ? * * - Prototype XXH128() : XXH128() uses the same arguments as XXH64(), for consistency. * It means it maps to XXH3_128bits_withSeed(). * This variant is slightly slower than XXH3_128bits(), * because the seed is now part of the algorithm, and can't be simplified. * Is that a good idea ? * * - Seed type for XXH128() : currently, it's a single 64-bit value, like the 64-bit variant. * It could be argued that it's more logical to offer a 128-bit seed input parameter for a 128-bit hash. * But 128-bit seed is more difficult to use, since it requires to pass a structure instead of a scalar value. * Such a variant could either replace current one, or become an additional one. * Farmhash, for example, offers both variants (the 128-bits seed variant is called `doubleSeed`). * Follow up question : if both 64-bit and 128-bit seeds are allowed, which variant should be called XXH128 ? * * - Result for len==0 : Currently, the result of hashing a zero-length input is always `0`. * It seems okay as a return value when using "default" secret and seed. * But is it still fine to return `0` when secret or seed are non-default ? * Are there use cases which could depend on generating a different hash result for zero-length input when the secret is different ? * * - Consistency (1) : Streaming XXH128 uses an XXH3 state, which is the same state as XXH3_64bits(). * It means a 128bit streaming loop must invoke the following symbols : * XXH3_createState(), XXH3_128bits_reset(), XXH3_128bits_update() (loop), XXH3_128bits_digest(), XXH3_freeState(). * Is that consistent enough ? * * - Consistency (2) : The canonical representation of `XXH3_64bits` is provided by existing functions * XXH64_canonicalFromHash(), and reverse operation XXH64_hashFromCanonical(). * As a mirror, canonical functions for XXH128_hash_t results generated by `XXH3_128bits` * are XXH128_canonicalFromHash() and XXH128_hashFromCanonical(). * Which means, `XXH3` doesn't appear in the names, because canonical functions operate on a type, * independently of which algorithm was used to generate that type. * Is that consistent enough ? */ #ifdef XXH_NAMESPACE # define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) # define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) # define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) # define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) # define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) # define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) # define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) # define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) # define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) # define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) # define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) #endif /* XXH3_64bits() : * default 64-bit variant, using default secret and default seed of 0. * It's the fastest variant. */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); /* XXH3_64bits_withSecret() : * It's possible to provide any blob of bytes as a "secret" to generate the hash. * This makes it more difficult for an external actor to prepare an intentional collision. * The secret *must* be large enough (>= XXH3_SECRET_SIZE_MIN). * It should consist of random bytes. * Avoid repeating same character, or sequences of bytes, * and especially avoid swathes of \0. * Failure to respect these conditions will result in a poor quality hash. */ #define XXH3_SECRET_SIZE_MIN 136 XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); /* XXH3_64bits_withSeed() : * This variant generates on the fly a custom secret, * based on the default secret, altered using the `seed` value. * While this operation is decently fast, note that it's not completely free. * note : seed==0 produces same results as XXH3_64bits() */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); /* streaming 64-bit */ #if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11+ */ # include # define XXH_ALIGN(n) alignas(n) #elif defined(__GNUC__) # define XXH_ALIGN(n) __attribute__ ((aligned(n))) #elif defined(_MSC_VER) # define XXH_ALIGN(n) __declspec(align(n)) #else # define XXH_ALIGN(n) /* disabled */ #endif typedef struct XXH3_state_s XXH3_state_t; #define XXH3_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ #define XXH3_INTERNALBUFFER_SIZE 256 struct XXH3_state_s { XXH_ALIGN(64) XXH64_hash_t acc[8]; XXH_ALIGN(64) unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]; /* used to store a custom secret generated from the seed. Makes state larger. Design might change */ XXH_ALIGN(64) unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]; XXH32_hash_t bufferedSize; XXH32_hash_t nbStripesPerBlock; XXH32_hash_t nbStripesSoFar; XXH32_hash_t secretLimit; XXH32_hash_t reserved32; XXH32_hash_t reserved32_2; XXH64_hash_t totalLen; XXH64_hash_t seed; XXH64_hash_t reserved64; const unsigned char* secret; /* note : there is some padding after, due to alignment on 64 bytes */ }; /* typedef'd to XXH3_state_t */ /* Streaming requires state maintenance. * This operation costs memory and cpu. * As a consequence, streaming is slower than one-shot hashing. * For better performance, prefer using one-shot functions whenever possible. */ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state); /* XXH3_64bits_reset() : * initialize with default parameters. * result will be equivalent to `XXH3_64bits()`. */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr); /* XXH3_64bits_reset_withSeed() : * generate a custom secret from `seed`, and store it into state. * digest will be equivalent to `XXH3_64bits_withSeed()`. */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); /* XXH3_64bits_reset_withSecret() : * `secret` is referenced, and must outlive the hash streaming session. * secretSize must be >= XXH3_SECRET_SIZE_MIN. */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length); XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); /* 128-bit */ #ifdef XXH_NAMESPACE # define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) # define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) # define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) # define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) # define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) # define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) # define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) # define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) # define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) # define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) # define XXH128_cmp XXH_NAME2(XXH_NAMESPACE, XXH128_cmp) # define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash) # define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical) #endif typedef struct { XXH64_hash_t low64; XXH64_hash_t high64; } XXH128_hash_t; XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); /* == XXH128() */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr); XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed); XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize); XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length); XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr); /* Note : for better performance, following functions can be inlined, * using XXH_INLINE_ALL */ /* return : 1 is equal, 0 if different */ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2); /* This comparator is compatible with stdlib's qsort(). * return : >0 if *h128_1 > *h128_2 * <0 if *h128_1 < *h128_2 * =0 if *h128_1 == *h128_2 */ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2); /*====== Canonical representation ======*/ typedef struct { unsigned char digest[16]; } XXH128_canonical_t; XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash); XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src); #endif /* XXH_NO_LONG_LONG */ /*-********************************************************************** * XXH_INLINE_ALL ************************************************************************/ #if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) # include "xxhash.c" /* include xxhash function bodies as `static`, for inlining */ #endif #endif /* XXH_STATIC_LINKING_ONLY */ #if defined (__cplusplus) } #endif #endif /* XXHASH_H_5627135585666179 */ dvisvgm-2.8.1/libs/xxHash/Makefile.am0000664000175000017500000000031013536436426014362 00000000000000if !HAVE_XXHASH noinst_LIBRARIES = libxxhash.a libxxhash_a_SOURCES = xxhash.c xxhash.h xxh3.h AM_CXXFLAGS = -Wall xxhash.c: xxhash.h xxh3.h @CODE_COVERAGE_RULES@ endif CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/libs/xxHash/xxhash.c0000664000175000017500000011177513553267757014027 00000000000000/* * xxHash - Fast Hash algorithm * Copyright (C) 2012-2016, Yann Collet * * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) * * 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. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You can contact the author at : * - xxHash homepage: http://www.xxhash.com * - xxHash source repository : https://github.com/Cyan4973/xxHash */ /* since xxhash.c can be included (via XXH_INLINE_ALL), * it's good practice to protect it with guard * in case of multiples inclusions */ #ifndef XXHASH_C_01393879 #define XXHASH_C_01393879 /* ************************************* * Tuning parameters ***************************************/ /*!XXH_FORCE_MEMORY_ACCESS : * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. * The below switch allow to select different access method for improved performance. * Method 0 (default) : use `memcpy()`. Safe and portable. * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. * Method 2 : direct access. This method doesn't depend on compiler but violate C standard. * It can generate buggy code on targets which do not support unaligned memory accesses. * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) * See http://stackoverflow.com/a/32095106/646947 for details. * Prefer these methods in priority order (0 > 1 > 2) */ #ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ # if !defined(__clang__) && defined(__GNUC__) && defined(__ARM_FEATURE_UNALIGNED) && defined(__ARM_ARCH) && (__ARM_ARCH == 6) # define XXH_FORCE_MEMORY_ACCESS 2 # elif !defined(__clang__) && ((defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ (defined(__GNUC__) && (defined(__ARM_ARCH) && __ARM_ARCH >= 7))) # define XXH_FORCE_MEMORY_ACCESS 1 # endif #endif /*!XXH_ACCEPT_NULL_INPUT_POINTER : * If input pointer is NULL, xxHash default behavior is to dereference it, triggering a segfault. * When this macro is enabled, xxHash actively checks input for null pointer. * It it is, result for null input pointers is the same as a null-length input. */ #ifndef XXH_ACCEPT_NULL_INPUT_POINTER /* can be defined externally */ # define XXH_ACCEPT_NULL_INPUT_POINTER 0 #endif /*!XXH_FORCE_ALIGN_CHECK : * This is a minor performance trick, only useful with lots of very small keys. * It means : check for aligned/unaligned input. * The check costs one initial branch per hash; * set it to 0 when the input is guaranteed to be aligned, * or when alignment doesn't matter for performance. */ #ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ # if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) # define XXH_FORCE_ALIGN_CHECK 0 # else # define XXH_FORCE_ALIGN_CHECK 1 # endif #endif /*!XXH_REROLL: * Whether to reroll XXH32_finalize, and XXH64_finalize, * instead of using an unrolled jump table/if statement loop. * * This is automatically defined on -Os/-Oz on GCC and Clang. */ #ifndef XXH_REROLL # if defined(__OPTIMIZE_SIZE__) # define XXH_REROLL 1 # else # define XXH_REROLL 0 # endif #endif /* ************************************* * Includes & Memory related functions ***************************************/ /*! Modify the local functions below should you wish to use some other memory routines * for malloc(), free() */ #include static void* XXH_malloc(size_t s) { return malloc(s); } static void XXH_free (void* p) { free(p); } /*! and for memcpy() */ #include static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); } #include /* ULLONG_MAX */ #define XXH_STATIC_LINKING_ONLY #include "xxhash.h" /* ************************************* * Compiler Specific Options ***************************************/ #ifdef _MSC_VER /* Visual Studio */ # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ # define XXH_FORCE_INLINE static __forceinline # define XXH_NO_INLINE static __declspec(noinline) #else # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ # ifdef __GNUC__ # define XXH_FORCE_INLINE static inline __attribute__((always_inline)) # define XXH_NO_INLINE static __attribute__((noinline)) # else # define XXH_FORCE_INLINE static inline # define XXH_NO_INLINE static # endif # else # define XXH_FORCE_INLINE static # define XXH_NO_INLINE static # endif /* __STDC_VERSION__ */ #endif /* ************************************* * Debug ***************************************/ /* DEBUGLEVEL is expected to be defined externally, * typically through compiler command line. * Value must be a number. */ #ifndef DEBUGLEVEL # define DEBUGLEVEL 0 #endif #if (DEBUGLEVEL>=1) # include /* note : can still be disabled with NDEBUG */ # define XXH_ASSERT(c) assert(c) #else # define XXH_ASSERT(c) ((void)0) #endif /* note : use after variable declarations */ #define XXH_STATIC_ASSERT(c) { enum { XXH_sa = 1/(int)(!!(c)) }; } /* ************************************* * Basic Types ***************************************/ #if !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) # include typedef uint8_t xxh_u8; #else typedef unsigned char xxh_u8; #endif typedef XXH32_hash_t xxh_u32; /* === Memory access === */ #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) /* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; } #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ /* currently only defined for gcc and icc */ typedef union { xxh_u32 u32; } __attribute__((packed)) unalign; static xxh_u32 XXH_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } #else /* portable and safe solution. Generally efficient. * see : http://stackoverflow.com/a/32095106/646947 */ static xxh_u32 XXH_read32(const void* memPtr) { xxh_u32 val; memcpy(&val, memPtr, sizeof(val)); return val; } #endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ /* === Endianess === */ typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; /* XXH_CPU_LITTLE_ENDIAN can be defined externally, for example on the compiler command line */ #ifndef XXH_CPU_LITTLE_ENDIAN # if defined(_WIN32) /* Windows is always little endian */ \ || defined(__LITTLE_ENDIAN__) \ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) # define XXH_CPU_LITTLE_ENDIAN 1 # elif defined(__BIG_ENDIAN__) \ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) # define XXH_CPU_LITTLE_ENDIAN 0 # else static int XXH_isLittleEndian(void) { const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 }; /* don't use static : performance detrimental */ return one.c[0]; } # define XXH_CPU_LITTLE_ENDIAN XXH_isLittleEndian() # endif #endif /* **************************************** * Compiler-specific Functions and Macros ******************************************/ #define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) #ifndef __has_builtin # define __has_builtin(x) 0 #endif #if !defined(NO_CLANG_BUILTIN) && __has_builtin(__builtin_rotateleft32) && __has_builtin(__builtin_rotateleft64) # define XXH_rotl32 __builtin_rotateleft32 # define XXH_rotl64 __builtin_rotateleft64 /* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */ #elif defined(_MSC_VER) # define XXH_rotl32(x,r) _rotl(x,r) # define XXH_rotl64(x,r) _rotl64(x,r) #else # define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) # define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) #endif #if defined(_MSC_VER) /* Visual Studio */ # define XXH_swap32 _byteswap_ulong #elif XXH_GCC_VERSION >= 403 # define XXH_swap32 __builtin_bswap32 #else static xxh_u32 XXH_swap32 (xxh_u32 x) { return ((x << 24) & 0xff000000 ) | ((x << 8) & 0x00ff0000 ) | ((x >> 8) & 0x0000ff00 ) | ((x >> 24) & 0x000000ff ); } #endif /* *************************** * Memory reads *****************************/ typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; XXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr) { return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr)); } static xxh_u32 XXH_readBE32(const void* ptr) { return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr); } XXH_FORCE_INLINE xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) { if (align==XXH_unaligned) { return XXH_readLE32(ptr); } else { return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr); } } /* ************************************* * Misc ***************************************/ XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } /* ******************************************************************* * 32-bit hash functions *********************************************************************/ static const xxh_u32 PRIME32_1 = 0x9E3779B1U; /* 0b10011110001101110111100110110001 */ static const xxh_u32 PRIME32_2 = 0x85EBCA77U; /* 0b10000101111010111100101001110111 */ static const xxh_u32 PRIME32_3 = 0xC2B2AE3DU; /* 0b11000010101100101010111000111101 */ static const xxh_u32 PRIME32_4 = 0x27D4EB2FU; /* 0b00100111110101001110101100101111 */ static const xxh_u32 PRIME32_5 = 0x165667B1U; /* 0b00010110010101100110011110110001 */ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) { acc += input * PRIME32_2; acc = XXH_rotl32(acc, 13); acc *= PRIME32_1; #if defined(__GNUC__) && defined(__SSE4_1__) && !defined(XXH_ENABLE_AUTOVECTORIZE) /* UGLY HACK: * This inline assembly hack forces acc into a normal register. This is the * only thing that prevents GCC and Clang from autovectorizing the XXH32 loop * (pragmas and attributes don't work for some resason) without globally * disabling SSE4.1. * * The reason we want to avoid vectorization is because despite working on * 4 integers at a time, there are multiple factors slowing XXH32 down on * SSE4: * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on newer chips!) * making it slightly slower to multiply four integers at once compared to four * integers independently. Even when pmulld was fastest, Sandy/Ivy Bridge, it is * still not worth it to go into SSE just to multiply unless doing a long operation. * * - Four instructions are required to rotate, * movqda tmp, v // not required with VEX encoding * pslld tmp, 13 // tmp <<= 13 * psrld v, 19 // x >>= 19 * por v, tmp // x |= tmp * compared to one for scalar: * roll v, 13 // reliably fast across the board * shldl v, v, 13 // Sandy Bridge and later prefer this for some reason * * - Instruction level parallelism is actually more beneficial here because the * SIMD actually serializes this operation: While v1 is rotating, v2 can load data, * while v3 can multiply. SSE forces them to operate together. * * How this hack works: * __asm__("" // Declare an assembly block but don't declare any instructions * : // However, as an Input/Output Operand, * "+r" // constrain a read/write operand (+) as a general purpose register (r). * (acc) // and set acc as the operand * ); * * Because of the 'r', the compiler has promised that seed will be in a * general purpose register and the '+' says that it will be 'read/write', * so it has to assume it has changed. It is like volatile without all the * loads and stores. * * Since the argument has to be in a normal register (not an SSE register), * each time XXH32_round is called, it is impossible to vectorize. */ __asm__("" : "+r" (acc)); #endif return acc; } /* mix all bits */ static xxh_u32 XXH32_avalanche(xxh_u32 h32) { h32 ^= h32 >> 15; h32 *= PRIME32_2; h32 ^= h32 >> 13; h32 *= PRIME32_3; h32 ^= h32 >> 16; return(h32); } #define XXH_get32bits(p) XXH_readLE32_align(p, align) static xxh_u32 XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) { #define PROCESS1 \ h32 += (*ptr++) * PRIME32_5; \ h32 = XXH_rotl32(h32, 11) * PRIME32_1 ; #define PROCESS4 \ h32 += XXH_get32bits(ptr) * PRIME32_3; \ ptr+=4; \ h32 = XXH_rotl32(h32, 17) * PRIME32_4 ; /* Compact rerolled version */ if (XXH_REROLL) { len &= 15; while (len >= 4) { PROCESS4; len -= 4; } while (len > 0) { PROCESS1; --len; } return XXH32_avalanche(h32); } else { switch(len&15) /* or switch(bEnd - p) */ { case 12: PROCESS4; /* fallthrough */ case 8: PROCESS4; /* fallthrough */ case 4: PROCESS4; return XXH32_avalanche(h32); case 13: PROCESS4; /* fallthrough */ case 9: PROCESS4; /* fallthrough */ case 5: PROCESS4; PROCESS1; return XXH32_avalanche(h32); case 14: PROCESS4; /* fallthrough */ case 10: PROCESS4; /* fallthrough */ case 6: PROCESS4; PROCESS1; PROCESS1; return XXH32_avalanche(h32); case 15: PROCESS4; /* fallthrough */ case 11: PROCESS4; /* fallthrough */ case 7: PROCESS4; /* fallthrough */ case 3: PROCESS1; /* fallthrough */ case 2: PROCESS1; /* fallthrough */ case 1: PROCESS1; /* fallthrough */ case 0: return XXH32_avalanche(h32); } XXH_ASSERT(0); return h32; /* reaching this point is deemed impossible */ } } XXH_FORCE_INLINE xxh_u32 XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) { const xxh_u8* bEnd = input + len; xxh_u32 h32; #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) if (input==NULL) { len=0; bEnd=input=(const xxh_u8*)(size_t)16; } #endif if (len>=16) { const xxh_u8* const limit = bEnd - 15; xxh_u32 v1 = seed + PRIME32_1 + PRIME32_2; xxh_u32 v2 = seed + PRIME32_2; xxh_u32 v3 = seed + 0; xxh_u32 v4 = seed - PRIME32_1; do { v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4; v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4; v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4; v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4; } while (input < limit); h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18); } else { h32 = seed + PRIME32_5; } h32 += (xxh_u32)len; return XXH32_finalize(h32, input, len&15, align); } XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) { #if 0 /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ XXH32_state_t state; XXH32_reset(&state, seed); XXH32_update(&state, (const xxh_u8*)input, len); return XXH32_digest(&state); #else if (XXH_FORCE_ALIGN_CHECK) { if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); } } return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); #endif } /*====== Hash streaming ======*/ XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) { return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); } XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) { XXH_free(statePtr); return XXH_OK; } XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) { memcpy(dstState, srcState, sizeof(*dstState)); } XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) { XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ memset(&state, 0, sizeof(state)); state.v1 = seed + PRIME32_1 + PRIME32_2; state.v2 = seed + PRIME32_2; state.v3 = seed + 0; state.v4 = seed - PRIME32_1; /* do not write into reserved, planned to be removed in a future version */ memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH32_update(XXH32_state_t* state, const void* input, size_t len) { if (input==NULL) #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) return XXH_OK; #else return XXH_ERROR; #endif { const xxh_u8* p = (const xxh_u8*)input; const xxh_u8* const bEnd = p + len; state->total_len_32 += (XXH32_hash_t)len; state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16)); if (state->memsize + len < 16) { /* fill in tmp buffer */ XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len); state->memsize += (XXH32_hash_t)len; return XXH_OK; } if (state->memsize) { /* some data left from previous update */ XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); { const xxh_u32* p32 = state->mem32; state->v1 = XXH32_round(state->v1, XXH_readLE32(p32)); p32++; state->v2 = XXH32_round(state->v2, XXH_readLE32(p32)); p32++; state->v3 = XXH32_round(state->v3, XXH_readLE32(p32)); p32++; state->v4 = XXH32_round(state->v4, XXH_readLE32(p32)); } p += 16-state->memsize; state->memsize = 0; } if (p <= bEnd-16) { const xxh_u8* const limit = bEnd - 16; xxh_u32 v1 = state->v1; xxh_u32 v2 = state->v2; xxh_u32 v3 = state->v3; xxh_u32 v4 = state->v4; do { v1 = XXH32_round(v1, XXH_readLE32(p)); p+=4; v2 = XXH32_round(v2, XXH_readLE32(p)); p+=4; v3 = XXH32_round(v3, XXH_readLE32(p)); p+=4; v4 = XXH32_round(v4, XXH_readLE32(p)); p+=4; } while (p<=limit); state->v1 = v1; state->v2 = v2; state->v3 = v3; state->v4 = v4; } if (p < bEnd) { XXH_memcpy(state->mem32, p, (size_t)(bEnd-p)); state->memsize = (unsigned)(bEnd-p); } } return XXH_OK; } XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* state) { xxh_u32 h32; if (state->large_len) { h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18); } else { h32 = state->v3 /* == seed */ + PRIME32_5; } h32 += state->total_len_32; return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned); } /*====== Canonical representation ======*/ /*! Default XXH result types are basic unsigned 32 and 64 bits. * The canonical representation follows human-readable write convention, aka big-endian (large digits first). * These functions allow transformation of hash result into and from its canonical format. * This way, hash values can be written into a file or buffer, remaining comparable across different systems. */ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash) { XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); memcpy(dst, &hash, sizeof(*dst)); } XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) { return XXH_readBE32(src); } #ifndef XXH_NO_LONG_LONG /* ******************************************************************* * 64-bit hash functions *********************************************************************/ /*====== Memory access ======*/ typedef XXH64_hash_t xxh_u64; /*! XXH_REROLL_XXH64: * Whether to reroll the XXH64_finalize() loop. * * Just like XXH32, we can unroll the XXH64_finalize() loop. This can be a performance gain * on 64-bit hosts, as only one jump is required. * * However, on 32-bit hosts, because arithmetic needs to be done with two 32-bit registers, * and 64-bit arithmetic needs to be simulated, it isn't beneficial to unroll. The code becomes * ridiculously large (the largest function in the binary on i386!), and rerolling it saves * anywhere from 3kB to 20kB. It is also slightly faster because it fits into cache better * and is more likely to be inlined by the compiler. * * If XXH_REROLL is defined, this is ignored and the loop is always rerolled. */ #ifndef XXH_REROLL_XXH64 # if (defined(__ILP32__) || defined(_ILP32)) /* ILP32 is often defined on 32-bit GCC family */ \ || !(defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) /* x86-64 */ \ || defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64__) /* aarch64 */ \ || defined(__PPC64__) || defined(__PPC64LE__) || defined(__ppc64__) || defined(__powerpc64__) /* ppc64 */ \ || defined(__mips64__) || defined(__mips64)) /* mips64 */ \ || (!defined(SIZE_MAX) || SIZE_MAX < ULLONG_MAX) /* check limits */ # define XXH_REROLL_XXH64 1 # else # define XXH_REROLL_XXH64 0 # endif #endif /* !defined(XXH_REROLL_XXH64) */ #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) /* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ static xxh_u64 XXH_read64(const void* memPtr) { return *(const xxh_u64*) memPtr; } #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ /* currently only defined for gcc and icc */ typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64; static xxh_u64 XXH_read64(const void* ptr) { return ((const unalign64*)ptr)->u64; } #else /* portable and safe solution. Generally efficient. * see : http://stackoverflow.com/a/32095106/646947 */ static xxh_u64 XXH_read64(const void* memPtr) { xxh_u64 val; memcpy(&val, memPtr, sizeof(val)); return val; } #endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ #if defined(_MSC_VER) /* Visual Studio */ # define XXH_swap64 _byteswap_uint64 #elif XXH_GCC_VERSION >= 403 # define XXH_swap64 __builtin_bswap64 #else static xxh_u64 XXH_swap64 (xxh_u64 x) { return ((x << 56) & 0xff00000000000000ULL) | ((x << 40) & 0x00ff000000000000ULL) | ((x << 24) & 0x0000ff0000000000ULL) | ((x << 8) & 0x000000ff00000000ULL) | ((x >> 8) & 0x00000000ff000000ULL) | ((x >> 24) & 0x0000000000ff0000ULL) | ((x >> 40) & 0x000000000000ff00ULL) | ((x >> 56) & 0x00000000000000ffULL); } #endif XXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr) { return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr)); } static xxh_u64 XXH_readBE64(const void* ptr) { return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr); } XXH_FORCE_INLINE xxh_u64 XXH_readLE64_align(const void* ptr, XXH_alignment align) { if (align==XXH_unaligned) return XXH_readLE64(ptr); else return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr); } /*====== xxh64 ======*/ static const xxh_u64 PRIME64_1 = 0x9E3779B185EBCA87ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */ static const xxh_u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */ static const xxh_u64 PRIME64_3 = 0x165667B19E3779F9ULL; /* 0b0001011001010110011001111011000110011110001101110111100111111001 */ static const xxh_u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL; /* 0b1000010111101011110010100111011111000010101100101010111001100011 */ static const xxh_u64 PRIME64_5 = 0x27D4EB2F165667C5ULL; /* 0b0010011111010100111010110010111100010110010101100110011111000101 */ static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input) { acc += input * PRIME64_2; acc = XXH_rotl64(acc, 31); acc *= PRIME64_1; return acc; } static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val) { val = XXH64_round(0, val); acc ^= val; acc = acc * PRIME64_1 + PRIME64_4; return acc; } static xxh_u64 XXH64_avalanche(xxh_u64 h64) { h64 ^= h64 >> 33; h64 *= PRIME64_2; h64 ^= h64 >> 29; h64 *= PRIME64_3; h64 ^= h64 >> 32; return h64; } #define XXH_get64bits(p) XXH_readLE64_align(p, align) static xxh_u64 XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) { #define PROCESS1_64 \ h64 ^= (*ptr++) * PRIME64_5; \ h64 = XXH_rotl64(h64, 11) * PRIME64_1; #define PROCESS4_64 \ h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * PRIME64_1; \ ptr+=4; \ h64 = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3; #define PROCESS8_64 { \ xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); \ ptr+=8; \ h64 ^= k1; \ h64 = XXH_rotl64(h64,27) * PRIME64_1 + PRIME64_4; \ } /* Rerolled version for 32-bit targets is faster and much smaller. */ if (XXH_REROLL || XXH_REROLL_XXH64) { len &= 31; while (len >= 8) { PROCESS8_64; len -= 8; } if (len >= 4) { PROCESS4_64; len -= 4; } while (len > 0) { PROCESS1_64; --len; } return XXH64_avalanche(h64); } else { switch(len & 31) { case 24: PROCESS8_64; /* fallthrough */ case 16: PROCESS8_64; /* fallthrough */ case 8: PROCESS8_64; return XXH64_avalanche(h64); case 28: PROCESS8_64; /* fallthrough */ case 20: PROCESS8_64; /* fallthrough */ case 12: PROCESS8_64; /* fallthrough */ case 4: PROCESS4_64; return XXH64_avalanche(h64); case 25: PROCESS8_64; /* fallthrough */ case 17: PROCESS8_64; /* fallthrough */ case 9: PROCESS8_64; PROCESS1_64; return XXH64_avalanche(h64); case 29: PROCESS8_64; /* fallthrough */ case 21: PROCESS8_64; /* fallthrough */ case 13: PROCESS8_64; /* fallthrough */ case 5: PROCESS4_64; PROCESS1_64; return XXH64_avalanche(h64); case 26: PROCESS8_64; /* fallthrough */ case 18: PROCESS8_64; /* fallthrough */ case 10: PROCESS8_64; PROCESS1_64; PROCESS1_64; return XXH64_avalanche(h64); case 30: PROCESS8_64; /* fallthrough */ case 22: PROCESS8_64; /* fallthrough */ case 14: PROCESS8_64; /* fallthrough */ case 6: PROCESS4_64; PROCESS1_64; PROCESS1_64; return XXH64_avalanche(h64); case 27: PROCESS8_64; /* fallthrough */ case 19: PROCESS8_64; /* fallthrough */ case 11: PROCESS8_64; PROCESS1_64; PROCESS1_64; PROCESS1_64; return XXH64_avalanche(h64); case 31: PROCESS8_64; /* fallthrough */ case 23: PROCESS8_64; /* fallthrough */ case 15: PROCESS8_64; /* fallthrough */ case 7: PROCESS4_64; /* fallthrough */ case 3: PROCESS1_64; /* fallthrough */ case 2: PROCESS1_64; /* fallthrough */ case 1: PROCESS1_64; /* fallthrough */ case 0: return XXH64_avalanche(h64); } } /* impossible to reach */ XXH_ASSERT(0); return 0; /* unreachable, but some compilers complain without it */ } XXH_FORCE_INLINE xxh_u64 XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) { const xxh_u8* bEnd = input + len; xxh_u64 h64; #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) if (input==NULL) { len=0; bEnd=input=(const xxh_u8*)(size_t)32; } #endif if (len>=32) { const xxh_u8* const limit = bEnd - 32; xxh_u64 v1 = seed + PRIME64_1 + PRIME64_2; xxh_u64 v2 = seed + PRIME64_2; xxh_u64 v3 = seed + 0; xxh_u64 v4 = seed - PRIME64_1; do { v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8; v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; } while (input<=limit); h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); h64 = XXH64_mergeRound(h64, v1); h64 = XXH64_mergeRound(h64, v2); h64 = XXH64_mergeRound(h64, v3); h64 = XXH64_mergeRound(h64, v4); } else { h64 = seed + PRIME64_5; } h64 += (xxh_u64) len; return XXH64_finalize(h64, input, len, align); } XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t seed) { #if 0 /* Simple version, good for code maintenance, but unfortunately slow for small inputs */ XXH64_state_t state; XXH64_reset(&state, seed); XXH64_update(&state, (const xxh_u8*)input, len); return XXH64_digest(&state); #else if (XXH_FORCE_ALIGN_CHECK) { if ((((size_t)input) & 7)==0) { /* Input is aligned, let's leverage the speed advantage */ return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); } } return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned); #endif } /*====== Hash Streaming ======*/ XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void) { return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t)); } XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr) { XXH_free(statePtr); return XXH_OK; } XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState) { memcpy(dstState, srcState, sizeof(*dstState)); } XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, XXH64_hash_t seed) { XXH64_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ memset(&state, 0, sizeof(state)); state.v1 = seed + PRIME64_1 + PRIME64_2; state.v2 = seed + PRIME64_2; state.v3 = seed + 0; state.v4 = seed - PRIME64_1; /* do not write into reserved64, might be removed in a future version */ memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved64)); return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* state, const void* input, size_t len) { if (input==NULL) #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) return XXH_OK; #else return XXH_ERROR; #endif { const xxh_u8* p = (const xxh_u8*)input; const xxh_u8* const bEnd = p + len; state->total_len += len; if (state->memsize + len < 32) { /* fill in tmp buffer */ XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len); state->memsize += (xxh_u32)len; return XXH_OK; } if (state->memsize) { /* tmp buffer is full */ XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0)); state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1)); state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2)); state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3)); p += 32-state->memsize; state->memsize = 0; } if (p+32 <= bEnd) { const xxh_u8* const limit = bEnd - 32; xxh_u64 v1 = state->v1; xxh_u64 v2 = state->v2; xxh_u64 v3 = state->v3; xxh_u64 v4 = state->v4; do { v1 = XXH64_round(v1, XXH_readLE64(p)); p+=8; v2 = XXH64_round(v2, XXH_readLE64(p)); p+=8; v3 = XXH64_round(v3, XXH_readLE64(p)); p+=8; v4 = XXH64_round(v4, XXH_readLE64(p)); p+=8; } while (p<=limit); state->v1 = v1; state->v2 = v2; state->v3 = v3; state->v4 = v4; } if (p < bEnd) { XXH_memcpy(state->mem64, p, (size_t)(bEnd-p)); state->memsize = (unsigned)(bEnd-p); } } return XXH_OK; } XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* state) { xxh_u64 h64; if (state->total_len >= 32) { xxh_u64 const v1 = state->v1; xxh_u64 const v2 = state->v2; xxh_u64 const v3 = state->v3; xxh_u64 const v4 = state->v4; h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); h64 = XXH64_mergeRound(h64, v1); h64 = XXH64_mergeRound(h64, v2); h64 = XXH64_mergeRound(h64, v3); h64 = XXH64_mergeRound(h64, v4); } else { h64 = state->v3 /*seed*/ + PRIME64_5; } h64 += (xxh_u64) state->total_len; return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned); } /*====== Canonical representation ======*/ XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) { XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); memcpy(dst, &hash, sizeof(*dst)); } XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) { return XXH_readBE64(src); } /* ********************************************************************* * XXH3 * New generation hash designed for speed on small keys and vectorization ************************************************************************ */ #include "xxh3.h" #endif /* XXH_NO_LONG_LONG */ #endif /* XXHASH_C_01393879 */ dvisvgm-2.8.1/libs/xxHash/xxh3.h0000664000175000017500000020344013553267757013412 00000000000000/* xxHash - Extremely Fast Hash algorithm Development source file for `xxh3` Copyright (C) 2019-present, Yann Collet. BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) 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. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - xxHash source repository : https://github.com/Cyan4973/xxHash */ /* Note : This file is separated for development purposes. It will be integrated into `xxhash.c` when development phase is complete. */ #ifndef XXH3_H #define XXH3_H /* === Dependencies === */ #undef XXH_INLINE_ALL /* in case it's already defined */ #define XXH_INLINE_ALL #include "xxhash.h" /* === Compiler specifics === */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ # define XXH_RESTRICT restrict #else /* note : it might be useful to define __restrict or __restrict__ for some C++ compilers */ # define XXH_RESTRICT /* disable */ #endif #if defined(__GNUC__) # if defined(__AVX2__) # include # elif defined(__SSE2__) # include # elif defined(__ARM_NEON__) || defined(__ARM_NEON) # define inline __inline__ /* clang bug */ # include # undef inline # endif #elif defined(_MSC_VER) # include #endif /* * Sanity check. * * XXH3 only requires these features to be efficient: * * - Usable unaligned access * - A 32-bit or 64-bit ALU * - If 32-bit, a decent ADC instruction * - A 32 or 64-bit multiply with a 64-bit result * * Almost all 32-bit and 64-bit targets meet this, except for Thumb-1, the * classic 16-bit only subset of ARM's instruction set. * * First of all, Thumb-1 lacks support for the UMULL instruction which * performs the important long multiply. This means numerous __aeabi_lmul * calls. * * Second of all, the 8 functional registers are just not enough. * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need * Lo registers, and this shuffling results in thousands more MOVs than A32. * * A32 and T32 don't have this limitation. They can access all 14 registers, * do a 32->64 multiply with UMULL, and the flexible operand is helpful too. * * If compiling Thumb-1 for a target which supports ARM instructions, we * will give a warning. * * Usually, if this happens, it is because of an accident and you probably * need to specify -march, as you probably meant to compileh for a newer * architecture. */ #if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM) # warning "XXH3 is highly inefficient without ARM or Thumb-2." #endif /* ========================================== * Vectorization detection * ========================================== */ #define XXH_SCALAR 0 #define XXH_SSE2 1 #define XXH_AVX2 2 #define XXH_NEON 3 #define XXH_VSX 4 #ifndef XXH_VECTOR /* can be defined on command line */ # if defined(__AVX2__) # define XXH_VECTOR XXH_AVX2 # elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) # define XXH_VECTOR XXH_SSE2 # elif defined(__GNUC__) /* msvc support maybe later */ \ && (defined(__ARM_NEON__) || defined(__ARM_NEON)) \ && (defined(__LITTLE_ENDIAN__) /* We only support little endian NEON */ \ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) # define XXH_VECTOR XXH_NEON # elif defined(__PPC64__) && defined(__POWER8_VECTOR__) && defined(__GNUC__) # define XXH_VECTOR XXH_VSX # else # define XXH_VECTOR XXH_SCALAR # endif #endif /* control alignment of accumulator, * for compatibility with fast vector loads */ #ifndef XXH_ACC_ALIGN # if XXH_VECTOR == 0 /* scalar */ # define XXH_ACC_ALIGN 8 # elif XXH_VECTOR == 1 /* sse2 */ # define XXH_ACC_ALIGN 16 # elif XXH_VECTOR == 2 /* avx2 */ # define XXH_ACC_ALIGN 32 # elif XXH_VECTOR == 3 /* neon */ # define XXH_ACC_ALIGN 16 # elif XXH_VECTOR == 4 /* vsx */ # define XXH_ACC_ALIGN 16 # endif #endif /* xxh_u64 XXH_mult32to64(xxh_u32 a, xxh_u64 b) { return (xxh_u64)a * (xxh_u64)b; } */ #if defined(_MSC_VER) && defined(_M_IX86) # include # define XXH_mult32to64(x, y) __emulu(x, y) #else # define XXH_mult32to64(x, y) ((xxh_u64)((x) & 0xFFFFFFFF) * (xxh_u64)((y) & 0xFFFFFFFF)) #endif /* VSX stuff. It's a lot because VSX support is mediocre across compilers and * there is a lot of mischief with endianness. */ #if XXH_VECTOR == XXH_VSX # include # undef vector typedef __vector unsigned long long U64x2; typedef __vector unsigned char U8x16; typedef __vector unsigned U32x4; #ifndef XXH_VSX_BE # if defined(__BIG_ENDIAN__) \ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) # define XXH_VSX_BE 1 # elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__ # warning "-maltivec=be is not recommended. Please use native endianness." # define XXH_VSX_BE 1 # else # define XXH_VSX_BE 0 # endif #endif /* We need some helpers for big endian mode. */ #if XXH_VSX_BE /* A wrapper for POWER9's vec_revb. */ # ifdef __POWER9_VECTOR__ # define XXH_vec_revb vec_revb # else XXH_FORCE_INLINE U64x2 XXH_vec_revb(U64x2 val) { U8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 }; return vec_perm(val, val, vByteSwap); } # endif /* Power8 Crypto gives us vpermxor which is very handy for * PPC64EB. * * U8x16 vpermxor(U8x16 a, U8x16 b, U8x16 mask) * { * U8x16 ret; * for (int i = 0; i < 16; i++) { * ret[i] = a[mask[i] & 0xF] ^ b[mask[i] >> 4]; * } * return ret; * } * * Because both of the main loops load the key, swap, and xor it with input, * we can combine the key swap into this instruction. */ # ifdef vec_permxor # define XXH_vec_permxor vec_permxor # else # define XXH_vec_permxor __builtin_crypto_vpermxor # endif #endif /* * Because we reinterpret the multiply, there are endian memes: vec_mulo actually becomes * vec_mule. * * Additionally, the intrinsic wasn't added until GCC 8, despite existing for a while. * Clang has an easy way to control this, we can just use the builtin which doesn't swap. * GCC needs inline assembly. */ #if __has_builtin(__builtin_altivec_vmuleuw) # define XXH_vec_mulo __builtin_altivec_vmulouw # define XXH_vec_mule __builtin_altivec_vmuleuw #else /* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */ XXH_FORCE_INLINE U64x2 XXH_vec_mulo(U32x4 a, U32x4 b) { U64x2 result; __asm__("vmulouw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); return result; } XXH_FORCE_INLINE U64x2 XXH_vec_mule(U32x4 a, U32x4 b) { U64x2 result; __asm__("vmuleuw %0, %1, %2" : "=v" (result) : "v" (a), "v" (b)); return result; } #endif #endif /* ========================================== * XXH3 default settings * ========================================== */ #define XXH_SECRET_DEFAULT_SIZE 192 /* minimum XXH3_SECRET_SIZE_MIN */ #if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN) # error "default keyset is not large enough" #endif XXH_ALIGN(64) static const xxh_u8 kSecret[XXH_SECRET_DEFAULT_SIZE] = { 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, 0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21, 0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c, 0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3, 0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8, 0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d, 0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64, 0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb, 0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e, 0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce, 0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e, }; /* * GCC for x86 has a tendency to use SSE in this loop. While it * successfully avoids swapping (as MUL overwrites EAX and EDX), it * slows it down because instead of free register swap shifts, it * must use pshufd and punpckl/hd. * * To prevent this, we use this attribute to shut off SSE. */ #if defined(__GNUC__) && !defined(__clang__) && defined(__i386__) __attribute__((__target__("no-sse"))) #endif static XXH128_hash_t XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) { /* * GCC/Clang __uint128_t method. * * On most 64-bit targets, GCC and Clang define a __uint128_t type. * This is usually the best way as it usually uses a native long 64-bit * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64. * * Usually. * * Despite being a 32-bit platform, Clang (and emscripten) define this * type despite not having the arithmetic for it. This results in a * laggy compiler builtin call which calculates a full 128-bit multiply. * In that case it is best to use the portable one. * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677 */ #if defined(__GNUC__) && !defined(__wasm__) \ && defined(__SIZEOF_INT128__) \ || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128) __uint128_t product = (__uint128_t)lhs * (__uint128_t)rhs; XXH128_hash_t const r128 = { (xxh_u64)(product), (xxh_u64)(product >> 64) }; return r128; /* * MSVC for x64's _umul128 method. * * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct); * * This compiles to single operand MUL on x64. */ #elif defined(_M_X64) || defined(_M_IA64) #ifndef _MSC_VER # pragma intrinsic(_umul128) #endif xxh_u64 product_high; xxh_u64 const product_low = _umul128(lhs, rhs, &product_high); XXH128_hash_t const r128 = { product_low, product_high }; return r128; #else /* * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. * * This is a fast and simple grade school multiply, which is shown * below with base 10 arithmetic instead of base 0x100000000. * * 9 3 // D2 lhs = 93 * x 7 5 // D2 rhs = 75 * ---------- * 1 5 // D2 lo_lo = (93 % 10) * (75 % 10) * 4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) * 2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) * + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) * --------- * 2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 * + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 * --------- * 6 9 7 5 * * The reasons for adding the products like this are: * 1. It avoids manual carry tracking. Just like how * (9 * 9) + 9 + 9 = 99, the same applies with this for * UINT64_MAX. This avoids a lot of complexity. * * 2. It hints for, and on Clang, compiles to, the powerful UMAAL * instruction available in ARMv6+ A32/T32, which is shown below: * * void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm) * { * xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm; * *RdLo = (xxh_u32)(product & 0xFFFFFFFF); * *RdHi = (xxh_u32)(product >> 32); * } * * This instruction was designed for efficient long multiplication, * and allows this to be calculated in only 4 instructions which * is comparable to some 64-bit ALUs. * * 3. It isn't terrible on other platforms. Usually this will be * a couple of 32-bit ADD/ADCs. */ /* First calculate all of the cross products. */ xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF); xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32, rhs & 0xFFFFFFFF); xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32); xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32, rhs >> 32); /* Now add the products together. These will never overflow. */ xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi; xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32) + hi_hi; xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF); XXH128_hash_t r128 = { lower, upper }; return r128; #endif } /* * We want to keep the attribute here because a target switch * disables inlining. * * Does a 64-bit to 128-bit multiply, then XOR folds it. * The reason for the separate function is to prevent passing * too many structs around by value. This will hopefully inline * the multiply, but we don't force it. */ #if defined(__GNUC__) && !defined(__clang__) && defined(__i386__) __attribute__((__target__("no-sse"))) #endif static xxh_u64 XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) { XXH128_hash_t product = XXH_mult64to128(lhs, rhs); return product.low64 ^ product.high64; } static XXH64_hash_t XXH3_avalanche(xxh_u64 h64) { h64 ^= h64 >> 37; h64 *= PRIME64_3; h64 ^= h64 >> 32; return h64; } /* ========================================== * Short keys * ========================================== */ XXH_FORCE_INLINE XXH64_hash_t XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(input != NULL); XXH_ASSERT(1 <= len && len <= 3); XXH_ASSERT(secret != NULL); { xxh_u8 const c1 = input[0]; xxh_u8 const c2 = input[len >> 1]; xxh_u8 const c3 = input[len - 1]; xxh_u32 const combined = ((xxh_u32)c1) | (((xxh_u32)c2) << 8) | (((xxh_u32)c3) << 16) | (((xxh_u32)len) << 24); xxh_u64 const keyed = (xxh_u64)combined ^ (XXH_readLE32(secret) + seed); xxh_u64 const mixed = keyed * PRIME64_1; return XXH3_avalanche(mixed); } } XXH_FORCE_INLINE XXH64_hash_t XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); XXH_ASSERT(4 <= len && len <= 8); { xxh_u32 const input_lo = XXH_readLE32(input); xxh_u32 const input_hi = XXH_readLE32(input + len - 4); xxh_u64 const input_64 = input_lo | ((xxh_u64)input_hi << 32); xxh_u64 const keyed = input_64 ^ (XXH_readLE64(secret) + seed); xxh_u64 const mix64 = len + ((keyed ^ (keyed >> 51)) * PRIME32_1); return XXH3_avalanche((mix64 ^ (mix64 >> 47)) * PRIME64_2); } } XXH_FORCE_INLINE XXH64_hash_t XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); XXH_ASSERT(9 <= len && len <= 16); { xxh_u64 const input_lo = XXH_readLE64(input) ^ (XXH_readLE64(secret) + seed); xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ (XXH_readLE64(secret + 8) - seed); xxh_u64 const acc = len + (input_lo + input_hi) + XXH3_mul128_fold64(input_lo, input_hi); return XXH3_avalanche(acc); } } XXH_FORCE_INLINE XXH64_hash_t XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(len <= 16); { if (len > 8) return XXH3_len_9to16_64b(input, len, secret, seed); if (len >= 4) return XXH3_len_4to8_64b(input, len, secret, seed); if (len) return XXH3_len_1to3_64b(input, len, secret, seed); return 0; } } /* === Long Keys === */ #define STRIPE_LEN 64 #define XXH_SECRET_CONSUME_RATE 8 /* nb of secret bytes consumed at each accumulation */ #define ACC_NB (STRIPE_LEN / sizeof(xxh_u64)) typedef enum { XXH3_acc_64bits, XXH3_acc_128bits } XXH3_accWidth_e; XXH_FORCE_INLINE void XXH3_accumulate_512( void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret, XXH3_accWidth_e accWidth) { #if (XXH_VECTOR == XXH_AVX2) XXH_ASSERT((((size_t)acc) & 31) == 0); { XXH_ALIGN(32) __m256i* const xacc = (__m256i *) acc; const __m256i* const xinput = (const __m256i *) input; /* not really aligned, just for ptr arithmetic, and because _mm256_loadu_si256() requires this type */ const __m256i* const xsecret = (const __m256i *) secret; /* not really aligned, just for ptr arithmetic, and because _mm256_loadu_si256() requires this type */ size_t i; for (i=0; i < STRIPE_LEN/sizeof(__m256i); i++) { __m256i const data_vec = _mm256_loadu_si256 (xinput+i); __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); /* uint32 dk[8] = {d0+k0, d1+k1, d2+k2, d3+k3, ...} */ __m256i const product = _mm256_mul_epu32 (data_key, _mm256_shuffle_epi32 (data_key, 0x31)); /* uint64 mul[4] = {dk0*dk1, dk2*dk3, ...} */ if (accWidth == XXH3_acc_128bits) { __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); __m256i const sum = _mm256_add_epi64(xacc[i], data_swap); xacc[i] = _mm256_add_epi64(product, sum); } else { /* XXH3_acc_64bits */ __m256i const sum = _mm256_add_epi64(xacc[i], data_vec); xacc[i] = _mm256_add_epi64(product, sum); } } } #elif (XXH_VECTOR == XXH_SSE2) XXH_ASSERT((((size_t)acc) & 15) == 0); { XXH_ALIGN(16) __m128i* const xacc = (__m128i *) acc; const __m128i* const xinput = (const __m128i *) input; /* not really aligned, just for ptr arithmetic, and because _mm_loadu_si128() requires this type */ const __m128i* const xsecret = (const __m128i *) secret; /* not really aligned, just for ptr arithmetic, and because _mm_loadu_si128() requires this type */ size_t i; for (i=0; i < STRIPE_LEN/sizeof(__m128i); i++) { __m128i const data_vec = _mm_loadu_si128 (xinput+i); __m128i const key_vec = _mm_loadu_si128 (xsecret+i); __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); /* uint32 dk[8] = {d0+k0, d1+k1, d2+k2, d3+k3, ...} */ __m128i const product = _mm_mul_epu32 (data_key, _mm_shuffle_epi32 (data_key, 0x31)); /* uint64 mul[4] = {dk0*dk1, dk2*dk3, ...} */ if (accWidth == XXH3_acc_128bits) { __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2)); __m128i const sum = _mm_add_epi64(xacc[i], data_swap); xacc[i] = _mm_add_epi64(product, sum); } else { /* XXH3_acc_64bits */ __m128i const sum = _mm_add_epi64(xacc[i], data_vec); xacc[i] = _mm_add_epi64(product, sum); } } } #elif (XXH_VECTOR == XXH_NEON) XXH_ASSERT((((size_t)acc) & 15) == 0); { XXH_ALIGN(16) uint64x2_t* const xacc = (uint64x2_t *) acc; /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ uint8_t const* const xinput = (const uint8_t *) input; uint8_t const* const xsecret = (const uint8_t *) secret; size_t i; for (i=0; i < STRIPE_LEN / sizeof(uint64x2_t); i++) { #if !defined(__aarch64__) && !defined(__arm64__) && defined(__GNUC__) /* ARM32-specific hack */ /* vzip on ARMv7 Clang generates a lot of vmovs (technically vorrs) without this. * vzip on 32-bit ARM NEON will overwrite the original register, and I think that Clang * assumes I don't want to destroy it and tries to make a copy. This slows down the code * a lot. * aarch64 not only uses an entirely different syntax, but it requires three * instructions... * ext v1.16B, v0.16B, #8 // select high bits because aarch64 can't address them directly * zip1 v3.2s, v0.2s, v1.2s // first zip * zip2 v2.2s, v0.2s, v1.2s // second zip * ...to do what ARM does in one: * vzip.32 d0, d1 // Interleave high and low bits and overwrite. */ /* data_vec = xsecret[i]; */ uint8x16_t const data_vec = vld1q_u8(xinput + (i * 16)); /* key_vec = xsecret[i]; */ uint8x16_t const key_vec = vld1q_u8(xsecret + (i * 16)); /* data_key = data_vec ^ key_vec; */ uint32x4_t data_key; if (accWidth == XXH3_acc_64bits) { /* Add first to prevent register swaps */ /* xacc[i] += data_vec; */ xacc[i] = vaddq_u64 (xacc[i], vreinterpretq_u64_u8(data_vec)); } else { /* XXH3_acc_128bits */ /* xacc[i] += swap(data_vec); */ /* can probably be optimized better */ uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec); uint64x2_t const swapped= vextq_u64(data64, data64, 1); xacc[i] = vaddq_u64 (xacc[i], swapped); } data_key = vreinterpretq_u32_u8(veorq_u8(data_vec, key_vec)); /* Here's the magic. We use the quirkiness of vzip to shuffle data_key in place. * shuffle: data_key[0, 1, 2, 3] = data_key[0, 2, 1, 3] */ __asm__("vzip.32 %e0, %f0" : "+w" (data_key)); /* xacc[i] += (uint64x2_t) data_key[0, 1] * (uint64x2_t) data_key[2, 3]; */ xacc[i] = vmlal_u32(xacc[i], vget_low_u32(data_key), vget_high_u32(data_key)); #else /* On aarch64, vshrn/vmovn seems to be equivalent to, if not faster than, the vzip method. */ /* data_vec = xsecret[i]; */ uint8x16_t const data_vec = vld1q_u8(xinput + (i * 16)); /* key_vec = xsecret[i]; */ uint8x16_t const key_vec = vld1q_u8(xsecret + (i * 16)); /* data_key = data_vec ^ key_vec; */ uint64x2_t const data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec)); /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF); */ uint32x2_t const data_key_lo = vmovn_u64 (data_key); /* data_key_hi = (uint32x2_t) (data_key >> 32); */ uint32x2_t const data_key_hi = vshrn_n_u64 (data_key, 32); if (accWidth == XXH3_acc_64bits) { /* xacc[i] += data_vec; */ xacc[i] = vaddq_u64 (xacc[i], vreinterpretq_u64_u8(data_vec)); } else { /* XXH3_acc_128bits */ /* xacc[i] += swap(data_vec); */ uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec); uint64x2_t const swapped= vextq_u64(data64, data64, 1); xacc[i] = vaddq_u64 (xacc[i], swapped); } /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */ xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi); #endif } } #elif (XXH_VECTOR == XXH_VSX) U64x2* const xacc = (U64x2*) acc; /* presumed aligned */ U64x2 const* const xinput = (U64x2 const*) input; /* no alignment restriction */ U64x2 const* const xsecret = (U64x2 const*) secret; /* no alignment restriction */ U64x2 const v32 = { 32, 32 }; #if XXH_VSX_BE U8x16 const vXorSwap = { 0x07, 0x16, 0x25, 0x34, 0x43, 0x52, 0x61, 0x70, 0x8F, 0x9E, 0xAD, 0xBC, 0xCB, 0xDA, 0xE9, 0xF8 }; #endif size_t i; for (i = 0; i < STRIPE_LEN / sizeof(U64x2); i++) { /* data_vec = xinput[i]; */ /* key_vec = xsecret[i]; */ #if XXH_VSX_BE /* byteswap */ U64x2 const data_vec = XXH_vec_revb(vec_vsx_ld(0, xinput + i)); U64x2 const key_raw = vec_vsx_ld(0, xsecret + i); /* See comment above. data_key = data_vec ^ swap(xsecret[i]); */ U64x2 const data_key = (U64x2)XXH_vec_permxor((U8x16)data_vec, (U8x16)key_raw, vXorSwap); #else U64x2 const data_vec = vec_vsx_ld(0, xinput + i); U64x2 const key_vec = vec_vsx_ld(0, xsecret + i); U64x2 const data_key = data_vec ^ key_vec; #endif /* shuffled = (data_key << 32) | (data_key >> 32); */ U32x4 const shuffled = (U32x4)vec_rl(data_key, v32); /* product = ((U64x2)data_key & 0xFFFFFFFF) * ((U64x2)shuffled & 0xFFFFFFFF); */ U64x2 const product = XXH_vec_mulo((U32x4)data_key, shuffled); xacc[i] += product; if (accWidth == XXH3_acc_64bits) { xacc[i] += data_vec; } else { /* XXH3_acc_128bits */ /* swap high and low halves */ U64x2 const data_swapped = vec_xxpermdi(data_vec, data_vec, 2); xacc[i] += data_swapped; } } #else /* scalar variant of Accumulator - universal */ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned on 32-bytes boundaries, little hint for the auto-vectorizer */ const xxh_u8* const xinput = (const xxh_u8*) input; /* no alignment restriction */ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ size_t i; XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0); for (i=0; i < ACC_NB; i++) { xxh_u64 const data_val = XXH_readLE64(xinput + 8*i); xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + i*8); if (accWidth == XXH3_acc_64bits) { xacc[i] += data_val; } else { xacc[i ^ 1] += data_val; /* swap adjacent lanes */ } xacc[i] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32); } #endif } XXH_FORCE_INLINE void XXH3_scrambleAcc(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { #if (XXH_VECTOR == XXH_AVX2) XXH_ASSERT((((size_t)acc) & 31) == 0); { XXH_ALIGN(32) __m256i* const xacc = (__m256i*) acc; const __m256i* const xsecret = (const __m256i *) secret; /* not really aligned, just for ptr arithmetic, and because _mm256_loadu_si256() requires this argument type */ const __m256i prime32 = _mm256_set1_epi32((int)PRIME32_1); size_t i; for (i=0; i < STRIPE_LEN/sizeof(__m256i); i++) { /* xacc[i] ^= (xacc[i] >> 47) */ __m256i const acc_vec = xacc[i]; __m256i const shifted = _mm256_srli_epi64 (acc_vec, 47); __m256i const data_vec = _mm256_xor_si256 (acc_vec, shifted); /* xacc[i] ^= xsecret; */ __m256i const key_vec = _mm256_loadu_si256 (xsecret+i); __m256i const data_key = _mm256_xor_si256 (data_vec, key_vec); /* xacc[i] *= PRIME32_1; */ __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, 0x31); __m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32); __m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32); xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32)); } } #elif (XXH_VECTOR == XXH_SSE2) XXH_ASSERT((((size_t)acc) & 15) == 0); { XXH_ALIGN(16) __m128i* const xacc = (__m128i*) acc; const __m128i* const xsecret = (const __m128i *) secret; /* not really aligned, just for ptr arithmetic, and because _mm_loadu_si128() requires this argument type */ const __m128i prime32 = _mm_set1_epi32((int)PRIME32_1); size_t i; for (i=0; i < STRIPE_LEN/sizeof(__m128i); i++) { /* xacc[i] ^= (xacc[i] >> 47) */ __m128i const acc_vec = xacc[i]; __m128i const shifted = _mm_srli_epi64 (acc_vec, 47); __m128i const data_vec = _mm_xor_si128 (acc_vec, shifted); /* xacc[i] ^= xsecret; */ __m128i const key_vec = _mm_loadu_si128 (xsecret+i); __m128i const data_key = _mm_xor_si128 (data_vec, key_vec); /* xacc[i] *= PRIME32_1; */ __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, 0x31); __m128i const prod_lo = _mm_mul_epu32 (data_key, prime32); __m128i const prod_hi = _mm_mul_epu32 (data_key_hi, prime32); xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32)); } } #elif (XXH_VECTOR == XXH_NEON) XXH_ASSERT((((size_t)acc) & 15) == 0); { uint64x2_t* const xacc = (uint64x2_t*) acc; uint8_t const* const xsecret = (uint8_t const*) secret; uint32x2_t const prime = vdup_n_u32 (PRIME32_1); size_t i; for (i=0; i < STRIPE_LEN/sizeof(uint64x2_t); i++) { /* data_vec = xacc[i] ^ (xacc[i] >> 47); */ uint64x2_t const acc_vec = xacc[i]; uint64x2_t const shifted = vshrq_n_u64 (acc_vec, 47); uint64x2_t const data_vec = veorq_u64 (acc_vec, shifted); /* key_vec = xsecret[i]; */ uint32x4_t const key_vec = vreinterpretq_u32_u8(vld1q_u8(xsecret + (i * 16))); /* data_key = data_vec ^ key_vec; */ uint32x4_t const data_key = veorq_u32 (vreinterpretq_u32_u64(data_vec), key_vec); /* shuffled = { data_key[0, 2], data_key[1, 3] }; */ uint32x2x2_t const shuffled = vzip_u32 (vget_low_u32(data_key), vget_high_u32(data_key)); /* data_key *= PRIME32_1 */ /* prod_hi = (data_key >> 32) * PRIME32_1; */ uint64x2_t const prod_hi = vmull_u32 (shuffled.val[1], prime); /* xacc[i] = prod_hi << 32; */ xacc[i] = vshlq_n_u64(prod_hi, 32); /* xacc[i] += (prod_hi & 0xFFFFFFFF) * PRIME32_1; */ xacc[i] = vmlal_u32(xacc[i], shuffled.val[0], prime); } } #elif (XXH_VECTOR == XXH_VSX) U64x2* const xacc = (U64x2*) acc; const U64x2* const xsecret = (const U64x2*) secret; /* constants */ U64x2 const v32 = { 32, 32 }; U64x2 const v47 = { 47, 47 }; U32x4 const prime = { PRIME32_1, PRIME32_1, PRIME32_1, PRIME32_1 }; size_t i; #if XXH_VSX_BE /* endian swap */ U8x16 const vXorSwap = { 0x07, 0x16, 0x25, 0x34, 0x43, 0x52, 0x61, 0x70, 0x8F, 0x9E, 0xAD, 0xBC, 0xCB, 0xDA, 0xE9, 0xF8 }; #endif for (i = 0; i < STRIPE_LEN / sizeof(U64x2); i++) { U64x2 const acc_vec = xacc[i]; U64x2 const data_vec = acc_vec ^ (acc_vec >> v47); /* key_vec = xsecret[i]; */ #if XXH_VSX_BE /* swap bytes words */ U64x2 const key_raw = vec_vsx_ld(0, xsecret + i); U64x2 const data_key = (U64x2)XXH_vec_permxor((U8x16)data_vec, (U8x16)key_raw, vXorSwap); #else U64x2 const key_vec = vec_vsx_ld(0, xsecret + i); U64x2 const data_key = data_vec ^ key_vec; #endif /* data_key *= PRIME32_1 */ /* prod_lo = ((U64x2)data_key & 0xFFFFFFFF) * ((U64x2)prime & 0xFFFFFFFF); */ U64x2 const prod_even = XXH_vec_mule((U32x4)data_key, prime); /* prod_hi = ((U64x2)data_key >> 32) * ((U64x2)prime >> 32); */ U64x2 const prod_odd = XXH_vec_mulo((U32x4)data_key, prime); xacc[i] = prod_odd + (prod_even << v32); } #else /* scalar variant of Scrambler - universal */ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned on 32-bytes boundaries, little hint for the auto-vectorizer */ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ size_t i; XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); for (i=0; i < ACC_NB; i++) { xxh_u64 const key64 = XXH_readLE64(xsecret + 8*i); xxh_u64 acc64 = xacc[i]; acc64 ^= acc64 >> 47; acc64 ^= key64; acc64 *= PRIME32_1; xacc[i] = acc64; } #endif } /* assumption : nbStripes will not overflow secret size */ XXH_FORCE_INLINE void XXH3_accumulate( xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT input, const xxh_u8* XXH_RESTRICT secret, size_t nbStripes, XXH3_accWidth_e accWidth) { size_t n; for (n = 0; n < nbStripes; n++ ) { XXH3_accumulate_512(acc, input + n*STRIPE_LEN, secret + n*XXH_SECRET_CONSUME_RATE, accWidth); } } /* note : clang auto-vectorizes well in SS2 mode _if_ this function is `static`, * and doesn't auto-vectorize it at all if it is `FORCE_INLINE`. * However, it auto-vectorizes better AVX2 if it is `FORCE_INLINE` * Pretty much every other modes and compilers prefer `FORCE_INLINE`. */ #if defined(__clang__) && (XXH_VECTOR==0) && !defined(__AVX2__) && !defined(__arm__) && !defined(__thumb__) static void #else XXH_FORCE_INLINE void #endif XXH3_hashLong_internal_loop( xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize, XXH3_accWidth_e accWidth) { size_t const nb_rounds = (secretSize - STRIPE_LEN) / XXH_SECRET_CONSUME_RATE; size_t const block_len = STRIPE_LEN * nb_rounds; size_t const nb_blocks = len / block_len; size_t n; XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); for (n = 0; n < nb_blocks; n++) { XXH3_accumulate(acc, input + n*block_len, secret, nb_rounds, accWidth); XXH3_scrambleAcc(acc, secret + secretSize - STRIPE_LEN); } /* last partial block */ XXH_ASSERT(len > STRIPE_LEN); { size_t const nbStripes = (len - (block_len * nb_blocks)) / STRIPE_LEN; XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE)); XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, accWidth); /* last stripe */ if (len & (STRIPE_LEN - 1)) { const xxh_u8* const p = input + len - STRIPE_LEN; #define XXH_SECRET_LASTACC_START 7 /* do not align on 8, so that secret is different from scrambler */ XXH3_accumulate_512(acc, p, secret + secretSize - STRIPE_LEN - XXH_SECRET_LASTACC_START, accWidth); } } } XXH_FORCE_INLINE xxh_u64 XXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret) { return XXH3_mul128_fold64( acc[0] ^ XXH_readLE64(secret), acc[1] ^ XXH_readLE64(secret+8) ); } static XXH64_hash_t XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start) { xxh_u64 result64 = start; result64 += XXH3_mix2Accs(acc+0, secret + 0); result64 += XXH3_mix2Accs(acc+2, secret + 16); result64 += XXH3_mix2Accs(acc+4, secret + 32); result64 += XXH3_mix2Accs(acc+6, secret + 48); return XXH3_avalanche(result64); } #define XXH3_INIT_ACC { PRIME32_3, PRIME64_1, PRIME64_2, PRIME64_3, \ PRIME64_4, PRIME32_2, PRIME64_5, PRIME32_1 }; XXH_FORCE_INLINE XXH64_hash_t XXH3_hashLong_internal(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize) { XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[ACC_NB] = XXH3_INIT_ACC; XXH3_hashLong_internal_loop(acc, input, len, secret, secretSize, XXH3_acc_64bits); /* converge into final hash */ XXH_STATIC_ASSERT(sizeof(acc) == 64); #define XXH_SECRET_MERGEACCS_START 11 /* do not align on 8, so that secret is different from accumulator */ XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); return XXH3_mergeAccs(acc, secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * PRIME64_1); } XXH_NO_INLINE XXH64_hash_t /* It's important for performance that XXH3_hashLong is not inlined. Not sure why (uop cache maybe ?), but difference is large and easily measurable */ XXH3_hashLong_64b_defaultSecret(const xxh_u8* XXH_RESTRICT input, size_t len) { return XXH3_hashLong_internal(input, len, kSecret, sizeof(kSecret)); } XXH_NO_INLINE XXH64_hash_t /* It's important for performance that XXH3_hashLong is not inlined. Not sure why (uop cache maybe ?), but difference is large and easily measurable */ XXH3_hashLong_64b_withSecret(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize) { return XXH3_hashLong_internal(input, len, secret, secretSize); } XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) { if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); memcpy(dst, &v64, sizeof(v64)); } /* XXH3_initCustomSecret() : * destination `customSecret` is presumed allocated and same size as `kSecret`. */ XXH_FORCE_INLINE void XXH3_initCustomSecret(xxh_u8* customSecret, xxh_u64 seed64) { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16; int i; XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0); for (i=0; i < nbRounds; i++) { XXH_writeLE64(customSecret + 16*i, XXH_readLE64(kSecret + 16*i) + seed64); XXH_writeLE64(customSecret + 16*i + 8, XXH_readLE64(kSecret + 16*i + 8) - seed64); } } /* XXH3_hashLong_64b_withSeed() : * Generate a custom key, * based on alteration of default kSecret with the seed, * and then use this key for long mode hashing. * This operation is decently fast but nonetheless costs a little bit of time. * Try to avoid it whenever possible (typically when seed==0). */ XXH_NO_INLINE XXH64_hash_t /* It's important for performance that XXH3_hashLong is not inlined. Not sure why (uop cache maybe ?), but difference is large and easily measurable */ XXH3_hashLong_64b_withSeed(const xxh_u8* input, size_t len, XXH64_hash_t seed) { XXH_ALIGN(8) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; if (seed==0) return XXH3_hashLong_64b_defaultSecret(input, len); XXH3_initCustomSecret(secret, seed); return XXH3_hashLong_internal(input, len, secret, sizeof(secret)); } XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64) { xxh_u64 const input_lo = XXH_readLE64(input); xxh_u64 const input_hi = XXH_readLE64(input+8); return XXH3_mul128_fold64( input_lo ^ (XXH_readLE64(secret) + seed64), input_hi ^ (XXH_readLE64(secret+8) - seed64) ); } XXH_FORCE_INLINE XXH64_hash_t XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize, XXH64_hash_t seed) { XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; XXH_ASSERT(16 < len && len <= 128); { xxh_u64 acc = len * PRIME64_1; if (len > 32) { if (len > 64) { if (len > 96) { acc += XXH3_mix16B(input+48, secret+96, seed); acc += XXH3_mix16B(input+len-64, secret+112, seed); } acc += XXH3_mix16B(input+32, secret+64, seed); acc += XXH3_mix16B(input+len-48, secret+80, seed); } acc += XXH3_mix16B(input+16, secret+32, seed); acc += XXH3_mix16B(input+len-32, secret+48, seed); } acc += XXH3_mix16B(input+0, secret+0, seed); acc += XXH3_mix16B(input+len-16, secret+16, seed); return XXH3_avalanche(acc); } } #define XXH3_MIDSIZE_MAX 240 XXH_NO_INLINE XXH64_hash_t XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize, XXH64_hash_t seed) { XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); #define XXH3_MIDSIZE_STARTOFFSET 3 #define XXH3_MIDSIZE_LASTOFFSET 17 { xxh_u64 acc = len * PRIME64_1; int const nbRounds = (int)len / 16; int i; for (i=0; i<8; i++) { acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed); } acc = XXH3_avalanche(acc); XXH_ASSERT(nbRounds >= 8); for (i=8 ; i < nbRounds; i++) { acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed); } /* last bytes */ acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed); return XXH3_avalanche(acc); } } /* === Public entry point === */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) { if (len <= 16) return XXH3_len_0to16_64b((const xxh_u8*)input, len, kSecret, 0); if (len <= 128) return XXH3_len_17to128_64b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), 0); if (len <= XXH3_MIDSIZE_MAX) return XXH3_len_129to240_64b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), 0); return XXH3_hashLong_64b_defaultSecret((const xxh_u8*)input, len); } XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) { XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); /* if an action must be taken should `secret` conditions not be respected, * it should be done here. * For now, it's a contract pre-condition. * Adding a check and a branch here would cost performance at every hash */ if (len <= 16) return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, 0); if (len <= 128) return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, 0); if (len <= XXH3_MIDSIZE_MAX) return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, 0); return XXH3_hashLong_64b_withSecret((const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize); } XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) { if (len <= 16) return XXH3_len_0to16_64b((const xxh_u8*)input, len, kSecret, seed); if (len <= 128) return XXH3_len_17to128_64b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), seed); if (len <= XXH3_MIDSIZE_MAX) return XXH3_len_129to240_64b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), seed); return XXH3_hashLong_64b_withSeed((const xxh_u8*)input, len, seed); } /* === XXH3 streaming === */ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) { return (XXH3_state_t*)XXH_malloc(sizeof(XXH3_state_t)); } XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) { XXH_free(statePtr); return XXH_OK; } XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) { memcpy(dst_state, src_state, sizeof(*dst_state)); } static void XXH3_64bits_reset_internal(XXH3_state_t* statePtr, XXH64_hash_t seed, const xxh_u8* secret, size_t secretSize) { XXH_ASSERT(statePtr != NULL); memset(statePtr, 0, sizeof(*statePtr)); statePtr->acc[0] = PRIME32_3; statePtr->acc[1] = PRIME64_1; statePtr->acc[2] = PRIME64_2; statePtr->acc[3] = PRIME64_3; statePtr->acc[4] = PRIME64_4; statePtr->acc[5] = PRIME32_2; statePtr->acc[6] = PRIME64_5; statePtr->acc[7] = PRIME32_1; statePtr->seed = seed; XXH_ASSERT(secret != NULL); statePtr->secret = secret; XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); statePtr->secretLimit = (XXH32_hash_t)(secretSize - STRIPE_LEN); statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; } XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr) { if (statePtr == NULL) return XXH_ERROR; XXH3_64bits_reset_internal(statePtr, 0, kSecret, XXH_SECRET_DEFAULT_SIZE); return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) { if (statePtr == NULL) return XXH_ERROR; XXH3_64bits_reset_internal(statePtr, 0, (const xxh_u8*)secret, secretSize); if (secret == NULL) return XXH_ERROR; if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) { if (statePtr == NULL) return XXH_ERROR; XXH3_64bits_reset_internal(statePtr, seed, kSecret, XXH_SECRET_DEFAULT_SIZE); XXH3_initCustomSecret(statePtr->customSecret, seed); statePtr->secret = statePtr->customSecret; return XXH_OK; } XXH_FORCE_INLINE void XXH3_consumeStripes( xxh_u64* acc, XXH32_hash_t* nbStripesSoFarPtr, XXH32_hash_t nbStripesPerBlock, const xxh_u8* input, size_t totalStripes, const xxh_u8* secret, size_t secretLimit, XXH3_accWidth_e accWidth) { XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock); if (nbStripesPerBlock - *nbStripesSoFarPtr <= totalStripes) { /* need a scrambling operation */ size_t const nbStripes = nbStripesPerBlock - *nbStripesSoFarPtr; XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, accWidth); XXH3_scrambleAcc(acc, secret + secretLimit); XXH3_accumulate(acc, input + nbStripes * STRIPE_LEN, secret, totalStripes - nbStripes, accWidth); *nbStripesSoFarPtr = (XXH32_hash_t)(totalStripes - nbStripes); } else { XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, totalStripes, accWidth); *nbStripesSoFarPtr += (XXH32_hash_t)totalStripes; } } XXH_FORCE_INLINE XXH_errorcode XXH3_update(XXH3_state_t* state, const xxh_u8* input, size_t len, XXH3_accWidth_e accWidth) { if (input==NULL) #if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) return XXH_OK; #else return XXH_ERROR; #endif { const xxh_u8* const bEnd = input + len; state->totalLen += len; if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { /* fill in tmp buffer */ XXH_memcpy(state->buffer + state->bufferedSize, input, len); state->bufferedSize += (XXH32_hash_t)len; return XXH_OK; } /* input now > XXH3_INTERNALBUFFER_SIZE */ #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / STRIPE_LEN) XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % STRIPE_LEN == 0); /* clean multiple */ if (state->bufferedSize) { /* some input within internal buffer: fill then consume it */ size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); input += loadSize; XXH3_consumeStripes(state->acc, &state->nbStripesSoFar, state->nbStripesPerBlock, state->buffer, XXH3_INTERNALBUFFER_STRIPES, state->secret, state->secretLimit, accWidth); state->bufferedSize = 0; } /* consume input by full buffer quantities */ if (input+XXH3_INTERNALBUFFER_SIZE <= bEnd) { const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; do { XXH3_consumeStripes(state->acc, &state->nbStripesSoFar, state->nbStripesPerBlock, input, XXH3_INTERNALBUFFER_STRIPES, state->secret, state->secretLimit, accWidth); input += XXH3_INTERNALBUFFER_SIZE; } while (input<=limit); } if (input < bEnd) { /* some remaining input input : buffer it */ XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); state->bufferedSize = (XXH32_hash_t)(bEnd-input); } } return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) { return XXH3_update(state, (const xxh_u8*)input, len, XXH3_acc_64bits); } XXH_FORCE_INLINE void XXH3_digest_long (XXH64_hash_t* acc, const XXH3_state_t* state, XXH3_accWidth_e accWidth) { memcpy(acc, state->acc, sizeof(state->acc)); /* digest locally, state remains unaltered, and can continue ingesting more input afterwards */ if (state->bufferedSize >= STRIPE_LEN) { size_t const totalNbStripes = state->bufferedSize / STRIPE_LEN; XXH32_hash_t nbStripesSoFar = state->nbStripesSoFar; XXH3_consumeStripes(acc, &nbStripesSoFar, state->nbStripesPerBlock, state->buffer, totalNbStripes, state->secret, state->secretLimit, accWidth); if (state->bufferedSize % STRIPE_LEN) { /* one last partial stripe */ XXH3_accumulate_512(acc, state->buffer + state->bufferedSize - STRIPE_LEN, state->secret + state->secretLimit - XXH_SECRET_LASTACC_START, accWidth); } } else { /* bufferedSize < STRIPE_LEN */ if (state->bufferedSize) { /* one last stripe */ xxh_u8 lastStripe[STRIPE_LEN]; size_t const catchupSize = STRIPE_LEN - state->bufferedSize; memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); XXH3_accumulate_512(acc, lastStripe, state->secret + state->secretLimit - XXH_SECRET_LASTACC_START, accWidth); } } } XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) { if (state->totalLen > XXH3_MIDSIZE_MAX) { XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[ACC_NB]; XXH3_digest_long(acc, state, XXH3_acc_64bits); return XXH3_mergeAccs(acc, state->secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)state->totalLen * PRIME64_1); } /* len <= XXH3_MIDSIZE_MAX : short code */ if (state->seed) return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), state->secret, state->secretLimit + STRIPE_LEN); } /* ========================================== * XXH3 128 bits (=> XXH128) * ========================================== */ XXH_FORCE_INLINE XXH128_hash_t XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(input != NULL); XXH_ASSERT(1 <= len && len <= 3); XXH_ASSERT(secret != NULL); { xxh_u8 const c1 = input[0]; xxh_u8 const c2 = input[len >> 1]; xxh_u8 const c3 = input[len - 1]; xxh_u32 const combinedl = ((xxh_u32)c1) + (((xxh_u32)c2) << 8) + (((xxh_u32)c3) << 16) + (((xxh_u32)len) << 24); xxh_u32 const combinedh = XXH_swap32(combinedl); xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ (XXH_readLE32(secret) + seed); xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ (XXH_readLE32(secret+4) - seed); xxh_u64 const mixedl = keyed_lo * PRIME64_1; xxh_u64 const mixedh = keyed_hi * PRIME64_5; XXH128_hash_t const h128 = { XXH3_avalanche(mixedl) /*low64*/, XXH3_avalanche(mixedh) /*high64*/ }; return h128; } } XXH_FORCE_INLINE XXH128_hash_t XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); XXH_ASSERT(4 <= len && len <= 8); { xxh_u32 const input_lo = XXH_readLE32(input); xxh_u32 const input_hi = XXH_readLE32(input + len - 4); xxh_u64 const input_64_lo = input_lo + ((xxh_u64)input_hi << 32); xxh_u64 const input_64_hi = XXH_swap64(input_64_lo); xxh_u64 const keyed_lo = input_64_lo ^ (XXH_readLE64(secret) + seed); xxh_u64 const keyed_hi = input_64_hi ^ (XXH_readLE64(secret + 8) - seed); xxh_u64 const mix64l1 = len + ((keyed_lo ^ (keyed_lo >> 51)) * PRIME32_1); xxh_u64 const mix64l2 = (mix64l1 ^ (mix64l1 >> 47)) * PRIME64_2; xxh_u64 const mix64h1 = ((keyed_hi ^ (keyed_hi >> 47)) * PRIME64_1) - len; xxh_u64 const mix64h2 = (mix64h1 ^ (mix64h1 >> 43)) * PRIME64_4; { XXH128_hash_t const h128 = { XXH3_avalanche(mix64l2) /*low64*/, XXH3_avalanche(mix64h2) /*high64*/ }; return h128; } } } XXH_FORCE_INLINE XXH128_hash_t XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); XXH_ASSERT(9 <= len && len <= 16); { xxh_u64 const input_lo = XXH_readLE64(input) ^ (XXH_readLE64(secret) + seed); xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ (XXH_readLE64(secret+8) - seed); XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi, PRIME64_1); xxh_u64 const lenContrib = XXH_mult32to64(len, PRIME32_5); m128.low64 += lenContrib; m128.high64 += input_hi * PRIME64_1; m128.low64 ^= (m128.high64 >> 32); { XXH128_hash_t h128 = XXH_mult64to128(m128.low64, PRIME64_2); h128.high64 += m128.high64 * PRIME64_2; h128.low64 = XXH3_avalanche(h128.low64); h128.high64 = XXH3_avalanche(h128.high64); return h128; } } } /* Assumption : `secret` size is >= 16 * Note : it should be >= XXH3_SECRET_SIZE_MIN anyway */ XXH_FORCE_INLINE XXH128_hash_t XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed) { XXH_ASSERT(len <= 16); { if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed); if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed); if (len) return XXH3_len_1to3_128b(input, len, secret, seed); { XXH128_hash_t const h128 = { 0, 0 }; return h128; } } } XXH_FORCE_INLINE XXH128_hash_t XXH3_hashLong_128b_internal(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize) { XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[ACC_NB] = XXH3_INIT_ACC; XXH3_hashLong_internal_loop(acc, input, len, secret, secretSize, XXH3_acc_128bits); /* converge into final hash */ XXH_STATIC_ASSERT(sizeof(acc) == 64); XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); { xxh_u64 const low64 = XXH3_mergeAccs(acc, secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * PRIME64_1); xxh_u64 const high64 = XXH3_mergeAccs(acc, secret + secretSize - sizeof(acc) - XXH_SECRET_MERGEACCS_START, ~((xxh_u64)len * PRIME64_2)); XXH128_hash_t const h128 = { low64, high64 }; return h128; } } XXH_NO_INLINE XXH128_hash_t /* It's important for performance that XXH3_hashLong is not inlined. Not sure why (uop cache maybe ?), but difference is large and easily measurable */ XXH3_hashLong_128b_defaultSecret(const xxh_u8* input, size_t len) { return XXH3_hashLong_128b_internal(input, len, kSecret, sizeof(kSecret)); } XXH_NO_INLINE XXH128_hash_t /* It's important for performance that XXH3_hashLong is not inlined. Not sure why (uop cache maybe ?), but difference is large and easily measurable */ XXH3_hashLong_128b_withSecret(const xxh_u8* input, size_t len, const xxh_u8* secret, size_t secretSize) { return XXH3_hashLong_128b_internal(input, len, secret, secretSize); } XXH_NO_INLINE XXH128_hash_t /* It's important for performance that XXH3_hashLong is not inlined. Not sure why (uop cache maybe ?), but difference is large and easily measurable */ XXH3_hashLong_128b_withSeed(const xxh_u8* input, size_t len, XXH64_hash_t seed) { XXH_ALIGN(8) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE]; if (seed == 0) return XXH3_hashLong_128b_defaultSecret(input, len); XXH3_initCustomSecret(secret, seed); return XXH3_hashLong_128b_internal(input, len, secret, sizeof(secret)); } XXH_FORCE_INLINE XXH128_hash_t XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2, const xxh_u8* secret, XXH64_hash_t seed) { acc.low64 += XXH3_mix16B (input_1, secret+0, seed); acc.low64 ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8); acc.high64 += XXH3_mix16B (input_2, secret+16, seed); acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8); return acc; } XXH_NO_INLINE XXH128_hash_t XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize, XXH64_hash_t seed) { XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX); { XXH128_hash_t acc; int const nbRounds = (int)len / 32; int i; acc.low64 = len * PRIME64_1; acc.high64 = 0; for (i=0; i<4; i++) { acc = XXH128_mix32B(acc, input+(32*i), input+(32*i)+16, secret+(32*i), seed); } acc.low64 = XXH3_avalanche(acc.low64); acc.high64 = XXH3_avalanche(acc.high64); XXH_ASSERT(nbRounds >= 4); for (i=4 ; i < nbRounds; i++) { acc = XXH128_mix32B(acc, input+(32*i), input+(32*i)+16, secret+XXH3_MIDSIZE_STARTOFFSET+(32*(i-4)), seed); } /* last bytes */ acc = XXH128_mix32B(acc, input + len - 16, input + len - 32, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16, 0ULL - seed); { xxh_u64 const low64 = acc.low64 + acc.high64; xxh_u64 const high64 = (acc.low64 * PRIME64_1) + (acc.high64 * PRIME64_4) + ((len - seed) * PRIME64_2); XXH128_hash_t const h128 = { XXH3_avalanche(low64), (XXH64_hash_t)0 - XXH3_avalanche(high64) }; return h128; } } } XXH_FORCE_INLINE XXH128_hash_t XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len, const xxh_u8* XXH_RESTRICT secret, size_t secretSize, XXH64_hash_t seed) { XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize; XXH_ASSERT(16 < len && len <= 128); { XXH128_hash_t acc; acc.low64 = len * PRIME64_1; acc.high64 = 0; if (len > 32) { if (len > 64) { if (len > 96) { acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed); } acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed); } acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed); } acc = XXH128_mix32B(acc, input, input+len-16, secret, seed); { xxh_u64 const low64 = acc.low64 + acc.high64; xxh_u64 const high64 = (acc.low64 * PRIME64_1) + (acc.high64 * PRIME64_4) + ((len - seed) * PRIME64_2); XXH128_hash_t const h128 = { XXH3_avalanche(low64), (XXH64_hash_t)0 - XXH3_avalanche(high64) }; return h128; } } } XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) { if (len <= 16) return XXH3_len_0to16_128b((const xxh_u8*)input, len, kSecret, 0); if (len <= 128) return XXH3_len_17to128_128b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), 0); if (len <= XXH3_MIDSIZE_MAX) return XXH3_len_129to240_128b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), 0); return XXH3_hashLong_128b_defaultSecret((const xxh_u8*)input, len); } XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) { XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); /* if an action must be taken should `secret` conditions not be respected, * it should be done here. * For now, it's a contract pre-condition. * Adding a check and a branch here would cost performance at every hash */ if (len <= 16) return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, 0); if (len <= 128) return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, 0); if (len <= XXH3_MIDSIZE_MAX) return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, 0); return XXH3_hashLong_128b_withSecret((const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize); } XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) { if (len <= 16) return XXH3_len_0to16_128b((const xxh_u8*)input, len, kSecret, seed); if (len <= 128) return XXH3_len_17to128_128b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), seed); if (len <= XXH3_MIDSIZE_MAX) return XXH3_len_129to240_128b((const xxh_u8*)input, len, kSecret, sizeof(kSecret), seed); return XXH3_hashLong_128b_withSeed((const xxh_u8*)input, len, seed); } XXH_PUBLIC_API XXH128_hash_t XXH128(const void* input, size_t len, XXH64_hash_t seed) { return XXH3_128bits_withSeed(input, len, seed); } /* === XXH3 128-bit streaming === */ /* all the functions are actually the same as for 64-bit streaming variant, just the reset one is different (different initial acc values for 0,5,6,7), and near the end of the digest function */ static void XXH3_128bits_reset_internal(XXH3_state_t* statePtr, XXH64_hash_t seed, const xxh_u8* secret, size_t secretSize) { XXH3_64bits_reset_internal(statePtr, seed, secret, secretSize); } XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr) { if (statePtr == NULL) return XXH_ERROR; XXH3_128bits_reset_internal(statePtr, 0, kSecret, XXH_SECRET_DEFAULT_SIZE); return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) { if (statePtr == NULL) return XXH_ERROR; XXH3_128bits_reset_internal(statePtr, 0, (const xxh_u8*)secret, secretSize); if (secret == NULL) return XXH_ERROR; if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) { if (statePtr == NULL) return XXH_ERROR; XXH3_128bits_reset_internal(statePtr, seed, kSecret, XXH_SECRET_DEFAULT_SIZE); XXH3_initCustomSecret(statePtr->customSecret, seed); statePtr->secret = statePtr->customSecret; return XXH_OK; } XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) { return XXH3_update(state, (const xxh_u8*)input, len, XXH3_acc_128bits); } XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) { if (state->totalLen > XXH3_MIDSIZE_MAX) { XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[ACC_NB]; XXH3_digest_long(acc, state, XXH3_acc_128bits); XXH_ASSERT(state->secretLimit + STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START); { xxh_u64 const low64 = XXH3_mergeAccs(acc, state->secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)state->totalLen * PRIME64_1); xxh_u64 const high64 = XXH3_mergeAccs(acc, state->secret + state->secretLimit + STRIPE_LEN - sizeof(acc) - XXH_SECRET_MERGEACCS_START, ~((xxh_u64)state->totalLen * PRIME64_2)); XXH128_hash_t const h128 = { low64, high64 }; return h128; } } /* len <= XXH3_MIDSIZE_MAX : short code */ if (state->seed) return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen), state->secret, state->secretLimit + STRIPE_LEN); } /* 128-bit utility functions */ #include /* memcmp */ /* return : 1 is equal, 0 if different */ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) { /* note : XXH128_hash_t is compact, it has no padding byte */ return !(memcmp(&h1, &h2, sizeof(h1))); } /* This prototype is compatible with stdlib's qsort(). * return : >0 if *h128_1 > *h128_2 * <0 if *h128_1 < *h128_2 * =0 if *h128_1 == *h128_2 */ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) { XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2; int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64); /* note : bets that, in most cases, hash values are different */ if (hcmp) return hcmp; return (h1.low64 > h2.low64) - (h2.low64 > h1.low64); } /*====== Canonical representation ======*/ XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) { XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) { hash.high64 = XXH_swap64(hash.high64); hash.low64 = XXH_swap64(hash.low64); } memcpy(dst, &hash.high64, sizeof(hash.high64)); memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); } XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src) { XXH128_hash_t h; h.high64 = XXH_readBE64(src); h.low64 = XXH_readBE64(src->digest + 8); return h; } #endif /* XXH3_H */ dvisvgm-2.8.1/libs/xxHash/Makefile.in0000664000175000017500000004630213563265577014415 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = libs/xxHash ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libxxhash_a_AR = $(AR) $(ARFLAGS) libxxhash_a_LIBADD = am__libxxhash_a_SOURCES_DIST = xxhash.c xxhash.h xxh3.h @HAVE_XXHASH_FALSE@am_libxxhash_a_OBJECTS = xxhash.$(OBJEXT) libxxhash_a_OBJECTS = $(am_libxxhash_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/xxhash.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libxxhash_a_SOURCES) DIST_SOURCES = $(am__libxxhash_a_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @HAVE_XXHASH_FALSE@noinst_LIBRARIES = libxxhash.a @HAVE_XXHASH_FALSE@libxxhash_a_SOURCES = xxhash.c xxhash.h xxh3.h @HAVE_XXHASH_FALSE@AM_CXXFLAGS = -Wall CLEANFILES = *.gcda *.gcno all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libs/xxHash/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign libs/xxHash/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libxxhash.a: $(libxxhash_a_OBJECTS) $(libxxhash_a_DEPENDENCIES) $(EXTRA_libxxhash_a_DEPENDENCIES) $(AM_V_at)-rm -f libxxhash.a $(AM_V_AR)$(libxxhash_a_AR) libxxhash.a $(libxxhash_a_OBJECTS) $(libxxhash_a_LIBADD) $(AM_V_at)$(RANLIB) libxxhash.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xxhash.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/xxhash.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/xxhash.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile @HAVE_XXHASH_FALSE@xxhash.c: xxhash.h xxh3.h @HAVE_XXHASH_FALSE@@CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/configure.ac0000664000175000017500000002033413563265146012427 00000000000000# This file is part of dvisvgm # Copyright (C) 2005-2019 Martin Gieseking # # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) AC_INIT([dvisvgm],[2.8.1],[martin.gieseking@uos.de]) DATE="November 2019" AC_CONFIG_SRCDIR(src) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) AC_CANONICAL_HOST AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([subdir-objects]) AH_TEMPLATE([TARGET_SYSTEM], [The machine triplet of the target system]) AC_DEFINE_UNQUOTED([TARGET_SYSTEM], ["$target"]) # Checks for programs. AC_PROG_CC AC_PROG_CC_C99 AC_PROG_CXX AX_CXX_COMPILE_STDCXX([11]) AM_PROG_AR LT_INIT AC_PROG_RANLIB AC_LANG(C) AX_CHECK_COMPILE_FLAG([-Wmismatched-tags -Wno-mismatched-tags], [CXXFLAGS="$CXXFLAGS -Wno-mismatched-tags"]) AC_CHECK_HEADERS([sys/time.h sys/timeb.h xlocale.h]) AC_HEADER_TIOCGWINSZ CPPFLAGS_SAVE="$CPPFLAGS" CFLAGS_SAVE="$CFLAGS" LDFLAGS_SAVE="$LDFLAGS" # Check availability and usability of the kpathsea library AC_ARG_VAR(KPSE_CFLAGS, [C/C++ compiler flags for the kpathsea library]) AC_ARG_VAR(KPSE_LIBS, [linker flags for the kpathsea library]) AC_ARG_VAR(KPSE_LIBS, []) AC_ARG_WITH([kpathsea], [AS_HELP_STRING([--with-kpathsea=prefix], [set location of kpathsea library])], [with_kpathsea="$withval"], [with_kpathsea=yes]) AS_IF([test "x$with_kpathsea" != "xyes"], [KPSE_CFLAGS="-I$with_kpathsea/include" KPSE_LIBS="-L$with_kpathsea/lib"] [CPPFLAGS="$CPPFLAGS $KPSE_CFLAGS" CFLAGS="$CFLAGS $KPSE_CFLAGS" LDFLAGS="$LDFLAGS $KPSE_LIBS"]) AC_CHECK_HEADER([kpathsea/kpathsea.h],, [AC_MSG_ERROR([please install the kpathsea development package])]) AC_CHECK_LIB([kpathsea], [kpse_find_file],, [AC_MSG_ERROR([libkpathsea not found, please install the corresponding package first])]) AC_MSG_CHECKING([kpathsea version]) AC_RUN_IFELSE([AC_LANG_SOURCE([#include #include int main() { FILE *f; f = fopen("kpseversion", "w"); if(!f) exit(1); fprintf(f, "%s\n", KPSEVERSION); fclose(f); exit(0); }])], [kpseversion=`cat kpseversion|sed 's/kpathsea version //'`], [kpseversion=], [kpseversion=unknown]) AC_MSG_RESULT("$kpseversion") rm -f kpseversion AS_IF([test -z "$kpseversion"], [AC_MSG_ERROR([Could not compile a simple kpathsea program -- check your installation])]) AC_SUBST(KPSE_CFLAGS) AC_SUBST(KPSE_LIBS) # Check how to link Ghostscript have_libgs=yes AC_CHECK_HEADER([ghostscript/iapi.h], [AC_CHECK_LIB(gs, gsapi_revision,, [have_libgs=no])], [have_libgs=no]) AS_IF([test "x$have_libgs" = "xno"], # Ghostscript not found, check for dlopen [AC_CHECK_LIB(dl, dlopen,, [AC_DEFINE(DISABLE_GS, 1, [Set to 1 if PostScript support should be disabled])] [AC_MSG_WARN(PostScript support disabled)])]) # Check for pkg-config PKG_PROG_PKG_CONFIG # Check for libraries. PKG_CHECK_MODULES([FREETYPE], [freetype2]) AC_ARG_ENABLE([woff], [AS_HELP_STRING([--disable-woff], [Disable WOFF support @<:@default=no@:>@])], [], [enable_woff=yes]) AM_CONDITIONAL([ENABLE_WOFF], [test "x$enable_woff" = "xyes"]) AC_ARG_WITH([ttfautohint], [AS_HELP_STRING([--with-ttfautohint@<:@=prefix@:>@], [enable ttfautohint support (disabled by default)])], [with_ttfautohint="$withval"], [with_ttfautohint=no]) # Add option to enable linking of bundled libraries (brotli, potrace, woff2, xxhash). AC_ARG_ENABLE([bundled-libs], [AS_HELP_STRING([--enable-bundled-libs], [use bundled libraries instead of the system ones @<:@default=no@:>@])]) AM_CONDITIONAL([USE_BUNDLED_LIBS], [test "x$enable_bundled_libs" = "xyes"]) # If option --enable-bundled-libs is not given, look for system libraries of brotli, potrace, woff2, and xxhash. AS_IF([test "x$enable_bundled_libs" != "xyes"], [AC_CHECK_HEADER(potracelib.h, [AC_SEARCH_LIBS(potrace_trace, [potrace], [have_potrace=yes])])] [AC_CHECK_HEADER([xxhash.h], [AC_SEARCH_LIBS(XXH32, [xxhash], [have_xxhash=yes])])] [AS_IF([test "x$enable_woff" = "xyes"], [PKG_CHECK_MODULES(BROTLI, [libbrotlienc], [have_brotli=yes])] [PKG_CHECK_MODULES(WOFF2, [libwoff2enc], [have_woff2=yes])])]) AM_CONDITIONAL(HAVE_POTRACE, [test "x$have_potrace" = "xyes"]) AM_CONDITIONAL(HAVE_BROTLI, [test "x$have_brotli" = "xyes"]) AM_CONDITIONAL(HAVE_WOFF2, [test "x$have_woff2" = "xyes"]) AM_CONDITIONAL(HAVE_XXHASH, [test "x$have_xxhash" = "xyes"]) AS_IF([test "x$enable_woff" != "xyes"], [AC_DEFINE([DISABLE_WOFF], 1, [Define if WOFF support is disabled])], [AS_IF([test "x$with_ttfautohint" != "xno"], [AS_IF([test "x$with_ttfautohint" = "xyes"], # --with-ttfautohint without path => check via pkg-config [PKG_CHECK_MODULES([TTFAUTOHINT], [ttfautohint],, [AC_MSG_ERROR([can't locate ttfautohint, use "--with-ttfautohint=path" to specify its location])])], # --with-ttfautohint=/path/ttfautohint given [TTFAUTOHINT_CFLAGS="-I$with_ttfautohint/include"] [TTFAUTOHINT_LIBS="-L$with_ttfautohint/lib"])] [CPPFLAGS="$CPPFLAGS $TTFAUTOHINT_CFLAGS" CFLAGS="$CFLAGS $TTFAUTOHINT_CFLAGS" LDFLAGS="$LDFLAGS $TTFAUTOHINT_LIBS"] [AC_CHECK_HEADERS([ttfautohint.h],, [AC_MSG_WARN([ttfautohint.h not found])])] [AC_CHECK_LIB([ttfautohint], [TTF_autohint],, [AC_MSG_WARN([no working ttfautohint library found])] [AC_CHECK_LIB(dl, dlopen, [AC_MSG_NOTICE([enabled dynamic loading of ttfautohint])], [AC_MSG_WARN([disabled ttfautohint support])])])] [AC_SUBST(TTFAUTOHINT_CFLAGS) AC_SUBST(TTFAUTOHINT_LIBS)])]) AC_CHECK_HEADERS([openssl/md5.h]) PKG_CHECK_MODULES([LIBCRYPTO], [libcrypto], [HAVE_LIBCRYPTO=1], [HAVE_LIBCRYPTO=0]) AM_CONDITIONAL([USE_BUNDLED_MD5], [test "$HAVE_LIBCRYPTO" -eq 0]) AC_CHECK_LIB(z, gzopen) # Check for header files. AC_HEADER_DIRENT AC_HEADER_STDC AC_CHECK_HEADERS_ONCE([libintl.h stdlib.h string.h strings.h unistd.h]) # Check for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_TYPE_SIZE_T AC_STRUCT_TM # Check for library functions. AC_FUNC_STAT AC_CHECK_FUNCS_ONCE([ftime gettimeofday sigaction umask uselocale]) # add options for selection of "optional" library locations # currently these libraries are mandatory; the --with-foo options # are used to specify the locations explicitely AC_ARG_WITH(zlib, [AS_HELP_STRING([--with-zlib=DIR], [set location of the zlib library])], [AS_IF([test "x$withval" != "xno"], [AS_IF([test "x$withval" != "xyes"], [ZLIB_DIR=$withval])] [AS_IF([test -n "$ZLIB_DIR"], [ZLIB_CFLAGS="-I$ZLIB_DIR -I$ZLIB_DIR/include"] [ZLIB_LIBS="-L$ZLIB_DIR/lib" -lz])])]) AC_SUBST([ZLIB_CFLAGS]) AC_SUBST([ZLIB_LIBS]) # Check if the kpathsea headers are C++ safe AC_MSG_CHECKING([if the kpathsea headers are C++ safe]) AC_LANG_PUSH([C++]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[printf("%s\n", concat("one", "two"))]])], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_DEFINE([KPSE_CXX_UNSAFE], 1, [Define to 1 if the kpathsea headers are not C++ safe.])]) AC_LANG_POP([C++]) CPPFLAGS="$CPPFLAGS_SAVE" CFLAGS="$CFLAGS_SAVE" LDFLAGS="$LDFLAGS_SAVE" AC_ARG_ENABLE([manpage], [AS_HELP_STRING([--disable-manpage], [disable generation of manual page @<:@default=no@:>@])]) AS_IF([test "x$enable_manpage" != "xno"],[ enable_manpage="no" # Check for utilities required to build the manpage AC_CHECK_PROG(ASCIIDOC, asciidoc, yes) AS_IF([test "x$ASCIIDOC" = "xyes"], [ AC_CHECK_PROG(XMLTO, xmlto, yes) AS_IF([test "x$XMLTO" = "xyes"], [ AC_CHECK_PROG(XSLTPROC, xsltproc, yes) AS_IF([test "x$XSLTPROC" = "xyes"],[enable_manpage="yes"])])])]) AS_IF([test "x$enable_manpage" != "xyes"], AC_MSG_NOTICE([generation of manual page has been disabled])) AM_CONDITIONAL([BUILD_MANPAGE], [test "x$enable_manpage" = "xyes"]) AX_CODE_COVERAGE AS_IF([ test "$enable_code_coverage" = "yes" ], [ # disable optimization changequote({,}) CFLAGS=`echo $CFLAGS | sed 's/-O[1-9s]//g'` CXXFLAGS=`echo $CXXFLAGS | sed 's/-O[1-9s]//g'` changequote([,]) ]) AC_SUBST([dvisvgm_srcdir], ['$(top_srcdir)']) AC_SUBST(DATE) AC_SUBST(AM_CPPFLAGS) AC_SUBST(AM_LDFLAGS) AC_CONFIG_FILES([ Makefile libs/Makefile libs/brotli/Makefile libs/clipper/Makefile libs/ff-woff/Makefile libs/md5/Makefile libs/potrace/Makefile libs/variant/Makefile libs/woff2/Makefile libs/xxHash/Makefile m4/Makefile src/Makefile src/version.hpp src/optimizer/Makefile tests/Makefile tests/data/Makefile doc/Makefile]) AC_OUTPUT dvisvgm-2.8.1/Makefile.in0000664000175000017500000006603013563265577012221 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ COPYING ChangeLog INSTALL NEWS README ar-lib compile \ config.guess config.sub depcomp install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign EXTRA_DIST = COPYING SUBDIRS = libs m4 src tests doc ACLOCAL_AMFLAGS = -I m4 @USE_BUNDLED_LIBS_TRUE@AM_DISTCHECK_CONFIGURE_FLAGS = --enable-bundled-libs @CODE_COVERAGE_ENABLED_TRUE@lcov_dir = $(top_builddir)/lcov @CODE_COVERAGE_ENABLED_TRUE@lcov_file = $(lcov_dir)/lcov.info all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile @CODE_COVERAGE_ENABLED_TRUE@lcov-report: @CODE_COVERAGE_ENABLED_TRUE@ @mkdir -p $(lcov_dir) @CODE_COVERAGE_ENABLED_TRUE@ lcov --capture --directory . --no-external -o $(lcov_file) @CODE_COVERAGE_ENABLED_TRUE@ genhtml --title "dvisvgm" --num-spaces 2 --legend -o $(lcov_dir) $(lcov_file) @CODE_COVERAGE_ENABLED_TRUE@lcov-clean: @CODE_COVERAGE_ENABLED_TRUE@ @rm -rf $(lcov_dir) @CODE_COVERAGE_ENABLED_TRUE@ @find . -name "*.gcda" -exec rm {} \; @CODE_COVERAGE_ENABLED_TRUE@ lcov --zerocounters --directory . @CODE_COVERAGE_ENABLED_TRUE@coverage: lcov-clean check lcov-report # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/ChangeLog0000664000175000017500000136075613563265573011737 000000000000002019-11-14 Martin Gieseking * NEWS, README.md: updated NEWS and README 2019-11-12 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.8.1 * doc/dvisvgm.txt.in: some minor changes of the manual page 2019-11-11 Martin Gieseking * src/psdefs.cpp: added newline at end of file 2019-11-08 Martin Gieseking * src/optimizer/GroupCollapser.hpp: made GroupCollapser::moveAttributes() static * doc/dvisvgm.txt.in, src/optimizer/Makefile.am, src/optimizer/SVGOptimizer.cpp, src/optimizer/TextSimplifier.cpp, src/optimizer/TextSimplifier.hpp: added optimizer module TextSimplifier * doc/dvisvgm.txt.in, src/XMLNode.hpp, src/optimizer/AttributeExtractor.hpp, src/optimizer/TextSimplifier.cpp: extended functionality of optimizer module 'simplify-text' - common attributes of tspans are moved to the enclosing text element - tspans without attributes are unwrapped 2019-11-05 Martin Gieseking * src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp: removed some constant initializers from constructors * src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/EmSpecialHandler.cpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: added support for PS operator 'nulldevice' 2019-10-30 Martin Gieseking * src/FileFinder.cpp: added PNG, JPEG, and SVG to supported formats of FileFinder * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: psfile: create absolute or relative paths to reference images depending on the file location and the file path given by the user 2019-10-29 Martin Gieseking * src/FilePath.cpp, src/FilePath.hpp: added method to check if a path is absolute or relative 2019-10-27 Martin Gieseking * src/CMapReader.cpp, src/CMapReader.hpp, tests/CMapReaderTest.cpp: CMapReader: extracted common code; added test for 'begincidchar' 2019-10-25 Martin Gieseking * tests/Makefile.am, tests/create-makefile: added missing gtest file to distribution * tests/FontCacheTest.cpp: remove temporary files created by FontCacheTest * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.8 * NEWS: updated NEWS 2019-10-23 Martin Gieseking * src/CMapReader.cpp, src/CMapReader.hpp: CMapReader: added support for operator 'begincidchar' (patch by Akira Kakuto) 2019-10-20 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/FilePath.cpp, src/FilePath.hpp, src/HyperlinkManager.cpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/PDFToSVG.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/SpecialActions.hpp, tests/FilePathTest.cpp, tests/SVGOutputTest.cpp: SVGOutput: renamed 'filename' to 'filepath'; changed return type to FilePath 2019-10-18 Martin Gieseking * tests/gtest/include/gtest/gtest-death-test.h, tests/gtest/include/gtest/gtest-matchers.h, tests/gtest/include/gtest/gtest-message.h, tests/gtest/include/gtest/gtest-param-test.h, tests/gtest/include/gtest/gtest-printers.h, tests/gtest/include/gtest/gtest-spi.h, tests/gtest/include/gtest/gtest-test-part.h, tests/gtest/include/gtest/gtest-typed-test.h, tests/gtest/include/gtest/gtest.h, tests/gtest/include/gtest/gtest_pred_impl.h, tests/gtest/include/gtest/internal/gtest-death-test-internal.h, tests/gtest/include/gtest/internal/gtest-filepath.h, tests/gtest/include/gtest/internal/gtest-internal.h, tests/gtest/include/gtest/internal/gtest-param-util.h, tests/gtest/include/gtest/internal/gtest-port-arch.h, tests/gtest/include/gtest/internal/gtest-port.h, tests/gtest/include/gtest/internal/gtest-string.h, tests/gtest/include/gtest/internal/gtest-type-util.h, tests/gtest/src/gtest-all.cc, tests/gtest/src/gtest-death-test.cc, tests/gtest/src/gtest-filepath.cc, tests/gtest/src/gtest-internal-inl.h, tests/gtest/src/gtest-matchers.cc, tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, tests/gtest/src/gtest-test-part.cc, tests/gtest/src/gtest-typed-test.cc, tests/gtest/src/gtest.cc, tests/gtest/src/gtest_main.cc, tests/testutil.hpp: updated gtest to version 1.10 * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: psfile: added support for PDF, JPG, PNG, and SVG files * src/optimizer/TransformSimplifier.cpp, src/optimizer/TransformSimplifier.hpp: try to incorporate transformations into positional and size attributes * src/PsSpecialHandler.cpp: PS handler: minor code enhancements 2019-10-17 Martin Gieseking * src/PSInterpreter.cpp: call GS with -dDELAYSAFER if GS version >= 9.50 Ghostscript 9.50 introduced incompatible changes regarding SAFER which is now active by default. This conflicts with DELAYBIND and WRITESYSTEMDICT, which are necessary for dvisvgm to work correctly. https://www.ghostscript.com/doc/9.50/Use.htm#Safer * tests/HashFunctionTest.cpp: adapted XXH128 tests to changes in xxhash 0.7.2 2019-10-08 Martin Gieseking * libs/xxHash/xxh3.h, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: updated xxhash to version 0.7.2 2019-10-06 Martin Gieseking * src/EllipticalArc.cpp: minor changes in EllipticalArc.cpp 2019-09-19 Martin Gieseking * src/PathClipper.cpp: prevent warnings about uninitialized variables 2019-09-17 Martin Gieseking * libs/potrace/auxiliary.h, libs/potrace/bitmap.h, libs/potrace/config.h, libs/potrace/curve.c, libs/potrace/curve.h, libs/potrace/decompose.c, libs/potrace/decompose.h, libs/potrace/lists.h, libs/potrace/potracelib.c, libs/potrace/potracelib.h, libs/potrace/progress.h, libs/potrace/trace.c, libs/potrace/trace.h: updated potrace to version 1.16 * src/Bitmap.cpp, src/Bitmap.hpp: minor code cleanup of Bitmap class 2019-09-12 Martin Gieseking * src/GraphicsPath.hpp: renamed misspelled variables 'largeArgFlag' to 'largeArcFlag' * src/EllipticalArc.cpp: removed #include "debug.h" 2019-09-03 Martin Gieseking * libs/woff2/src/glyph.cc, libs/woff2/src/normalize.cc: fixed two compiler warnings in libwoff2 regarding signed/unsigned comparison 2019-08-27 Martin Gieseking * src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: simplified implementation of XXHashFunction::digestValue() and tests 2019-08-26 Martin Gieseking * src/StreamReader.cpp, src/StreamReader.hpp, src/VFReader.cpp, tests/StreamReaderTest.cpp: removed vector reference from StreamReader::readBytes() * src/CRC32.cpp, src/CRC32.hpp, src/FontCache.cpp, src/FontCache.hpp, src/HashFunction.cpp, src/HashFunction.hpp, src/Makefile.am, src/StreamReader.cpp, src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, src/XXHashFunction.hpp, src/utility.hpp, tests/CRC32Test.cpp, tests/FontCacheTest.cpp, tests/Makefile.am, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp: replaced CRC32 cache checksums with XXH32 hashes 2019-08-25 Martin Gieseking * doc/dvisvgm.txt.in, libs/xxHash/xxhash.h, src/HashFunction.cpp, src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: added support for the experimental 128-bit XXH3 algorithm 2019-08-24 Martin Gieseking * src/GraphicsPath.hpp: avoid redundant sequences of closepath (z/Z) commands 2019-08-19 Martin Gieseking * src/GraphicsPath.hpp, tests/GraphicsPathTest.cpp: added short versions of 'quadto' and 'cubicto' to GraphicsPath 2019-08-18 Martin Gieseking * src/TpicSpecialHandler.cpp, tests/TpicSpecialTest.cpp: use class EllipticalArc to process arcs in tpic handler 2019-08-15 Martin Gieseking * libs/xxHash/Makefile.am, libs/xxHash/xxh3.h, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: updated xxhash to version 0.7.1 * src/DVIToSVG.cpp: print error message on wrong page hash arguments 2019-08-14 Martin Gieseking * src/EllipticalArc.cpp, src/EllipticalArc.hpp, src/GraphicsPath.hpp, tests/EllipticalArcTest.cpp, tests/GraphicsPathTest.cpp: added GraphicsPath::approximateArcs() 2019-08-13 Martin Gieseking * src/Bezier.cpp, src/Bezier.hpp, src/EllipticalArc.cpp, src/EllipticalArc.hpp, src/GraphicsPath.hpp, src/Makefile.am, src/Pair.hpp, src/utility.cpp, src/utility.hpp, tests/EllipticalArcTest.cpp, tests/Makefile.am: added support of 'arcto' command to class GraphicsPath 2019-08-08 Martin Gieseking * src/Bezier.cpp, src/Bezier.hpp, src/PsSpecialHandler.cpp, src/ShadingPatch.hpp, src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/TriangularPatch.cpp, src/TriangularPatch.hpp, tests/BezierTest.cpp, tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: getBBox(): replaced reference parameter with return value * src/PsSpecialHandler.cpp, src/ShadingPatch.hpp, src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/TriangularPatch.cpp, src/TriangularPatch.hpp, tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: getBoundaryPath(): replaced reference parameter with return value 2019-08-04 Martin Gieseking * src/Color.cpp, src/Pair.hpp: use std::hypot() to compute length of vector 2019-08-01 Martin Gieseking * src/MD5HashFunction.hpp: removed 'explicit' from default constructor Work around for C++11 bug in GCC 4.8: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58255 * src/FontCache.cpp, src/FontEngine.cpp, src/FontWriter.cpp, src/GraphicsPath.hpp, src/Pair.hpp, src/PathClipper.cpp, src/TpicSpecialHandler.cpp, src/optimizer/CMakeLists.txt, src/optimizer/Makefile.am, tests/FontCacheTest.cpp, tests/GraphicsPathTest.cpp: redesigned implementation of class GraphicsPath - use variant instances to store path commands instead of plain structs - process commands in visitor objects - removed GraphicsPath::Actions::draw() that exposed implemenation details - simplify iterate() method 2019-07-29 Martin Gieseking * src/FontCache.cpp: use direct string concatenation instead of temporary string stream 2019-07-28 Martin Gieseking * doc/Makefile.am: added missing dependency to Makefile rule * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.7.4 * NEWS: updated NEWS 2019-07-27 Martin Gieseking * doc/Makefile.am: moved generation of dvisvgm.sty to separate rule 2019-07-26 Martin Gieseking * src/Color.cpp: use std::round to round color value (fixes #116) * doc/Makefile.am, doc/dvisvgm.sty, doc/dvisvgm.txt.in, doc/generate-dvisvgm-sty.xsl, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl: show revision date given in doc/dvisvgm.txt on manual page rather than the build date 2019-07-25 Martin Gieseking * src/TrueTypeFont.cpp: call ofstream constructor with std::string instead of C string 2019-07-23 Martin Gieseking * src/MetafontWrapper.cpp: replaced atoi() with stoi() 2019-07-16 Martin Gieseking * src/MetafontWrapper.cpp: don't access moved string * doc/dvisvgm.txt.in, src/dvisvgm.cpp: changed cache location to $XDG_CACHE_HOME/dvisvgm or ~/.cache/dvisvgm if $XDG_CACHE_HOME is not set (closes #112) 2019-07-12 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.7.3 * NEWS: updated NEWS 2019-07-09 Martin Gieseking * src/XMLString.cpp, src/utility.cpp, src/utility.hpp, tests/UtilityTest.cpp: added util::to_string(double) that strips trailing zeros (in contrast to std::to_string) * src/CMapManager.cpp, src/CMapReader.cpp, src/DVIReader.cpp, src/GFReader.cpp, src/JFM.cpp, src/Length.cpp, src/MapLine.cpp, src/Matrix.cpp, src/PDFParser.cpp, src/SVGOutput.cpp, src/VFReader.cpp: replaced some string streams with plain strings 2019-07-08 Martin Gieseking * README.md: updated badges in README * src/Font.cpp, src/Font.hpp, src/dvisvgm.cpp: changed type of CACHE_PATH to std::string 2019-07-07 Martin Gieseking * .github/FUNDING.yml: added funding.yml 2019-07-06 Martin Gieseking * src/DVIToSVG.cpp: properly assign collected chars to unique fonts (fixes #110) 2019-06-18 Martin Gieseking * doc/dvisvgm.txt.in: manpage: updated \special example 2019-06-17 Martin Gieseking * src/BasicDVIReader.cpp: replaced string streams with plain strings 2019-06-11 Martin Gieseking * tests/genhashcheck.py: use range-based loop to iterate over C array 2019-06-07 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.7.2 * NEWS: updated NEWS 2019-05-29 Martin Gieseking * src/psdefs.cpp: 'GS_PDF_ProcSet' and 'pdfdict' are private as of GS 9.27 As a workaround 'runpdfbegin' and 'runpdfend' can be used to enter/leave the dictionaries. 2019-05-20 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.7.1 * NEWS: updated NEWS 2019-05-10 Martin Gieseking * .appveyor.yml, .gitignore, src/MiKTeXCom.hpp: added files required to access the MiKTeX session object 2019-05-06 Martin Gieseking * src/psdefs.cpp: pop unused operand in PS operator 'setmatrix' (closes #106) 2019-04-18 Martin Gieseking * src/optimizer/AttributeExtractor.cpp, src/optimizer/GroupCollapser.cpp, src/utility.hpp: removed util::make_array() due to compatibility issues https://trac.macports.org/ticket/58347 2019-04-17 Martin Gieseking * README, README.md: updated URL of FontForge website 2019-04-15 Martin Gieseking * README.md: removed Coverity badge as the service seems to be dead 2019-04-14 Martin Gieseking * src/Makefile.am: add file windows.hpp to source tarball 2019-04-13 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.7 * NEWS: updated NEWS 2019-04-12 Martin Gieseking * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp: added specials "bbox lock" and "bbox unlock" to lock/unlock the page bbox (closes #105) * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp: added optional modifier 'transform' to the dvisvgm:bbox specials * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp: added macro {?matrix} to raw specials 2019-04-11 Martin Gieseking * src/Bezier.cpp, src/BoundingBox.hpp, src/CMap.hpp, src/CMapReader.hpp, src/Character.hpp, src/Color.hpp, src/DLLoader.hpp, src/Directory.cpp, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/EPSFile.hpp, src/EncFile.hpp, src/FilePath.hpp, src/Font.hpp, src/FontEncoding.hpp, src/FontMap.hpp, src/FontWriter.cpp, src/FontWriter.hpp, src/GFTracer.hpp, src/GlyphTracerMessages.hpp, src/GraphicsPath.hpp, src/InputBuffer.hpp, src/InputReader.hpp, src/JFM.hpp, src/Length.hpp, src/MD5HashFunction.hpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, src/Message.hpp, src/PDFParser.cpp, src/PDFParser.hpp, src/PSPattern.hpp, src/PSPreviewFilter.hpp, src/PageSize.hpp, src/Pair.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SVGCharHandler.hpp, src/SVGCharTspanTextHandler.hpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.hpp, src/ShadingPatch.hpp, src/SourceInput.hpp, src/StreamReader.hpp, src/StreamWriter.hpp, src/TFM.hpp, src/TensorProductPatch.hpp, src/TriangularPatch.hpp, src/TrueTypeFont.hpp, src/VFReader.cpp, src/VFReader.hpp, src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.hpp, src/XMLString.hpp, src/XXHashFunction.hpp, src/optimizer/DependencyGraph.hpp: marked most constructors 'explicit' if they may be called with a single parameter * src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/Font.cpp, src/FontEngine.cpp, src/FontManager.cpp, src/HyperlinkManager.cpp, src/ImageToSVG.cpp, src/PDFParser.hpp, src/PSInterpreter.cpp, src/PdfSpecialHandler.cpp, src/PsSpecialHandler.cpp, src/SVGCharHandler.cpp, src/SVGCharPathHandler.cpp, src/SVGCharTspanTextHandler.cpp, src/SVGTree.cpp, src/TensorProductPatch.cpp, src/TriangularPatch.cpp, src/TrueTypeFont.cpp: use automatic type deduction in conjunction with casts * src/EPSFile.cpp, src/EmSpecialHandler.cpp, src/EncFile.cpp, src/InputReader.cpp, src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, src/SpecialManager.cpp, src/StreamReader.cpp, src/Subfont.cpp, src/Unicode.cpp, src/dvisvgm.cpp: explicitly cast integers representing characeters to char * src/CLCommandLine.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EncFile.cpp, src/Font.cpp, src/Font.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/Process.cpp, src/Process.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/Subfont.cpp, src/Subfont.hpp: if possible, move string parameters instead of copying them * src/Color.cpp, src/FontEngine.cpp, src/PathClipper.cpp: use std::lround() rather than truncation * src/DVIActions.hpp, src/DVIToSVGActions.hpp, src/Font.hpp, src/PSInterpreter.cpp, src/SignalHandler.cpp, src/System.cpp: replaced 0 and NULL with nullptr * src/Message.cpp, src/Message.hpp: drop 'const' from char parameter * src/EPSFile.cpp: replaced C array with std::array * src/SpecialManager.hpp, src/ZLibOutputStream.hpp: made deleted constructor public; use 'default' with default constructor * src/PageSize.cpp: removed redundant semicolons 2019-04-10 Martin Gieseking * src/RangeMap.cpp, tests/RangeMapTest.cpp: use std::accumulate() to compute the number of values mapped by a RangeMap 2019-04-09 Martin Gieseking * doc/dvisvgm.txt.in: reworded some paragraphs on the manpage 2019-04-05 Martin Gieseking * src/DvisvgmSpecialHandler.cpp, src/HtmlSpecialHandler.cpp, src/InputReader.cpp, src/InputReader.hpp, src/PsSpecialHandler.cpp, tests/StreamInputBufferTest.cpp: optionally allow 'flags' (attributes w/o values) in attribute lists * src/PsSpecialHandler.cpp: psfile/pdffile: evaluate boolean attribute 'clip' If given, the drawing region is clipped to the bounding box of the EPS/PDF page being processed. (closes #104) * .appveyor.yml: AppVeyor: switched build image to VS 2019 Preview 2019-04-04 Martin Gieseking * .appveyor.yml: AppVeyor: updated release number of ttfautohint-dll * m4/ax_cxx_compile_stdcxx.m4: updated ax_cxx_compile_stdcxx.m4 to version 11 2019-04-03 Martin Gieseking * .appveyor.yml: AppVeyor: set freetype version to 2.10.0; use current image of VS 2017 again * src/SVGTree.cpp: fixed gcc 5 failure regarding initializer lists * src/FileFinder.cpp: pdffile special: look for pdf files in texmf tree too (closes #103) 2019-04-01 Martin Gieseking * src/optimizer/GroupCollapser.cpp: group collapser: unwrap groups without attributes * src/DVIToSVGActions.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.cpp, src/HyperlinkManager.cpp, src/ImageToSVG.hpp, src/PSPattern.cpp, src/PsSpecialHandler.cpp, src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp: reduced interface of SpecialActions - removed append/prepend and context functions - added direct access to the SVGTree object 2019-03-31 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.hpp, src/optimizer/AttributeExtractor.cpp, src/optimizer/AttributeExtractor.hpp, src/optimizer/GroupCollapser.cpp, src/optimizer/RedundantElementRemover.cpp, src/optimizer/TransformSimplifier.cpp, src/optimizer/WSNodeRemover.cpp, tests/BoundingBoxTest.cpp, tests/TpicSpecialTest.cpp, tests/XMLNodeTest.cpp: refactored the implementation of the XML node classes for easier modifications of the XML tree 2019-03-30 Martin Gieseking * libs/ff-woff/Makefile.am: added missing zlib include path to ff-woff * src/CMapReader.cpp: properly release memory if CMap throws an exception 2019-03-28 Martin Gieseking * src/GraphicsPath.hpp: skip redundant line drawing commands in path elements 2019-03-27 Martin Gieseking * src/XMLString.cpp, tests/DVIReaderTest.cpp, tests/GFGlyphTracerTest.cpp, tests/MatrixTest.cpp: replace "0." by "." in floating point numbers |x| < 1 * src/GraphicsPath.hpp, tests/GFGlyphTracerTest.cpp: avoid redundant space characters in SVG paths * src/GraphicsPath.hpp, tests/TpicSpecialTest.cpp: take precision into account when checking for reflection points 2019-03-25 Martin Gieseking * src/Matrix.cpp, src/Matrix.hpp, tests/MatrixTest.cpp: made Matrix::parse() a static member * configure.ac, doc/dvisvgm.txt.in, src/CommandLine.hpp, src/DVIToSVG.cpp, src/DependencyGraph.hpp, src/ImageToSVG.cpp, src/Makefile.am, src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/SVGTree.cpp, src/XMLNode.cpp, src/dvisvgm.cpp, src/optimizer/AttributeExtractor.cpp, src/optimizer/AttributeExtractor.hpp, src/optimizer/CMakeLists.txt, src/optimizer/DependencyGraph.hpp, src/optimizer/GroupCollapser.cpp, src/optimizer/GroupCollapser.hpp, src/optimizer/Makefile.am, src/optimizer/OptimizerModule.hpp, src/optimizer/RedundantElementRemover.cpp, src/optimizer/RedundantElementRemover.hpp, src/optimizer/SVGOptimizer.cpp, src/optimizer/SVGOptimizer.hpp, src/optimizer/TransformSimplifier.cpp, src/optimizer/TransformSimplifier.hpp, src/optimizer/WSNodeRemover.cpp, src/optimizer/WSNodeRemover.hpp, src/options.xml, tests/DependencyGraphTest.cpp, tests/Makefile.am, tests/create-makefile: moved optimizer classes to subdirectory 2019-03-24 Martin Gieseking * src/Matrix.cpp, src/Matrix.hpp, src/PsSpecialHandler.cpp, tests/MatrixTest.cpp: swapped Matrix::lmultiply and Matrix::rmultiply * src/Matrix.cpp, src/Matrix.hpp, src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/utility.hpp, tests/MatrixTest.cpp: added optimizer to simplify 'transform' attributes 2019-03-23 Martin Gieseking * src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/XMLNode.cpp, src/XMLNode.hpp: remove whitespace nodes before collapsing group elements 2019-03-22 Martin Gieseking * src/InputBuffer.hpp: added StringInputBuffer::assign() to assign a different string * src/InputReader.cpp, tests/StreamInputBufferTest.cpp: replaced constraints for attribute names - must start with a letter - may contain selected non-alphanumeric characters, like '-', '_', and '.' * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/SVGTree.cpp, src/XMLNode.cpp, tests/DvisvgmSpecialTest.cpp: allow split tags distributed over several dvisvgm:raw specials 2019-03-21 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/PSPattern.cpp, src/PageRanges.cpp, src/PathClipper.cpp, src/RangeMap.cpp: use type 'auto' for local iterator variables * src/FilePath.hpp, src/Font.hpp, src/ImageToSVG.hpp, src/PDFParser.hpp, src/SVGOutput.hpp, src/Subfont.hpp, src/XMLNode.cpp, src/XMLNode.hpp: use move semantics to initialize string members 2019-03-20 Martin Gieseking * src/BasicDVIReader.hpp, src/DVIToSVG.hpp, src/Subfont.hpp: deleted constructors should be public * src/Bezier.cpp, src/Bezier.hpp, src/CMap.hpp, src/CMapReader.cpp, src/Color.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/EmSpecialHandler.cpp, src/EncFile.cpp, src/FileFinder.cpp, src/FileFinder.hpp, src/FileSystem.cpp, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, src/FontManager.hpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/Ghostscript.cpp, src/Ghostscript.hpp, src/ImageToSVG.cpp, src/MapLine.cpp, src/MapLine.hpp, src/Message.cpp, src/Message.hpp, src/NoPsSpecialHandler.hpp, src/PDFParser.cpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PathClipper.cpp, src/Process.hpp, src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, src/SVGTree.hpp, src/VFReader.cpp, src/VFReader.hpp, src/XMLNode.cpp, src/dvisvgm.cpp: use nullptr instead of 0 * src/BoundingBox.hpp, src/CLCommandLine.hpp, src/CMapReader.hpp, src/Calculator.hpp, src/Font.hpp, src/FontMetrics.hpp, src/FontWriter.hpp, src/GFReader.hpp, src/Length.hpp, src/MapLine.hpp, src/Matrix.hpp, src/MessageException.hpp, src/PDFParser.hpp, src/PSInterpreter.hpp, src/PageSize.hpp, src/ShadingPatch.hpp, src/SpecialHandler.hpp, src/StreamReader.hpp, src/TrueTypeFont.hpp, src/VFReader.hpp, src/VectorIterator.hpp, src/ZLibOutputStream.hpp: made constructors of exception classes explicit * src/ZLibOutputStream.hpp: few modifications of class ZLibOutputStream * src/CharMapID.hpp, src/Color.hpp, src/FontCache.hpp, src/Message.cpp, src/Message.hpp: ensure initializations of static members don't throw exceptions * src/BoundingBox.cpp, src/CMapManager.cpp, src/ColorSpecialHandler.cpp, src/DvisvgmSpecialHandler.cpp, src/PathClipper.cpp, src/RangeMap.cpp: replaced some index-based loops with range-based ones * src/FilePath.cpp, src/FilePath.hpp: fixed type used to store directories in class FilePath * src/CLCommandLine.cpp: use emplace_back() instead of push_back() * src/FileFinder.cpp, src/Font.hpp, src/TensorProductPatch.hpp, src/dvisvgm.cpp: removed redundant 'virtual' modifiers and calls of c_str() * src/FontManager.cpp, src/HyperlinkManager.cpp, src/PageSize.cpp: use spezialized string::find() to look for single characters * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.cpp: renamed option --exact to --exact-bbox This change is downward compatible due to partial matching of long options. * src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/Matrix.cpp, src/Matrix.hpp, src/PSPattern.cpp, src/PsSpecialHandler.cpp, src/SVGCharHandler.cpp, src/SVGCharPathHandler.cpp, src/SVGTree.cpp, tests/MatrixTest.cpp: renamed and slightly refactored Matrix::getSVG() 2019-03-19 Martin Gieseking * doc/dvisvgm.txt.in, src/DVIToSVGActions.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/HyperlinkManager.cpp, src/ImageToSVG.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/SpecialActions.hpp, tests/DvisvgmSpecialTest.cpp: added context stack for SVG defs section * src/DVIToSVG.cpp, src/ImageToSVG.cpp, src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/SVGTree.cpp, src/SVGTree.hpp: moved removal of redundant clipPath elements to SVGOptimizer * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/dvisvgm.cpp, src/options.xml: added command-line option --group-attributes 2019-03-18 Martin Gieseking * src/Makefile.am: reformatted file list in Makefile 2019-03-16 Martin Gieseking * src/psdefs.cpp: added processing of PS operators xshow, yshow, and xyshow 2019-03-15 Martin Gieseking * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: updated xxhash to version 0.7.0 2019-03-14 Martin Gieseking * src/Makefile.am, src/SVGOptimizer.cpp, src/SVGOptimizer.hpp, src/SVGTree.cpp, src/XMLNode.cpp, src/XMLNode.hpp, src/utility.hpp: added algorithms to move common attributes to group elements 2019-03-13 Martin Gieseking * src/DVIToSVGActions.hpp, src/ImageToSVG.hpp, src/PSPattern.cpp, src/PSPattern.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/SpecialActions.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, src/XMLDocument.cpp, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp: take unique_ptrs by value instead of rvalue reference 2019-03-12 Martin Gieseking * src/BoundingBox.cpp, src/BoundingBox.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/HyperlinkManager.cpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/PSPattern.cpp, src/PSPattern.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp, tests/XMLNodeTest.cpp: renamed XML node classes * src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLNode.hpp, tests/XMLNodeTest.cpp: replaced dynamic casts of XML nodes with dedicated cast methods 2019-03-11 Martin Gieseking * doc/Makefile.am: rebuild manpage if configure.ac was updated A potential change of the version number should be propagated to the manpage. * doc/dvisvgm.txt.in: manpage: added link to SVG color names 2019-03-09 Martin Gieseking * src/PsSpecialHandler.cpp: imgfile: improved and simplifed code - compute transformation matrix only once (for image and bbox) - compute and update bbox only if necessary * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.6.3 * NEWS: updated NEWS 2019-03-07 Martin Gieseking * src/dvisvgm.cpp: option --bbox: check validity of paper format arguments corretcly * src/PsSpecialHandler.cpp: ensure forward slashes in file paths passed to PS oparator 'run' * src/PsSpecialHandler.cpp, src/psdefs.cpp: psfile/pdffile: adapt opposite orientation of y-coordinates properly 2019-02-28 Martin Gieseking * src/InputReader.cpp, src/InputReader.hpp, tests/StreamInputBufferTest.cpp, tests/StringMatcherTest.cpp: added StringMatcher::read() * src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/InputReader.cpp, tests/DvisvgmSpecialTest.cpp: parse raw specials and create proper XML nodes 2019-02-26 Martin Gieseking * src/DvisvgmSpecialHandler.cpp, src/FontWriter.cpp: replaced lookup loops with std::find_if 2019-02-25 Martin Gieseking * m4/Makefile.am: add ax_check_compile_flag.m4 to distributed source archives 2019-02-24 Martin Gieseking * configure.ac, m4/ax_check_compile_flag.m4, src/Makefile.am: add -Wno-mismatched-tags only if compiler supports -Wmismatched-tags (closes #101) 2019-02-17 Martin Gieseking * src/Calculator.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/InputReader.cpp, src/InputReader.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, tests/StreamInputBufferTest.cpp: replaced some unordered maps with ordered ones * src/HtmlSpecialHandler.cpp, src/InputReader.cpp, src/InputReader.hpp, src/MapLine.cpp, src/PsSpecialHandler.cpp, tests/StreamInputBufferTest.cpp: accept alternative bounding chars in getQuotedString() 2019-02-16 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.hpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp: store attributes in vectors instead of maps 2019-02-15 Martin Gieseking * doc/dvisvgm.txt.in, src/Color.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/EmSpecialTest.cpp, tests/ShadingPatchTest.cpp, tests/TensorProductPatchTest.cpp, tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp: use short RGB hex values if possible 2019-02-12 Martin Gieseking * src/FontEngine.cpp, src/Ghostscript.cpp: replaced C casts with const_cast 2019-02-07 Martin Gieseking * README.md: added some links to README 2019-01-31 Martin Gieseking * tests/gtest/include/gtest/gtest-death-test.h, tests/gtest/include/gtest/gtest-message.h, tests/gtest/include/gtest/gtest-param-test.h, tests/gtest/include/gtest/gtest-printers.h, tests/gtest/include/gtest/gtest-spi.h, tests/gtest/include/gtest/gtest-test-part.h, tests/gtest/include/gtest/gtest-typed-test.h, tests/gtest/include/gtest/gtest.h, tests/gtest/include/gtest/gtest_pred_impl.h, tests/gtest/include/gtest/gtest_prod.h, tests/gtest/include/gtest/internal/custom/gtest-port.h, tests/gtest/include/gtest/internal/custom/gtest-printers.h, tests/gtest/include/gtest/internal/custom/gtest.h, tests/gtest/include/gtest/internal/gtest-death-test-internal.h, tests/gtest/include/gtest/internal/gtest-filepath.h, tests/gtest/include/gtest/internal/gtest-internal.h, tests/gtest/include/gtest/internal/gtest-linked_ptr.h, tests/gtest/include/gtest/internal/gtest-param-util-generated.h, tests/gtest/include/gtest/internal/gtest-param-util.h, tests/gtest/include/gtest/internal/gtest-port-arch.h, tests/gtest/include/gtest/internal/gtest-port.h, tests/gtest/include/gtest/internal/gtest-string.h, tests/gtest/include/gtest/internal/gtest-tuple.h, tests/gtest/include/gtest/internal/gtest-type-util.h, tests/gtest/src/gtest-all.cc, tests/gtest/src/gtest-death-test.cc, tests/gtest/src/gtest-filepath.cc, tests/gtest/src/gtest-internal-inl.h, tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, tests/gtest/src/gtest-test-part.cc, tests/gtest/src/gtest-typed-test.cc, tests/gtest/src/gtest.cc, tests/gtest/src/gtest_main.cc: updated gtest to version 1.8.1 2019-01-28 Martin Gieseking * src/PsSpecialHandler.cpp: put struct PatchVertex in corresponding method 2019-01-24 Martin Gieseking * Makefile.am, configure.ac, m4/Makefile.am: add m4 files to source tarball 2019-01-22 Martin Gieseking * NEWS, README, README.md: updated NEWS and README * .travis.yml: Travis: switched to xenial environment 2019-01-19 Martin Gieseking * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp: ensure a path loaded by 'clippath' is considered by clip/eoclip * src/PsSpecialHandler.cpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: changed semantics of operand of 'newpath' It now denotes whether method 'newpath' was triggered by PS operator 'newpath' or one of the drawing/clipping operators. * src/GraphicsPath.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, tests/FontCacheTest.cpp, tests/GraphicsPathTest.cpp: only create new clipPath element if the new clip path differs 2019-01-18 Martin Gieseking * src/Ghostscript.cpp: fixed formatting of GS version number * src/PsSpecialHandler.cpp: use nullptr instead of 0 2019-01-15 Martin Gieseking * src/psdefs.cpp: execute 'show' if called internally by another PS operator (e.g. charpath) * src/psdefs.cpp: don't propagate local transformations to the PS handler PS operators like 'charpath' may perform local transformations, e.g. by calling 'scale'. These must not be forwarded to the PS handler. * libs/variant/Makefile.am, libs/variant/include/mpark/config.hpp, libs/variant/include/mpark/in_place.hpp, libs/variant/include/mpark/lib.hpp, libs/variant/include/mpark/variant.hpp: updated mpark::variant to version 1.4.0 * src/psdefs.cpp: PS handler: draw glyph paths with 'fill' rather than 'eofill' * .appveyor.yml: AppVeyor: updated ttfautohint revision to 1.8.2-2 2019-01-14 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.6.2 2019-01-11 Martin Gieseking * src/psdefs.cpp, tests/PSInterpreterTest.cpp: properly apply current scale values to line properties * src/psdefs.cpp: prevent visible side-effects of PS operator 'stringwidth' According to the PS manual, p. 699, stringwidth may execute the path operators of the glyph descriptions. This led to visible fragments in the SVG graphics. 2019-01-08 Martin Gieseking * doc/db2html.xsl: manpage: fixed wrongly nested list elements * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl, doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, src/Bezier.hpp, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.hpp, src/Calculator.cpp, src/Calculator.hpp, src/CharMapID.cpp, src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/Directory.cpp, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, src/GraphicsPath.hpp, src/HashFunction.cpp, src/HashFunction.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, src/Length.cpp, src/Length.hpp, src/MD5HashFunction.hpp, src/Makefile.am, src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, src/Message.cpp, src/Message.hpp, src/MessageException.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/PDFParser.cpp, src/PDFParser.hpp, src/PDFToSVG.hpp, src/PSFilter.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PSPattern.cpp, src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.hpp, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, src/SignalHandler.hpp, src/SourceInput.cpp, src/SourceInput.hpp, src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, src/XMLString.hpp, src/XXHashFunction.hpp, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, src/options.dtd, src/options.xml, src/psdefs.cpp, src/utility.cpp, src/utility.hpp, src/version.hpp, src/version.hpp.in, src/windows.hpp, tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontCacheTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/GhostscriptTest.cpp, tests/GraphicsPathTest.cpp, tests/HashFunctionTest.cpp, tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PDFParserTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, tests/UnicodeTest.cpp, tests/UtilityTest.cpp, tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, tests/normalize.xsl, tests/testmain.cpp: updated year in copyright statements to 2019 2018-12-13 Martin Gieseking * libs/potrace/CMakeLists.txt, libs/variant/CMakeLists.txt: removed redundant files 2018-11-27 Martin Gieseking * src/CommandLine.hpp, src/options.xml: updated description in --help output 2018-11-06 Martin Gieseking * configure.ac, doc/Makefile.am, libs/defs.am, src/Makefile.am, tests/Makefile.am, tests/create-makefile: Makefiles: replaced $(top_srcdir) with $(dvisvgm_srcdir) to simplify maintenance of dvisvgm in TeX Live 2018-11-03 Martin Gieseking * m4/ax_cxx_compile_stdcxx.m4: updated ax_cxx_compile_stdcxx.m4 to version 10 2018-10-30 Martin Gieseking * libs/brotli/Makefile.am, libs/defs.am, libs/potrace/Makefile.am, libs/woff2/Makefile.am, libs/xxHash/Makefile.am: use negation in Makefile conditionals 2018-10-23 Martin Gieseking * libs/brotli/common/platform.h, libs/brotli/common/transform.c, libs/brotli/common/version.h, libs/brotli/enc/backward_references_hq.c, libs/brotli/enc/backward_references_hq.h, libs/brotli/enc/backward_references_inc.h, libs/brotli/enc/encode.c, libs/brotli/enc/hash.h, libs/brotli/enc/hash_composite_inc.h, libs/brotli/enc/hash_longest_match64_inc.h, libs/brotli/enc/hash_longest_match_inc.h, libs/brotli/enc/hash_rolling_inc.h, libs/brotli/enc/hash_to_binary_tree_inc.h: updated brotli to version 1.0.7 2018-10-11 Martin Gieseking * NEWS: updated NEWS 2018-10-10 Martin Gieseking * doc/Makefile.am: only create intermediate XML files if dvisvgm.txt.1 has changed * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.6.1 2018-10-09 Martin Gieseking * doc/Makefile.am: ensure dvisvgm.txt.in is distributed with the tarball * configure.ac, libs/brotli/Makefile.am, libs/defs.am, libs/potrace/Makefile.am, libs/woff2/Makefile.am, libs/xxHash/Makefile.am, src/Makefile.am, tests/Makefile.am, tests/create-makefile: relaxed semantics of config option --disable-bundled-libs If some of the system libraries brotli, potrace, woff2, and xxhash can't be found, the bundled libraries are used as a fallback, even if option --disable-bundled-libs is given. (closes #94) 2018-10-04 Martin Gieseking * configure.ac: added configuration option --disable-manpage (closes #93) 2018-10-02 Martin Gieseking * configure.ac, doc/Makefile.am: don't update man page if asciidoc file hasn't changed 2018-09-20 Martin Gieseking * libs/brotli/common/platform.h, libs/brotli/common/version.h, libs/brotli/enc/metablock.c: updated brotli to version 1.0.6 2018-09-13 Martin Gieseking * src/XXHashFunction.hpp: fixed constexpr issue occured with gcc 4.8 2018-09-09 Martin Gieseking * doc/Makefile.am: add dvisvgm.sty to distributed files 2018-09-07 Martin Gieseking * src/Ghostscript.cpp: call RegGetValueA() with correct buffer size * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.6 * NEWS: updated NEWS 2018-09-05 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/dvisvgm.cpp: use enums for hash parameters rather than strings * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/DVIToSVG.hpp: added optional parameter 'replace' to --page-hashes 2018-09-04 Martin Gieseking * src/DVIReader.cpp, src/DVIToSVG.cpp: reset hash function before computing a page hash 2018-09-03 Martin Gieseking * libs/clipper/clipper.cpp: clipper: initialize TEdge by constructor instead of memset() 2018-09-01 Martin Gieseking * configure.ac: removed redundant check for potrace from configure 2018-08-31 Martin Gieseking * libs/variant/include/mpark/config.hpp: VC: fixed failing compilation of mpark::variant https://github.com/mpark/variant/commit/4e3e7f88f03f513622daa973 2018-08-30 Martin Gieseking * .appveyor.yml: AppVeyor: use VS 2017 version 15.7 instead of 15.8 Version 15.8 of Visual Studio 2017 introduced a compiler bug that prevents compiling mpark::variant (https://github.com/mpark/variant/issues/48). 2018-08-28 Martin Gieseking * src/XXHashFunction.hpp, src/dvisvgm.cpp: use wrapper class to get the xxhash version number * src/HashFunction.cpp, src/HashFunction.hpp, src/MD5HashFunction.hpp, src/XXHashFunction.hpp, tests/HashFunctionTest.cpp: added extended create functions to hash classes * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/dvisvgm.cpp, src/options.xml, tests/SVGOutputTest.cpp: replaced pattern variable %h with %hd; added %ho and %hc In order to recognize changes in the command-line options that may affect the SVG output, %ho and %hc have been introduced. The former expands to a 32-bit hash reflecting the command-line options, the latter combines this information with the hash computed from the DVI page data. 2018-08-27 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/dvisvgm.cpp: option --page-hashes accepts multiple modifiers now 2018-08-24 Martin Gieseking * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/HashFunction.cpp, src/HashFunction.hpp, src/SVGOutput.hpp, src/dvisvgm.cpp, tests/CommandLineTest.cpp: added optional parameter 'list' to option --page-hashes * src/dvisvgm.cpp: fixed wrong directory separators shown in output of --cache 2018-08-22 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/DVIToSVG.hpp, src/dvisvgm.cpp, src/options.xml: added command-line option --page-hashes to enable hashing functionality 2018-08-21 Martin Gieseking * AUTHORS, README, README.md, configure.ac, libs/Makefile.am, libs/md5/Makefile.am, libs/md5/md5.c, libs/md5/md5.h, src/HashFunction.cpp, src/HashFunction.hpp, src/MD5HashFunction.hpp, src/Makefile.am, src/XXHashFunction.hpp, tests/HashFunctionTest.cpp, tests/Makefile.am, tests/create-makefile: added classes to compute MD5, XXH32, and XXH64 hash values * src/BasicDVIReader.hpp, src/DVIReader.cpp: added validity checks for bop offsets * src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/HashFunction.cpp, src/HashFunction.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp: added optional computation and evaluation of page hashes If this functionality is enabled, a hash value based on the contents of the corresponding DVI page is added to the SVG file names. Furthermore, dvisvgm skips the conversion of these pages in subsequent calls if the resulting SVG files already exist. 2018-08-18 Martin Gieseking * src/DVIReader.cpp: DVI postamble: relaxed plausibility check of the total page count 2018-08-08 Martin Gieseking * configure.ac: correctly evaluate config option --disable-bundled-libs (closes #91) 2018-08-07 Martin Gieseking * src/BasicDVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/PsSpecialHandler.cpp: getPageTransformation: replaced reference parameter with return value * src/DVIToSVGActions.hpp, src/ImageToSVG.hpp, src/PsSpecialHandler.cpp, src/SpecialActions.hpp: renamed getPageTransform; return unity matrix by default * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.5 * NEWS: updated NEWS 2018-08-02 Martin Gieseking * src/FileFinder.cpp, src/FilePath.cpp, src/FilePath.hpp, src/Ghostscript.cpp: TL32: also look for gsdll32.dll in the corresponding TL bin folder The changes are based on a patch sent by Akira Kakuto. 2018-08-01 Martin Gieseking * README: updated README * .appveyor.yml, .travis.yml: updated CI configurations; dropped potrace as an external dependency * configure.ac, src/SourceInput.cpp: set umask before calling mkstemp() Coverity complains about calling mkstemp() without securely setting umask first. If umask() is available, it's now called so that the permissions of temporary files result to 0600. * src/BoundingBox.cpp: show lock state when printing a bounding box object * src/DVIToSVG.cpp: apply user transformations even if the bounding box is locked 2018-07-30 Martin Gieseking * src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/dvisvgm.cpp: apply --transform commands in --eps and --pdf mode too * src/DVIToSVG.cpp, src/Length.cpp, src/Length.hpp, tests/LengthTest.cpp: added function to retrieve all units supported by the Length class * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/ImageToSVG.cpp, tests/CalculatorTest.cpp: allow to use all supported units in --transform commands * Makefile.am: propagate --enable-bundled-libs to "distcheck" * AUTHORS, README.md, configure.ac, libs/Makefile.am, libs/potrace/CMakeLists.txt, libs/potrace/Makefile.am, libs/potrace/auxiliary.h, libs/potrace/bitmap.h, libs/potrace/config.h, libs/potrace/curve.c, libs/potrace/curve.h, libs/potrace/decompose.c, libs/potrace/decompose.h, libs/potrace/lists.h, libs/potrace/potracelib.c, libs/potrace/potracelib.h, libs/potrace/progress.h, libs/potrace/trace.c, libs/potrace/trace.h, src/Makefile.am: added potrace to the bundled libraries again * tests/Makefile.am, tests/create-makefile: link tests only against bundled libs if configured with --enable-bundled-libs * src/ImageToSVG.cpp: changed type of exception thrown in case of invalid EPS/PDF files 2018-07-29 Martin Gieseking * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: replaced internal PS operator @getpdfpagebox with PSInterpreter method 2018-07-28 Martin Gieseking * src/dvisvgm.cpp: removed redundant code from main() * README.md, doc/dvisvgm.txt.in, src/EPSToSVG.hpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/PDFToSVG.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/dvisvgm.cpp, src/psdefs.cpp: PDF conversion: allow to specify the pages to process 2018-07-25 Martin Gieseking * .travis.yml, README.md, configure.ac, libs/brotli/Makefile.am, libs/woff2/Makefile.am, libs/xxHash/Makefile.am, src/Makefile.am, src/dvisvgm.cpp: added config option --enable-bundled-libs If this option is given, the bundled libraries brotli, woff2, and xxhash are built and statically linked. Otherwise, the configure script looks for the corresponing system libraries and links dvisvgm against those. (closes #90) 2018-07-19 Martin Gieseking * NEWS: fixed date in NEWS 2018-07-18 Martin Gieseking * configure.ac, doc/Makefile.am: don't try to build manpage if required tools are missing * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.4.2 * NEWS: updated NEWS 2018-07-17 Martin Gieseking * src/HyperlinkManager.cpp: reduced extent of hyperlinked areas to get a tight bbox 2018-07-15 Martin Gieseking * src/PsSpecialHandler.cpp: use unique_ptr in bbox debug code * src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp: removed redundant method PSPreviewFilter::getBorders() * src/PSPreviewFilter.cpp, src/PsSpecialHandler.cpp: fixed computation of preview extents (closes #89) * src/PsSpecialHandler.cpp: prevent warning about missing psfile "/dev/null" 2018-07-07 Martin Gieseking * NEWS: updated NEWS * .gitattributes: added linguist settings to .gitattributes https://github.com/github/linguist 2018-07-06 Martin Gieseking * libs/brotli/Makefile.am, libs/brotli/common/dictionary.c, libs/brotli/common/platform.h, libs/brotli/common/transform.c, libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, libs/brotli/enc/brotli_bit_stream.h, libs/brotli/enc/command.h, libs/brotli/enc/compress_fragment.c, libs/brotli/enc/compress_fragment_two_pass.c, libs/brotli/enc/encode.c, libs/brotli/enc/encoder_dict.h, libs/brotli/enc/fast_log.h, libs/brotli/enc/hash.h, libs/brotli/enc/hash_composite_inc.h, libs/brotli/enc/hash_rolling_inc.h, libs/brotli/enc/quality.h, libs/brotli/enc/static_dict.c, libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/port.h, libs/brotli/include/brotli/types.h: updated brotli to version 1.0.5 * README, README.md, doc/dvisvgm.txt.in, libs/ff-woff/README.md: updated links to new project website dvisvgm.de * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.4.1 2018-07-04 Martin Gieseking * doc/dvisvgm.txt.in: manpage: updated external links 2018-06-23 Martin Gieseking * libs/woff2/include/woff2/version.h, libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, libs/woff2/src/woff2_enc.cc: updated woff2 to 1.0.2 2018-06-08 Martin Gieseking * src/SourceInput.cpp, src/SourceInput.hpp: moved handling of temporary files to separate class 2018-05-30 Martin Gieseking * src/DVIToSVGActions.cpp, src/ImageToSVG.cpp: fixed evaluation of progress delay 2018-05-09 Martin Gieseking * doc/dvisvgm.txt.in: minor fixes in manpage 2018-05-04 Martin Gieseking * doc/conf-dblatex-pdf.xsl: list options and specials in PDF bookmarks of manpage * doc/dvisvgm.txt.in: manpage: ordered options alphabetically according to long name 2018-05-03 Martin Gieseking * NEWS, README, README.md: updated NEWS and README 2018-05-02 Martin Gieseking * src/Calculator.cpp: catch exception by reference rather than by value 2018-04-30 Martin Gieseking * src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.cpp: changed signature of EPSFile::bbox() * src/CLCommandLine.cpp: cmdline: fixed handling of 'usage' section * src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/ImageToSVG.cpp, src/ImageToSVG.hpp, src/Makefile.am: derive EPSToSVG from abstract class ImageToSVG * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/Makefile.am, src/PDFToSVG.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/dvisvgm.cpp, src/options.xml, src/psdefs.cpp, tests/CommandLineTest.cpp, tests/PSInterpreterTest.cpp: added option --pdf to convert PDF files to SVG * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.4 2018-04-28 Martin Gieseking * src/BoundingBox.cpp: swap wrongly assigned variables (doesn't affect behavior) 2018-04-26 Martin Gieseking * src/PsSpecialHandler.cpp: psfile: use operator 'run' to simplify execution of (E)PS files * src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: added special pdffile to embed PDF graphics * src/PsSpecialHandler.cpp: apply outer transformations to psfile/pdffile graphics 2018-04-20 Martin Gieseking * src/Ghostscript.cpp, src/Ghostscript.hpp, src/dvisvgm.cpp, tests/GhostscriptTest.cpp: added function to get numeric GS revision * src/PSInterpreter.cpp, src/PSInterpreter.hpp: moved GS init options to init method * src/PsSpecialHandler.cpp: replaced str2double() with stod(); added check for zero bbox * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, tests/ColorSpecialTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/PapersizeSpecialTest.cpp, tests/TpicSpecialTest.cpp: changed type of \special prefix from const char* to string * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SpecialHandler.hpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp: removed const from result vector of SpecialHandler::prefixes() 2018-04-19 Martin Gieseking * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: updated xxHash to version 0.6.5 * src/psdefs.cpp: fixed handling of PS operator 'setgstate' 2018-04-16 Martin Gieseking * m4/ax_cxx_compile_stdcxx.m4: updated ax_cxx_compile_stdcxx.m4 to version 8 2018-04-13 Martin Gieseking * src/BgColorSpecialHandler.hpp, src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.hpp, src/HtmlSpecialHandler.hpp, src/NoPsSpecialHandler.hpp, src/PapersizeSpecialHandler.hpp, src/PdfSpecialHandler.hpp, src/PsSpecialHandler.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, src/TpicSpecialHandler.hpp: merged listener methods into SpecialHandler class * src/CommandLine.hpp: made opt2cpp compatible with Python 3 2018-04-11 Martin Gieseking * libs/brotli/Makefile.am, libs/brotli/common/constants.h, libs/brotli/common/platform.h, libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, libs/brotli/enc/backward_references_hq.c, libs/brotli/enc/command.h, libs/brotli/enc/context.h, libs/brotli/enc/encode.c, libs/brotli/enc/memory.h, libs/brotli/enc/metablock.c, libs/brotli/enc/metablock.h, libs/brotli/enc/params.h, libs/brotli/enc/port.h, libs/brotli/enc/quality.h, libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/decode.h, libs/brotli/include/brotli/encode.h: updated brotli to version 1.0.4 2018-03-29 Martin Gieseking * doc/dvisvgm.txt.in, src/SVGOutput.cpp, src/ZLibOutputStream.hpp, src/dvisvgm.cpp: enabled to output compressed SVG data to stdout * src/dvisvgm.cpp: renamed SourceInput variable 2018-03-28 Martin Gieseking * src/dvisvgm.cpp: simplified main() function 2018-03-27 Martin Gieseking * doc/dvisvgm.txt.in, src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CommandLine.hpp, src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/FileSystem.cpp, src/Makefile.am, src/PsSpecialHandler.cpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/SourceInput.cpp, src/SourceInput.hpp, src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.cpp, tests/SVGOutputTest.cpp: added option to read DVI/EPS input from stdin (closes #86) 2018-03-26 Martin Gieseking * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: PS handler: added processing of .setshapealpha and .setblendmode 2018-03-23 Martin Gieseking * src/Matrix.cpp, src/Matrix.hpp, tests/MatrixTest.cpp: added initlist constructor to class Matrix * src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: psfile special: added evaluation of operator 'setpagedevice' * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.3.5 * NEWS: updated NEWS 2018-03-21 Martin Gieseking * src/PsSpecialHandler.cpp: added missing PS header required to evaluate color names * src/PSInterpreter.cpp, src/psdefs.cpp: drop GS option -dSAFER to stay compatible with GS 9.23 2018-03-13 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.3.4 * NEWS: updated NEWS 2018-03-12 Martin Gieseking * tests/data/Makefile.am: add required test file cmr10.pfb to source tarballs (closes #87) 2018-03-07 Martin Gieseking * src/EmSpecialHandler.hpp, src/XMLDocument.hpp, src/dvisvgm.cpp: replaced memory-inefficient lists with vectors * src/XMLNode.cpp, src/XMLNode.hpp: replaced lists of XML element pointers with deques * src/CLCommandLine.cpp: fixed message printed if command-line contains an isolated '-' 2018-03-03 Martin Gieseking * libs/brotli/Makefile.am, libs/brotli/common/constants.h, libs/brotli/common/context.h, libs/brotli/common/dictionary.h, libs/brotli/common/platform.h, libs/brotli/common/transform.h, libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, libs/brotli/enc/backward_references.h, libs/brotli/enc/backward_references_hq.c, libs/brotli/enc/backward_references_hq.h, libs/brotli/enc/backward_references_inc.h, libs/brotli/enc/bit_cost.c, libs/brotli/enc/bit_cost.h, libs/brotli/enc/block_encoder_inc.h, libs/brotli/enc/block_splitter.c, libs/brotli/enc/block_splitter.h, libs/brotli/enc/block_splitter_inc.h, libs/brotli/enc/brotli_bit_stream.c, libs/brotli/enc/brotli_bit_stream.h, libs/brotli/enc/cluster.c, libs/brotli/enc/cluster.h, libs/brotli/enc/command.h, libs/brotli/enc/compress_fragment.c, libs/brotli/enc/compress_fragment.h, libs/brotli/enc/compress_fragment_two_pass.c, libs/brotli/enc/compress_fragment_two_pass.h, libs/brotli/enc/dictionary_hash.c, libs/brotli/enc/encode.c, libs/brotli/enc/encoder_dict.c, libs/brotli/enc/encoder_dict.h, libs/brotli/enc/entropy_encode.c, libs/brotli/enc/entropy_encode.h, libs/brotli/enc/entropy_encode_static.h, libs/brotli/enc/fast_log.h, libs/brotli/enc/find_match_length.h, libs/brotli/enc/hash.h, libs/brotli/enc/hash_forgetful_chain_inc.h, libs/brotli/enc/hash_longest_match64_inc.h, libs/brotli/enc/hash_longest_match_inc.h, libs/brotli/enc/hash_longest_match_quickly_inc.h, libs/brotli/enc/hash_to_binary_tree_inc.h, libs/brotli/enc/histogram.c, libs/brotli/enc/histogram.h, libs/brotli/enc/histogram_inc.h, libs/brotli/enc/literal_cost.c, libs/brotli/enc/literal_cost.h, libs/brotli/enc/memory.c, libs/brotli/enc/memory.h, libs/brotli/enc/metablock.c, libs/brotli/enc/metablock.h, libs/brotli/enc/metablock_inc.h, libs/brotli/enc/params.h, libs/brotli/enc/prefix.h, libs/brotli/enc/quality.h, libs/brotli/enc/ringbuffer.h, libs/brotli/enc/static_dict.c, libs/brotli/enc/static_dict.h, libs/brotli/enc/static_dict_lut.h, libs/brotli/enc/utf8_util.c, libs/brotli/enc/utf8_util.h, libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/decode.h, libs/brotli/include/brotli/encode.h, libs/brotli/include/brotli/port.h: updated brotli to version 1.0.3 2018-02-20 Martin Gieseking * doc/dvisvgm.txt.in: minor changes of the manpage * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.3.3 * NEWS: updated NEWS 2018-02-19 Martin Gieseking * src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp: don't remove fontmap definitions before processing pdf:mapXXX specials * src/FontEngine.cpp: prevent creating string from nullptr 2018-02-09 Martin Gieseking * src/FileSystem.cpp, src/FontCache.cpp, src/FontMap.cpp, src/GFGlyphTracer.cpp, src/MetafontWrapper.cpp, src/PsSpecialHandler.cpp, src/utility.cpp, tests/DVIReaderTest.cpp, tests/GFReaderTest.cpp, tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: removed calls of c_str() redundant since C++11 * src/StreamReader.cpp: replaced c_str() with data() in StreamReader 2018-02-08 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.3.2 * src/TpicSpecialHandler.cpp: prevent potential division by 0 * src/dvisvgm.cpp: prevent dereferencing nullptr (CACHE_PATH) * NEWS: updated NEWS 2018-02-05 Martin Gieseking * src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp: don't update the SVG position after DVIActions::setChar() Otherwise, all characters get an explicit x position assigned even if it's already reached by applying the character's advance width. 2018-01-27 Hironobu Yamashita * src/JFM.cpp: JFM.cpp: support new JFM spec introduced in TeX Live r46452 * src/JFM.cpp, src/JFM.hpp, tests/JFMReaderTest.cpp: adapted types to conform new JFM format * src/options.xml: updated year in options.xml * src/FileFinder.cpp, src/Process.cpp: relaxed reading from process pipe; fixed getting output of kpsewhich (Win only) 2018-01-16 Martin Gieseking * src/CMap.hpp, src/RangeMap.hpp, src/ToUnicodeMap.cpp, tests/RangeMapTest.cpp, tests/ToUnicodeMapTest.cpp: renamed RangeMap::size() to RangeMap::numRanges() 2018-01-14 Martin Gieseking * src/RangeMap.cpp, src/RangeMap.hpp: added iterator and some getters to RangeMap 2018-01-12 Martin Gieseking * .appveyor.yml: AppVeyor: updated to FreeType 2.9 and ttfautohint 1.8.1 * .appveyor.yml: AppVeyor: fixed download link of ttfautohint-dll * NEWS: updated NEWS 2018-01-11 Martin Gieseking * doc/dvisvgm.txt.in: manpage: reworded info about option --bbox=preview (closes #83) 2018-01-09 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.3.1 2018-01-03 Martin Gieseking * src/CMapReader.cpp, src/Directory.cpp, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, src/Font.cpp, src/FontCache.cpp, src/FontCache.hpp, src/FontMap.cpp, src/FontMetrics.cpp, src/FontMetrics.hpp, src/MetafontWrapper.cpp: replaced some C string parameters with C++ strings 2018-01-02 Martin Gieseking * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-db-refentry.xsl, doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, libs/ff-woff/fontforge/tmpfile2.cpp, src/AGLTable.hpp, src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, src/Bezier.hpp, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.hpp, src/Calculator.cpp, src/Calculator.hpp, src/CharMapID.cpp, src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/Directory.cpp, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, src/GraphicsPath.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, src/Length.cpp, src/Length.hpp, src/Makefile.am, src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, src/Message.cpp, src/Message.hpp, src/MessageException.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/PDFParser.cpp, src/PDFParser.hpp, src/PSFilter.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PSPattern.cpp, src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.hpp, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, src/SignalHandler.hpp, src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, src/TFM.hpp, src/TTFAutohint.cpp, src/TTFAutohint.hpp, src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/TrueTypeFont.cpp, src/TrueTypeFont.hpp, src/Unicode.cpp, src/Unicode.hpp, src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, src/XMLString.hpp, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, src/options.dtd, src/options.xml, src/psdefs.cpp, src/utility.cpp, src/utility.hpp, src/version.hpp, src/version.hpp.in, src/windows.hpp, tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DVIReaderTest.cpp, tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontCacheTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/GhostscriptTest.cpp, tests/GraphicsPathTest.cpp, tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PDFParserTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/PapersizeSpecialTest.cpp, tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, tests/SpecialManagerTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/StringMatcherTest.cpp, tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/TpicSpecialTest.cpp, tests/TriangularPatchTest.cpp, tests/UnicodeTest.cpp, tests/UtilityTest.cpp, tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, tests/normalize.xsl, tests/testmain.cpp: updated year in copyright statements to 2018 * src/dvisvgm.cpp: avoid potential dangling string pointer to --fontmap argument * src/Font.cpp: fixed char width of fonts slanted by style option (closes #82) 2017-12-31 Martin Gieseking * src/TTFAutohint.hpp: don't declare member variables of TTFAutohint if ttfautohint is not available * src/FontWriter.cpp: keep unhinted TTF if autohinting failed 2017-12-28 Martin Gieseking * .appveyor.yml: AppVeyor: download and install ttfautohint headers * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.3 * NEWS, README, README.md: updated README and NEWS 2017-12-27 Martin Gieseking * src/DLLoader.cpp, src/DLLoader.hpp, src/Ghostscript.cpp, src/TTFAutohint.cpp: simplify function to load a symbol from a dynamic library 2017-12-23 Martin Gieseking * configure.ac, src/DLLoader.cpp, src/DLLoader.hpp, src/FontWriter.cpp, src/Makefile.am, src/TTFAutohint.cpp, src/TTFAutohint.hpp, src/dvisvgm.cpp: added code to load libttfautohint dynamically at runtime 2017-12-22 Martin Gieseking * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: updated xxHash to version 0.6.4 2017-12-21 Martin Gieseking * tests/gtest/include/gtest/gtest-param-test.h, tests/gtest/include/gtest/gtest-printers.h, tests/gtest/include/gtest/gtest-spi.h, tests/gtest/include/gtest/gtest-typed-test.h, tests/gtest/include/gtest/gtest.h, tests/gtest/include/gtest/internal/custom/gtest-port.h, tests/gtest/include/gtest/internal/custom/gtest.h, tests/gtest/include/gtest/internal/gtest-internal.h, tests/gtest/include/gtest/internal/gtest-param-util-generated.h, tests/gtest/include/gtest/internal/gtest-param-util.h, tests/gtest/include/gtest/internal/gtest-port-arch.h, tests/gtest/include/gtest/internal/gtest-port.h, tests/gtest/src/gtest-death-test.cc, tests/gtest/src/gtest-internal-inl.h, tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, tests/gtest/src/gtest.cc: updated gtest 2017-12-19 Martin Gieseking * configure.ac: configure: dropped check of outdated Ghostscript version * configure.ac, src/Makefile.am: configure: added --with-kpathsea to set the path of the kpathsea devel files closes #71 2017-12-18 Martin Gieseking * src/psdefs.cpp: psdefs: replaced '6 array' with 'matrix' 2017-12-17 Martin Gieseking * libs/woff2/Makefile.am, libs/woff2/include/woff2/file.h, src/FontWriter.cpp, src/FontWriter.hpp, src/Makefile.am, src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, src/TrueTypeFont.cpp, src/TrueTypeFont.hpp, src/ffwrapper.c, src/ffwrapper.h, src/utility.cpp, src/utility.hpp: replaced ff_sfd_to_woff() with TrueTypeFont::writeWOFF() * configure.ac, src/FontWriter.cpp, src/Makefile.am, src/dvisvgm.cpp: added optional support for ttfautohint 2017-12-14 Martin Gieseking * configure.ac, libs/Makefile.am, libs/brotli/LICENSE, libs/brotli/Makefile.am, libs/brotli/common/constants.h, libs/brotli/common/dictionary.c, libs/brotli/common/dictionary.h, libs/brotli/common/version.h, libs/brotli/enc/backward_references.c, libs/brotli/enc/backward_references.h, libs/brotli/enc/backward_references_hq.c, libs/brotli/enc/backward_references_hq.h, libs/brotli/enc/backward_references_inc.h, libs/brotli/enc/bit_cost.c, libs/brotli/enc/bit_cost.h, libs/brotli/enc/bit_cost_inc.h, libs/brotli/enc/block_encoder_inc.h, libs/brotli/enc/block_splitter.c, libs/brotli/enc/block_splitter.h, libs/brotli/enc/block_splitter_inc.h, libs/brotli/enc/brotli_bit_stream.c, libs/brotli/enc/brotli_bit_stream.h, libs/brotli/enc/cluster.c, libs/brotli/enc/cluster.h, libs/brotli/enc/cluster_inc.h, libs/brotli/enc/command.h, libs/brotli/enc/compress_fragment.c, libs/brotli/enc/compress_fragment.h, libs/brotli/enc/compress_fragment_two_pass.c, libs/brotli/enc/compress_fragment_two_pass.h, libs/brotli/enc/context.h, libs/brotli/enc/dictionary_hash.c, libs/brotli/enc/dictionary_hash.h, libs/brotli/enc/encode.c, libs/brotli/enc/entropy_encode.c, libs/brotli/enc/entropy_encode.h, libs/brotli/enc/entropy_encode_static.h, libs/brotli/enc/fast_log.h, libs/brotli/enc/find_match_length.h, libs/brotli/enc/hash.h, libs/brotli/enc/hash_forgetful_chain_inc.h, libs/brotli/enc/hash_longest_match64_inc.h, libs/brotli/enc/hash_longest_match_inc.h, libs/brotli/enc/hash_longest_match_quickly_inc.h, libs/brotli/enc/hash_to_binary_tree_inc.h, libs/brotli/enc/histogram.c, libs/brotli/enc/histogram.h, libs/brotli/enc/histogram_inc.h, libs/brotli/enc/literal_cost.c, libs/brotli/enc/literal_cost.h, libs/brotli/enc/memory.c, libs/brotli/enc/memory.h, libs/brotli/enc/metablock.c, libs/brotli/enc/metablock.h, libs/brotli/enc/metablock_inc.h, libs/brotli/enc/port.h, libs/brotli/enc/prefix.h, libs/brotli/enc/quality.h, libs/brotli/enc/ringbuffer.h, libs/brotli/enc/static_dict.c, libs/brotli/enc/static_dict.h, libs/brotli/enc/static_dict_lut.h, libs/brotli/enc/utf8_util.c, libs/brotli/enc/utf8_util.h, libs/brotli/enc/write_bits.h, libs/brotli/include/brotli/decode.h, libs/brotli/include/brotli/encode.h, libs/brotli/include/brotli/port.h, libs/brotli/include/brotli/types.h, libs/woff2/Makefile.am, libs/woff2/brotli/LICENSE, libs/woff2/brotli/Makefile.am, libs/woff2/brotli/common/constants.h, libs/woff2/brotli/common/dictionary.c, libs/woff2/brotli/common/dictionary.h, libs/woff2/brotli/common/version.h, libs/woff2/brotli/enc/backward_references.c, libs/woff2/brotli/enc/backward_references.h, libs/woff2/brotli/enc/backward_references_hq.c, libs/woff2/brotli/enc/backward_references_hq.h, libs/woff2/brotli/enc/backward_references_inc.h, libs/woff2/brotli/enc/bit_cost.c, libs/woff2/brotli/enc/bit_cost.h, libs/woff2/brotli/enc/bit_cost_inc.h, libs/woff2/brotli/enc/block_encoder_inc.h, libs/woff2/brotli/enc/block_splitter.c, libs/woff2/brotli/enc/block_splitter.h, libs/woff2/brotli/enc/block_splitter_inc.h, libs/woff2/brotli/enc/brotli_bit_stream.c, libs/woff2/brotli/enc/brotli_bit_stream.h, libs/woff2/brotli/enc/cluster.c, libs/woff2/brotli/enc/cluster.h, libs/woff2/brotli/enc/cluster_inc.h, libs/woff2/brotli/enc/command.h, libs/woff2/brotli/enc/compress_fragment.c, libs/woff2/brotli/enc/compress_fragment.h, libs/woff2/brotli/enc/compress_fragment_two_pass.c, libs/woff2/brotli/enc/compress_fragment_two_pass.h, libs/woff2/brotli/enc/context.h, libs/woff2/brotli/enc/dictionary_hash.c, libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.c, libs/woff2/brotli/enc/entropy_encode.c, libs/woff2/brotli/enc/entropy_encode.h, libs/woff2/brotli/enc/entropy_encode_static.h, libs/woff2/brotli/enc/fast_log.h, libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, libs/woff2/brotli/enc/hash_longest_match64_inc.h, libs/woff2/brotli/enc/hash_longest_match_inc.h, libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, libs/woff2/brotli/enc/hash_to_binary_tree_inc.h, libs/woff2/brotli/enc/histogram.c, libs/woff2/brotli/enc/histogram.h, libs/woff2/brotli/enc/histogram_inc.h, libs/woff2/brotli/enc/literal_cost.c, libs/woff2/brotli/enc/literal_cost.h, libs/woff2/brotli/enc/memory.c, libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/metablock.c, libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/metablock_inc.h, libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/prefix.h, libs/woff2/brotli/enc/quality.h, libs/woff2/brotli/enc/ringbuffer.h, libs/woff2/brotli/enc/static_dict.c, libs/woff2/brotli/enc/static_dict.h, libs/woff2/brotli/enc/static_dict_lut.h, libs/woff2/brotli/enc/utf8_util.c, libs/woff2/brotli/enc/utf8_util.h, libs/woff2/brotli/enc/write_bits.h, libs/woff2/brotli/include/brotli/decode.h, libs/woff2/brotli/include/brotli/encode.h, libs/woff2/brotli/include/brotli/port.h, libs/woff2/brotli/include/brotli/types.h, src/Makefile.am, tests/Makefile.am, tests/create-makefile: moved brotli from woff2 to libs folder 2017-12-12 Martin Gieseking * libs/variant/include/mpark/config.hpp, libs/variant/include/mpark/lib.hpp, libs/variant/include/mpark/variant.hpp: updated mpark::variant to https://github.com/mpark/variant/commit/382014b fixes a build error introduced with MSVC 19.12 2017-12-11 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.2.3 * NEWS: updated NEWS 2017-11-29 Martin Gieseking * libs/woff2/brotli/common/dictionary.h, libs/woff2/brotli/common/version.h, libs/woff2/brotli/enc/backward_references_hq.c, libs/woff2/brotli/enc/backward_references_hq.h, libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/quality.h, libs/woff2/brotli/include/brotli/decode.h, libs/woff2/brotli/include/brotli/encode.h: updated brotli to version 1.0.2 2017-11-24 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/BoundingBox.cpp, src/BoundingBox.hpp, src/Color.cpp, src/PathClipper.cpp, src/SVGTree.cpp, tests/BoundingBoxTest.cpp: minor code cleanup and improvements * src/DependencyGraph.hpp: simplified DependencyGraph::GraphNode 2017-11-23 Martin Gieseking * tests/TpicSpecialTest.cpp: added missing initializers in TpicSpecialTest * tests/EmSpecialTest.cpp: added missing initializers in EmSpecialTest * src/DependencyGraph.hpp: fixed dangling pointer issue in DependencyGraph * src/Makefile.am, tests/Makefile.am, tests/create-makefile: suppress warnings regarding 'mismatched tags' (class/struct) https://gcc.gnu.org/wiki/FAQ#Why_GCC_does_not_warn_for_mismatch_between_struct_and_class_.28-Wmismatched-tags.29_.3F 2017-11-22 Martin Gieseking * src/PSPattern.cpp, src/SVGCharHandler.cpp, src/SVGTree.cpp, src/TpicSpecialHandler.cpp: removed redundant calls of std::move() * src/Subfont.cpp, src/Subfont.hpp, tests/CMapManagerTest.cpp, tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/SubfontTest.cpp, tests/create-makefile, tests/testmain.cpp, tests/testutil.hpp: tests: moved common initializations to testmain.cpp * src/DVIReader.hpp, tests/DVIReaderTest.cpp, tests/Makefile.am, tests/data/Makefile.am, tests/data/cmr10.pfb, tests/data/sample_v2.dvi, tests/data/sample_v3.dvi: added test for DVIReader 2017-11-21 Martin Gieseking * Makefile.am: removed redundant lcov statement from Makefile 2017-11-20 Martin Gieseking * tests/CMapTest.cpp, tests/GFReaderTest.cpp, tests/JFMReaderTest.cpp, tests/RangeMapTest.cpp, tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/VectorStreamTest.cpp: tests: few code improvements * README.md: added donation badge to readme 2017-11-17 Martin Gieseking * src/Font.cpp, src/Font.hpp: prevent dangling pointers to font map entries (closes #79) * src/CMapManager.cpp, src/FileFinder.cpp, src/Font.cpp, src/Font.hpp, src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.hpp, src/Ghostscript.cpp, src/MiKTeXCom.cpp, src/XMLNode.cpp: replaced null pointer constants with 'nullptr' * src/XMLString.cpp, tests/TensorProductPatchTest.cpp, tests/XMLStringTest.cpp: avoid scientific notation when printing floats/doubles * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.2.2 * NEWS: updated NEWS 2017-11-13 Martin Gieseking * doc/Makefile.am: ensure tweak-db-refentry.xsl is put into the tarball * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.2.1 * NEWS, README.md: updated NEWS and README * libs/variant/include/mpark/lib.hpp, libs/variant/include/mpark/variant.hpp: updated mpark::variant to commit ea542a0 https://github.com/mpark/variant/commit/ea542a0fef86fb8c1696238b95bdaddb8ff2337c 2017-11-10 Martin Gieseking * README, README.md, doc/dvisvgm.txt.in: minor additions/fixes of manpage and README 2017-11-02 Martin Gieseking * doc/Makefile.am, doc/db2html.xsl, doc/tweak-db-refentry.xsl: manpage: avoid using 'stats' to improve portability (closes #72) 2017-10-31 Martin Gieseking * src/InputReader.cpp, src/InputReader.hpp, src/PSInterpreter.cpp: simplified code to lookup PS operators 2017-10-30 Martin Gieseking * src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: properly apply CTM to linewidth (closes #77) * src/PsSpecialHandler.hpp, src/psdefs.cpp, tests/PSInterpreterTest.cpp: call applyscalevals on every change of the CTM 2017-10-27 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/DvisvgmSpecialHandler.cpp, src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, src/HyperlinkManager.cpp, src/PSPattern.cpp, src/PSPattern.hpp, src/PsSpecialHandler.cpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, src/SVGCharPathHandler.cpp, src/SVGCharTspanTextHandler.cpp, src/SVGSingleCharTextHandler.cpp, src/SVGTree.cpp, src/SVGTree.hpp, src/ShadingPatch.hpp, src/SpecialActions.hpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/utility.hpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/TpicSpecialTest.cpp, tests/XMLNodeTest.cpp: replaced raw XMLNode pointers with unique_ptrs which helps to ensure proper ownership and simplifies deleting the corresponding objects * src/DependencyGraph.hpp, src/SVGTree.cpp, tests/DependencyGraphTest.cpp: manage heap memory in DependencyGraph with unique_ptrs 2017-10-21 Martin Gieseking * libs/ff-woff/fontforge/macbinary.c: updated link to CTAN:/tools/macutils/crc 2017-10-20 Martin Gieseking * libs/woff2/include/woff2/version.h: replaced CRLF line endings 2017-10-17 Martin Gieseking * src/CMapManager.cpp, src/CMapReader.cpp, src/CMapReader.hpp, src/DVIActions.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.hpp, src/FileFinder.cpp, src/Font.cpp, src/Font.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, src/FontMetrics.cpp, src/FontMetrics.hpp, src/PSPattern.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, src/SVGOutput.cpp, src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, src/Subfont.cpp, src/Subfont.hpp, src/XMLNode.cpp, tests/CMapReaderTest.cpp, tests/ShadingPatchTest.cpp: replaced several bare new/delete statements with unique pointers * src/dvisvgm.cpp: fixed output of option --version * src/Length.hpp, src/PageSize.cpp: added user-defined literals for some length units * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.2 * NEWS, README, README.md: updated NEWS and README 2017-10-16 Martin Gieseking * src/FontWriter.cpp: added missing #include of config.h * src/Message.cpp: check for '\0' at end of DVISVGM_COLORS * src/Subfont.cpp: don't access unique_ptr after it has been moved 2017-10-15 Martin Gieseking * src/PDFParser.cpp, src/PDFParser.hpp: replaced shared_ptr with unique_ptr in PDFParser 2017-10-13 Martin Gieseking * AUTHORS, configure.ac, doc/dvisvgm.txt.in, libs/Makefile.am, libs/variant/CMakeLists.txt, libs/variant/LICENSE.md, libs/variant/Makefile.am, libs/variant/include/mpark/in_place.hpp, libs/variant/include/mpark/lib.hpp, libs/variant/include/mpark/variant.hpp, src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/InputReader.hpp, src/Makefile.am, src/PDFParser.cpp, src/PDFParser.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, tests/Makefile.am, tests/PDFParserTest.cpp, tests/SpecialManagerTest.cpp, tests/create-makefile: added evaluation of PDF hyperlink specials (closes #74) * libs/variant/include/mpark/config.hpp: added missing config file * .travis.yml: Travis: use gcc 4.9 rather than 4.8 to compile mpark::variant correctly * tests/Makefile.am, tests/create-makefile, tests/testmain.cpp: add custom testmain to gtest.a 2017-10-11 Martin Gieseking * src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/HyperlinkManager.cpp, src/HyperlinkManager.hpp, src/Makefile.am, src/dvisvgm.cpp: separated hyperlink functionality from HtmlSpecialHandler to HyperlinkManager 2017-10-09 Martin Gieseking * libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, libs/woff2/src/woff2_enc.cc: woff2: removed unused variables to prevent compiler warnings * libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, libs/woff2/src/woff2_enc.cc: woff2: removed unused variables to prevent compiler warnings 2017-10-08 Martin Gieseking * libs/woff2/Makefile.am, libs/woff2/include/woff2/decode.h, libs/woff2/include/woff2/encode.h, libs/woff2/include/woff2/file.h, libs/woff2/include/woff2/output.h, libs/woff2/include/woff2/version.h, libs/woff2/src/buffer.h, libs/woff2/src/file.h, libs/woff2/src/font.cc, libs/woff2/src/font.h, libs/woff2/src/glyph.cc, libs/woff2/src/glyph.h, libs/woff2/src/normalize.cc, libs/woff2/src/normalize.h, libs/woff2/src/port.h, libs/woff2/src/round.h, libs/woff2/src/store_bytes.h, libs/woff2/src/table_tags.cc, libs/woff2/src/table_tags.h, libs/woff2/src/transform.cc, libs/woff2/src/transform.h, libs/woff2/src/variable_length.cc, libs/woff2/src/variable_length.h, libs/woff2/src/woff2_common.cc, libs/woff2/src/woff2_common.h, libs/woff2/src/woff2_dec.h, libs/woff2/src/woff2_enc.cc, libs/woff2/src/woff2_enc.h, libs/woff2/src/woff2_out.cc, libs/woff2/src/woff2_out.h, src/FontWriter.cpp, src/Makefile.am, src/dvisvgm.cpp: updated woff2 to version 1.0.1 2017-10-06 Martin Gieseking * src/CRC32.hpp, src/SpecialManager.hpp, src/Subfont.hpp, src/XMLNode.hpp: use delete/default to remove/implement constructors * src/XMLNode.cpp, src/XMLNode.hpp: added move constructor to XMLElementNode * src/Subfont.cpp, src/Subfont.hpp, src/utility.hpp: removed stream-based constructor of SubfontException 2017-09-29 Martin Gieseking * doc/dvisvgm.txt.in, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, tests/PapersizeSpecialTest.cpp: added evaluation of pdf:pagesize specials 2017-09-28 Martin Gieseking * src/DVIToSVG.cpp, src/Length.hpp, src/PageSize.cpp, src/PageSize.hpp, src/utility.hpp, tests/PageSizeTest.cpp: use class Length in PageSize rather than plain numbers * src/BoundingBox.cpp, src/BoundingBox.hpp, src/DVIToSVG.cpp, src/utility.cpp, src/utility.hpp, tests/BoundingBoxTest.cpp, tests/UtilityTest.cpp: rewrite of BoundingBox::extractLengths() 2017-09-21 Martin Gieseking * src/TpicSpecialHandler.cpp: use isxdigit() to check hex digits * src/InputReader.cpp, src/InputReader.hpp, tests/Makefile.am, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StringMatcherTest.cpp: use Knuth-Morris-Pratt algorithm to find a string in a stream * libs/woff2/brotli/common/constants.h, libs/woff2/brotli/common/dictionary.c, libs/woff2/brotli/common/dictionary.h, libs/woff2/brotli/common/version.h, libs/woff2/brotli/enc/backward_references.c, libs/woff2/brotli/enc/backward_references_hq.c, libs/woff2/brotli/enc/backward_references_hq.h, libs/woff2/brotli/enc/backward_references_inc.h, libs/woff2/brotli/enc/block_splitter.c, libs/woff2/brotli/enc/block_splitter_inc.h, libs/woff2/brotli/enc/brotli_bit_stream.c, libs/woff2/brotli/enc/brotli_bit_stream.h, libs/woff2/brotli/enc/cluster_inc.h, libs/woff2/brotli/enc/command.h, libs/woff2/brotli/enc/compress_fragment.c, libs/woff2/brotli/enc/compress_fragment_two_pass.c, libs/woff2/brotli/enc/encode.c, libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, libs/woff2/brotli/enc/hash_longest_match64_inc.h, libs/woff2/brotli/enc/hash_longest_match_inc.h, libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, libs/woff2/brotli/enc/hash_to_binary_tree_inc.h, libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/write_bits.h, libs/woff2/brotli/include/brotli/decode.h, libs/woff2/brotli/include/brotli/encode.h: updated Brotli to version 1.0.1 2017-09-15 Martin Gieseking * src/DVIToSVG.cpp, src/SpecialManager.cpp, src/SpecialManager.hpp, src/utility.hpp, tests/Makefile.am, tests/SpecialManagerTest.cpp: use smart pointers to allocate/deallocate SpecialHandlers * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, tests/ColorSpecialTest.cpp, tests/PapersizeSpecialTest.cpp: changed return value of SpecialHandler::prefixes() to std::vector * .appveyor.yml: AppVeyor: updated FreeType to version 2.8.1 2017-09-13 Martin Gieseking * tests/FileSystemTest.cpp: close streams before removing corresponding files 2017-09-09 Martin Gieseking * src/dvisvgm.cpp: fixed number of dashes printed by option -V1 2017-09-08 Martin Gieseking * src/DependencyGraph.hpp, src/SVGTree.cpp, tests/DependencyGraphTest.cpp: DependencyGraph::getKeys(): return result, don't use reference parameter * src/FileFinder.cpp, src/Makefile.am: added missing #include; added windows.hpp to Makefile.am * tests/Makefile.am, tests/create-makefile, tests/testmain.cpp: define variable TEST_ARGV0 to make argv[0] of main() available in tests this is required to initialize kpathsea properly, for example * src/FileFinder.cpp, src/FileFinder.hpp, tests/CMapManagerTest.cpp, tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/MapLineTest.cpp, tests/SubfontTest.cpp: init libkpathsea correctly in tests to prevent assertion failures * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: updated xxHash to version 0.6.3 2017-09-07 Martin Gieseking * tests/FontCacheTest.cpp, tests/Makefile.am, tests/create-makefile: fixed path issue in FontCacheTest * src/GFReader.cpp: fixed incorrect integer type in GFReader; insert CharInfos with emplace * src/MapLine.cpp, tests/MapLineTest.cpp: treat prefix "<<" in a mapline as "<[" (skip second char) * doc/dvisvgm.txt.in, src/dvisvgm.cpp: added pdftex.map to default mapfiles 2017-09-06 Martin Gieseking * src/BasicDVIReader.cpp, src/BgColorSpecialHandler.cpp, src/Bitmap.cpp, src/BoundingBox.cpp, src/CMap.cpp, src/CMapReader.cpp, src/CRC32.cpp, src/Calculator.cpp, src/ColorSpecialHandler.cpp, src/DLLoader.cpp, src/DVIReader.cpp, src/Directory.cpp, src/EPSFile.cpp, src/EPSToSVG.cpp, src/EmSpecialHandler.cpp, src/EncFile.cpp, src/FileFinder.cpp, src/FilePath.cpp, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.cpp, src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.hpp, src/FontMetrics.cpp, src/FontWriter.cpp, src/GFGlyphTracer.cpp, src/GFTracer.cpp, src/HtmlSpecialHandler.cpp, src/InputBuffer.cpp, src/InputReader.cpp, src/JFM.cpp, src/MapLine.cpp, src/Message.cpp, src/MetafontWrapper.cpp, src/MiKTeXCom.cpp, src/NoPsSpecialHandler.cpp, src/PSInterpreter.cpp, src/PSPattern.cpp, src/PSPreviewFilter.cpp, src/PageRanges.cpp, src/PageSize.cpp, src/PathClipper.cpp, src/PdfSpecialHandler.cpp, src/SVGTree.cpp, src/SpecialManager.cpp, src/StreamWriter.cpp, src/TFM.cpp, src/VFReader.cpp, src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLString.cpp, src/dvisvgm.cpp: removed redundant #includes of config.h * src/DLLoader.hpp, src/Directory.cpp, src/Directory.hpp, src/FileSystem.cpp, src/MiKTeXCom.hpp, src/Process.cpp, src/Terminal.cpp, src/windows.hpp: disable macros min/max defined in windows.h * src/CLCommandLine.cpp, src/CMapManager.cpp, src/CMapManager.hpp, src/Calculator.cpp, src/Calculator.hpp, src/DVIToSVG.cpp, src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/FileFinder.cpp, src/Font.cpp, src/Font.hpp, src/FontCache.hpp, src/FontEncoding.cpp, src/FontManager.cpp, src/FontManager.hpp, src/FontMap.hpp, src/GFReader.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/InputReader.cpp, src/InputReader.hpp, src/Message.cpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/SpecialManager.hpp, src/Subfont.cpp, src/Subfont.hpp, tests/StreamInputBufferTest.cpp: replaced std::map with std::unordered_map where possible to increase performance 2017-09-05 Martin Gieseking * tests/DvisvgmSpecialTest.cpp: replaced constexpr with const to make clang happy * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, tests/DvisvgmSpecialTest.cpp: allow all common length units in dvisvgm specials 2017-08-27 Martin Gieseking * src/AGLTable.hpp, src/CMapReader.cpp, src/Color.cpp, src/CommandLine.hpp, src/FontWriter.cpp, tests/genhashcheck.py: use list initialization on constant std::arrays * tests/MapLineTest.cpp: added braces to prevent compiler warnings 2017-08-25 Martin Gieseking * src/CMapManager.cpp, src/DvisvgmSpecialHandler.cpp, src/Font.cpp, src/Ghostscript.cpp, src/PsSpecialHandler.cpp, src/dvisvgm.cpp, tests/DvisvgmSpecialTest.cpp: use range-based for to iterate over a fixed sequence of items 2017-08-17 Martin Gieseking * m4/ax_code_coverage.m4: updated ax_code_coverage.m4 to version 25 2017-08-06 Martin Gieseking * .appveyor.yml: AppVeyor: updated potrace to version 1.15 2017-08-01 Martin Gieseking * libs/woff2/src/font.cc, libs/woff2/src/normalize.cc, libs/woff2/src/port.h, libs/woff2/src/store_bytes.h, libs/woff2/src/woff2_common.cc, libs/woff2/src/woff2_enc.cc: updated woff2 to https://github.com/google/woff2/commits/2e09253 2017-06-26 Martin Gieseking * .appveyor.yml: AppVeyor: changed build image to VS 2017; updated FreeType to 2.8 2017-06-20 Martin Gieseking * src/PsSpecialHandler.cpp: psfile: fixed sign of y coordinates 2017-06-12 Martin Gieseking * src/PsSpecialHandler.hpp: use bp units for line width and miter limit 2017-06-09 Martin Gieseking * src/EPSToSVG.cpp: remove redundant clipPath elements also when converting EPS files 2017-05-30 Martin Gieseking * src/GraphicsPath.hpp: replaced vector with deque in class GraphicsPath due to cheaper front insertions/deletions * src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp: manage memory of ClippingStack with shared pointers - automatically deletes unreferenced path objects - avoids keeping popped (and no longer required) paths in the pool vector 2017-05-26 Martin Gieseking * src/Pair.hpp, tests/PairTest.cpp: added abs() and negation operator to class Pair * src/Matrix.hpp, src/PsSpecialHandler.cpp: respect transformation of PS state in computation of psfile position (fixes #70) * src/FileFinder.cpp, src/PsSpecialHandler.cpp: lookup psfile in texmf tree if it's not present in cwd (fixes #69) 2017-05-16 Martin Gieseking * tests/FontCacheTest.cpp, tests/Makefile.am, tests/create-makefile: FontCacheTest: write test output to $builddir/data $srcdir/data may be read-only so that the tests fail unintentionally 2017-05-15 Martin Gieseking * libs/woff2/brotli/LICENSE, libs/woff2/brotli/Makefile.am, libs/woff2/brotli/common/constants.h, libs/woff2/brotli/common/dictionary.c, libs/woff2/brotli/common/dictionary.h, libs/woff2/brotli/common/version.h, libs/woff2/brotli/enc/backward_references.c, libs/woff2/brotli/enc/backward_references.h, libs/woff2/brotli/enc/backward_references_hq.c, libs/woff2/brotli/enc/backward_references_hq.h, libs/woff2/brotli/enc/backward_references_inc.h, libs/woff2/brotli/enc/block_splitter_inc.h, libs/woff2/brotli/enc/command.h, libs/woff2/brotli/enc/compress_fragment.c, libs/woff2/brotli/enc/compress_fragment.h, libs/woff2/brotli/enc/compress_fragment_two_pass.c, libs/woff2/brotli/enc/compress_fragment_two_pass.h, libs/woff2/brotli/enc/context.h, libs/woff2/brotli/enc/dictionary_hash.c, libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.c, libs/woff2/brotli/enc/fast_log.h, libs/woff2/brotli/enc/hash.h, libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, libs/woff2/brotli/enc/hash_longest_match64_inc.h, libs/woff2/brotli/enc/hash_longest_match_inc.h, libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, libs/woff2/brotli/enc/hash_to_binary_tree_inc.h, libs/woff2/brotli/enc/histogram.c, libs/woff2/brotli/enc/literal_cost.c, libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/metablock.c, libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/quality.h, libs/woff2/brotli/enc/static_dict.c, libs/woff2/brotli/enc/static_dict.h, libs/woff2/brotli/include/brotli/decode.h, libs/woff2/brotli/include/brotli/encode.h, libs/woff2/brotli/include/brotli/port.h, libs/woff2/brotli/include/brotli/types.h: updated brotli to version 0.6.0 2017-05-11 Martin Gieseking * src/Process.cpp: close pipe if fork() fails 2017-05-08 Martin Gieseking * configure.ac, src/SignalHandler.cpp, src/SignalHandler.hpp: use sigaction() rather than signal() if possible * src/Process.cpp, src/Process.hpp: refactored Process class - use separate class to encapsulate system-dependent stuff and to ensure proper termination in case of signals or errors - prevent blocking if subprocess doesn't write anything to stdout/stderr 2017-04-28 Martin Gieseking * src/Process.cpp: quit Process::run() if child process terminated unexpectedly (fixes #68) 2017-04-27 Martin Gieseking * tests/Makefile.am, tests/create-makefile: added the FontWriter dependencies to the tests 2017-04-24 Martin Gieseking * src/Color.cpp, src/Color.hpp, src/PSPattern.cpp, tests/ColorSpecialTest.cpp: avoid implicit conversion of Color object to RGB integer * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, tests/Makefile.am, tests/TpicSpecialTest.cpp: improved the TPIC special handler and added tests for it * src/TpicSpecialHandler.cpp, tests/TpicSpecialTest.cpp: added evaluation of TPIC's 'tx' special command 2017-04-23 Martin Gieseking * src/BasicDVIReader.hpp, src/BgColorSpecialHandler.hpp, src/CLCommandLine.hpp, src/CMapManager.hpp, src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/DvisvgmSpecialHandler.hpp, src/FilePath.hpp, src/Font.hpp, src/FontCache.cpp, src/FontCache.hpp, src/FontEngine.cpp, src/FontManager.hpp, src/Ghostscript.hpp, src/Glyph.hpp, src/GraphicsPath.hpp, src/HtmlSpecialHandler.hpp, src/NumericRanges.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, src/PathClipper.hpp, src/PsSpecialHandler.hpp, src/RangeMap.hpp, src/SVGCharPathHandler.hpp, src/ShadingPatch.hpp, src/SpecialManager.hpp, src/Subfont.hpp, src/VFReader.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/dvisvgm.cpp: replaced typedefs with 'using' statements 2017-04-20 Martin Gieseking * src/Ghostscript.cpp: simplify code for looking up libgs (closes #66) 2017-04-14 Martin Gieseking * src/DLLoader.cpp, src/DLLoader.hpp: added DLLoader::loadLibrary() to assign a different library * src/DLLoader.cpp, src/DLLoader.hpp, src/Ghostscript.cpp: replaced c-string parameters of DLLoader() and loadLibrary() with std::string 2017-04-13 Toby Fleming * src/Ghostscript.cpp: Auto-detect ghostscript dynamic library on macOS 2017-03-22 Martin Gieseking * m4/ax_code_coverage.m4, m4/ax_cxx_compile_stdcxx.m4: updated m4 scripts 2017-03-03 Martin Gieseking * src/FileFinder.cpp, tests/FileFinderTest.cpp: fixed handling of absolute additional directories in FileFinder * tests/FilePathTest.cpp, tests/FontCacheTest.cpp, tests/SVGOutputTest.cpp: tests: minor path improvements 2017-03-02 Martin Gieseking * libs/woff2/src/normalize.cc, libs/woff2/src/woff2_enc.cc: woff2: removed unused variables * src/Makefile.am, src/dvisvgm.cpp: improved generation of list showing the library versions * src/Color.cpp, src/FilePath.cpp, src/FontWriter.cpp, src/PageSize.cpp, src/dvisvgm.cpp, src/utility.cpp, src/utility.hpp, tests/UtilityTest.cpp: removed side-effect from util::to_lower(); returns new modified string instead 2017-03-01 Martin Gieseking * libs/ff-woff/fontforge/nowakowskittfinstr.c: ff-woff: removed redundant variables * libs/woff2/Makefile.am, libs/woff2/brotli/Makefile.am, libs/woff2/brotli/common/constants.h, libs/woff2/brotli/common/dictionary.c, libs/woff2/brotli/common/dictionary.h, libs/woff2/brotli/common/version.h, libs/woff2/brotli/enc/backward_references.c, libs/woff2/brotli/enc/backward_references.cc, libs/woff2/brotli/enc/backward_references.h, libs/woff2/brotli/enc/backward_references_inc.h, libs/woff2/brotli/enc/bit_cost.c, libs/woff2/brotli/enc/bit_cost.h, libs/woff2/brotli/enc/bit_cost_inc.h, libs/woff2/brotli/enc/block_encoder_inc.h, libs/woff2/brotli/enc/block_splitter.c, libs/woff2/brotli/enc/block_splitter.cc, libs/woff2/brotli/enc/block_splitter.h, libs/woff2/brotli/enc/block_splitter_inc.h, libs/woff2/brotli/enc/brotli_bit_stream.c, libs/woff2/brotli/enc/brotli_bit_stream.cc, libs/woff2/brotli/enc/brotli_bit_stream.h, libs/woff2/brotli/enc/cluster.c, libs/woff2/brotli/enc/cluster.h, libs/woff2/brotli/enc/cluster_inc.h, libs/woff2/brotli/enc/command.h, libs/woff2/brotli/enc/compress_fragment.c, libs/woff2/brotli/enc/compress_fragment.cc, libs/woff2/brotli/enc/compress_fragment.h, libs/woff2/brotli/enc/compress_fragment_two_pass.c, libs/woff2/brotli/enc/compress_fragment_two_pass.cc, libs/woff2/brotli/enc/compress_fragment_two_pass.h, libs/woff2/brotli/enc/compressor.h, libs/woff2/brotli/enc/context.h, libs/woff2/brotli/enc/dictionary.cc, libs/woff2/brotli/enc/dictionary.h, libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.c, libs/woff2/brotli/enc/encode.cc, libs/woff2/brotli/enc/encode.h, libs/woff2/brotli/enc/encode_parallel.cc, libs/woff2/brotli/enc/encode_parallel.h, libs/woff2/brotli/enc/entropy_encode.c, libs/woff2/brotli/enc/entropy_encode.cc, libs/woff2/brotli/enc/entropy_encode.h, libs/woff2/brotli/enc/entropy_encode_static.h, libs/woff2/brotli/enc/fast_log.h, libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, libs/woff2/brotli/enc/hash_forgetful_chain_inc.h, libs/woff2/brotli/enc/hash_longest_match_inc.h, libs/woff2/brotli/enc/hash_longest_match_quickly_inc.h, libs/woff2/brotli/enc/histogram.c, libs/woff2/brotli/enc/histogram.cc, libs/woff2/brotli/enc/histogram.h, libs/woff2/brotli/enc/histogram_inc.h, libs/woff2/brotli/enc/literal_cost.c, libs/woff2/brotli/enc/literal_cost.cc, libs/woff2/brotli/enc/literal_cost.h, libs/woff2/brotli/enc/memory.c, libs/woff2/brotli/enc/memory.h, libs/woff2/brotli/enc/metablock.c, libs/woff2/brotli/enc/metablock.cc, libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/metablock_inc.h, libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/prefix.h, libs/woff2/brotli/enc/quality.h, libs/woff2/brotli/enc/ringbuffer.h, libs/woff2/brotli/enc/static_dict.c, libs/woff2/brotli/enc/static_dict.cc, libs/woff2/brotli/enc/static_dict.h, libs/woff2/brotli/enc/static_dict_lut.h, libs/woff2/brotli/enc/streams.cc, libs/woff2/brotli/enc/streams.h, libs/woff2/brotli/enc/transform.h, libs/woff2/brotli/enc/types.h, libs/woff2/brotli/enc/utf8_util.c, libs/woff2/brotli/enc/utf8_util.cc, libs/woff2/brotli/enc/utf8_util.h, libs/woff2/brotli/enc/write_bits.h, libs/woff2/brotli/include/brotli/decode.h, libs/woff2/brotli/include/brotli/encode.h, libs/woff2/brotli/include/brotli/port.h, libs/woff2/brotli/include/brotli/types.h, libs/woff2/src/buffer.h, libs/woff2/src/font.cc, libs/woff2/src/glyph.cc, libs/woff2/src/variable_length.cc, libs/woff2/src/woff2_dec.h, libs/woff2/src/woff2_enc.cc, src/Makefile.am: updated woff2 to https://github.com/google/woff2/commit/68e9ab5 2017-02-23 Martin Gieseking * tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, tests/FileSystemTest.cpp, tests/GraphicsPathTest.cpp, tests/JFMReaderTest.cpp, tests/MatrixTest.cpp, tests/PageRagesTest.cpp, tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, tests/ToUnicodeMapTest.cpp, tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, tests/XMLNodeTest.cpp: fixed signed/unsigned warnings in tests 2017-02-22 Martin Gieseking * libs/woff2/brotli/tools/bro.cc, libs/woff2/brotli/tools/rfc-format.py, libs/woff2/brotli/tools/version.h: removed redundant files 2017-02-20 Martin Gieseking * .appveyor.yml, .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.1.3 * NEWS: updated NEWS 2017-02-18 Martin Gieseking * libs/ff-woff/inc/ffintl.h: ff-woff: removed redundant defines and prototypes to fix build failure on Solaris * tests/genhashcheck.py: reformatted genhashcheck * tests/BezierTest.cpp, tests/CRC32Test.cpp, tests/ToUnicodeMapTest.cpp, tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, tests/XMLNodeTest.cpp: minor additions to some tests 2017-02-15 Martin Gieseking * configure.ac, libs/ff-woff/Makefile.am, libs/ff-woff/fontforge/fflocale.c, libs/ff-woff/fontforge/fflocale.h, libs/ff-woff/fontforge/sfd.c, libs/ff-woff/fontforge/splinefont.h, libs/ff-woff/fontforge/tottf.c: ff-woff: only call uselocale() if present, use setlocale() otherwise 2017-02-14 Martin Gieseking * README, README.md: added information on required C++11 compiler to README * tests/genhashcheck.py: made genhashcheck.py compatible with Python 3 (plus few minor changes) 2017-02-13 Martin Gieseking * src/MapLine.cpp, src/MapLine.hpp, tests/ColorSpecialTest.cpp, tests/FontMapTest.cpp, tests/LengthTest.cpp, tests/MapLineTest.cpp: improved a couple of test cases * src/Color.cpp, src/Matrix.cpp, src/TpicSpecialHandler.cpp, src/utility.hpp: replaced non-standard constant M_PI with own definition * src/Color.cpp, src/Matrix.cpp, src/utility.hpp: replaced local copies of deg2rad with global function 2017-02-12 Martin Gieseking * .appveyor.yml, .travis.yml, appveyor.yml: exclude branch 'tmp' from CI builds 2017-02-11 Martin Gieseking * libs/ff-woff/Makefile.am, libs/ff-woff/fontforge/fontforge.h, libs/ff-woff/inc/ffintl.h, libs/ff-woff/inc/intl.h: don't try to #include libintl.h * .travis.yml: Travis: enable clang builds again * NEWS: updated NEWS 2017-02-10 Martin Gieseking * src/Calculator.cpp: fixed number parsing in Calculator class (failed on Mac) * tests/StreamReaderTest.cpp: clear istream flags to prevent failure of StreamReaderTest * libs/xxHash/xxhash.c, libs/xxHash/xxhash.h: removed 'restrict' keyword from xxHash * .travis.yml, appveyor.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.1.2 2017-02-09 Martin Gieseking * .gitignore, .travis.yml, Makefile.am, configure.ac, tests/Makefile.am, tests/create-makefile, tests/gtest/LICENSE, tests/gtest/include/gtest/gtest-death-test.h, tests/gtest/include/gtest/gtest-message.h, tests/gtest/include/gtest/gtest-param-test.h, tests/gtest/include/gtest/gtest-printers.h, tests/gtest/include/gtest/gtest-spi.h, tests/gtest/include/gtest/gtest-test-part.h, tests/gtest/include/gtest/gtest-typed-test.h, tests/gtest/include/gtest/gtest.h, tests/gtest/include/gtest/gtest_pred_impl.h, tests/gtest/include/gtest/gtest_prod.h, tests/gtest/include/gtest/internal/custom/gtest-port.h, tests/gtest/include/gtest/internal/custom/gtest-printers.h, tests/gtest/include/gtest/internal/custom/gtest.h, tests/gtest/include/gtest/internal/gtest-death-test-internal.h, tests/gtest/include/gtest/internal/gtest-filepath.h, tests/gtest/include/gtest/internal/gtest-internal.h, tests/gtest/include/gtest/internal/gtest-linked_ptr.h, tests/gtest/include/gtest/internal/gtest-param-util-generated.h, tests/gtest/include/gtest/internal/gtest-param-util.h, tests/gtest/include/gtest/internal/gtest-port-arch.h, tests/gtest/include/gtest/internal/gtest-port.h, tests/gtest/include/gtest/internal/gtest-string.h, tests/gtest/include/gtest/internal/gtest-tuple.h, tests/gtest/include/gtest/internal/gtest-type-util.h, tests/gtest/src/gtest-all.cc, tests/gtest/src/gtest-death-test.cc, tests/gtest/src/gtest-filepath.cc, tests/gtest/src/gtest-internal-inl.h, tests/gtest/src/gtest-port.cc, tests/gtest/src/gtest-printers.cc, tests/gtest/src/gtest-test-part.cc, tests/gtest/src/gtest-typed-test.cc, tests/gtest/src/gtest.cc, tests/gtest/src/gtest_main.cc: bundle gtest with the sources to simplify building and running the tests * src/Directory.cpp, tests/DirectoryTest.cpp: prevent calling closedir() with null pointer argument * src/VectorStream.hpp: don't access first vector component if the vector is empty * src/GFReader.cpp, src/StreamReader.cpp, tests/GFReaderTest.cpp, tests/StreamReaderTest.cpp: improved implementation of getString() * src/CLCommandLine.cpp: reset status flags before changing the sstream source 2017-02-08 Martin Gieseking * tests/CommandLineTest.cpp: removed redundant function * src/XMLString.cpp, tests/EmSpecialTest.cpp, tests/GFGlyphTracerTest.cpp: avoid negative zeros (-0) in SVG output * src/BoundingBox.cpp: fixed memory issue in BoundingBox class * src/CMapReader.cpp, src/InputReader.cpp, src/InputReader.hpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp: fixed potential number overflow issue * tests/CMapReaderTest.cpp: fixed memory leak in CMapReaderTest * src/Subfont.cpp: fixed memory leak in Subfont class * src/XMLNode.cpp: fixed memory leak in class XMLElementNode 2017-02-07 Martin Gieseking * configure.ac: replaced deprecated AC_CONFIG_HEADER * NEWS: updated NEWS * libs/clipper/License.txt: fixed line endings of clipper/License.txt 2017-02-06 Martin Gieseking * .travis.yml, appveyor.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.1.1 2017-02-04 Martin Gieseking * tests/FontCacheTest.cpp: fixed FontCacheTest ('make distcheck' failed) 2017-02-03 Martin Gieseking * src/Color.cpp, src/Color.hpp, src/VectorIterator.hpp, tests/ColorTest.cpp, tests/VectorIteratorTest.cpp: increased coverage of ColorTest * configure.ac, libs/ff-woff/fontforge/splinefont.h: include xlocale.h in ff-woff if available (fixes #65) 2017-02-02 Martin Gieseking * src/Makefile.am: removed spurious colon from src/Makefile.am * configure.ac: allow C++11 language extensions if necessary * src/Font.cpp, src/Font.hpp: report Metafont failures only once for each font 2017-01-31 Martin Gieseking * README, README.md: README: updated links, added release badge 2017-01-30 Martin Gieseking * tests/FontManagerTest.cpp, tests/data/cmr10.pfb: prevent FontManagerTest to fail due to missing font files 2017-01-26 Martin Gieseking * src/Matrix.cpp, tests/MatrixTest.cpp: minor changes of matrix class; improved MatrixTest 2017-01-25 Martin Gieseking * src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, tests/Makefile.am, tests/PapersizeSpecialTest.cpp, tests/create-makefile: added PapersizeSpecialTest * tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/JFMReaderTest.cpp, tests/MapLineTest.cpp, tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp: added 'override' specifier to gtest methods * src/FontCache.cpp, src/FontCache.hpp, tests/FontCacheTest.cpp, tests/Makefile.am: added FontCacheTest * tests/Makefile.am, tests/create-makefile: removed redundant linker flag from tests * m4/ax_code_coverage.m4, m4/ax_cxx_compile_stdcxx.m4: updated m4 scripts to latest versions 2017-01-23 Martin Gieseking * README.md, appveyor.yml: added basic appveyor.yml 2017-01-20 Martin Gieseking * libs/ff-woff/Makefile.am, libs/ff-woff/fontforge/fontforge.h, libs/ff-woff/fontforge/tmpfile2.cpp, libs/ff-woff/fontforge/utils.c, src/dvisvgm.cpp: improved error handling of tmpfile2() in ff-woff The FontForge library doesn't check the return value of tmpfile() which may lead to segfaults. The replacement function tmpfile2() throws an exception or calls exit() so that dvisvgm can terminate more cleanly. 2017-01-18 Martin Gieseking * src/BoundingBox.cpp, src/Color.cpp, src/DVIToSVGActions.cpp, src/FilePath.cpp, src/FileSystem.cpp, src/FontWriter.cpp, src/Makefile.am, src/PageSize.cpp, src/SVGOutput.cpp, src/utility.cpp, src/utility.hpp, tests/Makefile.am, tests/UtilityTest.cpp: moved common utility functions to separate compilation unit and namespace * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/EPSToSVG.cpp: get program name and version from version.hpp, avoid using macros from config.h * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.1 * NEWS: updated NEWS 2017-01-17 Martin Gieseking * libs/ff-woff/fontforge/utils.c, src/FileSystem.cpp, src/FileSystem.hpp, src/Font.cpp, src/FontWriter.cpp, src/GlyphTracerMessages.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/Process.cpp, src/Process.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp: create temp files in the system's temp folder rather than in cwd (closes #63) * doc/dvisvgm.txt.in, src/CommandLine.hpp, src/dvisvgm.cpp, src/options.xml: added option --tmpdir to select a different temp folder * src/FontWriter.cpp, src/FontWriter.hpp: print error message if FontWriter can't write temporary files 2017-01-12 Martin Gieseking * src/FilePath.cpp, src/FilePath.hpp, tests/FilePathTest.cpp, tests/SVGOutputTest.cpp: retain letter case of filenames (Windows) * src/DVIToSVG.cpp, src/EPSToSVG.cpp, src/SVGTree.hpp: print warning message if output file could not be written * tests/GhostscriptTest.cpp: disable GS banner in GhostscriptTest 2017-01-10 Martin Gieseking * src/PsSpecialHandler.cpp, src/dvisvgm.cpp: added missing newlines in messages; fixed typo 2017-01-05 Martin Gieseking * src/AGLTable.hpp: updated AGL table and removed colliding codepoints (closes #64) 2017-01-03 Martin Gieseking * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, doc/dvisvgm.txt.in, doc/tweak-db-article.xsl, doc/tweak-dblatex-pdf.xsl, libs/Makefile.am, src/AGLTable.hpp, src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/Bezier.cpp, src/Bezier.hpp, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.hpp, src/BoundingBox.cpp, src/BoundingBox.hpp, src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CLOption.hpp, src/CMap.cpp, src/CMap.hpp, src/CMapManager.cpp, src/CMapManager.hpp, src/CMapReader.cpp, src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.hpp, src/Calculator.cpp, src/Calculator.hpp, src/CharMapID.cpp, src/CharMapID.hpp, src/Character.hpp, src/Color.cpp, src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.hpp, src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.hpp, src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.hpp, src/DependencyGraph.hpp, src/Directory.cpp, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.hpp, src/EPSToSVG.cpp, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.hpp, src/FileFinder.cpp, src/FileFinder.hpp, src/FilePath.cpp, src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.hpp, src/FixWord.hpp, src/Font.cpp, src/Font.hpp, src/FontCache.cpp, src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.hpp, src/FontManager.cpp, src/FontManager.hpp, src/FontMap.cpp, src/FontMap.hpp, src/FontMetrics.cpp, src/FontMetrics.hpp, src/FontStyle.hpp, src/FontWriter.cpp, src/FontWriter.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.hpp, src/Ghostscript.cpp, src/Ghostscript.hpp, src/Glyph.hpp, src/GlyphTracerMessages.hpp, src/GraphicsPath.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.hpp, src/InputBuffer.cpp, src/InputBuffer.hpp, src/InputReader.cpp, src/InputReader.hpp, src/JFM.cpp, src/JFM.hpp, src/Length.cpp, src/Length.hpp, src/Makefile.am, src/MapLine.cpp, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.hpp, src/Message.cpp, src/Message.hpp, src/MessageException.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.hpp, src/NumericRanges.hpp, src/PSFilter.hpp, src/PSInterpreter.cpp, src/PSInterpreter.hpp, src/PSPattern.cpp, src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.hpp, src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.hpp, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.hpp, src/RangeMap.cpp, src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.hpp, src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.hpp, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/ShadingPatch.cpp, src/ShadingPatch.hpp, src/SignalHandler.cpp, src/SignalHandler.hpp, src/SpecialActions.hpp, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.hpp, src/Subfont.cpp, src/Subfont.hpp, src/System.cpp, src/System.hpp, src/TFM.cpp, src/TFM.hpp, src/TensorProductPatch.cpp, src/TensorProductPatch.hpp, src/Terminal.cpp, src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.hpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.hpp, src/TriangularPatch.cpp, src/TriangularPatch.hpp, src/Unicode.cpp, src/Unicode.hpp, src/VFActions.hpp, src/VFReader.cpp, src/VFReader.hpp, src/VectorIterator.hpp, src/VectorStream.hpp, src/XMLDocument.cpp, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/XMLString.cpp, src/XMLString.hpp, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/macros.hpp, src/options.dtd, src/options.xml, src/psdefs.cpp, src/version.hpp, src/version.hpp.in, tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/GraphicsPathTest.cpp, tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/TriangularPatchTest.cpp, tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, tests/create-makefile, tests/data/Makefile.am, tests/genhashcheck.py, tests/normalize.xsl: updated year in copyright statements to 2017 2016-12-20 Martin Gieseking * doc/Makefile.am, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, doc/dvisvgm.txt.in, doc/dvisvgm.xpr, doc/tweak-db-article.xsl: manpage: minor refactorings of the XSLT scripts; added generation of epub 2016-12-16 Martin Gieseking * doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, doc/tweak-dblatex-pdf.xsl: added missing email address to copyright headers * doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/tweak-dblatex-pdf.xsl: indent with tabs rather than spaces * doc/db2html.xsl: manpage: replace icon of Author section * doc/conf-dblatex-pdf.xsl, doc/tweak-dblatex-pdf.xsl: manpage: use mixed case titles in pdf output 2016-12-15 Martin Gieseking * doc/db2html.xsl, doc/dvisvgm.xpr: manpage: preserve whitespace in list of supported specials 2016-11-16 Martin Gieseking * configure.ac: ensure compiling C files with --std=c99 2016-11-14 Martin Gieseking * NEWS: updated NEWS 2016-11-12 Martin Gieseking * doc/dvisvgm.txt.in: minor changes in manpage * README, README.md, configure.ac, libs/Makefile.am, libs/ff-woff/LICENSE, libs/ff-woff/Makefile.am, libs/ff-woff/README.md, libs/ff-woff/fontforge/PfEd.h, libs/ff-woff/fontforge/alphabet.c, libs/ff-woff/fontforge/asmfpst.c, libs/ff-woff/fontforge/autohint.c, libs/ff-woff/fontforge/char.c, libs/ff-woff/fontforge/cjk.c, libs/ff-woff/fontforge/configure-fontforge.h, libs/ff-woff/fontforge/cvundoes.c, libs/ff-woff/fontforge/dumppfa.c, libs/ff-woff/fontforge/edgelist.h, libs/ff-woff/fontforge/edgelist2.h, libs/ff-woff/fontforge/encoding.c, libs/ff-woff/fontforge/encoding.h, libs/ff-woff/fontforge/fontforge-config.h, libs/ff-woff/fontforge/fontforge.h, libs/ff-woff/fontforge/fontforgevw.h, libs/ff-woff/fontforge/fvfonts.c, libs/ff-woff/fontforge/gwwiconv.c, libs/ff-woff/fontforge/libffstamp.h, libs/ff-woff/fontforge/lookups.c, libs/ff-woff/fontforge/macbinary.c, libs/ff-woff/fontforge/macenc.c, libs/ff-woff/fontforge/mathconstants.c, libs/ff-woff/fontforge/memory.c, libs/ff-woff/fontforge/mm.c, libs/ff-woff/fontforge/namehash.h, libs/ff-woff/fontforge/namelist.c, libs/ff-woff/fontforge/nouiutil.c, libs/ff-woff/fontforge/nowakowskittfinstr.c, libs/ff-woff/fontforge/parsepfa.c, libs/ff-woff/fontforge/parsettf.c, libs/ff-woff/fontforge/parsettfatt.c, libs/ff-woff/fontforge/psfont.h, libs/ff-woff/fontforge/psread.c, libs/ff-woff/fontforge/pua.c, libs/ff-woff/fontforge/sd.h, libs/ff-woff/fontforge/sfd.c, libs/ff-woff/fontforge/sfd1.c, libs/ff-woff/fontforge/sfd1.h, libs/ff-woff/fontforge/splinechar.c, libs/ff-woff/fontforge/splinefont.c, libs/ff-woff/fontforge/splinefont.h, libs/ff-woff/fontforge/splineorder2.c, libs/ff-woff/fontforge/splineoverlap.c, libs/ff-woff/fontforge/splinerefigure.c, libs/ff-woff/fontforge/splinesave.c, libs/ff-woff/fontforge/splinesaveafm.c, libs/ff-woff/fontforge/splineutil.c, libs/ff-woff/fontforge/splineutil2.c, libs/ff-woff/fontforge/start.c, libs/ff-woff/fontforge/stemdb.c, libs/ff-woff/fontforge/stemdb.h, libs/ff-woff/fontforge/tables.h, libs/ff-woff/fontforge/tottf.c, libs/ff-woff/fontforge/tottfaat.c, libs/ff-woff/fontforge/tottfgpos.c, libs/ff-woff/fontforge/tottfvar.c, libs/ff-woff/fontforge/ttf.h, libs/ff-woff/fontforge/ttfinstrs.c, libs/ff-woff/fontforge/ttfinstrs.h, libs/ff-woff/fontforge/ttfspecial.c, libs/ff-woff/fontforge/uiinterface.h, libs/ff-woff/fontforge/unialt.c, libs/ff-woff/fontforge/ustring.c, libs/ff-woff/fontforge/utils.c, libs/ff-woff/fontforge/utype.c, libs/ff-woff/fontforge/woff.c, libs/ff-woff/inc/basics.h, libs/ff-woff/inc/chardata.h, libs/ff-woff/inc/charset.h, libs/ff-woff/inc/dlist.h, libs/ff-woff/inc/gimage.h, libs/ff-woff/inc/gnetwork.h, libs/ff-woff/inc/gwwiconv.h, libs/ff-woff/inc/intl.h, libs/ff-woff/inc/ustring.h, libs/ff-woff/inc/utype.h, src/Makefile.am: bundle reduced fontforge library (ff-woff) * configure.ac, libs/Makefile.am, libs/clipper/Makefile.am, libs/ff-woff/Makefile.am, libs/woff2/Makefile.am, libs/woff2/brotli/Makefile.am, libs/woff2/brotli/enc/Makefile.am, libs/woff2/src/Makefile.am, src/Makefile.am: added license files of bundled libraries; relocated Makefiles * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.0.4 2016-11-07 Martin Gieseking * src/CommandLine.hpp, src/options.xml: fixed a typo in the --help output * src/BasicDVIReader.cpp, src/BasicDVIReader.hpp, src/DVIReader.cpp, src/DVIReader.hpp: use const variables for DVI opcodes rather than the values directly 2016-11-01 Martin Gieseking * src/FontWriter.cpp: few cosmetic changes; added comments 2016-09-27 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.0.3 * NEWS, README, README.md: updated NEWS and README 2016-09-23 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.hpp: dropped tracking of previous DVI state from DVIReader * src/DVIReader.cpp: fixed positioning of rules 2016-09-22 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.hpp, src/DVIToSVG.cpp: fixed regression in character positioning of of virtual fonts 2016-09-18 Martin Gieseking * src/DVIReader.cpp: fixed type regression in computation of DVI positions (closes #61) * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.0.2 * NEWS, README.md: updated NEWS and README 2016-09-16 Martin Gieseking * src/Font.cpp: fixed sign of character depth computed for native fonts 2016-09-03 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.0.1 * NEWS, README, README.md: updated NEWS and README 2016-08-31 Martin Gieseking * README, README.md: added link to reduced FF library to README * doc/dvisvgm.txt.in, src/FontWriter.cpp, src/FontWriter.hpp, src/SVGTree.cpp, src/SVGTree.hpp, src/ffwrapper.c: added option to autohint fonts created by the FontForge library 2016-08-30 Martin Gieseking * src/DVIToSVGActions.hpp, src/FontManager.hpp, src/MetafontWrapper.hpp: adapted struct/class forward declarations 2016-08-28 Martin Gieseking * src/FileFinder.cpp, src/FileFinder.hpp: removed unused variable * src/CLCommandLine.cpp: added missing cast to avoid compiler warning * .travis.yml, configure.ac, src/Doxyfile, src/version.hpp: set version to 2.0 * README, README.md: updated README files * NEWS: updated NEWS 2016-08-27 Martin Gieseking * .travis.yml: use Ubuntu Trusty for Travis builds * .travis.yml: Travis: prevent rebuilding files in folder 'src' when calling 'make check' * src/FontWriter.cpp, src/FontWriter.hpp, src/ffwrapper.c, src/ffwrapper.h: added missing copyright headers 2016-08-25 Martin Gieseking * Makefile.am, clipper/License.txt, clipper/Makefile.am, clipper/clipper.cpp, clipper/clipper.hpp, configure.ac, libs/Makefile.am, libs/clipper/License.txt, libs/clipper/Makefile.am, libs/clipper/clipper.cpp, libs/clipper/clipper.hpp, libs/xxHash/LICENSE, libs/xxHash/Makefile.am, libs/xxHash/xxhash.c, libs/xxHash/xxhash.h, src/Makefile.am, tests/Makefile.am, tests/create-makefile, xxHash/LICENSE, xxHash/Makefile.am, xxHash/xxhash.c, xxHash/xxhash.h: moved bundled libraries (clipper, xxHash) to subfolder 'libs' * configure.ac, doc/dvisvgm.txt.in, libs/Makefile.am, libs/woff2/LICENSE, libs/woff2/brotli/LICENSE, libs/woff2/brotli/enc/Makefile.am, libs/woff2/brotli/enc/backward_references.cc, libs/woff2/brotli/enc/backward_references.h, libs/woff2/brotli/enc/bit_cost.h, libs/woff2/brotli/enc/block_splitter.cc, libs/woff2/brotli/enc/block_splitter.h, libs/woff2/brotli/enc/brotli_bit_stream.cc, libs/woff2/brotli/enc/brotli_bit_stream.h, libs/woff2/brotli/enc/cluster.h, libs/woff2/brotli/enc/command.h, libs/woff2/brotli/enc/compress_fragment.cc, libs/woff2/brotli/enc/compress_fragment.h, libs/woff2/brotli/enc/compress_fragment_two_pass.cc, libs/woff2/brotli/enc/compress_fragment_two_pass.h, libs/woff2/brotli/enc/compressor.h, libs/woff2/brotli/enc/context.h, libs/woff2/brotli/enc/dictionary.cc, libs/woff2/brotli/enc/dictionary.h, libs/woff2/brotli/enc/dictionary_hash.h, libs/woff2/brotli/enc/encode.cc, libs/woff2/brotli/enc/encode.h, libs/woff2/brotli/enc/encode_parallel.cc, libs/woff2/brotli/enc/encode_parallel.h, libs/woff2/brotli/enc/entropy_encode.cc, libs/woff2/brotli/enc/entropy_encode.h, libs/woff2/brotli/enc/entropy_encode_static.h, libs/woff2/brotli/enc/fast_log.h, libs/woff2/brotli/enc/find_match_length.h, libs/woff2/brotli/enc/hash.h, libs/woff2/brotli/enc/histogram.cc, libs/woff2/brotli/enc/histogram.h, libs/woff2/brotli/enc/literal_cost.cc, libs/woff2/brotli/enc/literal_cost.h, libs/woff2/brotli/enc/metablock.cc, libs/woff2/brotli/enc/metablock.h, libs/woff2/brotli/enc/port.h, libs/woff2/brotli/enc/prefix.h, libs/woff2/brotli/enc/ringbuffer.h, libs/woff2/brotli/enc/static_dict.cc, libs/woff2/brotli/enc/static_dict.h, libs/woff2/brotli/enc/static_dict_lut.h, libs/woff2/brotli/enc/streams.cc, libs/woff2/brotli/enc/streams.h, libs/woff2/brotli/enc/transform.h, libs/woff2/brotli/enc/types.h, libs/woff2/brotli/enc/utf8_util.cc, libs/woff2/brotli/enc/utf8_util.h, libs/woff2/brotli/enc/write_bits.h, libs/woff2/brotli/tools/bro.cc, libs/woff2/brotli/tools/rfc-format.py, libs/woff2/brotli/tools/version.h, libs/woff2/src/Makefile.am, libs/woff2/src/buffer.h, libs/woff2/src/file.h, libs/woff2/src/font.cc, libs/woff2/src/font.h, libs/woff2/src/glyph.cc, libs/woff2/src/glyph.h, libs/woff2/src/normalize.cc, libs/woff2/src/normalize.h, libs/woff2/src/port.h, libs/woff2/src/round.h, libs/woff2/src/store_bytes.h, libs/woff2/src/table_tags.cc, libs/woff2/src/table_tags.h, libs/woff2/src/transform.cc, libs/woff2/src/transform.h, libs/woff2/src/variable_length.cc, libs/woff2/src/variable_length.h, libs/woff2/src/woff2_common.cc, libs/woff2/src/woff2_common.h, libs/woff2/src/woff2_dec.h, libs/woff2/src/woff2_enc.cc, libs/woff2/src/woff2_enc.h, libs/woff2/src/woff2_out.cc, libs/woff2/src/woff2_out.h, src/FontWriter.cpp, src/FontWriter.hpp, src/Makefile.am: added support for embedding WOFF2 fonts 2016-08-24 Martin Gieseking * src/XMLNode.hpp: added move constructors to XMLNode classes 2016-08-23 Martin Gieseking * src/FontEngine.cpp: fixed sign of the font descender * configure.ac, doc/dvisvgm.txt.in, src/CommandLine.hpp, src/FontWriter.cpp, src/FontWriter.hpp, src/GraphicsPath.hpp, src/Makefile.am, src/SVGTree.cpp, src/SVGTree.hpp, src/XMLNode.cpp, src/XMLNode.hpp, src/dvisvgm.cpp, src/ffwrapper.c, src/ffwrapper.h, src/options.xml: added option --font-format to select the file format used to embed fonts 2016-08-22 Martin Gieseking * xxHash/xxhash.c, xxHash/xxhash.h: updated xxHash to version 0.6.2 2016-08-17 Martin Gieseking * src/FixWord.hpp, src/Font.cpp, src/FontMetrics.hpp, src/SVGTree.cpp, src/TFM.cpp, src/TFM.hpp: added getters for ascent and descent to TFM-based fonts 2016-08-14 Martin Gieseking * src/Ghostscript.hpp: removed copy constructor of class Ghostscript * src/PathClipper.cpp: added missing initializers 2016-08-13 Martin Gieseking * configure.ac, src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CommandLine.hpp, src/Makefile.am, src/dvisvgm.cpp, src/options.dtd, src/options.xml, src/version.hpp, src/version.hpp.in: added version.hpp to provide the current version number 2016-08-08 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.hpp, src/Directory.cpp, src/Directory.hpp, src/FilePath.cpp, src/FilePath.hpp, src/Font.cpp, src/Font.hpp, src/FontManager.cpp, src/FontManager.hpp, src/GFReader.hpp, src/PageRanges.cpp, src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.hpp, src/SVGOutput.cpp, src/SVGOutput.hpp, src/VFActions.hpp, src/VFReader.cpp: pass string parameters by reference if possible * src/System.cpp, src/dvisvgm.cpp: minor refactorings of dvisvgm.cpp * src/Ghostscript.cpp, src/MiKTeXCom.cpp: replaced __WIN64__ with pre-defined _WIN64 2016-08-02 Martin Gieseking * src/CLCommandLine.cpp, src/CLCommandLine.hpp, src/CLOption.hpp, src/CmdLineParserBase.cpp, src/CmdLineParserBase.hpp, src/CommandLine.cpp, src/CommandLine.hpp, src/Makefile.am, src/dvisvgm.cpp, src/options.dtd, src/options.xml, tests/CommandLineTest.cpp: reimplemented the CommandLine parser class * src/CMap.cpp, src/CMapManager.cpp, src/CMapReader.cpp, src/EncFile.cpp, src/FileFinder.cpp, src/FileFinder.hpp, src/Font.cpp, src/FontEncoding.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMetrics.cpp, src/Ghostscript.cpp, src/MetafontWrapper.cpp, src/PsSpecialHandler.cpp, src/Subfont.cpp, src/dvisvgm.cpp, tests/CMapManagerTest.cpp, tests/FileFinderTest.cpp, tests/MapLineTest.cpp, tests/SubfontTest.cpp: made FileFinder a singleton again 2016-07-27 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/BoundingBox.cpp, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/FileSystem.cpp, src/FontCache.cpp, src/FontEngine.cpp, src/FontManager.cpp, src/GraphicsPath.hpp, src/PSInterpreter.cpp, src/PapersizeSpecialHandler.cpp, src/PathClipper.cpp, src/RangeMap.cpp, src/Subfont.cpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, src/XMLNode.cpp: replaced insert/push_back with emplace/emplace_back where useful 2016-07-23 Martin Gieseking * src/PathClipper.cpp: some minor refactorings of class PathClipper * src/CMapReader.cpp: minor refactoring of class CMapReader 2016-07-22 Martin Gieseking * src/FontMap.cpp, src/FontMap.hpp: some syntactic refactorings of class FontMap * src/FontManager.cpp, src/FontManager.hpp: use unique_ptr to automatically release Font objects in class FontManager 2016-07-21 Martin Gieseking * src/AGLTable.h, src/AGLTable.hpp, src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/BasicDVIReader.hpp, src/Bezier.cpp, src/Bezier.h, src/Bezier.hpp, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/BgColorSpecialHandler.hpp, src/Bitmap.cpp, src/Bitmap.h, src/Bitmap.hpp, src/BoundingBox.cpp, src/BoundingBox.h, src/BoundingBox.hpp, src/CMap.cpp, src/CMap.h, src/CMap.hpp, src/CMapManager.cpp, src/CMapManager.h, src/CMapManager.hpp, src/CMapReader.cpp, src/CMapReader.h, src/CMapReader.hpp, src/CRC32.cpp, src/CRC32.h, src/CRC32.hpp, src/Calculator.cpp, src/Calculator.h, src/Calculator.hpp, src/CharMapID.cpp, src/CharMapID.h, src/CharMapID.hpp, src/Character.h, src/Character.hpp, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CmdLineParserBase.hpp, src/Color.cpp, src/Color.h, src/Color.hpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/ColorSpecialHandler.hpp, src/CommandLine.cpp, src/CommandLine.h, src/CommandLine.hpp, src/DLLoader.cpp, src/DLLoader.h, src/DLLoader.hpp, src/DVIActions.h, src/DVIActions.hpp, src/DVIReader.cpp, src/DVIReader.h, src/DVIReader.hpp, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVG.hpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DVIToSVGActions.hpp, src/DependencyGraph.h, src/DependencyGraph.hpp, src/Directory.cpp, src/Directory.h, src/Directory.hpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/DvisvgmSpecialHandler.hpp, src/EPSFile.cpp, src/EPSFile.h, src/EPSFile.hpp, src/EPSToSVG.cpp, src/EPSToSVG.h, src/EPSToSVG.hpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EmSpecialHandler.hpp, src/EncFile.cpp, src/EncFile.h, src/EncFile.hpp, src/FileFinder.cpp, src/FileFinder.h, src/FileFinder.hpp, src/FilePath.cpp, src/FilePath.h, src/FilePath.hpp, src/FileSystem.cpp, src/FileSystem.h, src/FileSystem.hpp, src/FixWord.h, src/FixWord.hpp, src/Font.cpp, src/Font.h, src/Font.hpp, src/FontCache.cpp, src/FontCache.h, src/FontCache.hpp, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEncoding.hpp, src/FontEngine.cpp, src/FontEngine.h, src/FontEngine.hpp, src/FontManager.cpp, src/FontManager.h, src/FontManager.hpp, src/FontMap.cpp, src/FontMap.h, src/FontMap.hpp, src/FontMetrics.cpp, src/FontMetrics.h, src/FontMetrics.hpp, src/FontStyle.h, src/FontStyle.hpp, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFGlyphTracer.hpp, src/GFReader.cpp, src/GFReader.h, src/GFReader.hpp, src/GFTracer.cpp, src/GFTracer.h, src/GFTracer.hpp, src/Ghostscript.cpp, src/Ghostscript.h, src/Ghostscript.hpp, src/Glyph.h, src/Glyph.hpp, src/GlyphTracerMessages.h, src/GlyphTracerMessages.hpp, src/GraphicsPath.h, src/GraphicsPath.hpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/HtmlSpecialHandler.hpp, src/InputBuffer.cpp, src/InputBuffer.h, src/InputBuffer.hpp, src/InputReader.cpp, src/InputReader.h, src/InputReader.hpp, src/JFM.cpp, src/JFM.h, src/JFM.hpp, src/Length.cpp, src/Length.h, src/Length.hpp, src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/MapLine.hpp, src/Matrix.cpp, src/Matrix.h, src/Matrix.hpp, src/Message.cpp, src/Message.h, src/Message.hpp, src/MessageException.h, src/MessageException.hpp, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MetafontWrapper.hpp, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/MiKTeXCom.hpp, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/NoPsSpecialHandler.hpp, src/NumericRanges.h, src/NumericRanges.hpp, src/PSFilter.h, src/PSFilter.hpp, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSInterpreter.hpp, src/PSPattern.cpp, src/PSPattern.h, src/PSPattern.hpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PSPreviewFilter.hpp, src/PageRanges.cpp, src/PageRanges.h, src/PageRanges.hpp, src/PageSize.cpp, src/PageSize.h, src/PageSize.hpp, src/Pair.h, src/Pair.hpp, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.h, src/PapersizeSpecialHandler.hpp, src/PathClipper.cpp, src/PathClipper.h, src/PathClipper.hpp, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, src/PdfSpecialHandler.hpp, src/PreScanDVIReader.cpp, src/PreScanDVIReader.h, src/PreScanDVIReader.hpp, src/Process.cpp, src/Process.h, src/Process.hpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/PsSpecialHandler.hpp, src/RangeMap.cpp, src/RangeMap.h, src/RangeMap.hpp, src/SVGCharHandler.cpp, src/SVGCharHandler.h, src/SVGCharHandler.hpp, src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.h, src/SVGCharHandlerFactory.hpp, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.h, src/SVGCharPathHandler.hpp, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.h, src/SVGCharTspanTextHandler.hpp, src/SVGOutput.cpp, src/SVGOutput.h, src/SVGOutput.hpp, src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.h, src/SVGSingleCharTextHandler.hpp, src/SVGTree.cpp, src/SVGTree.h, src/SVGTree.hpp, src/ShadingPatch.cpp, src/ShadingPatch.h, src/ShadingPatch.hpp, src/SignalHandler.cpp, src/SignalHandler.h, src/SignalHandler.hpp, src/SpecialActions.h, src/SpecialActions.hpp, src/SpecialHandler.h, src/SpecialHandler.hpp, src/SpecialManager.cpp, src/SpecialManager.h, src/SpecialManager.hpp, src/StreamReader.cpp, src/StreamReader.h, src/StreamReader.hpp, src/StreamWriter.cpp, src/StreamWriter.h, src/StreamWriter.hpp, src/Subfont.cpp, src/Subfont.h, src/Subfont.hpp, src/System.cpp, src/System.h, src/System.hpp, src/TFM.cpp, src/TFM.h, src/TFM.hpp, src/TensorProductPatch.cpp, src/TensorProductPatch.h, src/TensorProductPatch.hpp, src/Terminal.cpp, src/Terminal.h, src/Terminal.hpp, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, src/ToUnicodeMap.hpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/TpicSpecialHandler.hpp, src/TriangularPatch.cpp, src/TriangularPatch.h, src/TriangularPatch.hpp, src/Unicode.cpp, src/Unicode.h, src/Unicode.hpp, src/VFActions.h, src/VFActions.hpp, src/VFReader.cpp, src/VFReader.h, src/VFReader.hpp, src/VectorIterator.h, src/VectorIterator.hpp, src/VectorStream.h, src/VectorStream.hpp, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLDocument.hpp, src/XMLNode.cpp, src/XMLNode.h, src/XMLNode.hpp, src/XMLString.cpp, src/XMLString.h, src/XMLString.hpp, src/ZLibOutputStream.h, src/ZLibOutputStream.hpp, src/dvisvgm.cpp, src/macros.h, src/macros.hpp, src/psdefs.cpp, tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, tests/CMapManagerTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/EmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/GhostscriptTest.cpp, tests/GraphicsPathTest.cpp, tests/JFMReaderTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, tests/TFMReaderTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/TriangularPatchTest.cpp, tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/create-makefile: renamed filename extension of C++ headers to .hpp 2016-07-20 Martin Gieseking * src/CMapManager.cpp, src/CMapManager.h, src/FileFinder.cpp, src/Font.cpp, src/Font.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, tests/XMLNodeTest.cpp: use smart pointers to release heap memory * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: create BoxMap object directly, avoid new/delete 2016-07-19 Martin Gieseking * src/AGLTable.h, src/Color.cpp, src/Unicode.cpp, tests/genhashcheck.py: replaced repeated binary search implementations with calls of lower_bound() 2016-07-13 Martin Gieseking * src/FileFinder.cpp, src/Message.cpp: initialize maps with initializer-lists 2016-07-05 Martin Gieseking * src/Length.cpp, src/TpicSpecialHandler.cpp: replaced 'id macros' with constexpr functions 2016-07-04 Martin Gieseking * src/TFM.cpp: added missing initializers * src/dvisvgm.cpp: catch exception in set_cache_dir() * .travis.yml, configure.ac, src/Doxyfile: set version to 1.16 * NEWS, README.md: updated NEWS and README 2016-07-03 Martin Gieseking * configure.ac, m4/ax_cxx_compile_stdcxx.m4: switch from C++03 to C++11 * src/NumericRanges.h, src/PapersizeSpecialHandler.cpp, src/Unicode.cpp, src/VFReader.cpp: replaced static callback functions with lambdas * src/CMapReader.cpp, src/CMapReader.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/CommandLine.cpp, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/EmSpecialHandler.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp, src/GraphicsPath.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/Length.cpp, src/Length.h, src/PathClipper.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/ShadingPatch.cpp, src/TensorProductPatch.h, tests/BoundingBoxTest.cpp, tests/LengthTest.cpp, tests/ShadingPatchTest.cpp, tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: replaced some enums with enum classes * clipper/clipper.hpp, src/AGLTable.h, src/BasicDVIReader.cpp, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.h, src/CMap.cpp, src/CMap.h, src/CMapReader.cpp, src/CRC32.cpp, src/CRC32.h, src/CharMapID.h, src/Character.h, src/Color.cpp, src/Color.h, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSFile.cpp, src/EPSFile.h, src/EncFile.cpp, src/EncFile.h, src/FileSystem.cpp, src/FileSystem.h, src/FixWord.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Glyph.h, src/GlyphTracerMessages.h, src/InputBuffer.cpp, src/InputBuffer.h, src/JFM.cpp, src/JFM.h, src/Makefile.am, src/Message.h, src/Pair.h, src/PathClipper.cpp, src/PreScanDVIReader.cpp, src/PsSpecialHandler.h, src/RangeMap.cpp, src/RangeMap.h, src/SVGCharHandler.h, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.h, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.h, src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, src/TFM.cpp, src/TFM.h, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, src/Unicode.cpp, src/Unicode.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/XMLString.cpp, src/types.h, tests/BitmapTest.cpp, tests/CRC32Test.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/JFMReaderTest.cpp, tests/Makefile.am, tests/StreamReaderTest.cpp, tests/TriangularPatchTest.cpp, tests/TypesTest.cpp, tests/UnicodeTest.cpp: replaced own fixed-sized integer types with types from cstdint * AUTHORS, LGPL-2.1.txt, Makefile.am, gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, gzstream/version, src/Makefile.am, src/SVGOutput.cpp, src/SVGOutput.h, src/ZLibOutputStream.h, src/dvisvgm.cpp, src/gzstream.cpp, src/gzstream.h, tests/Makefile.am, tests/SVGOutputTest.cpp, tests/create-makefile: replaced old gzstream classes * src/DVIReader.cpp, src/DVIReader.h, src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontManager.h, src/VFActions.h, src/VFReader.cpp: transfer DVI snippet of a VF char by move semantics rather than by heap pointer 2016-07-02 Martin Gieseking * src/Bitmap.cpp, src/BoundingBox.h, src/CMapManager.cpp, src/CmdLineParserBase.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DependencyGraph.h, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/FileFinder.cpp, src/FilePath.cpp, src/FilePath.h, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GraphicsPath.h, src/HtmlSpecialHandler.cpp, src/NumericRanges.h, src/PSPattern.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/SVGTree.h, src/SpecialManager.cpp, src/SpecialManager.h, src/Subfont.cpp, src/Subfont.h, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLString.cpp, src/macros.h: use range-based 'for' loop to iterate over containers; drop FORALL macro * clipper/clipper.hpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/CMap.h, src/CmdLineParserBase.h, src/ColorSpecialHandler.h, src/CommandLine.h, src/DVIReader.h, src/DVIToSVG.h, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.h, src/EPSToSVG.h, src/EmSpecialHandler.h, src/EncFile.h, src/Font.h, src/FontCache.cpp, src/FontEncoding.h, src/FontMetrics.h, src/GFGlyphTracer.h, src/GFReader.h, src/GFTracer.h, src/GlyphTracerMessages.h, src/GraphicsPath.h, src/HtmlSpecialHandler.h, src/InputBuffer.h, src/InputReader.h, src/JFM.h, src/MessageException.h, src/NoPsSpecialHandler.h, src/PSPattern.h, src/PSPreviewFilter.h, src/PapersizeSpecialHandler.h, src/PathClipper.cpp, src/PdfSpecialHandler.h, src/PreScanDVIReader.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGCharPathHandler.h, src/SVGCharTspanTextHandler.h, src/SVGOutput.h, src/SVGSingleCharTextHandler.h, src/SpecialActions.h, src/TFM.h, src/TensorProductPatch.h, src/TpicSpecialHandler.h, src/TriangularPatch.h, src/VectorStream.h, src/XMLNode.h: mark overridden methods with 'override' keyword * src/PsSpecialHandler.cpp: use unique_ptr rather than deprecated auto_ptr * src/BasicDVIReader.h, src/Bitmap.h, src/CMap.h, src/CmdLineParserBase.h, src/DVIActions.h, src/Font.h, src/FontEncoding.h, src/FontMetrics.h, src/GFGlyphTracer.h, src/GFReader.h, src/GFTracer.h, src/GraphicsPath.h, src/InputBuffer.h, src/InputReader.h, src/MessageException.h, src/PSFilter.h, src/PSInterpreter.h, src/PSPattern.h, src/SVGCharHandler.h, src/SVGOutput.h, src/ShadingPatch.h, src/SpecialActions.h, src/SpecialHandler.h, src/StreamReader.h, src/StreamWriter.h, src/Subfont.h, src/VFActions.h, src/XMLNode.h: replaced empty virtual destructors with default ones 2016-07-01 Martin Gieseking * src/BasicDVIReader.h, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FontManager.cpp, src/FontManager.h, src/PreScanDVIReader.h, src/dvisvgm.cpp: refactored the DVI reader classes - added higher-level template methods to process the DVI commands more safely - moved triggering of DVIActions from DVIReader to DVIToSVG 2016-06-29 Martin Gieseking * src/BoundingBox.cpp, src/BoundingBox.h, src/DVIToSVG.cpp, src/dvisvgm.cpp: fixed computation of bounding boxes modified by relative --bbox argument * xxHash/xxhash.c, xxHash/xxhash.h: updated xxHash to version 0.6.1 2016-06-17 Martin Gieseking * src/TFM.cpp, tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: minor improvements to TFM/JFM tests 2016-06-16 Martin Gieseking * src/DVIReader.cpp, src/VectorStream.h, tests/VectorStreamTest.cpp: refactored VectorStreamBuffer to keep constness of assigned vector * src/GFReader.cpp: ensure validity of postpost command in GFReader::executePostamble() 2016-06-14 Martin Gieseking * src/DvisvgmSpecialHandler.cpp, src/TFM.cpp, src/VFReader.cpp: replaced local definitions of pt2bp with Length::pt2bp * src/XMLNode.h: added ouput operators for the XML node objects * src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, tests/EmSpecialTest.cpp, tests/Makefile.am: improved the emTeX special handler; added EmSpecialTest * src/BoundingBox.cpp, src/BoundingBox.h, tests/BoundingBoxTest.cpp: fixed unit conversion in BoundingBox class 2016-06-13 Martin Gieseking * doc/dvisvgm.txt.in, src/Length.cpp, src/Length.h, tests/LengthTest.cpp: added dd, cc, and sp units to class Length; fixed factor pt2pc 2016-06-12 Martin Gieseking * xxHash/xxhash.c, xxHash/xxhash.h: updated xxHash to version 0.6.0 * src/DLLoader.cpp, src/DLLoader.h, src/Directory.cpp, src/Directory.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/GFTracer.cpp, src/Ghostscript.cpp, src/Ghostscript.h, src/Message.cpp, src/MetafontWrapper.cpp, src/Process.cpp, src/Terminal.cpp, src/Terminal.h, src/dvisvgm.cpp: cleaned up Windows-related #defines 2016-06-10 Martin Gieseking * src/CommandLine.cpp: removed redundant #includes * src/Length.cpp, src/Length.h, tests/LengthTest.cpp: added functions to convert between Length::Unit and std::string 2016-06-07 Martin Gieseking * src/CMapManager.cpp, src/CMapManager.h, src/DVIActions.h, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.h, src/Font.h, src/FontEngine.h, src/FontManager.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/PSPattern.h, src/PSPreviewFilter.h, src/SVGCharHandler.cpp, src/SVGCharHandler.h, src/SVGCharPathHandler.cpp, src/SVGCharTspanTextHandler.cpp, src/SVGSingleCharTextHandler.cpp, src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.h, src/XMLDocument.cpp, src/XMLNode.h, tests/XMLNodeTest.cpp: changed some structs to classes and replaced #includes with forward declarations * src/SVGCharHandler.h: added missing initializer to class SVGCharHandler 2016-06-03 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EPSToSVG.cpp, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/PSPattern.cpp, src/PSPattern.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, tests/ColorSpecialTest.cpp, tests/DvisvgmSpecialTest.cpp: refactored handling of SpecialAction objects * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SVGTree.cpp, src/SVGTree.h: refactored processing of end-of-page (eop) commands * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/Makefile.am, src/PapersizeSpecialHandler.cpp, src/PapersizeSpecialHandler.h, src/PsSpecialHandler.cpp, src/dvisvgm.cpp: added evaluation of PS special 'papersize=' 2016-06-02 Martin Gieseking * src/DVIToSVG.cpp: fixed transformation of background color rectange 2016-05-31 Martin Gieseking * src/DVIToSVG.cpp, src/EPSToSVG.cpp: reworded messages printed after finishing a conversion 2016-05-30 Martin Gieseking * src/DVIToSVGActions.cpp, src/Font.cpp, src/Makefile.am, src/SVGCharHandler.cpp, src/SVGCharHandler.h, src/SVGCharHandlerFactory.cpp, src/SVGCharHandlerFactory.h, src/SVGCharPathHandler.cpp, src/SVGCharPathHandler.h, src/SVGCharTspanTextHandler.cpp, src/SVGCharTspanTextHandler.h, src/SVGSingleCharTextHandler.cpp, src/SVGSingleCharTextHandler.h, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp: replaced static SVG text backend by specialized handler classes * src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/Bezier.h, src/TensorProductPatch.h, src/TriangularPatch.h: replaced leading spaces with tabs 2016-05-29 Martin Gieseking * src/BasicDVIReader.cpp, src/DVIReader.cpp: fixed handling of subfont index in native font definition of XDV 7 2016-05-27 Martin Gieseking * src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLNode.h, tests/DvisvgmSpecialTest.cpp: prevent line wrapping inside text nodes 2016-05-26 Martin Gieseking * README.md, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIToSVG.cpp: reworded 'DVI format' to 'DVI (format) version' * README.md, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/DVIReader.cpp: added support for XDV version 7 introduced by XeTeX 0.99995 2016-05-25 Martin Gieseking * src/TFM.cpp: prevent reading more than 7 TFM param values (fixes #58) * .travis.yml: temporarily drop clang from Travis builds 2016-05-24 Martin Gieseking * src/JFM.cpp, src/JFM.h, src/TFM.cpp, src/TFM.h: TFM: store design size in bp units rather than as fixword * src/FontMetrics.h, src/JFM.cpp, src/TFM.cpp, src/TFM.h: added methods to query space-related parameters from TFM/JFM files * src/TFM.cpp, tests/JFMReaderTest.cpp, tests/TFMReaderTest.cpp: fixed calculation of character dimensions in TFM class 2016-04-22 Martin Gieseking * src/Process.cpp: fixed collecting stdout/stderr output when executing a process 2016-04-20 Martin Gieseking * src/CMap.h, src/CMapReader.cpp, tests/CMapManagerTest.cpp, tests/Makefile.am, tests/data/Makefile.am, tests/data/ot1.cmap: added CMapManagerTest 2016-04-19 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.15.1 * NEWS, README, README.md: updated NEWS and README 2016-04-18 Martin Gieseking * src/Calculator.cpp, src/Matrix.cpp: use std::ws to skip whitespace in istreams * src/Matrix.cpp: avoid adding trailing EOF characters when parsing parameters of transformation commands * tests/CMapReaderTest.cpp: improved CMapReaderTest 2016-04-11 Martin Gieseking * src/AGLTable.h, src/Makefile.am, src/Unicode.cpp, tests/Makefile.am, tests/create-makefile, tests/genhashcheck.py: moved AGL hash table from Unicode.cpp to a separate file 2016-04-07 Martin Gieseking * src/XMLDocument.cpp: explicitly specify UTF-8 encoding in XML declaration (closes #54) * src/Unicode.cpp, tests/UnicodeTest.cpp: added support for the AGL character names 'uniFOO' and 'uFOO' 2016-03-17 Martin Gieseking * src/GraphicsPath.h: renamed GraphicsPath::sconito/scubicto 2016-03-14 Martin Gieseking * doc/db2html.xsl: adapted db2html to insert anchors for each option entry * src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SVGTree.cpp, src/SVGTree.h: changed font parameter of setFont() methods from pointer to reference * src/SVGTree.cpp, src/SVGTree.h: split text and path section of SVGTree::appendChar() into seperate methods 2016-02-27 Martin Gieseking * NEWS: updated NEWS 2016-02-26 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/Font.cpp, src/Font.h, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, src/options.xml: added option --comments (adds comments with additional information to the SVG file * src/Font.cpp, src/Unicode.cpp, src/Unicode.h, tests/UnicodeTest.cpp: renamed Unicode::psNameToCodepoint() to Unicode::aglNameToCodepoint * src/FileFinder.cpp, src/FilePath.cpp, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/MetafontWrapper.cpp, src/dvisvgm.cpp: changed string parameters of FileSystem functions to type std::string * .travis.yml, configure.ac, src/Doxyfile: set version to 1.15 2016-02-23 Martin Gieseking * src/FontEngine.cpp: reworded error messages of class FontEngine * src/MetafontWrapper.cpp, src/Process.cpp: avoid reading Metafont logfiles to extract the GF filename * configure.ac, src/FileFinder.cpp, src/FileFinder.h, tests/FileFinderTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/JFMReaderTest.cpp, tests/Makefile.am, tests/TFMReaderTest.cpp, tests/cidjmgr0-h.tfm, tests/cmr10.600gf, tests/cmr10.tfm, tests/create-makefile, tests/data/Makefile.am, tests/data/cidjmgr0-h.tfm, tests/data/cmr10.600gf, tests/data/cmr10.tfm, tests/data/dvipdfm_test.map, tests/data/dvips_test.map, tests/data/frktest-nf-cmp.svg, tests/data/frktest-wf-cmp.svg, tests/data/frktest.dvi, tests/data/sample-nf-cmp.svg, tests/data/sample-wf-cmp.svg, tests/data/sample.dvi, tests/data/sample.sfd, tests/dvipdfm_test.map, tests/dvips_test.map, tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/frktest.dvi, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg, tests/sample.dvi, tests/sample.sfd: moved test data files to subfolder 2016-02-22 Martin Gieseking * tests/FileFinderTest.cpp, tests/GFReaderTest.cpp, tests/SVGOutputTest.cpp: avoid implicit casts of ifstream/ozstream objects in tests * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, tests/CommandLineTest.cpp: minor improvements of class CommandLineTest * src/XMLNode.cpp, tests/DvisvgmSpecialTest.cpp: improved DvisvgmSpecialTest * src/FontEngine.cpp, src/FontEngine.h: removed redundant code from class FontEngine 2016-02-05 Martin Gieseking * src/PsSpecialHandler.cpp: don't remove clipping paths that consist of single moveto commands only 2016-02-01 Martin Gieseking * src/Bitmap.cpp, src/BoundingBox.cpp, src/CMap.cpp, src/CMapManager.cpp, src/Calculator.cpp, src/CommandLine.cpp, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/Directory.cpp, src/Directory.h, src/EPSToSVG.cpp, src/EncFile.cpp, src/FileFinder.cpp, src/Font.cpp, src/FontCache.h, src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMetrics.cpp, src/GFGlyphTracer.cpp, src/GFReader.cpp, src/GFTracer.cpp, src/HtmlSpecialHandler.cpp, src/InputReader.cpp, src/MapLine.cpp, src/MetafontWrapper.cpp, src/PSInterpreter.cpp, src/PdfSpecialHandler.cpp, src/Process.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/SpecialManager.cpp, src/StreamReader.cpp, src/StreamWriter.cpp, src/Subfont.cpp, src/TFM.cpp, src/TensorProductPatch.cpp, src/TpicSpecialHandler.cpp, src/VFReader.cpp, src/XMLDocument.cpp, src/dvisvgm.cpp, tests/XMLStringTest.cpp: minor code cleanup (removed redundant includes, added casts) 2016-01-21 Martin Gieseking * m4/ax_code_coverage.m4: updated m4 code coverage script to latest version * src/JFM.h, tests/JFMReaderTest.cpp, tests/Makefile.am, tests/TFMReaderTest.cpp, tests/cidjmgr0-h.tfm, tests/cmr10.tfm, tests/create-makefile: added tests for the TFM and JFM classes 2016-01-19 Martin Gieseking * src/GraphicsPath.h, tests/GraphicsPathTest.cpp: fixed access of invalid iterator * .travis.yml, configure.ac, src/Doxyfile: set version to 1.14.2 * NEWS, README.md: updated NEWS 2016-01-18 Martin Gieseking * doc/dvisvgm.txt.in: added generic info about the command-line interface to the manpage * doc/db2html.xsl: updated links to Bootstrap and Font Awesome in stylesheet db2html.xsl * src/dvisvgm.cpp, xxHash/xxhash.c, xxHash/xxhash.h: updated xxHash to version 0.5.0 * tests/Makefile.am, tests/create-makefile, tests/genhashcheck.py: added test to check the validity of the char name hashes used in Unicode.cpp 2016-01-15 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, tests/ColorSpecialTest.cpp: removed check for 'background' special from ColorSpecialHandler 2016-01-13 Martin Gieseking * src/DVIReader.h, src/FontStyle.h, src/SVGTree.cpp, src/TriangularPatch.cpp: updated/fixed some comments * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: corrected handling of background color special across DVI pages 2016-01-05 Martin Gieseking * src/GFReader.cpp, src/GFReader.h: added checks for misplaced GF commands * NEWS: updated NEWS 2016-01-04 Martin Gieseking * .travis.yml: force Travis to use legacy builds due to an issue with clang and gtest * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/db2html.xsl, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/Bezier.cpp, src/Bezier.h, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, src/CMapReader.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, src/CharMapID.cpp, src/CharMapID.h, src/Character.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DependencyGraph.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.cpp, src/EncFile.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicsPath.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/JFM.cpp, src/JFM.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/NumericRanges.h, src/PSFilter.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSPattern.cpp, src/PSPattern.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PathClipper.cpp, src/PathClipper.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, src/PreScanDVIReader.cpp, src/PreScanDVIReader.h, src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/RangeMap.cpp, src/RangeMap.h, src/SVGOutput.cpp, src/SVGOutput.h, src/SVGTree.cpp, src/SVGTree.h, src/ShadingPatch.cpp, src/ShadingPatch.h, src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h, src/Terminal.cpp, src/Terminal.h, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/TriangularPatch.cpp, src/TriangularPatch.h, src/Unicode.cpp, src/Unicode.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorIterator.h, src/VectorStream.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, src/psdefs.cpp, src/types.h, tests/BezierTest.cpp, tests/BitmapTest.cpp, tests/BoundingBoxTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFGlyphTracerTest.cpp, tests/GFReaderTest.cpp, tests/GraphicsPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/RangeMapTest.cpp, tests/SVGOutputTest.cpp, tests/ShadingPatchTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/TriangularPatchTest.cpp, tests/TypesTest.cpp, tests/UnicodeTest.cpp, tests/VectorIteratorTest.cpp, tests/VectorStreamTest.cpp, tests/XMLNodeTest.cpp, tests/XMLStringTest.cpp, tests/check-conv, tests/create-makefile, tests/normalize.xsl: updated year in copyright statements to 2016 * .travis.yml, configure.ac, src/Doxyfile: set version to 1.14.1 2015-12-31 Martin Gieseking * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: reset PS graphics state at end of every DVI page 2015-12-28 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.14 * NEWS: updated NEWS 2015-12-27 Martin Gieseking * src/PsSpecialHandler.cpp: added evaluation of PSTricks specials 'pst:' and 'PST:' 2015-12-26 Martin Gieseking * src/FileFinder.cpp: lookup files in the current working directory before searching the texmf tree * src/GraphicsPath.h, tests/GraphicsPathTest.cpp: fixed memory issue in class GraphicsPath 2015-12-17 Martin Gieseking * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSToSVG.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PsSpecialHandler.cpp, src/SpecialActions.h, src/dvisvgm.cpp: added option --bbox=preview; adapt preview data if --bbox=min 2015-12-09 Martin Gieseking * src/FileFinder.cpp: return entire kpathsea version string if it doesn't start with 'kpathsea' * tests/GhostscriptTest.cpp: prevent opening a graphics window when running GhostscriptTest 2015-12-08 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.13 * NEWS: updated NEWS * clipper/clipper.cpp, clipper/clipper.hpp: replaced DOS line endings of the Clipper sources to Unix ones 2015-12-02 Martin Gieseking * src/Font.cpp, src/Font.h, src/Glyph.h, src/GraphicPath.h, src/GraphicsPath.h, src/Makefile.am, src/PathClipper.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/ShadingPatch.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h, src/TpicSpecialHandler.cpp, src/TriangularPatch.cpp, src/TriangularPatch.h, tests/GraphicPathTest.cpp, tests/GraphicsPathTest.cpp, tests/Makefile.am, tests/TensorProductPatchTest.cpp, tests/TriangularPatchTest.cpp: renamed class GraphicPath to GraphicsPath 2015-11-30 Martin Gieseking * doc/dvisvgm.txt.in: added a couple of links to the manpage * src/GraphicPath.h, src/PsSpecialHandler.cpp: remove redundant moveto commands from graphics paths 2015-11-25 Martin Gieseking * src/DVIToSVGActions.cpp, src/EPSToSVG.cpp: remove progress message before printing a PS error message * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: removed redundant methods 2015-11-24 Martin Gieseking * src/psdefs.cpp: added evaluation of PS operators ashow, awidthshow, and widthshow (fixes #49) * xxHash/xxhash.c: updated xxHash to version r42 2015-11-23 Martin Gieseking * src/PsSpecialHandler.cpp, src/psdefs.cpp: minor code cleanup and reordering * src/psdefs.cpp: reduce rounding errors produced by PS operator 'charpath' * src/psdefs.cpp: propagate call of PS operator 'setcolor' to the PS handler 2015-11-18 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.12 * NEWS: updated NEWS 2015-11-16 Martin Gieseking * src/FontManager.cpp: removed redundant #include * src/FontEngine.cpp: treat character code as character index if no font mapping is set 2015-11-12 Martin Gieseking * README, README.md: updated links to Google Test framework 2015-11-09 Martin Gieseking * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/HtmlSpecialHandler.cpp, tests/ColorTest.cpp: renamed Color::setName() to Color::setPSName() * tests/Makefile.am, tests/ShadingPatch.cpp, tests/ShadingPatchTest.cpp: renamed ShadingPatchTest * doc/dvisvgm.txt.in, src/Color.cpp, src/Color.h, src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/HtmlSpecialHandler.cpp, src/PSPattern.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/TpicSpecialHandler.cpp, src/dvisvgm.cpp, src/options.xml, tests/ColorTest.cpp: added option --colornames to replace RGB color values with SVG color names 2015-10-27 Martin Gieseking * src/Process.cpp, src/Process.h: fixed invalid access to freed string memory 2015-10-06 Martin Gieseking * doc/dvisvgm.txt.in: minor improvements of the manual page 2015-09-21 Martin Gieseking * NEWS, README, README.md: updated NEWS and README files 2015-09-18 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.11 2015-09-14 Martin Gieseking * src/Font.cpp, src/ToUnicodeMap.cpp, src/Unicode.cpp, src/Unicode.h, tests/UnicodeTest.cpp: improved handling of invalid Unicode points * src/Font.cpp, src/Unicode.cpp, src/Unicode.h, tests/UnicodeTest.cpp: renamed Unicode::psName2Codepoint to Unicode::psNameToCodepoint 2015-09-10 Martin Gieseking * src/Font.cpp: prevent creating 0x00 codepoints if PS character name is unknown * src/HtmlSpecialHandler.cpp: quote XML metacharacters in xlink:title attributes * src/CmdLineParserBase.h, src/InputReader.h: changed 'struct InputReader' to 'class InputReader' 2015-09-09 Martin Gieseking * src/SVGTree.cpp: force creating a new text element after appending a different node to the page 2015-08-13 Martin Gieseking * README, README.md: minor updates to README and README.md 2015-07-29 Martin Gieseking * tests/GhostscriptTest.cpp, tests/Makefile.am: added GhostscriptTest * tests/UnicodeTest.cpp: improved UnicodeTest * tests/CommandLineTest.cpp, tests/MessageExceptionTest.cpp: use ASSERT_STREQ in tests 2015-07-22 Martin Gieseking * README, README.md, doc/dvisvgm.txt.in: updated links to project website again (relocated to dvisvgm.bplaced.net) 2015-07-20 Martin Gieseking * README, README.md, doc/dvisvgm.txt.in: updated info about new project website 2015-07-14 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.10 * NEWS: updated NEWS 2015-07-12 Martin Gieseking * README.md, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIReader.h, src/Font.h, src/FontManager.cpp, src/FontManager.h: added support for new XDV format 6 2015-07-11 Martin Gieseking * README, README.md: updated README 2015-07-03 Martin Gieseking * src/dvisvgm.cpp: check for option --help before initializing the FileFinder * src/MiKTeXCom.cpp: added some comments to MiKTeXCom.cpp 2015-07-02 Martin Gieseking * tests/BezierTest.cpp: removed #include "debug.h" from test * Makefile.am, configure.ac, xxHash/LICENSE, xxHash/Makefile.am, xxHash/xxhash.c, xxHash/xxhash.h: added xxHash library (https://github.com/Cyan4973/xxHash) * src/Font.cpp, src/Makefile.am, src/Unicode.cpp, src/Unicode.h, tests/Makefile.am, tests/create-makefile: added mapping from character names to unicode for PostScript fonts 2015-04-07 Martin Gieseking * .travis.yml, configure.ac, src/Doxyfile: set version to 1.9.2 * NEWS, README.md: updated NEWS and README.md * src/SVGTree.cpp: apply --precision settings to font-size attributes too 2015-04-04 Martin Gieseking * tests/SVGOutputTest.cpp: remove output files created by SVGOutputTest::getPageStream() 2015-04-02 Martin Gieseking * README.md: minor additions to README.md 2015-03-26 Martin Gieseking * src/GlyphTracerMessages.h: always skip tracer message if no glyphs have been traced * src/GFReader.cpp, src/GFReader.h, tests/GFReaderTest.cpp: improved GFReaderTest 2015-03-25 Martin Gieseking * src/GFGlyphTracer.cpp, src/GFTracer.h, tests/GFGlyphTracerTest.cpp, tests/Makefile.am: ensure GFGlyphTracer::executeChar() returns the correct status; added GFGlyphtracerTest * src/DVIToSVG.cpp: avoid retracing of fonts if option --no-fonts is given 2015-03-22 Martin Gieseking * tests/StreamWriterTest.cpp: fixed StreamWriterTest * tests/SVGOutputTest.cpp: improved SVGOutputTest 2015-03-19 Martin Gieseking * tests/Makefile.am, tests/ShadingPatch.cpp: added ShadingPatchTest 2015-03-18 Martin Gieseking * src/ShadingPatch.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h, src/TriangularPatch.cpp, src/TriangularPatch.h, tests/Makefile.am, tests/TriangularPatchTest.cpp: added test for class TriangularPatch * src/Bezier.cpp, src/Bezier.h, src/TensorProductPatch.cpp, src/TriangularPatch.cpp, src/TriangularPatch.h, tests/TriangularPatchTest.cpp: renamed method pointAt() of class Bezier and TriangularPatch to valueAt() * src/TensorProductPatch.h, tests/TensorProductPatchTest.cpp: improved TensorProductPatchTest 2015-03-17 Martin Gieseking * m4/ax_code_coverage.m4: added missing file ax_code_coverage.m4 * autogen.sh: updated autogen.sh 2015-03-15 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.h, tests/Makefile.am, tests/XMLNodeTest.cpp: fixed a few issues in class XMLElementNode; added XMLNodeTest * .gitignore, Makefile.am, clipper/Makefile.am, configure.ac, src/Makefile.am, tests/Makefile.am, tests/create-makefile: extended build system to generate coverage reports * tests/Makefile.am, tests/VectorIteratorTest.cpp: added VectorIteratorTest 2015-03-13 Martin Gieseking * tests/XMLStringTest.cpp: fixed test class name of XMLString 2015-03-09 Martin Gieseking * tests/CRC32Test.cpp: added test for 'compute' methods of class CRC32 * tests/GraphicPathTest.cpp: extended tests of class GraphicPath 2015-03-08 Martin Gieseking * src/Unicode.cpp, tests/Makefile.am, tests/UnicodeTest.cpp: fixed UTF-8 encoding of 0xfffe and 0xffff; added UnicodeTest * tests/StreamReaderTest.cpp: exteded StreamReader tests 2015-03-07 Martin Gieseking * src/XMLString.cpp, tests/Makefile.am, tests/XMLStringTest.cpp: fixed conversion from C and C++ strings to XMLString; added XMLStringTest * .gitignore: added .gitignore 2015-03-06 Martin Gieseking * src/Bitmap.cpp, src/Bitmap.h, tests/BitmapTest.cpp, tests/GFReaderTest.cpp, tests/Makefile.am: small refactorings of class Bitmap; added tests for class Bitmap * src/BoundingBox.cpp, src/BoundingBox.h, tests/BoundingBoxTest.cpp: improved BoundingBox tests 2015-03-04 Martin Gieseking * src/Bezier.cpp, src/BoundingBox.cpp, src/BoundingBox.h, tests/BezierTest.cpp, tests/Makefile.am: fixed Bezier::reduceDegree() for degree 1 and added BezierTest class 2015-03-01 Martin Gieseking * .travis.yml: Travis conf: added configuration data for Coverity Scan * README.md: added license badge to README.md 2015-02-28 Martin Gieseking * NEWS, README.md: updated NEWS and README.md 2015-02-27 Martin Gieseking * src/Calculator.cpp: replaced while(1) with for(;;) for consistency 2015-02-26 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.9.1 2015-02-25 Martin Gieseking * src/Ghostscript.cpp: disable lookup of GS library in Windows registry for old gcc versions 2015-02-20 Martin Gieseking * src/DVIToSVG.cpp, src/EPSToSVG.cpp, src/Makefile.am, src/SVGOutput.cpp, src/SVGOutput.h, src/SVGOutputBase.h, src/dvisvgm.cpp: moved class SVGOutput to separate compilation unit * doc/dvisvgm.txt.in, src/SVGOutput.cpp, src/SVGOutput.h, tests/Makefile.am, tests/SVGOutputTest.cpp, tests/create-makefile: added width specifiers and exression evaluation to --output patterns * doc/dvisvgm.txt.in: minor additions and formatting changes of the manpage * doc/Makefile.am, doc/conf-dblatex-man.xsl, doc/conf-dblatex-pdf.xsl, doc/dvisvgm.sty, doc/dvisvgm.xpr, doc/tweak-dblatex-pdf.xsl: improved the layout of the pdf manpage * doc/Makefile.am, doc/db2html.xsl, doc/dvisvgm.css: create html manpage with a separate stylesheet matching the new website theme 2015-02-19 Martin Gieseking * .travis.yml: added configuration file for Travis CI * .travis.yml: added dependency 'python-lxml' to Travis configuration * .travis.yml: added dependency 'libgtest-dev' to Travis configuration; ensure call of 'make check' * .travis.yml: Travis conf: added missing call of 'configure' * .travis.yml: Travis conf: build gtest libraries since Ubuntu doesn't provide the binaries 2015-02-18 Martin Gieseking * src/TpicSpecialHandler.cpp: use constant M_PI rather than computing PI locally 2015-02-17 Martin Gieseking * README, README.md: updated README and README.md 2015-01-26 Martin Gieseking * src/ShadingPatch.h: removed redundant methods from class ShadingPatch 2015-01-21 Martin Gieseking * src/TensorProductPatch.cpp, src/TriangularPatch.cpp: renamed static helper function clip() to snap() 2015-01-15 Martin Gieseking * src/Color.cpp: resolved ambiguous call of pow (patch by Peter Breitenlohner) 2015-01-12 Martin Gieseking * src/VectorIterator.h: removed redundant method VectorIterator::distanceToLast() 2014-12-30 Martin Gieseking * Makefile.am, README, README.md, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/Bezier.cpp, src/Bezier.h, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, src/CMapReader.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, src/CharMapID.cpp, src/CharMapID.h, src/Character.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DependencyGraph.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.cpp, src/EncFile.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicPath.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/JFM.cpp, src/JFM.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/NumericRanges.h, src/PSFilter.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSPattern.cpp, src/PSPattern.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PathClipper.cpp, src/PathClipper.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, src/PreScanDVIReader.cpp, src/PreScanDVIReader.h, src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/RangeMap.cpp, src/RangeMap.h, src/SVGOutputBase.h, src/SVGTree.cpp, src/SVGTree.h, src/ShadingPatch.cpp, src/ShadingPatch.h, src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h, src/Terminal.cpp, src/Terminal.h, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/TriangularPatch.cpp, src/TriangularPatch.h, src/Unicode.cpp, src/Unicode.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorIterator.h, src/VectorStream.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, src/psdefs.cpp, src/types.h, tests/BoundingBoxTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DependencyGraphTest.cpp, tests/DirectoryTest.cpp, tests/DvisvgmSpecialTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/RangeMapTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, tests/TensorProductPatchTest.cpp, tests/ToUnicodeMapTest.cpp, tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/check-conv, tests/create-makefile, tests/normalize.xsl: updated year in copyright statements to 2015 2014-12-28 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/ShadingPatch.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h, src/TriangularPatch.cpp, src/TriangularPatch.h, src/dvisvgm.cpp, src/options.xml: added command-line options --grad-overlap, --grad-segments, and --grad-simplify * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSToSVG.cpp, src/EPSToSVG.h, src/SpecialActions.h, src/SpecialManager.cpp, src/dvisvgm.cpp: show PS instruction counter when processing EPS files with option --progress * src/dvisvgm.cpp: clear line before printing the message about user interruption to avoid trailing text fragments * configure.ac, src/Doxyfile: set version to 1.9 * NEWS: updated NEWS 2014-12-20 Martin Gieseking * src/DVIReader.cpp: check validity of DVI file before trying to collect the BOPs 2014-12-18 Martin Gieseking * src/Makefile.am, src/TriangularPatch.cpp, src/TriangularPatch.h: added class to compute triangular shading patches * src/Makefile.am, src/PsSpecialHandler.cpp, src/ShadingPatch.cpp, src/ShadingPatch.h, src/TensorProductPatch.cpp, src/TensorProductPatch.h: extracted common interface class ShadingPatch from TensorProductPatch * src/Color.cpp, src/Color.h, src/Makefile.am, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/VectorIterator.h, src/psdefs.cpp: extended PS operator 'shfill' to support triangular patch meshes 2014-12-16 Martin Gieseking * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: added processing of the optional 'BBox' entry in a PS shading dictionary 2014-12-03 Martin Gieseking * src/CommandLine.cpp, src/CommandLine.h, src/dvisvgm.cpp, src/options.xml: disable option --clipjoin if PS support is disabled * src/Color.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp: fixed CMYK to RGB approximation 2014-11-27 Martin Gieseking * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.cpp, tests/PSInterpreterTest.cpp: added evaluation of PS operator shfill (Coons and tensor product patches only) 2014-11-24 Martin Gieseking * README.md: added list of features and a download button to README.md 2014-11-09 Martin Gieseking * clipper/clipper.cpp, clipper/clipper.hpp: updated clipper library to version 6.2.1 2014-11-08 Martin Gieseking * src/Bezier.cpp, src/Bezier.h, src/BoundingBox.h, src/GraphicPath.h, src/Makefile.am, src/TensorProductPatch.cpp, src/TensorProductPatch.h, tests/Makefile.am, tests/TensorProductPatchTest.cpp: added code to compute tensor-product patches required for gradient fills 2014-11-06 Martin Gieseking * src/Matrix.cpp: use constant M_PI rather than defining PI locally 2014-10-23 Martin Gieseking * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/PsSpecialHandler.cpp, tests/ColorTest.cpp: replaced float by double in class Color * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/DVIReader.cpp, src/HtmlSpecialHandler.cpp, src/PsSpecialHandler.cpp, tests/ColorTest.cpp: renamed RGB setters/getters of class Color * src/Color.cpp, src/Color.h: replaced vectors with valarrays in class Color * src/Color.cpp, src/Color.h, tests/ColorTest.cpp: added deltaE and L*a*b* color space methods to class Color 2014-10-17 Martin Gieseking * clipper/clipper.cpp, clipper/clipper.hpp: updated clipper library to version 6.2.0 * src/GraphicPath.h, src/PathClipper.cpp, src/PathClipper.h, src/XMLNode.h: fixed a couple of doxygen comments; removed redundant PathClipperException 2014-10-08 Martin Gieseking * src/CommandLine.cpp: updated CommandLine.cpp with description of option --no-merge * src/Ghostscript.cpp: try to lookup the location of the GS DLL in the Windows registry 2014-10-01 Martin Gieseking * doc/dvisvgm.txt.in, src/options.xml: added info about option --no-merge to the manpage 2014-09-24 Khaled Hosny * src/Makefile.am: Add an opt2cpp Python script A very ugly script that should work as a drop in replacement for the opt2cpp XSLT. 2014-09-15 Martin Gieseking * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: ensure that colors set by a color special are always considered by the PS handler 2014-09-10 Martin Gieseking * src/BasicDVIReader.cpp, src/DVIReader.cpp, src/FontCache.cpp, src/GFReader.cpp, src/dvisvgm.cpp: replaced namespace 'ios_base' with 'ios' 2014-08-29 Martin Gieseking * src/PsSpecialHandler.cpp: added missing whitespace boundaries in PS code * src/FontEngine.cpp, tests/PageRagesTest.cpp: removed unused static functions * configure.ac, src/Doxyfile: set version to 1.8.1 * NEWS: updated NEWS 2014-08-18 Martin Gieseking * src/DVIToSVG.cpp, src/DependencyGraph.h, src/Makefile.am, src/SVGTree.cpp, src/SVGTree.h, src/XMLNode.cpp, src/XMLNode.h, tests/DependencyGraphTest.cpp, tests/Makefile.am: remove redundant clipPath elements from generated SVG files 2014-08-16 Martin Gieseking * src/PSPattern.cpp, src/XMLNode.cpp, src/XMLNode.h: renamed XMLElementNode::findDescendants() and made it constant 2014-08-11 Martin Gieseking * tests/Makefile.am, tests/create-makefile: link tests against FreeType library * README.md: minor fixed to README.md 2014-08-10 Khaled Hosny * configure.ac, src/Makefile.am: Don't override CXXFLAGS in configure script Breaks standard things like: make CXXFLAGS="-g -O0 -pg" * configure.ac, src/Makefile.am: Don't override CPPFLAGS and LDFLAGS in configure For the same reasons as the previous commit 2014-08-07 Martin Gieseking * src/dvisvgm.cpp: removed old code that moved cache files to new location * src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h: removed unused emit() methods from XML classes 2014-07-31 Martin Gieseking * src/PsSpecialHandler.cpp, src/psdefs.cpp: prevent side-effects caused by bop/eop operators present in PS specials 2014-07-29 Martin Gieseking * NEWS: updated NEWS 2014-07-28 Martin Gieseking * src/GraphicPath.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.cpp, tests/PSInterpreterTest.cpp: added evaluation of PS operator 'clippath' (copies clipping path into graphics path) * configure.ac, src/Doxyfile: set version to 1.8 2014-07-26 Martin Gieseking * src/Font.cpp, src/GFGlyphTracer.cpp, src/GraphicPath.h, src/PsSpecialHandler.cpp: renamed GraphicPath::newpath() to GraphicPath::clear() 2014-07-24 Martin Gieseking * src/InputReader.cpp, src/PSInterpreter.cpp: ensure that InputReader::compare() checks whole and not just partial words 2014-07-22 Martin Gieseking * src/DVIToSVG.h, src/dvisvgm.cpp: prevent throwing a DVIException when option -l is present * Makefile.am, clipper/License.txt, clipper/Makefile.am, clipper/clipper.cpp, clipper/clipper.hpp, configure.ac, src/Makefile.am: added slightly modified sources of clipper library (computes boolops on polygons) * src/GraphicPath.h: added field to store the winding rule to class GraphicPath * README, README.md, src/Bezier.cpp, src/Bezier.h, src/GraphicPath.h, src/Makefile.am, src/PathClipper.cpp, src/PathClipper.h, src/dvisvgm.cpp: added class PathClipper to compute intersections of closed curved graphics paths * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/dvisvgm.cpp, src/options.xml: added option --clippath to compute the intersection of clipping paths 2014-07-20 Khaled Hosny * src/FontEngine.cpp: Free existing FT_Face before creating a new one FontEngine was never destroying the FT_Face's it creates, except the very last one that was destroyed by the destructor. For some reason, this was causing FT_New_Face() to fail on Windows after processing the first hundred or so pages of DVI files. 2014-07-18 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/GraphicPath.h, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, src/options.xml, tests/GraphicPathTest.cpp: added option to create relative rather than absolute path commands * src/TpicSpecialHandler.cpp: TPIC handler: use class GraphicPath to create SVG path commands 2014-07-07 Martin Gieseking * src/DVIToSVGActions.h, src/Doxyfile, src/HtmlSpecialHandler.h, src/RangeMap.cpp, src/SpecialManager.cpp, src/ToUnicodeMap.cpp: fixed a couple of broken doxygen comments 2014-06-25 Martin Gieseking * src/Ghostscript.cpp: get proper name of Ghostscript library when building for Cygwin 2014-06-23 Martin Gieseking * README.md: added markdown version of README 2014-06-20 Martin Gieseking * src/psdefs.cpp: suppress output of PS operator ':show' to prevent the creation of additional graphic elements 2014-06-17 Martin Gieseking * src/SpecialManager.cpp, src/SpecialManager.h: removed redundant method SpecialManager::leavePSHeaderSection() * doc/dvisvgm.txt.in, src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, tests/DvisvgmSpecialTest.cpp, tests/Makefile.am: added/improved dvisvgm::raw* specials * src/InputReader.cpp: added missing include * configure.ac, src/Doxyfile: set version to 1.7 * NEWS: updated NEWS 2014-06-12 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.h: added clear() to XMLNode classes; added XMLTextNode::getText() 2014-06-11 Martin Gieseking * src/InputReader.cpp, src/InputReader.h: added InputReader::getLine() * src/DVIToSVG.cpp, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: added listener to allow SpecialHandlers being notified when pre-processing has finished 2014-06-10 Martin Gieseking * src/SpecialActions.h, tests/ColorSpecialTest.cpp: renamed class SpecialEmptyActions to EmptySpecialActions 2014-06-09 Martin Gieseking * src/DVIReader.cpp, src/Ghostscript.cpp: removed unused variable; call Ghostscript::exit() with explicitely given object * src/DVIToSVG.h, src/SpecialManager.h: removed redundant definition of assignment operators 2014-06-05 Martin Gieseking * src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIReader.h, src/Makefile.am: moved basic funtionality of DVIReader to base class BasicDVIReader * src/BasicDVIReader.h, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVG.h, src/dvisvgm.cpp: moved call of executePreamble() and executePostamble() from DVIToSVG to DVIReader * src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, src/PreScanDVIReader.cpp, src/PreScanDVIReader.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h: pre-process DVI file to collect required data not present in the page ranges to be converted * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/SpecialManager.cpp, src/SpecialManager.h, src/dvisvgm.cpp: made class SpecialManager a singleton * src/BasicDVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: allow to replace the DVI reader assigned to an instance of DVIToSVGActions * doc/dvisvgm.txt.in, src/BasicDVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSToSVG.cpp, src/EPSToSVG.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/PreScanDVIReader.cpp, src/PreScanDVIReader.h, src/SpecialActions.h: process hyperref anchors and links across pages * src/BasicDVIReader.cpp, src/BasicDVIReader.h, src/Bitmap.h, src/BoundingBox.h, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.h, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, src/CmdLineParserBase.h, src/Color.cpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.h, src/DVIReader.cpp, src/DVIToSVG.h, src/DVIToSVGActions.h, src/Directory.h, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.h, src/FileFinder.h, src/FileSystem.cpp, src/Font.cpp, src/Font.h, src/FontCache.h, src/FontEncoding.cpp, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/GraphicPath.h, src/HtmlSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, src/JFM.h, src/Length.cpp, src/Length.h, src/MapLine.cpp, src/MapLine.h, src/Matrix.cpp, src/Matrix.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/NoPsSpecialHandler.h, src/NumericRanges.h, src/PSInterpreter.h, src/PSPattern.h, src/PSPreviewFilter.h, src/PageRanges.h, src/PageSize.h, src/Pair.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.h, src/SignalHandler.h, src/SpecialActions.h, src/SpecialManager.h, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, src/TFM.h, src/ToUnicodeMap.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFReader.cpp, src/VectorStream.h, src/XMLDocument.h, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/types.h: replaced leading spaces by tabs; removed trailing whitespace 2014-06-03 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.h: removed redundant variable DVIReader::_prevBop * src/PsSpecialHandler.cpp: fixed incorrect extent values shown when applying a preview bbox (bp->pt) 2014-06-01 Martin Gieseking * src/EPSFile.cpp, src/GFReader.cpp: replaced relative variant of seekg() by absolute one where possible * src/DVIReader.cpp, src/DVIReader.h: removed redundant code from DVIReader::evalCommand() 2014-05-31 Martin Gieseking * src/DVIReader.cpp, src/VFReader.cpp: few code adjustments * src/DVIReader.cpp, src/StreamReader.cpp, src/StreamReader.h, src/VFReader.cpp: removed StreamReader::in() * src/DVIReader.cpp, src/StreamReader.h, src/VFReader.cpp: renamed some methods of class StreamReader 2014-05-29 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.h, src/StreamReader.h: collect all DVI BOP offsets to reach them quickly * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h: removed DVIReader::_totalPages; use number of BOP offsets instead * src/DVIReader.cpp, src/DVIReader.h, src/dvisvgm.cpp: simplified computation of progress ratio * src/DVIReader.cpp, src/DVIReader.h: simplified DVIReader::executePage; removed DVIReader::executePages 2014-05-22 Martin Gieseking * src/Font.cpp, src/Makefile.am, src/Unicode.cpp, src/Unicode.h, src/XMLString.cpp: moved unicode-related funtions to separate class * src/CharMap.cpp, src/CharMap.h, src/Font.cpp, src/FontEngine.cpp, src/FontEngine.h: removed redundant method CharMap::invert() * src/CMap.cpp, src/CMap.h, src/Makefile.am, src/RangeMap.cpp, src/RangeMap.h, tests/Makefile.am, tests/RangeMapTest.cpp: extracted class RangeMap previously implemented as part of SegmentedCMap * src/RangeMap.cpp: fixed right joins of touching ranges in a RangeMap * src/CharMap.cpp, src/CharMap.h, src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontEngine.h, src/Makefile.am: replaced class CharMap with more generic class RangeMap * src/DVIToSVG.cpp, src/Makefile.am, src/NumericRanges.h, src/PageRanges.cpp, src/PageRanges.h, tests/PageRagesTest.cpp: extracted functionality of class PageRanges to separate class NumericRanges * src/Makefile.am, src/RangeMap.h, src/ToUnicodeMap.cpp, src/ToUnicodeMap.h, tests/Makefile.am, tests/ToUnicodeMapTest.cpp: added class ToUnicodeMap to handle mappings from character indexes to unicode points * src/Makefile.am: Makefile: put source files on separate lines 2014-04-30 Martin Gieseking * src/CharMapID.cpp, src/CharMapID.h, src/DVIReader.cpp, src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontEngine.h: try to add unicode mappings missing in a font's cmap table 2014-04-29 Martin Gieseking * src/SVGTree.cpp: don't add unnecessary element 'missing-glyph' to SVG files 2014-04-24 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/options.xml: renamed argument of option --linkmark from 'type' to 'style' 2014-04-23 Martin Gieseking * src/System.h: removed redundant semicolon 2014-04-22 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.6 * NEWS: updated NEWS 2014-04-21 Martin Gieseking * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/EPSToSVG.cpp: removed date and machine triplet from generated SVG files 2014-04-18 Martin Gieseking * doc/dvisvgm.txt.in, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h: added optional selection of line/box colors to option --linkmark 2014-04-17 Martin Gieseking * src/CommandLine.h, src/DVIToSVG.cpp, src/EPSToSVG.cpp: don't link GS messages unnecessarily if HAVE_LIBGS is defined * src/DVIReader.h, src/DVIToSVGActions.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/SpecialActions.h: only split hyperlink boxes on line breaks * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/options.xml: changed default argument of option --linkmark to 'box' 2014-04-16 Martin Gieseking * src/DLLoader.cpp: prevent calling dlopen() if the length of the string argument is 0 * doc/dvisvgm.txt.in, src/Ghostscript.cpp: if libgs is loaded during runtime, look for libgs.so.X instead of libgs.so * src/Ghostscript.cpp, src/dvisvgm.cpp: moved lookup of MiKTeX's GS DLL to get_libgs() * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, src/options.xml: added command-line option --zoom 2014-04-11 Martin Gieseking * src/CMap.cpp, src/CmdLineParserBase.cpp, src/ColorSpecialHandler.cpp, src/DVIReader.cpp, src/DVIToSVGActions.cpp, src/Doxyfile, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EPSFile.cpp, src/EmSpecialHandler.cpp, src/FileFinder.cpp, src/FileSystem.cpp, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontMap.cpp, src/GraphicPath.h, src/PSInterpreter.cpp, src/PageRanges.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/SVGTree.h, src/SpecialManager.cpp, src/Subfont.cpp, src/TFM.cpp, src/TpicSpecialHandler.cpp, src/XMLDocument.cpp, src/XMLNode.cpp, src/dvisvgm.cpp: fixed issues in the doxygen documentation * configure.ac, src/Doxyfile: set version to 1.5.3 * NEWS: updated NEWS 2014-04-09 Martin Gieseking * src/DVIToSVGActions.cpp: equalize implementations of moveToX and moveToY * src/BoundingBox.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, src/EPSToSVG.cpp, src/EmSpecialHandler.cpp, src/Font.h, src/FontManager.cpp, src/GFGlyphTracer.cpp, src/GFReader.cpp, src/GFTracer.cpp, src/GFTracer.h, src/GraphicPath.h, src/HtmlSpecialHandler.h, src/Makefile.am, src/PSPattern.cpp, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PageSize.cpp, src/PageSize.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TFM.cpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFReader.cpp: switched internal computations from TeX points (pt) to PS points (bp) 2014-02-05 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.h: ensure updating the SVG cursor position when executing DVI command set_rule 2014-01-13 Martin Gieseking * src/Ghostscript.cpp: check if library given by --libgs is actually a GS library 2014-01-10 Martin Gieseking * NEWS: updated NEWS 2014-01-03 Martin Gieseking * src/FileFinder.cpp: catch exceptions thrown by MiKTeXCom object * src/Directory.cpp: initialize Directory member variables (Win only) * src/FileFinder.cpp: return 'unknown' if MiKTeX version can't be retrieved * configure.ac, src/Doxyfile: set version to 1.5.2 2014-01-02 Martin Gieseking * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, src/CMapReader.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, src/CharMap.cpp, src/CharMap.h, src/CharMapID.cpp, src/CharMapID.h, src/Character.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/EncFile.cpp, src/EncFile.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/FontMetrics.cpp, src/FontMetrics.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicPath.h, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/JFM.cpp, src/JFM.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/PSFilter.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSPattern.cpp, src/PSPattern.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h, src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGOutputBase.h, src/SVGTree.cpp, src/SVGTree.h, src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/Subfont.cpp, src/Subfont.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/Terminal.cpp, src/Terminal.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, src/psdefs.cpp, src/types.h, tests/BoundingBoxTest.cpp, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/SubfontTest.cpp, tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/check-conv, tests/create-makefile, tests/normalize.xsl: updated year in copyright statements to 2014 2014-01-01 Martin Gieseking * src/MiKTeXCom.cpp: prevent releasing MiKTeX object if its initialization failed 2013-12-29 Martin Gieseking * src/Font.cpp: check if units per EM are not 0 to prevent divisions by zero * src/Directory.cpp, src/Directory.h, src/FontMap.cpp, tests/DirectoryTest.cpp: changed directory entry types from char to enums * src/FontCache.cpp: catch potential StreamReaderException 2013-12-18 Martin Gieseking * src/BoundingBox.cpp: explicitely initialize BoundingBox fields * src/FontCache.cpp: avoid accessing strings constructed from temporaries * src/Matrix.cpp: ensure return value of istream::get() is assigned to int vars * src/DVIReader.cpp: check if denominator of DVI unit is non-zero * src/DvisvgmSpecialHandler.cpp, src/FontCache.cpp: ensure null pointer checks before dereferencing * src/FontCache.cpp, src/SpecialManager.cpp: restore stream format flags * src/DVIReader.cpp, src/Directory.cpp, src/GFReader.cpp: added missing initializations of member variables 2013-12-09 Martin Gieseking * src/BgColorSpecialHandler.h, src/Bitmap.h, src/BoundingBox.h, src/CMap.h, src/CMapManager.h, src/CMapReader.h, src/Calculator.h, src/CharMap.h, src/CharMapID.h, src/Character.h, src/CmdLineParserBase.h, src/Color.h, src/ColorSpecialHandler.h, src/CommandLine.h, src/DLLoader.h, src/DVIActions.h, src/DVIReader.h, src/DVIToSVG.h, src/DVIToSVGActions.h, src/Directory.h, src/DvisvgmSpecialHandler.h, src/EPSFile.h, src/EPSToSVG.h, src/EmSpecialHandler.h, src/EncFile.h, src/FileFinder.h, src/FilePath.h, src/FileSystem.h, src/Font.h, src/FontCache.h, src/FontEncoding.h, src/FontEngine.h, src/FontManager.h, src/FontMap.h, src/FontMetrics.h, src/GFGlyphTracer.h, src/GFReader.h, src/GFTracer.h, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicPath.h, src/HtmlSpecialHandler.h, src/InputBuffer.h, src/InputReader.h, src/JFM.h, src/Length.h, src/MapLine.h, src/Matrix.h, src/Message.h, src/MessageException.h, src/MetafontWrapper.h, src/MiKTeXCom.h, src/NoPsSpecialHandler.h, src/PSFilter.h, src/PSInterpreter.h, src/PSPattern.h, src/PSPreviewFilter.h, src/PageRanges.h, src/PageSize.h, src/Pair.h, src/PdfSpecialHandler.h, src/Process.h, src/PsSpecialHandler.h, src/SVGOutputBase.h, src/SVGTree.h, src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.h, src/StreamReader.h, src/StreamWriter.h, src/Subfont.h, src/System.h, src/TFM.h, src/Terminal.h, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.h, src/VectorStream.h, src/XMLDocument.h, src/XMLNode.h, src/XMLString.h, src/macros.h, src/types.h: prefixed include guards with DVISVGM_ to prevent ambiguities with external headers 2013-11-16 Martin Gieseking * src/DVIReader.cpp, src/SVGTree.cpp, src/SVGTree.h: don't let global font colors interfere with color specials 2013-10-29 Martin Gieseking * NEWS: updated NEWS 2013-10-28 Martin Gieseking * src/Bitmap.cpp, src/Color.cpp, src/JFM.cpp, src/Matrix.cpp: added missing #includes of header file * src/FileSystem.cpp, src/MetafontWrapper.cpp: added explicit casts from ifstream to bool * src/DVIReader.cpp: temporarily reactivated processing of font definitions located in the postamble * configure.ac, src/Doxyfile: set version to 1.5.1 2013-10-27 Martin Gieseking * src/DVIToSVG.cpp: suppress output of logical page number if it equals physical page number 2013-10-16 Martin Gieseking * src/PSPreviewFilter.cpp, src/PsSpecialHandler.cpp: ensure proper evaluation of tightpage data if multiple pages are processed 2013-10-12 Martin Gieseking * src/InputBuffer.h: don't check unsigned variables for negative values * src/Color.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: added 'const' to read-only methods 2013-09-21 Martin Gieseking * src/FontCache.cpp, src/FontCache.h: renamed FontCache::VERSION to FontCache::FORMAT_VERSION * src/DVIToSVG.cpp, src/Ghostscript.h, src/dvisvgm.cpp: added missing guards and functions to prevent compilation errors if DISABLE_GS is set * src/DVIToSVG.cpp: changed warning message that appears if PS support has been disabled permanently 2013-09-01 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/Bitmap.cpp, src/BoundingBox.cpp, src/CMap.cpp, src/CMapManager.cpp, src/CMapReader.cpp, src/CRC32.cpp, src/Calculator.cpp, src/CharMap.cpp, src/CmdLineParserBase.cpp, src/Color.cpp, src/ColorSpecialHandler.cpp, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DVIActions.cpp, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/Directory.cpp, src/DvisvgmSpecialHandler.cpp, src/EPSFile.cpp, src/EPSToSVG.cpp, src/EmSpecialHandler.cpp, src/EncFile.cpp, src/FileFinder.cpp, src/FilePath.cpp, src/FileSystem.cpp, src/Font.cpp, src/FontCache.cpp, src/FontEncoding.cpp, src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMetrics.cpp, src/GFGlyphTracer.cpp, src/GFReader.cpp, src/GFTracer.cpp, src/Ghostscript.cpp, src/Ghostscript.h, src/HtmlSpecialHandler.cpp, src/InputBuffer.cpp, src/InputReader.cpp, src/JFM.cpp, src/Length.cpp, src/MapLine.cpp, src/Matrix.cpp, src/Message.cpp, src/MetafontWrapper.cpp, src/MiKTeXCom.cpp, src/NoPsSpecialHandler.cpp, src/PSInterpreter.cpp, src/PSPattern.cpp, src/PSPreviewFilter.cpp, src/PageRanges.cpp, src/PageSize.cpp, src/PdfSpecialHandler.cpp, src/Process.cpp, src/PsSpecialHandler.cpp, src/SVGTree.cpp, src/SignalHandler.cpp, src/SpecialManager.cpp, src/StreamReader.cpp, src/StreamWriter.cpp, src/Subfont.cpp, src/System.cpp, src/TFM.cpp, src/Terminal.cpp, src/TpicSpecialHandler.cpp, src/VFReader.cpp, src/XMLDocument.cpp, src/XMLNode.cpp, src/XMLString.cpp, src/dvisvgm.cpp: include config.h at the top of every translation unit * src/DLLoader.h, src/Directory.h: moved #define NOMINMAX to Windows config.h * configure.ac, src/Doxyfile: set version to 1.5 * NEWS: updated NEWS 2013-08-30 Martin Gieseking * src/FontMetrics.h, src/JFM.cpp, src/JFM.h, src/TFM.h: added retrieval of vertical mode flag to class FontMetrics * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontEngine.h, src/FontMetrics.h, src/JFM.h, src/SVGTree.cpp, src/SVGTree.h, src/TFM.h, src/dvisvgm.cpp: added support for DVI format 3 (pTeX, vertical mode) * src/DVIReader.cpp, src/DVIReader.h, src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontStyle.h, src/SVGTree.cpp, src/dvisvgm.cpp: added support for XDV (DVI format 5) files * src/Font.cpp, src/Font.h, src/XMLString.cpp: replaced entity references by corresponding UTF-8 characters; use correct unicode points rather than DVI charcodes * doc/dvisvgm.txt.in: updated manpage 2013-08-29 Martin Gieseking * src/CharMap.cpp, src/CharMap.h, src/Font.cpp, src/Font.h, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/Makefile.am: replaced local std::map tables used in Font classes with new class CharMap 2013-08-23 Martin Gieseking * src/SVGTree.cpp: appended px unit to font-size attributes in style section 2013-08-22 Martin Gieseking * src/XMLString.cpp: replace very small floating point numbers by 0 2013-08-20 Martin Gieseking * src/FileFinder.cpp: suppress error messages from makeFOO tools 2013-08-13 Martin Gieseking * src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/EncFile.h, src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h: derive EncodingPair from FontEncoding * src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h: moved assignment of base font map to Font class 2013-08-11 Martin Gieseking * configure.ac, src/FileFinder.cpp: check if the kpathsea library is C++-safe (patch by Peter Breitenlohner) * src/dvisvgm.cpp: fix number of dashes printed by -V1 2013-08-08 Martin Gieseking * src/Matrix.cpp, src/Matrix.h: renamed Matrix skewing methods 2013-08-04 Martin Gieseking * src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/FontStyle.h, src/Makefile.am: store pointers to font map and encoding in Font objects to speed up looking them up * src/Ghostscript.h, src/PSPreviewFilter.cpp, src/PsSpecialHandler.cpp: added missing variable initializations 2013-08-03 Martin Gieseking * src/CMapManager.cpp, src/CMapManager.h, src/FontManager.cpp: avoid const_cast in CMapManager 2013-08-02 Martin Gieseking * src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp: disable font processing while scanning PS header specials * src/CMap.h, src/CMapManager.cpp: properly handle 'unicode' encoding entries set in font map 2013-08-01 Martin Gieseking * src/XMLDocument.cpp, src/XMLString.cpp: changed encoding of SVG files from ISO-8859-1 to UTF-8 * src/DVIToSVG.cpp, src/Makefile.am, src/SVGTree.cpp, src/XMLDocTypeNode.h: removed DOCTYPE declaration from generated files as suggested by the SVG specification * src/DVIToSVG.cpp: removed redundant #include statements * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.h, src/EPSToSVG.h, src/Matrix.cpp, src/Matrix.h, src/PsSpecialHandler.cpp, src/SpecialActions.h, src/dvisvgm.cpp: apply page transformations to width, height, and depth of preview bbox * NEWS: updated NEWS * configure.ac, src/Doxyfile: set version to 1.4 2013-07-31 Martin Gieseking * src/CMap.cpp, src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, src/CMapReader.h, src/FontManager.cpp, src/Makefile.am, tests/CMapTest.cpp, tests/Makefile.am: added classes to handle CMap files * src/CMap.cpp, src/CMap.h, src/CMapManager.h, src/EncFile.cpp, src/EncFile.h, src/FileFinder.cpp, src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/Makefile.am, tests/CMapTest.cpp: derive .enc encoding vectors and CMaps from common base class FontEncoding * src/CMap.cpp, src/CMap.h, src/Character.h, src/EncFile.h, src/Font.cpp, src/Font.h, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/Makefile.am, tests/CMapTest.cpp: added Character class to handle character names, codes, and indexes consistently * src/FileFinder.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp: added support for OTF fonts * src/Font.cpp, src/Font.h, src/FontMetric.cpp, src/FontMetric.h, src/FontMetrics.cpp, src/FontMetrics.h, src/Makefile.am, src/TFM.h: renamed class FontMetric to FontMetrics * src/CMap.cpp, src/CMap.h, src/CMapReader.cpp, src/CMapReader.h, tests/CMapReaderTest.cpp, tests/CMapTest.cpp, tests/Makefile.am: added evaluation of base font (bf) sections in CMap files * src/CMap.h, src/CMapManager.cpp, src/CMapManager.h, src/CMapReader.cpp, src/CharMapID.cpp, src/CharMapID.h, src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/Makefile.am: try to decode characters of non-CID fonts that have a CMap assigned in the fontmap 2013-07-27 Martin Gieseking * src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h: moved lookup of the encoding of a font to the Font class * src/JFM.cpp: fixed retrieval of char indexes if a JFM contains entries of chartype 0 only * src/BgColorSpecialHandler.h, src/DVIToSVG.cpp, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: ensure that PS header code is evaluated before the page/body code; also execute bop-hook and eop-hook * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp: added funtion to execute PS code snippets and retrieve their results * doc/dvisvgm.txt.in, src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EPSToSVG.cpp, src/Makefile.am, src/PSFilter.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSPreviewFilter.cpp, src/PSPreviewFilter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: added evaluation of bounding box information created by preview package 2013-07-23 Martin Gieseking * src/EPSToSVG.cpp: print warning message if height or width of EPS bbox is 0 * src/psdefs.cpp: PS handler: call newpath before executing charpath in operator show * src/FontMap.cpp: check for EOF prior to try to parse another mapline 2013-07-18 Martin Gieseking * src/psdefs.cpp: replaced PS operator prval with =only in psdefs 2013-07-17 Martin Gieseking * src/DVIToSVG.cpp: ensure catching PSExceptions while processing PS header specials to prevent segfaults * src/psdefs.cpp: properly store PS operator applyscalevals in systemdict 2013-07-14 Martin Gieseking * src/Process.cpp, src/Process.h: extended Process::run() to grab the output written to stdout * src/FileFinder.cpp, src/FileFinder.h: FileFinder: added lookup of cmap files 2013-07-08 Martin Gieseking * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp: command-line parser: changed type of argument mode from char to enum 2013-06-17 Martin Gieseking * src/FileFinder.cpp: removed redundant 'using namespace std' 2013-06-03 Martin Gieseking * doc/dvisvgm.txt.in, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/dvisvgm.cpp: extend option --linkmark to highlight linked areas by a given background color 2013-06-01 Martin Gieseking * src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/SpecialActions.h, tests/ColorSpecialTest.cpp, tests/ColorTest.cpp, tests/Makefile.am: use Color class in ColorSpecialHandler rather than local code; added ColorTest 2013-05-22 Martin Gieseking * src/dvisvgm.cpp: added a missing (underlining) hyphen to the output of -V1 2013-05-17 Martin Gieseking * src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h: added missing NoPsSpecialhandler files 2013-05-13 Martin Gieseking * src/Font.cpp, src/Font.h, src/FontManager.h, src/FontMetric.cpp, src/FontMetric.h, src/Makefile.am, src/TFM.cpp, src/TFM.h: handle invalid TFM files properly * src/Font.cpp, src/FontMetric.cpp, src/FontMetric.h, src/JFM.cpp, src/JFM.h, src/Makefile.am, src/StreamReader.h, src/TFM.cpp, src/TFM.h: added support for Japanese font metric (JFM) files * src/FileFinder.cpp, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/dvisvgm.cpp: try to load the Ghostscript library that comes with MiKTeX * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/HtmlSpecialHandler.cpp, src/HtmlSpecialHandler.h, src/Makefile.am, src/SpecialManager.cpp: added support of hyperref specials * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/HtmlSpecialHandler.cpp, src/dvisvgm.cpp, src/options.xml: added option --linkmark to select the highlighing variant for hyperlinks * configure.ac, src/Doxyfile: set version to 1.3 * NEWS: updated NEWS 2013-05-02 Martin Gieseking * AUTHORS, Makefile.am, README, configure.ac, potracelib/Makefile.am, potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: removed bundled potrace library * src/SVGTree.cpp, src/SVGTree.h: added methods to push and pop 'context elements' to a page that wrap parts of the page contents * src/DVIToSVGActions.h, src/EPSToSVG.h, src/SpecialActions.h: provide the context push/pop methods of class SVGTree to special handlers * src/InputReader.cpp, src/InputReader.h: added optional parameter 'quotechar' to InputReader::parseAttributes() * src/EmSpecialHandler.h, src/NoPsSpecialHandler.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.h: moved DVI listener methods to dedicated listener interface classes * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/NoPsSpecialHandler.cpp, src/NoPsSpecialHandler.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: added page number parameter to DVIEndPageListener::dviEndPage() 2013-05-01 Martin Gieseking * src/DVIToSVGActions.cpp, src/Terminal.cpp, src/Terminal.h: disable cursor when showing the progress indicator (Windows only) 2013-04-26 Martin Gieseking * src/DVIToSVG.cpp: don't link NoPsSpecialHandler if HAVE_LIBGS 2013-04-25 Martin Gieseking * src/FontEncoding.cpp: fixed bracketing bug that prevented lookup of fontmap files 2013-04-24 Martin Gieseking * src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/Matrix.cpp, src/Matrix.h, src/MessageException.h, src/PageSize.cpp, src/PageSize.h, src/StreamReader.cpp, src/StreamReader.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocument.cpp, src/XMLDocument.h: added missing underscores to private member variables * configure.ac, src/Doxyfile: set version to 1.2.2 * NEWS: updated NEWS 2013-04-23 Martin Gieseking * src/DVIToSVG.cpp, src/EPSToSVG.cpp, src/dvisvgm.cpp: avoid output of empty parentheses if TARGET_SYSTEM is not set * doc/dvisvgm.txt.in, src/CmdLineParserBase.cpp, src/CommandLine.cpp, src/options.dtd, src/options.xml: added information about 'dvisvgm -E' to usage line * src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.h, src/CmdLineParserBase.h, src/DVIToSVGActions.cpp, src/Message.cpp, src/VFReader.cpp: added missing member initializations to some classes 2013-04-20 Martin Gieseking * src/DVIToSVG.cpp, src/Makefile.am, src/SpecialManager.cpp: print a warning message if PS specials are found but ignored 2013-04-15 Martin Gieseking * src/FileFinder.cpp, src/dvisvgm.cpp: catch MessageException if MiKTeX version can't be obtained 2013-04-09 Martin Gieseking * tests/Makefile.am, tests/create-makefile: updated tests/Makefile.am to honor system potracelib if present * configure.ac, src/Doxyfile: set version to 1.2.1 * NEWS: updated NEWS 2013-04-08 Martin Gieseking * doc/dvisvgm.txt.in, src/Color.cpp, src/Color.h, src/DVIToSVGActions.cpp: allow the background color special to insert white rectancles * src/PageRanges.h: dropped unused variable PageRanges::_max 2013-04-04 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.h: unhide derived method XMLDeclarationNode::append 2013-03-10 Martin Gieseking * Makefile.am, configure.ac: don't build bundled potracelib if system library is used (patch by Alexis Ballier) 2013-03-03 Martin Gieseking * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: updated bundled potrace library to version 1.11 2013-03-02 Martin Gieseking * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/decompose.h, potracelib/lists.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h, src/EPSFile.cpp, src/EPSToSVG.cpp, src/EPSToSVG.h, src/PSPattern.cpp, src/PSPattern.h, src/SVGOutputBase.h: converted DOS line endings 2013-02-28 Martin Gieseking * src/Makefile.am, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PSPattern.cpp, src/PSPattern.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.psc, tests/PSInterpreterTest.cpp: PS handler: added support of tiling patterns * src/Makefile.am, src/PSInterpreter.cpp, src/psdefs.cpp, src/psdefs.psc: make psdefs a separate compilation unit * tests/MapLineTest.cpp: prevent MapLineTest from failing if file UGBK.sfd is not available * src/psdefs.cpp: improved processing of PS operator 'show' * configure.ac, src/Doxyfile: set version to 1.2 * NEWS: updated NEWS 2013-02-21 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.h: added virtual constructor XMLNode::clone() * src/XMLNode.cpp, src/XMLNode.h: added methods to lookup attribute values and selected descendant XML nodes 2013-02-19 Martin Gieseking * src/PSInterpreter.cpp, src/PSInterpreter.h: added PSInterpreter::limit() to limit the number of bytes to be processed * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/EPSFile.cpp, src/EPSFile.h, src/EPSToSVG.cpp, src/EPSToSVG.h, src/Makefile.am, src/PsSpecialHandler.cpp, src/SVGOutputBase.h, src/dvisvgm.cpp, src/options.xml: add option to directly convert EPS files to SVG * src/FilePath.cpp: adapt path separators on Windows systems to get the correct output path 2013-02-11 Martin Gieseking * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, src/CommandLine.h: applied a few refactorings to the command-line parser 2013-02-07 Martin Gieseking * doc/dvisvgm.txt.in, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, src/CommandLine.h, src/dvisvgm.cpp, src/options.xml: added optional parameter to option --help to specify output format 2013-02-06 Martin Gieseking * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/CommandLine.cpp, src/CommandLine.h, src/EmSpecialHandler.cpp, src/GraphicPath.h, src/Matrix.cpp, src/PsSpecialHandler.cpp, src/TpicSpecialHandler.cpp, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/options.xml: added option --precision to set the number of decimal places applied to attribute values 2013-01-30 Martin Gieseking * src/CommandLine.cpp: fixed alignment of --help text 2013-01-22 Martin Gieseking * src/FileFinder.cpp, src/FontEngine.cpp, src/Makefile.am, src/MiKTeXCom.cpp, src/MiKTeXCom.h: moved MiKTeX COM code to separate class 2013-01-21 Martin Gieseking * src/DVIReader.cpp, src/DVIToSVG.cpp, src/FileFinder.cpp, src/Font.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/Makefile.am, src/MapLine.cpp, src/MapLine.h, src/Subfont.cpp, src/Subfont.h, tests/FontMapTest.cpp, tests/Makefile.am, tests/MapLineTest.cpp, tests/SubfontTest.cpp, tests/create-makefile, tests/sample.sfd: added support for subfont definitions and multi-font (.ttc) files * src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/MapLine.h: replaced FontMap entries by pointers; initialize entries with MapLine objects * src/CommandLine.cpp, src/Font.cpp, src/Font.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/MapLine.cpp, src/MapLine.h, tests/MapLineTest.cpp: implemented evaluation of font style options given in a mapline * configure.ac, src/Doxyfile: set version to 1.1 * NEWS, README: updated NEWS and README 2013-01-20 Martin Gieseking * src/FontEngine.cpp, src/FontEngine.h: removed unneeded code related to font sizes from class FontEngine 2013-01-16 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/FontMap.cpp, src/FontMap.h, src/dvisvgm.cpp, src/options.xml: renamed option --map-file to --fontmap; allow multiple mapfiles and modes * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/FontMap.cpp, src/FontMap.h, src/Makefile.am, src/PdfSpecialHandler.cpp, src/PdfSpecialHandler.h: added PdfSpecialHandler to evaluate pdf:mapline and pdf:mapfile specials 2013-01-10 Martin Gieseking * src/Font.cpp, src/FontEncoding.cpp: fixed a string exception that occurred when an encoding file or an entry in the encoding table is unavailable 2013-01-06 Martin Gieseking * src/FileFinder.cpp, src/FileFinder.h, src/FontEncoding.cpp, src/FontEncoding.h: removed font encoding methods from FileFinder 2013-01-02 Martin Gieseking * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/MiKTeXCom.cpp, src/MiKTeXCom.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, src/SVGTree.h, src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/Terminal.cpp, src/Terminal.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, src/psdefs.psc, src/types.h, tests/BoundingBoxTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/create-makefile: updated year in copyright statements to 2013 2012-12-23 Martin Gieseking * src/FontCache.cpp, src/PsSpecialHandler.cpp, src/TpicSpecialHandler.cpp: check emptiness of containers with empty() instead of size() * src/FileFinder.cpp, src/MiKTeXCom.cpp, src/Process.cpp: avoid creating copies of exception objects * src/CmdLineParserBase.h, src/Directory.cpp, src/GFReader.cpp, src/PsSpecialHandler.cpp: initialize uninitialized member variables * src/FileFinder.cpp, src/Message.cpp, src/dvisvgm.cpp: reduced scope of some variables 2012-12-12 Martin Gieseking * src/FontCache.cpp: replaced 'char' with 'glyph' in font cache listing * src/SpecialManager.cpp: clear all corresponding containers when calling SpecialHandler::unregisterHandlers() 2012-12-03 Martin Gieseking * src/Ghostscript.cpp: added explicit cast to avoid signed/unsigned comparison warning 2012-12-02 Martin Gieseking * src/FilePath.cpp, tests/FilePathTest.cpp: strip drive letter if it's not set (Windows only) * tests/FileSystemTest.cpp, tests/GFReaderTest.cpp: ensure that tests work properly on Windows * src/macros.h: removed SHOW() from macros.h * doc/dvisvgm.txt.in, src/Ghostscript.cpp: use gsdll64.dll for 64-bit builds; added info about gsdll64.dll to manpage 2012-11-24 Martin Gieseking * src/Message.cpp: don't wrap message lines explicitly on Windows * * * 2012-11-23 Martin Gieseking * src/Ghostscript.cpp, src/Ghostscript.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/dvisvgm.cpp: print an error message if the execution of PS code fails * src/PSInterpreter.cpp, src/psdefs.psc: print operand stack in case of a PS error 2012-11-22 Martin Gieseking * src/Message.cpp: handle wrapping of messages containing newlines correctly 2012-11-21 Martin Gieseking * src/DLLoader.cpp, src/DLLoader.h, src/Ghostscript.cpp: renamed DLLoader::loadFunction() to DLLoader::loadSymbol() 2012-11-19 Martin Gieseking * src/FontEngine.cpp, src/FontEngine.h: renamed FontEngine::fname to FontEngine::_fontname * src/Font.cpp, src/Font.h, src/FontManager.cpp: print warning if font checksums don't match 2012-11-16 Martin Gieseking * src/Directory.h: undefine macro max() to avoid compilation problems on Windows 2012-11-15 Martin Gieseking * src/FileFinder.cpp, src/FileFinder.h, src/FontMap.cpp, src/FontMap.h, tests/FontMapTest.cpp: made class FontMap a singleton * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp: moved initialization of FontMap from FileFinder to dvisvgm.cpp * src/Makefile.am, src/MapLine.cpp, src/MapLine.h, tests/Makefile.am, tests/MapLineTest.cpp: added new class MapLine to parse and evaluate a single line of a map file * src/FileFinder.cpp, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, tests/FontMapTest.cpp: adapted code to use new MapLine class; introduced support of map line modes 2012-11-14 Martin Gieseking * src/FileFinder.cpp: initialize Ghostscript when compiled for TeX Live Win32 (patch by Peter Breitenlohner) * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp, tests/FileFinderTest.cpp, tests/FontManagerTest.cpp: initialize second parameter of kpse_set_program_name() correctly * src/DVIToSVG.cpp: prevent compilation error when using a C++11 compiler (patch by Peter Breitenlohner) 2012-11-11 Martin Gieseking * src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/PsSpecialHandler.cpp, tests/StreamInputBufferTest.cpp: some refactorings of class InputReader; added InputReader::find() 2012-10-24 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVG.h, src/dvisvgm.cpp: don't show warning about disabled PS support in list of special handlers 2012-09-27 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.12 * NEWS: updated NEWS * src/options.ggo: removed deprecated file options.ggo 2012-09-20 Martin Gieseking * src/DVIToSVG.cpp: show warning if processing of PS specials is disabled * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: removed Ghostscript info from ps entry in list of special handlers 2012-09-19 Martin Gieseking * src/psdefs.psc: ignore dvips bop operators that might be present in PS specials 2012-09-17 Martin Gieseking * src/StreamReader.cpp: fixed reading invalid number of string characters 2012-04-17 Martin Gieseking * doc/Makefile.am: keep manpage when calling 'make clean' 2012-04-04 Martin Gieseking * src/DVIToSVGActions.cpp, src/SVGTree.cpp, src/SVGTree.h, tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: scale point units in the SVG files to big points (bp) 2012-04-02 Martin Gieseking * src/Matrix.cpp, src/Matrix.h, tests/MatrixTest.cpp: added Matrix::invert() and det() 2012-03-29 Martin Gieseking * src/Matrix.cpp, src/Matrix.h, tests/MatrixTest.cpp: added start index parameter to Matrix::set(vector<>) 2012-03-21 Martin Gieseking * src/psdefs.psc: evaluate PS operators rectclip, rectfill, and rectstroke 2012-03-09 Martin Gieseking * src/Ghostscript.cpp, src/Ghostscript.h: added optional parameter to Ghostscript::revision() to retrieve the revision number only * src/dvisvgm.cpp: added Ghostscript to library list printed by --version=yes * NEWS: updated NEWS 2012-03-08 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.11 2012-03-07 Martin Gieseking * src/DVIToSVGActions.cpp: correct location of a rule's bounding box (lp bug #948713) 2012-02-24 Martin Gieseking * doc/dvisvgm.txt.in: fixed a couple of mistakes and formatting flaws in the manpage 2012-02-17 Martin Gieseking * README: updated information about bug reporting 2012-01-26 Martin Gieseking * src/CmdLineParserBase.h, src/DVIActions.h, src/DVIReader.h, src/DVIToSVGActions.h, src/FontEngine.h, src/FontManager.h, src/MetafontWrapper.h, src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.h, src/TFM.h, src/VFReader.h: adapt forward declarations of classes and structs to their corresponding definition (SF bug #3480013) 2012-01-16 Martin Gieseking * src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h: removed outdated files for old MiKTeX bindings 2012-01-09 Martin Gieseking * src/InputReader.cpp, tests/StreamInputBufferTest.cpp: fixed parsing of negative floating point numbers starting with '-0.' (SF bug #3471097) * src/TpicSpecialHandler.cpp: added some more comments to methods of class TpicSpecialHandler 2012-01-06 Martin Gieseking * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/CRC32.cpp, src/CRC32.h, src/Calculator.cpp, src/Calculator.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/Process.cpp, src/Process.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, src/SVGTree.h, src/SignalHandler.cpp, src/SignalHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/Terminal.cpp, src/Terminal.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, src/psdefs.psc, src/types.h, tests/BoundingBoxTest.cpp, tests/CRC32Test.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FileSystemTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MatrixTest.cpp, tests/MessageExceptionTest.cpp, tests/PSInterpreterTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp, tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/check-conv, tests/create-makefile: updated year in copyright statements 2011-12-18 Martin Gieseking * tests/Makefile.am, tests/create-makefile: link tests with -lpthread (required by gtest on Ubuntu) * configure.ac, src/Doxyfile: set version to 1.0.10 * NEWS: updated NEWS 2011-12-17 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/GlyphTracerMessages.h, src/Message.cpp, src/Message.h, src/MetafontWrapper.cpp, src/Terminal.cpp, src/Terminal.h, src/dvisvgm.cpp: allow users to customize the message colors * doc/dvisvgm.txt.in: added documentation on environment variable DVISVGM_COLORS to manpage 2011-11-22 Martin Gieseking * src/GraphicPath.h: added some more comments to the methods of GraphicPath 2011-11-18 Martin Gieseking * configure.ac: move linker flag -lfreetype from LDFLAGS to LIBS to avoid linking problems 2011-10-28 Martin Gieseking * src/FontMap.cpp: removed unused variable eval_prefix in helper function read_entry() * src/SVGTree.cpp: avoid possible collisions of glyph IDs 2011-10-13 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.9 * NEWS: updated NEWS 2011-10-09 Martin Gieseking * src/FilePath.cpp: added some missing comments to methods of class FilePath * src/Directory.h: dropped method Directory::getEntry() 2011-10-07 Martin Gieseking * src/Process.cpp: added missing include to Process.cpp * src/Process.cpp: exclude definition of split_paramstr() from Windows builds as it's not used there 2011-10-03 Martin Gieseking * doc/Makefile.am: add metadata/pdfmarks to pdf version of manpage 2011-09-06 Martin Gieseking * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: updated bundled potrace library to version 1.10 2011-06-04 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.9dev * src/FileFinder.cpp, src/MetafontWrapper.cpp: fixed segfault occured in TeX Live Win32 caused by mf.exe being unavailable (SF bug #3308473) 2011-06-01 Martin Gieseking * configure.ac: added AC_LANG_SOURCE to avoid autoconf warnings 2011-05-31 Martin Gieseking * NEWS, configure.ac, src/Doxyfile: set version to 1.0.8; updated NEWS * src/PsSpecialHandler.cpp: explicitly cast double to int in call of ClippingStack::dup()/pop() 2011-05-27 Martin Gieseking * tests/check-conv, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: updated conversion tests 2011-05-23 Martin Gieseking * src/Font.cpp, src/Makefile.am, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/Process.cpp, src/Process.h, src/SignalHandler.cpp: replaced call of system() with Process::run() and kill child process if necessary 2011-05-22 Martin Gieseking * src/FileFinder.cpp: MiKTeX: maketfm and makemf have been renamed to miktex-maketfm and miktex-makemf * src/MetafontWrapper.cpp: dropped '--halt-on-error' in Metafont call to process buggy mf files completely 2011-05-19 Martin Gieseking * src/DLLoader.h: added #undef NOMINMAX before (re)defining it 2011-05-12 Martin Gieseking * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.psc, tests/PSInterpreterTest.cpp: PS handler: implemented evaluation of save, restore, and grestoreall 2011-05-07 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.8dev * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVGActions.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialActions.h: fixed interaction between PS and DVI drawing position * src/PsSpecialHandler.cpp: add definitions in literal PS headers to dictionary TeXDict * src/PsSpecialHandler.cpp: fixed potential segfault caused by invisible zero-length paths 2011-05-06 Martin Gieseking * src/DVIToSVGActions.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.psc: PS handler: added missing unit conversions (pt vs. bp) * NEWS, README, configure.ac, src/Doxyfile: set version to 1.0.7; updated NEWS and README 2011-05-05 Martin Gieseking * src/PSInterpreter.cpp, src/PsSpecialHandler.cpp: separate PS snippets by newline characters to leave preceding comments * src/PsSpecialHandler.h: corrected scaling formula applied to PS line properties * doc/dvisvgm.txt.in: added info about dvips rounding issues to manpage 2011-05-04 Martin Gieseking * src/PsSpecialHandler.cpp: don't call Ghostscript::revision() in initialization of static variable * src/Ghostscript.cpp, src/Ghostscript.h, src/PSInterpreter.cpp, src/PSInterpreter.h: avoid 'this' pointer in initialazation list of PSInterpreter::PSInterpreter() * src/Length.h: undefine macro IN 2011-05-03 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.7dev * src/psdefs.psc: catch PS error /nocurrentpoint in operator 'setpos' properly * src/psdefs.psc: PS handler: recognize save/restore operators * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: replaced methods for DVI position alterations with translation semantics * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/macros.h, src/psdefs.psc, tests/PSInterpreterTest.cpp: improved handling of pure PostScript specials * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: tpic special 'ip' must not draw the outline of the polygon but only fill its interior * src/DLLoader.cpp, src/DLLoader.h: don't define min/max macros in windows.h 2011-04-30 Martin Gieseking * src/SpecialManager.cpp: register special prefix ps:: properly 2011-04-18 Martin Gieseking * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp, tests/FileFinderTest.cpp: dropped class FileFinder::Impl and simplified FileFinder interface * src/DVIReader.cpp, src/Font.cpp, src/GFReader.cpp, src/Makefile.am, src/MetafontWrapper.cpp, src/PSInterpreter.cpp, src/SignalHandler.cpp, src/SignalHandler.h, src/TFM.cpp, src/dvisvgm.cpp: added class SignalHandler for CTRL-C signals * NEWS, README, configure.ac, src/Doxyfile: set version to 1.0.6; updated NEWS and README 2011-04-14 Martin Gieseking * src/DVIToSVGActions.cpp, src/MessageException.h, src/dvisvgm.cpp, tests/Makefile.am, tests/MessageExceptionTest.cpp: derived MessageException from std::exception and replaced getMessage() with what() 2011-04-13 Martin Gieseking * src/XMLNode.cpp, src/XMLNode.h: prepended member variables of the XMLNode classes with underscore 2011-03-15 Martin Gieseking * src/DVIReader.cpp: throw DVI exception if set_char/put_char is executed without preceding font selection 2011-03-04 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.6dev * potracelib/potracelib.c, potracelib/potracelib.h: changed return type of potrace_version() to 'const char *' in order to avoid compiler warning 2011-03-01 Martin Gieseking * NEWS, configure.ac, src/Doxyfile: set version to 1.0.5, updated NEWS 2011-02-28 Martin Gieseking * doc/dvisvgm.txt.in, src/FontCache.cpp, src/FontCache.h, src/dvisvgm.cpp: added code to remove outdated and corrupted cache files * src/Ghostscript.cpp: fixed formatting of GS version number 2011-02-21 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.5dev * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/GraphicPath.h, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.cpp: added option to replace use elements with paths * src/SVGTree.cpp: added missing unit in height/width attribute of svg root element * tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: updated conversion test files 2011-02-16 Martin Gieseking * src/InputBuffer.h: reference to scanned string in StringInputBuffer is constant now 2011-02-10 Martin Gieseking * src/FileSystem.cpp, src/FileSystem.h, src/dvisvgm.cpp, tests/FileSystemTest.cpp: merged FileSystem::move() into FileSystem::copy() * src/CRC32.cpp, src/CRC32.h, src/Makefile.am, tests/CRC32Test.cpp, tests/Makefile.am: added class CRC32 and corresponding tests * src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, tests/Makefile.am, tests/StreamReaderTest.cpp, tests/StreamWriterTest.cpp: added CRC32 computation methods to StreamReader and StreamWriter * src/FontCache.cpp, src/FontCache.h: added CRC32 checks to cache files 2011-01-31 Martin Gieseking * src/CmdLineParserBase.cpp: print character instead of ascii value in message of command-line parser 2011-01-30 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/FileFinder.cpp, src/FileFinder.h, src/FontEngine.cpp, src/FontEngine.h, src/dvisvgm.cpp, src/options.xml: added optional argument to --version 2011-01-28 Martin Gieseking * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: updated bundled potrace library to version 1.9 2011-01-17 Martin Gieseking * src/FileSystem.cpp, src/FileSystem.h, tests/FileSystemTest.cpp, tests/Makefile.am: added FileSystem::copy and FileSystem::move; added FileSystemTest * doc/dvisvgm.txt.in, src/dvisvgm.cpp: moved cache files to subfolder ($HOME/.dvisvgm/cache) 2011-01-04 Martin Gieseking * Makefile.am, README, configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.h, src/GlyphTracerMessages.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageRanges.cpp, src/PageRanges.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamReader.cpp, src/StreamReader.h, src/StreamWriter.cpp, src/StreamWriter.h, src/System.cpp, src/System.h, src/TFM.cpp, src/TFM.h, src/Terminal.cpp, src/Terminal.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.dtd, src/options.xml, src/psdefs.psc, src/types.h, tests/BoundingBoxTest.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, tests/FilePathTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GFReaderTest.cpp, tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MatrixTest.cpp, tests/PageRagesTest.cpp, tests/PageSizeTest.cpp, tests/PairTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamInputBufferTest.cpp, tests/TypesTest.cpp, tests/VectorStreamTest.cpp, tests/check-conv, tests/create-makefile: updated year in copyright info * tests/Makefile.am, tests/PSInterpreterTest.cpp: added basic tests for class PSInterpreter 2010-12-18 Martin Gieseking * src/FileFinder.cpp: updated to MiKTeX 2.8 SDK * src/PsSpecialHandler.cpp: fixed scaling issue in PS positioning * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.psc: PS handler: added missing scaling of linewidths and dash distances * NEWS, configure.ac, src/Doxyfile: set version to 1.0.4; updated NEWS * doc/dvisvgm.txt.in: minor update to the manpage 2010-08-18 Martin Gieseking * src/FontEngine.cpp: fixed FreeType version check (patch by Paul Vojta) 2010-08-11 Martin Gieseking * tests/Makefile.am, tests/PairTest.cpp: added PairTest 2010-08-06 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.3 2010-08-05 Martin Gieseking * NEWS, doc/dvisvgm.txt.in: updated manpage and NEWS 2010-08-04 Martin Gieseking * src/BoundingBox.cpp, src/BoundingBox.h, src/Matrix.cpp, src/Matrix.h, src/PsSpecialHandler.cpp: revamped PsSpecialHandler::psfile() to fix a transformation issue (SF bug #3037372) 2010-07-28 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp: added check of DVI format version 2010-07-26 Martin Gieseking * src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: restore transformation matrix after execution of psfile 2010-07-13 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.3dev * src/InputBuffer.h: added missing namespace prefix * src/Terminal.cpp: replaced \e with \x1B * src/GraphicPath.h, src/PsSpecialHandler.h: fixed missing initialization of GraphicPath iterator * src/Directory.cpp, src/Directory.h, src/GFReader.cpp, src/GFReader.h: added leading underscore to variables of GFReader 2010-06-22 Martin Gieseking * src/gzstream.cpp, src/gzstream.h: fixed class variable issue introduced by previous AIX patch * NEWS, configure.ac, src/Doxyfile: set version to 1.0.2 2010-06-18 Martin Gieseking * src/Bitmap.cpp, tests/DirectoryTest.cpp, tests/GFReaderTest.cpp, tests/Makefile.am, tests/cmr10.600gf, tests/create-makefile: added GFReaderTest; updated DirectoryTest 2010-06-17 Martin Gieseking * src/Bitmap.cpp, src/Calculator.cpp, src/CmdLineParserBase.cpp, src/Color.cpp, src/ColorSpecialHandler.cpp, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/FontCache.cpp, src/FontEncoding.cpp, src/GFGlyphTracer.cpp, src/Pair.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/TFM.cpp, src/TFM.h: fixed some type conversion warnings * src/Message.cpp, src/Message.h: renamed MessageStream::putchar() to MessageStream::putChar() to avoid name clashes * src/types.h, tests/Makefile.am, tests/TypesTest.cpp: added TypesTest 2010-06-16 Martin Gieseking * potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c: renamed internal potrace functions path_new() and path_free() to prevent linker conflicts on OS X 2010-06-14 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.2dev * configure.ac, src/CmdLineParserBase.h, src/FileFinder.h, src/FontCache.cpp, src/FontCache.h, src/FontEncoding.cpp, src/FontEngine.cpp, src/GFGlyphTracer.h, src/MetafontWrapper.cpp, src/gzstream.cpp: applied latest TL patches from Peter Breitenlohner and Karl Berry 2010-06-11 Martin Gieseking * src/Message.cpp: suppress ANSI color code by default * NEWS, configure.ac, src/Doxyfile: set version to 1.0.1 2010-06-09 Martin Gieseking * configure.ac, src/Doxyfile: set version to 1.0.1dev * src/psdefs.psc: fixed recursion issue in PS operator charpath 2010-06-08 Martin Gieseking * configure.ac, doc/Makefile.am, src/Makefile.am: cleaned up configuration scripts * configure.ac, src/Doxyfile: set version to 1.0dev * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/PsSpecialHandler.cpp, src/SpecialActions.h, src/SpecialManager.cpp, src/TpicSpecialHandler.cpp: added special for creating local bounding boxes * src/FilePath.cpp, src/FilePath.h, src/FileSystem.cpp, src/FileSystem.h, src/Makefile.am, tests/FilePathTest.cpp, tests/Makefile.am: added class FilePath * src/InputBuffer.h, tests/ColorSpecialTest.cpp, tests/StreamInputBufferTest.cpp: added InputBuffer::invalidate() * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, src/PageRanges.cpp, src/PageRanges.h, src/StreamCounter.h, src/dvisvgm.cpp, src/options.xml, tests/BoundingBoxTest.cpp, tests/CommandLineTest.cpp, tests/Makefile.am, tests/PageRagesTest.cpp, tests/StreamCounterTest.cpp: added conversion of multiple pages * configure.ac, doc/Makefile.am, doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/DVIActions.h, src/DVIToSVG.cpp, src/GFTracer.cpp, src/GlyphTracerMessages.h, src/Makefile.am, src/Message.cpp, src/Message.h, src/MetafontWrapper.cpp, src/Terminal.cpp, src/Terminal.h, src/dvisvgm.cpp, src/options.xml: improved output of messages including optional colorization * src/Font.cpp: print error message if Metafont failed * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.psc: evaluate Ghostscript operator .setopacityalpha * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h: added method to compute length of DVI command * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/DVIActions.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, src/Message.cpp, src/Message.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialActions.h, src/System.cpp, src/System.h, src/dvisvgm.cpp, src/options.xml: added percentage-based progress indicator * doc/Makefile.am, doc/dvisvgm.txt.in: documented option --help and --version in manpage * NEWS, configure.ac, src/Doxyfile: set version to 1.0 * src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: fixed PS destructor issue (SF bug #3013392) 2010-05-09 Martin Gieseking * configure.ac: fixed whitespace issue in CPPFLAGS and LDFLAGS 2010-05-04 Martin Gieseking * configure.ac: fixed kpathsea check; use pkg-config to check freetype availability * tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/check-conv: fixed segfaults in tests 2010-04-23 Martin Gieseking * NEWS, configure.ac, src/Doxyfile: set version to 0.9.1 2010-04-22 Martin Gieseking * src/CommandLine.cpp, src/options.xml: output of option --help: replaced '(default: FOO)' by '[FOO]' * src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SVGTree.cpp, src/SVGTree.h, src/XMLNode.cpp, src/XMLNode.h: ignore unused fonts in CSS styles list * src/SVGTree.cpp: fixed broken validity when using SVG fonts * src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: print page count and page number of DVI page being processed * tests/check-conv, tests/frktest-wf-cmp.svg, tests/sample-wf-cmp.svg: adapted conversion tests to new output format 2010-04-20 Martin Gieseking * src/FontEncoding.cpp: fixed memory bug in FontEncoding::encoding() 2010-04-11 Martin Gieseking * configure.ac, src/Doxyfile: set version to 0.9.1dev * src/DVIToSVGActions.cpp: replaced wrong font pointer that could lead to segfaults 2010-03-24 Martin Gieseking * src/Font.cpp, src/Font.h, src/dvisvgm.cpp: moved some methods from PhysicalFontImpl to PysicalFont * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, src/GlyphTracerMessages.h, src/Makefile.am, src/dvisvgm.cpp, src/options.xml: added command-line option --exact * src/FontCache.cpp, src/Makefile.am, src/StreamWriter.cpp, src/StreamWriter.h, src/TFM.cpp: replaced local stream IO functions by StreamReader/StreamWriter methods * src/CmdLineParserBase.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/FontEngine.cpp, src/GlyphTracerMessages.h, src/Message.cpp, src/Message.h, src/MetafontWrapper.cpp, src/dvisvgm.cpp: added class MessageStream, updated message output * src/FontCache.cpp, src/GFGlyphTracer.cpp, src/GFReader.cpp: variable _fontname is now correctly set in class FontCache * NEWS, configure.ac, src/Doxyfile: set version to 0.9 * tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg: updated conversion tests 2010-03-18 Martin Gieseking * src/DVIToSVG.cpp, src/SVGTree.cpp: moved creation of SVG 'use' elements from class DVIToSVG to class SVGTree * src/DVIToSVG.cpp, src/Font.cpp, src/Font.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/SVGTree.cpp, src/SVGTree.h: added class GFGlyphTracer::Callback providing an interface used to print status information about the tracer * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h: added evaluation of boolean and char arguments to the command-line parser * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/Font.cpp, src/Font.h, src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.cpp: reactivated option --trace-all, and added optional argument 'retrace' to it * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/Font.cpp, src/Font.h, src/dvisvgm.cpp, src/options.xml: added command-line option --keep 2010-03-17 Martin Gieseking * src/GFReader.cpp, src/GFReader.h: replaced GFReader messages by exceptions * src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, src/Makefile.am, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, src/SVGTree.h: removed class CharmapTranslator * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/FontManager.cpp, src/FontManager.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, src/SVGTree.h, src/VFReader.h, tests/FontManagerTest.cpp: made FontManager a singleton * src/FontCache.cpp, src/FontCache.h: added method FontCache::write(const char *dir) that updates the cache file of the current font * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/Font.cpp, src/Font.h, src/FontEmitter.h, src/GFGlyphTracer.h, src/Makefile.am, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, src/SVGTree.h, src/dvisvgm.cpp, tests/Makefile.am, tests/check-conv, tests/create-makefile: removed emitter classes; incorporated their functionality into SVGTree and PhysicalFontImpl * src/BoundingBox.cpp, src/Calculator.cpp, src/Matrix.cpp, src/PSInterpreter.cpp, src/PSInterpreter.h: fixed a couple of comments 2010-02-26 Martin Gieseking * src/Font.cpp, src/FontCache.cpp, src/FontCache.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h: refactorings of GF tracer class; removed transferGlyph() 2010-02-21 Martin Gieseking * src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontManager.cpp, src/FontManager.h, src/SVGFontEmitter.cpp: moved method encoding() from class FontManager to class FontEncoding * src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEngine.cpp, src/FontEngine.h, src/Glyph.cpp, src/Glyph.h, src/Makefile.am, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h: removed class Glyph and incorporated its functionality into Font class 2010-02-05 Martin Gieseking * configure.ac, src/Doxyfile: set version to 0.8.9dev * src/psdefs.psc: removed PS error handler nocurrentpoint * src/DVIToSVG.cpp: added evaluation of literal PS headers to PSHeaderActions 2010-02-02 Martin Gieseking * NEWS, configure.ac, src/Doxyfile: version updated to 0.8.8 2010-02-01 Martin Gieseking * tests/check-conv: skip conversion checks by default 2010-01-31 Martin Gieseking * tests/Makefile.am, tests/check-conv, tests/create-makefile, tests/frktest-nf-cmp.svg, tests/frktest-wf-cmp.svg, tests/frktest.dvi, tests/normalize.xsl, tests/sample-nf-cmp.svg, tests/sample-wf-cmp.svg, tests/sample.dvi: added tests to check conversion results * tests/normalize.xsl: some improvements to normalize.xsl 2010-01-29 Martin Gieseking * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, src/CommandLine.h: removed CmdLineParserBase::numOptions() * src/GraphicPath.h: fixed scaling bug in computation of glyph paths when using -n 2010-01-24 Martin Gieseking * doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/FontCache.h, src/dvisvgm.cpp, src/options.dtd, src/options.xml: added command-line option --libgs 2010-01-18 Martin Gieseking * src/CommandLine.cpp, src/options.dtd, src/options.xml: added DTD for options.xml 2010-01-17 Martin Gieseking * configure.ac: updated type of kpathsea_version_string (patch by lomov_vl) * fedora/dvisvgm-gs.patch, fedora/dvisvgm-potrace.patch, fedora/dvisvgm.spec: removed fedora directory * doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, src/DVIToSVG.cpp, tests/BoundingBoxTest.cpp, tests/Makefile.am: added support for enlarging the minimal bbox by a given amount. * Makefile.am, README, configure.ac, doc/dvisvgm.txt.in, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/CommandLine.cpp, src/CommandLine.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEmitter.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/Glyph.cpp, src/Glyph.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Length.cpp, src/Length.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamCounter.h, src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.xml, src/psdefs.psc, src/types.h, tests/BoundingBoxTest.cpp, tests/CalculatorTest.cpp, tests/ColorSpecialTest.cpp, tests/CommandLineTest.cpp, tests/DirectoryTest.cpp, tests/FileFinderTest.cpp, tests/FontManagerTest.cpp, tests/FontMapTest.cpp, tests/GraphicPathTest.cpp, tests/LengthTest.cpp, tests/Makefile.am, tests/MatrixTest.cpp, tests/PageSizeTest.cpp, tests/SplittedCharInputBufferTest.cpp, tests/StreamCounterTest.cpp, tests/StreamInputBufferTest.cpp, tests/VectorStreamTest.cpp, tests/create-makefile: updated boilerplates * doc/dvisvgm.txt.in, src/FileFinder.cpp, src/Ghostscript.cpp, src/Ghostscript.h, src/dvisvgm.cpp: environment variable LIBGS can now be used to set the name of the GS shared library * NEWS: updated NEWS * src/Ghostscript.cpp: fixed typo in variable name 2009-12-16 Martin Gieseking * src/InputReader.cpp: fixed bug in InputReader::parseUInt() 2009-12-15 Martin Gieseking * configure.ac, src/dvisvgm.cpp: appied get_time patch sent by Peter Breitenlohner 2009-12-02 Martin Gieseking * src/BoundingBox.h, src/Calculator.h, src/CharmapTranslator.h, src/DVIReader.h, src/DVIToSVG.h, src/DVIToSVGActions.h, src/Font.h, src/FontEngine.h, src/FontManager.h, src/FontMap.h, src/GFGlyphTracer.h, src/GFReader.h, src/MessageException.h, src/MetafontWrapper.h, src/PageSize.h, src/SVGTree.cpp, src/SVGTree.h, src/StreamReader.h, src/VFActions.h, src/VFReader.h, src/XMLDocTypeNode.h, src/XMLDocument.h, src/XMLNode.h, src/XMLString.h: removed using statements from header files 2009-11-25 Martin Gieseking * src/FontCache.cpp, src/FontCache.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFTracer.cpp, src/Glyph.cpp, src/Glyph.h, src/GraphicPath.h, src/Makefile.am, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontTraceEmitter.cpp, tests/GraphicPathTest.cpp: removed FEGlyphCommands and replaced separate glyph class implementation by class GraphicPath 2009-11-18 Martin Gieseking * src/DVIToSVG.cpp, src/Ghostscript.cpp, src/Ghostscript.h: replaced #if !DISABLE_GS by #if !defined(DISABLE_GS) (Peter Breitenlohner) * src/Ghostscript.cpp, src/Ghostscript.h: replaced #if HAVE_LIBGS by #if defined(HAVE_LIBGS) * src/DLLoader.cpp, src/DLLoader.h: fixed line endings 2009-11-17 Martin Gieseking * configure.ac, fedora/dvisvgm.spec, src/Doxyfile: set version number to 0.8.8dev * potracelib/potracelib.c, potracelib/potracelib.h: replaced outdated string constant type char* by const char* in potrace_version() * src/Color.cpp, src/ColorSpecialHandler.cpp, src/FontManager.cpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/TpicSpecialHandler.cpp: added explicit casts to avoid compiler warnings (Peter Breitenlohner) * src/InputReader.cpp: added missing initialization value (Peter Breitenlohner) * src/CmdLineParserBase.h, src/GraphicPath.h, src/InputReader.h, src/Makefile.am, src/PSInterpreter.h, src/SpecialManager.h: added missing virtual destructors to avoid warnings * src/dvisvgm.cpp: don't use email adress PACKAGE_BUGREPORT for copyright notice * NEWS: updated NEWS 2009-11-09 Martin Gieseking * src/DVIToSVG.cpp, src/dvisvgm.cpp: added total number of pages to message text * NEWS, src/Color.cpp, src/Color.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp: PS handler: colors set by color specials are now considered properly * configure.ac, fedora/dvisvgm.spec, src/Doxyfile: set version to 0.8.7 2009-11-06 Martin Gieseking * src/GraphicPath.h, src/PsSpecialHandler.cpp: PS handler: replace zero-length paths by dots * NEWS, doc/dvisvgm.txt.in: updated NEWS and manpage * NEWS, src/PsSpecialHandler.cpp: fixed path scaling issue in PS handler 2009-10-29 Martin Gieseking * src/DVIToSVGActions.cpp, src/Font.cpp, src/Font.h: fixed positioning of italic characters 2009-10-25 Martin Gieseking * src/DvisvgmSpecialHandler.cpp: added macro {?nl} to dvisvgm:raw evaluator 2009-10-18 Martin Gieseking * src/Font.cpp, src/TFM.cpp, src/TFM.h: added italic correction values to character widths 2009-10-16 Martin Gieseking * tests/Makefile.am, tests/create-makefile: added script to create tests/Makefile.am * configure.ac, src/Doxyfile: increased version to 0.8.7dev 2009-10-13 Martin Gieseking * doc/Makefile.am, doc/dvisvgm.txt.in: removed outdated post-processing of manpage * fedora/dvisvgm.spec: updated spec file * doc/Makefile.am: added missing dvi suffix in Makefile target dvi-pdf * README, tests/CalculatorTest.cpp, tests/CalculatorTest.h, tests/ColorSpecialTest.cpp, tests/ColorSpecialTest.h, tests/CommandLineTest.cpp, tests/CommandLineTest.h, tests/DirectoryTest.cpp, tests/DirectoryTest.h, tests/FileFinderTest.cpp, tests/FileFinderTest.h, tests/FontManagerTest.cpp, tests/FontManagerTest.h, tests/FontMapTest.cpp, tests/FontMapTest.h, tests/GraphicPathTest.cpp, tests/GraphicPathTest.h, tests/LengthTest.cpp, tests/LengthTest.h, tests/Makefile.am, tests/MatrixTest.cpp, tests/MatrixTest.h, tests/PageSizeTest.cpp, tests/PageSizeTest.h, tests/SplittedCharInputBufferTest.cpp, tests/SplittedCharInputBufferTest.h, tests/StreamCounterTest.cpp, tests/StreamCounterTest.h, tests/StreamInputBufferTest.cpp, tests/StreamInputBufferTest.h, tests/VectorStreamTest.cpp, tests/VectorStreamTest.h: replaced cxxtest by googletest 2009-10-12 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEmitter.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamCounter.h, src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/macros.h, src/types.h: code cleanup 2009-10-11 Martin Gieseking * autogen.sh: fixed file permissions of autogen.sh * src/DVIToSVG.cpp, src/DvisvgmSpecialHandler.cpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGTree.cpp, src/SVGTree.h: suppress empty style and transformation elements * NEWS: NEWS updated 2009-10-10 Martin Gieseking * src/PsSpecialHandler.cpp: scale clipping paths by 72.27/72 2009-10-09 Martin Gieseking * src/Bitmap.h: fixed bit shift overflow in Bitmap class occured on 64-bit systems * autogen.sh, prepare: prepare script replaced by autogen.sh * doc/dvisvgm.txt.in: fixed formatting of manual page * src/Length.cpp, src/Length.h, tests/LengthTest.h: fixed unit conversion bug * src/Makefile.am: fixed Makefile 2009-10-08 Martin Gieseking * NEWS, doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.h, tests/Makefile.am: cmdline parameter --bbox can now be used to set the absolute bounding box * NEWS, src/GraphicPath.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: PS clipping path sequences and intersections are now handled correctly * src/MetafontWrapper.cpp: fixed file permissions * src/dvisvgm.cpp: fixed uncaught PageSizeException 2009-10-07 Martin Gieseking * NEWS, doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, src/DvisvgmSpecialHandler.cpp: added the special variant 'dvisvgm:bbox abs' and 'dvisvgm:bbox fix' * src/BoundingBox.cpp, src/BoundingBox.h, src/Length.cpp, src/Length.h, src/Makefile.am, tests/LengthTest.h: class Length provides length unit calculations 2009-10-06 Martin Gieseking * src/BoundingBox.cpp, src/BoundingBox.h, src/GraphicPath.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/psdefs.psc: fixed some PS bounding box and positioning issues introduced by previous changesets * NEWS, configure.ac, fedora/dvisvgm.spec, src/Doxyfile: set version to 0.8.6 2009-10-05 Martin Gieseking * src/PsSpecialHandler.cpp: convert PS path coordinated to TeX point units * NEWS, src/PsSpecialHandler.cpp: fixed another positioning bug reported by John Bowman 2009-10-04 Martin Gieseking * src/GraphicPath.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: corrected positioning bug introduced with previous PS positioning fix 2009-10-02 Martin Gieseking * doc/Makefile.am, doc/dvisvgm.txt.in: generate pdf manpage directly with groff; adapted manpage source to work with latest asciidoc 2009-10-01 Martin Gieseking * doc/Makefile.am, doc/dvisvgm.txt.in: replaced backticks in manpage by apostrophes; updated date on homepage 2009-09-30 Martin Gieseking * src/DvisvgmSpecialHandler.cpp: added optional depth parameter to special dvisvgm:raw * doc/dvisvgm.txt.in: added dvisvgm:raw example to man page * LGPL-2.1.txt, NEWS, README: updated README and NEWS, and added file with LGPL license text * Makefile.am, configure.ac, fedora/dvisvgm.spec, src/Doxyfile: increased version number to 0.8.5 2009-09-17 Martin Gieseking * NEWS: added cretdit to John Bowman for sending a patch for the already fixed clipping bug * src/PsSpecialHandler.h: increased the default linewidth to 0.5 * fedora/dvisvgm.spec: updated spec file and fixed typo on website * doc/dvisvgm.txt.in: minor changes of the documentation 2009-09-11 Martin Gieseking * NEWS, src/CmdLineParserBase.cpp, src/FontCache.cpp, src/SVGFontTraceEmitter.cpp: fixed memory bug in tracer module (issue #21) * NEWS, doc/dvisvgm.txt.in, src/CommandLine.cpp, src/CommandLine.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SpecialManager.cpp, src/SpecialManager.h, src/dvisvgm.cpp, src/options.xml: added option --progress for enabling a progress indicator (feature #22) * src/FileSystem.cpp, src/MetafontWrapper.cpp: Windows: Metafont is now called via CreateProcess() 2009-09-10 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: refactored prefixes methods of the SpecialHandlers (ticket #20) * NEWS, doc/dvisvgm.txt.in, src/FileSystem.cpp, src/FileSystem.h, src/FontCache.cpp, src/FontCache.h, src/dvisvgm.cpp: option --cache prints additional information about the cached fonts (feature #7) * src/FileSystem.cpp, src/FontCache.cpp: fixed Windows-related bug in FileSystem::collect 2009-09-06 Martin Gieseking * NEWS, README: updated NEWS and README 2009-09-04 Martin Gieseking * configure.ac, fedora/dvisvgm.spec, src/Doxyfile: increased version number to 0.8.4 * src/BoundingBox.cpp, src/BoundingBox.h, src/PsSpecialHandler.cpp: linewidths are now considered properly in computation of bounding box (issue #13) * src/dvisvgm.cpp: fixed evaluation of option --help * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/CommandLine.cpp, src/InputBuffer.h, src/InputReader.h, src/psdefs.psc, tests/CommandLineTest.h: improved the command line parser to make it more POSIX-compliant (feature #17) 2009-09-01 Martin Gieseking * src/PsSpecialHandler.cpp, src/psdefs.psc: fixed flattened clipping path bug (issue #11) 2009-08-31 Martin Gieseking * src/Makefile.am: added error checks; disallow numeric optional arguments w/o default value 2009-08-28 Martin Gieseking * NEWS, src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, src/dvisvgm.cpp, src/psdefs.psc: added evaluation of PS 'show' operator in order to evaluate PSTricks Type 3 fonts properly * fedora/dvisvgm.spec: updated spec file and homepage to latest release 2009-08-27 Martin Gieseking * NEWS, configure.ac, doc/dvisvgm.txt.in, src/CmdLineParserBase.cpp, src/CommandLine.cpp, src/Doxyfile, src/dvisvgm.cpp, src/getopt.c, src/getopt.h, src/getopt1.c, src/options.xml: replaced option --cache=? by --cache; increased version number to 0.8.3 2009-08-26 Martin Gieseking * fedora/dvisvgm-0.8.1-potrace.patch, fedora/dvisvgm-gs.patch, fedora/dvisvgm-potrace.patch, fedora/dvisvgm.spec: updated Fedora files * configure.ac, fedora/dvisvgm.spec, src/Ghostscript.cpp, src/Ghostscript.h, src/Makefile.am: improved Ghostscript and potrace linking checks to simplify usage of external devel files * NEWS, configure.ac, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/PsSpecialHandler.cpp, src/SpecialManager.cpp, src/SpecialManager.h: PS prologue files referenced in first page are now always loaded 2009-08-24 Martin Gieseking * src/CommandLine.cpp, src/CommandLine.h: speed up printing help by using puts() instead of C++ streams 2009-08-21 Martin Gieseking * src/FontMap.cpp: fixed memory bug in FontMap * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Makefile.am, src/dvisvgm.cpp, src/options.xml, tests/CommandLineTest.h, tests/Makefile.am: improved CmdLineParserBase and replaced gengetopt-based parser * NEWS, configure.ac, src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/Doxyfile: increased version number to 0.8.2 2009-08-20 Martin Gieseking * src/InputReader.cpp, src/InputReader.h: added method parseUInt() * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h, src/options.xml: added files for replacement of gengetopt (not active yet) * src/CmdLineParserBase.cpp, src/CmdLineParserBase.h: finished cmdline parser * COPYING: added copy of file COPYING 2009-08-17 Martin Gieseking * tests/Makefile.am: added include path to fix broken distcheck * COPYING, LICENSE, Makefile.am, README, doc/dvisvgm.txt.in, src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontCache.cpp, src/FontCache.h, src/FontEmitter.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/Ghostscript.cpp, src/Ghostscript.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.cpp, src/SVGTree.h, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/StreamCounter.h, src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/inttypes.h, src/macros.h, src/psdefs.psc, src/types.h, tests/CalculatorTest.h, tests/ColorSpecialTest.h, tests/DirectoryTest.h, tests/FileFinderTest.h, tests/FontManagerTest.h, tests/FontMapTest.h, tests/GraphicPathTest.h, tests/MatrixTest.h, tests/PageSizeTest.h, tests/SplittedCharInputBufferTest.h, tests/StreamCounterTest.h, tests/StreamInputBufferTest.h, tests/VectorStreamTest.h: changed license to GPL version 3 or later 2009-08-10 Martin Gieseking * fedora/dvisvgm-0.8.1-potrace.patch, fedora/dvisvgm.spec: added spec file and patch for Fedora builds * Makefile.am, configure.ac, src/Makefile.am, src/tests/CalculatorTest.h, src/tests/ColorSpecialTest.h, src/tests/DirectoryTest.h, src/tests/FileFinderTest.h, src/tests/FontManagerTest.h, src/tests/FontMapTest.h, src/tests/GraphicPathTest.h, src/tests/MatrixTest.h, src/tests/PageSizeTest.h, src/tests/SplittedCharInputBufferTest.h, src/tests/StreamCounterTest.h, src/tests/StreamInputBufferTest.h, src/tests/VectorStreamTest.h, src/tests/dvipdfm_test.map, src/tests/dvips_test.map, tests/CalculatorTest.h, tests/ColorSpecialTest.h, tests/DirectoryTest.h, tests/FileFinderTest.h, tests/FontManagerTest.h, tests/FontMapTest.h, tests/GraphicPathTest.h, tests/Makefile.am, tests/MatrixTest.h, tests/PageSizeTest.h, tests/SplittedCharInputBufferTest.h, tests/StreamCounterTest.h, tests/StreamInputBufferTest.h, tests/VectorStreamTest.h, tests/dvipdfm_test.map, tests/dvips_test.map: moved tests from src/tests to ./tests * tests/Makefile.am: added generated file test-all.cpp to CLEANFILES 2009-08-02 Martin Gieseking * LICENSE, Makefile.am, src/Ghostscript.cpp: modified package to be compatible with prerequisites of Fedora 2009-07-30 Martin Gieseking * configure.ac, src/DVIToSVG.cpp: added target triplet to version string in SVG output * src/DVIToSVGActions.cpp, src/Ghostscript.cpp, src/Ghostscript.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: added Ghostscript revision info to output of dvisvgm -l 2009-07-29 Martin Gieseking * src/psdefs.psc: added vim tag to psdefs.psc 2009-07-28 Martin Gieseking * src/PsSpecialHandler.cpp: added evaluation of more psfile parameters; fixed psfile bounding box bug * NEWS, configure.ac, src/Doxyfile: updated version number to 0.8.1 * NEWS, src/FileSystem.cpp, src/FontEngine.cpp, src/FontManager.cpp, src/Ghostscript.cpp, src/PageSize.cpp, src/dvisvgm.cpp: fixed bug related to unsigned/size_t mismatch on x64 systems * src/psdefs.psc: cleaned up VC++ build files; added batch file to generate cmdline.c; added generated file psdefs.psc for convenience 2009-07-27 Martin Gieseking * src/DLLoader.cpp, src/InputReader.cpp, src/PSInterpreter.cpp: changes to make VC happy; fixed potential memory bug * NEWS, README: fixed typos; updated homepage/manpage * src/DVIReader.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Matrix.cpp, src/Matrix.h, src/PSInterpreter.h: replaced size_t parameters by unsigned 2009-07-23 Martin Gieseking * src/PSInterpreter.cpp: some clean-ups 2009-07-22 Martin Gieseking * NEWS, README, doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, src/GraphicPath.h, src/PSInterpreter.cpp, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h: fixed clipping bug; updated homepage, README, NEWS * src/TpicSpecialHandler.cpp: fixed reintroduced bug in TPIC handler 2009-07-20 Martin Gieseking * src/DvisvgmSpecialHandler.cpp, src/InputBuffer.cpp, src/InputReader.cpp, src/InputReader.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/tests/StreamInputBufferTest.h: implemented psfile special; fixed some bugs * src/PsSpecialHandler.cpp, src/SVGTree.cpp: fixed bbox bug; added missing file 2009-07-19 Martin Gieseking * configure.ac, doc/dvisvgm.txt.in, src/BoundingBox.cpp, src/BoundingBox.h, src/Color.cpp, src/Color.h, src/DLLoader.cpp, src/DLLoader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Doxyfile, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/FileFinder.cpp, src/FontEncoding.cpp, src/Ghostscript.cpp, src/Ghostscript.h, src/GraphicPath.h, src/InputBuffer.cpp, src/InputBuffer.h, src/InputReader.cpp, src/InputReader.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PsSpecialHandler.cpp, src/PsSpecialHandler.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/SVGTree.h, src/SpecialActions.h, src/TpicSpecialHandler.cpp, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/iapi.h, src/ierrors.h, src/tests/GraphicPathTest.h, src/tests/MatrixTest.h, src/tests/SplittedCharInputBufferTest.h, src/tests/StreamInputBufferTest.h: transplanted PS functionality to default branch 2009-06-01 Martin Gieseking * src/GFReader.cpp, src/GFReader.h: removed error method, use Message::estream instead * src/InputBuffer.cpp, src/InputBuffer.h, src/Makefile.am: transplanted changes to InputBuffer from branch 'pages' * src/Bitmap.cpp, src/Bitmap.h: transplanted changes to Bitmap from branch 'pages' * src/DVIReader.cpp, src/DVIReader.h: transplanted changes to DVIReader from branch 'pages' * src/FileSystem.cpp, src/FileSystem.h: transplanted changes to FileSystem from branch 'pages' * src/VFReader.cpp: transplanted changes to VFReader from branch 'pages' * src/GFTracer.cpp: transplanted changes to GFTracer from branch 'pages' * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: transplanted changes to SpecialHandlers from branch 'pages' 2009-04-24 Martin Gieseking * src/TpicSpecialHandler.cpp: fixed TPIC handler bug that could caused unwanted color fills of ellipses due to a missing call of reset() * NEWS, configure.ac, src/Doxyfile: increased version number to 0.7.3 * src/FontCache.h: increased version of font cache files to ensure their recreation due to the previously fixed shorthand path command bug 2009-04-23 Martin Gieseking * src/FontGlyph.cpp: fixed bug in computation of shorthand path command 2009-04-06 Martin Gieseking * src/FontMap.cpp: fixed bug in FontMap that causes a segfault if extension in given font file is missing (reported by Armin Geisse) 2009-04-02 Martin Gieseking * configure.ac, doc/dvisvgm.txt.in, src/MetafontWrapper.cpp, src/dvisvgm.cpp: prepared release 0.7.2 (removed inclusions of debug.h, adapted homepage and manpage) 2009-03-31 Martin Gieseking * src/MetafontWrapper.cpp, src/MetafontWrapper.h: ported fix in MetafontWrapper back to default branch 2009-03-25 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVG.h, src/FontGlyph.cpp, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/dvisvgm.cpp: replaced Metafont magnification variable and its setters by a public class variable * src/Doxyfile: added doxygen files * src/SVGFontTraceEmitter.cpp: fixed closing bracket "bug" when writing the currently traced character to the terminal 2009-03-24 Martin Gieseking * NEWS, src/FontCache.cpp, src/FontGlyph.cpp, src/FontGlyph.h, src/GFGlyphTracer.cpp, src/Pair.h, src/SVGFontEmitter.cpp: use of shorthand path commands has been implemented * src/FontGlyph.cpp: fixed potential bug in Glyph::optimizeCommands() * src/FontGlyph.cpp: fixed memory bug in Glyph::optimizeCommands() 2009-03-20 Martin Gieseking * src/FontCache.cpp: cache files are being compressed now to reduce the file size 2009-03-19 Martin Gieseking * NEWS, doc/dvisvgm.txt.in, src/FontEmitter.h, src/GFGlyphTracer.cpp, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/dvisvgm.cpp, src/options.ggo: added option --trace-all that forces tracing of all glyphs of all currently used bitmap fonts * src/FontCache.cpp, src/SVGFontTraceEmitter.cpp: don't read existing cache file if --trace-all is given (trace complete font and then write cache file instead) 2009-03-18 Martin Gieseking * src/FontCache.cpp: fixed bug in read/write functions of FontCache * src/DVIToSVG.cpp, src/TFM.cpp, src/TFM.h: added firstChar()/lastChar() to TFM class, removed unnecessary mag member variable and its setter 2009-03-17 Martin Gieseking * doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/FileSystem.cpp, src/FileSystem.h, src/FontCache.cpp, src/FontCache.h, src/FontGlyph.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/Makefile.am, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/dvisvgm.cpp: completed font caching support * doc/dvisvgm.txt.in, src/dvisvgm.cpp: added option variant --cache=? to display the default cache directory * src/FontCache.cpp: reduced size of cache file format by using variable integer sizes 2009-03-16 Martin Gieseking * NEWS, configure.ac, doc/dvisvgm.txt.in, src/DVIToSVG.cpp, src/FileSystem.cpp, src/FileSystem.h, src/FontCache.cpp, src/FontCache.h, src/FontGlyph.cpp, src/FontGlyph.h, src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFTracer.cpp, src/options.ggo: first additions to support font caching; not working yet 2009-03-11 Martin Gieseking * src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FontEmitter.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h: improved font embedding algorithm in case of --no-fonts (identical glyphs in different sizes are now referenced rather than duplicated) 2009-03-10 Martin Gieseking * NEWS, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/Font.h, src/SVGFontEmitter.cpp, src/SVGFontTraceEmitter.cpp: all glyph sizes are now computed correctly in conjuction with option --no-fonts 2009-03-09 Martin Gieseking * src/BgColorSpecialHandler.cpp, src/SpecialManager.cpp, src/TpicSpecialHandler.cpp: adapted Code to make VC happy * src/types.h: minor changes to homepage and .hgignore * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp: fixed transformation bug (transformations are now applied properly to the page) 2009-03-08 Martin Gieseking * NEWS, README, src/Color.cpp, src/Color.h, src/ColorSpecialHandler.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/Makefile.am, src/TpicSpecialHandler.cpp: added bgcolor support, updated homepage, fixed color handler bug * src/BgColorSpecialHandler.cpp, src/BgColorSpecialHandler.h: added missing background color handler 2009-03-06 Martin Gieseking * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: implemented arc drawing of tpic special set * src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: implemented splines of tpic specials 2009-03-03 Martin Gieseking * src/BoundingBox.cpp, src/BoundingBox.h, src/Color.cpp, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/EmSpecialHandler.cpp, src/Makefile.am, src/SpecialActions.h, src/SpecialHandler.h, src/TpicSpecialHandler.cpp: improved computation of the bounding box (works with specials now); added dummy function for background color assignments * doc/Makefile.am, doc/dvisvgm.txt.in, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/InputBuffer.cpp, src/InputBuffer.h, src/SpecialActions.h: implemented the dvisvgm specials raw, image, and bbox * doc/dvisvgm.txt.in, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h: minor code improvements; comments added 2009-02-26 Martin Gieseking * doc/Makefile.am, doc/dvisvgm.txt, doc/dvisvgm.txt.in: removed generated file, added dvisvgm.txt.in * doc/Makefile.am, doc/dvisvgm.txt.in: improved manpage 2009-02-25 Martin Gieseking * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/DvisvgmSpecialHandler.cpp, src/EmSpecialHandler.cpp, src/SpecialActions.h, src/TpicSpecialHandler.cpp: renamed appendInPage() to appendToPage 2009-02-24 Martin Gieseking * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVGActions.cpp, src/DvisvgmSpecialHandler.cpp, src/DvisvgmSpecialHandler.h, src/EmSpecialHandler.cpp, src/EmSpecialHandler.h, src/Makefile.am, src/SpecialColorHandler.cpp, src/SpecialColorHandler.h, src/SpecialDvisvgmHandler.cpp, src/SpecialDvisvgmHandler.h, src/SpecialEmHandler.cpp, src/SpecialEmHandler.h, src/SpecialHandler.h, src/SpecialHtmlHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/tests/ColorSpecialTest.h: improved SpecialHandler is now able to handle unprefixed specials * NEWS, src/Color.cpp, src/Color.h, src/DVIToSVGActions.cpp, src/Makefile.am, src/Pair.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/TpicSpecialHandler.cpp, src/TpicSpecialHandler.h: first tpic implementations; not complete yet * NEWS, doc/dvisvgm.1.in, src/TpicSpecialHandler.cpp: few additions to tpic handler 2009-02-23 Martin Gieseking * NEWS, configure.ac, doc/dvisvgm.1.in, src/DVIBBoxActions.h, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/XMLNode.cpp, src/XMLNode.h, src/dvisvgm.cpp, src/options.ggo, src/tests/ColorSpecialTest.h: added option --no-fonts wich uses path elements instead of fonts 2009-02-20 Martin Gieseking * NEWS, doc/dvisvgm.1.in, src/Color.cpp, src/Color.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, src/SpecialActions.h, src/SpecialColorHandler.cpp, src/SpecialDvisvgmHandler.cpp, src/SpecialDvisvgmHandler.h, src/SpecialEmHandler.cpp, src/SpecialEmHandler.h, src/SpecialHtmlHandler.h, src/VerbSpecialHandler.cpp, src/VerbSpecialHandler.h: fixed bug in color handler, added skeletons of dvisvgm/hyperref special handlers 2009-02-18 Martin Gieseking * src/Color.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, src/SpecialActions.h, src/SpecialColorHandler.cpp, src/SpecialEmHandler.cpp: added color support to emTeX specials, removed Color class * NEWS, src/SpecialActions.h, src/tests/ColorSpecialTest.h: adapted color test to new interface, added emtex info 2009-02-17 Martin Gieseking * src/DVIReader.cpp: made DVICommand local to executeCommand, removed unnecessary if statement 2009-02-14 Martin Gieseking * src/Color.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h: finished color support * src/dvisvgm.cpp: fixed incorrect behavior of option -V/--version * NEWS, configure.ac: increased version number to 0.6.2, updated NEWS * doc/dvisvgm.1.in, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/dvisvgm.cpp, src/options.ggo: added option --no-style * NEWS, configure.ac: prepared release of version 0.7 2009-02-13 Martin Gieseking * Makefile.am, configure.ac, src/tests/DirectoryTest.h: removed rpm support * prepare: added administrative files * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h: reverted to previous version, removed dependency on Color class * src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Makefile.am, src/SpecialActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: color specials are now processed by DVIToSVGActions, but don't create any results yet * prepare: updated administrative files * src/ColorSpecialHandler.cpp, src/Makefile.am, src/tests/ColorSpecialTest.h: added tests for ColorSpecialHandler 2009-02-12 martin@xps * src/inttypes.h: added rudimentary files for writing of SWF files; not ready yet 2009-02-10 Martin Gieseking * src/Color.h, src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/Makefile.am: replaced RGB arrays by Color class 2009-02-09 Martin Gieseking * src/TransformationMatrix.cpp: made y-coordinate of cmdline-option -t optional 2009-02-06 Martin Gieseking * doc/dvisvgm.1.in, src/ColorSpecialHandler.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/dvisvgm.cpp, src/options.ggo: added option --list-specials that lists all registered special handlers * src/FileFinder.cpp: changed lookup order of font maps 2009-02-05 Martin Gieseking * src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/dvisvgm.cpp, src/options.ggo: added optional prefix list to commandline option --no-specials * src/DVIToSVGActions.cpp: replaced special ignore list evaluation algorithm 2009-02-04 Martin Gieseking * src/FileFinder.cpp: added option for additional loading of user maps * src/FontMap.cpp: added output of font encoding in write method 2009-02-03 Martin Gieseking * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h, src/options.ggo: more color special implementation (color constants), still not ready * src/FileFinder.cpp, src/FileFinder.h, src/dvisvgm.cpp: option -m/--map-file is now evaluated properly * map/cork-lm.map: removed deprecated map subdirectory 2009-02-02 Martin Gieseking * NEWS, src/FileFinder.cpp: fixed buggy call of maketfm/makemf in Windows version * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h, src/Makefile.am, src/SpecialHandler.h, src/SpecialManager.cpp, src/SpecialManager.h: added special support skeletons; not working yet * src/ColorSpecialHandler.cpp, src/ColorSpecialHandler.h: some refactorings in color handler 2009-01-30 Martin Gieseking * src/dvisvgm.cpp: prevented writing zero-length svg files; simplified main code by using auto pointers * NEWS, src/DVIReader.cpp, src/DVIReader.h: fixed magnification bug 2009-01-29 Martin Gieseking * src/FileFinder.cpp: adapted Windows version to new release 2009-01-28 Martin Gieseking * src/FileFinder.cpp, src/FileFinder.h, src/Makefile.am, src/tests/DirectoryTest.h, src/tests/FileFinderTest.h, src/tests/FontManagerTest.h, src/tests/KPSFileFinderTest.h: refactored FileFinder (implementation as singleton) * src/dvisvgm.cpp: use new initialisation of FileFinder * src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h: improved GFTracer to support unscaled results * src/FontMap.cpp, src/Makefile.am, src/tests/FontMapTest.h, src/tests/dvipdfm_test.map, src/tests/dvips_test.map: extensions to FontMap almost complete but not finished yet * src/Calculator.cpp, src/DVIToSVG.cpp, src/FontEncoding.cpp, src/FontMap.cpp, src/SVGFontEmitter.cpp, src/SVGFontTraceEmitter.cpp: replaced comparisions with "" with calls of empty() * src/FileFinder.cpp, src/FontMap.cpp, src/FontMap.h, src/tests/FontMapTest.h, src/tests/dvips_test.map: FontMap now supports dvips and dvipdfm maps * NEWS, configure.ac, doc/dvisvgm.1.in: adapted configuration and documentation to new dvips map file support 2009-01-27 Martin Gieseking * src/GFGlyphTracer.cpp, src/GFGlyphTracer.h, src/GFTracer.cpp, src/GFTracer.h, src/Makefile.am, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h: made GFTracer a generic class with template methods 2009-01-26 Martin Gieseking * src/Bitmap.cpp, src/Bitmap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/Makefile.am: improvements to GF handling, first skeletton of gf->metapost (gfprint) * src/InputBuffer.h: fixed incompatible types bug 2009-01-25 Martin Gieseking * src/InputBuffer.cpp, src/InputBuffer.h: added missing include * src/FontMap.cpp, src/FontMap.h: started redesign of FontMap, not complete yet * src/CharmapTranslator.cpp, src/DVIToSVG.cpp, src/FileFinder.cpp, src/FileFinder.h, src/Font.cpp, src/FontEncoding.cpp, src/FontManager.cpp, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile.am, src/MetafontWrapper.cpp, src/TFM.cpp, src/dvisvgm.cpp: renamed KPSFileFinder to FileFinder * src/FontMap.cpp: basic dvips font map support, not complete yet 2009-01-23 Martin Gieseking * doc/Makefile.am, doc/dvisvgm.1.in: manpage updates 2009-01-22 Martin Gieseking * src/FontMap.cpp: forgot to remove address operator * src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/dvisvgm.cpp: added support for MiKTeX' new COM interface * src/DVIReader.cpp, src/FontManager.cpp, src/KPSFileFinder.cpp: memory leak fixed * src/KPSFileFinder.cpp: fixed throwing of COM exception * Makefile.am, NEWS, README, configure.ac, potracelib/Makefile.am: updated version info to 0.6 * src/tests/CalculatorTest.h, src/tests/DirectoryTest.h, src/tests/FontManagerTest.h, src/tests/FontMapTest.h, src/tests/KPSFileFinderTest.h, src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/tests/VectorStreamTest.h: updated tests * doc/dvisvgm.1.in, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.cpp, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Directory.cpp, src/Directory.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/Font.cpp, src/Font.h, src/FontEmitter.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/InputBuffer.cpp, src/InputBuffer.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamCounter.h, src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/options.ggo, src/types.h: updated file header comments * configure.ac: added test whether dvipdfm.map is available 2009-01-21 Martin Gieseking * src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/FontEncoding.cpp, src/FontGlyph.cpp: fixed bugs in handling of font encodings and virtual fonts * src/Calculator.cpp, src/DVIReader.cpp, src/DVIToSVGActions.cpp, src/Directory.cpp, src/FontEncoding.cpp, src/FontEngine.cpp, src/FontManager.cpp, src/FontMap.cpp, src/KPSFileFinder.cpp, src/MetafontWrapper.cpp, src/PageSize.cpp, src/StreamReader.cpp, src/TFM.cpp, src/TransformationMatrix.cpp, src/VFReader.cpp, src/XMLDocument.cpp, src/XMLNode.cpp: added in/out attributes to parameter documentation 2009-01-20 Martin Gieseking * src/DVIReader.cpp, src/DVIToSVG.cpp, src/Font.h, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontManager.cpp, src/FontManager.h, src/InputBuffer.cpp, src/InputBuffer.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h: first working version with font encoding support * src/FontEngine.cpp, src/FontEngine.h, src/SVGFontEmitter.cpp: fixed glyph positioning bug occured in conjunction with font encoding * src/SVGFontEmitter.cpp: fixed memory bug 2009-01-19 Martin Gieseking * src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp, src/FontMap.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h: more encoding implementations, not complete yet * src/DVIReader.cpp, src/FontEncoding.cpp, src/FontEncoding.h, src/FontEngine.cpp, src/FontEngine.h, src/FontManager.cpp, src/FontManager.h, src/FontMap.cpp: partly working mapping support, but yet too slow 2009-01-16 Martin Gieseking * src/TransformationMatrix.cpp: fixed bug in argument assignment of transformation command M 2009-01-15 Martin Gieseking * src/TransformationMatrix.cpp: removed a dangerous loop remained from previous code 2009-01-14 Martin Gieseking * potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: updated libpotrace to version 1.8 * src/FontEncoding.cpp, src/FontEncoding.h, src/InputBuffer.cpp, src/InputBuffer.h, src/Makefile.am: added basic skeleton for handling of font encodings * src/FileSystem.cpp, src/FileSystem.h: const string parameters * src/dvisvgm.cpp: updated copyright string * src/KPSFileFinder.cpp: added enc-file support 2009-01-13 Martin Gieseking * src/CharmapTranslator.cpp: fixed crash on loading corrupt pfb-files 2008-06-18 Martin Gieseking * src/Makefile.am: adapted to latest gengetopt version 2008-04-07 Martin Gieseking * src/Makefile.am: added missing include path * src/DVIReader.cpp: minor change 2007-03-26 Martin Gieseking * NEWS, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, src/DVIReader.cpp, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.h, src/FontManager.cpp, src/Makefile.am, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h: redesigned DVIActions and CharmapTranslator * src/DVIActions.cpp, src/DVIReader.cpp, src/DVIReader.h, src/FontManager.cpp, src/tests/FontManagerTest.h: few minor changes 2007-03-25 Martin Gieseking * src/DVIActions.cpp, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontManager.h, src/StreamReader.cpp, src/StreamReader.h, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/VectorStream.h: first working version 0.5, release candidate 1 * src/DVIReader.cpp, src/DVIReader.h, src/VFActions.h: minor fixes 2007-03-23 Martin Gieseking * src/DVIReader.cpp, src/FontManager.cpp, src/FontManager.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/VFReader.cpp: more vf implementations, not complete yet 2007-03-22 Martin Gieseking * NEWS, doc/Makefile.in, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/FileSystem.cpp, src/FileSystem.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile.am, src/dvisvgm.cpp, src/tests/DirectoryTest.h, src/tests/FontManagerTest.h: reintegrated font map initialization into KPSFileFinderm adapted some tests * src/DVIReader.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp, src/VFActions.h, src/VFReader.cpp, src/VFReader.h: more vf implementations 2007-03-21 Martin Gieseking * AUTHORS, Makefile.am, README, potracelib/Makefile.am, src/Directory.cpp, src/Directory.h, src/KPSFileFinder.cpp, src/Makefile, src/Makefile.am, src/Makefile.in, src/SVGFontTraceEmitter.cpp, src/test-all.cpp, src/tests/DirectoryTest.h: implemented Directory class for Linux, added DirectoryTest * src/Calculator.cpp, src/DVIReader.cpp, src/Directory.cpp, src/Font.h, src/FontManager.cpp, src/Makefile, src/Makefile.am, src/Makefile.in, src/MetafontWrapper.cpp, src/VFReader.cpp, src/VectorStream.h, src/test-all.cpp, src/tests/VectorStreamTest.h: removed redundant code and commented code fragments, added VectorInputStream class * src/Directory.cpp, src/Directory.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/dvisvgm.cpp: completed MiKTeX font map file look-up, fixed bug in Directory class * src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/dvisvgm.cpp: implemented options -n and -m 2007-03-20 Martin Gieseking * NEWS, doc/Makefile, doc/Makefile.in, doc/dvisvgm.1.in, src/DVIReader.cpp, src/DVIToSVG.cpp, src/Font.cpp, src/Font.h, src/FontManager.cpp, src/KPSFileFinder.cpp, src/Makefile, src/Makefile.am, src/Makefile.in, src/VFReader.cpp, src/dvisvgm.cpp, src/test-all.cpp, src/tests/KPSFileFinderTest.h: added KPSFileFinderTest, added EmptyFont, fixed compilation error * src/Directory.cpp, src/Directory.h, src/FileSystem.cpp, src/FontMap.cpp, src/FontMap.h, src/KPSFileFinder.cpp: more changes for MiKTeX support 2007-03-19 Martin Gieseking * src/CharmapTranslator.cpp, src/DVIToSVG.cpp, src/FontManager.cpp, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/MetafontWrapper.cpp, src/TFM.cpp: added mktexFOO support and font map lookups to KPSFileFinder * src/KPSFileFinder.cpp: bug fixed, font maps work now * src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/KPSFileFinder.cpp: made sources comaptible with MikTeX 2007-03-16 Martin Gieseking * src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontMap.cpp, src/FontMap.h, src/KPSFileFinder.cpp, src/Makefile, src/Makefile.am, src/Makefile.in, src/StreamReader.cpp, src/TFM.cpp, src/options.ggo, src/tests/FontMapTest.h: more coding in the font department, not finished yet 2007-03-09 Martin Gieseking * src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/Font.cpp, src/FontManager.cpp, src/GFTracer.cpp, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamReader.cpp, src/StreamReader.h, src/TFM.cpp, src/TFM.h, src/VFReader.cpp, src/VFReader.h, src/dvisvgm.cpp, src/options.ggo, src/test-all.cpp: refactorings: extracted StreamReader class, replaced generic FileFinder support by KPSFileFinder calls 2007-03-08 Martin Gieseking * src/DVIActions.h, src/DVIBBoxActions.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/Font.cpp, src/Font.h, src/FontManager.cpp, src/FontManager.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/Message.cpp, src/dvisvgm.cpp, src/macros.h, src/test-all.cpp: first unstable version with redesigned font handling * COPYING, Makefile, Makefile.am, Makefile.in, Martins_svg_neu.svg, NEWS, aclocal.m4, cmdline.c, config.guess, config.h, config.h.in, config.status, config.sub, configure.ac, depcomp, doc/Makefile, doc/dvisvgm.1, doc/dvisvgm.1.in, gpl.txt, install-sh, missing, src/FontManager.cpp, src/FontManager.h, src/Makefile.am, src/VFReader.cpp, src/tests/FontManagerTest.h, stamp-h1, table.txt: removed some garbage from the repository, added initial FontManagerTest * doc/dvisvgm.1, src/FontEngine.h, src/dvisvgm.cpp, src/tests/FontManagerTest.h: minor changes * src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/Font.cpp, src/Font.h, src/StreamCounter.h, src/dvisvgm.cpp: fixed memory bug * src/DVIReader.cpp, src/DVIToSVGActions.cpp, src/Font.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/VFActions.h, src/VFReader.cpp, src/VFReader.h, src/dvisvgm.cpp: plugged VFReader and its actions into the code (not usable yet) 2007-03-07 Martin Gieseking * src/Font.cpp, src/Font.h: added Font classes (not yet error-free) 2007-03-06 Martin Gieseking * src/DVIReader.h, src/DVIToSVG.cpp, src/FontManager.cpp, src/FontManager.h: added FontManager skeleton, fixed bug in makehead 2007-03-03 Martin Gieseking * src/DVIReader.cpp, src/FontManager.cpp, src/VFReader.cpp: added some more skeleton code 2007-03-02 Martin Gieseking * src/DVIReader.cpp, src/Makefile, src/Makefile.in, src/VFReader.cpp, src/VFReader.h, src/options.ggo: added skeleton of VFReader 2007-01-10 Martin Gieseking * src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamCounter.h, src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp, src/getopt.c, src/getopt.h, src/getopt1.c, src/gzstream.cpp, src/gzstream.h, src/macros.h, src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h, src/options.ggo, src/test-all.cpp, src/tests/CalculatorTest.h, src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/types.h: moved dir * INSTALL, Makefile.am, NEWS, README, configure.ac, doc/Makefile, doc/Makefile.am, doc/Makefile.in, doc/dvisvgm.1, doc/dvisvgm.1.in, gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, gzstream/version, map/cork-lm.map, potracelib/Makefile.am, potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h: moved sources * src/cmdline.c, src/cmdline.h: remove unnecessary files 2007-01-09 Martin Gieseking * INSTALL, Makefile.am, NEWS, README, configure.ac, doc/Makefile, doc/Makefile.am, doc/Makefile.in, doc/dvisvgm.1, doc/dvisvgm.1.in, gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, gzstream/version, potracelib/Makefile.am, potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamCounter.h, src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp, src/getopt.c, src/getopt.h, src/getopt1.c, src/gzstream.cpp, src/gzstream.h, src/macros.h, src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h, src/options.ggo, src/test-all.cpp, src/tests/CalculatorTest.h, src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/types.h: moved files to trunk subfolder * map/cork-lm.map: moved files to trunk 2007-01-05 Martin Gieseking * Makefile, Makefile.am, Makefile.in, README, config.status, configure.ac, potracelib/Makefile.am, potracelib/bitops.h, potracelib/flate.c, potracelib/flate.h, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile.am, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamCounter.h, src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/test-all.cpp, src/types.h: minor modifications 2007-01-03 Martin Gieseking * NEWS, src/KPSFileFinder.cpp: updated homepage * Makefile, Makefile.am, Makefile.in, config.h, config.h.in, config.status, configure, configure.ac, doc/Makefile, potracelib/Makefile.am, potracelib/auxiliary.h, potracelib/bitmap.h, potracelib/bitops.h, potracelib/curve.c, potracelib/curve.h, potracelib/decompose.c, potracelib/decompose.h, potracelib/flate.c, potracelib/flate.h, potracelib/lists.h, potracelib/potracelib.c, potracelib/potracelib.h, potracelib/progress.h, potracelib/trace.c, potracelib/trace.h, src/Makefile, src/Makefile.am, src/Makefile.in: added potracelib to distribution * configure: removed configure from repository 2006-12-31 Martin Gieseking * NEWS, configure.ac, src/DVIToSVG.cpp, src/FileSystem.cpp, src/FontEngine.cpp, src/GFTracer.cpp, src/KPSFileFinder.cpp, src/Matrix.h, src/Message.cpp, src/PageSize.cpp, src/TransformationMatrix.cpp, src/dvisvgm.cpp: updated to MikTeX 2.5 support * Makefile, config.status, configure, configure.ac, doc/Makefile, doc/dvisvgm.1, src/FileSystem.cpp, src/FontEngine.cpp, src/KPSFileFinder.cpp, src/Makefile, src/dvisvgm.cpp, src/test-all.cpp: some minor fixes * src/KPSFileFinder.cpp: fixed namepsace bug 2006-08-01 Martin Gieseking * Makefile, Makefile.in, NEWS, aclocal.m4, autom4te.cache/output.0, autom4te.cache/requests, autom4te.cache/traces.0, config.h, config.log, config.status, configure, configure.ac, doc/Makefile, doc/Makefile.in, doc/dvisvgm.1, src/FontEngine.cpp, src/Makefile, src/Makefile.in, src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp: added support for freetype version >= 2.1.1 * configure.ac: enabled svn keyword expansion 2006-04-12 Martin Gieseking * COPYING, INSTALL, Makefile, Makefile.am, Makefile.in, Martins_svg_neu.svg, NEWS, README, aclocal.m4, autom4te.cache/output.0, autom4te.cache/requests, autom4te.cache/traces.0, cmdline.c, config.guess, config.h, config.h.in, config.log, config.status, config.sub, configure, configure.ac, depcomp, doc/Makefile, doc/Makefile.am, doc/Makefile.in, doc/dvisvgm.1, doc/dvisvgm.1.in, gpl.txt, gzstream/COPYING.LIB, gzstream/Makefile, gzstream/README, gzstream/gzstream.cpp, gzstream/gzstream.h, gzstream/index.html, gzstream/logo.gif, gzstream/test_gunzip.C, gzstream/test_gzip.C, gzstream/version, install-sh, map/cork-lm.map, missing, src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Makefile, src/Makefile.am, src/Makefile.in, src/Matrix.cpp, src/Matrix.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PSInterpreter.cpp, src/PSInterpreter.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamCounter.h, src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/cmdline.c, src/cmdline.h, src/dvisvgm.cpp, src/getopt.c, src/getopt.h, src/getopt1.c, src/gzstream.cpp, src/gzstream.h, src/lshort-cm.dvi, src/lshort-cm.svg, src/lshort-cm.svgz, src/lshort.dvi, src/lshort.svg, src/lshort.svgz, src/macros.h, src/miktex-core.def, src/miktex-kps.def, src/miktex-kps.h, src/options.ggo, src/test-all.cpp, src/tests/CalculatorTest.h, src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/types.h, stamp-h1, table.txt: initial import * src/Bitmap.cpp, src/Bitmap.h, src/BoundingBox.cpp, src/BoundingBox.h, src/Calculator.cpp, src/Calculator.h, src/CharmapTranslator.cpp, src/CharmapTranslator.h, src/DVIActions.h, src/DVIBBoxActions.h, src/DVIBBoxReader.cpp, src/DVIBBoxReader.h, src/DVIReader.cpp, src/DVIReader.h, src/DVIToSVG.cpp, src/DVIToSVG.h, src/DVIToSVGActions.cpp, src/DVIToSVGActions.h, src/FileFinder.cpp, src/FileFinder.h, src/FileSystem.cpp, src/FileSystem.h, src/FontEmitter.h, src/FontEngine.cpp, src/FontEngine.h, src/FontGlyph.cpp, src/FontGlyph.h, src/FontMap.cpp, src/FontMap.h, src/GFReader.cpp, src/GFReader.h, src/GFTracer.cpp, src/GFTracer.h, src/KPSFileFinder.cpp, src/KPSFileFinder.h, src/Message.cpp, src/Message.h, src/MessageException.h, src/MetafontWrapper.cpp, src/MetafontWrapper.h, src/PageSize.cpp, src/PageSize.h, src/Pair.h, src/SVGFontEmitter.cpp, src/SVGFontEmitter.h, src/SVGFontTraceEmitter.cpp, src/SVGFontTraceEmitter.h, src/StreamCounter.h, src/TFM.cpp, src/TFM.h, src/TransformationMatrix.cpp, src/TransformationMatrix.h, src/XMLDocTypeNode.h, src/XMLDocument.cpp, src/XMLDocument.h, src/XMLNode.cpp, src/XMLNode.h, src/XMLString.cpp, src/XMLString.h, src/dvisvgm.cpp, src/macros.h, src/test-all.cpp, src/tests/CalculatorTest.h, src/tests/PageSizeTest.h, src/tests/StreamCounterTest.h, src/types.h: changed keyword tags * src/lshort-cm.dvi, src/lshort-cm.svg, src/lshort-cm.svgz, src/lshort.dvi, src/lshort.svg, src/lshort.svgz: removed files that need not be version controlled dvisvgm-2.8.1/COPYING0000664000175000017500000010451313510660062011162 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . dvisvgm-2.8.1/test-driver0000755000175000017500000001104213512046314012315 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2018 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: dvisvgm-2.8.1/missing0000755000175000017500000001533613512046314011530 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: dvisvgm-2.8.1/AUTHORS0000664000175000017500000000110013510660062011163 00000000000000Martin Gieseking author of dvisvgm Yann Collet libs/xxHash/xxhash.* https://github.com/Cyan4973/xxHash Google Inc. libs/brotli/* libs/woff2/* https://github.com/google/brotli https://github.com/google/woff2 Angus Johnson libs/clipper/clipper.* https://sourceforge.net/projects/polyclipping/ Michael Park libs/variant/include/mpark/* https://github.com/mpark/variant Alexander Peslyak libs/md5/* Peter Selinger libs/potrace/* http://potrace.sourceforge.net George Williams libs/ff-woff/* https://github.com/fontforge/fontforge dvisvgm-2.8.1/README0000664000175000017500000001403513510660062011006 00000000000000dvisvgm -- A DVI to SVG converter DESCRIPTION dvisvgm is a utility for TeX/LaTeX users. It converts DVI, EPS, and PDF files to the XML-based scalable vector graphics format SVG. DEPENDENCIES dvisvgm relies on the following free libraries: * Clipper (http://www.angusj.com/delphi/clipper.php) To compute the intersections of two curved paths, dvisvgm flattens the paths to polygons, intersects them using Clipper, and reconstructs the curves afterwards. * FontForge library (https://fontforge.github.io) dvisvgm can be built with optional WOFF support that allows to embed the font data in WOFF or TrueType format rather than as SVG. The FontForge library provides the required functions to create font files in these formats. A reduced version of the library is bundled with the dvisvgm sources. * FreeType 2 (http://www.freetype.org) This library is used to extract the glyph outlines from vector fonts (PFB, OTF, TTF). * Ghostscript (https://www.ghostscript.com) The PostScript special handler requires the Ghostscript shared library libgs.so.N (Linux) or gsdll32.dll/gsdll64.dll (Windows) to be installed. If the configure script finds the corresponding Ghostscript development files on the system, it directly links against libgs.so.N, where N is the library's ABI version. Otherwise, the library is looked up during runtime, and the PostScript support is enabled only if the shared library can be found. Due to incompatible changes of the Ghostscript API, dvisvgm requires Ghostscript 8.31 or later. * kpathsea (https://tug.org/kpathsea) This library is part of the Web2C package and is usually installed in conjunction with a TeX distribution. kpathsea provides functions for searching files in the large texmf tree. Please ensure that you use the kpathsea version coming with or matching your TeX system. * OpenSSL crypto library (https://www.openssl.org) dvisvgm comes with a bundled implementation of the MD5 hash algorithm which can optionally be replaced with the corresponding function of the OpenSSL crypto library. If the configuration script finds the OpenSSL development files on the build system, it links against libcrypto instead of the bundled MD5 module. * potracelib (http://potrace.sourceforge.net) Peter Selinger's bitmap tracing library is utilized to vectorize Metafont's bitmap output. A recent version is also part of the dvisvgm sources. * ttfautohint (https://www.freetype.org/ttfautohint) dvisvgm can optionally be built with ttfautohint support to replace the autohinting functionality of FontForge. Since it's still an experimental feature, ttfautohint support is disabled by default. The development files required for Windows can be found at https://github.com/mgieseki/ttfautohint-dll. * woff2 and brotli (https://github.com/google/woff2) These Google libraries are bundled with the dvisvgm sources. They are used to create WOFF2 from TrueType fonts. * xxHash (https://github.com/Cyan4973/xxHash) The xxHash library provides a fast hash algorithm. dvisvgm uses it to create unique integer values from PostScript character names in order to store them in a compact way together with their Unicode points. A recent version of xxHash is bundled with the dvisvgm sources. * zlib (http://www.zlib.org) This library is required to create compressed SVGZ files. BUILDING DVISVGM FROM SOURCE dvisvgm is written in C++11 (ISO C++ standard 2011) and requires an appropriate compiler, like GCC 4.9, Clang 3.3, or any later version. The configure script checks for the availability of C++11 support and adds the proper compiler options if necessary. Quick installation info: * ensure that the development packages of all libraries, listed above, are installed * type "./autogen.sh" if "configure" is not present in the dvisvgm root folder * either type "./configure" if you don't want to use the bundled libraries brotli, potrace, woff2, and xxHash but link against the corresponding system libraries, or type "./configure --enable-bundled-libs" in order to build and statically link the bundled libraries. * type "make" * type "make install" as root (or "sudo make install") For generic configuration instructions see the file INSTALL. The configure script should recognize all necessary parameters. If a library is installed but not detected, specify its location as commandline parameter of configure, e.g. ./configure --with-freetype=/usr/local/freetype (all available options can be displayed with ./configure --help) The tracer module calls Metafont in case of lacking TFM or PFB files via a system call. Please ensure that Metafont is installed and reachable through the system's search path. If you don't like compiling the sources yourself, you can download pre-compiled executables for Windows and MiKTeX from the project website instead (see below). USAGE Information about the command-line interface and the available options can be found in the manual page. ADDITIONAL INFORMATION This package is available from CTAN (dviware/dvisvgm) and can be downloaded from the project website as well: https://dvisvgm.de Here you can find the sources, pre-compiled binaries and further additional information about the converter and related topics. If you've found a bug, please let me know. You can either send me an email or preferably use the bug tracker at GitHub (https://github.com/mgieseki/dvisvgm). COPYRIGHT Copyright (C) 2005-2019 Martin Gieseking This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. See file COPYING for details. dvisvgm-2.8.1/config.sub0000755000175000017500000007530413512046314012115 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-08-29' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type IFS="-" read -r field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 os=$maybe_os ;; android-linux) basic_machine=$field1-unknown os=linux-android ;; *) basic_machine=$field1-$field2 os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any patern case $field1-$field2 in decstation-3100) basic_machine=mips-dec os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 os= ;; *) basic_machine=$field1 os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc os=bsd ;; a29khif) basic_machine=a29k-amd os=udi ;; adobe68k) basic_machine=m68010-adobe os=scout ;; alliant) basic_machine=fx80-alliant os= ;; altos | altos3068) basic_machine=m68k-altos os= ;; am29k) basic_machine=a29k-none os=bsd ;; amdahl) basic_machine=580-amdahl os=sysv ;; amiga) basic_machine=m68k-unknown os= ;; 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 ;; aros) basic_machine=i386-pc os=aros ;; aux) basic_machine=m68k-apple os=aux ;; balance) basic_machine=ns32k-sequent os=dynix ;; blackfin) basic_machine=bfin-unknown os=linux ;; cegcc) basic_machine=arm-unknown os=cegcc ;; 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) basic_machine=j90-cray os=unicos ;; crds | unos) basic_machine=m68k-crds os= ;; da30) basic_machine=m68k-da30 os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec os= ;; delta88) basic_machine=m88k-motorola os=sysv3 ;; dicos) basic_machine=i686-pc os=dicos ;; djgpp) basic_machine=i586-pc os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=ose ;; gmicro) basic_machine=tron-gmicro os=sysv ;; go32) basic_machine=i386-pc os=go32 ;; 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 ;; hppaosf) basic_machine=hppa1.1-hp os=osf ;; hppro) basic_machine=hppa1.1-hp os=proelf ;; i386mach) basic_machine=i386-mach os=mach ;; vsta) basic_machine=i386-pc os=vsta ;; isi68 | isi) basic_machine=m68k-isi os=sysv ;; m68knommu) basic_machine=m68k-unknown os=linux ;; magnum | m3230) basic_machine=mips-mips os=sysv ;; merlin) basic_machine=ns32k-utek os=sysv ;; mingw64) basic_machine=x86_64-pc os=mingw64 ;; mingw32) basic_machine=i686-pc os=mingw32 ;; mingw32ce) basic_machine=arm-unknown os=mingw32ce ;; monitor) basic_machine=m68k-rom68k os=coff ;; morphos) basic_machine=powerpc-unknown os=morphos ;; moxiebox) basic_machine=moxie-unknown os=moxiebox ;; msdos) basic_machine=i386-pc os=msdos ;; msys) basic_machine=i686-pc os=msys ;; mvs) basic_machine=i370-ibm os=mvs ;; nacl) basic_machine=le32-unknown os=nacl ;; ncr3000) basic_machine=i486-ncr os=sysv4 ;; netbsd386) basic_machine=i386-pc 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 ;; necv70) basic_machine=v70-nec os=sysv ;; 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 ;; os400) basic_machine=powerpc-ibm os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=ose ;; os68k) basic_machine=m68k-none os=os68k ;; paragon) basic_machine=i860-intel os=osf ;; parisc) basic_machine=hppa-unknown os=linux ;; pw32) basic_machine=i586-unknown os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=rdos ;; rdos32) basic_machine=i386-pc os=rdos ;; rom68k) basic_machine=m68k-rom68k os=coff ;; sa29200) basic_machine=a29k-amd os=udi ;; sei) basic_machine=mips-sei os=seiux ;; sequent) basic_machine=i386-sequent os= ;; sps7) basic_machine=m68k-bull os=sysv2 ;; st2000) basic_machine=m68k-tandem os= ;; stratus) basic_machine=i860-stratus os=sysv4 ;; sun2) basic_machine=m68000-sun os= ;; sun2os3) basic_machine=m68000-sun os=sunos3 ;; sun2os4) basic_machine=m68000-sun os=sunos4 ;; sun3) basic_machine=m68k-sun os= ;; sun3os3) basic_machine=m68k-sun os=sunos3 ;; sun3os4) basic_machine=m68k-sun os=sunos4 ;; sun4) basic_machine=sparc-sun os= ;; sun4os3) basic_machine=sparc-sun os=sunos3 ;; sun4os4) basic_machine=sparc-sun os=sunos4 ;; sun4sol2) basic_machine=sparc-sun os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun os= ;; sv1) basic_machine=sv1-cray os=unicos ;; symmetry) basic_machine=i386-sequent os=dynix ;; t3e) basic_machine=alphaev5-cray os=unicos ;; t90) basic_machine=t90-cray os=unicos ;; toad1) basic_machine=pdp10-xkl os=tops20 ;; tpf) basic_machine=s390x-ibm os=tpf ;; udi29k) basic_machine=a29k-amd os=udi ;; ultra3) basic_machine=a29k-nyu os=sym1 ;; v810 | necv810) basic_machine=v810-nec os=none ;; vaxv) basic_machine=vax-dec os=sysv ;; vms) basic_machine=vax-dec os=vms ;; vxworks960) basic_machine=i960-wrs os=vxworks ;; vxworks68) basic_machine=m68k-wrs os=vxworks ;; vxworks29k) basic_machine=a29k-wrs os=vxworks ;; xbox) basic_machine=i686-pc os=mingw32 ;; ymp) basic_machine=ymp-cray os=unicos ;; *) basic_machine=$1 os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi os=${os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray os=${os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $os in irix*) ;; *) os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony os=newsos ;; next | m*-next) cpu=m68k vendor=next case $os in nextstep* ) ;; ns2*) os=nextstep2 ;; *) os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde os=${os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) IFS="-" read -r cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ 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. auroraux) os=auroraux ;; bluegene*) os=cnk ;; solaris1 | solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; solaris) os=solaris2 ;; unixware*) os=sysv4.2uw ;; gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) es1800*) os=ose ;; # Some version numbers need modification chorusos*) os=chorusos ;; isc) os=isc2.2 ;; sco6) os=sco5v6 ;; sco5) os=sco3.2v5 ;; sco4) os=sco3.2v4 ;; sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` ;; sco3.2v[4-9]* | sco5v6*) # Don't forget version if it is 3.2v4 or newer. ;; scout) # Don't match below ;; sco*) os=sco3.2v2 ;; psos*) os=psos ;; # Now 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* | esix* | aix* | cnk* | sunos | sunos[34]*\ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | kopensolaris* | plan9* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* \ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ | knetbsd* | mirbsd* | netbsd* \ | bitrig* | openbsd* | solidbsd* | libertybsd* \ | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* \ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ | linux-newlib* | linux-musl* | linux-uclibc* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ | openstep* | oskit* | conix* | pw32* | nonstopux* \ | storm-chaos* | tops10* | tenex* | tops20* | its* \ | os2* | vos* | palmos* | uclinux* | nucleus* \ | morphos* | superux* | rtmk* | windiss* \ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ | skyos* | haiku* | rdos* | toppers* | drops* | es* \ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; qnx*) case $cpu in x86 | i*86) ;; *) os=nto-$os ;; esac ;; hiux*) os=hiuxwe2 ;; nto-qnx*) ;; nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; sim | xray | os68k* | v88r* \ | windows* | osx | abug | netware* | os9* \ | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) ;; linux-dietlibc) os=linux-dietlibc ;; linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; lynx*178) os=lynxos178 ;; lynx*5) os=lynxos5 ;; lynx*) os=lynxos ;; mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; opened*) os=openedition ;; os400*) os=os400 ;; sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; wince*) os=wince ;; utek*) os=bsd ;; dynix*) os=bsd ;; acis*) os=aos ;; atheos*) os=atheos ;; syllable*) os=syllable ;; 386bsd) os=bsd ;; ctix* | uts*) os=sysv ;; nova*) os=rtmk-nova ;; ns2) os=nextstep2 ;; nsk*) os=nsk ;; # Preserve the version number of sinix5. sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; sinix*) os=sysv4 ;; tpf*) os=tpf ;; triton*) os=sysv3 ;; oss*) os=sysv3 ;; svr4*) os=sysv4 ;; svr3) os=sysv3 ;; sysvr4) os=sysv4 ;; # This must come after sysvr4. sysv*) ;; ose*) os=ose ;; *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) os=mint ;; zvmoe) os=zvmoe ;; dicos*) os=dicos ;; pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $cpu in arm*) os=eabi ;; *) os=elf ;; esac ;; nacl*) ;; ios) ;; none) ;; *-eabi) ;; *) 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 $cpu-$vendor in score-*) os=elf ;; spu-*) os=elf ;; *-acorn) os=riscix1.2 ;; arm*-rebel) os=linux ;; arm*-semi) os=aout ;; c4x-* | tic4x-*) os=coff ;; c8051-*) os=elf ;; clipper-intergraph) os=clix ;; hexagon-*) os=elf ;; tic54x-*) os=coff ;; tic55x-*) os=coff ;; tic6x-*) os=coff ;; # This must come before the *-dec entry. pdp10-*) os=tops20 ;; pdp11-*) os=none ;; *-dec | vax-*) os=ultrix4.2 ;; m68*-apollo) os=domain ;; i386-sun) os=sunos4.0.2 ;; m68000-sun) os=sunos3 ;; m68*-cisco) os=aout ;; mep-*) os=elf ;; mips*-cisco) os=elf ;; mips*-*) os=elf ;; or32-*) os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 ;; sparc-* | *-sun) os=sunos4.1.1 ;; pru-*) os=elf ;; *-be) os=beos ;; *-ibm) os=aix ;; *-knuth) os=mmixware ;; *-wec) os=proelf ;; *-winbond) os=proelf ;; *-oki) os=proelf ;; *-hp) os=hpux ;; *-hitachi) os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=sysv ;; *-cbm) os=amigaos ;; *-dg) os=dgux ;; *-dolphin) os=sysv3 ;; m68k-ccur) os=rtu ;; m88k-omron*) os=luna ;; *-next) os=nextstep ;; *-sequent) os=ptx ;; *-crds) os=unos ;; *-ns) os=genix ;; i370-*) os=mvs ;; *-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 ;; *-wrs) os=vxworks ;; *) 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. case $vendor in unknown) case $os in riscix*) vendor=acorn ;; sunos*) vendor=sun ;; cnk*|-aix*) vendor=ibm ;; beos*) vendor=be ;; hpux*) vendor=hp ;; mpeix*) vendor=hp ;; hiux*) vendor=hitachi ;; unos*) vendor=crds ;; dgux*) vendor=dg ;; luna*) vendor=omron ;; genix*) vendor=ns ;; clix*) vendor=intergraph ;; mvs* | opened*) vendor=ibm ;; os400*) vendor=ibm ;; ptx*) vendor=sequent ;; tpf*) vendor=ibm ;; vxsim* | vxworks* | windiss*) vendor=wrs ;; aux*) vendor=apple ;; hms*) vendor=hitachi ;; mpw* | macos*) vendor=apple ;; *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) vendor=atari ;; vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dvisvgm-2.8.1/ltmain.sh0000644000175000017500000117106713512046311011753 00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 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. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.6 package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 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. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2014-01-07.03; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 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. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do eval $_G_hook '"$@"' # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift done func_quote_for_eval ${1+"$@"} func_run_hooks_result=$func_quote_for_eval_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, remove any # options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # func_quote_for_eval ${1+"$@"} # my_options_prep_result=$func_quote_for_eval_result # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # ;; # *) set dummy "$_G_opt" "$*"; shift; break ;; # esac # done # # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # func_quote_for_eval ${1+"$@"} # my_option_validation_result=$func_quote_for_eval_result # } # func_add_hook func_validate_options my_option_validation # # You'll alse need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd func_options_prep ${1+"$@"} eval func_parse_options \ ${func_options_prep_result+"$func_options_prep_result"} eval func_validate_options \ ${func_parse_options_result+"$func_parse_options_result"} eval func_run_hooks func_options \ ${func_validate_options_result+"$func_validate_options_result"} # save modified positional parameters for caller func_options_result=$func_run_hooks_result } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propogate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} # Adjust func_parse_options positional parameters to match eval set dummy "$func_run_hooks_result"; shift # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) test $# = 0 && func_missing_arg $_G_opt && break case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --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 --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message 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. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname (GNU libtool) 2.4.6 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; esac done # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # 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= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; 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." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && 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." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && 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." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [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: $progname [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 -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler 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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [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 -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) 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: $progname [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." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" 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 -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then 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" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; 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. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append 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 -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" 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 func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append 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 func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) 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*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; 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 "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # 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. sed_quote_subst='$sed_quote_subst' # 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+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' 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 file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ 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 "\ # 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 "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${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\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that 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 base_compile="$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= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append 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 # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir 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 func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" 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. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'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\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$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 $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; 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 $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append 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 dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append 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 func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; 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 "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' 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 prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; 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 yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; 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 prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # 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 "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" 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 func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 "*) ;; *) func_append 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 "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi 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 "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; 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 ;; esac ;; 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 with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append 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 func_append 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 relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_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 yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_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= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${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" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append 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 "*) ;; *) func_append 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"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append 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 yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } 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 func_append 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 func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; 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 "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "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}\" || $lt_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 func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "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}\" || $lt_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 func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; 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) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # 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' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false 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) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; 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 $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$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 func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: dvisvgm-2.8.1/src/0000775000175000017500000000000013563265647011014 500000000000000dvisvgm-2.8.1/src/TpicSpecialHandler.hpp0000664000175000017500000000506513510660062015127 00000000000000/************************************************************************* ** TpicSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TPICSPECIALHANDLER_HPP #define TPICSPECIALHANDLER_HPP #include #include "Pair.hpp" #include "SpecialHandler.hpp" class TpicSpecialHandler : public SpecialHandler { public: TpicSpecialHandler (); const char* info () const override {return "TPIC specials";} const char* name () const override {return "tpic";} std::vector prefixes() const override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; double penwidth () const {return _penwidth;} double grayLevel () const {return _grayLevel;} Color fillColor (bool grayOnly) const; protected: void dviEndPage (unsigned pageno, SpecialActions &actions) override; void reset (); void drawLines (double ddist, SpecialActions &actions); void drawSplines (double ddist, SpecialActions &actions); void drawArc (double cx, double cy, double rx, double ry, double angle1, double angle2, SpecialActions &actions); private: double _penwidth; ///< pen width in PS point units double _grayLevel; ///< [0,1]; 0=white, 1=black, if < 0, we don't fill anything std::vector _points; Color _dviColor; ///< current DVI color }; #endif dvisvgm-2.8.1/src/XXHashFunction.hpp0000664000175000017500000001071513536436612014312 00000000000000/************************************************************************* ** XXHashFunction.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef XXHASHFUNCTION_HPP #define XXHASHFUNCTION_HPP #include #include "HashFunction.hpp" #include "utility.hpp" #if (XXH_VERSION_NUMBER >= 701) && defined(XXH3_SECRET_SIZE_MIN) #define ENABLE_XXH128 #endif template struct XXHInterface { }; template<> struct XXHInterface<4> { using State = XXH32_state_t; static constexpr auto createState = &XXH32_createState; static constexpr auto freeState = &XXH32_freeState; static constexpr auto reset = &XXH32_reset; static constexpr auto update = &XXH32_update; static constexpr auto digest = &XXH32_digest; }; template<> struct XXHInterface<8> { using State = XXH64_state_t; static constexpr auto createState = &XXH64_createState; static constexpr auto freeState = &XXH64_freeState; static constexpr auto reset = &XXH64_reset; static constexpr auto update = &XXH64_update; static constexpr auto digest = &XXH64_digest; }; #ifdef ENABLE_XXH128 template<> struct XXHInterface<16> { using State = XXH3_state_t; static constexpr auto createState = &XXH3_createState; static constexpr auto freeState = &XXH3_freeState; static constexpr auto reset = &XXH3_128bits_reset_withSeed; static constexpr auto update = &XXH3_128bits_update; static constexpr auto digest = &XXH3_128bits_digest; }; #endif /** Implements the HashFunction class for the xxHash algorithms. */ template class XXHashFunction : public HashFunction { using Interface = XXHInterface; public: XXHashFunction () : _state(Interface::createState()) {Interface::reset(_state, 0);} XXHashFunction(const char *data, size_t length) : XXHashFunction() {update(data, length);} explicit XXHashFunction(const std::string &data) : XXHashFunction() {update(data);} explicit XXHashFunction(const std::vector &data) : XXHashFunction() {update(data);} ~XXHashFunction () override {Interface::freeState(_state);} int digestSize () const override {return HASH_BYTES;} void reset () override {Interface::reset(_state, 0);} void update (const char *data, size_t length) override {Interface::update(_state, data, length);} void update (const std::string &data) override {update(data.data(), data.length());} void update (const std::vector &data) override {update(reinterpret_cast(data.data()), data.size());} using HashFunction::update; // unhide update(istream &is) defined in base class std::vector digestValue () const override { return util::bytes(Interface::digest(_state), HASH_BYTES); } static unsigned version () {return XXH_versionNumber();} private: typename Interface::State *_state; }; using XXH32HashFunction = XXHashFunction<4>; using XXH64HashFunction = XXHashFunction<8>; #ifdef ENABLE_XXH128 using XXH128HashFunction = XXHashFunction<16>; template<> inline std::vector XXHashFunction<16>::digestValue () const { std::vector hash; auto digest = Interface::digest(_state); for (auto chunk : {digest.high64, digest.low64}) { auto bytes = util::bytes(chunk); hash.insert(hash.end(), bytes.begin(), bytes.end()); } return hash; } #endif #endif dvisvgm-2.8.1/src/Font.hpp0000664000175000017500000004166213510660062012342 00000000000000/************************************************************************* ** Font.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONT_HPP #define FONT_HPP #include #include #include #include #include "Character.hpp" #include "CharMapID.hpp" #include "Color.hpp" #include "FontCache.hpp" #include "FontEncoding.hpp" #include "FontMap.hpp" #include "FontMetrics.hpp" #include "GFGlyphTracer.hpp" #include "Glyph.hpp" #include "GraphicsPath.hpp" #include "MessageException.hpp" #include "RangeMap.hpp" #include "ToUnicodeMap.hpp" #include "VFActions.hpp" #include "VFReader.hpp" #include "utility.hpp" struct FontStyle; struct GlyphMetrics { GlyphMetrics () : wl(0), wr(0), h(0), d(0) {} GlyphMetrics (double wwl, double wwr, double hh, double dd) : wl(wwl), wr(wwr), h(hh), d(dd) {} double wl, wr, h, d; }; /** Abstract base for all font classes. */ class Font { public: virtual ~Font () =default; virtual std::unique_ptr clone (double ds, double sc) const =0; virtual const Font* uniqueFont () const =0; virtual std::string name () const =0; virtual double designSize () const =0; virtual double scaledSize () const =0; virtual double scaleFactor () const {return scaledSize()/designSize();} virtual double charWidth (int c) const =0; virtual double charDepth (int c) const =0; virtual double charHeight (int c) const =0; virtual double italicCorr (int c) const =0; virtual const FontMetrics* getMetrics () const =0; virtual const char* path () const =0; virtual const char* filename () const; virtual const FontEncoding* encoding () const; virtual bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *callback=nullptr) const =0; virtual void getGlyphMetrics (int c, bool vertical, GlyphMetrics &metrics) const; virtual uint32_t unicode (uint32_t c) const; virtual void tidy () const {} virtual bool findAndAssignBaseFontMap () {return true;} virtual bool verticalLayout () const {return getMetrics() ? getMetrics()->verticalLayout() : false;} virtual bool verifyChecksums () const {return true;} virtual int fontIndex () const {return 0;} virtual const FontStyle* style () const {return nullptr;} virtual Color color () const {return Color::BLACK;} virtual const FontMap::Entry* fontMapEntry () const; }; /** Empty font without any glyphs. Instances of this class are used * if no physical or virtual font file can be found. * The metric values returned by the member functions are based on cmr10. */ class EmptyFont : public Font { public: explicit EmptyFont (std::string name) : _fontname(std::move(name)) {} std::unique_ptr clone (double ds, double sc) const override {return util::make_unique(*this);} const Font* uniqueFont () const override {return this;} std::string name () const override {return _fontname;} double designSize () const override {return 10;} // cmr10 design size in pt double scaledSize () const override {return 10;} // cmr10 scaled size in pt double charWidth (int c) const override {return 9.164;} // width of cmr10's 'M' in pt double charHeight (int c) const override {return 6.833;} // height of cmr10's 'M' in pt double charDepth (int c) const override {return 0;} double italicCorr (int c) const override {return 0;} const FontMetrics* getMetrics () const override {return nullptr;} const char* path () const override {return nullptr;} bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb=nullptr) const override {return false;} private: std::string _fontname; }; /** Interface for all physical fonts. */ class PhysicalFont : public virtual Font { public: enum class Type {MF, OTF, PFB, TTC, TTF, UNKNOWN}; static std::unique_ptr create (const std::string &name, uint32_t checksum, double dsize, double ssize, PhysicalFont::Type type); static std::unique_ptr create (const std::string &name, int fontindex, uint32_t checksum, double dsize, double ssize); virtual Type type () const =0; bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb=nullptr) const override; virtual bool getExactGlyphBox (int c, BoundingBox &bbox, GFGlyphTracer::Callback *cb=nullptr) const; virtual bool getExactGlyphBox (int c, GlyphMetrics &metrics, bool vertical, GFGlyphTracer::Callback *cb=nullptr) const; virtual bool isCIDFont () const; virtual int hAdvance () const; virtual std::string familyName () const; virtual std::string styleName () const; virtual double hAdvance (int c) const; virtual double vAdvance (int c) const; std::string glyphName (int c) const; virtual int unitsPerEm () const; virtual double scaledAscent () const; virtual int ascent () const; virtual int descent () const; virtual int traceAllGlyphs (bool includeCached, GFGlyphTracer::Callback *cb=nullptr) const; virtual int collectCharMapIDs (std::vector &charmapIDs) const; virtual CharMapID getCharMapID () const =0; virtual void setCharMapID (const CharMapID &id) {} virtual Character decodeChar (uint32_t c) const; const char* path () const override; protected: bool createGF (std::string &gfname) const; public: static bool EXACT_BBOX; static bool KEEP_TEMP_FILES; static std::string CACHE_PATH; ///< path to cache directory ("" if caching is disabled) static double METAFONT_MAG; ///< magnification factor for Metafont calls protected: static FontCache _cache; }; /** Interface for all virtual fonts. */ class VirtualFont : public virtual Font { friend class FontManager; public: using DVIVector = std::vector; public: static std::unique_ptr create (const std::string &name, uint32_t checksum, double dsize, double ssize); virtual const DVIVector* getDVI (int c) const =0; bool getGlyph (int c, Glyph &glyph, GFGlyphTracer::Callback *cb=nullptr) const override {return false;} protected: virtual void assignChar (uint32_t c, DVIVector &&dvi) =0; }; class TFMFont : public virtual Font { public: TFMFont (std::string name, uint32_t cs, double ds, double ss); const FontMetrics* getMetrics () const override; std::string name () const override {return _fontname;} double designSize () const override {return _dsize;} double scaledSize () const override {return _ssize;} double charWidth (int c) const override; double charDepth (int c) const override; double charHeight (int c) const override; double italicCorr (int c) const override; bool verifyChecksums () const override; private: mutable std::unique_ptr _metrics; std::string _fontname; uint32_t _checksum; ///< cheksum to be compared with TFM checksum double _dsize; ///< design size in PS point units double _ssize; ///< scaled size in PS point units }; class PhysicalFontProxy : public PhysicalFont { friend class PhysicalFontImpl; public: std::unique_ptr clone (double ds, double sc) const override { return std::unique_ptr(new PhysicalFontProxy(*this, ds, sc)); } const Font* uniqueFont () const override {return _pf;} std::string name () const override {return _pf->name();} double designSize () const override {return _dsize;} double scaledSize () const override {return _ssize;} double charWidth (int c) const override {return _pf->charWidth(c);} double charDepth (int c) const override {return _pf->charDepth(c);} double charHeight (int c) const override {return _pf->charHeight(c);} double italicCorr (int c) const override {return _pf->italicCorr(c);} const FontMetrics* getMetrics () const override {return _pf->getMetrics();} Type type () const override {return _pf->type();} uint32_t unicode (uint32_t c) const override {return _pf->unicode(c);} int fontIndex () const override {return _pf->fontIndex();} const FontStyle* style () const override {return _pf->style();} const FontMap::Entry* fontMapEntry () const override {return _pf->fontMapEntry();} const FontEncoding* encoding () const override {return _pf->encoding();} CharMapID getCharMapID () const override {return _pf->getCharMapID();} int collectCharMapIDs (std::vector &charmapIDs) const override {return _pf->collectCharMapIDs(charmapIDs);} protected: PhysicalFontProxy (const PhysicalFont *font, double ds, double ss) : _pf(font), _dsize(ds), _ssize(ss) {} PhysicalFontProxy (const PhysicalFontProxy &proxy, double ds, double ss) : _pf(proxy._pf), _dsize(ds), _ssize(ss) {} private: const PhysicalFont *_pf; double _dsize; ///< design size in PS point units double _ssize; ///< scaled size in PS point units }; class PhysicalFontImpl : public PhysicalFont, public TFMFont { friend class PhysicalFont; public: ~PhysicalFontImpl () override; std::unique_ptr clone (double ds, double ss) const override { return std::unique_ptr(new PhysicalFontProxy(this, ds, ss)); } const Font* uniqueFont () const override {return this;} Type type () const override {return _filetype;} int fontIndex() const override {return _fontIndex;} const FontStyle* style () const override; const FontEncoding* encoding () const override; uint32_t unicode (uint32_t c) const override; bool findAndAssignBaseFontMap () override; void tidy () const override; CharMapID getCharMapID () const override {return _charmapID;} protected: PhysicalFontImpl (const std::string &name, int fontindex, uint32_t checksum, double dsize, double ssize, PhysicalFont::Type type); private: Type _filetype; int _fontIndex; FontEncodingPair _encodingPair; CharMapID _charmapID; ///< ID of the font's charmap to use std::unique_ptr _localCharMap; }; class NativeFont : public PhysicalFont { public: virtual std::unique_ptr clone (double ptsize, const FontStyle &style, Color color) const =0; std::unique_ptr clone (double ds, double sc) const override =0; std::string name () const override; Type type () const override; double designSize () const override {return _ptsize;} double scaledSize () const override {return _ptsize;} double charWidth (int c) const override; double charDepth (int c) const override; double charHeight (int c) const override; double italicCorr (int c) const override {return 0;} const FontMetrics* getMetrics () const override {return nullptr;} const FontStyle* style () const override {return &_style;} Color color () const override {return _color;} const FontMap::Entry* fontMapEntry () const override {return nullptr;} static std::string uniqueName (const std::string &path, const FontStyle &style); protected: NativeFont (double ptsize, const FontStyle &style, Color color) : _ptsize(ptsize), _style(style), _color(color) {} private: double _ptsize; ///< font size in PS point units FontStyle _style; Color _color; }; class NativeFontProxy : public NativeFont { friend class NativeFontImpl; public: std::unique_ptr clone (double ptsize, const FontStyle &style, Color color) const override { return std::unique_ptr(new NativeFontProxy(this, ptsize, style, color)); } std::unique_ptr clone (double ds, double sc) const override { return std::unique_ptr(new NativeFontProxy(this , sc, *style(), color())); } const Font* uniqueFont () const override {return _nfont;} const char* path () const override {return _nfont->path();} int fontIndex () const override {return _nfont->fontIndex();} Character decodeChar (uint32_t c) const override {return _nfont->decodeChar(c);} uint32_t unicode (uint32_t c) const override {return _nfont->unicode(c);} CharMapID getCharMapID () const override {return _nfont->getCharMapID();} protected: NativeFontProxy (const NativeFont *nfont, double ptsize, const FontStyle &style, Color color) : NativeFont(ptsize, style, color), _nfont(nfont) {} private: const NativeFont *_nfont; }; class NativeFontImpl : public NativeFont { public: NativeFontImpl (std::string fname, int fontIndex, double ptsize, const FontStyle &style, Color color) : NativeFont(ptsize, style, color), _path(std::move(fname)), _fontIndex(fontIndex) {} std::unique_ptr clone (double ptsize, const FontStyle &style, Color color) const override { return std::unique_ptr(new NativeFontProxy(this, ptsize, style, color)); } std::unique_ptr clone (double ds, double sc) const override { return std::unique_ptr(new NativeFontProxy(this , sc, *style(), color())); } const Font* uniqueFont () const override {return this;} const char* path () const override {return _path.c_str();} int fontIndex() const override {return _fontIndex;} std::string fontFamily () const; bool findAndAssignBaseFontMap () override; CharMapID getCharMapID () const override {return CharMapID::NONE;} Character decodeChar (uint32_t c) const override; uint32_t unicode (uint32_t c) const override; private: std::string _path; int _fontIndex; ToUnicodeMap _toUnicodeMap; ///< maps from char indexes to unicode points }; class VirtualFontProxy : public VirtualFont { friend class VirtualFontImpl; public: std::unique_ptr clone (double ds, double ss) const override { return std::unique_ptr(new VirtualFontProxy(*this, ds, ss)); } const Font* uniqueFont () const override {return _vf;} std::string name () const override {return _vf->name();} const DVIVector* getDVI (int c) const override {return _vf->getDVI(c);} double designSize () const override {return _dsize;} double scaledSize () const override {return _ssize;} double charWidth (int c) const override {return _vf->charWidth(c);} double charDepth (int c) const override {return _vf->charDepth(c);} double charHeight (int c) const override {return _vf->charHeight(c);} double italicCorr (int c) const override {return _vf->italicCorr(c);} const FontMetrics* getMetrics () const override {return _vf->getMetrics();} const char* path () const override {return _vf->path();} protected: VirtualFontProxy (const VirtualFont *font, double ds, double ss) : _vf(font), _dsize(ds), _ssize(ss) {} VirtualFontProxy (const VirtualFontProxy &proxy, double ds, double ss) : _vf(proxy._vf), _dsize(ds), _ssize(ss) {} void assignChar (uint32_t c, DVIVector &&dvi) override {} private: const VirtualFont *_vf; double _dsize; ///< design size in PS point units double _ssize; ///< scaled size in PS point units }; class VirtualFontImpl : public VirtualFont, public TFMFont { friend class VirtualFont; public: std::unique_ptr clone (double ds, double ss) const override { return std::unique_ptr(new VirtualFontProxy(this, ds, ss)); } const Font* uniqueFont () const override {return this;} const DVIVector* getDVI (int c) const override; const char* path () const override; protected: VirtualFontImpl (const std::string &name, uint32_t checksum, double dsize, double ssize); void assignChar (uint32_t c, DVIVector &&dvi) override; private: std::unordered_map _charDefs; ///< dvi subroutines defining the characters }; struct FontException : public MessageException { explicit FontException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/FontEncoding.hpp0000664000175000017500000000521613510660062014004 00000000000000/************************************************************************* ** FontEncoding.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTENCODING_HPP #define FONTENCODING_HPP #include #include "Character.hpp" struct CharMapID; class PhysicalFont; struct FontEncoding { virtual ~FontEncoding () =default; virtual Character decode (uint32_t c) const =0; virtual bool mapsToCharIndex () const =0; virtual const FontEncoding* findCompatibleBaseFontMap (const PhysicalFont *font, CharMapID &charmapID) const {return nullptr;} static FontEncoding* encoding (const std::string &encname); }; struct NamedFontEncoding : public FontEncoding { virtual const char* name () const =0; virtual const char* path () const =0; }; class FontEncodingPair : public FontEncoding { public: explicit FontEncodingPair (const FontEncoding *enc1) : _enc1(enc1), _enc2(nullptr) {} FontEncodingPair (const FontEncoding *enc1, const FontEncoding *enc2) : _enc1(enc1), _enc2(enc2) {} Character decode (uint32_t c) const override; bool mapsToCharIndex () const override; const FontEncoding* findCompatibleBaseFontMap (const PhysicalFont *font, CharMapID &charmapID) const override; const FontEncoding* enc1 () const {return _enc1;} const FontEncoding* enc2 () const {return _enc2;} void assign (const FontEncoding *enc); private: const FontEncoding *_enc1, *_enc2; }; #endif dvisvgm-2.8.1/src/PathClipper.cpp0000664000175000017500000003067113542104111013631 00000000000000/************************************************************************* ** PathClipper.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Bezier.hpp" #include "PathClipper.hpp" using namespace std; using namespace ClipperLib; using Polygon = ClipperLib::Path; using Polygons = ClipperLib::Paths; using CurvedPath = PathClipper::CurvedPath; const int SCALE_FACTOR = 1000; inline cInt to_cInt (double x) { return static_cast(lround(x*SCALE_FACTOR)); } inline double to_double (cInt x) { return static_cast(x)/SCALE_FACTOR; } inline DPair to_DPair (const IntPoint &p) { return DPair(to_double(p.X), to_double(p.Y)); } /** In order to flatten a curved path, all path segements are processed sequentially. * Depending on the type of the segment, one of the methods provided by this class * is called. */ class FlattenActions : public CurvedPath::IterationActions { public: FlattenActions (vector &curves, Polygons &polygons, int &numLines) : _polygons(polygons), _curves(curves), _numLines(numLines) {} void moveto (const CurvedPath::Point &p) override { if (p == _currentPoint && !_currentPoly.empty()) return; closepath(); _currentPoly.emplace_back(IntPoint(to_cInt(p.x()), to_cInt(p.y()), 0)); _currentPoint = _startPoint = p; } void lineto (const CurvedPath::Point &p) override { if (p == _currentPoint && !_currentPoly.empty()) return; if (_currentPoly.empty()) // this shouldn't happen but in case it does... _currentPoly.emplace_back(IntPoint(0, 0, 0)); // ...add a start point first _numLines--; _currentPoly.back().Z.label2 = _numLines; _currentPoly.emplace_back(IntPoint(to_cInt(p.x()), to_cInt(p.y()), ZType(_numLines, 0))); _currentPoint = p; } void quadto (const CurvedPath::Point &p1, const CurvedPath::Point &p2) override { Bezier bezier(_currentPoint, p1, p2); addCurvePoints(bezier); } void cubicto (const CurvedPath::Point &p1, const CurvedPath::Point &p2, const CurvedPath::Point &p3) override { Bezier bezier(_currentPoint, p1, p2, p3); addCurvePoints(bezier); } void closepath () override { if (_currentPoly.empty()) return; _numLines--; _currentPoly.back().Z.label2 = ZLabel(_numLines, 0); _currentPoly.front().Z.label1 = ZLabel(_numLines, 0); _polygons.push_back(_currentPoly); _currentPoly.clear(); } void finished () override { closepath(); } protected: void addCurvePoints (const Bezier &bezier) { if (_currentPoly.empty()) // this shouldn't happen but in case it does, ... _currentPoly.emplace_back(IntPoint(0, 0, 0)); // ...add a start point first vector points; // points of flattened curve vector t; // corresponding 'time' parameters bezier.approximate(0.01, points, &t); if (points.size() < 2) return; _curves.push_back(bezier); for (size_t i=1; i < points.size(); i++) { const DPair &p = points[i]; if (p == _currentPoint) continue; _currentPoly.back().Z.label2 = ZLabel(_curves.size(), t[i-1]); ZLabel label(_curves.size(), t[i]); _currentPoly.emplace_back(IntPoint(to_cInt(p.x()), to_cInt(p.y()), ZType(label, label))); _currentPoint = p; } } private: CurvedPath::Point _startPoint, _currentPoint; Polygon _currentPoly; ///< polygon being created Polygons &_polygons; ///< all polygons created vector &_curves; int &_numLines; }; /** Removes adjacent polygon vertices that equal their predecessor. */ static void remove_redundant_vertices (Polygon &polygon) { auto it1=polygon.begin(); while (it1 != polygon.end()) { auto it2 = it1+1; if (it2 == polygon.end()) it2 = polygon.begin(); if (it1 == it2) return; if (*it1 != *it2) ++it1; else { it1->Z.label2 = it2->Z.label2; polygon.erase(it2); } } } /** Approximates a curved path by a set of polygons and stores information * to reconstruct the curved segments later. The z component of each * polygon vertex holds two integers representing information about the two * adjacent edges the vertex belongs to. This is required to identify the * affected edges and thus the former (curve/line) segment of the path during * the intersection process. * @param[in] curvedPath curved path to be flattened * @param[out] polygons the flattened path (set of polygons) */ void PathClipper::flatten (const CurvedPath &curvedPath, Polygons &polygons) { FlattenActions flattenActions(_curves, polygons, _numLines); curvedPath.iterate(flattenActions, false); for (Polygon &poly : polygons) remove_redundant_vertices(poly); } /** Returns the ID of the path segment the polygon edge defined by its start * and end point belongs to. The z component of a polygon vertex holds a pair * of labels that allows to identify the original path segments the point belongs to. * Since always two adjacent segments share a point, each point gets two values assigned. * Negative numbers denote line segments, positive ones Bézier curves. * There are only these two segment types, so we don't need further flags in * order to distinguish them. By comparing the labels of two adjacent polygon * vertexes it's possible to identify the original path segment the corresponding * edge belongs to. * @param[in] p1 first of two adjacent vertices * @param[in] p2 second of two adjacent vertices * @param[out] t1 time parameter of p1 * @param[out] t2 time parameter of p2 * @return id of edge between p1 and p2, or 0 if it's not possible to identify the segment */ static int32_t segment_id (const IntPoint &p1, const IntPoint &p2, double &t1, double &t2) { const ZType &z1=p1.Z, &z2=p2.Z; if (z1 == z2 && z1.minLabel().id < 0) return z1.minLabel().id; if (z1.label1 == z2.label2) {t1=z1.label1.t; t2=z2.label2.t; return z1.label1.id;} if (z1.label2 == z2.label1) {t1=z1.label2.t; t2=z2.label1.t; return z1.label2.id;} if (z1.label1 == z2.label1) {t1=z1.label1.t; t2=z2.label1.t; return z1.label1.id;} if (z1.label2 == z2.label2) {t1=z1.label2.t; t2=z2.label2.t; return z1.label2.id;} // if we get here, it's not possible to identify the segment // => the edge is going to be handled as line segment return 0; } /** This function expects 3 colinear points p1, p2, and q, where q lies between p1 and p2, * i.e. q divides the line \f$ \overline{p_1 p_2} \f$ somewhere. The function returns * the corresponding division ratio. */ static double division_ratio (const IntPoint &p1, const IntPoint &p2, const IntPoint &q) { if (p1 == p2 || q == p1) return 0; if (q == p2) return 1; if (p1.X == p2.X) return double(q.Y-p1.Y)/(p2.Y-p1.Y); return double(q.X-p1.X)/(p2.X-p1.X); } /** Returns the label of point q that lies on the line between points p1 and p2. */ inline ZLabel division_label (const IntPoint &p1, const IntPoint &p2, const IntPoint &q) { double t1=0, t2=0; double s=0; int32_t id = segment_id(p1, p2, t1, t2); if (id > 0) s = t1+(t2-t1)*division_ratio(p1, p2, q); return ZLabel(id, s); } /** This method is called if the clipper library finds an intersection between two polygon edges. * It populates the z coordinate of the intersection point with the idexes of the two edges. * @param[in] e1bot first endpoint of edge 1 * @param[in] e1top second endpoint of edge 1 * @param[in] e2bot first endpoint of edge 2 * @param[in] e2top second endpoint of edge 2 * @param[in] ip intersection point of edge 1 and 2 */ void PathClipper::callback (IntPoint &e1bot, IntPoint &e1top, IntPoint &e2bot, IntPoint &e2top, IntPoint &ip) { ZLabel label1 = division_label(e1bot, e1top, ip); ZLabel label2 = division_label(e2bot, e2top, ip); ip.Z = ZType(label1, label2); } /** Iterates along the polygon edges until the endpoint of the current * path segment is found and returns its vector index afterwards. * @param[in] polygon the polygon to be processed * @param[in] start index of the vertex where the iteration starts * @param[out] label if not 0, retrieves the label of the endpoint * @param[in] startLabel if true, the found endpoint is treated as start point and * parameter 'label' gets the corresponding value */ static size_t find_segment_endpoint (const Polygon &polygon, size_t start, ZLabel *label=nullptr, bool startLabel=false) { if (polygon.empty()) return 0; const size_t num_points = polygon.size(); int i = start%num_points; double t1=0, t2=0; // time parameters of start and endpoint of current edge int32_t id1 = segment_id(polygon[i], polygon[(i+1)%num_points], t1, t2); int32_t id2 = id1; double t = t2; // time parameter of resulting endpoint for (size_t j=1; id1 == id2 && j < num_points; j++) { t = t2; i = (i+1)%num_points; if (id1 == 0) break; id2 = segment_id(polygon[i], polygon[(i+1)%num_points], t1, t2); } if (label) { *label = ZLabel(id1, id1 < 0 ? 0 : t); if (startLabel && id1 != 0) *label = polygon[i].Z.otherLabel(*label); } return i; } /** Reconstructs a curved path from the set of polygons. * @param[in] polygons set of polygons to reconstruct * @param[out] path the reconstructed curved path */ void PathClipper::reconstruct (const Polygons &polygons, CurvedPath &path) { for (const Polygon &polygon : polygons) reconstruct(polygon, path); } /** Reconstructs a curved path from a single polygon. * @param[in] polygon polygon to reconstruct * @param[out] path the reconstructed curved path */ void PathClipper::reconstruct (const Polygon &polygon, CurvedPath &path) { size_t num_points = polygon.size(); if (num_points < 2) return; ZLabel label1, label2; // labels of the current segment's start and endpoint int index1 = find_segment_endpoint(polygon, 0, &label1, true); int index2 = find_segment_endpoint(polygon, index1, &label2); int diff = (num_points+index2-index1)%num_points; path.moveto(to_DPair(polygon[index1])); for (size_t count = diff; count <= num_points; count += diff) { if (diff == 1 || label1.id <= 0) // line segment? path.lineto(to_DPair(polygon[index2])); else { // Bézier curve segment Bezier bezier(_curves[label1.id-1], label1.t, label2.t); if (label1.t > label2.t) bezier.reverse(); path.cubicto(bezier.point(1), bezier.point(2), bezier.point(3)); } if (label1.id == 0) find_segment_endpoint(polygon, index2, &label1, true); else label1 = polygon[index2].Z.otherLabel(label2); index1 = index2; index2 = find_segment_endpoint(polygon, index1, &label2); diff = (num_points+index2-index1)%num_points; } path.closepath(); } inline PolyFillType polyFillType (CurvedPath::WindingRule wr) { return (wr == CurvedPath::WindingRule::NON_ZERO) ? pftNonZero : pftEvenOdd; } /** Computes the intersection of to curved paths. * @param[in] p1 first curved path * @param[in] p2 second curved path * @param[out] result intersection of p1 and p2 */ void PathClipper::intersect (const CurvedPath &p1, const CurvedPath &p2, CurvedPath &result) { if (p1.size() < 2 || p2.size() < 2) return; Clipper clipper; Polygons polygons; flatten(p1, polygons); clipper.AddPaths(polygons, ptSubject, true); polygons.clear(); flatten(p2, polygons); clipper.AddPaths(polygons, ptClip, true); clipper.ZFillFunction(callback); Polygons flattenedPath; clipper.Execute(ctIntersection, flattenedPath, polyFillType(p1.windingRule()), polyFillType(p2.windingRule())); reconstruct(flattenedPath, result); } dvisvgm-2.8.1/src/NoPsSpecialHandler.hpp0000664000175000017500000000376613510660062015115 00000000000000/************************************************************************* ** NoPsSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef NOPSSPECIALHANDLER_HPP #define NOPSSPECIALHANDLER_HPP #include "SpecialHandler.hpp" class NoPsSpecialHandler : public SpecialHandler { public: NoPsSpecialHandler () : _count(0) {} bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; const char* name () const override {return nullptr;} const char* info () const override {return nullptr;} std::vector prefixes() const override; protected: void dviEndPage (unsigned pageno, SpecialActions &actions) override; private: unsigned _count; // number of PS specials skipped }; #endif dvisvgm-2.8.1/src/NoPsSpecialHandler.cpp0000664000175000017500000000401613510660062015075 00000000000000/************************************************************************* ** NoPsSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "Message.hpp" #include "NoPsSpecialHandler.hpp" using namespace std; bool NoPsSpecialHandler::process (const string&, istream&, SpecialActions&) { _count++; return true; } void NoPsSpecialHandler::dviEndPage (unsigned pageno, SpecialActions &actions) { if (_count > 0) { string suffix = (_count > 1 ? "s" : ""); Message::wstream(true) << _count << " PostScript special" << suffix << " ignored. The resulting SVG might look wrong.\n"; _count = 0; } } vector NoPsSpecialHandler::prefixes() const { vector pfx {"header=", "psfile=", "PSfile=", "ps:", "ps::", "!", "\""}; return pfx; } dvisvgm-2.8.1/src/PSPreviewFilter.cpp0000664000175000017500000001102413510660062014446 00000000000000/************************************************************************* ** PSPreviewFilter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "InputBuffer.hpp" #include "InputReader.hpp" #include "PSInterpreter.hpp" #include "PSPreviewFilter.hpp" #include "SpecialActions.hpp" using namespace std; PSPreviewFilter::PSPreviewFilter (PSInterpreter &psi) : PSFilter(psi), _active(false), _tightpage(false), _dvi2bp(1.0/65536.0) { } /** Activates this filter so that the PS code will be redirected through it if * it's hooked into the PSInterpreter. */ void PSPreviewFilter::activate () { if (_tightpage) // reactivate filter? _active = true; else { // first activation? _tightpage = _active = false; // try to retrieve version string of preview package set in the PS header section if (psInterpreter().executeRaw("SDict begin currentdict/preview@version known{preview@version}{0}ifelse end", 1)) _version = psInterpreter().rawData()[0]; // check if tightpage option was set if (_version != "0" && psInterpreter().executeRaw("SDict begin preview@tightpage end", 1)) { _tightpage = (psInterpreter().rawData()[0] == "true"); _active = true; } } _boxExtents.clear(); } /** Tries to extract the bounding box information from a chunk of PostScript code. * @param[in] code pointer to buffer with PS code to filter * @param[in] len number of bytes in buffer */ void PSPreviewFilter::execute (const char *code, size_t len) { // If the "tightpage" option was set in the TeX file, 7 integers representing the // extent of the bounding box are present at the begin of each page. if (!_tightpage) psInterpreter().execute(code, len); else { // Read bounding box information pushed on the operand stack by the preview package. // It consists of 7 values in DVI units: // adj_left, adj_bottom, adj_right, adj_top, height, depth, width, // where the first 4 values are set by \PreviewBorder or \PreviewBbAdjust. They denote // the border adjustments to create additional space around the graphics. // The baseline of the tight box extends from (0,0) to (tight_width, 0). CharInputBuffer ib(code, len); BufferInputReader ir(ib); ir.skipSpace(); int val; while (ir.parseInt(val) && _boxExtents.size() <= 7) { _boxExtents.push_back(val); ir.skipSpace(); } } _active = false; // no further processing required } /** Returns the bounding box defined by the preview package. */ bool PSPreviewFilter::getBoundingBox (BoundingBox &bbox) const { if (_boxExtents.size() < 7) return false; const double leftX = _boxExtents[0]*_dvi2bp; bbox = BoundingBox(leftX, -height(), width()+leftX, depth()); return true; } /** Returns the box height in PS points, or -1 if no data was found or read yet. */ double PSPreviewFilter::height () const { return _boxExtents.size() > 4 ? (_boxExtents[4]+_boxExtents[3])*_dvi2bp : -1; } /** Returns the box depth in PS points, or -1 if no data was found or read yet. */ double PSPreviewFilter::depth () const { return _boxExtents.size() > 5 ? (_boxExtents[5]-_boxExtents[1])*_dvi2bp : -1; } /** Returns the box width in PS points, or -1 if no data was found or read yet. */ double PSPreviewFilter::width () const { return _boxExtents.size() > 6 ? (_boxExtents[6]+_boxExtents[2]-_boxExtents[0])*_dvi2bp : -1; } dvisvgm-2.8.1/src/PageRanges.cpp0000664000175000017500000000544013510660062013435 00000000000000/************************************************************************* ** PageRanges.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "InputBuffer.hpp" #include "InputReader.hpp" #include "PageRanges.hpp" using namespace std; /** Analyzes a string describing a range sequence. * Syntax: ([0-9]+(-[0-9]*)?)|(-[0-9]+)(,([0-9]+(-[0-9]*)?)|(-[0-9]+))* * @param[in] str string to parse * @param[in] max_page greatest allowed value * @return true on success; false denotes a syntax error */ bool PageRanges::parse (const string &str, int max_page) { StringInputBuffer ib(str); BufferInputReader ir(ib); while (ir) { int first=1; int last=max_page; ir.skipSpace(); if (!isdigit(ir.peek()) && ir.peek() != '-') return false; if (isdigit(ir.peek())) first = ir.getInt(); ir.skipSpace(); if (ir.peek() == '-') { while (ir.peek() == '-') ir.get(); ir.skipSpace(); if (isdigit(ir.peek())) last = ir.getInt(); } else last = first; ir.skipSpace(); if (ir.peek() == ',') { ir.get(); if (ir.eof()) return false; } else if (!ir.eof()) return false; if (first > last) swap(first, last); first = max(1, first); last = max(first, last); if (max_page > 0) { first = min(first, max_page); last = min(last, max_page); } addRange(first, last); } return true; } /** Returns the number of pages. */ size_t PageRanges::numberOfPages () const { size_t sum=0; for (const auto &entry : *this) sum += entry.second - entry.first + 1; return sum; } dvisvgm-2.8.1/src/TrueTypeFont.hpp0000664000175000017500000000631313510660062014036 00000000000000/************************************************************************* ** TrueTypeFont.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TRUETYPEFONT_HPP #define TRUETYPEFONT_HPP #include #include #include #include #include #include "MessageException.hpp" class TrueTypeFont { struct TTFTableRecord { std::string name () const; uint32_t paddedSize () const {return (size+3) & ~3;} uint32_t computeChecksum () const; uint32_t tag; ///< table tag uint32_t checksum; ///< checksum of the table data uint32_t size; ///< number of bytes in the table const uint8_t *data; ///< points to the begin of the table }; struct WOFFTableRecord { WOFFTableRecord (uint32_t off, const TTFTableRecord &rec) : offset(off), size(rec.size), data(rec.data), ttfRecord(rec) {} size_t paddedSize () const {return (size+3) & ~3;} bool compressTableData (); uint32_t offset; ///< file offset to first byte of the table uint32_t size; ///< number of bytes in the table const uint8_t *data; ///< points to the begin of the WOFF table std::vector compressedData; ///< compressed table data const TTFTableRecord &ttfRecord; ///< corresponding TTF table record }; public: TrueTypeFont () : _version(0) {} explicit TrueTypeFont (const std::string &fname) {read(fname);} bool read (const std::string &fname); void writeWOFF (std::ostream &os) const; void writeWOFF (const std::string &fname) const; bool writeWOFF2 (std::ostream &os) const; bool writeWOFF2 (const std::string &fname) const; private: uint32_t _version; ///< TTF version std::string _buffer; ///< contents of TTF file std::vector _tableRecords; }; struct TrueTypeFontException : public MessageException { explicit TrueTypeFontException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/XMLNode.hpp0000664000175000017500000002325613562236411012705 00000000000000/************************************************************************* ** XMLNode.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef XMLNODE_HPP #define XMLNODE_HPP #include #include #include #include #include #include #include "utility.hpp" class XMLCData; class XMLComment; class XMLElement; class XMLText; class XMLNode { friend class XMLElement; template T* cast (const T* (XMLNode::*func)() const) { return const_cast((const_cast(this)->*func)()); } public: XMLNode () =default; XMLNode (const XMLNode &node) : _next(nullptr) {} XMLNode (XMLNode &&node) noexcept : _parent(node._parent), _prev(node._prev), _next(std::move(node._next)) {} virtual ~XMLNode () =default; virtual std::unique_ptr clone () const =0; virtual void clear () =0; virtual std::ostream& write (std::ostream &os) const =0; virtual const XMLElement* toElement () const {return nullptr;} virtual const XMLText* toText () const {return nullptr;} virtual const XMLText* toWSNode () const {return nullptr;} virtual const XMLComment* toComment () const {return nullptr;} virtual const XMLCData* toCData () const {return nullptr;} XMLElement* toElement () {return cast(&XMLNode::toElement);} XMLText* toText () {return cast(&XMLNode::toText);} XMLComment* toComment () {return cast(&XMLNode::toComment);} XMLCData* toCData () {return cast(&XMLNode::toCData);} XMLNode* parent () const {return _parent;} XMLNode* prev () const {return _prev;} XMLNode* next () const {return _next.get();} protected: XMLNode* insertNext (std::unique_ptr node); std::unique_ptr removeNext (); void parent (XMLNode *p) {_parent = p;} void prev (XMLNode *p) {_prev = p;} private: XMLNode *_parent=nullptr; ///< pointer to parent node XMLNode *_prev=nullptr; ///< pointer to preceding sibling std::unique_ptr _next; ///< pointer to next sibling (incl. ownership) }; class XMLNodeIterator { public: XMLNodeIterator () =default; explicit XMLNodeIterator (XMLNode *curr) : _curr(curr) {} XMLNodeIterator& operator ++ () {_curr = _curr->next(); return *this;} XMLNodeIterator& operator -- () {_curr = _curr->prev(); return *this;} XMLNodeIterator operator ++ (int) {auto p=_curr; _curr = _curr->next(); return XMLNodeIterator(p);} XMLNodeIterator operator -- (int) {auto p=_curr; _curr = _curr->prev(); return XMLNodeIterator(p);} XMLNode* operator * () {return _curr;} XMLNode& operator -> () {return *_curr;} bool operator == (const XMLNodeIterator &it) const {return _curr == it._curr;} bool operator != (const XMLNodeIterator &it) const {return _curr != it._curr;} private: XMLNode *_curr=nullptr; }; class ConstXMLNodeIterator { public: ConstXMLNodeIterator () =default; explicit ConstXMLNodeIterator (const XMLNode *curr) : _curr(curr) {} ConstXMLNodeIterator& operator ++ () {_curr = _curr->next(); return *this;} ConstXMLNodeIterator& operator -- () {_curr = _curr->prev(); return *this;} ConstXMLNodeIterator operator ++ (int) {auto p=_curr; _curr = _curr->next(); return ConstXMLNodeIterator(p);} ConstXMLNodeIterator operator -- (int) {auto p=_curr; _curr = _curr->prev(); return ConstXMLNodeIterator(p);} const XMLNode* operator * () {return _curr;} const XMLNode& operator -> () {return *_curr;} bool operator == (const ConstXMLNodeIterator &it) const {return _curr == it._curr;} bool operator != (const ConstXMLNodeIterator &it) const {return _curr != it._curr;} private: const XMLNode *_curr=nullptr; }; class XMLElement : public XMLNode { public: struct Attribute { Attribute (std::string nam, std::string val) : name(std::move(nam)), value(std::move(val)) {} std::string name; std::string value; }; using Attributes = std::vector; static bool WRITE_NEWLINES; ///< insert line breaks after element tags? public: explicit XMLElement (std::string name); XMLElement (const XMLElement &node); XMLElement (XMLElement &&node) noexcept; std::unique_ptr clone () const override {return util::make_unique(*this);} void clear () override; void addAttribute (const std::string &name, const std::string &value); void addAttribute (const std::string &name, double value); void removeAttribute (const std::string &name); XMLNode* append (std::unique_ptr child); XMLNode* append (const std::string &str); XMLNode* prepend (std::unique_ptr child); XMLNode* insertAfter (std::unique_ptr child, XMLNode *sibling); XMLNode* insertBefore (std::unique_ptr child, XMLNode *sibling); bool hasAttribute (const std::string &name) const; const char* getAttributeValue (const std::string &name) const; bool getDescendants (const char *name, const char *attrName, std::vector &descendants) const; XMLElement* getFirstDescendant (const char *name, const char *attrName, const char *attrValue) const; XMLNode* firstChild () const {return _firstChild.get();} XMLNode* lastChild () const {return _lastChild;} std::ostream& write (std::ostream &os) const override; bool empty () const {return !_firstChild;} Attributes& attributes () {return _attributes;} const Attributes& attributes () const {return _attributes;} XMLNodeIterator begin () {return XMLNodeIterator(_firstChild.get());} XMLNodeIterator end () {return XMLNodeIterator(nullptr);} ConstXMLNodeIterator begin () const {return ConstXMLNodeIterator(_firstChild.get());} ConstXMLNodeIterator end () const {return ConstXMLNodeIterator(nullptr);} const std::string& name () const {return _name;} const XMLElement* toElement () const override {return this;} const Attribute* getAttribute (const std::string &name) const; static std::unique_ptr remove (XMLNode *child); static XMLElement* wrap (XMLNode *first, XMLNode *last, const std::string &name); static XMLNode* unwrap (XMLElement *child); protected: Attribute* getAttribute (const std::string &name); XMLNode* insertFirst (std::unique_ptr child); XMLNode* insertLast (std::unique_ptr child); private: std::string _name; // element name (...) std::vector _attributes; std::unique_ptr _firstChild; ///< pointer to first child node (incl. ownership) XMLNode *_lastChild=nullptr; ///< pointer to last child node }; class XMLText : public XMLNode { public: explicit XMLText (std::string str) : _text(std::move(str)) {} std::unique_ptr clone () const override {return util::make_unique(*this);} void clear () override {_text.clear();} void append (std::unique_ptr node); void append (std::unique_ptr node); void append (const std::string &str); void prepend (std::unique_ptr node); std::ostream& write (std::ostream &os) const override {return os << _text;} const std::string& getText () const {return _text;} const XMLText* toText () const override {return this;} const XMLText* toWSNode () const override; private: std::string _text; }; class XMLComment : public XMLNode { public: explicit XMLComment (std::string str) : _text(std::move(str)) {} std::unique_ptr clone () const override {return util::make_unique(*this);} void clear () override {_text.clear();} std::ostream& write (std::ostream &os) const override {return os << "";} const XMLComment* toComment () const override {return this;} private: std::string _text; }; class XMLCData : public XMLNode { public: XMLCData () =default; explicit XMLCData (std::string data) : _data(std::move(data)) {} std::unique_ptr clone () const override {return util::make_unique(*this);} void clear () override {_data.clear();} void append (std::string &&str); std::ostream& write (std::ostream &os) const override; const XMLCData* toCData () const override {return this;} private: std::string _data; }; inline std::ostream& operator << (std::ostream &os, const XMLElement &node) {return node.write(os);} inline std::ostream& operator << (std::ostream &os, const XMLText &node) {return node.write(os);} inline std::ostream& operator << (std::ostream &os, const XMLComment &node) {return node.write(os);} inline std::ostream& operator << (std::ostream &os, const XMLCData &node) {return node.write(os);} #endif dvisvgm-2.8.1/src/ToUnicodeMap.cpp0000664000175000017500000001123113510660062013743 00000000000000/************************************************************************* ** ToUnicodeMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "ToUnicodeMap.hpp" #include "Unicode.hpp" using namespace std; /** Adds valid but random mappings for all missing character indexes. * If a font's cmap table doesn't provide Unicode mappings for some * glyphs in the font, it's necessary to fill the gaps in order to * handle all characters correctly. This functions assumes that the * characters are numbered from 1 to maxIndex. * @param[in] maxIndex largest character index to consider * @return true on success */ bool ToUnicodeMap::addMissingMappings (uint32_t maxIndex) { bool success=true; // collect Unicode points already in assigned NumericRanges codepoints; for (size_t i=0; i < numRanges() && success; i++) codepoints.addRange(rangeAt(i).minval(), rangeAt(i).maxval()); // fill unmapped ranges if (empty()) // no Unicode mapping present at all? success = fillRange(1, maxIndex, 1, codepoints, true); else { // (partial) Unicode mapping present? success = fillRange(1, rangeAt(0).min()-1, rangeAt(0).minval()-1, codepoints, false); for (size_t i=0; i < numRanges()-1 && success; i++) success = fillRange(rangeAt(i).max()+1, rangeAt(i+1).min()-1, rangeAt(i).maxval()+1, codepoints, true); if (success) success = fillRange(rangeAt(numRanges()-1).max()+1, maxIndex, rangeAt(numRanges()-1).maxval()+1, codepoints, true); } return success; } /** Checks if a given codepoint is valid and unused. Otherwise, try to find an alternative. * @param[in,out] ucp codepoint to fix * @param[in] used_codepoints codepoints already in use * @param[in] ascending if true, increase ucp to look for valid/unused codepoints * @return true on success */ static bool fix_codepoint (uint32_t &ucp, const NumericRanges &used_codepoints, bool ascending) { uint32_t start = ucp; while (!Unicode::isValidCodepoint(ucp) && used_codepoints.valueExists(ucp)) { if (ascending) ucp = (ucp == numeric_limits::max()) ? 0 : ucp+1; else ucp = (ucp == 0) ? numeric_limits::max() : ucp-1; if (ucp == start) // no free Unicode point found return false; } return true; } static bool is_less_or_equal (uint32_t a, uint32_t b) {return a <= b;} static bool is_greater_or_equal (uint32_t a, uint32_t b) {return a >= b;} /** Adds index to Unicode mappings for a given range of character indexes. * @param[in] minIndex lower bound of range to fill * @param[in] maxIndex upper bound of range to fill * @param[in] ucp first Unicode point to add (if possible) * @param[in,out] used_ucps Unicode points already in use * @param[in] ascending if true, fill range from lower to upper bound * @return true on success */ bool ToUnicodeMap::fillRange (uint32_t minIndex, uint32_t maxIndex, uint32_t ucp, NumericRanges &used_ucps, bool ascending) { if (minIndex <= maxIndex) { uint32_t first=minIndex, last=maxIndex; int inc=1; bool (*cmp)(uint32_t, uint32_t) = is_less_or_equal; if (!ascending) { swap(first, last); inc = -1; cmp = is_greater_or_equal; } for (uint32_t i=first; cmp(i, last); i += inc) { if (!fix_codepoint(ucp, used_ucps, ascending)) return false; else { addRange(i, i, ucp); used_ucps.addRange(ucp); ucp += inc; // preferred Unicode point for the next character of the current range } } } return true; }dvisvgm-2.8.1/src/Directory.cpp0000664000175000017500000000714113510660062013365 00000000000000/************************************************************************* ** Directory.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "Directory.hpp" using namespace std; #ifdef _WIN32 #include "windows.hpp" #else #include #include #endif Directory::Directory () { #if _WIN32 _handle = INVALID_HANDLE_VALUE; _firstread = true; memset(&_fileData, 0, sizeof(WIN32_FIND_DATA)); #else _dir = nullptr; _dirent = nullptr; #endif } Directory::Directory (const string &dirname) { #if _WIN32 _handle = INVALID_HANDLE_VALUE; _firstread = true; memset(&_fileData, 0, sizeof(WIN32_FIND_DATA)); #else _dir = nullptr; _dirent = nullptr; #endif open(dirname); } Directory::~Directory () { close(); } bool Directory::open (string dirname) { _dirname = dirname; #ifdef _WIN32 _firstread = true; if (dirname[dirname.length()-1] == '/' || dirname[dirname.length()-1] == '\\') dirname = dirname.substr(0, dirname.length()-1); dirname += "\\*"; _handle = FindFirstFile(dirname.c_str(), &_fileData); return _handle != INVALID_HANDLE_VALUE; #else _dir = opendir(_dirname.c_str()); return bool(_dir); #endif } void Directory::close () { #ifdef _WIN32 FindClose(_handle); #else if (_dir) { closedir(_dir); _dir = nullptr; } #endif } /** Reads first/next directory entry. * @param[in] type type of entry to return (a: file or dir, f: file, d: dir) * @return name of entry */ const char* Directory::read (EntryType type) { #ifdef _WIN32 if (_handle == INVALID_HANDLE_VALUE) return nullptr; while (_firstread || FindNextFile(_handle, &_fileData)) { _firstread = false; if (_fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (type == ET_FILE_OR_DIR || type == ET_DIR) return _fileData.cFileName; } else if (type == ET_FILE_OR_DIR || type == ET_FILE) return _fileData.cFileName; } FindClose(_handle); _handle = INVALID_HANDLE_VALUE; return nullptr; #else if (_dir) { while ((_dirent = readdir(_dir))) { string path = _dirname + "/" + _dirent->d_name; struct stat stats; if (stat(path.c_str(), &stats) == 0) { if (S_ISDIR(stats.st_mode)) { if (type == ET_FILE_OR_DIR || type == ET_DIR) return _dirent->d_name; } else if (type == ET_FILE_OR_DIR || type == ET_FILE) return _dirent->d_name; } } closedir(_dir); _dir = nullptr; } return nullptr; #endif } dvisvgm-2.8.1/src/DVIReader.cpp0000664000175000017500000006130213511327144013167 00000000000000/************************************************************************* ** DVIReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "Color.hpp" #include "DVIActions.hpp" #include "DVIReader.hpp" #include "Font.hpp" #include "FontManager.hpp" #include "HashFunction.hpp" #include "VectorStream.hpp" using namespace std; DVIReader::DVIReader (istream &is) : BasicDVIReader(is) { _inPage = false; _dvi2bp = 0.0; _inPostamble = false; _currFontNum = 0; _currPageNum = 0; _mag = 1; executePreamble(); collectBopOffsets(); executePostamble(); } int DVIReader::executeCommand () { int opcode = BasicDVIReader::executeCommand(); return opcode; } /** Executes all DVI commands read from the input stream. */ void DVIReader::executeAll () { int opcode = 0; while (!eof() && opcode >= 0) { try { opcode = executeCommand(); } catch (const InvalidDVIFileException &e) { // end of stream reached opcode = -1; } } } /** Reads and executes the commands of a single page. * This methods stops reading after the page's eop command has been executed. * @param[in] n number of page to be executed (1-based) * @returns true if page was read successfully */ bool DVIReader::executePage (unsigned n) { clearStream(); // reset all status bits if (!isStreamValid()) throw DVIException("invalid DVI file"); if (n < 1 || n > numberOfPages()) return false; seek(_bopOffsets[n-1]); // goto bop of n-th page _inPostamble = false; // not in postamble _currPageNum = n; while (executeCommand() != OP_EOP); return true; } void DVIReader::executePreamble () { clearStream(); if (isStreamValid()) { seek(0); if (readByte() == OP_PRE) { cmdPre(0); return; } } throw DVIException("invalid DVI file"); } /** Moves stream pointer to begin of postamble */ void DVIReader::goToPostamble () { clearStream(); if (!isStreamValid()) throw DVIException("invalid DVI file"); seek(-1, ios::end); // stream pointer to last byte int count=0; while (peek() == DVI_FILL) { // skip fill bytes seek(-1, ios::cur); count++; } if (count < 4) // the standard requires at least 4 trailing fill bytes throw DVIException("missing fill bytes at end of file"); seek(-4, ios::cur); // now at first byte of q (pointer to begin of postamble) uint32_t q = readUnsigned(4); // pointer to begin of postamble seek(q); // now at begin of postamble } /** Reads and executes the commands of the postamble. */ void DVIReader::executePostamble () { goToPostamble(); while (executeCommand() != OP_POSTPOST); // executes all commands until post_post (= 249) is reached } /** Collects and records the file offsets of all bop commands. */ void DVIReader::collectBopOffsets () { goToPostamble(); _bopOffsets.push_back(tell()); // also add offset of postamble readByte(); // skip post command uint32_t offset = readUnsigned(4); // offset of final bop while (int32_t(offset) != -1) { // not yet on first bop? _bopOffsets.push_back(offset); // record offset seek(offset); // now on previous bop if (readByte() != OP_BOP) throw DVIException("bop offset at "+to_string(offset)+" doesn't point to bop command" ); seek(40, ios::cur); // skip the 10 \count values => now on offset of previous bop uint32_t prevOffset = readUnsigned(4); if ((prevOffset >= offset && int32_t(prevOffset) != -1)) throw DVIException("invalid bop offset at "+to_string(tell()-static_cast(4))); offset = prevOffset; } reverse(_bopOffsets.begin(), _bopOffsets.end()); } /** Computes a hash value for a given page. The hash algorithm is selected by * a HashFunction object which will also contain the resulting hash value if * this function returns true. * @param[in] pageno number of page to process (1-based) * @param[in,out] hashFunc hash function to use * @return true on success, hashFunc contains the resulting hash value */ bool DVIReader::computePageHash (size_t pageno, HashFunction &hashFunc) { if (pageno == 0 || pageno > numberOfPages()) return false; hashFunc.reset(); clearStream(); seek(_bopOffsets[pageno-1]+45); // now on first command after bop of selected page const size_t BUFSIZE = 4096; char buf[BUFSIZE]; size_t numBytes = numberOfPageBytes(pageno-1)-46; // number of bytes excluding bop and eop while (numBytes > 0) { getInputStream().read(buf, min(numBytes, BUFSIZE)); hashFunc.update(buf, getInputStream().gcount()); numBytes -= getInputStream().gcount(); } return true; } ///////////////////////////////////// /** Reads and executes DVI preamble command. * Format: pre ver[1] num[4] den[4] mag[4] cmtlen[1] cmt[cmtlen] */ void DVIReader::cmdPre (int) { uint8_t id = readUnsigned(1); setDVIVersion(DVIVersion(id)); // identification number uint32_t numer = readUnsigned(4); // numerator units of measurement uint32_t denom = readUnsigned(4); // denominator units of measurement if (denom == 0) throw DVIException("denominator of measurement unit is zero"); _mag = readUnsigned(4); // magnification uint32_t k = readUnsigned(1); // length of following comment string comment = readString(k); // 1 dviunit * num/den == multiples of 0.0000001m // 1 dviunit * _dvibp: length of 1 dviunit in PS points * _mag/1000 _dvi2bp = numer/254000.0*72.0/denom*_mag/1000.0; dviPre(id, numer, denom, _mag, comment); } /** Reads and executes DVI postamble command. * Format: post p[4] num[4] den[4] mag[4] ph[4] pw[4] sd[2] np[2] */ void DVIReader::cmdPost (int) { uint32_t prevBopOffset = readUnsigned(4); uint32_t numer = readUnsigned(4); uint32_t denom = readUnsigned(4); if (denom == 0) throw DVIException("denominator of measurement unit is zero"); _mag = readUnsigned(4); uint32_t pageHeight = readUnsigned(4); // height of tallest page in dvi units uint32_t pageWidth = readUnsigned(4); // width of widest page in dvi units uint16_t stackDepth = readUnsigned(2); // max. stack depth required uint16_t numPages = readUnsigned(2); if (numPages != (numberOfPages() & 0xffff)) throw DVIException("page count in postamble doesn't match actual number of pages"); // 1 dviunit * num/den == multiples of 0.0000001m // 1 dviunit * _dvi2bp: length of 1 dviunit in PS points * _mag/1000 _dvi2bp = numer/254000.0*72.0/denom*_mag/1000.0; _inPostamble = true; dviPost(stackDepth, numPages, pageWidth*_dvi2bp, pageHeight*_dvi2bp, _mag, numer, denom, prevBopOffset); } /** Reads and executes DVI post_post command. * Format: post_post q[4] i[1] 223[>=4] */ void DVIReader::cmdPostPost (int) { _inPostamble = false; uint32_t postOffset = readUnsigned(4); // pointer to begin of postamble uint8_t id = readUnsigned(1); setDVIVersion(DVIVersion(id)); // identification byte while (readUnsigned(1) == DVI_FILL); // skip fill bytes (223), eof bit should be set now dviPostPost(DVIVersion(id), postOffset); } /** Reads and executes Begin-Of-Page command. * Format: bop c0[+4] ... c9[+4] p[+4] */ void DVIReader::cmdBop (int) { vector c(10); for (int i=0; i < 10; i++) c[i] = readSigned(4); int32_t prevBopOffset = readSigned(4); // pointer to peceeding bop (-1 in case of first page) _dviState.reset(); // set all DVI registers to 0 while (!_stateStack.empty()) _stateStack.pop(); _currFontNum = 0; _inPage = true; dviBop(c, prevBopOffset); } /** Reads and executes End-Of-Page command. */ void DVIReader::cmdEop (int) { if (!_stateStack.empty()) throw DVIException("stack not empty at end of page"); _inPage = false; dviEop(); } /** Reads and executes push command. */ void DVIReader::cmdPush (int) { _stateStack.push(_dviState); dviPush(); } /** Reads and executes pop command (restores pushed position information). */ void DVIReader::cmdPop (int) { if (_stateStack.empty()) throw DVIException("stack empty at pop command"); _dviState = _stateStack.top(); _stateStack.pop(); dviPop(); } /** Helper function that handles charaters from virtual fonts (VF). * It is called by the cmdSetChar and cmdPutChar methods. * @param[in] font current font (corresponding to _currFontNum) * @param[in] c character to typeset */ void DVIReader::putVFChar (Font *font, uint32_t c) { if (auto vf = dynamic_cast(font)) { // is current font a virtual font? if (const vector *dvi = vf->getDVI(c)) { // try to get DVI snippet that represents character c FontManager &fm = FontManager::instance(); DVIState savedState = _dviState; // save current cursor position _dviState.x = _dviState.y = _dviState.w = _dviState.z = 0; int savedFontNum = _currFontNum; // save current font number fm.enterVF(vf); // enter VF font number context setFont(fm.vfFirstFontNum(vf), SetFontMode::VF_ENTER); double savedScale = _dvi2bp; // DVI units in virtual fonts are multiples of 1^(-20) times the scaled size of the VF _dvi2bp = vf->scaledSize()/(1 << 20); VectorInputStream vis(*dvi); istream &is = replaceStream(vis); try { executeAll(); // execute DVI fragment } catch (const DVIException &e) { // Message::estream(true) << "invalid dvi in vf: " << e.getMessage() << endl; // @@ } replaceStream(is); // restore previous input stream _dvi2bp = savedScale; // restore previous scale factor fm.leaveVF(); // restore previous font number context setFont(savedFontNum, SetFontMode::VF_LEAVE); // restore previous font number _dviState = savedState; // restore previous cursor position } } } /** Reads and executes set_char_x command. Puts a character at the current * position and advances the cursor. * @param[in] c character to set * @throw DVIException if method is called ouside a bop/eop pair */ void DVIReader::cmdSetChar0 (int c) { if (!_inPage) throw DVIException("setchar outside of page"); Font *font = FontManager::instance().getFont(_currFontNum); dviSetChar0(c, font); // template method that may trigger further actions putVFChar(font, c); // further character processing if current font is a virtual font moveRight(font->charWidth(c)*font->scaleFactor()*_mag/1000.0, MoveMode::SETCHAR); } /** Reads and executes setx command. Puts a character at the current * position and advances the cursor. * @param[in] len number of parameter bytes (possible values: 1-4) * @throw DVIException if method is called ouside a bop/eop pair */ void DVIReader::cmdSetChar (int len) { if (!_inPage) throw DVIException("setchar outside of page"); // According to the dvi specification all character codes are unsigned // except len == 4. At the moment all char codes are treated as unsigned... uint32_t c = readUnsigned(len); // if len == 4 c may be signed Font *font = FontManager::instance().getFont(_currFontNum); dviSetChar(c, font); // template method that may trigger further actions putVFChar(font, c); // further character processing if current font is a virtual font moveRight(font->charWidth(c)*font->scaleFactor()*_mag/1000.0, MoveMode::SETCHAR); } /** Reads and executes putx command. Puts a character at the current * position but doesn't change the cursor position. * @param[in] len number of parameter bytes (possible values: 1-4) * @throw DVIException if method is called ouside a bop/eop pair */ void DVIReader::cmdPutChar (int len) { if (!_inPage) throw DVIException("putchar outside of page"); // According to the dvi specification all character codes are unsigned // except len == 4. At the moment all char codes are treated as unsigned... int32_t c = readUnsigned(len); Font *font = FontManager::instance().getFont(_currFontNum); dviPutChar(c, font); putVFChar(font, c); } /** Reads and executes set_rule command. Puts a solid rectangle at the current * position and updates the cursor position. * Format: set_rule h[+4] w[+4] * @throw DVIException if method is called ouside a bop/eop pair */ void DVIReader::cmdSetRule (int) { if (!_inPage) throw DVIException("set_rule outside of page"); double height = _dvi2bp*readSigned(4); double width = _dvi2bp*readSigned(4); dviSetRule(height, width); moveRight(width, MoveMode::CHANGEPOS); } /** Reads and executes set_rule command. Puts a solid rectangle at the current * position but leaves the cursor position unchanged. * Format: put_rule h[+4] w[+4] * @throw DVIException if method is called ouside a bop/eop pair */ void DVIReader::cmdPutRule (int) { if (!_inPage) throw DVIException("put_rule outside of page"); double height = _dvi2bp*readSigned(4); double width = _dvi2bp*readSigned(4); dviPutRule(height, width); } void DVIReader::moveRight (double dx, MoveMode) { switch (_dviState.d) { case WritingMode::LR: _dviState.h += dx; break; case WritingMode::TB: _dviState.v += dx; break; case WritingMode::BT: _dviState.v -= dx; break; } } void DVIReader::moveDown (double dy, MoveMode) { switch (_dviState.d) { case WritingMode::LR: _dviState.v += dy; break; case WritingMode::TB: _dviState.h -= dy; break; case WritingMode::BT: _dviState.h += dy; break; } } void DVIReader::cmdRight (int len) { double dx = _dvi2bp*readSigned(len); moveRight(dx, MoveMode::CHANGEPOS); dviRight(dx); } void DVIReader::cmdDown (int len) { double dy = _dvi2bp*readSigned(len); moveDown(dy, MoveMode::CHANGEPOS); dviDown(dy); } void DVIReader::cmdNop (int) {dviNop();} void DVIReader::cmdX0 (int) {moveRight(_dviState.x, MoveMode::CHANGEPOS); dviX0();} void DVIReader::cmdY0 (int) {moveDown(_dviState.y, MoveMode::CHANGEPOS); dviY0();} void DVIReader::cmdW0 (int) {moveRight(_dviState.w, MoveMode::CHANGEPOS); dviW0();} void DVIReader::cmdZ0 (int) {moveDown(_dviState.z, MoveMode::CHANGEPOS); dviZ0();} void DVIReader::cmdX (int len) { double dx = _dvi2bp*readSigned(len); _dviState.x = dx; moveRight(dx, MoveMode::CHANGEPOS); dviX(dx); } void DVIReader::cmdY (int len) { double dy = _dvi2bp*readSigned(len); _dviState.y = dy; moveDown(dy, MoveMode::CHANGEPOS); dviY(dy); } void DVIReader::cmdW (int len) { double dx = _dvi2bp*readSigned(len); _dviState.w = dx; moveRight(dx, MoveMode::CHANGEPOS); dviW(dx); } void DVIReader::cmdZ (int len) { double dy = _dvi2bp*readSigned(len); _dviState.z = dy; moveDown(dy, MoveMode::CHANGEPOS); dviZ(dy); } /** Sets the text orientation (horizontal, vertical). * This command is only available in DVI version 3 (created by pTeX) */ void DVIReader::cmdDir (int) { uint8_t wmode = readUnsigned(1); if (wmode == 4) // yoko mode (4) equals default LR mode (0) wmode = 0; if (wmode == 2 || wmode > 3) throw DVIException("invalid writing mode value " + std::to_string(wmode) + " (0, 1, 3, or 4 expected)"); _dviState.d = (WritingMode)wmode; dviDir(_dviState.d); } void DVIReader::cmdXXX (int len) { if (!_inPage) throw DVIException("special outside of page"); uint32_t numBytes = readUnsigned(len); string str = readString(numBytes); dviXXX(str); } /** Change the current font. * @param[in] fontnum local number of font to select * @param[in] mode info on command that triggered the font change * @throw DVIException if font number is undefined */ void DVIReader::setFont (int fontnum, SetFontMode mode) { if (const Font *font = FontManager::instance().getFont(fontnum)) { _currFontNum = fontnum; dviFontNum(uint32_t(fontnum), mode, font); } else throw DVIException("undefined font number " + std::to_string(fontnum)); } /** Selects a previously defined font by its number. * @param[in] fontnum font number * @throw DVIException if font number is undefined */ void DVIReader::cmdFontNum0 (int fontnum) { setFont(fontnum, SetFontMode::SF_SHORT); } /** Selects a previously defined font. * @param[in] len size of font number variable (in bytes) * @throw DVIException if font number is undefined */ void DVIReader::cmdFontNum (int len) { uint32_t fontnum = readUnsigned(len); setFont(fontnum, SetFontMode::SF_LONG); } /** Helper function to handle a font definition. * @param[in] fontnum local font number * @param[in] name font name * @param[in] cs checksum to be compared with TFM checksum * @param[in] ds design size in PS point units * @param[in] ss scaled size in PS point units */ const Font* DVIReader::defineFont (uint32_t fontnum, const string &name, uint32_t cs, double ds, double ss) { FontManager &fm = FontManager::instance(); Font *font = fm.getFont(fontnum); if (!font) { int id = fm.registerFont(fontnum, name, cs, ds, ss); font = fm.getFontById(id); if (auto vf = dynamic_cast(font)) { // read vf file, register its font and character definitions fm.enterVF(vf); ifstream ifs(vf->path(), ios::binary); VFReader vfReader(ifs); vfReader.replaceActions(this); vfReader.executeAll(); fm.leaveVF(); } } return font; } /** Defines a new font. * @param[in] len size of font number variable (in bytes) */ void DVIReader::cmdFontDef (int len) { uint32_t fontnum = readUnsigned(len); // font number uint32_t checksum = readUnsigned(4); // font checksum (to be compared with corresponding TFM checksum) uint32_t ssize = readUnsigned(4); // scaled size of font in DVI units uint32_t dsize = readUnsigned(4); // design size of font in DVI units uint32_t pathlen = readUnsigned(1); // length of font path uint32_t namelen = readUnsigned(1); // length of font name string path = readString(pathlen); // path to font file string fontname = readString(namelen); const Font *font = defineFont(fontnum, fontname, checksum, dsize*_dvi2bp, ssize*_dvi2bp); dviFontDef(fontnum, checksum, font); } /** This template method is called by the VFReader after reading a font definition from a VF file. * @param[in] fontnum local font number * @param[in] path path to font file * @param[in] name font name * @param[in] checksum checksum to be compared with TFM checksum * @param[in] dsize design size in PS point units * @param[in] ssize scaled size in PS point units */ void DVIReader::defineVFFont (uint32_t fontnum, const string &path, const string &name, uint32_t checksum, double dsize, double ssize) { if (const VirtualFont *vf = FontManager::instance().getVF()) defineFont(fontnum, name, checksum, dsize, ssize * vf->scaleFactor()); } /** This template method is called by the VFReader after reading a character definition from a VF file. * @param[in] c character number * @param[in] dvi DVI fragment describing the character */ void DVIReader::defineVFChar (uint32_t c, vector &&dvi) { FontManager::instance().assignVFChar(c, std::move(dvi)); } /** XDV extension: includes image or pdf file. * parameters: box[1] matrix[4][6] p[2] len[2] path[l] */ void DVIReader::cmdXPic (int) { uint8_t box = readUnsigned(1); // box vector matrix(6); for (int i=0; i < 6; i++) // matrix matrix[i] = readSigned(4); int16_t page = readSigned(2); // page number uint16_t len = readUnsigned(2); string path = readString(len); // path to image/pdf file dviXPic(box, matrix, page, path); } /** XDV extension: defines a native font */ void DVIReader::cmdXFontDef (int) { int32_t fontnum = readSigned(4); double ptsize = _dvi2bp*readUnsigned(4); uint16_t flags = readUnsigned(2); uint8_t psname_len = readUnsigned(1); uint8_t fmname_len = getDVIVersion() == DVI_XDV5 ? readUnsigned(1) : 0; // length of family name uint8_t stname_len = getDVIVersion() == DVI_XDV5 ? readUnsigned(1) : 0; // length of style name string fontname = readString(psname_len); uint32_t fontIndex=0; if (getDVIVersion() == DVI_XDV5) seek(fmname_len+stname_len, ios::cur); else fontIndex = readUnsigned(4); FontStyle style; Color color; if (flags & 0x0100) { // vertical? } if (flags & 0x0200) { // colored? // The font color must not interfere with color specials. If the font color is not black, // all color specials should be ignored, i.e. glyphs of a non-black fonts have a fixed color // that can't be changed by color specials. uint32_t rgba = readUnsigned(4); color.setRGB(uint8_t(rgba >> 24), uint8_t((rgba >> 16) & 0xff), uint8_t((rgba >> 8) & 0xff)); } if (flags & 0x1000) // extend? style.extend = _dvi2bp*readSigned(4); if (flags & 0x2000) // slant? style.slant = _dvi2bp*readSigned(4); if (flags & 0x4000) // embolden? style.bold = _dvi2bp*readSigned(4); if ((flags & 0x0800) && (getDVIVersion() == DVI_XDV5)) { // variations? uint16_t num_variations = readSigned(2); for (int i=0; i < num_variations; i++) readUnsigned(4); } const Font *font = FontManager::instance().getFont(fontnum); if (!font) { FontManager::instance().registerFont(fontnum, fontname, fontIndex, ptsize, style, color); font = FontManager::instance().getFont(fontnum); } dviXFontDef(fontnum, dynamic_cast(font)); } /** XDV extension: prints an array of characters where each character * can take independent x and y coordinates. * parameters: w[4] n[2] (dx,dy)[(4+4)n] glyphs[2n] */ void DVIReader::cmdXGlyphArray (int) { vector dx, dy; vector glyphs; double width = putGlyphArray(false, dx, dy, glyphs); if (Font *font = FontManager::instance().getFont(_currFontNum)) dviXGlyphArray(dx, dy, glyphs, *font); else throw DVIException("missing setfont prior to xglypharray"); moveRight(width, MoveMode::SETCHAR); } /** XDV extension: prints an array/string of characters where each character * can take independent x coordinates whereas all share a single y coordinate. * parameters: w[4] n[2] dx[4n] dy[4] glyphs[2n] */ void DVIReader::cmdXGlyphString (int) { vector dx, dy; vector glyphs; double width = putGlyphArray(true, dx, dy, glyphs); if (Font *font = FontManager::instance().getFont(_currFontNum)) dviXGlyphString(dx, glyphs, *font); else throw DVIException("missing setfont prior to xglyphstring"); moveRight(width, MoveMode::SETCHAR); } /** XDV extension: Same as cmdXGlyphArray plus a leading array of UTF-16 characters * that specify the "actual text" represented by the glyphs to be printed. It usually * contains the text with special characters (like ligatures) expanded so that it * can be used for text search, plain text copy & paste etc. This XDV command was * introduced with XeTeX 0.99995 and can be triggered by \\XeTeXgenerateactualtext1. * parameters: l[2] chars[2l] w[4] n[2] (dx,dy)[8n] glyphs[2n] */ void DVIReader::cmdXTextAndGlyphs (int) { uint16_t l = readUnsigned(2); // number of chars vector chars(l); for (int i=0; i < l; i++) chars[i] = readUnsigned(2); vector x, y; vector glyphs; double width = putGlyphArray(false, x, y, glyphs); if (Font *font = FontManager::instance().getFont(_currFontNum)) dviXTextAndGlyphs(x, y, chars, glyphs, *font); else throw DVIException("missing setfont prior to xtextandglyphs"); moveRight(width, MoveMode::SETCHAR); } /** Implements the common functionality of cmdXGlyphArray, cmdXGlyphString, and cmdXTextAndGlyphs. * @param[in] xonly indicates if the characters share a single y coordinate (xonly==true) * @param[out] dx relative horizontal positions of each glyph * @param[out] dy relative vertical positions of each glyph * @param[out] glyphs FreeType indices of the glyphs to typeset * @return total width of the glyph array */ double DVIReader::putGlyphArray (bool xonly, vector &dx, vector &dy, vector &glyphs) { double strwidth = _dvi2bp*readSigned(4); uint16_t num_glyphs = readUnsigned(2); dx.resize(num_glyphs); dy.resize(num_glyphs); glyphs.resize(num_glyphs); for (int i=0; i < num_glyphs; i++) { dx[i] = readSigned(4)*_dvi2bp; dy[i] = xonly ? 0 : readSigned(4)*_dvi2bp; } for (int i=0; i < num_glyphs; i++) glyphs[i] = readUnsigned(2); return strwidth; } dvisvgm-2.8.1/src/SVGCharHandler.cpp0000664000175000017500000000726013510660062014156 00000000000000/************************************************************************* ** SVGCharHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "SVGCharHandler.hpp" #include "utility.hpp" #include "XMLNode.hpp" using namespace std; void SVGCharHandler::setInitialContextNode (XMLElement *node) { resetContextNode(); _initialContextNode = node; } /** Changes the context element. All following nodes will be appended to this node. * @param[in] node the new context node * @return bare pointer to the new context node or 0 if context hasn't changed */ XMLElement* SVGCharHandler::pushContextNode (unique_ptr node) { if (node && (_contextNodeStack.empty() || node.get() != _contextNodeStack.top())) { XMLElement *nodeptr = node.get(); contextNode()->append(std::move(node)); _contextNodeStack.push(nodeptr); return nodeptr; } return nullptr; } void SVGCharHandler::popContextNode () { if (!_contextNodeStack.empty()) _contextNodeStack.pop(); } /** Resets the context node to the initial element node. */ void SVGCharHandler::resetContextNode () { while (!_contextNodeStack.empty()) _contextNodeStack.pop(); } /** Creates and returns a new SVG text element. * @param[in] x current x coordinate * @param[in] y current y coordinate */ unique_ptr SVGCharTextHandler::createTextNode (double x, double y) const { const Font *font = _font.get(); if (!font) return nullptr; auto textNode = util::make_unique("text"); if (_selectFontByClass) textNode->addAttribute("class", string("f")+XMLString(_fontnum)); else { textNode->addAttribute("font-family", font->name()); textNode->addAttribute("font-size", XMLString(font->scaledSize())); if (font->color() != Color::BLACK) textNode->addAttribute("fill", font->color().svgColorString()); } if (_vertical) { textNode->addAttribute("writing-mode", "tb"); // align glyphs designed for horizontal layout properly if (auto pf = dynamic_cast(font)) { if (!pf->getMetrics()->verticalLayout()) { // alphabetic text designed for horizontal layout? x += pf->scaledAscent()/2.5; // move vertical baseline to the right by strikethrough offset textNode->addAttribute("glyph-orientation-vertical", 90); // ensure rotation } } } textNode->addAttribute("x", x); textNode->addAttribute("y", y); if (!_matrix.get().isIdentity()) textNode->addAttribute("transform", _matrix.get().toSVG()); return textNode; } dvisvgm-2.8.1/src/System.cpp0000664000175000017500000000372513510660062012711 00000000000000/************************************************************************* ** System.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "System.hpp" #if defined (HAVE_SYS_TIME_H) #include #elif defined (HAVE_SYS_TIMEB_H) #include #endif using namespace std; /** Returns timestamp (wall time) in seconds. */ double System::time () { #if defined (HAVE_SYS_TIME_H) struct timeval tv; gettimeofday(&tv, nullptr); return tv.tv_sec + tv.tv_usec/1000000.0; #elif defined (HAVE_SYS_TIMEB_H) struct timeb tb; ftime(&tb); return tb.time + tb.millitm/1000.0; #else clock_t myclock = clock(); return double(myclock)/CLOCKS_PER_SEC; #endif } dvisvgm-2.8.1/src/HashFunction.cpp0000664000175000017500000000703113536436567014033 00000000000000/************************************************************************* ** HashFunction.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "HashFunction.hpp" #include "utility.hpp" #include "MD5HashFunction.hpp" #include "XXHashFunction.hpp" using namespace std; /** Returns a vector containing the names of the currently supported hash algorithms. */ vector HashFunction::supportedAlgorithms () { return vector { "md5", "xxh32", "xxh64", #ifdef ENABLE_XXH128 "xxh128" #endif }; } /** Returns true if 'algo' is the name of a supported hash algorithm. */ bool HashFunction::isSupportedAlgorithm (const std::string &algo) { auto algos = supportedAlgorithms(); return find(algos.begin(), algos.end(), algo) != algos.end(); } /** Creates a hash function for a given algorithm name/identifier. * The following names are currently supported: md5, xxh32, xxh64. */ unique_ptr HashFunction::create (const string &name) { string lowerName = util::tolower(name); if (lowerName == "md5") return util::make_unique(); if (lowerName == "xxh32") return util::make_unique(); if (lowerName == "xxh64") return util::make_unique(); #ifdef ENABLE_XXH128 if (lowerName == "xxh128") return util::make_unique(); #endif return nullptr; } std::unique_ptr HashFunction::create (const string &name, const char *data, size_t length) { auto hashfunc = create(name); if (hashfunc) hashfunc->update(data, length); return hashfunc; } std::unique_ptr HashFunction::create (const string &name, const string &data) { return create(name, data.data(), data.length()); } std::unique_ptr HashFunction::create (const string &name, const vector &data) { return create(name, reinterpret_cast(data.data()), data.size()); } void HashFunction::update (istream &is) { char buf[4096]; while (is) { is.read(buf, 4096); update(buf, is.gcount()); } } /** Returns the current digest as hexadecimal value. */ string HashFunction::digestString () const { ostringstream oss; oss << hex << setfill('0'); for (int byte : digestValue()) oss << setw(2) << byte; return oss.str(); } dvisvgm-2.8.1/src/FileFinder.cpp0000664000175000017500000002177713560004141013436 00000000000000/************************************************************************* ** FileFinder.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #ifdef MIKTEX #include "MiKTeXCom.hpp" #include "utility.hpp" #else #ifdef KPSE_CXX_UNSAFE extern "C" { #endif #include #ifdef KPSE_CXX_UNSAFE } #endif #endif #include #include #include #include #include "FileFinder.hpp" #include "FilePath.hpp" #include "FileSystem.hpp" #include "FontMap.hpp" #include "Message.hpp" #include "MessageException.hpp" #include "Process.hpp" std::string FileFinder::_argv0; std::string FileFinder::_progname; bool FileFinder::_enableMktex = false; /** Constructs a new file finder. * @param[in] argv0 argv[0] of main() function * @param[in] progname name of application using the FileFinder * @param[in] enable_mktexmf if true, tfm and mf file generation is activated */ FileFinder::FileFinder () { addLookupDir("."); // always lookup files in the current working directory #ifdef MIKTEX _miktex = util::make_unique(); #else kpse_set_program_name(_argv0.c_str(), _progname.c_str()); // enable tfm and mf generation (actually invoked by calls of kpse_make_tex) kpse_set_program_enabled(kpse_tfm_format, 1, kpse_src_env); kpse_set_program_enabled(kpse_mf_format, 1, kpse_src_env); kpse_make_tex_discard_errors = true; // suppress messages from mktexFOO tools #endif } void FileFinder::init (const std::string &argv0, const std::string &progname, bool enable_mktexmf) { _argv0 = argv0; _progname = progname; _enableMktex = enable_mktexmf; } FileFinder& FileFinder::instance () { static FileFinder instance; return instance; } /** Returns the version string of the underlying file searching library (kpathsea, MiKTeX) */ std::string FileFinder::version () const { #ifdef MIKTEX return _miktex->getVersion(); #else if (const char *v = strrchr(KPSEVERSION, ' ')) return (std::string(KPSEVERSION).substr(0, 9) == "kpathsea ") ? v+1 : KPSEVERSION; if (strlen(KPSEVERSION) > 0) return KPSEVERSION; #endif return "unknown"; } void FileFinder::addLookupDir (const std::string &path) { FilePath filepath(path); _additionalDirs.insert(filepath.absolute()); } /** Determines filetype by the filename extension and calls kpse_find_file * to actually look up the file. * @param[in] fname name of file to look up * @param[in] ftype expected file format of file fname; if 0, it's derived from the filename suffix * @return file path on success, 0 otherwise */ const char* FileFinder::findFile (const std::string &fname, const char *ftype) const { if (fname.empty()) return nullptr; static std::string buf; // try to lookup the file in the additionally specified directories for (const std::string &dir : _additionalDirs) { buf = dir + "/" + fname; if (FileSystem::exists(buf)) return buf.c_str(); } std::string ext; if (ftype) ext = ftype; else { size_t pos = fname.rfind('.'); if (pos == std::string::npos) return nullptr; // no extension and no file type => no search ext = fname.substr(pos+1); } #ifdef MIKTEX if (ext == "dll" || ext == "exe") { // lookup dll and exe files in the MiKTeX bin directory first buf = _miktex->getBinDir() + "/" + fname; if (FileSystem::exists(buf)) return buf.c_str(); } else if (ext == "cmap") { // The MiKTeX SDK doesn't support the lookup of files without suffix (yet), thus // it's not possible to find cmap files which usually don't have a suffix. In order // to work around this, we try to lookup the files by calling kpsewhich. Process process("kpsewhich", "-format=cmap "+fname); process.run(&buf); buf = util::trim(buf); return buf.empty() ? nullptr : buf.c_str(); } try { return _miktex->findFile(fname.c_str()); } catch (const MessageException &e) { return nullptr; } #else #ifdef TEXLIVEWIN32 if (ext == "exe") { // lookup exe files in directory where dvisvgm is located if (const char *path = kpse_var_value("SELFAUTOLOC")) { buf = std::string(path) + "/" + fname; return FileSystem::exists(buf) ? buf.c_str() : nullptr; } return nullptr; } #endif static std::map types = { {"tfm", kpse_tfm_format}, {"pfb", kpse_type1_format}, {"vf", kpse_vf_format}, {"mf", kpse_mf_format}, {"ttc", kpse_truetype_format}, {"ttf", kpse_truetype_format}, {"otf", kpse_opentype_format}, {"map", kpse_fontmap_format}, {"cmap", kpse_cmap_format}, {"sty", kpse_tex_format}, {"enc", kpse_enc_format}, {"pro", kpse_tex_ps_header_format}, {"sfd", kpse_sfd_format}, {"eps", kpse_pict_format}, {"png", kpse_pict_format}, {"jpg", kpse_pict_format}, {"jpeg", kpse_pict_format}, {"svg", kpse_pict_format}, {"pdf", kpse_tex_format}, }; auto it = types.find(ext); if (it == types.end()) return nullptr; if (char *path = kpse_find_file(fname.c_str(), it->second, 0)) { // In the current version of libkpathsea, each call of kpse_find_file produces // a memory leak since the path buffer is not freed. I don't think we can do // anything against it here... buf = path; std::free(path); return buf.c_str(); } return nullptr; #endif } /** Checks whether the given file is mapped to a different name and if the * file can be found under this name. * @param[in] fname name of file to look up * @return file path on success, 0 otherwise */ const char* FileFinder::findMappedFile (std::string fname) const { size_t pos = fname.rfind('.'); if (pos == std::string::npos) return nullptr; const std::string ext = fname.substr(pos+1); // file extension const std::string base = fname.substr(0, pos); if (const FontMap::Entry *entry = FontMap::instance().lookup(base)) { const char *path=nullptr; if (entry->fontname.find('.') != std::string::npos) // does the mapped filename has an extension? path = findFile(entry->fontname, nullptr); // look for that file else { // otherwise, use extension of unmapped file fname = entry->fontname + "." + ext; (path = findFile(fname, nullptr)) || (path = mktex(fname)); } return path; } return nullptr; } /** Runs external mktexFOO tool to create missing tfm or mf file. * @param[in] fname name of file to build * @return file path on success, 0 otherwise */ const char* FileFinder::mktex (const std::string &fname) const { size_t pos = fname.rfind('.'); if (!_enableMktex || pos == std::string::npos) return nullptr; std::string ext = fname.substr(pos+1); // file extension if (ext != "tfm" && ext != "mf") return nullptr; const char *path = nullptr; #ifdef MIKTEX // maketfm and makemf are located in miktex/bin which is in the search PATH std::string toolname = (ext == "tfm" ? "miktex-maketfm" : "miktex-makemf"); system((toolname+".exe "+fname).c_str()); path = findFile(fname, nullptr); #else kpse_file_format_type type = (ext == "tfm" ? kpse_tfm_format : kpse_mf_format); path = kpse_make_tex(type, fname.c_str()); #endif return path; } /** Searches a file in the TeX directory tree. * If the file doesn't exist, maximal two further steps are applied * (if "extended" is true): * - checks whether the filename is mapped to a different name and returns * the path to that name * - in case of tfm or mf files: invokes the external mktextfm/mktexmf tool * to create the missing file * @param[in] fname name of file to look up * @param[in] ftype type/format of file to look up * @param[in] extended if true, use fontmap lookup and mktexFOO calls * @return path to file on success, 0 otherwise */ const char* FileFinder::lookup (const std::string &fname, const char *ftype, bool extended) const { const char *path; if ((path = findFile(fname, ftype)) || (extended && ((path = findMappedFile(fname)) || (path = mktex(fname))))) return path; return nullptr; } dvisvgm-2.8.1/src/Ghostscript.cpp0000664000175000017500000002674413510660062013744 00000000000000/************************************************************************* ** Ghostscript.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "FilePath.hpp" #include "Ghostscript.hpp" #include "utility.hpp" #if !defined(DISABLE_GS) #include #include #include #if defined(HAVE_LIBGS) #include #else #include "ierrors.h" #include "FileFinder.hpp" #endif using namespace std; // name of Ghostscript shared library set by the user string Ghostscript::LIBGS_NAME; #ifndef HAVE_LIBGS #ifdef _WIN32 /** Looks up the path of the Ghostscript DLL in the Windows registry and returns it. * If there is no proper registry entry, the returned string is empty. */ static string get_path_from_registry () { #ifdef RRF_RT_REG_SZ // RegGetValueA and RRF_RT_REG_SZ may not be defined for some oldish MinGW REGSAM mode = KEY_READ|KEY_QUERY_VALUE; #ifdef KEY_WOW64_64KEY #ifdef _WIN64 mode |= KEY_WOW64_64KEY; #else mode |= KEY_WOW64_32KEY; #endif #endif for (const char *gs_company : {"GPL", "GNU", "AFPL", "Aladdin"}) { const string reg_path = string("SOFTWARE\\") + gs_company + " Ghostscript"; for (HKEY reg_root : {HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE}) { HKEY hkey; if (RegOpenKeyExA(reg_root, reg_path.c_str(), 0, mode, &hkey) == ERROR_SUCCESS) { char subkey[16]; for (int k=0; RegEnumKeyA(hkey, k, subkey, 16) == ERROR_SUCCESS; k++) { istringstream iss(subkey); int major_version; iss >> major_version; if (major_version >= 7) { char dll_path[512]; // path to Ghostscript DLL stored in the registry DWORD length = 512; if (RegGetValueA(hkey, subkey, "GS_DLL", RRF_RT_REG_SZ, nullptr, dll_path, &length) == ERROR_SUCCESS) { RegCloseKey(hkey); return dll_path; } } } RegCloseKey(hkey); } } } #endif // RRF_RT_REG_SZ return ""; } #endif // _WIN32 #if defined(_WIN32) && !defined(_WIN64) static string get_gsdll32 () { string pathstr; #if defined(TEXLIVEWIN32) char exepath[256]; if (GetModuleFileNameA(NULL, exepath, 256)) { FilePath path(exepath); path.set(path.absolute(false)+"/../../tlpkg/tlgs"); pathstr = util::replace(path.absolute(false)+"/", "/", "\\"); string envvar = "GS_LIB="; for (string dirs : {"lib", "fonts", "Resource\\Init", "Resource", "kanji"}) envvar += pathstr+dirs+";"; _putenv(envvar.c_str()); pathstr += "bin\\"; } #endif return pathstr+"gsdll32.dll"; } #endif // _WIN32 && !_WIN64 /** Try to detect name of the Ghostscript shared library depending on the user settings. * @param[in] fname path/filename given by the user * @return name of Ghostscript shared library */ static string get_libgs (const string &fname) { if (!fname.empty()) return fname; #ifdef MIKTEX #if defined(_WIN64) const char *gsdll = "mgsdll64.dll"; #else const char *gsdll = "mgsdll32.dll"; #endif // try to look up the Ghostscript DLL coming with MiKTeX if (const char *gsdll_path = FileFinder::instance().lookup(gsdll)) return gsdll_path; #endif // MIKTEX #if defined(_WIN32) // try to look up the path of the Ghostscript DLL in the Windows registry string gsdll_path = get_path_from_registry(); if (!gsdll_path.empty()) return gsdll_path; #endif //_WIN32 #if defined(_WIN64) return "gsdll64.dll"; #elif defined(_WIN32) return get_gsdll32(); #else // try to find libgs.so.X on the user's system const int abi_min=7, abi_max=9; // supported libgs ABI versions for (int i=abi_max; i >= abi_min; i--) { #if defined(__CYGWIN__) string dlname = "cyggs-" + to_string(i) + ".dll"; #else string dlname = "libgs.so." + to_string(i); #endif DLLoader loader(dlname); if (loader.loaded()) return dlname; #if defined(__APPLE__) dlname = "libgs." + to_string(i) + ".dylib"; if (loader.loadLibrary(dlname)) return dlname; #endif } #endif // no appropriate library found return ""; } #endif // !HAVE_LIBGS /** Loads the Ghostscript library but does not create an instance. This * constructor should only be used to call available() and revision(). */ Ghostscript::Ghostscript () #if !defined(HAVE_LIBGS) : DLLoader(get_libgs(LIBGS_NAME)) #endif { } /** Tries to load the shared library and to initialize Ghostscript. * @param[in] argc number of parameters in array argv * @param[in] argv parameters passed to Ghostscript * @param[in] caller this parameter is passed to all callback functions */ Ghostscript::Ghostscript (int argc, const char **argv, void *caller) #if !defined(HAVE_LIBGS) : DLLoader(get_libgs(LIBGS_NAME)) #endif { init(argc, argv, caller); } /** Exits Ghostscript and unloads the dynamic library. */ Ghostscript::~Ghostscript () { if (_inst) { this->exit(); delete_instance(); } } bool Ghostscript::init (int argc, const char **argv, void *caller) { if (!_inst) { int status = new_instance(&_inst, caller); if (status < 0) _inst = nullptr; else { init_with_args(argc, const_cast(argv)); } } return _inst != nullptr; } /** Returns true if Ghostscript library was found and can be loaded. */ bool Ghostscript::available () { #if defined(HAVE_LIBGS) return true; #else gsapi_revision_t rev; return loaded() && revision(&rev); #endif } /** Retrieves version information about Ghostscript. * @param[out] r takes the revision information (see GS API documentation for further details) * @return true on success */ bool Ghostscript::revision (gsapi_revision_t *r) { #if defined(HAVE_LIBGS) return (gsapi_revision(r, sizeof(gsapi_revision_t)) == 0); #else if (auto fn = LOAD_SYMBOL(gsapi_revision)) return (fn(r, sizeof(gsapi_revision_t)) == 0); return false; #endif } /** Returns the revision number of the GS library. */ int Ghostscript::revision () { gsapi_revision_t r; if (revision(&r)) return static_cast(r.revision); return 0; } /** Returns the revision of the GS library as a string of the form "MAJOR.MINOR". */ string Ghostscript::revisionstr () { string revstr; if (int rev = revision()) { revstr = to_string(rev/100) + "."; if (rev % 100 < 10) revstr += "0"; revstr += to_string(rev%100); } return revstr; } /** Creates a new instance of Ghostscript. This method is called by the constructor and * should not be used elsewhere. * @param[out] psinst handle of newly created instance (or 0 on error) * @param[in] caller pointer forwarded to callback functions */ int Ghostscript::new_instance (void **psinst, void *caller) { #if defined(HAVE_LIBGS) return gsapi_new_instance(psinst, caller); #else if (auto fn = LOAD_SYMBOL(gsapi_new_instance)) return fn(psinst, caller); *psinst = nullptr; return 0; #endif } /** Destroys the current instance of Ghostscript. This method is called by the destructor * and should not be used elsewhere. */ void Ghostscript::delete_instance () { #if defined(HAVE_LIBGS) gsapi_delete_instance(_inst); #else if (auto fn = LOAD_SYMBOL(gsapi_delete_instance)) fn(_inst); #endif } /** Exits the interpreter. Must be called before destroying the GS instance. */ int Ghostscript::exit () { #if defined(HAVE_LIBGS) return gsapi_exit(_inst); #else if (auto fn = LOAD_SYMBOL(gsapi_exit)) return fn(_inst); return 0; #endif } /** Sets the I/O callback functions. * @param[in] in pointer to stdin handler * @param[in] out pointer to stdout handler * @param[in] err pointer to stderr handler */ int Ghostscript::set_stdio (Stdin in, Stdout out, Stderr err) { #if defined(HAVE_LIBGS) return gsapi_set_stdio(_inst, in, out, err); #else if (auto fn = LOAD_SYMBOL(gsapi_set_stdio)) return fn(_inst, in, out, err); return 0; #endif } /** Initializes Ghostscript with a set of optional parameters. This * method is called by the constructor and should not be used elsewhere. * @param[in] argc number of paramters * @param[in] argv parameters passed to Ghostscript */ int Ghostscript::init_with_args (int argc, char **argv) { #if defined(HAVE_LIBGS) return gsapi_init_with_args(_inst, argc, argv); #else if (auto fn = LOAD_SYMBOL(gsapi_init_with_args)) return fn(_inst, argc, argv); return 0; #endif } /** Tells Ghostscript that several calls of run_string_continue will follow. */ int Ghostscript::run_string_begin (int user_errors, int *pexit_code) { #if defined(HAVE_LIBGS) return gsapi_run_string_begin(_inst, user_errors, pexit_code); #else if (auto fn = LOAD_SYMBOL(gsapi_run_string_begin)) return fn(_inst, user_errors, pexit_code); *pexit_code = 0; return 0; #endif } /** Executes a chunk of PostScript commands given by a buffer of characters. The size of * this buffer must not exceed 64KB. Longer programs can be split into arbitrary smaller chunks * and passed to Ghostscript by successive calls of run_string_continue. * @param[in] str buffer containing the PostScript code * @param[in] length number of characters in buffer * @param[in] user_errors if non-negative, the default PS error values will be generated, otherwise this value is returned * @param[out] pexit_code takes the PS error code */ int Ghostscript::run_string_continue (const char *str, unsigned length, int user_errors, int *pexit_code) { #if defined(HAVE_LIBGS) return gsapi_run_string_continue(_inst, str, length, user_errors, pexit_code); #else if (auto fn = LOAD_SYMBOL(gsapi_run_string_continue)) return fn(_inst, str, length, user_errors, pexit_code); *pexit_code = 0; return 0; #endif } /** Terminates the successive code feeding. Must be called after the last call of run_string_continue. */ int Ghostscript::run_string_end (int user_errors, int *pexit_code) { #if defined(HAVE_LIBGS) return gsapi_run_string_end(_inst, user_errors, pexit_code); #else if (auto fn = LOAD_SYMBOL(gsapi_run_string_end)) return fn(_inst, user_errors, pexit_code); *pexit_code = 0; return 0; #endif } const char* Ghostscript::error_name (int code) { if (code < 0) code = -code; const char *error_names[] = { ERROR_NAMES }; if (code == 0 || (size_t)code > sizeof(error_names)/sizeof(error_names[0])) return nullptr; #if defined(HAVE_LIBGS) // use array defined in libgs to avoid linking the error strings into the binary return gs_error_names[code-1]; #elif defined(_WIN32) // gs_error_names is private in the Ghostscript DLL so we can't access it here return error_names[code-1]; #else if (auto error_names = loadSymbol("gs_error_names")) return error_names[code-1]; return nullptr; #endif } #endif // !DISABLE_GS dvisvgm-2.8.1/src/SVGOutput.cpp0000664000175000017500000001433613553267757013332 00000000000000/************************************************************************* ** SVGOutput.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include "Calculator.hpp" #include "FileSystem.hpp" #include "Message.hpp" #include "SVGOutput.hpp" #include "utility.hpp" #include "ZLibOutputStream.hpp" using namespace std; SVGOutput::SVGOutput (const string &base, string pattern, int zipLevel) : _path(base), _pattern(std::move(pattern)), _stdout(base.empty()), _zipLevel(zipLevel), _page(-1) { } /** Returns an output stream for the given page. * @param[in] page number of current page * @param[in] numPages total number of pages in the DVI file * @param[in] hash hash value of the current page * @return output stream for the given page */ ostream& SVGOutput::getPageStream (int page, int numPages, const HashTriple &hashes) const { FilePath path = filepath(page, numPages, hashes); if (path.empty()) { if (_zipLevel == 0) { _osptr.reset(); return cout; } #ifdef _WIN32 if (_setmode(_fileno(stdout), _O_BINARY) == -1) throw MessageException("can't open stdout in binary mode"); #endif return *(_osptr = util::make_unique(cout, ZLIB_GZIP, _zipLevel)); } if (page == _page) return *_osptr; _page = page; if (_zipLevel > 0) _osptr = util::make_unique(path.absolute(), ZLIB_GZIP, _zipLevel); else _osptr = util::make_unique(path.absolute()); if (!_osptr) throw MessageException("can't open file "+path.shorterAbsoluteOrRelative()+" for writing"); return *_osptr; } /** Returns the path of the SVG file containing the given page number. * @param[in] page number of current page * @param[in] numPages total number of pages * @param[in] hash hash value of current page */ FilePath SVGOutput::filepath (int page, int numPages, const HashTriple &hashes) const { FilePath outpath; if (!_stdout) { string expanded_pattern = util::trim(expandFormatString(_pattern, page, numPages, hashes)); // set and expand default pattern if necessary if (expanded_pattern.empty()) { string pattern = hashes.empty() ? (numPages > 1 ? "%f-%p" : "%f") : "%f-%hd"; expanded_pattern = expandFormatString(pattern, page, numPages, hashes); } // append suffix if necessary outpath.set(expanded_pattern, true); if (outpath.suffix().empty()) outpath.suffix(_zipLevel > 0 ? "svgz" : "svg"); } return outpath; } /** Replaces expressions in a given string by the corresponding values and returns the result. * Supported constructs: * %f: basename of the current file (filename without suffix) * %h: hash value of current page * %[0-9]?p: current page number * %[0-9]?P: number of pages in DVI file * %[0-9]?(expr): arithmetic expression * @param[in] str string to expand * @param[in] page number of current page * @param[in] numPages total number of pages * @param[in] hash hash value of current page (skipped if empty) */ string SVGOutput::expandFormatString (string str, int page, int numPages, const HashTriple &hashes) const { string result; while (!str.empty()) { size_t pos = str.find('%'); if (pos == string::npos) { result += str; str.clear(); } else { result += str.substr(0, pos); str = str.substr(pos); pos = 1; ostringstream oss; if (!isdigit(str[pos])) oss << setw(util::ilog10(numPages)+1) << setfill('0'); else { oss << setw(str[pos]-'0') << setfill('0'); pos++; } switch (str[pos]) { case 'f': result += _path.basename(); break; case 'h': { char variant = pos+1 < str.length() ? str[++pos] : '\0'; switch (variant) { case 'd': result += hashes.dviHash(); break; case 'c': result += hashes.cmbHash(); break; case 'o': result += hashes.optHash(); break; default: throw MessageException("hash type 'd', 'c', or 'o' expected after '%h' in filename pattern"); } break; } case 'p': case 'P': oss << (str[pos] == 'p' ? page : numPages); result += oss.str(); break; case '(': { size_t endpos = str.find(')', pos); if (endpos == string::npos) throw MessageException("missing ')' in filename pattern"); else if (endpos-pos-1 > 1) { try { Calculator calculator; calculator.setVariable("p", page); calculator.setVariable("P", numPages); oss << floor(calculator.eval(str.substr(pos, endpos-pos+1))); result += oss.str(); } catch (CalculatorException &e) { throw MessageException("error in filename pattern (" + string(e.what()) + ")"); } pos = endpos; } break; } } str = str.substr(pos+1); } } return result; } /** Returns true if methods 'filename' and 'getPageStream' ignore the hash * parameter because it's not requested in the filename pattern. */ bool SVGOutput::ignoresHashes () const { return _stdout || (!_pattern.empty() && _pattern.find("%h") == string::npos); } dvisvgm-2.8.1/src/TFM.cpp0000664000175000017500000001564713510660062012061 00000000000000/************************************************************************* ** TFM.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileFinder.hpp" #include "Length.hpp" #include "Message.hpp" #include "StreamReader.hpp" #include "TFM.hpp" using namespace std; /** Reads a sequence of n TFM words (4 Bytes each). * @param[in] reader the TFM data is read from this object * @param[out] v the read words * @param[in] n number of words to be read */ template static void read_words (StreamReader &reader, vector &v, unsigned n) { v.clear(); v.resize(n); for (unsigned i=0; i < n; i++) v[i] = reader.readUnsigned(4); } TFM::TFM (istream &is) : _checksum(0), _firstChar(0), _lastChar(0), _designSize(0), _ascent(0), _descent(0) { if (!is) return; is.seekg(0); StreamReader reader(is); uint16_t lf = uint16_t(reader.readUnsigned(2)); // length of entire file in 4 byte words uint16_t lh = uint16_t(reader.readUnsigned(2)); // length of header in 4 byte words _firstChar= uint16_t(reader.readUnsigned(2)); // smallest character code in font _lastChar = uint16_t(reader.readUnsigned(2)); // largest character code in font uint16_t nw = uint16_t(reader.readUnsigned(2)); // number of words in width table uint16_t nh = uint16_t(reader.readUnsigned(2)); // number of words in height table uint16_t nd = uint16_t(reader.readUnsigned(2)); // number of words in depth table uint16_t ni = uint16_t(reader.readUnsigned(2)); // number of words in italic corr. table uint16_t nl = uint16_t(reader.readUnsigned(2)); // number of words in lig/kern table uint16_t nk = uint16_t(reader.readUnsigned(2)); // number of words in kern table uint16_t ne = uint16_t(reader.readUnsigned(2)); // number of words in ext. char table uint16_t np = uint16_t(reader.readUnsigned(2)); // number of font parameter words if (6+lh+(_lastChar-_firstChar+1)+nw+nh+nd+ni+nl+nk+ne+np != lf) throw FontMetricException("inconsistent length values"); if (_firstChar >= _lastChar || _lastChar > 255 || ne > 256) throw FontMetricException("character codes out of range"); readHeader(reader); is.seekg(24+lh*4); // move to char info table readTables(reader, nw, nh, nd, ni); is.seekg(4*(lf-np), ios::beg); // move to param section readParameters(reader, np); } void TFM::readHeader (StreamReader &reader) { _checksum = reader.readUnsigned(4); _designSize = double(FixWord(reader.readUnsigned(4)))*Length::pt2bp; } void TFM::readTables (StreamReader &reader, int nw, int nh, int nd, int ni) { read_words(reader, _charInfoTable, _lastChar-_firstChar+1); read_words(reader, _widthTable, nw); read_words(reader, _heightTable, nh); read_words(reader, _depthTable, nd); read_words(reader, _italicTable, ni); for (FixWord h : _heightTable) _ascent = max(_ascent, h); for (FixWord d : _depthTable) _descent = max(_descent, d); } /** Read the values from the param section of the TFM file. * @param[in] reader read from this stream * @param[in] np number of paramaters to read */ void TFM::readParameters (StreamReader &reader, int np) { _params.resize(7); np = min(np, 7); for (int i=0; i < np; i++) _params[i] = reader.readUnsigned(4); for (int i=np; i < 7; i++) _params[i] = 0; } /** Returns the optimal space width between words (in PS point units). */ double TFM::getSpace () const { return _params.empty() ? 0 : double(_params[1])*_designSize; } /** Returns the amount of glue stretching between words (in PS point units). */ double TFM::getSpaceStretch () const { return _params.empty() ? 0 : double(_params[2])*_designSize; } /** Returns the amount of glue shrinking between words (in PS point units). */ double TFM::getSpaceShrink () const { return _params.empty() ? 0 : double(_params[3])*_designSize; } /** Returns the size of one EM unit (in PS point units). */ double TFM::getQuad () const { if (_params.empty() || _params[5] == 0) return _designSize; return double(_params[5])*_designSize; } /** Returns the index to the entry of the character info table that describes the metric of a given character. * @param[in] c character whose index is retrieved * @return table index for character c, or -1 if there's no entry */ int TFM::charIndex (int c) const { if (c < _firstChar || c > _lastChar || size_t(c-_firstChar) >= _charInfoTable.size()) return -1; return c-_firstChar; } // the char info word for each character consists of 4 bytes holding the following information: // width index w, height index (h), depth index (d), italic correction index (it), // tag (tg) and a remainder: // // byte 1 | byte 2 | byte 3 | byte 4 // xxxxxxxx | xxxx xxxx | xxxxxx xx | xxxxxxxx // w | h d | it tg | remainder /** Returns the width of char c in PS point units. */ double TFM::getCharWidth (int c) const { int index = charIndex(c); if (index < 0) return 0; index = (_charInfoTable[index] >> 24) & 0xFF; return double(_widthTable[index]) * _designSize; } /** Returns the height of char c in PS point units. */ double TFM::getCharHeight (int c) const { int index = charIndex(c); if (index < 0) return 0; index = (_charInfoTable[index] >> 20) & 0x0F; return double(_heightTable[index]) * _designSize; } /** Returns the depth of char c in PS point units. */ double TFM::getCharDepth (int c) const { int index = charIndex(c); if (index < 0) return 0; index = (_charInfoTable[index] >> 16) & 0x0F; return double(_depthTable[index]) * _designSize; } /** Returns the italic correction of char c in PS point units. */ double TFM::getItalicCorr (int c) const { int index = charIndex(c); if (index < 0) return 0; index = (_charInfoTable[index] >> 10) & 0x3F; return double(_italicTable[index]) * _designSize; } dvisvgm-2.8.1/src/SourceInput.hpp0000664000175000017500000000452413510660062013710 00000000000000/************************************************************************* ** SourceInput.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SOURCEINPUT_HPP #define SOURCEINPUT_HPP #include #include /** Helper class to handle temporary files. */ class TemporaryFile { public: ~TemporaryFile () {close();} bool create (); bool opened () const {return _fd >= 0;} bool write (const char *buf, size_t len); bool close (); const std::string& path () const {return _path;} private: int _fd = -1; ///< file descriptor assigned to the temporary file std::string _path; ///< path to temporary file }; class SourceInput { public: explicit SourceInput (const std::string &fname) : _fname(fname) {} std::istream& getInputStream (bool showMessages=false); std::string getFileName () const; std::string getMessageFileName () const; std::string getFilePath () const; private: const std::string &_fname; ///< name of file to read from TemporaryFile _tmpfile; ///< temporary file used when reading from stdin std::ifstream _ifs; }; #endif dvisvgm-2.8.1/src/EllipticalArc.hpp0000664000175000017500000000603413536436422014147 00000000000000/************************************************************************* ** EllipticalArc.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include "Bezier.hpp" #include "BoundingBox.hpp" #include "Matrix.hpp" #include "Pair.hpp" class EllipticalArc { public: struct CenterParams { DPair center; ///< absolute coordinates of the center point double startAngle; ///< angle of start point relative to semi-major axis (in radians) double deltaAngle; ///< difference between angles of the start and end point (>0 if sweep flag is set) }; public: EllipticalArc (const DPair &start, double rx, double ry, double angle, bool laf, bool sweep, const DPair &end); EllipticalArc (const DPair ¢er, double rx, double ry, double rot, double startAngle, double deltaAngle); CenterParams getCenterParams () const; double rx () const {return _rx;} double ry () const {return _ry;} bool largeArc () const {return _largeArc;} bool sweepPositive () const {return _sweepPositive;} double rotationAngle () const {return _rotationAngle;} DPair startPoint () const {return _startPoint;} DPair endPoint () const {return _endPoint;} bool isStraightLine () const {return _rx < 1e-7 || _ry < 1e-7;} BoundingBox getBBox () const; void transform (const Matrix &matrix); std::vector approximate () const; private: double _rx, _ry; ///< length of semi-major and semi-minor axes double _rotationAngle; ///< rotation angle around center (in radians) bool _largeArc; ///< if true, the longer arc from start to end point is chosen, else the shorter one bool _sweepPositive; ///< if true, arc is drawn in direction of positive angles, else the opposite direction DPair _startPoint, _endPoint; ///< absolute coordinates of start and end point }; dvisvgm-2.8.1/src/macros.hpp0000664000175000017500000000373613510660062012720 00000000000000/************************************************************************* ** macros.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MACROS_HPP #define MACROS_HPP #define IMPLEMENT_ARITHMETIC_OPERATOR(class, op) \ inline class operator op (class a, const class &b) { \ return a op##= b; \ } #define IMPLEMENT_ARITHMETIC_OPERATOR2(class, scalar, op) \ inline class operator op (class a, scalar b) { \ return a op##= b; \ } #define IMPLEMENT_OUTPUT_OPERATOR(class) \ inline std::ostream& operator << (std::ostream &os, class obj) { \ return obj.write(os); \ } #endif dvisvgm-2.8.1/src/PsSpecialHandler.cpp0000664000175000017500000013420413561274402014610 00000000000000/************************************************************************* ** PsSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "EPSFile.hpp" #include "FileFinder.hpp" #include "FilePath.hpp" #include "FileSystem.hpp" #include "Message.hpp" #include "PathClipper.hpp" #include "PSPattern.hpp" #include "PSPreviewFilter.hpp" #include "PsSpecialHandler.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" #include "TensorProductPatch.hpp" #include "TriangularPatch.hpp" using namespace std; bool PsSpecialHandler::COMPUTE_CLIPPATHS_INTERSECTIONS = false; bool PsSpecialHandler::SHADING_SEGMENT_OVERLAP = false; int PsSpecialHandler::SHADING_SEGMENT_SIZE = 20; double PsSpecialHandler::SHADING_SIMPLIFY_DELTA = 0.01; PsSpecialHandler::PsSpecialHandler () : _psi(this), _actions(), _previewFilter(_psi), _xmlnode(), _savenode() { } PsSpecialHandler::~PsSpecialHandler () { _psi.setActions(nullptr); // ensure no further PS actions are performed } /** Initializes the PostScript handler. It's called by the first use of process(). The * deferred initialization speeds up the conversion of DVI files that doesn't contain * PS specials. */ void PsSpecialHandler::initialize () { if (_psSection == PS_NONE) { initgraphics(); // execute dvips prologue/header files for (const char *fname : {"tex.pro", "texps.pro", "special.pro", "color.pro"}) processHeaderFile(fname); // disable bop/eop operators to prevent side-effects by // unexpected bops/eops present in PS specials _psi.execute("\nTeXDict begin /bop{pop pop}def /eop{}def end "); _psSection = PS_HEADERS; // allow to process header specials now } } /** Set initial values of PS graphics state (see PS language reference (Red Book)), p. 612). */ void PsSpecialHandler::initgraphics () { _linewidth = 1; _linecap = _linejoin = 0; // butt end caps and miter joins _miterlimit = 4; _xmlnode = _savenode = nullptr; _opacityalpha = _shapealpha = 1; // fully opaque _blendmode = 0; // "normal" mode (no blending) _sx = _sy = _cos = 1.0; _pattern = nullptr; _currentcolor = Color::BLACK; _dashoffset = 0; _dashpattern.clear(); _path.clear(); _clipStack.clear(); } void PsSpecialHandler::processHeaderFile (const char *name) { if (const char *path = FileFinder::instance().lookup(name, false)) { ifstream ifs(path); _psi.execute(string("%%BeginProcSet: ")+name+" 0 0\n", false); _psi.execute(ifs, false); _psi.execute("%%EndProcSet\n", false); } else Message::wstream(true) << "PostScript header file " << name << " not found\n"; } void PsSpecialHandler::enterBodySection () { if (_psSection == PS_HEADERS) { _psSection = PS_BODY; // don't process any PS header code ostringstream oss; // process collected header code if (!_headerCode.empty()) { oss << "\nTeXDict begin @defspecial " << _headerCode << "\n@fedspecial end"; _headerCode.clear(); } // push dictionary "TeXDict" with dvips definitions on dictionary stack // and initialize basic dvips PostScript variables oss << "\nTeXDict begin 0 0 1000 72 72 () @start 0 0 moveto "; _psi.execute(oss.str(), false); // Check for information generated by preview.sty. If the tightpage options // was set, don't execute the bop-hook but allow the PS filter to read // the bbox data present at the beginning of the page. _psi.setFilter(&_previewFilter); _previewFilter.activate(); if (!_previewFilter.tightpage()) _psi.execute("userdict/bop-hook known{bop-hook}if\n", false); } } /** Move PS graphic position to current DVI location. */ void PsSpecialHandler::moveToDVIPos () { if (_actions) { const double x = _actions->getX(); const double y = _actions->getY(); ostringstream oss; oss << '\n' << x << ' ' << y << " moveto "; _psi.execute(oss.str()); _currentpoint = DPair(x, y); } } /** Executes a PS snippet and optionally synchronizes the DVI cursor position * with the current PS point. * @param[in] is stream to read the PS code from * @param[in] updatePos if true, move the DVI drawing position to the current PS point */ void PsSpecialHandler::executeAndSync (istream &is, bool updatePos) { if (_actions && _actions->getColor() != _currentcolor) { // update the PS graphics state if the color has been changed by a color special double r, g, b; _actions->getColor().getRGB(r, g, b); ostringstream oss; oss << '\n' << r << ' ' << g << ' ' << b << " setrgbcolor "; _psi.execute(oss.str(), false); } _psi.execute(is); if (updatePos) { // retrieve current PS position (stored in _currentpoint) _psi.execute("\nquerypos "); if (_actions) { _actions->setX(_currentpoint.x()); _actions->setY(_currentpoint.y()); } } } void PsSpecialHandler::preprocess (const string &prefix, istream &is, SpecialActions &actions) { initialize(); if (_psSection != PS_HEADERS) return; _actions = &actions; if (prefix == "!") { _headerCode += "\n"; _headerCode += string(istreambuf_iterator(is), istreambuf_iterator()); } else if (prefix == "header=") { // read and execute PS header file string fname; is >> fname; processHeaderFile(fname.c_str()); } } static string filename_suffix (const string &fname) { string ret; size_t pos = fname.rfind('.'); if (pos != string::npos) ret = util::tolower(fname.substr(pos+1)); return ret; } bool PsSpecialHandler::process (const string &prefix, istream &is, SpecialActions &actions) { // process PS headers only once (in prescan) if (prefix == "!" || prefix == "header=") return true; _actions = &actions; initialize(); if (_psSection != PS_BODY) enterBodySection(); if (prefix == "\"" || prefix == "pst:") { // read and execute literal PostScript code (isolated by a wrapping save/restore pair) moveToDVIPos(); _psi.execute("\n@beginspecial @setspecial "); executeAndSync(is, false); _psi.execute("\n@endspecial "); } else if (prefix == "psfile=" || prefix == "PSfile=" || prefix == "pdffile=") { if (_actions) { StreamInputReader in(is); string fname = in.getQuotedString(in.peek() == '"' ? "\"" : nullptr); fname = FileSystem::adaptPathSeperators(fname); FileType fileType = FileType::EPS; if (prefix == "pdffile") fileType = FileType::PDF; else { // accept selected non-PS files in psfile special string ext = filename_suffix(fname); if (ext == "pdf") fileType = FileType::PDF; else if (ext == "svg") fileType = FileType::SVG; else if (ext == "jpg" || ext == "jpeg" || ext == "png") fileType = FileType::BITMAP; } map attr; in.parseAttributes(attr, false); imgfile(fileType, fname, attr); } } else if (prefix == "ps::") { if (_actions) _actions->finishLine(); // reset DVI position on next DVI command if (is.peek() == '[') { // collect characters inside the brackets string code; for (int i=0; i < 9 && is.peek() != ']' && !is.eof(); ++i) code += char(is.get()); if (is.peek() == ']') code += char(is.get()); if (code == "[begin]" || code == "[nobreak]") { moveToDVIPos(); executeAndSync(is, true); } else { // no move to DVI position here if (code != "[end]") // PS array? _psi.execute(code); executeAndSync(is, true); } } else { // ps:: behaves like ps::[end] // no move to DVI position here executeAndSync(is, true); } } else { // ps: ... or PST: ... if (_actions) _actions->finishLine(); moveToDVIPos(); StreamInputReader in(is); if (in.check(" plotfile ")) { // ps: plotfile fname string fname = in.getString(); ifstream ifs(fname); if (ifs) _psi.execute(ifs); else Message::wstream(true) << "file '" << fname << "' not found in ps: plotfile\n"; } else { // ps: is almost identical to ps::[begin] but does // a final repositioning to the current DVI location executeAndSync(is, true); moveToDVIPos(); } } return true; } /** Handles a psfile/pdffile special which places an external EPS/PDF graphic * at the current DVI position. The lower left corner (llx,lly) of the * given bounding box is placed at the DVI position. * @param[in] filetype type of file to process (EPS or PDF) * @param[in] fname EPS/PDF file to be included * @param[in] attr attributes given with psfile/pdffile special */ void PsSpecialHandler::imgfile (FileType filetype, const string &fname, const map &attr) { // prevent warning about missing image file "/dev/null" which is // added by option "psfixbb" of the preview package if (fname == "/dev/null") return; map::const_iterator it; // bounding box of EPS figure in PS point units (lower left and upper right corner) double llx = (it = attr.find("llx")) != attr.end() ? stod(it->second) : 0; double lly = (it = attr.find("lly")) != attr.end() ? stod(it->second) : 0; double urx = (it = attr.find("urx")) != attr.end() ? stod(it->second) : 0; double ury = (it = attr.find("ury")) != attr.end() ? stod(it->second) : 0; int pageno = (it = attr.find("page")) != attr.end() ? stoi(it->second, nullptr, 10) : 1; if (filetype == FileType::BITMAP || filetype == FileType::SVG) swap(lly, ury); else if (filetype == FileType::PDF && llx == 0 && lly == 0 && urx == 0 && ury == 0) { BoundingBox pagebox = _psi.pdfPageBox(fname, pageno); if (pagebox.valid()) { llx = pagebox.minX(); lly = pagebox.minY(); urx = pagebox.maxX(); ury = pagebox.maxY(); } } // desired width and height of the untransformed figure in PS point units double rwi = (it = attr.find("rwi")) != attr.end() ? stod(it->second)/10.0 : -1; double rhi = (it = attr.find("rhi")) != attr.end() ? stod(it->second)/10.0 : -1; if (rwi == 0 || rhi == 0 || urx-llx == 0 || ury-lly == 0) return; // user transformations (default values chosen according to dvips manual) // order of transformations: rotate, scale, translate/offset double hoffset = (it = attr.find("hoffset")) != attr.end() ? stod(it->second) : 0; double voffset = (it = attr.find("voffset")) != attr.end() ? stod(it->second) : 0; // double hsize = (it = attr.find("hsize")) != attr.end() ? stod(it->second) : 612; // double vsize = (it = attr.find("vsize")) != attr.end() ? stod(it->second) : 792; double hscale = (it = attr.find("hscale")) != attr.end() ? stod(it->second) : 100; double vscale = (it = attr.find("vscale")) != attr.end() ? stod(it->second) : 100; double angle = (it = attr.find("angle")) != attr.end() ? stod(it->second) : 0; bool clipToBbox = (attr.find("clip") != attr.end()); // compute factors to scale the bounding box to width rwi and height rhi double sx = rwi/abs(llx-urx); double sy = rhi/abs(lly-ury); if (sx == 0 || sy == 0) return; if (sx < 0) sx = sy; // rwi attribute not set if (sy < 0) sy = sx; // rhi attribute not set if (sx < 0) sx = sy = 1.0; // neither rwi nor rhi set // save current DVI position double x = _actions->getX(); double y = _actions->getY(); // all following drawings are relative to (0,0) _actions->setX(0); _actions->setY(0); moveToDVIPos(); auto imgNode = createImageNode(filetype, fname, pageno, BoundingBox(llx, lly, urx, ury), clipToBbox); if (imgNode) { // has anything been drawn? Matrix matrix(1); if (filetype == FileType::EPS || filetype == FileType::PDF) sy = -sy; // adapt orientation of y-coordinates matrix.scale(sx, sy).rotate(-angle).scale(hscale/100, vscale/100); // apply transformation attributes matrix.translate(x+hoffset, y-voffset); // move image to current DVI position matrix.lmultiply(_actions->getMatrix()); // update bounding box BoundingBox bbox(0, 0, urx-llx, ury-lly); bbox.transform(matrix); _actions->embed(bbox); // insert element containing the image data matrix.rmultiply(TranslationMatrix(-llx, -lly)); // move lower left corner of image to origin if (!matrix.isIdentity()) imgNode->addAttribute("transform", matrix.toSVG()); _actions->svgTree().appendToPage(std::move(imgNode)); } // restore DVI position _actions->setX(x); _actions->setY(y); moveToDVIPos(); } /** Creates an XML element containing the image data depending on the file type. * @param[in] type file type of the image * @param[in] fname file name/path of image file * @param[in] pageno number of page to process (PDF only) * @param[in] bbox bounding box of the image * @param[in] clip if true, the image is clipped to its bounding box * @return pointer to the element or nullptr if there's no image data */ unique_ptr PsSpecialHandler::createImageNode (FileType type, const string &fname, int pageno, BoundingBox bbox, bool clip) { unique_ptr node; string pathstr; if (const char *path = FileFinder::instance().lookup(fname, false)) pathstr = FileSystem::adaptPathSeperators(path); if ((pathstr.empty() || !FileSystem::exists(pathstr)) && FileSystem::exists(fname)) pathstr = fname; if (pathstr.empty()) Message::wstream(true) << "file '" << fname << "' not found\n"; else if (type == FileType::BITMAP || type == FileType::SVG) { node = util::make_unique("image"); node->addAttribute("x", 0); node->addAttribute("y", 0); node->addAttribute("width", bbox.width()); node->addAttribute("height", bbox.height()); // Only reference the image with an absolute path if either an absolute path was given by the user // or a given plain filename is not present in the current working directory but was found through // the FileFinder, i.e. it's usually located somewhere in the texmf tree. string href = pathstr; if (!FilePath::isAbsolute(fname) && (fname.find('/') != string::npos || FilePath(fname).exists())) href = FilePath(pathstr).relative(FilePath(_actions->getSVGFilePath(pageno))); node->addAttribute("xlink:href", href); } else { // PostScript or PDF // clip image to its bounding box if flag 'clip' is given string rectclip; if (clip) rectclip = to_string(bbox.minX())+" "+to_string(bbox.minY())+" "+to_string(bbox.width())+" "+to_string(bbox.height())+" rectclip"; node = util::make_unique("g"); // put SVG nodes created from the EPS/PDF file in this group _xmlnode = node.get(); _psi.execute( "\n@beginspecial @setspecial" // enter special environment "/setpagedevice{@setpagedevice}def " // activate processing of operator "setpagedevice" "matrix setmatrix" // don't apply outer PS transformations "/FirstPage "+to_string(pageno)+" def" // set number of first page to convert (PDF only) "/LastPage "+to_string(pageno)+" def " // set number of last page to convert (PDF only) +rectclip+ // clip to bounding box (if requexted by attribute 'clip') "(" + pathstr + ")run " // execute file content "@endspecial " // leave special environment ); if (node->empty()) node.reset(nullptr); _xmlnode = nullptr; // append following elements to page group again } return node; } /** Apply transformation to width, height, and depth set by preview package. * @param[in] matrix transformation matrix to apply * @param[out] w width * @param[out] h height * @param[out] d depth * @return true if the baseline is still horizontal after the transformation */ static bool transform_box_extents (const Matrix &matrix, double &w, double &h, double &d) { DPair shift = matrix*DPair(0,0); // the translation component of the matrix DPair ex = matrix*DPair(1,0)-shift; DPair ey = matrix*DPair(0,1)-shift; if (ex.y() != 0 && ey.x() != 0) // rotation != mod 90 degrees? return false; // => non-horizontal baseline, can't compute meaningful extents if (ex.y() == 0) // horizontal scaling or skewing? w *= abs(ex.x()); if (ey.x()==0 || ex.y()==0) { // vertical scaling? if (ey.y() < 0) swap(h, d); double sy = abs(ey.y())/ey.length(); if (sy < 1e-8) h = d = 0; else { h *= abs(ey.y()/sy); d *= abs(ey.y()/sy); } } return true; } void PsSpecialHandler::dviEndPage (unsigned, SpecialActions &actions) { BoundingBox bbox; if (_previewFilter.getBoundingBox(bbox)) { // is there any data written by preview package? double w=0, h=0, d=0; if (actions.getBBoxFormatString() == "preview" || actions.getBBoxFormatString() == "min") { if (actions.getBBoxFormatString() == "preview") { w = max(0.0, _previewFilter.width()); h = max(0.0, _previewFilter.height()); d = max(0.0, _previewFilter.depth()); actions.bbox() = bbox; Message::mstream() << "\napplying bounding box set by"; } else { w = actions.bbox().width(); h = max(0.0, -actions.bbox().minY()); d = max(0.0, actions.bbox().maxY()); Message::mstream() << "\ncomputing extents based on data set by"; } Message::mstream() << " preview package (version " << _previewFilter.version() << ")\n"; // apply page transformations to box extents Matrix pagetrans = actions.getPageTransformation(); bool isBaselineHorizontal = transform_box_extents(pagetrans, w, h, d); actions.bbox().lock(); if (!isBaselineHorizontal) Message::mstream() << "can't determine height, width, and depth due to non-horizontal baseline\n"; else { const double bp2pt = 72.27/72.0; Message::mstream() << "width=" << XMLString(w*bp2pt) << "pt, " "height=" << XMLString(h*bp2pt) << "pt, " "depth=" << XMLString(d*bp2pt) << "pt\n"; } #if 0 auto rect = util::make_unique("rect"); rect->addAttribute("x", actions.bbox().minX()); rect->addAttribute("y", actions.bbox().minY()); rect->addAttribute("width", w); rect->addAttribute("height", h+d); rect->addAttribute("fill", "none"); rect->addAttribute("stroke", "red"); rect->addAttribute("stroke-width", "0.1"); actions.appendToPage(std::move(rect)); if (d > 0) { auto line = util::make_unique("line"); line->addAttribute("x1", actions.bbox().minX()); line->addAttribute("y1", actions.bbox().minY()+h); line->addAttribute("x2", actions.bbox().maxX()); line->addAttribute("y2", actions.bbox().minY()+h); line->addAttribute("stroke", "blue"); line->addAttribute("stroke-width", "0.1"); actions.appendToPage(std::move(line)); } #endif } } // close dictionary TeXDict and execute end-hook if defined if (_psSection == PS_BODY) { _psi.execute("\nend userdict/end-hook known{end-hook}if initgraphics "); initgraphics(); // reset graphics state to default values _psSection = PS_HEADERS; } } /////////////////////////////////////////////////////// void PsSpecialHandler::setpagedevice (std::vector &p) { _linewidth = 1; _linecap = _linejoin = 0; // butt end caps and miter joins _miterlimit = 4; _opacityalpha = _shapealpha = 1; // fully opaque _blendmode = 0; // "normal" mode (no blending) _sx = _sy = _cos = 1.0; _pattern = nullptr; _currentcolor = Color::BLACK; _dashoffset = 0; _dashpattern.clear(); _path.clear(); } void PsSpecialHandler::gsave (vector&) { _clipStack.dup(); } void PsSpecialHandler::grestore (vector&) { _clipStack.pop(); } void PsSpecialHandler::grestoreall (vector&) { _clipStack.pop(-1, true); } void PsSpecialHandler::save (vector &p) { _clipStack.dup(static_cast(p[0])); } void PsSpecialHandler::restore (vector &p) { _clipStack.pop(static_cast(p[0])); } void PsSpecialHandler::moveto (vector &p) { _path.moveto(p[0], p[1]); } void PsSpecialHandler::lineto (vector &p) { _path.lineto(p[0], p[1]); } void PsSpecialHandler::curveto (vector &p) { _path.cubicto(p[0], p[1], p[2], p[3], p[4], p[5]); } void PsSpecialHandler::closepath (vector&) { _path.closepath(); } static string css_blendmode_name (int mode) { static const array modenames = {{ "normal", "multiply", "screen", "overlay", "soft-light", "hard-light", "color-dodge", "color-burn", "darken", "lighten", "difference", "exclusion", "hue", "saturation", "color", "luminosity" }}; if (mode < 0 || mode > 15) return ""; return modenames[mode]; } /** Draws the current path recorded by previously executed path commands (moveto, lineto,...). * @param[in] p not used */ void PsSpecialHandler::stroke (vector &p) { _path.removeRedundantCommands(); if ((_path.empty() && !_clipStack.prependedPath()) || !_actions) return; BoundingBox bbox; if (!_actions->getMatrix().isIdentity()) { _path.transform(_actions->getMatrix()); if (!_xmlnode) bbox.transform(_actions->getMatrix()); } if (_clipStack.prependedPath()) _path.prepend(*_clipStack.prependedPath()); unique_ptr path; Pair point; if (_path.isDot(point)) { // zero-length path? if (_linecap == 1) { // round line ends? => draw dot double x = point.x(); double y = point.y(); double r = _linewidth/2.0; path = util::make_unique("circle"); path->addAttribute("cx", x); path->addAttribute("cy", y); path->addAttribute("r", r); path->addAttribute("fill", _actions->getColor().svgColorString()); bbox = BoundingBox(x-r, y-r, x+r, y+r); } } else { // compute bounding box _path.computeBBox(bbox); bbox.expand(_linewidth/2); ostringstream oss; _path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); path = util::make_unique("path"); path->addAttribute("d", oss.str()); path->addAttribute("stroke", _actions->getColor().svgColorString()); path->addAttribute("fill", "none"); if (_linewidth != 1) path->addAttribute("stroke-width", _linewidth); if (_miterlimit != 4) path->addAttribute("stroke-miterlimit", _miterlimit); if (_linecap > 0) // default value is "butt", no need to set it explicitly path->addAttribute("stroke-linecap", _linecap == 1 ? "round" : "square"); if (_linejoin > 0) // default value is "miter", no need to set it explicitly path->addAttribute("stroke-linejoin", _linecap == 1 ? "round" : "bevel"); if (_opacityalpha < 1 || _shapealpha < 1) path->addAttribute("stroke-opacity", _opacityalpha*_shapealpha); if (_blendmode > 0 && _blendmode < 16) path->addAttribute("style", "mix-blend-mode:"+css_blendmode_name(_blendmode)); if (!_dashpattern.empty()) { string patternStr; for (double dashValue : _dashpattern) patternStr += XMLString(dashValue)+","; patternStr.pop_back(); path->addAttribute("stroke-dasharray", patternStr); if (_dashoffset != 0) path->addAttribute("stroke-dashoffset", _dashoffset); } } if (path && _clipStack.path()) { // assign clipping path and clip bounding box path->addAttribute("clip-path", XMLString("url(#clip")+XMLString(_clipStack.topID())+")"); BoundingBox clipbox; _clipStack.path()->computeBBox(clipbox); bbox.intersect(clipbox); _clipStack.removePrependedPath(); } if (_xmlnode) _xmlnode->append(std::move(path)); else { _actions->svgTree().appendToPage(std::move(path)); _actions->embed(bbox); } _path.clear(); } /** Draws a closed path filled with the current color. * @param[in] p not used * @param[in] evenodd true: use even-odd fill algorithm, false: use nonzero fill algorithm */ void PsSpecialHandler::fill (vector &p, bool evenodd) { _path.removeRedundantCommands(); if ((_path.empty() && !_clipStack.prependedPath()) || !_actions) return; // compute bounding box BoundingBox bbox; _path.computeBBox(bbox); if (!_actions->getMatrix().isIdentity()) { _path.transform(_actions->getMatrix()); if (!_xmlnode) bbox.transform(_actions->getMatrix()); } if (_clipStack.prependedPath()) _path.prepend(*_clipStack.prependedPath()); ostringstream oss; _path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); unique_ptr path = util::make_unique("path"); path->addAttribute("d", oss.str()); if (_pattern) path->addAttribute("fill", XMLString("url(#")+_pattern->svgID()+")"); else if (_actions->getColor() != Color::BLACK || _savenode) path->addAttribute("fill", _actions->getColor().svgColorString()); if (_clipStack.path()) { // assign clipping path and clip bounding box path->addAttribute("clip-path", XMLString("url(#clip")+XMLString(_clipStack.topID())+")"); BoundingBox clipbox; _clipStack.path()->computeBBox(clipbox); bbox.intersect(clipbox); _clipStack.removePrependedPath(); } if (evenodd) // SVG default fill rule is "nonzero" algorithm path->addAttribute("fill-rule", "evenodd"); if (_opacityalpha < 1 || _shapealpha < 1) path->addAttribute("fill-opacity", _opacityalpha*_shapealpha); if (_blendmode > 0 && _blendmode < 16) path->addAttribute("style", "mix-blend-mode:"+css_blendmode_name(_blendmode)); if (_xmlnode) _xmlnode->append(std::move(path)); else { _actions->svgTree().appendToPage(std::move(path)); _actions->embed(bbox); } _path.clear(); } /** Creates a Matrix object from a given sequence of 6 double values. * The given values must be arranged in PostScript matrix order. * @param[in] v vector containing the matrix values * @param[in] startindex vector index of first component * @param[out] matrix the generated matrix */ static void create_matrix (vector &v, int startindex, Matrix &matrix) { // Ensure vector p has 6 elements. If necessary, add missing ones // using corresponding values of the identity matrix. if (v.size()-startindex < 6) { v.resize(6+startindex); for (size_t i=v.size()-startindex; i < 6; ++i) v[i+startindex] = (i%3 ? 0 : 1); } // PS matrix [a b c d e f] equals ((a,b,0),(c,d,0),(e,f,1)). // Since PS uses left multiplications, we must transpose and reorder // the matrix to ((a,c,e),(b,d,f),(0,0,1)). This is done by the // following swaps. swap(v[startindex+1], v[startindex+2]); // => (a, c, b, d, e, f) swap(v[startindex+2], v[startindex+4]); // => (a, c, e, d, b, f) swap(v[startindex+3], v[startindex+4]); // => (a, c, e, b, d, f) matrix.set(v, startindex); } /** Starts the definition of a new fill pattern. This operator * expects 9 parameters for tiling patterns (see PS reference 4.9.2): * @param[in] p the 9 values defining a tiling pattern (see PS reference 4.9.2): * 0: pattern type (0:none, 1:tiling, 2:shading) * 1: pattern ID * 2-5: lower left and upper right coordinates of pattern box * 6: horizontal distance of adjacent tiles * 7: vertical distance of adjacent tiles * 8: paint type (1: colored pattern, 2: uncolored pattern) * 9-14: pattern matrix */ void PsSpecialHandler::makepattern (vector &p) { int pattern_type = static_cast(p[0]); int id = static_cast(p[1]); switch (pattern_type) { case 0: // pattern definition completed if (_savenode) { _xmlnode = _savenode; _savenode = nullptr; } break; case 1: { // tiling pattern BoundingBox bbox(p[2], p[3], p[4], p[5]); const double &xstep=p[6], &ystep=p[7]; // horizontal and vertical distance of adjacent tiles int paint_type = static_cast(p[8]); Matrix matrix; // transformation matrix given together with pattern definition create_matrix(p, 9, matrix); matrix.lmultiply(_actions->getMatrix()); unique_ptr pattern; if (paint_type == 1) pattern = util::make_unique(id, bbox, matrix, xstep, ystep); else pattern = util::make_unique(id, bbox, matrix, xstep, ystep); _savenode = _xmlnode; _xmlnode = pattern->getContainerNode(); // insert the following SVG elements into this node _patterns[id] = std::move(pattern); break; } case 2: { // define a shading pattern } } } /** Selects a previously defined fill pattern. * 0: pattern ID * 1-3: (optional) RGB values for uncolored tiling patterns * further parameters depend on the pattern type */ void PsSpecialHandler::setpattern (vector &p) { int patternID = static_cast(p[0]); Color color; if (p.size() == 4) color.setRGB(p[1], p[2], p[3]); auto it = _patterns.find(patternID); if (it == _patterns.end()) _pattern = nullptr; else { if (auto pattern = dynamic_cast(it->second.get())) pattern->setColor(color); it->second->apply(*_actions); if (auto pattern = dynamic_cast(it->second.get())) _pattern = pattern; else _pattern = nullptr; } } /** Clears the current clipping path. * @param[in] p not used */ void PsSpecialHandler::initclip (vector &) { _clipStack.pushEmptyPath(); } /** Assigns the current clipping path to the graphics path. */ void PsSpecialHandler::clippath (std::vector&) { if (!_clipStack.empty()) _clipStack.setPrependedPath(); } /** Assigns a new clipping path to the graphics state using the current path. * If the graphics state already contains a clipping path, the new one is * computed by intersecting the current clipping path with the current graphics * path (see PS language reference, 3rd edition, pp. 193, 542) * @param[in] p not used * @param[in] evenodd true: use even-odd fill algorithm, false: use nonzero fill algorithm */ void PsSpecialHandler::clip (vector&, bool evenodd) { clip(_path, evenodd); } /** Assigns a new clipping path to the graphics state using the current path. * If the graphics state already contains a clipping path, the new one is * computed by intersecting the current one with the given path. * @param[in] path path used to restrict the clipping region * @param[in] evenodd true: use even-odd fill algorithm, false: use nonzero fill algorithm */ void PsSpecialHandler::clip (Path path, bool evenodd) { // when this method is called, _path contains the clipping path if (path.empty() || !_actions) return; Path::WindingRule windingRule = evenodd ? Path::WindingRule::EVEN_ODD : Path::WindingRule::NON_ZERO; path.setWindingRule(windingRule); if (!_actions->getMatrix().isIdentity()) path.transform(_actions->getMatrix()); if (_clipStack.prependedPath()) path.prepend(*_clipStack.prependedPath()); int oldID = _clipStack.topID(); ostringstream oss; bool pathReplaced; if (!COMPUTE_CLIPPATHS_INTERSECTIONS || oldID < 1) { pathReplaced = _clipStack.replace(path); path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); } else { // compute the intersection of the current clipping path with the current graphics path const Path *oldPath = _clipStack.path(); Path intersectedPath(windingRule); PathClipper clipper; clipper.intersect(*oldPath, path, intersectedPath); pathReplaced = _clipStack.replace(intersectedPath); intersectedPath.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); } if (pathReplaced) { auto pathElem = util::make_unique("path"); pathElem->addAttribute("d", oss.str()); if (evenodd) pathElem->addAttribute("clip-rule", "evenodd"); int newID = _clipStack.topID(); auto clipElem = util::make_unique("clipPath"); clipElem->addAttribute("id", XMLString("clip")+XMLString(newID)); if (!COMPUTE_CLIPPATHS_INTERSECTIONS && oldID) clipElem->addAttribute("clip-path", XMLString("url(#clip")+XMLString(oldID)+")"); clipElem->append(std::move(pathElem)); _actions->svgTree().appendToDefs(std::move(clipElem)); } } /** Applies a gradient fill to the current graphics path. Vector p contains the shading parameters * in the following order: * - shading type (6=Coons, 7=tensor product) * - color space (1=gray, 3=rgb, 4=cmyk) * - 1.0 followed by the background color components based on the declared color space, or 0.0 * - 1.0 followed by the bounding box coordinates, or 0.0 * - geometry and color parameters depending on the shading type */ void PsSpecialHandler::shfill (vector ¶ms) { if (params.size() < 9) return; // collect common data relevant for all shading types int shadingTypeID = static_cast(params[0]); ColorSpace colorSpace = Color::ColorSpace::RGB; switch (static_cast(params[1])) { case 1: colorSpace = Color::ColorSpace::GRAY; break; case 3: colorSpace = Color::ColorSpace::RGB; break; case 4: colorSpace = Color::ColorSpace::CMYK; break; } VectorIterator it(params); it += 2; // skip shading type and color space // Get color to fill the whole mesh area before drawing the gradient colors on top of that background. // This is an optional parameter to shfill. bool bgcolorGiven = static_cast(*it++); Color bgcolor; if (bgcolorGiven) bgcolor.set(colorSpace, it); // Get clipping rectangle to limit the drawing area of the gradient mesh. // This is an optional parameter to shfill too. bool bboxGiven = static_cast(*it++); if (bboxGiven) { // bounding box given Path bboxPath; const double &x1 = *it++; const double &y1 = *it++; const double &x2 = *it++; const double &y2 = *it++; bboxPath.moveto(x1, y1); bboxPath.lineto(x2, y1); bboxPath.lineto(x2, y2); bboxPath.lineto(x1, y2); bboxPath.closepath(); clip(bboxPath, false); } try { if (shadingTypeID == 5) processLatticeTriangularPatchMesh(colorSpace, it); else processSequentialPatchMesh(shadingTypeID, colorSpace, it); } catch (ShadingException &e) { Message::estream(false) << "PostScript error: " << e.what() << '\n'; it.invalidate(); // stop processing the remaining patch data } catch (IteratorException &e) { Message::estream(false) << "PostScript error: incomplete shading data\n"; } if (bboxGiven) _clipStack.pop(); } /** Reads position and color data of a single shading patch from the data vector. * @param[in] shadingTypeID PS shading type ID identifying the format of the subsequent patch data * @param[in] edgeflag edge flag specifying how to connect the current patch to the preceding one * @param[in] cspace color space used to compute the color gradient * @param[in,out] it iterator used to sequentially access the patch data * @param[out] points the points defining the geometry of the patch * @param[out] colors the colors assigned to the vertices of the patch */ static void read_patch_data (ShadingPatch &patch, int edgeflag, VectorIterator &it, vector &points, vector &colors) { // number of control points and colors required to define a single patch int numPoints = patch.numPoints(edgeflag); int numColors = patch.numColors(edgeflag); points.resize(numPoints); colors.resize(numColors); if (patch.psShadingType() == 4) { // format of a free-form triangular patch definition, where eN denotes // the edge of the corresponding vertex: // edge flag = 0, x1, y1, {color1}, e2, x2, y2, {color2}, e3, x3, y3, {color3} // edge flag > 0, x1, y1, {color1} for (int i=0; i < numPoints; i++) { if (i > 0) ++it; // skip redundant edge flag from free-form triangular patch double x = *it++; double y = *it++; points[i] = DPair(x, y); colors[i].set(patch.colorSpace(), it); } } else if (patch.psShadingType() == 6 || patch.psShadingType() == 7) { // format of each Coons/tensor product patch definition: // edge flag = 0, x1, y1, ... , xn, yn, {color1}, {color2}, {color3}, {color4} // edge flag > 0, x5, y5, ... , xn, yn, {color3}, {color4} for (int i=0; i < numPoints; i++) { double x = *it++; double y = *it++; points[i] = DPair(x, y); } for (int i=0; i < numColors; i++) colors[i].set(patch.colorSpace(), it); } } class ShadingCallback : public ShadingPatch::Callback { public: ShadingCallback (SpecialActions &actions, XMLElement *parent, int clippathID) : _actions(actions) { auto group = util::make_unique("g"); _group = group.get(); if (parent) parent->append(std::move(group)); else actions.svgTree().appendToPage(std::move(group)); if (clippathID > 0) _group->addAttribute("clip-path", XMLString("url(#clip")+XMLString(clippathID)+")"); } void patchSegment (GraphicsPath &path, const Color &color) override { if (!_actions.getMatrix().isIdentity()) path.transform(_actions.getMatrix()); // draw a single patch segment ostringstream oss; path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); auto pathElem = util::make_unique("path"); pathElem->addAttribute("d", oss.str()); pathElem->addAttribute("fill", color.svgColorString()); _group->append(std::move(pathElem)); } private: SpecialActions &_actions; XMLElement *_group; }; /** Handle all patch meshes whose patches and their connections can be processed sequentially. * This comprises free-form triangular, Coons, and tensor-product patch meshes. */ void PsSpecialHandler::processSequentialPatchMesh (int shadingTypeID, ColorSpace colorSpace, VectorIterator &it) { unique_ptr previousPatch; while (it.valid()) { int edgeflag = static_cast(*it++); vector points; vector colors; unique_ptr patch = ShadingPatch::create(shadingTypeID, colorSpace); read_patch_data(*patch, edgeflag, it, points, colors); patch->setPoints(points, edgeflag, previousPatch.get()); patch->setColors(colors, edgeflag, previousPatch.get()); ShadingCallback callback(*_actions, _xmlnode, _clipStack.topID()); #if 0 if (bgcolorGiven) { // fill whole patch area with given background color GraphicsPath outline = patch->getBoundaryPath(); callback.patchSegment(outline, bgcolor); } #endif patch->approximate(SHADING_SEGMENT_SIZE, SHADING_SEGMENT_OVERLAP, SHADING_SIMPLIFY_DELTA, callback); if (!_xmlnode) { // update bounding box BoundingBox bbox = patch->getBBox(); bbox.transform(_actions->getMatrix()); _actions->embed(bbox); } previousPatch = std::move(patch); } } void PsSpecialHandler::processLatticeTriangularPatchMesh (ColorSpace colorSpace, VectorIterator &it) { int verticesPerRow = static_cast(*it++); if (verticesPerRow < 2) return; struct PatchVertex { DPair point; Color color; }; // hold two adjacent rows of vertices and colors vector row1(verticesPerRow); vector row2(verticesPerRow); vector *rowptr1 = &row1; vector *rowptr2 = &row2; // read data of first row for (int i=0; i < verticesPerRow; i++) { PatchVertex &vertex = (*rowptr1)[i]; vertex.point.x(*it++); vertex.point.y(*it++); vertex.color.set(colorSpace, it); } LatticeTriangularPatch patch(colorSpace); ShadingCallback callback(*_actions, _xmlnode, _clipStack.topID()); while (it.valid()) { // read next row for (int i=0; i < verticesPerRow; i++) { PatchVertex &vertex = (*rowptr2)[i]; vertex.point.x(*it++); vertex.point.y(*it++); vertex.color.set(colorSpace, it); } // create triangular patches for the vertices of the two rows for (int i=0; i < verticesPerRow-1; i++) { const PatchVertex &v1 = (*rowptr1)[i], &v2 = (*rowptr1)[i+1]; const PatchVertex &v3 = (*rowptr2)[i], &v4 = (*rowptr2)[i+1]; patch.setPoints(v1.point, v2.point, v3.point); patch.setColors(v1.color, v2.color, v3.color); patch.approximate(SHADING_SEGMENT_SIZE, SHADING_SEGMENT_OVERLAP, SHADING_SIMPLIFY_DELTA, callback); patch.setPoints(v2.point, v3.point, v4.point); patch.setColors(v2.color, v3.color, v4.color); patch.approximate(SHADING_SEGMENT_SIZE, SHADING_SEGMENT_OVERLAP, SHADING_SIMPLIFY_DELTA, callback); } swap(rowptr1, rowptr2); } } /** Clears current path. */ void PsSpecialHandler::newpath (vector &p) { bool calledByNewpathOp = (p[0] > 0); if (calledByNewpathOp) // function triggered by PS operator 'newpath'? _clipStack.removePrependedPath(); _path.clear(); } void PsSpecialHandler::setmatrix (vector &p) { if (_actions) { Matrix m; create_matrix(p, 0, m); _actions->setMatrix(m); } } // In contrast to SVG, PostScript transformations are applied in // reverse order (M' = T*M). Thus, the transformation matrices must be // left-multiplied in the following methods scale(), translate() and rotate(). void PsSpecialHandler::scale (vector &p) { if (_actions) { Matrix m = _actions->getMatrix(); ScalingMatrix s(p[0], p[1]); m.rmultiply(s); _actions->setMatrix(m); } } void PsSpecialHandler::translate (vector &p) { if (_actions) { Matrix m = _actions->getMatrix(); TranslationMatrix t(p[0], p[1]); m.rmultiply(t); _actions->setMatrix(m); } } void PsSpecialHandler::rotate (vector &p) { if (_actions) { Matrix m = _actions->getMatrix(); RotationMatrix r(p[0]); m.rmultiply(r); _actions->setMatrix(m); } } void PsSpecialHandler::setgray (vector &p) { _pattern = nullptr; _currentcolor.setGray(p[0]); if (_actions) _actions->setColor(_currentcolor); } void PsSpecialHandler::setrgbcolor (vector &p) { _pattern= nullptr; _currentcolor.setRGB(p[0], p[1], p[2]); if (_actions) _actions->setColor(_currentcolor); } void PsSpecialHandler::setcmykcolor (vector &p) { _pattern = nullptr; _currentcolor.setCMYK(p[0], p[1], p[2], p[3]); if (_actions) _actions->setColor(_currentcolor); } void PsSpecialHandler::sethsbcolor (vector &p) { _pattern = nullptr; _currentcolor.setHSB(p[0], p[1], p[2]); if (_actions) _actions->setColor(_currentcolor); } /** Sets the dash parameters used for stroking. * @param[in] p dash pattern array m1,...,mn plus trailing dash offset */ void PsSpecialHandler::setdash (vector &p) { _dashpattern.clear(); for (size_t i=0; i < p.size()-1; i++) _dashpattern.push_back(scale(p[i])); _dashoffset = scale(p.back()); } /** This method is called by the PSInterpreter if an PS operator has been executed. */ void PsSpecialHandler::executed () { if (_actions) _actions->progress("ps"); } /** This method is called by PSInterpreter if the status of the output devices has changed. * @param[in] p 1 if output device is the nulldevice, 1 otherwise */ void PsSpecialHandler::setnulldevice (vector &p) { if (_actions) { if (p[0] != 0) _actions->lockOutput(); // prevent further SVG output else _actions->unlockOutput(); // enable SVG output again } } //////////////////////////////////////////// void PsSpecialHandler::ClippingStack::pushEmptyPath () { if (!_stack.empty()) _stack.emplace(Entry()); } void PsSpecialHandler::ClippingStack::push (const Path &path, int saveID) { shared_ptr prependedPath; if (!_stack.empty()) prependedPath = _stack.top().prependedPath; if (path.empty()) _stack.emplace(Entry(saveID)); else _stack.emplace(Entry(path, ++_maxID, saveID)); _stack.top().prependedPath = prependedPath; } /** Pops a single or several elements from the clipping stack. * The method distinguishes between the following cases: * 1) saveID < 0 and grestoreall == false: * pop top element if it was pushed by gsave (its saveID is < 0 as well) * 2) saveID < 0 and grestoreall == true * repeat popping until stack is empty or the top element was pushed * by save (its saveID is >= 0) * 3) saveID >= 0: * pop all elements until the saveID of the top element equals parameter saveID */ void PsSpecialHandler::ClippingStack::pop (int saveID, bool grestoreall) { if (_stack.empty()) return; if (saveID < 0) { // grestore? if (_stack.top().saveID < 0) // pushed by 'gsave'? _stack.pop(); // pop all further elements pushed by 'gsave' if grestoreall == true while (grestoreall && !_stack.empty() && _stack.top().saveID < 0) _stack.pop(); } else { // pop elements pushed by 'gsave' while (!_stack.empty() && _stack.top().saveID != saveID) _stack.pop(); // pop element pushed by 'save' if (!_stack.empty()) _stack.pop(); } } /** Returns a pointer to the path on top of the stack, or 0 if the stack is empty. */ const PsSpecialHandler::Path* PsSpecialHandler::ClippingStack::path () const { return _stack.empty() ? nullptr : _stack.top().path.get(); } /** Returns a pointer to the path on top of the stack, or 0 if the stack is empty. */ const PsSpecialHandler::Path* PsSpecialHandler::ClippingStack::prependedPath () const { return _stack.empty() ? nullptr : _stack.top().prependedPath.get(); } void PsSpecialHandler::ClippingStack::removePrependedPath () { if (!_stack.empty()) _stack.top().prependedPath = nullptr; } /** Pops all elements from the stack. */ void PsSpecialHandler::ClippingStack::clear() { while (!_stack.empty()) _stack.pop(); } /** Replaces the top path by a new one. * @param[in] path new path to put on the stack * @return true if the new path differs from the previous one */ bool PsSpecialHandler::ClippingStack::replace (const Path &path) { if (_stack.empty()) push(path, -1); else if (_stack.top().path && path == *_stack.top().path) return false; else { _stack.top().path = make_shared(path); _stack.top().pathID = ++_maxID; } return true; } /** Duplicates the top element, i.e. the top element is pushed again. */ void PsSpecialHandler::ClippingStack::dup (int saveID) { _stack.emplace(_stack.empty() ? Entry() : _stack.top()); _stack.top().saveID = saveID; } void PsSpecialHandler::ClippingStack::setPrependedPath () { if (!_stack.empty()) _stack.top().prependedPath = _stack.top().path; } vector PsSpecialHandler::prefixes() const { vector pfx { "header=", // read and execute PS header file prior to the following PS statements "pdffile=", // process PDF file "psfile=", // read and execute PS file "PSfile=", // dito "ps:", // execute literal PS code wrapped by @beginspecial and @endspecial "ps::", // execute literal PS code without additional adaption of the drawing position "!", // execute literal PS header code following this prefix "\"", // execute literal PS code following this prefix "pst:", // dito "PST:", // same as "ps:" }; return pfx; } dvisvgm-2.8.1/src/HyperlinkManager.cpp0000664000175000017500000002311513553267757014705 00000000000000/************************************************************************* ** HyperlinkManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "HyperlinkManager.hpp" #include "Message.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" #include "utility.hpp" #include "XMLNode.hpp" using namespace std; // variable to select the link marker variant (none, underlined, boxed, or colored background) HyperlinkManager::MarkerType HyperlinkManager::MARKER_TYPE = MarkerType::LINE; Color HyperlinkManager::LINK_BGCOLOR; Color HyperlinkManager::LINK_LINECOLOR; HyperlinkManager::ColorSource HyperlinkManager::COLORSOURCE = ColorSource::DEFAULT; HyperlinkManager& HyperlinkManager::instance () { static HyperlinkManager instance; return instance; } void HyperlinkManager::addHrefAnchor (const string &uri) { if (uri.empty() || uri[0] != '#') return; string name = uri.substr(1); auto it = _namedAnchors.find(name); if (it != _namedAnchors.end()) // anchor already defined? it->second.referenced = true; else { int id = static_cast(_namedAnchors.size())+1; _namedAnchors.emplace(name, NamedAnchor(0, -id, 0, true)); } } void HyperlinkManager::addNameAchor (const string &name, int pageno) { if (name.empty()) return; auto it = _namedAnchors.find(name); if (it == _namedAnchors.end()) { // anchor completely undefined? int id = static_cast(_namedAnchors.size())+1; _namedAnchors.emplace(name, NamedAnchor(pageno, id, 0)); } else if (it->second.id >= 0) // anchor already defined? Message::wstream(true) << "named hyperref anchor '" << name << "' redefined\n"; else { // anchor referenced but not defined yet? it->second.id *= -1; it->second.pageno = pageno; } } void HyperlinkManager::setActiveNameAnchor (const string &name, SpecialActions &actions) { auto it = _namedAnchors.find(name); if (it != _namedAnchors.end()) { closeAnchor(actions); it->second.pos = actions.getY(); _anchorType = AnchorType::NAME; } } void HyperlinkManager::createLink (string uri, SpecialActions &actions) { closeAnchor(actions); string name; if (uri[0] == '#') { // reference to named anchor? name = uri.substr(1); auto it = _namedAnchors.find(name); if (it == _namedAnchors.end() || it->second.id < 0) Message::wstream(true) << "reference to undefined anchor '" << name << "'\n"; else { int id = it->second.id; uri = "#loc"+XMLString(id); if (actions.getCurrentPageNumber() != it->second.pageno) { ostringstream oss; oss << actions.getSVGFilePath(it->second.pageno).relative() << uri; uri = oss.str(); } } } if (!_base.empty() && uri.find("://") != string::npos) { if (*_base.rbegin() != '/' && uri[0] != '/' && uri[0] != '#') uri = "/" + uri; uri = _base + uri; } auto anchorNode = util::make_unique("a"); anchorNode->addAttribute("xlink:href", uri); anchorNode->addAttribute("xlink:title", XMLString(name.empty() ? uri : name, false)); actions.svgTree().pushPageContext(std::move(anchorNode)); actions.bbox("{anchor}", true); // start computing the bounding box of the linked area _depthThreshold = actions.getDVIStackDepth(); _anchorType = AnchorType::HREF; } void HyperlinkManager::closeAnchor (SpecialActions &actions) { if (_anchorType == AnchorType::HREF) { markLinkedBox(actions); actions.svgTree().popPageContext(); _depthThreshold = 0; } _anchorType = AnchorType::NONE; } void HyperlinkManager::checkNewLine (SpecialActions &actions) { if (_anchorType == AnchorType::NONE) return; // Start a new box if the current depth of the DVI stack underruns // the initial threshold which indicates a line break. if (actions.getDVIStackDepth() < _depthThreshold) { markLinkedBox(actions); _depthThreshold = actions.getDVIStackDepth(); actions.bbox("{anchor}", true); // start a new box on the new line } } /** Marks a single rectangular area of the linked part of the document with a line or * a box so that it's noticeable by the user. Additionally, an invisible rectangle is * placed over this area in order to avoid flickering of the mouse cursor when moving * it over the hyperlinked area. */ void HyperlinkManager::markLinkedBox (SpecialActions &actions) { const BoundingBox &bbox = actions.bbox("{anchor}"); if (bbox.width() > 0 && bbox.height() > 0) { // does the bounding box extend in both dimensions? if (MARKER_TYPE != MarkerType::NONE) { const double linewidth = _linewidth >= 0 ? _linewidth : min(0.5, bbox.height()/15); auto rect = util::make_unique("rect"); double x = bbox.minX(); double y = bbox.maxY()+linewidth; double w = bbox.width(); double h = linewidth; const Color linecolor = COLORSOURCE == ColorSource::DEFAULT ? actions.getColor() : LINK_LINECOLOR; if (MARKER_TYPE == MarkerType::LINE) rect->addAttribute("fill", linecolor.svgColorString()); else { const double offset = _linewidth < 0 ? linewidth : 0 ; x -= offset; y = bbox.minY()-offset; w += 2*offset; h += bbox.height()+offset; if (MARKER_TYPE == MarkerType::BGCOLOR) { rect->addAttribute("fill", LINK_BGCOLOR.svgColorString()); if (COLORSOURCE != ColorSource::DEFAULT) { rect->addAttribute("stroke", linecolor.svgColorString()); rect->addAttribute("stroke-width", linewidth); } } else { // LM_BOX rect->addAttribute("fill", "none"); rect->addAttribute("stroke", linecolor.svgColorString()); rect->addAttribute("stroke-width", linewidth); } } rect->addAttribute("x", x); rect->addAttribute("y", y); rect->addAttribute("width", w); rect->addAttribute("height", h); actions.svgTree().prependToPage(std::move(rect)); if (MARKER_TYPE == MarkerType::BOX || MARKER_TYPE == MarkerType::BGCOLOR) { // slightly enlarge the boxed area x -= linewidth/2; y -= linewidth/2; w += linewidth; h += linewidth; } actions.embed(BoundingBox(x, y, x+w, y+h)); } // Create an invisible rectangle around the linked area so that it's easier to access. // This is only necessary when using paths rather than real text elements together with fonts. if (!SVGTree::USE_FONTS) { auto rect = util::make_unique("rect"); rect->addAttribute("x", bbox.minX()); rect->addAttribute("y", bbox.minY()); rect->addAttribute("width", bbox.width()); rect->addAttribute("height", bbox.height()); rect->addAttribute("fill", "white"); rect->addAttribute("fill-opacity", 0); actions.svgTree().appendToPage(std::move(rect)); } } } // Creates SVG views for all collected named anchors defined on a given page. void HyperlinkManager::createViews (unsigned pageno, SpecialActions &actions) { const BoundingBox &pagebox = actions.bbox(); for (auto &stranchorpair : _namedAnchors) { if (stranchorpair.second.pageno == pageno && stranchorpair.second.referenced) { // current anchor referenced? ostringstream oss; oss << pagebox.minX() << ' ' << stranchorpair.second.pos << ' ' << pagebox.width() << ' ' << pagebox.height(); auto view = util::make_unique("view"); view->addAttribute("id", "loc"+XMLString(stranchorpair.second.id)); view->addAttribute("viewBox", oss.str()); actions.svgTree().appendToDefs(std::move(view)); } } closeAnchor(actions); } /** Sets the appearance of the link markers. * @param[in] marker string specifying the marker (format: type[:linecolor]) * @return true on success */ bool HyperlinkManager::setLinkMarker (const string &marker) { string type; // "none", "box", "line", or a background color specifier string color; // optional line color specifier size_t seppos = marker.find(':'); if (seppos == string::npos) type = marker; else { type = marker.substr(0, seppos); color = marker.substr(seppos+1); } if (type.empty() || type == "none") MARKER_TYPE = MarkerType::NONE; else if (type == "line") MARKER_TYPE = MarkerType::LINE; else if (type == "box") MARKER_TYPE = MarkerType::BOX; else { if (!LINK_BGCOLOR.setPSName(type, false)) return false; MARKER_TYPE = MarkerType::BGCOLOR; } COLORSOURCE = ColorSource::DEFAULT; if (MARKER_TYPE != MarkerType::NONE && !color.empty()) { if (!LINK_LINECOLOR.setPSName(color, false)) return false; COLORSOURCE = ColorSource::LINKMARKER; } return true; } void HyperlinkManager::setDefaultLinkColor (Color color) { if (COLORSOURCE != ColorSource::LINKMARKER) { COLORSOURCE = ColorSource::STATIC; LINK_LINECOLOR = color; } }dvisvgm-2.8.1/src/TriangularPatch.hpp0000664000175000017500000000575113536435625014540 00000000000000/************************************************************************* ** TriangularPatch.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TRIANGULARPATCH_HPP #define TRIANGULARPATCH_HPP #include "Color.hpp" #include "Pair.hpp" #include "ShadingPatch.hpp" class TriangularPatch : public ShadingPatch { public: TriangularPatch (); explicit TriangularPatch (Color::ColorSpace cspace) : ShadingPatch(cspace) {} TriangularPatch (const PointVec &points, const ColorVec &colors, Color::ColorSpace cspace, int edgeflag, TriangularPatch *patch); int psShadingType() const override {return 4;} DPair valueAt (double u, double v) const; Color colorAt (double u, double v) const; Color averageColor() const override; void setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) override; void setPoints (const DPair &p1, const DPair &p2, const DPair &p3); void setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) override; void setColors (const Color &c1, const Color &c2, const Color &c3); void approximate (int gridsize, bool overlap, double delta, Callback &listener) const override; BoundingBox getBBox () const override; GraphicsPath getBoundaryPath () const override; int numPoints (int edgeflag) const override {return edgeflag == 0 ? 3 : 1;} int numColors (int edgeflag) const override {return edgeflag == 0 ? 3 : 1;} protected: Color averageColor (const Color &c1, const Color &c2, const Color &c3) const; private: DPair _points[3]; Color _colors[3]; }; class LatticeTriangularPatch : public TriangularPatch { public: explicit LatticeTriangularPatch (Color::ColorSpace cspace) : TriangularPatch(cspace) {} int psShadingType() const override {return 5;} }; #endif dvisvgm-2.8.1/src/GFReader.cpp0000664000175000017500000002553613511327144013052 00000000000000/************************************************************************* ** GFReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FixWord.hpp" #include "GFReader.hpp" #include "Length.hpp" #include "SignalHandler.hpp" using namespace std; struct GFCommand { void (GFReader::*method)(int); int numBytes; }; /** Converts a scaled value to double */ static inline double scaled2double (int32_t scaled) { return double(scaled)/(1 << 16); } GFReader::GFReader (istream &is) : _in(is), _insideCharDef(false), _penDown(false) { _minX = _maxX = _minY = _maxY = _x = _y = 0; _currentChar = 0; _designSize = 0; _hppp = _vppp = 0; _checksum = 0; } uint32_t GFReader::readUnsigned (int bytes) { uint32_t ret = 0; for (int i=bytes-1; i >= 0 && !_in.eof(); i--) { uint32_t b = _in.get(); ret |= b << (8*i); } return ret; } int32_t GFReader::readSigned (int bytes) { uint32_t ret = _in.get(); if (ret & 128) // negative value? ret |= 0xffffff00; for (int i=bytes-2; i >= 0 && !_in.eof(); i--) ret = (ret << 8) | _in.get(); return int32_t(ret); } string GFReader::readString (int bytes) { bytes = max(0, bytes); string str(bytes, '\0'); _in.read(&str[0], bytes); return str; } /** Reads a single GF command from the current position of the input stream and calls the * corresponding cmdFOO method. * @return opcode of the executed command */ int GFReader::executeCommand () { SignalHandler::instance().check(); /* Each cmdFOO command reads the necessary number of bytes from the stream so executeCommand doesn't need to know the exact GF command format. Some cmdFOO methods are used for multiple GF commands because they only differ in the size of their parameters. */ static const GFCommand commands[] = { {&GFReader::cmdPaint, 1}, {&GFReader::cmdPaint, 2}, {&GFReader::cmdPaint, 3}, // 64-66 {&GFReader::cmdBoc, 0}, {&GFReader::cmdBoc1, 0}, // 67-68 {&GFReader::cmdEoc, 0}, // 69 {&GFReader::cmdSkip, 0}, {&GFReader::cmdSkip, 1}, {&GFReader::cmdSkip, 2},{&GFReader::cmdSkip, 3}, // 70-73 {&GFReader::cmdXXX, 1}, {&GFReader::cmdXXX, 2}, {&GFReader::cmdXXX, 3}, {&GFReader::cmdXXX, 4}, // 239-242 {&GFReader::cmdYYY, 0}, // 243 {&GFReader::cmdNop, 0}, // 244 {&GFReader::cmdCharLoc, 0}, {&GFReader::cmdCharLoc0, 0}, // 245-246 {&GFReader::cmdPre, 0}, {&GFReader::cmdPost, 0}, {&GFReader::cmdPostPost, 0} // 247-249 }; int opcode = _in.get(); if (opcode < 0) // at end of file? throw GFException("unexpected end of file"); if (opcode >= 0 && opcode <= 63) cmdPaint0(opcode); else if (opcode >= 74 && opcode <= 238) cmdNewRow(opcode-74); else if (opcode >= 250) throw GFException("undefined GF command (opcode " + std::to_string(opcode) + ")"); else { int offset = opcode <= 73 ? 64 : 239-(73-64+1); const GFCommand &cmd = commands[opcode-offset]; if (cmd.method) (this->*cmd.method)(cmd.numBytes); } return opcode; } bool GFReader::executeChar (uint8_t c) { _in.clear(); if (_charInfoMap.empty()) executePostamble(); // read character info _in.clear(); auto it = _charInfoMap.find(c); if (_in && it != _charInfoMap.end()) { _in.seekg(it->second.location); while (executeCommand() != 69); // execute all commands until eoc is reached return true; } return false; } bool GFReader::executeAllChars () { _in.clear(); if (_charInfoMap.empty()) executePostamble(); // read character info _in.clear(); if (_in) { _in.seekg(0); while (executeCommand() != 248); // execute all commands until postamble is reached return true; } return false; } bool GFReader::executePreamble () { _in.clear(); if (!_in) return false; _in.seekg(0); executeCommand(); return true; } bool GFReader::executePostamble () { _in.clear(); if (!_in) return false; _in.seekg(-1, ios::end); while (_in.peek() == 223) // skip fill bytes _in.seekg(-1, ios::cur); if (_in.peek() != 131) throw GFException("invalid identification byte in postpost"); _in.seekg(-5, ios::cur); // now on postpost if (_in.get() != 249) throw GFException("invalid GF file"); uint32_t q = readUnsigned(4); // pointer to begin of postamble _in.seekg(q); // now on begin of postamble while (executeCommand() != 249); // execute all commands until postpost is reached return true; } /** Returns the width of character c in PS point units */ double GFReader::getCharWidth (uint32_t c) const { auto it = _charInfoMap.find(c%256); return it == _charInfoMap.end() ? 0 : it->second.width*getDesignSize()/(1<<24); } /////////////////////// /** Reads the preamble. */ void GFReader::cmdPre (int) { uint32_t i = readUnsigned(1); if (i != 131) throw GFException("invalid identification byte in preamble"); else { uint32_t k = readUnsigned(1); string s = readString(k); preamble(s); } } /** Reads the postamble. */ void GFReader::cmdPost (int) { readUnsigned(4); // pointer to byte after final eoc _designSize = double(FixWord(readUnsigned(4)))*Length::pt2bp; // design size of font in points _checksum = readUnsigned(4); // checksum _hppp = scaled2double(readUnsigned(4))/Length::pt2bp; // horizontal pixels per PS point _vppp = scaled2double(readUnsigned(4))/Length::pt2bp; // vertical pixels per PS point _in.seekg(16, ios::cur); // skip x and y bounds postamble(); } /** Reads trailing bytes at end of stream. */ void GFReader::cmdPostPost (int) { readUnsigned(4); // pointer to begin of postamble uint32_t i = readUnsigned(1); if (i != 131) throw GFException("invalid identification byte in postpost"); while (readUnsigned(1) == 223); // skip fill bytes } /** Inverts "paint color" (black to white or vice versa) of n pixels * and advances the cursor by n. * @param[in] n number of pixels to be inverted */ void GFReader::cmdPaint0 (int n) { if (!_insideCharDef) throw GFException("character-related command outside BOC and EOC"); if (_penDown) // set pixels? _bitmap.setBits(_y, _x, n); _x += n; _penDown = !_penDown; // invert pen state } /** Inverts "paint color" (black to white or vice versa) of n pixels * and advances the cursor by n. The number n of pixels is read from * the input stream. * @param[in] len size of n in bytes */ void GFReader::cmdPaint (int len) { uint32_t pixels = readUnsigned(len); cmdPaint0(pixels); } /** Beginning of character (generic format). */ void GFReader::cmdBoc (int) { _currentChar = readSigned(4); readSigned(4); // pointer to previous boc with same c mod 256 _minX = readSigned(4); _maxX = readSigned(4); _minY = readSigned(4); _maxY = readSigned(4); _x = _minX; _y = _maxY; _penDown = false; _bitmap.resize(_minX, _maxX, _minY, _maxY); _insideCharDef = true; beginChar(_currentChar); } /** Beginning of character (compact format). */ void GFReader::cmdBoc1 (int) { _currentChar = readUnsigned(1); uint32_t dx = readUnsigned(1); _maxX = readUnsigned(1); _minX = _maxX - dx; uint32_t dy = readUnsigned(1); _maxY = readUnsigned(1); _minY = _maxY - dy; _x = _minX; _y = _maxY; _penDown = false; _bitmap.resize(_minX, _maxX, _minY, _maxY); _insideCharDef = true; beginChar(_currentChar); } /** End of character. */ void GFReader::cmdEoc (int) { if (!_insideCharDef) throw GFException("misplaced EOC"); _insideCharDef = false; endChar(_currentChar); } /** Moves cursor to the beginning of a following row and sets * paint color to white. * @param[in] len if 0: move to next row, otherwise: number of bytes to read. * The read value denotes the number of rows to be skipped. */ void GFReader::cmdSkip (int len) { if (!_insideCharDef) throw GFException("character-related command outside BOC and EOC"); if (len == 0) _y--; else _y -= readUnsigned(len)+1; _x = _minX; _penDown = false; } /** Moves cursor to pixel number 'col' in the next row and sets * the paint color to black. * @param[in] col pixel/column number */ void GFReader::cmdNewRow (int col) { if (!_insideCharDef) throw GFException("character-related command outside BOC and EOC"); _x = _minX + col ; _y--; _penDown = true; } void GFReader::cmdXXX (int len) { uint32_t n = readUnsigned(len); string str = readString(n); special(str); } void GFReader::cmdYYY (int) { int32_t y = readSigned(4); numspecial(y); } /** Does nothing. */ void GFReader::cmdNop (int) { } /** Reads character locator (part of postamble) */ void GFReader::cmdCharLoc0 (int) { uint8_t c = readUnsigned(1); // character code mod 256 uint8_t dm = readUnsigned(1); // = dx/65536 int32_t w = readSigned(4); // (1<<24)*characterWidth/designSize int32_t p = readSigned(4); // pointer to begin of (last) character data int32_t dx = 65536*dm; // horizontal escapement int32_t dy = 0; // vertical escapement _charInfoMap.emplace(c, CharInfo(dx, dy, w, p)); } /** Reads character locator (part of postamble) */ void GFReader::cmdCharLoc (int) { uint8_t c = readUnsigned(1); // character code mod 256 int32_t dx = readSigned(4); // horizontal escapement (scaled pixel units) int32_t dy = readSigned(4); // vertical escapement (scaled pixel units) int32_t w = readSigned(4); // (1<<24)*characterWidth/designSize int32_t p = readSigned(4); // pointer to begin of (last) character data _charInfoMap.emplace(c, CharInfo(dx, dy, w, p)); } dvisvgm-2.8.1/src/ZLibOutputStream.hpp0000664000175000017500000001346413510660062014670 00000000000000/************************************************************************* ** ZLibOutputStream.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef ZLIBOUTPUTSTREAM_HPP #define ZLIBOUTPUTSTREAM_HPP #include #include #include #include #include "MessageException.hpp" #ifdef _WIN32 # include # include #endif struct ZLibException : public MessageException { explicit ZLibException (const std::string &msg) : MessageException(msg) {} }; enum ZLibCompressionFormat {ZLIB_DEFLATE=0, ZLIB_GZIP=16}; class ZLibOutputBuffer : public std::streambuf { public: ZLibOutputBuffer () =default; ZLibOutputBuffer (std::streambuf *sbuf, ZLibCompressionFormat format, int zipLevel) { open(sbuf, format, zipLevel); } ~ZLibOutputBuffer () override { close(); } /** Opens the buffer for writing. * @param[in] sink stream buffer taking the compressed data * @param[in] format compression format (deflate or gzip) * @param[in] zipLevel compression level (1-9) * @return true if buffer is ready for writing */ bool open (std::streambuf *sink, ZLibCompressionFormat format, int zipLevel) { if (sink) { _inbuf.reserve(4096); _zbuf.resize(4096); _zstream.zalloc = Z_NULL; _zstream.zfree = Z_NULL; _zstream.opaque = Z_NULL; zipLevel = std::max(1, std::min(9, zipLevel)); if (deflateInit2(&_zstream, zipLevel, Z_DEFLATED, 15+format, 8, Z_DEFAULT_STRATEGY) != Z_OK) throw ZLibException("failed to initialize deflate compression"); _sink = sink; _opened = true; } return _opened; } /** Flushes the remaining data, finishes the compression process, and * closes the buffer so that further output doesn't reach the sink. */ void close () { close(true); } int_type overflow (int_type c) override { if (c == traits_type::eof()) { close(); } else { if (_inbuf.size() == _inbuf.capacity()) flush(Z_NO_FLUSH); _inbuf.push_back(static_cast(c)); } return c; } int sync () override { flush(Z_NO_FLUSH); return 0; } protected: /** Compresses the chunk of data present in the input buffer * and writes it to the assigned output stream. * @param[in] flushmode flush mode of deflate function (Z_NO_FLUSH or Z_FINISH) * @throws ZLibException if compression failed */ void flush (int flushmode) { if (_opened) { _zstream.avail_in = static_cast(_inbuf.size()); _zstream.next_in = _inbuf.data(); do { _zstream.avail_out = static_cast(_zbuf.size()); _zstream.next_out = _zbuf.data(); int ret = deflate(&_zstream, flushmode); if (ret == Z_STREAM_ERROR) { close(false); throw ZLibException("stream error during data compression"); } auto have = _zbuf.size()-_zstream.avail_out; _sink->sputn(reinterpret_cast(_zbuf.data()), have); } while (_zstream.avail_out == 0); } _inbuf.clear(); } /** Closes the buffer so that further output doesn't reach the sink. * @param[in] finish if true, flushes the remaining data and finishes the compression process */ void close (bool finish) { if (_opened) { if (finish) flush(Z_FINISH); deflateEnd(&_zstream); _sink = nullptr; _opened = false; } } private: z_stream _zstream; std::streambuf *_sink = nullptr; ///< target buffer where the compressded data is flushed to std::vector _inbuf; ///< buffer holding a chunk of data to be compressed std::vector _zbuf; ///< buffer holding a chunk of compressed data bool _opened = false; ///< true if ready to process the incoming data correctly }; class ZLibOutputStream : private ZLibOutputBuffer, public std::ostream { public: ZLibOutputStream () : std::ostream(this) {} ZLibOutputStream (std::ostream &os, ZLibCompressionFormat format, int zipLevel) : ZLibOutputBuffer(os.rdbuf(), format, zipLevel), std::ostream(this) {} ~ZLibOutputStream () override {close();} bool open (std::ostream &os, ZLibCompressionFormat format, int zipLevel) { ZLibOutputBuffer::close(); return ZLibOutputBuffer::open(os.rdbuf(), format, zipLevel); } void close () { ZLibOutputBuffer::close(); } }; class ZLibOutputFileStream : public ZLibOutputStream { public: ZLibOutputFileStream (const std::string &fname, ZLibCompressionFormat format, int zipLevel) : _ofs(fname, std::ios::binary) { if (_ofs) { if (_ofs.rdbuf()) open(_ofs, format, zipLevel); else _ofs.close(); } } ~ZLibOutputFileStream () override {close();} private: std::ofstream _ofs; }; #endif dvisvgm-2.8.1/src/SVGSingleCharTextHandler.cpp0000664000175000017500000000410713510660062016162 00000000000000/************************************************************************* ** SVGSingleCharTextHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "SVGSingleCharTextHandler.hpp" #include "XMLNode.hpp" using namespace std; void SVGSingleCharTextHandler::appendChar (uint32_t c, double x, double y) { const Font *font = _font.get(); auto textNode = createTextNode(x, y); textNode->append(XMLString(font->unicode(c), false)); // Apply color changes only if the color differs from black and if the font color itself is black. // Glyphs from non-black fonts (e.g. defined in a XeTeX document) can't change their color. if (_color.get() != Color::BLACK && font->color() == Color::BLACK) { textNode->addAttribute("fill", _color.get().svgColorString()); _color.changed(false); } contextNode()->append(std::move(textNode)); } dvisvgm-2.8.1/src/ShadingPatch.cpp0000664000175000017500000000546713510660062013767 00000000000000/************************************************************************* ** ShadingPatch.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "ShadingPatch.hpp" #include "TensorProductPatch.hpp" #include "TriangularPatch.hpp" #include "utility.hpp" using namespace std; /** Get functions to get/set the current color depending on the assigned color space. */ void ShadingPatch::colorQueryFuncs (ColorGetter &getter, ColorSetter &setter) const { switch (_colorspace) { case Color::ColorSpace::CMYK: getter = &Color::getCMYK; setter = &Color::setCMYK; break; case Color::ColorSpace::LAB: getter = &Color::getLab; setter = &Color::setLab; break; case Color::ColorSpace::RGB: getter = &Color::getRGB; setter = &Color::setRGB; break; case Color::ColorSpace::GRAY: getter = &Color::getGray; setter = &Color::setGray; } } /** Factory method: Creates a shading patch object depending on the given PostScript shading type. */ unique_ptr ShadingPatch::create (int psShadingType, Color::ColorSpace cspace) { switch (psShadingType) { case 4: return util::make_unique(cspace); case 5: return util::make_unique(cspace); case 6: return util::make_unique(cspace); case 7: return util::make_unique(cspace); } ostringstream oss; if (psShadingType > 0 && psShadingType < 4) oss << "shading type " << psShadingType << " not supported"; else oss << "invalid shading type " << psShadingType; throw ShadingException(oss.str()); } dvisvgm-2.8.1/src/DVIActions.hpp0000664000175000017500000000443613510660062013375 00000000000000/************************************************************************* ** DVIActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DVIACTIONS_HPP #define DVIACTIONS_HPP #include #include class BoundingBox; class Font; struct DVIActions { virtual ~DVIActions () =default; virtual void reset () {} virtual void setChar (double x, double y, unsigned c, bool vertical, const Font &f) {} virtual void setRule (double x, double y, double height, double width) {} virtual void setTextOrientation (bool vertical) {} virtual void moveToX (double x, bool forceSVGMove) {} virtual void moveToY (double y, bool forceSVGMove) {} virtual void setFont (int num, const Font &font) {} virtual void special (const std::string &s, double dvi2bp, bool preprocessing=false) {} virtual void beginPage (unsigned pageno, const std::vector &c) {} virtual void endPage (unsigned pageno) {} virtual BoundingBox& bbox () =0; virtual void progress (size_t current, size_t total, const char *id=nullptr) {} }; #endif dvisvgm-2.8.1/src/ShadingPatch.hpp0000664000175000017500000000611613536435625014001 00000000000000/************************************************************************* ** ShadingPatch.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SHADINGPATCH_HPP #define SHADINGPATCH_HPP #include #include "Color.hpp" #include "GraphicsPath.hpp" #include "MessageException.hpp" class ShadingPatch { public: struct Callback { virtual ~Callback () =default; virtual void patchSegment (GraphicsPath &path, const Color &color) =0; }; using PointVec = std::vector; using ColorVec = std::vector; public: explicit ShadingPatch (Color::ColorSpace colorSpace) : _colorspace(colorSpace) {} virtual ~ShadingPatch () =default; virtual int psShadingType () const =0; virtual void approximate (int gridsize, bool overlap, double delta, Callback &callback) const =0; virtual BoundingBox getBBox () const =0; virtual GraphicsPath getBoundaryPath () const =0; virtual void setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) =0; virtual void setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) =0; virtual int numPoints (int edgeflag) const =0; virtual int numColors (int edgeflag) const =0; virtual Color averageColor() const =0; Color::ColorSpace colorSpace () const {return _colorspace;} static std::unique_ptr create (int psShadingType, Color::ColorSpace cspace); protected: using ColorGetter = void (Color::*)(std::valarray &va) const; using ColorSetter = void (Color::*)(const std::valarray &va); void colorQueryFuncs (ColorGetter &getter, ColorSetter &setter) const; private: Color::ColorSpace _colorspace; ///< color space used to compute the shading values }; struct ShadingException : public MessageException { explicit ShadingException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/FixWord.hpp0000664000175000017500000000344013510660062013006 00000000000000/************************************************************************* ** FixWord.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FIXWORD_HPP #define FIXWORD_HPP #include class FixWord { public: FixWord () : _value(0) {} FixWord (int32_t fw) : _value(fw) {} explicit operator double () const {return double(_value)/(1 << 20);} bool operator < (FixWord fw) const {return _value < fw._value;} bool operator == (FixWord fw) const {return _value == fw._value;} private: int32_t _value; }; #endif dvisvgm-2.8.1/src/MetafontWrapper.hpp0000664000175000017500000000341513510660062014544 00000000000000/************************************************************************* ** MetafontWrapper.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef METAFONTWRAPPER_HPP #define METAFONTWRAPPER_HPP #include class FileFinder; class MetafontWrapper { public: MetafontWrapper (std::string fname, std::string dir); bool call (const std::string &mode, double mag); bool make (const std::string &mode, double mag); bool success () const; private: std::string _fontname; std::string _dir; }; #endif dvisvgm-2.8.1/src/optimizer/0000775000175000017500000000000013563265650013030 500000000000000dvisvgm-2.8.1/src/optimizer/SVGOptimizer.hpp0000664000175000017500000000437113510660062016014 00000000000000/************************************************************************* ** SVGOptimizer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include #include #include #include #include "OptimizerModule.hpp" #include "../XMLNode.hpp" class SVGTree; class SVGOptimizer { struct ModuleEntry { ModuleEntry (std::string name, std::unique_ptr mod) : modname(std::move(name)), module(std::move(mod)) {} std::string modname; std::unique_ptr module; }; public: explicit SVGOptimizer (SVGTree *svg=nullptr); explicit SVGOptimizer (SVGTree &svg) : SVGOptimizer(&svg) {} void execute (); void listModules (std::ostream &os) const; bool checkModuleString (std::string &namestr, std::vector &unknownNames) const; static std::string MODULE_SEQUENCE; protected: OptimizerModule* getModule (const std::string &name) const; private: SVGTree *_svg; std::vector _moduleEntries; }; dvisvgm-2.8.1/src/optimizer/AttributeExtractor.cpp0000664000175000017500000001766713510660062017320 00000000000000/************************************************************************* ** AttributeExtractor.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "AttributeExtractor.hpp" using namespace std; /** Constructs a new run object for an attribute and a sequence of sibling nodes. * @param[in] attr attribute to look for * @param[in] first first element of node sequence to scan */ AttributeExtractor::AttributeRun::AttributeRun (const Attribute &attr, XMLElement *first) { _length = 1; _first = first; for (_last=_first->next(); _last; _last=_last->next()) { if (_last->toText() || _last->toCData()) // don't include text/CDATA nodes break; if (XMLElement *childElem = _last->toElement()) { if (!groupable(*childElem)) break; const char *val = childElem->getAttributeValue(attr.name); if (val && val == attr.value) ++_length; else break; } } if (_first != _last && _last) _last = _last->prev(); } const char* AttributeExtractor::info () const { return "move common attributes from a sequence of elements to enclosing groups"; } /** Performs the attribute extraction on a given context node. Each extracted * attribute gets its own group, i.e. the extraction of multiple attributes * of the same elements leads to nested groups. * @param[in] context attributes of all children in this element are extracted * @param[in] recurse if true, the algorithm is recursively performed on all descendant elements */ void AttributeExtractor::execute (XMLElement *context, bool recurse) { if (!context || context->empty()) return; if (recurse) { for (auto node : *context) { if (XMLElement *elem = node->toElement()) execute(elem, true); } } for (XMLNode *child=context->firstChild(); child; child=child->next()) { if (XMLElement *elem = child->toElement()) child = extractAttribute(elem); } } /** Looks for the first attribute not yet processed and tries to group it. If * there is a sequence of adjacent sibling nodes N1,...,Nn with an identical inheritable * attribute, the function creates a group element with this attribute and moves the * nodes N1,...,Nn into that group. The group is inserted at the former position of N1. * @param[in] elem first element of a node sequence with potentially identical attributes * @return the new group element if attributes could be grouped, 'elem' otherwise */ XMLNode* AttributeExtractor::extractAttribute (XMLElement *elem) { for (const auto ¤tAttribute : elem->attributes()) { if (!inheritable(currentAttribute) || extracted(currentAttribute)) continue; AttributeRun run(currentAttribute, elem); if (run.length() >= MIN_RUN_LENGTH) { XMLElement::Attribute attrib = currentAttribute; XMLElement *group = XMLElement::wrap(run.first(), run.last(), "g"); group->addAttribute(attrib.name, attrib.value); // remove attribute from the grouped elements but keep it on elements with 'id' attribute // since they can be referenced, and keep 'fill' attribute on animation elements for (XMLNode *node : *group) { XMLElement *elem = node->toElement(); if (elem && extractable(attrib, *elem)) elem->removeAttribute(attrib.name); } // continue with children of the new group but ignore the just extracted attribute _extractedAttributes.insert(attrib.name); execute(group, false); _extractedAttributes.erase(attrib.name); return group; } } return elem; } /** Checks whether an element type is allowed to be put in a group element (...). * For now we only consider a subset of the actually allowed set of elements. * @param[in] elem name of element to check * @return true if the element is groupable */ bool AttributeExtractor::groupable (const XMLElement &elem) { // https://www.w3.org/TR/SVG/struct.html#GElement static const char *names[] = { "a", "altGlyphDef", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "ellipse", "filter", "font", "font-face", "foreignObject", "g", "image", "line", "linearGradient", "marker", "mask", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "set", "style", "switch", "symbol", "text", "title", "use", "view" }; return binary_search(begin(names), end(names), elem.name(), [](const string &name1, const string &name2) { return name1 < name2; }); } /** Checks whether an SVG attribute A of an element E implicitly propagates its properties * to all child elements of E that don't specify A. For now we only consider a subset of * the inheritable properties. * @param[in] attrib name of attribute to check * @return true if the attribute is inheritable */ bool AttributeExtractor::inheritable (const Attribute &attrib) { // subset of inheritable properties listed on https://www.w3.org/TR/SVG11/propidx.html // clip-path is not inheritable but can be moved to the parent element as long as // no child gets an different clip-path attribute // https://www.w3.org/TR/SVG11/styling.html#Inheritance static const char *names[] = { "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "direction", "fill", "fill-opacity", "fill-rule", "font", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "glyph-orientation-horizontal", "glyph-orientation-vertical", "letter-spacing", "paint-order", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "transform", "visibility", "word-spacing", "writing-mode" }; return binary_search(begin(names), end(names), attrib.name, [](const string &name1, const string &name2) { return name1 < name2; }); } /** Checks whether an attribute is allowed to be removed from a given element. */ bool AttributeExtractor::extractable (const Attribute &attrib, XMLElement &element) { if (element.hasAttribute("id")) return false; if (attrib.name != "fill") return true; // the 'fill' attribute of animation elements has different semantics than // that of graphics elements => don't extract it from animation nodes // https://www.w3.org/TR/SVG11/animate.html#TimingAttributes static const char *names[] = { "animate", "animateColor", "animateMotion", "animateTransform", "set" }; auto it = find_if(begin(names), end(names), [&](const string &name) { return element.name() == name; }); return it == end(names); } /** Returns true if a given attribute was already extracted from the * current run of elements. */ bool AttributeExtractor::extracted (const Attribute &attr) const { return _extractedAttributes.find(attr.name) != _extractedAttributes.end(); } dvisvgm-2.8.1/src/optimizer/TransformSimplifier.cpp0000664000175000017500000001417313553267757017472 00000000000000/************************************************************************* ** TransformSimplifier.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "TransformSimplifier.hpp" #include "../Matrix.hpp" #include "../utility.hpp" #include "../XMLNode.hpp" #include "../XMLString.hpp" using namespace std; const char* TransformSimplifier::info () const { return "try to simplify and shorten the values of 'transform' attributes"; } /** Tries to simplify the transform attributes of the context node and all its descendants. */ void TransformSimplifier::execute (XMLElement *context) { if (!context) return; if (const char *transform = context->getAttributeValue("transform")) { Matrix matrix = Matrix::parseSVGTransform(transform); if (!incorporateTransform(context, matrix)) { string decomp = decompose(matrix); if (decomp.length() > matrix.toSVG().length()) context->addAttribute("transform", matrix.toSVG()); else { if (decomp.empty()) context->removeAttribute("transform"); else context->addAttribute("transform", decomp); } } } // continue with child elements for (XMLNode *child : *context) { if (XMLElement *elem = child->toElement()) execute(elem); } } /** Tries to incorporate the translation and scaling components of the 'transform' attribute * of a given element into the positional and/or size attributes of that element. If successful, * the 'transform' attribute is removed. * Currently, only 'image' and 'rect' elements are considered. * @param[in] elem element to check * @param[in] matrix matrix representing the 'transform' attribute of the element * @return true on success */ bool TransformSimplifier::incorporateTransform (XMLElement *elem, const Matrix &matrix) { if ((elem->name() == "image" || elem->name() == "rect") && matrix.get(0, 1) == 0 && matrix.get(1, 0) == 0) { double tx = matrix.get(0, 2); double ty = matrix.get(1, 2); double sx = matrix.get(0, 0); double sy = matrix.get(1, 1); if (const char *xstr = elem->getAttributeValue("x")) tx += sx*strtod(xstr, nullptr); if (const char *ystr = elem->getAttributeValue("y")) ty += sy*strtod(ystr, nullptr); if (const char *wstr = elem->getAttributeValue("width")) elem->addAttribute("width", sx*strtod(wstr, nullptr)); if (const char *hstr = elem->getAttributeValue("height")) elem->addAttribute("height", sy*strtod(hstr, nullptr)); elem->addAttribute("x", tx); // update x attribute elem->addAttribute("y", ty); // update x attribute elem->removeAttribute("transform"); return true; } return false; } static string translate_cmd (double dx, double dy) { string ret; XMLString dxstr(dx), dystr(dy); if (dxstr != "0" || dystr != "0") { ret = "translate("+dxstr; if (dystr != "0") ret += " "+dystr; ret += ')'; } return ret; } static string scale_cmd (double sx, double sy) { string ret; XMLString sxstr(sx), systr(sy); if (sxstr != "1" || systr != "1") { ret = "scale("+sxstr; if (systr != "1") ret += " "+systr; ret += ')'; } return ret; } static string rotate_cmd (double rad) { string ret; XMLString degstr(math::rad2deg(fmod(rad, math::TWO_PI))); if (degstr != "0") ret = "rotate("+degstr+")"; return ret; } static string skewx_cmd (double rad) { string ret; XMLString degstr(math::rad2deg(fmod(rad, math::PI))); if (degstr != "0") ret = "skewX("+degstr+")"; return ret; } static string skewy_cmd (double rad) { string ret; XMLString degstr(math::rad2deg(fmod(rad, math::PI))); if (degstr != "0") ret = "skewY("+degstr+")"; return ret; } static bool not_equal (double x, double y) { return abs(x-y) >= 1e-6; } /** Decomposes a transformation matrix into a sequence of basic SVG transformations, i.e. * translation, rotation, scaling, and skewing. The algorithm (QR-based decomposition) * is taken from http://frederic-wang.fr/decomposition-of-2d-transform-matrices.html. * @param[in] matrix matrix to decompose * @return string containing the SVG transformation commands */ string TransformSimplifier::decompose (const Matrix &matrix) { // transformation matrix [a b c d e f] according to // https://www.w3.org/TR/SVG11/coords.html#EstablishingANewUserSpace double a = matrix.get(0, 0); double b = matrix.get(1, 0); double c = matrix.get(0, 1); double d = matrix.get(1, 1); double e = matrix.get(0, 2); double f = matrix.get(1, 2); string ret = translate_cmd(e, f); double delta = a*d - b*c; if (not_equal(a, 0) || not_equal(b, 0)) { double r = sqrt(a*a + b*b); ret += rotate_cmd(b > 0 ? acos(a/r) : -acos(a/r)); ret += scale_cmd(r, delta/r); ret += skewx_cmd(atan((a*c + b*d)/(r*r))); } else if (not_equal(c, 0) || not_equal(d, 0)) { double s = sqrt(c*c + d*d); ret += rotate_cmd(math::HALF_PI - (d > 0 ? acos(-c/s) : -acos(c/s))); ret += scale_cmd(delta/s, s); ret += skewy_cmd(atan((a*c + b*d)/(s*s))); } else ret += scale_cmd(0, 0); return ret; } dvisvgm-2.8.1/src/optimizer/TextSimplifier.hpp0000664000175000017500000000324313561275403016426 00000000000000/************************************************************************* ** TextSimplifier.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include "OptimizerModule.hpp" class TextSimplifier : public OptimizerModule { public: void execute (XMLElement *defs, XMLElement *context) override {execute(context);} static void execute (XMLElement *context); const char *info () const override; }; dvisvgm-2.8.1/src/optimizer/Makefile.am0000664000175000017500000000102613561275403014776 00000000000000noinst_LTLIBRARIES = liboptimizer.la liboptimizer_la_SOURCES = \ AttributeExtractor.hpp AttributeExtractor.cpp \ DependencyGraph.hpp \ GroupCollapser.hpp GroupCollapser.cpp \ OptimizerModule.hpp \ RedundantElementRemover.hpp RedundantElementRemover.cpp \ SVGOptimizer.hpp SVGOptimizer.cpp \ TextSimplifier.hpp TextSimplifier.cpp \ TransformSimplifier.hpp TransformSimplifier.cpp \ WSNodeRemover.hpp WSNodeRemover.cpp AM_CXXFLAGS = -I$(dvisvgm_srcdir)/libs/variant/include dvisvgm-2.8.1/src/optimizer/TextSimplifier.cpp0000664000175000017500000001016413562236411016416 00000000000000/************************************************************************* ** TextSimplifier.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "AttributeExtractor.hpp" #include "TextSimplifier.hpp" #include "../XMLNode.hpp" using namespace std; const char* TextSimplifier::info () const { return "merge data of tspans into enclosing text elements"; } /** Returns all common inheritable attributes of multiple elements. */ static XMLElement::Attributes common_inheritable_attributes (const vector &elements) { bool intersected=false; XMLElement::Attributes commonAttribs; for (const XMLElement *elem : elements) { if (commonAttribs.empty()) { if (intersected) break; for (const auto attrib : elem->attributes()) { if (AttributeExtractor::inheritable(attrib)) commonAttribs.push_back(attrib); } } else { for (auto it = commonAttribs.begin(); it != commonAttribs.end();) { auto *attrib = elem->getAttribute(it->name); if (!attrib || attrib->value != it->value) it = commonAttribs.erase(it); else ++it; } } intersected = true; } return commonAttribs; } /** Returns all tspan elements of a text element if the latter doesn't contain * any non-whitespace text nodes. Otherwise, the returned vector is empty. * @param[in] textElement text element to check * @return the tspan children of the text element */ static vector get_tspans (XMLElement *textElement) { vector tspans; bool failed=false; for (XMLNode *child : *textElement) { if (child->toWSNode() || child->toComment()) continue; if (child->toText()) failed = true; else if (XMLElement *childElement = child->toElement()) { if (childElement->name() != "tspan") failed = true; else tspans.push_back(childElement); } if (failed) { tspans.clear(); break; } } return tspans; } void TextSimplifier::execute (XMLElement *context) { if (!context) return; if (context->name() == "text") { vector tspans = get_tspans(context); vector attribs = common_inheritable_attributes(tspans); if (!tspans.empty() && !attribs.empty()) { // move all common tspan attributes to the parent text element for (const XMLElement::Attribute &attr : attribs) context->addAttribute(attr.name, attr.value); // remove all common attributes from the tspan elements for (XMLElement *tspan : tspans) { for (const XMLElement::Attribute &attr : attribs) tspan->removeAttribute(attr.name); // unwrap the tspan if there are no remaining attributes if (tspan->attributes().empty()) XMLElement::unwrap(tspan); } } } else { XMLNode *node = context->firstChild(); while (node) { XMLNode *next = node->next(); // keep safe pointer to next node if (XMLElement *elem = node->toElement()) execute(elem); node = next; } } } dvisvgm-2.8.1/src/optimizer/DependencyGraph.hpp0000664000175000017500000001016513510660062016510 00000000000000/************************************************************************* ** DependencyGraph.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DEPENDENCYGRAPH_HPP #define DEPENDENCYGRAPH_HPP #include #include #include #include #include "../utility.hpp" template class DependencyGraph { struct GraphNode { explicit GraphNode (const T &k) : key(k), dependent() {} void addDependee (GraphNode *node) { if (node) { node->dependent = this; dependees.insert(node); } } void unlinkDependees () { for (GraphNode *dependee : dependees) dependee->dependent = nullptr; dependees.clear(); } void unlinkDependee (GraphNode *dependee) { auto it = dependees.find(dependee); if (it != dependees.end()) { (*it)->dependent = nullptr; dependees.erase(it); } } T key; GraphNode *dependent; std::set dependees; }; using NodeMap = std::map>; public: /** Inserts a new isolated node into the dependency graph. */ void insert (const T &key) { if (!contains(key)) _nodeMap.emplace(key, util::make_unique(key)); } /** Inserts a new node to the graph and adds a dependency on an existing one to it. * @param[in] key ID of new node to insert * @param[in] dependantKey ID of node the new node should depend on */ void insert (const T &dependentKey, const T &key) { if (!contains(key)) { auto dependentIter = _nodeMap.find(dependentKey); if (dependentIter != _nodeMap.end()) { auto node = util::make_unique(key); dependentIter->second->addDependee(node.get()); _nodeMap.emplace(key, std::move(node)); } } } /** Removes a node and all its dependents from the graph. */ void removeDependencyPath (const T &key) { auto it = _nodeMap.find(key); if (it != _nodeMap.end()) { for (GraphNode *node = it->second.get(); node;) { GraphNode *dependent = node->dependent; node->unlinkDependees(); if (dependent) dependent->unlinkDependee(node); _nodeMap.erase(node->key); node = dependent; } } } /** Returns the IDs of all nodes present in the graph. */ std::vector getKeys () const { std::vector keys; for (auto &entry : _nodeMap) keys.emplace_back(entry.first); return keys; } bool contains (const T &value) const { return _nodeMap.find(value) != _nodeMap.end(); } bool empty () const { return _nodeMap.empty(); } #if 0 void writeDOT (std::ostream &os) const { os << "digraph {\n"; for (auto it=_nodeMap.begin(); it != _nodeMap.end(); ++it) { GraphNode *node = it->second; if (node->dependent) os << (node->key) << " -> " << (node->dependent->key) << ";\n"; else if (node->dependees.empty()) os << (node->key) << ";\n"; } os << "}\n"; } #endif private: NodeMap _nodeMap; }; #endif dvisvgm-2.8.1/src/optimizer/TransformSimplifier.hpp0000664000175000017500000000350013553267757017467 00000000000000/************************************************************************* ** TransformSimplifier.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include #include "OptimizerModule.hpp" class Matrix; class TransformSimplifier : public OptimizerModule { public: void execute (XMLElement*, XMLElement *context) override {execute(context);} void execute (XMLElement *context); const char* info () const override; protected: bool incorporateTransform (XMLElement *elem, const Matrix &matrix); std::string decompose (const Matrix &matrix); }; dvisvgm-2.8.1/src/optimizer/Makefile.in0000664000175000017500000005322613563265577015035 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/optimizer ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) liboptimizer_la_LIBADD = am_liboptimizer_la_OBJECTS = AttributeExtractor.lo GroupCollapser.lo \ RedundantElementRemover.lo SVGOptimizer.lo TextSimplifier.lo \ TransformSimplifier.lo WSNodeRemover.lo liboptimizer_la_OBJECTS = $(am_liboptimizer_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/AttributeExtractor.Plo \ ./$(DEPDIR)/GroupCollapser.Plo \ ./$(DEPDIR)/RedundantElementRemover.Plo \ ./$(DEPDIR)/SVGOptimizer.Plo ./$(DEPDIR)/TextSimplifier.Plo \ ./$(DEPDIR)/TransformSimplifier.Plo \ ./$(DEPDIR)/WSNodeRemover.Plo am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(liboptimizer_la_SOURCES) DIST_SOURCES = $(liboptimizer_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = liboptimizer.la liboptimizer_la_SOURCES = \ AttributeExtractor.hpp AttributeExtractor.cpp \ DependencyGraph.hpp \ GroupCollapser.hpp GroupCollapser.cpp \ OptimizerModule.hpp \ RedundantElementRemover.hpp RedundantElementRemover.cpp \ SVGOptimizer.hpp SVGOptimizer.cpp \ TextSimplifier.hpp TextSimplifier.cpp \ TransformSimplifier.hpp TransformSimplifier.cpp \ WSNodeRemover.hpp WSNodeRemover.cpp AM_CXXFLAGS = -I$(dvisvgm_srcdir)/libs/variant/include all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/optimizer/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/optimizer/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } liboptimizer.la: $(liboptimizer_la_OBJECTS) $(liboptimizer_la_DEPENDENCIES) $(EXTRA_liboptimizer_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(liboptimizer_la_OBJECTS) $(liboptimizer_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AttributeExtractor.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GroupCollapser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RedundantElementRemover.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGOptimizer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TextSimplifier.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TransformSimplifier.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WSNodeRemover.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/AttributeExtractor.Plo -rm -f ./$(DEPDIR)/GroupCollapser.Plo -rm -f ./$(DEPDIR)/RedundantElementRemover.Plo -rm -f ./$(DEPDIR)/SVGOptimizer.Plo -rm -f ./$(DEPDIR)/TextSimplifier.Plo -rm -f ./$(DEPDIR)/TransformSimplifier.Plo -rm -f ./$(DEPDIR)/WSNodeRemover.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/AttributeExtractor.Plo -rm -f ./$(DEPDIR)/GroupCollapser.Plo -rm -f ./$(DEPDIR)/RedundantElementRemover.Plo -rm -f ./$(DEPDIR)/SVGOptimizer.Plo -rm -f ./$(DEPDIR)/TextSimplifier.Plo -rm -f ./$(DEPDIR)/TransformSimplifier.Plo -rm -f ./$(DEPDIR)/WSNodeRemover.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/src/optimizer/WSNodeRemover.cpp0000664000175000017500000000373513510660062016147 00000000000000/************************************************************************* ** WSNodeRemover.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "WSNodeRemover.hpp" #include "../XMLNode.hpp" const char* WSNodeRemover::info () const { return "remove redundant whitespace nodes"; } void WSNodeRemover::execute (XMLElement *context) { if (!context) return; bool removeWS = context->name() != "text" && context->name() != "tspan"; XMLNode *child = context->firstChild(); while (child) { if (removeWS && child->toWSNode()) { XMLNode *next = child->next(); XMLElement::remove(child); child = next; continue; } if (XMLElement *elem = child->toElement()) execute(elem); child = child->next(); } } dvisvgm-2.8.1/src/optimizer/GroupCollapser.hpp0000664000175000017500000000370013561275403016415 00000000000000/************************************************************************* ** GroupCollapser.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include "OptimizerModule.hpp" /** Joins the attributes of nested groups and removes groups without attributes. */ class GroupCollapser : public OptimizerModule { public: void execute (XMLElement*, XMLElement *context) override {execute(context);}; void execute (XMLElement *context); const char* info () const override; protected: static bool moveAttributes (XMLElement &source, XMLElement &dest); static bool collapsible (const XMLElement &elem); static bool unwrappable (const XMLElement &source, const XMLElement &dest); }; dvisvgm-2.8.1/src/optimizer/GroupCollapser.cpp0000664000175000017500000001377013510660062016411 00000000000000/************************************************************************* ** GroupCollapser.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "AttributeExtractor.hpp" #include "GroupCollapser.hpp" #include "../XMLNode.hpp" using namespace std; const char* GroupCollapser::info () const { return "join nested group elements"; } /** Checks if there's only a single child element and optional whitespace * siblings in a given element. * @param[in] elem element to check * @return pointer to the only child element or nullptr */ static XMLElement* only_child_element (XMLElement *elem) { XMLElement *firstChildElement=nullptr; for (XMLNode *child : *elem) { if (XMLElement *childElement = child->toElement()) { if (firstChildElement) return nullptr; firstChildElement = childElement; } else if (!child->toWSNode()) return nullptr; } return firstChildElement; } /** Removes all whitespace child nodes from a given element. */ static void remove_ws_nodes (XMLElement *elem) { XMLNode *node = elem->firstChild(); while (node) { if (!node->toWSNode()) node = node->next(); else { XMLNode *next = node->next(); XMLElement::remove(node); node = next; } } } /** Recursively removes all redundant group elements from the given context element * and moves their attributes to the corresponding parent element. * @param[in] context root of the subtree to process */ void GroupCollapser::execute (XMLElement *context) { if (!context) return; XMLNode *node=context->firstChild(); while (node) { XMLNode *next = node->next(); // keep safe pointer to next node if (XMLElement *elem = node->toElement()) execute(elem); node = next; } if (context->name() == "g" && context->attributes().empty()) { // unwrap group without attributes remove_ws_nodes(context); XMLElement::unwrap(context); } else { XMLElement *child = only_child_element(context); if (child && collapsible(*context)) { if (child->name() == "g" && unwrappable(*child, *context) && moveAttributes(*child, *context)) { remove_ws_nodes(context); XMLElement::unwrap(child); } } } } /** Moves all attributes from an element to another one. Attributes already * present in the destination element are overwritten or combined. * @param[in] source element the attributes are taken from * @param[in] dest element that receives the attributes * @return true if all attributes have been moved */ bool GroupCollapser::moveAttributes (XMLElement &source, XMLElement &dest) { vector movedAttributes; for (const XMLElement::Attribute &attr : source.attributes()) { if (attr.name == "transform") { string transform; if (const char *destvalue = dest.getAttributeValue("transform")) transform = destvalue+attr.value; else transform = attr.value; dest.addAttribute("transform", transform); movedAttributes.emplace_back("transform"); } else if (AttributeExtractor::inheritable(attr)) { dest.addAttribute(attr.name, attr.value); movedAttributes.emplace_back(attr.name); } } for (const string &attrname : movedAttributes) source.removeAttribute(attrname); return source.attributes().empty(); } /** Returns true if a given element is allowed to take the inheritable attributes * and children of a child group without changing the semantics. * @param[in] element group element to check */ bool GroupCollapser::collapsible (const XMLElement &element) { // the 'fill' attribute of animation elements has different semantics than // that of graphics elements => don't collapse them static const char *names[] = { "animate", "animateColor", "animateMotion", "animateTransform", "set" }; auto it = find_if(begin(names), end(names), [&](const string &name) { return element.name() == name; }); return it == end(names); } /** Returns true if a given group element is allowed to be unwrapped, i.e. its * attributes and children can be moved to the parent without changing the semantics. * @param[in] source element whose children and attributes should be moved * @param[in] dest element that should receive the children and attributes */ bool GroupCollapser::unwrappable (const XMLElement &source, const XMLElement &dest) { // check for colliding clip-path attributes if (const char *cp1 = source.getAttributeValue("clip-path")) { if (const char *cp2 = dest.getAttributeValue("clip-path")) { if (string(cp1) != cp2) return false; } } // these attributes prevent a group from being unwrapped static const char *attribs[] = { "class", "id", "filter", "mask", "style" }; auto it = find_if(begin(attribs), end(attribs), [&](const string &name) { return source.hasAttribute(name) || dest.hasAttribute(name); }); return it == end(attribs); } dvisvgm-2.8.1/src/optimizer/AttributeExtractor.hpp0000664000175000017500000000522513562236411017314 00000000000000/************************************************************************* ** AttributeExtractor.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include #include #include "OptimizerModule.hpp" #include "../XMLNode.hpp" /** Moves common attributes of adjacent elements to enclosing groups. */ class AttributeExtractor : public OptimizerModule { using Attribute = XMLElement::Attribute; /** Represents a range of adjacent nodes where all elements have a common attribute. */ struct AttributeRun { public: AttributeRun (const Attribute &attr, XMLElement *first); XMLNode* first () {return _first;} XMLNode* last () {return _last;} int length () const {return _length;} private: int _length; ///< run length excluding non-element nodes XMLNode *_first, *_last; ///< first and last node in run }; public: void execute (XMLElement*, XMLElement *context) override {execute(context, true);}; const char* info () const override; static bool groupable (const XMLElement &elem); static bool inheritable (const Attribute &attrib); static bool extractable (const Attribute &attr, XMLElement &element); protected: void execute (XMLElement *context, bool recurse); XMLNode* extractAttribute (XMLElement *elem); bool extracted (const Attribute &attr) const; private: std::set _extractedAttributes; static constexpr int MIN_RUN_LENGTH = 3; }; dvisvgm-2.8.1/src/optimizer/SVGOptimizer.cpp0000664000175000017500000001045213561275403016013 00000000000000/************************************************************************* ** SVGOptimizer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "SVGOptimizer.hpp" #include "../SVGTree.hpp" #include "AttributeExtractor.hpp" #include "GroupCollapser.hpp" #include "RedundantElementRemover.hpp" #include "TextSimplifier.hpp" #include "TransformSimplifier.hpp" #include "WSNodeRemover.hpp" using namespace std; string SVGOptimizer::MODULE_SEQUENCE; SVGOptimizer::SVGOptimizer (SVGTree *svg) : _svg(svg) { // optimizer modules available to the user; must be listed in default order // _moduleEntries.emplace_back(ModuleEntry("remove-ws", util::make_unique())); _moduleEntries.emplace_back(ModuleEntry("simplify-text", util::make_unique())); _moduleEntries.emplace_back(ModuleEntry("group-attributes", util::make_unique())); _moduleEntries.emplace_back(ModuleEntry("collapse-groups", util::make_unique())); _moduleEntries.emplace_back(ModuleEntry("simplify-transform", util::make_unique())); _moduleEntries.emplace_back(ModuleEntry("remove-clippath", util::make_unique())); } void SVGOptimizer::execute () { if (!_svg || MODULE_SEQUENCE == "none") return; if (MODULE_SEQUENCE.empty()) MODULE_SEQUENCE = "remove-clippath"; // default behaviour of previous dvisvgm releases if (MODULE_SEQUENCE == "all") { for (const auto &entry : _moduleEntries) entry.module->execute(_svg->defsNode(), _svg->pageNode()); } else { vector names = util::split(MODULE_SEQUENCE, ","); for (const string &name : names) { if (OptimizerModule *module = getModule(name)) module->execute(_svg->defsNode(), _svg->pageNode()); } } } void SVGOptimizer::listModules (ostream &os) const { size_t maxlen=0; map infos; for (const auto &entry : _moduleEntries) { maxlen = max(maxlen, entry.modname.length()); infos.emplace(entry.modname, entry.module->info()); } for (const auto &infopair : infos) { os << setw(maxlen) << left << infopair.first; os << " | " << infopair.second << '\n'; } } /** Checks if all module names given in a comma-separated list are known. * @param[in] namestr comma-separated list of module names * @param[out] unknownNames names not recognized * @return true if all names are known */ bool SVGOptimizer::checkModuleString (string &namestr, vector &unknownNames) const { unknownNames.clear(); if (namestr.empty() || namestr == "all" || namestr == "none") return true; vector givenNames = util::split(namestr, ","); for (const string &name : givenNames) { if (!getModule(name)) unknownNames.emplace_back(name); } return unknownNames.empty(); } OptimizerModule* SVGOptimizer::getModule (const string &name) const { auto it = find_if(_moduleEntries.begin(), _moduleEntries.end(), [&](const ModuleEntry &entry) { return entry.modname == name; }); if (it != _moduleEntries.end()) return (*it).module.get(); return nullptr; } dvisvgm-2.8.1/src/optimizer/RedundantElementRemover.cpp0000664000175000017500000000607213510660062020243 00000000000000/************************************************************************* ** RedundantElementRemover.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "DependencyGraph.hpp" #include "RedundantElementRemover.hpp" #include "../XMLNode.hpp" using namespace std; const char* RedundantElementRemover::info () const { return "remove redundant 'clipPath' elements"; } /** Extracts the ID from a local URL reference like url(#abcde) */ static inline string extract_id_from_url (const string &url) { return url.substr(5, url.length()-6); } /** Removes elements present in the SVG tree that are not required. * For now, only clipPath elements are removed. */ void RedundantElementRemover::execute (XMLElement *defs, XMLElement *context) { vector clipPathElements; if (!defs || !context || !defs->getDescendants("clipPath", nullptr, clipPathElements)) return; // collect dependencies between clipPath elements in the defs section of the SVG tree DependencyGraph idTree; for (const XMLElement *clip : clipPathElements) { if (const char *id = clip->getAttributeValue("id")) { if (const char *url = clip->getAttributeValue("clip-path")) idTree.insert(extract_id_from_url(url), id); else idTree.insert(id); } } // collect elements that reference a clipPath, i.e. have a clip-path attribute vector descendants; context->getDescendants(nullptr, "clip-path", descendants); // remove referenced IDs and their dependencies from the dependency graph for (const XMLElement *elem : descendants) { string idref = extract_id_from_url(elem->getAttributeValue("clip-path")); idTree.removeDependencyPath(idref); } descendants.clear(); for (const string &str : idTree.getKeys()) { XMLElement *node = defs->getFirstDescendant("clipPath", "id", str.c_str()); XMLElement::remove(node); } } dvisvgm-2.8.1/src/optimizer/RedundantElementRemover.hpp0000664000175000017500000000315413510660062020246 00000000000000/************************************************************************* ** RedundantElementRemover.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include "OptimizerModule.hpp" class RedundantElementRemover : public OptimizerModule { public: void execute (XMLElement *defs, XMLElement *context) override; const char* info () const override; }; dvisvgm-2.8.1/src/optimizer/WSNodeRemover.hpp0000664000175000017500000000322713510660062016150 00000000000000/************************************************************************* ** WSNodeRemover.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include "OptimizerModule.hpp" class WSNodeRemover : public OptimizerModule { public: void execute (XMLElement*, XMLElement *context) override {execute(context);}; void execute (XMLElement *context); const char* info () const override; }; dvisvgm-2.8.1/src/optimizer/OptimizerModule.hpp0000664000175000017500000000315213510660062016576 00000000000000/************************************************************************* ** OptimizerModule.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once class XMLElement; class OptimizerModule { public: virtual ~OptimizerModule () =default; virtual void execute (XMLElement *defs, XMLElement *context) =0; virtual const char* info () const =0; }; dvisvgm-2.8.1/src/FontManager.cpp0000664000175000017500000002767513510660062013640 00000000000000/************************************************************************* ** FontManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "CMap.hpp" #include "Font.hpp" #include "FontManager.hpp" #include "FileFinder.hpp" #include "FileSystem.hpp" #include "Message.hpp" using namespace std; /** Returns the singleton instance */ FontManager& FontManager::instance () { static FontManager fm; return fm; } /** Returns a unique ID that identifies the font. * @param[in] n local font number, as used in DVI and VF files * @return non-negative font ID if font was found, -1 otherwise */ int FontManager::fontID (int n) const { if (_vfStack.empty()) { auto it = _num2id.find(n); return (it == _num2id.end()) ? -1 : it->second; } auto vit = _vfnum2id.find(_vfStack.top()); if (vit == _vfnum2id.end()) return -1; const Num2IdMap &num2id = vit->second; auto it = num2id.find(n); return (it == num2id.end()) ? -1 : it->second; } /** Returns a unique ID that identifies the font. Not the font object but the * font pointer is looked up to get the ID. Thus, two different pointers * referencing different objects of the same font are mapped to different IDs. * @param[in] font pointer to font object to be identified * @return non-negative font ID if font was found, -1 otherwise */ int FontManager::fontID (const Font *font) const { for (size_t i=0; i < _fonts.size(); i++) if (_fonts[i].get() == font) return i; return -1; } /** Returns a unique ID that identifies the font. * @param[in] name name of font to be identified, e.g. cmr10 * @return non-negative font ID if font was found, -1 otherwise */ int FontManager::fontID (const string &name) const { auto it = _name2id.find(name); if (it == _name2id.end()) return -1; return it->second; } int FontManager::fontnum (int id) const { if (id < 0 || size_t(id) > _fonts.size()) return -1; if (_vfStack.empty()) { for (const auto &entry : _num2id) if (entry.second == id) return entry.first; } else { auto it = _vfnum2id.find(_vfStack.top()); if (it == _vfnum2id.end()) return -1; for (const auto &entry : it->second) if (entry.second == id) return entry.first; } return -1; } int FontManager::vfFirstFontNum (const VirtualFont *vf) const { auto it = _vfFirstFontMap.find(vf); return (it == _vfFirstFontMap.end()) ? -1 : (int) it->second; } /** Returns a previously registered font. * @param[in] n local font number, as used in DVI and VF files * @return pointer to font if font was found, 0 otherwise */ Font* FontManager::getFont (int n) const { int id = fontID(n); return (id < 0) ? nullptr : _fonts[id].get(); } Font* FontManager::getFont (const string &name) const { int id = fontID(name); if (id < 0) return nullptr; return _fonts[id].get(); } Font* FontManager::getFontById (int id) const { if (id < 0 || size_t(id) >= _fonts.size()) return nullptr; return _fonts[id].get(); } /** Returns the current active virtual font. */ const VirtualFont* FontManager::getVF () const { return _vfStack.empty() ? nullptr : _vfStack.top(); } static unique_ptr create_font (const string &filename, const string &fontname, int fontindex, uint32_t checksum, double dsize, double ssize) { string ext; if (const char *dot = strrchr(filename.c_str(), '.')) ext = dot+1; if (!ext.empty() && FileFinder::instance().lookup(filename)) { if (ext == "pfb") return PhysicalFont::create(fontname, checksum, dsize, ssize, PhysicalFont::Type::PFB); if (ext == "otf") return PhysicalFont::create(fontname, checksum, dsize, ssize, PhysicalFont::Type::OTF); if (ext == "ttf") return PhysicalFont::create(fontname, checksum, dsize, ssize, PhysicalFont::Type::TTF); if (ext == "ttc") return PhysicalFont::create(fontname, fontindex, checksum, dsize, ssize); if (ext == "vf") return VirtualFont::create(fontname, checksum, dsize, ssize); if (ext == "mf") return PhysicalFont::create(fontname, checksum, dsize, ssize, PhysicalFont::Type::MF); } return nullptr; } /** Registers a new font to be managed by the FontManager. If there is * already a registered font assigned to number n, nothing happens. * @param[in] fontnum local font number, as used in DVI and VF files * @param[in] name TFM fontname given in DVI file, e.g. cmr10 * @param[in] checksum checksum to be compared with TFM checksum * @param[in] dsize design size in PS point units * @param[in] ssize scaled size in PS point units * @return id of registered font */ int FontManager::registerFont (uint32_t fontnum, const string &name, uint32_t checksum, double dsize, double ssize) { int id = fontID(fontnum); if (id >= 0) return id; unique_ptr newfont; const int newid = _fonts.size(); // the new font gets this ID auto it = _name2id.find(name); if (it != _name2id.end()) { // font with same name already registered? const auto &font = _fonts[it->second]; newfont = font->clone(dsize, ssize); } else { string filename = name; int fontindex = 0; const FontMap::Entry *map_entry = FontMap::instance().lookup(name); if (map_entry) { filename = map_entry->fontname; fontindex = map_entry->fontindex; } // try to find font file with the exact given name if (filename.rfind('.') != string::npos) newfont = create_font(filename, name, fontindex, checksum, dsize, ssize); else { // try various font file formats if the given file has no extension const char *exts[] = {"pfb", "otf", "ttc", "ttf", "vf", "mf", nullptr}; for (const char **p = exts; *p && !newfont; ++p) newfont = create_font(filename+"."+*p, name, fontindex, checksum, dsize, ssize); } if (newfont) { if (!newfont->findAndAssignBaseFontMap()) Message::wstream(true) << "no suitable encoding table found for font " << filename << "\n"; if (!newfont->verifyChecksums()) Message::wstream(true) << "checksum mismatch in font " << name << '\n'; } else { // create dummy font as a placeholder if the proper font is not available newfont = util::make_unique(name); if (filename.rfind('.') == string::npos) filename += ".mf"; // print warning message about missing font file (only once for each filename) static set missing_fonts; if (missing_fonts.find(filename) == missing_fonts.end()) { Message::wstream(true) << "font file '" << filename << "' not found\n"; missing_fonts.insert(filename); } } _name2id[name] = newid; } _fonts.emplace_back(std::move(newfont)); if (_vfStack.empty()) // register font referenced in dvi file? _num2id[fontnum] = newid; else { // register font referenced in vf file const VirtualFont *vf = _vfStack.top(); _vfnum2id[vf][fontnum] = newid; if (_vfFirstFontMap.find(vf) == _vfFirstFontMap.end()) // first fontdef of VF? _vfFirstFontMap[vf] = fontnum; } return newid; } /** Registers a new native font to be managed by the FontManager. If there is * already a registered font assigned to number n, nothing happens. * @param[in] fontnum local font number used in DVI file * @param[in] filename name/path of font file * @param[in] ptsize font size in PS points * @param[in] style font style parameters * @param[in] color global font color * @return global font id */ int FontManager::registerFont (uint32_t fontnum, const string &filename, double ptsize, const FontStyle &style, Color color) { return registerFont(fontnum, filename, 0, ptsize, style, color); } /** Registers a new native font to be managed by the FontManager. If there is * already a registered font assigned to number n, nothing happens. * @param[in] fontnum local font number used in DVI file * @param[in] filename name/path of font file * @param[in] fontIndex subfont index * @param[in] ptsize font size in PS points * @param[in] style font style parameters * @param[in] color global font color * @return global font id */ int FontManager::registerFont (uint32_t fontnum, string filename, int fontIndex, double ptsize, const FontStyle &style, Color color) { int id = fontID(fontnum); if (id >= 0) return id; if (!filename.empty() && filename[0] == '[' && filename[filename.size()-1] == ']') filename = filename.substr(1, filename.size()-2); string fontname = NativeFont::uniqueName(filename, style); const char *path = filename.c_str(); unique_ptr newfont; const int newid = _fonts.size(); // the new font gets this ID auto it = _name2id.find(fontname); if (it != _name2id.end()) { // font with same name already registered? if (auto font = dynamic_cast(_fonts[it->second].get())) newfont = font->clone(ptsize, style, color); } else { if (!FileSystem::exists(path)) path = FileFinder::instance().lookup(filename, false); if (path) { newfont.reset(new NativeFontImpl(path, fontIndex, ptsize, style, color)); newfont->findAndAssignBaseFontMap(); } if (!newfont) { // create dummy font as a placeholder if the proper font is not available newfont = util::make_unique(filename); // print warning message about missing font file (only once for each filename) static set missing_fonts; if (missing_fonts.find(filename) == missing_fonts.end()) { Message::wstream(true) << "font file '" << filename << "' not found\n"; missing_fonts.insert(filename); } } _name2id[fontname] = newid; } _fonts.emplace_back(std::move(newfont)); _num2id[fontnum] = newid; return newid; } /** Enters a new virtual font frame. * This method must be called before processing a VF character. * @param[in] vf virtual font */ void FontManager::enterVF (VirtualFont *vf) { if (vf) _vfStack.push(vf); } /** Leaves a previously entered virtual font frame. */ void FontManager::leaveVF () { if (!_vfStack.empty()) _vfStack.pop(); } /** Assigns a sequence of DVI commands to a char code. * @param[in] c character code * @param[in] dvi DVI commands that describe character c */ void FontManager::assignVFChar (int c, vector &&dvi) { if (!_vfStack.empty()) _vfStack.top()->assignChar(c, std::move(dvi)); } ostream& FontManager::write (ostream &os, Font *font, int level) { #if 0 if (font) { int id = -1; for (int i=0; i < _fonts.size() && id < 0; i++) if (_fonts[i] == font) id = i; VirtualFont *vf = dynamic_cast(font); for (int j=0; j < level+1; j++) os << " "; os << "id " << id << " fontnum " << fontnum(id) << " " << (vf ? "VF" : "PF") << " " << font->name() << endl; if (vf) { enterVF(vf); const Num2IdMap &num2id = _vfnum2id.find(vf)->second; for (const auto &entry : num2id) { Font *font = _fonts[entry.second]; write(os, font, level+1); } leaveVF(); } } else { for (int i=0; i < _fonts.size(); i++) write(os, _fonts[i], level); os << endl; } #endif return os; } dvisvgm-2.8.1/src/Matrix.cpp0000664000175000017500000004072513511327144012674 00000000000000/************************************************************************* ** Matrix.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "Calculator.hpp" #include "Matrix.hpp" #include "utility.hpp" #include "XMLString.hpp" using namespace std; using math::deg2rad; /** Computes the determinant of a given matrix */ double det (const Matrix &m) { double sum=0; for (int i=0; i < 3; ++i) { sum += m._values[0][i] * m._values[1][(i+1)%3] * m._values[2][(i+2)%3] - m._values[0][2-i] * m._values[1][(4-i)%3] * m._values[2][(3-i)%3]; } return sum; } /** Computes the determinant of the 2x2 submatrix of m where a given * row and column were removed. * @param[in] m base matrix * @param[in] row row to remove * @param[in] col column to remove */ double det (const Matrix &m, int row, int col) { int c1 = (col+1)%3, c2 = (col+2)%3; int r1 = (row+1)%3, r2 = (row+2)%3; if (c1 > c2) swap(c1, c2); if (r1 > r2) swap(r1, r2); return m._values[r1][c1] * m._values[r2][c2] - m._values[r1][c2] * m._values[r2][c1]; } /** Creates a diagonal matrix ((d,0,0),(0,d,0),(0,0,d)). * @param[in] d value of diagonal elements */ Matrix::Matrix (double d) { set(d); } /** Creates the matrix ((v0,v1,v2),(v3,v4,v5),(v6,v7,v8)). * Expects that array v consists of 'size' elements. If size is less than 9, the * remaining matrix components will be set to those of the identity matrix. * @param[in] v array containing the matrix components * @param[in] size size of array v */ Matrix::Matrix (const double *v, unsigned size) { set(v, size); } /** Creates the matrix ((v0,v1,v2),(v3,v4,v5),(v6,v7,v8)). * If vector v has less than 9 elements, the remaining matrix components will be set to * those of the identity matrix. * @param[in] v array containing the matrix components * @param[in] start use vector components start,...,start+8 */ Matrix::Matrix (const std::vector &v, int start) { set(v, start); } Matrix::Matrix (const string &cmds, Calculator &calc) { *this = parse(cmds, calc); } Matrix::Matrix (initializer_list initlist) { int count=0; for (auto it=initlist.begin(); it != initlist.end() && count < 9; ++it) { _values[count/3][count%3] = *it; count++; } for (; count < 9; count++) _values[count/3][count%3] = (count%4 ? 0 : 1); } Matrix& Matrix::set (double d) { for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) _values[i][j] = (i==j ? d : 0); return *this; } Matrix& Matrix::set (const double *v, unsigned size) { size = min(size, 9u); for (unsigned i=0; i < size; i++) _values[i/3][i%3] = v[i]; for (unsigned i=size; i < 9; i++) _values[i/3][i%3] = (i%4 ? 0 : 1); return *this; } /** Set matrix values ((v0,v1,v2),(v3,v4,v5),(v6,v7,v8)). * If vector v has less than 9 elements, the remaining matrix components will be set to * those of the identity matrix. * @param[in] v array containing the matrix components * @param[in] start use vector components start,...,start+8 */ Matrix& Matrix::set (const vector &v, int start) { unsigned size = min((unsigned)v.size()-start, 9u); for (unsigned i=0; i < size; i++) _values[i/3][i%3] = v[i+start]; for (unsigned i=size; i < 9; i++) _values[i/3][i%3] = (i%4 ? 0 : 1); return *this; } Matrix& Matrix::set (const string &cmds, Calculator &calc) { *this = parse(cmds, calc); return *this; } Matrix& Matrix::translate (double tx, double ty) { if (tx != 0 || ty != 0) { TranslationMatrix t(tx, ty); lmultiply(t); } return *this; } Matrix& Matrix::scale (double sx, double sy) { if (sx != 1 || sy != 1) { ScalingMatrix s(sx, sy); lmultiply(s); } return *this; } /** Multiplies this matrix by ((cos d, -sin d, 0), (sin d, cos d, 0), (0,0,1)) that * describes an anti-clockwise rotation by d degrees. * @param[in] deg rotation angle in degrees */ Matrix& Matrix::rotate (double deg) { RotationMatrix r(deg); lmultiply(r); return *this; } Matrix& Matrix::xskewByAngle (double deg) { if (fmod(fabs(deg)-90, 180) != 0) return xskewByRatio(tan(deg2rad(deg))); return *this; } Matrix& Matrix::xskewByRatio (double xyratio) { if (xyratio != 0) { double v[] = {1, xyratio}; Matrix t(v, 2); lmultiply(t); } return *this; } Matrix& Matrix::yskewByAngle (double deg) { if (fmod(fabs(deg)-90, 180) != 0) return yskewByRatio(tan(deg2rad(deg))); return *this; } Matrix& Matrix::yskewByRatio (double xyratio) { if (xyratio != 0) { double v[] = {1, 0, 0, xyratio}; Matrix t(v, 4); lmultiply(t); } return *this; } Matrix& Matrix::flip (bool haxis, double a) { double s = 1; if (haxis) // mirror at horizontal axis? s = -1; double v[] = {-s, 0, (haxis ? 0 : 2*a), 0, s, (haxis ? 2*a : 0), 0, 0, 1}; Matrix t(v); lmultiply(t); return *this; } /** Swaps rows and columns of the matrix. */ Matrix& Matrix::transpose () { for (int i=0; i < 3; i++) for (int j=i+1; j < 3; j++) swap(_values[i][j], _values[j][i]); return *this; } /** Multiplies this matrix M with matrix tm (tm is the factor on the right side): M := M * tm */ Matrix& Matrix::rmultiply (const Matrix &tm) { Matrix ret; for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) for (int k=0; k < 3; k++) ret._values[i][j] += _values[i][k] * tm._values[k][j]; return *this = ret; } /** Multiplies this matrix M with matrix tm (tm is the factor on the left side): M := tm * M */ Matrix& Matrix::lmultiply (const Matrix &tm) { Matrix ret; for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) for (int k=0; k < 3; k++) ret._values[i][j] += tm._values[i][k] * _values[k][j]; return *this = ret; } Matrix& Matrix::invert () { Matrix ret; if (double denom = det(*this)) { for (int i=0; i < 3; ++i) { for (int j=0; j < 3; ++j) { ret._values[i][j] = det(*this, i, j)/denom; if ((i+j)%2 != 0) ret._values[i][j] *= -1; } } return *this = ret; } throw exception(); } Matrix& Matrix::operator *= (double c) { for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) _values[i][j] *= c; return *this; } DPair Matrix::operator * (const DPair &p) const { double pp[] = {p.x(), p.y(), 1}; double ret[]= {0, 0}; for (int i=0; i < 2; i++) for (int j=0; j < 3; j++) ret[i] += _values[i][j] * pp[j]; return DPair(ret[0], ret[1]); } /** Returns true if this matrix equals. Checks equality by comparing the matrix components. */ bool Matrix::operator == (const Matrix &m) const { for (int i=0; i < 2; i++) for (int j=0; j < 3; j++) if (std::abs(_values[i][j]-m._values[i][j]) >= numeric_limits::epsilon()) return false; return true; } /** Returns true if this matrix doesn't equal m. Checks inequality by comparing the matrix components. */ bool Matrix::operator != (const Matrix &m) const { for (int i=0; i < 2; i++) for (int j=0; j < 3; j++) if (std::abs(_values[i][j]-m._values[i][j]) >= numeric_limits::epsilon()) return true; return false; } /** Returns true if this matrix is the identity matrix ((1,0,0),(0,1,0),(0,0,1)). */ bool Matrix::isIdentity() const { for (int i=0; i < 2; i++) for (int j=0; j < 3; j++) { const double &v = _values[i][j]; if ((i == j && v != 1) || (i != j && v != 0)) return false; } return true; } /** Checks whether this matrix describes a plain translation (without any other transformations). * If so, the parameters tx and ty are filled with the translation components. * @param[out] tx horizontal translation * @param[out] ty vertical translation * @return true if matrix describes a pure translation */ bool Matrix::isTranslation (double &tx, double &ty) const { tx = _values[0][2]; ty = _values[1][2]; for (int i=0; i < 3; i++) for (int j=0; j < 2; j++) { const double &v = _values[i][j]; if ((i == j && v != 1) || (i != j && v != 0)) return false; } return _values[2][2] == 1; } /** Gets a parameter for the transformation command. * @param[in] is parameter chars are read from this stream * @param[in] calc parameters can be arithmetic expressions, so we need a calculator to evaluate them * @param[in] def default value if parameter is optional * @param[in] optional true if parameter is optional * @param[in] leadingComma true if first non-blank must be a comma * @return value of argument */ static double getArgument (istream &is, Calculator &calc, double def, bool optional, bool leadingComma) { is >> ws; if (!optional && leadingComma && is.peek() != ',') throw ParserException("',' expected"); if (is.peek() == ',') { is.get(); // skip comma optional = false; // now we expect a parameter } string expr; while (!isupper(is.peek()) && is.peek() != ',' && is) expr += (char)is.get(); if (expr.length() == 0) { if (optional) return def; else throw ParserException("parameter expected"); } return calc.eval(expr); } Matrix Matrix::parse (istream &is, Calculator &calc) { Matrix ret(1); while (is) { is >> ws; int cmd = is.get(); switch (cmd) { case 'T': { double tx = getArgument(is, calc, 0, false, false); double ty = getArgument(is, calc, 0, true, true); ret.translate(tx, ty); break; } case 'S': { double sx = getArgument(is, calc, 1, false, false); double sy = getArgument(is, calc, sx, true, true ); ret.scale(sx, sy); break; } case 'R': { double a = getArgument(is, calc, 0, false, false); double x = getArgument(is, calc, calc.getVariable("ux")+calc.getVariable("w")/2, true, true); double y = getArgument(is, calc, calc.getVariable("uy")+calc.getVariable("h")/2, true, true); ret.translate(-x, -y); ret.rotate(a); ret.translate(x, y); break; } case 'F': { int c = is.get(); if (c != 'H' && c != 'V') throw ParserException("'H' or 'V' expected"); double a = getArgument(is, calc, 0, false, false); ret.flip(c == 'H', a); break; } case 'K': { int c = is.get(); if (c != 'X' && c != 'Y') throw ParserException("transformation command 'K' must be followed by 'X' or 'Y'"); double a = getArgument(is, calc, 0, false, false); if (std::abs(cos(deg2rad(a))) < numeric_limits::epsilon()) throw ParserException("illegal skewing angle: " + util::to_string(a) + " degrees"); if (c == 'X') ret.xskewByAngle(a); else ret.yskewByAngle(a); break; } case 'M': { double v[9]; for (int i=0; i < 6; i++) v[i] = getArgument(is, calc, i%4 ? 0 : 1, i!=0, i!=0); // third row (0, 0, 1) v[6] = v[7] = 0; v[8] = 1; Matrix tm(v); ret.lmultiply(tm); break; } default: throw ParserException("transformation command expected (found '" + string(1, cmd) + "' instead)"); } } return ret; } Matrix Matrix::parse (const string &cmds, Calculator &calc) { istringstream iss; iss.str(cmds); return parse(iss, calc); } /** Returns an SVG matrix expression that can be used in transform attributes. * ((a,b,c),(d,e,f),(0,0,1)) => matrix(a d b e c f) */ string Matrix::toSVG () const { ostringstream oss; oss << "matrix("; for (int i=0; i < 3; i++) { for (int j=0; j < 2; j++) oss << XMLString(_values[j][i]) << ' '; } oss.seekp(-1, ios::cur) << ')'; // overwrite trailing space character return oss.str(); } ostream& Matrix::write (ostream &os) const { os << '('; for (int i=0; i < 3; i++) { os << '(' << _values[i][0]; for (int j=1; j < 3; j++) os << ',' << _values[i][j]; os << ')'; if (i < 2) os << ','; } os << ')'; return os; } static const char* ord_suffix (int n) { static const char *suffixes[] = {"th", "st", "nd", "rd"}; if (abs(n) < 4) return suffixes[n]; return suffixes[0]; } static void skip_comma_wsp (istream &is) { is >> ws; if (is.peek() == ',') is.ignore(1); is >> ws; } static size_t parse_transform_cmd (istream &is, string cmd, size_t minparams, size_t maxparams, vector ¶ms) { for (int i=0; i < int(cmd.length()); i++) { if (is.get() != cmd[i]) { is.seekg(-i-1, ios::cur); return 0; } } params.clear(); is >> ws; if (is.get() != '(') throw ParserException("missing '(' after command '"+cmd+"'"); for (size_t i=1; i <= maxparams; i++) { is >> ws; double val; if (is.fail()) throw ParserException(to_string(i)+ord_suffix(i)+" parameter of '"+cmd+"' must be a number"); is >> val; params.push_back(val); is >> ws; if (i == minparams && is.peek() == ')') { is.ignore(1); return i; } if (i == maxparams) { if (is.peek() != ')') throw ParserException("missing ')' at end of command '"+cmd+"'"); is.ignore(1); } skip_comma_wsp(is); } return maxparams; } static bool ne (double x, double y) {return abs(x-y) >= 1e-6;} static bool ne_angle (double x, double y) {return abs(x-y) >= 1e-3;} Matrix Matrix::parseSVGTransform (const string &transform) { istringstream iss(transform); Matrix matrix(1); iss >> ws; while (iss) { vector params; if (parse_transform_cmd(iss, "matrix", 6, 6, params)) { if (ne(params[0], 1) || ne(params[1], 0) || ne(params[2], 0) || ne(params[3], 1) || ne(params[4], 0) || ne(params[5], 0)) matrix.rmultiply({params[0], params[2], params[4], params[1], params[3], params[5]}); } else if (parse_transform_cmd(iss, "rotate", 1, 3, params)) { if (params.size() == 1) { params.push_back(0); params.push_back(0); } if (ne_angle(fmod(params[0], 360), 0)) { bool translate = ne(params[1], 0) || ne(params[2], 0); if (translate) matrix.rmultiply(TranslationMatrix(params[1], params[2])); matrix.rmultiply(RotationMatrix(params[0])); if (translate) matrix.rmultiply(TranslationMatrix(-params[1], -params[2])); } } else if (parse_transform_cmd(iss, "scale", 1, 2, params)) { if (params.size() == 1) params.push_back(1); if (ne(params[0], 1) || ne(params[1], 1)) matrix.rmultiply(ScalingMatrix(params[0], params[1])); } else if (parse_transform_cmd(iss, "skewX", 1, 1, params)) { if (ne_angle(fmod(abs(params[0])-90, 180), 0)) matrix.rmultiply(XSkewingMatrix(params[0])); } else if (parse_transform_cmd(iss, "skewY", 1, 1, params)) { if (ne_angle(fmod(abs(params[0])-90, 180), 0)) matrix.rmultiply(YSkewingMatrix(params[0])); } else if (parse_transform_cmd(iss, "translate", 1, 2, params)) { if (params.size() == 1) params.push_back(0); if (ne(params[0], 0) || ne(params[1], 0)) matrix.rmultiply(TranslationMatrix(params[0], params[1])); } else { // invalid command string cmd; while (isalpha(iss.peek())) cmd += char(iss.get()); if (cmd.empty()) throw ParserException("unexpected character in transform attribute: "+to_string(char(iss.get()))); throw ParserException("invalid command in transform attribute: "+cmd); } skip_comma_wsp(iss); } return matrix; } ////////////////////////////////////////////////////////////////// TranslationMatrix::TranslationMatrix (double tx, double ty) { double v[] = {1, 0, tx, 0, 1, ty}; set(v, 6); } ScalingMatrix::ScalingMatrix (double sx, double sy) { double v[] = {sx, 0, 0, 0, sy}; set(v, 5); } RotationMatrix::RotationMatrix (double deg) { double rad = deg2rad(deg); double c = cos(rad); double s = sin(rad); double v[] = {c, -s, 0, s, c}; set(v, 5); } XSkewingMatrix::XSkewingMatrix (double deg) { double xyratio = tan(deg2rad(deg)); lmultiply(Matrix({1, xyratio})); } YSkewingMatrix::YSkewingMatrix (double deg) { double xyratio = tan(deg2rad(deg)); lmultiply(Matrix({1, 0, 0, xyratio})); } dvisvgm-2.8.1/src/SVGCharTspanTextHandler.hpp0000664000175000017500000000377113510660062016041 00000000000000/************************************************************************* ** SVGCharTspanTextHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGCHARTSPANTEXTHANDLER_HPP #define SVGCHARTSPANTEXTHANDLER_HPP #include "SVGCharHandler.hpp" class SVGCharTspanTextHandler : public SVGCharTextHandler { public: explicit SVGCharTspanTextHandler (bool selectFontByClass); void notifyXAdjusted () override {_xchanged = true;} void notifyYAdjusted() override {_ychanged = true;} void appendChar (uint32_t c, double x, double y) override; void setInitialContextNode (XMLElement *node) override; protected: void resetContextNode () override; private: bool _xchanged, _ychanged; XMLElement *_textNode; XMLElement *_tspanNode; }; #endif dvisvgm-2.8.1/src/Pair.hpp0000664000175000017500000000771313536436371012342 00000000000000/************************************************************************* ** Pair.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PAIR_HPP #define PAIR_HPP #include #include #include "macros.hpp" template class Pair { public: explicit Pair (T x=0, T y=0) : _x(x), _y(y) {} template Pair (const Pair &p) : _x(U(p.x())), _y(U(p.y())) {} Pair (const Pair &p) =default; Pair (Pair &&p) =default; Pair& operator = (const Pair &p) =default; Pair& operator = (Pair &&p) =default; Pair operator += (const Pair &p) {_x += p._x; _y += p._y; return *this;} Pair operator -= (const Pair &p) {_x -= p._x; _y -= p._y; return *this;} Pair operator *= (T c) {_x *= c; _y *= c; return *this;} Pair operator /= (T c) {_x /= c; _y /= c; return *this;} Pair operator - () const {return Pair(-_x, -_y);} Pair ortho () const {return Pair(-_y, _x);} double length () const {return std::hypot(_x, _y);} bool operator == (const Pair &p) const {return _x == p._x && _y == p._y;} bool operator != (const Pair &p) const {return _x != p._x || _y != p._y;} T x () const {return _x;} T y () const {return _y;} void x (const T &xx) {_x = xx;} void y (const T &yy) {_y = yy;} std::ostream& write (std::ostream &os) const {return os << '(' << _x << ',' << _y << ')';} private: T _x, _y; }; template inline Pair abs (const Pair &p) { return Pair(std::abs(p.x()), std::abs(p.y())); } /** Returns the dot product of two 2D vectors. */ template inline T dot (const Pair &p1, const Pair &p2) { return p1.x()*p1.y() + p1.y()*p2.y(); } /** Returns the determinant of two 2D vectors. */ template inline T det (const Pair &p1, const Pair &p2) { return p1.x()*p2.y() - p1.y()*p2.x(); } struct Pair32 : public Pair { explicit Pair32 (int32_t x=0, int32_t y=0) : Pair(x, y) {} explicit Pair32 (double x, double y) : Pair(lround(x), lround(y)) {} Pair32 (const Pair &p) : Pair(p) {} }; typedef Pair DPair; inline DPair round (const DPair &p) { return DPair(std::lround(p.x()), std::lround(p.y())); } template IMPLEMENT_ARITHMETIC_OPERATOR(Pair, +) template IMPLEMENT_ARITHMETIC_OPERATOR(Pair, -) template IMPLEMENT_ARITHMETIC_OPERATOR2(Pair, T, *) template IMPLEMENT_ARITHMETIC_OPERATOR2(Pair, T, /) template IMPLEMENT_OUTPUT_OPERATOR(Pair) IMPLEMENT_ARITHMETIC_OPERATOR2(Pair32, int32_t, *) #endif dvisvgm-2.8.1/src/PSInterpreter.cpp0000664000175000017500000003327313561274402014201 00000000000000/************************************************************************* ** PSInterpreter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "FileFinder.hpp" #include "InputReader.hpp" #include "Message.hpp" #include "PSFilter.hpp" #include "PSInterpreter.hpp" #include "SignalHandler.hpp" using namespace std; /** Constructs a new PSInterpreter object. * @param[in] actions template methods to be executed after recognizing the corresponding PS operator. */ PSInterpreter::PSInterpreter (PSActions *actions) : _mode(PS_NONE), _actions(actions) { } void PSInterpreter::init () { if (!_initialized) { vector gsargs { "gs", // dummy name "-q", // be quiet, suppress gs banner "-dNODISPLAY", // we don't need a display device "-dNOPAUSE", // keep going "-dWRITESYSTEMDICT", // leave systemdict writable as some operators must be replaced "-dNOPROMPT" }; if (int gsrev = _gs.revision()) { gsargs.emplace_back(gsrev == 922 ? "-dREALLYDELAYBIND" : "-dDELAYBIND"); // As of GS 9.50, -dSAFER is active by default which leads to warnings // in conjunction with -dDELAYBIND and -dWRITESYSTEMDICT. // Thus, -dDELAYSAFER (or -dNOSAFER) must be added. // https://www.ghostscript.com/doc/9.50/Use.htm#Safer if (gsrev >= 950) gsargs.emplace_back("-dDELAYSAFER"); } _gs.init(gsargs.size(), gsargs.data(), this); _gs.set_stdio(input, output, error); _initialized = true; // Before executing any random PS code redefine some operators and run // initializing PS code. This cannot be done in the constructor because we // need the completely initialized PSInterpreter object here. execute(PSDEFS); } } PSActions* PSInterpreter::setActions (PSActions *actions) { PSActions *old_actions = _actions; _actions = actions; return old_actions; } /** Checks if the given status value returned by Ghostscript indicates an error. * @param[in] status status value returned by Ghostscript after the execution of a PS snippet * @throw PSException if the status value indicates a PostScript error */ void PSInterpreter::checkStatus (int status) { if (status < 0) { _mode = PS_QUIT; if (status < -100) throw PSException("fatal error"); if (_errorMessage.empty()) throw PSException(_gs.error_name(status)); throw PSException(_errorMessage); } } /** Executes a chunk of PostScript code. * @param[in] str buffer containing the code * @param[in] len number of characters in buffer * @param[in] flush If true, a final 'flush' is sent which forces the output buffer to be written immediately. * @return true if the assigned number of bytes have been read */ bool PSInterpreter::execute (const char *str, size_t len, bool flush) { init(); if (_mode == PS_QUIT) return false; int status=0; if (_mode == PS_NONE) { _gs.run_string_begin(0, &status); _mode = PS_RUNNING; } checkStatus(status); bool complete=false; if (_bytesToRead > 0 && len >= _bytesToRead) { len = _bytesToRead; complete = true; } if (_filter && _filter->active()) { PSFilter *filter = _filter; _filter = nullptr; // prevent recursion when filter calls execute() filter->execute(str, len); if (filter->active()) // filter still active after execution? _filter = filter; return complete; } // feed Ghostscript with code chunks that are not larger than 64KB // => see documentation of gsapi_run_string_foo() const char *p=str; while (PS_RUNNING && len > 0) { SignalHandler::instance().check(); size_t chunksize = min(len, (size_t)0xffff); _gs.run_string_continue(p, chunksize, 0, &status); p += chunksize; len -= chunksize; if (_bytesToRead > 0) _bytesToRead -= chunksize; if (status == -101) // e_Quit _mode = PS_QUIT; else checkStatus(status); } if (flush) { // force writing contents of output buffer _gs.run_string_continue("\nflush ", 7, 0, &status); } return complete; } /** Executes a chunk of PostScript code read from a stream. The method returns on EOF. * @param[in] is the input stream * @param[in] flush If true, a final 'flush' is sent which forces the output buffer to be written immediately. * @return true if the assigned number of bytes have been read */ bool PSInterpreter::execute (istream &is, bool flush) { char buf[4096]; bool finished = false; while (is && !is.eof() && !finished) { is.read(buf, 4096); finished = execute(buf, is.gcount(), false); } execute("\n", 1, flush); return finished; } bool PSInterpreter::executeRaw (const string &str, int n) { _rawData.clear(); ostringstream oss; oss << str << ' ' << n << " (raw) prcmd\n"; execute(oss.str()); return !_rawData.empty(); } /** This callback function handles input from stdin to Ghostscript. Currently not needed. * @param[in] inst pointer to calling instance of PSInterpreter * @param[in] buf takes the read characters * @param[in] len size of buffer buf * @return number of characters read */ int GSDLLCALL PSInterpreter::input (void *inst, char *buf, int len) { return 0; } /** This callback function handles output from Ghostscript to stdout. It looks for * emitted commands staring with "dvi." and executes them by calling method callActions. * Ghostscript sends the text in chunks by several calls of this function. * Unfortunately, the PostScript specification wants error messages also to be sent to stdout * instead of stderr. Thus, we must collect and concatenate the chunks until an evaluable text * snippet is completely received. Furthermore, error messages have to be recognized and to be * filtered out. * @param[in] inst pointer to calling instance of PSInterpreter * @param[in] buf contains the characters to be output * @param[in] len number of characters in buf * @return number of processed characters (equals 'len') */ int GSDLLCALL PSInterpreter::output (void *inst, const char *buf, int len) { auto self = static_cast(inst); if (self && self->_actions) { const size_t MAXLEN = 512; // maximal line length (longer lines are of no interest) const char *end = buf+len-1; // last position of buf for (const char *first=buf, *last=buf; first <= end; last++, first=last) { // move first and last to begin and end of the next line, respectively while (last < end && *last != '\n') last++; size_t linelength = last-first+1; if (linelength > MAXLEN) // skip long lines since they don't contain any relevant information continue; vector &linebuf = self->_linebuf; // just a shorter name... if ((*last == '\n' || !self->active()) || self->_inError) { if (linelength + linebuf.size() > 1) { // prefix "dvi." plus final newline SplittedCharInputBuffer ib(linebuf.empty() ? nullptr : &linebuf[0], linebuf.size(), first, linelength); BufferInputReader in(ib); if (self->_inError) self->_errorMessage += string(first, linelength); else { in.skipSpace(); if (in.check("Unrecoverable error: ")) { self->_errorMessage.clear(); while (!in.eof()) self->_errorMessage += char(in.get()); self->_inError = true; } else if (in.check("dvi.")) self->callActions(in); } } linebuf.clear(); } else { // no line end found => // save remaining characters and prepend them to the next incoming chunk of characters if (linebuf.size() + linelength > MAXLEN) linebuf.clear(); // don't care for long lines else { size_t currsize = linebuf.size(); linebuf.resize(currsize+linelength); memcpy(&linebuf[currsize], first, linelength); } } } } return len; } /** Evaluates a command emitted by Ghostscript and invokes the corresponding * method of interface class PSActions. * @param[in] in reader pointing to the next command */ void PSInterpreter::callActions (InputReader &in) { struct Operator { int pcount; // number of parameters (< 0 : variable number of parameters) void (PSActions::*handler)(vector &p); // operation handler }; static const unordered_map operators { {"applyscalevals", { 3, &PSActions::applyscalevals}}, {"clip", { 0, &PSActions::clip}}, {"clippath", { 0, &PSActions::clippath}}, {"closepath", { 0, &PSActions::closepath}}, {"curveto", { 6, &PSActions::curveto}}, {"eoclip", { 0, &PSActions::eoclip}}, {"eofill", { 0, &PSActions::eofill}}, {"fill", { 0, &PSActions::fill}}, {"grestore", { 0, &PSActions::grestore}}, {"grestoreall", { 0, &PSActions::grestoreall}}, {"gsave", { 0, &PSActions::gsave}}, {"initclip", { 0, &PSActions::initclip}}, {"lineto", { 2, &PSActions::lineto}}, {"makepattern", {-1, &PSActions::makepattern}}, {"moveto", { 2, &PSActions::moveto}}, {"newpath", { 1, &PSActions::newpath}}, {"querypos", { 2, &PSActions::querypos}}, {"raw", {-1, nullptr}}, {"restore", { 1, &PSActions::restore}}, {"rotate", { 1, &PSActions::rotate}}, {"save", { 1, &PSActions::save}}, {"scale", { 2, &PSActions::scale}}, {"setblendmode", { 1, &PSActions::setblendmode}}, {"setcmykcolor", { 4, &PSActions::setcmykcolor}}, {"setdash", {-1, &PSActions::setdash}}, {"setgray", { 1, &PSActions::setgray}}, {"sethsbcolor", { 3, &PSActions::sethsbcolor}}, {"setlinecap", { 1, &PSActions::setlinecap}}, {"setlinejoin", { 1, &PSActions::setlinejoin}}, {"setlinewidth", { 1, &PSActions::setlinewidth}}, {"setmatrix", { 6, &PSActions::setmatrix}}, {"setmiterlimit", { 1, &PSActions::setmiterlimit}}, {"setnulldevice", { 1, &PSActions::setnulldevice}}, {"setopacityalpha",{ 1, &PSActions::setopacityalpha}}, {"setshapealpha", { 1, &PSActions::setshapealpha}}, {"setpagedevice", { 0, &PSActions::setpagedevice}}, {"setpattern", {-1, &PSActions::setpattern}}, {"setrgbcolor", { 3, &PSActions::setrgbcolor}}, {"shfill", {-1, &PSActions::shfill}}, {"stroke", { 0, &PSActions::stroke}}, {"translate", { 2, &PSActions::translate}}, }; if (_actions) { in.skipSpace(); auto it = operators.find(in.getWord()); if (it != operators.end()) { if (!it->second.handler) { // raw string data received? _rawData.clear(); in.skipSpace(); while (!in.eof()) { _rawData.emplace_back(in.getString()); in.skipSpace(); } } else { // collect parameters vector params; int pcount = it->second.pcount; if (pcount < 0) { // variable number of parameters? in.skipSpace(); while (!in.eof()) { // read all available parameters params.emplace_back(in.getString()); in.skipSpace(); } } else { // fix number of parameters for (int i=0; i < pcount; i++) { in.skipSpace(); params.emplace_back(in.getString()); } } // convert parameter strings to doubles vector v(params.size()); transform(params.begin(), params.end(), v.begin(), [](const string &str) { return stod(str); }); // call operator handler (_actions->*it->second.handler)(v); _actions->executed(); } } } } /** This callback function handles output from Ghostscript to stderr. * @param[in] inst pointer to calling instance of PSInterpreter * @param[in] buf contains the characters to be output * @param[in] len number of chars in buf * @return number of processed characters */ int GSDLLCALL PSInterpreter::error (void *inst, const char *buf, int len) { return len; } /** Returns the total number of pages of a PDF file. * @param[in] fname name/path of the PDF file */ int PSInterpreter::pdfPageCount (const string &fname) { executeRaw("\n("+fname+")@pdfpagecount ", 1); if (!_rawData.empty()) { size_t index; int ret = stoi(_rawData[0], &index, 10); if (index > 0) return ret; } return 0; } /** Returns the bounding box of a PDF page. If the selected page doesn't exist, * the "invalid" flag of the returned bounding box is set. * @param[in] fname name/path of the PDF file * @param[in] pageno page number * @return the bounding box of the given page */ BoundingBox PSInterpreter::pdfPageBox (const string &fname, int pageno) { BoundingBox pagebox; executeRaw("\n"+to_string(pageno)+"("+fname+")@pdfpagebox ", 4); if (_rawData.size() < 4) pagebox.invalidate(); else pagebox = BoundingBox(stod(_rawData[0]), stod(_rawData[1]), stod(_rawData[2]), stod(_rawData[3])); return pagebox; } dvisvgm-2.8.1/src/Color.cpp0000664000175000017500000004607113536435603012515 00000000000000/************************************************************************* ** Color.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include #include #include "Color.hpp" #include "utility.hpp" using namespace std; bool Color::SUPPRESS_COLOR_NAMES = true; const Color Color::BLACK(uint32_t(0)); const Color Color::WHITE(uint8_t(255), uint8_t(255), uint8_t(255)); const Color Color::TRANSPARENT(uint32_t(0xff000000)); static inline uint8_t double_to_byte (double v) { v = max(0.0, min(1.0, v)); return uint8_t(round(255.0*v)); } Color::Color (const string &psname) { if (!setPSName(psname, false)) setGray(uint8_t(0)); } void Color::setRGB (double r, double g, double b) { setRGB(double_to_byte(r), double_to_byte(g), double_to_byte(b)); } /** Expects a PostScript color name and sets the color accordingly. * @param[in] name PS color name * @param[in] case_sensitive if true, upper/lower case spelling is significant * @return true if color name could be applied properly */ bool Color::setPSName (string name, bool case_sensitive) { if (name[0] == '#') { char *p=nullptr; _rgb = uint32_t(strtol(name.c_str()+1, &p, 16)); while (isspace(*p)) p++; return (*p == 0 && _rgb <= 0xFFFFFF); } struct ColorConstant { const char *name; const uint32_t rgb; }; // converted color constants from color.pro static const array constants {{ {"Apricot", 0xFFAD7A}, {"Aquamarine", 0x2DFFB2}, {"Bittersweet", 0xC10200}, {"Black", 0x000000}, {"Blue", 0x0000FF}, {"BlueGreen", 0x26FFAA}, {"BlueViolet", 0x190CF4}, {"BrickRed", 0xB70000}, {"Brown", 0x660000}, {"BurntOrange", 0xFF7C00}, {"CadetBlue", 0x606DC4}, {"CarnationPink", 0xFF5EFF}, {"Cerulean", 0x0FE2FF}, {"CornflowerBlue", 0x59DDFF}, {"Cyan", 0x00FFFF}, {"Dandelion", 0xFFB528}, {"DarkOrchid", 0x9932CC}, {"Emerald", 0x00FF7F}, {"ForestGreen", 0x00E000}, {"Fuchsia", 0x7202EA}, {"Goldenrod", 0xFFE528}, {"Gray", 0x7F7F7F}, {"Green", 0x00FF00}, {"GreenYellow", 0xD8FF4F}, {"JungleGreen", 0x02FF7A}, {"Lavender", 0xFF84FF}, {"LimeGreen", 0x7FFF00}, {"Magenta", 0xFF00FF}, {"Mahogany", 0xA50000}, {"Maroon", 0xAD0000}, {"Melon", 0xFF897F}, {"MidnightBlue", 0x007091}, {"Mulberry", 0xA314F9}, {"NavyBlue", 0x0F75FF}, {"OliveGreen", 0x009900}, {"Orange", 0xFF6321}, {"OrangeRed", 0xFF007F}, {"Orchid", 0xAD5BFF}, {"Peach", 0xFF7F4C}, {"Periwinkle", 0x6D72FF}, {"PineGreen", 0x00BF28}, {"Plum", 0x7F00FF}, {"ProcessBlue", 0x0AFFFF}, {"Purple", 0x8C23FF}, {"RawSienna", 0x8C0000}, {"Red", 0xFF0000}, {"RedOrange", 0xFF3A21}, {"RedViolet", 0x9600A8}, {"Rhodamine", 0xFF2DFF}, {"RoyalBlue", 0x007FFF}, {"RoyalPurple", 0x3F19FF}, {"RubineRed", 0xFF00DD}, {"Salmon", 0xFF779E}, {"SeaGreen", 0x4FFF7F}, {"Sepia", 0x4C0000}, {"SkyBlue", 0x60FFE0}, {"SpringGreen", 0xBCFF3D}, {"Tan", 0xDB9370}, {"TealBlue", 0x1EF9A3}, {"Thistle", 0xE068FF}, {"Turquoise", 0x26FFCC}, {"Violet", 0x351EFF}, {"VioletRed", 0xFF30FF}, {"White", 0xFFFFFF}, {"WildStrawberry", 0xFF0A9B}, {"Yellow", 0xFFFF00}, {"YellowGreen", 0x8EFF42}, {"YellowOrange", 0xFF9300}, }}; if (case_sensitive) { const ColorConstant cmppair = {name.c_str(), 0}; auto it = lower_bound(constants.begin(), constants.end(), cmppair, [](const ColorConstant &c1, const ColorConstant &c2) { return strcmp(c1.name, c2.name) < 0; } ); if (it != constants.end() && it->name == name) { _rgb = it->rgb; return true; } } else { name = util::tolower(name); auto it = find_if(constants.begin(), constants.end(), [&](const ColorConstant &cc) { return name == util::tolower(cc.name); }); if (it != constants.end()) { _rgb = it->rgb; return true; } } return false; } void Color::setHSB (double h, double s, double b) { valarray hsb(3), rgb(3); hsb[0] = h; hsb[1] = s; hsb[2] = b; HSB2RGB(hsb, rgb); setRGB(rgb); } void Color::setCMYK (double c, double m, double y, double k) { valarray cmyk(4), rgb(3); cmyk[0] = c; cmyk[1] = m; cmyk[2] = y; cmyk[3] = k; CMYK2RGB(cmyk, rgb); setRGB(rgb); } void Color::setCMYK (const std::valarray &cmyk) { valarray rgb(3); CMYK2RGB(cmyk, rgb); setRGB(rgb); } void Color::set (ColorSpace colorSpace, VectorIterator &it) { switch (colorSpace) { case ColorSpace::GRAY: setGray(*it++); break; case ColorSpace::RGB : setRGB(*it, *(it+1), *(it+2)); it+=3; break; case ColorSpace::LAB : setLab(*it, *(it+1), *(it+2)); it+=3; break; case ColorSpace::CMYK: setCMYK(*it, *(it+1), *(it+2), *(it+3)); it+=4; break; } } Color Color::operator *= (double c) { if (abs(c) < 0.001) _rgb &= 0xff000000; else if (abs(c-trunc(c)) < 0.999) { uint32_t rgb=0; for (int i=0; i < 3; i++) { rgb |= lround((_rgb & 0xff)*c) << (8*i); _rgb >>= 8; } _rgb = rgb; } return *this; } /** Returns an RGB string representing the color. Depending on the * color value, the string either consists of 3 or 6 hex digits * plus a leading '#' character. */ string Color::rgbString () const { ostringstream oss; oss << '#'; for (int i=2; i >= 0; i--) { oss << setbase(16) << setfill('0') << setw(2) << (((_rgb >> (8*i)) & 0xff)); } // check if RGB string can be reduced to a three digit hex value // #RRGGBB => #RGB, e.g. #112233 => #123 string hexstr = oss.str(); if (hexstr[1] == hexstr[2] && hexstr[3] == hexstr[4] && hexstr[5] == hexstr[6]) { hexstr[2] = hexstr[3]; hexstr[3] = hexstr[5]; hexstr.resize(4); } return hexstr; } /** Returns an SVG color string representing the current color. The result can * either be an SVG color name or an RGB string of the form #RRGGBB. The latter * will be returned if parameter rgbonly is true or if the SVG standard doesn't * define a name for the current color. */ string Color::svgColorString (bool rgbonly) const { if (!rgbonly) { struct ColorName { uint32_t rgb; const char *name; }; static const array colornames {{ {0x000000, "black"}, {0x000080, "navy"}, {0x00008b, "darkblue"}, {0x0000cd, "mediumblue"}, {0x0000ff, "blue"}, {0x006400, "darkgreen"}, {0x008000, "green"}, {0x008080, "teal"}, {0x008b8b, "darkcyan"}, {0x00bfff, "deepskyblue"}, {0x00ced1, "darkturquoise"}, {0x00fa9a, "mediumspringgreen"}, {0x00ff00, "lime"}, {0x00ff7f, "springgreen"}, {0x00ffff, "cyan"}, {0x191970, "midnightblue"}, {0x1e90ff, "dodgerblue"}, {0x20b2aa, "lightseagreen"}, {0x228b22, "forestgreen"}, {0x2e8b57, "seagreen"}, {0x2f4f4f, "darkslategray"}, {0x32cd32, "limegreen"}, {0x3cb371, "mediumseagreen"}, {0x40e0d0, "turquoise"}, {0x4169e1, "royalblue"}, {0x4682b4, "steelblue"}, {0x483d8b, "darkslateblue"}, {0x48d1cc, "mediumturquoise"}, {0x4b0082, "indigo"}, {0x556b2f, "darkolivegreen"}, {0x5f9ea0, "cadetblue"}, {0x6495ed, "cornflowerblue"}, {0x66cdaa, "mediumaquamarine"}, {0x696969, "dimgray"}, {0x6a5acd, "slateblue"}, {0x6b8e23, "olivedrab"}, {0x708090, "slategray"}, {0x778899, "lightslategray"}, {0x7b68ee, "mediumslateblue"}, {0x7cfc00, "lawngreen"}, {0x7fff00, "chartreuse"}, {0x7fffd4, "aquamarine"}, {0x800000, "maroon"}, {0x800080, "purple"}, {0x808000, "olive"}, {0x808080, "gray"}, {0x87ceeb, "skyblue"}, {0x87cefa, "lightskyblue"}, {0x8a2be2, "blueviolet"}, {0x8b0000, "darkred"}, {0x8b008b, "darkmagenta"}, {0x8b4513, "saddlebrown"}, {0x8fbc8f, "darkseagreen"}, {0x90ee90, "lightgreen"}, {0x9370db, "mediumpurple"}, {0x9400d3, "darkviolet"}, {0x98fb98, "palegreen"}, {0x9932cc, "darkorchid"}, {0x9acd32, "yellowgreen"}, {0xa0522d, "sienna"}, {0xa52a2a, "brown"}, {0xa9a9a9, "darkgray"}, {0xadd8e6, "lightblue"}, {0xadff2f, "greenyellow"}, {0xafeeee, "paleturquoise"}, {0xb0c4de, "lightsteelblue"}, {0xb0e0e6, "powderblue"}, {0xb22222, "firebrick"}, {0xb8860b, "darkgoldenrod"}, {0xba55d3, "mediumorchid"}, {0xbc8f8f, "rosybrown"}, {0xbdb76b, "darkkhaki"}, {0xc0c0c0, "silver"}, {0xc71585, "mediumvioletred"}, {0xcd5c5c, "indianred"}, {0xcd853f, "peru"}, {0xd2691e, "chocolate"}, {0xd2b48c, "tan"}, {0xd3d3d3, "lightgray"}, {0xd8bfd8, "thistle"}, {0xda70d6, "orchid"}, {0xdaa520, "goldenrod"}, {0xdb7093, "palevioletred"}, {0xdc143c, "crimson"}, {0xdcdcdc, "gainsboro"}, {0xdda0dd, "plum"}, {0xdeb887, "burlywood"}, {0xe0ffff, "lightcyan"}, {0xe6e6fa, "lavender"}, {0xe9967a, "darksalmon"}, {0xee82ee, "violet"}, {0xeee8aa, "palegoldenrod"}, {0xf08080, "lightcoral"}, {0xf0e68c, "khaki"}, {0xf0f8ff, "aliceblue"}, {0xf0fff0, "honeydew"}, {0xf0ffff, "azure"}, {0xf4a460, "sandybrown"}, {0xf5deb3, "wheat"}, {0xf5f5dc, "beige"}, {0xf5f5f5, "whitesmoke"}, {0xf5fffa, "mintcream"}, {0xf8f8ff, "ghostwhite"}, {0xfa8072, "salmon"}, {0xfaebd7, "antiquewhite"}, {0xfaf0e6, "linen"}, {0xfafad2, "lightgoldenrodyellow"}, {0xfdf5e6, "oldlace"}, {0xff0000, "red"}, {0xff00ff, "magenta"}, {0xff1493, "deeppink"}, {0xff4500, "orangered"}, {0xff6347, "tomato"}, {0xff69b4, "hotpink"}, {0xff7f50, "coral"}, {0xff8c00, "darkorange"}, {0xffa07a, "lightsalmon"}, {0xffa500, "orange"}, {0xffb6c1, "lightpink"}, {0xffc0cb, "pink"}, {0xffd700, "gold"}, {0xffdab9, "peachpuff"}, {0xffdead, "navajowhite"}, {0xffe4b5, "moccasin"}, {0xffe4c4, "bisque"}, {0xffe4e1, "mistyrose"}, {0xffebcd, "blanchedalmond"}, {0xffefd5, "papayawhip"}, {0xfff0f5, "lavenderblush"}, {0xfff5ee, "seashell"}, {0xfff8dc, "cornsilk"}, {0xfffacd, "lemonchiffon"}, {0xfffaf0, "floralwhite"}, {0xfffafa, "snow"}, {0xffff00, "yellow"}, {0xffffe0, "lightyellow"}, {0xfffff0, "ivory"}, {0xffffff, "white"} }}; ColorName cmppair = {_rgb, nullptr}; auto it = lower_bound(colornames.begin(), colornames.end(), cmppair, [](const ColorName &c1, const ColorName &c2) { return c1.rgb < c2.rgb; }); if (it != colornames.end() && it->rgb == _rgb) return it->name; } return rgbString(); } /** Approximates a CMYK color by an RGB triple. The component values * are expected to be normalized, i.e. 0 <= cmyk[i],rgb[j] <= 1. * @param[in] cmyk color in CMYK space * @param[out] rgb RGB approximation */ void Color::CMYK2RGB (const valarray &cmyk, valarray &rgb) { double kc = 1.0-cmyk[3]; for (int i=0; i < 3; i++) rgb[i] = min(1.0, max(0.0, (1.0-cmyk[i])*kc)); } void Color::RGB2CMYK (const valarray &rgb, valarray &cmyk) { double c = 1-rgb[0]; double m = 1-rgb[1]; double y = 1-rgb[2]; cmyk[3] = min(min(c, m), y); cmyk[0] = c-cmyk[3]; cmyk[1] = m-cmyk[3]; cmyk[2] = y-cmyk[3]; } /** Converts a color given in HSB coordinates to RGB. * @param[in] hsb color in HSB space * @param[out] rgb color in RGB space */ void Color::HSB2RGB (const valarray &hsb, valarray &rgb) { if (hsb[1] == 0) rgb[0] = rgb[1] = rgb[2] = hsb[2]; else { double h = hsb[0]-floor(hsb[0]); int i = int(6*h); double f = 6*h-i; double p = hsb[2]*(1-hsb[1]); double q = hsb[2]*(1-hsb[1]*f); double t = hsb[2]*(1-hsb[1]*(1-f)); switch (i) { case 0 : rgb[0]=hsb[2]; rgb[1]=t; rgb[2]=p; break; case 1 : rgb[0]=q; rgb[1]=hsb[2]; rgb[2]=p; break; case 2 : rgb[0]=p; rgb[1]=hsb[2]; rgb[2]=t; break; case 3 : rgb[0]=p; rgb[1]=q; rgb[2]=hsb[2]; break; case 4 : rgb[0]=t; rgb[1]=p; rgb[2]=hsb[2]; break; case 5 : rgb[0]=hsb[2]; rgb[1]=p; rgb[2]=q; break; default: ; // prevent compiler warning } } } double Color::getGray () const { double r, g, b; getRGB(r, g, b); return r*0.3 + g*0.59 + b*0.11; // gray value according to NTSC video standard } void Color::getGray (valarray &gray) const { gray.resize(1); gray[0] = getGray(); } void Color::getRGB (double &r, double &g, double &b) const { r = ((_rgb >> 16) & 255) / 255.0; g = ((_rgb >> 8) & 255) / 255.0; b = (_rgb & 255) / 255.0; } void Color::getRGB (valarray &rgb) const { rgb.resize(3); double r, g, b; getRGB(r, g, b); rgb[0] = r; rgb[1] = g; rgb[2] = b; } void Color::getCMYK (double &c, double &m, double &y, double &k) const { valarray rgb(3), cmyk(4); getRGB(rgb); RGB2CMYK(rgb, cmyk); c = cmyk[0]; m = cmyk[1]; y = cmyk[2]; k = cmyk[3]; } void Color::getCMYK (std::valarray &cmyk) const { cmyk.resize(4); valarray rgb(3); getRGB(rgb); RGB2CMYK(rgb, cmyk); } void Color::getXYZ (double &x, double &y, double &z) const { valarray rgb(3), xyz(3); getRGB(rgb); RGB2XYZ(rgb, xyz); x = xyz[0]; y = xyz[1]; z = xyz[2]; } void Color::setXYZ (double x, double y, double z) { valarray xyz(3), rgb(3); xyz[0] = x; xyz[1] = y; xyz[2] = z; XYZ2RGB(xyz, rgb); setRGB(rgb); } void Color::setXYZ (const valarray &xyz) { valarray rgb(3); XYZ2RGB(xyz, rgb); setRGB(rgb); } void Color::setLab (double l, double a, double b) { valarray lab(3), xyz(3); lab[0] = l; lab[1] = a; lab[2] = b; Lab2XYZ(lab, xyz); setXYZ(xyz); } void Color::setLab (const valarray &lab) { valarray xyz(3); Lab2XYZ(lab, xyz); setXYZ(xyz); } /** Get the color in CIELAB color space using the sRGB working space and reference white D65. */ void Color::getLab (double &l, double &a, double &b) const { valarray rgb(3), lab(3); getRGB(rgb); RGB2Lab(rgb, lab); l = lab[0]; a = lab[1]; b = lab[2]; } void Color::getLab (std::valarray &lab) const { lab.resize(3); valarray rgb(3); getRGB(rgb); RGB2Lab(rgb, lab); } // static inline double sqr (double x) {return x*x;} static inline double cube (double x) {return x*x*x;} void Color::Lab2XYZ (const valarray &lab, valarray &xyz) { xyz.resize(3); double wx=0.95047, wy=1.00, wz=1.08883; // reference white D65 double eps = 0.008856; double kappa = 903.3; double fy = (lab[0]+16)/116; double fx = lab[1]/500 + fy; double fz = fy - lab[2]/200; double xr = (cube(fx) > eps ? cube(fx) : (116*fx-16)/kappa); double yr = (lab[0] > kappa*eps ? cube((lab[0]+16)/116) : lab[0]/kappa); double zr = (cube(fz) > eps ? cube(fz) : (116*fz-16)/kappa); xyz[0] = xr*wx; xyz[1] = yr*wy; xyz[2] = zr*wz; } void Color::XYZ2RGB (const valarray &xyz, valarray &rgb) { rgb.resize(3); rgb[0] = 3.2404542*xyz[0] - 1.5371385*xyz[1] - 0.4985314*xyz[2]; rgb[1] = -0.9692660*xyz[0] + 1.8760108*xyz[1] + 0.0415560*xyz[2]; rgb[2] = 0.0556434*xyz[0] - 0.2040259*xyz[1] + 1.0572252*xyz[2]; for (int i=0; i < 3; i++) rgb[i] = (rgb[i] <= 0.0031308 ? 12.92*rgb[i] : 1.055*pow(rgb[i], 1/2.4)-0.055); } void Color::RGB2XYZ (valarray rgb, valarray &xyz) { xyz.resize(3); for (int i=0; i < 3; i++) rgb[i] = (rgb[i] <= 0.04045 ? rgb[i]/12.92 : pow((rgb[i]+0.055)/1.055, 2.4)); xyz[0] = 0.4124564*rgb[0] + 0.3575761*rgb[1] + 0.1804375*rgb[2]; xyz[1] = 0.2126729*rgb[0] + 0.7151522*rgb[1] + 0.0721750*rgb[2]; xyz[2] = 0.0193339*rgb[0] + 0.1191920*rgb[1] + 0.9503041*rgb[2]; } void Color::RGB2Lab (const valarray &rgb, valarray &lab) { double wx=0.95047, wy=1.00, wz=1.08883; // reference white D65 double eps = 0.008856; double kappa = 903.3; valarray xyz(3); RGB2XYZ(rgb, xyz); xyz[0] /= wx; xyz[1] /= wy; xyz[2] /= wz; double fx = (xyz[0] > eps ? pow(xyz[0], 1.0/3) : (kappa*xyz[0]+16)/116); double fy = (xyz[1] > eps ? pow(xyz[1], 1.0/3) : (kappa*xyz[1]+16)/116); double fz = (xyz[2] > eps ? pow(xyz[2], 1.0/3) : (kappa*xyz[2]+16)/116); lab[0] = 116*fy-16; lab[1] = 500*(fx-fy); lab[2] = 200*(fy-fz); } #if 0 /** Returns the Delta E difference (CIE 2000) between this and another color. */ double Color::deltaE (const Color &c) const { double l1, a1, b1; double l2, a2, b2; getLab(l1, a1, b1); c.getLab(l2, a2, b2); const double deltaL = l2-l1; const double lBar = (l1+l2)/2; const double c1 = hypot(a1, b1); const double c2 = hypot(a2, b2); const double cBar = (c1+c2)/2.0; const double g = (1.0-sqrt(pow(cBar, 7.0)/(pow(cBar, 7.0)+6103515625.0)))/2.0; const double aa1 = a1*(1.0+g); const double aa2 = a2*(1.0+g); const double cc1 = hypot(aa1, b1); const double cc2 = hypot(aa2, b2); const double ccBar = (cc1+cc2)/2.0; const double deltaCC = cc2-cc1; double hh1 = atan2(b1, aa1); if (hh1 < 0) hh1 += deg2rad(360); double hh2 = atan2(b2, aa2); if (hh2 < 0) hh2 += deg2rad(360); const double hhBar = (std::abs(hh1-hh2) > deg2rad(180) ? (hh1+hh2+deg2rad(360)) : (hh1+hh2))/2.0; const double t = 1.0 - 0.17*cos(hhBar-deg2rad(30.0)) + 0.24*cos(2.0*hhBar) + 0.32*cos(3.0*hhBar+deg2rad(6.0)) - 0.20*cos(4.0*hhBar-deg2rad(63.0)); double deltaHH = hh2-hh1; if (deltaHH < deg2rad(-180)) deltaHH += deg2rad(360); else if (deltaHH > deg2rad(180)) deltaHH -= deg2rad(360); const double deltaHHH = 2.0*sqrt(cc1*cc2)*sin(deltaHH/2.0); const double sl = 1.0 + 0.015*sqr(lBar-50.0)/sqrt(20.0+sqr(lBar-50.0)); const double sc = 1.0 + 0.045*ccBar; const double sh = 1.0 + 0.015*ccBar*t; const double deltaTheta = deg2rad(30)*exp(-sqr((hhBar-deg2rad(275))/deg2rad(25))); const double rc = 2.0*sqrt(pow(ccBar, 7)/(pow(ccBar, 7)+6103515625.0)); const double rt = -rc*sin(2.0*deltaTheta); const double deltaE = sqrt(sqr(deltaL/sl) + sqr(deltaCC/sc) + sqr(deltaHHH/sh) + rt*deltaCC/sc*deltaHHH/sh); return deltaE; } #endif int Color::numComponents (ColorSpace colorSpace) { switch (colorSpace) { case ColorSpace::GRAY: return 1; case ColorSpace::LAB: case ColorSpace::RGB: return 3; case ColorSpace::CMYK: return 4; } return 0; } dvisvgm-2.8.1/src/PreScanDVIReader.hpp0000664000175000017500000000353413510660062014451 00000000000000/************************************************************************* ** PreScanDVIReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PRESCANDVIREADER_HPP #define PRESCANDVIREADER_HPP #include "BasicDVIReader.hpp" struct DVIActions; class PreScanDVIReader : public BasicDVIReader { public: PreScanDVIReader (std::istream &is, DVIActions *actions); unsigned currentPageNumber () const override {return _currentPageNumber;} protected: void cmdBop (int) override; void cmdXXX (int len) override; private: DVIActions *_actions; unsigned _currentPageNumber; }; #endif dvisvgm-2.8.1/src/CMapReader.hpp0000664000175000017500000000601013560004141013356 00000000000000/************************************************************************* ** CMapReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CMAPREADER_HPP #define CMAPREADER_HPP #include #include #include #include #include #include "MessageException.hpp" struct CMap; class InputReader; class CMapReader { class Token { public: enum class Type {UNKNOWN, END, DELIM, NUMBER, STRING, NAME, OPERATOR}; public: explicit Token (InputReader &ir); void scan (InputReader &ir); Type type () const {return _type;} const std::string& strvalue () const {return _value;} double numvalue () const {return std::atof(_value.c_str());} private: Type _type; std::string _value; }; public: std::unique_ptr read (const std::string &fname); std::unique_ptr read (std::istream &is, const std::string &name); protected: Token popToken () {Token t=_tokens.back(); _tokens.pop_back(); return t;} void executeOperator (const std::string &op, InputReader &ir); void parseCIDChars (InputReader &ir, bool isRange); void op_beginbfchar (InputReader &ir); void op_beginbfrange (InputReader &ir); void op_begincidchar (InputReader &ir); void op_begincidrange (InputReader &ir); void op_def (InputReader &ir); void op_endcmap (InputReader &ir); void op_usecmap (InputReader &ir); private: std::unique_ptr _cmap; ///< pointer to CMap being read std::vector _tokens; ///< stack of tokens to be processed bool _inCMap=false; ///< true if operator begincmap has been executed }; struct CMapReaderException : public MessageException { explicit CMapReaderException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/FontCache.hpp0000664000175000017500000000545113536436567013305 00000000000000/************************************************************************* ** FontCache.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTCACHE_HPP #define FONTCACHE_HPP #include #include #include #include "Glyph.hpp" class FontCache { public: struct FontInfo { std::string name; // fontname uint16_t version; // file format version std::vector checksum; // checksum of file data uint32_t numchars; // number of characters uint32_t numbytes; // number of bytes uint32_t numcmds; // number of path commands }; public: ~FontCache () {clear();} bool read (const std::string &fontname, const std::string &dir); bool read (const std::string &fontname, std::istream &is); bool write (const std::string &dir) const; bool write (const std::string &fontname, const std::string &dir) const; bool write (const std::string &fontname, std::ostream &os) const; const Glyph* getGlyph (int c) const; void setGlyph (int c, const Glyph &glyph); void clear (); const std::string& fontname () const {return _fontname;} static bool fontinfo (const std::string &dirname, std::vector &infos, std::vector &invalid); static bool fontinfo (std::istream &is, FontInfo &info); static void fontinfo (const std::string &dirname, std::ostream &os, bool purge=false); private: static const uint8_t FORMAT_VERSION; std::string _fontname; std::map _glyphs; bool _changed=false; }; #endif dvisvgm-2.8.1/src/Bezier.hpp0000664000175000017500000000470613536436371012666 00000000000000/************************************************************************* ** Bezier.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef BEZIER_HPP #define BEZIER_HPP #include #include "BoundingBox.hpp" #include "Pair.hpp" class Matrix; class Bezier { public: Bezier (); Bezier (const DPair &p0, const DPair &p1, const DPair &p2); Bezier (const DPair &p0, const DPair &p1, const DPair &p2, const DPair &p3); Bezier (const Bezier &source, double t0, double t1); void setPoints (const DPair &p0, const DPair &p1, const DPair &p2, const DPair &p3); void reverse (); DPair valueAt (double t) const; DPair blossomValue (double u, double v, double w) const; void subdivide (double t, Bezier *bezier1, Bezier *bezier2) const; Bezier& transform (const Matrix &matrix); int approximate (double delta, std::vector &p, std::vector *t=nullptr) const; const DPair& point (int i) const {return _points[i];} int reduceDegree (double delta, std::vector &p) const; BoundingBox getBBox () const; protected: int approximate (double delta, double t0, double t1, std::vector &p, std::vector *t) const; private: DPair _points[4]; }; #endif dvisvgm-2.8.1/src/DvisvgmSpecialHandler.cpp0000664000175000017500000004331613510660062015643 00000000000000/************************************************************************* ** DvisvgmSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "DvisvgmSpecialHandler.hpp" #include "InputBuffer.hpp" #include "InputReader.hpp" #include "Length.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" #include "utility.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; DvisvgmSpecialHandler::DvisvgmSpecialHandler () : _currentMacro(_macros.end()), _defsParser(&SVGTree::appendToDefs, &SVGTree::pushDefsContext, &SVGTree::popDefsContext), _pageParser(&SVGTree::appendToPage, &SVGTree::pushPageContext, &SVGTree::popPageContext) { } void DvisvgmSpecialHandler::preprocess (const string&, istream &is, SpecialActions&) { struct Command { const char *name; void (DvisvgmSpecialHandler::*handler)(InputReader&); }; constexpr array commands {{ {"raw", &DvisvgmSpecialHandler::preprocessRaw}, {"rawdef", &DvisvgmSpecialHandler::preprocessRawDef}, {"rawset", &DvisvgmSpecialHandler::preprocessRawSet}, {"endrawset", &DvisvgmSpecialHandler::preprocessEndRawSet}, {"rawput", &DvisvgmSpecialHandler::preprocessRawPut} }}; StreamInputReader ir(is); const string cmdstr = ir.getWord(); auto it = find_if(commands.begin(), commands.end(), [&](const Command &cmd) { return cmd.name == cmdstr; }); if (it != commands.end()) { ir.skipSpace(); (this->*it->handler)(ir); } } void DvisvgmSpecialHandler::preprocessRawSet (InputReader &ir) { _nestingLevel++; string id = ir.getString(); if (id.empty()) throw SpecialException("definition of unnamed SVG fragment"); if (_nestingLevel > 1) throw SpecialException("nested definition of SVG fragment '" + id + "'"); _currentMacro = _macros.find(id); if (_currentMacro != _macros.end()) { _currentMacro = _macros.end(); throw SpecialException("redefinition of SVG fragment '" + id + "'"); } pair entry(id, StringVector()); pair state = _macros.emplace(move(entry)); _currentMacro = state.first; } void DvisvgmSpecialHandler::preprocessEndRawSet (InputReader&) { if (_nestingLevel > 0 && --_nestingLevel == 0) _currentMacro = _macros.end(); } void DvisvgmSpecialHandler::preprocessRaw (InputReader &ir) { if (_currentMacro == _macros.end()) return; string str = ir.getLine(); if (!str.empty()) _currentMacro->second.emplace_back("P"+str); } void DvisvgmSpecialHandler::preprocessRawDef (InputReader &ir) { if (_currentMacro == _macros.end()) return; string str = ir.getLine(); if (!str.empty()) _currentMacro->second.emplace_back("D"+str); } void DvisvgmSpecialHandler::preprocessRawPut (InputReader &ir) { if (_currentMacro != _macros.end()) throw SpecialException("dvisvgm:rawput not allowed inside rawset/endrawset"); } /** Evaluates and executes a dvisvgm special statement. * @param[in] prefix special prefix read by the SpecialManager * @param[in] is the special statement is read from this stream * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ bool DvisvgmSpecialHandler::process (const string &prefix, istream &is, SpecialActions &actions) { struct Command { const char *name; void (DvisvgmSpecialHandler::*handler)(InputReader&, SpecialActions&); }; constexpr array commands {{ {"raw", &DvisvgmSpecialHandler::processRaw}, {"rawdef", &DvisvgmSpecialHandler::processRawDef}, {"rawset", &DvisvgmSpecialHandler::processRawSet}, {"endrawset", &DvisvgmSpecialHandler::processEndRawSet}, {"rawput", &DvisvgmSpecialHandler::processRawPut}, {"bbox", &DvisvgmSpecialHandler::processBBox}, {"img", &DvisvgmSpecialHandler::processImg} }}; StreamInputReader ir(is); const string cmdstr = ir.getWord(); auto it = find_if(commands.begin(), commands.end(), [&](const Command &cmd) { return cmd.name == cmdstr; }); if (it != commands.end()) { ir.skipSpace(); (this->*it->handler)(ir, actions); } return true; } /** Replaces constants of the form {?name} by their corresponding value. * @param[in,out] str text to expand * @param[in] actions interfcae to the world outside the special handler */ static void expand_constants (string &str, SpecialActions &actions) { bool repl_bbox = true; while (repl_bbox) { size_t pos = str.find("{?bbox "); if (pos == string::npos) repl_bbox = false; else { size_t endpos = pos+7; while (endpos < str.length() && isalnum(str[endpos])) ++endpos; if (str[endpos] == '}') { BoundingBox &box=actions.bbox(str.substr(pos+7, endpos-pos-7)); str.replace(pos, endpos-pos+1, box.toSVGViewBox()); } else repl_bbox = false; } } struct Constant { const char *name; string val; }; const array constants {{ {"x", XMLString(actions.getX())}, {"y", XMLString(actions.getY())}, {"color", actions.getColor().svgColorString()}, {"matrix", actions.getMatrix().toSVG()}, {"nl", "\n"}, }}; for (const Constant &constant : constants) { const string pattern = string("{?")+constant.name+"}"; size_t pos = str.find(pattern); while (pos != string::npos) { str.replace(pos, strlen(constant.name)+3, constant.val); pos = str.find(pattern, pos+constant.val.length()); // look for further matches } } } /** Processes raw SVG fragments from the input stream. The SVG data must represent * a single or multiple syntactically complete XML parts, like opening/closing tags, * comments, or CDATA blocks. These must not be split and distributed over several * 'raw' statements. Elements can be split but element tags can't. * Example: "" is ok. */ void DvisvgmSpecialHandler::processRaw (InputReader &ir, SpecialActions &actions) { if (_nestingLevel == 0) { string xml = ir.getLine(); if (!xml.empty()) { expand_constants(xml, actions); _pageParser.parse(xml, actions); } } } void DvisvgmSpecialHandler::processRawDef (InputReader &ir, SpecialActions &actions) { if (_nestingLevel == 0) { string xml = ir.getLine(); if (!xml.empty()) { expand_constants(xml, actions); _defsParser.parse(xml, actions); } } } void DvisvgmSpecialHandler::processRawSet (InputReader&, SpecialActions&) { _nestingLevel++; } void DvisvgmSpecialHandler::processEndRawSet (InputReader&, SpecialActions&) { if (_nestingLevel > 0) _nestingLevel--; } void DvisvgmSpecialHandler::processRawPut (InputReader &ir, SpecialActions &actions) { if (_nestingLevel > 0) return; string id = ir.getString(); auto it = _macros.find(id); if (it == _macros.end()) throw SpecialException("undefined SVG fragment '" + id + "' referenced"); StringVector &defvector = it->second; for (string &defstr : defvector) { char &type = defstr[0]; string def = defstr.substr(1); if ((type == 'P' || type == 'D') && !def.empty()) { expand_constants(def, actions); if (type == 'P') _pageParser.parse(def, actions); else { // type == 'D' _defsParser.parse(def, actions); type = 'L'; // locked } } } } /** Embeds the virtual rectangle (x, y ,w , h) into the current bounding box, * where (x,y) is the lower left vertex composed of the current DVI position. * @param[in] w width of the rectangle in PS point units * @param[in] h height of the rectangle in PS point units * @param[in] d depth of the rectangle in PS point units * @param[in] transform if true, apply the current transformation matrix to the rectangle * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ static void update_bbox (Length w, Length h, Length d, bool transform, SpecialActions &actions) { double x = actions.getX(); double y = actions.getY(); BoundingBox bbox1(x, y, x+w.bp(), y-h.bp()); BoundingBox bbox2(x, y, x+w.bp(), y+d.bp()); if (transform) { bbox1.transform(actions.getMatrix()); bbox2.transform(actions.getMatrix()); } actions.embed(bbox1); actions.embed(bbox2); } /** Reads a length value including a trailing unit specifier and returns it. */ static Length read_length (InputReader &ir) { Length length; ir.skipSpace(); if (!isalpha(ir.peek())) { double val = ir.getDouble(); string unit = isalpha(ir.peek()) ? ir.getString(2) : "pt"; length = Length(val, unit); } return length; } /** Evaluates the special dvisvgm:bbox. * variant 1: dvisvgm:bbox [r[el]] [] [transform] * variant 2: dvisvgm:bbox a[bs] [transform] * variant 3: dvisvgm:bbox f[ix] [transform] * variant 4: dvisvgm:bbox n[ew] * variant 5: dvisvgm:bbox lock | unlock */ void DvisvgmSpecialHandler::processBBox (InputReader &ir, SpecialActions &actions) { ir.skipSpace(); if (ir.check("lock")) actions.bbox().lock(); else if (ir.check("unlock")) actions.bbox().unlock(); else { int c = ir.peek(); try { if (!isalpha(c)) c = 'r'; // no mode specifier => relative box parameters else { while (!isspace(ir.peek())) // skip trailing characters ir.get(); if (c == 'n') { // "new": create new local bounding box ir.skipSpace(); string name; while (isalnum(ir.peek())) name += char(ir.get()); ir.skipSpace(); if (!name.empty() && ir.eof()) actions.bbox(name, true); // create new user box } else if (c == 'a' || c == 'f') { // "abs" or "fix" Length lengths[4]; for (Length &len : lengths) len = read_length(ir); BoundingBox b(lengths[0], lengths[1], lengths[2], lengths[3]); ir.skipSpace(); if (ir.check("transform")) b.transform(actions.getMatrix()); if (c == 'a') actions.embed(b); else { actions.bbox() = b; actions.bbox().lock(); } } } if (c == 'r') { Length w = read_length(ir); Length h = read_length(ir); Length d = read_length(ir); ir.skipSpace(); update_bbox(w, h, d, ir.check("transform"), actions); } } catch (const UnitException &e) { throw SpecialException(string("dvisvgm:bbox: ") + e.what()); } } } void DvisvgmSpecialHandler::processImg (InputReader &ir, SpecialActions &actions) { try { Length w = read_length(ir); Length h = read_length(ir); string f = ir.getString(); update_bbox(w, h, Length(0), false, actions); auto img = util::make_unique("image"); img->addAttribute("x", actions.getX()); img->addAttribute("y", actions.getY()); img->addAttribute("width", w.bp()); img->addAttribute("height", h.bp()); img->addAttribute("xlink:href", f); if (!actions.getMatrix().isIdentity()) img->addAttribute("transform", actions.getMatrix().toSVG()); actions.svgTree().appendToPage(std::move(img)); } catch (const UnitException &e) { throw SpecialException(string("dvisvgm:img: ") + e.what()); } } void DvisvgmSpecialHandler::dviPreprocessingFinished () { string id; if (_currentMacro != _macros.end()) id = _currentMacro->first; // ensure all pattern definitions are closed after pre-processing the whole DVI file _currentMacro = _macros.end(); _nestingLevel = 0; if (!id.empty()) throw SpecialException("missing dvisvgm:endrawset for SVG fragment '" + id + "'"); } void DvisvgmSpecialHandler::dviEndPage (unsigned, SpecialActions &actions) { _defsParser.flush(actions); _pageParser.flush(actions); actions.bbox().unlock(); for (auto &strvecpair : _macros) { StringVector &vec = strvecpair.second; for (string &str : vec) { // activate locked parts of a pattern again if (str[0] == 'L') str[0] = 'D'; } } } vector DvisvgmSpecialHandler::prefixes() const { vector pfx {"dvisvgm:"}; return pfx; } //////////////////////////////////////////////////////////////////////////////// /** Parses a fragment of XML code, creates corresponding XML nodes and adds them * to the SVG tree. The code may be split and processed by several calls of this * function. Incomplete chunks that can't be processed yet are stored and picked * up again together with the next incoming XML fragment. If no further code should * be appended, parameter 'finish' must be set. * @param[in] xml XML fragment to parse * @param[in] actions object providing the SVG tree functions * @param[in] finish if true, no more XML is expected and parsing is finished */ void DvisvgmSpecialHandler::XMLParser::parse (const string &xml, SpecialActions &actions, bool finish) { // collect/extract an XML fragment that only contains complete tags // incomplete tags are held back _xmlbuf += xml; size_t left=0, right; while (left != string::npos) { right = _xmlbuf.find('<', left); if (left < right && left < _xmlbuf.length()) // plain text found? (actions.svgTree().*_append)(util::make_unique(_xmlbuf.substr(left, right-left))); if (right != string::npos) { left = right; if (_xmlbuf.compare(left, 9, "", left+9); if (right == string::npos) { if (finish) throw SpecialException("expected ']]>' at end of CDATA block"); break; } (actions.svgTree().*_append)(util::make_unique(_xmlbuf.substr(left+9, right-left-9))); right += 2; } else if (_xmlbuf.compare(left, 4, "", left+4); if (right == string::npos) { if (finish) throw SpecialException("expected '-->' at end of comment"); break; } (actions.svgTree().*_append)(util::make_unique(_xmlbuf.substr(left+4, right-left-4))); right += 2; } else if (_xmlbuf.compare(left, 2, "", left+2); if (right == string::npos) { if (finish) throw SpecialException("expected '?>' at end of processing instruction"); break; } (actions.svgTree().*_append)(util::make_unique(_xmlbuf.substr(left, right-left+2))); right++; } else if (_xmlbuf.compare(left, 2, "', left+2); if (right == string::npos) { if (finish) throw SpecialException("missing '>' at end of closing XML tag"); break; } closeElement(_xmlbuf.substr(left+2, right-left-2), actions); } else { right = _xmlbuf.find('>', left+1); if (right == string::npos) { if (finish) throw SpecialException("missing '>' or '/>' at end of opening XML tag"); break; } openElement(_xmlbuf.substr(left+1, right-left-1), actions); } } left = right; if (right != string::npos) left++; } if (left == string::npos) _xmlbuf.clear(); else _xmlbuf.erase(0, left); } /** Processes an opening element tag. * @param[in] tag tag without leading and trailing angle brackets */ void DvisvgmSpecialHandler::XMLParser::openElement (const string &tag, SpecialActions &actions) { StringInputBuffer ib(tag); BufferInputReader ir(ib); string name = ir.getString("/ \t\n\r"); ir.skipSpace(); auto elemNode = util::make_unique(name); map attribs; if (ir.parseAttributes(attribs, true, "\"'")) { for (const auto &attrpair : attribs) elemNode->addAttribute(attrpair.first, attrpair.second); } ir.skipSpace(); if (ir.peek() == '/') // end of empty element tag (actions.svgTree().*_append)(std::move(elemNode)); else if (ir.peek() < 0) { // end of opening tag _nameStack.push_back(name); (actions.svgTree().*_pushContext)(std::move(elemNode)); } else throw SpecialException("'>' or '/>' expected at end of opening tag <"+name); } /** Processes a closing element tag. * @param[in] tag tag without leading and trailing angle brackets */ void DvisvgmSpecialHandler::XMLParser::closeElement (const string &tag, SpecialActions &actions) { StringInputBuffer ib(tag); BufferInputReader ir(ib); string name = ir.getString(" \t\n\r"); ir.skipSpace(); if (ir.peek() >= 0) throw SpecialException("'>' expected at end of closing tag "); if (_nameStack.back() != name) throw SpecialException("expected but found "); (actions.svgTree().*_popContext)(); _nameStack.pop_back(); } /** Processes any remaining XML fragments, checks for missing closing tags, * and resets the parser state. */ void DvisvgmSpecialHandler::XMLParser::flush (SpecialActions &actions) { if (!_xmlbuf.empty()) { parse("", actions, true); _xmlbuf.clear(); } string tags; while (!_nameStack.empty()) { tags += ", "; _nameStack.pop_back(); } if (!tags.empty()) { tags.resize(tags.length()-2); throw SpecialException("missing closing tags: "+tags); } }dvisvgm-2.8.1/src/DVIToSVGActions.cpp0000664000175000017500000002771213561274402014262 00000000000000/************************************************************************* ** DVIToSVGActions.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "BoundingBox.hpp" #include "DVIToSVG.hpp" #include "DVIToSVGActions.hpp" #include "Font.hpp" #include "FontManager.hpp" #include "GlyphTracerMessages.hpp" #include "System.hpp" #include "utility.hpp" using namespace std; void DVIToSVGActions::reset() { _usedChars.clear(); _usedFonts.clear(); _bbox = BoundingBox(); _currentFontNum = -1; _bgcolor = Color::TRANSPARENT; } /** Change current horizontal position. * @param[in] x new horizontal position * @param[in] forceSVGMove if true, creates an explicit position change in the SVG tree */ void DVIToSVGActions::moveToX (double x, bool forceSVGMove) { SpecialManager::instance().notifyPositionChange(getX(), getY(), *this); if (forceSVGMove) _svg.setX(x); } /** Change current vertical position. * @param[in] y new vertical position * @param[in] forceSVGMove if true, creates an explicit position change in the SVG tree */ void DVIToSVGActions::moveToY (double y, bool forceSVGMove) { SpecialManager::instance().notifyPositionChange(getX(), getY(), *this); if (forceSVGMove) _svg.setY(y); } FilePath DVIToSVGActions::getSVGFilePath (unsigned pageno) const { FilePath path; if (auto dvi2svg = dynamic_cast(_dvireader)) path = dvi2svg->getSVGFilePath(pageno); return path; } string DVIToSVGActions::getBBoxFormatString () const { string boxstr; if (auto dvi2svg = dynamic_cast(_dvireader)) boxstr = dvi2svg->getUserBBoxString(); return boxstr; } /** This method is called when a "set char" command was found in the DVI file. * It draws a character of the current font. * @param[in] x horizontal position of left bounding box edge * @param[in] y vertical position of the character's baseline * @param[in] c character code relative to the current font * @param[in] vertical true if we're in vertical mode * @param[in] font font to be used */ void DVIToSVGActions::setChar (double x, double y, unsigned c, bool vertical, const Font &font) { if (_outputLocked) return; // If we use SVG fonts there is no need to record all font name/char/size combinations // because the SVG font mechanism handles this automatically. It's sufficient to // record font names and chars. The various font sizes can be ignored here. // For a given font object, Font::uniqueFont() returns the same unique font object for // all fonts with the same name. _usedChars[SVGTree::USE_FONTS ? font.uniqueFont() : &font].insert(c); // However, we record all required fonts _usedFonts.insert(&font); _svg.appendChar(c, x, y); static string fontname; GlyphTracerMessages callback(fontname != font.name(), false); fontname = font.name(); GlyphMetrics metrics; font.getGlyphMetrics(c, vertical, metrics); auto pf = dynamic_cast(&font); if (PhysicalFont::EXACT_BBOX && pf) { GlyphMetrics exact_metrics; pf->getExactGlyphBox(c, exact_metrics, vertical, &callback); if (vertical) { // move top of bbox to upper margin of glyph (just an approximation yet) y += (metrics.d-exact_metrics.h-exact_metrics.d)/2; } metrics = exact_metrics; } BoundingBox bbox(x-metrics.wl, y-metrics.h, x+metrics.wr, y+metrics.d); // update bounding box if (!getMatrix().isIdentity()) bbox.transform(getMatrix()); embed(bbox); #if 0 XMLElement *rect = new XMLElement("rect"); rect->addAttribute("x", x-metrics.wl); rect->addAttribute("y", y-metrics.h); rect->addAttribute("width", metrics.wl+metrics.wr); rect->addAttribute("height", metrics.h+metrics.d); rect->addAttribute("fill", "none"); rect->addAttribute("stroke", "red"); rect->addAttribute("stroke-width", "0.5"); _svg.appendToPage(rect); if (metrics.d > 0) { XMLElement *line = new XMLElement("line"); line->addAttribute("x1", x-metrics.wl); line->addAttribute("y1", y); line->addAttribute("x2", x+metrics.wr); line->addAttribute("y2", y); line->addAttribute("stroke", "blue"); line->addAttribute("stroke-width", "0.5"); _svg.appendToPage(line); } if (metrics.wl > 0) { XMLElement *line = new XMLElement("line"); line->addAttribute("x1", x); line->addAttribute("y1", y-metrics.h); line->addAttribute("x2", x); line->addAttribute("y2", y+metrics.d); line->addAttribute("stroke", "blue"); line->addAttribute("stroke-width", "0.5"); _svg.appendToPage(line); } #endif } /** This method is called when a "set rule" or "put rule" command was found in the * DVI file. It draws a solid unrotated rectangle. * @param[in] x horizontal position of left edge * @param[in] y vertical position of bottom(!) edge * @param[in] height length of the vertical edges * @param[in] width length of the horizontal edges */ void DVIToSVGActions::setRule (double x, double y, double height, double width) { if (_outputLocked) return; // (x,y) is the lower left corner of the rectangle auto rect = util::make_unique("rect"); rect->addAttribute("x", x); rect->addAttribute("y", y-height); rect->addAttribute("height", height); rect->addAttribute("width", width); if (!getMatrix().isIdentity()) rect->addAttribute("transform", getMatrix().toSVG()); if (getColor() != Color::BLACK) rect->addAttribute("fill", _svg.getColor().svgColorString()); _svg.appendToPage(std::move(rect)); // update bounding box BoundingBox bb(x, y-height, x+width, y); if (!getMatrix().isIdentity()) bb.transform(getMatrix()); embed(bb); } /** This method is called when a "set font" command was found in the DVI file. The * font must be previously defined. * @param[in] num unique number of the font in the DVI file (not necessarily equal to the DVI font number) * @param[in] font pointer to the font object (always represents a physical font and never a virtual font) */ void DVIToSVGActions::setFont (int num, const Font &font) { _currentFontNum = num; _svg.setFont(num, font); } /** This method is called when a "special" command was found in the DVI file. * @param[in] spc the special expression * @param[in] dvi2bp factor to scale DVI units to PS points * @param[in] preprocessing if true, the DVI file is being pre-processed */ void DVIToSVGActions::special (const string &spc, double dvi2bp, bool preprocessing) { try { if (preprocessing) SpecialManager::instance().preprocess(spc, *this); else SpecialManager::instance().process(spc, dvi2bp, *this); // @@ output message in case of unsupported specials? } catch (const SpecialException &e) { Message::estream(true) << "error in special: " << e.what() << '\n'; } } /** This method is called when a "begin of page (bop)" command was found in the DVI file. * @param[in] pageno physical page number * @param[in] c array with 10 components representing \\count0 ... \\count9. c[0] contains the * current (printed) page number (may differ from page count) */ void DVIToSVGActions::beginPage (unsigned pageno, const vector&) { SpecialManager::instance().notifyBeginPage(pageno, *this); _svg.newPage(++_pageCount); _bbox = BoundingBox(); // clear bounding box _boxes.clear(); } /** This method is called when an "end of page (eop)" command was found in the DVI file. */ void DVIToSVGActions::endPage (unsigned pageno) { SpecialManager::instance().notifyEndPage(pageno, *this); Matrix matrix = _dvireader->getPageTransformation(); _svg.transformPage(matrix); if (_bgcolor != Color::TRANSPARENT) { // create a rectangle filled with the background color auto rect = util::make_unique("rect"); rect->addAttribute("x", _bbox.minX()); rect->addAttribute("y", _bbox.minY()); rect->addAttribute("width", _bbox.width()); rect->addAttribute("height", _bbox.height()); rect->addAttribute("fill", _bgcolor.svgColorString()); _svg.prependToPage(std::move(rect)); } } void DVIToSVGActions::setBgColor (const Color &color) { _bgcolor = color; } void DVIToSVGActions::embed(const BoundingBox &bbox) { _bbox.embed(bbox); for (auto &strboxpair : _boxes) strboxpair.second.embed(bbox); } void DVIToSVGActions::embed(const DPair& p, double r) { if (r == 0) _bbox.embed(p); else _bbox.embed(p, r); for (auto &strboxpair : _boxes) strboxpair.second.embed(p, r); } BoundingBox& DVIToSVGActions::bbox(const string& name, bool reset) { BoundingBox &box = _boxes[name]; if (reset) box = BoundingBox(); return box; } /** This method is called by subprocesses like the PS handler when * a computation step has finished. Since the total number of steps * can't be determined in advance, we don't show a percent value but * a rotating dash. */ void DVIToSVGActions::progress (const char *id) { if (PROGRESSBAR_DELAY < 1000) { static double time=System::time(); // slow down updating the progress indicator to prevent flickering if (System::time() - time > 0.1) { progress(0, 0, id); time = System::time(); } } } /** Returns the number of digits of a given integer. */ static int digits (int n) { if (n == 0) return 1; if (n > 0) return util::ilog10(n)+1; return util::ilog10(-n)+2; } /** Draws a simple progress indicator. * @param[in] current current iteration step (of 'total' steps) * @param[in] total total number of iteration steps * @param[in] id ID of the subprocess providing the information */ void DVIToSVGActions::progress (size_t current, size_t total, const char *id) { static double time=0; static bool draw=false; // show progress indicator? static const char *prev_id=nullptr; if (current == 0 && total > 0) { time = System::time(); draw = false; Message::mstream() << '\n'; } // don't show the progress indicator before the given time has elapsed if (!draw && System::time()-time > PROGRESSBAR_DELAY) { draw = true; Terminal::cursor(false); } if (draw && (System::time() - time > 0.1 || (total > 0 && current == total) || prev_id != id)) { static int step = -1; // >=0: rotating dash static size_t prev_current=0, prev_total=1; const char *tips = "-\\|/"; if (total == 0) { current = prev_current; total = prev_total; step = (step+1) % 4; } else { prev_current = current; prev_total = total; step = -1; } // adapt length of progress indicator to terminal width int cols = Terminal::columns(); int width = (cols == 0 || cols > 60) ? 50 : 49-60+cols; double factor = double(current)/double(total); int length = int(width*factor); Message::mstream(false, Message::MC_PROGRESS) << '[' << string(length, '=') << (factor < 1.0 ? (step < 0 ? ' ' : tips[step]) : '=') << string(width-length, ' ') << "] " << string(3-digits(int(100*factor)), ' ') << int(100*factor) << "%\r"; // overprint indicator when finished if (factor == 1.0) { Message::estream().clearline(); Terminal::cursor(true); } time = System::time(); prev_id = id; } } dvisvgm-2.8.1/src/MiKTeXCom.hpp0000664000175000017500000000354613510660062013173 00000000000000/************************************************************************* ** MiKTeXCom.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MIKTEXCOM_HPP #define MIKTEXCOM_HPP #include #include "windows.hpp" #ifdef _MSC_VER #import using namespace MiKTeXSession2_9; #else #include "miktex-session.h" #endif class MiKTeXCom { public: MiKTeXCom (); ~MiKTeXCom (); std::string getBinDir (); std::string getVersion (); const char* findFile (const char* fname); private: #ifdef _MSC_VER ISession2Ptr _session; #else ISession2 *_session; #endif }; #endif dvisvgm-2.8.1/src/SVGTree.cpp0000664000175000017500000002773213510660062012710 00000000000000/************************************************************************* ** SVGTree.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "BoundingBox.hpp" #include "DVIToSVG.hpp" #include "FileSystem.hpp" #include "Font.hpp" #include "FontManager.hpp" #include "FontWriter.hpp" #include "SVGCharHandlerFactory.hpp" #include "SVGTree.hpp" #include "XMLDocument.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; // static class variables bool SVGTree::CREATE_CSS=true; bool SVGTree::USE_FONTS=true; FontWriter::FontFormat SVGTree::FONT_FORMAT = FontWriter::FontFormat::SVG; bool SVGTree::CREATE_USE_ELEMENTS=false; bool SVGTree::RELATIVE_PATH_CMDS=false; bool SVGTree::MERGE_CHARS=true; bool SVGTree::ADD_COMMENTS=false; double SVGTree::ZOOM_FACTOR=1.0; SVGTree::SVGTree () : _charHandler(SVGCharHandlerFactory::createHandler()) { reset(); } /** Clears the SVG tree and initializes the root element. */ void SVGTree::reset () { _doc.clear(); auto rootNode = util::make_unique("svg"); rootNode->addAttribute("version", "1.1"); rootNode->addAttribute("xmlns", "http://www.w3.org/2000/svg"); rootNode->addAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); _root = rootNode.get(); _doc.setRootNode(std::move(rootNode)); _page = _defs = nullptr; _styleCDataNode = nullptr; } /** Sets the bounding box of the document. * @param[in] bbox bounding box in PS point units */ void SVGTree::setBBox (const BoundingBox &bbox) { if (ZOOM_FACTOR >= 0) { _root->addAttribute("width", XMLString(bbox.width()*ZOOM_FACTOR)+"pt"); _root->addAttribute("height", XMLString(bbox.height()*ZOOM_FACTOR)+"pt"); } _root->addAttribute("viewBox", bbox.toSVGViewBox()); } void SVGTree::setColor (const Color &c) { const Font *font = _charHandler->getFont(); if (!font || font->color() == Color::BLACK) _charHandler->setColor(c); } void SVGTree::setFont (int num, const Font &font) { _charHandler->setFont(font, num); // set default color assigned to the font if (font.color() != Color::BLACK && getColor() != font.color()) setColor(font.color()); } bool SVGTree::setFontFormat (string formatstr) { size_t pos = formatstr.find(','); string opt; if (pos != string::npos) { opt = formatstr.substr(pos+1); formatstr = formatstr.substr(0, pos); } FontWriter::FontFormat format = FontWriter::toFontFormat(formatstr); if (format == FontWriter::FontFormat::UNKNOWN) return false; FONT_FORMAT = format; FontWriter::AUTOHINT_FONTS = (opt == "autohint" || opt == "ah"); return true; } /** Starts a new page. * @param[in] pageno number of new page */ void SVGTree::newPage (int pageno) { auto pageNode = util::make_unique("g"); if (pageno >= 0) pageNode->addAttribute("id", string("page")+XMLString(pageno)); _charHandler->setInitialContextNode(pageNode.get()); _page = pageNode.get(); _root->append(std::move(pageNode)); _defsContextStack = stack(); _pageContextStack = stack(); } void SVGTree::appendToDefs (unique_ptr node) { if (!_defs) { auto defsNode = util::make_unique("defs"); _defs = defsNode.get(); _root->prepend(std::move(defsNode)); } XMLElement *parent = _defsContextStack.empty() ? _defs : _defsContextStack.top(); parent->append(std::move(node)); } void SVGTree::appendToPage (unique_ptr node) { XMLElement *parent = _pageContextStack.empty() ? _page : _pageContextStack.top(); parent->append(std::move(node)); _charHandler->setInitialContextNode(parent); } void SVGTree::prependToPage (unique_ptr node) { if (_pageContextStack.empty()) _page->prepend(std::move(node)); else _pageContextStack.top()->prepend(std::move(node)); } void SVGTree::transformPage (const Matrix &usermatrix) { if (!usermatrix.isIdentity()) _page->addAttribute("transform", usermatrix.toSVG()); } /** Creates an SVG element for a single glyph. * @param[in] c character number * @param[in] font font to extract the glyph from * @param[in] cb pointer to callback object for sending feedback to the glyph tracer (may be 0) * @return pointer to element node if glyph exists, 0 otherwise */ static unique_ptr createGlyphNode (int c, const PhysicalFont &font, GFGlyphTracer::Callback *cb) { Glyph glyph; if (!font.getGlyph(c, glyph, cb) || (!SVGTree::USE_FONTS && !SVGTree::CREATE_USE_ELEMENTS)) return nullptr; double sx=1.0, sy=1.0; double upem = font.unitsPerEm(); unique_ptr glyphNode; if (SVGTree::USE_FONTS) { double extend = font.style() ? font.style()->extend : 1; glyphNode = util::make_unique("glyph"); glyphNode->addAttribute("unicode", XMLString(font.unicode(c), false)); glyphNode->addAttribute("horiz-adv-x", XMLString(font.hAdvance(c)*extend)); glyphNode->addAttribute("vert-adv-y", XMLString(font.vAdvance(c))); string name = font.glyphName(c); if (!name.empty()) glyphNode->addAttribute("glyph-name", name); } else { glyphNode = util::make_unique("path"); glyphNode->addAttribute("id", "g"+to_string(FontManager::instance().fontID(&font))+"-"+to_string(c)); sx = font.scaledSize()/upem; sy = -sx; } ostringstream oss; glyph.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS, sx, sy); glyphNode->addAttribute("d", oss.str()); return glyphNode; } static string font_info (const Font &font) { ostringstream oss; if (auto nf = dynamic_cast(&font)) { oss << nf->familyName() << ' ' << nf->styleName() << "; " << nf->filename(); if (nf->style()) { if (nf->style()->bold != 0) oss << ", bold:" << XMLString(nf->style()->bold) << "pt"; if (nf->style()->extend != 1) oss << ", extent:" << XMLString(nf->style()->extend); if (nf->style()->slant != 0) oss << ", slant:" << XMLString(nf->style()->slant); } } return oss.str(); } void SVGTree::appendFontStyles (const unordered_set &fonts) { if (CREATE_CSS && USE_FONTS && !fonts.empty() && _page) { map sortmap; for (const Font *font : fonts) if (!dynamic_cast(font)) // skip virtual fonts sortmap[FontManager::instance().fontID(font)] = font; ostringstream style; // add font style definitions in ascending order for (auto &idfontpair : sortmap) { if (CREATE_CSS) { style << "text.f" << idfontpair.first << ' ' << "{font-family:" << idfontpair.second->name() << ";font-size:" << XMLString(idfontpair.second->scaledSize()) << "px"; if (idfontpair.second->color() != Color::BLACK) style << ";fill:" << idfontpair.second->color().svgColorString(); style << '}'; if (ADD_COMMENTS) { string info = font_info(*idfontpair.second); if (!info.empty()) style << " /* " << info << " */"; } style << '\n'; } } styleCDataNode()->append(style.str()); } } /** Appends glyph definitions of a given font to the defs section of the SVG tree. * @param[in] font font to be appended * @param[in] chars codes of the characters whose glyph outlines should be appended * @param[in] callback pointer to callback object for sending feedback to the glyph tracer (may be 0) */ void SVGTree::append (const PhysicalFont &font, const set &chars, GFGlyphTracer::Callback *callback) { if (chars.empty()) return; if (USE_FONTS) { if (FONT_FORMAT != FontWriter::FontFormat::SVG) { ostringstream style; FontWriter fontWriter(font); if (fontWriter.writeCSSFontFace(FONT_FORMAT, chars, style, callback)) styleCDataNode()->append(style.str()); } else { if (ADD_COMMENTS) { string info = font_info(font); if (!info.empty()) appendToDefs(util::make_unique(string(" font: ")+info+" ")); } auto fontNode = util::make_unique("font"); string fontname = font.name(); fontNode->addAttribute("id", fontname); fontNode->addAttribute("horiz-adv-x", XMLString(font.hAdvance())); auto faceNode = util::make_unique("font-face"); faceNode->addAttribute("font-family", fontname); faceNode->addAttribute("units-per-em", XMLString(font.unitsPerEm())); if (!font.verticalLayout()) { faceNode->addAttribute("ascent", XMLString(font.ascent())); faceNode->addAttribute("descent", XMLString(font.descent())); } fontNode->append(std::move(faceNode)); for (int c : chars) fontNode->append(createGlyphNode(c, font, callback)); appendToDefs(std::move(fontNode)); } } else if (CREATE_USE_ELEMENTS && &font != font.uniqueFont()) { // If the same character is used in various sizes, we don't want to embed the complete (lengthy) path // descriptions multiple times. Because they would only differ by a scale factor, it's better to // reference the already embedded path together with a transformation attribute and let the SVG renderer // scale the glyphs properly. This is only necessary if we don't want to use font but path elements. for (int c : chars) { auto useNode = util::make_unique("use"); useNode->addAttribute("id", "g"+to_string(FontManager::instance().fontID(&font))+"-"+to_string(c)); useNode->addAttribute("xlink:href", "#g"+to_string(FontManager::instance().fontID(font.uniqueFont()))+"-"+to_string(c)); double scale = font.scaledSize()/font.uniqueFont()->scaledSize(); if (scale != 1.0) useNode->addAttribute("transform", "scale("+XMLString(scale)+")"); appendToDefs(std::move(useNode)); } } else { for (int c : chars) appendToDefs(createGlyphNode(c, font, callback)); } } void SVGTree::pushDefsContext (unique_ptr node) { XMLElement *nodePtr = node.get(); if (_defsContextStack.empty()) appendToDefs(std::move(node)); else _defsContextStack.top()->append(std::move(node)); _defsContextStack.push(nodePtr); } void SVGTree::popDefsContext () { if (!_defsContextStack.empty()) _defsContextStack.pop(); } /** Pushes a new context element that will take all following nodes added to the page. */ void SVGTree::pushPageContext (unique_ptr node) { XMLElement *nodePtr = node.get(); if (_pageContextStack.empty()) _page->append(std::move(node)); else _pageContextStack.top()->append(std::move(node)); _pageContextStack.push(nodePtr); _charHandler->setInitialContextNode(nodePtr); } /** Pops the current context element and restored the previous one. */ void SVGTree::popPageContext () { if (!_pageContextStack.empty()) _pageContextStack.pop(); _charHandler->setInitialContextNode(_page); } XMLCData* SVGTree::styleCDataNode () { if (!_styleCDataNode) { auto styleNode = util::make_unique("style"); styleNode->addAttribute("type", "text/css"); auto cdataNode = util::make_unique(); _styleCDataNode = cdataNode.get(); styleNode->append(std::move(cdataNode)); _root->insertBefore(std::move(styleNode), _page); } return _styleCDataNode; } dvisvgm-2.8.1/src/GFGlyphTracer.cpp0000664000175000017500000000536213510660062014065 00000000000000/************************************************************************* ** GFGlyphTracer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "GFGlyphTracer.hpp" using namespace std; GFGlyphTracer::GFGlyphTracer () : GFTracer(_ifs, 0) { } /** Constructs a new glyph tracer. * @param[in] is GF input stream * @param[in] upp target units per PS point */ GFGlyphTracer::GFGlyphTracer (string &fname, double upp, Callback *cb) : GFTracer(_ifs, upp), _callback(cb) { if (_callback) _callback->setFont(fname); _ifs.open(fname, ios::binary); } void GFGlyphTracer::reset (string &fname, double upp) { if (_callback) _callback->setFont(fname); if (_ifs.is_open()) _ifs.close(); unitsPerPoint(upp); _ifs.open(fname, ios::binary); } bool GFGlyphTracer::executeChar (uint8_t c) { if (!_glyph) return false; if (_callback) _callback->beginChar(c); bool ok = GFTracer::executeChar(c); if (_callback) { if (ok) _callback->endChar(c); else _callback->emptyChar(c); } return ok; } void GFGlyphTracer::moveTo (double x, double y) { _glyph->moveto(int(x), int(y)); } void GFGlyphTracer::lineTo (double x, double y) { _glyph->lineto(int(x), int(y)); } void GFGlyphTracer::curveTo (double c1x, double c1y, double c2x, double c2y, double x, double y) { _glyph->cubicto(int(c1x), int(c1y), int(c2x), int(c2y), int(x), int(y)); } void GFGlyphTracer::closePath () { _glyph->closepath(); } void GFGlyphTracer::endChar (uint32_t c) { _glyph->clear(); GFTracer::endChar(c); } dvisvgm-2.8.1/src/PSPattern.cpp0000664000175000017500000001463713510660062013311 00000000000000/************************************************************************* ** PSPattern.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "BoundingBox.hpp" #include "PSPattern.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" #include "utility.hpp" #include "XMLNode.hpp" using namespace std; string PSPattern::svgID () const { return XMLString("pat")+XMLString(_id); } /** Appends the definition of this pattern to the "def" section of the SVG tree. */ void PSPattern::apply (SpecialActions &actions) { if (auto pattern = createPatternNode()) actions.svgTree().appendToDefs(std::move(pattern)); } ///////////////////////////////////////////////////////////////////////////// PSTilingPattern::PSTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep) : PSPattern(id), _bbox(bbox), _matrix(matrix), _xstep(xstep), _ystep(ystep) { _groupNode = PSTilingPattern::createGroupNode(); _groupNodePtr = _groupNode.get(); } /** Assigns a new group element. */ void PSTilingPattern::setGroupNode (unique_ptr node) { _groupNode = std::move(node); _groupNodePtr = _groupNode.get(); } /** Creates a new pattern element representing the pattern defined in the PS code. */ unique_ptr PSTilingPattern::createPatternNode () const { if (!_groupNode) return nullptr; BoundingBox box(_bbox.minX(), _bbox.minY(), _bbox.minX()+_xstep, _bbox.minY()+_ystep); auto pattern = util::make_unique("pattern"); pattern->addAttribute("id", svgID()); pattern->addAttribute("x", box.minX()); pattern->addAttribute("y", box.minY()); pattern->addAttribute("width", box.width()); pattern->addAttribute("height", box.height()); pattern->addAttribute("viewBox", box.toSVGViewBox()); pattern->addAttribute("patternUnits", "userSpaceOnUse"); if (!_matrix.isIdentity()) pattern->addAttribute("patternTransform", _matrix.toSVG()); if (_xstep < _bbox.width() || _ystep < _bbox.height()) { // overlapping tiles? // disable clipping at the tile borders => tiles become "transparent" pattern->addAttribute("overflow", "visible"); } if (auto clip = createClipNode()) pattern->append(std::move(clip)); pattern->append(std::move(_groupNode)); _groupNode.reset(); return pattern; } /** Creates a new clip element restricting the drawing area to the * dimensions given in the definition of the pattern. */ unique_ptr PSTilingPattern::createClipNode() const { auto clip = util::make_unique("clipPath"); clip->addAttribute("id", "pc"+XMLString(psID())); auto rect = util::make_unique("rect"); rect->addAttribute("x", _bbox.minX()); rect->addAttribute("y", _bbox.minY()); rect->addAttribute("width", _bbox.width()); rect->addAttribute("height", _bbox.height()); clip->append(std::move(rect)); return clip; } /** Creates a new group element that contains all "drawing" elements that * define the pattern graphic. */ unique_ptr PSTilingPattern::createGroupNode () const { // add all succeeding path elements to this group auto group = util::make_unique("g"); group->addAttribute("clip-path", XMLString("url(#pc")+XMLString(psID())+")"); return group; } void PSTilingPattern::apply (SpecialActions &actions) { PSPattern::apply(actions); _groupNode.reset(); } ///////////////////////////////////////////////////////////////////////////// PSColoredTilingPattern::PSColoredTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep) : PSTilingPattern(id, bbox, matrix, xstep, ystep) { } ///////////////////////////////////////////////////////////////////////////// PSUncoloredTilingPattern::PSUncoloredTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep) : PSTilingPattern(id, bbox, matrix, xstep, ystep), _applied() { } /** Returns an SVG id value that identifies this pattern with the current color applied. */ string PSUncoloredTilingPattern::svgID () const { ostringstream oss; oss << PSPattern::svgID() << '-' << hex << uint32_t(_currentColor); return oss.str(); } /** Appends the definition of this pattern with the current color applied * to the "def" section of the SVG tree. */ void PSUncoloredTilingPattern::apply (SpecialActions &actions) { auto it=_colors.find(_currentColor); if (it == _colors.end()) { if (_applied) setGroupNode(util::static_unique_ptr_cast(getGroupNode()->clone())); // assign current color to the pattern graphic vector colored_elems; const array attribs = {{"fill", "stroke"}}; for (const char *attrib : attribs) { getGroupNode()->getDescendants(nullptr, attrib, colored_elems); for (XMLElement *elem : colored_elems) { if (string(elem->getAttributeValue(attrib)) != "none") elem->addAttribute(attrib, _currentColor.svgColorString()); } colored_elems.clear(); } PSPattern::apply(actions); _colors.insert(_currentColor); _applied = true; } } unique_ptr PSUncoloredTilingPattern::createClipNode() const { // only the first instance of this patterns get a clip element if (_colors.empty()) return PSTilingPattern::createClipNode(); return nullptr; } dvisvgm-2.8.1/src/PathClipper.hpp0000664000175000017500000000451613510660062013644 00000000000000/************************************************************************* ** PathClipper.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PATHCLIPPER_HPP #define PATHCLIPPER_HPP #include #include #include #include "Bezier.hpp" #include "GraphicsPath.hpp" #include "MessageException.hpp" using ClipperLib::IntPoint; class PathClipper { public: using CurvedPath = GraphicsPath; public: PathClipper () : _numLines(0) {} void intersect (const CurvedPath &p1, const CurvedPath &p2, CurvedPath &result); protected: void flatten (const CurvedPath &gp, ClipperLib::Paths &polygons); // void divide (IntPoint &p1, IntPoint &p2, IntPoint &ip); void reconstruct (const ClipperLib::Path &polygon, CurvedPath &path); void reconstruct (const ClipperLib::Paths &polygons, CurvedPath &path); static void callback (IntPoint &e1bot, IntPoint &e1top, IntPoint &e2bot, IntPoint &e2top, IntPoint &ip); private: std::vector _curves; int _numLines; ///< negative number of straight line segments in path been processed }; #endif dvisvgm-2.8.1/src/CLOption.hpp0000664000175000017500000001460313510660062013116 00000000000000/************************************************************************* ** CLOption.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CL_OPTION_HPP #define CL_OPTION_HPP #include #include #include namespace CL { class Option { friend class CommandLine; public: enum class ArgMode {NONE, OPTIONAL, REQUIRED}; public: Option (const char *longname, char shortname, const char *summary) : _shortName(shortname), _longName(longname), _summary(summary), _given(false) {} virtual ~Option () = default; virtual std::string typeString () const {return "";} virtual ArgMode argMode () const {return ArgMode::NONE;} virtual bool given () const {return _given;} virtual char shortName () const {return _shortName;} virtual std::string longName () const {return _longName;} virtual std::string summary () const {return _summary;} virtual std::string argName () const {return "";} virtual std::string valueString () const {return "";} virtual std::string helpline () const { std::string line; if (_shortName != '\0') line = std::string("-") + _shortName + ", "; else line = " "; line += "--" + std::string(_longName); if (!argName().empty()) { if (argMode() == ArgMode::OPTIONAL) line += '['; line += '='; line += argName(); if (argMode() == ArgMode::OPTIONAL) line += ']'; } if (_summary) { line += '\t'; line += _summary; } if (argMode() != ArgMode::NONE && !valueString().empty()) line += std::string(" [") + valueString() + "]"; return line; } protected: virtual bool parse (std::istream &is, bool longopt) { if (is.eof()) return given(argMode() != ArgMode::REQUIRED); if (argMode() == ArgMode::OPTIONAL && is.peek() == ' ') return given(false); if (longopt && is.get() != '=') return given(false); return given(parseValue(is)); } virtual bool parseValue (std::istream &is) { return is.peek() == EOF || argMode() == ArgMode::NONE; } bool given (bool val) {return _given = val;} private: char _shortName; const char *_longName; const char*_summary; bool _given; }; template constexpr const char* typeString () {return "unknown";} template<> constexpr const char* typeString () {return "boolean";} template<> constexpr const char* typeString () {return "integer";} template<> constexpr const char* typeString () {return "non-negative integer";} template<> constexpr const char* typeString () {return "floating point";} template<> constexpr const char* typeString () {return "string";} template inline T parseValue (std::istream &is) { T value; is >> value; return value; } template<> inline std::string parseValue (std::istream &is) { is >> std::ws; std::string str; std::getline(is, str); return str; } template class TypedOption : public Option { public: TypedOption (const char *longName, char shortName, const char *argName, T val, const char *summary) : Option(longName, shortName, summary), _argName(argName), _value(val) {} TypedOption (const char *longName, char shortName, const char *argName, const char *summary) : Option(longName, shortName, summary), _argName(argName), _value() {} T value () const {return _value;} std::string typeString () const override {return CL::typeString();} std::string argName() const override {return _argName ? _argName : "";} std::string valueString () const override { std::ostringstream oss; oss << _value; return oss.str(); } ArgMode argMode () const override {return mode;} protected: bool parseValue (std::istream &is) override { T value = CL::parseValue(is); if (!is.fail()) _value = std::move(value); return !is.fail() || (argMode() == ArgMode::OPTIONAL && is.eof()); } private: const char *_argName; T _value; }; template class TypedOption : public Option { public: TypedOption (const char *longName, char shortName, const char *argName, bool val, const char *summary) : Option(longName, shortName, summary), _argName(argName), _value(val) {} TypedOption (const char *longName, char shortName, const char *argName, const char *summary) : Option(longName, shortName, summary), _argName(argName), _value(false) {} bool value () const {return _value;} std::string valueString () const override {return _value ? "yes" : "no";} ArgMode argMode () const override {return mode;} std::string typeString () const override {return CL::typeString();} std::string argName() const override {return _argName ? _argName : "";} protected: bool parseValue (std::istream &is) override { std::string str; is >> str; if (is.fail()) return argMode() != ArgMode::REQUIRED; if (str == "yes" || str == "y" || str == "true" || str == "1") _value = true; else if (str == "no" || str == "n" || str == "false" || str == "0") _value = false; else return false; return true; } private: const char *_argName; bool _value; }; } // namespace CL #endif dvisvgm-2.8.1/src/FilePath.cpp0000664000175000017500000002346313560004141013115 00000000000000/************************************************************************* ** FilePath.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "FilePath.hpp" #include "FileSystem.hpp" #include "MessageException.hpp" #include "utility.hpp" using namespace std; /** Removes redundant slashes from a given path. */ static string& single_slashes (string &str) { size_t pos=0; while ((pos = str.find("//", pos)) != string::npos) str.replace(pos, 2, "/"); return str; } #ifdef _WIN32 static char strip_drive_letter (string &path) { char letter = 0; if (path.length() >= 2 && path[1] == ':' && isalpha(path[0])) { letter = path[0]; path.erase(0, 2); } return letter; } static char adapt_current_path (string &path, char target_drive) { if (char current_drive = strip_drive_letter(path)) { if (target_drive != current_drive) { if (target_drive == 0) target_drive = current_drive; if (path.empty() || path[0] != '/') { if (FileSystem::chdir(string(1, target_drive) + ":")) { path.insert(0, FileSystem::getcwd()+"/"); strip_drive_letter(path); } else throw MessageException("drive " + string(1, target_drive) + ": not accessible"); } } } return target_drive; } #endif bool FilePath::Directory::operator == (const Directory &dir) const { #ifdef _WIN32 // letter case is not significant on Windows systems return util::tolower(_dirstr) == util::tolower(dir._dirstr); #else return _dirstr == dir._dirstr; #endif } /** Constructs a FilePath object. * @param[in] path absolute or relative path to a file or directory * @param[in] isfile true if 'path' references a file, false if a directory is referenced * @param[in] current_dir if 'path' is a relative path expression it will be related to 'current_dir' */ FilePath::FilePath (const string &path, bool isfile, const string ¤t_dir) { init(path, isfile, current_dir); } /** Assigns a new path of a file or directory that already exists. * Relative paths are relative to the current working directory. * @param[in] path absolute or relative path to a file or directory */ void FilePath::set (const string &path) { set(path, !FileSystem::isDirectory(path)); } /** Assigns a new path. Relative paths are relative to the current working directory. * @param[in] path absolute or relative path to a file or directory * @param[in] isfile true if 'path' references a file, false if a directory is referenced */ void FilePath::set (const string &path, bool isfile) { init(path, isfile, FileSystem::getcwd()); } /** Assigns a new path. Relative paths are relative to the current working directory. * @param[in] path absolute or relative path to a file or directory * @param[in] isfile true if 'path' references a file, false if a directory is referenced * @param[in] current_dir if 'path' is a relative path expression it will be related to 'current_dir' */ void FilePath::set (const string &path, bool isfile, const string ¤t_dir) { init(path, isfile, current_dir); } /** Initializes a FilePath object. This method should be called by the constructors only. * @param[in] path absolute or relative path to a file or directory * @param[in] isfile true if 'path' references a file, false if a directory is referenced * @param[in] current_dir if 'path' is a relative path expression it will be related to 'current_dir' */ void FilePath::init (string path, bool isfile, string current_dir) { _dirs.clear(); _fname.clear(); single_slashes(path); single_slashes(current_dir); #ifdef _WIN32 path = FileSystem::adaptPathSeperators(path); _drive = strip_drive_letter(path); #endif if (isfile) { size_t pos = path.rfind('/'); _fname = path.substr((pos == string::npos) ? 0 : pos+1); if (pos != string::npos) path.erase(pos); else path.clear(); } if (current_dir.empty()) current_dir = FileSystem::getcwd(); #ifdef _WIN32 _drive = adapt_current_path(current_dir, _drive); #endif if (!path.empty()) { if (path[0] == '/') current_dir.clear(); else if (current_dir[0] != '/') current_dir = "/"; else { FilePath curr(current_dir, false, "/"); current_dir = curr.absolute(); #ifdef _WIN32 adapt_current_path(current_dir, _drive); #endif } } path.insert(0, current_dir + "/"); string elem; for (char c : path) { if (c != '/') elem += c; else { add(elem); elem.clear(); } } add(elem); } /** Adds a location step to the current path. */ void FilePath::add (const string &dir) { if (dir == ".." && !_dirs.empty()) _dirs.pop_back(); else if (dir.length() > 0 && dir != ".") _dirs.emplace_back(dir); } /** Returns the suffix of the filename. If FilePath represents the * location of a directory (and not of a file) an empty string * is returned. */ string FilePath::suffix () const { size_t start = 0; // ignore leading dots while (start < _fname.length() && _fname[start] == '.') start++; string sub = _fname.substr(start); size_t pos = sub.rfind('.'); if (pos != string::npos && pos < sub.length()-1) return sub.substr(pos+1); return ""; } /** Changes the suffix of the filename. If FilePath represents the * location of a directory (and not of a file) nothing happens. * @param[in] s new suffix */ void FilePath::suffix (const string &s) { if (!_fname.empty()) { string current_suffix = suffix(); if (!current_suffix.empty()) _fname.erase(_fname.length()-current_suffix.length()-1); _fname += "."+s; } } /** Returns the filename without suffix. * Example: FilePath("/a/b/c.def", true) == "c" */ string FilePath::basename () const { if (!_fname.empty()) { size_t len = suffix().length(); if (len > 0) len++; // strip dot too return _fname.substr(0, _fname.length()-len); } return ""; } /** Returns the absolute path string of this FilePath. * @param[in] with_filename if false, the filename is omitted * @return the absolute path string */ string FilePath::absolute (bool with_filename) const { string path; for (const Directory &dir : _dirs) path += "/" + string(dir); if (path.empty()) path = "/"; if (with_filename && !_fname.empty()) path += "/"+_fname; #ifdef _WIN32 if (_drive) path.insert(0, string(1, _drive) + ":"); #endif return single_slashes(path); } /** Returns a path string of this FilePath relative to reldir. If we wanted to * navigate from /a/b/c/d to /a/b/e/f using the shell command "cd", we could do that * with the relative path argument: "cd ../../e/f". This function returns such a relative * path. Example: FilePath("/a/b/e/f").relative("/a/b/c/d") => "../../e/f". * @param[in] reldir absolute path to a directory * @param[in] with_filename if false, the filename is omitted * @return the relative path string */ string FilePath::relative (string reldir, bool with_filename) const { if (reldir.empty()) reldir = FileSystem::getcwd(); #ifdef _WIN32 adapt_current_path(reldir, _drive); #endif if (reldir[0] != '/') return absolute(); FilePath rel(reldir, false); string path; #ifdef _WIN32 if (rel._drive && _drive && tolower(rel._drive) != tolower(_drive)) path += string(1, _drive) + ":"; #endif auto it1 = _dirs.begin(); auto it2 = rel._dirs.begin(); while (it1 != _dirs.end() && it2 != rel._dirs.end() && *it1 == *it2) ++it1, ++it2; for (; it2 != rel._dirs.end(); ++it2) path += "../"; for (; it1 != _dirs.end(); ++it1) path += string(*it1) + "/"; if (!path.empty()) path.erase(path.length()-1, 1); // remove trailing slash if (with_filename && !_fname.empty()) { if (!path.empty() && path != "/") path += "/"; path += _fname; } if (path.empty()) path = "."; return single_slashes(path); } string FilePath::relative (const FilePath &filepath, bool with_filename) const { return relative(filepath.absolute(false), with_filename); } /** Return the absolute or relative path whichever is shorter. * @param[in] reldir absolute path to a directory * @param[in] with_filename if false, the filename is omitted */ string FilePath::shorterAbsoluteOrRelative (string reldir, bool with_filename) const { string abs = absolute(with_filename); string rel = relative(reldir, with_filename); return abs.length() < rel.length() ? abs : rel; } bool FilePath::exists () const { return empty() ? false : FileSystem::exists(absolute()); } /** Checks if a given path is absolute or relative. * @param[in] path path string to check * @return true if path is absolute */ bool FilePath::isAbsolute (string path) { path = util::trim(path); #ifdef _WIN32 path = FileSystem::adaptPathSeperators(path); if (path.length() >= 2 && path[1] == ':' && isalpha(path[0])) path.erase(0, 2); // remove drive letter and colon #endif return !path.empty() && path[0] == '/'; } dvisvgm-2.8.1/src/TpicSpecialHandler.cpp0000664000175000017500000003155613561274402015133 00000000000000/************************************************************************* ** TpicSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "Color.hpp" #include "EllipticalArc.hpp" #include "InputBuffer.hpp" #include "InputReader.hpp" #include "GraphicsPath.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" #include "TpicSpecialHandler.hpp" #include "utility.hpp" using namespace std; TpicSpecialHandler::TpicSpecialHandler () { reset(); } void TpicSpecialHandler::dviEndPage (unsigned pageno, SpecialActions&) { reset(); } void TpicSpecialHandler::reset () { _points.clear(); _penwidth = 1.0; _grayLevel = -1.0; // no fill } /** Returns the current color used to fill closed paths or shapes. * The TPIC documentation only specifies grayscale colors set by a floating point value * in the range of 0 (white) and 1 (black). Most DVI drivers extend the color support * by taking color specials into account: The grayscale colors are only applied if * the DVI color is set to black. All other colors are directly used as fill color * without evaluating the TPIC gray level. */ Color TpicSpecialHandler::fillColor (bool grayOnly) const { if (_grayLevel >= 0 && (_dviColor == Color::BLACK || grayOnly)) return Color::WHITE*(1.0-_grayLevel); return _dviColor; } /** Adds stroke attributes to a given element depending on the pen width. * @param[in] elem element node the attributes are added to * @param[in] penwidth pen with used to compute the stroke parameters * @param[in] pencolor the drawing color * @param[in] ddist dash/dot distance of line in PS point units (0:solid line, >0:dashed line, <0:dotted line) */ static void add_stroke_attribs (XMLElement *elem, double penwidth, Color pencolor, double ddist) { if (penwidth > 0) { // attributes actually required? elem->addAttribute("stroke", pencolor.svgColorString()); elem->addAttribute("stroke-width", XMLString(penwidth)); if (ddist > 0) elem->addAttribute("stroke-dasharray", XMLString(ddist)); else if (ddist < 0) elem->addAttribute("stroke-dasharray", XMLString(penwidth) + ' ' + XMLString(-ddist)); } } static unique_ptr create_ellipse_element (double cx, double cy, double rx, double ry) { bool is_circle = (rx == ry); auto elem = util::make_unique(is_circle ? "circle" : "ellipse"); elem->addAttribute("cx", XMLString(cx)); elem->addAttribute("cy", XMLString(cy)); if (is_circle) elem->addAttribute("r", XMLString(rx)); else { elem->addAttribute("rx", XMLString(rx)); elem->addAttribute("ry", XMLString(ry)); } return elem; } /** Creates SVG elements that draw lines through the recorded points. * @param[in] ddist dash/dot distance of line in PS point units (0:solid line, >0:dashed line, <0:dotted line) * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ void TpicSpecialHandler::drawLines (double ddist, SpecialActions &actions) { if (!_points.empty() && (_penwidth > 0 || _grayLevel >= 0) && !actions.outputLocked()) { unique_ptr elem; if (_points.size() == 1) { const DPair &p = _points.back(); elem = create_ellipse_element(p.x()+actions.getX(), p.y()+actions.getY(), _penwidth/2.0, _penwidth/2.0); actions.embed(p, _penwidth/2.0); } else { if (_points.size() == 2 || (_grayLevel < 0 && _points.front() != _points.back())) { elem = util::make_unique("polyline"); elem->addAttribute("fill", "none"); elem->addAttribute("stroke-linecap", "round"); } else { while (_points.front() == _points.back()) _points.pop_back(); elem = util::make_unique("polygon"); elem->addAttribute("fill", _grayLevel < 0 ? "none" : fillColor(false).svgColorString()); } ostringstream oss; for (auto it=_points.begin(); it != _points.end(); ++it) { if (it != _points.begin()) oss << ' '; double x = it->x()+actions.getX(); double y = it->y()+actions.getY(); oss << XMLString(x) << ',' << XMLString(y); actions.embed(DPair(x, y)); } elem->addAttribute("points", oss.str()); add_stroke_attribs(elem.get(), _penwidth, Color::BLACK, ddist); } actions.svgTree().appendToPage(std::move(elem)); } reset(); } /** Stroke a quadratic spline through the midpoints of the lines defined by * the previously recorded points. The spline starts with a straight line * from the first point to the mid-point of the first line. The spline ends * with a straight line from the mid-point of the last line to the last point. * If ddist=0, the spline is stroked solid. Otherwise ddist denotes the length * of the dashes and the gaps inbetween. * @param[in] ddist length of dashes and gaps * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ void TpicSpecialHandler::drawSplines (double ddist, SpecialActions &actions) { if (!_points.empty() && _penwidth > 0 && !actions.outputLocked()) { const size_t numPoints = _points.size(); if (numPoints < 3) { _grayLevel = -1; drawLines(ddist, actions); } else { DPair p(actions.getX(), actions.getY()); GraphicsPath path; path.moveto(p+_points[0]); DPair mid = p+_points[0]+(_points[1]-_points[0])/2.0; path.lineto(mid); actions.embed(p+_points[0]); for (size_t i=1; i < numPoints-1; i++) { const DPair p0 = p+_points[i-1]; const DPair p1 = p+_points[i]; const DPair p2 = p+_points[i+1]; mid = p1+(p2-p1)/2.0; path.quadto(p1, mid); actions.embed(mid); actions.embed((p0+p1*6.0+p2)/8.0, _penwidth); } if (_points[0] == _points[numPoints-1]) // closed path? path.closepath(); else { path.lineto(p+_points[numPoints-1]); actions.embed(p+_points[numPoints-1]); } auto pathElem = util::make_unique("path"); pathElem->addAttribute("fill", "none"); ostringstream oss; path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); pathElem->addAttribute("d", oss.str()); add_stroke_attribs(pathElem.get(), _penwidth, _dviColor, ddist); actions.svgTree().appendToPage(std::move(pathElem)); } } reset(); } /** Draws an elliptical arc. * @param[in] cx x-coordinate of arc center relative to current DVI position * @param[in] cy y-coordinate of arc center relative to current DVI position * @param[in] rx length of horizontal semi-axis * @param[in] ry length of vertical semi-axis * @param[in] angle1 starting angle (clockwise) relative to x-axis * @param[in] angle2 ending angle (clockwise) relative to x-axis * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ void TpicSpecialHandler::drawArc (double cx, double cy, double rx, double ry, double angle1, double angle2, SpecialActions &actions) { if ((_penwidth > 0 || _grayLevel >= 0) && !actions.outputLocked()) { cx += actions.getX(); cy += actions.getY(); unique_ptr elem; bool closed=true; if (abs(angle2-angle1) >= math::TWO_PI) // closed ellipse? elem = create_ellipse_element(cx, cy, rx, ry); else { EllipticalArc arc(DPair(cx, cy), rx, ry, 0, -angle1, math::normalize_0_2pi(angle2-angle1)); GraphicsPath path; path.moveto(arc.startPoint()); path.arcto(rx, ry, 0, arc.largeArc(), arc.sweepPositive(), arc.endPoint()); if (_grayLevel >= 0) path.closepath(); else closed = false; elem = util::make_unique("path"); ostringstream oss; path.writeSVG(oss, SVGTree::RELATIVE_PATH_CMDS); elem->addAttribute("d", oss.str()); } if (_penwidth > 0) { elem->addAttribute("stroke-width", _penwidth); elem->addAttribute("stroke", actions.getColor().svgColorString()); if (!closed) elem->addAttribute("stroke-linecap", "round"); } elem->addAttribute("fill", _grayLevel < 0 ? "none" : fillColor(true).svgColorString()); actions.svgTree().appendToPage(std::move(elem)); double pw = _penwidth/2.0; actions.embed(BoundingBox(cx-rx-pw, cy-ry-pw, cx+rx+pw, cy+ry+pw)); } reset(); } /** Computes the gray level based on the ratio of set bits to the total * number of bits of a given hex value. * @param[in] hexstr a sequence of hexadecimal digits * @return the computed gray level [0-1] */ static double bit_sequence_to_gray (const string &hexstr) { if (hexstr.empty()) return 1.0; int setbits=0; // number of bits set int totalbits=0; // number of bits processed constexpr int CHUNKBITS = 8*sizeof(unsigned long long); for (size_t pos=0; pos < hexstr.length(); pos+=CHUNKBITS/4) { size_t digitcount; // number of hex digits processed unsigned long long val = stoull(hexstr.substr(pos, CHUNKBITS/4), &digitcount, 16); setbits += bitset(val).count(); totalbits += 4*digitcount; } return totalbits == 0 ? 1.0 : 1.0-double(setbits)/double(totalbits); } /** Returns a unique integer for a TPIC command (consisting of two letters). */ constexpr int cmd_id (const char *cmd) { return (cmd[0] << 8) | cmd[1]; }; bool TpicSpecialHandler::process (const string &prefix, istream &is, SpecialActions &actions) { if (prefix.length() != 2) return false; _dviColor = actions.getColor(); const double mi2bp=0.072; // factor for milli-inch to PS points StreamInputBuffer ib(is); BufferInputReader ir(ib); switch (cmd_id(prefix.c_str())) { case cmd_id("pn"): // set pen width in milli-inches _penwidth = max(0.0, ir.getDouble()*mi2bp); break; case cmd_id("bk"): // set fill color to black _grayLevel = 1; break; case cmd_id("wh"): // set fill color to white _grayLevel = 0; break; case cmd_id("sh"): // set fill color to given gray level (0=white, 1=black) ir.skipSpace(); _grayLevel = ir.eof() ? 0.5 : max(0.0, min(1.0, ir.getDouble())); break; case cmd_id("tx"): { // set fill color depending on a sequence of bits (given as hex value) string hexstr; while (!ir.eof()) { ir.skipSpace(); int c = ir.get(); if (isxdigit(c)) hexstr += static_cast(tolower(c)); else break; } _grayLevel = bit_sequence_to_gray(hexstr); break; } case cmd_id("pa"): { // add point to path double x = ir.getDouble()*mi2bp; double y = ir.getDouble()*mi2bp; _points.emplace_back(DPair(x,y)); break; } case cmd_id("fp"): // draw solid lines through recorded points; close and fill path if fill color was defined drawLines(0, actions); break; case cmd_id("ip"): // don't draw outlines but close the recorded path and fill the resulting polygon _penwidth = 0; drawLines(0, actions); break; case cmd_id("da"): // as fp but draw dashed lines drawLines(ir.getDouble()*72, actions); break; case cmd_id("dt"): // as fp but draw dotted lines drawLines(-ir.getDouble()*72, actions); break; case cmd_id("sp"): { // draw quadratic splines through recorded points double ddist = ir.getDouble()*72; drawSplines(ddist, actions); break; } case cmd_id("ar"): { // draw elliptical arc double cx = ir.getDouble()*mi2bp; double cy = ir.getDouble()*mi2bp; double rx = ir.getDouble()*mi2bp; double ry = ir.getDouble()*mi2bp; double a1 = ir.getDouble(); double a2 = ir.getDouble(); drawArc(cx, cy, rx, ry, a1, a2, actions); break; } case cmd_id("ia"): { // fill elliptical arc double cx = ir.getDouble()*mi2bp; double cy = ir.getDouble()*mi2bp; double rx = ir.getDouble()*mi2bp; double ry = ir.getDouble()*mi2bp; double a1 = ir.getDouble(); double a2 = ir.getDouble(); _penwidth = 0; drawArc(cx, cy, rx, ry, a1, a2, actions); break; } default: return false; } return true; } vector TpicSpecialHandler::prefixes() const { vector pfx {"ar", "bk", "da", "dt", "fp", "ia", "ip", "pa", "pn", "sh", "sp", "tx", "wh"}; return pfx; } dvisvgm-2.8.1/src/FontEngine.cpp0000664000175000017500000003230313536436037013466 00000000000000/************************************************************************* ** FontEngine.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include FT_ADVANCES_H #include FT_GLYPH_H #include FT_OUTLINE_H #include FT_TRUETYPE_TABLES_H #include FT_TYPES_H #include "Font.hpp" #include "FontEngine.hpp" #include "FontStyle.hpp" #include "Message.hpp" #include "utility.hpp" using namespace std; /** Converts a floating point value to a 16.16 fixed point value. */ static inline FT_Fixed to_16dot16 (double val) { return static_cast(lround(val*65536.0)); } /** Converts an integer to a 16.16 fixed point value. */ static inline FT_Fixed to_16dot16 (int val) { return static_cast(val) << 16; } /////////////////////////////////////////////////////////////////////////// FontEngine::FontEngine () { if (FT_Init_FreeType(&_library)) Message::estream(true) << "failed to initialize FreeType library\n"; } FontEngine::~FontEngine () { if (_currentFace && FT_Done_Face(_currentFace)) Message::estream(true) << "failed to release font\n"; if (FT_Done_FreeType(_library)) Message::estream(true) << "failed to release FreeType library\n"; } /** Returns the singleton instance of this class. */ FontEngine& FontEngine::instance () { static FontEngine engine; return engine; } string FontEngine::version () { FT_Int major, minor, patch; FT_Library &lib = instance()._library; FT_Library_Version(lib, &major, &minor, &patch); ostringstream oss; oss << major << '.' << minor << '.' << patch; return oss.str(); } /** Sets the font to be used. * @param[in] fname path to font file * @param[in] fontindex index of font in font collection (multi-font files, like TTC) * @return true on success */ bool FontEngine::setFont (const string &fname, int fontindex, const CharMapID &charMapID) { if (_currentFace && FT_Done_Face(_currentFace)) Message::estream(true) << "failed to release font\n"; if (FT_New_Face(_library, fname.c_str(), fontindex, &_currentFace)) { Message::estream(true) << "can't read font file " << fname << '\n'; return false; } if (charMapID.valid()) setCharMap(charMapID); return true; } bool FontEngine::setFont (const Font &font) { if (_currentFont && _currentFont->name() == font.name()) return true; if (const char *path=font.path()) { auto pf = dynamic_cast(&font); if (setFont(path, font.fontIndex(), pf ? pf->getCharMapID() : CharMapID())) { _currentFont = &font; return true; } } return false; } bool FontEngine::isCIDFont() const { FT_Bool cid_keyed; return FT_Get_CID_Is_Internally_CID_Keyed(_currentFace, &cid_keyed) == 0 && cid_keyed; } bool FontEngine::setCharMap (const CharMapID &charMapID) { for (int i=0; i < _currentFace->num_charmaps; i++) { FT_CharMap ft_cmap = _currentFace->charmaps[i]; if (ft_cmap->platform_id == charMapID.platform_id && ft_cmap->encoding_id == charMapID.encoding_id) { FT_Set_Charmap(_currentFace, ft_cmap); return true; } } return false; } /** Returns a character map that maps from character indexes to character codes * of the current encoding. * @param[out] charmap the resulting charmap */ void FontEngine::buildCharMap (RangeMap &charmap) { charmap.clear(); FT_UInt glyph_index; uint32_t charcode = FT_Get_First_Char(_currentFace, &glyph_index); while (glyph_index) { charmap.addRange(glyph_index, glyph_index, charcode); charcode = FT_Get_Next_Char(_currentFace, charcode, &glyph_index); } } /** Creates a charmap that maps from the custom character encoding to unicode. * @return pointer to charmap if it could be created, 0 otherwise */ unique_ptr FontEngine::createCustomToUnicodeMap () { FT_CharMap ftcharmap = _currentFace->charmap; if (FT_Select_Charmap(_currentFace, FT_ENCODING_ADOBE_CUSTOM) != 0) return nullptr; RangeMap index_to_source_chrcode; buildCharMap(index_to_source_chrcode); if (FT_Select_Charmap(_currentFace, FT_ENCODING_UNICODE) != 0) return nullptr; auto charmap = util::make_unique(); FT_UInt glyph_index; uint32_t unicode_point = FT_Get_First_Char(_currentFace, &glyph_index); while (glyph_index) { uint32_t custom_charcode = index_to_source_chrcode.valueAt(glyph_index); charmap->addRange(custom_charcode, custom_charcode, unicode_point); unicode_point = FT_Get_Next_Char(_currentFace, unicode_point, &glyph_index); } FT_Set_Charmap(_currentFace, ftcharmap); return std::move(charmap); } const char* FontEngine::getFamilyName () const { return _currentFace ? _currentFace->family_name : nullptr; } const char* FontEngine::getStyleName () const { return _currentFace ? _currentFace->style_name : nullptr; } int FontEngine::getUnitsPerEM () const { return _currentFace ? _currentFace->units_per_EM : 0; } /** Returns the ascender of the current font in font units. * The (usually) positive value denotes the maximum height * (extent above the baseline) of the font. */ int FontEngine::getAscender () const { return _currentFace ? _currentFace->ascender : 0; } /** Returns the descender of the current font in font units. * The (usually) positive value denotes the maximum depth * (extent below the baseline) of the font. */ int FontEngine::getDescender () const { return _currentFace ? -_currentFace->descender : 0; } int FontEngine::getAdvance (int c) const { if (_currentFace) { FT_Fixed adv=0; FT_Get_Advance(_currentFace, c, FT_LOAD_NO_SCALE, &adv); return adv; } return 0; } int FontEngine::getHAdvance () const { if (_currentFace) { auto table = static_cast(FT_Get_Sfnt_Table(_currentFace, ft_sfnt_os2)); return table ? table->xAvgCharWidth : 0; } return 0; } int FontEngine::getHAdvance (const Character &c) const { if (_currentFace) { FT_Load_Glyph(_currentFace, charIndex(c), FT_LOAD_NO_SCALE); return _currentFace->glyph->metrics.horiAdvance; } return 0; } int FontEngine::getVAdvance (const Character &c) const { if (_currentFace) { FT_Load_Glyph(_currentFace, charIndex(c), FT_LOAD_NO_SCALE); if (FT_HAS_VERTICAL(_currentFace)) return _currentFace->glyph->metrics.vertAdvance; return _currentFace->glyph->metrics.horiAdvance; } return 0; } int FontEngine::charIndex (const Character &c) const { if (!_currentFace || !_currentFace->charmap) return c.type() == Character::NAME ? 0 : c.number(); switch (c.type()) { case Character::CHRCODE: return FT_Get_Char_Index(_currentFace, (FT_ULong)c.number()); case Character::NAME: return FT_Get_Name_Index(_currentFace, const_cast(c.name())); default: return c.number(); } } /** Get first available character of the current font face. */ int FontEngine::getFirstChar () const { if (_currentFace) return _currentChar = FT_Get_First_Char(_currentFace, &_currentGlyphIndex); return 0; } /** Get the next available character of the current font face. */ int FontEngine::getNextChar () const { if (_currentFace && _currentGlyphIndex) return _currentChar = FT_Get_Next_Char(_currentFace, _currentChar, &_currentGlyphIndex); return getFirstChar(); } /** Returns the number of glyphs present in the current font face. */ int FontEngine::getNumGlyphs () const { return _currentFace ? _currentFace->num_glyphs : 0; } /** Returns the glyph name for a given charater code. * @param[in] c char code * @return glyph name */ string FontEngine::getGlyphName (const Character &c) const { if (c.type() == Character::NAME) return c.name(); if (_currentFace && FT_HAS_GLYPH_NAMES(_currentFace)) { char buf[256]; FT_Get_Glyph_Name(_currentFace, charIndex(c), buf, 256); return string(buf); } return ""; } vector FontEngine::getPanose () const { vector panose(10); if (_currentFace) { auto table = static_cast(FT_Get_Sfnt_Table(_currentFace, ft_sfnt_os2)); if (table) for (int i=0; i < 10; i++) panose[i] = table->panose[i]; } return panose; } int FontEngine::getCharMapIDs (vector &charmapIDs) const { charmapIDs.clear(); if (_currentFace) { for (int i=0; i < _currentFace->num_charmaps; i++) { FT_CharMap charmap = _currentFace->charmaps[i]; charmapIDs.emplace_back(CharMapID(charmap->platform_id, charmap->encoding_id)); } } return charmapIDs.size(); } CharMapID FontEngine::setUnicodeCharMap () { if (_currentFace && FT_Select_Charmap(_currentFace, FT_ENCODING_UNICODE) == 0) return CharMapID(_currentFace->charmap->platform_id, _currentFace->charmap->encoding_id); return CharMapID(); } CharMapID FontEngine::setCustomCharMap () { if (_currentFace && FT_Select_Charmap(_currentFace, FT_ENCODING_ADOBE_CUSTOM) == 0) return CharMapID(_currentFace->charmap->platform_id, _currentFace->charmap->encoding_id); return CharMapID(); } // handle API change in freetype version 2.2.1 #if FREETYPE_MAJOR > 2 || (FREETYPE_MAJOR == 2 && (FREETYPE_MINOR > 2 || (FREETYPE_MINOR == 2 && FREETYPE_PATCH >= 1))) using FTVectorPtr = const FT_Vector*; #else using FTVectorPtr = FT_Vector*; #endif // Callback functions used by trace_outline/FT_Outline_Decompose static int moveto (FTVectorPtr to, void *user) { auto glyph = static_cast(user); glyph->moveto(to->x, to->y); return 0; } static int lineto (FTVectorPtr to, void *user) { auto glyph = static_cast(user); glyph->lineto(to->x, to->y); return 0; } static int quadto (FTVectorPtr control, FTVectorPtr to, void *user) { auto glyph = static_cast(user); glyph->quadto(control->x, control->y, to->x, to->y); return 0; } static int cubicto (FTVectorPtr control1, FTVectorPtr control2, FTVectorPtr to, void *user) { auto glyph = static_cast(user); glyph->cubicto(control1->x, control1->y, control2->x, control2->y, to->x, to->y); return 0; } /** Traces the outline of a glyph by calling the corresponding "drawing" functions. * Each glyph is composed of straight lines, quadratic or cubic Bézier curves. * This function creates a Glyph object representing these graphics segments. * @param[in] face FreeType object representing the font to scan * @param[in] font corresponding Font object providing additional data * @param[in] index index of the glyph to be traced * @param[out] glyph resulting Glyph object containing the graphics segments * @param[in] scale if true the current pt size will be considered otherwise the plain TrueType units are used. * @return false on errors */ static bool trace_outline (FT_Face face, const Font *font, int index, Glyph &glyph, bool scale) { if (face) { if (FT_Load_Glyph(face, index, scale ? FT_LOAD_DEFAULT : FT_LOAD_NO_SCALE)) { Message::estream(true) << "can't load glyph " << int(index) << '\n'; return false; } if (face->glyph->format != FT_GLYPH_FORMAT_OUTLINE) { Message::estream(true) << "no outlines found in glyph " << int(index) << '\n'; return false; } FT_Outline outline = face->glyph->outline; // apply style parameters if set if (const FontStyle *style = font->style()) { FT_Matrix matrix = {to_16dot16(style->extend), to_16dot16(style->slant), 0, to_16dot16(1)}; FT_Outline_Transform(&outline, &matrix); if (style->bold != 0) FT_Outline_Embolden(&outline, style->bold/font->scaledSize()*face->units_per_EM); } const FT_Outline_Funcs funcs = {moveto, lineto, quadto, cubicto, 0, 0}; FT_Outline_Decompose(&outline, &funcs, &glyph); return true; } Message::wstream(true) << "can't trace outline (no font selected)\n"; return false; } /** Traces the outline of a glyph by calling the corresponding "drawing" functions. * Each glyph is composed of straight lines, quadratic or cubic Bézier curves. * This function creates a Glyph object representing these graphics segments. * @param[in] c the glyph of this character will be traced * @param[out] glyph resulting Glyph object containing the graphics segments * @param[in] scale if true the current pt size will be considered otherwise the plain TrueType units are used. * @return false on errors */ bool FontEngine::traceOutline (const Character &c, Glyph &glyph, bool scale) const { return trace_outline(_currentFace, _currentFont, charIndex(c), glyph, scale); } dvisvgm-2.8.1/src/GFTracer.hpp0000664000175000017500000000405013510660062013057 00000000000000/************************************************************************* ** GFTracer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef GFTRACER_HPP #define GFTRACER_HPP #include #include "GFReader.hpp" class GFTracer : public GFReader { public: explicit GFTracer (std::istream &is); GFTracer (std::istream &is, double upp); virtual void moveTo (double x, double y) =0; virtual void lineTo (double x, double y) =0; virtual void curveTo (double c1x, double c1y, double c2x, double c2y, double x, double y) =0; virtual void closePath () =0; void beginChar (uint32_t c) override; void endChar (uint32_t c) override; protected: void unitsPerPoint(double upp) {_unitsPerPoint = upp;} private: double _unitsPerPoint; ///< target units per PS point }; #endif dvisvgm-2.8.1/src/XMLDocument.hpp0000664000175000017500000000400513510660062013561 00000000000000/************************************************************************* ** XMLDocument.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef XMLDOCUMENT_HPP #define XMLDOCUMENT_HPP #include #include #include "XMLNode.hpp" class XMLDocument { public: XMLDocument () =default; explicit XMLDocument(std::unique_ptr root); void clear (); void append (std::unique_ptr node); void append (std::unique_ptr node); void setRootNode (std::unique_ptr root); const XMLElement* getRootElement () const {return _rootElement.get();} std::ostream& write (std::ostream &os) const; private: std::vector> _nodes; std::unique_ptr _rootElement; }; #endif dvisvgm-2.8.1/src/Makefile.am0000664000175000017500000001571413536436567013001 00000000000000## This file is part of dvisvgm ## Copyright (C) 2005-2019 Martin Gieseking ## ## Process this file with automake. bin_PROGRAMS = dvisvgm noinst_LTLIBRARIES = libdvisvgm.la SUBDIRS = optimizer dvisvgm_SOURCES = \ CommandLine.hpp \ dvisvgm.cpp include ../libs/defs.am dvisvgm_LDADD = \ $(noinst_LTLIBRARIES) \ ../libs/clipper/libclipper.a \ $(FREETYPE_LIBS) \ $(FONTFORGE_LIBS) \ $(POTRACE_LIBS) \ $(XXHASH_LIBS) \ $(ZLIB_LIBS) if ENABLE_WOFF dvisvgm_LDADD += \ ../libs/ff-woff/libfontforge.a \ $(WOFF2_LIBS) \ $(BROTLI_LIBS) endif if USE_BUNDLED_MD5 dvisvgm_LDADD += ../libs/md5/libmd5.a else dvisvgm_LDADD += $(LIBCRYPTO_LIBS) endif dvisvgm_DEPENDENCIES = $(noinst_LTLIBRARIES) libdvisvgm_la_SOURCES = \ AGLTable.hpp \ BasicDVIReader.hpp BasicDVIReader.cpp \ Bezier.hpp Bezier.cpp \ BgColorSpecialHandler.hpp BgColorSpecialHandler.cpp \ Bitmap.hpp Bitmap.cpp \ BoundingBox.hpp BoundingBox.cpp \ Calculator.hpp Calculator.cpp \ Character.hpp \ CharMapID.hpp CharMapID.cpp \ CLCommandLine.hpp CLCommandLine.cpp \ CMap.hpp CMap.cpp \ CMapManager.hpp CMapManager.cpp \ CMapReader.hpp CMapReader.cpp \ CLOption.hpp \ Color.hpp Color.cpp \ ColorSpecialHandler.hpp ColorSpecialHandler.cpp \ CommandLine.hpp \ Directory.hpp Directory.cpp \ DVIActions.hpp \ DLLoader.hpp DLLoader.cpp \ DVIReader.hpp DVIReader.cpp \ DvisvgmSpecialHandler.hpp DvisvgmSpecialHandler.cpp \ DVIToSVG.hpp DVIToSVG.cpp \ DVIToSVGActions.hpp DVIToSVGActions.cpp \ EllipticalArc.hpp EllipticalArc.cpp \ EmSpecialHandler.hpp EmSpecialHandler.cpp \ EncFile.hpp EncFile.cpp \ EPSFile.hpp EPSFile.cpp \ EPSToSVG.hpp \ FileFinder.hpp FileFinder.cpp \ FilePath.hpp FilePath.cpp \ FileSystem.hpp FileSystem.cpp \ FixWord.hpp \ Font.hpp Font.cpp \ FontCache.hpp FontCache.cpp \ FontEncoding.hpp FontEncoding.cpp \ FontEngine.hpp FontEngine.cpp \ FontManager.hpp FontManager.cpp \ FontMap.hpp FontMap.cpp \ FontMetrics.hpp FontMetrics.cpp \ FontStyle.hpp \ FontWriter.hpp FontWriter.cpp \ GFGlyphTracer.hpp GFGlyphTracer.cpp \ GFReader.hpp GFReader.cpp \ GFTracer.hpp GFTracer.cpp \ Ghostscript.hpp Ghostscript.cpp \ Glyph.hpp \ GlyphTracerMessages.hpp \ GraphicsPath.hpp \ HashFunction.hpp HashFunction.cpp \ HtmlSpecialHandler.hpp HtmlSpecialHandler.cpp \ HyperlinkManager.hpp HyperlinkManager.cpp \ ImageToSVG.hpp ImageToSVG.cpp \ InputBuffer.hpp InputBuffer.cpp \ InputReader.hpp InputReader.cpp \ JFM.hpp JFM.cpp \ Length.hpp Length.cpp \ macros.hpp \ MapLine.hpp MapLine.cpp \ Matrix.hpp Matrix.cpp \ MD5HashFunction.hpp \ Message.hpp Message.cpp \ MessageException.hpp \ MetafontWrapper.hpp MetafontWrapper.cpp \ NoPsSpecialHandler.hpp NoPsSpecialHandler.cpp \ NumericRanges.hpp \ PageRanges.hpp PageRanges.cpp \ PageSize.hpp PageSize.cpp \ Pair.hpp \ PapersizeSpecialHandler.hpp PapersizeSpecialHandler.cpp \ PathClipper.hpp PathClipper.cpp \ PDFParser.hpp PDFParser.cpp \ PdfSpecialHandler.hpp PdfSpecialHandler.cpp \ PDFToSVG.hpp \ PreScanDVIReader.hpp PreScanDVIReader.cpp \ Process.hpp Process.cpp \ psdefs.cpp \ PSFilter.hpp \ PSInterpreter.hpp PSInterpreter.cpp \ PSPattern.hpp PSPattern.cpp \ PSPreviewFilter.hpp PSPreviewFilter.cpp \ PsSpecialHandler.hpp PsSpecialHandler.cpp \ RangeMap.hpp RangeMap.cpp \ ShadingPatch.hpp ShadingPatch.cpp \ SignalHandler.hpp SignalHandler.cpp \ SourceInput.hpp SourceInput.cpp \ SpecialActions.hpp \ SpecialHandler.hpp \ SpecialManager.hpp SpecialManager.cpp \ StreamReader.hpp StreamReader.cpp \ StreamWriter.hpp StreamWriter.cpp \ Subfont.hpp Subfont.cpp \ SVGCharHandler.hpp SVGCharHandler.cpp \ SVGCharHandlerFactory.hpp SVGCharHandlerFactory.cpp \ SVGCharPathHandler.hpp SVGCharPathHandler.cpp \ SVGCharTspanTextHandler.hpp SVGCharTspanTextHandler.cpp \ SVGOutput.hpp SVGOutput.cpp \ SVGSingleCharTextHandler.hpp SVGSingleCharTextHandler.cpp \ SVGTree.hpp SVGTree.cpp \ System.hpp System.cpp \ TensorProductPatch.hpp TensorProductPatch.cpp \ Terminal.hpp Terminal.cpp \ TFM.hpp TFM.cpp \ ToUnicodeMap.hpp ToUnicodeMap.cpp \ TpicSpecialHandler.hpp TpicSpecialHandler.cpp \ TriangularPatch.hpp TriangularPatch.cpp \ TrueTypeFont.hpp TrueTypeFont.cpp \ TTFAutohint.hpp TTFAutohint.cpp \ Unicode.hpp Unicode.cpp \ utility.hpp utility.cpp \ VectorIterator.hpp \ VectorStream.hpp \ VFActions.hpp \ VFReader.hpp VFReader.cpp \ windows.hpp \ XMLDocument.hpp XMLDocument.cpp \ XMLNode.hpp XMLNode.cpp \ XMLString.hpp XMLString.cpp \ XXHashFunction.hpp \ ZLibOutputStream.hpp if ENABLE_WOFF libdvisvgm_la_SOURCES += ffwrapper.c ffwrapper.h endif libdvisvgm_la_LIBADD = optimizer/liboptimizer.la EXTRA_DIST = options.xml options.dtd iapi.h ierrors.h MiKTeXCom.hpp MiKTeXCom.cpp AM_CFLAGS = -Wall \ $(ZLIB_CFLAGS) \ $(CODE_COVERAGE_CFLAGS) AM_CXXFLAGS = -Wall -Wnon-virtual-dtor \ -I$(dvisvgm_srcdir)/libs/clipper \ -I$(dvisvgm_srcdir)/libs/variant/include \ $(KPSE_CFLAGS) \ $(FREETYPE_CFLAGS) \ $(ZLIB_CFLAGS) \ $(CODE_COVERAGE_CFLAGS) AM_CXXFLAGS += \ $(POTRACE_CFLAGS) \ $(XXHASH_CFLAGS) AM_LDFLAGS = \ $(KPSE_LIBS) \ $(CODE_COVERAGE_LDFLAGS) if ENABLE_WOFF AM_CFLAGS += \ -I$(dvisvgm_srcdir)/libs/ff-woff/fontforge \ -I$(dvisvgm_srcdir)/libs/ff-woff/inc AM_CXXFLAGS += $(TTFAUTOHINT_CFLAGS) AM_CXXFLAGS += \ $(BROTLI_CFLAGS) \ $(WOFF2_CFLAGS) if USE_BUNDLED_MD5 AM_CXXFLAGS += -I$(dvisvgm_srcdir)/libs/md5 else AM_CXXFLAGS += $(LIBCRYPTO_CFLAGS) endif AM_LDFLAGS += $(TTFAUTOHINT_LIBS) endif # the command-line parser class is generated from options.xml by opt2cpp $(srcdir)/CommandLine.hpp: options.xml rm -f $@ python $(srcdir)/opt2cpp.py $< >$@ # Create a C string definition containing the PostScript routines psdefs.ps needed by class PSInterpreter $(srcdir)/psdefs.cpp: psdefs.ps if test -f $<; then \ ps2c PSInterpreter::PSDEFS $< >$@; \ fi psdefs.ps: ; @CODE_COVERAGE_RULES@ CLEANFILES = *.gcda *.gcno dvisvgm-2.8.1/src/InputBuffer.hpp0000664000175000017500000001122613510660062013656 00000000000000/************************************************************************* ** InputBuffer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef INPUTBUFFER_HPP #define INPUTBUFFER_HPP #include #include #include #include #include struct InputBuffer { virtual ~InputBuffer () =default; virtual int get () =0; virtual int peek () const =0; virtual int peek (size_t n) const =0; virtual bool eof () const =0; virtual void invalidate () =0; }; class StreamInputBuffer : public InputBuffer { public: explicit StreamInputBuffer (std::istream &is, size_t bufsize=1024); ~StreamInputBuffer () override; int get () override; int peek () const override; int peek (size_t n) const override; bool eof () const override {return pos() == _size1 && _size2 == 0;} void invalidate () override {_bufptr = _buf1+_size1; _size2 = 0;} protected: int fillBuffer (uint8_t *buf); size_t pos () const {return _bufptr-_buf1;} private: std::istream &_is; const size_t _bufsize; ///< maximal number of bytes each buffer can hold uint8_t *_buf1; ///< pointer to first buffer uint8_t *_buf2; ///< pointer to second buffer size_t _size1; ///< number of bytes in buffer 1 size_t _size2; ///< number of bytes in buffer 2 uint8_t *_bufptr; ///< pointer to next byte to read }; class StringInputBuffer : public InputBuffer { public: explicit StringInputBuffer (const std::string &str) : _str(&str) {} void assign (const std::string &str) {_str = &str; _pos=0;} int get () override {return _pos < _str->length() ? _str->at(_pos++) : -1;} int peek () const override {return _pos < _str->length() ? _str->at(_pos) : -1;} int peek (size_t n) const override {return _pos+n < _str->length() ? _str->at(_pos+n) : -1;} bool eof () const override {return _pos >= _str->length();} void invalidate () override {_pos = _str->length();} private: const std::string *_str; size_t _pos=0; }; class CharInputBuffer : public InputBuffer { public: CharInputBuffer (const char *buf, size_t size) : _pos(buf), _size(buf ? size : 0) {} int get () override { if (_size == 0) return -1; else { _size--; return *_pos++; } } void assign (const char *buf, size_t size) { _pos = buf; _size = size; } void assign (const char *buf) {assign(buf, std::strlen(buf));} int peek () const override {return _size > 0 ? *_pos : -1;} int peek (size_t n) const override {return _size >= n ? _pos[n] : -1;} bool eof () const override {return _size == 0;} void invalidate () override {_size = 0;} private: const char *_pos; size_t _size; }; class SplittedCharInputBuffer : public InputBuffer { public: SplittedCharInputBuffer (const char *buf1, size_t s1, const char *buf2, size_t s2); int get () override; int peek () const override; int peek (size_t n) const override; bool eof () const override {return _size[_index] == 0;} void invalidate () override {_size[_index] = 0;} private: const char *_buf[2]; size_t _size[2]; int _index; }; class TextStreamInputBuffer : public StreamInputBuffer { public: explicit TextStreamInputBuffer (std::istream &is) : StreamInputBuffer(is) {} int get () override; int line () const {return _line;} int col () const {return _col;} private: int _line=1, _col=1; }; #endif dvisvgm-2.8.1/src/Bitmap.cpp0000664000175000017500000001143113542104105012626 00000000000000/************************************************************************* ** Bitmap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "Bitmap.hpp" using namespace std; /** Constructs a Bitmap */ Bitmap::Bitmap (int minx, int maxx, int miny , int maxy) { resize(minx, maxx, miny, maxy); } /** Resizes the bitmap and clears all pixels. * @param[in] minx index of leftmost pixel column * @param[in] maxx index of rightmost pixel column * @param[in] miny index of bottom row * @param[in] maxy index of top row */ void Bitmap::resize (int minx, int maxx, int miny , int maxy) { _rows = abs(maxy-miny)+1; _cols = abs(maxx-minx)+1; _xshift = minx; _yshift = miny; _bpr = _cols/8 + (_cols % 8 ? 1 : 0); // bytes per row _bytes.resize(_rows*_bpr); std::fill(_bytes.begin(), _bytes.end(), 0); } /** Sets n pixels of row r to 1 starting at pixel c. * @param[in] row number of row * @param[in] col number of column (pixel) * @param[in] n number of bits to be set */ void Bitmap::setBits (int row, int col, int n) { row -= _yshift; col -= _xshift; uint8_t *byte = &_bytes[row*_bpr + col/8]; if (byte < &_bytes[0]) return; const uint8_t *maxptr = &_bytes[0]+_bytes.size()-1; while (n > 0 && byte <= maxptr) { int b = 7 - col%8; // number of leftmost bit in current byte to be set int m = min(n, b+1); // number of bits to be set in current byte int bitseq = (1 << m)-1; // sequence of n set bits (bits 0..n-1 are set) bitseq <<= b-m+1; // move bit sequence so that bit b is the leftmost set bit *byte |= uint8_t(bitseq); // apply bit sequence to current byte byte++; n -= m; col += m; } } void Bitmap::forAllPixels (Callback &data) const { for (int row=0; row < _rows ; row++) { for (int col=0; col < _bpr; col++) { uint8_t byte = _bytes[row*_bpr+col]; int x; for (int b=7; (b >= 0) && ((x = 8*col+(7-b)) < _cols); b--) data.pixel(x, row, bool(byte & (1 << b)), *this); } } data.finish(); } class BBoxCallback : public Bitmap::Callback { public: int minx () const {return _minx;} int miny () const {return _miny;} int maxx () const {return _maxx;} int maxy () const {return _maxy;} bool empty () const {return !_changed;} void pixel (int x, int y, bool set, const Bitmap&) override { if (set) { _minx = min(_minx, x); _miny = min(_miny, y); _maxx = max(_maxx, x); _maxy = max(_maxy, y); _changed = true; } } void finish () override { if (empty()) _minx = _miny = 0; } private: bool _changed = false; int _minx = numeric_limits::max(), _miny=_minx; int _maxx = 0, _maxy = 0; }; /** Computes the bounding box that spans all set pixels. */ bool Bitmap::getBBox (int &minx, int &miny, int &maxx, int &maxy) const { BBoxCallback bboxCallback; forAllPixels(bboxCallback); minx = bboxCallback.minx(); miny = bboxCallback.miny(); maxx = bboxCallback.maxx(); maxy = bboxCallback.maxy(); return !bboxCallback.empty(); } /** Computes width and height of the bounding box that spans all set pixels. */ void Bitmap::getExtent (int &w, int &h) const { int minx, miny, maxx, maxy; if (getBBox(minx, miny, maxx, maxy)) { w = maxx-minx+1; h = maxy-miny+1; } else w = h = 0; } #if 0 ostream& Bitmap::write (ostream &os) const { for (int r=_rows-1; r >= 0 ; r--) { for (int c=0; c < _bpr; c++) { uint8_t byte = _bytes[r*_bpr+c]; for (int b=128; b; b>>=1) os << (byte & b ? '*' : '-'); os << ' '; } os << endl; } return os; } #endif dvisvgm-2.8.1/src/MapLine.cpp0000664000175000017500000002045713511327144012755 00000000000000/************************************************************************* ** MapLine.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "InputBuffer.hpp" #include "InputReader.hpp" #include "MapLine.hpp" #include "Subfont.hpp" using namespace std; /** Constructs a MapLine object by parsing a single map line from the given stream. */ MapLine::MapLine (istream &is) : MapLine() { char buf[256]; is.getline(buf, 256); parse(buf); } MapLine::MapLine (string str) : MapLine() { size_t pos = str.rfind('\n'); if (pos != string::npos) str = str.substr(0, pos); parse(str.c_str()); } // Some of the following functions have been derived from the dvipdfmx source file fontmap.c: // http://cvs.ktug.or.kr/viewcvs/dvipdfmx/src/fontmap.c?revision=1.43&view=markup /** Returns true if the given string is in dvips mapline format, and false if it's in dvipdfm format. @param[in] line string to check */ bool MapLine::isDVIPSFormat (const char *line) const { if (strchr(line, '"') || strchr(line, '<')) // these chars are only present in dvips maps return true; char prevchar = ' '; int entry_count=0; for (const char *p=line; *p; ++p) { if (isspace(prevchar)) { if (*p == '-') // options starting with '-' are only present in dvipdfm map files return false; if (!isspace(*p)) entry_count++; } prevchar = *p; } // tfm_name and ps_name only => dvips map return entry_count == 2; } /** Separates main font name and subfont definition name from a given combined name. * Example: "basename@sfdname@10" => {"basename10", "sfdname"} * @param[in,out] fontname complete fontname; after separation: main fontname only * @param[out] sfdname name of subfont definition * @return true on success */ static bool split_fontname (string &fontname, string &sfdname) { size_t pos1; // index of first '@' if ((pos1 = fontname.find('@')) != string::npos && pos1 > 0) { size_t pos2; // index of second '@' if ((pos2 = fontname.find('@', pos1+1)) != string::npos && pos2 > pos1+1) { sfdname = fontname.substr(pos1+1, pos2-pos1-1); fontname = fontname.substr(0, pos1) + fontname.substr(pos2+1); return true; } } return false; } /** Parses a single mapline and stores the scanned data in member variables. * The line may either be given in dvips or dvipdfmx mapfile format. * @param[in] line the mapline */ void MapLine::parse (const char *line) { if (line) { CharInputBuffer ib(line, strlen(line)); BufferInputReader ir(ib); _texname = ir.getString(); string sfdname; split_fontname(_texname, sfdname); if (!sfdname.empty()) _sfd = SubfontDefinition::lookup(sfdname); if (isDVIPSFormat(line)) parseDVIPSLine(ir); else parseDVIPDFMLine(ir); } } /** Parses a single line in dvips mapfile format. * @param[in] ir the input stream must be assigned to this reader */ void MapLine::parseDVIPSLine (InputReader &ir) { ir.skipSpace(); if (ir.peek() != '<' && ir.peek() != '"') _psname = ir.getString(); ir.skipSpace(); while (ir.peek() == '<' || ir.peek() == '"') { if (ir.peek() == '<') { ir.get(); if (ir.peek() == '[' || ir.peek() == '<') ir.get(); // skip second char of "<[" and "<<" string name = ir.getString(); if (name.length() > 4 && name.substr(name.length()-4) == ".enc") _encname = name.substr(0, name.length()-4); else _fontfname = name; } else { // ir.peek() == '"' => list of PS font operators string options = ir.getQuotedString("\""); StringInputBuffer sib(options); BufferInputReader sir(sib); while (!sir.eof()) { double number; if (sir.parseDouble(number)) { // operator with preceding numeric parameter (value opstr) string opstr = sir.getString(); if (opstr == "SlantFont") _slant = number; else if (opstr == "ExtendFont") _extend = number; } else { // operator without parameter => skip for now sir.getString(); } } } ir.skipSpace(); } } static void throw_number_expected (char opt, bool integer_only=false) { ostringstream oss; oss << "option -" << opt << ": " << (integer_only ? "integer" : "floating point") << " value expected"; throw MapLineException(oss.str()); } /** Parses a single line in dvipdfmx mapfile format. * @param[in] ir the input stream must be assigned to this reader */ void MapLine::parseDVIPDFMLine (InputReader &ir) { ir.skipSpace(); if (ir.peek() != '-') { _encname = ir.getString(); if (_encname == "default" || _encname == "none") _encname.clear(); } ir.skipSpace(); if (ir.peek() != '-') _fontfname = ir.getString(); if (!_fontfname.empty()) { parseFilenameOptions(_fontfname); } ir.skipSpace(); while (ir.peek() == '-') { ir.get(); int option = ir.get(); if (!isprint(option)) throw MapLineException("option character expected"); ir.skipSpace(); switch (option) { case 's': // slant if (!ir.parseDouble(_slant)) throw_number_expected('s'); break; case 'e': // extend if (!ir.parseDouble(_extend)) throw_number_expected('e'); break; case 'b': // bold if (!ir.parseDouble(_bold)) throw_number_expected('b'); break; case 'r': //remap (deprecated) break; case 'i': // ttc index if (!ir.parseInt(_fontindex, false)) throw_number_expected('i', true); break; case 'p': // UCS plane int dummy; if (!ir.parseInt(dummy, false)) throw_number_expected('p', true); break; case 'u': // to unicode ir.getString(); break; case 'v': // stemV int stemv; if (!ir.parseInt(stemv, true)) throw_number_expected('v', true); break; case 'm': // map single chars ir.skipUntil("-"); break; case 'w': // writing mode (horizontal=0, vertical=1) int vertical; if (!ir.parseInt(vertical, false)) throw_number_expected('w', true); break; default: throw MapLineException("invalid option: -" + string(1, option)); } ir.skipSpace(); } } /** [:INDEX:][!]FONTNAME[/CSI][,VARIANT] */ void MapLine::parseFilenameOptions (string fname) { _fontfname = fname; StringInputBuffer ib(fname); BufferInputReader ir(ib); if (ir.peek() == ':' && isdigit(ir.peek(1))) { // index given? ir.get(); _fontindex = ir.getInt(); // font index of file with multiple fonts if (ir.peek() == ':') ir.get(); else _fontindex = 0; } if (ir.peek() == '!') // no embedding ir.get(); bool csi_given=false, style_given=false; int pos; if ((pos = ir.find('/')) >= 0) { // csi delimiter csi_given = true; _fontfname = ir.getString(pos); } else if ((pos = ir.find(',')) >= 0) { style_given = true; _fontfname = ir.getString(pos); } else _fontfname = ir.getString(); if (csi_given) { if ((pos = ir.find(',')) >= 0) { style_given = true; ir.getString(pos); // charcoll } else if (ir.eof()) throw MapLineException("CSI specifier expected"); else ir.getString(); // charcoll } if (style_given) { ir.get(); // skip ',' if (ir.check("BoldItalic")) { } else if (ir.check("Bold")) { } else if (ir.check("Italic")) { } if (!ir.eof()) throw MapLineException("invalid style given"); } } dvisvgm-2.8.1/src/EncFile.cpp0000664000175000017500000000753713510660062012737 00000000000000/************************************************************************* ** EncFile.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Font.hpp" #include "EncFile.hpp" #include "InputBuffer.hpp" #include "InputReader.hpp" #include "FileFinder.hpp" #include "Message.hpp" using namespace std; static string read_entry (InputReader &in); static bool valid_name_char (int c); EncFile::EncFile (string encname) : _encname(std::move(encname)) { read(); } const char* EncFile::path () const { return FileFinder::instance().lookup(_encname+".enc", false); } /** Search for suitable enc-file and read its encoding information. * The file contents must be a valid PostScript vector with 256 entries. */ void EncFile::read () { if (const char *p = path()) { ifstream ifs(p); read(ifs); } else Message::wstream(true) << "encoding file '" << _encname << ".enc' not found\n"; } /** Read encoding information from stream. */ void EncFile::read (istream &is) { StreamInputBuffer ib(is, 256); BufferInputReader in(ib); _table.resize(256); // find beginning of vector while (!in.eof()) { in.skipSpace(); if (in.peek() == '%') in.skipUntil("\n"); else if (in.get() == '[') break; } // read vector entries int n=0; while (!in.eof()) { in.skipSpace(); if (in.peek() == '%') in.skipUntil("\n"); else if (in.peek() == ']') { in.get(); break; } else { string entry = read_entry(in); if (entry == ".notdef") entry.clear(); if (n < 256) _table[n++] = entry; } } // remove trailing .notdef names for (n--; n > 0 && _table[n].empty(); n--); _table.resize(n+1); } static string read_entry (InputReader &in) { string entry; bool accept_slashes=true; while (!in.eof() && ((in.peek() == '/' && accept_slashes) || valid_name_char(in.peek()))) { if (in.peek() != '/') accept_slashes = false; entry += char(in.get()); } if (entry.length() > 1) { // strip leading slashes // According to the PostScript specification, a single slash without further // following characters is a valid name. size_t n=0; while (n < entry.length() && entry[n] == '/') n++; entry = entry.substr(n); } return entry; } static bool valid_name_char (int c) { const char *delimiters = "<>(){}[]/~%"; return isprint(c) && !isspace(c) && !strchr(delimiters, c); } /** Returns an entry of the encoding table. * @param[in] c character code * @return character name assigned to character code c*/ const char* EncFile::charName (uint32_t c) const { if (c < _table.size()) return !_table[c].empty() ? _table[c].c_str() : nullptr; return nullptr; } dvisvgm-2.8.1/src/Unicode.hpp0000664000175000017500000000325413510660062013015 00000000000000/************************************************************************* ** Unicode.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef UNICODE_HPP #define UNICODE_HPP #include struct Unicode { static bool isValidCodepoint (uint32_t code); static uint32_t charToCodepoint (uint32_t c); static std::string utf8 (int32_t c); static int32_t aglNameToCodepoint (const std::string &name); }; #endif dvisvgm-2.8.1/src/TTFAutohint.cpp0000664000175000017500000001010713510660062013566 00000000000000/************************************************************************* ** TTFAutohint.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "TTFAutohint.hpp" using namespace std; #ifndef HAVE_TTFAUTOHINT_H TTFAutohint::TTFAutohint () {} bool TTFAutohint::available () const { return false; } int TTFAutohint::autohint (const string&, const string&, bool) { return 0; } string TTFAutohint::lastErrorMessage () const { return ""; } string TTFAutohint::version () const { return ""; } #else // HAVE_TTFAUTOHINT_H #include #ifndef HAVE_LIBTTFAUTOHINT static string get_libttfautohint () { #ifdef _WIN32 return "ttfautohint.dll"; #else string dlname = "libttfautohint.so.1"; #ifdef __APPLE__ DLLoader loader(dlname); if (!loader.loaded()) dlname = "libttfautohint.1.dylib"; #endif return dlname; #endif // _WIN32 } #endif // HAVE_LIBTTFAUTOHINT TTFAutohint::TTFAutohint () : #ifndef HAVE_LIBTTFAUTOHINT DLLoader(get_libttfautohint()), #endif _lastErrorMessage() { } /** Returns true if the ttfautohint library is present. */ bool TTFAutohint::available () const { #ifdef HAVE_LIBTTFAUTOHINT return true; #else return loaded(); #endif } /** Runs ttfautohint on a given font file. * @param[in] source name of TTF input file * @param[in] target name of TTF output file * @param[in] rehintIfSymbolFont if true, ttfautohint is run again with option "symbol" in case regular hinting is rejected. * @return ttfautohint error code (0 = success) */ int TTFAutohint::autohint (const string &source, const string &target, bool rehintIfSymbolFont) { #ifdef HAVE_LIBTTFAUTOHINT auto fn = &TTF_autohint; #else auto fn = LOAD_SYMBOL(TTF_autohint); #endif int ret=0; if (fn) { FILE *ttf_in = fopen(source.c_str(), "rb"); FILE *ttf_out = fopen(target.c_str(), "wb"); ret = fn("in-file, out-file, default-script, error-string", ttf_in, ttf_out, "latn", &_lastErrorMessage); if (ret == TA_Err_Missing_Glyph && rehintIfSymbolFont) { fseek(ttf_in, 0, SEEK_SET); fseek(ttf_out, 0, SEEK_SET); ret = fn("in-file, out-file, symbol, error-string", ttf_in, ttf_out, true, &_lastErrorMessage); } fclose(ttf_out); fclose(ttf_in); } return ret; } /** Returns the error message of the last autohint call. */ string TTFAutohint::lastErrorMessage () const { string message; if (_lastErrorMessage) message = reinterpret_cast(_lastErrorMessage); return message; } /** Returns the version number of ttfautohint. */ string TTFAutohint::version () const { #ifdef HAVE_LIBTTFAUTOHINT auto fn = &TTF_autohint_version; #else auto fn = LOAD_SYMBOL(TTF_autohint_version); #endif string ret; if (fn) { int major, minor, revision; fn(&major, &minor, &revision); ret = to_string(major)+"."+to_string(minor); if (revision) ret += "."+to_string(revision); } return ret; } #endif // HAVE_TTFAUTOHINT_H dvisvgm-2.8.1/src/Bezier.cpp0000664000175000017500000002165713536436371012665 00000000000000/************************************************************************* ** Bezier.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "Bezier.hpp" #include "Matrix.hpp" using namespace std; Bezier::Bezier () { _points[0] = _points[1] = _points[2] = _points[3] = DPair(0); } /** Creates a quadratic Bézier curve. internally, it's represented as a cubic one. */ Bezier::Bezier (const DPair &p0, const DPair &p1, const DPair &p2) { setPoints(p0, p0+(p1-p0)*2.0/3.0, p2+(p1-p2)*2.0/3.0, p2); } Bezier::Bezier (const DPair &p0, const DPair &p1, const DPair &p2, const DPair &p3) { setPoints(p0, p1, p2, p3); } /** Creates a subcurve of a given Bézier curve. * @param[in] source original curve to be clipped * @param[in] t0 'time' parameter \f$\in[0,1]\f$ of source curve where the subcurve starts * @param[in] t1 'time' parameter \f$\in[0,1]\f$ of source curve where the subcurve ends */ Bezier::Bezier (const Bezier &source, double t0, double t1) { if (t0 == t1) _points[0] = _points[1] = _points[2] = _points[3] = source.valueAt(t0); else { if (t0 > t1) swap(t0, t1); if (t0 == 0) source.subdivide(t1, this, nullptr); else if (t1 == 1) source.subdivide(t0, nullptr, this); else { Bezier subcurve; source.subdivide(t0, nullptr, &subcurve); subcurve.subdivide((t1-t0)/(1-t0), this, nullptr); } } } void Bezier::setPoints(const DPair &p0, const DPair &p1, const DPair &p2, const DPair &p3) { _points[0] = p0; _points[1] = p1; _points[2] = p2; _points[3] = p3; } void Bezier::reverse() { swap(_points[0], _points[3]); swap(_points[1], _points[2]); } DPair Bezier::valueAt (double t) const { const double s = 1-t; return _points[0]*s*s*s + _points[1]*3.0*s*s*t + _points[2]*3.0*s*t*t + _points[3]*t*t*t; } /** Returns a value of the Bézier curve's blossom representation. */ DPair Bezier::blossomValue (double u, double v, double w) const { const double uv = u*v; const double uw = u*w; const double vw = v*w; const double uvw = u*v*w; return _points[0]*(1.0-u-v-w+uv+uw+vw-uvw) +_points[1]*(u+v+w-2.0*(uv+uw+vw)+3.0*uvw) +_points[2]*(uv+uw+vw-3.0*uvw) +_points[3]*uvw; } /** Splits the curve at t into two sub-curves. */ void Bezier::subdivide (double t, Bezier *bezier1, Bezier *bezier2) const { const double s = 1-t; DPair p01 = _points[0]*s + _points[1]*t; DPair p12 = _points[1]*s + _points[2]*t; DPair p23 = _points[2]*s + _points[3]*t; DPair p012 = p01*s + p12*t; DPair p123 = p12*s + p23*t; DPair p0123 = p012*s + p123*t; if (bezier1) bezier1->setPoints(_points[0], p01, p012, p0123); if (bezier2) bezier2->setPoints(p0123, p123, p23, _points[3]); } /** Approximates the current Bézier curve by a sequence of line segments. * This is done by subdividing the curve several times using De Casteljau's algorithm. * If a sub-curve is almost flat, i.e. \f$\sum\limits_{k=0}^2 |p_{k+1}-p_k| - |p_3-p_0| < \delta\f$, * the curve is not further subdivided. * @param[in] delta threshold where to stop further subdivisions (see description above) * @param[out] p the resulting sequence of points defining the start/end points of the line segments * @param[out] t corresponding curve parameters of the approximated points p: \f$ b(t_i)=p_i \f$ * @return number of points in vector p */ int Bezier::approximate (double delta, std::vector &p, vector *t) const { p.push_back(_points[0]); if (t) t->push_back(0); return approximate(delta, 0, 1, p, t); } int Bezier::approximate (double delta, double t0, double t1, vector &p, vector *t) const { // compute distance of adjacent control points const double l01 = (_points[1]-_points[0]).length(); const double l12 = (_points[2]-_points[1]).length(); const double l23 = (_points[3]-_points[2]).length(); const double l03 = (_points[3]-_points[0]).length(); if (l01+l12+l23-l03 < delta) { // is curve flat enough? p.push_back(_points[3]); // => store endpoint if (t) t->push_back(t1); } else { // subdivide curve at b(0.5) and approximate the resulting parts separately Bezier b1, b2; subdivide(0.5, &b1, &b2); double tmid = (t0+t1)/2; b1.approximate(delta, t0, tmid, p, t); b2.approximate(delta, tmid, t1, p, t); } return p.size(); } /** Returns the signed area of the triangle (p1, p2, p3). */ static inline double signed_area (const DPair &p1, const DPair &p2, const DPair &p3) { return ((p2.x()-p1.x())*(p3.y()-p1.y()) - (p3.x()-p1.x())*(p2.y()-p1.y()))/2.0; } static inline double dot_prod (const DPair &p1, const DPair &p2) { return p1.x()*p2.x() + p1.y()*p2.y(); } /** Returns true if p3 is located between p1 and p2, i.e. p3 lays almost on the line * between p1 and p2. */ static bool between (const DPair &p1, const DPair &p2, const DPair &p3, double delta) { double sqr_dist = dot_prod(p2-p1, p2-p1); double factor = sqr_dist == 0.0 ? 1.0 : sqr_dist; double area2 = fabs(signed_area(p1, p2, p3)); return area2*area2/factor < delta // does p3 lay almost on the line through p1 and p2... && min(p1.x(), p2.x()) <= p3.x() // ...and on or inside the rectangle spanned by p1 and p2? && max(p1.x(), p2.x()) >= p3.x() && min(p1.y(), p2.y()) <= p3.y() && max(p1.y(), p2.y()) >= p3.y(); } static inline bool near (const DPair &p1, const DPair &p2, double delta) { DPair diff = p2-p1; return fabs(diff.x()) < delta && fabs(diff.y()) < delta; } /** Tries to reduce the degree of the Bézier curve. This only works if the number of * control points can be reduces without changing the shape of the curve significantly. * @param[in] delta deviation tolerance * @param[in] p control points of the reduced curve * @return degree of the reduced curve */ int Bezier::reduceDegree (double delta, vector &p) const { p.clear(); if (near(_points[0], _points[1], delta) && near(_points[0], _points[2], delta) && near(_points[0], _points[3], delta)) p.push_back(_points[0]); else if (between(_points[0], _points[3], _points[1], delta) && between(_points[0], _points[3], _points[2], delta)) { p.push_back(_points[0]); p.push_back(_points[3]); } else if (near((_points[1]-_points[0])*1.5+_points[0], (_points[2]-_points[3])*1.5+_points[3], delta)) { p.push_back(_points[0]); p.push_back((_points[1]-_points[0])*1.5 + _points[0]); p.push_back(_points[3]); } else { p.resize(4); for (int i=0; i < 4; i++) p[i] = _points[i]; } return p.size()-1; } /** Try to solve the quadratic equation ax^2 + bx + c = 0. */ static bool solve_quadratic_equation (double a, double b, double c, double &x1, double &x2) { if (a == 0) { if (b == 0) return false; x1 = x2 = -c/b; } else { double discr = b*b - 4*a*c; if (discr < 0) return false; double p = -b/a/2; double r = sqrt(discr)/a/2; x1 = p+r; x2 = p-r; } return true; } /** Returns a tight bounding box parallel to the x- and y-axis. */ BoundingBox Bezier::getBBox () const { BoundingBox bbox; // coefficients of the derivative DPair pa = _points[3] - _points[2]*3.0 + _points[1]*3.0 - _points[0]; DPair pb = (_points[2]-_points[1]*2.0+_points[0])*2.0; DPair pc = _points[1]-_points[0]; // compute extrema for t > 0 and t < 1 double t1, t2; if (solve_quadratic_equation(pa.x(), pb.x(), pc.x(), t1, t2)) { if (t1 > 0.001 && t1 < 0.999) bbox.embed(valueAt(t1)); if (t1 != t2 && t2 > 0.001 && t2 < 0.999) bbox.embed(valueAt(t2)); } if (solve_quadratic_equation(pa.y(), pb.y(), pc.y(), t1, t2)) { if (t1 > 0.001 && t1 < 0.999) bbox.embed(valueAt(t1)); if (t1 != t2 && t2 > 0.001 && t2 < 0.999) bbox.embed(valueAt(t2)); } bbox.embed(_points[0]); bbox.embed(_points[3]); return bbox; } Bezier& Bezier::transform (const Matrix &matrix) { for (int i=0; i < 4; i++) _points[i] = matrix*_points[i]; return *this; } dvisvgm-2.8.1/src/FontMetrics.hpp0000664000175000017500000000650413510660062013665 00000000000000/************************************************************************* ** FontMetrics.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTMETRICS_HPP #define FONTMETRICS_HPP #include #include #include #include "MessageException.hpp" struct FontMetrics { virtual ~FontMetrics () =default; virtual double getDesignSize () const =0; virtual double getCharWidth (int c) const =0; virtual double getCharHeight (int c) const =0; virtual double getCharDepth (int c) const =0; virtual double getItalicCorr (int c) const =0; virtual double getSpace () const =0; virtual double getSpaceStretch () const =0; virtual double getSpaceShrink () const =0; virtual double getQuad () const =0; virtual double getAscent () const =0; virtual double getDescent () const =0; virtual bool verticalLayout () const =0; virtual uint32_t getChecksum () const =0; virtual uint16_t firstChar () const =0; virtual uint16_t lastChar () const =0; static std::unique_ptr read (const std::string &fontname); }; struct NullFontMetric : public FontMetrics { double getDesignSize () const override {return 1;} double getCharWidth (int c) const override {return 0;} double getCharHeight (int c) const override {return 0;} double getCharDepth (int c) const override {return 0;} double getItalicCorr (int c) const override {return 0;} double getSpace () const override {return 0;} double getSpaceStretch () const override {return 0;} double getSpaceShrink () const override {return 0;} double getQuad () const override {return 0;} double getAscent () const override {return 0;} double getDescent () const override {return 0;} bool verticalLayout () const override {return false;} uint32_t getChecksum () const override {return 0;} uint16_t firstChar () const override {return 0;} uint16_t lastChar () const override {return 0;} }; struct FontMetricException : public MessageException { explicit FontMetricException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/HtmlSpecialHandler.cpp0000664000175000017500000000704713510660062015131 00000000000000/************************************************************************* ** HtmlSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "HtmlSpecialHandler.hpp" #include "HyperlinkManager.hpp" #include "InputReader.hpp" #include "SpecialActions.hpp" using namespace std; void HtmlSpecialHandler::preprocess (const string&, istream &is, SpecialActions &actions) { StreamInputReader ir(is); ir.skipSpace(); // collect page number and ID of named anchors map attribs; if (ir.check(" 0) { map::iterator it; if ((it = attribs.find("name")) != attribs.end()) HyperlinkManager::instance().addNameAchor(it->second, actions.getCurrentPageNumber()); else if ((it = attribs.find("href")) != attribs.end()) HyperlinkManager::instance().addHrefAnchor(it->second); } } bool HtmlSpecialHandler::process (const string&, istream &is, SpecialActions &actions) { _active = true; StreamInputReader ir(is); ir.skipSpace(); map attribs; map::iterator it; if (ir.check(" 0) { if ((it = attribs.find("href")) != attribs.end()) // HyperlinkManager::instance().createLink(it->second, actions); else if ((it = attribs.find("name")) != attribs.end()) // HyperlinkManager::instance().setActiveNameAnchor(it->second, actions); else return false; // none or only invalid attributes } else if (ir.check("")) HyperlinkManager::instance().closeAnchor(actions); else if (ir.check(" 0 && (it = attribs.find("href")) != attribs.end()) HyperlinkManager::instance().setBaseUrl(it->second); return true; } /** This method is called every time the DVI position changes. */ void HtmlSpecialHandler::dviMovedTo (double x, double y, SpecialActions &actions) { if (_active) HyperlinkManager::instance().checkNewLine(actions); } void HtmlSpecialHandler::dviEndPage (unsigned pageno, SpecialActions &actions) { if (_active) { HyperlinkManager::instance().createViews(pageno, actions); _active = false; } } vector HtmlSpecialHandler::prefixes() const { vector pfx {"html:"}; return pfx; } dvisvgm-2.8.1/src/CLCommandLine.hpp0000664000175000017500000000551313510660062014034 00000000000000/************************************************************************* ** CLCommandLine.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CL_COMMANDLINE_HPP #define CL_COMMANDLINE_HPP #include #include #include #include #include #include "CLOption.hpp" #include "MessageException.hpp" namespace CL { class CommandLine { public: CommandLine (const char *summary, const char *usage, const char *copyright); virtual ~CommandLine () =default; void parse (int argc, char **argv); void help (std::ostream &os, int mode=0) const; void addFilename (const std::string &fname) {_files.emplace_back(fname);} bool singleDashGiven () const {return _singleDashParsed;} const std::vector& filenames () const {return _files;} protected: using OptSectPair = std::pair; void parseShortOption (std::istringstream &is, int argc, char **argv, int &argn); void parseLongOption (std::istream &is); virtual std::vector& options () const =0; virtual const char* section (size_t n) const {return nullptr;} Option* lookupOption (char optchar) const; std::vector lookupOption (const std::string &optname) const; private: const char *_summary; const char *_usage; const char *_copyright; bool _singleDashParsed=false; ///< true if a single '-' w/o a following char was parsed std::vector _files; }; struct CommandLineException : public MessageException { explicit CommandLineException (const std::string &msg) : MessageException(msg) {} }; } // namespace CL #endif dvisvgm-2.8.1/src/Unicode.cpp0000664000175000017500000001507213510660062013011 00000000000000/************************************************************************* ** Unicode.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include "Unicode.hpp" using namespace std; /** Returns true if c is a valid Unicode point in XML documents. * XML version 1.0 doesn't allow various Unicode character references * ( for example). */ bool Unicode::isValidCodepoint (uint32_t c) { if ((c & 0xffff) == 0xfffe || (c & 0xffff) == 0xffff) return false; uint32_t ranges[] = { 0x0000, 0x0020, // basic control characters + space 0x007f, 0x009f, // use of control characters is discouraged by the XML standard 0x202a, 0x202e, // bidi control characters 0xd800, 0xdfff, // High Surrogates are not allowed in XML 0xfdd0, 0xfdef, // non-characters for internal use by applications }; for (size_t i=0; i < sizeof(ranges)/sizeof(uint32_t) && c >= ranges[i]; i+=2) if (c <= ranges[i+1]) return false; return true; } /** Returns a valid Unicode point for the given character code. Character codes * that are invalid code points because the XML standard forbids or discourages * their usage, are mapped to the Private Use Zone U+E000-U+F8FF. */ uint32_t Unicode::charToCodepoint (uint32_t c) { uint32_t ranges[] = { 0x0000, 0x0020, 0xe000, // basic control characters + space 0x007f, 0x009f, 0xe021, // use of control characters is discouraged by the XML standard 0x202a, 0x202e, 0xe042, // bidi control characters 0xd800, 0xdfff, 0xe047, // High Surrogates are not allowed in XML 0xfdd0, 0xfdef, 0xe847, // non-characters for internal use by applications 0xfffe, 0xffff, 0xe867, 0x1fffe, 0x1ffff, 0xe869, 0x2fffe, 0x2ffff, 0xe86b, 0x3fffe, 0x3ffff, 0xe86d, 0x4fffe, 0x4ffff, 0xe86f, 0x5fffe, 0x5ffff, 0xe871, 0x6fffe, 0x6ffff, 0xe873, 0x7fffe, 0x7ffff, 0xe875, 0x8fffe, 0x8ffff, 0xe877, 0x9fffe, 0x9ffff, 0xe879, 0xafffe, 0xaffff, 0xe87b, 0xbfffe, 0xbffff, 0xe87d, 0xcfffe, 0xcffff, 0xe87f, 0xdfffe, 0xdffff, 0xe881, 0xefffe, 0xeffff, 0xe883, 0xffffe, 0xfffff, 0xe885, 0x10fffe, 0x10ffff, 0xe887 }; for (size_t i=0; i < sizeof(ranges)/sizeof(unsigned) && c >= ranges[i]; i+=3) if (c <= ranges[i+1]) return ranges[i+2]+c-ranges[i]; return c; } /** Converts a Unicode point to a UTF-8 byte sequence. * @param[in] cp code point * @return utf8 sequence consisting of 1-4 bytes */ string Unicode::utf8 (int32_t cp) { string utf8; if (cp >= 0) { if (cp < 0x80) utf8 += char(cp); else if (cp < 0x800) { utf8 += char(0xC0 + (cp >> 6)); utf8 += char(0x80 + (cp & 0x3F)); } else if (cp < 0x10000) { utf8 += char(0xE0 + (cp >> 12)); utf8 += char(0x80 + ((cp >> 6) & 0x3F)); utf8 += char(0x80 + (cp & 0x3F)); } else if (cp < 0x110000) { utf8 += char(0xF0 + (cp >> 18)); utf8 += char(0x80 + ((cp >> 12) & 0x3F)); utf8 += char(0x80 + ((cp >> 6) & 0x3F)); utf8 += char(0x80 + (cp & 0x3F)); } // UTF-8 does not support codepoints >= 0x110000 } return utf8; } #include "AGLTable.hpp" /** Tries to extract the codepoint from AGL character names like "uni1234" or "u1234". * Returns 0 if the given name doesn't satisfy the constraints. * https://github.com/adobe-type-tools/agl-specification * @param[in] name AGL character name * @return the extracted codepoint or 0 on failure */ static int32_t extract_codepoint_from_name (const string &name) { size_t offset=1; auto is_hex_digit = [](char c) {return isdigit(c) || (c >= 'A' && c <= 'F');}; if (name.substr(0, 3) == "uni" && is_hex_digit(name[4]) && name.length() >= 7) offset = 3; else if (name[0] != 'u' || !is_hex_digit(name[1]) || name.length() < 5) return 0; string::const_iterator it = name.begin()+offset; while (it != name.end() && is_hex_digit(*it) && *it != '.' && *it != '_') ++it; if (it != name.end() && *it != '.' && *it != '_') return 0; string hexstr(name.begin()+offset, it); if (hexstr.length() < 4 || (offset == 3 && hexstr.length() % 4 != 0)) return 0; if (offset == 3) hexstr = hexstr.substr(0, 4); int32_t codepoint; istringstream iss(hexstr); iss >> hex >> codepoint; if (!iss.fail() && (codepoint <= 0xD7FF || (codepoint >= 0xE000 && codepoint <= 0x10FFFF))) return codepoint; return 0; } #if 0 static const char* get_suffix (const string &name) { static const char *suffixes[] = { "small", "swash", "superior", "inferior", "numerator", "denominator", "oldstyle", "display", "text", "big", "bigg", "Big", "Bigg", 0 }; size_t pos = name.rfind('.'); if (pos != string::npos) { string suffix = name.substr(pos+1); for (const char **p=suffixes; *p; p++) if (suffix == *p) return *p; } return 0; } #endif /** Returns the Unicode point for a given AGL character name. * @param name AGL name of the character to look up * @return codepoint of the character */ int32_t Unicode::aglNameToCodepoint (const string &name) { if (int32_t cp = extract_codepoint_from_name(name)) return cp; uint32_t hash = XXH32(&name[0], name.length(), 0); const HashCodepointPair cmppair = {hash, 0}; auto it = lower_bound(hash2unicode.begin(), hash2unicode.end(), cmppair, [](const HashCodepointPair &p1, const HashCodepointPair &p2) { return p1.hash < p2.hash; } ); if (it != hash2unicode.end() && it->hash == hash) return it->codepoint; return 0; } dvisvgm-2.8.1/src/utility.cpp0000664000175000017500000001600313536436371013135 00000000000000/************************************************************************* ** utility.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include "utility.hpp" using namespace std; /** Computes the singular value decomposition of a given 2x2 matrix M * so that M = rotate(phi)*scale(sx,sy)*rotate(theta), where * rotate(t):={{cos t, -sin t}, {sin t, cos t}} and scale(sx, sy):={{sx, 0}, {0, sy}}. * The corresponding math can be found in Jim Blinn: "Consider the Lowly 2x2 Matrix" * https://ieeexplore.ieee.org/document/486688 * Also published in "Jim Blinn's Corner: Notation, Notation, Notation", pp. 69--95. * @param[in] m matrix {{m00, m01}, {m10, m11}} where the inner pairs denote the rows * @return vector {phi, sx, sy, theta} */ vector math::svd (const double (&m)[2][2]) { double phi=0, theta=0, sx=0, sy=0; if (m[0][0] != 0 || m[0][1] != 0 || m[1][0] != 0 || m[1][1] != 0) { double e = (m[0][0] + m[1][1])/2; // = cos(phi+theta)*(sx+sy)/2 double f = (m[0][0] - m[1][1])/2; // = cos(phi-theta)*(sx-sy)/2 double g = (m[1][0] + m[0][1])/2; // = sin(phi-theta)*(sx-sy)/2 double h = (m[1][0] - m[0][1])/2; // = sin(phi+theta)*(sx+sy)/2 double hyp1 = hypot(e, h); // = (sx+sy)/2 double hyp2 = hypot(f, g); // = (sx-sy)/2 sx = hyp1+hyp2; sy = hyp1-hyp2; if (hyp2 == 0) // uniformly scaled rotation? theta = atan2(h, e); else if (hyp1 == 0) // uniformly scaled reflection? theta = -atan2(g, f); else { double a1 = atan2(g, f); // = phi-theta (g/f = tan(phi-theta)) double a2 = atan2(h, e); // = phi+theta (h/e = tan(phi+theta)) phi = (a2+a1)/2; theta = (a2-a1)/2; } } return vector{phi, sx, sy, theta}; } /** Normalizes an angle to the interval [-mod, mod). */ double math::normalize_angle (double angle, double mod) { angle = fmod(angle+mod, 2.0*mod); if (angle < 0) angle += 2.0*mod; return angle-mod; } double math::normalize_0_2pi (double rad) { rad = fmod(rad, TWO_PI); if (rad < 0) rad += TWO_PI; return rad; } /** Returns a given string with leading and trailing whitespace removed. * @param[in] str the string to process * @param[in] ws characters treated as whitespace * @return the trimmed string */ string util::trim (const std::string &str, const char *ws) { size_t first = str.find_first_not_of(ws); if (first == string::npos) return ""; size_t last = str.find_last_not_of(ws); return str.substr(first, last-first+1); } /** Removes leading and trailing whitespace from a given string, and replaces * all other whitespace sequences by single spaces. * @param[in] str the string to process * @param[in] ws characters treated as whitespace * @return the normalized string */ string util::normalize_space (string str, const char *ws) { str = trim(str); size_t first = str.find_first_of(ws); while (first != string::npos) { size_t last = str.find_first_not_of(ws, first); str.replace(first, last-first, " "); first = str.find_first_of(ws, first+1); } return str; } /** Replaces all occurences of a substring with another string. * @param[in] str string to search through * @param[in] find string to look for * @param[in] repl replacement for "find" * @return the resulting string */ string util::replace (string str, const string &find, const string &repl) { if (!find.empty() && !repl.empty()) { size_t first = str.find(find); while (first != string::npos) { str.replace(first, find.length(), repl); first = str.find(find, first+repl.length()); } } return str; } /** Splits a string at all occurences of a given separator string and * returns the substrings. * @param[in] str string to split * @param[in] sep separator to look for * @return the substrings between the separators */ vector util::split (const string &str, const string &sep) { vector parts; if (str.empty() || sep.empty()) parts.emplace_back(str); else { size_t left=0; while (left <= str.length()) { size_t right = str.find(sep, left); if (right == string::npos) { parts.emplace_back(str.substr(left)); left = string::npos; } else { parts.emplace_back(str.substr(left, right-left)); left = right+sep.length(); } } } return parts; } string util::tolower (const string &str) { string ret=str; transform(str.begin(), str.end(), ret.begin(), ::tolower); return ret; } /** Converts a double to a string and strips redundant trailing digits/dots. */ string util::to_string (double val) { string str = std::to_string(val); if (str.find('.') != string::npos) { // double value and not an integer? size_t pos = str.find_last_not_of('0'); if (pos != string::npos) // trailing zeros str.erase(pos+1, string::npos); if (str.back() == '.') // trailing dot? str.pop_back(); } return str; } /** Returns the integer part of log10 of a given integer \f$n>0\f$. * If \f$n<0\f$, the result is 0. */ int util::ilog10 (int n) { int result = 0; while (n >= 10) { result++; n /= 10; } return result; } /** Returns the contents of a file. * @param[in] fname name/path of the file */ string util::read_file_contents (const string &fname) { ifstream ifs(fname, ios::binary); return string(istreambuf_iterator(ifs.rdbuf()), istreambuf_iterator()); } /** Writes a sequence of bytes given as a string to a file. * @param[in] name/path of the file to write * @param[in] start iterator pointing to the begin of the byte sequence * @param[in] end iterator pointing to the first byte after the byte sequence to write */ void util::write_file_contents (const string &fname, string::iterator start, string::iterator end) { ofstream ofs(fname, ios::binary); copy(start, end, ostream_iterator(ofs)); } dvisvgm-2.8.1/src/XMLDocument.cpp0000664000175000017500000000430013510660062013552 00000000000000/************************************************************************* ** XMLDocument.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "XMLDocument.hpp" using namespace std; XMLDocument::XMLDocument (unique_ptr root) : _rootElement(std::move(root)) { } void XMLDocument::clear () { _rootElement.reset(); _nodes.clear(); } void XMLDocument::append (unique_ptr node) { if (node) { if (node->toElement()) _rootElement = util::static_unique_ptr_cast(std::move(node)); else _nodes.emplace_back(std::move(node)); } } void XMLDocument::setRootNode (unique_ptr root) { _rootElement = std::move(root); } ostream& XMLDocument::write (ostream &os) const { if (_rootElement) { // no root element => no output os << "\n"; for (const auto &node : _nodes) { node->write(os); os << '\n'; } _rootElement->write(os); } return os; } dvisvgm-2.8.1/src/PdfSpecialHandler.hpp0000664000175000017500000000541613510660062014741 00000000000000/************************************************************************* ** PdfSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PDFSPECIALHANDLER_HPP #define PDFSPECIALHANDLER_HPP #include "SpecialHandler.hpp" class StreamInputReader; class PdfSpecialHandler : public SpecialHandler { public: const char* info () const override {return "PDF hyperlink, font map, and pagesize specials";} const char* name () const override {return "pdf";} std::vector prefixes() const override; void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; protected: // handlers for corresponding PDF specials void preprocessBeginAnn (StreamInputReader &ir, SpecialActions &actions); void preprocessDest (StreamInputReader &ir, SpecialActions &actions); void preprocessPagesize (StreamInputReader &ir, SpecialActions &actions); void processBeginAnn (StreamInputReader &ir, SpecialActions &actions); void processEndAnn (StreamInputReader &ir, SpecialActions &actions); void processDest (StreamInputReader &ir, SpecialActions &actions); void processMapfile (StreamInputReader &ir, SpecialActions &actions); void processMapline (StreamInputReader &ir, SpecialActions &actions); void dviMovedTo (double x, double y, SpecialActions &actions) override; void dviEndPage (unsigned pageno, SpecialActions &actions) override; private: bool _active=false; }; #endif dvisvgm-2.8.1/src/MessageException.hpp0000664000175000017500000000336313510660062014673 00000000000000/************************************************************************* ** MessageException.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MESSAGEEXCEPTION_HPP #define MESSAGEEXCEPTION_HPP #include #include class MessageException : public std::exception { public: explicit MessageException (std::string msg) : _message(std::move(msg)) {} const char* what () const noexcept override {return _message.c_str();} private: std::string _message; }; #endif dvisvgm-2.8.1/src/PapersizeSpecialHandler.hpp0000664000175000017500000000472213510660062016171 00000000000000/************************************************************************* ** PapersizeSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PAPERSIZESPECIALHANDLER_HPP #define PAPERSIZESPECIALHANDLER_HPP #include #include #include "Length.hpp" #include "SpecialHandler.hpp" class PapersizeSpecialHandler : public SpecialHandler { using DoublePair = std::pair; // (width, height) using PageSize = std::pair; // page number -> (width, height) public: void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; const char* info () const override {return "special to set the page size";} const char* name () const override {return "papersize";} std::vector prefixes() const override; void storePaperSize (unsigned pageno, Length width, Length height); void reset () {_pageSizes.clear();} protected: void dviEndPage (unsigned pageno, SpecialActions &actions) override; void applyPaperSize (unsigned pageno, SpecialActions &actions); private: std::vector _pageSizes; }; #endif dvisvgm-2.8.1/src/SVGCharPathHandler.hpp0000664000175000017500000000462713510660062015004 00000000000000/************************************************************************* ** SVGCharPathHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGCHARPATHHANDLER_HPP #define SVGCHARPATHHANDLER_HPP #include "SVGCharHandler.hpp" /** Creates SVG path elements for all characters. */ class SVGCharPathHandler : public SVGCharHandler { using AppendMethod = void (SVGCharPathHandler::*)(uint32_t c, double x, double y, const Matrix &matrix); public: SVGCharPathHandler (bool createUseElements, bool relativePathsCommands); void appendChar (uint32_t c, double x, double y) override; protected: void appendUseElement (uint32_t c, double x, double y, const Matrix &matrix); void appendPathElement (uint32_t c, double x, double y, const Matrix &matrix); void resetContextNode () override; private: AppendMethod _appendChar; ///< method called to append a single character bool _relativePathCommands; ///< if true, create relative rather than absolute SVG path commands XMLElement *_groupNode=nullptr; ///< current group node taking the path elements CharProperty _fontColor=Color::BLACK; ///< color of current font }; #endif dvisvgm-2.8.1/src/Subfont.hpp0000664000175000017500000000671113510660062013050 00000000000000/************************************************************************* ** Subfont.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SUBFONT_HPP #define SUBFONT_HPP #include #include #include #include #include #include #include "MessageException.hpp" class Subfont; /** Represents a collection of subfont mappings as defined in a .sfd file, and * encapsulates the evaluation of these files. */ class SubfontDefinition { using Subfonts = std::map>; public: SubfontDefinition (const SubfontDefinition &sfd) =delete; static SubfontDefinition* lookup (const std::string &name); // int getIDs (std::vector &ids) const; const std::string& name() const {return _sfname;} std::string filename() const {return _sfname+".sfd";} Subfont* subfont (const std::string &id) const; int subfonts (std::vector &sfs) const; const char* path () const; protected: SubfontDefinition (std::string name, const char *fpath); private: std::string _sfname; ///< name of subfont Subfonts _subfonts; ///< all subfonts defined in the corresponding .sfd file }; /** Represents a single subfont mapping defined in a SubfontDefinition (.sfd file). */ class Subfont { friend class SubfontDefinition; public: Subfont (const Subfont &sf) =delete; const std::string& id () const {return _id;} uint16_t decode (unsigned char c); protected: Subfont (SubfontDefinition &sfd, const std::string &id) : _sfd(sfd), _id(id), _mapping(0) {} bool read (); private: SubfontDefinition &_sfd; ///< SubfontDefinition where this Subfont belongs to const std::string &_id; ///< id of this subfont as specified in the .sfd file std::vector _mapping; ///< the character mapping table with 256 entries }; class SubfontException : public MessageException { public: SubfontException (const std::string &msg, std::string fname, int lineno=0) : MessageException(msg), _fname(std::move(fname)), _lineno(lineno) {} const char* filename () const {return _fname.c_str();} int lineno () const {return _lineno;} private: std::string _fname; int _lineno; }; #endif dvisvgm-2.8.1/src/GraphicsPath.hpp0000664000175000017500000006634313536440466014030 00000000000000/************************************************************************* ** GraphicsPath.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #pragma once #include #include #include #include #include #include #include "BoundingBox.hpp" #include "EllipticalArc.hpp" #include "Matrix.hpp" #include "Pair.hpp" #include "utility.hpp" #include "XMLString.hpp" template class GraphicsPath; namespace gp { /// Base class for all path data commands, like moveto, lineto, curveto, etc. struct CommandBase {}; /** Base class for all path data commands with NUM_POINTS point parameters * @tparam NUM_POINTS number of parameter pairs representing points, e.g. 1 for moveto and lineto */ template class Command : public CommandBase { friend class GraphicsPath; public: int numPoints () const {return NUM_POINTS;} Pair& point (int n) {return points[n];} const Pair& point (int n) const {return points[n];} /** Transforms the command by a given transformation matrix. * @params[in] matrix describes the affine transformation to apply * @params[in] currentPoint the untransformed end point of the preceding command */ void transform (const Matrix &matrix, const Pair ¤tPoint) { for (Pair &p : points) p = matrix * p; } /** Returns true if all points are identical to those of another command. */ bool pointsEqual (const Command &cmd) const { for (int i=0; i < NUM_POINTS; i++) if (points[i] != cmd.points[i]) return false; return true; } protected: explicit Command () =default; explicit Command (std::array, NUM_POINTS> &&pts) : points(std::move(pts)) {} protected: std::array, NUM_POINTS> points; }; template struct MoveTo : public Command { explicit MoveTo (const Pair &p) : Command({p}) {} }; template struct LineTo : public Command { explicit LineTo (const Pair &p) : Command({p}) {} }; template struct CubicTo : public Command { explicit CubicTo (const Pair &p1, const Pair &p2, const Pair &p3) : Command({p1, p2, p3}) {} }; template struct QuadTo : public Command { explicit QuadTo (const Pair &p1, const Pair &p2) : Command({p1, p2}) {} }; template struct ClosePath : public Command { ClosePath () : Command() {} }; template struct ArcTo : Command { ArcTo (T rxx, T ryy, double xrot, bool laf, bool sf, const Pair &pp) : Command({pp}), rx(rxx < 0 ? -rxx : rxx), ry(ryy < 0 ? -ryy : ryy), xrotation(xrot), largeArcFlag(laf), sweepFlag(sf) {} bool operator == (const ArcTo &arc) const { return rx == arc.rx && ry == arc.ry && xrotation == arc.xrotation && largeArcFlag == arc.largeArcFlag && sweepFlag == arc.sweepFlag && this->points[0] == arc.points[0]; } void transform (const Matrix &matrix, const Pair ¤tPoint); bool operator != (const ArcTo &arc) const {return !(*this == arc);} T rx, ry; ///< length of the semi-major and semi-minor axes double xrotation; ///< rotation of the semi-major axis in degrees bool largeArcFlag; ///< if true, the longer arc from start to end point is chosen, else the shorter one bool sweepFlag; ///< if true, arc is drawn in direction of positive angles, else the opposite direction }; /** Applies an affine transformation described by a given matrix to the arc segment. * @params[in] matrix describes the affine transformation to apply * @params[in] currentPoint the untransformed end point of the preceding command */ template void ArcTo::transform (const Matrix &matrix, const Pair ¤tPoint) { EllipticalArc arc(currentPoint, rx, ry, math::deg2rad(xrotation), largeArcFlag, sweepFlag, this->points[0]); arc.transform(matrix); rx = arc.rx(); ry = arc.ry(); xrotation = math::rad2deg(arc.rotationAngle()); largeArcFlag = arc.largeArc(); sweepFlag = arc.sweepPositive(); this->points[0] = Pair(arc.endPoint()); } /** Returns true if two path command objects are identical (same command and same parameters). */ template inline typename std::enable_if::value, bool>::type operator == (const Cmd1 &cmd1, const Cmd2 &cmd2) { if (std::is_convertible::value && std::is_convertible::value) return cmd1.pointsEqual(cmd2); return false; } /** Returns true if two path command objects differ (different commands or different parameters). */ template inline typename std::enable_if::value, bool>::type operator != (const Cmd1 &cmd1, const Cmd2 &cmd2) { if (std::is_convertible::value && std::is_convertible::value) return !cmd1.pointsEqual(cmd2); return true; } } // namespace gp template class GraphicsPath { friend class PathClipper; public: enum class WindingRule {EVEN_ODD, NON_ZERO}; using Point = Pair; protected: static XMLString to_param_str (double v, double s, double d, bool leadingSpace) { XMLString str(v*s + d); if (leadingSpace && (str[0] != '-')) str.insert(0, " "); return str; } static XMLString to_param_str (double val, double prev, double s, double d, bool leadingSpace) { XMLString str((val-prev)*s + d); if (leadingSpace && (str[0] != '-')) str.insert(0, " "); return str; } static std::string to_param_str (const Point &p, double sx, double sy, double dx, double dy, bool leadingSpace) { return to_param_str(p.x(), sx, dx, leadingSpace) + to_param_str(p.y(), sy, dy, true); } static std::string to_param_str (const Point &p, const Point &prev, double sx, double sy, double dx, double dy, bool leadingSpace) { return to_param_str(p.x()-prev.x(), sx, dx, leadingSpace) + to_param_str(p.y()-prev.y(), sy, dy, true); } using MoveTo = gp::MoveTo; using LineTo = gp::LineTo; using CubicTo = gp::CubicTo; using QuadTo = gp::QuadTo; using ArcTo = gp::ArcTo; using ClosePath = gp::ClosePath; /// Variant representing a single path command using CommandVariant = mpark::variant; class IterationVisitor; public: /** Base class providing several template methods being called when executing * GraphicsPath::iterate(). */ class IterationActions { friend class IterationVisitor; public: virtual ~IterationActions () =default; virtual void moveto (const Point &p) {} virtual void lineto (const Point &p) {} virtual void hlineto (const T &x) {} virtual void vlineto (const T &y) {} virtual void quadto (const Point &p) {} virtual void quadto (const Point &p1, const Point &p2) {} virtual void cubicto (const Point &p1, const Point &p2) {} virtual void cubicto (const Point &p1, const Point &p2, const Point &p3) {} virtual void arcto (T rx, T ry, double angle, bool largeArcFlag, bool sweepFlag, const Point &p) {} virtual void closepath () {} virtual bool quit () {return false;} virtual void finished () {} const Point& startPoint () const {return _startPoint;} const Point& currentPoint () const {return _currentPoint;} private: Point _startPoint; ///< first point of the current sub-path Point _currentPoint; ///< point reached by preceding path command, or (0,0) otherwise }; protected: class ModificationActions : public IterationActions { friend class GraphicsPath; public: explicit ModificationActions (GraphicsPath &path) : _path(path) {} protected: GraphicsPath& path () {return _path;} int commandPos () const {return _commandPos;} private: GraphicsPath &_path; int _commandPos=0; ///< number of command in path being processed }; class WriteActions : public IterationActions { public: WriteActions (std::ostream &os, bool rel, double sx, double sy, double dx, double dy) : _os(os), _relative(rel), _sx(sx), _sy(sy), _dx(dx), _dy(dy) {} void moveto (const Point &p) override {write('M', {p});} void lineto (const Point &p) override {write('L', {p});} void hlineto (const T &x) override {write('H', x, this->currentPoint().x(), _sx, _dx);} void vlineto (const T &y) override {write('V', y, this->currentPoint().y(), _sy, _dy);} void quadto (const Point &p) override {write('T', {p});} void quadto (const Point &p1, const Point &p2) override {write('Q', {p1, p2});} void cubicto (const Point &p1, const Point &p2) override {write('S', {p1, p2});} void cubicto (const Point &p1, const Point &p2, const Point &p3) override {write('C', {p1, p2, p3});} void closepath () override {_os << (_relative ? 'z' : 'Z');} void arcto (T rx, T ry, double angle, bool largeArcFlag, bool sweepFlag, const Point &p) override { Point diff = p-this->currentPoint(); if (std::abs(diff.x()) < 1e-7 && std::abs(diff.y()) < 1e-7) return; if (std::abs(rx) < 1e-7 && std::abs(ry) < 1e-7) lineto(p); else { if (std::abs(std::abs(_sx) - std::abs(_sy)) < 1e-7) { // symmetric scaling? angle *= math::sgn(_sx) * math::sgn(_sy); rx *= std::abs(_sx); ry *= std::abs(_sx); } else { // asymmetric scaling => compute new shape parameters EllipticalArc arc(this->currentPoint(), double(rx), double(ry), math::deg2rad(angle), largeArcFlag, sweepFlag, p); arc.transform(ScalingMatrix(_sx, _sy)); angle = math::rad2deg(arc.rotationAngle()); rx = arc.rx(); ry = arc.ry(); } _os << (_relative ? 'a' : 'A') << to_param_str(rx, 1.0, 0, false) << to_param_str(ry, 1.0, 0, true) << to_param_str(angle, 1.0, 0, true) << ' ' << (largeArcFlag ? 1 : 0) << ' ' << (sweepFlag ? 1 : 0); if (_relative) _os << to_param_str(p, this->currentPoint(), _sx, _sy, _dx, _dy, true); else _os << to_param_str(p, _sx, _sy, _dx, _dy, true); } } protected: void write (char cmdchar, std::initializer_list points) const { int count=0; if (_relative) { _os << char(tolower(cmdchar)); for (const Point &p : points) _os << to_param_str(p, this->currentPoint(), _sx, _sy, _dx, _dy, count++ > 0); } else { _os << cmdchar; for (const Point &p : points) _os << to_param_str(p, _sx, _sy, _dx, _dy, count++ > 0); } } void write (char cmdchar, T val, T relval, double s, double d) const { if (_relative) _os << char(tolower(cmdchar)) << to_param_str(val, relval, s, d, false); else _os << cmdchar << to_param_str(val, s, d, false); } private: std::ostream &_os; ///< write output to this stream bool _relative; ///< if true, use relative coordinates in path commands double _sx, _sy; ///< horizontal and vertical scaling factors double _dx, _dy; ///< horizontal and vertical translation values }; /////////////////////////////////////////////////////////////////////////////// /** Calls the corresponding template method of an Action object for the current path command. * If parameter 'useShortCmds' is true, the visitor operators check whether a command * can be shortened due to special cases, e.g. horizontal or vertical lines, smooth * curve connections etc. Otherwise, the full command templates are triggered. */ class IterationVisitor { public: IterationVisitor (IterationActions &actions, bool useShortCmds, double eps=1e-7) : _actions(actions), _shortCommandsActive(useShortCmds), _eps(eps) {} void setPrevCommand (const CommandVariant &prevCommand) { _prevCommand = &prevCommand; } void operator () (const MoveTo &cmd) { _actions.moveto(cmd.points[0]); _actions._startPoint = _actions._currentPoint = cmd.points[0]; } void operator () (const LineTo &cmd) { Point diff = abs(_actions._currentPoint-cmd.points[0]); if (diff.x() >= _eps || diff.y() >= _eps) { if (!_shortCommandsActive) _actions.lineto(cmd.points[0]); else { if (diff.x() < _eps) _actions.vlineto(cmd.points[0].y()); else if (diff.y() < _eps) _actions.hlineto(cmd.points[0].x()); else _actions.lineto(cmd.points[0]); } } _actions._currentPoint = cmd.points[0]; } void operator () (const CubicTo &cmd) { bool smooth=false; if (_shortCommandsActive) { if (auto *prevCubic = mpark::get_if(_prevCommand)) { Point diff = abs(cmd.points[0] - prevCubic->points[2]*T(2) + prevCubic->points[1]); if ((smooth = (diff.x() < _eps && diff.y() < _eps))) _actions.cubicto(cmd.points[1], cmd.points[2]); } } if (!smooth) _actions.cubicto(cmd.points[0], cmd.points[1], cmd.points[2]); _actions._currentPoint = cmd.points[2]; } void operator () (const QuadTo &cmd) { bool smooth=false; if (_shortCommandsActive) { if (auto *prevQuad = mpark::get_if(_prevCommand)) { Point diff = abs(cmd.points[0] - prevQuad->points[1] * T(2) + prevQuad->points[0]); if ((smooth = (diff.x() < _eps && diff.y() < _eps))) // is reflection? _actions.quadto(cmd.points[1]); } } if (!smooth) _actions.quadto(cmd.points[0], cmd.points[1]); _actions._currentPoint = cmd.points[1]; } void operator () (const ClosePath &cmd) { _actions.closepath(); _actions._currentPoint = _actions._startPoint; } void operator () (const ArcTo &cmd) { _actions.arcto(cmd.rx, cmd.ry, cmd.xrotation, cmd.largeArcFlag, cmd.sweepFlag, cmd.points[0]); _actions._currentPoint = cmd.points[0]; } private: IterationActions &_actions; bool _shortCommandsActive=false; double _eps=1e-7; const CommandVariant *_prevCommand=nullptr; }; /////////////////////////////////////////////////////////////////////////////// /** Transforms all Point parameters of a path command. */ class TransformVisior { public: explicit TransformVisior (const Matrix &m) : matrix(m) {} template void operator () (Cmd &cmd) { Point cp = cmd.point(cmd.numPoints()-1); cmd.transform(matrix, _currentPoint); _currentPoint = cp; } void operator () (MoveTo &cmd) { Point cp = cmd.point(0); cmd.transform(matrix, _currentPoint); _startPoint = _currentPoint = cp; } void operator () (ClosePath &cmd) { _currentPoint = _startPoint; } private: const Matrix &matrix; Point _startPoint, _currentPoint; ///< untransformed start end current point }; public: explicit GraphicsPath (WindingRule wr=WindingRule::NON_ZERO) : _windingRule(wr) {} void setWindingRule (WindingRule wr) {_windingRule = wr;} WindingRule windingRule () const {return _windingRule;} void clear () { _commands.clear(); } /// Returns true if the path is empty, i.e. there is nothing to draw bool empty () const { return _commands.empty(); } /// Returns the number of path commands used to describe the path. size_t size () const { return _commands.size(); } const Point& startPoint () const {return _startPoint;} const Point& finalPoint () const {return _finalPoint;} /// Insert another path at the beginning of this one. void prepend (const GraphicsPath &path) { _commands.insert(_commands.begin(), path._commands.begin(), path._commands.end()); } void moveto (const T &x, const T &y) { moveto(Point(x, y)); } void moveto (const Point &p) { // avoid sequences of several MOVETOs; always use latest if (_commands.empty() || !mpark::get_if(&_commands.back())) _commands.emplace_back(MoveTo{p}); else mpark::get(_commands.back()).points[0] = p; _startPoint = _finalPoint = p; } void lineto (const T &x, const T &y) { lineto(Point(x, y)); } void lineto (const Point &p) { _commands.emplace_back(LineTo{p}); _finalPoint = p; } void quadto (const T &x1, const T &y1, const T &x2, const T &y2) { quadto(Point(x1, y1), Point(x2, y2)); } /** Creates a quadratic Bézier segment. */ void quadto (const Point &p1, const Point &p2) { _commands.emplace_back(QuadTo{p1, p2}); _finalPoint = p2; } /** Creates a quadratic Bézier segment smoothly extending a preceding one, i.e. the gradients * of the two curves are identical at the connection point. The control point of the second * curve is computed as the reflection of the preceding curve's control point at the connection * point. */ void quadto (const Point &p2) { Point p1; if (!_commands.empty()) { if (auto qto = mpark::get_if(&_commands.back())) p1 = _finalPoint*T(2) - qto->point(0); // reflect previous control point at current point else // previous command isn't a quadto? p1 = _finalPoint; // => use current point as control point } quadto(p1, p2); } void cubicto (const T &x1, const T &y1, const T &x2, const T &y2, const T &x3, const T &y3) { cubicto(Point(x1, y1), Point(x2, y2), Point(x3, y3)); } /** Creates a cubic Bézier segment. */ void cubicto (const Point &p1, const Point &p2, const Point &p3) { _commands.emplace_back(CubicTo{p1, p2, p3}); _finalPoint = p3; } /** Creates a cubic Bézier segment smoothly extending a preceding one, i.e. the gradients * of the two curves are identical at the connection point. The first control point of * the second curve is computed as the reflection of the preceding curve's second control * point at the connection point. */ void cubicto (const Point &p2, const Point &p3) { Point p1; if (!_commands.empty()) { if (auto cto = mpark::get_if(&_commands.back())) p1 = _finalPoint*T(2) - cto->point(1); // reflect previous control point at current point else // previous command isn't a cubicto? p1 = _finalPoint; // => use current point as control point } cubicto(p1, p2, p3); } void closepath () { if (!_commands.empty() && !mpark::get_if(&_commands.back())) { _commands.emplace_back(ClosePath{}); _finalPoint = _startPoint; } } void arcto (double rx, double ry, double angle, bool laf, bool sweep, const Point &p) { _commands.emplace_back(ArcTo{rx, ry, angle, laf, sweep, p}); _finalPoint = p; } /** Detects all open subpaths and closes them by adding a closePath command. * Most font formats only support closed outline paths so there are no explicit closePath statements * in the glyph's outline description. All open paths are automatically closed by the renderer. * This method detects all open paths and adds the missing closePath statement. */ void closeOpenSubPaths () { CommandVariant *prevCmd = nullptr; for (auto it=_commands.begin(); it != _commands.end(); ++it) { if (mpark::get_if(&*it) && prevCmd && !mpark::get_if(prevCmd)) { prevCmd = &*it; it = _commands.insert(it, ClosePath{})+1; } else prevCmd = &*it; } if (!_commands.empty() && !mpark::get_if(&_commands.back())) closepath(); } /** Removes redundant path commands commands. Currently, only removes movetos. */ void removeRedundantCommands () { // remove trailing moveto commands while (!_commands.empty() && mpark::get_if(&_commands.back())) _commands.pop_back(); // resolve intermediate sequences of moveto commands auto it=_commands.begin(); if (it == _commands.end()) return; auto prev = it++; while (it != _commands.end()) { if (!mpark::get_if(&*prev) || !mpark::get_if(&*it)) prev = it++; else { prev = _commands.erase(prev); // remove leading MOVETO and advance 'prev' to 'it' ++it; } } } /** Writes the path data as SVG path drawing command to a given output stream. * @param[in] os output stream used to write the SVG commands to * @param[in] relative if true, create relative rather than absolute coordinate values * @param[in] sx horizontal scale factor * @param[in] sy vertical scale factor * @param[in] dx horizontal translation in PS point units * @param[in] dy vertical translation in PS point units */ void writeSVG (std::ostream &os, bool relative, double sx=1.0, double sy=1.0, double dx=0.0, double dy=0.0) const { WriteActions actions(os, relative, sx, sy, dx, dy); iterate(actions, true); } /** Computes the bounding box of the current path. * @param[out] bbox the computed bounding box */ void computeBBox (BoundingBox &bbox) const { struct BBoxActions : IterationActions { explicit BBoxActions (BoundingBox &bb) : bbox(bb) {} void moveto (const Point &p) override {bbox.embed(p);} void lineto (const Point &p) override {bbox.embed(p);} void quadto (const Point &p1, const Point &p2) override {bbox.embed(p1); bbox.embed(p2);} void cubicto (const Point &p1, const Point &p2, const Point &p3) override {bbox.embed(p1); bbox.embed(p2); bbox.embed(p3);} void arcto (T rx, T ry, double angle, bool laf, bool sweep, const Point &p) override { bbox.embed(EllipticalArc(this->currentPoint(), double(rx), double(ry), angle, laf, sweep, p).getBBox()); } BoundingBox &bbox; } actions(bbox); iterate(actions, false); } /** Checks whether the current path describes a dot/point only (with no extent). * @param[out] p coordinates of the point if path describes a dot * @return true if path is a dot/point */ bool isDot (Point &p) const { struct DotActions : IterationActions { DotActions () : differs(false) {} void moveto (const Point &p) override {point = p;} void lineto (const Point &p) override {differs = (p != point);} void quadto (const Point &p1, const Point &p2) override { differs = (point != p1 || point != p2);} void cubicto (const Point &p1, const Point &p2, const Point &p3) override {differs = (point != p1 || point != p2 || point != p3);} void arcto (T rx, T ry, double angle, bool largeArcFlag, bool sweepFlag, const Point &p) override { differs = (point != p);} bool quit () override {return differs;} Point point; bool differs; } actions; iterate(actions, false); p = actions.point; return !actions.differs; } /** Replaces all elliptic arcs with cubic Bézier curves. */ void approximateArcs () { struct ArcActions : ModificationActions { explicit ArcActions (GraphicsPath &path) : ModificationActions(path) {} void arcto (T rx, T ry, double angle, bool largeArcFlag, bool sweepFlag, const Point &p) override { EllipticalArc arc(this->currentPoint(), rx, ry, angle, largeArcFlag, sweepFlag, p); std::vector cmds; for (const Bezier &bezier : arc.approximate()) cmds.emplace_back(CubicTo{bezier.point(1), bezier.point(2), bezier.point(3)}); this->path().replace(this->commandPos(), cmds); } } actions(*this); iterate(actions); } /** Transforms the path according to a given Matrix. * @param[in] matrix Matrix describing the affine transformation */ void transform (const Matrix &matrix) { TransformVisior visior(matrix); for (CommandVariant &command : _commands) mpark::visit(visior, command); } /** Returns true if this path equals another one, i.e. it consists the same sequence * of commands and coordinates. */ bool operator == (const GraphicsPath &path) const { if (size() != path.size()) return false; auto it = _commands.begin(); for (const auto &cmd : path._commands) { if (*it++ != cmd) return false; } return true; } /** Returns true if this path differs from another one (command-wise). */ bool operator != (const GraphicsPath &path) const { if (size() != path.size()) return true; auto it = _commands.begin(); for (const auto &cmd : path._commands) { if (*it++ != cmd) return true; } return false; } /** Iterates over all commands defining this path and calls the corresponding template methods. * In the case of successive bezier curve sequences, control points or tangent slopes are often * identical so that the path description contains redundant information. SVG provides shorthand * curve commands that require less parameters. If 'optimize' is true, this method detects such * command sequences. * @param[in] actions template methods called by each iteration step * @param[in] optimize if true, shorthand drawing commands (hlineto, vlineto,...) are considered */ void iterate (IterationActions &actions, bool optimize) const { double eps = XMLString::DECIMAL_PLACES > 0 ? pow(10, -XMLString::DECIMAL_PLACES) : 1e-7; IterationVisitor visitor(actions, optimize, eps); for (const CommandVariant &cmd : _commands) { if (actions.quit()) break; mpark::visit(visitor, cmd); visitor.setPrevCommand(cmd); } actions.finished(); } protected: /** Replaces a command by a sequence of other ones. * @param[in] pos position of command to replace (0-based) * @param[in] cmds commands to insert */ void replace (int pos, const std::vector &cmds) { auto it = _commands.end(); if (!_commands.empty()) { it = _commands.begin()+pos; it = _commands.erase(it); } _commands.insert(it, cmds.begin(), cmds.end()); } /** Iterates over all commands of the path and calls the corresponding template methods. * In contrast to the public iterate() method, this one allows to modify the command sequence. * @param[in] actions template methods called by each iteration step */ void iterate (ModificationActions &actions) { IterationVisitor visitor(actions, false); // no iterators here since they may be invalidated during path modifications for (size_t i=0; i < _commands.size(); i++) { if (actions.quit()) break; actions._commandPos = i; mpark::visit(visitor, _commands[i]); visitor.setPrevCommand(_commands[i]); } actions.finished(); } private: std::deque _commands; ///< sequence of path commands WindingRule _windingRule; Point _startPoint; ///< start point of final sub-path Point _finalPoint; ///< final point reached by last command in path }; dvisvgm-2.8.1/src/FontMap.hpp0000664000175000017500000000553513510660062012777 00000000000000/************************************************************************* ** FontMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTMAP_HPP #define FONTMAP_HPP #include #include #include #include #include "FontStyle.hpp" struct FontEncoding; class MapLine; class Subfont; class FontMap { public: struct Entry { explicit Entry (const MapLine &mapline, Subfont *subfont=nullptr); Entry (const Entry &entry) =delete; Entry (Entry &&entry) =default; Entry& operator = (Entry &&entry) =default; std::string fontname; ///< target font name std::string encname; ///< name of font encoding Subfont *subfont; int fontindex; ///< index of font in multi-font file bool locked; FontStyle style; }; public: enum class Mode {APPEND, REMOVE, REPLACE}; static FontMap& instance (); bool read (const std::string &fname, Mode mode); bool read (const std::string &fname, char modechar); bool read (const std::string &fname_seq); void readdir (const std::string &dirname); bool apply (const MapLine &mapline, Mode mode); bool apply (const MapLine &mapline, char modechar); bool append (const MapLine &mapline); bool replace (const MapLine &mapline); bool remove (const MapLine &mapline); void lockFont (const std::string &fontname); void clear (bool unlocked_only=false); std::ostream& write (std::ostream &os) const; const Entry* lookup (const std::string &fontname) const; protected: FontMap () =default; private: std::unordered_map> _entries; }; #endif dvisvgm-2.8.1/src/FilePath.hpp0000664000175000017500000000654213560004141013121 00000000000000/************************************************************************* ** FilePath.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FILEPATH_HPP #define FILEPATH_HPP #include #include #include class FilePath { class Directory { public: explicit Directory (std::string dir) : _dirstr(std::move(dir)) {} explicit Directory (std::string &&dir) : _dirstr(std::move(dir)) {} bool operator == (const Directory &dir) const; bool operator != (const Directory &dir) const {return !(*this == dir);} explicit operator std::string () const {return _dirstr;} private: std::string _dirstr; }; public: FilePath () =default; explicit FilePath (const std::string &path) {set(path);} FilePath (const std::string &path, bool isfile) : FilePath(path, isfile, "") {} FilePath (const std::string &path, bool isfile, const std::string ¤t_dir); void set (const std::string &path); void set (const std::string &path, bool isfile); void set (const std::string &path, bool isfile, const std::string ¤t_dir); std::string absolute (bool with_filename=true) const; std::string relative (std::string reldir="", bool with_filename=true) const; std::string relative (const FilePath &filepath, bool with_filename=true) const; std::string shorterAbsoluteOrRelative (std::string reldir="", bool with_filename=true) const; std::string basename () const; std::string suffix () const; void suffix (const std::string &s); size_t depth () const {return _dirs.size();} bool isFile () const {return !_fname.empty();} bool empty () const {return _dirs.empty() && _fname.empty();} const std::string& filename () const {return _fname;} void filename (const std::string &fname) {_fname = fname;} bool exists () const; static bool isAbsolute (std::string path); protected: void init (std::string path, bool isfile, std::string current_dir); void add (const std::string &elem); private: std::vector _dirs; std::string _fname; #ifdef _WIN32 char _drive=0; #endif }; #endif dvisvgm-2.8.1/src/BoundingBox.cpp0000664000175000017500000001727113510660062013644 00000000000000/************************************************************************* ** BoundingBox.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "BoundingBox.hpp" #include "Matrix.hpp" #include "utility.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; BoundingBox::BoundingBox () : _ulx(0), _uly(0), _lrx(0), _lry(0), _valid(false), _locked(false) { } BoundingBox::BoundingBox (double ulxx, double ulyy, double lrxx, double lryy) : _ulx(min(ulxx,lrxx)), _uly(min(ulyy,lryy)), _lrx(max(ulxx,lrxx)), _lry(max(ulyy,lryy)), _valid(true), _locked(false) { } BoundingBox::BoundingBox (const DPair &p1, const DPair &p2) : _ulx(min(p1.x(), p2.x())), _uly(min(p1.y(), p2.y())), _lrx(max(p1.x(), p2.x())), _lry(max(p1.y(), p2.y())), _valid(true), _locked(false) { } BoundingBox::BoundingBox (const Length &ulxx, const Length &ulyy, const Length &lrxx, const Length &lryy) : _ulx(min(ulxx.bp(),lrxx.bp())), _uly(min(ulyy.bp(),lryy.bp())), _lrx(max(ulxx.bp(),lrxx.bp())), _lry(max(ulyy.bp(),lryy.bp())), _valid(true), _locked(false) { } BoundingBox::BoundingBox (const string &boxstr) : _ulx(0), _uly(0), _lrx(0), _lry(0), _valid(false), _locked(false) { set(boxstr); } /** Extracts a sequence of length values from a string like "5cm, 2.4in, 0pt". * @param[in] boxstr whitespace and/or comma separated string of lengths. * @param[out] the extracted lengths */ vector BoundingBox::extractLengths (string boxstr) { vector lengths; boxstr = util::replace(boxstr, ",", " "); boxstr = util::normalize_space(boxstr); vector lengthStrings = util::split(boxstr, " "); for (const string &lenstr : lengthStrings) { if (!lenstr.empty()) lengths.emplace_back(Length(lenstr)); } return lengths; } /** Sets or modifies the bounding box. If 'boxstr' consists of 4 length values, * they denote the absolute position of two diagonal corners of the box. In case * of a single length value l the current box is enlarged by adding (-l,-l) the upper * left and (l,l) to the lower right corner. * @param[in] boxstr whitespace and/or comma separated string of lengths. */ void BoundingBox::set (const string &boxstr) { vector coord = extractLengths(boxstr); set(coord); } void BoundingBox::set (const std::vector &coord) { switch (coord.size()) { case 1: _ulx -= coord[0].bp(); _uly -= coord[0].bp(); _lrx += coord[0].bp(); _lry += coord[0].bp(); break; case 2: _ulx -= coord[0].bp(); _uly -= coord[1].bp(); _lrx += coord[0].bp(); _lry += coord[1].bp(); break; case 4: _ulx = min(coord[0].bp(), coord[2].bp()); _uly = min(coord[1].bp(), coord[3].bp()); _lrx = max(coord[0].bp(), coord[2].bp()); _lry = max(coord[1].bp(), coord[3].bp()); break; default: throw BoundingBoxException("1, 2 or 4 length parameters expected"); } _valid = true; } /** Enlarges the box so that point (x,y) is enclosed. */ void BoundingBox::embed (double x, double y) { if (!_locked) { if (_valid) { if (x < _ulx) _ulx = x; else if (x > _lrx) _lrx = x; if (y < _uly) _uly = y; else if (y > _lry) _lry = y; } else { _ulx = _lrx = x; _uly = _lry = y; _valid = true; } } } /** Enlarges the box so that the given bounding box is enclosed. */ void BoundingBox::embed (const BoundingBox &bbox) { if (!_locked && bbox._valid) { if (_valid) { embed(bbox._ulx, bbox._uly); embed(bbox._lrx, bbox._lry); } else { _ulx = bbox._ulx; _uly = bbox._uly; _lrx = bbox._lrx; _lry = bbox._lry; _valid = true; } } } /** Embeds a virtual circle into the box and enlarges it accordingly. * @param[in] c center of the circle * @param[in] r radius of the circle */ void BoundingBox::embed (const DPair &c, double r) { embed(BoundingBox(c.x()-r, c.y()-r, c.x()+r, c.y()+r)); } /** Expands the box in all four directions by a given value. */ void BoundingBox::expand (double m) { if (!_locked) { _ulx -= m; _uly -= m; _lrx += m; _lry += m; } } /** Intersects the current box with bbox and applies the result to *this. * If both boxes are disjoint, *this is not altered. * @param[in] bbox box to intersect with * @return false if *this is locked or both boxes are disjoint */ bool BoundingBox::intersect (const BoundingBox &bbox) { // check if the two boxes are disjoint if (_locked || _lrx < bbox._ulx || _lry < bbox._uly || _ulx > bbox._lrx || _uly > bbox._lry) return false; // not disjoint: compute the intersection _ulx = max(_ulx, bbox._ulx); _uly = max(_uly, bbox._uly); _lrx = min(_lrx, bbox._lrx); _lry = min(_lry, bbox._lry); return true; } void BoundingBox::operator += (const BoundingBox &bbox) { if (!_locked) { _ulx += bbox._ulx; _uly += bbox._uly; _lrx += bbox._lrx; _lry += bbox._lry; } } static inline bool almost_equal (double v1, double v2) { return fabs(v1-v2) < 1e-10; } bool BoundingBox::operator == (const BoundingBox &bbox) const { return _valid && bbox._valid && almost_equal(_ulx, bbox._ulx) && almost_equal(_uly, bbox._uly) && almost_equal(_lrx, bbox._lrx) && almost_equal(_lry, bbox._lry); } void BoundingBox::scale (double sx, double sy) { if (!_locked) { _ulx *= sx; _lrx *= sx; if (sx < 0) swap(_ulx, _lrx); _uly *= sy; _lry *= sy; if (sy < 0) swap(_uly, _lry); } } void BoundingBox::transform (const Matrix &tm) { if (!_locked) { DPair ul = tm * DPair(_ulx, _uly); DPair lr = tm * DPair(_lrx, _lry); DPair ll = tm * DPair(_ulx, _lry); DPair ur = tm * DPair(_lrx, _uly); _ulx = min(min(ul.x(), lr.x()), min(ur.x(), ll.x())); _uly = min(min(ul.y(), lr.y()), min(ur.y(), ll.y())); _lrx = max(max(ul.x(), lr.x()), max(ur.x(), ll.x())); _lry = max(max(ul.y(), lr.y()), max(ur.y(), ll.y())); } } string BoundingBox::toSVGViewBox () const { ostringstream oss; oss << XMLString(_ulx) << ' ' << XMLString(_uly) << ' ' << XMLString(width()) << ' ' << XMLString(height()); return oss.str(); } ostream& BoundingBox::write (ostream &os) const { os << '(' << _ulx << ", " << _uly << ", " << _lrx << ", " << _lry << ')'; if (!_valid) os << " (invalid)"; else if (_locked) os << " (locked)"; return os; } unique_ptr BoundingBox::createSVGRect () const { auto rect = util::make_unique("rect"); rect->addAttribute("x", minX()); rect->addAttribute("y", minY()); rect->addAttribute("width", width()); rect->addAttribute("height", height()); rect->addAttribute("fill", "none"); return rect; } dvisvgm-2.8.1/src/EllipticalArc.cpp0000664000175000017500000002532013553267757014155 00000000000000/************************************************************************* ** EllipticalArc.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "EllipticalArc.hpp" #include "utility.hpp" using namespace std; /** Constructs an elliptical arc from end point parameterization. * @param[in] start start point of arc * @param[in] rx length of semi-major axis * @param[in] ry length of semi-minor axis * @param[in] angle rotation of ellipse around its center (in radians) * @param[in] laf if true, choose the larger arc between start and end point * @param[in] sweep if true, arc is drawn in the direction of increasing angles * @param[in] end end point of the arc */ EllipticalArc::EllipticalArc (const DPair &start, double rx, double ry, double angle, bool laf, bool sweep, const DPair &end) : _rx(abs(rx)), _ry(abs(ry)), _rotationAngle(math::normalize_angle(angle, math::PI)), _largeArc(laf), _sweepPositive(sweep), _startPoint(start), _endPoint(end) { if (!isStraightLine()) { // fix out-of-range radii according to section F.6.6.3 in // https://www.w3.org/TR/SVG/implnote.html#ArcCorrectionOutOfRangeRadii double c = cos(_rotationAngle); double s = sin(_rotationAngle); DPair p = (_startPoint-_endPoint)/2.0; p = DPair(c*p.x()+s*p.y(), c*p.y()-s*p.x()); double lambda = (p.x()*p.x())/(_rx*_rx) + (p.y()*p.y())/(_ry*_ry); if (lambda > 1) { lambda = sqrt(lambda); _rx *= lambda; _ry *= lambda; } } } /** Constructs an elliptical arc from center parameterization * @param[in] center absolute coordinates of the center of the ellipse * @param[in] rx length of semi-major axis * @param[in] ry length of semi-minor axis * @param[in] rot rotation of ellipse around its center (in radians) * @param[in] startAngle angle between major axis and vector from center to start point * @param[in] deltaAngle angle between the vectors from center to start and end point, respectively */ EllipticalArc::EllipticalArc (const DPair ¢er, double rx, double ry, double rot, double startAngle, double deltaAngle) : _rx(rx), _ry(ry), _rotationAngle(math::normalize_angle(rot, math::TWO_PI)), _largeArc(abs(deltaAngle) > math::PI), _sweepPositive(deltaAngle > 0) { // https://www.w3.org/TR/SVG/implnote.html#ArcConversionCenterToEndpoint double c = cos(_rotationAngle); double s = sin(_rotationAngle); double c1 = cos(startAngle); double s1 = sin(startAngle); double c2 = cos(startAngle+deltaAngle); double s2 = sin(startAngle+deltaAngle); _startPoint = DPair(c*rx*c1*c - s*ry*s1, s*rx*c1 + c*ry*s1) + center; _endPoint = DPair(c*rx*c2*c - s*ry*s2, s*rx*c2 + c*ry*s2) + center; } /** Returns the angle between (1, 0) and a given vector. * The angle is normalized to the range [0, 2pi). */ static inline double angle (const DPair &p) { return math::normalize_0_2pi(atan2(p.y(), p.x())); } /** Computes the center parameterization of the arc. */ EllipticalArc::CenterParams EllipticalArc::getCenterParams () const { EllipticalArc::CenterParams params; if (isStraightLine()) { params.center = (_endPoint-_startPoint)/2.0; params.startAngle = params.deltaAngle = 0; } else { // https://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter double c = cos(_rotationAngle); double s = sin(_rotationAngle); DPair p = (_startPoint-_endPoint)/2.0; p = DPair(c*p.x()+s*p.y(), c*p.y()-s*p.x()); double rx2 = _rx*_rx, ry2 = _ry*_ry; double px2 = p.x()*p.x(), py2 = p.y()*p.y(); double radicand = rx2*ry2 - rx2*py2 - ry2*px2; if (radicand < 0) // should not happen if out-of-range radii were fixed correctly radicand = 0; else radicand /= rx2*py2 + ry2*px2; double root = sqrt(radicand) * (_largeArc == _sweepPositive ? -1 : 1); DPair cp(root*p.y()*_rx/_ry, -root*p.x()*_ry/_rx); DPair mid = (_startPoint+_endPoint)/2.0; params.center = DPair(c*cp.x() - s*cp.y() + mid.x(), s*cp.x() + c*cp.y() + mid.y()); DPair q1((p.x() - cp.x())/_rx, (p.y() - cp.y())/_ry); DPair q2(-(p.x() + cp.x())/_rx, -(p.y() + cp.y())/_ry); params.startAngle = angle(q1); params.deltaAngle = angle(q2) - params.startAngle; if (_sweepPositive && params.deltaAngle < 0) params.deltaAngle += math::TWO_PI; else if (!_sweepPositive && params.deltaAngle > 0) params.deltaAngle -= math::TWO_PI; } return params; } /** Applies the affine transformation described by a given matrix to the arc. */ void EllipticalArc::transform (const Matrix &matrix) { double c = cos(_rotationAngle); double s = sin(_rotationAngle); Matrix ellipse({_rx*c, -_ry*s, 0, _rx*s, _ry*c}); // E := rotate(xrot)*scale(rx, ry) ellipse.lmultiply(matrix); // E':= M*E // Compute the singular value decomposition of the transformed ellipse shape: // E' = rotate(phi)*scale(sx, sy)*rotate(theta) // The initial, right-hand rotation can be ignored because it rotates the unit circle // around the origin, i.e. rotate(theta) maps the circle to itself. // The signs of sx and sy don't matter either. They just flip the yet unrotated // ellipse on the x- and/or y-axis. Thus, |sx| and |sy| are the new radii, // and phi the new rotation angle. auto vec = math::svd({{ellipse.get(0,0), ellipse.get(0,1)}, {ellipse.get(1,0), ellipse.get(1,1)}}); if (std::abs(vec[1]-vec[2]) < 1e-7) { // circle? _rx = _ry = vec[1]; // always >= 0 _rotationAngle = 0; } else { _rx = vec[1]; // always >= 0 _ry = abs(vec[2]); // ensure >= 0 _rotationAngle = math::normalize_angle(vec[0], math::HALF_PI); } // change drawing direction (clockwise vs. counter-clockwise) if 'matrix' // flipped the ellipse horizontally or vertically but not both if ((matrix.get(0, 0) < 0) != (matrix.get(1, 1) < 0)) _sweepPositive = !_sweepPositive; _startPoint = matrix * _startPoint; _endPoint = matrix * _endPoint; } /** Approximates an arc of the unit circle by a single cubic Bézier curve. * @param[in] phi start angle of the arc in radians * @param[in] delta length of the arc */ static Bezier approx_unit_arc (double phi, double delta) { double c = 0.551915024494; // see http://spencermortensen.com/articles/bezier-circle if (abs(delta + math::HALF_PI) < 1e-7) c = -c; else c = 4.0/3*tan(delta/4); DPair p1(cos(phi), sin(phi)); DPair p4(cos(phi+delta), sin(phi+delta)); DPair p2(p1.x()-c*p1.y(), p1.y()+c*p1.x()); DPair p3(p4.x()+c*p4.y(), p4.y()-c*p4.x()); return Bezier(p1, p2, p3, p4); } /** Approximates the arc by a sequence of cubic Bézier curves. */ vector EllipticalArc::approximate () const { vector beziers; if (_startPoint != _endPoint) { if (isStraightLine()) { DPair dir = (_endPoint - _startPoint); dir /= dir.length()/3.0; beziers.emplace_back(Bezier(_startPoint, _startPoint+dir, _endPoint-dir, _endPoint)); } else { CenterParams cparams = getCenterParams(); int numCurves = ceil(cparams.deltaAngle/math::HALF_PI); double remainder = abs(fmod(cparams.deltaAngle, math::HALF_PI)); if (remainder < 1e-7) numCurves--; else if (math::HALF_PI-remainder < 1e-7) numCurves++; if (numCurves > 0) { double c = cos(_rotationAngle); double s = sin(_rotationAngle); Matrix ellipse = {_rx*c, -_ry*s, cparams.center.x(), _rx*s, _ry*c, cparams.center.y()}; double angle = cparams.startAngle; double diff = cparams.deltaAngle/numCurves; while (numCurves-- > 0) { beziers.emplace_back(approx_unit_arc(angle, diff).transform(ellipse)); angle += diff; } } } } return beziers; } static inline bool is_angle_between (double t, double angle1, double angle2) { if (angle1 < angle2) return angle1 < t && t < angle2; return angle2 > t || t > angle1; } /** Returns the tight bounding box of the arc. */ BoundingBox EllipticalArc::getBBox () const { BoundingBox bbox; bbox.embed(_startPoint); bbox.embed(_endPoint); if (!isStraightLine()) { // compute extremes of ellipse centered at the origin double c = cos(_rotationAngle); double s = sin(_rotationAngle); double tx1 = math::normalize_0_2pi(-atan2(_ry*s, _rx*c)); // position of vertical tangent, d/dt E(tx1)=(0, y) double tx2 = math::normalize_0_2pi(math::PI+tx1); // position of second vertical tangent double ct = cos(tx1); double st = sin(tx1); DPair pv1(_rx*c*ct - _ry*s*st, _rx*s*ct + _ry*c*st); // E(tx1), 1st point on ellipse with vertical tangent DPair pv2 = -pv1; // E(tx2), 2nd point on ellipse with vertical tangent double ty1 = math::normalize_0_2pi(atan2(_ry*c, _rx*s)); // position of horizontal tangent, d/dt E(ty1)=(x, 0) double ty2 = math::normalize_0_2pi(math::PI+ty1); // position of second horizontal tangent ct = cos(ty1); st = sin(ty1); DPair ph1(_rx*c*ct - _ry*s*st, _rx*s*ct + _ry*c*st); // E(ty1), 1st point on ellipse with horizontal tangent DPair ph2 = -ph1; // E(ty2), 2nd point on ellipse with horizontal tangent // translate extreme points to actual coordinates CenterParams cparams = getCenterParams(); pv1 += cparams.center; pv2 += cparams.center; ph1 += cparams.center; ph2 += cparams.center; double angle1 = cparams.startAngle; double angle2 = math::normalize_0_2pi(angle1+cparams.deltaAngle); if (!_sweepPositive) swap(angle1, angle2); // only consider extreme points located on the arc if (is_angle_between(tx1, angle1, angle2)) bbox.embed(pv1); if (is_angle_between(tx2, angle1, angle2)) bbox.embed(pv2); if (is_angle_between(ty1, angle1, angle2)) bbox.embed(ph1); if (is_angle_between(ty2, angle1, angle2)) bbox.embed(ph2); } return bbox; } dvisvgm-2.8.1/src/TensorProductPatch.cpp0000664000175000017500000005063413536435625015236 00000000000000/************************************************************************* ** TensorProductPatch.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "TensorProductPatch.hpp" using namespace std; TensorProductPatch::TensorProductPatch (const PointVec &points, const ColorVec &colors, Color::ColorSpace cspace, int edgeflag, TensorProductPatch *patch) : ShadingPatch(cspace) { setPoints(points, edgeflag, patch); setColors(colors, edgeflag, patch); } void TensorProductPatch::setFirstMatrixColumn (const DPair source[4], bool reverse) { for (int i=0; i < 4; i++) _points[i][0] = source[reverse ? 3-i : i]; } void TensorProductPatch::setFirstMatrixColumn (DPair source[4][4], int col, bool reverse) { for (int i=0; i < 4; i++) _points[i][0] = source[reverse ? 3-i : i][col]; } /*void TensorProductPatch::setPoints (const DPair points[4][4]) { for (int i=0; i < 4; i++) for (int j=0; j < 4; j++) _points[i][j] = points[i][j]; }*/ /** Sets the control points defining the structure of the patch. If the edge flag is 0, * the point vector must contain all 16 control points of the 4x4 matrix in "spiral" order: * 0 11 10 9 * 1 12 15 8 * 2 13 14 7 * 3 4 5 6 * If the edge flag is 1,2, or 3, the points of the first matrix collumn * are omitted, and taken from a reference patch instead. * @param[in] points the control points in "spiral" order as described in the PS reference, p. 286 * @param[in] edgeflag defines how to connect this patch with another one * @param[in] patch reference patch required if edgeflag > 0 */ void TensorProductPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) { auto tpPatch = dynamic_cast(patch); if (edgeflag > 0 && !tpPatch) throw ShadingException("missing preceding data in definition of tensor-product patch"); if ((edgeflag == 0 && points.size() != 16) || (edgeflag > 0 && points.size() != 12)) throw ShadingException("invalid number of control points in tensor-product patch definition"); // assign the 12 control points that are invariant for all edge flag values int i = (edgeflag == 0 ? 4 : 0); _points[3][1] = points[i++]; _points[3][2] = points[i++]; _points[3][3] = points[i++]; _points[2][3] = points[i++]; _points[1][3] = points[i++]; _points[0][3] = points[i++]; _points[0][2] = points[i++]; _points[0][1] = points[i++]; _points[1][1] = points[i++]; _points[2][1] = points[i++]; _points[2][2] = points[i++]; _points[1][2] = points[i]; // populate the first column of the control point matrix switch (edgeflag) { case 0: setFirstMatrixColumn(&points[0], false); break; case 1: setFirstMatrixColumn(tpPatch->_points[3], false); break; case 2: setFirstMatrixColumn(tpPatch->_points, 3, true); break; case 3: setFirstMatrixColumn(tpPatch->_points[0], true); break; } } /** Sets the vertex colors of the patch. If the edge flag is 0, * the color vector must contain all 4 colors in the following order: * c00, c30, c33, c03, where cXY belongs to the vertex pXY of the control * point matrix. * c00 ---- c03 * | | * | | * c30 ---- c33 * If the edge flag is 1,2, or 3, the colors c00 and c30 are omitted, * and taken from a reference patch instead. * @param[in] points the color values in the order c00, c30, c33, c03 * @param[in] edgeflag defines how to connect this patch with another one * @param[in] patch reference patch required if edgeflag > 0 */ void TensorProductPatch::setColors(const ColorVec &colors, int edgeflag, ShadingPatch* patch) { auto tpPatch = dynamic_cast(patch); if (edgeflag > 0 && !tpPatch) throw ShadingException("missing preceding data in definition of tensor-product patch"); if ((edgeflag == 0 && colors.size() != 4) || (edgeflag > 0 && colors.size() != 2)) throw ShadingException("invalid number of colors in tensor-product patch definition"); int i = (edgeflag == 0 ? 2 : 0); _colors[3] = colors[i]; _colors[1] = colors[i+1]; switch (edgeflag) { case 0: _colors[0] = colors[0]; _colors[2] = colors[1]; break; case 1: _colors[0] = tpPatch->_colors[2]; _colors[2] = tpPatch->_colors[3]; break; case 2: _colors[0] = tpPatch->_colors[3]; _colors[2] = tpPatch->_colors[1]; break; case 3: _colors[0] = tpPatch->_colors[1]; _colors[2] = tpPatch->_colors[0]; break; } } /** Returns the point P(u,v) of the patch. */ DPair TensorProductPatch::valueAt (double u, double v) const { // check if we can return one of the vertices if (u == 0) { if (v == 0) return _points[0][0]; else if (v == 1) return _points[3][0]; } else if (u == 1) { if (v == 0) return _points[0][3]; else if (v == 1) return _points[3][3]; } // compute tensor product DPair p[4]; for (int i=0; i < 4; i++) { Bezier bezier(_points[i][0], _points[i][1], _points[i][2], _points[i][3]); p[i] = bezier.valueAt(u); } Bezier bezier(p[0], p[1], p[2], p[3]); return bezier.valueAt(v); } /** Returns the color at point P(u,v) which is bilinearly interpolated from * the colors assigned to vertices of the patch. */ Color TensorProductPatch::colorAt (double u, double v) const { // check if we can return one of the vertex colors if (u == 0) { if (v == 0) return _colors[0]; else if (v == 1) return _colors[2]; } else if (u == 1) { if (v == 0) return _colors[1]; else if (v == 1) return _colors[3]; } // interpolate color ColorGetter getComponents; ColorSetter setComponents; colorQueryFuncs(getComponents, setComponents); valarray comp[4]; for (int i=0; i < 4; i++) (_colors[i].*getComponents)(comp[i]); Color color; (color.*setComponents)((1-u)*(1-v)*comp[0] + u*(1-v)*comp[1] + (1-u)*v*comp[2] + u*v*comp[3]); return color; } Color TensorProductPatch::averageColor () const { return averageColor(_colors[0], _colors[1], _colors[2], _colors[3]); } /** Compute the average of four given colors depending on the assigned color space. */ Color TensorProductPatch::averageColor (const Color &c1, const Color &c2, const Color &c3, const Color &c4) const { ColorGetter getComponents; ColorSetter setComponents; colorQueryFuncs(getComponents, setComponents); valarray va1, va2, va3, va4; (c1.*getComponents)(va1); (c2.*getComponents)(va2); (c3.*getComponents)(va3); (c4.*getComponents)(va4); Color averageColor; (averageColor.*setComponents)((va1+va2+va3+va4)/4.0); return averageColor; } GraphicsPath TensorProductPatch::getBoundaryPath () const { // Simple approach: Use the outer curves as boundary path. This doesn't always lead // to correct results since, depending on the control points, P(u,v) might exceed // the simple boundary. GraphicsPath path; path.moveto(_points[0][0]); path.cubicto(_points[0][1], _points[0][2], _points[0][3]); path.cubicto(_points[1][3], _points[2][3], _points[3][3]); path.cubicto(_points[3][2], _points[3][1], _points[3][0]); path.cubicto(_points[2][0], _points[1][0], _points[0][0]); path.closepath(); return path; } /** Computes the bicubically interpolated isoparametric Bézier curve P(u,t) that * runs "vertically" from P(u,0) to P(u,1) through the patch P. * @param[in] u "horizontal" parameter in the range from 0 to 1 * @param[out] bezier the resulting Bézier curve */ void TensorProductPatch::verticalCurve (double u, Bezier &bezier) const { // check for simple cases (boundary curves) first if (u == 0) bezier.setPoints(_points[0][0], _points[1][0], _points[2][0], _points[3][0]); else if (u == 1) bezier.setPoints(_points[0][3], _points[1][3], _points[2][3], _points[3][3]); else { // compute "inner" curve DPair p[4]; for (int i=0; i < 4; i++) { Bezier bezier(_points[i][0], _points[i][1], _points[i][2], _points[i][3]); p[i] = bezier.valueAt(u); } bezier.setPoints(p[0], p[1], p[2], p[3]); } } /** Computes the bicubically interpolated isoparametric Bézier curve P(t,v) that * runs "horizontally" from P(0,v) to P(1,v) through the patch P. * @param[in] v "vertical" parameter in the range from 0 to 1 * @param[out] bezier the resulting Bézier curve */ void TensorProductPatch::horizontalCurve (double v, Bezier &bezier) const { // check for simple cases (boundary curves) first if (v == 0) bezier.setPoints(_points[0][0], _points[0][1], _points[0][2], _points[0][3]); else if (v == 1) bezier.setPoints(_points[3][0], _points[3][1], _points[3][2], _points[3][3]); else { // compute "inner" curve DPair p[4]; for (int i=0; i < 4; i++) { Bezier bezier(_points[0][i], _points[1][i], _points[2][i], _points[3][i]); p[i] = bezier.valueAt(v); } bezier.setPoints(p[0], p[1], p[2], p[3]); } } /** Computes the sub-patch that maps the unit square [0,1]x[0,1] to * the area P([u1,u2],[v1,v2]) of patch P. The control points of the sub-patch * can easily be calculated using the tensor product blossom of patch P. * See G. Farin: Curves and Surfaces for CAGD, p. 259 for example. */ void TensorProductPatch::subpatch (double u1, double u2, double v1, double v2, TensorProductPatch &patch) const { if (u1 > u2) swap(u1, u2); if (v1 > v2) swap(v1, v2); // compute control points double u[] = {u1, u1, u1, 0}; // blossom parameters of the "horizontal" domain (plus dummy value 0) for (int i=0; i < 4; i++) { u[3-i] = u2; double v[] = {v1, v1, v1, 0}; // blossom parameters of the "vertical" domain (plus dummy value 0) for (int j=0; j < 4; j++) { v[3-j] = v2; patch._points[i][j] = blossomValue(u, v); } } // assign color values patch._colors[0] = colorAt(u1, v1); patch._colors[1] = colorAt(u2, v1); patch._colors[2] = colorAt(u1, v2); patch._colors[3] = colorAt(u2, v2); } /** Computes the value b(u1,u2,u3;v1,v2,v3) where b is tensor product blossom of the patch. */ DPair TensorProductPatch::blossomValue (double u1, double u2, double u3, double v1, double v2, double v3) const { DPair p[4]; for (int i=0; i < 4; i++) { Bezier bezier(_points[i][0], _points[i][1], _points[i][2], _points[i][3]); p[i] = bezier.blossomValue(u1, u2, u3); } Bezier bezier(p[0], p[1], p[2], p[3]); return bezier.blossomValue(v1, v2, v3); } /** Snaps value x to the interval [0,1]. Values lesser than or near 0 are mapped to 0, values * greater than or near 1 are mapped to 1. */ static inline double snap (double x) { if (fabs(x) < 0.001) return 0; if (fabs(1-x) < 0.001) return 1; return x; } /** Computes a single row of segments approximating the patch region between v1 and v1+inc. */ void TensorProductPatch::approximateRow (double v1, double inc, bool overlap, double delta, const vector &vbeziers, Callback &callback) const { double v2 = snap(v1+inc); double ov2 = (overlap && v2 < 1) ? snap(v2+inc) : v2; Bezier hbezier1, hbezier2; horizontalCurve(v1, hbezier1); horizontalCurve(ov2, hbezier2); double u1 = 0; for (size_t i=1; i < vbeziers.size(); i++) { double u2 = snap(u1+inc); double ou2 = (overlap && u2 < 1) ? snap(u2+inc) : u2; // compute segment boundaries Bezier b1(hbezier1, u1, ou2); Bezier b2(vbeziers[i + (overlap && i < vbeziers.size()-1 ? 1 : 0)], v1, ov2); Bezier b3(hbezier2, u1, ou2); Bezier b4(vbeziers[i-1], v1, ov2); GraphicsPath path; path.moveto(b1.point(0)); if (inc > delta) { path.cubicto(b1.point(1), b1.point(2), b1.point(3)); path.cubicto(b2.point(1), b2.point(2), b2.point(3)); path.cubicto(b3.point(2), b3.point(1), b3.point(0)); path.cubicto(b4.point(2), b4.point(1), b4.point(0)); } else { path.lineto(b1.point(3)); path.lineto(b2.point(3)); path.lineto(b3.point(0)); } path.closepath(); callback.patchSegment(path, averageColor(colorAt(u1, v1), colorAt(u2, v1), colorAt(u1, v2), colorAt(u2, v2))); u1 = u2; } } /** Approximate the patch by dividing it into a grid of segments that are filled with the * average color of the corresponding region. The boundary of each segment consists of * four Bézier curves, too. In order to prevent visual gaps between neighbored segments due * to anti-aliasing, the flag 'overlap' can be set. It enlarges the segments so that they overlap * with their right and bottom neighbors (which are drawn on top of the overlapping regions). * @param[in] gridsize number of segments per row/column * @param[in] overlap if true, enlarge each segment to overlap with its right and bottom neighbors * @param[in] delta reduce level of detail if the segment size is smaller than the given value * @param[in] callback object notified */ void TensorProductPatch::approximate (int gridsize, bool overlap, double delta, Callback &callback) const { if (_colors[0] == _colors[1] && _colors[1] == _colors[2] && _colors[2] == _colors[3]) { // simple case: monochromatic patch GraphicsPath path = getBoundaryPath(); callback.patchSegment(path, _colors[0]); } else { const double inc = 1.0/gridsize; // collect curves dividing the patch into several columns (curved vertical stripes) vector vbeziers(gridsize+1); double u=0; for (int i=0; i <= gridsize; i++) { verticalCurve(u, vbeziers[i]); u = snap(u+inc); } // compute the segments row by row double v=0; for (int i=0; i < gridsize; i++) { approximateRow(v, inc, overlap, delta, vbeziers, callback); v = snap(v+inc); } } } BoundingBox TensorProductPatch::getBBox () const { BoundingBox bbox; Bezier bezier; for (int i=0; i <= 1; i++) { horizontalCurve(i, bezier); bbox.embed(bezier.getBBox()); verticalCurve(i, bezier); bbox.embed(bezier.getBBox()); } return bbox; } #if 0 void TensorProductPatch::approximate (int gridsize, Callback &callback) const { const double inc = 1.0/gridsize; Bezier ubezier0; verticalCurve(0, ubezier0); Bezier ubezier1; verticalCurve(1, ubezier1); Bezier vbezier0; horizontalCurve(0, vbezier0); Bezier vbezier1; horizontalCurve(1, vbezier1); for (double v1=0; v1 < 1; v1=snap(v1+inc)) { double v2 = snap(v1+inc); DPair p0 = valueAt(0, v1); DPair p2 = valueAt(0, v2); Color c0 = colorAt(0, v1); Color c2 = colorAt(0, v2); double u1 = 0; for (double u2=inc; u2 <= 1; u2=snap(u2+inc)) { DPair p1 = valueAt(u2, v1); DPair p3 = valueAt(u2, v2); Color c1 = colorAt(u2, v1); Color c3 = colorAt(u2, v2); // Compute a single patch segment. Only those segment edges that lay on the // patch boundary are drawn as Bézier curves, all other edges are approximated // with straight lines. This ensures a smooth outline and reduces the number of // time consuming computations. GraphicsPath path; path.moveto(p0); if (v1 > 0) path.lineto(p1); else { Bezier bezier(vbezier0, u1, u2); path.cubicto(bezier.point(1), bezier.point(2), bezier.point(3)); } if (u2 < 1) path.lineto(p3); else { Bezier bezier(ubezier1, v1, v2); path.cubicto(bezier.point(1), bezier.point(2), bezier.point(3)); } if (v2 < 1) path.lineto(p2); else { Bezier bezier(vbezier1, u1, u2); path.cubicto(bezier.point(2), bezier.point(1), bezier.point(0)); } if (u1 > 0) path.closepath(); else { Bezier bezier(ubezier0, v1, v2); path.cubicto(bezier.point(2), bezier.point(1), bezier.point(0)); path.closepath(); } callback.patchSegment(path, averageColor(c0, c1, c2, c3)); p0 = p1; p2 = p3; c0 = c1; c2 = c3; u1 = u2; } } } #endif ///////////////////////////////////////////////////////////////////////////////////// CoonsPatch::CoonsPatch (const PointVec &points, const ColorVec &colors, Color::ColorSpace cspace, int edgeflag, CoonsPatch *patch) : TensorProductPatch(cspace) { setPoints(points, edgeflag, patch); setColors(colors, edgeflag, patch); } DPair CoonsPatch::valueAt (double u, double v) const { // Compute the value of P(u,v) using the Coons equation rather than the // tensor product since the "inner" control points of the tensor matrix // might not be set yet. Bezier bezier1(_points[3][0], _points[3][1], _points[3][2], _points[3][3]); Bezier bezier2(_points[0][0], _points[0][1], _points[0][2], _points[0][3]); Bezier bezier3(_points[3][0], _points[2][0], _points[1][0], _points[0][0]); Bezier bezier4(_points[3][3], _points[2][3], _points[1][3], _points[0][3]); DPair ph = bezier1.valueAt(u)*(1-v) + bezier2.valueAt(u)*v; DPair pv = bezier3.valueAt(v)*(1-u) + bezier4.valueAt(v)*u; DPair pc = (_points[3][0]*(1-u) + _points[3][3]*u)*(1-v) + (_points[0][0]*(1-u) + _points[0][3]*u)*v; return ph+pv-pc; } /** Sets the 12 control points defining the geometry of the coons patch. The points * must be given in the following order: * 3 4 5 6 * 2 7 * 1 8 * 0 11 10 9 * where each edge of the square represents the four control points of a cubic Bézier curve. * If the edge flag is 1, 2, or 3, the points 0 to 3 are omitted, and taken from a reference * patch instead. * @param[in] points the control points in cyclic order as described in the PS reference, p. 281 * @param[in] edgeflag defines how to connect this patch to another one * @param[in] patch reference patch required if edgeflag > 0 */ void CoonsPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) { auto coonsPatch = dynamic_cast(patch); if (edgeflag > 0 && !coonsPatch) throw ShadingException("missing preceding data in definition of relative Coons patch"); if ((edgeflag == 0 && points.size() != 12) || (edgeflag > 0 && points.size() != 8)) throw ShadingException("invalid number of control points in Coons patch definition"); // Since a Coons patch is a special tensor product patch, we only have to reorder the // control points and compute the additional "inner" points of the 4x4 point tensor matrix. // set outer control points of the tensor matrix except those of the first column // because these points depend on the edge flag int i = (edgeflag == 0 ? 4 : 0); _points[3][1] = points[i++]; _points[3][2] = points[i++]; _points[3][3] = points[i++]; _points[2][3] = points[i++]; _points[1][3] = points[i++]; _points[0][3] = points[i++]; _points[0][2] = points[i++]; _points[0][1] = points[i]; // set control points of first matrix column switch (edgeflag) { case 0: setFirstMatrixColumn(&points[0], false); break; case 1: setFirstMatrixColumn(coonsPatch->_points[3], false); break; case 2: setFirstMatrixColumn(coonsPatch->_points, 3, true); break; case 3: setFirstMatrixColumn(coonsPatch->_points[0], true); break; } // compute inner control points of the tensor matrix _points[1][1] = valueAt(1.0/3.0, 2.0/3.0); _points[1][2] = valueAt(2.0/3.0, 2.0/3.0); _points[2][1] = valueAt(1.0/3.0, 1.0/3.0); _points[2][2] = valueAt(2.0/3.0, 1.0/3.0); } void CoonsPatch::setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) { auto coonsPatch = dynamic_cast(patch); if (edgeflag > 0 && !coonsPatch) throw ShadingException("missing preceding data in definition of relative Coons patch"); if ((edgeflag == 0 && colors.size() != 4) || (edgeflag > 0 && colors.size() != 2)) throw ShadingException("invalid number of colors in Coons patch definition"); int i = (edgeflag == 0 ? 2 : 0); _colors[3] = colors[i]; _colors[1] = colors[i+1]; switch (edgeflag) { case 0: _colors[0] = colors[0]; _colors[2] = colors[1]; break; case 1: _colors[0] = coonsPatch->_colors[2]; _colors[2] = coonsPatch->_colors[3]; break; case 2: _colors[0] = coonsPatch->_colors[3]; _colors[2] = coonsPatch->_colors[1]; break; case 3: _colors[0] = coonsPatch->_colors[1]; _colors[2] = coonsPatch->_colors[0]; break; } } dvisvgm-2.8.1/src/InputBuffer.cpp0000664000175000017500000000731413510660062013654 00000000000000/************************************************************************* ** InputBuffer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "InputBuffer.hpp" using namespace std; StreamInputBuffer::StreamInputBuffer (istream &is, size_t bufsize) : _is(is), _bufsize(bufsize), _buf1(new uint8_t[_bufsize]), _buf2(new uint8_t[_bufsize]), _bufptr(_buf1) { _size1 = fillBuffer(_buf1); _size2 = fillBuffer(_buf2); } StreamInputBuffer::~StreamInputBuffer () { delete [] _buf1; delete [] _buf2; } int StreamInputBuffer::get () { if (pos() == _size1) { if (_size2 == 0) return -1; swap(_buf1, _buf2); _size1 = _size2; _bufptr = _buf1; _size2 = fillBuffer(_buf2); } uint8_t c = *_bufptr++; return c; } /** Returns the next character to be read without skipping it. * Same as peek(0). */ int StreamInputBuffer::peek () const { if (pos() < _size1) return *_bufptr; return _size2 > 0 ? *_buf2 : -1; } /** Returns the n-th next character without skipping it. */ int StreamInputBuffer::peek (size_t n) const { if (pos()+n < _size1) return *(_bufptr+n); if (pos()+n < _size1+_size2) return *(_buf2 + pos()+n-_size1); return -1; } /** Fills the buffer by reading a sequence of characters from the assigned * input stream. * @param[in] buf pointer to character buffer to be filled * @return number of characters read */ int StreamInputBuffer::fillBuffer (uint8_t *buf) { if (_is && !_is.eof()) { _is.read((char*)buf, _bufsize); return _is.gcount(); } return 0; } /////////////////////////////////////////////// SplittedCharInputBuffer::SplittedCharInputBuffer (const char *buf1, size_t s1, const char *buf2, size_t s2) { _buf[0] = buf1; _buf[1] = buf2; _size[0] = buf1 ? s1 : 0; _size[1] = buf2 ? s2 : 0; _index = _size[0] ? 0 : 1; } int SplittedCharInputBuffer::get () { if (_size[_index] == 0) return -1; int ret = *_buf[_index]++; _size[_index]--; if (_index == 0 && _size[0] == 0) _index++; return ret; } int SplittedCharInputBuffer::peek () const { return _size[_index] ? *_buf[_index] : -1; } int SplittedCharInputBuffer::peek (size_t n) const { if (n < _size[_index]) return _buf[_index][n]; n -= _size[_index]; if (_index == 0 && n < _size[1]) return _buf[1][n]; return -1; } /////////////////////////////////////////////// int TextStreamInputBuffer::get () { int c = StreamInputBuffer::get(); if (c == '\n') { _line++; _col = 1; } else _col++; return c; } dvisvgm-2.8.1/src/StreamWriter.hpp0000664000175000017500000000422413536436567014100 00000000000000/************************************************************************* ** StreamWriter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef STREAMWRITER_HPP #define STREAMWRITER_HPP #include #include class HashFunction; class StreamWriter { public: explicit StreamWriter (std::ostream &os) : _os(os) {} void writeUnsigned (uint32_t val, int n); void writeSigned (int32_t val, int n); void writeBytes (const std::vector &bytes); void writeBytes (const uint8_t *buf, size_t bufsize); void writeBytes (int byte, size_t count); void writeString (const std::string &str, bool finalZero=false); void writeUnsigned (uint32_t val, int n, HashFunction &hashfunc); void writeSigned (int32_t val, int n, HashFunction &hashfunc); void writeString (const std::string &str, HashFunction &hashfunc, bool finalZero=false); private: std::ostream &_os; }; #endif dvisvgm-2.8.1/src/PSPreviewFilter.hpp0000664000175000017500000000500013510660062014450 00000000000000/************************************************************************* ** PSPreviewFilter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PSPREVIEWFILTER_HPP #define PSPREVIEWFILTER_HPP #include #include #include "BoundingBox.hpp" #include "PSFilter.hpp" class SpecialActions; class PSPreviewFilter : public PSFilter { public: explicit PSPreviewFilter (PSInterpreter &psi); void activate (); void execute (const char *code, size_t len) override; bool active () const override {return _active;} std::string version () const {return _version;} bool tightpage () const {return _tightpage;} void setDviScaleFactor (double dvi2bp) {_dvi2bp = dvi2bp;} void assignBorders (BoundingBox &bbox) const; bool getBoundingBox (BoundingBox &bbox) const; double height () const; double depth () const; double width () const; private: std::string _version; ///< version string of preview package bool _active; ///< true if filter is active bool _tightpage; ///< true if tightpage option was given double _dvi2bp; ///< factor to convert dvi units to PS points std::vector _boxExtents; ///< bounding box data set by the preview package (in DVI units) }; #endif dvisvgm-2.8.1/src/Subfont.cpp0000664000175000017500000002207013510660062013037 00000000000000/************************************************************************* ** Subfont.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "FileFinder.hpp" #include "Message.hpp" #include "Subfont.hpp" #include "utility.hpp" using namespace std; // helper functions static int skip_mapping_data (istream &is); static bool scan_line (const char *line, int lineno, vector &mapping, const string &fname, long &offset); /** Constructs a new SubfontDefinition object. * @param[in] name name of subfont definition * @param[in] fpath path to corresponding .sfd file*/ SubfontDefinition::SubfontDefinition (string name, const char *fpath) : _sfname(std::move(name)) { // read all subfont IDs from the .sfd file but skip the mapping data ifstream is(fpath); while (is) { if (is.peek() == '#') // comment line? is.ignore(numeric_limits::max(), '\n'); // => skip it else if (isspace(is.peek())) is.get(); else { string id; while (is && !isspace(is.peek())) id += char(is.get()); if (!id.empty()) { auto state = _subfonts.emplace(pair>(id, unique_ptr())); if (state.second) // id was not present in map already state.first->second = unique_ptr(new Subfont(*this, state.first->first)); skip_mapping_data(is); } } } } /** Looks for a subfont definition of the given name and returns the corresponding object. * All objects are only created once for a given name and stored in an internal cache. * @param[in] name name of subfont definition to lookup * @return pointer to subfont definition object or 0 if it doesn't exist */ SubfontDefinition* SubfontDefinition::lookup (const std::string &name) { static map> sfdMap; auto it = sfdMap.find(name); if (it != sfdMap.end()) return it->second.get(); SubfontDefinition *sfd=nullptr; if (const char *path = FileFinder::instance().lookup(name+".sfd", false)) { sfd = new SubfontDefinition(name, path); sfdMap[name] = unique_ptr(sfd); } return sfd; } /** Returns the full path to the corresponding .sfd file or 0 if it can't be found. */ const char* SubfontDefinition::path () const { return FileFinder::instance().lookup(filename(), false); } /** Returns the subfont with the given ID, or 0 if it doesn't exist. */ Subfont* SubfontDefinition::subfont (const string &id) const { auto it = _subfonts.find(id); if (it != _subfonts.end()) return it->second.get(); return nullptr; } /** Returns all subfonts defined in this SFD. */ int SubfontDefinition::subfonts (vector &sfs) const { for (const auto &strsfpair : _subfonts) sfs.push_back(strsfpair.second.get()); return int(sfs.size()); } ////////////////////////////////////////////////////////////////////// /** Reads the character mappings for a given subfont ID. * Format of subfont definition (sfd) files: * sfd ::= (ID entries | '#' '\n')* * ID ::= * entries ::= (integer | integer ':' | integer '_' integer)* * The mapping data for a subfont is given as a sequence of 256 16-bit values where * value v at position c defines the (global) character code that is assigned to the * local subfont character c. The sequence v,v+1,v+2,...,v+n can be abbreviated with * v '_' v+n, e.g. 10_55. In order to continue the sequence at a different position, * the syntax number ':' can be used. Example: 10: 5 6 7 assigns the values v=5, 6, 7 * to c=10, 11 and 12, respectively. * @return true if the data has been read successfully */ bool Subfont::read () { if (!_mapping.empty()) // if there's already a mapping assigned, we're finished here return true; if (const char *p = _sfd.path()) { ifstream is(p); if (!is) return false; int lineno=1; while (is) { if (is.peek() == '#' || is.peek() == '\n') { is.ignore(numeric_limits::max(), '\n'); // skip comment and empty line lineno++; } else if (isspace(is.peek())) is.get(); else { string id; while (is && !isspace(is.peek())) id += char(is.get()); if (id != _id) lineno += skip_mapping_data(is); else { // build mapping array _mapping.resize(256, 0); long pos=0; char buf[1024]; bool complete=false; while (!complete) { is.getline(buf, 1024); complete = scan_line(buf, lineno, _mapping, _sfd.filename(), pos); } return true; } } } } return false; } /** Returns the global character code of the target font for a * (local) character code of the subfont. * @param[in] c local character code relative to the subfont * @return character code of the target font */ uint16_t Subfont::decode (unsigned char c) { if (_mapping.empty() && !read()) return 0; return _mapping[c]; } ////////////////////////////////////////////////////////////////////// /** Skips the mapping data of a subfont entry. * @param[in] is stream to read from * @return number of lines skipped */ static int skip_mapping_data (istream &is) { char buf[1024]; bool complete=false; int lines=0; while (is && !complete) { is.getline(buf, 1024); if (is.gcount() > 1) lines++; const char *p = buf+is.gcount()-2; while (p >= buf && isspace(*p)) p--; complete = (p < buf || *p != '\\'); // line doesn't end with backslash } return lines; } /** Scans a single line of mapping data and stores the values in the given array. * @param[in] line the line of text to be scanned * @param[in] lineno line number used in exception messages * @param[in,out] mapping the mapping data * @param[in] fname name of the mapfile being scanned * @param[in,out] offset position/index of next mapping value * @return true if the line is the last one the current mapping sequence, i.e. the line doesn't end with a backslash */ static bool scan_line (const char *line, int lineno, vector &mapping, const string &fname, long &offset) { const char *p=line; char *q; for (; *p && isspace(*p); p++); while (*p) { if (*p == '\\') { while (*++p) if (!isspace(*p)) throw SubfontException("unexpected backslash in mapping table", fname, lineno); } else { long val1 = strtol(p, &q, 0); // first value of range long val2 = -1; // last value of range switch (*q) { case ':': if (val1 < 0 || val1 > 255) throw SubfontException("offset value "+to_string(val1)+" out of range (0-255)", fname, lineno); offset = val1; val1 = -1; q++; break; case '_': p = q+1; val2 = strtol(p, &q, 0); if (val1 < 0 || val1 > 0xffffL) throw SubfontException("table value "+to_string(val1)+" out of range", fname, lineno); if (val2 < 0 || val2 > 0xffffL) throw SubfontException("table value "+to_string(val2)+" out of range", fname, lineno); if (p == q || (!isspace(*q) && *q != '\\' && *q)) throw SubfontException("unexpected character '"+to_string(*q)+"'", fname, lineno); break; default: if (p == q || (!isspace(*q) && *q != '\\' && *q)) throw SubfontException("unexpected character '"+to_string(*q)+"'", fname, lineno); if (val1 < 0 || val1 > 0xffffL) throw SubfontException("invalid character code", fname, lineno); val2 = val1; } if (val1 >= 0) { if (val1 > val2 || offset+val2-val1 > 255) throw SubfontException("invalid range in mapping table: "+util::tohex(val1)+"_"+util::tohex(val2), fname, lineno); for (long v=val1; v <= val2; v++) { if (mapping[offset]) throw SubfontException("mapping of character "+to_string(offset)+" already defined", fname, lineno); mapping[offset++] = static_cast(v); } } for (p=q; *p && isspace(*p); p++); } } for (p--; p >= line && isspace(*p); p--); return p < line || *p != '\\'; } dvisvgm-2.8.1/src/Terminal.hpp0000664000175000017500000000435413510660062013204 00000000000000/************************************************************************* ** Terminal.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TERMINAL_HPP #define TERMINAL_HPP #include class Terminal { public: static const int DEFAULT; static const int BLACK; static const int RED; static const int GREEN; static const int BLUE; static const int CYAN; static const int YELLOW; static const int MAGENTA; static const int WHITE; public: static void init (std::ostream &os); static void finish (std::ostream &os); static int columns (); static int rows (); static void fgcolor (int color, std::ostream &os); static void bgcolor (int color, std::ostream &os); static void cursor (bool visible); private: static int _fgcolor; ///< current foreground color static int _bgcolor; ///< current background color #ifdef _WIN32 static int _defaultColor; static int _cursorHeight; ///< current height of the cursor in percent #endif }; #endif dvisvgm-2.8.1/src/ierrors.h0000664000175000017500000001076313510660062012557 00000000000000/* Copyright (C) 2001-2006 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of that license. Refer to licensing information at http://www.artifex.com/ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. */ /* $Id: ierrors.h 8022 2007-06-05 22:23:38Z giles $ */ /* Definition of error codes */ #ifndef ierrors_INCLUDED # define ierrors_INCLUDED /* * DO NOT USE THIS FILE IN THE GRAPHICS LIBRARY. * THIS FILE IS PART OF THE POSTSCRIPT INTERPRETER. * USE gserrors.h IN THE LIBRARY. */ /* * A procedure that may return an error always returns * a non-negative value (zero, unless otherwise noted) for success, * or negative for failure. * We use ints rather than an enum to avoid a lot of casting. */ /* Define the error name table */ extern const char *const gs_error_names[]; /* ------ PostScript Level 1 errors ------ */ #define e_unknownerror (-1) /* unknown error */ #define e_dictfull (-2) #define e_dictstackoverflow (-3) #define e_dictstackunderflow (-4) #define e_execstackoverflow (-5) #define e_interrupt (-6) #define e_invalidaccess (-7) #define e_invalidexit (-8) #define e_invalidfileaccess (-9) #define e_invalidfont (-10) #define e_invalidrestore (-11) #define e_ioerror (-12) #define e_limitcheck (-13) #define e_nocurrentpoint (-14) #define e_rangecheck (-15) #define e_stackoverflow (-16) #define e_stackunderflow (-17) #define e_syntaxerror (-18) #define e_timeout (-19) #define e_typecheck (-20) #define e_undefined (-21) #define e_undefinedfilename (-22) #define e_undefinedresult (-23) #define e_unmatchedmark (-24) #define e_VMerror (-25) /* must be the last Level 1 error */ #define LEVEL1_ERROR_NAMES\ "unknownerror", "dictfull", "dictstackoverflow", "dictstackunderflow",\ "execstackoverflow", "interrupt", "invalidaccess", "invalidexit",\ "invalidfileaccess", "invalidfont", "invalidrestore", "ioerror",\ "limitcheck", "nocurrentpoint", "rangecheck", "stackoverflow",\ "stackunderflow", "syntaxerror", "timeout", "typecheck", "undefined",\ "undefinedfilename", "undefinedresult", "unmatchedmark", "VMerror" /* ------ Additional Level 2 errors (also in DPS) ------ */ #define e_configurationerror (-26) #define e_undefinedresource (-27) #define e_unregistered (-28) #define LEVEL2_ERROR_NAMES\ "configurationerror", "undefinedresource", "unregistered" /* ------ Additional DPS errors ------ */ #define e_invalidcontext (-29) /* invalidid is for the NeXT DPS extension. */ #define e_invalidid (-30) #define DPS_ERROR_NAMES\ "invalidcontext", "invalidid" #define ERROR_NAMES\ LEVEL1_ERROR_NAMES, LEVEL2_ERROR_NAMES, DPS_ERROR_NAMES /* ------ Pseudo-errors used internally ------ */ /* * Internal code for a fatal error. * gs_interpret also returns this for a .quit with a positive exit code. */ #define e_Fatal (-100) /* * Internal code for the .quit operator. * The real quit code is an integer on the operand stack. * gs_interpret returns this only for a .quit with a zero exit code. */ #define e_Quit (-101) /* * Internal code for a normal exit from the interpreter. * Do not use outside of interp.c. */ #define e_InterpreterExit (-102) /* * Internal code that indicates that a procedure has been stored in the * remap_proc of the graphics state, and should be called before retrying * the current token. This is used for color remapping involving a call * back into the interpreter -- inelegant, but effective. */ #define e_RemapColor (-103) /* * Internal code to indicate we have underflowed the top block * of the e-stack. */ #define e_ExecStackUnderflow (-104) /* * Internal code for the vmreclaim operator with a positive operand. * We need to handle this as an error because otherwise the interpreter * won't reload enough of its state when the operator returns. */ #define e_VMreclaim (-105) /* * Internal code for requesting more input from run_string. */ #define e_NeedInput (-106) /* * Internal code for a normal exit when usage info is displayed. * This allows Window versions of Ghostscript to pause until * the message can be read. */ #define e_Info (-110) /* * Define which error codes require re-executing the current object. */ #define ERROR_IS_INTERRUPT(ecode)\ ((ecode) == e_interrupt || (ecode) == e_timeout) #endif /* ierrors_INCLUDED */ dvisvgm-2.8.1/src/PDFToSVG.hpp0000664000175000017500000000475613553267757012760 00000000000000/************************************************************************* ** PDFToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PDFTOSVG_HPP #define PDFTOSVG_HPP #include #include "ImageToSVG.hpp" class PsSpecialHandler; class PDFToSVG : public ImageToSVG { public: PDFToSVG (const std::string &fname, SVGOutputBase &out) : ImageToSVG(fname, out) {} bool isSinglePageFormat() const override {return false;} /** Returns the total number of pages in the PDF file. */ int totalPageCount() override { if (_totalPageCount < 0) { _totalPageCount = psInterpreter().pdfPageCount(filename()); if (_totalPageCount < 1) throw MessageException("can't retrieve number of pages from file " + filename()); } return _totalPageCount; } protected: bool imageIsValid () const override { std::ifstream ifs(filename()); if (ifs) { char buf[16]; ifs.getline(buf, 16); return std::strncmp(buf, "%PDF-1.", 7) == 0; } return false; } std::string imageFormat () const override {return "PDF";} BoundingBox imageBBox () const override {return BoundingBox();} std::string psSpecialCmd () const override {return "pdffile=";} private: mutable int _totalPageCount = -1; }; #endif dvisvgm-2.8.1/src/GFGlyphTracer.hpp0000664000175000017500000000476513510660062014100 00000000000000/************************************************************************* ** GFGlyphTracer.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef GFGLYPHTRACER_HPP #define GFGLYPHTRACER_HPP #include #include #include "GFTracer.hpp" #include "Glyph.hpp" class GFGlyphTracer : public GFTracer { public: struct Callback { virtual ~Callback () =default; virtual void setFont (const std::string &fontname) {} virtual void beginChar (uint8_t c) {} virtual void endChar (uint8_t c) {} virtual void emptyChar (uint8_t c) {} }; public: GFGlyphTracer (); GFGlyphTracer (std::string &fname, double upp, Callback *cb=nullptr); void reset (std::string &fname, double upp); void setCallback (Callback *cb) {_callback = cb;} bool executeChar (uint8_t c) override; void moveTo (double x, double y) override; void lineTo (double x, double y) override; void curveTo (double c1x, double c1y, double c2x, double c2y, double x, double y) override; void closePath () override; void endChar (uint32_t c) override; void setGlyph (Glyph &glyph) {_glyph = &glyph;} const Glyph& getGlyph () const {return *_glyph;} private: std::ifstream _ifs; Glyph *_glyph = nullptr; Callback *_callback = nullptr; }; #endif dvisvgm-2.8.1/src/DLLoader.cpp0000664000175000017500000000436213510660062013051 00000000000000/************************************************************************* ** DLLoader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "DLLoader.hpp" using namespace std; /** Creates a new DLLoader object and tries to load the given dynamic/shared library. * @param[in] dlname name of library to load */ DLLoader::DLLoader (const string &dlname) : _handle(nullptr) { loadLibrary(dlname); } /** Releases the currently assigned dynamic/shared library and loads another one. * @param[in] dlname name of library to load */ bool DLLoader::loadLibrary (const string &dlname) { closeLibrary(); if (!dlname.empty()) { #ifdef _WIN32 _handle = LoadLibrary(dlname.c_str()); #else _handle = dlopen(dlname.c_str(), RTLD_LAZY); #endif } return _handle != nullptr; } /** Releases the library currently assigned to the DLLoader object. */ void DLLoader::closeLibrary () { if (_handle) { #ifdef _WIN32 FreeLibrary(_handle); #else dlclose(_handle); #endif _handle = nullptr; } } dvisvgm-2.8.1/src/TTFAutohint.hpp0000664000175000017500000000405213510660062013575 00000000000000/************************************************************************* ** TTFAutohint.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TTFAUTOHINT_HPP #define TTFAUTOHINT_HPP #include #include #if defined(HAVE_TTFAUTOHINT_H) && !defined(HAVE_LIBTTFAUTOHINT) #include "DLLoader.hpp" #endif class TTFAutohint #if defined(HAVE_TTFAUTOHINT_H) && !defined(HAVE_LIBTTFAUTOHINT) : public DLLoader #endif { public: TTFAutohint (); TTFAutohint (const TTFAutohint &ta) =delete; bool available () const; int autohint (const std::string &source, const std::string &target, bool rehintIfSymbolFont); std::string lastErrorMessage () const; std::string version () const; #ifdef HAVE_TTFAUTOHINT_H private: const unsigned char *_lastErrorMessage; #endif }; #endif dvisvgm-2.8.1/src/RangeMap.hpp0000664000175000017500000001211613510660062013116 00000000000000/************************************************************************* ** RangeMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef RANGEMAP_HPP #define RANGEMAP_HPP #include #include #include class RangeMap { class Range { friend class RangeMap; public: Range () : _min(0), _max(0), _minval(0) {} Range (uint32_t min, uint32_t max, uint32_t minval) : _min(min), _max(max), _minval(minval) { if (_min > _max) std::swap(_min, _max); } uint32_t min () const {return _min;} uint32_t max () const {return _max;} uint32_t minval () const {return _minval;} uint32_t maxval () const {return valueAt(_max);} uint32_t valueAt (uint32_t c) const {return c-_min+_minval;} uint32_t numKeys () const {return _max-_min+1;} bool operator < (const Range &r) const {return _min < r._min;} std::ostream& write (std::ostream &os) const; protected: void min (uint32_t m) {_min = m;} void max (uint32_t m) {_max = m;} void setMinAndAdaptValue (uint32_t c) {_minval = valueAt(c); _min = c;} bool join (const Range &r); private: uint32_t _min, _max; uint32_t _minval; }; using Ranges = std::vector; class Iterator { friend class RangeMap; public: void operator ++ () { if (_currentKey < _rangeIterator->max()) ++_currentKey; else { if (++_rangeIterator != _rangeMap._ranges.end()) _currentKey = _rangeIterator->min(); } } void operator -- () { if (_currentKey > _rangeIterator->min()) --_currentKey; else { if (_rangeIterator != _rangeMap._ranges.begin()) _currentKey = (--_rangeIterator)->max(); } } std::pair operator * () const { return std::pair(_currentKey, _rangeMap.valueAt(_currentKey)); } bool operator == (const Iterator &it) const { bool ret = (_rangeIterator == it._rangeIterator); if (ret && _rangeIterator != _rangeMap._ranges.end()) ret = (_currentKey == it._currentKey); return ret; } bool operator != (const Iterator &it) const { bool ret = (_rangeIterator != it._rangeIterator); if (!ret && _rangeIterator != _rangeMap._ranges.end()) ret = _currentKey != it._currentKey; return ret; } protected: Iterator (const RangeMap &rangeMap, Ranges::const_iterator it) : _rangeMap(rangeMap), _rangeIterator(it), _currentKey() { if (_rangeIterator != _rangeMap._ranges.end()) _currentKey = _rangeIterator->min(); } private: const RangeMap &_rangeMap; Ranges::const_iterator _rangeIterator; uint32_t _currentKey; }; public: void addRange (uint32_t first, uint32_t last, uint32_t cid); bool valueExists (uint32_t c) const {return lookup(c) >= 0;} uint32_t valueAt (uint32_t c) const; uint32_t minKey () const {return _ranges.empty() ? 0 : _ranges.front().min();} uint32_t maxKey () const {return _ranges.empty() ? 0 : _ranges.back().max();} size_t numRanges () const {return _ranges.size();} size_t numValues () const; bool empty () const {return _ranges.empty();} void clear () {_ranges.clear();} const Range& getRange (size_t n) const {return _ranges[n];} Iterator begin () const {return Iterator(*this, _ranges.begin());} Iterator end () const {return Iterator(*this, _ranges.end());} std::ostream& write (std::ostream &os) const; protected: void adaptNeighbors (Ranges::iterator it); int lookup (uint32_t c) const; const Range& rangeAt (size_t n) const {return _ranges[n];} private: Ranges _ranges; }; inline std::ostream& operator << (std::ostream& os, const RangeMap &rangemap) { return rangemap.write(os); } #endif dvisvgm-2.8.1/src/SVGTree.hpp0000664000175000017500000001067413510660062012712 00000000000000/************************************************************************* ** SVGTree.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGTREE_HPP #define SVGTREE_HPP #include #include #include #include #include #include "Color.hpp" #include "FontWriter.hpp" #include "GFGlyphTracer.hpp" #include "Matrix.hpp" #include "SVGCharHandler.hpp" #include "XMLDocument.hpp" #include "XMLNode.hpp" class BoundingBox; class Color; class Font; class Matrix; class PhysicalFont; class SVGTree { public: SVGTree (); void reset (); bool write (std::ostream &os) const {return bool(_doc.write(os));} void newPage (int pageno); void appendToDefs (std::unique_ptr node); void appendToPage (std::unique_ptr node); void prependToPage (std::unique_ptr node); void appendToDoc (std::unique_ptr node) {_doc.append(std::move(node));} void appendToRoot (std::unique_ptr node) {_root->append(std::move(node));} void appendChar (int c, double x, double y) {_charHandler->appendChar(c, x, y);} void appendFontStyles (const std::unordered_set &fonts); void append (const PhysicalFont &font, const std::set &chars, GFGlyphTracer::Callback *callback=nullptr); void pushDefsContext (std::unique_ptr node); void popDefsContext (); void pushPageContext (std::unique_ptr node); void popPageContext (); void setBBox (const BoundingBox &bbox); void setFont (int id, const Font &font); static bool setFontFormat (std::string formatstr); void setX (double x) {_charHandler->notifyXAdjusted();} void setY (double y) {_charHandler->notifyYAdjusted();} void setMatrix (const Matrix &m) {_charHandler->setMatrix(m);} void setColor (const Color &c); void setVertical (bool state) {_charHandler->setVertical(state);} void transformPage (const Matrix &m); Color getColor () const {return _charHandler->getColor();} const Matrix& getMatrix () const {return _charHandler->getMatrix();} XMLElement* rootNode () const {return _root;} XMLElement* defsNode () const {return _defs;} XMLElement* pageNode () const {return _page;} protected: XMLCData* styleCDataNode (); public: static bool USE_FONTS; ///< if true, create font references and don't draw paths directly static bool CREATE_CSS; ///< define and use CSS classes to reference fonts? static bool CREATE_USE_ELEMENTS; ///< allow generation of elements? static FontWriter::FontFormat FONT_FORMAT; ///< format of fonts to be embedded static bool RELATIVE_PATH_CMDS; ///< relative path commands rather than absolute ones? static bool MERGE_CHARS; ///< whether to merge chars with common properties into the same tag static bool ADD_COMMENTS; ///< add comments with additional information static double ZOOM_FACTOR; ///< factor applied to width/height attribute private: XMLDocument _doc; XMLElement *_root, *_page, *_defs; XMLCData *_styleCDataNode; std::unique_ptr _charHandler; std::stack _defsContextStack; std::stack _pageContextStack; }; #endif dvisvgm-2.8.1/src/ToUnicodeMap.hpp0000664000175000017500000000346413510660062013761 00000000000000/************************************************************************* ** ToUnicodeMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TOUNICODEMAP_HPP #define TOUNICODEMAP_HPP #include "NumericRanges.hpp" #include "RangeMap.hpp" /** Represents a mapping from character indexes to unicode points. */ class ToUnicodeMap : public RangeMap { public: bool addMissingMappings (uint32_t maxIndex); protected: bool fillRange (uint32_t minIndex, uint32_t maxIndex, uint32_t ucp, NumericRanges &used_ucps, bool ascending); }; #endif dvisvgm-2.8.1/src/XMLString.cpp0000664000175000017500000000573413511327140013254 00000000000000/************************************************************************* ** XMLString.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "Unicode.hpp" #include "utility.hpp" #include "XMLString.hpp" using namespace std; int XMLString::DECIMAL_PLACES = 0; static string translate (uint32_t c) { switch (c) { case '<' : return "<"; case '&' : return "&"; case '"' : return """; case '\'': return "'"; } return Unicode::utf8(c); } XMLString::XMLString (const string &str, bool plain) { if (plain) assign(str); else { for (char c : str) append(translate(c)); } } XMLString::XMLString (const char *str, bool plain) { if (str) { if (plain) assign(str); else { while (*str) append(translate(*str++)); } } } XMLString::XMLString (int n, bool cast) : string(cast ? to_string(n) : translate(n)) { } /** Rounds a floating point value to a given number of decimal places. * @param[in] x number to round * @param[in] n number of decimal places (must be between 1 and 6) * @return rounded value */ static inline double round (double x, int n) { const long pow10[] = {10L, 100L, 1000L, 10000L, 100000L, 1000000L}; const double eps = 1e-7; n--; if (x >= 0) return floor(x*pow10[n]+0.5+eps)/pow10[n]; return ceil(x*pow10[n]-0.5-eps)/pow10[n]; } XMLString::XMLString (double x) { if (DECIMAL_PLACES > 0) { // don't use fixed and setprecision() manipulators here to avoid // banker's rounding applied in some STL implementations x = round(x, DECIMAL_PLACES); } if (std::abs(x) < 1e-6) x = 0; assign(util::to_string(x)); size_t pos = find("0."); if (pos != string::npos && (pos == 0 || at(pos-1) == '-')) erase(pos, 1); } dvisvgm-2.8.1/src/FileFinder.hpp0000664000175000017500000000456313510660062013442 00000000000000/************************************************************************* ** FileFinder.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FILEFINDER_HPP #define FILEFINDER_HPP #include #include #include class MiKTeXCom; class FileFinder { public: static void init (const std::string &argv0, const std::string &progname, bool enable_mktexmf); static FileFinder& instance (); std::string version () const; void addLookupDir (const std::string &path); const char* lookup (const std::string &fname, const char *ftype, bool extended=true) const; const char* lookup (const std::string &fname, bool extended=true) const {return lookup(fname, nullptr, extended);} protected: FileFinder (); const char* findFile (const std::string &fname, const char *ftype) const; const char* findMappedFile (std::string fname) const; const char* mktex (const std::string &fname) const; private: static std::string _argv0; static std::string _progname; static bool _enableMktex; std::set _additionalDirs; #ifdef MIKTEX std::unique_ptr _miktex; #endif }; #endif dvisvgm-2.8.1/src/VectorIterator.hpp0000664000175000017500000000657413510660062014413 00000000000000/************************************************************************* ** VectorIterator.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef VECTORITERATOR_HPP #define VECTORITERATOR_HPP #include #include "MessageException.hpp" struct IteratorException : public MessageException { explicit IteratorException (const std::string &msg) : MessageException(msg) {} }; template class VectorIterator { public: explicit VectorIterator (std::vector &vec) : _vector(vec), _pos(0) {} VectorIterator operator ++ () { _pos++; return *this; } VectorIterator operator ++ (int) { VectorIterator it = *this; _pos++; return it; } VectorIterator operator -- () { _pos--; return *this; } VectorIterator operator -- (int) { VectorIterator it = *this; _pos--; return it; } VectorIterator operator += (int n) { _pos += n; return *this; } VectorIterator operator -= (int n) { _pos -= n; return *this; } VectorIterator operator + (int n) { return VectorIterator(_vector, _pos+n); } VectorIterator operator - (int n) { return VectorIterator(_vector, _pos-n); } T& operator * () { if (valid()) return _vector[_pos]; throw IteratorException("invalid access"); } T* operator -> () { if (valid()) return &_vector[_pos]; throw IteratorException("invalid access"); } bool operator == (const VectorIterator &it) const {return _pos == it._pos;} bool operator != (const VectorIterator &it) const {return _pos != it._pos;} bool operator <= (const VectorIterator &it) const {return _pos <= it._pos;} bool operator >= (const VectorIterator &it) const {return _pos >= it._pos;} bool operator < (const VectorIterator &it) const {return _pos < it._pos;} bool operator > (const VectorIterator &it) const {return _pos > it._pos;} bool valid () const {return _pos >= 0 && _pos < _vector.size();} void invalidate () {_pos = _vector.size();} void reset () {_pos = 0;} protected: VectorIterator (std::vector &vec, size_t pos) : _vector(vec), _pos(pos) {} private: std::vector &_vector; size_t _pos; }; #endif dvisvgm-2.8.1/src/FontWriter.hpp0000664000175000017500000000526613510660062013537 00000000000000/************************************************************************* ** FontWriter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTWRITER_HPP #define FONTWRITER_HPP #include #include #include #include #include "GFGlyphTracer.hpp" #include "MessageException.hpp" class PhysicalFont; class FontWriter { public: enum class FontFormat {UNKNOWN, SVG, TTF, WOFF, WOFF2}; static bool AUTOHINT_FONTS; public: explicit FontWriter (const PhysicalFont &font); std::string createFontFile (FontFormat format, const std::set &charcodes, GFGlyphTracer::Callback *cb=nullptr) const; bool writeCSSFontFace (FontFormat format, const std::set &charcodes, std::ostream &os, GFGlyphTracer::Callback *cb=nullptr) const; static FontFormat toFontFormat (std::string formatstr); static std::vector supportedFormats (); protected: struct FontFormatInfo { FontWriter::FontFormat format; const char *mimetype; const char *formatstr_short; const char *formatstr_long; }; static const FontFormatInfo* fontFormatInfo (FontFormat format); bool createTTFFile (const std::string &sfdname, const std::string &ttfname) const; private: const PhysicalFont &_font; static const std::array _formatInfos; }; struct FontWriterException : MessageException { explicit FontWriterException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/PapersizeSpecialHandler.cpp0000664000175000017500000000772413510660062016171 00000000000000/************************************************************************* ** PapersizeSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "Message.hpp" #include "PapersizeSpecialHandler.hpp" #include "SpecialActions.hpp" using namespace std; void PapersizeSpecialHandler::preprocess (const string&, std::istream &is, SpecialActions &actions) { string params; is >> params; Length w, h; const size_t splitpos = params.find(','); try { if (splitpos == string::npos) { w.set(params); h.set(params); } else { w.set(params.substr(0, splitpos)); h.set(params.substr(splitpos+1)); } storePaperSize(actions.getCurrentPageNumber(), w, h); } catch (UnitException &e) { // ignore invalid length units for now } } bool PapersizeSpecialHandler::process (const string&, std::istream&, SpecialActions&) { return true; } /** Records a paper size for a given page number for later processing. This function doesn't * assign them to the page. */ void PapersizeSpecialHandler::storePaperSize (unsigned pageno, Length width, Length height) { DoublePair whpair(width.bp(), height.bp()); if (_pageSizes.empty() || _pageSizes.back().second != whpair) { if (!_pageSizes.empty() && _pageSizes.back().first == pageno) _pageSizes.back().second = whpair; else _pageSizes.emplace_back(PageSize(pageno, whpair)); } } /** Applies the previously recorded size to a given page. */ void PapersizeSpecialHandler::applyPaperSize (unsigned pageno, SpecialActions &actions) { // find page n >= pageno that contains a papersize special auto lb_it = lower_bound(_pageSizes.begin(), _pageSizes.end(), PageSize(pageno, DoublePair()), [](const PageSize &ps1, const PageSize &ps2) { // order PageSize objects by page number return ps1.first < ps2.first; }); auto it = _pageSizes.end(); if (lb_it != _pageSizes.end() && lb_it->first == pageno) it = lb_it; // if current page contains a papersize special, use it else if (lb_it != _pageSizes.begin()) // no papersize special on current page? it = lb_it-1; // => use the one on the nearest preceding page if (it == _pageSizes.end()) Message::wstream(true) << "no valid papersize special found\n"; else { DoublePair size = it->second; const double border = -72; // DVI standard: coordinates of upper left paper corner are (-72bp, -72bp) actions.bbox() = BoundingBox(border, border, size.first+border, size.second+border); } } void PapersizeSpecialHandler::dviEndPage (unsigned pageno, SpecialActions &actions) { if (actions.getBBoxFormatString() == "papersize") applyPaperSize(pageno, actions); } vector PapersizeSpecialHandler::prefixes() const { vector pfx {"papersize="}; return pfx; } dvisvgm-2.8.1/src/CMap.cpp0000664000175000017500000000516413510660062012244 00000000000000/************************************************************************* ** CMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "CMap.hpp" #include "CMapManager.hpp" #include "FileFinder.hpp" using namespace std; const char* CMap::path () const { return FileFinder::instance().lookup(name(), "cmap", false); } const FontEncoding* CMap::findCompatibleBaseFontMap (const PhysicalFont *font, CharMapID &charmapID) const { return CMapManager::instance().findCompatibleBaseFontMap(font, this, charmapID); } ////////////////////////////////////////////////////////////////////// /** Returns the RO (Registry-Ordering) string of the CMap. */ string SegmentedCMap::getROString() const { if (_registry.empty() || _ordering.empty()) return ""; return _registry + "-" + _ordering; } /** Returns the CID for a given character code. */ uint32_t SegmentedCMap::cid (uint32_t c) const { if (_cidranges.valueExists(c)) return _cidranges.valueAt(c); if (_basemap) return _basemap->cid(c); return 0; } /** Returns the character code of a base font for a given CID. */ uint32_t SegmentedCMap::bfcode (uint32_t cid) const { if (_bfranges.valueExists(cid)) return _bfranges.valueAt(cid); if (_basemap) return _basemap->bfcode(cid); return 0; } void SegmentedCMap::write (ostream &os) const { _cidranges.write(os); } dvisvgm-2.8.1/src/DVIToSVG.hpp0000664000175000017500000001274213553267757012763 00000000000000/************************************************************************* ** DVIToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DVITOSVG_HPP #define DVITOSVG_HPP #include #include #include #include "DVIReader.hpp" #include "FilePath.hpp" #include "SVGTree.hpp" struct DVIActions; struct SVGOutputBase; class HashFunction; class DVIToSVG : public DVIReader { public: class HashSettings { public: enum Parameter {P_LIST, P_REPLACE}; void setParameters (const std::string ¶mstr); void setOptionHash (const std::string &optHash) {_optHash = optHash;} std::string algorithm () const {return _algo;} std::string optionsHash () const {return _optHash;} bool isSet (Parameter param) {return _params.find(param) != _params.end();} private: std::string _algo; std::string _optHash; std::set _params; }; public: explicit DVIToSVG (std::istream &is, SVGOutputBase &out); DVIToSVG (const DVIToSVG&) =delete; void convert (const std::string &range, std::pair *pageinfo=nullptr); void setPageSize (const std::string &format) {_bboxFormatString = format;} void setPageTransformation (const std::string &cmds) {_transCmds = cmds;} Matrix getPageTransformation () const override; void translateToX (double x) override {_tx = x-dviState().h-_tx;} void translateToY (double y) override {_ty = y-dviState().v-_ty;} double getXPos() const override {return dviState().h+_tx;} double getYPos() const override {return dviState().v+_ty;} void finishLine () override {_prevYPos = std::numeric_limits::min();} void listHashes (const std::string &rangestr, std::ostream &os); FilePath getSVGFilePath (unsigned pageno) const; std::string getUserBBoxString () const {return _bboxFormatString;} static void setProcessSpecials (const char *ignorelist=nullptr, bool pswarning=false); public: static bool COMPUTE_PROGRESS; ///< if true, an action to handle the progress ratio of a page is triggered static char TRACE_MODE; static HashSettings PAGE_HASH_SETTINGS; protected: void convert (unsigned firstPage, unsigned lastPage, HashFunction *hashFunc); int executeCommand () override; void enterBeginPage (unsigned pageno, const std::vector &c); void leaveEndPage (unsigned pageno); void embedFonts (XMLElement *svgElement); void moveRight (double dx, MoveMode mode) override; void moveDown (double dy, MoveMode mode) override; void dviPost (uint16_t stdepth, uint16_t pages, uint32_t pw, uint32_t ph, uint32_t mag, uint32_t num, uint32_t den, uint32_t lbopofs) override; void dviBop (const std::vector &c, int32_t prevBopOffset) override; void dviEop () override; void dviSetChar0 (uint32_t c, const Font *font) override; void dviSetChar (uint32_t c, const Font *font) override; void dviPutChar (uint32_t c, const Font *font) override; void dviSetRule (double h, double w) override; void dviPutRule (double h, double w) override; void dviPop () override; void dviFontNum (uint32_t fontnum, SetFontMode mode, const Font *font) override; void dviDir (WritingMode dir) override; void dviXXX (const std::string &str) override; void dviXGlyphArray (std::vector &dx, std::vector &dy, std::vector &glyphs, const Font &font) override; void dviXGlyphString (std::vector &dx, std::vector &glyphs, const Font &font) override; void dviXTextAndGlyphs (std::vector &dx, std::vector &dy, std::vector &chars, std::vector &glyphs, const Font &font) override; private: SVGTree _svg; SVGOutputBase &_out; std::unique_ptr _actions; std::string _bboxFormatString; ///< bounding box size/format set by the user std::string _transCmds; ///< page transformation commands set by the user double _pageHeight, _pageWidth; ///< global page height and width stored in the postamble double _tx, _ty; ///< translation of cursor position double _prevXPos, _prevYPos; ///< previous cursor position WritingMode _prevWritingMode; ///< previous writing mode std::streampos _pageByte; ///< position of the stream pointer relative to the preceding bop (in bytes) }; #endif dvisvgm-2.8.1/src/BgColorSpecialHandler.cpp0000664000175000017500000000614713510660062015554 00000000000000/************************************************************************* ** BgColorSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "BgColorSpecialHandler.hpp" #include "ColorSpecialHandler.hpp" #include "SpecialActions.hpp" using namespace std; /** Collect all background color changes while preprocessing the DVI file. * We need them in order to apply the correct background colors even if * not all but only selected DVI pages are converted. */ void BgColorSpecialHandler::preprocess (const string&, std::istream &is, SpecialActions &actions) { Color color = ColorSpecialHandler::readColor(is); unsigned pageno = actions.getCurrentPageNumber(); if (_pageColors.empty() || _pageColors.back().second != color) { if (!_pageColors.empty() && _pageColors.back().first == pageno) _pageColors.back().second = color; else _pageColors.emplace_back(PageColor(pageno, color)); } } bool BgColorSpecialHandler::process (const string&, istream&, SpecialActions&) { return true; } void BgColorSpecialHandler::dviBeginPage (unsigned pageno, SpecialActions &actions) { // Ensure that the background color of the preceeding page is set as the // default background color of the current page because this special affects // the current and all subsequent pages until the next change. // See the documentation of the color package, section 3.5. if (_pageColors.empty()) return; // find number of page with bg color change not lower than the current one auto it = lower_bound(_pageColors.begin(), _pageColors.end(), PageColor(pageno, Color::BLACK)); if (it != _pageColors.end() && it->first == pageno) actions.setBgColor(it->second); else if (it != _pageColors.begin()) actions.setBgColor((--it)->second); } vector BgColorSpecialHandler::prefixes() const { vector pfx {"background"}; return pfx; } dvisvgm-2.8.1/src/Process.hpp0000664000175000017500000000342713510660062013047 00000000000000/************************************************************************* ** Process.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PROCESS_HPP #define PROCESS_HPP #include class Process { public: Process (std::string cmd, std::string paramstr); Process (const Process &orig) =delete; Process (Process &&orig) =delete; bool run (std::string *out=nullptr); bool run (const std::string &dir, std::string *out=nullptr); private: std::string _cmd; const std::string _paramstr; }; #endif dvisvgm-2.8.1/src/GlyphTracerMessages.hpp0000664000175000017500000000552313510660062015344 00000000000000/************************************************************************* ** GlyphTracerMessages.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef GLYPHTRACERMESSAGES_HPP #define GLYPHTRACERMESSAGES_HPP #include #include "GFGlyphTracer.hpp" #include "Message.hpp" class GlyphTracerMessages : public GFGlyphTracer::Callback { public: explicit GlyphTracerMessages (bool sfmsg=true, bool autonl=true) : _sfmsg(sfmsg), _autonl(autonl), _traced(false) {} ~GlyphTracerMessages () override { if (_autonl) Message::mstream() << '\n'; } void beginChar (uint8_t c) override { if (!_traced) { if (!_fname.empty()) Message::mstream() << '\n'; // extract font name from file path std::string fontname = _fname; size_t pos; if ((pos = fontname.rfind('/')) != std::string::npos) fontname = fontname.substr(pos+1); if ((pos = fontname.rfind('.')) != std::string::npos) fontname = fontname.substr(0, pos); Message::mstream(false, Message::MC_STATE) << "tracing glyphs of " << fontname << '\n'; _traced = true; } } void endChar (uint8_t c) override { std::ostringstream oss; oss << '['; if (isprint(c)) oss << c; else oss << '#' << unsigned(c); oss << ']'; Message::mstream(false, Message::MC_TRACING) << oss.str(); } void setFont (const std::string &fname) override { if (_sfmsg && fname != _fname) { _fname = fname; _traced = false; } } private: std::string _fname; bool _sfmsg, _autonl; bool _traced; ///< true if a glyph of the current font has already been traced? }; #endif dvisvgm-2.8.1/src/FileSystem.cpp0000664000175000017500000002271713510660062013513 00000000000000/************************************************************************* ** FileSystem.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "FileSystem.hpp" #include "utility.hpp" #include "version.hpp" #ifdef HAVE_UNISTD_H #include #endif using namespace std; #ifdef _WIN32 #include #include "windows.hpp" const char *FileSystem::DEVNULL = "nul"; const char FileSystem::PATHSEP = '\\'; #define unlink _unlink #else #include #include #include #include const char *FileSystem::DEVNULL = "/dev/null"; const char FileSystem::PATHSEP = '/'; #endif FileSystem FileSystem::_fs; string FileSystem::TMPDIR; const char *FileSystem::TMPSUBDIR = nullptr; /** Private wrapper function for mkdir: creates a single folder. * @param[in] dir folder name * @return true on success */ static bool s_mkdir (const string &dirname) { bool success = true; if (!FileSystem::exists(dirname)) { #ifdef _WIN32 success = (_mkdir(dirname.c_str()) == 0); #else success = (::mkdir(dirname.c_str(), 0775) == 0); #endif } return success; } static bool inline s_rmdir (const string &dirname) { #ifdef _WIN32 return (_rmdir(dirname.c_str()) == 0); #else return (::rmdir(dirname.c_str()) == 0); #endif } FileSystem::~FileSystem () { // remove the subdirectory from the system's temp folder (if empty) if (TMPSUBDIR) s_rmdir(tmpdir()); } bool FileSystem::remove (const string &fname) { return unlink(fname.c_str()) == 0; } /** Copies a file. * @param[in] src path of file to copy * @param[in] dest path of target file * @param[in] remove_src remove file 'src' if true * @return true on success */ bool FileSystem::copy (const string &src, const string &dest, bool remove_src) { ifstream ifs(src, ios::in|ios::binary); ofstream ofs(dest, ios::out|ios::binary); if (ifs && ofs) { ofs << ifs.rdbuf(); if (!ifs.fail() && !ofs.fail() && remove_src) { ofs.close(); ifs.close(); return remove(src); } else return !remove_src; } return false; } bool FileSystem::rename (const string &oldname, const string &newname) { return ::rename(oldname.c_str(), newname.c_str()) == 0; } uint64_t FileSystem::filesize (const string &fname) { #ifdef _WIN32 // unfortunately, stat doesn't work properly under Windows // so we have to use this freaky code WIN32_FILE_ATTRIBUTE_DATA attr; GetFileAttributesExA(fname.c_str(), GetFileExInfoStandard, &attr); return (static_cast(attr.nFileSizeHigh) << (8*sizeof(attr.nFileSizeLow))) | attr.nFileSizeLow; #else struct stat attr; return (stat(fname.c_str(), &attr) == 0) ? attr.st_size : 0; #endif } string FileSystem::adaptPathSeperators (string path) { std::replace(path.begin(), path.end(), PATHSEP, '/'); return path; } string FileSystem::getcwd () { char buf[1024]; #ifdef _WIN32 return adaptPathSeperators(_getcwd(buf, 1024)); #else return ::getcwd(buf, 1024); #endif } /** Changes the work directory. * @param[in] dir path to new work directory * @return true on success */ bool FileSystem::chdir (const std::string &dirname) { bool success = false; if (const char *cdirname = dirname.c_str()) { #ifdef _WIN32 success = (_chdir(cdirname) == 0); #else success = (::chdir(cdirname) == 0); #endif } return success; } /** Returns the user's home directory. */ const char* FileSystem::userdir () { #ifdef _WIN32 const char *drive=getenv("HOMEDRIVE"); const char *path=getenv("HOMEPATH"); if (drive && path) { static string ret = string(drive)+path; if (!ret.empty()) return ret.c_str(); } return nullptr; #else const char *dir=getenv("HOME"); if (!dir) { if (const char *user=getenv("USER")) { if (struct passwd *pw=getpwnam(user)) dir = pw->pw_dir; } } return dir; #endif } /** Returns the path of the temporary folder. */ string FileSystem::tmpdir () { string ret; if (!TMPDIR.empty()) ret = TMPDIR; else { #ifdef _WIN32 char buf[MAX_PATH]; if (GetTempPath(MAX_PATH, buf)) ret = adaptPathSeperators(buf); else ret = "."; #else if (const char *path = getenv("TMPDIR")) ret = path; else ret = "/tmp"; #endif if (ret.back() == '/') ret.pop_back(); static bool initialized=false; if (!initialized && ret != ".") { TMPSUBDIR = PROGRAM_NAME; s_mkdir(ret + "/" + TMPSUBDIR); initialized = true; } if (TMPSUBDIR) ret += string("/") + TMPSUBDIR; } if (!ret.empty() && ret.back() != '/') ret += '/'; return ret; } /** Creates a new folder relative to the current work directory. If necessary, * the parent folders are also created. * @param[in] dir single folder name or path to folder * @return true if folder(s) could be created */ bool FileSystem::mkdir (const string &dirname) { bool success = false; if (const char *cdirname = dirname.c_str()) { success = true; const string dirstr = adaptPathSeperators(util::trim(cdirname)); for (size_t pos=1; success && (pos = dirstr.find('/', pos)) != string::npos; pos++) success &= s_mkdir(dirstr.substr(0, pos)); success &= s_mkdir(dirstr); } return success; } /** Removes a directory and its contents. * @param[in] dirname path to directory * @return true on success */ bool FileSystem::rmdir (const string &dirname) { bool ok = false; if (isDirectory(dirname)) { ok = true; #ifdef _WIN32 string pattern = dirname + "/*"; WIN32_FIND_DATA data; HANDLE h = FindFirstFile(pattern.c_str(), &data); bool ready = (h == INVALID_HANDLE_VALUE); while (!ready && ok) { const char *fname = data.cFileName; string path = dirname + "/" + fname; if (isDirectory(path)) { if (strcmp(fname, ".") != 0 && strcmp(fname, "..") != 0) ok = rmdir(path) && s_rmdir(path); } else if (isFile(path)) ok = remove(path); else ok = false; ready = !FindNextFile(h, &data); } FindClose(h); #else if (DIR *dir = opendir(dirname.c_str())) { struct dirent *ent; while ((ent = readdir(dir)) && ok) { const char *fname = ent->d_name; string path = dirname + "/" + fname; if (isDirectory(path)) { if (strcmp(fname, ".") != 0 && strcmp(fname, "..") != 0) ok = rmdir(path) && s_rmdir(path); } else if (isFile(path)) ok = remove(path); else ok = false; } closedir(dir); } #endif ok = s_rmdir(dirname); } return ok; } /** Checks if a file or directory exits. */ bool FileSystem::exists (const string &fname) { if (const char *cfname = fname.c_str()) { #ifdef _WIN32 return GetFileAttributes(cfname) != INVALID_FILE_ATTRIBUTES; #else struct stat attr; return stat(cfname, &attr) == 0; #endif } return false; } /** Returns true if 'fname' references a directory. */ bool FileSystem::isDirectory (const string &fname) { if (const char *cfname = fname.c_str()) { #ifdef _WIN32 auto attr = GetFileAttributes(cfname); return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY); #else struct stat attr; return stat(cfname, &attr) == 0 && S_ISDIR(attr.st_mode); #endif } return false; } /** Returns true if 'fname' references a file. */ bool FileSystem::isFile (const string &fname) { if (const char *cfname = fname.c_str()) { #ifdef _WIN32 ifstream ifs(cfname); return (bool)ifs; #else struct stat attr; return stat(cfname, &attr) == 0 && S_ISREG(attr.st_mode); #endif } return false; } int FileSystem::collect (const std::string &dirname, vector &entries) { entries.clear(); #ifdef _WIN32 string pattern = dirname + "/*"; WIN32_FIND_DATA data; HANDLE h = FindFirstFile(pattern.c_str(), &data); bool ready = (h == INVALID_HANDLE_VALUE); while (!ready) { string fname = data.cFileName; string path = dirname+"/"+fname; string typechar = isFile(path) ? "f" : isDirectory(path) ? "d" : "?"; if (fname != "." && fname != "..") entries.emplace_back(typechar+fname); ready = !FindNextFile(h, &data); } FindClose(h); #else if (DIR *dir = opendir(dirname.c_str())) { struct dirent *ent; while ((ent = readdir(dir))) { string fname = ent->d_name; string path = dirname+"/"+fname; string typechar = isFile(path) ? "f" : isDirectory(path) ? "d" : "?"; if (fname != "." && fname != "..") entries.emplace_back(typechar+fname); } closedir(dir); } #endif return entries.size(); } dvisvgm-2.8.1/src/Makefile.in0000664000175000017500000016452613563265577013021 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = dvisvgm$(EXEEXT) @HAVE_BROTLI_FALSE@am__append_1 = -I$(dvisvgm_srcdir)/libs/brotli/include @HAVE_BROTLI_FALSE@am__append_2 = ../libs/brotli/libbrotli.a @HAVE_WOFF2_FALSE@am__append_3 = -I$(dvisvgm_srcdir)/libs/woff2/include @HAVE_WOFF2_FALSE@am__append_4 = ../libs/woff2/libwoff2.a @ENABLE_WOFF_TRUE@am__append_5 = \ @ENABLE_WOFF_TRUE@ ../libs/ff-woff/libfontforge.a \ @ENABLE_WOFF_TRUE@ $(WOFF2_LIBS) \ @ENABLE_WOFF_TRUE@ $(BROTLI_LIBS) @USE_BUNDLED_MD5_TRUE@am__append_6 = ../libs/md5/libmd5.a @USE_BUNDLED_MD5_FALSE@am__append_7 = $(LIBCRYPTO_LIBS) @ENABLE_WOFF_TRUE@am__append_8 = ffwrapper.c ffwrapper.h @ENABLE_WOFF_TRUE@am__append_9 = \ @ENABLE_WOFF_TRUE@ -I$(dvisvgm_srcdir)/libs/ff-woff/fontforge \ @ENABLE_WOFF_TRUE@ -I$(dvisvgm_srcdir)/libs/ff-woff/inc @ENABLE_WOFF_TRUE@am__append_10 = $(TTFAUTOHINT_CFLAGS) \ @ENABLE_WOFF_TRUE@ $(BROTLI_CFLAGS) $(WOFF2_CFLAGS) @ENABLE_WOFF_TRUE@@USE_BUNDLED_MD5_TRUE@am__append_11 = -I$(dvisvgm_srcdir)/libs/md5 @ENABLE_WOFF_TRUE@@USE_BUNDLED_MD5_FALSE@am__append_12 = $(LIBCRYPTO_CFLAGS) @ENABLE_WOFF_TRUE@am__append_13 = $(TTFAUTOHINT_LIBS) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.hpp CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) LTLIBRARIES = $(noinst_LTLIBRARIES) libdvisvgm_la_DEPENDENCIES = optimizer/liboptimizer.la am__libdvisvgm_la_SOURCES_DIST = AGLTable.hpp BasicDVIReader.hpp \ BasicDVIReader.cpp Bezier.hpp Bezier.cpp \ BgColorSpecialHandler.hpp BgColorSpecialHandler.cpp Bitmap.hpp \ Bitmap.cpp BoundingBox.hpp BoundingBox.cpp Calculator.hpp \ Calculator.cpp Character.hpp CharMapID.hpp CharMapID.cpp \ CLCommandLine.hpp CLCommandLine.cpp CMap.hpp CMap.cpp \ CMapManager.hpp CMapManager.cpp CMapReader.hpp CMapReader.cpp \ CLOption.hpp Color.hpp Color.cpp ColorSpecialHandler.hpp \ ColorSpecialHandler.cpp CommandLine.hpp Directory.hpp \ Directory.cpp DVIActions.hpp DLLoader.hpp DLLoader.cpp \ DVIReader.hpp DVIReader.cpp DvisvgmSpecialHandler.hpp \ DvisvgmSpecialHandler.cpp DVIToSVG.hpp DVIToSVG.cpp \ DVIToSVGActions.hpp DVIToSVGActions.cpp EllipticalArc.hpp \ EllipticalArc.cpp EmSpecialHandler.hpp EmSpecialHandler.cpp \ EncFile.hpp EncFile.cpp EPSFile.hpp EPSFile.cpp EPSToSVG.hpp \ FileFinder.hpp FileFinder.cpp FilePath.hpp FilePath.cpp \ FileSystem.hpp FileSystem.cpp FixWord.hpp Font.hpp Font.cpp \ FontCache.hpp FontCache.cpp FontEncoding.hpp FontEncoding.cpp \ FontEngine.hpp FontEngine.cpp FontManager.hpp FontManager.cpp \ FontMap.hpp FontMap.cpp FontMetrics.hpp FontMetrics.cpp \ FontStyle.hpp FontWriter.hpp FontWriter.cpp GFGlyphTracer.hpp \ GFGlyphTracer.cpp GFReader.hpp GFReader.cpp GFTracer.hpp \ GFTracer.cpp Ghostscript.hpp Ghostscript.cpp Glyph.hpp \ GlyphTracerMessages.hpp GraphicsPath.hpp HashFunction.hpp \ HashFunction.cpp HtmlSpecialHandler.hpp HtmlSpecialHandler.cpp \ HyperlinkManager.hpp HyperlinkManager.cpp ImageToSVG.hpp \ ImageToSVG.cpp InputBuffer.hpp InputBuffer.cpp InputReader.hpp \ InputReader.cpp JFM.hpp JFM.cpp Length.hpp Length.cpp \ macros.hpp MapLine.hpp MapLine.cpp Matrix.hpp Matrix.cpp \ MD5HashFunction.hpp Message.hpp Message.cpp \ MessageException.hpp MetafontWrapper.hpp MetafontWrapper.cpp \ NoPsSpecialHandler.hpp NoPsSpecialHandler.cpp \ NumericRanges.hpp PageRanges.hpp PageRanges.cpp PageSize.hpp \ PageSize.cpp Pair.hpp PapersizeSpecialHandler.hpp \ PapersizeSpecialHandler.cpp PathClipper.hpp PathClipper.cpp \ PDFParser.hpp PDFParser.cpp PdfSpecialHandler.hpp \ PdfSpecialHandler.cpp PDFToSVG.hpp PreScanDVIReader.hpp \ PreScanDVIReader.cpp Process.hpp Process.cpp psdefs.cpp \ PSFilter.hpp PSInterpreter.hpp PSInterpreter.cpp PSPattern.hpp \ PSPattern.cpp PSPreviewFilter.hpp PSPreviewFilter.cpp \ PsSpecialHandler.hpp PsSpecialHandler.cpp RangeMap.hpp \ RangeMap.cpp ShadingPatch.hpp ShadingPatch.cpp \ SignalHandler.hpp SignalHandler.cpp SourceInput.hpp \ SourceInput.cpp SpecialActions.hpp SpecialHandler.hpp \ SpecialManager.hpp SpecialManager.cpp StreamReader.hpp \ StreamReader.cpp StreamWriter.hpp StreamWriter.cpp Subfont.hpp \ Subfont.cpp SVGCharHandler.hpp SVGCharHandler.cpp \ SVGCharHandlerFactory.hpp SVGCharHandlerFactory.cpp \ SVGCharPathHandler.hpp SVGCharPathHandler.cpp \ SVGCharTspanTextHandler.hpp SVGCharTspanTextHandler.cpp \ SVGOutput.hpp SVGOutput.cpp SVGSingleCharTextHandler.hpp \ SVGSingleCharTextHandler.cpp SVGTree.hpp SVGTree.cpp \ System.hpp System.cpp TensorProductPatch.hpp \ TensorProductPatch.cpp Terminal.hpp Terminal.cpp TFM.hpp \ TFM.cpp ToUnicodeMap.hpp ToUnicodeMap.cpp \ TpicSpecialHandler.hpp TpicSpecialHandler.cpp \ TriangularPatch.hpp TriangularPatch.cpp TrueTypeFont.hpp \ TrueTypeFont.cpp TTFAutohint.hpp TTFAutohint.cpp Unicode.hpp \ Unicode.cpp utility.hpp utility.cpp VectorIterator.hpp \ VectorStream.hpp VFActions.hpp VFReader.hpp VFReader.cpp \ windows.hpp XMLDocument.hpp XMLDocument.cpp XMLNode.hpp \ XMLNode.cpp XMLString.hpp XMLString.cpp XXHashFunction.hpp \ ZLibOutputStream.hpp ffwrapper.c ffwrapper.h @ENABLE_WOFF_TRUE@am__objects_1 = ffwrapper.lo am_libdvisvgm_la_OBJECTS = BasicDVIReader.lo Bezier.lo \ BgColorSpecialHandler.lo Bitmap.lo BoundingBox.lo \ Calculator.lo CharMapID.lo CLCommandLine.lo CMap.lo \ CMapManager.lo CMapReader.lo Color.lo ColorSpecialHandler.lo \ Directory.lo DLLoader.lo DVIReader.lo DvisvgmSpecialHandler.lo \ DVIToSVG.lo DVIToSVGActions.lo EllipticalArc.lo \ EmSpecialHandler.lo EncFile.lo EPSFile.lo FileFinder.lo \ FilePath.lo FileSystem.lo Font.lo FontCache.lo FontEncoding.lo \ FontEngine.lo FontManager.lo FontMap.lo FontMetrics.lo \ FontWriter.lo GFGlyphTracer.lo GFReader.lo GFTracer.lo \ Ghostscript.lo HashFunction.lo HtmlSpecialHandler.lo \ HyperlinkManager.lo ImageToSVG.lo InputBuffer.lo \ InputReader.lo JFM.lo Length.lo MapLine.lo Matrix.lo \ Message.lo MetafontWrapper.lo NoPsSpecialHandler.lo \ PageRanges.lo PageSize.lo PapersizeSpecialHandler.lo \ PathClipper.lo PDFParser.lo PdfSpecialHandler.lo \ PreScanDVIReader.lo Process.lo psdefs.lo PSInterpreter.lo \ PSPattern.lo PSPreviewFilter.lo PsSpecialHandler.lo \ RangeMap.lo ShadingPatch.lo SignalHandler.lo SourceInput.lo \ SpecialManager.lo StreamReader.lo StreamWriter.lo Subfont.lo \ SVGCharHandler.lo SVGCharHandlerFactory.lo \ SVGCharPathHandler.lo SVGCharTspanTextHandler.lo SVGOutput.lo \ SVGSingleCharTextHandler.lo SVGTree.lo System.lo \ TensorProductPatch.lo Terminal.lo TFM.lo ToUnicodeMap.lo \ TpicSpecialHandler.lo TriangularPatch.lo TrueTypeFont.lo \ TTFAutohint.lo Unicode.lo utility.lo VFReader.lo \ XMLDocument.lo XMLNode.lo XMLString.lo $(am__objects_1) libdvisvgm_la_OBJECTS = $(am_libdvisvgm_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am_dvisvgm_OBJECTS = dvisvgm.$(OBJEXT) dvisvgm_OBJECTS = $(am_dvisvgm_OBJECTS) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(am__append_4) am__DEPENDENCIES_3 = $(am__append_2) @ENABLE_WOFF_TRUE@am__DEPENDENCIES_4 = ../libs/ff-woff/libfontforge.a \ @ENABLE_WOFF_TRUE@ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) @USE_BUNDLED_MD5_FALSE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/BasicDVIReader.Plo \ ./$(DEPDIR)/Bezier.Plo ./$(DEPDIR)/BgColorSpecialHandler.Plo \ ./$(DEPDIR)/Bitmap.Plo ./$(DEPDIR)/BoundingBox.Plo \ ./$(DEPDIR)/CLCommandLine.Plo ./$(DEPDIR)/CMap.Plo \ ./$(DEPDIR)/CMapManager.Plo ./$(DEPDIR)/CMapReader.Plo \ ./$(DEPDIR)/Calculator.Plo ./$(DEPDIR)/CharMapID.Plo \ ./$(DEPDIR)/Color.Plo ./$(DEPDIR)/ColorSpecialHandler.Plo \ ./$(DEPDIR)/DLLoader.Plo ./$(DEPDIR)/DVIReader.Plo \ ./$(DEPDIR)/DVIToSVG.Plo ./$(DEPDIR)/DVIToSVGActions.Plo \ ./$(DEPDIR)/Directory.Plo \ ./$(DEPDIR)/DvisvgmSpecialHandler.Plo ./$(DEPDIR)/EPSFile.Plo \ ./$(DEPDIR)/EllipticalArc.Plo ./$(DEPDIR)/EmSpecialHandler.Plo \ ./$(DEPDIR)/EncFile.Plo ./$(DEPDIR)/FileFinder.Plo \ ./$(DEPDIR)/FilePath.Plo ./$(DEPDIR)/FileSystem.Plo \ ./$(DEPDIR)/Font.Plo ./$(DEPDIR)/FontCache.Plo \ ./$(DEPDIR)/FontEncoding.Plo ./$(DEPDIR)/FontEngine.Plo \ ./$(DEPDIR)/FontManager.Plo ./$(DEPDIR)/FontMap.Plo \ ./$(DEPDIR)/FontMetrics.Plo ./$(DEPDIR)/FontWriter.Plo \ ./$(DEPDIR)/GFGlyphTracer.Plo ./$(DEPDIR)/GFReader.Plo \ ./$(DEPDIR)/GFTracer.Plo ./$(DEPDIR)/Ghostscript.Plo \ ./$(DEPDIR)/HashFunction.Plo \ ./$(DEPDIR)/HtmlSpecialHandler.Plo \ ./$(DEPDIR)/HyperlinkManager.Plo ./$(DEPDIR)/ImageToSVG.Plo \ ./$(DEPDIR)/InputBuffer.Plo ./$(DEPDIR)/InputReader.Plo \ ./$(DEPDIR)/JFM.Plo ./$(DEPDIR)/Length.Plo \ ./$(DEPDIR)/MapLine.Plo ./$(DEPDIR)/Matrix.Plo \ ./$(DEPDIR)/Message.Plo ./$(DEPDIR)/MetafontWrapper.Plo \ ./$(DEPDIR)/NoPsSpecialHandler.Plo ./$(DEPDIR)/PDFParser.Plo \ ./$(DEPDIR)/PSInterpreter.Plo ./$(DEPDIR)/PSPattern.Plo \ ./$(DEPDIR)/PSPreviewFilter.Plo ./$(DEPDIR)/PageRanges.Plo \ ./$(DEPDIR)/PageSize.Plo \ ./$(DEPDIR)/PapersizeSpecialHandler.Plo \ ./$(DEPDIR)/PathClipper.Plo ./$(DEPDIR)/PdfSpecialHandler.Plo \ ./$(DEPDIR)/PreScanDVIReader.Plo ./$(DEPDIR)/Process.Plo \ ./$(DEPDIR)/PsSpecialHandler.Plo ./$(DEPDIR)/RangeMap.Plo \ ./$(DEPDIR)/SVGCharHandler.Plo \ ./$(DEPDIR)/SVGCharHandlerFactory.Plo \ ./$(DEPDIR)/SVGCharPathHandler.Plo \ ./$(DEPDIR)/SVGCharTspanTextHandler.Plo \ ./$(DEPDIR)/SVGOutput.Plo \ ./$(DEPDIR)/SVGSingleCharTextHandler.Plo \ ./$(DEPDIR)/SVGTree.Plo ./$(DEPDIR)/ShadingPatch.Plo \ ./$(DEPDIR)/SignalHandler.Plo ./$(DEPDIR)/SourceInput.Plo \ ./$(DEPDIR)/SpecialManager.Plo ./$(DEPDIR)/StreamReader.Plo \ ./$(DEPDIR)/StreamWriter.Plo ./$(DEPDIR)/Subfont.Plo \ ./$(DEPDIR)/System.Plo ./$(DEPDIR)/TFM.Plo \ ./$(DEPDIR)/TTFAutohint.Plo ./$(DEPDIR)/TensorProductPatch.Plo \ ./$(DEPDIR)/Terminal.Plo ./$(DEPDIR)/ToUnicodeMap.Plo \ ./$(DEPDIR)/TpicSpecialHandler.Plo \ ./$(DEPDIR)/TriangularPatch.Plo ./$(DEPDIR)/TrueTypeFont.Plo \ ./$(DEPDIR)/Unicode.Plo ./$(DEPDIR)/VFReader.Plo \ ./$(DEPDIR)/XMLDocument.Plo ./$(DEPDIR)/XMLNode.Plo \ ./$(DEPDIR)/XMLString.Plo ./$(DEPDIR)/dvisvgm.Po \ ./$(DEPDIR)/ffwrapper.Plo ./$(DEPDIR)/psdefs.Plo \ ./$(DEPDIR)/utility.Plo am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libdvisvgm_la_SOURCES) $(dvisvgm_SOURCES) DIST_SOURCES = $(am__libdvisvgm_la_SOURCES_DIST) $(dvisvgm_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/../libs/defs.am $(srcdir)/Makefile.in \ $(srcdir)/version.hpp.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = $(KPSE_LIBS) $(CODE_COVERAGE_LDFLAGS) $(am__append_13) AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ $(am__append_1) BROTLI_LIBS = @BROTLI_LIBS@ $(am__append_2) CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ $(am__append_3) WOFF2_LIBS = @WOFF2_LIBS@ $(am__append_4) XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libdvisvgm.la SUBDIRS = optimizer dvisvgm_SOURCES = \ CommandLine.hpp \ dvisvgm.cpp @HAVE_POTRACE_FALSE@POTRACE_CFLAGS = -I$(dvisvgm_srcdir)/libs/potrace @HAVE_POTRACE_FALSE@POTRACE_LIBS = ../libs/potrace/libpotrace.a @HAVE_XXHASH_FALSE@XXHASH_CFLAGS = -I$(dvisvgm_srcdir)/libs/xxHash @HAVE_XXHASH_FALSE@XXHASH_LIBS = ../libs/xxHash/libxxhash.a dvisvgm_LDADD = $(noinst_LTLIBRARIES) ../libs/clipper/libclipper.a \ $(FREETYPE_LIBS) $(FONTFORGE_LIBS) $(POTRACE_LIBS) \ $(XXHASH_LIBS) $(ZLIB_LIBS) $(am__append_5) $(am__append_6) \ $(am__append_7) dvisvgm_DEPENDENCIES = $(noinst_LTLIBRARIES) libdvisvgm_la_SOURCES = AGLTable.hpp BasicDVIReader.hpp \ BasicDVIReader.cpp Bezier.hpp Bezier.cpp \ BgColorSpecialHandler.hpp BgColorSpecialHandler.cpp Bitmap.hpp \ Bitmap.cpp BoundingBox.hpp BoundingBox.cpp Calculator.hpp \ Calculator.cpp Character.hpp CharMapID.hpp CharMapID.cpp \ CLCommandLine.hpp CLCommandLine.cpp CMap.hpp CMap.cpp \ CMapManager.hpp CMapManager.cpp CMapReader.hpp CMapReader.cpp \ CLOption.hpp Color.hpp Color.cpp ColorSpecialHandler.hpp \ ColorSpecialHandler.cpp CommandLine.hpp Directory.hpp \ Directory.cpp DVIActions.hpp DLLoader.hpp DLLoader.cpp \ DVIReader.hpp DVIReader.cpp DvisvgmSpecialHandler.hpp \ DvisvgmSpecialHandler.cpp DVIToSVG.hpp DVIToSVG.cpp \ DVIToSVGActions.hpp DVIToSVGActions.cpp EllipticalArc.hpp \ EllipticalArc.cpp EmSpecialHandler.hpp EmSpecialHandler.cpp \ EncFile.hpp EncFile.cpp EPSFile.hpp EPSFile.cpp EPSToSVG.hpp \ FileFinder.hpp FileFinder.cpp FilePath.hpp FilePath.cpp \ FileSystem.hpp FileSystem.cpp FixWord.hpp Font.hpp Font.cpp \ FontCache.hpp FontCache.cpp FontEncoding.hpp FontEncoding.cpp \ FontEngine.hpp FontEngine.cpp FontManager.hpp FontManager.cpp \ FontMap.hpp FontMap.cpp FontMetrics.hpp FontMetrics.cpp \ FontStyle.hpp FontWriter.hpp FontWriter.cpp GFGlyphTracer.hpp \ GFGlyphTracer.cpp GFReader.hpp GFReader.cpp GFTracer.hpp \ GFTracer.cpp Ghostscript.hpp Ghostscript.cpp Glyph.hpp \ GlyphTracerMessages.hpp GraphicsPath.hpp HashFunction.hpp \ HashFunction.cpp HtmlSpecialHandler.hpp HtmlSpecialHandler.cpp \ HyperlinkManager.hpp HyperlinkManager.cpp ImageToSVG.hpp \ ImageToSVG.cpp InputBuffer.hpp InputBuffer.cpp InputReader.hpp \ InputReader.cpp JFM.hpp JFM.cpp Length.hpp Length.cpp \ macros.hpp MapLine.hpp MapLine.cpp Matrix.hpp Matrix.cpp \ MD5HashFunction.hpp Message.hpp Message.cpp \ MessageException.hpp MetafontWrapper.hpp MetafontWrapper.cpp \ NoPsSpecialHandler.hpp NoPsSpecialHandler.cpp \ NumericRanges.hpp PageRanges.hpp PageRanges.cpp PageSize.hpp \ PageSize.cpp Pair.hpp PapersizeSpecialHandler.hpp \ PapersizeSpecialHandler.cpp PathClipper.hpp PathClipper.cpp \ PDFParser.hpp PDFParser.cpp PdfSpecialHandler.hpp \ PdfSpecialHandler.cpp PDFToSVG.hpp PreScanDVIReader.hpp \ PreScanDVIReader.cpp Process.hpp Process.cpp psdefs.cpp \ PSFilter.hpp PSInterpreter.hpp PSInterpreter.cpp PSPattern.hpp \ PSPattern.cpp PSPreviewFilter.hpp PSPreviewFilter.cpp \ PsSpecialHandler.hpp PsSpecialHandler.cpp RangeMap.hpp \ RangeMap.cpp ShadingPatch.hpp ShadingPatch.cpp \ SignalHandler.hpp SignalHandler.cpp SourceInput.hpp \ SourceInput.cpp SpecialActions.hpp SpecialHandler.hpp \ SpecialManager.hpp SpecialManager.cpp StreamReader.hpp \ StreamReader.cpp StreamWriter.hpp StreamWriter.cpp Subfont.hpp \ Subfont.cpp SVGCharHandler.hpp SVGCharHandler.cpp \ SVGCharHandlerFactory.hpp SVGCharHandlerFactory.cpp \ SVGCharPathHandler.hpp SVGCharPathHandler.cpp \ SVGCharTspanTextHandler.hpp SVGCharTspanTextHandler.cpp \ SVGOutput.hpp SVGOutput.cpp SVGSingleCharTextHandler.hpp \ SVGSingleCharTextHandler.cpp SVGTree.hpp SVGTree.cpp \ System.hpp System.cpp TensorProductPatch.hpp \ TensorProductPatch.cpp Terminal.hpp Terminal.cpp TFM.hpp \ TFM.cpp ToUnicodeMap.hpp ToUnicodeMap.cpp \ TpicSpecialHandler.hpp TpicSpecialHandler.cpp \ TriangularPatch.hpp TriangularPatch.cpp TrueTypeFont.hpp \ TrueTypeFont.cpp TTFAutohint.hpp TTFAutohint.cpp Unicode.hpp \ Unicode.cpp utility.hpp utility.cpp VectorIterator.hpp \ VectorStream.hpp VFActions.hpp VFReader.hpp VFReader.cpp \ windows.hpp XMLDocument.hpp XMLDocument.cpp XMLNode.hpp \ XMLNode.cpp XMLString.hpp XMLString.cpp XXHashFunction.hpp \ ZLibOutputStream.hpp $(am__append_8) libdvisvgm_la_LIBADD = optimizer/liboptimizer.la EXTRA_DIST = options.xml options.dtd iapi.h ierrors.h MiKTeXCom.hpp MiKTeXCom.cpp AM_CFLAGS = -Wall $(ZLIB_CFLAGS) $(CODE_COVERAGE_CFLAGS) \ $(am__append_9) AM_CXXFLAGS = -Wall -Wnon-virtual-dtor \ -I$(dvisvgm_srcdir)/libs/clipper \ -I$(dvisvgm_srcdir)/libs/variant/include $(KPSE_CFLAGS) \ $(FREETYPE_CFLAGS) $(ZLIB_CFLAGS) $(CODE_COVERAGE_CFLAGS) \ $(POTRACE_CFLAGS) $(XXHASH_CFLAGS) $(am__append_10) \ $(am__append_11) $(am__append_12) CLEANFILES = *.gcda *.gcno all: all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../libs/defs.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../libs/defs.am $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): version.hpp: $(top_builddir)/config.status $(srcdir)/version.hpp.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libdvisvgm.la: $(libdvisvgm_la_OBJECTS) $(libdvisvgm_la_DEPENDENCIES) $(EXTRA_libdvisvgm_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libdvisvgm_la_OBJECTS) $(libdvisvgm_la_LIBADD) $(LIBS) dvisvgm$(EXEEXT): $(dvisvgm_OBJECTS) $(dvisvgm_DEPENDENCIES) $(EXTRA_dvisvgm_DEPENDENCIES) @rm -f dvisvgm$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(dvisvgm_OBJECTS) $(dvisvgm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BasicDVIReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bezier.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BgColorSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bitmap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BoundingBox.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CLCommandLine.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMapManager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMapReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Calculator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CharMapID.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Color.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DLLoader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DVIReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DVIToSVG.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DVIToSVGActions.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Directory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DvisvgmSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EPSFile.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EllipticalArc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EmSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EncFile.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileFinder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FilePath.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileSystem.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Font.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontCache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontEncoding.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontEngine.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontManager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontMap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontMetrics.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontWriter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GFGlyphTracer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GFReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GFTracer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Ghostscript.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HashFunction.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HtmlSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HyperlinkManager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ImageToSVG.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InputBuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/InputReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JFM.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Length.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MapLine.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Matrix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Message.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetafontWrapper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NoPsSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFParser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSInterpreter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSPattern.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSPreviewFilter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageRanges.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageSize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PapersizeSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PathClipper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PdfSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PreScanDVIReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Process.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PsSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RangeMap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharHandlerFactory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharPathHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGCharTspanTextHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGOutput.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGSingleCharTextHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGTree.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShadingPatch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SignalHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SourceInput.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SpecialManager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamWriter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Subfont.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/System.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TFM.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TTFAutohint.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TensorProductPatch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Terminal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ToUnicodeMap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TpicSpecialHandler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TriangularPatch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrueTypeFont.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Unicode.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VFReader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMLDocument.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMLNode.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMLString.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dvisvgm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffwrapper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psdefs.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utility.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/BasicDVIReader.Plo -rm -f ./$(DEPDIR)/Bezier.Plo -rm -f ./$(DEPDIR)/BgColorSpecialHandler.Plo -rm -f ./$(DEPDIR)/Bitmap.Plo -rm -f ./$(DEPDIR)/BoundingBox.Plo -rm -f ./$(DEPDIR)/CLCommandLine.Plo -rm -f ./$(DEPDIR)/CMap.Plo -rm -f ./$(DEPDIR)/CMapManager.Plo -rm -f ./$(DEPDIR)/CMapReader.Plo -rm -f ./$(DEPDIR)/Calculator.Plo -rm -f ./$(DEPDIR)/CharMapID.Plo -rm -f ./$(DEPDIR)/Color.Plo -rm -f ./$(DEPDIR)/ColorSpecialHandler.Plo -rm -f ./$(DEPDIR)/DLLoader.Plo -rm -f ./$(DEPDIR)/DVIReader.Plo -rm -f ./$(DEPDIR)/DVIToSVG.Plo -rm -f ./$(DEPDIR)/DVIToSVGActions.Plo -rm -f ./$(DEPDIR)/Directory.Plo -rm -f ./$(DEPDIR)/DvisvgmSpecialHandler.Plo -rm -f ./$(DEPDIR)/EPSFile.Plo -rm -f ./$(DEPDIR)/EllipticalArc.Plo -rm -f ./$(DEPDIR)/EmSpecialHandler.Plo -rm -f ./$(DEPDIR)/EncFile.Plo -rm -f ./$(DEPDIR)/FileFinder.Plo -rm -f ./$(DEPDIR)/FilePath.Plo -rm -f ./$(DEPDIR)/FileSystem.Plo -rm -f ./$(DEPDIR)/Font.Plo -rm -f ./$(DEPDIR)/FontCache.Plo -rm -f ./$(DEPDIR)/FontEncoding.Plo -rm -f ./$(DEPDIR)/FontEngine.Plo -rm -f ./$(DEPDIR)/FontManager.Plo -rm -f ./$(DEPDIR)/FontMap.Plo -rm -f ./$(DEPDIR)/FontMetrics.Plo -rm -f ./$(DEPDIR)/FontWriter.Plo -rm -f ./$(DEPDIR)/GFGlyphTracer.Plo -rm -f ./$(DEPDIR)/GFReader.Plo -rm -f ./$(DEPDIR)/GFTracer.Plo -rm -f ./$(DEPDIR)/Ghostscript.Plo -rm -f ./$(DEPDIR)/HashFunction.Plo -rm -f ./$(DEPDIR)/HtmlSpecialHandler.Plo -rm -f ./$(DEPDIR)/HyperlinkManager.Plo -rm -f ./$(DEPDIR)/ImageToSVG.Plo -rm -f ./$(DEPDIR)/InputBuffer.Plo -rm -f ./$(DEPDIR)/InputReader.Plo -rm -f ./$(DEPDIR)/JFM.Plo -rm -f ./$(DEPDIR)/Length.Plo -rm -f ./$(DEPDIR)/MapLine.Plo -rm -f ./$(DEPDIR)/Matrix.Plo -rm -f ./$(DEPDIR)/Message.Plo -rm -f ./$(DEPDIR)/MetafontWrapper.Plo -rm -f ./$(DEPDIR)/NoPsSpecialHandler.Plo -rm -f ./$(DEPDIR)/PDFParser.Plo -rm -f ./$(DEPDIR)/PSInterpreter.Plo -rm -f ./$(DEPDIR)/PSPattern.Plo -rm -f ./$(DEPDIR)/PSPreviewFilter.Plo -rm -f ./$(DEPDIR)/PageRanges.Plo -rm -f ./$(DEPDIR)/PageSize.Plo -rm -f ./$(DEPDIR)/PapersizeSpecialHandler.Plo -rm -f ./$(DEPDIR)/PathClipper.Plo -rm -f ./$(DEPDIR)/PdfSpecialHandler.Plo -rm -f ./$(DEPDIR)/PreScanDVIReader.Plo -rm -f ./$(DEPDIR)/Process.Plo -rm -f ./$(DEPDIR)/PsSpecialHandler.Plo -rm -f ./$(DEPDIR)/RangeMap.Plo -rm -f ./$(DEPDIR)/SVGCharHandler.Plo -rm -f ./$(DEPDIR)/SVGCharHandlerFactory.Plo -rm -f ./$(DEPDIR)/SVGCharPathHandler.Plo -rm -f ./$(DEPDIR)/SVGCharTspanTextHandler.Plo -rm -f ./$(DEPDIR)/SVGOutput.Plo -rm -f ./$(DEPDIR)/SVGSingleCharTextHandler.Plo -rm -f ./$(DEPDIR)/SVGTree.Plo -rm -f ./$(DEPDIR)/ShadingPatch.Plo -rm -f ./$(DEPDIR)/SignalHandler.Plo -rm -f ./$(DEPDIR)/SourceInput.Plo -rm -f ./$(DEPDIR)/SpecialManager.Plo -rm -f ./$(DEPDIR)/StreamReader.Plo -rm -f ./$(DEPDIR)/StreamWriter.Plo -rm -f ./$(DEPDIR)/Subfont.Plo -rm -f ./$(DEPDIR)/System.Plo -rm -f ./$(DEPDIR)/TFM.Plo -rm -f ./$(DEPDIR)/TTFAutohint.Plo -rm -f ./$(DEPDIR)/TensorProductPatch.Plo -rm -f ./$(DEPDIR)/Terminal.Plo -rm -f ./$(DEPDIR)/ToUnicodeMap.Plo -rm -f ./$(DEPDIR)/TpicSpecialHandler.Plo -rm -f ./$(DEPDIR)/TriangularPatch.Plo -rm -f ./$(DEPDIR)/TrueTypeFont.Plo -rm -f ./$(DEPDIR)/Unicode.Plo -rm -f ./$(DEPDIR)/VFReader.Plo -rm -f ./$(DEPDIR)/XMLDocument.Plo -rm -f ./$(DEPDIR)/XMLNode.Plo -rm -f ./$(DEPDIR)/XMLString.Plo -rm -f ./$(DEPDIR)/dvisvgm.Po -rm -f ./$(DEPDIR)/ffwrapper.Plo -rm -f ./$(DEPDIR)/psdefs.Plo -rm -f ./$(DEPDIR)/utility.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/BasicDVIReader.Plo -rm -f ./$(DEPDIR)/Bezier.Plo -rm -f ./$(DEPDIR)/BgColorSpecialHandler.Plo -rm -f ./$(DEPDIR)/Bitmap.Plo -rm -f ./$(DEPDIR)/BoundingBox.Plo -rm -f ./$(DEPDIR)/CLCommandLine.Plo -rm -f ./$(DEPDIR)/CMap.Plo -rm -f ./$(DEPDIR)/CMapManager.Plo -rm -f ./$(DEPDIR)/CMapReader.Plo -rm -f ./$(DEPDIR)/Calculator.Plo -rm -f ./$(DEPDIR)/CharMapID.Plo -rm -f ./$(DEPDIR)/Color.Plo -rm -f ./$(DEPDIR)/ColorSpecialHandler.Plo -rm -f ./$(DEPDIR)/DLLoader.Plo -rm -f ./$(DEPDIR)/DVIReader.Plo -rm -f ./$(DEPDIR)/DVIToSVG.Plo -rm -f ./$(DEPDIR)/DVIToSVGActions.Plo -rm -f ./$(DEPDIR)/Directory.Plo -rm -f ./$(DEPDIR)/DvisvgmSpecialHandler.Plo -rm -f ./$(DEPDIR)/EPSFile.Plo -rm -f ./$(DEPDIR)/EllipticalArc.Plo -rm -f ./$(DEPDIR)/EmSpecialHandler.Plo -rm -f ./$(DEPDIR)/EncFile.Plo -rm -f ./$(DEPDIR)/FileFinder.Plo -rm -f ./$(DEPDIR)/FilePath.Plo -rm -f ./$(DEPDIR)/FileSystem.Plo -rm -f ./$(DEPDIR)/Font.Plo -rm -f ./$(DEPDIR)/FontCache.Plo -rm -f ./$(DEPDIR)/FontEncoding.Plo -rm -f ./$(DEPDIR)/FontEngine.Plo -rm -f ./$(DEPDIR)/FontManager.Plo -rm -f ./$(DEPDIR)/FontMap.Plo -rm -f ./$(DEPDIR)/FontMetrics.Plo -rm -f ./$(DEPDIR)/FontWriter.Plo -rm -f ./$(DEPDIR)/GFGlyphTracer.Plo -rm -f ./$(DEPDIR)/GFReader.Plo -rm -f ./$(DEPDIR)/GFTracer.Plo -rm -f ./$(DEPDIR)/Ghostscript.Plo -rm -f ./$(DEPDIR)/HashFunction.Plo -rm -f ./$(DEPDIR)/HtmlSpecialHandler.Plo -rm -f ./$(DEPDIR)/HyperlinkManager.Plo -rm -f ./$(DEPDIR)/ImageToSVG.Plo -rm -f ./$(DEPDIR)/InputBuffer.Plo -rm -f ./$(DEPDIR)/InputReader.Plo -rm -f ./$(DEPDIR)/JFM.Plo -rm -f ./$(DEPDIR)/Length.Plo -rm -f ./$(DEPDIR)/MapLine.Plo -rm -f ./$(DEPDIR)/Matrix.Plo -rm -f ./$(DEPDIR)/Message.Plo -rm -f ./$(DEPDIR)/MetafontWrapper.Plo -rm -f ./$(DEPDIR)/NoPsSpecialHandler.Plo -rm -f ./$(DEPDIR)/PDFParser.Plo -rm -f ./$(DEPDIR)/PSInterpreter.Plo -rm -f ./$(DEPDIR)/PSPattern.Plo -rm -f ./$(DEPDIR)/PSPreviewFilter.Plo -rm -f ./$(DEPDIR)/PageRanges.Plo -rm -f ./$(DEPDIR)/PageSize.Plo -rm -f ./$(DEPDIR)/PapersizeSpecialHandler.Plo -rm -f ./$(DEPDIR)/PathClipper.Plo -rm -f ./$(DEPDIR)/PdfSpecialHandler.Plo -rm -f ./$(DEPDIR)/PreScanDVIReader.Plo -rm -f ./$(DEPDIR)/Process.Plo -rm -f ./$(DEPDIR)/PsSpecialHandler.Plo -rm -f ./$(DEPDIR)/RangeMap.Plo -rm -f ./$(DEPDIR)/SVGCharHandler.Plo -rm -f ./$(DEPDIR)/SVGCharHandlerFactory.Plo -rm -f ./$(DEPDIR)/SVGCharPathHandler.Plo -rm -f ./$(DEPDIR)/SVGCharTspanTextHandler.Plo -rm -f ./$(DEPDIR)/SVGOutput.Plo -rm -f ./$(DEPDIR)/SVGSingleCharTextHandler.Plo -rm -f ./$(DEPDIR)/SVGTree.Plo -rm -f ./$(DEPDIR)/ShadingPatch.Plo -rm -f ./$(DEPDIR)/SignalHandler.Plo -rm -f ./$(DEPDIR)/SourceInput.Plo -rm -f ./$(DEPDIR)/SpecialManager.Plo -rm -f ./$(DEPDIR)/StreamReader.Plo -rm -f ./$(DEPDIR)/StreamWriter.Plo -rm -f ./$(DEPDIR)/Subfont.Plo -rm -f ./$(DEPDIR)/System.Plo -rm -f ./$(DEPDIR)/TFM.Plo -rm -f ./$(DEPDIR)/TTFAutohint.Plo -rm -f ./$(DEPDIR)/TensorProductPatch.Plo -rm -f ./$(DEPDIR)/Terminal.Plo -rm -f ./$(DEPDIR)/ToUnicodeMap.Plo -rm -f ./$(DEPDIR)/TpicSpecialHandler.Plo -rm -f ./$(DEPDIR)/TriangularPatch.Plo -rm -f ./$(DEPDIR)/TrueTypeFont.Plo -rm -f ./$(DEPDIR)/Unicode.Plo -rm -f ./$(DEPDIR)/VFReader.Plo -rm -f ./$(DEPDIR)/XMLDocument.Plo -rm -f ./$(DEPDIR)/XMLNode.Plo -rm -f ./$(DEPDIR)/XMLString.Plo -rm -f ./$(DEPDIR)/dvisvgm.Po -rm -f ./$(DEPDIR)/ffwrapper.Plo -rm -f ./$(DEPDIR)/psdefs.Plo -rm -f ./$(DEPDIR)/utility.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool clean-noinstLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # the command-line parser class is generated from options.xml by opt2cpp $(srcdir)/CommandLine.hpp: options.xml rm -f $@ python $(srcdir)/opt2cpp.py $< >$@ # Create a C string definition containing the PostScript routines psdefs.ps needed by class PSInterpreter $(srcdir)/psdefs.cpp: psdefs.ps if test -f $<; then \ ps2c PSInterpreter::PSDEFS $< >$@; \ fi psdefs.ps: ; @CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/src/TriangularPatch.cpp0000664000175000017500000001774213536435625014536 00000000000000/************************************************************************* ** TriangularPatch.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "TriangularPatch.hpp" using namespace std; TriangularPatch::TriangularPatch (const PointVec &points, const ColorVec &colors, Color::ColorSpace cspace, int edgeflag, TriangularPatch *patch) : ShadingPatch(cspace) { setPoints(points, edgeflag, patch); setColors(colors, edgeflag, patch); } void TriangularPatch::setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) { auto triangularPatch = dynamic_cast(patch); if (edgeflag > 0 && !triangularPatch) throw ShadingException("missing preceding data in definition of triangular patch"); if ((edgeflag == 0 && points.size() != 3) || (edgeflag > 0 && points.size() != 1)) throw ShadingException("invalid number of vertices in triangular patch definition"); _points[0] = points[0]; switch (edgeflag) { case 0: _points[1] = points[1]; _points[2] = points[2]; break; case 1: _points[1] = triangularPatch->_points[1]; _points[2] = triangularPatch->_points[2]; break; case 2: _points[1] = triangularPatch->_points[2]; _points[2] = triangularPatch->_points[0]; } } void TriangularPatch::setPoints (const DPair &p1, const DPair &p2, const DPair &p3) { _points[0] = p1; _points[1] = p2; _points[2] = p3; } void TriangularPatch::setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) { auto triangularPatch = dynamic_cast(patch); if (edgeflag > 0 && !triangularPatch) throw ShadingException("missing preceding data in definition of triangular patch"); if ((edgeflag == 0 && colors.size() != 3) || (edgeflag > 0 && colors.size() != 1)) throw ShadingException("invalid number of colors in triangular patch definition"); _colors[0] = colors[0]; switch (edgeflag) { case 0: _colors[1] = colors[1]; _colors[2] = colors[2]; break; case 1: _colors[1] = triangularPatch->_colors[1]; _colors[2] = triangularPatch->_colors[2]; break; case 2: _colors[1] = triangularPatch->_colors[2]; _colors[2] = triangularPatch->_colors[0]; } } void TriangularPatch::setColors (const Color &c1, const Color &c2, const Color &c3) { _colors[0] = c1; _colors[1] = c2; _colors[2] = c3; } /** Returns the Cartesian coordinates for the barycentric coordinates \f$(u, v, 1-u-v)\f$ * of a point of the triangle, where \f$u, v \in [0,1]\f$ and \f$u+v \le 1\f$. * The relation between the vertices of the triangle and their barycentric coordinates * is as follows: \f$(1,0,0)=p_1, (0,1,0)=p_2, (0,0,1)=p_0\f$. */ DPair TriangularPatch::valueAt (double u, double v) const { return _points[0] + (_points[1]-_points[0])*u + (_points[2]-_points[0])*v; } /** Returns the color at a given point of the triangle. The point must be given * in barycentric coordinates \f$(u, v, 1-u-v)\f$, where \f$u, v \in [0,1]\f$ * and \f$u+v \le 1\f$. * The relation between the vertices of the triangle and their barycentric coordinates * is as follows: \f$(1,0,0)=p_1, (0,1,0)=p_2, (0,0,1)=p_0\f$. */ Color TriangularPatch::colorAt (double u, double v) const { ColorGetter getComponents; ColorSetter setComponents; colorQueryFuncs(getComponents, setComponents); valarray comp[3]; for (int i=0; i < 3; i++) (_colors[i].*getComponents)(comp[i]); Color color; (color.*setComponents)(comp[0]*(1-u-v) + comp[1]*u + comp[2]*v); return color; } Color TriangularPatch::averageColor () const { return averageColor(_colors[0], _colors[1], _colors[2]); } /** Compute the average of three given colors depending on the assigned color space. */ Color TriangularPatch::averageColor (const Color &c1, const Color &c2, const Color &c3) const { ColorGetter getComponents; ColorSetter setComponents; colorQueryFuncs(getComponents, setComponents); valarray va1, va2, va3; (c1.*getComponents)(va1); (c2.*getComponents)(va2); (c3.*getComponents)(va3); Color averageColor; (averageColor.*setComponents)((va1+va2+va3)/3.0); return averageColor; } /** Snaps value x to the interval [0,1]. Values lesser than or near 0 are mapped to 0, values * greater than or near 1 are mapped to 1. */ static inline double snap (double x) { if (fabs(x) < 0.001) return 0; if (fabs(1-x) < 0.001) return 1; return x; } /** Approximate the patch by dividing it into a grid of triangular segments that are filled * with the average color of the corresponding region. In order to prevent visual gaps between * adjacent segments due to anti-aliasing, the flag 'overlap' can be set. It enlarges the * segments so that they overlap with their right and bottom neighbors (which are drawn on * top of the overlapping regions). * @param[in] gridsize number of segments per row/column * @param[in] overlap if true, enlarge each segment to overlap with its right and bottom neighbors * @param[in] delta reduce level of detail if the segment size is smaller than the given value * @param[in] callback object notified */ void TriangularPatch::approximate (int gridsize, bool overlap, double delta, Callback &callback) const { if (_colors[0] == _colors[1] && _colors[1] == _colors[2]) { GraphicsPath path = getBoundaryPath(); callback.patchSegment(path, _colors[0]); } else { const double inc = 1.0/gridsize; for (double u1=0; u1 < 1; u1=snap(u1+inc)) { double u2 = snap(u1+inc); double ou2 = (overlap && snap(u2+inc) <= 1 ? snap(u2+inc) : u2); for (double v1=0; snap(u1+v1) < 1; v1=snap(v1+inc)) { double v2 = snap(v1+inc); double ov2 = (overlap && snap(v2+inc) <= 1 ? snap(v2+inc) : v2); if (!overlap || (snap(u1+ov2) <= 1 && snap(ou2+v1) <= 1)) { // create triangular segments pointing in the same direction as the whole patch GraphicsPath path; path.moveto(valueAt(u1, v1)); path.lineto(valueAt(ou2, v1)); path.lineto(valueAt(u1, ov2)); path.closepath(); callback.patchSegment(path, averageColor(colorAt(u1, v1), colorAt(u2, v1), colorAt(u1, v2))); if (snap(u2+v2) <= 1 && (!overlap || inc > delta)) { // create triangular segments pointing in the opposite direction as the whole patch path.clear(); path.moveto(valueAt(u1, v2)); path.lineto(valueAt(u2, v1)); path.lineto(valueAt(u2, v2)); path.closepath(); callback.patchSegment(path, averageColor(colorAt(u1, v2), colorAt(u2, v1), colorAt(u2, v2))); } } } } } } GraphicsPath TriangularPatch::getBoundaryPath () const { GraphicsPath path; path.clear(); path.moveto(_points[0]); path.lineto(_points[1]); path.lineto(_points[2]); path.closepath(); return path; } BoundingBox TriangularPatch::getBBox () const { BoundingBox bbox; bbox.embed(_points[0]); bbox.embed(_points[1]); bbox.embed(_points[2]); return bbox; } dvisvgm-2.8.1/src/Matrix.hpp0000664000175000017500000001003313510660062012664 00000000000000/************************************************************************* ** Matrix.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MATRIX_HPP #define MATRIX_HPP #include #include #include #include #include "MessageException.hpp" #include "Pair.hpp" struct ParserException : public MessageException { explicit ParserException (const std::string &msg) : MessageException(msg) {} }; class Calculator; class Matrix { friend double det (const Matrix &m); friend double det (const Matrix &m, int row, int col); public: Matrix (const std::string &cmds, Calculator &calc); Matrix (double d=0); explicit Matrix (const double *v, unsigned size=9); explicit Matrix (const std::vector &v, int start=0); Matrix (std::initializer_list initlist); Matrix& set (double d); Matrix& set (const double *v, unsigned size); Matrix& set (const std::vector &v, int start=0); Matrix& set (const std::string &cmds, Calculator &calc); double get (int row, int col) const {return _values[row][col];} Matrix& transpose (); Matrix& invert (); Matrix& rmultiply (const Matrix &tm); Matrix& lmultiply (const Matrix &tm); Matrix& translate (double tx, double ty); Matrix& translate (const DPair &p) {return translate(p.x(), p.y());} Matrix& scale (double sx, double sy); Matrix& scale (const DPair &p) {return scale(p.x(), p.y());} Matrix& rotate (double deg); Matrix& xskewByAngle (double deg); Matrix& yskewByAngle (double deg); Matrix& xskewByRatio (double xyratio); Matrix& yskewByRatio (double xyratio); Matrix& flip (bool h, double a); Matrix& operator *= (double c); DPair operator * (const DPair &p) const; bool operator == (const Matrix &m) const; bool operator != (const Matrix &m) const; bool isIdentity() const; bool isTranslation (double &tx, double &ty) const; std::string toSVG () const; std::ostream& write (std::ostream &os) const; static Matrix parse (std::istream &is, Calculator &c); static Matrix parse (const std::string &cmds, Calculator &c); static Matrix parseSVGTransform (const std::string &transform); private: double _values[3][3]; // row x col }; struct TranslationMatrix : public Matrix { TranslationMatrix (double tx, double ty); }; struct ScalingMatrix : public Matrix { ScalingMatrix (double sx, double sy); }; struct RotationMatrix : public Matrix { explicit RotationMatrix (double deg); }; struct XSkewingMatrix : public Matrix { explicit XSkewingMatrix (double deg); }; struct YSkewingMatrix : public Matrix { explicit YSkewingMatrix (double deg); }; inline std::ostream& operator << (std::ostream &os, const Matrix &m) { return m.write(os); } double det (const Matrix &m); double det (const Matrix &m, int row, int col); #endif dvisvgm-2.8.1/src/CharMapID.cpp0000664000175000017500000000377013510660062013155 00000000000000/************************************************************************* ** CharMapID.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "CharMapID.hpp" const CharMapID CharMapID::NONE(0, 0); const CharMapID CharMapID::WIN_SYMBOL(3, 0); const CharMapID CharMapID::WIN_UCS2(3, 1); const CharMapID CharMapID::WIN_SHIFTJIS(3, 2); const CharMapID CharMapID::WIN_PRC(3, 3); const CharMapID CharMapID::WIN_BIG5(3, 4); const CharMapID CharMapID::WIN_WANSUNG(3, 5); const CharMapID CharMapID::WIN_JOHAB(3, 6); const CharMapID CharMapID::WIN_UCS4(3, 10); const CharMapID CharMapID::MAC_JAPANESE(1, 1); const CharMapID CharMapID::MAC_TRADCHINESE(1, 2); const CharMapID CharMapID::MAC_KOREAN(1, 3); const CharMapID CharMapID::MAC_SIMPLCHINESE(1, 25); dvisvgm-2.8.1/src/TrueTypeFont.cpp0000664000175000017500000001571213517541161014041 00000000000000/************************************************************************* ** TrueTypeFont.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "StreamReader.hpp" #include "StreamWriter.hpp" #include "TrueTypeFont.hpp" #include "utility.hpp" using namespace std; /** Reads the font data from a TTF file. * OTF specification: https://www.microsoft.com/typography/otspec/otff.htm * @param[in] fname name/path of file to read * @return true on success */ bool TrueTypeFont::read (const string &fname) { _tableRecords.clear(); _buffer = util::read_file_contents(fname); if (_buffer.empty()) return false; istringstream iss(_buffer); StreamReader reader(iss); _version = reader.readUnsigned(4); uint16_t numTables = reader.readUnsigned(2); if (numTables == 0 || _buffer.size() <= 12u+16u*numTables) return false; // read table records reader.seek(12); // skip searchRange, entrySelector, and rangeShift for (uint16_t i=0; i < numTables; i++) { uint32_t tag = reader.readUnsigned(4); uint32_t checksum = reader.readUnsigned(4); uint32_t offset = reader.readUnsigned(4); uint32_t length = reader.readUnsigned(4); if ((offset | length) > _buffer.size() || offset+length > _buffer.size()) return false; TTFTableRecord record = {tag, checksum, length, reinterpret_cast(_buffer.data())+offset}; _tableRecords.emplace_back(std::move(record)); } return true; } /** Compresses the data of the referenced TTF table and updated the record data accordingly. * @return true if the data was compressed */ bool TrueTypeFont::WOFFTableRecord::compressTableData () { if (ttfRecord.size < 16) return false; uLong compressedSize = compressBound(ttfRecord.size); compressedData.resize(compressedSize); // Compress with zlib for now. We could also use zopfli for slightly better but much slower compression. // Only use the compressed data if it actually leads to a size reduction. Otherwise, use the original table data. if (compress2(compressedData.data(), &compressedSize, ttfRecord.data, ttfRecord.size, Z_BEST_COMPRESSION) != Z_OK || compressedSize >= ttfRecord.size) { compressedData.clear(); return false; } size = compressedSize; data = compressedData.data(); return true; } /** Writes font data in WOFF format to a given output stream. WOFF specifiction: https://www.w3.org/TR/WOFF */ void TrueTypeFont::writeWOFF (ostream &os) const { // compute WOFF table records first vector woffRecords; uint32_t woffSize = static_cast(44 + 20*_tableRecords.size()); uint32_t ttfSize = static_cast(12 + 16*_tableRecords.size()); for (const TTFTableRecord &ttfRecord : _tableRecords) { WOFFTableRecord woffRecord(woffSize, ttfRecord); woffRecord.compressTableData(); woffSize += woffRecord.paddedSize(); ttfSize += ttfRecord.paddedSize(); woffRecords.emplace_back(std::move(woffRecord)); } // write WOFF header StreamWriter writer(os); writer.writeUnsigned(0x774F4646, 4); // "WOFF" writer.writeUnsigned(_version, 4); // version of contained TTF font writer.writeUnsigned(woffSize, 4); // total length of WOFF file writer.writeUnsigned(_tableRecords.size(), 2); // number of tables writer.writeBytes(0, 2); // reserved writer.writeUnsigned(ttfSize, 4); // size of uncompressed TTF data writer.writeBytes(0, 4); // WOFF version (not required) writer.writeBytes(0, 12); // offset, compressed and uncompressed size of metadata block writer.writeBytes(0, 8); // offset and size of private data block // write WOFF table directory for (const WOFFTableRecord &woffRecord : woffRecords) { writer.writeUnsigned(woffRecord.ttfRecord.tag, 4); writer.writeUnsigned(woffRecord.offset, 4); writer.writeUnsigned(woffRecord.size, 4); writer.writeUnsigned(woffRecord.ttfRecord.size, 4); writer.writeUnsigned(woffRecord.ttfRecord.checksum, 4); } // write WOFF tables for (const WOFFTableRecord &woffRecord : woffRecords) { writer.writeBytes(woffRecord.data, woffRecord.size); size_t padding = woffRecord.paddedSize()-woffRecord.size; writer.writeBytes(0, padding); } } void TrueTypeFont::writeWOFF (const string &fname) const { ofstream ofs(fname, ios::binary); writeWOFF(ofs); } /** Puts the TrueType data in a WOFF2 container and writes the resulting data to a given stream. * @param[out] os stream to write the WOFF2 data to * @return true on success */ bool TrueTypeFont::writeWOFF2 (ostream &os) const { auto input_data = reinterpret_cast(_buffer.data()); size_t output_size = woff2::MaxWOFF2CompressedSize(input_data, _buffer.size()); string output(output_size, 0); auto output_data = reinterpret_cast(&output[0]); woff2::WOFF2Params params; if (woff2::ConvertTTFToWOFF2(input_data, _buffer.size(), output_data, &output_size, params)) { output.resize(output_size); copy(output.begin(), output.end(), ostream_iterator(os)); return true; } return false; } bool TrueTypeFont::writeWOFF2 (const string &fname) const { ofstream ofs(fname, ios::binary); return writeWOFF2(ofs); } /** Converts the numeric table tag (which represents a four-character ID) to a string. */ string TrueTypeFont::TTFTableRecord::name () const { string ret; for (int i=24; i >= 0; i-= 8) ret += static_cast(tag >> i); return ret; } uint32_t TrueTypeFont::TTFTableRecord::computeChecksum () const { uint32_t sum=0; auto startptr = reinterpret_cast(data); auto endptr = startptr + paddedSize()/sizeof(uint32_t); while (startptr < endptr) sum += *startptr++; return sum; } dvisvgm-2.8.1/src/StreamWriter.cpp0000664000175000017500000000727013536436567014077 00000000000000/************************************************************************* ** StreamWriter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "HashFunction.hpp" #include "StreamWriter.hpp" #include "utility.hpp" using namespace std; /** Writes an unsigned integer to the output stream. * @param[in] val the value to write * @param[in] n number of bytes to be considered */ void StreamWriter::writeUnsigned (uint32_t val, int n) { for (n--; n >= 0; n--) _os.put(char((val >> (8*n)) & 0xff)); } /** Writes a signed integer to the output stream. * @param[in] val the value to write * @param[in] n number of bytes to be considered */ void StreamWriter::writeSigned (int32_t val, int n) { writeUnsigned(uint32_t(val), n); } void StreamWriter::writeBytes (const std::vector &bytes) { _os.write(reinterpret_cast(bytes.data()), bytes.size()); } void StreamWriter::writeBytes (const uint8_t *buf, size_t bufsize) { _os.write(reinterpret_cast(buf), bufsize); } void StreamWriter::writeBytes (int byte, size_t count) { while (count-- > 0) _os.put(byte); } /** Writes a string to the output stream. * @param[in] str the string to write * @param[in] finalZero if true, a final 0-byte is appended */ void StreamWriter::writeString (const string &str, bool finalZero) { for (char c : str) _os.put(c); if (finalZero) _os.put(0); } /** Writes an unsigned integer to the output stream. * @param[in] val the value to write * @param[in] n number of bytes to be considered * @param[in,out] hashfunc hash to update */ void StreamWriter::writeUnsigned (uint32_t val, int n, HashFunction &hashfunc) { writeUnsigned(val, n); hashfunc.update(util::bytes(val, n)); } /** Writes a signed integer to the output stream and updates the hash value. * @param[in] val the value to write * @param[in] n number of bytes to be considered * @param[in,out] hashfunc hash to update */ void StreamWriter::writeSigned (int32_t val, int n, HashFunction &hashfunc) { writeUnsigned(uint32_t(val), n, hashfunc); } /** Writes a string to the output stream and updates the hash value. * @param[in] str the string to write * @param[in,out] hashfunc hash to update * @param[in] finalZero if true, a final 0-byte is appended */ void StreamWriter::writeString (const std::string &str, HashFunction &hashfunc, bool finalZero) { writeString(str, finalZero); hashfunc.update(str.data(), str.length() + (finalZero ? 1 : 0)); } dvisvgm-2.8.1/src/BasicDVIReader.hpp0000664000175000017500000001173713510660062014143 00000000000000/************************************************************************* ** BasicDVIReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef BASICDVIREADER_HPP #define BASICDVIREADER_HPP #include "Matrix.hpp" #include "MessageException.hpp" #include "StreamReader.hpp" struct DVIException : public MessageException { explicit DVIException (const std::string &msg) : MessageException(msg) {} }; struct InvalidDVIFileException : public DVIException { explicit InvalidDVIFileException (const std::string &msg) : DVIException(msg) {} }; /** This class provides the basic functionality to read a DVI file. * It just skips all DVI commands and apply any semantic to it. The latter must * be realized by deriving a separate class that implements the cmdXXX template * methods. These are low-level functions that represent the DVI commands and * require to read and evaluate the correct portion of data from the DVI stream. * Since the DVI commands are almost skipped by advancing the file pointer, * running through a DVI file is pretty fast. */ class BasicDVIReader : public StreamReader { protected: using CommandHandler = void (BasicDVIReader::*)(int); enum DVIVersion {DVI_NONE=0, DVI_STANDARD=2, DVI_PTEX=3, DVI_XDV5=5, DVI_XDV6=6, DVI_XDV7=7}; const uint8_t OP_SETCHAR0=0, OP_SETCHAR127=127, OP_SET1=128, OP_BOP=139, OP_EOP=140, OP_FNTNUM0=171, OP_FNTNUM63=234, OP_PRE=247, OP_POST=248, OP_POSTPOST=249, OP_DIR=255, DVI_FILL=223; public: explicit BasicDVIReader (std::istream &is); virtual void executeAllPages (); virtual double getXPos () const {return 0;} virtual double getYPos () const {return 0;} virtual void finishLine () {} virtual void translateToX (double x) {} virtual void translateToY (double y) {} virtual int stackDepth () const {return 0;} virtual Matrix getPageTransformation () const {return Matrix(1);} virtual unsigned currentPageNumber () const {return 0;} protected: void setDVIVersion (DVIVersion version); DVIVersion getDVIVersion () const {return _dviVersion;} virtual int evalCommand (CommandHandler &handler, int ¶m); virtual int executeCommand (); void executePostPost (); bool evalXDVOpcode (int op, CommandHandler &handler) const; // The following template methods represent the single DVI commands. They // must read the correct chunk of data from the input stream in order to // process the DVI file correctly. virtual void cmdSetChar0 (int c); virtual void cmdSetChar (int len); virtual void cmdPutChar (int len); virtual void cmdSetRule (int len); virtual void cmdPutRule (int len); virtual void cmdNop (int len); virtual void cmdBop (int len); virtual void cmdEop (int len); virtual void cmdPush (int len); virtual void cmdPop (int len); virtual void cmdDir (int len); virtual void cmdRight (int len); virtual void cmdDown (int len); virtual void cmdX0 (int len); virtual void cmdY0 (int len); virtual void cmdW0 (int len); virtual void cmdZ0 (int len); virtual void cmdX (int len); virtual void cmdY (int len); virtual void cmdW (int len); virtual void cmdZ (int len); virtual void cmdFontDef (int len); virtual void cmdFontNum0 (int n); virtual void cmdFontNum (int len); virtual void cmdXXX (int len); virtual void cmdPre (int len); virtual void cmdPost (int len); virtual void cmdPostPost (int len); virtual void cmdXFontDef (int len); // XDV only virtual void cmdXGlyphArray (int len); // XDV only virtual void cmdXGlyphString (int len); // XDV version 5 only virtual void cmdXPic (int len); // XDV version 5 only virtual void cmdXTextAndGlyphs (int len); // XDV version 7 only private: DVIVersion _dviVersion; ///< DVI version of file being processed }; #endif dvisvgm-2.8.1/src/EmSpecialHandler.hpp0000664000175000017500000000556213561274375014611 00000000000000/************************************************************************* ** EmSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef EMSPECIALHANDLER_HPP #define EMSPECIALHANDLER_HPP #include #include #include "Pair.hpp" #include "SpecialHandler.hpp" class InputReader; class SpecialActions; class EmSpecialHandler : public SpecialHandler { struct Line { Line (int pp1, int pp2, char cc1, char cc2, double w) : p1(pp1), p2(pp2), c1(cc1), c2(cc2), width(w) {} int p1, p2; ///< point numbers of line ends char c1, c2; ///< cut type of line ends (h, v or p) double width; ///< line width }; public: const char* name () const override {return "em";} const char* info () const override {return "line drawing statements of the emTeX special set";} std::vector prefixes() const override; bool process (const std::string &prefix, std::istream &in, SpecialActions &actions) override; protected: void dviEndPage (unsigned pageno, SpecialActions &actions) override; void linewidth (InputReader &ir, SpecialActions &actions); void moveto (InputReader &ir, SpecialActions &actions); void lineto (InputReader &ir, SpecialActions &actions); void line (InputReader &ir, SpecialActions &actions); void point (InputReader &ir, SpecialActions &actions); private: std::unordered_map _points; ///< points defined by special em:point std::vector _lines; ///< list of lines with undefined end points double _linewidth=0.4*72/72.27; ///< global line width DPair _pos; ///< current position of "graphic cursor" }; #endif dvisvgm-2.8.1/src/EPSToSVG.hpp0000664000175000017500000000405413510660062012740 00000000000000/************************************************************************* ** EPSToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef EPSTOSVG_HPP #define EPSTOSVG_HPP #include "EPSFile.hpp" #include "ImageToSVG.hpp" class PsSpecialHandler; class EPSToSVG : public ImageToSVG { public: EPSToSVG (const std::string &fname, SVGOutputBase &out) : ImageToSVG(fname, out) {} bool isSinglePageFormat() const override {return true;} int totalPageCount() override {return 1;} protected: std::string imageFormat () const override {return "EPS";} bool imageIsValid () const override {return EPSFile(filename()).hasValidHeader();} BoundingBox imageBBox () const override {return EPSFile(filename()).bbox();} std::string psSpecialCmd () const override {return "psfile=";} }; #endif dvisvgm-2.8.1/src/options.xml0000664000175000017500000002112113510660062013124 00000000000000 [options] dvifile --eps [options] epsfile --pdf [options] pdffile This program converts DVI files, as created by TeX/LaTeX, as well as\nEPS and PDF files to the XML-based scalable vector graphics format SVG. Copyright (C) 2005-2019 Martin Gieseking <martin.gieseking@uos.de>
dvisvgm-2.8.1/src/FontMap.cpp0000664000175000017500000002212213510660062012761 00000000000000/************************************************************************* ** FontMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "CMap.hpp" #include "Directory.hpp" #include "FileFinder.hpp" #include "FontManager.hpp" #include "FontMap.hpp" #include "MapLine.hpp" #include "Message.hpp" #include "Subfont.hpp" #include "utility.hpp" using namespace std; /** Returns the singleton instance. */ FontMap& FontMap::instance() { static FontMap fontmap; return fontmap; } /** Reads and evaluates a single font map file. * @param[in] fname name of map file to read * @param[in] mode selects how to integrate the map file entries into the global map tree * @return true if file could be opened */ bool FontMap::read (const string &fname, FontMap::Mode mode) { ifstream ifs(fname); if (!ifs) return false; int line_number = 1; while (ifs) { int c = ifs.peek(); if (c < 0 || strchr("\n&#%;*", c)) // comment or empty line? ifs.ignore(numeric_limits::max(), '\n'); else { try { MapLine mapline(ifs); apply(mapline, mode); } catch (const MapLineException &e) { Message::wstream(true) << fname << ", line " << line_number << ": " << e.what() << '\n'; } catch (const SubfontException &e) { Message::wstream(true) << e.filename(); if (e.lineno() > 0) Message::wstream(false) << ", line " << e.lineno(); Message::wstream(false) << e.what() << '\n'; } } line_number++; } return true; } bool FontMap::read (const string &fname, char modechar) { Mode mode; switch (modechar) { case '=': mode = Mode::REPLACE; break; case '-': mode = Mode::REMOVE; break; default : mode = Mode::APPEND; } return read(fname, mode); } /** Applies a mapline according to the given mode (append, remove, replace). * @param[in] mapline the mapline to be applied * @param[in] mode mode to use * @return true in case of success */ bool FontMap::apply (const MapLine& mapline, FontMap::Mode mode) { switch (mode) { case Mode::APPEND: return append(mapline); case Mode::REMOVE: return remove(mapline); default: return replace(mapline); } } /** Applies a mapline according to the given mode (append, remove, replace). * @param[in] mapline the mapline to be applied * @param[in] modechar character that denotes the mode (+, -, or =) * @return true in case of success */ bool FontMap::apply (const MapLine& mapline, char modechar) { Mode mode; switch (modechar) { case '=': mode = Mode::REPLACE; break; case '-': mode = Mode::REMOVE; break; default : mode = Mode::APPEND; } return apply(mapline, mode); } /** Reads and evaluates a sequence of map files. Each map file is looked up in the local * directory and the TeX file tree. * @param[in] fname_seq comma-separated list of map file names * @return true if at least one of the given map files was found */ bool FontMap::read (const string &fname_seq) { bool found = false; size_t left=0; while (left < fname_seq.length()) { const char modechar = fname_seq[left]; if (strchr("+-=", modechar)) left++; string fname; size_t right = fname_seq.find(',', left); if (right != string::npos) fname = fname_seq.substr(left, right-left); else { fname = fname_seq.substr(left); right = fname_seq.length(); } if (!fname.empty()) { if (!read(fname, modechar)) { if (const char *path = FileFinder::instance().lookup(fname, false)) found = found || read(path, modechar); else Message::wstream(true) << "map file " << fname << " not found\n"; } } left = right+1; } return found; } /** Appends given map line data to the font map if there is no entry for the corresponding * font in the map yet. * @param[in] mapline parsed font data * @return true if data has been appended */ bool FontMap::append (const MapLine &mapline) { bool appended = false; if (!mapline.texname().empty()) { if (!mapline.fontfname().empty() || !mapline.encname().empty()) { vector subfonts; if (mapline.sfd()) mapline.sfd()->subfonts(subfonts); else subfonts.push_back(nullptr); for (Subfont *subfont : subfonts) { string fontname = mapline.texname()+(subfont ? subfont->id() : ""); auto it = _entries.find(fontname); if (it == _entries.end()) { _entries.emplace(fontname, util::make_unique(mapline, subfont)); appended = true; } } } } return appended; } /** Replaces the map data of the given font. * If the font is locked (because it's already in use) nothing happens. * @param[in] mapline parsed font data * @return true if data has been replaced */ bool FontMap::replace (const MapLine &mapline) { if (mapline.texname().empty()) return false; if (mapline.fontfname().empty() && mapline.encname().empty()) return remove(mapline); vector subfonts; if (mapline.sfd()) mapline.sfd()->subfonts(subfonts); else subfonts.push_back(nullptr); for (Subfont *subfont : subfonts) { string fontname = mapline.texname()+(subfont ? subfont->id() : ""); auto it = _entries.find(fontname); if (it == _entries.end()) _entries.emplace(fontname, util::make_unique(mapline, subfont)); else if (!it->second->locked) *it->second = Entry(mapline, subfont); } return true; } /** Removes the map entry of the given font. * If the font is locked (because it's already in use) nothing happens. * @param[in] mapline parsed font data * @return true if entry has been removed */ bool FontMap::remove (const MapLine &mapline) { bool removed = false; if (!mapline.texname().empty()) { vector subfonts; if (mapline.sfd()) mapline.sfd()->subfonts(subfonts); else subfonts.push_back(nullptr); for (const Subfont *subfont : subfonts) { string fontname = mapline.texname()+(subfont ? subfont->id() : ""); auto it = _entries.find(fontname); if (it != _entries.end() && !it->second->locked) { _entries.erase(it); removed = true; } } } return removed; } ostream& FontMap::write (ostream &os) const { for (const auto &entry : _entries) os << entry.first << " -> " << entry.second->fontname << " [" << entry.second->encname << "]\n"; return os; } /** Reads and evaluates all map files in the given directory. * @param[in] dirname path to directory containing the map files to be read */ void FontMap::readdir (const string &dirname) { Directory dir(dirname); while (const char *fname = dir.read(Directory::ET_FILE)) { if (strlen(fname) >= 4 && strcmp(fname+strlen(fname)-4, ".map") == 0) { string path = dirname + "/" + fname; read(path); } } } /** Returns name of font that is mapped to a given font. * @param[in] fontname name of font whose mapped name is retrieved * @returns name of mapped font */ const FontMap::Entry* FontMap::lookup (const string &fontname) const { auto it = _entries.find(fontname); if (it == _entries.end()) return nullptr; return it->second.get(); } /** Sets the lock flag for the given font in order to avoid changing the map data of this font. * @param[in] fontname name of font to be locked */ void FontMap::lockFont (const string& fontname) { auto it = _entries.find(fontname); if (it != _entries.end()) it->second->locked = true; } /** Removes all (unlocked) entries from the font map. * @param[in] unlocked_only if true, only unlocked entries are removed */ void FontMap::clear (bool unlocked_only) { if (!unlocked_only) _entries.clear(); else { auto it=_entries.begin(); while (it != _entries.end()) { if (it->second->locked) ++it; else it = _entries.erase(it); } } } ///////////////////////////////////////////////// FontMap::Entry::Entry (const MapLine &mapline, Subfont *sf) : fontname(mapline.fontfname()), encname(mapline.encname()), subfont(sf), fontindex(mapline.fontindex()), locked(false), style(mapline.bold(), mapline.extend(), mapline.slant()) { } dvisvgm-2.8.1/src/Terminal.cpp0000664000175000017500000001374113510660062013177 00000000000000/************************************************************************* ** Terminal.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Terminal.hpp" #ifdef HAVE_TERMIOS_H #include #endif #ifdef GWINSZ_IN_SYS_IOCTL #include #endif #ifdef _WIN32 #include "windows.hpp" #endif #include using namespace std; const int Terminal::RED = 1; const int Terminal::GREEN = 2; const int Terminal::BLUE = 4; const int Terminal::CYAN = GREEN|BLUE; const int Terminal::YELLOW = RED|GREEN; const int Terminal::MAGENTA = RED|BLUE; const int Terminal::WHITE = RED|GREEN|BLUE; const int Terminal::DEFAULT = -1; const int Terminal::BLACK = 0; #ifdef _WIN32 int Terminal::_defaultColor; int Terminal::_cursorHeight; #endif int Terminal::_fgcolor = Terminal::DEFAULT; int Terminal::_bgcolor = Terminal::DEFAULT; /** Initializes the terminal. This method should be called before any of the others. * @param[in,out] os terminal output stream (currently unused) */ void Terminal::init (ostream &os) { #ifdef _WIN32 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); if (h != INVALID_HANDLE_VALUE) { CONSOLE_SCREEN_BUFFER_INFO buffer_info; GetConsoleScreenBufferInfo(h, &buffer_info); _defaultColor = (buffer_info.wAttributes & 0xff); CONSOLE_CURSOR_INFO cursor_info; GetConsoleCursorInfo(h, &cursor_info); _cursorHeight = cursor_info.dwSize; } #endif } /** Finishes the terminal output. Should be called after last terminal action. * @param[in,out] os terminal output stream */ void Terminal::finish (ostream &os) { fgcolor(DEFAULT, os); bgcolor(DEFAULT, os); cursor(true); } /** Returns the number of terminal columns (number of characters per row). * If it's not possible to retrieve information about the terminal size, 0 is returned. */ int Terminal::columns () { #if defined(TIOCGWINSZ) struct winsize ws; if (ioctl(fileno(stderr), TIOCGWINSZ, &ws) < 0) return 0; return ws.ws_col; #elif defined(_WIN32) CONSOLE_SCREEN_BUFFER_INFO info; if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &info)) return 0; return info.dwSize.X; #else return 0; #endif } /** Returns the number of terminal rows. * If it's not possible to retrieve information about the terminal size, 0 is returned. */ int Terminal::rows () { #if defined(TIOCGWINSZ) struct winsize ws; if (ioctl(fileno(stderr), TIOCGWINSZ, &ws) < 0) return 0; return ws.ws_row; #elif defined(_WIN32) CONSOLE_SCREEN_BUFFER_INFO info; if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_ERROR_HANDLE), &info)) return 0; return info.dwSize.Y; #else return 0; #endif } /** Sets the foreground color. * @param[in] color color code * @param[in] os terminal output stream */ void Terminal::fgcolor (int color, ostream &os) { _fgcolor = color; #ifdef _WIN32 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); if (h != INVALID_HANDLE_VALUE) { CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(h, &info); if (_fgcolor == DEFAULT) color = _defaultColor & 0x0f; else { // swap red and blue bits color = (color & 0x0a) | ((color & 1) << 2) | ((color & 4) >> 2); } color = (info.wAttributes & 0xf0) | (color & 0x0f); SetConsoleTextAttribute(h, (DWORD)color); } #else bool light = false; if (color != DEFAULT && color > 7) { light = true; color %= 8; } if (color == DEFAULT) { os << "\x1B[0m"; if (_bgcolor != DEFAULT) bgcolor(_bgcolor, os); } else os << "\x1B[" << (light ? '1': '0') << ';' << (30+(color & 0x07)) << 'm'; #endif } /** Sets the background color. * @param[in] color color code * @param[in] os terminal output stream */ void Terminal::bgcolor (int color, ostream &os) { _bgcolor = color; #ifdef _WIN32 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); if (h != INVALID_HANDLE_VALUE) { CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(h, &info); if (_bgcolor == DEFAULT) color = (_defaultColor & 0xf0) >> 4; else { // swap red and blue bits color = (color & 0x0a) | ((color & 1) << 2) | ((color & 4) >> 2); } color = (info.wAttributes & 0x0f) | ((color & 0x0f) << 4); SetConsoleTextAttribute(h, (DWORD)color); } #else if (color != DEFAULT && color > 7) color %= 8; if (color == DEFAULT) { os << "\x1B[0m"; if (_fgcolor != DEFAULT) fgcolor(_fgcolor, os); } else os << "\x1B[" << (40+(color & 0x07)) << 'm'; #endif } /** Disables or enables the console cursor * @param[in] visible if false, the cursor is disabled, and enabled otherwise */ void Terminal::cursor (bool visible) { #ifdef _WIN32 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); if (h != INVALID_HANDLE_VALUE) { CONSOLE_CURSOR_INFO cursor_info; cursor_info.bVisible = visible; cursor_info.dwSize = _cursorHeight; SetConsoleCursorInfo(h, &cursor_info); } #endif } dvisvgm-2.8.1/src/ffwrapper.c0000664000175000017500000000603213510660062013053 00000000000000/************************************************************************* ** ffwrapper.c ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "ffwrapper.h" #ifdef _NDEBUG static void no_post_error (const char *title, const char *error, ...) {} static void no_warning (const char *format, ...) {} #endif /** Initializes the FontForge library. */ void ff_init () { InitSimpleStuff(); #ifdef _NDEBUG ui_interface.post_error = &no_post_error; ui_interface.logwarning = &no_warning; #endif } int ff_version () { return FONTFORGE_VERSIONDATE_RAW; } /** Runs the autohinter for all glyphs in a given font. * @param[in,out] sf the font to be autohinted * @param[in] order2 if != 0, target font requires quadratic rather than cubic splines */ static void ff_autohint (SplineFont *sf, int order2) { BlueData bd; GlobalInstrCt gic; if (order2) SFConvertToOrder2(sf); QuickBlues(sf, ly_fore, &bd); if (order2) InitGlobalInstrCt(&gic, sf, ly_fore, &bd); for (int i=0; i < sf->glyphcnt; i++) { SplineChar *sc = sf->glyphs[i]; if (sc != NULL) { SplineChar *sc = sf->glyphs[i]; SplineCharAutoHint(sc, ly_fore, &bd); // generate hints if (order2) NowakowskiSCAutoInstr(&gic, sc); // generate TTF instructions } } if (order2) FreeGlobalInstrCt(&gic); } /** Creates a TrueType font from a FontForge SFD file. * @param[in] sfdname name of SFD file * @param[in] ttfname name of TrueType file * @param[in] autohint run the autohinter if != 0 */ int ff_sfd_to_ttf (const char *sfdname, const char *ttfname, int autohint) { int ret=0; SplineFont *sf = SFDRead((char*)sfdname); if (sf) { if (autohint) ff_autohint(sf, true); ret = WriteTTFFont((char*)ttfname, sf, ff_ttf, 0, 0, 0, sf->map, ly_fore); SplineFontFree(sf); } return ret; } dvisvgm-2.8.1/src/version.hpp.in0000664000175000017500000000305113510660062013514 00000000000000/************************************************************************* ** version.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef VERSION_HPP #define VERSION_HPP constexpr const char *PROGRAM_NAME = "dvisvgm"; constexpr const char *PROGRAM_VERSION = "@VERSION@"; #endif dvisvgm-2.8.1/src/Length.hpp0000664000175000017500000001005213510660062012642 00000000000000/************************************************************************* ** Length.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef LENGTH_HPP #define LENGTH_HPP #include #include #include "MessageException.hpp" #ifdef IN #undef IN #endif struct UnitException : MessageException { explicit UnitException (const std::string &msg) : MessageException(msg) {} }; class Length { public: enum class Unit {PT, BP, CM, MM, IN, PC, DD, CC, SP}; public: constexpr Length () : _pt(0) {} explicit constexpr Length (long double pt) : _pt(static_cast(pt)) {} Length (double val, Unit unit) {set(val, unit);} Length (double val, const std::string &unitstr) {set(val, unitstr);} explicit Length (const std::string &lenstr) {set(lenstr);} void set (double val, Unit unit); void set (double val, std::string unit); void set (const std::string &lenstr); double pt () const {return _pt;} double in () const {return _pt*pt2in;} double bp () const {return _pt*pt2bp;} double cm () const {return _pt*pt2cm;} double mm () const {return _pt*pt2mm;} double pc () const {return _pt*pt2pc;} double dd () const {return _pt*pt2dd;} double cc () const {return _pt*pt2cc;} double sp () const {return _pt*pt2sp;} double get (Unit unit) const; std::string toString (Unit unit) const; bool operator == (Length len) const {return _pt == len._pt;} bool operator != (Length len) const {return _pt != len._pt;} static Unit stringToUnit (const std::string &unitstr); static std::string unitToString (Unit unit); static std::map getUnits (); public: static constexpr double pt2in = 1.0/72.27; static constexpr double pt2bp = pt2in*72; static constexpr double pt2cm = pt2in*2.54; static constexpr double pt2mm = pt2cm*10; static constexpr double pt2pc = 1.0/12; static constexpr double pt2dd = 1157.0/1238; static constexpr double pt2cc = pt2dd/12; static constexpr double pt2sp = 65536.0; private: double _pt; // length in TeX point units (72.27pt = 1in) }; constexpr Length operator "" _pt (long double pt) {return Length(pt);} constexpr Length operator "" _bp (long double bp) {return Length(bp/Length::pt2bp);} constexpr Length operator "" _mm (long double mm) {return Length(mm/Length::pt2mm);} constexpr Length operator "" _in (long double in) {return Length(in/Length::pt2in);} constexpr Length operator "" _pt (unsigned long long pt) {return Length(static_cast(pt));} constexpr Length operator "" _bp (unsigned long long bp) {return Length(static_cast(bp)/Length::pt2bp);} constexpr Length operator "" _mm (unsigned long long mm) {return Length(static_cast(mm)/Length::pt2mm);} constexpr Length operator "" _in (unsigned long long in) {return Length(static_cast(in)/Length::pt2in);} #endif dvisvgm-2.8.1/src/Color.hpp0000664000175000017500000001125313510660062012503 00000000000000/************************************************************************* ** Color.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef COLOR_HPP #define COLOR_HPP #include #include #include #include "VectorIterator.hpp" #ifdef TRANSPARENT #undef TRANSPARENT #endif class Color { public: static bool SUPPRESS_COLOR_NAMES; static const Color BLACK; static const Color WHITE; static const Color TRANSPARENT; enum class ColorSpace {GRAY, RGB, CMYK, LAB}; public: Color () noexcept : _rgb(0) {} explicit Color (uint32_t rgb) noexcept : _rgb(rgb) {} Color (uint8_t r, uint8_t g, uint8_t b) noexcept {setRGB(r,g,b);} Color (double r, double g, double b) noexcept {setRGB(r,g,b);} explicit Color (const std::valarray &rgb) noexcept {setRGB(rgb);} explicit Color (const std::string &name); explicit operator uint32_t () const {return _rgb;} bool operator == (const Color &c) const {return _rgb == c._rgb;} bool operator != (const Color &c) const {return _rgb != c._rgb;} bool operator < (const Color &c) const {return _rgb < c._rgb;} Color operator *= (double c); Color operator * (double c) const {return Color(*this) *= c;} void setRGB (uint8_t r, uint8_t g, uint8_t b) {_rgb = (r << 16) | (g << 8) | b;} void setRGB (double r, double g, double b); void setRGB (const std::valarray &rgb) {setRGB(rgb[0], rgb[1], rgb[2]);} bool setPSName (std::string name, bool case_sensitive=true); void setGray (uint8_t g) {setRGB(g,g,g);} void setGray (double g) {setRGB(g,g,g);} void setGray (const std::valarray &gray) {setRGB(gray[0], gray[0], gray[0]);} void setHSB (double h, double s, double b); void setCMYK (double c, double m, double y, double k); void setCMYK (const std::valarray &cmyk); void setXYZ (double x, double y, double z); void setXYZ (const std::valarray &xyz); void setLab (double l, double a, double b); void setLab (const std::valarray &lab); void set (ColorSpace colorSpace, VectorIterator &it); double getGray () const; void getGray (std::valarray &gray) const; void getRGB (double &r, double &g, double &b) const; void getRGB (std::valarray &rgb) const; void getCMYK (double &c, double &m, double &y, double &k) const; void getCMYK (std::valarray &cmyk) const; void getXYZ (double &x, double &y, double &z) const; void getLab (double &l, double &a, double &b) const; void getLab (std::valarray &lab) const; double deltaE (const Color &c) const; std::string rgbString () const; std::string svgColorString (bool rgbonly) const; std::string svgColorString () const {return svgColorString(SUPPRESS_COLOR_NAMES);} static void CMYK2RGB (const std::valarray &cmyk, std::valarray &rgb); static void RGB2CMYK (const std::valarray &rgb, std::valarray &cmyk); static void HSB2RGB (const std::valarray &hsb, std::valarray &rgb); static void RGB2XYZ (std::valarray rgb, std::valarray &xyz); static void XYZ2RGB (const std::valarray &xyz, std::valarray &rgb); static void RGB2Lab (const std::valarray &rgb, std::valarray &lab); static void Lab2XYZ (const std::valarray &lab, std::valarray &xyz); static int numComponents (ColorSpace colorSpace); private: uint32_t _rgb; }; #endif dvisvgm-2.8.1/src/dvisvgm.cpp0000664000175000017500000004165713513552320013112 00000000000000/************************************************************************* ** dvisvgm.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include #include #include #include "CommandLine.hpp" #include "DVIToSVG.hpp" #include "DVIToSVGActions.hpp" #include "EPSToSVG.hpp" #include "FileFinder.hpp" #include "FileSystem.hpp" #include "Font.hpp" #include "FontEngine.hpp" #include "Ghostscript.hpp" #include "HashFunction.hpp" #include "HyperlinkManager.hpp" #include "Message.hpp" #include "PageSize.hpp" #include "PDFToSVG.hpp" #include "PSInterpreter.hpp" #include "PsSpecialHandler.hpp" #include "SignalHandler.hpp" #include "SourceInput.hpp" #include "optimizer/SVGOptimizer.hpp" #include "SVGOutput.hpp" #include "System.hpp" #include "XXHashFunction.hpp" #include "utility.hpp" #include "version.hpp" #ifndef DISABLE_WOFF #include //#include #include "ffwrapper.h" #include "TTFAutohint.hpp" #endif using namespace std; //////////////////////////////////////////////////////////////////////////////// static string remove_path (string fname) { fname = FileSystem::adaptPathSeperators(fname); size_t slashpos = fname.rfind('/'); if (slashpos == string::npos) return fname; return fname.substr(slashpos+1); } static string ensure_suffix (string fname, const string &suffix) { if (!fname.empty()) { size_t dotpos = remove_path(fname).rfind('.'); if (dotpos == string::npos) fname += "." + suffix; } return fname; } static string get_transformation_string (const CommandLine &args) { ostringstream oss; if (args.rotateOpt.given()) oss << 'R' << args.rotateOpt.value() << ",w/2,h/2"; if (args.translateOpt.given()) oss << 'T' << args.translateOpt.value(); if (args.scaleOpt.given()) oss << 'S' << args.scaleOpt.value(); if (args.transformOpt.given()) oss << args.transformOpt.value(); return oss.str(); } static void set_libgs (CommandLine &args) { #if !defined(DISABLE_GS) && !defined(HAVE_LIBGS) if (args.libgsOpt.given()) Ghostscript::LIBGS_NAME = args.libgsOpt.value(); else if (getenv("LIBGS")) Ghostscript::LIBGS_NAME = getenv("LIBGS"); #endif } static bool set_cache_dir (const CommandLine &args) { if (args.cacheOpt.given() && !args.cacheOpt.value().empty()) { if (args.cacheOpt.value() == "none") PhysicalFont::CACHE_PATH.clear(); else if (FileSystem::exists(args.cacheOpt.value())) PhysicalFont::CACHE_PATH = args.cacheOpt.value(); else Message::wstream(true) << "cache directory '" << args.cacheOpt.value() << "' does not exist (caching disabled)\n"; } else { string &cachepath = PhysicalFont::CACHE_PATH; const char *cachehome = getenv("XDG_CACHE_HOME"); if (!cachehome || util::trim(cachehome).empty()) { #ifdef _WIN32 cachehome = "~\\.cache"; #else cachehome = "~/.cache"; #endif } cachepath = util::trim(cachehome) + FileSystem::PATHSEP + "dvisvgm"; if (cachepath[0] == '~' && cachepath[1] == FileSystem::PATHSEP) { if (FileSystem::userdir()) cachepath.replace(0, 1, FileSystem::userdir()); else cachepath.erase(0, 2); // strip leading "~/" } if (!FileSystem::exists(cachepath)) FileSystem::mkdir(cachepath); } if (args.cacheOpt.given() && args.cacheOpt.value().empty()) { cout << "cache directory: " << (PhysicalFont::CACHE_PATH.empty() ? "(none)" : PhysicalFont::CACHE_PATH) << '\n'; try { if (!PhysicalFont::CACHE_PATH.empty()) FontCache::fontinfo(PhysicalFont::CACHE_PATH, cout, true); } catch (StreamReaderException &e) { Message::wstream(true) << "failed reading cache data\n"; } return false; } return true; } static bool set_temp_dir (const CommandLine &args) { if (args.tmpdirOpt.given()) { if (!args.tmpdirOpt.value().empty()) FileSystem::TMPDIR = args.tmpdirOpt.value(); else { cout << "temporary folder: " << FileSystem::tmpdir() << '\n'; return false; } } return true; } static void check_bbox (const string &bboxstr) { for (const char *fmt : {"none", "min", "preview", "papersize", "dvi"}) if (bboxstr == fmt) return; if (isalpha(bboxstr[0])) { try { PageSize size(bboxstr); } catch (const PageSizeException &e) { throw MessageException("invalid bounding box format '" + bboxstr + "'"); } } else { // check if given bbox argument is valid, i.e. doesn't throw an exception BoundingBox bbox; bbox.set(bboxstr); } } // Helper class to generate a list of version information of the used libraries. class VersionInfo { public: void add (const string &name, const string &version, bool ignoreEmpty=false) { if (!version.empty() || !ignoreEmpty) append(name, util::trim(version)); } void add (const string &name, const char *version, bool ignoreEmpty=false) { if (version && *version) append(name, util::trim(version)); else if (!ignoreEmpty) append(name, ""); } void add (const string &name, const vector &versionComponents) { string version; for (auto it=versionComponents.begin(); it != versionComponents.end(); ++it) { if (it != versionComponents.begin()) version += '.'; version += to_string(*it); } append(name, version); } /** Adds a version number given as a single unsigned integer, and optionally * extracts its components, e.g. 0x00010203 => "1.2.3" (3 components separated * by multiples of 256). * @param[in] name library name * @param[in] version version number * @param[in] compcount number of components the version consists of * @param[in] factor factor used to separate the components */ void add (const string &name, uint32_t version, int compcount=1, uint32_t factor=0xffffffff) { string str; while (compcount-- > 0) { if (!str.empty()) str.insert(0, "."); str.insert(0, to_string(version % factor)); version /= factor; } append(name, str); } /** Writes the version information to the given output stream. */ void write (ostream &os) { using Entry = pair; sort(_versionPairs.begin(), _versionPairs.end(), [](const Entry &e1, const Entry &e2) { return util::tolower(e1.first) < util::tolower(e2.first); }); size_t maxNameLength=0; for (const Entry &versionPair : _versionPairs) maxNameLength = max(maxNameLength, versionPair.first.length()); for (const Entry &versionPair : _versionPairs) { string name = versionPair.first+":"; os << left << setw(maxNameLength+2) << name; os << (versionPair.second.empty() ? "unknown" : versionPair.second) << '\n'; } } protected: void append (const string &name, const string &version) { _versionPairs.emplace_back(pair(name, version)); } private: vector> _versionPairs; }; static void print_version (bool extended) { string versionstr = string(PROGRAM_NAME)+" "+PROGRAM_VERSION; #ifdef TARGET_SYSTEM if (extended && strlen(TARGET_SYSTEM) > 0) versionstr += " (" TARGET_SYSTEM ")"; #endif cout << versionstr << '\n'; if (extended) { cout << string(versionstr.length(), '-') << '\n'; VersionInfo versionInfo; versionInfo.add("clipper", CLIPPER_VERSION); versionInfo.add("freetype", FontEngine::version()); versionInfo.add("potrace", strchr(potrace_version(), ' ')); versionInfo.add("xxhash", XXH64HashFunction::version(), 3, 100); versionInfo.add("zlib", zlibVersion()); versionInfo.add("Ghostscript", Ghostscript().revisionstr(), true); #ifndef DISABLE_WOFF versionInfo.add("brotli", BrotliEncoderVersion(), 3, 0x1000); // versionInfo.add("woff2", woff2::version, 3, 0x100); versionInfo.add("fontforge", ff_version()); versionInfo.add("ttfautohint", TTFAutohint().version(), true); #endif #ifdef MIKTEX versionInfo.add("MiKTeX", FileFinder::instance().version()); #else versionInfo.add("kpathsea", FileFinder::instance().version()); #endif versionInfo.write(cout); } } static void init_fontmap (const CommandLine &cmdline) { string mapseq; if (cmdline.fontmapOpt.given()) mapseq = cmdline.fontmapOpt.value(); bool additional = !mapseq.empty() && strchr("+-=", mapseq[0]); if (mapseq.empty() || additional) { bool found = false; for (string mapfile : {"ps2pk", "pdftex", "dvipdfm", "psfonts"}) { if ((found = FontMap::instance().read(mapfile+".map"))) break; } if (!found) Message::wstream(true) << "none of the default map files could be found\n"; } if (!mapseq.empty()) FontMap::instance().read(mapseq); } /** Returns a unique string for the current state of the command-line * options affecting the SVG output. */ static string svg_options_hash (const CommandLine &cmdline) { // options affecting the SVG output vector svg_options = { &cmdline.bboxOpt, &cmdline.clipjoinOpt, &cmdline.colornamesOpt, &cmdline.commentsOpt, &cmdline.exactBboxOpt, &cmdline.fontFormatOpt, &cmdline.fontmapOpt, &cmdline.gradOverlapOpt, &cmdline.gradSegmentsOpt, &cmdline.gradSimplifyOpt, &cmdline.linkmarkOpt, &cmdline.magOpt, &cmdline.noFontsOpt, &cmdline.noMergeOpt, &cmdline.noSpecialsOpt, &cmdline.noStylesOpt, &cmdline.optimizeOpt, &cmdline.precisionOpt, &cmdline.relativeOpt, &cmdline.zoomOpt }; string idString = get_transformation_string(cmdline); for (const CL::Option *opt : svg_options) { idString += char(opt->given()); idString += opt->valueString(); } return XXH64HashFunction(idString).digestString(); } static bool list_page_hashes (const CommandLine &cmdline, DVIToSVG &dvisvg) { if (cmdline.pageHashesOpt.given()) { DVIToSVG::PAGE_HASH_SETTINGS.setParameters(cmdline.pageHashesOpt.value()); DVIToSVG::PAGE_HASH_SETTINGS.setOptionHash(svg_options_hash(cmdline)); if (DVIToSVG::PAGE_HASH_SETTINGS.isSet(DVIToSVG::HashSettings::P_LIST)) { dvisvg.listHashes(cmdline.pageOpt.value(), cout); return true; } } return false; } static void set_variables (const CommandLine &cmdline) { Message::COLORIZE = cmdline.colorOpt.given(); if (cmdline.progressOpt.given()) { DVIToSVG::COMPUTE_PROGRESS = true; SpecialActions::PROGRESSBAR_DELAY = cmdline.progressOpt.value(); } Color::SUPPRESS_COLOR_NAMES = !cmdline.colornamesOpt.given(); SVGTree::CREATE_CSS = !cmdline.noStylesOpt.given(); SVGTree::USE_FONTS = !cmdline.noFontsOpt.given(); if (!SVGTree::setFontFormat(cmdline.fontFormatOpt.value())) { string msg = "unknown font format '"+cmdline.fontFormatOpt.value()+"' (supported formats: "; for (const string &format : FontWriter::supportedFormats()) msg += format + ", "; msg.erase(msg.end()-2); throw CL::CommandLineException(msg); } SVGTree::CREATE_USE_ELEMENTS = cmdline.noFontsOpt.value() < 1; SVGTree::ZOOM_FACTOR = cmdline.zoomOpt.value(); SVGTree::RELATIVE_PATH_CMDS = cmdline.relativeOpt.given(); SVGTree::MERGE_CHARS = !cmdline.noMergeOpt.given(); SVGTree::ADD_COMMENTS = cmdline.commentsOpt.given(); DVIToSVG::TRACE_MODE = cmdline.traceAllOpt.given() ? (cmdline.traceAllOpt.value() ? 'a' : 'm') : 0; Message::LEVEL = cmdline.verbosityOpt.value(); PhysicalFont::EXACT_BBOX = cmdline.exactBboxOpt.given(); PhysicalFont::KEEP_TEMP_FILES = cmdline.keepOpt.given(); PhysicalFont::METAFONT_MAG = max(1.0, cmdline.magOpt.value()); XMLString::DECIMAL_PLACES = max(0, min(6, cmdline.precisionOpt.value())); PsSpecialHandler::COMPUTE_CLIPPATHS_INTERSECTIONS = cmdline.clipjoinOpt.given(); PsSpecialHandler::SHADING_SEGMENT_OVERLAP = cmdline.gradOverlapOpt.given(); PsSpecialHandler::SHADING_SEGMENT_SIZE = max(1, cmdline.gradSegmentsOpt.value()); PsSpecialHandler::SHADING_SIMPLIFY_DELTA = cmdline.gradSimplifyOpt.value(); if (cmdline.optimizeOpt.given()) { SVGOptimizer::MODULE_SEQUENCE = cmdline.optimizeOpt.value(); vector modnames; if (!SVGOptimizer().checkModuleString(SVGOptimizer::MODULE_SEQUENCE, modnames)) { string msg = "invalid optimizer module"; if (modnames.size() > 1) msg += 's'; msg += ": "; for (const string &modname : modnames) msg += modname + ", "; msg.erase(msg.end()-2); throw CL::CommandLineException(msg); } } } static void timer_message (double start_time, const pair *pageinfo) { Message::mstream().indent(0); if (!pageinfo) Message::mstream(false, Message::MC_PAGE_NUMBER) << "\n" << "file"; else { Message::mstream(false, Message::MC_PAGE_NUMBER) << "\n" << pageinfo->first << " of " << pageinfo->second << " page"; if (pageinfo->second > 1) Message::mstream(false, Message::MC_PAGE_NUMBER) << 's'; } Message::mstream(false, Message::MC_PAGE_NUMBER) << " converted in " << (System::time()-start_time) << " seconds\n"; } int main (int argc, char *argv[]) { try { CommandLine cmdline; cmdline.parse(argc, argv); if (argc == 1 || cmdline.helpOpt.given()) { cmdline.help(cout, cmdline.helpOpt.value()); return 0; } FileFinder::init(argv[0], "dvisvgm", !cmdline.noMktexmfOpt.given()); set_libgs(cmdline); if (cmdline.versionOpt.given()) { print_version(cmdline.versionOpt.value()); return 0; } if (cmdline.listSpecialsOpt.given()) { DVIToSVG::setProcessSpecials(); SpecialManager::instance().writeHandlerInfo(cout); return 0; } if (cmdline.optimizeOpt.value() == "list") { SVGOptimizer().listModules(cout); return 0; } if (!set_cache_dir(cmdline) || !set_temp_dir(cmdline)) return 0; check_bbox(cmdline.bboxOpt.value()); if (!HyperlinkManager::setLinkMarker(cmdline.linkmarkOpt.value())) Message::wstream(true) << "invalid argument '"+cmdline.linkmarkOpt.value()+"' supplied for option --linkmark\n"; if (cmdline.stdinOpt.given() || cmdline.singleDashGiven()) { if (!cmdline.filenames().empty()) throw MessageException("option - or --stdin can't be used together with a filename"); cmdline.addFilename(""); // empty filename => read from stdin } if (argc > 1 && cmdline.filenames().empty()) throw MessageException("no input file given"); SignalHandler::instance().start(); string inputfile = ensure_suffix(cmdline.filenames()[0], cmdline.epsOpt.given() ? "eps" : cmdline.pdfOpt.given() ? "pdf" : "dvi"); SourceInput srcin(inputfile); if (!srcin.getInputStream(true)) throw MessageException("can't open file '" + srcin.getMessageFileName() + "' for reading"); double start_time = System::time(); set_variables(cmdline); SVGOutput out(cmdline.stdoutOpt.given() ? "" : srcin.getFileName(), cmdline.outputOpt.value(), cmdline.zipOpt.given() ? cmdline.zipOpt.value() : 0); pair pageinfo; if (cmdline.epsOpt.given() || cmdline.pdfOpt.given()) { auto img2svg = unique_ptr( cmdline.epsOpt.given() ? static_cast(new EPSToSVG(srcin.getFilePath(), out)) : static_cast(new PDFToSVG(srcin.getFilePath(), out))); img2svg->setPageTransformation(get_transformation_string(cmdline)); img2svg->convert(cmdline.pageOpt.value(), &pageinfo); timer_message(start_time, img2svg->isSinglePageFormat() ? nullptr : &pageinfo); } else { init_fontmap(cmdline); DVIToSVG dvi2svg(srcin.getInputStream(), out); if (list_page_hashes(cmdline, dvi2svg)) return 0; const char *ignore_specials=nullptr; if (cmdline.noSpecialsOpt.given()) ignore_specials = cmdline.noSpecialsOpt.value().empty() ? "*" : cmdline.noSpecialsOpt.value().c_str(); dvi2svg.setProcessSpecials(ignore_specials, true); dvi2svg.setPageTransformation(get_transformation_string(cmdline)); dvi2svg.setPageSize(cmdline.bboxOpt.value()); dvi2svg.convert(cmdline.pageOpt.value(), &pageinfo); timer_message(start_time, &pageinfo); } } catch (DVIException &e) { Message::estream() << "\nDVI error: " << e.what() << '\n'; } catch (PSException &e) { Message::estream() << "\nPostScript error: " << e.what() << '\n'; } catch (SignalException &e) { Message::wstream().clearline(); Message::wstream(true) << "execution interrupted by user\n"; } catch (exception &e) { Message::estream(true) << e.what() << '\n'; } return 0; } dvisvgm-2.8.1/src/HtmlSpecialHandler.hpp0000664000175000017500000000431413510660062015130 00000000000000/************************************************************************* ** HtmlSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef HTMLSPECIALHANDLER_HPP #define HTMLSPECIALHANDLER_HPP #include #include "Color.hpp" #include "SpecialHandler.hpp" class SpecialActions; class HtmlSpecialHandler : public SpecialHandler { public: HtmlSpecialHandler () : _active(false) {} void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; const char* name () const override {return "html";} const char* info () const override {return "hyperref specials";} std::vector prefixes() const override; protected: void dviEndPage (unsigned pageno, SpecialActions &actions) override; void dviMovedTo (double x, double y, SpecialActions &actions) override; private: bool _active; }; #endif dvisvgm-2.8.1/src/FontManager.hpp0000664000175000017500000000722613510660062013633 00000000000000/************************************************************************* ** FontManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTMANAGER_HPP #define FONTMANAGER_HPP #include #include #include #include #include #include #include #include "Color.hpp" #include "FontStyle.hpp" class FileFinder; class Font; class VirtualFont; /** This class provides methods for easy DVI font handling. * DVI and VF files use local font numbers to reference fonts. For SVG output * we need a single list with unique IDs of all physical fonts. Characters of * virtual fonts are completely replaced by their DVI description so they don't * appear anywhere in the output. */ class FontManager { using Num2IdMap = std::unordered_map; using Name2IdMap = std::unordered_map; using VfNum2IdMap = std::unordered_map; using VfFirstFontMap = std::unordered_map; using VfStack = std::stack; public: static FontManager& instance (); int registerFont (uint32_t fontnum, const std::string &fontname, uint32_t checksum, double dsize, double scale); int registerFont (uint32_t fontnum, const std::string &fname, double ptsize, const FontStyle &style, Color color); int registerFont (uint32_t fontnum, std::string fname, int fontIndex, double ptsize, const FontStyle &style, Color color); Font* getFont (int n) const; Font* getFont (const std::string &name) const; Font* getFontById (int id) const; const VirtualFont* getVF () const; int fontID (int n) const; int fontID (const Font *font) const; int fontID (const std::string &name) const; int fontnum (int id) const; int vfFirstFontNum (const VirtualFont *vf) const; void enterVF (VirtualFont *vf); void leaveVF (); void assignVFChar (int c, std::vector &&dvi); std::ostream& write (std::ostream &os, Font *font=nullptr, int level=0); protected: FontManager () =default; private: std::vector> _fonts; ///< all registered Fonts Num2IdMap _num2id; ///< DVI font number -> fontID Name2IdMap _name2id; ///< fontname -> fontID VfNum2IdMap _vfnum2id; VfStack _vfStack; ///< stack of currently processed virtual fonts VfFirstFontMap _vfFirstFontMap; ///< VF -> local font number of first font defined in VF }; #endif dvisvgm-2.8.1/src/SVGSingleCharTextHandler.hpp0000664000175000017500000000337013510660062016170 00000000000000/************************************************************************* ** SVGSingleCharTextHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGSINGLECHARTEXTHANDLER_HPP #define SVGSINGLECHARTEXTHANDLER_HPP #include "SVGCharHandler.hpp" class SVGSingleCharTextHandler : public SVGCharTextHandler { public: explicit SVGSingleCharTextHandler (bool createStyleElements) : SVGCharTextHandler(createStyleElements) {} void appendChar (uint32_t c, double x, double y) override; }; #endif dvisvgm-2.8.1/src/ColorSpecialHandler.hpp0000664000175000017500000000410613510660062015301 00000000000000/************************************************************************* ** ColorSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef COLORSPECIALHANDLER_HPP #define COLORSPECIALHANDLER_HPP #include #include #include #include "Color.hpp" #include "SpecialHandler.hpp" class ColorSpecialHandler : public SpecialHandler { public: bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; static Color readColor (std::istream &is); static Color readColor (const std::string &model, std::istream &is); const char* name () const override {return "color";} const char* info () const override {return "complete support of color specials";} std::vector prefixes() const override; private: std::stack _colorStack; }; #endif dvisvgm-2.8.1/src/PDFParser.cpp0000664000175000017500000003607613511327144013222 00000000000000/************************************************************************* ** PDFParser.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "InputReader.hpp" #include "PDFParser.hpp" #include "utility.hpp" using namespace std; /** Parses PDF from an input stream and returns the corresponding object representation. * @param[in] is input stream the PDF data is read from * @param[in] opHandler handler used to treat PDF operators * @return the parsed objects */ vector PDFParser::parse (std::istream &is, const PDFOperatorHandler &opHandler) { StreamInputReader ir(is); return parse(ir, opHandler); } /** Parses PDF from a string and returns the corresponding object representation. * @param[in] str string that contains the PDF data * @param[in] opHandler handler used to treat PDF operators * @return the parsed objects */ vector PDFParser::parse (const std::string &str, const PDFOperatorHandler &opHandler) { istringstream iss(str); return parse(iss, opHandler); } /** Parses PDF from an InputReader object and returns the corresponding object representation. * @param[in] ir InputReader the PDF data is read from * @param[in] opHandler handler used to treat PDF operators * @return the parsed objects */ vector PDFParser::parse (InputReader &ir, const PDFOperatorHandler &opHandler) { vector objects; while (!ir.eof()) { ir.skipSpace(); if (ir.peek() == '%') // comment? while (ir.get() != '\n' && !ir.eof()); else if (!ir.eof()) parse(ir, objects, opHandler); } return objects; } /** Default handler for PDF operators. Just adds the operators to the * object vector without evaluating them. * @param[in] opname name of the operator * @param[in,out] objects vector holding the parsed objects */ static void append_operator (const string &opname, vector &objects) { objects.emplace_back(PDFOperator(opname)); } /** Parses PDF from an input stream and returns the corresponding object representation. * @param[in] is input stream the PDF data is read from * @return the parsed objects */ vector PDFParser::parse (std::istream &is) { return parse(is, append_operator); } /** Parses PDF from a string and returns the corresponding object representation. * @param[in] str string that contains the PDF data * @return the parsed objects */ vector PDFParser::parse (const std::string &str) { return parse(str, append_operator); } /** Parses PDF from an InputReader object and returns the corresponding object representation. * @param[in] ir InputReader the PDF data is read from * @return the parsed objects */ vector PDFParser::parse (InputReader &ir) { return parse(ir, append_operator); } /** Parses PDF from an InputReader object and appends the recognized objects to a vector. * @param[in] ir InputReader the PDF data is read from * @param[in,out] objects the parsed PDF objects are appended to this vector * @return the parsed objects */ void PDFParser::parse (InputReader &ir, vector &objects) { parse(ir, objects, append_operator); } inline bool isoctaldigit (int c) {return c >= '0' && c <= '7';} /** Parses a PDF escape sequence of the form \FOO, where FOO is a single * character or a sequence of 1-3 octal digits * @return pair (s,c), s=true if c contains a parsed character */ static pair parse_escape_seq (InputReader &ir) { // leading backslash has already been read if (isoctaldigit(ir.peek())) { string str; for (int i=0; i < 3 && isoctaldigit(ir.peek()); i++) str += static_cast(ir.get()); return pair{true, stoi(str, nullptr, 8)}; } char c = static_cast(ir.get()); switch (c) { case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case '\n': case '\r': if ((c == '\n' && ir.peek() == '\r') || (c == '\r' && ir.peek() == '\n')) ir.get(); return pair{false, 0}; } return pair{true, c}; } /** Parses a literal PDF string of the form (FOO). */ static string parse_literal_string (InputReader &ir) { string str; ir.get(); // skip initial '(' int open_parens=1; while (ir.peek() >= 0 && open_parens > 0) { if (ir.peek() == '\n' || ir.peek() == '\r') break; int c = ir.get(); switch (c) { case '(': open_parens++; break; case ')': open_parens--; break; case '\\': pair state = parse_escape_seq(ir); c = state.first ? state.second : -1; break; } if (open_parens > 0 && c >= 0) str += static_cast(c); } if (open_parens > 0) throw PDFException("missing ')' at end of literal string"); return str; } /** Gets a single hex digit from the InputReader. */ static char get_hex_digit (InputReader &ir) { int c = ir.get(); if (isxdigit(c)) return char(c); throw PDFException("invalid hexadecimal digit '" + string(1, char(c)) + "'"); } /** Parses a PDF hex string of the form , where FOO is a sequence of * hex digits optionally separated by whitespace. */ static string parse_hex_string (InputReader &ir) { // initial '<' has already been read string str; ir.skipSpace(); while (ir.peek() > 0 && ir.peek() != '>') { string hexpair; hexpair += get_hex_digit(ir); ir.skipSpace(); if (ir.peek() > 0 && ir.peek() != '>') hexpair += get_hex_digit(ir); else if (ir.peek() == '>') hexpair += '0'; ir.skipSpace(); str += static_cast(stoi(hexpair, nullptr, 16)); } if (ir.peek() != '>') throw PDFException("missing '>' at end of hexadecimal string"); ir.get(); // skip closing '>' return str; } using NumberVariant = mpark::variant; /** Parses a PDF number from a string. The number is either integer or real. * @param[in] str string to parse * @param[out] nv variant holding the numeric value * @return true if entire string has been parsed succesfully */ static bool parse_number (const string &str, NumberVariant &nv) { if (str.empty()) return false; try { size_t dotpos = str.find('.'); if (dotpos == string::npos) { // not a real number? size_t count; nv = NumberVariant(stoi(str, &count, 10)); // then try to convert str to int return count == str.length(); // successful only if all characters have been processed } string postdot = str.substr(dotpos+1); // ensure signless integer after dot to exclude exponental notation // which is not allowed in PDF real number constants if (!postdot.empty() && isdigit(postdot[0])) { size_t count; stoi(postdot, &count, 10); if (count != postdot.length()) return false; } size_t count; nv = NumberVariant(stod(str, &count)); return count == str.length(); } catch (invalid_argument &e) { return false; } } /** Parses a PDF array from the input stream and returns a corresponding object. */ PDFArray PDFParser::parseArray (InputReader &ir, const PDFOperatorHandler &opHandler) { ir.get(); // skip '[' vector localObjects; while (!ir.eof() && ir.peek() != ']') parse(ir, localObjects, opHandler); ir.skipSpace(); if (ir.peek() != ']') throw PDFException("missing ']' at end of array"); ir.get(); PDFArray arr; std::move(localObjects.begin(), localObjects.end(), back_inserter(arr)); return arr; } /** Parses a PDF dictionary from the input stream and returns a corresponding object. * The function expects that the first opening angle bracket denoting the start of an * dictionary has already been swallowed from the stream. */ PDFDict PDFParser::parseDict (InputReader &ir, const PDFOperatorHandler &opHandler) { ir.get(); // skip second "<" vector localObjects; while (!ir.eof() && ir.peek() != '>') parse(ir, localObjects, opHandler); if (ir.getString(2) != ">>") throw PDFException("missing '>>' at end of dictionary"); PDFDict dict; for (auto it=localObjects.begin(); it != localObjects.end(); ++it) { if (!it->get()) throw PDFException("name key expected in dictionary"); const PDFName &key = *it->get(); if (++it == localObjects.end()) throw PDFException(string("missing dictionary value for key '")+key.str+"'"); dict.emplace(key.str, std::move(*it)); } return dict; } static PDFStream parse_stream (InputReader &ir, const char *delim) { do ir.skipUntil("endstream"); while (ir.peek() >= 0 && !strchr(delim, ir.peek())); // ensure delimiter after "endstream" return PDFStream(); } static PDFIndirectObject parse_indirect_object (InputReader &ir, const char *delim, vector &objects) { do ir.skipUntil("endobj"); while (ir.peek() >= 0 && !strchr(delim, ir.peek())); // ensure delimiter after "endobj" if (objects.size() >= 2) { const int *genno = objects.back().get(); objects.pop_back(); const int *objno = objects.back().get(); objects.pop_back(); if (objno && genno) return PDFIndirectObject(*objno, *genno); } throw PDFException("object and generation number expected before 'obj'"); } static PDFObjectRef parse_object_ref (vector &objects) { if (objects.size() >= 2) { const int *genno = objects.back().get(); objects.pop_back(); const int *objno = objects.back().get(); objects.pop_back(); if (objno && genno) return PDFObjectRef(*objno, *genno); } throw PDFException("object and generation number expected before 'R'"); } /** Replaces all occurences of "#XX" (XX are two hex digits) with the corresponding character. */ static string& subst_numeric_chars (string &str) { for (size_t pos=str.find('#'); pos != string::npos; pos=str.find('#', pos+1)) { if (pos > str.length()-3) throw PDFException("sign character # must be followed by two hexadecimal digits"); if (isxdigit(str[pos+1]) && isxdigit(str[pos+2])) { int c = stoi(str.substr(pos+1, 2), nullptr, 16); if (c == 0) throw PDFException("null character not permitted in name"); str.replace(pos, 3, 1, static_cast(c)); } else throw PDFException("sign character # must be followed by two hexadecimal digits"); } return str; } /** Parses a single PDF object from an InputReader object. * @param[in,out] ir reader object to read the PDF data from * @param[out] objects the parsed object is appended to this vector * @param[in] opHandler handler used to treat PDF operators * @throws PDFException on failure */ void PDFParser::parse (InputReader &ir, vector &objects, const PDFOperatorHandler &opHandler) { static const char *delim = "()<>[]{}/% \t\n\r\f"; ir.skipSpace(); if (ir.peek() < 0) return; switch (ir.peek()) { case '(': objects.emplace_back(parse_literal_string(ir)); break; case '[': objects.emplace_back(util::make_unique(parseArray(ir, opHandler))); break; case '<': ir.get(); if (ir.peek() != '<') objects.emplace_back(parse_hex_string(ir)); else objects.emplace_back(util::make_unique(parseDict(ir, opHandler))); break; case '/': { ir.get(); string name = ir.getString(delim); objects.emplace_back(PDFName(subst_numeric_chars(name))); break; } default: { string str = ir.getString(delim); if (str.empty()) break; if (str == "null") objects.emplace_back(PDFNull()); else if (str == "true") objects.emplace_back(true); else if (str == "false") objects.emplace_back(false); else if (str == "stream") objects.emplace_back(parse_stream(ir, delim)); else if (str == "obj") objects.emplace_back(parse_indirect_object(ir, delim, objects)); else if (str == "R") objects.emplace_back(parse_object_ref(objects)); else { NumberVariant number; if (!parse_number(str, number)) opHandler(str, objects); else { if (mpark::get_if(&number)) objects.emplace_back(mpark::get(number)); else objects.emplace_back(mpark::get(number)); } } } } } ////////////////////////////////////////////////////////////////////////// struct ToDoubleVisitor { template double operator () (const V &val) {return 0;} }; template<> double ToDoubleVisitor::operator () (const int &val) {return static_cast(val);} template<> double ToDoubleVisitor::operator () (const double &val) {return val;} template<> double ToDoubleVisitor::operator () (const string &val) { try { return stod(val); } catch (exception &e) { return 0; } } PDFObject::operator double () const { return mpark::visit(ToDoubleVisitor(), _value); } PDFObject::operator std::string () const { ostringstream oss; oss << *this; return oss.str(); } static std::ostream& operator << (std::ostream &os, const PDFName &name) {return os << name.str;} static ostream& operator << (ostream &os, const PDFNull&) {return os << "null";} static ostream& operator << (ostream &os, const PDFStream&) {return os << "stream";} static ostream& operator << (ostream &os, const PDFOperator &op) {return os << op.opname;} static ostream& operator << (ostream &os, const PDFIndirectObject &obj) { return os << "obj(" << obj.objnum << ", " << obj.gennum << ')'; } static ostream& operator << (ostream &os, const PDFObjectRef &ref) { return os << "obj(" << ref.objnum << ", " << ref.gennum << ')'; } static ostream& operator << (ostream &os, const unique_ptr> &val) { os << '['; for (auto it=val->begin(); it != val->end(); ++it) { if (it != val->begin()) os << ", "; it->write(os); } os << ']'; return os; } static ostream& operator << (ostream &os, const unique_ptr> &val) { os << "<<"; for (auto it=val->begin(); it != val->end(); ++it) { if (it != val->begin()) os << ", "; os << it->first << ':' << it->second; } os << ">>"; return os; } struct WriteVisitor { explicit WriteVisitor (ostream &os) : _os(os) {} template void operator () (const T &val) {_os << val;} ostream &_os; }; void PDFObject::write (ostream &os) const { mpark::visit(WriteVisitor(os), _value); } dvisvgm-2.8.1/src/CMapReader.cpp0000664000175000017500000002012213560004141013351 00000000000000/************************************************************************* ** CMapReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "CMap.hpp" #include "CMapManager.hpp" #include "CMapReader.hpp" #include "FileFinder.hpp" #include "InputReader.hpp" #include "utility.hpp" using namespace std; /** Reads a cmap file and returns the corresponding CMap object. * @param fname[in] name/path of cmap file * @return CMap object representing the read data, or 0 if file could not be read */ unique_ptr CMapReader::read (const string &fname) { if (const char *path = FileFinder::instance().lookup(fname, "cmap", false)) { ifstream ifs(path); if (ifs) return read(ifs, fname); } _tokens.clear(); return unique_ptr(); } /** Reads cmap data from a given stream and returns the corresponding CMap object. * @param is[in] cmap data input stream * @param is[in] name name of CMap to be read * @return CMap object representing the read data, or 0 if file could not be read */ unique_ptr CMapReader::read (std::istream& is, const string &name) { _tokens.clear(); _cmap = util::make_unique(name); StreamInputReader ir(is); try { while (ir) { Token token(ir); if (token.type() == Token::Type::END) break; if (_inCMap) { if (token.type() == Token::Type::OPERATOR) executeOperator(token.strvalue(), ir); else _tokens.push_back(token); } else if (token.type() == Token::Type::OPERATOR && token.strvalue() == "begincmap") _inCMap = true; } } catch (CMapReaderException &e) { _cmap.reset(); throw; } return std::move(_cmap); } /** Executes a PS operator from the CMap file. * @param[in] opname name of operator to execute * @param[in] ir reader object used to read the CMap stream */ void CMapReader::executeOperator (const string &opname, InputReader &ir) { struct Operator { const char *name; void (CMapReader::*handler)(InputReader&); }; constexpr array operators {{ {"beginbfchar", &CMapReader::op_beginbfchar}, {"beginbfrange", &CMapReader::op_beginbfrange}, {"begincidchar", &CMapReader::op_begincidchar}, {"begincidrange", &CMapReader::op_begincidrange}, {"def", &CMapReader::op_def}, {"endcmap", &CMapReader::op_endcmap}, {"usecmap", &CMapReader::op_usecmap}, }}; auto it = find_if(operators.begin(), operators.end(), [&](const Operator &op) { return op.name == opname; }); if (it != operators.end()) (this->*it->handler)(ir); _tokens.clear(); } void CMapReader::op_def (InputReader&) { size_t size = _tokens.size(); if (size >= 2) { const string val = popToken().strvalue(); const string name = popToken().strvalue(); if (name == "WMode") { if (val == "0" || val == "1") _cmap->_vertical = (val == "1"); else throw CMapReaderException("invalid WMode (0 or 1 expected)"); } else if (name == "Registry") _cmap->_registry = val; else if (name == "Ordering") _cmap->_ordering = val; } } void CMapReader::op_endcmap (InputReader &) { _inCMap = false; } void CMapReader::op_usecmap (InputReader &) { if (_tokens.empty()) throw CMapReaderException("stack underflow while processing usecmap"); else { const string name = popToken().strvalue(); if ((_cmap->_basemap = CMapManager::instance().lookup(name)) == nullptr) throw CMapReaderException("CMap file '"+name+"' not found"); } } static uint32_t parse_hexentry (InputReader &ir) { ir.skipSpace(); if (ir.get() != '<') throw CMapReaderException("invalid range entry ('<' expected)"); unsigned val; if (!ir.parseUInt(16, val)) throw CMapReaderException("invalid range entry (hexadecimal value expected)"); if (ir.get() != '>') throw CMapReaderException("invalid range entry ('>' expected)"); return uint32_t(val); } void CMapReader::parseCIDChars (InputReader &ir, bool isRange) { if (!_tokens.empty() && _tokens.back().type() == Token::Type::NUMBER) { ir.skipSpace(); int num_entries = static_cast(popToken().numvalue()); while (num_entries > 0 && ir.peek() == '<') { uint32_t first = parse_hexentry(ir); uint32_t last = first; if (isRange) last = parse_hexentry(ir); ir.skipSpace(); uint32_t cid; if (!ir.parseUInt(cid)) throw CMapReaderException("invalid char entry (decimal value expected)"); _cmap->addCIDRange(first, last, cid); ir.skipSpace(); } } } void CMapReader::op_begincidchar (InputReader &ir) { parseCIDChars(ir, false); } void CMapReader::op_begincidrange (InputReader &ir) { parseCIDChars(ir, true); } void CMapReader::op_beginbfrange (InputReader &ir) { if (!_tokens.empty() && _tokens.back().type() == Token::Type::NUMBER) { ir.skipSpace(); int num_entries = static_cast(popToken().numvalue()); while (num_entries > 0 && ir.peek() == '<') { uint32_t first = parse_hexentry(ir); uint32_t last = parse_hexentry(ir); uint32_t chrcode = parse_hexentry(ir); _cmap->addBFRange(first, last, chrcode); ir.skipSpace(); } _cmap->_mapsToCID = false; } } void CMapReader::op_beginbfchar (InputReader &ir) { if (!_tokens.empty() && _tokens.back().type() == Token::Type::NUMBER) { ir.skipSpace(); int num_entries = static_cast(popToken().numvalue()); while (num_entries > 0 && ir.peek() == '<') { uint32_t cid = parse_hexentry(ir); ir.skipSpace(); if (ir.peek() == '/') throw CMapReaderException("mapping of named characters is not supported"); uint32_t chrcode = parse_hexentry(ir); _cmap->addBFRange(cid, cid, chrcode); ir.skipSpace(); } _cmap->_mapsToCID = false; } } //////////////////////////////////////////////////////////////////////////////////// CMapReader::Token::Token (InputReader &ir) { scan(ir); } /** Reads the next characters from the input stream to create a token. */ void CMapReader::Token::scan (InputReader &ir) { ir.skipSpace(); while (ir.peek() == '%') { // comment? while (ir.peek() != '\n') // => skip until end of line ir.get(); ir.skipSpace(); } ir.skipSpace(); if (ir.eof()) _type = Type::END; else if (ir.peek() == '/') { // PS name? ir.get(); while (!strchr("[]{}<>", ir.peek()) && !isspace(ir.peek())) _value += ir.get(); _type = Type::NAME; } else if (ir.peek() == '(') { // string? ir.get(); int level=0; while (ir.peek() != ')' || level > 0) { if (ir.peek() == '(') level++; else if (ir.peek() == ')' && level > 0) level--; _value += ir.get(); } ir.get(); // skip ')' _type = Type::STRING; } else if (strchr("[]{}<>", ir.peek())) { // PS delimiter _value = ir.get(); _type = Type::DELIM; } else if (isdigit(ir.peek())) { // number? double val; if (ir.parseDouble(val)) { _value = util::to_string(val); _type = Type::NUMBER; } } else { while (!strchr("[]{}<>", ir.peek()) && !isspace(ir.peek())) _value += ir.get(); _type = Type::OPERATOR; } } dvisvgm-2.8.1/src/StreamReader.hpp0000664000175000017500000000563713536436567014037 00000000000000/************************************************************************* ** StreamReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef STREAMREADER_HPP #define STREAMREADER_HPP #include #include #include #include "MessageException.hpp" class HashFunction; class StreamReader { public: explicit StreamReader (std::istream &is) : _is(&is) {} virtual ~StreamReader () =default; bool isStreamValid () const {return _is;} bool eof () const {return _is->eof();} void clearStream () {_is->clear();} std::istream& replaceStream (std::istream &s); uint32_t readUnsigned (int n); uint32_t readUnsigned (int n, HashFunction &hashfunc); int32_t readSigned (int n); int32_t readSigned (int n, HashFunction &hashfunc); std::string readString (); std::string readString (HashFunction &hashfunc, bool finalZero=false); std::string readString (int length); std::string readString (int length, HashFunction &hashfunc); std::vector readBytes (int n); std::vector readBytes (int n, HashFunction &hash); int readByte () {return _is->get();} int readByte (HashFunction &hashfunc); void seek (std::streampos pos, std::ios::seekdir dir) {_is->seekg(pos, dir);} void seek (std::streampos pos) {_is->seekg(pos);} std::streampos tell () const {return _is->tellg();} int peek () const {return _is->peek();} protected: std::istream& getInputStream () {return *_is;} private: std::istream *_is; }; struct StreamReaderException : public MessageException { explicit StreamReaderException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/SpecialHandler.hpp0000664000175000017500000000472013510660062014304 00000000000000/************************************************************************* ** SpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SPECIALHANDLER_HPP #define SPECIALHANDLER_HPP #include #include #include #include "MessageException.hpp" class SpecialActions; class SpecialManager; struct SpecialException : public MessageException { explicit SpecialException (const std::string &msg) : MessageException(msg) {} }; class SpecialHandler { friend class SpecialManager; public: virtual ~SpecialHandler () =default; virtual const char* info () const=0; virtual const char* name () const=0; virtual std::vector prefixes() const =0; virtual void setDviScaleFactor (double dvi2bp) {} virtual void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) {} virtual bool process (const std::string &prefix, std::istream &is, SpecialActions &actions)=0; virtual void dviPreprocessingFinished () {} virtual void dviBeginPage (unsigned pageno, SpecialActions &actions) {} virtual void dviEndPage (unsigned pageno, SpecialActions &actions) {} virtual void dviMovedTo (double x, double y, SpecialActions &actions) {} }; #endif dvisvgm-2.8.1/src/VFReader.cpp0000664000175000017500000001474413536436502013076 00000000000000/************************************************************************* ** VFReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "FixWord.hpp" #include "Font.hpp" #include "Length.hpp" #include "VFActions.hpp" #include "VFReader.hpp" using namespace std; VFReader::VFReader (istream &is) : StreamReader(is) { } VFActions* VFReader::replaceActions (VFActions *a) { VFActions *ret = _actions; _actions = a; return ret; } /** Reads a single VF command from the current position of the input stream and calls the * corresponding cmdFOO method. The execution can be influenced by a function of type ApproveOpcode. * It takes an opcode and returns true if the command is supposed to be executed. * @param[in] approve function to approve invocation of the action assigned to command * @return opcode of the executed command */ int VFReader::executeCommand (ApproveAction approve) { int opcode = readByte(); if (!isStreamValid() || opcode < 0) // at end of file? throw VFException("invalid VF file"); bool approved = !approve || approve(opcode); VFActions *actions = _actions; if (!approved) replaceActions(nullptr); // disable actions if (opcode <= 241) // short character definition? cmdShortChar(opcode); else if (opcode >= 243 && opcode <= 246) // font definition? cmdFontDef(opcode-243+1); else { switch (opcode) { case 242: cmdLongChar(); break; // long character definition case 247: cmdPre(); break; // preamble case 248: cmdPost(); break; // postamble default : { // invalid opcode replaceActions(actions); // reenable actions throw VFException("undefined VF command (opcode " + std::to_string(opcode) + ")"); } } } replaceActions(actions); // reenable actions return opcode; } bool VFReader::executeAll () { clearStream(); // reset all status bits if (!isStreamValid()) return false; seek(0); // move file pointer to first byte of the input stream while (!eof() && executeCommand() != 248); // stop reading after post (248) return true; } bool VFReader::executePreambleAndFontDefs () { clearStream(); if (!isStreamValid()) return false; seek(0); // move file pointer to first byte of the input stream auto is_pre_or_fontdef = [](int op) {return op > 242;}; while (!eof() && executeCommand(is_pre_or_fontdef) > 242); // stop reading after last font definition return true; } bool VFReader::executeCharDefs () { clearStream(); if (!isStreamValid()) return false; seek(0); auto is_chardef = [](int op) {return op < 243;}; while (!eof() && executeCommand(is_chardef) < 243); // stop reading after last char definition return true; } ////////////////////////////////////////////////////////////////////////////// /** Reads and executes DVI preamble command. */ void VFReader::cmdPre () { uint32_t i = readUnsigned(1); // identification number (should be 2) uint32_t k = readUnsigned(1); // length of following comment string cmt = readString(k); // comment uint32_t cs = readUnsigned(4); // check sum to be compared with TFM cecksum int32_t ds = readUnsigned(4); // design size (same as TFM design size) (fix_word) _designSize = double(FixWord(ds))*Length::pt2bp; if (i != 202) throw VFException("invalid identification value in preamble"); if (_actions) _actions->vfPreamble(cmt, cs, ds); } void VFReader::cmdPost () { while ((readUnsigned(1)) == 248); // skip fill bytes if (_actions) _actions->vfPostamble(); } void VFReader::cmdLongChar () { uint32_t pl = readUnsigned(4); // packet length (length of DVI subroutine) if (!_actions) seek(8+pl, ios::cur); // skip remaining char definition bytes else { uint32_t cc = readUnsigned(4); // character code readUnsigned(4); // equals character width from corresponding TFM file auto dvi = readBytes(pl); // DVI subroutine _actions->defineVFChar(cc, std::move(dvi)); // call template method for user actions } } /** Reads and executes short_char_x command. * @param[in] pl packet length (length of DVI subroutine) */ void VFReader::cmdShortChar (int pl) { if (!_actions) seek(4+pl, ios::cur); // skip char definition bytes else { uint32_t cc = readUnsigned(1); // character code readUnsigned(3); // character width from corresponding TFM file auto dvi = readBytes(pl); // DVI subroutine _actions->defineVFChar(cc, std::move(dvi)); // call template method for user actions } } void VFReader::cmdFontDef (int len) { uint32_t fontnum = readUnsigned(len); // font number uint32_t checksum = readUnsigned(4); // font checksum (to be compared with corresponding TFM checksum) uint32_t ssize = readUnsigned(4); // scaled size of font relative to design size (fix_word) uint32_t dsize = readUnsigned(4); // design size of font (same as TFM design size) (fix_word) uint32_t pathlen = readUnsigned(1); // length of font path uint32_t namelen = readUnsigned(1); // length of font name string fontpath = readString(pathlen); string fontname = readString(namelen); if (_actions) { double ss = double(FixWord(ssize))*Length::pt2bp; double ds = double(FixWord(dsize))*Length::pt2bp; _actions->defineVFFont(fontnum, fontpath, fontname, checksum, ds, ss*_designSize); } } dvisvgm-2.8.1/src/Length.cpp0000664000175000017500000001117013511327144012641 00000000000000/************************************************************************* ** Length.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "InputReader.hpp" #include "Length.hpp" using namespace std; void Length::set (const string &lenstr) { switch (lenstr.length()) { case 0: _pt = 0; break; case 1: if (isdigit(lenstr[0])) _pt = lenstr[0] - '0'; else throw UnitException(string("invalid length: ")+lenstr); break; default: istringstream iss(lenstr); StreamInputReader ir(iss); double val; if (!ir.parseDouble(val)) throw UnitException(string("invalid length: ")+lenstr); string unit = ir.getWord(); set(val, unit); } } void Length::set (double val, Unit unit) { switch (unit) { case Unit::PT: _pt = val; break; case Unit::BP: _pt = val/pt2bp; break; case Unit::IN: _pt = val/pt2in; break; case Unit::CM: _pt = val/pt2cm; break; case Unit::MM: _pt = val/pt2mm; break; case Unit::PC: _pt = val/pt2pc; break; case Unit::DD: _pt = val/pt2dd; break; case Unit::CC: _pt = val/pt2cc; break; case Unit::SP: _pt = val/pt2sp; break; default: // this isn't supposed to happen throw UnitException("invalid length unit: (" + std::to_string(static_cast(unit)) + ")"); } } double Length::get (Unit unit) const { switch (unit) { case Unit::PT: return pt(); case Unit::BP: return bp(); case Unit::IN: return in(); case Unit::CM: return cm(); case Unit::MM: return mm(); case Unit::PC: return pc(); case Unit::DD: return dd(); case Unit::CC: return cc(); case Unit::SP: return sp(); } // this isn't supposed to happen throw UnitException("invalid length unit: (" + std::to_string(static_cast(unit)) + ")"); } string Length::toString (Unit unit) const { ostringstream oss; oss << get(unit) << unitToString(unit); return oss.str(); } static constexpr int unit_id (int c1, int c2) { return (c1 << 8) | c2; } Length::Unit Length::stringToUnit (const std::string &unitstr) { if (unitstr.length() == 2) { switch (unit_id(unitstr[0], unitstr[1])) { case unit_id('p','t'): return Unit::PT; case unit_id('b','p'): return Unit::BP; case unit_id('i','n'): return Unit::IN; case unit_id('c','m'): return Unit::CM; case unit_id('m','m'): return Unit::MM; case unit_id('p','c'): return Unit::PC; case unit_id('d','d'): return Unit::DD; case unit_id('c','c'): return Unit::CC; case unit_id('s','p'): return Unit::SP; } } throw UnitException(string("invalid length unit: ") + unitstr); } string Length::unitToString (Unit unit) { switch (unit) { case Unit::PT: return "pt"; case Unit::BP: return "bp"; case Unit::IN: return "in"; case Unit::CM: return "cm"; case Unit::MM: return "mm"; case Unit::PC: return "pc"; case Unit::DD: return "dd"; case Unit::CC: return "cc"; case Unit::SP: return "sp"; } // this isn't supposed to happen return "??"; } void Length::set (double val, string unitstr) { if (unitstr.empty()) unitstr = "pt"; else if (unitstr.length() != 2) throw UnitException(string("invalid length unit: ") + unitstr); set(val, stringToUnit(unitstr)); } map Length::getUnits () { map units = { {"pt", Unit::PT}, {"bp", Unit::BP}, {"in", Unit::IN}, {"cm", Unit::CM}, {"mm", Unit::MM}, {"pc", Unit::PC}, {"dd", Unit::DD}, {"cc", Unit::CC}, {"sp", Unit::SP}, }; return units; } dvisvgm-2.8.1/src/SVGCharHandlerFactory.cpp0000664000175000017500000000375013510660062015506 00000000000000/************************************************************************* ** SVGCharHandlerFactory.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "SVGCharHandlerFactory.hpp" #include "SVGCharPathHandler.hpp" #include "SVGSingleCharTextHandler.hpp" #include "SVGCharTspanTextHandler.hpp" #include "SVGTree.hpp" #include "utility.hpp" using namespace std; unique_ptr SVGCharHandlerFactory::createHandler () { if (!SVGTree::USE_FONTS) return util::make_unique(SVGTree::CREATE_USE_ELEMENTS, SVGTree::RELATIVE_PATH_CMDS); if (SVGTree::MERGE_CHARS) return util::make_unique(SVGTree::CREATE_CSS); return util::make_unique(SVGTree::CREATE_CSS); } dvisvgm-2.8.1/src/SVGCharHandlerFactory.hpp0000664000175000017500000000315513510660062015512 00000000000000/************************************************************************* ** SVGCharHandlerFactory.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGCHARHANDLERFACTORY_HPP #define SVGCHARHANDLERFACTORY_HPP #include #include "SVGCharHandler.hpp" struct SVGCharHandlerFactory { static std::unique_ptr createHandler (); }; #endif dvisvgm-2.8.1/src/PSFilter.hpp0000664000175000017500000000341613510660062013117 00000000000000/************************************************************************* ** PSFilter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PSFILTER_HPP #define PSFILTER_HPP class PSInterpreter; class PSFilter { public: explicit PSFilter (PSInterpreter &psi) : _psi(psi) {} virtual ~PSFilter () =default; virtual void execute (const char *code, size_t len) =0; virtual bool active () const =0; protected: PSInterpreter& psInterpreter () {return _psi;} private: PSInterpreter &_psi; }; #endif dvisvgm-2.8.1/src/EPSFile.hpp0000664000175000017500000000400313510660062012647 00000000000000/************************************************************************* ** EPSFile.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef EPSFILE_HPP #define EPSFILE_HPP #include #include #include #include "BoundingBox.hpp" class EPSFile { public: explicit EPSFile (const std::string &fname); std::istream& istream () const; bool hasValidHeader () const {return _headerValid;} BoundingBox bbox () const; uint32_t pslength () const {return _pslength;} private: mutable std::ifstream _ifs; bool _headerValid=false; ///< true if file has a valid header uint32_t _offset=0; ///< stream offset where ASCII part of the file begins uint32_t _pslength=0; ///< length of PS section (in bytes) }; #endif dvisvgm-2.8.1/src/TensorProductPatch.hpp0000664000175000017500000001223213536435625015233 00000000000000/************************************************************************* ** TensorProductPatch.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TENSORPRODUCTPATCH_HPP #define TENSORPRODUCTPATCH_HPP #include #include #include #include "Bezier.hpp" #include "Color.hpp" #include "MessageException.hpp" #include "Pair.hpp" #include "ShadingPatch.hpp" /** This class represents a single tensor product patch P which is defined by 16 control points * and 4 color values. The mapping of the unit square to the patch surface is defined as the sum * \f[P(u,v):=\sum_{i=0}^3\sum_{j=0}^3 p_{ij} B_i(u) B_j(v)\f] * where \f$B_k(t)={3\choose k}(1-t)^k t^k\f$ and \f$u,v \in [0,1]\f$. The four colors assigned * to the vertices are interpolated bilinearily over the unit square. */ class TensorProductPatch : public ShadingPatch { friend class CoonsPatch; public: TensorProductPatch () : ShadingPatch(Color::ColorSpace::RGB) {} explicit TensorProductPatch (Color::ColorSpace cspace) : ShadingPatch(cspace) {} TensorProductPatch (const PointVec &points, const ColorVec &colors, Color::ColorSpace cspace, int edgeflag, TensorProductPatch *patch); int psShadingType() const override {return 7;} void setPoints (const DPair points[4][4], int edgeflag, TensorProductPatch *patch); void setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) override; void setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) override; virtual DPair valueAt (double u, double v) const; Color colorAt (double u, double v) const; Color averageColor () const override; void horizontalCurve (double v, Bezier &bezier) const; void verticalCurve (double u, Bezier &bezier) const; GraphicsPath getBoundaryPath () const override; void subpatch (double u1, double u2, double v1, double v2, TensorProductPatch &patch) const; DPair blossomValue (double u1, double u2, double u3, double v1, double v2, double v3) const; DPair blossomValue (double u[3], double v[3]) const {return blossomValue(u[0], u[1], u[2], v[0], v[1], v[2]);} void approximate (int gridsize, bool overlap, double delta, Callback &callback) const override; BoundingBox getBBox () const override; int numPoints (int edgeflag) const override {return edgeflag == 0 ? 16 : 12;} int numColors (int edgeflag) const override {return edgeflag == 0 ? 4 : 2;} protected: Color averageColor (const Color &c1, const Color &c2, const Color &c3, const Color &c4) const; void approximateRow (double v1, double inc, bool overlap, double delta, const std::vector &beziers, Callback &callback) const; void setFirstMatrixColumn (const DPair source[4], bool reverse); void setFirstMatrixColumn (DPair source[4][4], int col, bool reverse); private: DPair _points[4][4]; ///< control point matrix defining the patch surface Color _colors[4]; ///< vertex colors cK (c0->p00, c1->p03, c2->p30, c3->p33) }; /** Coons patches are special tensor product patches where the four "inner" control points * depend on the outer ones, i.e. they are computed automatically and can't be set by the user. * Thus, a Coons patch is defined by 12 control points, 4 vertex colors and a corresponding * color space. */ class CoonsPatch : public TensorProductPatch { public: CoonsPatch () =default; explicit CoonsPatch (Color::ColorSpace cspace) : TensorProductPatch(cspace) {} CoonsPatch (const PointVec &points, const ColorVec &colors, Color::ColorSpace cspace, int edgeflag, CoonsPatch *patch); int psShadingType() const override {return 6;} void setPoints (const PointVec &points, int edgeflag, ShadingPatch *patch) override; void setColors (const ColorVec &colors, int edgeflag, ShadingPatch *patch) override; DPair valueAt (double u, double v) const override; int numPoints (int edgeflag) const override {return edgeflag == 0 ? 12 : 8;} int numColors (int edgeflag) const override {return edgeflag == 0 ? 4 : 2;} }; #endif dvisvgm-2.8.1/src/RangeMap.cpp0000664000175000017500000001562313510660062013117 00000000000000/************************************************************************* ** RangeMap.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "RangeMap.hpp" using namespace std; /** Tries to merge range r into this one. This is only possible if the ranges * touch or overlap and if the assigned values match at the junction points. * @param[in] r range to join * @return true if join was successful */ bool RangeMap::Range::join (const Range &r) { // check most common cases first if (_max+1 < r._min || _min-1 > r._max) // disjoint ranges? return false; if (r._min-1 == _max) { // does r touch *this on the right? if (valueAt(r._min) == r._minval) { _max = r._max; return true; } return false; } if (r._max+1 == _min) { // does r touch *this on the left if (r.valueAt(_min) == _minval) { setMinAndAdaptValue(r._min); return true; } return false; } // the following cases should be pretty rare if (r._min <= _min && r._max >= _max) { // does r overlap *this on both sides? *this = r; return true; } if (r._min < _min) { // left overlap only? if (r.valueAt(_min) == _minval) { _min = r._min; _minval = r._minval; return true; } return false; } if (r._max > _max) { // right overlap only? if (valueAt(r._min) == r._minval) { _max = r._max; return true; } return false; } // r completely inside *this return valueAt(r._min) == r._minval; } /** Adds a new number range. The range describes a mapping from c to v(c), where * \f$c \in [cmin,cmax]\f$ and \f$v(cmin):=vmin, v(c):=vmin+c-cmin\f$. * @param[in] cmin smallest number in the range * @param[in] cmax largest number in the range * @param[in] vmin map value of cmin */ void RangeMap::addRange (uint32_t cmin, uint32_t cmax, uint32_t vmin) { if (cmin > cmax) swap(cmin, cmax); Range range(cmin, cmax, vmin); if (_ranges.empty()) _ranges.emplace_back(std::move(range)); else { // check for simple cases that can be handled pretty fast Range &lrange = *_ranges.begin(); Range &rrange = *_ranges.rbegin(); if (cmin > rrange.max()) { // non-overlapping range at end of vector? if (!rrange.join(range)) _ranges.emplace_back(std::move(range)); } else if (cmax < lrange.min()) { // non-overlapping range at begin of vector? if (!lrange.join(range)) _ranges.emplace(_ranges.begin(), std::move(range)); } else { // ranges overlap and/or must be inserted somewhere inside the vector auto it = lower_bound(_ranges.begin(), _ranges.end(), range); const bool at_end = (it == _ranges.end()); if (at_end) --it; if (!it->join(range) && (it == _ranges.begin() || !(it-1)->join(range))) { if (it->min() < cmin && it->max() > cmax) { // new range completely inside an existing range? //split existing range uint32_t itmax = it->max(); it->max(cmin-1); it = _ranges.emplace(it+1, Range(cmax+1, itmax, it->valueAt(cmax+1))); } else if (at_end) // does new range overlap right side of last range in vector? it = _ranges.end(); // => append new range at end of vector it = _ranges.emplace(it, std::move(range)); } adaptNeighbors(it); // resolve overlaps } } } /** Adapts the left and right neighbor elements of a newly inserted range. * The new range could overlap ranges in the neighborhood so that those must be * adapted or removed. All ranges in the range vector are ordered ascendingly, i.e. * [min_1, max_1],...,[min_n, max_n] where min_i < min_j for all i < j. * @param[in] it pointer to the newly inserted range */ void RangeMap::adaptNeighbors (Ranges::iterator it) { if (it != _ranges.end()) { // adapt left neighbor if (it != _ranges.begin() && it->min() <= (it-1)->max()) { auto lit = it-1; // points to left neighbor bool left_neighbor_valid = (it->min() > 0 && it->min()-1 >= lit->min()); if (left_neighbor_valid) // is adapted left neighbor valid? lit->max(it->min()-1); // => assign new max value if (!left_neighbor_valid || it->join(*lit)) it = _ranges.erase(lit); } // remove right neighbors completely overlapped by *it auto rit = it+1; // points to right neighbor while (rit != _ranges.end() && it->max() >= rit->max()) { // complete overlap? _ranges.erase(rit); rit = it+1; } // adapt rightmost range partially overlapped by *it if (rit != _ranges.end()) { if (it->max() >= rit->min()) rit->setMinAndAdaptValue(it->max()+1); // try to merge right neighbor into *this if (it->join(*rit)) _ranges.erase(rit); // remove merged neighbor } } } /** Finds the index of the range that contains a given value c. * @param[in] c find range that contains this value * @return index of the range found, or -1 if range was not found */ int RangeMap::lookup (uint32_t c) const { // simple binary search int left=0, right=_ranges.size()-1; while (left <= right) { int mid = (left+right)/2; if (c < _ranges[mid].min()) right = mid-1; else if (c > _ranges[mid].max()) left = mid+1; else return mid; } return -1; } uint32_t RangeMap::valueAt (uint32_t c) const { int pos = lookup(c); return pos < 0 ? 0 : _ranges[pos].valueAt(c); } /** Returns the number of values mapped. */ size_t RangeMap::numValues () const { return std::accumulate(_ranges.begin(), _ranges.end(), 0, [](size_t sum, const Range &range) { return sum+range.max()-range.min()+1; }); } ostream& RangeMap::Range::write (ostream& os) const { return os << '[' << _min << ',' << _max << "] => " << _minval; } ostream& RangeMap::write (ostream& os) const { for (const Range &range : _ranges) range.write(os) << '\n'; return os; } dvisvgm-2.8.1/src/NumericRanges.hpp0000664000175000017500000000763713510660062014202 00000000000000/************************************************************************* ** NumericRanges.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef NUMERICRANGES_HPP #define NUMERICRANGES_HPP #include #include #include template class NumericRanges { public: using Range = std::pair; using Container = std::list; using ConstIterator = typename Container::const_iterator; public: void addRange (T value) {addRange(value, value);} void addRange (T first, T last); bool valueExists (T value) const; size_t size () const {return _ranges.size();} ConstIterator begin () const {return _ranges.begin();} ConstIterator end () const {return _ranges.end();} const Container& ranges () const {return _ranges;} private: Container _ranges; }; /** Adds a numeric range to the collection. * @param[in] first left bound of new range * @param[in] last right bound of new range */ template void NumericRanges::addRange (T first, T last) { if (first > last) std::swap(first, last); typename Container::iterator it = _ranges.begin(); while (it != _ranges.end() && first > it->first+1 && first > it->second+1) ++it; if (it == _ranges.end() || last < it->first-1 || first > it->second+1) it = _ranges.insert(it, Range(first, last)); else if ((first < it->first && last >= it->first-1) || (first <= it->second+1 && last > it->second)) { it->first = std::min(it->first, first); it->second = std::max(it->second, last); } // merge adjacent ranges if (it != _ranges.end()) { typename Container::iterator l = it; typename Container::iterator r = it; if (l == _ranges.begin()) l = _ranges.end(); else --l; ++r; bool l_modified = false; bool r_modified = false; if (l != _ranges.end() && l->second >= it->first-1) { l->first = std::min(l->first, it->first); l->second = std::max(l->second, it->second); l_modified = true; } if (r != _ranges.end() && r->first <= it->second+1) { r->first = std::min(r->first, it->first); r->second = std::max(r->second, it->second); r_modified = true; } if (l_modified || r_modified) { _ranges.erase(it); if (l_modified && r_modified && l->second >= r->first-1) { l->first = std::min(l->first, r->first); l->second = std::max(l->second, r->second); _ranges.erase(r); } } } } template bool NumericRanges::valueExists (T value) const { auto it = std::lower_bound(_ranges.begin(), _ranges.end(), Range(value, 0), [](const Range &r1, const Range &r2) { return r1.first < r2.first; }); return (it != _ranges.end() && it->first <= value && it->second >= value); } #endif dvisvgm-2.8.1/src/Calculator.cpp0000664000175000017500000001333713510660062013516 00000000000000/************************************************************************* ** Calculator.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "Calculator.hpp" using namespace std; // token types const char END = 0; const char NUMBER = 1; const char NAME = 2; /** Evaluates a given arithmetic expression and returns its value. * The evaluator is implemented as a recursive descent parser. * @param[in] is reads expression from this stream * @return expression value */ double Calculator::eval (istream &is) { double ret = expr(is, false); if (lookAhead(is) > 0) throw CalculatorException("expression syntax error"); return ret; } /** Evaluates a given arithmetic expression and returns its value. * @param[in] expr expression to evaluate * @return expression value */ double Calculator::eval (const string &expr) { istringstream iss; iss.str(expr); return eval(iss); } /** Evaluates the root rule of the expression grammar. */ double Calculator::expr (istream &is, bool skip) { // expr: double left = term(is, skip); for (;;) { switch (lookAhead(is)) { case '+': left += term(is, true); break; // term '+' term => $1 + $3 case '-': left -= term(is, true); break; // term '-' term => $1 - $3 default : return left; // term => $1 } } } double Calculator::term (istream &is, bool skip) { // term: double left = prim(is, skip); for (;;) switch (lookAhead(is)) { case '*': left *= prim(is, true); break; // prim '*' prim => $1 * $3 case '/': { // prim '/' prim => $1 / $3 double denom = prim(is, true); if (denom == 0) throw CalculatorException("division by zero"); left /= denom; break; } case '%': { // prim '%' prim => $1 mod $3 double denom = prim(is, true); if (denom == 0) throw CalculatorException("division by zero"); left -= denom*floor(left/denom); break; } default: // prim => $1 return left; } } double Calculator::prim (istream &is, bool skip) { // prim: if (skip) lex(is); switch (lookAhead(is)) { case NUMBER: { // NUMBER => $1 lex(is); double ret = _numValue; if (lookAhead(is) == NAME) { // NUMBER NAME => $1 * $2 lex(is); ret *= getVariable(_strValue); } return ret; } case NAME: { // NAME => getVariable($1) lex(is); return getVariable(_strValue); } case '-': // '-' prim => -$2 return -prim(is, true); case '(': { // '(' expr ')' => $2 double e = expr(is, true); if (lookAhead(is) != ')') throw CalculatorException("')' expected"); lex(is); return e; } default: throw CalculatorException("primary expression expected"); } } /** Determines type of next token without swallowing it. That means * the same token will be read again next time. */ char Calculator::lookAhead (istream &is) { is >> ws; int c = is.peek(); if (is.eof()) return END; if (isdigit(c) || c == '.') return NUMBER; if (isalpha(c)) return NAME; return char(c); } /** Reads next token and returns its type. The token value is either assigned * to the object members numValue or strValue depending on the type. The token * type is represented by a unique integer. In contrast to method 'lookAhead' * lex consumes the read token. * @param[in] is next token is read from this stream * @return token type */ char Calculator::lex (istream &is) { int tokenType = lookAhead(is); switch (tokenType) { case NUMBER: { string str; while (isdigit(is.peek()) || is.peek() == '.') str += char(is.get()); try { _numValue = stod(str); } catch (const exception&) { throw CalculatorException("invalid number: "+str); } break; } case NAME: { _strValue.clear(); while (isalpha(is.peek())) _strValue += char(is.get()); break; } default: tokenType = is.get(); } return char(tokenType); } /** Returns the value of a previously defined variable. If there * is no variable of the given name, a CalculatorException is thrown. * @param[in] name name of variable * @return assigned value */ double Calculator::getVariable (const string &name) const { auto it = _variables.find(name); if (it == _variables.end()) throw CalculatorException("undefined variable '" + name + "'"); return it->second; } dvisvgm-2.8.1/src/DvisvgmSpecialHandler.hpp0000664000175000017500000001072213510660062015643 00000000000000/************************************************************************* ** DvisvgmSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DVISVGMSPECIALHANDLER_HPP #define DVISVGMSPECIALHANDLER_HPP #include #include #include #include #include "SpecialHandler.hpp" class InputReader; class SpecialActions; class SVGTree; class XMLElement; class XMLNode; #ifdef _MSC_VER // MSVC: Prevent aggressive optimization of pointers to member functions. // Instatiating class DvisvgmSpecialHandler without the following pragma // leads to memory corruption. // https://docs.microsoft.com/en-us/cpp/preprocessor/pointers-to-members #pragma pointers_to_members(full_generality, single_inheritance) #endif class DvisvgmSpecialHandler : public SpecialHandler { class XMLParser { using AppendFunc = void (SVGTree::*)(std::unique_ptr); using PushFunc = void (SVGTree::*)(std::unique_ptr); using PopFunc = void (SVGTree::*)(); using NameStack = std::vector; public: XMLParser (AppendFunc append, PushFunc push, PopFunc pop) : _append(append), _pushContext(push), _popContext(pop) {} void parse (const std::string &xml, SpecialActions &actions, bool finish=false); void flush (SpecialActions &actions); protected: void openElement (const std::string &tag, SpecialActions &actions); void closeElement (const std::string &tag, SpecialActions &actions); private: AppendFunc _append; PushFunc _pushContext; PopFunc _popContext; std::string _xmlbuf; NameStack _nameStack; ///< names of nested elements still missing a closing tag }; using StringVector = std::vector; using MacroMap = std::unordered_map; public: DvisvgmSpecialHandler (); const char* name () const override {return "dvisvgm";} const char* info () const override {return "special set for embedding raw SVG snippets";} std::vector prefixes() const override; void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; protected: void preprocessRaw (InputReader &ir); void preprocessRawDef (InputReader &ir); void preprocessRawSet (InputReader &ir); void preprocessEndRawSet (InputReader &ir); void preprocessRawPut (InputReader &ir); void processRaw (InputReader &ir, SpecialActions &actions); void processRawDef (InputReader &ir, SpecialActions &actions); void processRawSet (InputReader &ir, SpecialActions &actions); void processEndRawSet (InputReader &ir, SpecialActions &actions); void processRawPut (InputReader &ir, SpecialActions &actions); void processBBox (InputReader &ir, SpecialActions &actions); void processImg (InputReader &ir, SpecialActions &actions); void dviPreprocessingFinished () override; void dviEndPage (unsigned pageno, SpecialActions &actions) override; private: MacroMap _macros; MacroMap::iterator _currentMacro; int _nestingLevel=0; ///< nesting depth of rawset specials XMLParser _defsParser; ///< parses XML added by 'rawdef' specials XMLParser _pageParser; ///< parses XML added by 'raw' specials }; #endif dvisvgm-2.8.1/src/ImageToSVG.hpp0000664000175000017500000001041013553267757013351 00000000000000/************************************************************************* ** ImageToSVG.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef IMAGETOSVG_HPP #define IMAGETOSVG_HPP #include #include #include #include "PsSpecialHandler.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" struct SVGOutputBase; class ImageToSVG : protected SpecialActions { public: ImageToSVG (std::string fname, SVGOutputBase &out) : _fname(std::move(fname)), _out(out) {} void convert (int pageno); void convert (int firstPage, int lastPage, std::pair *pageinfo); void convert (const std::string &rangestr, std::pair *pageinfo); void setPageTransformation (const std::string &transCmds) {_transCmds = transCmds;} // void setPageSize (const std::string &name); std::string filename () const {return _fname;} PSInterpreter& psInterpreter () {return _psHandler.psInterpreter();} virtual bool isSinglePageFormat () const =0; virtual int totalPageCount () =0; protected: void checkGSAndFileFormat (); Matrix getUserMatrix (const BoundingBox &bbox) const; virtual std::string imageFormat () const =0; virtual bool imageIsValid () const =0; virtual BoundingBox imageBBox () const =0; virtual std::string psSpecialCmd () const =0; // implement abstract base class SpecialActions double getX () const override {return _x;} double getY () const override {return _y;} void setX (double x) override {_x = x; _svg.setX(x);} void setY (double y) override {_y = y; _svg.setY(y);} void finishLine () override {} void setColor (const Color &color) override {_svg.setColor(color);} Color getColor () const override {return _svg.getColor();} void setMatrix (const Matrix &m) override {_svg.setMatrix(m);} const Matrix& getMatrix () const override {return _svg.getMatrix();} const SVGTree& svgTree () const override {return _svg;} void setBgColor (const Color &color) override {} void embed (const BoundingBox &bbox) override {_bbox.embed(bbox);} void embed (const DPair &p, double r=0) override {if (r==0) _bbox.embed(p); else _bbox.embed(p, r);} void progress (const char *id) override; unsigned getCurrentPageNumber() const override {return 0;} BoundingBox& bbox () override {return _bbox;} BoundingBox& bbox (const std::string &name, bool reset=false) override {return _bbox;} FilePath getSVGFilePath (unsigned pageno) const override; std::string getBBoxFormatString () const override {return "";} private: std::string _fname; ///< name of image file SVGTree _svg; SVGOutputBase &_out; double _x=0, _y=0; BoundingBox _bbox; PsSpecialHandler _psHandler; bool _haveGS=false; ///< true if Ghostscript is available std::string _transCmds; ///< transformation commands }; #endif dvisvgm-2.8.1/src/windows.hpp0000664000175000017500000000310413510660062013113 00000000000000/************************************************************************* ** windows.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef WINDOWS_HPP #define WINDOWS_HPP // Prevent defining the macros min and max present in windows.h #ifndef NOMINMAX #define NOMINMAX #endif #include #endif dvisvgm-2.8.1/src/FontCache.cpp0000664000175000017500000003033613536436567013300 00000000000000/************************************************************************* ** FontCache.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "FileSystem.hpp" #include "FontCache.hpp" #include "Pair.hpp" #include "StreamReader.hpp" #include "StreamWriter.hpp" #include "XXHashFunction.hpp" using namespace std; const uint8_t FontCache::FORMAT_VERSION = 5; static Pair32 read_pair (int bytes, StreamReader &sr) { int32_t x = sr.readSigned(bytes); int32_t y = sr.readSigned(bytes); return Pair32(x, y); } /** Removes all data from the cache. This does not affect the cache files. */ void FontCache::clear () { _glyphs.clear(); _fontname.clear(); } /** Assigns glyph data to a character and adds it to the cache. * @param[in] c character code * @param[in] glyph font glyph data */ void FontCache::setGlyph (int c, const Glyph &glyph) { _glyphs[c] = glyph; _changed = true; } /** Returns the corresponding glyph data of a given character of the current font. * @param[in] c character code * @return font glyph data (0 if no matching data was found) */ const Glyph* FontCache::getGlyph (int c) const { auto it = _glyphs.find(c); return (it != _glyphs.end()) ? &it->second : nullptr; } /** Writes the current cache data to a file (only if anything changed after * the last call of read()). * @param[in] fontname name of current font * @param[in] dir directory where the cache file should go * @return true if writing was successful */ bool FontCache::write (const string &fontname, const string &dir) const { if (!_changed) return true; if (!fontname.empty()) { string pathstr = dir.empty() ? FileSystem::getcwd() : dir; pathstr += "/" + fontname + ".fgd"; ofstream ofs(pathstr, ios::binary); return write(fontname, ofs); } return false; } bool FontCache::write (const string &dir) const { return _fontname.empty() ? false : write(_fontname, dir); } /** Returns the minimal number of bytes needed to store the given value. */ static int max_number_of_bytes (int32_t value) { int32_t limit = 0x7f; for (int i=1; i <= 4; i++) { if ((value < 0 && -value <= limit+1) || (value >= 0 && value <= limit)) return i; limit = (limit << 8) | 0xff; } return 4; } static int max_int_size () { return 0; } template static int max_int_size (const Glyph::Point &p1, const Args& ...args) { int max1 = max(max_number_of_bytes(p1.x()), max_number_of_bytes(p1.y())); return max(max1, max_int_size(args...)); } struct WriteActions : Glyph::IterationActions { WriteActions (StreamWriter &sw, HashFunction &hashfunc) : _sw(sw), _hashfunc(hashfunc) {} using Point = Glyph::Point; void moveto (const Point &p) override {write('M', p);} void lineto (const Point &p) override {write('L', p);} void quadto (const Point &p1, const Point &p2) override {write('Q', p1, p2);} void cubicto (const Point &p1, const Point &p2, const Point &p3) override {write('C', p1, p2, p3); } void closepath () override {write('Z');} template void write (char cmd, Args ...args) { int bytesPerValue = max_int_size(args...); int cmdchar = (bytesPerValue << 5) | (cmd - 'A'); _sw.writeUnsigned(cmdchar, 1, _hashfunc); writeParams(bytesPerValue, args...); } static void writeParams (int bytesPerValue) {} template void writeParams (int bytesPerValue, const Point &p, const Args& ...args) { _sw.writeSigned(p.x(), bytesPerValue, _hashfunc); _sw.writeSigned(p.y(), bytesPerValue, _hashfunc); writeParams(bytesPerValue, args...); } StreamWriter &_sw; HashFunction &_hashfunc; }; /** Writes the current cache data to a stream (only if anything changed after * the last call of read()). * @param[in] fontname name of current font * @param[in] os output stream * @return true if writing was successful */ bool FontCache::write (const string &fontname, ostream &os) const { if (!_changed) return true; if (!os) return false; StreamWriter sw(os); XXH32HashFunction hashfunc; sw.writeUnsigned(FORMAT_VERSION, 1, hashfunc); sw.writeBytes(hashfunc.digestValue()); // space for checksum sw.writeString(fontname, hashfunc, true); sw.writeUnsigned(_glyphs.size(), 4, hashfunc); WriteActions actions(sw, hashfunc); for (const auto &charglyphpair : _glyphs) { const Glyph &glyph = charglyphpair.second; sw.writeUnsigned(charglyphpair.first, 4, hashfunc); sw.writeUnsigned(glyph.size(), 2, hashfunc); glyph.iterate(actions, false); } os.seekp(1); auto digest = hashfunc.digestValue(); sw.writeBytes(digest); // insert checksum os.seekp(0, ios::end); return true; } /** Reads font glyph information from a file. * @param[in] fontname name of font data to read * @param[in] dir directory where the cache files are located * @return true if reading was successful */ bool FontCache::read (const string &fontname, const string &dir) { if (fontname.empty()) return false; if (_fontname == fontname) return true; clear(); string dirstr = dir.empty() ? FileSystem::getcwd() : dir; ostringstream oss; oss << dirstr << '/' << fontname << ".fgd"; ifstream ifs(oss.str(), ios::binary); return read(fontname, ifs); } /** Reads font glyph information from a stream. * @param[in] fontname name of font data to read * @param[in] is input stream to read the glyph data from * @return true if reading was successful */ bool FontCache::read (const string &fontname, istream &is) { if (_fontname == fontname) return true; clear(); _fontname = fontname; if (!is) return false; StreamReader sr(is); XXH32HashFunction hashfunc; if (sr.readUnsigned(1, hashfunc) != FORMAT_VERSION) return false; auto hashcmp = sr.readBytes(hashfunc.digestSize()); hashfunc.update(is); if (hashfunc.digestValue() != hashcmp) return false; is.clear(); is.seekg(hashfunc.digestSize()+1); // continue reading after checksum string fname = sr.readString(); if (fname != fontname) return false; uint32_t num_glyphs = sr.readUnsigned(4); while (num_glyphs-- > 0) { uint32_t c = sr.readUnsigned(4); // character code uint16_t s = sr.readUnsigned(2); // number of path commands Glyph &glyph = _glyphs[c]; while (s-- > 0) { uint8_t cmdval = sr.readUnsigned(1); uint8_t cmdchar = (cmdval & 0x1f) + 'A'; int bytes = cmdval >> 5; switch (cmdchar) { case 'C': { Pair32 p1 = read_pair(bytes, sr); Pair32 p2 = read_pair(bytes, sr); Pair32 p3 = read_pair(bytes, sr); glyph.cubicto(p1, p2, p3); break; } case 'L': glyph.lineto(read_pair(bytes, sr)); break; case 'M': glyph.moveto(read_pair(bytes, sr)); break; case 'Q': { Pair32 p1 = read_pair(bytes, sr); Pair32 p2 = read_pair(bytes, sr); glyph.quadto(p1, p2); break; } case 'Z': glyph.closepath(); } } } _changed = false; return true; } /** Collects font cache information. * @param[in] dirname path to font cache directory * @param[out] infos the collected font information * @param[out] invalid names of outdated/corrupted cache files * @return true on success */ bool FontCache::fontinfo (const string &dirname, vector &infos, vector &invalid) { infos.clear(); invalid.clear(); if (!dirname.empty()) { vector fnames; FileSystem::collect(dirname, fnames); for (const string &fname : fnames) { if (fname[0] == 'f' && fname.length() > 5 && fname.substr(fname.length()-4) == ".fgd") { FontInfo info; string path = dirname+"/"+(fname.substr(1)); ifstream ifs(path, ios::binary); if (fontinfo(ifs, info)) infos.emplace_back(move(info)); else invalid.emplace_back(fname.substr(1)); } } } return !infos.empty(); } /** Collects font cache information of a single font. * @param[in] is input stream of the cache file * @param[out] info the collected data * @return true if data could be read, false if cache file is unavailable, outdated, or corrupted */ bool FontCache::fontinfo (std::istream &is, FontInfo &info) { info.name.clear(); info.numchars = info.numbytes = info.numcmds = 0; if (is) { is.clear(); is.seekg(0); try { StreamReader sr(is); XXH32HashFunction hashfunc; if ((info.version = sr.readUnsigned(1, hashfunc)) != FORMAT_VERSION) return false; info.checksum = sr.readBytes(hashfunc.digestSize()); hashfunc.update(is); if (hashfunc.digestValue() != info.checksum) return false; is.clear(); is.seekg(hashfunc.digestSize()+1); // continue reading after checksum info.name = sr.readString(); info.numchars = sr.readUnsigned(4); for (uint32_t i=0; i < info.numchars; i++) { sr.readUnsigned(4); // character code uint16_t s = sr.readUnsigned(2); // number of path commands while (s-- > 0) { uint8_t cmdval = sr.readUnsigned(1); uint8_t cmdchar = (cmdval & 0x1f) + 'A'; int bytes = cmdval >> 5; int bc = 0; switch (cmdchar) { case 'C': bc = 6*bytes; break; case 'H': case 'L': case 'M': case 'T': case 'V': bc = 2*bytes; break; case 'Q': case 'S': bc = 4*bytes; break; case 'Z': break; default : return false; } info.numbytes += bc+1; // command length + command info.numcmds++; is.seekg(bc, ios::cur); } info.numbytes += 6; // number of path commands + char code } info.numbytes += 6+info.name.length(); // version + 0-byte + fontname + number of chars } catch (StreamReaderException &e) { return false; } } return true; } /** Collects font cache information and write it to a stream. * @param[in] dirname path to font cache directory * @param[in] os output is written to this stream * @param[in] purge if true, outdated and corrupted cache files are removed */ void FontCache::fontinfo (const string &dirname, ostream &os, bool purge) { if (!dirname.empty()) { ios::fmtflags osflags(os.flags()); vector infos; vector invalid_files; if (!fontinfo(dirname, infos, invalid_files)) os << "cache is empty\n"; else { os << "cache format version " << infos[0].version << endl; map sortmap; for (const FontInfo &info : infos) sortmap[info.name] = &info; for (const auto &strinfopair : sortmap) { os << dec << setfill(' ') << left << setw(10) << left << strinfopair.second->name << setw(5) << right << strinfopair.second->numchars << " glyph" << (strinfopair.second->numchars == 1 ? ' ':'s') << setw(10) << right << strinfopair.second->numcmds << " cmd" << (strinfopair.second->numcmds == 1 ? ' ':'s') << setw(12) << right << strinfopair.second->numbytes << " byte" << (strinfopair.second->numbytes == 1 ? ' ':'s') << " hash:" << hex; for (int byte : strinfopair.second->checksum) os << setw(2) << setfill('0') << byte; os << '\n'; } } if (purge) { for (const string &str : invalid_files) { string path=dirname+"/"+str; if (FileSystem::remove(path)) os << "invalid cache file " << str << " removed\n"; } } os.flags(osflags); // restore format flags } } dvisvgm-2.8.1/src/ColorSpecialHandler.cpp0000664000175000017500000001002613510660062015272 00000000000000/************************************************************************* ** ColorSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "ColorSpecialHandler.hpp" #include "SpecialActions.hpp" using namespace std; static double read_double (istream &is) { is.clear(); double v; is >> v; if (is.fail()) throw SpecialException("number expected"); return v; } /** Reads multiple double values from a given stream. The number of * values read is determined by the size of the result vector. * @param[in] is stream to be read from * @param[out] vec the resulting values */ static void read_doubles (istream &is, vector &vec) { for (double &val : vec) val = read_double(is); } /** Reads a color statement from an input stream and converts it to a color object. * A color statement has the following syntax: * _color model_ _component values_ * Currently, the following color models are supported: rgb, cmyk, hsb and gray. * Examples: rgb 1 0.5 0, gray 0.5 * @param[in] model the color model * @param[in] is stream to be read from * @return resulting Color object */ Color ColorSpecialHandler::readColor (const string &model, istream &is) { Color color; if (model == "rgb") { vector rgb(3); read_doubles(is, rgb); color.setRGB(rgb[0], rgb[1], rgb[2]); } else if (model == "cmyk") { vector cmyk(4); read_doubles(is, cmyk); color.setCMYK(cmyk[0], cmyk[1], cmyk[2], cmyk[3]); } else if (model == "hsb") { vector hsb(3); read_doubles(is, hsb); color.setHSB(hsb[0], hsb[1], hsb[2]); } else if (model == "gray") color.setGray(read_double(is)); else if (!color.setPSName(model, true)) throw SpecialException("unknown color statement"); return color; } /** Reads the color model (rgb, cmyk, hsb, or gray) and the corresponding color compontents * from a given input stream. * @param[in] is stream to be read from * @return resulting Color object */ Color ColorSpecialHandler::readColor (istream &is) { string model; is >> model; return readColor(model, is); } bool ColorSpecialHandler::process (const string&, istream &is, SpecialActions &actions) { string cmd; is >> cmd; if (cmd == "push") // color push _colorStack.push(readColor(is)); else if (cmd == "pop") { if (!_colorStack.empty()) // color pop _colorStack.pop(); } else { // color while (!_colorStack.empty()) _colorStack.pop(); _colorStack.push(readColor(cmd, is)); } if (_colorStack.empty()) actions.setColor(Color::BLACK); else actions.setColor(_colorStack.top()); return true; } vector ColorSpecialHandler::prefixes() const { vector pfx {"color"}; return pfx; } dvisvgm-2.8.1/src/Process.cpp0000664000175000017500000002331513510660062013040 00000000000000/************************************************************************* ** Process.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifdef _WIN32 #include "windows.hpp" #else #include #include #include #include #endif #include #include "FileSystem.hpp" #include "Process.hpp" #include "SignalHandler.hpp" using namespace std; /** Helper class that encapsulates the system-specific parts of * running a subprocess and retrieving its terminal output. */ class Subprocess { public: enum class State {RUNNING, FINISHED, FAILED}; public: Subprocess (); Subprocess (const Subprocess&) =delete; Subprocess (Subprocess&&) =delete; ~Subprocess (); bool run (const string &cmd, string params); bool readFromPipe (string &out); State state (); private: #ifdef _WIN32 HANDLE _pipeReadHandle; ///< handle of read end of pipe HANDLE _childProcHandle; ///< handle of child process #else int _readfd; ///< file descriptor of read end of pipe pid_t _pid; ///< PID of the subprocess #endif }; Process::Process (string cmd, string paramstr) : _cmd(std::move(cmd)), _paramstr(std::move(paramstr)) { } /** Runs the process and waits until it's finished. * @param[out] out takes the output written to stdout by the executed subprocess * @return true if process terminated properly * @throw SignalException if CTRL-C was pressed during execution */ bool Process::run (string *out) { Subprocess subprocess; if (!subprocess.run(_cmd, _paramstr)) return false; for (;;) { if (out) { out->clear(); subprocess.readFromPipe(*out); } Subprocess::State state = subprocess.state(); if (state != Subprocess::State::RUNNING) return state == Subprocess::State::FINISHED; SignalHandler::instance().check(); } } /** Runs the process in the given working directory and waits until it's finished. * @param[in] dir working directory * @param[out] out takes the output written to stdout by the executed process * @return true if process terminated properly * @throw SignalException if CTRL-C was pressed during execution */ bool Process::run (const string &dir, string *out) { bool ret = false; string cwd = FileSystem::getcwd(); if (FileSystem::chdir(dir)) { ret = run(out); ret &= FileSystem::chdir(cwd); } return ret; } // system-specific stuff #ifdef _WIN32 static inline void close_and_zero_handle (HANDLE &handle) { CloseHandle(handle); handle = NULL; } Subprocess::Subprocess() : _pipeReadHandle(NULL), _childProcHandle(NULL) { } Subprocess::~Subprocess () { if (_pipeReadHandle != NULL) CloseHandle(_pipeReadHandle); if (_childProcHandle != NULL) { TerminateProcess(_childProcHandle, 1); CloseHandle(_childProcHandle); } } /** Retrieves output generated by child process. * @param[out] out read output is appended to this string * @returns false on errors */ bool Subprocess::readFromPipe (string &out) { if (!_pipeReadHandle) return false; bool success=false; bool processExited=false; DWORD len=0; while (PeekNamedPipe(_pipeReadHandle, NULL, 0, NULL, &len, NULL)) { // prevent blocking if (len == 0) { if (processExited) break; // process still busy processExited = (!_childProcHandle || WaitForSingleObject(_childProcHandle, 100) != WAIT_TIMEOUT); } else { char buf[4096]; success = ReadFile(_pipeReadHandle, buf, sizeof(buf), &len, NULL); if (!success || len == 0) break; out.append(buf, len); } } return success; } /** Starts a child process. * @param[in] cmd name of command to execute * @param[in] paramstr parameters required by command * @returns true if child process started properly */ bool Subprocess::run (const string &cmd, string paramstr) { SECURITY_ATTRIBUTES securityAttribs; ZeroMemory(&securityAttribs, sizeof(SECURITY_ATTRIBUTES)); securityAttribs.nLength = sizeof(SECURITY_ATTRIBUTES); securityAttribs.bInheritHandle = true; HANDLE pipeWriteHandle; // write end of pipe if (CreatePipe(&_pipeReadHandle, &pipeWriteHandle, &securityAttribs, 0) == ERROR_INVALID_HANDLE) return false; SetHandleInformation(_pipeReadHandle, HANDLE_FLAG_INHERIT, 0); HANDLE nullFile = CreateFile("NUL", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, &securityAttribs, OPEN_EXISTING, 0, NULL); bool success = false; if (nullFile != INVALID_HANDLE_VALUE) { STARTUPINFO startupInfo; ZeroMemory(&startupInfo, sizeof(STARTUPINFO)); startupInfo.cb = sizeof(STARTUPINFO); startupInfo.dwFlags = STARTF_USESTDHANDLES; startupInfo.hStdInput = nullFile; startupInfo.hStdOutput = pipeWriteHandle; startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE); PROCESS_INFORMATION processInfo; ZeroMemory(&processInfo, sizeof(PROCESS_INFORMATION)); string cmdline = cmd + " " + paramstr; // put subprocess in separate process group to prevent its termination in case of CTRL-C success = CreateProcess(NULL, (LPSTR)cmdline.c_str(), NULL, NULL, true, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &startupInfo, &processInfo); if (success) { _childProcHandle = processInfo.hProcess; CloseHandle(processInfo.hThread); } CloseHandle(nullFile); } CloseHandle(pipeWriteHandle); // must be closed before reading from pipe to prevent blocking if (!success) close_and_zero_handle(_pipeReadHandle); return success; } /** Returns the current state of the child process. */ Subprocess::State Subprocess::state () { DWORD status; if (!GetExitCodeProcess(_childProcHandle, &status)) return State::FAILED; if (status == STILL_ACTIVE) return State::RUNNING; close_and_zero_handle(_childProcHandle); return status == 0 ? State::FINISHED : State::FAILED; } #else // !_WIN32 Subprocess::Subprocess () : _readfd(-1), _pid(-1) { } Subprocess::~Subprocess () { if (_readfd >= 0) close(_readfd); if (_pid > 0) kill(_pid, SIGKILL); } /** Retrieves output generated by child process. * @param[out] out read output is appended to this string * @returns false on errors */ bool Subprocess::readFromPipe (string &out) { if (_readfd < 0 || _pid < 0) return false; char buf[1024]; ssize_t len; while ((len = read(_readfd, buf, sizeof(buf))) > 0) out.append(buf, len); if (len < 0) { close(_readfd); _readfd = -1; } return len >= 0; } /** Extracts whitespace-separated parameters from a string. * @param[in,out] paramstr the parameter string * @param[out] params vector holding pointers to the extracted parameters */ static void split_paramstr (string ¶mstr, vector ¶ms) { size_t left=0, right=0; // index of first and last character of current parameter char quote=0; // current quote character, 0=none const size_t len = paramstr.length(); while (left <= right && right < len) { while (left < len && isspace(paramstr[left])) ++left; if (left < len && (paramstr[left] == '"' || paramstr[left] == '\'')) quote = paramstr[left++]; right = left; while (right < len && (quote || !isspace(paramstr[right]))) { if (quote && paramstr[right] == quote) { quote=0; break; } else ++right; } if (right < len) paramstr[right]=0; if (left < len) params.push_back(¶mstr[left]); left = ++right; } } /** Starts a child process. * @param[in] cmd name of command to execute * @param[in] paramstr parameters required by command * @returns true if child process started properly */ bool Subprocess::run (const string &cmd, string paramstr) { int pipefd[2]; if (pipe(pipefd) < 0) return false; _pid = fork(); if (_pid < 0) { close(pipefd[0]); close(pipefd[1]); return false; } if (_pid == 0) { // child process dup2(pipefd[1], STDOUT_FILENO); // redirect stdout to the pipe dup2(pipefd[1], STDERR_FILENO); // redirect stderr to the pipe close(pipefd[0]); close(pipefd[1]); vector params; params.push_back(cmd.c_str()); split_paramstr(paramstr, params); params.push_back(nullptr); // trailing null pointer marks end of parameter list signal(SIGINT, SIG_IGN); // child process is supposed to ignore ctrl-c events execvp(cmd.c_str(), const_cast(¶ms[0])); exit(1); } _readfd = pipefd[0]; close(pipefd[1]); // close write end of pipe return true; } /** Returns the current state of the child process. */ Subprocess::State Subprocess::state () { int status; pid_t wpid = waitpid(_pid, &status, WNOHANG); if (wpid == 0) return State::RUNNING; // still running _pid = -1; if (wpid > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 0) return State::FINISHED; return State::FAILED; } #endif // !_WIN32 dvisvgm-2.8.1/src/FontEncoding.cpp0000664000175000017500000000640313510660062013776 00000000000000/************************************************************************* ** FontEncoding.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "CMap.hpp" #include "CMapManager.hpp" #include "EncFile.hpp" #include "FileFinder.hpp" #include "FontEncoding.hpp" #include "utility.hpp" using namespace std; /** Returns the encoding object for a given encoding name. * @param[in] encname name of the encoding to lookup * @return pointer to encoding object, or 0 if there is no encoding defined */ FontEncoding* FontEncoding::encoding (const string &encname) { if (encname.empty()) return nullptr; using EncodingMap = unordered_map>; static EncodingMap encmap; // initially, try to find an .enc file with the given name auto it = encmap.find(encname); if (it != encmap.end()) return it->second.get(); if (FileFinder::instance().lookup(encname + ".enc", false)) { auto state = encmap.emplace(encname, util::make_unique(encname)); return state.first->second.get(); } // no .enc file found => try to find a CMap if (CMap *cmap = CMapManager::instance().lookup(encname)) return cmap; return nullptr; } ///////////////////////////////////////////////////////////////////////// Character FontEncodingPair::decode (uint32_t c) const { if (_enc1) { Character chr = _enc1->decode(c); if (_enc2 && chr.type() != Character::NAME) chr = _enc2->decode(chr.number()); return chr; } return Character(Character::INDEX, 0); } bool FontEncodingPair::mapsToCharIndex () const { if (_enc2) return _enc2->mapsToCharIndex(); if (_enc1) return _enc1->mapsToCharIndex(); return false; } const FontEncoding* FontEncodingPair::findCompatibleBaseFontMap (const PhysicalFont *font, CharMapID &charmapID) const { if (_enc2) return _enc2->findCompatibleBaseFontMap(font, charmapID); if (_enc1) return _enc1->findCompatibleBaseFontMap(font, charmapID); return nullptr; } void FontEncodingPair::assign (const FontEncoding *enc) { if (!_enc1) _enc1 = enc; else _enc2 = enc; } dvisvgm-2.8.1/src/GFReader.hpp0000664000175000017500000000750313510660062013047 00000000000000/************************************************************************* ** GFReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef GFREADER_HPP #define GFREADER_HPP #include #include #include #include "Bitmap.hpp" #include "MessageException.hpp" class CharInfo; struct GFException : public MessageException { explicit GFException (const std::string &msg) : MessageException(msg) {} }; class GFReader { struct CharInfo { CharInfo () : dx(0), dy(0), width(0), location(0) {} CharInfo (int32_t dxx, int32_t dyy, int32_t w, uint32_t p) : dx(dxx), dy(dyy), width(w), location(p) {} int32_t dx, dy; int32_t width; // 2^24 * (true width)/(design size) uint32_t location; }; public: explicit GFReader (std::istream &is); virtual ~GFReader () =default; virtual bool executeChar (uint8_t c); virtual bool executeAllChars (); bool executePreamble (); bool executePostamble (); virtual void preamble (const std::string &str) {} virtual void postamble () {} virtual void beginChar (uint32_t c) {} virtual void endChar (uint32_t c) {} virtual void special (const std::string &str) {} virtual void numspecial (int32_t y) {} const Bitmap& getBitmap () const {return _bitmap;} double getDesignSize () const {return _designSize;} double getHPixelsPerPoint () const {return _hppp;} double getVPixelsPerPoint () const {return _vppp;}; double getCharWidth (uint32_t c) const; uint32_t getChecksum () const {return _checksum;} protected: int32_t readSigned (int bytes); uint32_t readUnsigned (int bytes); std::string readString (int len); int executeCommand (); std::istream& getInputStream () const {return _in;} void cmdPre (int); void cmdPost (int); void cmdPostPost (int); void cmdPaint0 (int pixels); void cmdPaint (int len); void cmdBoc (int); void cmdBoc1 (int); void cmdEoc (int); void cmdSkip (int len); void cmdNewRow (int col); void cmdXXX (int len); void cmdYYY (int); void cmdNop (int); void cmdCharLoc0 (int); void cmdCharLoc (int); private: std::istream &_in; int32_t _minX, _maxX, _minY, _maxY; int32_t _x, _y; ///< current pen location (pixel units) int32_t _currentChar; Bitmap _bitmap; ///< bitmap of current char double _designSize; ///< designSize in PS points double _hppp, _vppp; ///< horizontal and vertical pixel per point uint32_t _checksum; std::unordered_map _charInfoMap; bool _insideCharDef; ///< true if inside a character definition (between BOC and EOC) bool _penDown; }; #endif dvisvgm-2.8.1/src/Character.hpp0000664000175000017500000000372013510660062013321 00000000000000/************************************************************************* ** Character.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CHARACTER_HPP #define CHARACTER_HPP class Character { public: enum Type {CHRCODE, INDEX, NAME}; explicit Character (const char *name) : _type(NAME), _name(name) {} Character (Type type, uint32_t val) : _type(type), _number(val) {} Character (Type type, const Character &c) : _type(type), _number(c.type() != NAME ? c._number : 0) {} Type type () const {return _type;} const char* name () const {return _name;} uint32_t number () const {return _number;} private: Type _type; union { uint32_t _number; const char *_name; }; }; #endif dvisvgm-2.8.1/src/PdfSpecialHandler.cpp0000664000175000017500000002424613510660062014736 00000000000000/************************************************************************* ** PdfSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "Color.hpp" #include "HyperlinkManager.hpp" #include "InputReader.hpp" #include "MapLine.hpp" #include "PdfSpecialHandler.hpp" #include "FontMap.hpp" #include "Message.hpp" #include "PapersizeSpecialHandler.hpp" #include "PDFParser.hpp" #include "SpecialActions.hpp" #include "SpecialManager.hpp" using namespace std; using CmdHandler = void (PdfSpecialHandler::*)(StreamInputReader&, SpecialActions&); void PdfSpecialHandler::preprocess (const string&, istream &is, SpecialActions &actions) { StreamInputReader ir(is); ir.skipSpace(); const string cmdstr = ir.getWord(); static unordered_map commands = { {"bann", &PdfSpecialHandler::preprocessBeginAnn}, {"bannot", &PdfSpecialHandler::preprocessBeginAnn}, {"beginann", &PdfSpecialHandler::preprocessBeginAnn}, {"dest", &PdfSpecialHandler::preprocessDest}, {"pagesize", &PdfSpecialHandler::preprocessPagesize} }; auto it = commands.find(cmdstr); if (it != commands.end()) (this->*it->second)(ir, actions); } bool PdfSpecialHandler::process (const string&, istream &is, SpecialActions &actions) { _active = true; StreamInputReader ir(is); ir.skipSpace(); const string cmdstr = ir.getWord(); ir.skipSpace(); // dvipdfm(x) specials currently supported static unordered_map commands = { {"bann", &PdfSpecialHandler::processBeginAnn}, {"bannot", &PdfSpecialHandler::processBeginAnn}, {"beginann", &PdfSpecialHandler::processBeginAnn}, {"eann", &PdfSpecialHandler::processEndAnn}, {"eannot", &PdfSpecialHandler::processEndAnn}, {"endann", &PdfSpecialHandler::processEndAnn}, {"dest", &PdfSpecialHandler::processDest}, {"mapfile", &PdfSpecialHandler::processMapfile}, {"mapline", &PdfSpecialHandler::processMapline} }; auto it = commands.find(cmdstr); if (it != commands.end()) (this->*it->second)(ir, actions); return true; } static char prepare_mode (InputReader &ir) { // read mode selector ('+', '-', or '=') char modechar = '+'; // default mode (append if new, do not replace existing mapping) if (strchr("=+-", ir.peek())) // leading modifier given? modechar = static_cast(ir.get()); return modechar; } /** Sets the page size. This command is similar to the papersize special. * Syntax pdf:pagesize ( )+ */ void PdfSpecialHandler::preprocessPagesize (StreamInputReader &ir, SpecialActions &actions) { // add page sizes to collection of paper sizes in order to handle them equally SpecialHandler *handler = SpecialManager::instance().findHandlerByName("papersize"); if (auto papersizeHandler = dynamic_cast(handler)) { try { Length width, height; // parse parameter sequence of the form (name length)+ while (!ir.eof()) { string dimname = ir.getWord(); string lenstr = ir.getString(" \t"); // only consider width and height settings if (dimname == "width" && !lenstr.empty()) width.set(lenstr); else if (dimname == "height" && !lenstr.empty()) height.set(lenstr); } papersizeHandler->storePaperSize(actions.getCurrentPageNumber(), width, height); } catch (UnitException &e) { // ignore invalid length units for now } } } void PdfSpecialHandler::processMapfile (StreamInputReader &ir, SpecialActions&) { char modechar = prepare_mode(ir); string fname = ir.getString(); if (!FontMap::instance().read(fname, modechar)) Message::wstream(true) << "can't open map file " << fname << '\n'; } void PdfSpecialHandler::processMapline (StreamInputReader &ir, SpecialActions&) { char modechar = prepare_mode(ir); try { MapLine mapline(ir.getStream()); FontMap::instance().apply(mapline, modechar); } catch (const MapLineException &ex) { Message::wstream(true) << "pdf:mapline: " << ex.what() << '\n'; } } /** Defines a named destination, e.g. a link target. * Syntax: dest PDFString PDFDest */ void PdfSpecialHandler::preprocessDest (StreamInputReader &ir, SpecialActions &actions) { PDFParser parser; vector objects = parser.parse(ir, [&](const string &opname, vector &objects) { if (!opname.empty() && opname[0] == '@') { if (opname == "@thispage") objects.emplace_back(static_cast(actions.getCurrentPageNumber())); else if (opname == "@xpos") objects.emplace_back(actions.getX()); else if (opname == "@ypos") objects.emplace_back(actions.getY()); } }); if (objects.size() < 2) return; auto name = objects[0].get(); auto dest = objects[1].get(); // get target info from array [pageno /XYZ xpos ypos zpos] if (name && dest && dest->size() >= 4 && dest->at(0).get()) { int pageno = *dest->at(0).get(); HyperlinkManager::instance().addNameAchor(*name, pageno); } } /** Extracts the URI from a PDF annotation dictionary. "GoTo" targets (named anchors) * are prefixed with a '#'. * @param[in] annotDict annotation dictionary containing the target URI * @return the URI if one was found, "" otherwise */ static string get_uri (const PDFDict &annotDict) { // At the moment, we only support link annotations const PDFObject *type = annotDict.get("Type"); if (type && string(*type) == "Annot") { const PDFObject *subtype = annotDict.get("Subtype"); if (subtype && string(*subtype) == "Link") { const PDFObject *dict = annotDict.get("A"); if (const PDFDict *actionDict = dict->get()) { if (const PDFObject *s = actionDict->get("S")) { if (string(*s) == "GoTo") { if (const PDFObject *dest = actionDict->get("D")) return "#" + string(*dest); } else if (string(*s) == "URI") { if (const PDFObject *uri = actionDict->get("URI")) return string(*uri); } } } } } return ""; } void PdfSpecialHandler::preprocessBeginAnn (StreamInputReader &ir, SpecialActions&) { PDFParser parser; vector pdfobjs = parser.parse(ir); if (pdfobjs.empty() || !pdfobjs[0].get()) return; const PDFDict &annotDict = *pdfobjs[0].get(); string uri = get_uri(annotDict); if (!uri.empty()) HyperlinkManager::instance().addHrefAnchor(uri); } /** Converts a PDFObject to a Color, where a single number denotes a gray value. * Number arrays are treated as gray, RGB, or CMYK colors depending on the * number of components. */ static Color to_color (const PDFObject &obj) { Color color; if (obj.get() || obj.get()) color.setGray(double(obj)); else if (auto colorArray = obj.get()) { size_t size = min(size_t(4), colorArray->size()); valarray colorComps(size); for (size_t i=0; i < size; i++) colorComps[i] = double(colorArray->at(i)); switch (size) { case 1: color.setGray(colorComps); break; case 3: color.setRGB(colorComps); break; case 4: color.setCMYK(colorComps); break; } } return color; } /** Begins a breakable annotation, e.g. a hyperlink. * Syntax: beginann PDFDict */ void PdfSpecialHandler::processBeginAnn (StreamInputReader &ir, SpecialActions &actions) { PDFParser parser; vector pdfobjs = parser.parse(ir); if (pdfobjs.empty() || !pdfobjs[0].get()) return; const PDFDict &annotDict = *pdfobjs[0].get(); string uri = get_uri(annotDict); if (uri.empty()) return; // check presence of entry /Border [hr vr bw] defining the horizontal/vertical // corner radius and the border width auto it = annotDict.find("Border"); if (it != annotDict.end() && it->second.get() && it->second.get()->size() > 2) HyperlinkManager::instance().setLineWidth(double(it->second.get()->at(2))); // check presence of entry /C defining the border color it = annotDict.find("C"); if (it != annotDict.end()) HyperlinkManager::setDefaultLinkColor(to_color(it->second)); HyperlinkManager::instance().createLink(uri, actions); } /** Terminates the preceding breakable annotation. * Syntax: endann */ void PdfSpecialHandler::processEndAnn (StreamInputReader&, SpecialActions &actions) { HyperlinkManager::instance().closeAnchor(actions); } void PdfSpecialHandler::processDest (StreamInputReader &ir, SpecialActions &actions) { PDFParser parser; vector objects = parser.parse(ir); if (!objects.empty()) { if (auto name = objects[0].get()) HyperlinkManager::instance().setActiveNameAnchor(*name, actions); } } /** This method is called every time the DVI position changes. */ void PdfSpecialHandler::dviMovedTo (double x, double y, SpecialActions &actions) { if (_active) HyperlinkManager::instance().checkNewLine(actions); } void PdfSpecialHandler::dviEndPage (unsigned pageno, SpecialActions &actions) { if (_active) { HyperlinkManager::instance().createViews(pageno, actions); _active = false; } } vector PdfSpecialHandler::prefixes() const { vector pfx {"pdf:"}; return pfx; } dvisvgm-2.8.1/src/PSInterpreter.hpp0000664000175000017500000001453513561274402014206 00000000000000/************************************************************************* ** PSInterpreter.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PSINTERPRETER_HPP #define PSINTERPRETER_HPP #include #include #include #include #include "BoundingBox.hpp" #include "Ghostscript.hpp" #include "InputReader.hpp" #include "MessageException.hpp" struct PSException : public MessageException { explicit PSException (const std::string &msg) : MessageException(msg) {} }; /** This interface provides the template methods called by PSInterpreter when executing a PS snippet. * Each method corresponds to a PostScript operator of the same name. */ struct PSActions { virtual ~PSActions () =default; virtual void applyscalevals (std::vector &p) =0; virtual void clip (std::vector &p) =0; virtual void clippath (std::vector &p) =0; virtual void closepath (std::vector &p) =0; virtual void curveto (std::vector &p) =0; virtual void eoclip (std::vector &p) =0; virtual void eofill (std::vector &p) =0; virtual void fill (std::vector &p) =0; virtual void gsave (std::vector &p) =0; virtual void grestore (std::vector &p) =0; virtual void grestoreall (std::vector &p) =0; virtual void initclip (std::vector &p) =0; virtual void lineto (std::vector &p) =0; virtual void makepattern (std::vector &p) =0; virtual void moveto (std::vector &p) =0; virtual void newpath (std::vector &p) =0; virtual void querypos (std::vector &p) =0; virtual void restore (std::vector &p) =0; virtual void rotate (std::vector &p) =0; virtual void save (std::vector &p) =0; virtual void scale (std::vector &p) =0; virtual void setblendmode (std::vector &p) =0; virtual void setcmykcolor (std::vector &cmyk) =0; virtual void setdash (std::vector &p) =0; virtual void setgray (std::vector &p) =0; virtual void sethsbcolor (std::vector &hsb) =0; virtual void setlinecap (std::vector &p) =0; virtual void setlinejoin (std::vector &p) =0; virtual void setlinewidth (std::vector &p) =0; virtual void setmatrix (std::vector &p) =0; virtual void setmiterlimit (std::vector &p) =0; virtual void setnulldevice (std::vector &p) =0; virtual void setopacityalpha (std::vector &p) =0; virtual void setshapealpha (std::vector &p) =0; virtual void setpagedevice (std::vector &p) =0; virtual void setpattern (std::vector &p) =0; virtual void setrgbcolor (std::vector &rgb) =0; virtual void shfill (std::vector &p) =0; virtual void stroke (std::vector &p) =0; virtual void translate (std::vector &p) =0; virtual void executed () {} // triggered if one of the above PS operators has been executed }; class PSFilter; /** This class provides methods to execute chunks of PostScript code and calls * several template methods on invocation of selected PS operators (see PSActions). */ class PSInterpreter { enum Mode {PS_NONE, PS_RUNNING, PS_QUIT}; public: explicit PSInterpreter (PSActions *actions=nullptr); PSInterpreter (const PSInterpreter &psi) =delete; bool execute (const char *str, size_t len, bool flush=true); bool execute (const char *str, bool flush=true) {return execute(str, std::strlen(str), flush);} bool execute (const std::string &str, bool flush=true) {return execute(str.c_str(), flush);} bool execute (std::istream &is, bool flush=true); bool executeRaw (const std::string &str, int n); bool active () const {return _mode != PS_QUIT;} void limit (size_t max_bytes) {_bytesToRead = max_bytes;} void setFilter (PSFilter *filter) {_filter = filter;} PSActions* setActions (PSActions *actions); int pdfPageCount (const std::string &fname); BoundingBox pdfPageBox (const std::string &fname, int pageno); const std::vector& rawData () const {return _rawData;} protected: void init (); // callback functions static int GSDLLCALL input (void *inst, char *buf, int len); static int GSDLLCALL output (void *inst, const char *buf, int len); static int GSDLLCALL error (void *inst, const char *buf, int len); void checkStatus (int status); void callActions (InputReader &cib); private: Ghostscript _gs; Mode _mode; ///< current execution mode PSActions *_actions=nullptr; ///< actions to be performed PSFilter *_filter=nullptr; ///< active filter used to process PS code size_t _bytesToRead=0; ///< if > 0, maximal number of bytes to be processed by following calls of execute() std::vector _linebuf; std::string _errorMessage; ///< text of error message bool _inError=false; ///< true if scanning error message bool _initialized=false; ///< true if PSInterpreter has been completely initialized std::vector _rawData; ///< raw data received static const char *PSDEFS; ///< initial PostScript definitions }; #endif dvisvgm-2.8.1/src/PageRanges.hpp0000664000175000017500000000325713510660062013446 00000000000000/************************************************************************* ** PageRanges.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PAGERANGES_HPP #define PAGERANGES_HPP #include #include #include #include "NumericRanges.hpp" class PageRanges : public NumericRanges { public: bool parse (const std::string &str, int max_page=0); size_t numberOfPages () const; }; #endif dvisvgm-2.8.1/src/EncFile.hpp0000664000175000017500000000410413510660062012727 00000000000000/************************************************************************* ** EncFile.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef ENCFILE_HPP #define ENCFILE_HPP #include #include #include #include #include "FontEncoding.hpp" class EncFile : public NamedFontEncoding { public: explicit EncFile (std::string encname); void read (); void read (std::istream &is); int size () const {return _table.size();} const char* name () const override {return _encname.c_str();} const char* charName (uint32_t c) const; Character decode (uint32_t c) const override {return Character(charName(c));} bool mapsToCharIndex () const override {return false;} const char* path () const override; private: std::string _encname; std::vector _table; }; #endif dvisvgm-2.8.1/src/XMLNode.cpp0000664000175000017500000003455013510660062012673 00000000000000/************************************************************************* ** XMLNode.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "utility.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; bool XMLElement::WRITE_NEWLINES=true; /** Inserts a sibling node after this one. * @param[in] node node to insert * @return raw pointer to inserted node */ XMLNode* XMLNode::insertNext (unique_ptr node) { if (_next) { _next->_prev = node.get(); node->_next = std::move(_next); } node->_prev = this; node->_parent = _parent; _next = std::move(node); return _next.get(); } /** Removes the following sibling node of this one. * @return pointer to the removed node */ unique_ptr XMLNode::removeNext () { unique_ptr oldnext = std::move(_next); if (oldnext) { oldnext->_parent = oldnext->_prev = nullptr; if ((_next = std::move(oldnext->_next))) { _next->_prev = this; oldnext->_next.reset(); } } return oldnext; } ///////////////////////////////////////////////////////////////////// XMLElement::XMLElement (string name) : _name(std::move(name)) { } XMLElement::XMLElement (const XMLElement &node) : XMLNode(node), _name(node._name), _attributes(node._attributes) { for (XMLNode *child=_firstChild.get(); child; child = child->next()) insertLast(child->clone()); } XMLElement::XMLElement (XMLElement &&node) noexcept : XMLNode(std::move(node)), _name(std::move(node._name)), _attributes(std::move(node._attributes)), _firstChild(std::move(node._firstChild)), _lastChild(node._lastChild) { } /** Removes all attributes and children. */ void XMLElement::clear () { _attributes.clear(); _firstChild.reset(); _lastChild = nullptr; } void XMLElement::addAttribute (const string &name, const string &value) { if (Attribute *attr = getAttribute(name)) attr->value = value; else _attributes.emplace_back(Attribute(name, value)); } void XMLElement::addAttribute (const string &name, double value) { addAttribute(name, XMLString(value)); } void XMLElement::removeAttribute (const std::string &name) { _attributes.erase(find_if(_attributes.begin(), _attributes.end(), [&](const Attribute &attr) { return attr.name == name; })); } /** Inserts a new last child node and returns a raw pointer to it. */ XMLNode* XMLElement::insertLast (unique_ptr child) { if (!child) return nullptr; child->parent(this); if (!empty()) _lastChild = _lastChild->insertNext(std::move(child)); else { _firstChild = std::move(child); _lastChild = _firstChild.get(); } return _lastChild; } /** Inserts a new first child node and returns a raw pointer to it. */ XMLNode* XMLElement::insertFirst (unique_ptr child) { if (!child) return nullptr; child->parent(this); if (empty()) { _firstChild = std::move(child); _lastChild = _firstChild.get(); } else { child->insertNext(std::move(_firstChild)); _firstChild = std::move(child); } return _firstChild.get(); } /** Appends a child node to this element. The element also takes the ownership of the child. * @param[in] child node to be appended * @return raw pointer to the appended child node */ XMLNode* XMLElement::append (unique_ptr child) { if (!child) return nullptr; XMLText *textNode1 = child->toText(); if (!textNode1 || empty()) insertLast(std::move(child)); else { if (XMLText *textNode2 = _lastChild->toText()) textNode2->append(util::static_unique_ptr_cast(std::move(child))); // merge two consecutive text nodes else insertLast(std::move(child)); } return _lastChild; } /** Appends a string to this element. If the last child is a text node, the string is * appended there, otherwise a new text node is created. * @param[in] str string to be appended * @return raw pointer to the text node the string was appended to */ XMLNode* XMLElement::append (const string &str) { XMLText *last; if (!empty() && (last = _lastChild->toText())) last->append(str); else insertLast(util::make_unique(str)); return _lastChild; } /** Prepends a child node to this element. The element also takes the ownership of the child. * @param[in] child node to be prepended * @return raw pointer to the prepended child node */ XMLNode* XMLElement::prepend (unique_ptr child) { if (!child) return nullptr; XMLText *textNode1 = child->toText(); if (textNode1 && !empty()) { if (XMLText *textNode2 = _firstChild->toText()) { textNode2->prepend(util::static_unique_ptr_cast(std::move(child))); // merge two consecutive text nodes return textNode2; } } insertFirst(std::move(child)); return _firstChild.get(); } /** Inserts a new child node before a given child node already present. The latter * will be the following sibling of the node to be inserted. If there's no such * node present, nothing is inserted. * @param[in] child node to be inserted * @param[in] sibling following sibling of 'child' * @return raw pointer to inserted node */ XMLNode* XMLElement::insertBefore (unique_ptr child, XMLNode *sibling) { if (!child || (sibling && sibling->parent() != this)) return nullptr; if (!sibling) return insertLast(std::move(child)); if (sibling == _firstChild.get()) return insertFirst(std::move(child)); return sibling->prev()->insertNext(std::move(child)); } /** Inserts a new child node after a given child node already present. The latter * will be the preceding sibling of the node to be inserted. If there's no such * node present, nothing is inserted. * @param[in] child node to be inserted * @param[in] sibling preceding sibling of 'child' * @return raw pointer to inserted node */ XMLNode* XMLElement::insertAfter (unique_ptr child, XMLNode *sibling) { if (!child || (sibling && sibling->parent() != this)) return nullptr; if (!sibling) return insertFirst(std::move(child)); if (sibling == _lastChild) return insertLast(std::move(child)); return sibling->insertNext(std::move(child)); } /** Moves a sequence of child nodes to a new element of a given name and inserts * this (wrapper) element at the former position of the first node of the sequence. * Example: wrap 3 child nodes of element a with b: * text1text2 => text1text2 * @param[in] first first node to wrap * @param[in] last last node to wrap (or nullptr if all following siblings of 'first' are to be wrapped) * @param[in] name name of the wrapper element to be created * @return raw pointer to the new wrapper element */ XMLElement* XMLElement::wrap (XMLNode *first, XMLNode *last, const string &name) { if (!first || !first->parent() || (last && first->parent() != last->parent())) return nullptr; XMLElement *parent = first->parent()->toElement(); XMLNode *prev = first->prev(); auto wrapper = util::make_unique(name); if (last) last = last->next(); XMLNode *child = first; while (child && child != last) { XMLNode *next = child->next(); wrapper->insertLast(remove(child)); child = next; } XMLElement *ret = wrapper.get(); if (prev) parent->insertAfter(std::move(wrapper), prev); else parent->insertFirst(std::move(wrapper)); return ret; } /** Moves all child nodes C1,...,Cn of a given element E to its parent and * removes E afterwards, so that C1 is located at the former position of E * followed by C2,...,Cn. * Example: unwrap a child element b of a: * text1text2 => text1text2 * @param[in] child child element to unwrap * @return raw pointer to the first node C1 of the unwrapped sequence */ XMLNode* XMLElement::unwrap (XMLElement *child) { if (!child || !child->parent()) return nullptr; XMLElement *parent = child->parent()->toElement(); auto removedChild = remove(child); if (child->empty()) return child->next(); XMLNode *firstGrandchild = child->firstChild(); XMLNode *prev = child->prev(); unique_ptr grandchild = std::move(child->_firstChild); while (grandchild) { prev = parent->insertAfter(std::move(grandchild), prev); grandchild = std::move(prev->_next); } return firstGrandchild; } /** Removes a child node from the element. * @param[in] child pointer to child to remove * @return pointer to removed child or nullptr if given child doesn't belong to this element */ unique_ptr XMLElement::remove (XMLNode *child) { unique_ptr node; if (child && child->parent()) { XMLElement *parent = child->parent()->toElement(); if (child == parent->_lastChild) parent->_lastChild = child->prev(); if (child != parent->firstChild()) node = child->prev()->removeNext(); else { node = std::move(parent->_firstChild); if ((parent->_firstChild = std::move(node->_next))) parent->_firstChild->prev(nullptr); } child->parent(nullptr); } return node; } /** Gets all descendant elements with a given name and given attribute. * @param[in] name name of elements to find * @param[in] attrName name of attribute to find * @param[out] descendants all elements found * @return true if at least one element was found */ bool XMLElement::getDescendants (const char *name, const char *attrName, vector &descendants) const { for (XMLNode *child = _firstChild.get(); child; child = child->next()) { if (XMLElement *elem = child->toElement()) { if ((!name || elem->name() == name) && (!attrName || elem->hasAttribute(attrName))) descendants.push_back(elem); elem->getDescendants(name, attrName, descendants); } } return !descendants.empty(); } /** Returns the first descendant element that matches the given properties in depth first order. * @param[in] name element name; if 0, all elements are taken into account * @param[in] attrName if not 0, only elements with an attribute of this name are considered * @param[in] attrValue if not 0, only elements with attribute attrName="attrValue" are considered * @return pointer to the found element or 0 */ XMLElement* XMLElement::getFirstDescendant (const char *name, const char *attrName, const char *attrValue) const { for (XMLNode *child = _firstChild.get(); child; child = child->next()) { if (XMLElement *elem = child->toElement()) { if (!name || elem->name() == name) { const char *value; if (!attrName || (((value = elem->getAttributeValue(attrName)) != nullptr) && (!attrValue || string(value) == attrValue))) return elem; } if (XMLElement *descendant = elem->getFirstDescendant(name, attrName, attrValue)) return descendant; } } return nullptr; } ostream& XMLElement::write (ostream &os) const { os << '<' << _name; for (const auto &attrib : _attributes) os << ' ' << attrib.name << "='" << attrib.value << '\''; if (empty()) os << "/>"; else { os << '>'; // Insert newlines around children except text nodes. According to the // SVG specification, pure whitespace nodes are ignored by the SVG renderer. if (WRITE_NEWLINES && !_firstChild->toText()) os << '\n'; for (XMLNode *child = _firstChild.get(); child; child = child->next()) { child->write(os); if (!child->toText()) { if (WRITE_NEWLINES && (!child->next() || !child->next()->toText())) os << '\n'; } } os << "'; } return os; } /** Returns true if this element has an attribute of given name. */ bool XMLElement::hasAttribute (const string &name) const { return getAttribute(name) != nullptr; } /** Returns the value of an attribute. * @param[in] name name of attribute * @return attribute value or 0 if attribute doesn't exist */ const char* XMLElement::getAttributeValue (const std::string& name) const { if (const Attribute *attr = getAttribute(name)) return attr->value.c_str(); return nullptr; } XMLElement::Attribute* XMLElement::getAttribute (const string &name) { auto it = find_if(_attributes.begin(), _attributes.end(), [&](const Attribute &attr) { return attr.name == name; }); return it != _attributes.end() ? &(*it) : nullptr; } const XMLElement::Attribute* XMLElement::getAttribute (const string &name) const { auto it = find_if(_attributes.begin(), _attributes.end(), [&](const Attribute &attr) { return attr.name == name; }); return it != _attributes.end() ? &(*it) : nullptr; } ////////////////////// void XMLText::append (unique_ptr node) { if (!node) return; if (node->toText()) append(util::static_unique_ptr_cast(std::move(node))); else { // append text representation of the node ostringstream oss; node->write(oss); append(XMLString(oss.str())); } } void XMLText::append (unique_ptr node) { if (node) _text += node->_text; } void XMLText::append (const string &str) { _text += str; } void XMLText::prepend (unique_ptr node) { if (XMLText *textNode = node->toText()) _text = textNode->_text + _text; } const XMLText* XMLText::toWSNode () const { return _text.find_first_not_of(" \t\n\r") == string::npos ? this : nullptr; } ///////////////////////////////////////////////////////////////////// ostream& XMLCData::write (ostream &os) const { if (!_data.empty()) os << ""; return os; } void XMLCData::append (string &&str) { if (_data.empty()) _data = move(str); else _data += str; } dvisvgm-2.8.1/src/CMapManager.hpp0000664000175000017500000000425513510660062013544 00000000000000/************************************************************************* ** CMapManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CMAPMANAGER_HPP #define CMAPMANAGER_HPP #include #include #include #include #include "CharMapID.hpp" struct CMap; struct FontEncoding; class FontEncodingPair; class PhysicalFont; class CMapManager { public: CMap* lookup (const std::string &name); const CMap* findCompatibleBaseFontMap (const PhysicalFont *font, const CMap *cmap, CharMapID &charmapID); static CMapManager& instance (); protected: CMapManager () : _level(0) {} private: std::unordered_map> _cmaps; ///< loaded cmaps std::unordered_set _includedCMaps; ///< names of cmaps loaded by "usecmap" int _level; ///< current inclusion depth; >0 if a cmap loaded by "usecmap" is being processed }; #endif dvisvgm-2.8.1/src/JFM.hpp0000664000175000017500000000411013510660062012033 00000000000000/************************************************************************* ** JFM.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef JFM_HPP #define JFM_HPP #include #include "TFM.hpp" class JFM : public TFM { public: explicit JFM (std::istream &is); bool verticalLayout () const override {return _vertical;} uint32_t minChar () const {return _minchar;} uint32_t maxChar () const {return static_cast(_minchar+_charTypeTable.size()-1);} protected: void readTables (StreamReader &reader, int nt, int nw, int nh, int nd, int ni); int charIndex (int c) const override; private: uint32_t _minchar; ///< character code of first entry in character type table bool _vertical; ///< true if metrics refer to vertical text layout std::vector _charTypeTable; }; #endif dvisvgm-2.8.1/src/BasicDVIReader.cpp0000664000175000017500000003217713510660062014137 00000000000000/************************************************************************* ** BasicDVIReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "BasicDVIReader.hpp" using namespace std; BasicDVIReader::BasicDVIReader (std::istream &is) : StreamReader(is), _dviVersion(DVI_NONE) { } /** Evaluates the next DVI command, and computes the corresponding handler. * @param[out] handler handler for current DVI command * @param[out] param the handler must be called with this parameter * @return opcode of current DVI command */ int BasicDVIReader::evalCommand (CommandHandler &handler, int ¶m) { struct DVICommand { CommandHandler handler; int length; // number of parameter bytes }; /* Each cmdFOO command reads the necessary number of bytes from the stream, so executeCommand doesn't need to know the exact DVI command format. Some cmdFOO methods are used for multiple DVI commands because they only differ in length of their parameters. */ static const DVICommand commands[] = { {&BasicDVIReader::cmdSetChar, 1}, {&BasicDVIReader::cmdSetChar, 2}, // 128-129 {&BasicDVIReader::cmdSetChar, 3}, {&BasicDVIReader::cmdSetChar, 4}, // 130-131 {&BasicDVIReader::cmdSetRule, 8}, // 132 {&BasicDVIReader::cmdPutChar, 1}, {&BasicDVIReader::cmdPutChar, 2}, // 133-134 {&BasicDVIReader::cmdPutChar, 3}, {&BasicDVIReader::cmdPutChar, 4}, // 135-136 {&BasicDVIReader::cmdPutRule, 8}, // 137 {&BasicDVIReader::cmdNop, 0}, // 138 {&BasicDVIReader::cmdBop, 44}, {&BasicDVIReader::cmdEop, 0}, // 139-140 {&BasicDVIReader::cmdPush, 0}, {&BasicDVIReader::cmdPop, 0}, // 141-142 {&BasicDVIReader::cmdRight, 1}, {&BasicDVIReader::cmdRight, 2}, // 143-144 {&BasicDVIReader::cmdRight, 3}, {&BasicDVIReader::cmdRight, 4}, // 145-146 {&BasicDVIReader::cmdW0, 0}, // 147 {&BasicDVIReader::cmdW, 1}, {&BasicDVIReader::cmdW, 2}, // 148-149 {&BasicDVIReader::cmdW, 3}, {&BasicDVIReader::cmdW, 4}, // 150-151 {&BasicDVIReader::cmdX0, 0}, // 152 {&BasicDVIReader::cmdX, 1}, {&BasicDVIReader::cmdX, 2}, // 153-154 {&BasicDVIReader::cmdX, 3}, {&BasicDVIReader::cmdX, 4}, // 155-156 {&BasicDVIReader::cmdDown, 1}, {&BasicDVIReader::cmdDown, 2}, // 157-158 {&BasicDVIReader::cmdDown, 3}, {&BasicDVIReader::cmdDown, 4}, // 159-160 {&BasicDVIReader::cmdY0, 0}, // 161 {&BasicDVIReader::cmdY, 1}, {&BasicDVIReader::cmdY, 2}, // 162-163 {&BasicDVIReader::cmdY, 3}, {&BasicDVIReader::cmdY, 4}, // 164-165 {&BasicDVIReader::cmdZ0, 0}, // 166 {&BasicDVIReader::cmdZ, 1}, {&BasicDVIReader::cmdZ, 2}, // 167-168 {&BasicDVIReader::cmdZ, 3}, {&BasicDVIReader::cmdZ, 4}, // 169-170 {&BasicDVIReader::cmdFontNum, 1}, {&BasicDVIReader::cmdFontNum, 2}, // 235-236 {&BasicDVIReader::cmdFontNum, 3}, {&BasicDVIReader::cmdFontNum, 4}, // 237-238 {&BasicDVIReader::cmdXXX, 1}, {&BasicDVIReader::cmdXXX, 2}, // 239-240 {&BasicDVIReader::cmdXXX, 3}, {&BasicDVIReader::cmdXXX, 4}, // 241-242 {&BasicDVIReader::cmdFontDef, 1}, {&BasicDVIReader::cmdFontDef, 2}, // 243-244 {&BasicDVIReader::cmdFontDef, 3}, {&BasicDVIReader::cmdFontDef, 4}, // 245-246 {&BasicDVIReader::cmdPre, 0}, {&BasicDVIReader::cmdPost, 0}, // 247-248 {&BasicDVIReader::cmdPostPost, 0}, // 249 }; const int opcode = readByte(); if (!isStreamValid() || opcode < 0) // at end of file throw InvalidDVIFileException("invalid DVI file"); int num_param_bytes = 0; param = -1; if (opcode >= OP_SETCHAR0 && opcode <= OP_SETCHAR127) { handler = &BasicDVIReader::cmdSetChar0; param = opcode; } else if (opcode >= OP_FNTNUM0 && opcode <= OP_FNTNUM63) { handler = &BasicDVIReader::cmdFontNum0; param = opcode-OP_FNTNUM0; } else if (evalXDVOpcode(opcode, handler)) num_param_bytes = 0; else if (_dviVersion == DVI_PTEX && opcode == OP_DIR) { // direction command set by pTeX? handler = &BasicDVIReader::cmdDir; num_param_bytes = 1; } else if (opcode > OP_POSTPOST) throw DVIException("undefined DVI command (opcode " + to_string(opcode) + ")"); else { const int offset = opcode < OP_FNTNUM0 ? OP_SET1 : (OP_FNTNUM63+1)-(OP_FNTNUM0-OP_SET1); handler = commands[opcode-offset].handler; num_param_bytes = commands[opcode-offset].length; } if (param < 0) param = num_param_bytes; return opcode; } /** Checks if a given opcode belongs to an XDV extension. * @param[in] op the opcode to check * @param[out] handler corresponding command handler if opcode is valid */ bool BasicDVIReader::evalXDVOpcode (int op, CommandHandler &handler) const { static const struct { int min, max; // minimal and maximal opcode in XDV section } xdvranges[] = { {251, 254}, // XDV5 {252, 253}, // XDV6 {252, 254}, // XDV7 }; int index = _dviVersion-DVI_XDV5; if (_dviVersion < DVI_XDV5 || _dviVersion > DVI_XDV7 || op < xdvranges[index].min || op > xdvranges[index].max) return false; static const CommandHandler handlers[] = { &BasicDVIReader::cmdXPic, // 251 (XDV5 only) &BasicDVIReader::cmdXFontDef, // 252 &BasicDVIReader::cmdXGlyphArray, // 253 &BasicDVIReader::cmdXTextAndGlyphs, // 254 (XDV7 only) &BasicDVIReader::cmdXGlyphString // 254 (XDV5 only) }; index = op-251; if (_dviVersion == DVI_XDV5 && op == 254) index++; handler = handlers[index]; return true; } /** Reads a single DVI command from the current position of the input stream and calls the * corresponding cmdFOO method. * @return opcode of the executed command */ int BasicDVIReader::executeCommand () { CommandHandler handler; int param; // parameter of handler int opcode = evalCommand(handler, param); (this->*handler)(param); return opcode; } void BasicDVIReader::executePostPost () { clearStream(); // reset all status bits if (!isStreamValid()) throw DVIException("invalid DVI file"); seek(-1, ios::end); // stream pointer to last byte int count=0; while (peek() == DVI_FILL) { // count trailing fill bytes seek(-1, ios::cur); count++; } if (count < 4) // the standard requires at least 4 trailing fill bytes throw DVIException("missing fill bytes at end of file"); setDVIVersion((DVIVersion)readUnsigned(1)); } void BasicDVIReader::executeAllPages () { if (_dviVersion == DVI_NONE) executePostPost(); // get version ID from post_post seek(0); // go to preamble while (executeCommand() != OP_POST); // execute all commands until postamble is reached } void BasicDVIReader::setDVIVersion (DVIVersion version) { _dviVersion = max(_dviVersion, version); switch (_dviVersion) { case DVI_STANDARD: case DVI_PTEX: case DVI_XDV5: case DVI_XDV6: case DVI_XDV7: break; default: throw DVIException("DVI version " + to_string(_dviVersion) + " not supported"); } } ///////////////////////////////////// /** Executes preamble command. * Format: pre i[1] num[4] den[4] mag[4] k[1] x[k] */ void BasicDVIReader::cmdPre (int) { setDVIVersion((DVIVersion)readUnsigned(1)); // identification number seek(12, ios::cur); // skip numerator, denominator, and mag factor uint32_t k = readUnsigned(1); // length of following comment seek(k, ios::cur); // skip comment } /** Executes postamble command. * Format: post p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2] */ void BasicDVIReader::cmdPost (int) { seek(28, ios::cur); } /** Executes postpost command. * Format: postpost q[4] i[1] 223's[>= 4] */ void BasicDVIReader::cmdPostPost (int) { seek(4, ios::cur); setDVIVersion((DVIVersion)readUnsigned(1)); // identification byte while (readUnsigned(1) == DVI_FILL); // skip fill bytes (223), eof bit should be set now } /** Executes bop (begin of page) command. * Format: bop c0[+4] ... c9[+4] p[+4] */ void BasicDVIReader::cmdBop (int) {seek(44, ios::cur);} void BasicDVIReader::cmdEop (int) {} void BasicDVIReader::cmdPush (int) {} void BasicDVIReader::cmdPop (int) {} void BasicDVIReader::cmdSetChar0 (int) {} void BasicDVIReader::cmdSetChar (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdPutChar (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdSetRule (int) {seek(8, ios::cur);} void BasicDVIReader::cmdPutRule (int) {seek(8, ios::cur);} void BasicDVIReader::cmdRight (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdDown (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdX0 (int) {} void BasicDVIReader::cmdY0 (int) {} void BasicDVIReader::cmdW0 (int) {} void BasicDVIReader::cmdZ0 (int) {} void BasicDVIReader::cmdX (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdY (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdW (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdZ (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdNop (int) {} void BasicDVIReader::cmdDir (int) {seek(1, ios::cur);} void BasicDVIReader::cmdFontNum0 (int) {} void BasicDVIReader::cmdFontNum (int len) {seek(len, ios::cur);} void BasicDVIReader::cmdXXX (int len) {seek(readUnsigned(len), ios::cur);} /** Executes fontdef command. * Format: fontdef k[len] c[4] s[4] d[4] a[1] l[1] n[a+l] * @param[in] len size of font number variable (in bytes) */ void BasicDVIReader::cmdFontDef (int len) { seek(len+12, ios::cur); // skip font number uint32_t pathlen = readUnsigned(1); // length of font path uint32_t namelen = readUnsigned(1); // length of font name seek(pathlen+namelen, ios::cur); } /** XDV extension: include image or pdf file. * parameters: box[1] matrix[4][6] p[2] len[2] path[l] */ void BasicDVIReader::cmdXPic (int) { seek(1+24+2, ios::cur); uint16_t len = readUnsigned(2); seek(len, ios::cur); } void BasicDVIReader::cmdXFontDef (int) { seek(4+4, ios::cur); uint16_t flags = readUnsigned(2); uint8_t len = readUnsigned(1); if (_dviVersion == DVI_XDV5) len += readUnsigned(1)+readUnsigned(1); seek(len, ios::cur); if (_dviVersion >= DVI_XDV6) seek(4, ios::cur); // skip subfont index if (flags & 0x0200) // colored? seek(4, ios::cur); if (flags & 0x1000) // extend? seek(4, ios::cur); if (flags & 0x2000) // slant? seek(4, ios::cur); if (flags & 0x4000) // embolden? seek(4, ios::cur); if ((flags & 0x0800) && (_dviVersion == DVI_XDV5)) { // variations? uint16_t num_variations = readSigned(2); seek(4*num_variations, ios::cur); } } /** XDV extension: prints an array of characters where each character * can take independent x and y coordinates. * parameters: w[4] n[2] xy[(4+4)n] g[2n] */ void BasicDVIReader::cmdXGlyphArray (int) { seek(4, ios::cur); uint16_t num_glyphs = readUnsigned(2); seek(10*num_glyphs, ios::cur); } /** XDV extension: prints an array/string of characters where each character * can take independent x coordinates whereas all share a single y coordinate. * parameters: w[4] n[2] x[4n] y[4] g[2n] */ void BasicDVIReader::cmdXGlyphString (int) { seek(4, ios::cur); uint16_t num_glyphs = readUnsigned(2); seek(6*num_glyphs, ios::cur); } /** XDV extension: Same as cmdXGlyphArray plus a leading array of UTF-16 characters * that specify the "actual text" represented by the glyphs to be printed. It usually * contains the text with special characters (like ligatures) expanded so that it * can be used for text search, plain text copy & paste etc. This XDV command was * introduced with XeTeX 0.99995 and can be triggered by \\XeTeXgenerateactualtext1. * parameters: l[2] t[2l] w[4] n[2] xy[8n] g[2n] */ void BasicDVIReader::cmdXTextAndGlyphs (int) { uint16_t l = readUnsigned(2); seek(2*l, ios::cur); cmdXGlyphArray(0); } dvisvgm-2.8.1/src/iapi.h0000664000175000017500000002345413510660062012015 00000000000000/* Copyright (C) 2001-2006 Artifex Software, Inc. All Rights Reserved. This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of that license. Refer to licensing information at http://www.artifex.com/ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. */ /* $Id: iapi.h 9043 2008-08-28 22:48:19Z giles $ */ /* * Public API for Ghostscript interpreter * for use both as DLL and for static linking. * * Should work for Windows, OS/2, Linux, Mac. * * DLL exported functions should be as similar as possible to imain.c * You will need to include "ierrors.h". * * Current problems: * 1. Ghostscript does not support multiple instances. * 2. Global variables in gs_main_instance_default() * and gsapi_instance_counter */ /* Exported functions may need different prefix * GSDLLEXPORT marks functions as exported * GSDLLAPI is the calling convention used on functions exported * by Ghostscript * GSDLLCALL is used on callback functions called by Ghostscript * When you include this header file in the caller, you may * need to change the definitions by defining these * before including this header file. * Make sure you get the calling convention correct, otherwise your * program will crash either during callbacks or soon after returning * due to stack corruption. */ #ifndef iapi_INCLUDED # define iapi_INCLUDED #ifdef __cplusplus extern "C" { #endif #if defined(_WINDOWS_) || defined(__WINDOWS__) # ifndef _Windows # define _Windows # endif #endif #ifdef _Windows # ifndef GSDLLEXPORT # define GSDLLEXPORT __declspec(dllexport) # endif # ifndef GSDLLAPI # define GSDLLAPI __stdcall # endif # ifndef GSDLLCALL # define GSDLLCALL __stdcall # endif #endif /* _Windows */ #if defined(OS2) && defined(__IBMC__) # ifndef GSDLLAPI # define GSDLLAPI _System # endif # ifndef GSDLLCALL # define GSDLLCALL _System # endif #endif /* OS2 && __IBMC */ #ifdef __MACOS__ # pragma export on #endif #ifndef GSDLLEXPORT # define GSDLLEXPORT #endif #ifndef GSDLLAPI # define GSDLLAPI #endif #ifndef GSDLLCALL # define GSDLLCALL #endif #if defined(__IBMC__) # define GSDLLAPIPTR * GSDLLAPI # define GSDLLCALLPTR * GSDLLCALL #else # define GSDLLAPIPTR GSDLLAPI * # define GSDLLCALLPTR GSDLLCALL * #endif #ifndef display_callback_DEFINED # define display_callback_DEFINED typedef struct display_callback_s display_callback; #endif typedef struct gsapi_revision_s { const char *product; const char *copyright; long revision; long revisiondate; } gsapi_revision_t; /* Get version numbers and strings. * This is safe to call at any time. * You should call this first to make sure that the correct version * of the Ghostscript is being used. * pr is a pointer to a revision structure. * len is the size of this structure in bytes. * Returns 0 if OK, or if len too small (additional parameters * have been added to the structure) it will return the required * size of the structure. */ GSDLLEXPORT int GSDLLAPI gsapi_revision(gsapi_revision_t *pr, int len); /* * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING * Ghostscript supports only one instance. * The current implementation uses a global static instance * counter to make sure that only a single instance is used. * If you try to create two instances, the second attempt * will return < 0 and set pinstance to NULL. * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ /* Create a new instance of Ghostscript. * This instance is passed to most other API functions. * The caller_handle will be provided to callback functions. */ GSDLLEXPORT int GSDLLAPI gsapi_new_instance(void **pinstance, void *caller_handle); /* * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING * Ghostscript supports only one instance. * The current implementation uses a global static instance * counter to make sure that only a single instance is used. * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */ /* Destroy an instance of Ghostscript * Before you call this, Ghostscript must have finished. * If Ghostscript has been initialised, you must call gsapi_exit() * before gsapi_delete_instance. */ GSDLLEXPORT void GSDLLAPI gsapi_delete_instance(void *instance); /* Set the callback functions for stdio * The stdin callback function should return the number of * characters read, 0 for EOF, or -1 for error. * The stdout and stderr callback functions should return * the number of characters written. * If a callback address is NULL, the real stdio will be used. */ GSDLLEXPORT int GSDLLAPI gsapi_set_stdio(void *instance, int (GSDLLCALLPTR stdin_fn)(void *caller_handle, char *buf, int len), int (GSDLLCALLPTR stdout_fn)(void *caller_handle, const char *str, int len), int (GSDLLCALLPTR stderr_fn)(void *caller_handle, const char *str, int len)); /* Set the callback function for polling. * This is used for handling window events or cooperative * multitasking. This function will only be called if * Ghostscript was compiled with CHECK_INTERRUPTS * as described in gpcheck.h. * The polling function should return 0 if all is well, * and negative if it wants ghostscript to abort. * The polling function must be fast. */ GSDLLEXPORT int GSDLLAPI gsapi_set_poll(void *instance, int (GSDLLCALLPTR poll_fn)(void *caller_handle)); /* Set the display device callback structure. * If the display device is used, this must be called * after gsapi_new_instance() and before gsapi_init_with_args(). * See gdevdisp.h for more details. */ GSDLLEXPORT int GSDLLAPI gsapi_set_display_callback( void *instance, display_callback *callback); /* Initialise the interpreter. * This calls gs_main_init_with_args() in imainarg.c * 1. If quit or EOF occur during gsapi_init_with_args(), * the return value will be e_Quit. This is not an error. * You must call gsapi_exit() and must not call any other * gsapi_XXX functions. * 2. If usage info should be displayed, the return value will be e_Info * which is not an error. Do not call gsapi_exit(). * 3. Under normal conditions this returns 0. You would then * call one or more gsapi_run_*() functions and then finish * with gsapi_exit(). */ GSDLLEXPORT int GSDLLAPI gsapi_init_with_args(void *instance, int argc, char **argv); /* * The gsapi_run_* functions are like gs_main_run_* except * that the error_object is omitted. * If these functions return <= -100, either quit or a fatal * error has occured. You then call gsapi_exit() next. * The only exception is gsapi_run_string_continue() * which will return e_NeedInput if all is well. */ GSDLLEXPORT int GSDLLAPI gsapi_run_string_begin(void *instance, int user_errors, int *pexit_code); GSDLLEXPORT int GSDLLAPI gsapi_run_string_continue(void *instance, const char *str, unsigned int length, int user_errors, int *pexit_code); GSDLLEXPORT int GSDLLAPI gsapi_run_string_end(void *instance, int user_errors, int *pexit_code); GSDLLEXPORT int GSDLLAPI gsapi_run_string_with_length(void *instance, const char *str, unsigned int length, int user_errors, int *pexit_code); GSDLLEXPORT int GSDLLAPI gsapi_run_string(void *instance, const char *str, int user_errors, int *pexit_code); GSDLLEXPORT int GSDLLAPI gsapi_run_file(void *instance, const char *file_name, int user_errors, int *pexit_code); /* Exit the interpreter. * This must be called on shutdown if gsapi_init_with_args() * has been called, and just before gsapi_delete_instance(). */ GSDLLEXPORT int GSDLLAPI gsapi_exit(void *instance); /* Visual Tracer */ /* This function is only for debug purpose clients */ struct vd_trace_interface_s; GSDLLEXPORT void GSDLLAPI gsapi_set_visual_tracer(struct vd_trace_interface_s *I); /* function prototypes */ typedef int (GSDLLAPIPTR PFN_gsapi_revision)( gsapi_revision_t *pr, int len); typedef int (GSDLLAPIPTR PFN_gsapi_new_instance)( void **pinstance, void *caller_handle); typedef void (GSDLLAPIPTR PFN_gsapi_delete_instance)( void *instance); typedef int (GSDLLAPIPTR PFN_gsapi_set_stdio)(void *instance, int (GSDLLCALLPTR stdin_fn)(void *caller_handle, char *buf, int len), int (GSDLLCALLPTR stdout_fn)(void *caller_handle, const char *str, int len), int (GSDLLCALLPTR stderr_fn)(void *caller_handle, const char *str, int len)); typedef int (GSDLLAPIPTR PFN_gsapi_set_poll)(void *instance, int(GSDLLCALLPTR poll_fn)(void *caller_handle)); typedef int (GSDLLAPIPTR PFN_gsapi_set_display_callback)( void *instance, display_callback *callback); typedef int (GSDLLAPIPTR PFN_gsapi_init_with_args)( void *instance, int argc, char **argv); typedef int (GSDLLAPIPTR PFN_gsapi_run_string_begin)( void *instance, int user_errors, int *pexit_code); typedef int (GSDLLAPIPTR PFN_gsapi_run_string_continue)( void *instance, const char *str, unsigned int length, int user_errors, int *pexit_code); typedef int (GSDLLAPIPTR PFN_gsapi_run_string_end)( void *instance, int user_errors, int *pexit_code); typedef int (GSDLLAPIPTR PFN_gsapi_run_string_with_length)( void *instance, const char *str, unsigned int length, int user_errors, int *pexit_code); typedef int (GSDLLAPIPTR PFN_gsapi_run_string)( void *instance, const char *str, int user_errors, int *pexit_code); typedef int (GSDLLAPIPTR PFN_gsapi_run_file)(void *instance, const char *file_name, int user_errors, int *pexit_code); typedef int (GSDLLAPIPTR PFN_gsapi_exit)(void *instance); typedef void (GSDLLAPIPTR PFN_gsapi_set_visual_tracer) (struct vd_trace_interface_s *I); #ifdef __MACOS__ #pragma export off #endif #ifdef __cplusplus } /* extern 'C' protection */ #endif #endif /* iapi_INCLUDED */ dvisvgm-2.8.1/src/FileSystem.hpp0000664000175000017500000000534513510660062013516 00000000000000/************************************************************************* ** FileSystem.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FILESYSTEM_HPP #define FILESYSTEM_HPP #include #include class FileSystem { public: ~FileSystem (); static bool remove (const std::string &fname); static bool rename (const std::string &oldname, const std::string &newname); static bool copy (const std::string &src, const std::string &dest, bool remove_src=false); static uint64_t filesize (const std::string &fname); static std::string adaptPathSeperators (std::string path); static std::string getcwd (); static std::string tmpdir (); static bool chdir (const std::string &dir); static bool exists (const std::string &fname); static bool mkdir (const std::string &dirname); static bool rmdir (const std::string &dirname); static int collect (const std::string &dirname, std::vector &entries); static bool isDirectory (const std::string &fname); static bool isFile (const std::string &fname); static const char* userdir (); static const char* DEVNULL; ///< name of NULL device static const char PATHSEP; ///< character used to separate folders/files in a path static std::string TMPDIR; ///< set path to temporary folder protected: FileSystem () =default; bool system_tmpdir_available (); static const char* TMPSUBDIR; ///< subdirectory of the system's temporary folder private: static FileSystem _fs; }; #endif dvisvgm-2.8.1/src/TFM.hpp0000664000175000017500000000676213510660062012064 00000000000000/************************************************************************* ** TFM.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef TFM_HPP #define TFM_HPP #include #include #include #include "FixWord.hpp" #include "FontMetrics.hpp" #include "StreamReader.hpp" class StreamReader; class TFM : public FontMetrics { public: explicit TFM (std::istream &is); double getCharWidth (int c) const override; double getCharHeight (int c) const override; double getCharDepth (int c) const override; double getItalicCorr (int c) const override; double getDesignSize () const override {return _designSize;} double getSpace () const override; double getSpaceStretch () const override; double getSpaceShrink () const override; double getQuad () const override; double getAscent () const override {return double(_ascent)*_designSize;} double getDescent () const override {return double(_descent)*_designSize;} bool verticalLayout () const override {return false;} uint32_t getChecksum () const override {return _checksum;} uint16_t firstChar () const override {return _firstChar;} uint16_t lastChar () const override {return _lastChar;} protected: TFM () : _checksum(0), _firstChar(0), _lastChar(0), _designSize(0), _params(7) {} void readHeader (StreamReader &reader); void readTables (StreamReader &reader, int nw, int nh, int nd, int ni); void readParameters (StreamReader &reader, int np); virtual int charIndex (int c) const; void setCharRange (int firstchar, int lastchar) {_firstChar=firstchar; _lastChar=lastchar;} private: uint32_t _checksum; uint16_t _firstChar, _lastChar; double _designSize; ///< design size of the font in PS points (72bp = 1in) std::vector _charInfoTable; std::vector _widthTable; ///< character widths in design size units std::vector _heightTable; ///< character height in design size units std::vector _depthTable; ///< character depth in design size units std::vector _italicTable; ///< italic corrections in design size units std::vector _params; ///< values of the TFM's param section FixWord _ascent, _descent; ///< max. height and depth }; #endif dvisvgm-2.8.1/src/SVGOutput.hpp0000664000175000017500000000665413553267757013343 00000000000000/************************************************************************* ** SVGOutput.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGOUTPUT_HPP #define SVGOUTPUT_HPP #include #include #include #include "FilePath.hpp" struct SVGOutputBase { class HashTriple { public: HashTriple () =default; HashTriple (std::string dviHash, std::string optHash, std::string cmbHash) : _dviHash(std::move(dviHash)), _optHash(std::move(optHash)), _cmbHash(std::move(cmbHash)) {} std::string dviHash () const {return _dviHash;} std::string optHash () const {return _optHash;} std::string cmbHash () const {return _cmbHash;} bool empty () const {return _dviHash.empty();} private: std::string _dviHash; ///< hash of plain DVI data std::string _optHash; ///< hash of options affecting the SVG document std::string _cmbHash; ///< combined hash of DVI data and options }; virtual ~SVGOutputBase () =default; virtual std::ostream& getPageStream (int page, int numPages, const HashTriple &hashes=HashTriple()) const =0; virtual FilePath filepath (int page, int numPages, const HashTriple &hashes= HashTriple()) const =0; virtual bool ignoresHashes () const {return true;} }; class SVGOutput : public SVGOutputBase { public: SVGOutput () : SVGOutput("", "", 0) {} explicit SVGOutput (const std::string &base) : SVGOutput(base, "", 0) {} SVGOutput (const std::string &base, const std::string &pattern) : SVGOutput(base, pattern, 0) {} SVGOutput (const std::string &base, std::string pattern, int zipLevel); std::ostream& getPageStream (int page, int numPages, const HashTriple &hash=HashTriple()) const override; FilePath filepath (int page, int numPages, const HashTriple &hash=HashTriple()) const override; bool ignoresHashes () const override; protected: std::string expandFormatString (std::string str, int page, int numPages, const HashTriple &hashes) const; private: FilePath _path; std::string _pattern; bool _stdout; ///< write to STDOUT? int _zipLevel; ///< compression level mutable int _page; ///< number of current page being written mutable std::unique_ptr _osptr; }; #endif dvisvgm-2.8.1/src/VectorStream.hpp0000664000175000017500000000563113510660062014046 00000000000000/************************************************************************* ** VectorStream.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef VECTORSTREAM_HPP #define VECTORSTREAM_HPP #include #include template class VectorStreamBuffer : public std::streambuf { public: explicit VectorStreamBuffer (const std::vector &v) { if (v.empty()) _begin = _end = _curr = nullptr; else { _begin = _curr = &v[0]; _end = &v[0]+v.size(); } } protected: int_type underflow () override { return _curr == _end ? traits_type::eof() : traits_type::to_int_type(*_curr); } int_type uflow() override { return _curr == _end ? traits_type::eof() : traits_type::to_int_type(*_curr++); } std::streamsize showmanyc () override {return _end-_curr;} int_type pbackfail (int_type c) override { if (_curr == _begin || (c != traits_type::eof() && c != _curr[-1])) return traits_type::eof(); return traits_type::to_int_type(*--_curr); } pos_type seekoff (off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which=std::ios_base::in) override { switch (dir) { case std::ios_base::cur: _curr += off; break; case std::ios_base::beg: _curr = _begin+off; break; case std::ios_base::end: _curr = _end-off; break; default: break; } return _curr-_begin; } private: const T *_begin; const T *_end; const T *_curr; }; template class VectorInputStream : public std::istream { public: explicit VectorInputStream (const std::vector &source) : std::istream(&_buf), _buf(source) {} private: VectorStreamBuffer _buf; }; #endif dvisvgm-2.8.1/src/BoundingBox.hpp0000664000175000017500000000751013510660062013644 00000000000000/************************************************************************* ** BoundingBox.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef BOUNDINGBOX_HPP #define BOUNDINGBOX_HPP #include #include #include #include #include "Length.hpp" #include "MessageException.hpp" #include "Pair.hpp" class Matrix; class XMLElement; struct BoundingBoxException : MessageException { explicit BoundingBoxException (const std::string &msg) : MessageException(msg) {} }; class BoundingBox { public: BoundingBox (); BoundingBox (double ulxx, double ulyy, double lrxx, double lryy); BoundingBox (const DPair &p1, const DPair &p2); BoundingBox (const Length &ulxx, const Length &ulyy, const Length &lrxx, const Length &lryy); explicit BoundingBox (const std::string &boxstr); void set (const std::string &boxstr); void set (const std::vector &lengths); void embed (double x, double y); void embed (const BoundingBox &bb); void embed (const DPair &p) {embed(p.x(), p.y());} void embed (const DPair &c, double r); static std::vector extractLengths (std::string boxstr); template void embed (const Pair &p) {embed(p.x(), p.y());} void expand (double m); bool intersect (const BoundingBox &bbox); double minX () const {return _ulx;} double minY () const {return _uly;} double maxX () const {return _lrx;} double maxY () const {return _lry;} double width () const {return _lrx-_ulx;} double height () const {return _lry-_uly;} bool valid() const {return _valid;} bool locked() const {return _locked;} void lock () {_locked = true;} void unlock () {_locked = false;} void invalidate () {_valid = false;} void operator += (const BoundingBox &bbox); bool operator == (const BoundingBox &bbox) const; bool operator != (const BoundingBox &bbox) const {return !(*this == bbox);} void scale (double sx, double sy); void transform (const Matrix &tm); std::string toSVGViewBox () const; std::ostream& write (std::ostream &os) const; std::unique_ptr createSVGRect () const; private: double _ulx, _uly; ///< coordinates of upper left vertex (in PS point units) double _lrx, _lry; ///< coordinates of lower right vertex (in PS point units) bool _valid : 1; ///< true if the box coordinates are properly set bool _locked : 1; ///< if true, the box data is read-only }; inline std::ostream& operator << (std::ostream &os, const BoundingBox &bbox) { return bbox.write(os); } #endif dvisvgm-2.8.1/src/DVIReader.hpp0000664000175000017500000002042013510660062013166 00000000000000/************************************************************************* ** DVIReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DVIREADER_HPP #define DVIREADER_HPP #include #include #include #include #include "BasicDVIReader.hpp" #include "Color.hpp" #include "VFActions.hpp" class Font; class FontStyle; class HashFunction; class NativeFont; class VirtualFont; class DVIReader : public BasicDVIReader, public VFActions { protected: enum class WritingMode {LR=0, TB=1, BT=3}; enum class SetFontMode {SF_SHORT, SF_LONG, VF_ENTER, VF_LEAVE}; enum class MoveMode {SETCHAR, CHANGEPOS}; struct DVIState { double h, v; ///< horizontal and vertical cursor position double x, w, y, z; ///< additional registers to store horizontal (x, w) and vertical (y, z) positions WritingMode d; ///< direction: 0: horizontal, 1: vertical(top->bottom), 3: vertical (bottom->top) DVIState () {reset();} void reset () {h = v = x = w = y = z = 0.0; d=WritingMode::LR;} }; public: explicit DVIReader (std::istream &is); bool executeDocument (); void executeAll (); void executePreamble (); void executePostamble (); bool executePage (unsigned n); bool inPostamble () const {return _inPostamble;} double getXPos () const override {return _dviState.h;} double getYPos () const override {return _dviState.v;} int stackDepth () const override {return _stateStack.size();} int currentFontNumber () const {return _currFontNum;} unsigned currentPageNumber () const override {return _currPageNum;} unsigned numberOfPages () const {return _bopOffsets.empty() ? 0 : _bopOffsets.size()-1;} protected: int executeCommand () override; void collectBopOffsets (); size_t numberOfPageBytes (int n) const {return _bopOffsets.size() > 1 ? _bopOffsets[n+1]-_bopOffsets[n] : 0;} bool computePageHash (size_t pageno, HashFunction &hashFunc); void goToPostamble (); virtual void moveRight (double dx, MoveMode mode); virtual void moveDown (double dy, MoveMode mode); void putVFChar (Font *font, uint32_t c); double putGlyphArray (bool xonly, std::vector &dx, std::vector &dy, std::vector &glyphs); const Font* defineFont (uint32_t fontnum, const std::string &name, uint32_t cs, double ds, double ss); void setFont (int num, SetFontMode mode); const DVIState& dviState() const {return _dviState;} double dvi2bp () const {return _dvi2bp;} bool inPage () const {return _inPage;} // VFAction methods void defineVFFont (uint32_t fontnum, const std::string &path, const std::string &name, uint32_t checksum, double dsize, double ssize) override; void defineVFChar (uint32_t c, std::vector &&dvi) override; // The following template methods provide higher-level access to the DVI commands. // In contrast to their cmdXXX pendants, they don't require any handling of the input stream. // All command arguments are delivered as function parameters. These methods are called after // the DVI registers have been updated, i.e. currState() represents the state after executing // the command. If the previous register state is required, prevState() can be used. virtual void dviPre (uint8_t id, uint32_t numer, uint32_t denom, uint32_t mag, const std::string &comment) {} virtual void dviPost (uint16_t stdepth, uint16_t pages, uint32_t pw, uint32_t ph, uint32_t mag, uint32_t num, uint32_t den, uint32_t lbopofs) {} virtual void dviPostPost (uint8_t id, uint32_t postOffset) {} virtual void dviBop (const std::vector &c, int32_t prevBopOffset) {} virtual void dviEop () {} virtual void dviSetChar0 (uint32_t c, const Font *font) {} virtual void dviSetChar (uint32_t c, const Font *font) {} virtual void dviPutChar (uint32_t c, const Font *font) {} virtual void dviSetRule (double h, double w) {} virtual void dviPutRule (double h, double w) {} virtual void dviNop () {} virtual void dviPush () {} virtual void dviPop () {} virtual void dviRight (double dx) {} virtual void dviDown (double dy) {} virtual void dviX0 () {} virtual void dviY0 () {} virtual void dviW0 () {} virtual void dviZ0 () {} virtual void dviX (double x) {} virtual void dviY (double y) {} virtual void dviW (double w) {} virtual void dviZ (double z) {} virtual void dviFontDef (uint32_t fontnum, uint32_t checksum, const Font *font) {} virtual void dviFontNum (uint32_t fontnum, SetFontMode mode, const Font *font) {} virtual void dviDir (WritingMode dir) {} virtual void dviXXX (const std::string &str) {} virtual void dviXPic (uint8_t box, const std::vector &matrix, int16_t page, const std::string &path) {} virtual void dviXFontDef (uint32_t fontnum, const NativeFont *font) {} virtual void dviXGlyphArray (std::vector &dx, std::vector &dy, std::vector &glyphs, const Font &font) {} virtual void dviXGlyphString (std::vector &dx, std::vector &glyphs, const Font &font) {} virtual void dviXTextAndGlyphs (std::vector &dx, std::vector &dy, std::vector &chars, std::vector &glyphs, const Font &font) {} private: // The following low-level methods evaluate the DVI commands read from // the input stream and call the corresponding dviXXX methods. void cmdSetChar0 (int c) override; void cmdSetChar (int len) override; void cmdPutChar (int len) override; void cmdSetRule (int len) override; void cmdPutRule (int len) override; void cmdNop (int len) override; void cmdBop (int len) override; void cmdEop (int len) override; void cmdPush (int len) override; void cmdPop (int len) override; void cmdDir (int len) override; void cmdRight (int len) override; void cmdDown (int len) override; void cmdX0 (int len) override; void cmdY0 (int len) override; void cmdW0 (int len) override; void cmdZ0 (int len) override; void cmdX (int len) override; void cmdY (int len) override; void cmdW (int len) override; void cmdZ (int len) override; void cmdFontDef (int len) override; void cmdFontNum0 (int n) override; void cmdFontNum (int len) override; void cmdXXX (int len) override; void cmdPre (int len) override; void cmdPost (int len) override; void cmdPostPost (int len) override; void cmdXPic (int len) override; void cmdXFontDef (int len) override; void cmdXGlyphArray (int len) override; void cmdXGlyphString (int len) override; void cmdXTextAndGlyphs (int len) override; private: bool _inPage; ///< true if stream pointer is between bop and eop unsigned _currPageNum; ///< current page number (1 is first page) int _currFontNum; ///< current font number double _dvi2bp; ///< factor to convert dvi units to PS points uint32_t _mag; ///< magnification factor * 1000 bool _inPostamble; ///< true if stream pointer is inside the postamble DVIState _dviState; ///< current state of the DVI registers std::stack _stateStack; std::vector _bopOffsets; }; #endif dvisvgm-2.8.1/src/Calculator.hpp0000664000175000017500000000440013510660062013512 00000000000000/************************************************************************* ** Calculator.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CALCULATOR_HPP #define CALCULATOR_HPP #include #include #include #include "MessageException.hpp" struct CalculatorException : public MessageException { explicit CalculatorException (const std::string &msg) : MessageException(msg) {} }; class Calculator { public: Calculator () : _numValue(0) {} double eval (std::istream &is); double eval (const std::string &expr); void setVariable (const std::string &name, double value) {_variables[name] = value;} double getVariable (const std::string &name) const; protected: double expr (std::istream &is, bool skip); double term (std::istream &is, bool skip); double prim (std::istream &is, bool skip); char lex (std::istream &is); char lookAhead (std::istream &is); private: std::map _variables; double _numValue; std::string _strValue; }; #endif dvisvgm-2.8.1/src/InputReader.cpp0000664000175000017500000003001313510660062013635 00000000000000/************************************************************************* ** InputReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "InputReader.hpp" using namespace std; void StringMatcher::setPattern (const string &pattern) { _pattern = pattern; _charsRead = 0; _borders.resize(pattern.length()+1); // preprocessing to set up the border indexes _borders[0] = -1; int i=0, j=-1; const int len = static_cast(pattern.length()); while (i < len) { while (j >= 0 && _pattern[i] != _pattern[j]) j = _borders[j]; _borders[++i] = ++j; } } /** Reads characters from an input stream until the pattern string or EOF is reached. * The matching string is read too if found. An empty pattern matches any character, i.e. * reading stops after the first character. * @return true if the pattern was found */ bool StringMatcher::match (InputReader &ir) { int c; int i=0; const int len = static_cast(_pattern.length()); _charsRead = 0; while ((c = ir.get()) >= 0) { _charsRead++; while (i >= 0 && c != _pattern[i]) i = _borders[i]; if (++i == len) return true; } return false; } /** Reads characters from an input stream until the pattern string or EOF is reached * and returns them as a string. The matching string is also appended to the returned string. */ string StringMatcher::read (InputReader &ir) { string ret; int c; int i=0; const int len = static_cast(_pattern.length()); while ((c = ir.get()) >= 0) { ret += char(c); while (i >= 0 && c != _pattern[i]) i = _borders[i]; if (++i == len) break; } _charsRead = ret.length(); return ret; } /////////////////////////////////////////////////////////////////////////// /** Skips n characters. */ void InputReader::skip (size_t n) { while (n-- > 0) get(); } /** Moves the buffer pointer to the next non-space character. A following call * of get() returns this character. */ void InputReader::skipSpace () { while (isspace(peek())) get(); } /** Tries to find a given string and skips all characters preceding that string. If * the string can't be found, all characters until EOF are skipped. * @param[in] str string to look for (must not be longer than the maximal buffer size) * @return true if str was found */ bool InputReader::skipUntil (const char *str) { StringMatcher matcher(str); return matcher.match(*this); } /** Tries to find a given string and returns all characters including that string. If * the string can't be found, all characters until EOF are read. * @param[in] str string to look for (must not be longer than the maximal buffer size) * @return the read characters */ string InputReader::readUntil (const char *str) { StringMatcher matcher(str); return matcher.read(*this); } /** Looks for the first occurrence of a given character. * @param[in] c character to lookup * @return position of character relative to current location, -1 if character was not found */ int InputReader::find (char c) const { int pos = 0; int cc; while ((cc = peek(pos)) >= 0 && cc != c) pos++; return cc < 0 ? -1 : pos; } /** Checks if the next characters to be read match a given string. * @param[in] s string to be matched * @param[in] consume if true, the characters of the matched string are skipped * @return true if s matches */ bool InputReader::check (const char *s, bool consume) { size_t count = 0; for (const char *p=s; *p; p++) { if (peek(count++) != *p) return false; } if (consume) skip(count); return true; } /** Reads an integer from the buffer. All characters that are part of * the read integer constant are skipped. If this function returns false, * the buffer pointer points to the same position as before the function call. * @param[out] val contains the read integer value on success * @param[in] accept_sign if false, only positive integers (without sign) are accepted * @return true if integer could be read */ bool InputReader::parseInt (int &val, bool accept_sign) { val = 0; int fac=1; int sign; // explicitly given sign if (accept_sign && ((sign = peek()) == '+' || sign == '-')) { if (isdigit(peek(1))) { get(); // skip sign if (sign == '-') fac = -1; } else return false; } else if (!isdigit(peek())) return false; while (isdigit(peek())) val = val*10 + (get()-'0'); val *= fac; return true; } bool InputReader::parseUInt (unsigned &val) { val = 0; if (!isdigit(peek())) return false; while (isdigit(peek())) val = val*10 + (get()-'0'); return true; } bool InputReader::parseUInt (int base, unsigned &val) { if (base < 2 || base > 32) return false; const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; const char maxdigit = digits[base-1]; int c; if (!isalnum(c = tolower(peek())) || c > maxdigit) return false; val = 0; while (isalnum(c = tolower(peek())) && c <= maxdigit) { get(); unsigned digit = c - (c <= '9' ? '0' : 'a'-10); val = val*base + digit; } return true; } /** Reads a double from the buffer. All characters that are part of * the read double constant are skipped. If this function returns false, * the buffer pointer points to the same position as before the function call. * @param[out] val contains the read double value on success * @return number details: 0=no number, 'i'=integer, 'f'=floating point number */ char InputReader::parseDouble (double &val) { int fac=1; int int_part=0; bool is_float = false; skipSpace(); int sign = peek(); if (parseInt(int_part)) { // match [+-]?[0-9]+\.? if (peek() == '.') { get(); is_float = true; } if (int_part < 0 || sign == '-') { fac = -1; int_part = -int_part; } } else { // match [+-]?\. if ((sign = peek()) == '+' || sign == '-') { // match [+-]?\.[0-9] if (peek(1) != '.' || !isdigit(peek(2))) return 0; if (sign == '-') fac = -1; skip(2); // skip sign and dot } else if (peek() == '.' && isdigit(peek(1))) get(); else return 0; is_float = true; } // parse fractional part double frac_part=0.0; for (double u=10; isdigit(peek()); u*=10) frac_part += (get()-'0')/u; val = (int_part + frac_part) * fac; // parse exponent int c; if (tolower(peek()) == 'e' && (isdigit(c=peek(1)) || ((c == '+' || c == '-') && isdigit(peek(2))))) { get(); // skip 'e' int exp; parseInt(exp); val *= pow(10.0, exp); is_float = true; } return is_float ? 'f' : 'i'; } /** Reads an integer value from the buffer. If no valid integer constant * could be found at the current position 0 is returned. */ int InputReader::getInt () { skipSpace(); int val; return parseInt(val) ? val : 0; } /** Reads an double value from the buffer. If no valid double constant * could be found at the current position 0 is returned. */ double InputReader::getDouble () { skipSpace(); double val; return parseDouble(val) ? val : 0.0; } /** Reads a string that consists of alphabetic letters only. Reading stops as * soon as a non-alphabetic character is found or EOF is reached. */ string InputReader::getWord () { string ret; skipSpace(); while (isalpha(peek())) ret += char(get()); return ret; } /** Reads a single punctuation character. * @return the read character or 0 if there's no punctuation character at the current position */ char InputReader::getPunct () { skipSpace(); if (ispunct(peek())) return char(get()); return 0; } /** Reads a string optionally enclosed by a given quotation character. * Before reading the string, all leading whitespace is skipped. Then, the function checks * for one of the the given quotation characters. If it is found, all characters until the * second appearance of the same quotation char are appended to the result. Otherwise, an * empty string is returned. If the quotation character is 0, the behavior of this function * is identical to a call of getString(). * @param[in] quotechars recognized quotation characters bounding the string to be read * @return the string read */ string InputReader::getQuotedString (const char *quotechars) { if (!quotechars) return getString(); string ret; skipSpace(); if (const char *quotechar = strchr(quotechars, peek())) { get(); while (!eof() && peek() != *quotechar) ret += char(get()); get(); } return ret; } /** Reads a string delimited by whitespace and/or invisible characters. * Before reading the string, all leading whitespace is skipped. Then, the function adds * all printable characters to the result until a whitespace, an unprintable character, or * EOF is found. * @return the string read */ string InputReader::getString () { string ret; skipSpace(); while (!eof() && !isspace(peek()) && isprint(peek())) ret += char(get()); return ret; } /** Reads a given number of characters and returns the resulting string. * @param n number of character to read * @return the string read */ string InputReader::getString (size_t n) { string ret; while (n-- > 0) ret += char(get()); return ret; } /** Reads a string delimited by EOF or a single character from a given set of characters. * @param[in] delim characters delimiting the string * @return the read string */ string InputReader::getString (const char *delim) { if (!delim || !delim[0]) return getString(); string ret; skipSpace(); while (!eof() && peek() > 0 && !strchr(delim, peek())) ret += char(get()); return ret; } string InputReader::getLine () { string ret; skipSpace(); while (!eof() && peek() > 0 && peek() != '\n') ret += char(get()); // trim trailing whitespace ret.erase(std::find_if(ret.rbegin(), ret.rend(), not1(ptr_fun(isspace))).base(), ret.end()); return ret; } /** Parses a sequence of key-value pairs of the form KEY=VALUE or KEY="VALUE". * If parameter 'requireValues' is false, attributes may also consist of a key only. * @param[out] attr the scanned atributes * @param[in] requireValues true if all attributes require a value * @param[in] quotechars recognized quote characters used to enclose the attribute values * @return number of attributes scanned */ int InputReader::parseAttributes (map &attr, bool requireValues, const char *quotechars) { while (!eof()) { string key; skipSpace(); if (!isalpha(peek())) // first character of attribute name must be a letter break; key += char(get()); while (isalnum(peek()) || strchr("-:._", peek())) key += char(get()); skipSpace(); if (peek() == '=') { get(); skipSpace(); string val = getQuotedString(quotechars); attr.emplace(std::move(key), std::move(val)); } else if (!requireValues) attr.emplace(std::move(key), ""); } return attr.size(); } ////////////////////////////////////////// int StreamInputReader::peek (size_t n) const { if (n == 0) return peek(); vector chars(n); _is.read(&chars[0], n); int ret = peek(); for (int i=n-1; i >= 0; i--) _is.putback(chars[i]); return ret; } dvisvgm-2.8.1/src/options.dtd0000664000175000017500000000402313510660062013101 00000000000000 dvisvgm-2.8.1/src/DLLoader.hpp0000664000175000017500000000475313510660062013062 00000000000000/************************************************************************* ** DLLoader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DLLOADER_HPP #define DLLOADER_HPP #include #ifdef _WIN32 #include "windows.hpp" #else #include #endif class DLLoader { public: DLLoader () =delete; explicit DLLoader (const std::string &dlname); DLLoader (DLLoader &&loader) =default; virtual ~DLLoader () {closeLibrary();} bool loaded () const {return _handle != nullptr;} bool loadLibrary (const std::string &dlname); protected: template T loadSymbol (const char *name) const; void closeLibrary (); private: #ifdef _WIN32 HINSTANCE _handle; #else void *_handle; #endif }; /** Loads a function or variable from the dynamic/shared library. * @param[in] name name of function/variable to load * @return pointer to loaded symbol, or 0 if the symbol could not be loaded */ template T DLLoader::loadSymbol (const char *name) const { if (_handle) { #ifdef _WIN32 return reinterpret_cast(GetProcAddress(_handle, name)); #else return reinterpret_cast(dlsym(_handle, name)); #endif } return nullptr; } #define LOAD_SYMBOL(sym) loadSymbol(#sym) #endif dvisvgm-2.8.1/src/PSPattern.hpp0000664000175000017500000000753013510660062013310 00000000000000/************************************************************************* ** PSPattern.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PSPATTERN_HPP #define PSPATTERN_HPP #include #include #include #include "BoundingBox.hpp" #include "Color.hpp" #include "Matrix.hpp" #include "XMLNode.hpp" class SpecialActions; class SVGTree; class XMLElement; class PSPattern { public: virtual ~PSPattern () =default; virtual int psID () const {return _id;} virtual std::string svgID () const; virtual void apply (SpecialActions &actions); protected: explicit PSPattern (int id) : _id(id) {} virtual std::unique_ptr createPatternNode () const =0; private: int _id; ///< PostSCript ID of this pattern }; class PSTilingPattern : public PSPattern { public: virtual XMLElement* getContainerNode () {return _groupNode.get();} void apply (SpecialActions &actions) override; protected: PSTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep); std::unique_ptr createPatternNode () const override; virtual std::unique_ptr createClipNode () const; virtual std::unique_ptr createGroupNode () const; virtual XMLElement* getGroupNode () const {return _groupNodePtr;} virtual void setGroupNode (std::unique_ptr node); private: BoundingBox _bbox; ///< bounding box of the tile graphics Matrix _matrix; ///< tile transformation double _xstep, _ystep; ///< horizontal and vertical distance between neighboured tiles mutable std::unique_ptr _groupNode; ///< group containing the drawing elements XMLElement *_groupNodePtr; ///< keeps a pointer to the group node even after moving _groupNode to the SVGTree }; class PSColoredTilingPattern final : public PSTilingPattern { public: PSColoredTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep); }; class PSUncoloredTilingPattern final : public PSTilingPattern { public: PSUncoloredTilingPattern (int id, BoundingBox &bbox, Matrix &matrix, double xstep, double ystep); std::string svgID () const override; void setColor (Color color) {_currentColor = color;} void apply (SpecialActions &actions) override; protected: std::unique_ptr createClipNode () const override; private: std::set _colors; ///< colors this pattern has already been drawn with Color _currentColor; ///< current color to be applied bool _applied; ///< has pattern with current group node already been applied to the SVG tree? }; #endif dvisvgm-2.8.1/src/Glyph.hpp0000664000175000017500000000300113510660062012500 00000000000000/************************************************************************* ** Glyph.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef GLYPH_HPP #define GLYPH_HPP #include "GraphicsPath.hpp" using Glyph = GraphicsPath; #endif dvisvgm-2.8.1/src/SVGCharHandler.hpp0000664000175000017500000000777513510660062014176 00000000000000/************************************************************************* ** SVGCharHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SVGCHARHANDLER_HPP #define SVGCHARHANDLER_HPP #include #include #include "Color.hpp" #include "Font.hpp" #include "Matrix.hpp" template class CharProperty { public: CharProperty (const T &v) : _value(v) {} void set (const T &v) { if (v != _value) { _value = v; _changed = true; } } const T& get () const {return _value;} operator const T& () const {return _value;} bool changed () const {return _changed;} void changed (bool c) {_changed = c;} private: T _value; bool _changed=false; }; class XMLElement; /** Base class for all character handlers. These handlers create SVG representations * for the added characters and append them to the SVG tree. */ class SVGCharHandler { public: SVGCharHandler () : _matrix(1) {} virtual ~SVGCharHandler() =default; virtual void setInitialContextNode (XMLElement *node); virtual void appendChar (uint32_t c, double x, double y) =0; virtual void notifyXAdjusted () {} virtual void notifyYAdjusted () {} void setColor (const Color &color) {_color.set(color);} void setFont (const Font &font, int id) {_font.set(&font); _fontnum = id;} void setMatrix (const Matrix &matrix) {_matrix.set(matrix);} void setVertical (bool vertical) {_vertical.set(vertical);} Color getColor () const {return _color.get();} const Font* getFont () const {return _font.get();} const Matrix& getMatrix () const {return _matrix.get();} protected: virtual void resetContextNode (); XMLElement* pushContextNode (std::unique_ptr node); void popContextNode (); XMLElement* contextNode () const { return _contextNodeStack.empty() ? _initialContextNode : _contextNodeStack.top(); } CharProperty _color=Color::BLACK; ///< current color CharProperty _font=0; ///< current font int _fontnum=0; ///< current font ID CharProperty _matrix; ///< current transformation CharProperty _vertical=false; ///< current writing mode private: XMLElement *_initialContextNode= nullptr; ///< SVG element the generated character nodes are attached to std::stack _contextNodeStack; }; /** Base class for all character handlers that create SVG elements. */ class SVGCharTextHandler : public SVGCharHandler { public: explicit SVGCharTextHandler (bool selectFontByClass) : _selectFontByClass(selectFontByClass) {} protected: std::unique_ptr createTextNode (double x, double y) const; private: bool _selectFontByClass; }; #endif dvisvgm-2.8.1/src/SignalHandler.hpp0000664000175000017500000000417313510660062014143 00000000000000/************************************************************************* ** SignalHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SIGNALHANDLER_HPP #define SIGNALHANDLER_HPP #include #include struct SignalException : public std::exception { }; class SignalHandler { public: SignalHandler (const SignalHandler&) =delete; SignalHandler (SignalHandler&&) =delete; ~SignalHandler (); static SignalHandler& instance (); bool start (); void stop (); void check (); void trigger (bool notify); bool active () const {return _active;} protected: SignalHandler (); static void callback (int signal); private: bool _active; ///< true if listening for signals static volatile bool _break; ///< true if signal has been caught class Impl; std::unique_ptr _impl; ///< system-specific data/functions }; #endif dvisvgm-2.8.1/src/XMLString.hpp0000664000175000017500000000353713510660062013262 00000000000000/************************************************************************* ** XMLString.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef XMLSTRING_HPP #define XMLSTRING_HPP #include class XMLString : public std::string { public: XMLString () : std::string() {} explicit XMLString (const char *str, bool plain=false); explicit XMLString (const std::string &str, bool plain=false); explicit XMLString (int n, bool cast=true); explicit XMLString (double x); static int DECIMAL_PLACES; ///< number of decimal places applied to floating point values (0-6) }; #endif dvisvgm-2.8.1/src/MiKTeXCom.cpp0000664000175000017500000000731413510660062013163 00000000000000/************************************************************************* ** MiKTeXCom.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "MessageException.hpp" #include "MiKTeXCom.hpp" using namespace std; /** Constructs a COM object representing a MiKTeX session. */ MiKTeXCom::MiKTeXCom () : _session() { if (FAILED(CoInitialize(nullptr))) throw MessageException("COM library could not be initialized\n"); // try to initialize the MiKTeX session object #ifdef _MSC_VER HRESULT hres = _session.CreateInstance(L"MiKTeX.Session"); #elif defined(_WIN64) HRESULT hres = CoCreateInstance(CLSID_MiKTeXSession2_9, 0, CLSCTX_LOCAL_SERVER, IID_ISession2, (void**)&_session); #else HRESULT hres = CoCreateInstance(CLSID_MiKTeXSession2_9, 0, CLSCTX_INPROC_SERVER, IID_ISession2, (void**)&_session); #endif if (FAILED(hres)) { CoUninitialize(); throw MessageException("MiKTeX session could not be initialized"); } } MiKTeXCom::~MiKTeXCom () { if (_session) { #ifdef _MSC_VER _session.Release(); #else _session->Release(); #endif _session = nullptr; // prevent automatic call of Release() after CoUninitialize() } CoUninitialize(); } /** Returns the MiKTeX version number. */ string MiKTeXCom::getVersion () { #ifdef _MSC_VER MiKTeXSetupInfo info = _session->GetMiKTeXSetupInfo(); #else MiKTeXSetupInfo info; _session->GetMiKTeXSetupInfo(&info); #endif _bstr_t version = info.version; return string(version); } /** Returns the path of the directory where the MiKTeX binaries are located. */ string MiKTeXCom::getBinDir () { #ifdef _MSC_VER MiKTeXSetupInfo info = _session->GetMiKTeXSetupInfo(); #else MiKTeXSetupInfo info; _session->GetMiKTeXSetupInfo(&info); #endif _bstr_t bindir = info.binDirectory; return string(bindir); } /** Try to lookup a given file in the MiKTeX directory tree. * @param[in] fname name of file to lookup * @return path of the file or 0 if it can't be found */ const char* MiKTeXCom::findFile (const char *fname) { try { _bstr_t path; static string ret; #ifdef _MSC_VER HRESULT hres = _session->FindFile(fname, path.GetAddress()); bool found = (hres != 0); #else VARIANT_BOOL found_var; _session->FindFile(_bstr_t(fname), path.GetAddress(), &found_var); bool found = (found_var == VARIANT_TRUE); #endif if (found) { ret = _bstr_t(path); return ret.c_str(); } return nullptr; } catch (_com_error &e) { throw MessageException((const char*)e.Description()); } } dvisvgm-2.8.1/src/JFM.cpp0000664000175000017500000001061313511327144012035 00000000000000/************************************************************************* ** JFM.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "JFM.hpp" #include "StreamReader.hpp" using namespace std; JFM::JFM (istream &is) { is.seekg(0); StreamReader reader(is); uint16_t id = uint16_t(reader.readUnsigned(2)); // JFM ID (9 or 11) if (id != 9 && id != 11) throw FontMetricException("invalid JFM identifier " + std::to_string(id) + " (9 or 11 expected)"); _vertical = (id == 9); uint16_t nt = uint16_t(reader.readUnsigned(2)); // length of character type table uint16_t lf = uint16_t(reader.readUnsigned(2)); // length of entire file in 4 byte words uint16_t lh = uint16_t(reader.readUnsigned(2)); // length of header in 4 byte words uint16_t bc = uint16_t(reader.readUnsigned(2)); // smallest character code in font uint16_t ec = uint16_t(reader.readUnsigned(2)); // largest character code in font uint16_t nw = uint16_t(reader.readUnsigned(2)); // number of words in width table uint16_t nh = uint16_t(reader.readUnsigned(2)); // number of words in height table uint16_t nd = uint16_t(reader.readUnsigned(2)); // number of words in depth table uint16_t ni = uint16_t(reader.readUnsigned(2)); // number of words in italic corr. table uint16_t nl = uint16_t(reader.readUnsigned(2)); // number of words in glue/kern table uint16_t nk = uint16_t(reader.readUnsigned(2)); // number of words in kern table uint16_t ng = uint16_t(reader.readUnsigned(2)); // number of words in glue table uint16_t np = uint16_t(reader.readUnsigned(2)); // number of font parameter words if (7+nt+lh+(ec-bc+1)+nw+nh+nd+ni+nl+nk+ng+np != lf) throw FontMetricException("inconsistent length values"); setCharRange(bc, ec); readHeader(reader); is.seekg(28+lh*4); readTables(reader, nt, nw, nh, nd, ni); is.seekg(4*(lf-np), ios::beg); readParameters(reader, np); // JFM files provide 9 parameters but we don't need all of them } void JFM::readTables (StreamReader &reader, int nt, int nw, int nh, int nd, int ni) { // determine smallest charcode with chartype > 0 uint32_t minchar=0xFFFFFFFF, maxchar=0; for (int i=0; i < nt; i++) { // support new JFM spec by texjporg uint32_t c = reader.readUnsigned(2); c += 0x10000 * reader.readUnsigned(1); uint8_t t = uint8_t(reader.readUnsigned(1)); if (t > 0) { minchar = min(minchar, c); maxchar = max(maxchar, c); } } // build charcode to chartype map if (minchar <= maxchar) { _minchar = minchar; _charTypeTable.resize(maxchar-minchar+1, 0); reader.seek(-nt*4, ios::cur); for (int i=0; i < nt; i++) { // support new JFM spec by texjporg uint32_t c = reader.readUnsigned(2); c += 0x10000 * reader.readUnsigned(1); uint8_t t = uint8_t(reader.readUnsigned(1)); if (c >= minchar) _charTypeTable[c-minchar] = t; } } TFM::readTables(reader, nw, nh, nd, ni); } int JFM::charIndex (int c) const { uint8_t chartype = 0; if (!_charTypeTable.empty() && uint32_t(c) >= _minchar && uint32_t(c) < _minchar+_charTypeTable.size()) chartype = _charTypeTable[c-_minchar]; return TFM::charIndex(chartype); } dvisvgm-2.8.1/src/DVIToSVGActions.hpp0000664000175000017500000001146313561274402014263 00000000000000/************************************************************************* ** DVIToSVGActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DVITOSVGACTIONS_HPP #define DVITOSVGACTIONS_HPP #include #include #include "BoundingBox.hpp" #include "DVIActions.hpp" #include "Matrix.hpp" #include "SpecialActions.hpp" #include "SpecialManager.hpp" #include "SVGTree.hpp" class DVIToSVG; class FileFinder; class Font; class XMLNode; class DVIToSVGActions : public DVIActions, public SpecialActions { using CharMap = std::unordered_map>; using FontSet = std::unordered_set; using BoxMap = std::unordered_map; public: DVIToSVGActions (DVIToSVG &dvisvg, SVGTree &svg) : _svg(svg), _dvireader(&dvisvg) {} void reset () override; void setChar (double x, double y, unsigned c, bool vertical, const Font &f) override; void setRule (double x, double y, double height, double width) override; void setBgColor (const Color &color) override; void setColor (const Color &color) override {_svg.setColor(color);} void setMatrix (const Matrix &m) override {_svg.setMatrix(m);} const Matrix& getMatrix () const override {return _svg.getMatrix();} Matrix getPageTransformation () const override {return _dvireader->getPageTransformation();} Color getColor () const override {return _svg.getColor();} int getDVIStackDepth () const override {return _dvireader->stackDepth();} unsigned getCurrentPageNumber () const override {return _dvireader->currentPageNumber();} void setTextOrientation (bool vertical) override {_svg.setVertical(vertical);} void moveToX (double x, bool forceSVGMove) override; void moveToY (double y, bool forceSVGMove) override; void setFont (int num, const Font &font) override; void special (const std::string &spc, double dvi2bp, bool preprocessing=false) override; void beginPage (unsigned pageno, const std::vector &c) override; void endPage (unsigned pageno) override; void progress (size_t current, size_t total, const char *id=nullptr) override; void progress (const char *id) override; double getX() const override {return _dvireader->getXPos();} double getY() const override {return _dvireader->getYPos();} void setX (double x) override {_dvireader->translateToX(x); _svg.setX(x);} void setY (double y) override {_dvireader->translateToY(y); _svg.setY(y);} void finishLine () override {_dvireader->finishLine();} void lockOutput () override {_outputLocked = true;} void unlockOutput () override {_outputLocked = false;} bool outputLocked () const override {return _outputLocked;} const SVGTree& svgTree () const override {return _svg;} BoundingBox& bbox () override {return _bbox;} BoundingBox& bbox (const std::string &name, bool reset=false) override; void embed (const BoundingBox &bbox) override; void embed (const DPair &p, double r=0) override; FilePath getSVGFilePath (unsigned pageno) const override; std::string getBBoxFormatString () const override; CharMap& getUsedChars () const {return _usedChars;} const FontSet& getUsedFonts () const {return _usedFonts;} void setDVIReader (BasicDVIReader &r) {_dvireader = &r;} private: SVGTree &_svg; BasicDVIReader *_dvireader; BoundingBox _bbox; int _pageCount=0; int _currentFontNum=-1; mutable CharMap _usedChars; FontSet _usedFonts; Color _bgcolor=Color::TRANSPARENT; BoxMap _boxes; bool _outputLocked=false; }; #endif dvisvgm-2.8.1/src/PsSpecialHandler.hpp0000664000175000017500000002242213561274402014613 00000000000000/************************************************************************* ** PsSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PSSPECIALHANDLER_HPP #define PSSPECIALHANDLER_HPP #include #include #include #include #include #include "GraphicsPath.hpp" #include "PSInterpreter.hpp" #include "SpecialHandler.hpp" #include "PSPattern.hpp" #include "PSPreviewFilter.hpp" class PSPattern; class XMLElement; class PsSpecialHandler : public SpecialHandler, protected PSActions { using Path = GraphicsPath; using ColorSpace = Color::ColorSpace; /** Helper class storing the clipping paths currently present on the graphics context stack. * Since PS operator 'clippath' only delivers a linearly approximated version of the paths * that are sometimes too imprecise for direct usage in SVG, we keep the possibly curved * clipping paths and compute their intersections locally if necessary. */ class ClippingStack { public: ClippingStack () : _maxID(0) {} void pushEmptyPath (); void push (const Path &path, int saveID=-1); bool replace (const Path &path); void dup (int saveID=-1); void pop (int saveID=-1, bool grestore=false); void clear (); bool empty () const {return _stack.empty();} void setPrependedPath (); const Path* path () const; const Path* prependedPath () const; void removePrependedPath (); int topID () const {return _stack.empty() ? 0 : _stack.top().pathID;} private: struct Entry { std::shared_ptr path; ///< pointer to current clipping path std::shared_ptr prependedPath=nullptr; int pathID; ///< ID of current clipping path int saveID; ///< if >=0, path was pushed by 'save', and saveID holds the ID of the PS memory object Entry () : Entry(-1) {} Entry (const Path &p, int pid, int sid) : path(std::make_shared(p)), pathID(pid), saveID(sid) {} explicit Entry (int sid) : path(nullptr), pathID(0), saveID(sid) {} Entry (const Entry &entry) =default; Entry (Entry &&entry) =default; }; size_t _maxID; std::stack _stack; ///< stack holding the clipping information of the current graphics context }; enum PsSection {PS_NONE, PS_HEADERS, PS_BODY}; enum class FileType {EPS, PDF, SVG, BITMAP}; public: PsSpecialHandler (); ~PsSpecialHandler () override; const char* name () const override {return "ps";} const char* info () const override {return "dvips PostScript specials";} std::vector prefixes() const override; void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; void setDviScaleFactor (double dvi2bp) override {_previewFilter.setDviScaleFactor(dvi2bp);} void enterBodySection (); PSInterpreter& psInterpreter () {return _psi;} public: static bool COMPUTE_CLIPPATHS_INTERSECTIONS; static bool SHADING_SEGMENT_OVERLAP; static int SHADING_SEGMENT_SIZE; static double SHADING_SIMPLIFY_DELTA; protected: void initialize (); void initgraphics (); void moveToDVIPos (); void executeAndSync (std::istream &is, bool updatePos); void processHeaderFile (const char *fname); void imgfile (FileType type, const std::string &fname, const std::map &attr); std::unique_ptr createImageNode (FileType type, const std::string &fname, int pageno, BoundingBox bbox, bool clip); void dviEndPage (unsigned pageno, SpecialActions &actions) override; void clip (Path path, bool evenodd); void processSequentialPatchMesh (int shadingTypeID, ColorSpace cspace, VectorIterator &it); void processLatticeTriangularPatchMesh (ColorSpace colorSpace, VectorIterator &it); /// scale given value by current PS scale factors double scale (double v) const {return v*(_sx*(1-_cos*_cos) + _sy*_cos*_cos);} void applyscalevals (std::vector &p) override {_sx = p[0]; _sy = p[1]; _cos = p[2];} void clip (std::vector &p) override {clip(p, false);} void clip (std::vector &p, bool evenodd); void clippath (std::vector &p) override; void closepath (std::vector &p) override; void curveto (std::vector &p) override; void eoclip (std::vector &p) override {clip(p, true);} void eofill (std::vector &p) override {fill(p, true);} void fill (std::vector &p, bool evenodd); void fill (std::vector &p) override {fill(p, false);} void grestore (std::vector &p) override; void grestoreall (std::vector &p) override; void gsave (std::vector &p) override; void initclip (std::vector &p) override; void lineto (std::vector &p) override; void makepattern (std::vector &p) override; void moveto (std::vector &p) override; void newpath (std::vector &p) override; void querypos (std::vector &p) override {_currentpoint = DPair(p[0], p[1]);} void restore (std::vector &p) override; void rotate (std::vector &p) override; void save (std::vector &p) override; void scale (std::vector &p) override; void setblendmode (std::vector &p) override {_blendmode = int(p[0]);} void setcmykcolor (std::vector &cmyk) override; void setdash (std::vector &p) override; void setgray (std::vector &p) override; void sethsbcolor (std::vector &hsb) override; void setlinecap (std::vector &p) override {_linecap = uint8_t(p[0]);} void setlinejoin (std::vector &p) override {_linejoin = uint8_t(p[0]);} void setlinewidth (std::vector &p) override {_linewidth = scale(p[0] ? p[0] : 0.5);} void setmatrix (std::vector &p) override; void setmiterlimit (std::vector &p) override {_miterlimit = p[0];} void setnulldevice (std::vector &p) override; void setopacityalpha (std::vector &p) override {_opacityalpha = p[0];} void setshapealpha (std::vector &p) override {_shapealpha = p[0];} void setpagedevice (std::vector &p) override; void setpattern (std::vector &p) override; void setrgbcolor (std::vector &rgb) override; void shfill (std::vector &p) override; void stroke (std::vector &p) override; void translate (std::vector &p) override; void executed () override; private: PSInterpreter _psi; SpecialActions *_actions; PSPreviewFilter _previewFilter; ///< filter to extract information generated by the preview package PsSection _psSection=PS_NONE; ///< current section processed (nothing yet, headers, or body specials) XMLElement *_xmlnode; ///< if != 0, created SVG elements are appended to this node XMLElement *_savenode; ///< pointer to temporaryly store _xmlnode std::string _headerCode; ///< collected literal PS header code Path _path; DPair _currentpoint; ///< current PS position in bp units Color _currentcolor; ///< current stroke/fill color double _sx, _sy; ///< horizontal and vertical scale factors retrieved by operator "applyscalevals" double _cos; ///< cosine of angle between (1,0) and transform(1,0) double _linewidth; ///< current line width in bp units double _miterlimit; ///< current miter limit in bp units double _opacityalpha; ///< opacity level (0=fully transparent, ..., 1=opaque) double _shapealpha; ///< shape opacity level (0=fully transparent, ..., 1=opaque) int _blendmode; ///< blend mode used when overlaying colored areas uint8_t _linecap : 2; ///< current line cap (0=butt, 1=round, 2=projecting square) uint8_t _linejoin : 2; ///< current line join (0=miter, 1=round, 2=bevel) double _dashoffset; ///< current dash offset std::vector _dashpattern; ClippingStack _clipStack; std::map> _patterns; PSTilingPattern *_pattern; ///< current pattern }; #endif dvisvgm-2.8.1/src/EmSpecialHandler.cpp0000664000175000017500000002336313561274402014572 00000000000000/************************************************************************* ** EmSpecialHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "EmSpecialHandler.hpp" #include "InputBuffer.hpp" #include "InputReader.hpp" #include "Length.hpp" #include "SpecialActions.hpp" #include "SVGTree.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; /** Computes the "cut vector" that is used to compute the line shape. * Because each line has a width > 0 the actual shape of the line is a tetragon. * The 4 vertices can be influenced by the cut parameter c that specifies * a horizontal, vertical or orthogonal cut of a line end. Depending on c and the * line's slope a cut vector v can be computed that, relatively to endpoint p, denotes * the 2 vertices of that line end: v1=p+v and v2=p-v. * @param[in] cuttype character identifying the cut direction ('h', 'v' or 'p') * @param[in] linedir direction vector of line to be drawn * @param[in] lw width of line to be drawn * @return the "cut vector" */ static DPair cut_vector (char cuttype, const DPair &linedir, double linewidth) { DPair cut; switch (cuttype) { case 'v': // vertical if (linedir.x() != 0) { double slope = linedir.y()/linedir.x(); double h = sqrt(linewidth*linewidth*(1+slope*slope)); cut.y(h/2); } break; case 'h': // horizontal if (linedir.y() != 0) { double slope = linedir.x()/linedir.y(); double h = sqrt(linewidth*linewidth*(1+slope*slope)); double sgn = slope < 0 ? 1.0 : -1.0; cut.x(h*sgn/2); } break; default: // c == 'p': perpendicular to the line vector if (linedir.x() != 0 && linedir.y() != 0) return linedir.ortho()/linedir.length() * (linewidth/2); } return cut; } /** Creates the SVG element that will a the line. * @param[in] p1 first endpoint in PS point units * @param[in] p2 second endpoint in PS point units * @param[in] c1 cut method of first endpoint ('h', 'v' or 'p') * @param[in] c2 cut method of second endpoint ('h', 'v' or 'p') * @param[in] lw line width in PS point units * @param[in] actions object providing the actions that can be performed by the SpecialHandler */ static void create_line (const DPair &p1, const DPair &p2, char c1, char c2, double lw, SpecialActions &actions) { if (actions.outputLocked()) return; unique_ptr node; DPair dir = p2-p1; if (dir.x() == 0 || dir.y() == 0 || (c1 == 'p' && c2 == 'p')) { // draw regular line node = util::make_unique("line"); node->addAttribute("x1", p1.x()); node->addAttribute("y1", p1.y()); node->addAttribute("x2", p2.x()); node->addAttribute("y2", p2.y()); node->addAttribute("stroke-width", lw); node->addAttribute("stroke", actions.getColor().svgColorString()); // update bounding box DPair cv = cut_vector('p', dir, lw); actions.embed(p1+cv); actions.embed(p1-cv); actions.embed(p2+cv); actions.embed(p2-cv); } else { // draw polygon DPair cv1 = cut_vector(c1, dir, lw); DPair cv2 = cut_vector(c2, dir, lw); DPair q11 = p1+cv1, q12 = p1-cv1; DPair q21 = p2+cv2, q22 = p2-cv2; ostringstream oss; oss << XMLString(q11.x()) << ',' << XMLString(q11.y()) << ' ' << XMLString(q12.x()) << ',' << XMLString(q12.y()) << ' ' << XMLString(q22.x()) << ',' << XMLString(q22.y()) << ' ' << XMLString(q21.x()) << ',' << XMLString(q21.y()); node = util::make_unique("polygon"); node->addAttribute("points", oss.str()); if (actions.getColor() != Color::BLACK) node->addAttribute("fill", actions.getColor().svgColorString()); // update bounding box actions.embed(q11); actions.embed(q12); actions.embed(q21); actions.embed(q22); } actions.svgTree().appendToPage(std::move(node)); } /** Reads a length (value + unit) and returns its value in PS points (bp). * If no unit is specified, TeX points are assumed. */ static double read_length (InputReader &in) { double val = in.getDouble(); string unitstr; if (isalpha(in.peek())) unitstr += char(in.get()); if (isalpha(in.peek())) unitstr += char(in.get()); Length::Unit unit = Length::Unit::PT; try { unit = Length::stringToUnit(unitstr); } catch (UnitException &e) { } return Length(val, unit).bp(); } bool EmSpecialHandler::process (const string &prefix, istream &is, SpecialActions &actions) { // em:moveto => move graphic cursor to dvi position // em:lineto => draw line from graphic cursor to dvi cursor, then move graphic cursor to dvi position // em:linewidth => set line width to // em:point [,[,]] => defines point as (,); if and/or is missing, // the corresponding dvi cursor coordinate is inserted // and are lengths // em:line [h|v|p], [h|v|p] [,] => draws line of width from point # to point # // point number suffixes: // h: cut line horizontally // v: cut line vertically // p: cut line orthogonally to line direction (default) // if is omitted, the global line width is used // // supported length units: pt, pc, in, bp, cm, mm, dd, cc, sp // default line width: 0.4pt struct Command { const char *name; void (EmSpecialHandler::*handler)(InputReader&, SpecialActions&); } commands[] = { {"point", &EmSpecialHandler::point}, {"line", &EmSpecialHandler::line}, {"moveto", &EmSpecialHandler::moveto}, {"lineto", &EmSpecialHandler::lineto}, {"linewidth", &EmSpecialHandler::linewidth}, {nullptr, nullptr} }; StreamInputReader ir(is); const string cmdstr = ir.getWord(); for (Command *cmd=commands; cmd->name; cmd++) { if (cmdstr == cmd->name) { (this->*cmd->handler)(ir, actions); break; } } return true; } /** Handles the "moveto" command that sets the drawing position to the current DVI position. */ void EmSpecialHandler::moveto (InputReader&, SpecialActions &actions) { _pos.x(actions.getX()); _pos.y(actions.getY()); } /** Handles the "lineto" command that sraws a straight line from the current drawing position * to the current DVI position, and sets the drawing position to the DVI position afterwards. */ void EmSpecialHandler::lineto (InputReader&, SpecialActions &actions) { DPair currpos(actions.getX(), actions.getY()); create_line(_pos, currpos, 'p', 'p', _linewidth, actions); _pos = currpos; } /** Handles the "linewidth" command that changes the line width which affects all following * drawing commands. */ void EmSpecialHandler::linewidth (InputReader &ir, SpecialActions&) { _linewidth = read_length(ir); } /** Handles the "point" command that adds a point to the point list. */ void EmSpecialHandler::point (InputReader &ir, SpecialActions &actions) { DPair pos(actions.getX(), actions.getY()); int n = ir.getInt(); if (ir.getPunct() == ',') { pos.x(ir.getDouble()); if (ir.getPunct() == ',') pos.y(ir.getDouble()); } _points[n] = pos; } /** Handles the "line" command that draws a straight line between two points * from the point list. */ void EmSpecialHandler::line (InputReader &ir, SpecialActions& actions) { int pointnum1 = ir.getInt(); int cut1 = 'p'; if (isalpha(ir.peek())) cut1 = ir.get(); ir.getPunct(); int pointnum2 = ir.getInt(); int cut2 = 'p'; if (isalpha(ir.peek())) cut2 = ir.get(); double linewidth = _linewidth; if (ir.getPunct() == ',') linewidth = read_length(ir); auto it1=_points.find(pointnum1); auto it2=_points.find(pointnum2); if (it1 != _points.end() && it2 != _points.end()) create_line(it1->second, it2->second, char(cut1), char(cut2), linewidth, actions); else { // Line endpoints don't necessarily have to be defined before // a line definition. If a point isn't defined yet, we put the line // in a wait list and process the lines at the end of the page. _lines.emplace_back(Line(pointnum1, pointnum2, char(cut1), char(cut2), linewidth)); } } /** This method is called at the end of a DVI page. Here we have to draw all pending * lines that are still in the line list. All line endpoints must be defined until here. */ void EmSpecialHandler::dviEndPage (unsigned pageno, SpecialActions &actions) { for (const Line &line : _lines) { auto pit1=_points.find(line.p1); auto pit2=_points.find(line.p2); if (pit1 != _points.end() && pit2 != _points.end()) create_line(pit1->second, pit2->second, line.c1, line.c2, line.width, actions); // all lines with still undefined points are ignored } // line and point definitions are local to a page _lines.clear(); _points.clear(); } vector EmSpecialHandler::prefixes() const { vector pfx {"em:"}; return pfx; } dvisvgm-2.8.1/src/BgColorSpecialHandler.hpp0000664000175000017500000000426413510660062015557 00000000000000/************************************************************************* ** BgColorSpecialHandler.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef BGCOLORSPECIALHANDLER_HPP #define BGCOLORSPECIALHANDLER_HPP #include #include "Color.hpp" #include "SpecialHandler.hpp" class BgColorSpecialHandler : public SpecialHandler { public: void preprocess (const std::string &prefix, std::istream &is, SpecialActions &actions) override; bool process (const std::string &prefix, std::istream &is, SpecialActions &actions) override; const char* info () const override {return "background color special";} const char* name () const override {return "bgcolor";} std::vector prefixes() const override; protected: void dviBeginPage (unsigned pageno, SpecialActions &actions) override; private: using PageColor = std::pair; // page number and color std::vector _pageColors; }; #endif dvisvgm-2.8.1/src/CharMapID.hpp0000664000175000017500000000500313510660062013151 00000000000000/************************************************************************* ** CharMapID.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CHARMAPID_HPP #define CHARMAPID_HPP #include /** Represents a character map of a font. */ struct CharMapID { CharMapID () noexcept : platform_id(0), encoding_id(0) {} CharMapID (uint8_t plf_id, uint8_t enc_id) noexcept : platform_id(plf_id), encoding_id(enc_id) {} bool operator == (const CharMapID &ids) const { return platform_id == ids.platform_id && encoding_id == ids.encoding_id; } bool operator != (const CharMapID &ids) const { return platform_id != ids.platform_id || encoding_id != ids.encoding_id; } bool valid () const {return platform_id != 0 && encoding_id != 0;} static const CharMapID NONE; static const CharMapID WIN_SYMBOL; static const CharMapID WIN_UCS2; static const CharMapID WIN_SHIFTJIS; static const CharMapID WIN_PRC; static const CharMapID WIN_BIG5; static const CharMapID WIN_WANSUNG; static const CharMapID WIN_JOHAB; static const CharMapID WIN_UCS4; static const CharMapID MAC_JAPANESE; static const CharMapID MAC_TRADCHINESE; static const CharMapID MAC_SIMPLCHINESE; static const CharMapID MAC_KOREAN; uint8_t platform_id; uint8_t encoding_id; }; #endif dvisvgm-2.8.1/src/Directory.hpp0000664000175000017500000000373313510660062013375 00000000000000/************************************************************************* ** Directory.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef DIRECTORY_HPP #define DIRECTORY_HPP #include #ifdef _WIN32 #include "windows.hpp" #else #include #endif class Directory { public: enum EntryType {ET_FILE, ET_DIR, ET_FILE_OR_DIR}; public: Directory (); explicit Directory (const std::string &path); ~Directory (); bool open (std::string path); void close (); const char* read (EntryType type=ET_FILE_OR_DIR); private: std::string _dirname; #ifdef _WIN32 bool _firstread; HANDLE _handle; WIN32_FIND_DATA _fileData; #else DIR *_dir; struct dirent *_dirent; #endif }; #endif dvisvgm-2.8.1/src/SVGCharTspanTextHandler.cpp0000664000175000017500000000725213510660062016032 00000000000000/************************************************************************* ** SVGCharTspanTextHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "SVGCharTspanTextHandler.hpp" #include "utility.hpp" #include "XMLNode.hpp" using namespace std; SVGCharTspanTextHandler::SVGCharTspanTextHandler (bool selectFontByClass) : SVGCharTextHandler(selectFontByClass) { resetContextNode(); } void SVGCharTspanTextHandler::appendChar (uint32_t c, double x, double y) { // changes of fonts and transformations require a new text element if (!_textNode || _font.changed() || _matrix.changed() || _vertical.changed()) { resetContextNode(); _textNode = pushContextNode(createTextNode(x, y)); _color.changed(true); // force creating tspan with color attribute if current color differs from font color } if (_tspanNode && (_xchanged || _ychanged || _color.changed())) { // if drawing position or color was explicitly changed, finish current tspan element popContextNode(); _tspanNode = nullptr; } // Apply text color changes only if the color of the entire font is black. // Glyphs of non-black fonts (e.g. defined in a XeTeX document) can't change their color. bool applyColor = _color.get() != Color::BLACK && _font.get()->color() == Color::BLACK; if (_xchanged || _ychanged || (_color.changed() && applyColor)) { _tspanNode = pushContextNode(util::make_unique("tspan")); if (applyColor) _tspanNode->addAttribute("fill", _color.get().svgColorString()); _color.changed(false); if (_xchanged) { if (_vertical) { // align glyphs designed for horizontal layout properly if (auto pf = dynamic_cast(_font.get())) if (!pf->getMetrics()->verticalLayout()) x += pf->scaledAscent()/2.5; // move vertical baseline to the right by strikethrough offset } _tspanNode->addAttribute("x", x); _xchanged = false; } if (_ychanged) { _tspanNode->addAttribute("y", y); _ychanged = false; } } contextNode()->append(XMLString(_font.get()->unicode(c), false)); } void SVGCharTspanTextHandler::setInitialContextNode (XMLElement *node) { SVGCharHandler::setInitialContextNode(node); _textNode = _tspanNode = nullptr; _xchanged = _ychanged = false; } void SVGCharTspanTextHandler::resetContextNode () { SVGCharHandler::resetContextNode(); _textNode = _tspanNode = nullptr; _xchanged = _ychanged = false; _font.changed(false); _matrix.changed(false); _vertical.changed(false); } dvisvgm-2.8.1/src/CommandLine.hpp0000664000175000017500000001641513512046345013624 00000000000000// This file was automatically generated by opt2cpp. // It is part of the dvisvgm package and published under the terms // of the GNU General Public License version 3, or (at your option) any later version. // See file COPYING for further details. // Copyright (C) 2016-2019 Martin Gieseking #ifndef COMMANDLINE_HPP #define COMMANDLINE_HPP #include #include #include #include "CLCommandLine.hpp" using CL::Option; using CL::TypedOption; class CommandLine : public CL::CommandLine { public: CommandLine () : CL::CommandLine( "This program converts DVI files, as created by TeX/LaTeX, as well as\nEPS and PDF files to the XML-based scalable vector graphics format SVG.", "[options] dvifile\n--eps [options] epsfile\n--pdf [options] pdffile", "Copyright (C) 2005-2019 Martin Gieseking " ) {} CommandLine (int argc, char **argv) : CommandLine() { parse(argc, argv); } // option variables TypedOption bboxOpt {"bbox", 'b', "size", "min", "set size of bounding box"}; TypedOption cacheOpt {"cache", 'C', "dir", "set/print path of cache directory"}; Option clipjoinOpt {"clipjoin", 'j', "compute intersection of clipping paths"}; Option colorOpt {"color", '\0', "colorize messages"}; Option colornamesOpt {"colornames", '\0', "prefer color names to RGB values if possible"}; Option commentsOpt {"comments", '\0', "add comments with additional information"}; Option epsOpt {"eps", 'E', "convert EPS file to SVG"}; Option exactBboxOpt {"exact-bbox", 'e', "compute exact glyph bounding boxes"}; TypedOption fontFormatOpt {"font-format", 'f', "format", "svg", "select file format of embedded fonts"}; TypedOption fontmapOpt {"fontmap", 'm', "filenames", "evaluate (additional) font map files"}; Option gradOverlapOpt {"grad-overlap", '\0', "create overlapping color gradient segments"}; TypedOption gradSegmentsOpt {"grad-segments", '\0', "number", 20, "number of color gradient segments per row"}; TypedOption gradSimplifyOpt {"grad-simplify", '\0', "delta", 0.05, "reduce level of detail for small segments"}; TypedOption helpOpt {"help", 'h', "mode", 0, "print this summary of options and exit"}; Option keepOpt {"keep", '\0', "keep temporary files"}; TypedOption libgsOpt {"libgs", '\0', "filename", "set name of Ghostscript shared library"}; TypedOption linkmarkOpt {"linkmark", 'L', "style", "box", "select how to mark hyperlinked areas"}; Option listSpecialsOpt {"list-specials", 'l', "print supported special sets and exit"}; TypedOption magOpt {"mag", 'M', "factor", 4, "magnification of Metafont output"}; TypedOption noFontsOpt {"no-fonts", 'n', "variant", 0, "draw glyphs by using path elements"}; Option noMergeOpt {"no-merge", '\0', "don't merge adjacent text elements"}; Option noMktexmfOpt {"no-mktexmf", '\0', "don't try to create missing fonts"}; TypedOption noSpecialsOpt {"no-specials", 'S', "prefixes", "don't process [selected] specials"}; Option noStylesOpt {"no-styles", '\0', "don't use CSS styles to reference fonts"}; TypedOption optimizeOpt {"optimize", 'O', "modules", "all", "perform several SVG optimizations"}; TypedOption outputOpt {"output", 'o', "pattern", "set name pattern of output files"}; TypedOption pageOpt {"page", 'p', "ranges", "1", "choose page(s) to convert"}; TypedOption pageHashesOpt {"page-hashes", 'H', "params", "xxh64", "activate usage of page hashes"}; Option pdfOpt {"pdf", 'P', "convert PDF file to SVG"}; TypedOption precisionOpt {"precision", 'd', "number", 0, "set number of decimal points (0-6)"}; TypedOption progressOpt {"progress", '\0', "delay", 0.5, "enable progress indicator"}; Option relativeOpt {"relative", 'R', "create relative path commands"}; TypedOption rotateOpt {"rotate", 'r', "angle", "rotate page content clockwise"}; TypedOption scaleOpt {"scale", 'c', "sx[,sy]", "scale page content"}; Option stdinOpt {"stdin", '\0', "read input file from stdin"}; Option stdoutOpt {"stdout", 's', "write SVG output to stdout"}; TypedOption tmpdirOpt {"tmpdir", '\0', "path", "set/print the directory for temporary files"}; TypedOption traceAllOpt {"trace-all", 'a', "retrace", false, "trace all glyphs of bitmap fonts"}; TypedOption transformOpt {"transform", 'T', "commands", "transform page content"}; TypedOption translateOpt {"translate", 't', "tx[,ty]", "shift page content"}; TypedOption verbosityOpt {"verbosity", 'v', "level", 7, "set verbosity level (0-7)"}; TypedOption versionOpt {"version", 'V', "extended", false, "print version and exit"}; TypedOption zipOpt {"zip", 'z', "level", 9, "create compressed .svgz file"}; TypedOption zoomOpt {"zoom", 'Z', "factor", 1.0, "zoom page content"}; protected: std::vector& options () const override {return _options;} const char* section (size_t n) const override {return n < _sections.size() ? _sections[n] : nullptr;} private: std::array _sections {{ "Input options", "SVG output options", "SVG transformations", "Processing options", "Message options", }}; mutable std::vector _options = { {&pageOpt, 0}, {&fontmapOpt, 0}, #if !defined(DISABLE_GS) {&epsOpt, 0}, #endif #if !defined(DISABLE_GS) {&pdfOpt, 0}, #endif {&stdinOpt, 0}, {&bboxOpt, 1}, #if !defined(DISABLE_GS) {&clipjoinOpt, 1}, #endif {&colornamesOpt, 1}, {&commentsOpt, 1}, #if !defined(DISABLE_WOFF) {&fontFormatOpt, 1}, #endif #if !defined(DISABLE_GS) {&gradOverlapOpt, 1}, #endif #if !defined(DISABLE_GS) {&gradSegmentsOpt, 1}, #endif #if !defined(DISABLE_GS) {&gradSimplifyOpt, 1}, #endif {&linkmarkOpt, 1}, {&optimizeOpt, 1}, {&outputOpt, 1}, {&precisionOpt, 1}, {&relativeOpt, 1}, {&stdoutOpt, 1}, {&tmpdirOpt, 1}, {&noFontsOpt, 1}, {&noMergeOpt, 1}, {&noStylesOpt, 1}, {&zipOpt, 1}, {&rotateOpt, 2}, {&scaleOpt, 2}, {&translateOpt, 2}, {&transformOpt, 2}, {&zoomOpt, 2}, {&cacheOpt, 3}, {&exactBboxOpt, 3}, {&keepOpt, 3}, #if !defined(HAVE_LIBGS) && !defined(DISABLE_GS) {&libgsOpt, 3}, #endif {&magOpt, 3}, {&noMktexmfOpt, 3}, {&noSpecialsOpt, 3}, {&pageHashesOpt, 3}, {&traceAllOpt, 3}, {&colorOpt, 4}, {&helpOpt, 4}, {&listSpecialsOpt, 4}, {&progressOpt, 4}, {&verbosityOpt, 4}, {&versionOpt, 4}, }; }; #endif dvisvgm-2.8.1/src/PageSize.cpp0000664000175000017500000001236413510660062013133 00000000000000/************************************************************************* ** PageSize.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "PageSize.hpp" #include "utility.hpp" using namespace std; /** Computes width and height of ISO/DIN An. * @param[in] n the A level (e.g. n=4 => DIN A4) * @param[out] width contains the page width when function returns * @param[out] height contains the page height when function returns */ static void computeASize (int n, Length &width, Length &height) { height.set(floor(1189.0/pow(math::SQRT2, n)+0.5), Length::Unit::MM); width.set(floor(height.mm()/math::SQRT2+0.5), Length::Unit::MM); } /** Computes width and height of ISO/DIN Bn. * @param[in] n the B level (e.g. n=4 => DIN B4) * @param[out] width contains the page width when function returns * @param[out] height contains the page height when function returns */ static void computeBSize (int n, Length &width, Length &height) { Length w, h; computeASize(n, width, height); computeASize(n-1, w, h); width.set(floor(sqrt(width.mm() * w.mm())+0.5), Length::Unit::MM); height.set(floor(sqrt(height.mm() * h.mm())+0.5), Length::Unit::MM); } /** Computes width and height of ISO/DIN Cn. * @param[in] n the C level (e.g. n=4 => DIN C4) * @param[out] width contains the page width when function returns * @param[out] height contains the page height when function returns */ static void computeCSize (int n, Length &width, Length &height) { Length w, h; computeASize(n, width, height); computeBSize(n, w, h); width.set(floor(sqrt(width.mm() * w.mm())+0.5), Length::Unit::MM); height.set(floor(sqrt(height.mm() * h.mm())+0.5), Length::Unit::MM); } /** Computes width and height of ISO/DIN Dn in millimeters. * @param[in] n the D level (e.g. n=4 => DIN D4) * @param[out] width contains the page width when function returns * @param[out] height contains the page height when function returns */ static void computeDSize (int n, Length &width, Length &height) { Length w, h; computeASize(n, width, height); computeBSize(n+1, w, h); width.set(floor(sqrt(width.mm() * w.mm())+0.5), Length::Unit::MM); height.set(floor(sqrt(height.mm() * h.mm())+0.5), Length::Unit::MM); } /** Constructs a PageSize object of given size. * @param[in] name specifies the page size, e.g. "A4" or "letter" */ PageSize::PageSize (const string &name) : _width(0), _height(0) { resize(name); } void PageSize::resize (Length w, Length h) { _width = w; _height = h; } void PageSize::resize (string name) { if (name.length() < 2) throw PageSizeException("unknown page format: "+name); name = util::tolower(name); // extract optional suffix size_t pos = name.rfind('-'); bool landscape = false; if (pos != string::npos) { string suffix = name.substr(pos); name = name.substr(0, pos); if (suffix == "-l" || suffix == "-landscape") landscape = true; else if (suffix != "-p" && suffix != "-portrait") throw PageSizeException("invalid page format suffix: " + suffix); } if (name == "invoice") { _width = 140_mm; _height = 216_mm; } else if (name == "executive") { _width = 184_mm; _height = 267_mm; } else if (name == "legal") { _width = 216_mm; _height = 356_mm; } else if (name == "letter") { _width = 216_mm; _height = 279_mm; } else if (name == "ledger") { _width = 279_mm; _height = 432_mm; } else if (isdigit(name[1]) && name.length() < 5) { // limit length of number to prevent arithmetic errors istringstream iss(name.substr(1)); int n; iss >> n; switch (name[0]) { case 'a' : computeASize(n, _width, _height); break; case 'b' : computeBSize(n, _width, _height); break; case 'c' : computeCSize(n, _width, _height); break; case 'd' : computeDSize(n, _width, _height); break; default : throw PageSizeException("invalid page format: "+name); } } if (_width.pt() == 0 || _height.pt() == 0) throw PageSizeException("unknown page format: "+name); if (landscape) swap(_width, _height); } dvisvgm-2.8.1/src/MetafontWrapper.cpp0000664000175000017500000001106113517541161014540 00000000000000/************************************************************************* ** MetafontWrapper.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "FileSystem.hpp" #include "FileFinder.hpp" #include "Message.hpp" #include "MetafontWrapper.hpp" #include "Process.hpp" #include "XMLString.hpp" using namespace std; MetafontWrapper::MetafontWrapper (string fname, string dir) : _fontname(std::move(fname)), _dir(std::move(dir)) { // ensure that folder paths ends with slash if (_dir.empty()) _dir = "./"; else if (_dir != "/" && _dir.back() != '/') _dir += '/'; } /** Calls Metafont and evaluates the logfile. If a gf file was successfully * generated the dpi value is stripped from the filename * (e.g. cmr10.600gf => cmr10.gf). This makes life easier... * @param[in] mode Metafont mode, e.g. "ljfour" * @param[in] mag magnification factor * @return true on success */ bool MetafontWrapper::call (const string &mode, double mag) { if (!FileFinder::instance().lookup(_fontname+".mf")) return false; // mf file not available => no need to call the "slow" Metafont FileSystem::remove(_fontname+".gf"); #ifdef _WIN32 #ifdef TEXLIVEWIN32 const char *mfname = "mf-nowin.exe"; #else const char *mfname = "mf.exe"; #endif const char *cmd = FileFinder::instance().lookup(mfname, false); if (!cmd) { Message::estream(true) << "can't run Metafont (" << mfname << " not found)\n"; return false; } #else const char *cmd = "mf"; #endif ostringstream oss; oss << "\"\\mode=" << mode << ";" // set MF mode, e.g. 'proof', 'ljfour' or 'localfont' "mode_setup;" // initialize MF variables "mag:=" << mag << ";" // set magnification factor "show pixels_per_inch*mag;" // print character resolution to stdout "batchmode;" // don't halt on errors and don't print informational messages "input " << _fontname << "\""; // load font description Message::mstream(false, Message::MC_STATE) << "\nrunning Metafont for " << _fontname << '\n'; Process mf_process(cmd, oss.str()); string mf_messages; mf_process.run(_dir, &mf_messages); // get resolution value from stdout created by above MF command char buf[256]; istringstream iss(mf_messages); int resolution = 0; while (iss) { iss.getline(buf, sizeof(buf)); string line = buf; if (line.substr(0, 3) == ">> ") { resolution = stoi(line.substr(3)); break; } } // compose expected name of GF file (see Metafont Book, p. 324) string gfname = _dir + _fontname + "."; if (resolution > 0) gfname += XMLString(resolution); gfname += "gf"; FileSystem::rename(gfname, _dir+_fontname+".gf"); // remove resolution value from filename return FileSystem::exists(_dir+_fontname+".gf"); } /** Calls Metafont if output files (tfm and gf) don't already exist. * @param[in] mode Metafont mode to be used (e.g. 'ljfour') * @param[in] mag magnification factor * @return true on success */ bool MetafontWrapper::make (const string &mode, double mag) { ifstream tfm(_dir+_fontname+".tfm"); ifstream gf(_dir+_fontname+".gf"); if (gf && tfm) // @@ distinguish between gf and tfm return true; return call(mode, mag); } bool MetafontWrapper::success () const { ifstream tfm(_dir+_fontname+".tfm"); ifstream gf(_dir+_fontname+".gf"); return tfm && gf; } dvisvgm-2.8.1/src/Font.cpp0000664000175000017500000005111013510660062012322 00000000000000/************************************************************************* ** Font.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "CMap.hpp" #include "FileFinder.hpp" #include "FileSystem.hpp" #include "Font.hpp" #include "FontEngine.hpp" #include "Message.hpp" #include "MetafontWrapper.hpp" #include "SignalHandler.hpp" #include "Subfont.hpp" #include "Unicode.hpp" #include "utility.hpp" using namespace std; uint32_t Font::unicode (uint32_t c) const { return Unicode::charToCodepoint(c); } /** Returns the encoding object of this font which is asigned in a map file. * If there's no encoding assigned, the function returns 0. */ const FontEncoding* Font::encoding () const { if (const FontMap::Entry *entry = fontMapEntry()) return FontEncoding::encoding(entry->encname); return nullptr; } const FontMap::Entry* Font::fontMapEntry () const { string fontname = name(); size_t pos = fontname.rfind('.'); if (pos != string::npos) fontname = fontname.substr(0, pos); // strip extension return FontMap::instance().lookup(fontname); } /** Compute the extents of a given glyph. * @param[in] c character code of glyph * @param[in] vertical true if is glyph is part of vertical aligned text * @param[out] metrics the resulting extents */ void Font::getGlyphMetrics (int c, bool vertical, GlyphMetrics &metrics) const { double s = scaleFactor(); if (vertical) { // get metrics for vertical text flow? if (verticalLayout()) { // is the font designed for vertical texts? metrics.wl = s*charDepth(c); metrics.wr = s*charHeight(c); metrics.h = 0; metrics.d = s*charWidth(c); } else { // rotate box by 90 degrees for alphabetic text metrics.wl = s*charDepth(c); metrics.wr = s*charHeight(c); metrics.h = 0; metrics.d = s*(charWidth(c)+italicCorr(c)); } } else { metrics.wl = 0; metrics.wr = s*(charWidth(c)+italicCorr(c)); metrics.h = s*charHeight(c); metrics.d = s*charDepth(c); } } const char* Font::filename () const { const char *fname = strrchr(path(), '/'); if (fname) return fname+1; return path(); } /////////////////////////////////////////////////////////////////////////////////////// TFMFont::TFMFont (string name, uint32_t cs, double ds, double ss) : _fontname(std::move(name)), _checksum(cs), _dsize(ds), _ssize(ss) { } /** Returns a font metrics object for the current font. * @throw FontException if TFM file can't be found */ const FontMetrics* TFMFont::getMetrics () const { if (!_metrics) { try { _metrics = FontMetrics::read(_fontname); if (!_metrics) { _metrics = util::make_unique(); Message::wstream(true) << "can't find "+_fontname+".tfm\n"; } } catch (FontMetricException &e) { _metrics = util::make_unique(); Message::wstream(true) << e.what() << " in " << _fontname << ".tfm\n"; } } return _metrics.get(); } double TFMFont::charWidth (int c) const { double w = getMetrics() ? getMetrics()->getCharWidth(c) : 0; if (style()) w *= style()->extend; return w; } double TFMFont::italicCorr (int c) const { double w = getMetrics() ? getMetrics()->getItalicCorr(c) : 0; if (style()) { w += abs(style()->slant*charHeight(c)); // slant := tan(phi) = dx/height w *= style()->extend; } return w; } double TFMFont::charDepth (int c) const {return getMetrics() ? getMetrics()->getCharDepth(c) : 0;} double TFMFont::charHeight (int c) const {return getMetrics() ? getMetrics()->getCharHeight(c) : 0;} /** Tests if the checksum of the font matches that of the corresponding TFM file. */ bool TFMFont::verifyChecksums () const { if (_checksum != 0 && getMetrics() && getMetrics()->getChecksum() != 0) return _checksum == getMetrics()->getChecksum(); return true; } ////////////////////////////////////////////////////////////////////////////// // static class variables bool PhysicalFont::EXACT_BBOX = false; bool PhysicalFont::KEEP_TEMP_FILES = false; string PhysicalFont::CACHE_PATH; double PhysicalFont::METAFONT_MAG = 4; FontCache PhysicalFont::_cache; unique_ptr PhysicalFont::create (const string &name, uint32_t checksum, double dsize, double ssize, PhysicalFont::Type type) { return unique_ptr(new PhysicalFontImpl(name, 0, checksum, dsize, ssize, type)); } unique_ptr PhysicalFont::create (const string &name, int fontindex, uint32_t checksum, double dsize, double ssize) { return unique_ptr(new PhysicalFontImpl(name, fontindex, checksum, dsize, ssize, PhysicalFont::Type::TTC)); } const char* PhysicalFont::path () const { const char *ext=nullptr; switch (type()) { case Type::OTF: ext = "otf"; break; case Type::PFB: ext = "pfb"; break; case Type::TTC: ext = "ttc"; break; case Type::TTF: ext = "ttf"; break; case Type::MF : ext = "mf"; break; default : ext = nullptr; } if (ext) return FileFinder::instance().lookup(name()+"."+ext); return FileFinder::instance().lookup(name()); } /** Returns true if this font is CID-based. */ bool PhysicalFont::isCIDFont () const { if (type() == Type::MF) return false; FontEngine::instance().setFont(*this); return FontEngine::instance().isCIDFont(); } /** Retrieve the IDs of all charachter maps available in the font file. * @param[out] charMapIDs IDs of the found character maps * @return number of found character maps */ int PhysicalFont::collectCharMapIDs (std::vector &charMapIDs) const { if (type() == Type::MF) return 0; FontEngine::instance().setFont(*this); return FontEngine::instance().getCharMapIDs(charMapIDs); } /** Decodes a character code used in the DVI file to the code required to * address the correct character in the font. * @param[in] c DVI character to decode * @return target character code or name */ Character PhysicalFont::decodeChar (uint32_t c) const { if (const FontEncoding *enc = encoding()) return enc->decode(c); return Character(Character::CHRCODE, c); } /** Returns the number of units per EM. The EM square is the virtual area a glyph is designed on. * All coordinates used to specify portions of the glyph are relative to the origin (0,0) at the * lower left corner of this square, while the upper right corner is located at (m,m), where m * is an integer value defined with the font, and returned by this function. */ int PhysicalFont::unitsPerEm() const { if (type() == Type::MF) return 1000; FontEngine::instance().setFont(*this); return FontEngine::instance().getUnitsPerEM(); } int PhysicalFont::hAdvance () const { if (type() == Type::MF) return 0; FontEngine::instance().setFont(*this); return FontEngine::instance().getHAdvance(); } double PhysicalFont::hAdvance (int c) const { if (type() == Type::MF) return unitsPerEm()*charWidth(c)/designSize(); FontEngine::instance().setFont(*this); if (const FontMap::Entry *entry = fontMapEntry()) if (Subfont *sf = entry->subfont) c = sf->decode(c); return FontEngine::instance().getHAdvance(decodeChar(c)); } double PhysicalFont::vAdvance (int c) const { if (type() == Type::MF) return unitsPerEm()*charWidth(c)/designSize(); FontEngine::instance().setFont(*this); if (const FontMap::Entry *entry = fontMapEntry()) if (Subfont *sf = entry->subfont) c = sf->decode(c); return FontEngine::instance().getVAdvance(decodeChar(c)); } string PhysicalFont::glyphName (int c) const { if (type() == Type::MF) return ""; FontEngine::instance().setFont(*this); if (const FontMap::Entry *entry = fontMapEntry()) if (Subfont *sf = entry->subfont) c = sf->decode(c); return FontEngine::instance().getGlyphName(decodeChar(c)); } double PhysicalFont::scaledAscent() const { return ascent()*scaledSize()/unitsPerEm(); } /** Returns the unscaled ascender of the font in design units. */ int PhysicalFont::ascent () const { if (type() == Type::MF) return getMetrics() ? getMetrics()->getAscent()*unitsPerEm()/getMetrics()->getQuad() : 0; FontEngine::instance().setFont(*this); return FontEngine::instance().getAscender(); } /** Returns the unscaled descender of the font in design units. */ int PhysicalFont::descent () const { if (type() == Type::MF) return getMetrics() ? getMetrics()->getDescent()*unitsPerEm()/getMetrics()->getQuad() : 0; FontEngine::instance().setFont(*this); return FontEngine::instance().getDescender(); } std::string PhysicalFont::familyName () const { if (type() == Type::MF) return ""; FontEngine::instance().setFont(*this); const char *family = FontEngine::instance().getFamilyName(); return family ? family : ""; } std::string PhysicalFont::styleName () const { if (type() == Type::MF) return ""; FontEngine::instance().setFont(*this); const char *style = FontEngine::instance().getStyleName(); return style ? style : ""; } /** Extracts the glyph outlines of a given character. * @param[in] c character code of requested glyph * @param[out] glyph path segments of the glyph outline * @param[in] callback optional callback object for tracer class * @return true if outline could be computed */ bool PhysicalFont::getGlyph (int c, GraphicsPath &glyph, GFGlyphTracer::Callback *callback) const { if (type() == Type::MF) { const Glyph *cached_glyph=nullptr; if (!CACHE_PATH.empty()) { _cache.write(CACHE_PATH); _cache.read(name(), CACHE_PATH); cached_glyph = _cache.getGlyph(c); } if (cached_glyph) { glyph = *cached_glyph; return true; } else { string gfname; if (createGF(gfname)) { try { double ds = getMetrics() ? getMetrics()->getDesignSize() : 1; GFGlyphTracer tracer(gfname, unitsPerEm()/ds, callback); tracer.setGlyph(glyph); tracer.executeChar(c); glyph.closeOpenSubPaths(); if (!CACHE_PATH.empty()) _cache.setGlyph(c, glyph); return true; } catch (GFException &e) { // @@ print error message } } } } else { // vector fonts (OTF, PFB, TTF, TTC) bool ok=true; FontEngine::instance().setFont(*this); if (const FontMap::Entry *entry = fontMapEntry()) if (Subfont *sf = entry->subfont) c = sf->decode(c); ok = FontEngine::instance().traceOutline(decodeChar(c), glyph, false); glyph.closeOpenSubPaths(); return ok; } return false; } /** Creates a GF file for this font object. * @param[out] gfname name of the generated GF font file * @return true on success */ bool PhysicalFont::createGF (string &gfname) const { static set failed_fonts; if (failed_fonts.find(name()) == failed_fonts.end()) { SignalHandler::instance().check(); gfname = FileSystem::tmpdir()+name()+".gf"; MetafontWrapper mf(name(), FileSystem::tmpdir()); bool ok = mf.make("ljfour", METAFONT_MAG); // call Metafont if necessary if (ok && mf.success() && getMetrics()) return true; // report failure only once failed_fonts.insert(name()); Message::wstream(true) << "failed to create " << name() << ".gf\n"; } return false; } /** Traces all glyphs of the current font and stores them in the cache. If caching is disabled, nothing happens. * @param[in] includeCached if true, glyphs already cached are traced again * @param[in] cb optional callback methods called by the tracer * @return number of glyphs traced */ int PhysicalFont::traceAllGlyphs (bool includeCached, GFGlyphTracer::Callback *cb) const { int count = 0; if (type() == Type::MF && !CACHE_PATH.empty()) { if (const FontMetrics *metrics = getMetrics()) { int fchar = metrics->firstChar(); int lchar = metrics->lastChar(); string gfname; Glyph glyph; if (createGF(gfname)) { _cache.read(name(), CACHE_PATH); double ds = getMetrics() ? getMetrics()->getDesignSize() : 1; GFGlyphTracer tracer(gfname, unitsPerEm()/ds, cb); tracer.setGlyph(glyph); for (int i=fchar; i <= lchar; i++) { if (includeCached || !_cache.getGlyph(i)) { glyph.clear(); tracer.executeChar(i); glyph.closeOpenSubPaths(); _cache.setGlyph(i, glyph); ++count; } } _cache.write(CACHE_PATH); } } } return count; } /** Computes the exact bounding box of a glyph. * @param[in] c character code of the glyph * @param[out] bbox the computed bounding box * @param[in] cb optional calback object forwarded to the tracer * @return true if the box could be computed successfully */ bool PhysicalFont::getExactGlyphBox(int c, BoundingBox& bbox, GFGlyphTracer::Callback* cb) const { Glyph glyph; if (getGlyph(c, glyph, cb)) { glyph.computeBBox(bbox); double s = scaledSize()/unitsPerEm(); bbox.scale(s, s); return true; } return false; } bool PhysicalFont::getExactGlyphBox (int c, GlyphMetrics &metrics, bool vertical, GFGlyphTracer::Callback *cb) const { BoundingBox charbox; if (!getExactGlyphBox(c, charbox, cb)) return false; if ((metrics.wl = -charbox.minX()) < 0) metrics.wl=0; if ((metrics.wr = charbox.maxX()) < 0) metrics.wr=0; if ((metrics.h = charbox.maxY()) < 0) metrics.h=0; if ((metrics.d = -charbox.minY()) < 0) metrics.d=0; if (vertical) { // vertical text orientation if (verticalLayout()) { // font designed for vertical layout? metrics.wl = metrics.wr = (metrics.wl+metrics.wr)/2; metrics.d += metrics.h; metrics.h = 0; } else { double depth = metrics.d; metrics.d = metrics.wr; metrics.wr = metrics.h; metrics.h = metrics.wl; metrics.wl = depth; } } return true; } unique_ptr VirtualFont::create (const string &name, uint32_t checksum, double dsize, double ssize) { return unique_ptr(new VirtualFontImpl(name, checksum, dsize, ssize)); } ////////////////////////////////////////////////////////////////////////////// PhysicalFontImpl::PhysicalFontImpl (const string &name, int fontindex, uint32_t cs, double ds, double ss, PhysicalFont::Type type) : TFMFont(name, cs, ds, ss), _filetype(type), _fontIndex(fontindex), _encodingPair(Font::encoding()) { } PhysicalFontImpl::~PhysicalFontImpl () { if (!CACHE_PATH.empty()) _cache.write(CACHE_PATH); if (!KEEP_TEMP_FILES) tidy(); } const FontEncoding* PhysicalFontImpl::encoding () const { if (!_encodingPair.enc1()) return nullptr; return &_encodingPair; } bool PhysicalFontImpl::findAndAssignBaseFontMap () { const FontEncoding *enc = encoding(); if (enc && enc->mapsToCharIndex()) { // try to find a base font map that maps from character indexes to a suitable // target encoding supported by the font file if (const FontEncoding *bfmap = enc->findCompatibleBaseFontMap(this, _charmapID)) _encodingPair.assign(bfmap); else return false; } else if (type() != Type::MF) { FontEngine::instance().setFont(*this); _localCharMap = FontEngine::instance().createCustomToUnicodeMap(); if (_localCharMap) _charmapID = FontEngine::instance().setCustomCharMap(); else _charmapID = FontEngine::instance().setUnicodeCharMap(); } return true; } /** Returns the Unicode point for a given DVI character. */ uint32_t PhysicalFontImpl::unicode (uint32_t c) const { if (type() == Type::MF) return Font::unicode(c); Character chr = decodeChar(c); if (type() == Type::PFB) { // try to get the Unicode point from the character name string glyphname = glyphName(c); uint32_t codepoint; if (!glyphname.empty() && (codepoint = Unicode::aglNameToCodepoint(glyphname)) != 0) return codepoint; if (c <= 0x1900) // does character code c fit into Private Use Zone U+E000? return 0xe000+c; // Message::wstream() << "can't properly map PS character '" << glyphname << "' (0x" << hex << c << ") to Unicode\n"; // If we get here, there is no easy mapping. As for now, we use the character code as Unicode point. // Although quite unlikely, it might collide with properly mapped characters. return Unicode::charToCodepoint(c); } if (chr.type() == Character::NAME || chr.number() == 0) return Unicode::charToCodepoint(chr.number()); if (_localCharMap) { if (uint32_t mapped_char = _localCharMap->valueAt(chr.number())) return mapped_char; } // No Unicode equivalent found in the font file. // Now we should look for a smart alternative but at the moment // it's sufficient to simply choose a valid unused codepoint. return Unicode::charToCodepoint(chr.number()); } const FontStyle* PhysicalFontImpl::style () const { if (auto entry = fontMapEntry()) return &entry->style; return nullptr; } /** Delete all temporary font files created by Metafont. */ void PhysicalFontImpl::tidy () const { if (type() == Type::MF) { string fname = FileSystem::tmpdir()+name(); for (const char *ext : {"gf", "tfm", "log"}) { if (FileSystem::exists(fname+"."+ext)) FileSystem::remove(fname+"."+ext); } } } ////////////////////////////////////////////////////////////////////////////// string NativeFont::uniqueName (const string &path, const FontStyle &style) { static unordered_map ids; ostringstream oss; oss << path << "b" << style.bold << "e" << style.extend << "s" << style.slant; auto it = ids.find(oss.str()); int id = ids.size(); if (it == ids.end()) ids[oss.str()] = id; else id = it->second; oss.str(""); oss << "nf" << id; return oss.str(); } string NativeFont::name () const { return uniqueName(path(), _style); } PhysicalFont::Type NativeFont::type () const { if (const char *filepath = path()) { if (const char *p =strrchr(filepath, '.')) { string ext = p+1; if (ext == "otf") return PhysicalFont::Type::OTF; if (ext == "ttf") return PhysicalFont::Type::TTF; if (ext == "pfb") return PhysicalFont::Type::PFB; } } return PhysicalFont::Type::UNKNOWN; } double NativeFont::charWidth (int c) const { FontEngine::instance().setFont(*this); int upem = FontEngine::instance().getUnitsPerEM(); double w = upem ? (scaledSize()*FontEngine::instance().getAdvance(c)/upem*_style.extend) : 0; w += fabs(_style.slant*charHeight(c)); return w; } double NativeFont::charHeight (int c) const { FontEngine::instance().setFont(*this); int upem = FontEngine::instance().getUnitsPerEM(); return upem ? (scaledSize()*FontEngine::instance().getAscender()/upem) : 0; } double NativeFont::charDepth (int c) const { FontEngine::instance().setFont(*this); int upem = FontEngine::instance().getUnitsPerEM(); return upem ? (scaledSize()*FontEngine::instance().getDescender()/upem) : 0; } bool NativeFontImpl::findAndAssignBaseFontMap () { FontEngine &fe = FontEngine::instance(); fe.setFont(*this); fe.setUnicodeCharMap(); fe.buildCharMap(_toUnicodeMap); if (!_toUnicodeMap.addMissingMappings(fe.getNumGlyphs())) Message::wstream(true) << "incomplete Unicode mapping for native font " << name() << " (" << filename() << ")\n"; return true; } Character NativeFontImpl::decodeChar (uint32_t c) const { return Character(Character::INDEX, c); } uint32_t NativeFontImpl::unicode (uint32_t c) const { uint32_t ucode = _toUnicodeMap.valueAt(c); return Unicode::charToCodepoint(ucode); } ////////////////////////////////////////////////////////////////////////////// VirtualFontImpl::VirtualFontImpl (const string &name, uint32_t cs, double ds, double ss) : TFMFont(name, cs, ds, ss) { } const char* VirtualFontImpl::path () const { return FileFinder::instance().lookup(name()+".vf"); } void VirtualFontImpl::assignChar (uint32_t c, DVIVector &&dvi) { _charDefs.emplace(c, std::move(dvi)); } /** Returns the DVI sippet that describes a given character of the virtual font. * @param[in] c character code * @return pointer to vector of DVI commands, or 0 if character doesn't exist */ const vector* VirtualFontImpl::getDVI (int c) const { auto it = _charDefs.find(c); return (it == _charDefs.end() ? nullptr : &it->second); } dvisvgm-2.8.1/src/ffwrapper.h0000664000175000017500000000317113510660062013061 00000000000000/************************************************************************* ** ffwrapper.h ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FFWRAPPER_H #define FFWRAPPER_H #ifdef __cplusplus extern "C" { #endif void ff_init (); int ff_version (); int ff_sfd_to_ttf (const char *sfdname, const char *ttfname, int autohint); #ifdef __cplusplus } #endif #endif dvisvgm-2.8.1/src/VFActions.hpp0000664000175000017500000000356713510660062013272 00000000000000/************************************************************************* ** VFActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef VFACTIONS_HPP #define VFACTIONS_HPP #include #include struct VFActions { virtual ~VFActions () =default; virtual void vfPreamble (const std::string &comment, uint32_t checksum, double dsize) {} virtual void vfPostamble () {} virtual void defineVFFont (uint32_t fontnum, const std::string &path, const std::string &name, uint32_t checksum, double dsize, double ssize) {} virtual void defineVFChar (uint32_t c, std::vector &&dvi) {} }; #endif dvisvgm-2.8.1/src/ImageToSVG.cpp0000664000175000017500000001527713553267757013364 00000000000000/************************************************************************* ** ImageToSVG.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "Calculator.hpp" #include "ImageToSVG.hpp" #include "Message.hpp" #include "MessageException.hpp" #include "PageRanges.hpp" #include "PsSpecialHandler.hpp" #include "optimizer/SVGOptimizer.hpp" #include "SVGOutput.hpp" #include "System.hpp" #include "utility.hpp" #include "version.hpp" using namespace std; void ImageToSVG::checkGSAndFileFormat () { if (!_haveGS) { #ifdef HAVE_LIBGS _haveGS = true; #else _haveGS = Ghostscript().available(); #endif if (!_haveGS) throw MessageException("Ghostscript is required to process "+imageFormat()+" files"); if (!imageIsValid()) throw MessageException("invalid "+imageFormat()+" file"); } } void ImageToSVG::convert (int pageno) { checkGSAndFileFormat(); BoundingBox bbox = imageBBox(); if (bbox.valid() && (bbox.width() == 0 || bbox.height() == 0)) Message::wstream(true) << "bounding box of " << imageFormat() << " file is empty\n"; Message::mstream().indent(0); Message::mstream(false, Message::MC_PAGE_NUMBER) << "processing " << imageFormat() << " file\n"; Message::mstream().indent(1); _svg.newPage(1); // create a psfile special and forward it to the PsSpecialHandler stringstream ss; ss << "\"" << _fname << "\" " "llx=" << bbox.minX() << " " "lly=" << bbox.minY() << " " "urx=" << bbox.maxX() << " " "ury=" << bbox.maxY(); if (!isSinglePageFormat()) ss << " page=" << pageno; try { _psHandler.process(psSpecialCmd(), ss, *this); } catch (...) { progress(nullptr); // remove progress message throw; } progress(nullptr); Matrix matrix = getUserMatrix(_bbox); // output SVG file SVGOptimizer(_svg).execute(); _svg.transformPage(matrix); _bbox.transform(matrix); _svg.setBBox(_bbox); _svg.appendToDoc(util::make_unique(" This file was generated by dvisvgm " + string(PROGRAM_VERSION) + " ")); bool success = _svg.write(_out.getPageStream(pageno, totalPageCount())); string svgfname = _out.filepath(pageno, totalPageCount()).shorterAbsoluteOrRelative(); if (svgfname.empty()) svgfname = ""; if (!success) Message::wstream() << "failed to write output to " << svgfname << '\n'; else { const double bp2pt = 72.27/72; const double bp2mm = 25.4/72; Message::mstream(false, Message::MC_PAGE_SIZE) << "graphic size: " << XMLString(_bbox.width()*bp2pt) << "pt" " x " << XMLString(_bbox.height()*bp2pt) << "pt" " (" << XMLString(_bbox.width()*bp2mm) << "mm" " x " << XMLString(_bbox.height()*bp2mm) << "mm)\n"; Message::mstream(false, Message::MC_PAGE_WRITTEN) << "output written to " << svgfname << '\n'; } _svg.reset(); } void ImageToSVG::convert (int firstPage, int lastPage, pair *pageinfo) { checkGSAndFileFormat(); int pageCount = 1; // number of pages converted if (isSinglePageFormat()) convert(1); else { if (firstPage > lastPage) swap(firstPage, lastPage); firstPage = max(1, firstPage); if (firstPage > totalPageCount()) pageCount = 0; else { lastPage = min(totalPageCount(), lastPage); pageCount = lastPage-firstPage+1; for (int i=firstPage; i <= lastPage; i++) convert(i); } } if (pageinfo) { pageinfo->first = pageCount; pageinfo->second = totalPageCount(); } } void ImageToSVG::convert (const std::string &rangestr, pair *pageinfo) { checkGSAndFileFormat(); PageRanges ranges; if (!ranges.parse(rangestr, totalPageCount())) throw MessageException("invalid page range format"); int pageCount=0; // number of pages converted for (const auto &range : ranges) { convert(range.first, range.second, pageinfo); if (pageinfo) pageCount += pageinfo->first; } if (pageinfo) pageinfo->first = pageCount; } FilePath ImageToSVG::getSVGFilePath (unsigned pageno) const { FilePath path; if (pageno == 1) path = _out.filepath(1, 1); return path; } void ImageToSVG::progress (const char *id) { static double time=System::time(); static bool draw=false; // show progress indicator? static size_t count=0; count++; // don't show the progress indicator before the given time has elapsed if (!draw && System::time()-time > PROGRESSBAR_DELAY) { draw = true; Terminal::cursor(false); Message::mstream(false) << "\n"; } if (draw && ((System::time() - time > 0.05) || id == nullptr)) { const size_t DIGITS=6; Message::mstream(false, Message::MC_PROGRESS) << string(DIGITS-min(DIGITS, static_cast(log10(count))), ' ') << count << " PostScript instructions processed\r"; // overprint indicator when finished if (id == nullptr) { Message::estream().clearline(); Terminal::cursor(true); } time = System::time(); } } /** Returns the matrix describing the graphics transformations * given by the user in terms of transformation commands. * @param[in] bbox bounding box of the graphics to transform */ Matrix ImageToSVG::getUserMatrix (const BoundingBox &bbox) const { Matrix matrix(1); if (!_transCmds.empty()) { const double bp2pt = (1_bp).pt(); Calculator calc; calc.setVariable("ux", bbox.minX()*bp2pt); calc.setVariable("uy", bbox.minY()*bp2pt); calc.setVariable("w", bbox.width()*bp2pt); calc.setVariable("h", bbox.height()*bp2pt); // add constants for length units to calculator for (const auto &unit : Length::getUnits()) calc.setVariable(unit.first, Length(1, unit.second).pt()); matrix.set(_transCmds, calc); } return matrix; } dvisvgm-2.8.1/src/EPSFile.cpp0000664000175000017500000000730013510660062012645 00000000000000/************************************************************************* ** EPSFile.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "EPSFile.hpp" #include "InputBuffer.hpp" #include "InputReader.hpp" using namespace std; /** Reads a little-endian 32-bit integer from the given input stream. */ static uint32_t getUInt32 (istream &is) { uint32_t value=0; char buf[4]; is.read(buf, 4); for (int i=0; i < 4; i++) value |= ((buf[i] & 255) << (8*i)); return value; } static size_t getline (istream &is, char *line, size_t n) { char buf[512]; is.get(buf, min(n, (size_t)512)-1); n = is.gcount(); size_t linelen=0; for (size_t i=0; i < n; i++) if (isprint(buf[i])) line[linelen++] = buf[i]; line[linelen] = 0; if (is.peek() == '\n') is.get(); else is.ignore(numeric_limits::max(), '\n'); return linelen; } EPSFile::EPSFile (const string &fname) : _ifs(fname, ios::binary) { if (_ifs) { if (getUInt32(_ifs) != 0xC6D3D0C5) // no binary header present? _ifs.seekg(0); // go back to the first byte else { _offset = getUInt32(_ifs); // stream offset where PS part of the file begins _pslength = getUInt32(_ifs); // length of PS section in bytes _ifs.seekg(_offset); // continue reading at the beginning of the PS section } string str; str += char(_ifs.get()); str += char(_ifs.get()); _headerValid = (str == "%!"); _ifs.seekg(0); } } /** Returns an input stream for the EPS file. The stream pointer is automatically moved * to the beginning of the ASCII (PostScript) part of the file. */ istream& EPSFile::istream () const { _ifs.clear(); _ifs.seekg(_offset); return _ifs; } /** Extracts the bounding box information from the DSC header/footer (if present). * @return the extracted bounding box */ BoundingBox EPSFile::bbox () const { BoundingBox box; std::istream &is = EPSFile::istream(); if (is) { char buf[64]; while (is) { size_t linelen = getline(is, buf, 64); if (strncmp(buf, "%%BoundingBox:", 14) == 0) { CharInputBuffer ib(buf, linelen); BufferInputReader ir(ib); ir.skip(14); ir.skipSpace(); if (!ir.check("(atend)", true)) { array values; for (int &v : values) { ir.skipSpace(); ir.parseInt(v); } box = BoundingBox(values[0], values[1], values[2], values[3]); break; } } } } return box; } dvisvgm-2.8.1/src/Bitmap.hpp0000664000175000017500000001010613542104105012631 00000000000000/************************************************************************* ** Bitmap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef BITMAP_HPP #define BITMAP_HPP #include #include class Bitmap { public: struct Callback { virtual ~Callback() =default; virtual void pixel (int x, int y, bool set, Bitmap &bm) {} virtual void pixel (int x, int y, bool set, const Bitmap &bm) {} virtual void finish () {} }; public: Bitmap () =default; Bitmap (int minx, int maxx, int miny , int maxy); void resize (int minx, int maxx, int miny , int maxy); void setBits(int row, int col, int n); const uint8_t* rowPtr (int row) const {return &_bytes[row*_bpr];} int height () const {return _rows;} int width () const {return _cols;} int xshift () const {return _xshift;} int yshift () const {return _yshift;} int bytesPerRow () const {return _bpr;} bool empty () const {return (!_rows && !_cols) || _bytes.empty();} bool getBBox (int &minx, int &miny, int &maxx, int &maxy) const; void getExtent (int &w, int &h) const; void forAllPixels (Callback &callback) const; template int copy (std::vector &target, bool vflip=false) const; // template // void write (std::ostream &os, const std::vector &v) const; // std::ostream& write (std::ostream &os) const; private: int _rows=0, _cols=0; ///< number of rows, columns int _xshift=0, _yshift=0; ///< horizontal/vertical shift int _bpr=0; ///< number of bytes per row std::vector _bytes; }; /** Copies the bitmap to a new target area and reorganizes the bits. * @tparam T component type of target vector * @param[out] target points to first T of new bitmap (must be deleted after usage) * @param[in] vflip true if the new bitmap should be flipped vertically * @return number of Ts per row */ template int Bitmap::copy (std::vector &target, bool vflip) const { const int s = sizeof(T); const int tpr = _bpr/s + (_bpr%s ? 1 : 0); // number of Ts per row target.resize(_rows*tpr); for (int r=0; r < _rows; r++) { int targetrow = vflip ? _rows-r-1 : r; for (int b=0; b < _bpr; b++) { T &t = target[targetrow*tpr + b/s]; T chunk = static_cast(_bytes[r*_bpr+b]) << (8*(s-1-b%s)); if (b % s == 0) t = chunk; else t |= chunk; } } return tpr; } /* template void Bitmap::write (std::ostream &os, const std::vector &v) const { const int s = sizeof(T); const int tpr = _bpr/s + (_bpr%s ? 1 : 0); // number of Ts per row for (int r=_rows-1; r >= 0; r--) { for (int t=0; t < tpr; t++) { for (T b=(T)1<<(8*s-1); b; b>>=1) os << ((v[r*tpr+t] & b) ? '*' : '-'); os << ' '; } os << std::endl; } }*/ #endif dvisvgm-2.8.1/src/HyperlinkManager.hpp0000664000175000017500000000767313510660062014700 00000000000000/************************************************************************* ** HyperlinkManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef HYPERLINKMANAGER_HPP #define HYPERLINKMANAGER_HPP #include #include #include "Color.hpp" #include "SpecialActions.hpp" class SpecialActions; class HyperlinkManager { struct NamedAnchor { NamedAnchor () : pageno(0), id(0), pos(0), referenced(false) {} NamedAnchor (unsigned pn, int i, double p, bool r=false) : pageno(pn), id(i), pos(p), referenced(r) {} unsigned pageno; ///< page number where the anchor is located int id; ///< unique numerical ID (< 0 if anchor is undefined yet) double pos; ///< vertical position of named anchor (in PS point units) bool referenced; ///< true if a reference to this anchor exists }; enum class AnchorType {NONE, HREF, NAME}; enum class ColorSource {DEFAULT, LINKMARKER, STATIC}; using NamedAnchors = std::unordered_map; public: HyperlinkManager (const HyperlinkManager&) =delete; HyperlinkManager (HyperlinkManager&&) =delete; void addHrefAnchor (const std::string &uri); void addNameAchor (const std::string &name, int pageno); void setActiveNameAnchor (const std::string &name, SpecialActions &actions); void closeAnchor (SpecialActions &actions); void checkNewLine (SpecialActions &actions); void createLink (std::string uri, SpecialActions &actions); void createViews (unsigned pageno, SpecialActions &actions); void setBaseUrl (std::string &base) {_base = base;} void setLineWidth (double w) {_linewidth = w;} static HyperlinkManager& instance (); static bool setLinkMarker (const std::string &marker); static void setDefaultLinkColor (Color color); protected: HyperlinkManager () : _anchorType(AnchorType::NONE), _depthThreshold(0), _linewidth(-1) {} void markLinkedBox (SpecialActions &actions); enum class MarkerType {NONE, LINE, BOX, BGCOLOR}; static MarkerType MARKER_TYPE; ///< selects how to mark linked areas static Color LINK_BGCOLOR; ///< background color if linkmark type == LT_BGCOLOR static Color LINK_LINECOLOR; ///< line color if linkmark type is LM_LINE or LM_BOX static ColorSource COLORSOURCE; ///< if true, LINK_LINECOLOR is applied private: AnchorType _anchorType; ///< type of active anchor int _depthThreshold; ///< break anchor box if the DVI stack depth underruns this threshold double _linewidth; ///< line width of link marker (-1 => compute individual value per link) std::string _base; ///< base URL that is prepended to all relative targets NamedAnchors _namedAnchors; ///< information about all named anchors processed }; #endif dvisvgm-2.8.1/src/FontEngine.hpp0000664000175000017500000000626613510660062013471 00000000000000/************************************************************************* ** FontEngine.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTENGINE_HPP #define FONTENGINE_HPP #include #include FT_FREETYPE_H #include FT_CID_H #include #include #include #include #include "Character.hpp" #include "CharMapID.hpp" #include "Glyph.hpp" #include "RangeMap.hpp" class Font; /** This class provides methods to handle font files and font data. * It's a wrapper for the Freetype font library. */ class FontEngine { public: ~FontEngine (); static FontEngine& instance (); static std::string version (); bool setFont (const Font &font); bool isCIDFont() const; bool traceOutline (const Character &c, Glyph &glyph, bool scale=true) const; const char* getFamilyName () const; const char* getStyleName () const; int getUnitsPerEM () const; int getAscender () const; int getDescender () const; int getAdvance (int c) const; int getHAdvance () const; int getHAdvance (const Character &c) const; int getVAdvance (const Character &c) const; int getFirstChar () const; int getNextChar () const; int getCharMapIDs (std::vector &charmapIDs) const; int getNumGlyphs () const; CharMapID setUnicodeCharMap (); CharMapID setCustomCharMap (); std::vector getPanose () const; std::string getGlyphName (const Character &c) const; int getCharByGlyphName (const char *name) const; bool setCharMap (const CharMapID &charMapID); void buildCharMap (RangeMap &charmap); std::unique_ptr createCustomToUnicodeMap (); protected: FontEngine (); bool setFont (const std::string &fname, int fontindex, const CharMapID &charmapID); int charIndex (const Character &c) const; private: mutable unsigned int _currentChar=0, _currentGlyphIndex=0; FT_Face _currentFace = nullptr; FT_Library _library; const Font *_currentFont = nullptr; }; #endif dvisvgm-2.8.1/src/PageSize.hpp0000664000175000017500000000405413510660062013135 00000000000000/************************************************************************* ** PageSize.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PAGESIZE_HPP #define PAGESIZE_HPP #include "Length.hpp" #include "MessageException.hpp" struct PageSizeException : public MessageException { explicit PageSizeException (const std::string &msg) : MessageException(msg) {} }; class PageSize { public: PageSize () =default; PageSize (Length w, Length h) : _width(w), _height(h) {} explicit PageSize (const std::string &name); void resize (std:: string name); void resize (Length w, Length h); Length width () const {return _width;} Length height () const {return _height;} bool valid () const {return _width.pt() > 0 && _height.pt() > 0;} private: Length _width, _height; }; #endif dvisvgm-2.8.1/src/SignalHandler.cpp0000664000175000017500000001017213510660062014132 00000000000000/************************************************************************* ** SignalHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "SignalHandler.hpp" #include "utility.hpp" using namespace std; volatile bool SignalHandler::_break = false; /** Helper class that encapsulates the system-specific parts of * registering and handling CTRL-C (SIGINT) events. */ class SignalHandler::Impl { using HandlerFunc = void (*)(int); public: Impl (); bool setSigintHandler (HandlerFunc handler); bool restoreSigintHandler (); private: #ifdef HAVE_SIGACTION struct sigaction _currentSigaction; struct sigaction _origSigaction; #else HandlerFunc _origHandlerFunc; #endif }; SignalHandler::SignalHandler () : _active(false), _impl(util::make_unique()) { } SignalHandler::~SignalHandler () { stop(); } /** Returns the singleton handler object. */ SignalHandler& SignalHandler::instance() { static SignalHandler handler; return handler; } /** Starts listening to CTRL-C signals. * @return true if handler was activated. */ bool SignalHandler::start () { if (!_active) { _break = false; if (_impl->setSigintHandler(callback)) _active = true; } return _active; } /** Stops listening for CTRL-C signals. */ void SignalHandler::stop () { if (_active) { _impl->restoreSigintHandler(); _active = false; } } /** Checks for incoming signals and throws an exception if CTRL-C was caught. * @throw SignalException */ void SignalHandler::check() { if (_break) throw SignalException(); } void SignalHandler::trigger (bool notify) { _break = true; if (notify) check(); } /** This function is called on CTRL-C signals. */ void SignalHandler::callback (int) { _break = true; } // Prefer sigaction() to signal() due to its more reliable interface and behavior. // Use signal() as fallback on systems that don't provide sigaction(). #ifdef HAVE_SIGACTION SignalHandler::Impl::Impl () { _origSigaction.sa_handler = nullptr; } bool SignalHandler::Impl::setSigintHandler (HandlerFunc handler) { sigemptyset(&_currentSigaction.sa_mask); _currentSigaction.sa_handler = handler; _currentSigaction.sa_flags = SA_SIGINFO; return (sigaction(SIGINT, &_currentSigaction, &_origSigaction) == 0); } bool SignalHandler::Impl::restoreSigintHandler () { if (_origSigaction.sa_handler == nullptr) return false; return (sigaction(SIGINT, &_origSigaction, nullptr) == 0); } #else // !HAVE_SIGACTION SignalHandler::Impl::Impl () : _origHandlerFunc(SIG_ERR) { } bool SignalHandler::Impl::setSigintHandler (HandlerFunc handler) { _origHandlerFunc = signal(SIGINT, handler); return _origHandlerFunc != SIG_ERR; } bool SignalHandler::Impl::restoreSigintHandler () { if (_origHandlerFunc == SIG_ERR) return false; return (signal(SIGINT, _origHandlerFunc) != SIG_ERR); } #endif dvisvgm-2.8.1/src/utility.hpp0000664000175000017500000001163713536436567013161 00000000000000/************************************************************************* ** utility.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef UTILITY_HPP #define UTILITY_HPP #include #include #include #include #include namespace math { constexpr const double PI = 3.141592653589793238462643383279502884; constexpr const double HALF_PI = 1.570796326794896619231321691639751442; constexpr const double TWO_PI = 6.283185307179586476925286766559005768; constexpr const double SQRT2 = 1.414213562373095048801688724209698079; inline double deg2rad (double deg) {return PI*deg/180.0;} inline double rad2deg (double rad) {return 180.0*rad/PI;} double normalize_angle (double angle, double mod); double normalize_0_2pi (double rad); std::vector svd (const double (&m)[2][2]); /** Signum function (returns x/abs(x) if x != 0, and 0 otherwise). */ template inline int sgn (T x) {return (x > T(0)) - (x < T(0));} } // namespace math namespace util { template std::string tohex (T val) { std::ostringstream oss; oss << std::hex << val; return oss.str(); } std::string trim (const std::string &str, const char *ws=" \t\n\r\f"); std::string normalize_space (std::string str, const char *ws=" \t\n\r\f"); std::string tolower (const std::string &str); std::string replace (std::string str, const std::string &find, const std::string &repl); std::string to_string (double val); std::vector split (const std::string &str, const std::string &sep); int ilog10 (int n); std::string read_file_contents (const std::string &fname); void write_file_contents (const std::string &fname, std::string::iterator start, std::string::iterator end); /** Returns a sequence of bytes of a given integral value. * @param[in] val get bytes of this value * @param[in] n number of bytes to extract (from LSB to MSB), all if n == 0 * @return vector of bytes in big-endian order */ template std::vector bytes (T val, int n=0) { if (n <= 0) n = sizeof(T); std::vector ret(n); for (int i=0; i < n; i++) { ret[n-i-1] = val & 0xff; val >>= 8; } return ret; } /** Encodes the bytes in the half-open range [first,last) to Base64 and writes * the result to the range starting at 'dest'. * @param[in] first initial position of the range to be encoded * @param[in] last final position of the range to be encoded * @param[in] dest first position of the destination range */ template void base64_copy (InputIterator first, InputIterator last, OutputIterator dest) { static const char *base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; while (first != last) { int padding = 0; unsigned char c0 = *first++, c1=0, c2=0; if (first == last) padding = 2; else { c1 = *first++; if (first == last) padding = 1; else c2 = *first++; } uint32_t n = (c0 << 16) | (c1 << 8) | c2; for (int i=0; i <= 3-padding; i++) { *dest++ = base64_chars[(n >> 18) & 0x3f]; n <<= 6; } while (padding--) *dest++ = '='; } } /** Simple implementation mimicking std::make_unique introduced in C++14. * Constructs an object of class T on the heap and returns a unique_ptr to it. * @param[in] args arguments forwarded to an constructor of T */ template std::unique_ptr make_unique (Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } template std::unique_ptr static_unique_ptr_cast (std::unique_ptr &&old){ return std::unique_ptr{static_cast(old.release())}; } } // namespace util #endif dvisvgm-2.8.1/src/CLCommandLine.cpp0000664000175000017500000002015313510660062014024 00000000000000/************************************************************************* ** CLCommandLine.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "CLCommandLine.hpp" #include "version.hpp" using namespace CL; using namespace std; CommandLine::CommandLine (const char *summary, const char *usage, const char *copyright) : _summary(summary), _usage(usage), _copyright(copyright) { } void CommandLine::parse (int argc, char **argv) { bool filesOnly = false; for (int i=1; i < argc; i++) { istringstream iss(argv[i]); if (filesOnly || iss.peek() != '-') _files.emplace_back(argv[i]); else { iss.get(); // skip dash if (iss.peek() < 0) _singleDashParsed = true; else if (iss.peek() != '-') parseShortOption(iss, argc, argv, i); else { iss.get(); // skip dash if (iss.peek() == EOF) // "--" only, no following option name? filesOnly = true; // treat all following options as filenames else parseLongOption(iss); } } } } static void error (const Option &option, bool shortname, const string &msg) { ostringstream oss; oss << "option "; if (shortname) oss << '-' << option.shortName(); else oss << "--" << option.longName(); oss << ": " << msg; throw CommandLineException(oss.str()); } static void type_error (const Option &option, bool shortname) { ostringstream oss; switch (option.argMode()) { case Option::ArgMode::NONE: error(option, shortname, "no argument expected"); break; case Option::ArgMode::OPTIONAL: oss << "optional argument "; if (!option.argName().empty()) oss << "'" << option.argName() << "' "; oss << "must be of "+option.typeString()+" type"; error(option, shortname, oss.str()); break; default: oss << option.typeString()+" argument "; if (!option.argName().empty()) oss << "'" << option.argName() << "' "; oss << "expected"; error(option, shortname, oss.str()); } } void CommandLine::parseShortOption (istringstream &iss, int argc, char **argv, int &argn) { bool combined = false; do { char shortname = static_cast(iss.get()); if (!isalnum(shortname)) throw CommandLineException(string("syntax error: -")+shortname); if (Option *option = lookupOption(shortname)) { if (!combined || option->argMode() == Option::ArgMode::NONE) { if (option->argMode() == Option::ArgMode::REQUIRED && strlen(argv[argn]) == 2) { // required argument separated by whitespace? if (argn+1 < argc && argv[argn+1][0] != '-') { iss.clear(); // reset error flags iss.str(argv[++argn]); // continue parsing with next command-line field } } if (!option->parse(iss, false)) type_error(*option, true); if (option->argMode() == Option::ArgMode::NONE) combined = true; } else throw CommandLineException(string("option -")+ shortname + " must be given separately"); } else throw CommandLineException(string("unknown option -")+shortname); } while (combined && !iss.eof()); } void CommandLine::parseLongOption (istream &is) { string optname; while (isalnum(is.peek()) || (!optname.empty() && is.peek() == '-')) optname += char(is.get()); if (optname.empty()) throw CommandLineException("unexpected character '" + string(1, is.peek()) + "' after '--'"); vector options = lookupOption(optname); if (options.empty()) throw CommandLineException("unknown option --"+optname); else if (options.size() == 1) { if (!options[0]->parse(is, true)) type_error(*options[0], false); } else { // is partially given option ambiguous? sort(options.begin(), options.end(), [](const Option *opt1, const Option *opt2) { return opt1->longName() < opt2->longName(); }); string msg = "option --" + optname + " is ambiguous ("; for (const Option *opt : options) { if (opt != options[0]) msg += ", "; msg += opt->longName(); } msg += ')'; throw CommandLineException(msg); } } /** Returns all options that match the given long name. */ vector CommandLine::lookupOption (const string &optname) const { vector matches; int len = optname.length(); for (OptSectPair optsect : options()) { if (optsect.first->longName() == optname) { // exact match? matches.clear(); matches.push_back(optsect.first); break; } if (optsect.first->longName().substr(0, len) == optname) // partial match? matches.push_back(optsect.first); } return matches; } /** Returns the option that match the given short name. */ Option* CommandLine::lookupOption (char optchar) const { auto it = find_if(options().begin(), options().end(), [=](const OptSectPair &optsect) { return optsect.first->shortName() == optchar; }); return (it != options().end()) ? it->first : nullptr; } /** Prints help text including summary of options. * @param[in] os output stream the help text is printed to * @param[in] mode output mode (0=section, 1=sorted by short options, 2=sorted by long options) */ void CommandLine::help (ostream &os, int mode) const { os << PROGRAM_NAME << ' '<< PROGRAM_VERSION << "\n\n"; os << _summary << "\n\n"; // print usage info string usage = _usage; int count=0; while (!usage.empty()) { size_t pos = usage.find('\n'); os << (count++ == 0 ? "Usage: " : " ") << PROGRAM_NAME << ' ' << usage.substr(0, pos) << '\n'; if (pos != string::npos) usage = usage.substr(pos+1); else usage.clear(); } if (mode > 0) os << '\n'; // compute width of first column of help output unordered_map> linecols; size_t col1width=0; for (const OptSectPair &ospair : options()) { size_t pos; string line = ospair.first->helpline(); if ((pos = line.find('\t')) != string::npos) { linecols.emplace(ospair.first, pair(line.substr(0, pos), line.substr(pos+1))); col1width = max(col1width, pos); } } if (mode > 0) { bool (*isless)(const OptSectPair&, const OptSectPair&) = [](const OptSectPair &p1, const OptSectPair &p2) { return p1.first->longName() < p2.first->longName(); }; if (mode == 1) { isless = [](const OptSectPair &p1, const OptSectPair &p2) { char c1 = p1.first->shortName(), c2 = p2.first->shortName(); if (c1 == c2) return p1.first->longName() < p2.first->longName(); if (tolower(c1) == tolower(c2)) return c1 > c2; // lower case before upper case letters return tolower(c1) < tolower(c2); }; } sort(options().begin(), options().end(), isless); } // print summary of options col1width += 2; int sectno=-1; for (const OptSectPair &ospair : options()) { if (mode == 0 && ospair.second != sectno) { // first option in current section? sectno = ospair.second; if (section(sectno)) os << '\n' << section(sectno) << ":\n"; } Option *opt = ospair.first; os << " " << setw(col1width) << left << linecols[opt].first; os << setw(0) << linecols[opt].second << '\n'; } os << '\n' << _copyright << '\n'; } dvisvgm-2.8.1/src/FontMetrics.cpp0000664000175000017500000000370013510660062013653 00000000000000/************************************************************************* ** FontMetrics.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileFinder.hpp" #include "FontMetrics.hpp" #include "JFM.hpp" #include "utility.hpp" using namespace std; unique_ptr FontMetrics::read (const string &fontname) { const char *path = FileFinder::instance().lookup(fontname + ".tfm"); ifstream ifs(path, ios::binary); if (!ifs) return unique_ptr(); uint16_t id = 256*ifs.get(); id += ifs.get(); if (id == 9 || id == 11) // Japanese font metric file? return util::make_unique(ifs); return util::make_unique(ifs); } dvisvgm-2.8.1/src/SpecialActions.hpp0000664000175000017500000001021613561274402014331 00000000000000/************************************************************************* ** SpecialActions.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SPECIALACTIONS_HPP #define SPECIALACTIONS_HPP #include #include #include "BoundingBox.hpp" #include "Color.hpp" #include "FilePath.hpp" #include "Matrix.hpp" #include "SVGTree.hpp" class XMLElement; class XMLNode; class SpecialActions { public: virtual ~SpecialActions () =default; virtual double getX () const =0; virtual double getY () const =0; virtual void setX (double x) =0; virtual void setY (double y) =0; virtual void finishLine () =0; virtual void setColor (const Color &color) =0; virtual Color getColor () const =0; virtual void setMatrix (const Matrix &m) =0; virtual const Matrix& getMatrix () const =0; virtual Matrix getPageTransformation () const {return Matrix(1);} virtual void setBgColor (const Color &color) =0; virtual const SVGTree& svgTree () const =0; SVGTree& svgTree () {return const_cast(const_cast(this)->svgTree());} virtual BoundingBox& bbox () =0; virtual BoundingBox& bbox (const std::string &name, bool reset=false) =0; virtual void embed (const BoundingBox &bbox) =0; virtual void embed (const DPair &p, double r=0) =0; virtual unsigned getCurrentPageNumber () const =0; virtual FilePath getSVGFilePath (unsigned pageno) const =0; virtual std::string getBBoxFormatString () const =0; virtual void progress (const char *id) {} virtual int getDVIStackDepth () const {return 0;} virtual void lockOutput () {} virtual void unlockOutput () {} virtual bool outputLocked () const {return false;} static double PROGRESSBAR_DELAY; ///< progress bar doesn't appear before this time has elapsed (in sec) }; class EmptySpecialActions : public SpecialActions { public: EmptySpecialActions () : _matrix(1) {_svg.newPage(1);} double getX () const override {return 0;} double getY () const override {return 0;} void setX (double x) override {} void setY (double y) override {} void finishLine () override {} void setColor (const Color &color) override {} void setBgColor (const Color &color) override {} Color getColor () const override {return Color::BLACK;} void setMatrix (const Matrix &m) override {} const Matrix& getMatrix () const override {return _matrix;} const SVGTree& svgTree () const override {return _svg;} BoundingBox& bbox () override {return _bbox;} BoundingBox& bbox (const std::string &name, bool reset=false) override {return _bbox;} void embed (const BoundingBox &bbox) override {} void embed (const DPair &p, double r=0) override {} unsigned getCurrentPageNumber() const override {return 0;} FilePath getSVGFilePath (unsigned pageno) const override {return FilePath();} std::string getBBoxFormatString () const override {return "";} private: BoundingBox _bbox; Matrix _matrix; SVGTree _svg; }; #endif dvisvgm-2.8.1/src/VFReader.hpp0000664000175000017500000000456513510660062013073 00000000000000/************************************************************************* ** VFReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef VFREADER_HPP #define VFREADER_HPP #include "MessageException.hpp" #include "StreamReader.hpp" struct VFException : public MessageException { explicit VFException (const std::string &msg) : MessageException(msg) {} }; struct VFActions; class VFReader : public StreamReader{ using ApproveAction = bool (*)(int); public: explicit VFReader (std::istream &is); VFActions* replaceActions (VFActions *a); bool executeAll (); bool executePreambleAndFontDefs (); bool executeCharDefs (); protected: int executeCommand (ApproveAction approve=nullptr); // the following methods represent the VF commands // they are called by executeCommand and should not be used directly void cmdPre (); void cmdPost (); void cmdShortChar (int pl); void cmdLongChar (); void cmdFontDef (int len); private: VFActions *_actions=nullptr; ///< actions to execute when reading a VF command double _designSize=0; ///< design size of currently read VF in PS points }; #endif dvisvgm-2.8.1/src/PreScanDVIReader.cpp0000664000175000017500000000362013510660062014440 00000000000000/************************************************************************* ** PreScanDVIReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "DVIActions.hpp" #include "PreScanDVIReader.hpp" using namespace std; PreScanDVIReader::PreScanDVIReader (std::istream &is, DVIActions *actions) : BasicDVIReader(is), _actions(actions), _currentPageNumber(0) { } void PreScanDVIReader::cmdBop (int) { _currentPageNumber++; BasicDVIReader::cmdBop(0); } void PreScanDVIReader::cmdXXX (int len) { uint32_t numBytes = readUnsigned(len); string s = readString(numBytes); if (_actions) _actions->special(s, 0, true); // pre-process special } dvisvgm-2.8.1/src/CMap.hpp0000664000175000017500000001052213510660062012243 00000000000000/************************************************************************* ** CMap.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef CMAP_HPP #define CMAP_HPP #include #include #include #include "FontEncoding.hpp" #include "RangeMap.hpp" struct CMap : public NamedFontEncoding { virtual bool vertical () const =0; virtual bool mapsToCID () const =0; virtual uint32_t cid (uint32_t c) const =0; virtual uint32_t bfcode (uint32_t cid) const =0; virtual std::string getROString () const =0; const char* path () const override; const FontEncoding* findCompatibleBaseFontMap (const PhysicalFont *font, CharMapID &charmapID) const override; bool mapsToCharIndex () const override {return mapsToCID();} Character decode (uint32_t c) const override { if (mapsToCID()) return Character(Character::INDEX, cid(c)); return Character(Character::CHRCODE, bfcode(c)); } }; struct IdentityCMap : public CMap { uint32_t cid (uint32_t c) const override {return c;} uint32_t bfcode (uint32_t cid) const override {return 0;} std::string getROString () const override {return "Adobe-Identity";} bool mapsToCID() const override {return true;} }; struct IdentityHCMap : public IdentityCMap { bool vertical () const override {return false;} const char* name () const override {return "Identity-H";} }; struct IdentityVCMap : public IdentityCMap { bool vertical () const override {return true;} const char* name () const override {return "Identity-V";} }; struct UnicodeCMap : public CMap { bool vertical () const override {return false;} const char* name () const override {return "unicode";} bool mapsToCID () const override {return false;} const char* path () const override {return nullptr;} uint32_t cid (uint32_t c) const override {return c;} uint32_t bfcode (uint32_t cid) const override {return cid;} std::string getROString () const override {return "";} }; class SegmentedCMap : public CMap { friend class CMapReader; public: explicit SegmentedCMap (std::string fname) : _filename(std::move(fname)) {} const char* name () const override {return _filename.c_str();} uint32_t cid (uint32_t c) const override; uint32_t bfcode (uint32_t cid) const override; void addCIDRange (uint32_t first, uint32_t last, uint32_t cid) {_cidranges.addRange(first, last, cid);} void addBFRange (uint32_t first, uint32_t last, uint32_t chrcode) {_bfranges.addRange(first, last, chrcode);} void write (std::ostream &os) const; bool vertical () const override {return _vertical;} bool mapsToCID () const override {return _mapsToCID;} size_t numCIDRanges () const {return _cidranges.numRanges();} size_t numBFRanges () const {return _bfranges.numRanges();} std::string getROString () const override; private: std::string _filename; std::string _registry; std::string _ordering; CMap *_basemap = nullptr; bool _vertical = false; bool _mapsToCID = true; // true: chrcode->CID, false: CID->charcode RangeMap _cidranges; RangeMap _bfranges; }; #endif dvisvgm-2.8.1/src/InputReader.hpp0000664000175000017500000001013013510660062013640 00000000000000/************************************************************************* ** InputReader.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef INPUTREADER_HPP #define INPUTREADER_HPP #include #include #include #include #include "InputBuffer.hpp" class InputReader { public: virtual ~InputReader() =default; virtual int get () =0; virtual int peek () const =0; virtual int peek (size_t n) const =0; virtual bool eof () const =0; virtual bool check (char c) const {return peek() == c;} virtual bool check (const char *s, bool consume=true); virtual void skip (size_t n); virtual bool skipUntil (const char *str); virtual std::string readUntil (const char *str); virtual int find (char c) const; virtual void skipSpace (); virtual int getInt (); virtual bool parseInt (int &val, bool accept_sign=true); virtual bool parseUInt (int base, unsigned &val); virtual bool parseUInt (unsigned &val); virtual char parseDouble (double &val); virtual double getDouble (); virtual std::string getWord (); virtual char getPunct (); virtual std::string getQuotedString (const char *quotechars); virtual std::string getString (); virtual std::string getString (size_t n); virtual std::string getString (const char *delim); virtual std::string getLine (); virtual int parseAttributes (std::map &attr, bool requireValues, const char *quotechars=nullptr); virtual operator bool () const {return !eof();} }; class StreamInputReader : public InputReader { public: explicit StreamInputReader (std::istream &is) : _is(is) {} int get () override {return _is.get();} int peek () const override {return _is.peek();} int peek (size_t n) const override; bool eof () const override {return !_is || _is.eof();} std::istream& getStream () {return _is;} private: std::istream &_is; }; class BufferInputReader : public InputReader { public: explicit BufferInputReader (InputBuffer &ib) : _ib(&ib) {} void assign (InputBuffer &ib) {_ib = &ib;} int get () override {return _ib->get();} int peek () const override {return _ib->peek();} int peek (size_t n) const override {return _ib->peek(n);} bool eof () const override {return _ib->eof();} private: InputBuffer *_ib; }; /** Implementation of the Knuth-Morris-Pratt search algorithm. * http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm */ class StringMatcher { public: StringMatcher () : _charsRead(0) {} explicit StringMatcher (const std::string &pattern) : _charsRead(0) {setPattern(pattern);} void setPattern (const std::string &pattern); bool match (InputReader &ir); std::string read (InputReader &ir); size_t charsRead () const {return _charsRead;} private: std::string _pattern; std::vector _borders; size_t _charsRead; }; #endif dvisvgm-2.8.1/src/SourceInput.cpp0000664000175000017500000001101713510660062013676 00000000000000/************************************************************************* ** SourceInput.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileSystem.hpp" #include "Message.hpp" #include "MessageException.hpp" #include "SourceInput.hpp" #include "utility.hpp" #ifdef _WIN32 # include # include # include #else # include # ifdef HAVE_UMASK # include # endif #endif #ifdef _MSC_VER # include #else # include # include #endif using namespace std; #ifdef _WIN32 static int fdwrite (int fd, const char *buf, size_t len) {return _write(fd, buf, len);} static int fdclose (int fd) {return _close(fd);} #else static int fdwrite (int fd, const char *buf, size_t len) {return write(fd, buf, len);} static int fdclose (int fd) {return close(fd);} #endif /** Creates a new temporary file in the configured tmp folder. * If the object already holds an opened temporary file, it's closed * and removed before creating the new one. * @return true on success */ bool TemporaryFile::create () { if (opened()) close(); _path = FileSystem::tmpdir(); #ifndef _WIN32 _path += "stdinXXXXXX"; #ifdef HAVE_UMASK mode_t mode_mask = umask(S_IXUSR | S_IRWXG | S_IRWXO); // set file permissions to 0600 #endif _fd = mkstemp(&_path[0]); #ifdef HAVE_UMASK umask(mode_mask); #endif #else // !_WIN32 char fname[MAX_PATH]; std::replace(_path.begin(), _path.end(), '/', '\\'); if (GetTempFileName(_path.c_str(), "stdin", 0, fname)) { _fd = _open(fname, _O_CREAT | _O_WRONLY | _O_BINARY, _S_IWRITE); _path = fname; } #endif return opened(); } /** Writes a sequence of characters to the file. * @param[in] buf buffer containing the characters to write * @param[in] len number of characters to write * @return true on success */ bool TemporaryFile::write (const char *buf, size_t len) { return opened() && fdwrite(_fd, buf, len) >= 0; } /** Closes and removes the temporary file. * @return true on success */ bool TemporaryFile::close () { bool ok = true; if (opened()) { ok = (fdclose(_fd) >= 0); FileSystem::remove(_path); _fd = -1; _path.clear(); } return ok; } //////////////////////////////////////////////////////////////// istream& SourceInput::getInputStream (bool showMessages) { if (!_ifs.is_open()) { if (!_fname.empty()) _ifs.open(_fname, ios::binary); else { #ifdef _WIN32 if (_setmode(_fileno(stdin), _O_BINARY) == -1) throw MessageException("can't open stdin in binary mode"); #endif if (!_tmpfile.create()) throw MessageException("can't create temporary file for writing"); if (showMessages) Message::mstream() << "reading from " << getMessageFileName() << '\n'; char buf[1024]; while (cin) { cin.read(buf, 1024); size_t count = cin.gcount(); if (!_tmpfile.write(buf, count)) throw MessageException("failed to write data to temporary file"); } _ifs.open(_tmpfile.path(), ios::binary); } } return _ifs; } string SourceInput::getFileName () const { return _fname.empty() ? "stdin" : _fname; } string SourceInput::getMessageFileName () const { return _fname.empty() ? "" : _fname; } string SourceInput::getFilePath () const { return _tmpfile.path().empty() ? _fname : _tmpfile.path(); } dvisvgm-2.8.1/src/HashFunction.hpp0000664000175000017500000000476613536436567014054 00000000000000/************************************************************************* ** HashFunction.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef HASHFUNCTION_HPP #define HASHFUNCTION_HPP #include #include #include #include /** Common base class for all hash functions. */ class HashFunction { public: virtual ~HashFunction () =default; virtual int digestSize () const =0; virtual void reset () =0; virtual void update (const char *data, size_t length) =0; virtual void update (const std::string &data) =0; virtual void update (const std::vector &data) =0; virtual std::vector digestValue () const =0; void update (std::istream &is); std::string digestString () const; static std::vector supportedAlgorithms (); static bool isSupportedAlgorithm (const std::string &algo); static std::unique_ptr create (const std::string &name); static std::unique_ptr create (const std::string &name, const char *data, size_t length); static std::unique_ptr create (const std::string &name, const std::string &data); static std::unique_ptr create (const std::string &name, const std::vector &data); }; #endif dvisvgm-2.8.1/src/DVIToSVG.cpp0000664000175000017500000005146713553267757012765 00000000000000/************************************************************************* ** DVIToSVG.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include #include "Calculator.hpp" #include "DVIToSVG.hpp" #include "DVIToSVGActions.hpp" #include "FileSystem.hpp" #include "Font.hpp" #include "FontManager.hpp" #include "GlyphTracerMessages.hpp" #include "InputBuffer.hpp" #include "InputReader.hpp" #include "PageRanges.hpp" #include "PageSize.hpp" #include "PreScanDVIReader.hpp" #include "SignalHandler.hpp" #include "optimizer/SVGOptimizer.hpp" #include "SVGOutput.hpp" #include "utility.hpp" #include "version.hpp" #include "XXHashFunction.hpp" /////////////////////////////////// // special handlers #include "BgColorSpecialHandler.hpp" #include "ColorSpecialHandler.hpp" #include "DvisvgmSpecialHandler.hpp" #include "EmSpecialHandler.hpp" #include "HtmlSpecialHandler.hpp" #include "PapersizeSpecialHandler.hpp" #include "PdfSpecialHandler.hpp" #include "TpicSpecialHandler.hpp" #ifndef HAVE_LIBGS #include "NoPsSpecialHandler.hpp" #endif #ifndef DISABLE_GS #include "PsSpecialHandler.hpp" #endif /////////////////////////////////// using namespace std; /** 'a': trace all glyphs even if some of them are already cached * 'm': trace missing glyphs, i.e. glyphs not yet cached * 0 : only trace actually required glyphs */ char DVIToSVG::TRACE_MODE = 0; bool DVIToSVG::COMPUTE_PROGRESS = false; DVIToSVG::HashSettings DVIToSVG::PAGE_HASH_SETTINGS; DVIToSVG::DVIToSVG (istream &is, SVGOutputBase &out) : DVIReader(is), _out(out) { _pageHeight = _pageWidth = 0; _tx = _ty = 0; // no cursor translation _pageByte = 0; _prevXPos = _prevYPos = numeric_limits::min(); _prevWritingMode = WritingMode::LR; _actions = util::make_unique(*this, _svg); } /** Starts the conversion process. * @param[in] first number of first page to convert * @param[in] last number of last page to convert * @param[in] hashFunc pointer to function to be used to compute page hashes */ void DVIToSVG::convert (unsigned first, unsigned last, HashFunction *hashFunc) { if (first > last) swap(first, last); if (first > numberOfPages()) { ostringstream oss; oss << "file contains only " << numberOfPages() << " page"; if (numberOfPages() > 1) oss << 's'; throw DVIException(oss.str()); } last = min(last, numberOfPages()); bool computeHashes = (hashFunc && !_out.ignoresHashes()); string shortenedOptHash = XXH32HashFunction(PAGE_HASH_SETTINGS.optionsHash()).digestString(); for (unsigned i=first; i <= last; ++i) { string dviHash, combinedHash; if (computeHashes) { computePageHash(i, *hashFunc); dviHash = hashFunc->digestString(); hashFunc->update(PAGE_HASH_SETTINGS.optionsHash()); combinedHash = hashFunc->digestString(); } const SVGOutput::HashTriple hashTriple(dviHash, shortenedOptHash, combinedHash); FilePath path = _out.filepath(i, numberOfPages(), hashTriple); if (!dviHash.empty() && !PAGE_HASH_SETTINGS.isSet(HashSettings::P_REPLACE) && path.exists()) { Message::mstream(false, Message::MC_PAGE_NUMBER) << "skipping page " << i; Message::mstream().indent(1); Message::mstream(false, Message::MC_PAGE_WRITTEN) << "\nfile " << path.shorterAbsoluteOrRelative() << " exists\n"; Message::mstream().indent(0); } else { executePage(i); SVGOptimizer(_svg).execute(); embedFonts(_svg.rootNode()); bool success = _svg.write(_out.getPageStream(currentPageNumber(), numberOfPages(), hashTriple)); string fname = path.shorterAbsoluteOrRelative(); if (fname.empty()) fname = ""; if (success) Message::mstream(false, Message::MC_PAGE_WRITTEN) << "\noutput written to " << fname << '\n'; else Message::wstream(true) << "failed to write output to " << fname << '\n'; _svg.reset(); _actions->reset(); } } } /** Creates a HashFunction object for a given algorithm name. * @param[in] algo name of hash algorithm * @return pointer to hash function * @throw MessageException if algorithm name is invalid or not supported */ static unique_ptr create_hash_function (const string &algo) { if (auto hashFunc = HashFunction::create(algo)) return hashFunc; string msg = "unknown hash algorithm '"+algo+"' (supported algorithms: "; for (const string &name : HashFunction::supportedAlgorithms()) msg += name + ", "; msg.pop_back(); msg.back() = ')'; throw MessageException(msg); } /** Convert DVI pages specified by a page range string. * @param[in] rangestr string describing the pages to convert * @param[out] pageinfo (number of converted pages, number of total pages) */ void DVIToSVG::convert (const string &rangestr, pair *pageinfo) { PageRanges ranges; if (!ranges.parse(rangestr, numberOfPages())) throw MessageException("invalid page range format"); Message::mstream(false, Message::MC_PAGE_NUMBER) << "pre-processing DVI file (format version " << getDVIVersion() << ")\n"; if (auto actions = dynamic_cast(_actions.get())) { PreScanDVIReader prescan(getInputStream(), actions); actions->setDVIReader(prescan); prescan.executeAllPages(); actions->setDVIReader(*this); SpecialManager::instance().notifyPreprocessingFinished(); } unique_ptr hashFunc; if (!PAGE_HASH_SETTINGS.algorithm().empty()) // name of hash algorithm present? hashFunc = create_hash_function(PAGE_HASH_SETTINGS.algorithm()); for (const auto &range : ranges) convert(range.first, range.second, hashFunc.get()); if (pageinfo) { pageinfo->first = ranges.numberOfPages(); pageinfo->second = numberOfPages(); } } /** Writes the hash values of a selected set of pages to an output stream. * @param[in] rangestr string describing the pages to convert * @param[in,out] os stream the output is written to */ void DVIToSVG::listHashes (const string &rangestr, std::ostream &os) { PageRanges ranges; if (!ranges.parse(rangestr, numberOfPages())) throw MessageException("invalid page range format"); XXH32HashFunction xxh32; auto hashFunc = create_hash_function(PAGE_HASH_SETTINGS.algorithm()); int width1 = util::ilog10(numberOfPages())+1; int width2 = hashFunc->digestSize()*2; int spaces1 = width1+2+(width2-3)/2; int spaces2 = width1+2+width2+2-spaces1-3+(width2-7)/2; string shortenedOptHash = XXH32HashFunction(PAGE_HASH_SETTINGS.optionsHash()).digestString(); os << string(spaces1, ' ') << "DVI" << string(spaces2, ' ') << "DVI+opt\n"; for (const auto &range : ranges) { for (int i=range.first; i <= range.second; i++) { computePageHash(i, *hashFunc); os << setw(width1) << i; os << ": " << hashFunc->digestString(); hashFunc->update(PAGE_HASH_SETTINGS.optionsHash()); os << ", " << hashFunc->digestString() << '\n'; } } os << "hash algorithm: " << PAGE_HASH_SETTINGS.algorithm() << ", options hash: " << shortenedOptHash << '\n'; } int DVIToSVG::executeCommand () { SignalHandler::instance().check(); const streampos cmdpos = tell(); int opcode = DVIReader::executeCommand(); if (dviState().v+_ty != _prevYPos) { _tx = _ty = 0; _prevYPos = dviState().v; } _prevXPos = dviState().h+_tx; _prevWritingMode = dviState().d; if (COMPUTE_PROGRESS && inPage() && _actions) { size_t pagelen = numberOfPageBytes(currentPageNumber()-1); _pageByte += tell()-cmdpos; _actions->progress(_pageByte, pagelen); } return opcode; } /** This template method is called by parent class DVIReader before * executing the BOP actions. * @param[in] pageno physical page number (1 = first page) * @param[in] c contains information about the page (page number etc.) */ void DVIToSVG::enterBeginPage (unsigned pageno, const vector &c) { if (dynamic_cast(_actions.get())) { Message::mstream().indent(0); Message::mstream(false, Message::MC_PAGE_NUMBER) << "processing page " << pageno; if (pageno != (unsigned)c[0]) // Does page number shown on page differ from physical page number? Message::mstream(false) << " [" << c[0] << ']'; Message::mstream().indent(1); _svg.appendToDoc(util::make_unique(" This file was generated by dvisvgm " + string(PROGRAM_VERSION) + " ")); } } /** This template method is called by DVIReader::cmdEop() after * executing the EOP actions. */ void DVIToSVG::leaveEndPage (unsigned) { if (!dynamic_cast(_actions.get())) return; // set bounding box and apply page transformations BoundingBox bbox = _actions->bbox(); // bounding box derived from the DVI commands executed if (_bboxFormatString == "min" || _bboxFormatString == "preview" || _bboxFormatString == "papersize") { bbox.unlock(); bbox.transform(getPageTransformation()); } else if (_bboxFormatString == "dvi") { // center page content double dx = (_pageWidth-bbox.width())/2; double dy = (_pageHeight-bbox.height())/2; bbox += BoundingBox(-dx, -dy, dx, dy); } else if (_bboxFormatString != "none") { istringstream iss(_bboxFormatString); StreamInputReader ir(iss); ir.skipSpace(); if (isalpha(ir.peek())) { // set explicitly given page format PageSize size(_bboxFormatString); if (size.valid()) { // convention: DVI position (0,0) equals (1in, 1in) relative // to the upper left vertex of the page (see DVI specification) const double border = -72; bbox = BoundingBox(border, border, size.width().bp()+border, size.height().bp()+border); } } else { // set/modify bounding box by explicitly given values try { vector lengths = BoundingBox::extractLengths(_bboxFormatString); if (lengths.size() == 1 || lengths.size() == 2) { // relative box size? // apply the page transformation and adjust the bbox afterwards bbox.transform(getPageTransformation()); } bbox.set(lengths); } catch (const MessageException &e) { } } } if (bbox.width() == 0) Message::wstream(false) << "\npage is empty\n"; if (_bboxFormatString != "none") { _svg.setBBox(bbox); const double bp2pt = 72.27/72; const double bp2mm = 25.4/72; Message::mstream(false) << '\n'; Message::mstream(false, Message::MC_PAGE_SIZE) << "graphic size: " << XMLString(bbox.width()*bp2pt) << "pt" " x " << XMLString(bbox.height()*bp2pt) << "pt" " (" << XMLString(bbox.width()*bp2mm) << "mm" " x " << XMLString(bbox.height()*bp2mm) << "mm)"; Message::mstream(false) << '\n'; } } Matrix DVIToSVG::getPageTransformation () const { Matrix matrix(1); // unity matrix if (!_transCmds.empty()) { Calculator calc; if (_actions) { const double bp2pt = (1_bp).pt(); BoundingBox &bbox = _actions->bbox(); calc.setVariable("ux", bbox.minX()*bp2pt); calc.setVariable("uy", bbox.minY()*bp2pt); calc.setVariable("w", bbox.width()*bp2pt); calc.setVariable("h", bbox.height()*bp2pt); } // add constants for length units to calculator for (const auto &unit : Length::getUnits()) calc.setVariable(unit.first, Length(1, unit.second).pt()); matrix.set(_transCmds, calc); } return matrix; } static void collect_chars (unordered_map> &fontmap) { unordered_map> insertedChars; for (const auto &entry : fontmap) { const Font *unique_font = entry.first->uniqueFont(); if (unique_font != entry.first) { for (int c : entry.second) insertedChars[unique_font].insert(c); } } for (const auto &entry : insertedChars) fontmap[entry.first].insert(entry.second.begin(), entry.second.end()); } /** Adds the font information to the SVG tree. * @param[in] svgElement the font nodes are added to this node */ void DVIToSVG::embedFonts (XMLElement *svgElement) { if (!svgElement || !_actions) // no dvi actions => no chars written => no fonts to embed return; const DVIToSVGActions *svgActions = static_cast(_actions.get()); auto &usedCharsMap = svgActions->getUsedChars(); collect_chars(usedCharsMap); GlyphTracerMessages messages; unordered_set tracedFonts; // collect unique fonts already traced for (const auto &fontchar : usedCharsMap) { const Font *font = fontchar.first; if (auto ph_font = dynamic_cast(font)) { // Check if glyphs should be traced. Only trace the glyphs of unique fonts, i.e. // avoid retracing the same glyphs again if they are referenced in various sizes. if (TRACE_MODE != 0 && tracedFonts.find(ph_font->uniqueFont()) == tracedFonts.end()) { ph_font->traceAllGlyphs(TRACE_MODE == 'a', &messages); tracedFonts.insert(ph_font->uniqueFont()); } if (font->path()) // does font file exist? _svg.append(*ph_font, fontchar.second, &messages); else Message::wstream(true) << "can't embed font '" << font->name() << "'\n"; } else Message::wstream(true) << "can't embed font '" << font->name() << "'\n"; } _svg.appendFontStyles(svgActions->getUsedFonts()); } /** Enables or disables processing of specials. If ignorelist == 0, all * supported special handlers are loaded. To disable selected sets of specials, * the corresponding prefixes can be given separated by non alpha-numeric characters, * e.g. "color, ps, em" or "color: ps em" etc. * A single "*" in the ignore list disables all specials. * @param[in] ignorelist list of special prefixes to ignore * @param[in] pswarning if true, shows warning about disabled PS support * @return the SpecialManager that handles special statements */ void DVIToSVG::setProcessSpecials (const char *ignorelist, bool pswarning) { if (ignorelist && strcmp(ignorelist, "*") == 0) // ignore all specials? SpecialManager::instance().unregisterHandlers(); else { // add special handlers vector> handlers; handlers.emplace_back(util::make_unique()); // handles background color special handlers.emplace_back(util::make_unique()); // handles color specials handlers.emplace_back(util::make_unique()); // handles raw SVG embeddings handlers.emplace_back(util::make_unique()); // handles emTeX specials handlers.emplace_back(util::make_unique()); // handles hyperref specials handlers.emplace_back(util::make_unique()); // handles papersize special handlers.emplace_back(util::make_unique()); // handles pdf specials handlers.emplace_back(util::make_unique()); // handles tpic specials #ifndef DISABLE_GS if (Ghostscript().available()) handlers.emplace_back(util::make_unique()); // handles PostScript specials else #endif { #ifndef HAVE_LIBGS // dummy PS special handler that only prints warning messages handlers.emplace_back(util::make_unique()); if (pswarning) { #ifdef DISABLE_GS Message::wstream() << "processing of PostScript specials has been disabled permanently\n"; #else Message::wstream() << "processing of PostScript specials is disabled (Ghostscript not found)\n"; #endif } #endif } SpecialManager::instance().unregisterHandlers(); SpecialManager::instance().registerHandlers(handlers, ignorelist); } } FilePath DVIToSVG::getSVGFilePath (unsigned pageno) const { return _out.filepath(pageno, numberOfPages()); } void DVIToSVG::moveRight (double dx, MoveMode mode) { DVIReader::moveRight(dx, mode); if (_actions) { if (dviState().d == WritingMode::LR) _actions->moveToX(dviState().h+_tx, mode == MoveMode::CHANGEPOS); else _actions->moveToY(dviState().v+_ty, mode == MoveMode::CHANGEPOS); } } void DVIToSVG::moveDown (double dy, MoveMode mode) { DVIReader::moveDown(dy, mode); if (_actions) { if (dviState().d == WritingMode::LR) _actions->moveToY(dviState().v+_ty, mode == MoveMode::CHANGEPOS); else _actions->moveToX(dviState().h+_tx, mode == MoveMode::CHANGEPOS); } } void DVIToSVG::dviPost (uint16_t, uint16_t pages, uint32_t pw, uint32_t ph, uint32_t, uint32_t, uint32_t, uint32_t) { _pageHeight = ph; // height of tallest page in dvi units _pageWidth = pw; // width of widest page in dvi units } void DVIToSVG::dviBop (const std::vector &c, int32_t) { _pageByte = 0; enterBeginPage(currentPageNumber(), c); if (_actions) { _actions->progress(0, 1); // ensure that progress is called at 0% _actions->beginPage(currentPageNumber(), c); } } void DVIToSVG::dviEop () { if (_actions) { _actions->endPage(currentPageNumber()); _pageByte = numberOfPageBytes(currentPageNumber()-1); _actions->progress(_pageByte, _pageByte); // ensure that progress is called at 100% } leaveEndPage(currentPageNumber()); } void DVIToSVG::dviSetChar0 (uint32_t c, const Font *font) { if (_actions && !dynamic_cast(font)) _actions->setChar(dviState().h+_tx, dviState().v+_ty, c, dviState().d != WritingMode::LR, *font); } void DVIToSVG::dviSetChar (uint32_t c, const Font *font) { dviSetChar0(c, font); } void DVIToSVG::dviPutChar (uint32_t c, const Font *font) { dviSetChar0(c, font); } void DVIToSVG::dviSetRule (double height, double width) { if (_actions && height > 0 && width > 0) _actions->setRule(dviState().h+_tx, dviState().v+_ty, height, width); } void DVIToSVG::dviPutRule (double height, double width) { dviSetRule(height, width); } void DVIToSVG::dviPop () { if (_actions) { if (_prevXPos != dviState().h+_tx) _actions->moveToX(dviState().h + _tx, true); // force setting the SVG position if (_prevYPos != dviState().v+_ty) _actions->moveToY(dviState().v + _ty, true); // force setting the SVG position if (_prevWritingMode != dviState().d) _actions->setTextOrientation(dviState().d != WritingMode::LR); } } void DVIToSVG::dviFontNum (uint32_t fontnum, SetFontMode, const Font *font) { if (_actions && font && !dynamic_cast(font)) _actions->setFont(FontManager::instance().fontID(fontnum), *font); // all fonts get a recomputed ID } void DVIToSVG::dviDir (WritingMode dir) { if (_actions) _actions->setTextOrientation(dir != WritingMode::LR); } void DVIToSVG::dviXXX (const std::string &str) { if (_actions) _actions->special(str, dvi2bp()); } void DVIToSVG::dviXGlyphArray (std::vector &dx, vector &dy, vector &glyphs, const Font &font) { if (_actions) { for (size_t i=0; i < glyphs.size(); i++) _actions->setChar(dviState().h+dx[i]+_tx, dviState().v+dy[i]+_ty, glyphs[i], false, font); } } void DVIToSVG::dviXGlyphString (vector &dx, vector &glyphs, const Font &font) { if (_actions) { for (size_t i=0; i < glyphs.size(); i++) _actions->setChar(dviState().h+dx[i]+_tx, dviState().v+_ty, glyphs[i], false, font); } } void DVIToSVG::dviXTextAndGlyphs (vector &dx, vector &dy, vector&, vector &glyphs, const Font &font) { dviXGlyphArray(dx, dy, glyphs, font); } /////////////////////////////////////////////////////////////// /** Parses a string consisting of comma-separated words, and assigns * the values to the hash settings. */ void DVIToSVG::HashSettings::setParameters (const string ¶mstr) { auto paramnames = util::split(paramstr, ","); map paramMap = { {"list", P_LIST}, {"replace", P_REPLACE} }; for (string &name : paramnames) { name = util::trim(name); auto it = paramMap.find(name); if (it != paramMap.end()) _params.insert(it->second); else if (_algo.empty() && HashFunction::isSupportedAlgorithm(name)) _algo = name; else if (!name.empty()) { string msg = "invalid hash parameter '"+name+"' (supported algorithms: "; for (string str : HashFunction::supportedAlgorithms()) msg += str + ", "; msg.pop_back(); msg.pop_back(); msg += ')'; throw MessageException(msg); } } // set default hash algorithm if none is given if (_algo.empty()) _algo = "xxh64"; } dvisvgm-2.8.1/src/FontStyle.hpp0000664000175000017500000000343713510660062013361 00000000000000/************************************************************************* ** FontStyle.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef FONTSTYLE #define FONTSTYLE struct FontStyle { FontStyle () : bold(0), extend(1), slant(0) {} FontStyle (float b, float e, float s) : bold(b), extend(e), slant(s) {} double bold; ///< stroke width in pt used to draw the glyph outlines double extend; ///< factor to strech/shrink the glyphs horizontally double slant; ///< horizontal slanting/skewing value (= tan(phi)) }; #endif dvisvgm-2.8.1/src/System.hpp0000664000175000017500000000274713510660062012721 00000000000000/************************************************************************* ** System.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SYSTEM_HPP #define SYSTEM_HPP namespace System { double time (); } #endif dvisvgm-2.8.1/src/MD5HashFunction.hpp0000664000175000017500000000522013536435574014341 00000000000000/************************************************************************* ** MD5HashFunction.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MD5HASHFUNCTION_HPP #define MD5HASHFUNCTION_HPP #include #ifdef HAVE_OPENSSL_MD5_H # include #else # include #endif #include "HashFunction.hpp" class MD5HashFunction : public HashFunction { public: MD5HashFunction () {MD5_Init(&_context);} MD5HashFunction (const char *data, size_t length) : MD5HashFunction() {update(data, length);} explicit MD5HashFunction (const std::string &data) : MD5HashFunction() {update(data);} explicit MD5HashFunction (const std::vector &data) : MD5HashFunction() {update(data);} int digestSize () const override {return 16;} void reset () override {MD5_Init(&_context);} void update (const char *data, size_t length) override {MD5_Update(&_context, data, length);} void update (const std::string &data) override {update(data.data(), data.length());} void update (const std::vector &data) override {update(reinterpret_cast(data.data()), data.size());} std::vector digestValue () const override { std::vector hash(16); MD5_CTX savedContext = _context; MD5_Final(hash.data(), &_context); // also erases the context structure _context = savedContext; return hash; } private: mutable MD5_CTX _context; }; #endif dvisvgm-2.8.1/src/SVGCharPathHandler.cpp0000664000175000017500000001316213510660062014771 00000000000000/************************************************************************* ** SVGCharPathHandler.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Font.hpp" #include "FontManager.hpp" #include "SVGCharPathHandler.hpp" #include "utility.hpp" #include "XMLNode.hpp" using namespace std; /** Constructs a new path builder. * @param[in] createUseElements determines whether to create "use" elements to reference previous paths or not * @param[in] relativePathCommands determines whether to create relative or absolute SVG path commands */ SVGCharPathHandler::SVGCharPathHandler (bool createUseElements, bool relativePathCommands) : _relativePathCommands(relativePathCommands) { if (createUseElements) _appendChar = &SVGCharPathHandler::appendUseElement; else _appendChar = &SVGCharPathHandler::appendPathElement; } void SVGCharPathHandler::resetContextNode () { SVGCharHandler::resetContextNode(); _groupNode = nullptr; } /** Appends the path representation of a single character to the context element. * @param[in] c code of the character to be appended * @param[in] x horizontal position of the character (in bp units) * @param[in] y vertical position of the character (in bp units) */ void SVGCharPathHandler::appendChar (uint32_t c, double x, double y) { if (_font.changed()) { _fontColor.set(_font.get()->color()); if (_fontColor.changed() && _fontColor.get() != Color::BLACK) _color.changed(true); // ensure application of text color when resetting the font color to black _font.changed(false); } // Apply text color changes only if the color of the entire font is black. // Glyphs of non-black fonts (e.g. defined in a XeTeX document) can't change their color. CharProperty &color = (_fontColor.get() != Color::BLACK) ? _fontColor : _color; bool applyColor = color.get() != Color::BLACK; bool applyMatrix = !_matrix.get().isIdentity(); if (!_groupNode) { color.changed(applyColor); _matrix.changed(applyMatrix); } if (color.changed() || _matrix.changed()) { resetContextNode(); if (applyColor || applyMatrix) { _groupNode = pushContextNode(util::make_unique("g")); if (applyColor) contextNode()->addAttribute("fill", color.get().svgColorString()); if (applyMatrix) contextNode()->addAttribute("transform", _matrix.get().toSVG()); } color.changed(false); _matrix.changed(false); } const Font *font = _font.get(); if (font->verticalLayout()) { // move glyph graphics so that its origin is located at the top center position GlyphMetrics metrics; font->getGlyphMetrics(c, _vertical, metrics); x -= metrics.wl; if (auto pf = dynamic_cast(font)) { // Center glyph between top and bottom border of the TFM box. // This is just an approximation used until I find a way to compute // the exact location in vertical mode. GlyphMetrics exact_metrics; pf->getExactGlyphBox(c, exact_metrics, false); y += exact_metrics.h+(metrics.d-exact_metrics.h-exact_metrics.d)/2; } else y += metrics.d; } Matrix rotation(1); if (_vertical && !font->verticalLayout()) { // alphabetic text designed for horizontal mode // must be rotated by 90 degrees if in vertical mode rotation.translate(-x, -y); rotation.rotate(90); rotation.translate(x, y); } (this->*_appendChar)(c, x, y, rotation); } void SVGCharPathHandler::appendUseElement (uint32_t c, double x, double y, const Matrix &matrix) { string id = "#g" + to_string(FontManager::instance().fontID(_font)) + "-" + to_string(c); auto useNode = util::make_unique("use"); useNode->addAttribute("x", XMLString(x)); useNode->addAttribute("y", XMLString(y)); useNode->addAttribute("xlink:href", id); if (!matrix.isIdentity()) useNode->addAttribute("transform", matrix.toSVG()); contextNode()->append(std::move(useNode)); } void SVGCharPathHandler::appendPathElement (uint32_t c, double x, double y, const Matrix &matrix) { Glyph glyph; auto pf = dynamic_cast(_font.get()); if (pf && pf->getGlyph(c, glyph)) { double sx = pf->scaledSize()/pf->unitsPerEm(); double sy = -sx; ostringstream oss; glyph.writeSVG(oss, _relativePathCommands, sx, sy, x, y); auto glyphNode = util::make_unique("path"); glyphNode->addAttribute("d", oss.str()); if (!matrix.isIdentity()) glyphNode->addAttribute("transform", matrix.toSVG()); contextNode()->append(std::move(glyphNode)); } } dvisvgm-2.8.1/src/CMapManager.cpp0000664000175000017500000001231213511327144013532 00000000000000/************************************************************************* ** CMapManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "CMap.hpp" #include "CMapManager.hpp" #include "CMapReader.hpp" #include "FileFinder.hpp" #include "Font.hpp" #include "Message.hpp" using namespace std; CMapManager& CMapManager::instance () { static CMapManager cmm; return cmm; } /** Loads a cmap and returns the corresponding object. */ CMap* CMapManager::lookup (const string &name) { auto it = _cmaps.find(name); if (it != _cmaps.end()) return it->second.get(); if (_includedCMaps.find(name) != _includedCMaps.end()) { _level = 0; throw CMapReaderException("circular reference of CMap " + name); } unique_ptr cmap_ptr; if (name == "Identity-H") cmap_ptr = util::make_unique(); else if (name == "Identity-V") cmap_ptr = util::make_unique(); else if (name == "unicode") cmap_ptr = util::make_unique(); if (cmap_ptr) { CMap *ret = cmap_ptr.get(); _cmaps[name] = std::move(cmap_ptr); return ret; } // Load cmap data of file and also process all cmaps referenced by operator "usecmap". // This can lead to a sequence of further calls of lookup(). In order to prevent infinite loops // due to (disallowed) circular cmap inclusions, we keep track of all cmaps processed during // a sequence of inclusions. _includedCMaps.insert(name); // save name of current cmap being processed _level++; // increase nesting level CMap *ret=nullptr; try { CMapReader reader; if (!(cmap_ptr = reader.read(name))) { _level = 1; Message::wstream(true) << "CMap file '" << name << "' not found\n"; } ret = cmap_ptr.get(); _cmaps[name] = std::move(cmap_ptr); } catch (const CMapReaderException &e) { Message::estream(true) << "CMap file " << name << ": " << e.what() << "\n"; } if (--_level == 0) // back again at initial nesting level? _includedCMaps.clear(); // => names of included cmaps are no longer needed return ret; } /** Looks for a base font CMap and a compatible encoding table in a given font. The CMap describe * the mapping from CIDs to character codes where the latter are relative to the encoding table * identified by charmapID. * cmap:X->CID, bfmap:CID->Y, enctable:Y->CharCode * @param[in] font look for available encoding tables in this font * @param[in] cmap take the source registry-ordering pair from this CMap * @param[out] charmapID ID of the compatible character map found in the given font * @return base font CMap that maps from CIDs to character codes */ const CMap* CMapManager::findCompatibleBaseFontMap (const PhysicalFont *font, const CMap *cmap, CharMapID &charmapID) { if (!font || !cmap) return nullptr; struct CharMapIDToEncName { CharMapID id; const char *encname; }; const array encodings {{ {CharMapID::WIN_UCS4, "UCS4"}, {CharMapID::WIN_UCS2, "UCS2"}, {CharMapID::WIN_SHIFTJIS, "90ms-RKSJ"}, {CharMapID::WIN_PRC, "GBK-EUC"}, {CharMapID::WIN_BIG5, "ETen-B5"}, {CharMapID::WIN_WANSUNG, "KSCms-UHC"}, {CharMapID::MAC_JAPANESE, "90pv-RKSJ"}, {CharMapID::MAC_TRADCHINESE, "B5pc"}, {CharMapID::MAC_SIMPLCHINESE, "GBpc-EUC"}, {CharMapID::MAC_KOREAN, "KSCpc-EUC"} }}; // get IDs of all available charmaps in font vector charmapIDs; font->collectCharMapIDs(charmapIDs); // try to find a compatible encoding CMap const bool is_unicode_map = bool(dynamic_cast(cmap)); const string ro = cmap->getROString(); for (const CharMapIDToEncName &enc : encodings) { for (const CharMapID &id : charmapIDs) { if (enc.id == id) { string cmapname = ro+"-"+enc.encname; if (is_unicode_map || FileFinder::instance().lookup(cmapname, "cmap", false)) { charmapID = enc.id; return is_unicode_map ? cmap : lookup(cmapname); } } } } return nullptr; } dvisvgm-2.8.1/src/Message.cpp0000664000175000017500000001653513510660062013014 00000000000000/************************************************************************* ** Message.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "Message.hpp" #include "Terminal.hpp" using namespace std; MessageStream::MessageStream (std::ostream &os) noexcept : _os(&os), _nl(true) { Terminal::init(os); } MessageStream::~MessageStream () { if (_os && Message::COLORIZE) Terminal::finish(*_os); } void MessageStream::putChar (char c, ostream &os) { switch (c) { case '\r': os << '\r'; _nl = true; _col = 1; return; case '\n': if (!_nl) { _col = 1; _nl = true; os << '\n'; } return; default: if (_nl) { os << string(_indent, ' '); _col += _indent; } else { const int cols = Terminal::columns(); if (cols > 0 && _col >= cols) { #ifndef _WIN32 // move cursor to next line explicitly (not necessary in Windows/DOS terminal) os << '\n'; #endif os << string(_indent, ' '); _col = _indent+1; } else _col++; } _nl = false; if (!_nl || c != '\n') os << c; } } MessageStream& MessageStream::operator << (const char *str) { if (_os && str) { const char *first = str; while (*first) { const char *last = strchr(first, '\n'); if (!last) last = first+strlen(first)-1; #ifndef _WIN32 // move cursor to next line explicitly (not necessary in Windows/DOS terminal) const int cols = Terminal::columns(); int len = last-first+1; if (cols > 0 && _col+len > cols && _indent+len <= cols) putChar('\n', *_os); #endif while (first <= last) putChar(*first++, *_os); first = last+1; } } return *this; } MessageStream& MessageStream::operator << (const char &c) { if (_os) putChar(c, *_os); return *this; } void MessageStream::indent (bool reset) { if (reset) _indent = 0; _indent += 2; } void MessageStream::outdent (bool all) { if (all) _indent = 0; else if (_indent > 0) _indent -= 2; } void MessageStream::clearline () { if (_os) { int cols = Terminal::columns(); *_os << '\r' << string(cols ? cols-1 : 79, ' ') << '\r'; _nl = true; _col = 1; } } static MessageStream nullStream; static MessageStream messageStream(cerr); ////////////////////////////// // maximal verbosity int Message::LEVEL = Message::MESSAGES | Message::WARNINGS | Message::ERRORS; bool Message::COLORIZE = false; bool Message::_initialized = false; Message::Color Message::_classColors[9]; /** Returns the stream for usual messages. */ MessageStream& Message::mstream (bool prefix, MessageClass mclass) { init(); MessageStream *ms = (LEVEL & MESSAGES) ? &messageStream : &nullStream; if (COLORIZE && ms && ms->os()) { Terminal::fgcolor(_classColors[mclass].foreground, *ms->os()); Terminal::bgcolor(_classColors[mclass].background, *ms->os()); } if (prefix) *ms << "\nMESSAGE: "; return *ms; } /** Returns the stream for warning messages. */ MessageStream& Message::wstream (bool prefix) { init(); MessageStream *ms = (LEVEL & WARNINGS) ? &messageStream : &nullStream; if (COLORIZE && ms && ms->os()) { Terminal::fgcolor(_classColors[MC_WARNING].foreground, *ms->os()); Terminal::bgcolor(_classColors[MC_WARNING].background, *ms->os()); } if (prefix) *ms << "\nWARNING: "; return *ms; } /** Returns the stream for error messages. */ MessageStream& Message::estream (bool prefix) { init(); MessageStream *ms = (LEVEL & ERRORS) ? &messageStream : &nullStream; if (COLORIZE && ms && ms->os()) { Terminal::fgcolor(_classColors[MC_ERROR].foreground, *ms->os()); Terminal::bgcolor(_classColors[MC_ERROR].background, *ms->os()); } if (prefix) *ms << "\nERROR: "; return *ms; } static bool colorchar2int (char colorchar, int *val) { colorchar = tolower(colorchar); if (colorchar >= '0' && colorchar <= '9') *val = int(colorchar-'0'); else if (colorchar >= 'a' && colorchar <= 'f') *val = int(colorchar-'a'+10); else if (colorchar == '*') *val = -1; else return false; return true; } /** Initializes the Message class. Sets the colors for each message set. * The colors can be changed via environment variable DVISVGM_COLORS. Its * value must be a sequence of color entries of the form gg:BF where the * two-letter ID gg specifies a message set, B the hex digit of the * background, and F the hex digit of the foreground/text color. * Color codes: * - 1: red, 2: green, 4: blue * - 0-7: dark colors * - 8-F: light colors * - *: default color * Example: pn:01 sets page number messages to red on black background */ void Message::init () { if (_initialized || !Message::COLORIZE) return; // set default message colors _classColors[MC_ERROR] = Color(Terminal::RED, true); _classColors[MC_WARNING] = Color(Terminal::YELLOW); _classColors[MC_PAGE_NUMBER] = Color(Terminal::BLUE, true); _classColors[MC_PAGE_SIZE] = Color(Terminal::MAGENTA); _classColors[MC_PAGE_WRITTEN] = Color(Terminal::GREEN); _classColors[MC_STATE] = Color(Terminal::CYAN); _classColors[MC_TRACING] = Color(Terminal::BLUE); _classColors[MC_PROGRESS] = Color(Terminal::MAGENTA); if (const char *color_str = getenv("DVISVGM_COLORS")) { unordered_map classes = { {"er", MC_ERROR}, {"wn", MC_WARNING}, {"pn", MC_PAGE_NUMBER}, {"ps", MC_PAGE_SIZE}, {"fw", MC_PAGE_WRITTEN}, {"sm", MC_STATE}, {"tr", MC_TRACING}, {"pi", MC_PROGRESS}, }; const char *p=color_str; // skip leading whitespace while (isspace(*p)) ++p; // iterate over color assignments while (strlen(p) >= 5) { auto it = classes.find(string(p, 2)); if (it != classes.end() && p[2] == '=') { int bgcolor, fgcolor; if (colorchar2int(p[3], &bgcolor) && colorchar2int(p[4], &fgcolor)) { _classColors[it->second].background = bgcolor; _classColors[it->second].foreground = fgcolor; } } p += 5; // skip trailing characters in a malformed entry while (*p && !isspace(*p) && *p != ':' && *p != ';') ++p; // skip separation characters while (isspace(*p) || *p == ':' || *p == ';') ++p; } } _initialized = true; } dvisvgm-2.8.1/src/StreamReader.cpp0000664000175000017500000001163513536436567014025 00000000000000/************************************************************************* ** StreamReader.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "HashFunction.hpp" #include "StreamReader.hpp" #include "utility.hpp" using namespace std; istream& StreamReader::replaceStream (istream &in) { istream &ret = *_is; _is = ∈ return ret; } /** Reads an unsigned integer from assigned input stream. * @param[in] bytes number of bytes to read (max. 4) * @return read integer */ uint32_t StreamReader::readUnsigned (int bytes) { uint32_t ret = 0; for (bytes--; bytes >= 0 && !_is->eof(); bytes--) { uint32_t b = uint32_t(_is->get()); ret |= b << (8*bytes); } return ret; } /** Reads an unsigned integer from assigned input stream and updates the hash value. * @param[in] n number of bytes to read (max. 4) * @param[in,out] hashfunc hash to update * @return read integer */ uint32_t StreamReader::readUnsigned (int n, HashFunction &hashfunc) { uint32_t ret = readUnsigned(n); hashfunc.update(util::bytes(ret, n)); return ret; } /** Reads an signed integer from assigned input stream. * @param[in] bytes number of bytes to read (max. 4) * @return read integer */ int32_t StreamReader::readSigned (int bytes) { uint32_t ret = uint32_t(_is->get()); if (ret & 128) // negative value? ret |= 0xffffff00; for (bytes-=2; bytes >= 0 && !_is->eof(); bytes--) ret = (ret << 8) | _is->get(); return int32_t(ret); } /** Reads an signed integer from assigned input stream and updates the hash value. * @param[in] bytes number of bytes to read (max. 4) * @param[in,out] hashfunc hash to update * @return read integer */ int32_t StreamReader::readSigned (int n, HashFunction &hashfunc) { int32_t ret = readSigned(n); hashfunc.update(util::bytes(ret, n)); return ret; } /** Reads a string terminated by a 0-byte. */ string StreamReader::readString () { if (!_is) throw StreamReaderException("no stream assigned"); string ret; while (!_is->eof() && _is->peek() > 0) ret += char(_is->get()); _is->get(); // skip 0-byte return ret; } /** Reads a string terminated by a 0-byte and updates the hash value. * @param[in,out] hashfunc hash to update * @param[in] finalZero consider final 0-byte in checksum * @return the string read */ string StreamReader::readString (HashFunction &hashfunc, bool finalZero) { string ret = readString(); hashfunc.update(ret.data(), ret.length()); if (finalZero) hashfunc.update(0, 1); return ret; } /** Reads a string of a given length. * @param[in] length number of characters to read * @return the string read */ string StreamReader::readString (int length) { if (!_is) throw StreamReaderException("no stream assigned"); length = max(0, length); string str(length, '\0'); _is->read(&str[0], length); // read 'length' bytes and append '\0' return str; } /** Reads a string of a given length and updates the hash value. * @param[in] length number of characters to read * @param[in,out] hashfunc hash to update * @return the string read */ string StreamReader::readString (int length, HashFunction &hashfunc) { string ret = readString(length); hashfunc.update(ret.data(), length); return ret; } vector StreamReader::readBytes (int n) { vector bytes(n); if (n > 0) _is->read(reinterpret_cast(bytes.data()), n); return bytes; } vector StreamReader::readBytes (int n, HashFunction &hashfunc) { vector bytes = readBytes(n); hashfunc.update(bytes); return bytes; } int StreamReader::readByte (HashFunction &hashfunc) { int ret = readByte(); if (ret >= 0) { char c = ret & 0xff; hashfunc.update(&c, 1); } return ret; } dvisvgm-2.8.1/src/psdefs.cpp0000664000175000017500000002253313562236412012714 00000000000000/************************************************************************* ** psdefs.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include "PSInterpreter.hpp" const char *PSInterpreter::PSDEFS = "<>setpagedevice/@dodraw true store/@nulldev false store/@patcnt 0 sto" "re/@SD systemdict def/@UD userdict def true setglobal @SD/:save @SD/save get p" "ut @SD/:restore @SD/restore get put @SD/:gsave @SD/gsave get put @SD/:grestore" " @SD/grestore get put @SD/:grestoreall @SD/grestoreall get put @SD/:newpath @S" "D/newpath get put @SD/:stroke @SD/stroke get put @SD/:fill @SD/fill get put @S" "D/:eofill @SD/eofill get put @SD/:clip @SD/clip get put @SD/:eoclip @SD/eoclip" " get put @SD/:charpath @SD/charpath get put @SD/:show @SD/show get put @SD/:st" "ringwidth @SD/stringwidth get put @SD/:nulldevice @SD/nulldevice get put @SD/." "setopacityalpha known not{@SD/.setopacityalpha{pop}put}if @SD/.setshapealpha k" "nown not{@SD/.setshapealpha{pop}put}if @SD/.setblendmode known not{@SD/.setble" "ndmode{pop}put}if @SD/prseq{-1 1{-1 roll =only( )print}for(\\n)print}put @SD/p" "rcmd{( )exch(\\ndvi.)3{print}repeat prseq}put @SD/cvxall{{cvx}forall}put @SD/d" "efpr{[exch[/copy @SD]cvxall 5 -1 roll dup 6 1 roll[/get/exec]cvxall 6 -1 roll " "dup 7 1 roll 4 -1 roll dup 5 1 roll dup length string cvs/prcmd cvx]cvx def}pu" "t @SD/querypos{{currentpoint}stopped{$error/newerror false put}{2(querypos)prc" "md}ifelse}put @SD/applyscalevals{1 0 dtransform exch dup mul exch dup mul add " "sqrt 0 1 dtransform exch dup mul exch dup mul add sqrt 1 0 dtransform dup mul " "exch dup dup mul 3 -1 roll add dup 0 eq{pop}{sqrt div}ifelse 3(applyscalevals)" "prcmd}put @SD/prpath{{2(moveto)prcmd}{2(lineto)prcmd}{6(curveto)prcmd}{0(close" "path)prcmd}pathforall}put @SD/nulldevice{/@nulldev true store :nulldevice 1 1(" "setnulldevice)prcmd}put @SD/charpath{/@dodraw false store :charpath/@dodraw tr" "ue store}put @SD/stringwidth{/@dodraw false store :stringwidth/@dodraw true st" "ore}put @SD/show{@dodraw @nulldev not and{dup :gsave currentpoint 2{50 mul exc" "h}repeat :newpath moveto 50 50/scale sysexec true charpath fill :grestore/@dod" "raw false store :show/@dodraw true store}{:show}ifelse}put @SD/varxyshow{exch " "dup type/arraytype eq{<>begin" "{chr 0 3 -1 roll put :gsave chr show :grestore currentpoint prc moveto/idx idx" " 1 add store}forall end}{pop show}ifelse}put @SD/xyshow{{exch arr idx 2 mul ge" "t add exch arr idx 2 mul 1 add get add}varxyshow}put @SD/xshow{{exch arr idx g" "et add exch}varxyshow}put @SD/yshow{{arr idx get add}varxyshow}put @SD/awidths" "how{{1 string dup 0 5 index put :gsave show :grestore pop 0 rmoveto 3 index eq" "{4 index 4 index rmoveto}if 1 index 1 index rmoveto}exch cshow 5{pop}repeat}pu" "t @SD/widthshow{0 0 3 -1 roll pstack awidthshow}put @SD/ashow{0 0 0 6 3 roll a" "widthshow}put @SD/newpath{:newpath 1 1(newpath)prcmd}put @SD/stroke{@dodraw @n" "ulldev not and{prcolor 0 1(newpath)prcmd prpath 0(stroke)prcmd :newpath}{:stro" "ke}ifelse}put @SD/fill{@dodraw @nulldev not and{prcolor 0 1(newpath)prcmd prpa" "th 0(fill)prcmd :newpath}{:fill}ifelse}put @SD/eofill{@dodraw @nulldev not and" "{prcolor 0 1(newpath)prcmd prpath 0(eofill)prcmd :newpath}{:eofill}ifelse}put " "@SD/clip{:clip @nulldev not{0 1(newpath)prcmd prpath 0(clip)prcmd}if}put @SD/e" "oclip{:eoclip @nulldev not{0 1(newpath)prcmd prpath 0(eoclip)prcmd}}put @SD/sh" "fill{begin currentdict/ShadingType known currentdict/ColorSpace known and curr" "entdict/DataSource known and currentdict/Function known not and ShadingType 4 " "ge and DataSource type/arraytype eq and{<>begin " "currentdict ColorSpace known{ShadingType ColorSpace load bgknown{1 Background " "aload pop}{0}ifelse bbknown{1 BBox aload pop}{0}ifelse ShadingType 5 eq{Vertic" "esPerRow}if DataSource aload length 4 add bgknown{ColorSpace load add}if bbkno" "wn{4 add}if ShadingType 5 eq{1 add}if(shfill)prcmd}if end}if end}put/@rect{4 -" "2 roll moveto exch dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}b" "ind def/@rectcc{4 -2 roll moveto 2 copy 0 lt exch 0 lt xor{dup 0 exch rlineto " "exch 0 rlineto neg 0 exch rlineto}{exch dup 0 rlineto exch 0 exch rlineto neg " "0 rlineto}ifelse closepath}bind def @SD/rectclip{:newpath dup type/arraytype e" "q{aload length 4 idiv{@rectcc}repeat}{@rectcc}ifelse clip :newpath}put @SD/rec" "tfill{gsave :newpath dup type/arraytype eq{aload length 4 idiv{@rectcc}repeat}" "{@rectcc}ifelse fill grestore}put @SD/rectstroke{gsave :newpath dup type/array" "type eq{aload length 4 idiv{@rect}repeat}{@rect}ifelse stroke grestore}put fal" "se setglobal @SD readonly pop/initclip 0 defpr/clippath 0 defpr/sysexec{@SD ex" "ch get exec}def/adddot{dup length 1 add string dup 0 46 put dup 3 -1 roll 1 ex" "ch putinterval}def/setlinewidth{dup/setlinewidth sysexec 1(setlinewidth)prcmd}" "def/setlinecap 1 defpr/setlinejoin 1 defpr/setmiterlimit 1 defpr/setdash{mark " "3 1 roll 2 copy/setdash sysexec exch aload length 1 add -1 roll counttomark(se" "tdash)prcmd pop}def/@setpagedevice{pop<<>>/setpagedevice sysexec matrix setmat" "rix newpath 0(setpagedevice)prcmd}def/@checknulldev{@nulldev{currentpagedevice" " maxlength 0 ne{/@nulldev false store 0 1(setnulldevice)prcmd}if}if}def/prcolo" "r{currentrgbcolor 3(setrgbcolor)prcmd}def/printgstate{@dodraw @nulldev not and" "{matrix currentmatrix aload pop 6(setmatrix)prcmd applyscalevals currentlinewi" "dth 1(setlinewidth)prcmd currentlinecap 1(setlinecap)prcmd currentlinejoin 1(s" "etlinejoin)prcmd currentmiterlimit 1(setmiterlimit)prcmd currentrgbcolor 3(set" "rgbcolor)prcmd currentdash mark 3 1 roll exch aload length 1 add -1 roll count" "tomark(setdash)prcmd pop}if}def/setgstate{/setgstate sysexec printgstate}def/s" "ave{@UD begin/@saveID vmstatus pop pop def end :save @saveID 1(save)prcmd}def/" "restore{:restore @checknulldev printgstate @UD/@saveID known{@UD begin @saveID" " end}{0}ifelse 1(restore)prcmd}def/gsave 0 defpr/grestore{:grestore @checknull" "dev printgstate 0(grestore)prcmd}def/grestoreall{:grestoreall @checknulldev se" "tstate 0(grestoreall)prcmd}def/rotate{dup type/arraytype ne @dodraw and{dup 1(" "rotate)prcmd}if/rotate sysexec applyscalevals}def/scale{dup type/arraytype ne " "@dodraw and{2 copy 2(scale)prcmd}if/scale sysexec applyscalevals}def/translate" "{dup type/arraytype ne @dodraw and{2 copy 2(translate)prcmd}if/translate sysex" "ec}def/setmatrix{dup/setmatrix sysexec @dodraw{aload pop 6(setmatrix)prcmd app" "lyscalevals}{pop}ifelse}def/initmatrix{matrix setmatrix}def/concat{matrix curr" "entmatrix matrix concatmatrix setmatrix}def/makepattern{gsave<>" "begin dup/XUID[1000000 @patcnt]put mx/makepattern sysexec dup dup begin Patter" "nType @patcnt BBox aload pop XStep YStep PaintType mx aload pop 15(makepattern" ")prcmd :newpath matrix setmatrix PaintProc 0 1(makepattern)prcmd end/@patcnt @" "patcnt 1 add store end grestore}def/setpattern{begin PatternType 1 eq{PaintTyp" "e 1 eq{XUID aload pop exch pop 1}{:gsave[currentcolorspace aload length -1 rol" "l pop]setcolorspace/setcolor sysexec XUID aload pop exch pop currentrgbcolor :" "grestore 4}ifelse(setpattern)prcmd}{/setpattern sysexec}ifelse end}def/setcolo" "r{dup type/dicttype eq{setpattern}{/setcolor sysexec/currentrgbcolor sysexec s" "etrgbcolor}ifelse}def/setgray 1 defpr/setcmykcolor 4 defpr/sethsbcolor 3 defpr" "/setrgbcolor 3 defpr/.setopacityalpha{dup/.setopacityalpha sysexec 1(setopacit" "yalpha)prcmd}def/.setshapealpha{dup/.setshapealpha sysexec 1(setshapealpha)prc" "md}def/.setblendmode{dup/.setblendmode sysexec<>exch get 1(setblendmode)prcmd}def/@pdfpagecount{" "(r)file runpdfbegin pdfpagecount runpdfend}def/@pdfpagebox{(r)file runpdfbegin" " dup dup 1 lt exch pdfpagecount gt or{pop}{pdfgetpage/MediaBox pget pop aload " "pop}ifelse runpdfend}def DELAYBIND{.bindnow}if "; dvisvgm-2.8.1/src/MapLine.hpp0000664000175000017500000000602113510660062012747 00000000000000/************************************************************************* ** MapLine.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MAPLINE_HPP #define MAPLINE_HPP #include #include #include #include "MessageException.hpp" class InputReader; class SubfontDefinition; struct MapLineException : MessageException { explicit MapLineException (const std::string &msg) : MessageException(msg) {} }; class MapLine { public: explicit MapLine (std::istream &is); explicit MapLine (std::string str); const std::string& texname () const {return _texname;} const std::string& psname () const {return _psname;} const std::string& fontfname () const {return _fontfname;} const std::string& encname () const {return _encname;} int fontindex () const {return _fontindex;} double bold () const {return _bold;} double slant () const {return _slant;} double extend () const {return _extend;} SubfontDefinition* sfd () const {return _sfd;} protected: MapLine () =default; bool isDVIPSFormat (const char *line) const; void parse (const char *line); void parseDVIPSLine (InputReader &ir); void parseDVIPDFMLine (InputReader &ir); void parseFilenameOptions (std::string opt); private: std::string _texname; ///< TeX font name std::string _psname; ///< PS font name std::string _fontfname; ///< name of fontfile std::string _encname; ///< name of encoding (without file suffix ".enc") SubfontDefinition *_sfd=nullptr; ///< subfont definition to be used int _fontindex=0; ///< font index of file with multiple fonts (e.g. ttc files) double _slant=0, _bold=0, _extend=1; }; #endif dvisvgm-2.8.1/src/Message.hpp0000664000175000017500000000672513510660062013021 00000000000000/************************************************************************* ** Message.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef MESSAGE_HPP #define MESSAGE_HPP #include #include #include #include #include #include "Terminal.hpp" class Message; class MessageStream { friend class Message; public: MessageStream () =default; explicit MessageStream (std::ostream &os) noexcept; ~MessageStream (); template MessageStream& operator << (const T &obj) { std::ostringstream oss; oss << obj; (*this) << oss.str(); return *this; } MessageStream& operator << (const char *str); MessageStream& operator << (const char &c); MessageStream& operator << (const std::string &str) {return (*this) << str.c_str();} void indent (int level) {_indent = std::max(0, level*2);} void indent (bool reset=false); void outdent (bool all=false); void clearline (); protected: void putChar (char c, std::ostream &os); std::ostream* os () {return _os;} private: std::ostream *_os=nullptr; bool _nl=false; ///< true if previous character was a newline int _col=1; ///< current terminal column int _indent=0; ///< indentation width (number of columns/characters) }; class Message { struct Color { Color () =default; explicit Color (int8_t fgcolor) noexcept : foreground(fgcolor) {} Color (int8_t fgcolor, bool light) noexcept: foreground(fgcolor + (light ? 8 : 0)) {} Color (int8_t fgcolor, int8_t bgcolor) noexcept : foreground(fgcolor), background(bgcolor) {} int8_t foreground = -1; int8_t background = -1; }; public: enum MessageClass { MC_ERROR, MC_WARNING, MC_MESSAGE, MC_PAGE_NUMBER, MC_PAGE_SIZE, MC_PAGE_WRITTEN, MC_STATE, MC_TRACING, MC_PROGRESS, }; public: static MessageStream& mstream (bool prefix=false, MessageClass mclass=MC_MESSAGE); static MessageStream& estream (bool prefix=false); static MessageStream& wstream (bool prefix=false); enum {ERRORS=1, WARNINGS=2, MESSAGES=4}; static int LEVEL; static bool COLORIZE; protected: static void init (); private: static Color _classColors[]; static bool _initialized; }; #endif dvisvgm-2.8.1/src/Ghostscript.hpp0000664000175000017500000000770013510660062013740 00000000000000/************************************************************************* ** Ghostscript.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef GHOSTSCRIPT_HPP #define GHOSTSCRIPT_HPP #include #include #if defined(DISABLE_GS) #include "iapi.h" #elif defined(HAVE_LIBGS) #include #else #include "DLLoader.hpp" #include "iapi.h" #endif #if defined(_WIN32) && !defined(_Windows) #define _Windows #endif #if defined(DISABLE_GS) struct Ghostscript { using Stdin = int (GSDLLCALLPTR)(void *caller, char *buf, int len); using Stdout = int (GSDLLCALLPTR)(void *caller, const char *str, int len); using Stderr = int (GSDLLCALLPTR)(void *caller, const char *str, int len); Ghostscript () {} Ghostscript (int argc, const char **argv, void *caller=0) {} bool init (int argc, const char **argv, void *caller=0) {return false;} bool available () {return false;} bool revision (gsapi_revision_t *r) {return false;} int revision () {return 0;} std::string revisionstr () {return "";} int set_stdio (Stdin in, Stdout out, Stderr err) {return 0;} int run_string_begin (int user_errors, int *pexit_code) {return 0;} int run_string_continue (const char *str, unsigned int length, int user_errors, int *pexit_code) {return 0;} int run_string_end (int user_errors, int *pexit_code) {return 0;} int exit () {return 0;} const char* error_name (int code) {return 0;} }; #else /** Wrapper class of (a subset of) the Ghostscript API. */ class Ghostscript #if !defined(HAVE_LIBGS) : public DLLoader #endif { public: using Stdin = int (GSDLLCALLPTR)(void *caller, char *buf, int len); using Stdout = int (GSDLLCALLPTR)(void *caller, const char *str, int len); using Stderr = int (GSDLLCALLPTR)(void *caller, const char *str, int len); public: Ghostscript (); Ghostscript (int argc, const char **argv, void *caller=nullptr); Ghostscript (const Ghostscript &gs) =delete; ~Ghostscript (); bool init (int argc, const char **argv, void *caller=nullptr); bool available (); bool revision (gsapi_revision_t *r); int revision (); std::string revisionstr (); int set_stdio (Stdin in, Stdout out, Stderr err); int run_string_begin (int user_errors, int *pexit_code); int run_string_continue (const char *str, unsigned int length, int user_errors, int *pexit_code); int run_string_end (int user_errors, int *pexit_code); int exit (); const char* error_name (int code); static std::string LIBGS_NAME; protected: int init_with_args (int argc, char **argv); int new_instance (void **psinst, void *caller); void delete_instance (); private: void *_inst = nullptr; ///< Ghostscript handle needed to call the gsapi_foo functions }; #endif // DISABLE_GS #endif dvisvgm-2.8.1/src/GFTracer.cpp0000664000175000017500000000714613510660062013063 00000000000000/************************************************************************* ** GFTracer.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "GFTracer.hpp" #include "Glyph.hpp" #include "Message.hpp" using namespace std; GFTracer::GFTracer (istream &is) : GFReader(is), _unitsPerPoint(0.0) { } /** Constructs a new GFTracer. * @param[in] is GF file is read from this stream * @param[in] upp target units per PS point */ GFTracer::GFTracer (istream &is, double upp) : GFReader(is), _unitsPerPoint(upp) { } void GFTracer::beginChar (uint32_t c) { } void GFTracer::endChar (uint32_t c) { const Bitmap &bitmap = getBitmap(); if (bitmap.empty()) return; // prepare potrace's bitmap structure vector buffer; potrace_bitmap_t pobitmap; pobitmap.w = bitmap.width(); pobitmap.h = bitmap.height(); pobitmap.dy = bitmap.copy(buffer); pobitmap.map = &buffer[0]; potrace_param_t *param = potrace_param_default(); potrace_state_t *state = potrace_trace(param, &pobitmap); potrace_param_free(param); if (!state || state->status == POTRACE_STATUS_INCOMPLETE) Message::wstream(true) << "error while tracing character\n"; else { double hsf=1.0, vsf=1.0; // horizontal a d vertical scale factor if (_unitsPerPoint != 0.0) { hsf = _unitsPerPoint/getHPixelsPerPoint(); // horizontal scale factor vsf = _unitsPerPoint/getVPixelsPerPoint(); // vertical scale factor } for (potrace_path_t *path = state->plist; path; path = path->next) { potrace_dpoint_t &p = path->curve.c[path->curve.n-1][2]; // start/end point moveTo(hsf*(p.x+bitmap.xshift()), vsf*(p.y+bitmap.yshift())); for (int i=0; i < path->curve.n; i++) { if (path->curve.tag[i] == POTRACE_CURVETO) { curveTo(hsf*(path->curve.c[i][0].x+bitmap.xshift()), vsf*(path->curve.c[i][0].y+bitmap.yshift()), hsf*(path->curve.c[i][1].x+bitmap.xshift()), vsf*(path->curve.c[i][1].y+bitmap.yshift()), hsf*(path->curve.c[i][2].x+bitmap.xshift()), vsf*(path->curve.c[i][2].y+bitmap.yshift())); } else { lineTo(hsf*(path->curve.c[i][1].x+bitmap.xshift()), vsf*(path->curve.c[i][1].y+bitmap.yshift())); if (i == path->curve.n-1) closePath(); else lineTo(hsf*(path->curve.c[i][2].x+bitmap.xshift()), vsf*(path->curve.c[i][2].y+bitmap.yshift())); } } } } potrace_state_free(state); } dvisvgm-2.8.1/src/SpecialManager.cpp0000664000175000017500000001455713510660062014305 00000000000000/************************************************************************* ** SpecialManager.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "SpecialActions.hpp" #include "SpecialHandler.hpp" #include "SpecialManager.hpp" using namespace std; double SpecialActions::PROGRESSBAR_DELAY=1000; // initial delay in seconds (values >= 1000 disable the progressbar) SpecialManager& SpecialManager::instance() { static SpecialManager sm; return sm; } /** Remove all registered handlers. */ void SpecialManager::unregisterHandlers () { _handlerPool.clear(); _handlersByPrefix.clear(); } /** Registers a single special handler. This method doesn't check if a * handler of the same class is already registered. * @param[in] handler pointer to handler to be registered */ void SpecialManager::registerHandler (unique_ptr handler) { if (handler) { // get array of prefixes this handler is responsible for for (const char *prefix : handler->prefixes()) _handlersByPrefix[prefix] = handler.get(); _handlerPool.emplace_back(std::move(handler)); } } /** Registers several special handlers at once. * If ignorelist == 0, all given handlers are registered. To exclude selected sets of * specials, the corresponding names can be given separated by non alpha-numeric characters, * e.g. "color, ps, em" or "color: ps em" etc. * @param[in] handlers pointer to zero-terminated array of handlers to be registered * @param[in] ignorelist list of special names to be ignored */ void SpecialManager::registerHandlers (vector> &handlers, const char *ignorelist) { if (handlers.empty()) return; string ignorestr = ignorelist ? ignorelist : ""; for (char &c : ignorestr) if (!isalnum(c)) c = '%'; ignorestr = "%"+ignorestr+"%"; for (auto &handler : handlers) if (!handler->name() || ignorestr.find("%"+string(handler->name())+"%") == string::npos) registerHandler(std::move(handler)); } /** Looks for a handler responsible for a given special prefix. * @param[in] prefix the special prefix, e.g. "color" or "em" * @return in case of success: pointer to handler, 0 otherwise */ SpecialHandler* SpecialManager::findHandlerByPrefix (const string &prefix) const { auto it = _handlersByPrefix.find(prefix); if (it != _handlersByPrefix.end()) return it->second; return nullptr; } /** Looks for a handler with a given name. * @param[in] name name of handler to look for, e.g. "papersize" * @return in case of success: pointer to handler, 0 otherwise */ SpecialHandler* SpecialManager::findHandlerByName (const string &name) const { for (auto &handler : _handlerPool) { if (handler->name() == name) return handler.get(); } return nullptr; } static string extract_prefix (istream &is) { int c; string prefix; while (isalnum(c=is.get())) prefix += char(c); if (ispunct(c)) // also add separation character to identifying prefix prefix += char(c); if (prefix == "ps:" && is.peek() == ':') prefix += char(is.get()); return prefix; } void SpecialManager::preprocess (const string &special, SpecialActions &actions) const { istringstream iss(special); const string prefix = extract_prefix(iss); if (SpecialHandler *handler = findHandlerByPrefix(prefix)) handler->preprocess(prefix, iss, actions); } /** Executes a special command. * @param[in] special the special expression * @param[in] dvi2bp factor to convert DVI units to PS points * @param[in] actions actions the special handlers can perform * @return true if the special could be processed successfully * @throw SpecialException in case of errors during special processing */ bool SpecialManager::process (const string &special, double dvi2bp, SpecialActions &actions) const { istringstream iss(special); const string prefix = extract_prefix(iss); bool success=false; if (SpecialHandler *handler = findHandlerByPrefix(prefix)) { handler->setDviScaleFactor(dvi2bp); success = handler->process(prefix, iss, actions); } return success; } void SpecialManager::notifyPreprocessingFinished () const { for (auto &handler : _handlerPool) handler->dviPreprocessingFinished(); } void SpecialManager::notifyBeginPage (unsigned pageno, SpecialActions &actions) const { for (auto &handler : _handlerPool) handler->dviBeginPage(pageno, actions); } void SpecialManager::notifyEndPage (unsigned pageno, SpecialActions &actions) const { for (auto &handler : _handlerPool) handler->dviEndPage(pageno, actions); } void SpecialManager::notifyPositionChange (double x, double y, SpecialActions &actions) const { for (auto &handler : _handlerPool) handler->dviMovedTo(x, y, actions); } void SpecialManager::writeHandlerInfo (ostream &os) const { ios::fmtflags osflags(os.flags()); map sortmap; for (const auto &handler : _handlerPool) if (handler->name()) sortmap[handler->name()] = handler.get(); for (const auto &strhandlerpair : sortmap) { os << setw(10) << left << strhandlerpair.second->name() << ' '; if (strhandlerpair.second->info()) os << strhandlerpair.second->info(); os << endl; } os.flags(osflags); // restore format flags } dvisvgm-2.8.1/src/SpecialManager.hpp0000664000175000017500000000561613510660062014306 00000000000000/************************************************************************* ** SpecialManager.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef SPECIALMANAGER_HPP #define SPECIALMANAGER_HPP #include #include #include #include #include #include "SpecialHandler.hpp" class SpecialActions; class SpecialManager { private: using HandlerPool = std::vector>; using HandlerMap = std::unordered_map; public: SpecialManager (const SpecialManager &) =delete; static SpecialManager& instance (); void registerHandler (std::unique_ptr handler); void registerHandlers (std::vector> &handlers, const char *ignorelist); void unregisterHandlers (); void preprocess (const std::string &special, SpecialActions &actions) const; bool process (const std::string &special, double dvi2bp, SpecialActions &actions) const; void notifyPreprocessingFinished () const; void notifyBeginPage (unsigned pageno, SpecialActions &actions) const; void notifyEndPage (unsigned pageno, SpecialActions &actions) const; void notifyPositionChange (double x, double y, SpecialActions &actions) const; void writeHandlerInfo (std::ostream &os) const; SpecialHandler* findHandlerByName (const std::string &name) const; protected: SpecialManager () =default; SpecialHandler* findHandlerByPrefix (const std::string &prefix) const; private: HandlerPool _handlerPool; ///< stores pointers to all handlers HandlerMap _handlersByPrefix; ///< pointers to handlers for corresponding prefixes }; #endif dvisvgm-2.8.1/src/PDFParser.hpp0000664000175000017500000001332113510660062013211 00000000000000/************************************************************************* ** PDFParser.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef PDFPARSER_HPP #define PDFPARSER_HPP #include #include #include #include #include #include #include #include #include #include #include "MessageException.hpp" template class Dictionary { using Map = std::map; public: typename Map::const_iterator begin () const {return _map.begin();} typename Map::const_iterator end () const {return _map.end();} typename Map::iterator begin () {return _map.begin();} typename Map::iterator end () {return _map.end();} typename Map::const_iterator find (const K &key) const {return _map.find(key);} bool empty () const {return _map.empty();} bool exists (const K &key) const {return _map.find(key) != _map.end();} size_t size () const {return _map.size();} const V* get (const K &key) const { auto it = _map.find(key); if (it != _map.end()) return &it->second; return nullptr; } std::pair emplace (const K &key, V &&value) { return _map.emplace(key, std::forward(value)); } private: Map _map; }; ////////////////////////////////////////////////////////////////////////// // PDF object types struct PDFNull {}; struct PDFStream {}; struct PDFIndirectObject { PDFIndirectObject (int n, int gen) : objnum(n), gennum(gen) {} int objnum, gennum; }; struct PDFObjectRef { PDFObjectRef (int n, int gen) : objnum(n), gennum(gen) {} int objnum, gennum; }; struct PDFOperator { explicit PDFOperator (std::string name) : opname(std::move(name)) {} std::string opname; }; struct PDFName { explicit PDFName (std::string val) : str(std::move(val)) {} bool operator == (const PDFName &name) const {return str == name.str;} std::string str; }; class PDFObject; using PDFArray = std::vector; using PDFDict = Dictionary; ////////////////////////////////////////////////////////////////////////// /** This class represents a single variadic PDF object. */ class PDFObject { using Value = mpark::variant< PDFNull, bool, int, double, PDFName, PDFStream, PDFIndirectObject, PDFObjectRef, PDFOperator, std::string, std::unique_ptr, std::unique_ptr >; public: PDFObject () : _value(0) {} template explicit PDFObject (T &&value) : _value(std::forward(value)) {} explicit PDFObject (const char *value) : _value(std::string(value)) {} explicit operator std::string () const; explicit operator double () const; template const T* get () const {return mpark::get_if(&_value);} void write (std::ostream &os) const; private: Value _value; }; template<> inline const PDFArray* PDFObject::get() const { if (auto p = mpark::get_if>(&_value)) return &(**p); return nullptr; } template<> inline const PDFDict* PDFObject::get() const { if (auto p = mpark::get_if>(&_value)) return &(**p); return nullptr; } inline std::ostream& operator << (std::ostream &os, const PDFObject &obj) { obj.write(os); return os; } ////////////////////////////////////////////////////////////////////////// class InputReader; class PDFParser { public: using PDFOperatorHandler = std::function&)>; public: std::vector parse (std::istream &is); std::vector parse (const std::string &str); std::vector parse (InputReader &ir); void parse (InputReader &ir, std::vector &objects); std::vector parse (std::istream &is, const PDFOperatorHandler &opHandler); std::vector parse (const std::string &str, const PDFOperatorHandler &opHandler); std::vector parse (InputReader &ir, const PDFOperatorHandler &opHandler); void parse (InputReader &ir, std::vector &objects, const PDFOperatorHandler &opHandler); protected: PDFArray parseArray (InputReader &ir, const PDFOperatorHandler &opHandler); PDFDict parseDict (InputReader &ir, const PDFOperatorHandler &opHandler); }; /** If errors occur while parsing a sequence of PDF objects, an instance of this exception is thrown. */ struct PDFException : public MessageException { explicit PDFException (const std::string &msg) : MessageException(msg) {} }; #endif dvisvgm-2.8.1/src/FontWriter.cpp0000664000175000017500000002372213536436037013542 00000000000000/************************************************************************* ** FontWriter.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FontWriter.hpp" #include "Message.hpp" #include "utility.hpp" using namespace std; bool FontWriter::AUTOHINT_FONTS = false; const array FontWriter::_formatInfos {{ {FontWriter::FontFormat::SVG, "image/svg+xml", "svg", "svg"}, {FontWriter::FontFormat::TTF, "application/x-font-ttf", "ttf", "truetype"}, {FontWriter::FontFormat::WOFF, "application/x-font-woff", "woff", "woff"}, {FontWriter::FontFormat::WOFF2, "application/x-font-woff2", "woff2", "woff2"}, }}; /** Returns the corresponding FontFormat for a given format name (e.g. "svg", "woff" etc.). */ FontWriter::FontFormat FontWriter::toFontFormat (string formatstr) { formatstr = util::tolower(formatstr); auto it = find_if(_formatInfos.begin(), _formatInfos.end(), [&](const FontFormatInfo &info) { return info.formatstr_short == formatstr; }); return it != _formatInfos.end() ? it->format : FontFormat::UNKNOWN; } /** Returns the corresponding FontFormatInfo for a given FontFormat. */ const FontWriter::FontFormatInfo* FontWriter::fontFormatInfo (FontFormat format) { auto it = find_if(_formatInfos.begin(), _formatInfos.end(), [&](const FontFormatInfo &info) { return info.format == format; }); return it != _formatInfos.end() ? &(*it) : nullptr; } /** Returns the names of all supported font formats. */ vector FontWriter::supportedFormats () { vector formats; for (const FontFormatInfo &info : _formatInfos) formats.emplace_back(info.formatstr_short); return formats; } #include #ifdef DISABLE_WOFF // dummy functions used if WOFF support is disabled FontWriter::FontWriter (const PhysicalFont &font) : _font(font) {} std::string FontWriter::createFontFile (FontFormat format, const set &charcodes, GFGlyphTracer::Callback *cb) const {return "";} bool FontWriter::writeCSSFontFace (FontFormat format, const set &charcodes, ostream &os, GFGlyphTracer::Callback *cb) const {return false;} #else #include #include #include #include #include #include "ffwrapper.h" #include "Bezier.hpp" #include "FileSystem.hpp" #include "Font.hpp" #include "Glyph.hpp" #include "TTFAutohint.hpp" #include "TrueTypeFont.hpp" FontWriter::FontWriter (const PhysicalFont &font) : _font(font) { static bool initialized=false; if (!initialized) { ff_init(); initialized = true; } } struct SFDActions : Glyph::IterationActions { explicit SFDActions (ostream &os) : _os(os) {} using Point = Glyph::Point; void moveto (const Point &p) override {write('m', p);} void lineto (const Point &p) override {write('l', p);} void cubicto (const Point &p1, const Point &p2, const Point &p3) override {write('c', p1, p2, p3); } void closepath () override {write('m', startPoint());} void quadto (const Point &p1, const Point &p2) override { // convert quadratic Bézier curve to cubic one DPair pt0(currentPoint().x(), currentPoint().y()); DPair pt1(p1.x(), p1.y()); DPair pt2(p2.x(), p2.y()); Bezier b(pt0, pt1, pt2); write('c', round(b.point(0)), round(b.point(1)), round(b.point(2)), round(b.point(3))); } template void write (char cmd, const Args& ...args) { writeParams(args...); _os << cmd << " 0\n"; } static void writeParams () {} template void writeParams (const Pt &p, const Args& ...args) const { _os << p.x() << ' ' << p.y() << ' '; writeParams(args...); } ostream &_os; Glyph::Point _startPoint, _currentPoint; }; /** Creates a Spline Font Database (SFD) file describing the font and its glyphs. * https://fontforge.github.io/sfdformat.html */ static void writeSFD (const string &sfdname, const PhysicalFont &font, const set &charcodes, GFGlyphTracer::Callback *cb) { ofstream sfd(sfdname); if (!sfd) throw FontWriterException("failed writing SFD file "+sfdname); sfd << "SplineFontDB: 3.0\n" "FontName: " << font.name() << '\n'; // ensure that the sum of the SFD's Ascent and Descent values equals the font's units per EM double yext = font.ascent()+font.descent(); double scale = double(font.unitsPerEm())/(yext != 0 ? yext : fabs(font.ascent())); sfd << "Ascent: " << font.ascent()*scale << "\n" "Descent: " << font.descent()*scale << "\n" "LayerCount: 2\n" // number of layers must be 2 at least "Layer: 0 0 \"Back\" 1\n" // layer 0: background layer with cubic splines "Layer: 1 0 \"Fore\" 0\n" // layer 1: foreground layer with cubic splines "Encoding: UnicodeFull\n" // character codes can use the full Unicode range "BeginChars: 1114112 " << charcodes.size() << '\n'; double extend = font.style() ? font.style()->extend : 1; for (int c : charcodes) { string name = font.glyphName(c); if (name.empty()) { // if the font doesn't provide glyph names, use AGL name uFOO ostringstream oss; oss << 'u' << hex << uppercase << setw(4) << setfill('0') << c; name = oss.str(); } uint32_t codepoint = font.unicode(c); sfd << "StartChar: " << name << "\n" "Encoding: " << codepoint << ' ' << codepoint << " 0\n" "Width: " << font.hAdvance(c)*extend << "\n" "VWidth: " << font.vAdvance(c) << "\n" "Fore\n" "SplineSet\n"; Glyph glyph; if (font.getGlyph(c, glyph, cb)) { SFDActions actions(sfd); glyph.iterate(actions, false); } sfd << "EndSplineSet\n" "EndChar\n"; } sfd.flush(); sfd.close(); if (sfd.fail()) throw FontWriterException("failed writing SFD file "+sfdname); } bool FontWriter::createTTFFile (const string &sfdname, const string &ttfname) const { TTFAutohint autohinter; if (!autohinter.available()) return ff_sfd_to_ttf(sfdname.c_str(), ttfname.c_str(), AUTOHINT_FONTS); bool ok = ff_sfd_to_ttf(sfdname.c_str(), ttfname.c_str(), false); if (ok && AUTOHINT_FONTS) { string tmpname = ttfname+"-ah"; int errnum = autohinter.autohint(ttfname, tmpname, true); if (errnum) { Message::wstream(true) << "failed to autohint font '" << _font.name() << "'"; string msg = autohinter.lastErrorMessage(); if (!msg.empty()) Message::wstream() << " (" << msg << ")"; // keep the unhinted TTF FileSystem::remove(tmpname); } else { FileSystem::remove(ttfname); FileSystem::rename(tmpname, ttfname); } } return ok; } /** Creates a font file containing a given set of glyphs mapped to their Unicode points. * @param[in] format target font format * @param[in] charcodes character codes of the glyphs to be considered * @param[in] cb callback object that allows to react to events triggered by the glyph tracer * @return name of the created font file */ string FontWriter::createFontFile (FontFormat format, const set &charcodes, GFGlyphTracer::Callback *cb) const { string tmpdir = FileSystem::tmpdir(); string basename = tmpdir+_font.name()+"-tmp"; string sfdname = basename+".sfd"; writeSFD(sfdname, _font, charcodes, cb); string ttfname = basename+".ttf"; string targetname = basename+"."+fontFormatInfo(format)->formatstr_short; bool ok = createTTFFile(sfdname, ttfname); if (ok) { if (format == FontFormat::WOFF || format == FontFormat::WOFF2) { TrueTypeFont ttf(ttfname); if (format == FontFormat::WOFF) ttf.writeWOFF(targetname); else ok = ttf.writeWOFF2(targetname); if (!PhysicalFont::KEEP_TEMP_FILES) FileSystem::remove(ttfname); } } if (!PhysicalFont::KEEP_TEMP_FILES) FileSystem::remove(sfdname); if (!ok) throw FontWriterException("failed writing "+string(fontFormatInfo(format)->formatstr_short)+ " file " + targetname); return targetname; } /** Writes a CSS font-face rule to an output stream that references or contains the WOFF/TTF font data. * @param[in] format target font format * @param[in] charcodes character codes of the glyphs to be considered * @param[in] os stream the CSS data is written to * @param[in] cb callback object that allows to react to events triggered by the glyph tracer * @return true on success */ bool FontWriter::writeCSSFontFace (FontFormat format, const set &charcodes, ostream &os, GFGlyphTracer::Callback *cb) const { if (const FontFormatInfo *info = fontFormatInfo(format)) { string filename = createFontFile(format, charcodes, cb); ifstream ifs(filename, ios::binary); if (ifs) { os << "@font-face{" << "font-family:" << _font.name() << ';' << "src:url(data:" << info->mimetype << ";base64,"; util::base64_copy(istreambuf_iterator(ifs), istreambuf_iterator(), ostreambuf_iterator(os)); os << ") format('" << info->formatstr_long << "');}\n"; ifs.close(); if (!PhysicalFont::KEEP_TEMP_FILES) FileSystem::remove(filename); return true; } } return false; } #endif // !DISABLE_WOFF dvisvgm-2.8.1/src/AGLTable.hpp0000664000175000017500000046532213510660062013012 00000000000000/************************************************************************* ** AGLTable.hpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ /* The following table provides a compact mapping from PostScript character names * to Unicode points. Instead of using the character names directly it maps the * hash values (xxhash32) of the names to the corresponding code points. * The character mapping is derived from the Adobe Glyph List (AGL): * https://github.com/adobe-type-tools/agl-aglfn * http://tug.ctan.org/macros/latex/contrib/pdfx/glyphtounicode-cmr.tex */ #include struct HashCodepointPair { uint32_t hash; uint32_t codepoint; }; std::array hash2unicode {{ {0x001cf4a9, 0x0118}, // Eogonek {0x003b11fb, 0x055f}, // abbreviationmarkarmenian {0x0050a316, 0x0444}, // afii10086 {0x0066ddfe, 0x03a5}, // Upsilon {0x0067a87d, 0x0026}, // ampersand {0x007399ea, 0x2118}, // weierstrass {0x009a8cbc, 0x30c8}, // tokatakana {0x00a8ecc1, 0xfb93}, // gaffinalarabic {0x00b0f8d6, 0x05b2}, // hatafpatahwidehebrew {0x00b1b890, 0x2486}, // nineteenparen {0x00b92975, 0x05a7}, // dargalefthebrew {0x00c458a3, 0x2154}, // twothirds {0x00e73988, 0x09b8}, // sabengali {0x00f475c4, 0x03ee}, // Deicoptic {0x00fa9974, 0x0303}, // tildecmb {0x01012c9a, 0x05b4}, // hiriq {0x0107d6e3, 0x0933}, // lladeva {0x01127238, 0x3237}, // ideographiccongratulationparen {0x011abc50, 0x0547}, // Shaarmenian {0x01297545, 0x25aa}, // H18543 {0x012d44bc, 0x05d6}, // afii57670 {0x013044fb, 0x2205}, // emptyset {0x01422ce1, 0x0486}, // psilipneumatacyrilliccmb {0x01571757, 0xfe6b}, // atsmall {0x01678eeb, 0x066b}, // decimalseparatorpersian {0x018643fe, 0x091a}, // cadeva {0x019e6772, 0x3148}, // cieuckorean {0x019fa822, 0x05de}, // mem {0x01cfa7b3, 0x0a3e}, // aamatragurmukhi {0x01d7c979, 0x3007}, // ideographiczero {0x020d70ad, 0x278b}, // twocircleinversesansserif {0x0239eab1, 0x3131}, // kiyeokkorean {0x023b0c79, 0xff87}, // nukatakanahalfwidth {0x023deac8, 0x3183}, // yesieungpansioskorean {0x02409db2, 0x1ed1}, // ocircumflexacute {0x02574652, 0x0e1b}, // poplathai {0x025b8acc, 0x0a47}, // eematragurmukhi {0x02610d57, 0x2668}, // hotsprings {0x0292f83b, 0x0e11}, // thonangmonthothai {0x0293c9db, 0xff49}, // imonospace {0x029e63cc, 0x21e7}, // arrowupwhite {0x02a32a9d, 0x0275}, // obarred {0x02a97908, 0x09f7}, // fournumeratorbengali {0x02abe0be, 0x2556}, // SF210000 {0x02acd87a, 0x2461}, // twocircle {0x02bb8927, 0x0154}, // Racute {0x02bd043f, 0x3392}, // mhzsquare {0x02bdc138, 0x304a}, // ohiragana {0x02c40de7, 0xffe6}, // wonmonospace {0x02dab625, 0x310c}, // lbopomofo {0x02df8edf, 0x30e7}, // yosmallkatakana {0x02e3dfc8, 0x3062}, // dihiragana {0x0306380d, 0xff35}, // Umonospace {0x03170204, 0x0495}, // ghemiddlehookcyrillic {0x03182c9f, 0x25b4}, // blackuppointingsmalltriangle {0x0319d343, 0x329e}, // ideographicprintcircle {0x031ad266, 0x331e}, // kooposquare {0x03274b72, 0x0018}, // controlCAN {0x0334c4d5, 0x0aa7}, // dhagujarati {0x03396436, 0x1ed0}, // Ocircumflexacute {0x033b64c4, 0x047f}, // otcyrillic {0x033e74dc, 0x1e44}, // Ndotaccent {0x034ec8b1, 0x30b0}, // gukatakana {0x037b5e30, 0x00b9}, // onesuperior {0x03993e60, 0xff57}, // wmonospace {0x03a136c3, 0x0e0b}, // sosothai {0x03b0103c, 0x2270}, // notlessnorequal {0x03c2a8d8, 0x1eb3}, // abrevehookabove {0x03d234c7, 0xfea7}, // khahinitialarabic {0x03f4da1a, 0x05b8}, // qamatsnarrowhebrew {0x0410b525, 0x0138}, // kgreenlandic {0x0433eb22, 0x014e}, // Obreve {0x043f3fc5, 0x040a}, // afii10059 {0x044589fe, 0x0646}, // afii57446 {0x044ba421, 0x0585}, // oharmenian {0x0454dddc, 0x0432}, // afii10067 {0x048b164e, 0x01c3}, // clickretroflex {0x048e8b97, 0x0161}, // scaron {0x0491732e, 0x3186}, // yeorinhieuhkorean {0x049c65ac, 0x2121}, // telephone {0x04a45907, 0x041a}, // afii10028 {0x04c4d94b, 0x05b5}, // tsere1e {0x04c8ee7d, 0x042d}, // Ereversedcyrillic {0x04de1db0, 0x0950}, // omdeva {0x04f4d676, 0x0027}, // quotesingle {0x0500f909, 0x0407}, // Yicyrillic {0x0503fcb5, 0x00b1}, // plusminus {0x05116c6a, 0x30fc}, // prolongedkana {0x05302abd, 0x2025}, // twodotleader {0x053ece0c, 0x3050}, // guhiragana {0x05574c05, 0x09a3}, // nnabengali {0x056bac6c, 0x30a3}, // ismallkatakana {0x058218bb, 0x0386}, // Alphatonos {0x058691a9, 0x33d2}, // squarelog {0x059c61cd, 0x0436}, // zhecyrillic {0x059eb4a3, 0x2085}, // fiveinferior {0x05a47299, 0x320d}, // hieuhparenkorean {0x05a53e96, 0x0282}, // shook {0x05b0f8c3, 0x02b5}, // rhookturnedsuperior {0x05cee53c, 0x201d}, // quotedblright {0x05de47fd, 0x1e7f}, // vdotbelow {0x05e340f3, 0x1e70}, // Tcircumflexbelow {0x05e8321d, 0x0325}, // ringbelowcmb {0x05ec5d36, 0x2471}, // eighteencircle {0x05f03fff, 0x0ae0}, // rrvocalicgujarati {0x060beb03, 0x0175}, // wcircumflex {0x061ad8fc, 0x24ca}, // Ucircle {0x0642035b, 0x0010}, // controlDLE {0x0646584a, 0x003d}, // equal {0x064874b1, 0x05d3}, // afii57667 {0x066433cf, 0x20a4}, // lira {0x06823c6b, 0xfb4d}, // kafrafehebrew {0x06894954, 0xff5e}, // asciitildemonospace {0x069a405d, 0x00e6}, // ae {0x06b00ffc, 0x0101}, // amacron {0x06b72f51, 0x27e8}, // angbracketleftbig {0x06be8647, 0x0442}, // afii10084 {0x06ec3366, 0xfe42}, // cornerbracketrightvertical {0x0700a693, 0x0475}, // izhitsacyrillic {0x07019244, 0xfb02}, // fl {0x07072da3, 0x2299}, // circleot {0x07099ef9, 0xfeae}, // rehfinalarabic {0x0710dd39, 0x02de}, // rhotichookmod {0x074aba74, 0x09af}, // yabengali {0x07562010, 0x09bc}, // nuktabengali {0x075a830a, 0x21e6}, // arrowleftwhite {0x076312db, 0x2497}, // sixteenperiod {0x0767cf10, 0x1ea8}, // Acircumflexhookabove {0x076c3b34, 0x1ec3}, // ecircumflexhookabove {0x076dbf41, 0x05b7}, // patah11 {0x07726745, 0x0e25}, // lolingthai {0x078184fa, 0x00f7}, // divide {0x0790751c, 0x2466}, // sevencircle {0x0793d50d, 0x30bb}, // sekatakana {0x07a1ce35, 0x0906}, // aadeva {0x07ab20a8, 0x0ab3}, // llagujarati {0x07e20c30, 0x017b}, // Zdot {0x07e38c67, 0x33bb}, // nwsquare {0x081dd122, 0x0a38}, // sagurmukhi {0x082543e5, 0x33a0}, // cmsquaredsquare {0x083d0b54, 0x3227}, // eightideographicparen {0x08429fa7, 0x2591}, // ltshade {0x084b888b, 0x311a}, // abopomofo {0x085499c4, 0x0925}, // thadeva {0x086a99d9, 0x01af}, // Uhorn {0x087038eb, 0xfb20}, // ayinaltonehebrew {0x089d739a, 0x005a}, // Z {0x08a131c8, 0x096d}, // sevendeva {0x08a6b099, 0x02a6}, // ts {0x08b5de5a, 0x038a}, // Iotatonos {0x08b78f6b, 0xff86}, // nikatakanahalfwidth {0x08d57b6a, 0x0019}, // controlEM {0x08ddb521, 0x3226}, // sevenideographicparen {0x092aa224, 0x0a90}, // aigujarati {0x092cd86d, 0x03d6}, // omega1 {0x09310ab8, 0x027f}, // rfishhookreversed {0x094ceadc, 0x0047}, // G {0x09751504, 0x038c}, // Omicrontonos {0x09790f28, 0x33be}, // kwsquare {0x09853aa3, 0x01c1}, // clicklateral {0x09a03740, 0xfe5b}, // braceleftsmall {0x09a4b050, 0x0ae8}, // twogujarati {0x09d4b5eb, 0x3388}, // calsquare {0x09f2217d, 0x00a9}, // copyright {0x09f9df24, 0x1e0c}, // Ddotbelow {0x0a040d76, 0x098a}, // uubengali {0x0a1d800c, 0x0291}, // zcurl {0x0a3b8eb5, 0x044b}, // yericyrillic {0x0a46f2f1, 0x0284}, // dotlessjstrokehook {0x0a5cb3b1, 0x30d6}, // bukatakana {0x0a5ff1a8, 0xff6b}, // osmallkatakanahalfwidth {0x0a67f8fb, 0x24b2}, // wparen {0x0a704676, 0xfccc}, // lammeeminitialarabic {0x0a8ba8e8, 0x0112}, // Emacron {0x0a9b47dd, 0x306f}, // hahiragana {0x0aa2156d, 0xfc0c}, // tehhahisolatedarabic {0x0abb4ec1, 0x0441}, // afii10083 {0x0adbba15, 0x21c0}, // harpoonrightbarbup {0x0ae79191, 0x01e1}, // adotmacron {0x0af77d49, 0x09ea}, // fourbengali {0x0b367d7a, 0x0421}, // Escyrillic {0x0b4b7082, 0xff62}, // cornerbracketlefthalfwidth {0x0b6abf22, 0x20aa}, // sheqel {0x0b7f2b2d, 0x0a5a}, // ghhagurmukhi {0x0b92d660, 0x32a6}, // ideographiclowcircle {0x0b9e2621, 0x2665}, // heartsuitblack {0x0ba5f00c, 0x03cc}, // omicrontonos {0x0bae12ff, 0xff2a}, // Jmonospace {0x0bd4abb3, 0x0254}, // oopen {0x0bd8d304, 0x3215}, // ieungaparenkorean {0x0bdad647, 0x0970}, // abbreviationsigndeva {0x0bdb550e, 0x0669}, // ninehackarabic {0x0be3cda3, 0x1e0b}, // ddotaccent {0x0bf8ed4a, 0x09f2}, // rupeemarkbengali {0x0bfa9d4e, 0x05b6}, // afii57795 {0x0c138c8e, 0x308f}, // wahiragana {0x0c17017e, 0x02a5}, // dzcurl {0x0c19fd92, 0x037a}, // ypogegrammeni {0x0c255ae5, 0x0553}, // Piwrarmenian {0x0c356707, 0x0625}, // afii57413 {0x0c678de3, 0x032a}, // bridgebelowcmb {0x0c810887, 0x0a88}, // iigujarati {0x0c83c594, 0x1e63}, // sdotbelow {0x0c8f5261, 0x0164}, // Tcaron {0x0cacee48, 0xfba8}, // hehinitialaltonearabic {0x0cbb507c, 0x3036}, // circlepostalmark {0x0cd99820, 0x05c0}, // paseqhebrew {0x0cdb81c4, 0x24a2}, // gparen {0x0ce8bb7e, 0x30d5}, // hukatakana {0x0cf04968, 0x02be}, // ringhalfright {0x0d0eb2f0, 0x315d}, // weokorean {0x0d21bb72, 0x2550}, // SF430000 {0x0d47308f, 0x05d4}, // he {0x0d747cfe, 0x04c3}, // Kahookcyrillic {0x0d932b5b, 0x30d2}, // hikatakana {0x0da4d862, 0x05b6}, // segol13 {0x0db7d6e4, 0x05d4}, // hehebrew {0x0dc03ecb, 0x0a9c}, // jagujarati {0x0dd6f75d, 0x09f6}, // threenumeratorbengali {0x0de664af, 0x01fa}, // Aringacute {0x0deddd7b, 0x017a}, // zacute {0x0df6966e, 0x1e4f}, // otildedieresis {0x0e0870a7, 0x2713}, // checkmark {0x0e0aefc5, 0x05af}, // masoracirclehebrew {0x0e15512a, 0xff43}, // cmonospace {0x0e157c7d, 0x0166}, // Tbar {0x0e34eac4, 0x06ba}, // afii57514 {0x0e359de3, 0x332b}, // paasentosquare {0x0e35e57d, 0x01f4}, // Gacute {0x0e6ec8aa, 0x0a40}, // iimatragurmukhi {0x0e8140cb, 0x2318}, // propellor {0x0e8e8ac7, 0x25aa}, // blacksmallsquare {0x0e8ed92c, 0x05b3}, // hatafqamatsquarterhebrew {0x0e9c1a93, 0x0149}, // quoterightn {0x0eb0ce00, 0xff30}, // Pmonospace {0x0ec7e019, 0xfc4b}, // noonjeemisolatedarabic {0x0ed8b040, 0x33b5}, // nvsquare {0x0edd0c59, 0x0e35}, // saraiithai {0x0ee06289, 0x05b0}, // shevaquarterhebrew {0x0efc1459, 0x09b6}, // shabengali {0x0f02712c, 0x00ea}, // ecircumflex {0x0f066e82, 0x33b3}, // mssquare {0x0f1a6991, 0x24c4}, // Ocircle {0x0f2768b1, 0x05b1}, // hatafsegolwidehebrew {0x0f332d5e, 0x002e}, // period {0x0f35dd15, 0x04b0}, // Ustraightstrokecyrillic {0x0f432338, 0x0020}, // space {0x0f433f21, 0xff7d}, // sukatakanahalfwidth {0x0f610d68, 0x1e53}, // omacronacute {0x0f61debf, 0x33b9}, // mvmegasquare {0x0f8de5e5, 0xff4b}, // kmonospace {0x0f984d6e, 0xfec0}, // dadmedialarabic {0x0fcfb12d, 0x016c}, // Ubreve {0x0fdfc487, 0x02a8}, // tccurl {0x0ff64b0b, 0x0665}, // fivehackarabic {0x1001b5d7, 0xfc48}, // meemmeemisolatedarabic {0x100f790a, 0x20ac}, // Euro {0x101477b7, 0x216a}, // Elevenroman {0x1030f103, 0x0918}, // ghadeva {0x103612b8, 0x2287}, // supersetorequal {0x10459048, 0x2217}, // asteriskmath {0x10529f46, 0x0e59}, // ninethai {0x10656b29, 0x042a}, // afii10044 {0x10659a4d, 0x0041}, // A {0x106ab99c, 0x0943}, // rvocalicvowelsigndeva {0x10827219, 0x01e4}, // Gstroke {0x1087cbb6, 0x318d}, // araeakorean {0x10c49213, 0x094d}, // viramadeva {0x10c6b04c, 0xfee8}, // noonmedialarabic {0x10e1204e, 0x224c}, // allequal {0x1112335e, 0x0e24}, // ruthai {0x1113e9a7, 0x0a87}, // igujarati {0x11140e23, 0xff50}, // pmonospace {0x112533be, 0x0446}, // tsecyrillic {0x1128968b, 0x03dc}, // Digammagreek {0x113f9725, 0x1ea1}, // adotbelow {0x11572f90, 0x3240}, // ideographicfestivalparen {0x1159e298, 0x2484}, // seventeenparen {0x115b5935, 0xff78}, // kukatakanahalfwidth {0x115c3cb2, 0x3179}, // kapyeounssangpieupkorean {0x11672a1e, 0x3051}, // kehiragana {0x1179ac42, 0x00a0}, // nbspace {0x1198b8ba, 0x05f1}, // vavyodhebrew {0x11adf5a7, 0x24a9}, // nparen {0x11aeb63a, 0x2272}, // lessorequivalent {0x11ba40f5, 0x05ea}, // tavhebrew {0x11c11092, 0x1e2c}, // Itildebelow {0x11c8e4b3, 0x2660}, // spadesuitblack {0x11d3eac3, 0x3060}, // dahiragana {0x11d67798, 0xfb33}, // daletdagesh {0x11e401c1, 0x05d6}, // zayin {0x1216fef8, 0x328e}, // ideographmetalcircle {0x1219f723, 0xff6e}, // yosmallkatakanahalfwidth {0x1224d569, 0xfee4}, // meemmedialarabic {0x1228548c, 0x05d0}, // alefhebrew {0x1233afe9, 0x30df}, // mikatakana {0x123a07fe, 0x05e6}, // tsadihebrew {0x1242de49, 0x042b}, // Yericyrillic {0x1246d709, 0x315f}, // wikorean {0x126c42a3, 0x21d0}, // arrowleftdbl {0x1278a8d5, 0x3087}, // yosmallhiragana {0x129b0140, 0x0445}, // afii10087 {0x12a29be8, 0x03c5}, // upsilon {0x12bdd9c7, 0x21a6}, // mapsto {0x12d3e8f7, 0x30c0}, // dakatakana {0x12def4bb, 0xfeba}, // sadfinalarabic {0x12e22bb8, 0x33c2}, // amsquare {0x1329e467, 0x0311}, // breveinvertedcmb {0x132b7bd0, 0x2a04}, // unionmultitext {0x132e0697, 0x01b3}, // Yhook {0x134d9c31, 0x304c}, // gahiragana {0x13597fb3, 0x04d9}, // afii10846 {0x135d6341, 0x33c8}, // dbsquare {0x13635045, 0x0300}, // gravecmb {0x1369554a, 0x207f}, // nsuperior {0x1376f153, 0x0403}, // afii10052 {0x1384d3da, 0x05b4}, // hiriqnarrowhebrew {0x13868087, 0x0636}, // afii57430 {0x138fca68, 0x0a30}, // ragurmukhi {0x13a69297, 0x0917}, // gadeva {0x13bcc567, 0x25d1}, // circlewithrighthalfblack {0x13ccaf5f, 0x3061}, // tihiragana {0x13dc1f9e, 0x05b1}, // hatafsegol {0x13e2dbb5, 0x1e3a}, // Llinebelow {0x140e7a7e, 0x0551}, // Coarmenian {0x14117f5a, 0x1e77}, // ucircumflexbelow {0x141d63ad, 0x1eda}, // Ohornacute {0x142c024d, 0x013a}, // lacute {0x143d707c, 0x05a6}, // merkhakefulalefthebrew {0x146c75cf, 0x3275}, // ieungacirclekorean {0x146f18bb, 0xfb36}, // zayindagesh {0x147a2240, 0x1e81}, // wgrave {0x1486cc9b, 0x054b}, // Jheharmenian {0x14ac715c, 0x2473}, // twentycircle {0x14b421a5, 0x0638}, // zaharabic {0x14c795cf, 0x0051}, // Q {0x14d1cd4b, 0x2284}, // notsubset {0x14d2cd8a, 0x012f}, // iogonek {0x14f2bc91, 0x1eab}, // acircumflextilde {0x15045632, 0x05d1}, // bet {0x1505dc02, 0x3083}, // yasmallhiragana {0x152785c0, 0x30a1}, // asmallkatakana {0x15642935, 0x23a9}, // braceleftbt {0x1564e3f1, 0x05b9}, // holam26 {0x15771621, 0x042c}, // Softsigncyrillic {0x159ac6ab, 0x0591}, // etnahtafoukhlefthebrew {0x159b9dc9, 0x24c6}, // Qcircle {0x15d1c25e, 0x04bf}, // chedescenderabkhasiancyrillic {0x15dd6b0c, 0x25d9}, // whitecircleinverse {0x15f64606, 0x33c5}, // cdsquare {0x15f8ec13, 0x037e}, // questiongreek {0x1602acd3, 0xff38}, // Xmonospace {0x1610c2ad, 0x3181}, // yesieungkorean {0x16393f6d, 0xfef6}, // lamalefmaddaabovefinalarabic {0x164a5cd1, 0x0058}, // X {0x165341dd, 0x02e0}, // gammasuperior {0x167b1fac, 0xfebc}, // sadmedialarabic {0x168b9d05, 0x04d5}, // aiecyrillic {0x169cceb3, 0x005b}, // bracketleft {0x16ad260d, 0x0253}, // bhook {0x16b23c67, 0x3135}, // nieuncieuckorean {0x16ba0a7a, 0x30a9}, // osmallkatakana {0x16d5ac91, 0x3018}, // whitetortoiseshellbracketleft {0x16f9045d, 0x0a16}, // khagurmukhi {0x17093caa, 0x01e3}, // aemacron {0x170fc75c, 0x306c}, // nuhiragana {0x171b516a, 0x0a39}, // hagurmukhi {0x17301afd, 0x3023}, // threehangzhou {0x173c8456, 0x338b}, // nfsquare {0x178d45ae, 0x337e}, // meizierasquare {0x17a9e49b, 0x322a}, // ideographicmoonparen {0x17ad5313, 0x09ab}, // phabengali {0x17da2afa, 0x0335}, // strokeshortoverlaycmb {0x17deda0e, 0x00ed}, // iacute {0x17e36acb, 0x05b8}, // qamats {0x17ef9c62, 0x0a05}, // agurmukhi {0x180419cd, 0xfc62}, // shaddakasraarabic {0x18120be8, 0x200b}, // zerowidthspace {0x18175789, 0x05b3}, // hatafqamatswidehebrew {0x181f5c91, 0x091f}, // ttadeva {0x182bd096, 0x0148}, // ncaron {0x183028bb, 0x04da}, // Schwadieresiscyrillic {0x1840ed9a, 0xfea0}, // jeemmedialarabic {0x18492236, 0x0e5a}, // angkhankhuthai {0x1855a5e3, 0xfe5f}, // numbersignsmall {0x185b816d, 0x0146}, // ncommaaccent {0x187ab455, 0x0e42}, // saraothai {0x1885706c, 0x3157}, // okorean {0x18923bff, 0x2135}, // aleph {0x18a5c10a, 0x2584}, // dnblock {0x18a72a69, 0xfb3a}, // finalkafdageshhebrew {0x18b82c53, 0x045c}, // afii10109 {0x18c46fec, 0x033c}, // seagullbelowcmb {0x18d47bfd, 0x3298}, // ideographiclaborcircle {0x18dbddd2, 0x0993}, // obengali {0x18df8652, 0x2286}, // subsetorequal {0x18ea53c7, 0x0663}, // afii57395 {0x18ec3f78, 0x05e8}, // afii57688 {0x18f0d507, 0xfe9f}, // jeeminitialarabic {0x190a56aa, 0xfe5a}, // parenrightsmall {0x1920c2c2, 0xff65}, // middledotkatakanahalfwidth {0x192c8826, 0x2283}, // superset {0x1940b4fd, 0x2251}, // geometricallyequal {0x19427103, 0x2a01}, // circleplustext {0x1946a31f, 0x05ae}, // zinorhebrew {0x194ec3dd, 0xfb38}, // tetdageshhebrew {0x195fdeed, 0x3013}, // getamark {0x197f461f, 0x1e03}, // bdotaccent {0x1994a487, 0x0481}, // koppacyrillic {0x19985117, 0x339a}, // nmsquare {0x19a1a98b, 0x00ad}, // sfthyphen {0x19ad4aac, 0xfef2}, // yehfinalarabic {0x19b22272, 0x3269}, // chieuchcirclekorean {0x19b344e4, 0x0123}, // gcedilla {0x19b3f208, 0x05b8}, // qamats27 {0x19d833fe, 0x02ba}, // dblprimemod {0x19dea593, 0x0428}, // afii10042 {0x19f7c320, 0x04d1}, // abrevecyrillic {0x19fa29b1, 0x327f}, // koreanstandardsymbol {0x1a00d3da, 0x032b}, // dblarchinvertedbelowcmb {0x1a260946, 0x0447}, // checyrillic {0x1a287ed9, 0x0922}, // ddhadeva {0x1a3b33cb, 0xfed7}, // qafinitialarabic {0x1a3bf649, 0x05b2}, // hatafpatahhebrew {0x1a4f3484, 0x0913}, // odeva {0x1a533d39, 0x0306}, // brevecmb {0x1ac76244, 0x0425}, // Khacyrillic {0x1ac90440, 0x010f}, // dcaron {0x1b240a74, 0x00d8}, // Oslash {0x1b2b4015, 0xfe65}, // greatersmall {0x1b33167a, 0xfe3e}, // dblanglebracketrightvertical {0x1b342691, 0x017c}, // zdot {0x1b39339b, 0x253c}, // SF050000 {0x1b3f9c21, 0x1e72}, // Udieresisbelow {0x1b4399b2, 0x04c7}, // Enhookcyrillic {0x1b5874ea, 0x091b}, // chadeva {0x1b8c8992, 0x2122}, // trademark {0x1ba72293, 0xff03}, // numbersignmonospace {0x1bbb8fb3, 0x0477}, // izhitsadblgravecyrillic {0x1bcb2bfd, 0x337d}, // taisyouerasquare {0x1be98812, 0x24d4}, // ecircle {0x1c079308, 0x09cc}, // auvowelsignbengali {0x1c16ebae, 0x0126}, // Hbar {0x1c2631dd, 0x3385}, // KBsquare {0x1c56e166, 0xfd3f}, // parenrightaltonearabic {0x1c94529b, 0x21b5}, // carriagereturn {0x1cb10674, 0x0a27}, // dhagurmukhi {0x1cb5367a, 0x0532}, // Benarmenian {0x1cdb3e05, 0x2514}, // SF020000 {0x1ce17c08, 0xfea6}, // khahfinalarabic {0x1ce29209, 0x02cc}, // verticallinelowmod {0x1ce40996, 0xff3b}, // bracketleftmonospace {0x1cf31612, 0x0598}, // zarqahebrew {0x1d2559c8, 0x03b9}, // iota {0x1d25e3ef, 0x043c}, // emcyrillic {0x1d420ccb, 0x0430}, // afii10065 {0x1d954d85, 0x09a4}, // tabengali {0x1da7ae8c, 0x00d7}, // multiply {0x1db92094, 0x053d}, // Xeharmenian {0x1dbbea92, 0x02e6}, // tonebarhighmod {0x1dbc2a14, 0x2245}, // congruent {0x1dbe86c5, 0x246d}, // fourteencircle {0x1dc0644e, 0x2012}, // figuredash {0x1ded853e, 0x01cc}, // nj {0x1df7638a, 0x00e4}, // adieresis {0x1dfc2837, 0x217a}, // elevenroman {0x1e0312fa, 0x0290}, // zretroflexhook {0x1e1332fd, 0x0287}, // tturned {0x1e25355a, 0x0461}, // omegacyrillic {0x1e38c8d8, 0x012a}, // Imacron {0x1e56afb4, 0xfc61}, // shaddadammaarabic {0x1e645fd0, 0x00b2}, // twosuperior {0x1e6cddcb, 0x0563}, // gimarmenian {0x1e7c9862, 0x338f}, // squarekg {0x1e82a7c3, 0x2302}, // house {0x1e860782, 0x0983}, // visargabengali {0x1e917582, 0x09a2}, // ddhabengali {0x1ea7d113, 0x031c}, // ringhalfleftbelowcmb {0x1eae034a, 0x3122}, // anbopomofo {0x1eae1716, 0x0434}, // afii10069 {0x1edf9913, 0x1e16}, // Emacronacute {0x1ef123d5, 0x0413}, // Gecyrillic {0x1f06ae25, 0xfb31}, // betdageshhebrew {0x1f1df6d1, 0x3381}, // nasquare {0x1f2383d4, 0x0004}, // controlEOT {0x1f2a4214, 0xfdfa}, // sallallahoualayhewasallamarabic {0x1f60dad4, 0x05e8}, // reshhebrew {0x1f686fbe, 0xff2c}, // Lmonospace {0x1f90aeb4, 0xff7b}, // sakatakanahalfwidth {0x1f93ce2b, 0xff33}, // Smonospace {0x1f9b52d4, 0x0323}, // dotbelowcmb {0x1faa2fdf, 0x203e}, // overline {0x1faf20cc, 0x02b9}, // primemod {0x1fba9d24, 0x1e4a}, // Ncircumflexbelow {0x1fc00e7e, 0x0050}, // P {0x1fc99492, 0x3126}, // erbopomofo {0x1feea4ab, 0x0623}, // afii57411 {0x20061138, 0x1e02}, // Bdotaccent {0x200e9513, 0x030f}, // dblgravecmb {0x201a6676, 0x2310}, // logicalnotreversed {0x201e3ee9, 0x0310}, // candrabinducmb {0x2024cfd1, 0x0475}, // afii10196 {0x2038e6d5, 0x307a}, // pehiragana {0x205d0ec7, 0x03a0}, // Pi {0x207bf81e, 0xff84}, // tokatakanahalfwidth {0x2086c569, 0x00d2}, // Ograve {0x208b3b40, 0xfed0}, // ghainmedialarabic {0x209bfca6, 0x24d5}, // fcircle {0x20a31ebd, 0x2489}, // twoperiod {0x20abefc1, 0x0385}, // dialytikatonos {0x20b8cfa5, 0x0443}, // afii10085 {0x20bc528f, 0x2042}, // asterism {0x20ca67b9, 0x09a1}, // ddabengali {0x20ce09b9, 0xfb7b}, // tchehfinalarabic {0x20dd36ea, 0x207e}, // parenrightsuperior {0x20e840a0, 0x30d4}, // pikatakana {0x2111e869, 0x092a}, // padeva {0x21185c0e, 0x028e}, // yturned {0x2130f98f, 0x0aa0}, // tthagujarati {0x215fc096, 0x000d}, // controlCR {0x21622652, 0x249e}, // cparen {0x21669982, 0x0181}, // Bhook {0x217143de, 0x05b3}, // hatafqamats34 {0x2173a28b, 0x0295}, // glottalstopreversed {0x218d5b62, 0x3232}, // ideographichaveparen {0x21b37808, 0x2477}, // fourparen {0x21bef9d7, 0x0e06}, // khorakhangthai {0x21c0f31f, 0x013b}, // Lcommaaccent {0x21ce0071, 0x2179}, // tenroman {0x21d28f9e, 0x05e9}, // shin {0x21f74f30, 0x043e}, // afii10080 {0x2203033d, 0x019d}, // Nhookleft {0x22037801, 0x044b}, // afii10093 {0x220f1331, 0x05db}, // kafhebrew {0x2221c36b, 0x06f6}, // sixpersian {0x22351581, 0x059f}, // qarneyparahebrew {0x223cb30f, 0xfc9f}, // behmeeminitialarabic {0x225099c3, 0x3149}, // ssangcieuckorean {0x22542ce4, 0x2207}, // nabla {0x22702420, 0x3153}, // eokorean {0x2274db8f, 0xff08}, // parenleftmonospace {0x2282e86d, 0x00fa}, // uacute {0x22a883d2, 0x25c7}, // whitediamond {0x22c93a2b, 0x338d}, // mugsquare {0x22e3ac9e, 0xff4c}, // lmonospace {0x2320c842, 0x0277}, // omegalatinclosed {0x2324e69c, 0x2665}, // heart {0x2351e945, 0x0a8a}, // uugujarati {0x2356706f, 0x0541}, // Jaarmenian {0x23679572, 0x1ef1}, // uhorndotbelow {0x236d79e4, 0x301e}, // quotedblprime {0x237979f3, 0xff73}, // ukatakanahalfwidth {0x23947e9f, 0x0266}, // hhook {0x23b6327c, 0x304f}, // kuhiragana {0x23b9408d, 0x2208}, // element {0x23d291f5, 0x0639}, // ainarabic {0x23d42e51, 0xff0b}, // plusmonospace {0x23e15f1c, 0xff90}, // mikatakanahalfwidth {0x23e70b3f, 0x0664}, // afii57396 {0x23e9f46b, 0xff80}, // takatakanahalfwidth {0x23ea33c4, 0x30f1}, // wekatakana {0x23f0f542, 0xff2f}, // Omonospace {0x2415f58f, 0x3069}, // dohiragana {0x2419b09a, 0x038f}, // Omegatonos {0x241b0583, 0x0a9e}, // nyagujarati {0x241f6494, 0x3105}, // bbopomofo {0x2459d6f7, 0x0aea}, // fourgujarati {0x24688db0, 0x02c1}, // glottalstopreversedmod {0x24776c38, 0x0343}, // koroniscmb {0x2479e0d2, 0x3021}, // onehangzhou {0x249dd6ee, 0x0665}, // afii57397 {0x24c0efcc, 0x316d}, // rieulyeorinhieuhkorean {0x24ccbd1b, 0x09e6}, // zerobengali {0x24d11d48, 0x02c2}, // arrowheadleftmod {0x24d6b19b, 0xfee7}, // nooninitialarabic {0x24deab24, 0x25a4}, // squarehorizontalfill {0x24e9b4e5, 0x21e4}, // arrowtableft {0x24f5be18, 0x0308}, // dieresiscmb {0x2527d2da, 0x300c}, // cornerbracketleft {0x252ef6ac, 0x01de}, // Adieresismacron {0x253f33be, 0x006e}, // n {0x2543ce81, 0x05c1}, // shindothebrew {0x254b8857, 0x0929}, // nnnadeva {0x25725d01, 0x0496}, // Zhedescendercyrillic {0x2592eb8c, 0x1e39}, // ldotbelowmacron {0x25a29a9e, 0x000a}, // controlLF {0x25bfabf1, 0x056c}, // liwnarmenian {0x25c22a8d, 0x0927}, // dhadeva {0x25c3f8ae, 0xff3e}, // asciicircummonospace {0x25ca4638, 0x0576}, // nowarmenian {0x25d83051, 0x0e19}, // nonuthai {0x25e64388, 0x1ee5}, // udotbelow {0x25eb8755, 0xff34}, // Tmonospace {0x25ef68be, 0x0103}, // abreve {0x25f0117e, 0x095f}, // yyadeva {0x2614c40e, 0x0aaf}, // yagujarati {0x262be20f, 0x0471}, // psicyrillic {0x2637caf5, 0x0932}, // ladeva {0x263e0b92, 0x09ac}, // babengali {0x2652690c, 0x3137}, // tikeutkorean {0x265be8ad, 0x01cf}, // Icaron {0x265fdad4, 0x05b8}, // qamatshebrew {0x26621b4d, 0x0072}, // r {0x2669a6cb, 0x211c}, // Rfraktur {0x26837556, 0x0048}, // H {0x26a72a71, 0x3188}, // yoyaekorean {0x26ab6d3a, 0x1ed9}, // ocircumflexdotbelow {0x26af8089, 0x304e}, // gihiragana {0x26b9c1d9, 0x0e30}, // saraathai {0x26c43ea8, 0x0911}, // ocandradeva {0x26caa803, 0x21d4}, // arrowdblboth {0x26cb382e, 0x23ab}, // bracerighttp {0x26f6f992, 0x04e4}, // Idieresiscyrillic {0x26fb496b, 0x3351}, // rittorusquare {0x27075678, 0x012e}, // Iogonek {0x2731451f, 0x0408}, // afii10057 {0x273977ae, 0x0435}, // afii10070 {0x27487450, 0x007e}, // asciitilde {0x275654ea, 0x099b}, // chabengali {0x275a3e46, 0x09a0}, // tthabengali {0x275a5b3b, 0x1ee1}, // ohorntilde {0x27607db6, 0x05b4}, // hiriq2d {0x27a2d18f, 0x05b9}, // holam32 {0x27b7bf17, 0x031f}, // plusbelowcmb {0x27b7cc70, 0xfb2d}, // shindageshsindothebrew {0x27d62d65, 0x200d}, // afii301 {0x27d8dd28, 0x00e8}, // egrave {0x27e6d9df, 0x0271}, // mhook {0x27f31ec3, 0x3271}, // rieulacirclekorean {0x283f3216, 0x2075}, // fivesuperior {0x28898020, 0x0281}, // Rsmallinverted {0x288edd59, 0x24cc}, // Wcircle {0x28d9fe2f, 0x0e41}, // saraaethai {0x28dd4931, 0x3234}, // ideographicnameparen {0x28e31924, 0x0a6c}, // sixgurmukhi {0x28e4057d, 0xfc58}, // yehmeemisolatedarabic {0x28f71acd, 0x0633}, // afii57427 {0x290ed42e, 0x1e18}, // Ecircumflexbelow {0x29287ce1, 0x03d2}, // Upsilon1 {0x29346ac3, 0x2021}, // daggerdbl {0x29371ded, 0x1e8f}, // ydotaccent {0x29734fd7, 0x092d}, // bhadeva {0x298e1b46, 0x01ea}, // Oogonek {0x29958ce9, 0x0005}, // controlENQ {0x29a8f130, 0x04d4}, // Aiecyrillic {0x29ab0eda, 0x0146}, // ncedilla {0x29c07bd0, 0x305e}, // zohiragana {0x29d0597d, 0x262f}, // yinyang {0x29d51dd2, 0x06d1}, // yehthreedotsbelowarabic {0x29d5f944, 0x03e4}, // Feicoptic {0x29e31b8f, 0x05b1}, // hatafsegolhebrew {0x29e6e487, 0x30cc}, // nukatakana {0x29e7f6bb, 0x0035}, // five {0x2a0fca4c, 0x3085}, // yusmallhiragana {0x2a239937, 0x0375}, // numeralsignlowergreek {0x2a28d54e, 0x30aa}, // okatakana {0x2a619f09, 0x2660}, // spade {0x2a645de3, 0x3091}, // wehiragana {0x2a64e363, 0x226e}, // notless {0x2a6a5dc5, 0x3088}, // yohiragana {0x2a72414c, 0x0e44}, // saraaimaimalaithai {0x2a8e7779, 0x0ad0}, // omgujarati {0x2ac0e180, 0x33a6}, // kmcubedsquare {0x2ac17d0f, 0x00f3}, // oacute {0x2ae749c7, 0x00e1}, // aacute {0x2ae8215f, 0x001d}, // controlGS {0x2ae8c5a6, 0x21c4}, // arrowrightoverleft {0x2aedcd2c, 0x09fa}, // issharbengali {0x2afb134c, 0xfb03}, // ffi {0x2b27655e, 0x261c}, // pointingindexleftwhite {0x2b3ff353, 0x2557}, // SF250000 {0x2b42ad49, 0xfe55}, // colonsmall {0x2b5ac1a6, 0x0045}, // E {0x2b84f841, 0x30a6}, // ukatakana {0x2b91651d, 0x0319}, // righttackbelowcmb {0x2b93dd53, 0x0661}, // afii57393 {0x2b9750e3, 0x2200}, // universal {0x2b9c968a, 0x0315}, // commaaboverightcmb {0x2bb5189c, 0x25e3}, // blacklowerlefttriangle {0x2bd253b1, 0x09bf}, // ivowelsignbengali {0x2be6415c, 0x05b3}, // hatafqamatshebrew {0x2beb7c62, 0x013c}, // lcommaaccent {0x2c0f9c0b, 0x0912}, // oshortdeva {0x2c15e9f4, 0x091c}, // jadeva {0x2c1b74f9, 0x2262}, // notidentical {0x2c4944e4, 0x0393}, // Gamma {0x2c91b61a, 0x0640}, // kashidaautonosidebearingarabic {0x2c964b66, 0x334a}, // miribaarusquare {0x2cb17e35, 0xfec6}, // zahfinalarabic {0x2cd9d9ec, 0xfc6d}, // behnoonfinalarabic {0x2cdfcd2a, 0x30cb}, // nikatakana {0x2cf9daf5, 0x3228}, // nineideographicparen {0x2d2e3883, 0x2190}, // arrowleft {0x2d329c65, 0xfb3c}, // lameddageshhebrew {0x2d39ea69, 0x019e}, // nlegrightlong {0x2d3b565d, 0x05ea}, // afii57690 {0x2d456f79, 0x25e2}, // blacklowerrighttriangle {0x2d52bd2b, 0x3326}, // dorusquare {0x2d84140a, 0x0293}, // ezhcurl {0x2d8d5b1d, 0x33d0}, // lmsquare {0x2d95d169, 0x3155}, // yeokorean {0x2d975eca, 0xfb04}, // ffl {0x2d9ae85a, 0x0661}, // onehackarabic {0x2d9b14ff, 0xfb6d}, // vehmedialarabic {0x2da2ea79, 0x313d}, // rieulsioskorean {0x2daa1b6f, 0x090a}, // uudeva {0x2e04353d, 0x1ea9}, // acircumflexhookabove {0x2e043b05, 0xff0a}, // asteriskmonospace {0x2e10a2b1, 0x0374}, // numeralsigngreek {0x2e1eaa7d, 0xfb49}, // shindagesh {0x2e2c25c0, 0x0392}, // Beta {0x2e356485, 0x09c2}, // uuvowelsignbengali {0x2e4224af, 0x05e4}, // afii57684 {0x2e5e0023, 0x0a20}, // tthagurmukhi {0x2e647759, 0x33d6}, // molsquare {0x2e7c6436, 0x3048}, // ehiragana {0x2e915a9d, 0xfe3b}, // blacklenticularbracketleftvertical {0x2e9e14a6, 0x0454}, // ecyrillic {0x2e9ef541, 0x0192}, // florin {0x2ea8b970, 0x327a}, // phieuphacirclekorean {0x2eb22aa1, 0x01dc}, // udieresisgrave {0x2eb3bdc7, 0x027e}, // rfishhook {0x2eb455b0, 0x25b6}, // blackrightpointingtriangle {0x2ec430ea, 0x0078}, // x {0x2ec8352a, 0x0143}, // Nacute {0x2eea1838, 0x0170}, // Uhungarumlaut {0x2efaa14d, 0x3015}, // tortoiseshellbracketright {0x2f06c380, 0x0a91}, // ocandragujarati {0x2f0e722f, 0x0021}, // exclam {0x2f14e4ad, 0x0183}, // btopbar {0x2f22b335, 0x305f}, // tahiragana {0x2f247a45, 0x00b5}, // mu {0x2f42e9c9, 0x0405}, // afii10054 {0x2f4b01e9, 0x03e0}, // Sampigreek {0x2f51a2a5, 0x0591}, // etnahtahebrew {0x2f5af1cc, 0xfec4}, // tahmedialarabic {0x2f5c74c9, 0x30a4}, // ikatakana {0x2f5e2692, 0x033f}, // dbloverlinecmb {0x2f7e3ce0, 0xfb35}, // vavdagesh65 {0x2f7fe7da, 0x04ea}, // Obarreddieresiscyrillic {0x2f8f84ed, 0x3019}, // whitetortoiseshellbracketright {0x2f9c7ff4, 0x221f}, // orthogonal {0x2fa13b0c, 0x0309}, // hookcmb {0x2fa6d960, 0x0e05}, // khokhonthai {0x2fb88e89, 0x0492}, // Ghestrokecyrillic {0x2fe066dc, 0x24c8}, // Scircle {0x2ff9eee3, 0x3231}, // ideographicstockparen {0x30132e73, 0x2474}, // oneparen {0x302d72c2, 0xfb2b}, // shinsindothebrew {0x3033e257, 0x0416}, // Zhecyrillic {0x3034a6d0, 0x0213}, // rinvertedbreve {0x3043436d, 0x0208}, // Idblgrave {0x3046485b, 0x0a41}, // umatragurmukhi {0x30585e10, 0x0631}, // reharabic {0x305b2089, 0x006d}, // m {0x305dc9d7, 0x2480}, // thirteenparen {0x3097f64c, 0x010c}, // Ccaron {0x30b4b18c, 0x0e28}, // sosalathai {0x30c0161e, 0x01d3}, // Ucaron {0x30c9bc6e, 0x0a1e}, // nyagurmukhi {0x30cd38cb, 0x33d8}, // pmsquare {0x30d25d42, 0x2089}, // nineinferior {0x30eada85, 0x2219}, // bulletoperator {0x30f64fef, 0x20aa}, // sheqelhebrew {0x310a4774, 0x337f}, // corporationsquare {0x31158bc3, 0x339f}, // mmsquaredsquare {0x3116a838, 0x0647}, // heharabic {0x312db4ff, 0x2040}, // tie {0x313237dd, 0xff32}, // Rmonospace {0x313f3c20, 0x09df}, // yyabengali {0x3154a912, 0x04ab}, // esdescendercyrillic {0x31f1489a, 0x0643}, // afii57443 {0x31f928de, 0x05df}, // finalnun {0x31fab77d, 0x1eea}, // Uhorngrave {0x3207407e, 0x046b}, // yusbigcyrillic {0x3238fa28, 0x3004}, // jis {0x323ea229, 0x33ac}, // gpasquare {0x324496b3, 0x33bf}, // mwmegasquare {0x3248fa12, 0xfe5e}, // tortoiseshellbracketrightsmall {0x324bc39e, 0x22da}, // lessequalorgreater {0x3266451e, 0x30f2}, // wokatakana {0x326ca1fd, 0x013f}, // Ldot {0x32930f95, 0x046f}, // ksicyrillic {0x329a975f, 0x0a0a}, // uugurmukhi {0x329ed55c, 0x04e1}, // dzeabkhasiancyrillic {0x32d855b8, 0x0ae9}, // threegujarati {0x32e77f07, 0x22c2}, // intersectiontext {0x32fd46a7, 0x041e}, // afii10032 {0x32fe41c6, 0x0667}, // afii57399 {0x330263f2, 0x3136}, // nieunhieuhkorean {0x3303dbcb, 0x04b2}, // Hadescendercyrillic {0x33042de7, 0x1e90}, // Zcircumflex {0x335e3259, 0x3022}, // twohangzhou {0x336106b8, 0x05d7}, // afii57671 {0x33821f87, 0x05e2}, // ayinhebrew {0x33849fcd, 0x304d}, // kihiragana {0x339cb29c, 0x03cb}, // upsilondieresis {0x339dfd30, 0x2200}, // forall {0x33a4598f, 0x0e10}, // thothanthai {0x33dd39ff, 0x0437}, // zecyrillic {0x33ea63c8, 0x24df}, // pcircle {0x33f59002, 0x0285}, // eshsquatreversed {0x340746a2, 0xff4a}, // jmonospace {0x3425ba3a, 0x056d}, // xeharmenian {0x342d52b5, 0x25cb}, // whitecircle {0x34399add, 0x0034}, // four {0x343b0ff5, 0x1e8b}, // xdotaccent {0x343f59f3, 0x0437}, // afii10073 {0x344b950b, 0x031d}, // uptackbelowcmb {0x34515ec0, 0x01ca}, // NJ {0x345791f2, 0x027c}, // rlongleg {0x346086da, 0x2286}, // reflexsubset {0x3463147c, 0x1e69}, // sdotbelowdotaccent {0x3490ad97, 0x047a}, // Omegaroundcyrillic {0x34a7b989, 0x006f}, // o {0x34a88183, 0x2640}, // female {0x34b5f401, 0x016a}, // Umacron {0x34bab99c, 0x24e0}, // qcircle {0x34c88fb4, 0x2312}, // arc {0x34c908a5, 0x1eb4}, // Abrevetilde {0x34df3d1c, 0x00a1}, // exclamdown {0x34e969fb, 0x05a0}, // telishagedolahebrew {0x34f9cd37, 0x010b}, // cdot {0x35188ac4, 0xfeac}, // thalfinalarabic {0x351bf85e, 0x0257}, // dhook {0x351e7136, 0x0482}, // thousandcyrillic {0x352bce90, 0x00a3}, // sterling {0x35378756, 0x2591}, // shadelight {0x35440d94, 0x040c}, // Kjecyrillic {0x354dad21, 0x0129}, // itilde {0x35514624, 0x00d6}, // Odieresis {0x3596098d, 0xfb9f}, // noonghunnafinalarabic {0x359e9c03, 0x0418}, // Iicyrillic {0x359f6846, 0x1ebc}, // Etilde {0x35a9ba78, 0x0a95}, // kagujarati {0x35b65af3, 0x33af}, // radoverssquaredsquare {0x35ce2a2d, 0x066a}, // afii57381 {0x35ddec6f, 0x00eb}, // edieresis {0x35e5fe3b, 0x3118}, // cbopomofo {0x3613bad2, 0x011b}, // ecaron {0x361cb4c9, 0xfb6b}, // vehfinalarabic {0x361e70b8, 0x0043}, // C {0x362459fb, 0xfe97}, // tehinitialarabic {0x362c9d3a, 0x02b0}, // hsuperior {0x36678fdf, 0x2326}, // deleteright {0x3676afc0, 0x0ac9}, // ocandravowelsigngujarati {0x368bf72e, 0x0038}, // eight {0x36aaad0e, 0x307b}, // hohiragana {0x36d3bc14, 0x0491}, // afii10098 {0x36d54fb7, 0x015a}, // Sacute {0x37117bac, 0x059b}, // tevirlefthebrew {0x372986de, 0x05f3}, // gereshhebrew {0x373e5e3f, 0xff27}, // Gmonospace {0x37866f5c, 0x00df}, // germandbls {0x37a73b5a, 0xfee0}, // lammedialarabic {0x37a77cc1, 0x030b}, // hungarumlautcmb {0x37b36429, 0xff68}, // ismallkatakanahalfwidth {0x37b7557e, 0x001c}, // controlFS {0x37c2175b, 0xfcca}, // lamhahinitialarabic {0x37c23820, 0x24c5}, // Pcircle {0x37d669b4, 0x090e}, // eshortdeva {0x37e460db, 0x308d}, // rohiragana {0x37e5061e, 0x04a3}, // endescendercyrillic {0x37f67ca7, 0x029a}, // eopenclosed {0x381040c4, 0x310d}, // gbopomofo {0x381640e0, 0xffe3}, // macronmonospace {0x381c7e4d, 0x1ece}, // Ohookabove {0x38201bde, 0x0961}, // llvocalicdeva {0x38291591, 0x0e2e}, // honokhukthai {0x3839681b, 0x3055}, // sahiragana {0x3863c9a6, 0x208e}, // parenrightinferior {0x386cda71, 0x01f0}, // jcaron {0x38746563, 0x01b0}, // uhorn {0x38880d1d, 0x0198}, // Khook {0x38885f68, 0x091d}, // jhadeva {0x388ccfdd, 0x30e3}, // yasmallkatakana {0x3896be1c, 0x0025}, // percent {0x38a80af1, 0x306d}, // nehiragana {0x38bcbef5, 0x05b7}, // afii57798 {0x38bebcf5, 0x2552}, // SF510000 {0x38ce8c39, 0x059a}, // yetivhebrew {0x38cea50a, 0x24d6}, // gcircle {0x38d9b559, 0x3003}, // dittomark {0x38de4662, 0x1e7c}, // Vtilde {0x38e73ed2, 0x01c0}, // clickdental {0x38efc9e4, 0x04a6}, // Pemiddlehookcyrillic {0x391e728b, 0x099a}, // cabengali {0x392c00af, 0x3305}, // intisquare {0x3934b5de, 0x0e43}, // saraaimaimuanthai {0x3946429a, 0x3010}, // blacklenticularbracketleft {0x396642a3, 0x322d}, // ideographicwoodparen {0x396b44dd, 0x0a3c}, // nuktagurmukhi {0x396d8b52, 0x0930}, // radeva {0x3989511a, 0xfc5e}, // shaddadammatanarabic {0x39918d40, 0x30b6}, // zakatakana {0x399ac15a, 0x0283}, // esh {0x39aa6d90, 0x0a83}, // visargagujarati {0x39b06752, 0x004a}, // J {0x39d0b19b, 0x00ae}, // registered {0x39d5a1b1, 0x019c}, // Mturned {0x39e226d5, 0x05e3}, // afii57683 {0x39f864d5, 0x2462}, // threecircle {0x39fd88e8, 0x05a8}, // qadmahebrew {0x3a029acd, 0x338e}, // squaremg {0x3a0e66b8, 0x1ee6}, // Uhookabove {0x3a1089b2, 0x0073}, // s {0x3a3b69ae, 0x317c}, // siostikeutkorean {0x3a3c0e00, 0xff9d}, // nkatakanahalfwidth {0x3a40856d, 0x25a0}, // blacksquare {0x3a7498f3, 0x05e2}, // ayin {0x3a777405, 0x0945}, // ecandravowelsigndeva {0x3a846086, 0xff9c}, // wakatakanahalfwidth {0x3aa3cfcb, 0x0960}, // rrvocalicdeva {0x3ab26d21, 0x062f}, // dalarabic {0x3ade6670, 0x0440}, // afii10082 {0x3afe4407, 0x25a9}, // squarediagonalcrosshatchfill {0x3b0367b4, 0x0a6b}, // fivegurmukhi {0x3b43910b, 0x0e36}, // sarauethai {0x3b4774fb, 0xfb35}, // vavdageshhebrew {0x3b6394a8, 0x30e0}, // mukatakana {0x3b722aff, 0x02bf}, // ringhalfleft {0x3b86faf7, 0x1e31}, // kacute {0x3b8c9510, 0x0926}, // dadeva {0x3b8f536a, 0x0564}, // daarmenian {0x3b919910, 0x02b4}, // rturnedsuperior {0x3b92b9ea, 0x1e4b}, // ncircumflexbelow {0x3b9a0136, 0x2468}, // ninecircle {0x3b9a26e8, 0x0637}, // taharabic {0x3bf4dcc7, 0xfea3}, // hahinitialarabic {0x3bf5a3f3, 0x301d}, // quotedblprimereversed {0x3c2679f3, 0x25c3}, // whiteleftpointingsmalltriangle {0x3c4101c7, 0x0a2b}, // phagurmukhi {0x3c47c401, 0x0196}, // Iotaafrican {0x3c5c7654, 0x0910}, // aideva {0x3c6261b4, 0x322e}, // ideographicmetalparen {0x3c6e58f4, 0x05d5}, // vavhebrew {0x3c89c6b7, 0x2192}, // arrowright {0x3c9425ca, 0x0666}, // sixhackarabic {0x3c9b6897, 0xff0e}, // periodmonospace {0x3ca31461, 0x01d1}, // Ocaron {0x3ca4227b, 0x0120}, // Gdot {0x3ca9c5ab, 0x0345}, // ypogegrammenigreekcmb {0x3cb5e1bf, 0x3146}, // ssangsioskorean {0x3cb6098f, 0x25b9}, // whiterightpointingsmalltriangle {0x3ccd3832, 0xfc60}, // shaddafathaarabic {0x3cfd6c60, 0x305a}, // zuhiragana {0x3cfe2d05, 0x018f}, // Schwa {0x3d0581a8, 0x313c}, // rieulpieupkorean {0x3d200141, 0x30c9}, // dokatakana {0x3d25bc32, 0x2116}, // numero {0x3d292466, 0x05b1}, // hatafsegol17 {0x3d30abad, 0x0279}, // rturned {0x3d3a35a3, 0x0252}, // ascriptturned {0x3d3c2f4b, 0x309d}, // iterationhiragana {0x3d44ad12, 0x3210}, // tikeutaparenkorean {0x3d4a2f11, 0x0187}, // Chook {0x3d50ceda, 0x21a8}, // arrowupdnbse {0x3d59a63c, 0x30e2}, // mokatakana {0x3d6d45f8, 0x0688}, // ddalarabic {0x3d794ead, 0x04c8}, // enhookcyrillic {0x3d888246, 0x300d}, // cornerbracketright {0x3d93ad95, 0x0171}, // uhungarumlaut {0x3d987773, 0x03c6}, // phi {0x3da1e076, 0xfb2a}, // shinshindot {0x3da24bf2, 0x004d}, // M {0x3da45134, 0xff3d}, // bracketrightmonospace {0x3dac6cb7, 0x212e}, // estimated {0x3db24f7f, 0x04eb}, // obarreddieresiscyrillic {0x3ddbfa17, 0xfe64}, // lesssmall {0x3de84dee, 0x3387}, // GBsquare {0x3de8cd4d, 0x02c9}, // firsttonechinese {0x3deb36dc, 0x0570}, // hoarmenian {0x3e08b864, 0x1e1c}, // Ecedillabreve {0x3e2966c3, 0x25a7}, // squareupperlefttolowerrightfill {0x3e2ad069, 0x0125}, // hcircumflex {0x3e2b18e7, 0x05d2}, // gimelhebrew {0x3e2ddf1a, 0x00fb}, // ucircumflex {0x3e4b0d7f, 0x2478}, // fiveparen {0x3e5c6b2e, 0x2086}, // sixinferior {0x3e78c213, 0x03f3}, // yotgreek {0x3e7bef16, 0x063a}, // ghainarabic {0x3e9c0cab, 0x0e0d}, // yoyingthai {0x3ea9e6c5, 0x044e}, // afii10096 {0x3ec30c4d, 0x0168}, // Utilde {0x3ed6d505, 0x3108}, // fbopomofo {0x3edc9801, 0x031e}, // downtackbelowcmb {0x3edf2653, 0x04ba}, // Shhacyrillic {0x3edfbd48, 0x0959}, // khhadeva {0x3ee5a28f, 0x0342}, // perispomenigreekcmb {0x3ef2c5ca, 0x05df}, // finalnunhebrew {0x3efcef55, 0x09a7}, // dhabengali {0x3f19d4d4, 0x30e5}, // yusmallkatakana {0x3f35ecb4, 0x0a0f}, // eegurmukhi {0x3f36dce9, 0x061b}, // afii57403 {0x3f5ead94, 0x0456}, // icyrillic {0x3f61f37a, 0x1ea3}, // ahookabove {0x3f76f3d1, 0x0214}, // Udblgrave {0x3f817391, 0x314b}, // khieukhkorean {0x3f8b0c34, 0x30c7}, // dekatakana {0x3fa4349b, 0x0e1d}, // fofathai {0x3fa5f151, 0x03de}, // Koppagreek {0x3fbf7ccb, 0x01ae}, // Tretroflexhook {0x3fddfa91, 0x22ce}, // curlyor {0x3fe060fb, 0x0147}, // Ncaron {0x3fe534eb, 0x0e12}, // thophuthaothai {0x4016947c, 0x246b}, // twelvecircle {0x401a74d3, 0x06f3}, // threepersian {0x40663d0c, 0xfeb2}, // seenfinalarabic {0x4069b3b1, 0x24ab}, // pparen {0x407a7b83, 0x0531}, // Aybarmenian {0x407de2ef, 0x06d5}, // afii57534 {0x40882350, 0x0305}, // overlinecmb {0x4096d7d2, 0x006a}, // j {0x409d1b5a, 0xff97}, // rakatakanahalfwidth {0x40b0365e, 0x092f}, // yadeva {0x40e21552, 0x30de}, // makatakana {0x40eb54f4, 0x046d}, // yusbigiotifiedcyrillic {0x413f6e7c, 0x05b4}, // hiriq21 {0x4144d56c, 0x016d}, // ubreve {0x414507c4, 0x05b9}, // holamnarrowhebrew {0x414a0074, 0x3336}, // hekutaarusquare {0x4156eb7c, 0x3123}, // enbopomofo {0x415d9061, 0xff42}, // bmonospace {0x415fae27, 0x0398}, // Theta {0x4161c806, 0x09e1}, // llvocalicbengali {0x416a2ede, 0x0e04}, // khokhwaithai {0x4178dd24, 0x2243}, // asymptoticallyequal {0x41a22b2c, 0x007c}, // bar {0x41a40813, 0xff2d}, // Mmonospace {0x41a4780c, 0x0472}, // afii10147 {0x41c544c2, 0x1ee7}, // uhookabove {0x41c76cd5, 0x05d7}, // het {0x41cb5b30, 0x02db}, // ogonek {0x41da6e39, 0x098c}, // lvocalicbengali {0x41e154b7, 0x1edd}, // ohorngrave {0x41e44ef7, 0x0aaa}, // pagujarati {0x41efdfc2, 0x33c1}, // mohmsquare {0x42320627, 0x2495}, // fourteenperiod {0x4235d221, 0xfecf}, // ghaininitialarabic {0x423f9221, 0x05a7}, // dargahebrew {0x4247685c, 0x01ff}, // oslashacute {0x4252dd77, 0x02c7}, // caron {0x42716524, 0x0069}, // i {0x42737aaf, 0x3081}, // mehiragana {0x427d3f50, 0x04a9}, // haabkhasiancyrillic {0x42803db2, 0x0030}, // zero {0x42813ae4, 0x1e24}, // Hdotbelow {0x428fedda, 0xfb44}, // pedagesh {0x42bba9f5, 0x30f0}, // wikatakana {0x42bc1b07, 0x25c4}, // triaglf {0x42bed72c, 0x33c0}, // kohmsquare {0x42bf360e, 0x1e6e}, // Tlinebelow {0x42d74152, 0x0578}, // voarmenian {0x42e554b2, 0x013b}, // Lcedilla {0x42ed7ca6, 0x0698}, // jeharabic {0x42f02b62, 0xfb95}, // gafmedialarabic {0x42f35290, 0x0064}, // d {0x42fb2842, 0x3120}, // aubopomofo {0x42fc57be, 0x3110}, // jbopomofo {0x42fd43ba, 0x044c}, // afii10094 {0x42fdb31a, 0x0070}, // p {0x4305bc9e, 0x0920}, // tthadeva {0x4306eed3, 0x015d}, // scircumflex {0x430c20fb, 0x215e}, // seveneighths {0x430ddad4, 0xff20}, // atmonospace {0x431e0706, 0x00dc}, // Udieresis {0x43221a39, 0x1e91}, // zcircumflex {0x4328cb01, 0x339d}, // squarecm {0x432e75ab, 0x055d}, // commaarmenian {0x43399322, 0x026c}, // lbelt {0x434b10a7, 0x0a86}, // aagujarati {0x435f906e, 0xfb3e}, // memdageshhebrew {0x436008b6, 0x3064}, // tuhiragana {0x436f4b68, 0xfeaa}, // dalfinalarabic {0x439bf74d, 0xff8b}, // hikatakanahalfwidth {0x43a7e4d1, 0x0635}, // afii57429 {0x43d0d1da, 0x0627}, // afii57415 {0x43d651b4, 0x2663}, // clubsuitblack {0x43d755d6, 0x2212}, // minus {0x43dfb761, 0x0592}, // segoltahebrew {0x4405f04b, 0x05be}, // afii57645 {0x4425746a, 0x0a18}, // ghagurmukhi {0x44317cf4, 0x2662}, // diamondsuitwhite {0x443620cd, 0x00fe}, // thorn {0x444b0abf, 0x0467}, // yuslittlecyrillic {0x444f60e7, 0x007f}, // controlDEL {0x445a3b6e, 0x0447}, // afii10089 {0x4461957b, 0x041c}, // Emcyrillic {0x4464a19f, 0x0acb}, // ovowelsigngujarati {0x4483f355, 0x300f}, // whitecornerbracketright {0x4487c491, 0x3342}, // hoonsquare {0x4492e703, 0x0624}, // afii57412 {0x44979567, 0x0a25}, // thagurmukhi {0x449b4678, 0xfec3}, // tahinitialarabic {0x44a78c72, 0x1eef}, // uhorntilde {0x44b414b4, 0xff0c}, // commamonospace {0x44d687fa, 0x1e06}, // Blinebelow {0x45116064, 0x2592}, // shade {0x453aa0af, 0x09f0}, // ramiddlediagonalbengali {0x4546a724, 0x05d0}, // afii57664 {0x454cef44, 0x2642}, // mars {0x455bcfc1, 0x041d}, // afii10031 {0x457de97e, 0x3184}, // kapyeounphieuphkorean {0x457e9e97, 0x1ee8}, // Uhornacute {0x459f0c78, 0x23a7}, // bracelefttp {0x45b3d9fd, 0x0a22}, // ddhagurmukhi {0x45b6c88f, 0x029b}, // Gsmallhook {0x45b98e95, 0x2163}, // Fourroman {0x45c29649, 0x1ef4}, // Ydotbelow {0x45c5ae6b, 0x0165}, // tcaron {0x45d73e08, 0x0a09}, // ugurmukhi {0x45e50e5b, 0x0384}, // tonos {0x45f6e82c, 0x057f}, // tiwnarmenian {0x45f7d5e0, 0x2084}, // fourinferior {0x46038ece, 0x00b6}, // paragraph {0x460c35ae, 0x05b8}, // qamats10 {0x460ca9f0, 0x30e8}, // yokatakana {0x4611c6d0, 0x000b}, // controlVT {0x461bc854, 0x0194}, // Gammaafrican {0x46271982, 0x23ac}, // bracerightmid {0x4652be4f, 0x1e6d}, // tdotbelow {0x46541398, 0x0111}, // dmacron {0x465ea2f8, 0x3202}, // tikeutparenkorean {0x46611d40, 0x05bb}, // qubuts31 {0x466452b7, 0x321b}, // hieuhaparenkorean {0x467a9a55, 0x055b}, // emphasismarkarmenian {0x46ab407a, 0x322b}, // ideographicfireparen {0x46ab921d, 0x3076}, // buhiragana {0x46ba3911, 0x1e45}, // ndotaccent {0x46bce40e, 0xfb4f}, // aleflamedhebrew {0x46c4dd5b, 0x0433}, // afii10068 {0x46ca3a49, 0x2791}, // eightcircleinversesansserif {0x46e3006c, 0x055c}, // exclamarmenian {0x46f10ed2, 0x222a}, // union {0x46f3948a, 0x05d1}, // bethebrew {0x46f5f918, 0x05c3}, // afii57658 {0x46f9c8ca, 0x2195}, // arrowupdn {0x470d662e, 0x042e}, // IUcyrillic {0x470da4b8, 0x0453}, // gjecyrillic {0x471d219d, 0x00f4}, // ocircumflex {0x472c971d, 0x1e4d}, // otildeacute {0x47542f2d, 0x0107}, // cacute {0x47849b51, 0x05e5}, // finaltsadi {0x478eb915, 0x014f}, // obreve {0x47b12f1d, 0x3009}, // anglebracketright {0x47b78334, 0x09a5}, // thabengali {0x47ee62a0, 0x04f1}, // udieresiscyrillic {0x480265ce, 0x06f2}, // twopersian {0x48175191, 0x0130}, // Idotaccent {0x481e50de, 0xfb32}, // gimeldagesh {0x4825c60d, 0x02c3}, // arrowheadrightmod {0x482626d7, 0x09ee}, // eightbengali {0x4826d3e4, 0x3391}, // khzsquare {0x48270352, 0x1e42}, // Mdotbelow {0x4848966d, 0x05b2}, // hatafpatah {0x485d5052, 0x057d}, // seharmenian {0x48908e05, 0xff28}, // Hmonospace {0x48a3aad1, 0x1ec8}, // Ihookabove {0x48adcc47, 0x0160}, // Scaron {0x48b11825, 0x1e3f}, // macute {0x48b31eb3, 0x02a3}, // dzaltone {0x48bbab6b, 0x1e68}, // Sdotbelowdotaccent {0x48d0cd97, 0x0460}, // Omegacyrillic {0x48ed1289, 0x3180}, // ssangieungkorean {0x48f1ea86, 0x007c}, // verticalbar {0x49188fb6, 0x261d}, // pointingindexupwhite {0x491e8c30, 0x2562}, // SF200000 {0x4928f75b, 0x1e3d}, // lcircumflexbelow {0x49299271, 0x1eee}, // Uhorntilde {0x49314f7c, 0x1e96}, // hlinebelow {0x493c6957, 0x01ec}, // Oogonekmacron {0x497b2a29, 0x03c8}, // psi {0x49877605, 0x1ecf}, // ohookabove {0x49a6c904, 0x00d5}, // Otilde {0x49a8fbe4, 0x227a}, // precedes {0x49b28bf6, 0x011f}, // gbreve {0x49c941c8, 0x0630}, // thalarabic {0x49cf949f, 0x0011}, // controlDC1 {0x49d53679, 0x053e}, // Caarmenian {0x49e41b40, 0x0117}, // edotaccent {0x4a059748, 0x2329}, // angleleft {0x4a0a939e, 0x02dc}, // ilde {0x4a0dc7cd, 0x0273}, // nhookretroflex {0x4a1b8688, 0x0a8f}, // egujarati {0x4a67a4cd, 0x33c6}, // coverkgsquare {0x4a6dc3e0, 0x017c}, // zdotaccent {0x4a8f25d9, 0x0134}, // Jcircumflex {0x4a911686, 0x042a}, // Hardsigncyrillic {0x4aa9a643, 0x220c}, // notcontains {0x4ab871b2, 0x05a9}, // telishaqetanahebrew {0x4ad4b644, 0x066c}, // thousandsseparatorpersian {0x4adaae02, 0x30bc}, // zekatakana {0x4b13bfc7, 0x261f}, // pointingindexdownwhite {0x4b146e46, 0x0076}, // v {0x4b1cfc1b, 0x0052}, // R {0x4b69c8eb, 0x3200}, // kiyeokparenkorean {0x4b7a4380, 0x326b}, // thieuthcirclekorean {0x4b8cb1d3, 0x315a}, // oekorean {0x4b904ad7, 0x09ec}, // sixbengali {0x4bc3db0d, 0xfe8e}, // aleffinalarabic {0x4bcb1484, 0x0997}, // gabengali {0x4bf3941c, 0x04e7}, // odieresiscyrillic {0x4c1231bd, 0xfebe}, // dadfinalarabic {0x4c224e3d, 0x0216}, // Uinvertedbreve {0x4c31d446, 0x05b6}, // segolwidehebrew {0x4c330dc7, 0x2303}, // control {0x4c539c26, 0xff45}, // emonospace {0x4c550d84, 0x0286}, // eshcurl {0x4c63022b, 0x00ac}, // logicalnot {0x4c636f96, 0xfe4c}, // overlinedblwavy {0x4ca2293a, 0x0549}, // Chaarmenian {0x4ca721bb, 0x24d9}, // jcircle {0x4cbb6976, 0x054c}, // Raarmenian {0x4cc2766b, 0x0474}, // Izhitsacyrillic {0x4ccaa98f, 0x0292}, // ezh {0x4cda32dd, 0x2592}, // shademedium {0x4cf1d7c1, 0xfb2c}, // shindageshshindot {0x4d08f8de, 0x278c}, // threecircleinversesansserif {0x4d18f1c3, 0x01e5}, // gstroke {0x4d3fee14, 0x2207}, // gradient {0x4d5e2eea, 0x09c7}, // evowelsignbengali {0x4d66ad61, 0x0259}, // schwa {0x4d6f0f44, 0x03b6}, // zeta {0x4d76cbca, 0x0939}, // hadeva {0x4da2ea17, 0x30f7}, // vakatakana {0x4dad3b1f, 0xff47}, // gmonospace {0x4db4092d, 0x05b2}, // hatafpatahquarterhebrew {0x4dc635ef, 0x03c2}, // sigmafinal {0x4dd49001, 0x04ae}, // Ustraightcyrillic {0x4dd4e51e, 0x05e3}, // finalpe {0x4ddb0ff8, 0x3014}, // tortoiseshellbracketleft {0x4ddbe970, 0x0054}, // T {0x4ddd9ef4, 0x3296}, // ideographicfinancialcircle {0x4dedf33d, 0xff8d}, // hekatakanahalfwidth {0x4def9c7c, 0x2327}, // clear {0x4dfb4b2a, 0x247b}, // eightparen {0x4e03617a, 0x0ac1}, // uvowelsigngujarati {0x4e0fdced, 0x0a2d}, // bhagurmukhi {0x4e1cdd9c, 0x247d}, // tenparen {0x4e63a83b, 0x0642}, // qafarabic {0x4e7d8096, 0xff53}, // smonospace {0x4e8356bc, 0x0108}, // Ccircumflex {0x4eb853e7, 0x3384}, // kasquare {0x4ec3d2dc, 0xfccb}, // lamkhahinitialarabic {0x4ec752cf, 0x2022}, // bullet {0x4ef94777, 0x323b}, // ideographicstudyparen {0x4efcaf3c, 0x01ff}, // ostrokeacute {0x4f1d81af, 0x05bb}, // qubuts {0x4f1d9a74, 0x1e15}, // emacrongrave {0x4f1fbad2, 0x33b2}, // mussquare {0x4f238367, 0x0270}, // mlonglegturned {0x4f23d8fd, 0xfeda}, // kaffinalarabic {0x4f2d09de, 0x0662}, // twohackarabic {0x4f2efda5, 0xff07}, // quotesinglemonospace {0x4f30c414, 0x01c6}, // dzcaron {0x4f4be9c8, 0x3129}, // iubopomofo {0x4f6c2078, 0x00e5}, // aring {0x4f9b207b, 0x06c1}, // hehaltonearabic {0x4f9deafc, 0x03c4}, // tau {0x4fb92256, 0x216b}, // Twelveroman {0x4fdd1a2b, 0x300a}, // dblanglebracketleft {0x4feaecfe, 0x22c3}, // uniontext {0x5004c9ab, 0x09ed}, // sevenbengali {0x50166be8, 0x049a}, // Kadescendercyrillic {0x501dd48e, 0x2229}, // intersection {0x5024fa7b, 0x260f}, // whitetelephone {0x502bdceb, 0x3290}, // ideographsuncircle {0x503133b5, 0x0009}, // controlHT {0x507713d7, 0x2a02}, // circlemultiplytext {0x50794cf3, 0x255d}, // SF260000 {0x508090a0, 0xff82}, // tukatakanahalfwidth {0x50993bc3, 0x05dd}, // finalmemhebrew {0x509ec6af, 0x0490}, // Gheupturncyrillic {0x50a87245, 0x05b9}, // holamwidehebrew {0x50be3a5b, 0x3189}, // yoikorean {0x50cc5524, 0x00be}, // threequarters {0x50cc8cef, 0x24a3}, // hparen {0x50fb6106, 0x30c1}, // tikatakana {0x510f444c, 0x0662}, // afii57394 {0x511118c0, 0x05b8}, // qamatsqatanquarterhebrew {0x51250a43, 0x0ab9}, // hagujarati {0x5125d1fa, 0x25a1}, // whitesquare {0x513a52c9, 0x2510}, // SF030000 {0x51439af3, 0x064e}, // afii57454 {0x5147986a, 0xff5b}, // braceleftmonospace {0x514d7298, 0x3238}, // ideographiclaborparen {0x515692ea, 0x0414}, // Decyrillic {0x51616742, 0x328c}, // ideographwatercircle {0x51817d65, 0xfca1}, // tehjeeminitialarabic {0x51969939, 0x03ba}, // kappa {0x51ca7ab6, 0x00f6}, // odieresis {0x51cbc424, 0x014d}, // omacron {0x51d34569, 0x00e9}, // eacute {0x51e6847c, 0x05b2}, // hatafpatah16 {0x51ed3cb2, 0x00af}, // macron {0x51f006ea, 0x24af}, // tparen {0x51f3c5bb, 0x2082}, // twoinferior {0x51fee10e, 0x2210}, // coproducttext {0x52099e7d, 0x3267}, // ieungcirclekorean {0x5241ded3, 0x0428}, // Shacyrillic {0x5247cafc, 0x0691}, // afii57513 {0x524c924c, 0x02d6}, // plusmod {0x525a3324, 0x2606}, // whitestar {0x5282fafa, 0x0e09}, // chochingthai {0x528afecc, 0xfb89}, // ddalfinalarabic {0x52beac4f, 0x25bf}, // whitedownpointingsmalltriangle {0x52e15cc8, 0x24b6}, // Acircle {0x52f72574, 0x3322}, // sentisquare {0x530e1856, 0x05dd}, // finalmem {0x531472bf, 0x05bb}, // qubutswidehebrew {0x531963a3, 0x0a73}, // uragurmukhi {0x531c6e1f, 0x315b}, // yokorean {0x532f469f, 0x093d}, // avagrahadeva {0x533e9388, 0x02bc}, // afii57929 {0x537b0d36, 0x0466}, // Yuslittlecyrillic {0x53b3b784, 0xfb4a}, // tavdagesh {0x53ca8524, 0x099d}, // jhabengali {0x53d8dfb9, 0x3115}, // shbopomofo {0x53e66e1a, 0x0476}, // Izhitsadblgravecyrillic {0x53f49c2a, 0x066c}, // thousandsseparatorarabic {0x53f951b5, 0x056f}, // kenarmenian {0x540493c8, 0x03b1}, // alpha {0x540c5f40, 0x0552}, // Yiwnarmenian {0x542576f9, 0x0a07}, // igurmukhi {0x542f1e7a, 0x0151}, // ohungarumlaut {0x54761f15, 0x0631}, // afii57425 {0x54820079, 0x04df}, // zedieresiscyrillic {0x548a6dde, 0x0451}, // iocyrillic {0x5494ff15, 0x053c}, // Liwnarmenian {0x54cc0e6b, 0x0212}, // Rinvertedbreve {0x54dfda54, 0xfe44}, // whitecornerbracketrightvertical {0x54f8c0f2, 0x1e78}, // Utildeacute {0x55003750, 0x05b0}, // shevanarrowhebrew {0x55021a5a, 0x0644}, // lamarabic {0x550a9f23, 0x0452}, // djecyrillic {0x550d7456, 0x0061}, // a {0x5512ec97, 0x0067}, // g {0x552e72ea, 0x1e8d}, // xdieresis {0x5532b75e, 0x3044}, // ihiragana {0x554f67fa, 0x1e4e}, // Otildedieresis {0x556bcf7c, 0xff1f}, // questionmonospace {0x5575c7a8, 0x09a8}, // nabengali {0x557f8e27, 0x1ee0}, // Ohorntilde {0x558d2385, 0x0318}, // lefttackbelowcmb {0x55aa99d5, 0xfe3f}, // anglebracketleftvertical {0x55b44317, 0x1ef2}, // Ygrave {0x55c6e8cd, 0x0aac}, // bagujarati {0x55e74cbe, 0x23a6}, // bracketrightbt {0x55e81ebb, 0x3124}, // angbopomofo {0x56000715, 0x33b0}, // pssquare {0x560f90ad, 0x25e4}, // blackupperlefttriangle {0x56200891, 0x092b}, // phadeva {0x56217879, 0x0596}, // tipehalefthebrew {0x56362764, 0x24d0}, // acircle {0x565aa859, 0x30a8}, // ekatakana {0x565d95fc, 0x3109}, // dbopomofo {0x56a0101f, 0x04ac}, // Tedescendercyrillic {0x56d036b9, 0x000f}, // controlSI {0x56deae12, 0x0102}, // Abreve {0x57050efe, 0x0145}, // Ncommaaccent {0x5708e98e, 0x3154}, // ekorean {0x5713d355, 0x2790}, // sevencircleinversesansserif {0x575226bc, 0x239f}, // parenrightex {0x57687403, 0x0e08}, // chochanthai {0x576959da, 0x04b7}, // chedescendercyrillic {0x577fdcc5, 0x033a}, // bridgeinvertedbelowcmb {0x578594f4, 0x0e47}, // maitaikhuthai {0x579e8de2, 0x2074}, // foursuperior {0x57a10bfe, 0x0435}, // iecyrillic {0x57c4d153, 0xfb1f}, // yodyodpatahhebrew {0x57c8c90f, 0x313b}, // rieulmieumkorean {0x57cea503, 0xff17}, // sevenmonospace {0x57fc3d5e, 0x255b}, // SF280000 {0x58064efc, 0x0448}, // shacyrillic {0x580bc6b8, 0x2320}, // integraltop {0x580e0aa6, 0x005e}, // asciicircum {0x5817c838, 0x3141}, // mieumkorean {0x581d6ffc, 0x1ef8}, // Ytilde {0x58246165, 0x0152}, // OE {0x582e4f2f, 0x02a1}, // glottalstopstroke {0x58408a1e, 0x2321}, // integralbottom {0x584e8397, 0x263a}, // whitesmilingface {0x5855c496, 0x0465}, // eiotifiedcyrillic {0x587d22eb, 0x208d}, // parenleftinferior {0x58a61c85, 0x1e9a}, // arighthalfring {0x58ab0a67, 0x0544}, // Menarmenian {0x58ba15a9, 0x24c9}, // Tcircle {0x58c52193, 0x221a}, // radical {0x58df0572, 0x0301}, // acutecmb {0x58dfd388, 0x3187}, // yoyakorean {0x58e61a1f, 0x05e8}, // resh {0x58ea1dd9, 0x0650}, // afii57456 {0x593b3f38, 0x0aa1}, // ddagujarati {0x5951351c, 0x0109}, // ccircumflex {0x59664498, 0xff21}, // Amonospace {0x597231b2, 0x1e00}, // Aringbelow {0x598309ec, 0x1edc}, // Ohorngrave {0x598631c5, 0x24c1}, // Lcircle {0x59b5003e, 0x3274}, // siosacirclekorean {0x59b9b187, 0x0075}, // u {0x59be0f3a, 0xff7f}, // sokatakanahalfwidth {0x59c46f70, 0x3299}, // ideographicsecretcircle {0x59c80d40, 0x2482}, // fifteenparen {0x59d6d87b, 0xff74}, // ekatakanahalfwidth {0x59d7f689, 0x3393}, // ghzsquare {0x59eccfd0, 0x05a3}, // munahlefthebrew {0x5a1aca3c, 0xfe34}, // wavyunderscorevertical {0x5a24f67c, 0x03b4}, // delta {0x5a3b6461, 0xfeb8}, // sheenmedialarabic {0x5a532aa6, 0x0586}, // feharmenian {0x5a575dc4, 0x0582}, // yiwnarmenian {0x5a62c8e8, 0x005c}, // backslash {0x5a8d2a4a, 0x09c3}, // rvocalicvowelsignbengali {0x5a963c7c, 0x0e02}, // khokhaithai {0x5acd345c, 0x339c}, // squaremm {0x5af634c5, 0x059e}, // gershayimaccenthebrew {0x5b041347, 0x0581}, // coarmenian {0x5b0fd985, 0x0360}, // tildedoublecmb {0x5b1907c0, 0x30a5}, // usmallkatakana {0x5b1da33a, 0x2206}, // increment {0x5b1dbca0, 0x0aa6}, // dagujarati {0x5b426364, 0x30cf}, // hakatakana {0x5b426591, 0xfeb7}, // sheeninitialarabic {0x5b46f9e7, 0x2080}, // zeroinferior {0x5b54a5c3, 0x05e1}, // afii57681 {0x5b5f52e7, 0x0421}, // afii10035 {0x5b6ab184, 0x25ef}, // largecircle {0x5b6f6c30, 0x0003}, // controlETX {0x5b720455, 0x014c}, // Omacron {0x5b72ad21, 0x03d5}, // phi1 {0x5b785975, 0x02a7}, // tesh {0x5b7a64f2, 0x0597}, // reviahebrew {0x5bbfa15f, 0x25c4}, // blackleftpointingpointer {0x5bc1fa37, 0xfb47}, // qofdageshhebrew {0x5be94211, 0xff24}, // Dmonospace {0x5beb1e0f, 0x24cf}, // Zcircle {0x5c0e8b47, 0x0426}, // afii10040 {0x5c185e06, 0x0250}, // aturned {0x5c299659, 0x250c}, // SF010000 {0x5c337c81, 0xff8a}, // hakatakanahalfwidth {0x5c3478b9, 0xff3a}, // Zmonospace {0x5c349e9d, 0x30c5}, // dukatakana {0x5c352033, 0x092c}, // badeva {0x5c3b9279, 0x307e}, // mahiragana {0x5c3eecc5, 0x2561}, // SF190000 {0x5c4a060e, 0x0e29}, // sorusithai {0x5c6b0ced, 0x05b8}, // qamats33 {0x5c71c76c, 0x24b8}, // Ccircle {0x5c7f4966, 0x01b8}, // Ezhreversed {0x5c97be88, 0x0a2a}, // pagurmukhi {0x5c9a7487, 0x30ec}, // rekatakana {0x5ca0edc2, 0x01e7}, // gcaron {0x5cad2e17, 0x0679}, // tteharabic {0x5cb64e9e, 0x0150}, // Ohungarumlaut {0x5cb98a11, 0x05e9}, // afii57689 {0x5cc203b0, 0x09eb}, // fivebengali {0x5cde4fa9, 0xff39}, // Ymonospace {0x5ce216d6, 0x02bb}, // commaturnedmod {0x5ce89c18, 0x028c}, // vturned {0x5cee9de2, 0x333b}, // peezisquare {0x5d053ab9, 0x334d}, // meetorusquare {0x5d06b34a, 0x01f5}, // gacute {0x5d185c29, 0x0aec}, // sixgujarati {0x5d23e967, 0x019a}, // lbar {0x5d24fed7, 0x047d}, // omegatitlocyrillic {0x5d26ca2e, 0x0996}, // khabengali {0x5d32256c, 0x25c6}, // blackdiamond {0x5d333915, 0x2234}, // therefore {0x5d42ce05, 0x30c2}, // dikatakana {0x5d590cb1, 0x05bb}, // qubutsnarrowhebrew {0x5d71a05b, 0x0017}, // controlETB {0x5d85b369, 0x05b8}, // qamats29 {0x5d8c507f, 0xfb47}, // qofdagesh {0x5da58253, 0x30d0}, // bakatakana {0x5dba07ed, 0x22a5}, // perpendicular {0x5dbeec87, 0x01cd}, // Acaron {0x5de3b63c, 0x09cb}, // ovowelsignbengali {0x5e0aac56, 0x0200}, // Adblgrave {0x5e1c8dfa, 0x05b0}, // sheva2e {0x5e27fa57, 0xff6d}, // yusmallkatakanahalfwidth {0x5e36a670, 0xfe33}, // underscorevertical {0x5e483ddc, 0x3277}, // chieuchacirclekorean {0x5e4f2fbb, 0x1e65}, // sacutedotaccent {0x5ea7176f, 0x02d9}, // dotaccent {0x5edd1e19, 0xff25}, // Emonospace {0x5edd9086, 0x003a}, // colon {0x5eddf92b, 0x0044}, // D {0x5ee2af9c, 0x0e58}, // eightthai {0x5f03252d, 0x0136}, // Kcedilla {0x5f0ec9e9, 0x039a}, // Kappa {0x5f1bf33a, 0x1e17}, // emacronacute {0x5f4a5f07, 0x0abe}, // aavowelsigngujarati {0x5f5c5d5f, 0x041b}, // Elcyrillic {0x5f63748c, 0x03e6}, // Kheicoptic {0x5f7dc76d, 0x033b}, // squarebelowcmb {0x5f881d5c, 0x3160}, // yukorean {0x5f8f63e2, 0x24a0}, // eparen {0x5f99c0ac, 0x01ad}, // thook {0x5fa5f5cc, 0xfefa}, // lamalefhamzabelowfinalarabic {0x5fb56903, 0x095d}, // rhadeva {0x5fbeac33, 0x028b}, // vhook {0x5fe9065e, 0x042e}, // afii10048 {0x6037ae88, 0x1ef3}, // ygrave {0x603b5882, 0x2287}, // reflexsuperset {0x603b9d93, 0x00d3}, // Oacute {0x603ff393, 0x1e6c}, // Tdotbelow {0x60753fe5, 0x066d}, // afii63167 {0x607c93ed, 0x01b2}, // Vhook {0x60a46930, 0x0197}, // Istroke {0x60a4c80a, 0x30ee}, // wasmallkatakana {0x60ac2314, 0x25cc}, // dottedcircle {0x60ba7236, 0x000e}, // controlSO {0x60d57bed, 0x0aa4}, // tagujarati {0x60e1bf57, 0x1e0d}, // ddotbelow {0x60ebe651, 0x1ed8}, // Ocircumflexdotbelow {0x60f5a9fa, 0x03b7}, // eta {0x6106119c, 0xff37}, // Wmonospace {0x610b31e6, 0x01f1}, // DZ {0x6114c811, 0x1ef0}, // Uhorndotbelow {0x6121a3f6, 0x0e4d}, // nikhahitthai {0x61239a5a, 0x01c2}, // clickalveolar {0x6143b142, 0x1e67}, // scarondotaccent {0x61503571, 0x027b}, // rhookturned {0x6154bc05, 0x043b}, // afii10077 {0x617c687c, 0x01a2}, // Oi {0x6198a771, 0xfef3}, // alefmaksurainitialarabic {0x61a21109, 0x01c9}, // lj {0x61a2d0df, 0x258c}, // lfblock {0x61a6f1a4, 0x0264}, // ramshorn {0x61b4ed39, 0x25ba}, // triagrt {0x61b7afbf, 0x05b5}, // tserenarrowhebrew {0x61b9f022, 0x04c4}, // kahookcyrillic {0x61ce131a, 0x0647}, // afii57470 {0x61d46fc2, 0x1ed6}, // Ocircumflextilde {0x61d7bcdb, 0x1e57}, // pdotaccent {0x61e75298, 0x0417}, // afii10025 {0x61f36361, 0x06f8}, // eightpersian {0x61fe712f, 0x20a4}, // afii08941 {0x621057dd, 0x1ef5}, // ydotbelow {0x62127977, 0x266a}, // musicalnote {0x62161c15, 0x05da}, // finalkafhebrew {0x6229838d, 0x05d0}, // alef {0x62447ae3, 0x0314}, // commareversedabovecmb {0x6248b5e6, 0x33dd}, // wbsquare {0x625320aa, 0x30b2}, // gekatakana {0x6260c6fc, 0x0589}, // periodarmenian {0x6265e881, 0x2266}, // lessoverequal {0x626cbaa4, 0x01bf}, // wynn {0x62724d89, 0x09ad}, // bhabengali {0x62896f4a, 0x05f2}, // yodyodhebrew {0x628a5951, 0xff56}, // vmonospace {0x62a11b25, 0x1e87}, // wdotaccent {0x62accaf5, 0x239d}, // parenleftbt {0x62b2cd2d, 0x00c2}, // Acircumflex {0x62b6e7ac, 0x01a5}, // phook {0x62c361d5, 0x05e2}, // afii57682 {0x62c52689, 0x05d5}, // afii57669 {0x62ca59ed, 0x03aa}, // Iotadieresis {0x62cfccee, 0x017d}, // Zcaron {0x62d27ffc, 0x0567}, // eharmenian {0x62f7161d, 0x3020}, // postalmarkface {0x630680b1, 0x1e20}, // Gmacron {0x63070542, 0x0401}, // afii10023 {0x630758ff, 0x317e}, // sioscieuckorean {0x632ae410, 0x0acc}, // auvowelsigngujarati {0x634ac34b, 0x2297}, // timescircle {0x634e42e5, 0xff2b}, // Kmonospace {0x635a9554, 0x04e5}, // idieresiscyrillic {0x636fabd5, 0x093c}, // nuktadeva {0x637ae7ca, 0x0344}, // dialytikatonoscmb {0x637d3539, 0x00bc}, // onequarter {0x6389d9bb, 0x0641}, // afii57441 {0x63a82931, 0x0297}, // cstretched {0x63d84bb6, 0x2281}, // notsucceeds {0x63dfed74, 0x311f}, // eibopomofo {0x63e274d2, 0xfc0b}, // tehjeemisolatedarabic {0x63e60b13, 0x0149}, // napostrophe {0x63f6cd8f, 0x049d}, // kaverticalstrokecyrillic {0x642b78c5, 0x1ed5}, // ocircumflexhookabove {0x642e193e, 0x0469}, // yuslittleiotifiedcyrillic {0x6434f04a, 0xfd88}, // lammeemhahinitialarabic {0x64468e36, 0x0e18}, // thothongthai {0x64517fe8, 0x004b}, // K {0x6453c78e, 0x064e}, // fathalowarabic {0x6460d798, 0x3025}, // fivehangzhou {0x646b157e, 0x3242}, // ideographicselfparen {0x646c5c19, 0x0ab5}, // vagujarati {0x647eca4f, 0x09ae}, // mabengali {0x64a1b76b, 0x30fa}, // vokatakana {0x64d00b32, 0x0114}, // Ebreve {0x64d7a402, 0x0e40}, // saraethai {0x64d94f4a, 0x0e01}, // kokaithai {0x64e7dff2, 0x09c4}, // rrvocalicvowelsignbengali {0x64eb016b, 0x2245}, // approximatelyequal {0x64fd7a48, 0x2078}, // eightsuperior {0x650678be, 0x02cb}, // fourthtonechinese {0x65070663, 0x0459}, // ljecyrillic {0x6510d99a, 0x0938}, // sadeva {0x651d5722, 0x04c2}, // zhebrevecyrillic {0x6525cdb1, 0x00ad}, // softhyphen {0x6543f12c, 0x01d5}, // Udieresismacron {0x654d08a0, 0x0e3a}, // phinthuthai {0x657ffabd, 0x22ee}, // ellipsisvertical {0x6598fbfe, 0x3112}, // xbopomofo {0x65a5bd1b, 0x24e1}, // rcircle {0x65be15d1, 0x0a08}, // iigurmukhi {0x65c095c5, 0x200e}, // afii299 {0x65cc1f56, 0x0545}, // Yiarmenian {0x662a6586, 0x23a0}, // parenrightbt {0x662a831c, 0x1eeb}, // uhorngrave {0x663a2c1a, 0x3300}, // apaatosquare {0x6642f834, 0x0361}, // breveinverteddoublecmb {0x665bba62, 0x2017}, // dbllowline {0x665e930f, 0x3264}, // mieumcirclekorean {0x666ae75e, 0x0159}, // rcaron {0x666e8927, 0xfc4e}, // noonmeemisolatedarabic {0x666faf51, 0xfba5}, // hehhamzaabovefinalarabic {0x6689dbc7, 0x33cb}, // HPsquare {0x668e9764, 0x30a2}, // akatakana {0x66bb979c, 0x246c}, // thirteencircle {0x66c590a5, 0x2236}, // ratio {0x66e9c5c7, 0x3084}, // yahiragana {0x66ef8fdf, 0x040f}, // afii10145 {0x66fb9b49, 0x33c9}, // gysquare {0x67188e74, 0x0066}, // f {0x6740a4ac, 0x25cf}, // H18533 {0x67427e4a, 0x2079}, // ninesuperior {0x674a0210, 0x02b6}, // Rsmallinvertedsuperior {0x674c80b7, 0x03da}, // Stigmagreek {0x67569fa6, 0x05b5}, // tsere {0x6758c83c, 0x2588}, // block {0x6776a85a, 0x0ac7}, // evowelsigngujarati {0x6779be95, 0x3113}, // zhbopomofo {0x6785194b, 0x221f}, // rightangle {0x679d9205, 0x02c5}, // arrowheaddownmod {0x679dcadd, 0x0e54}, // fourthai {0x679ffc49, 0x2024}, // onedotenleader {0x67ea250f, 0x1e2d}, // itildebelow {0x67ebcea4, 0x3209}, // chieuchparenkorean {0x67f3db47, 0x3073}, // bihiragana {0x67f3ecac, 0xfb4b}, // afii57700 {0x67f7f220, 0x309c}, // semivoicedmarkkana {0x67fa1db6, 0x203a}, // guilsinglright {0x68070609, 0x0916}, // khadeva {0x6808ec86, 0x02d8}, // breve {0x6811e3e1, 0x0404}, // Ecyrillic {0x6814026d, 0x02c8}, // verticallinemod {0x682b08dd, 0x01ac}, // Thook {0x6853e235, 0x0652}, // sukunarabic {0x685932be, 0xfe36}, // parenrightvertical {0x68a76955, 0x00c7}, // Ccedilla {0x68b3215e, 0x0339}, // ringhalfrightbelowcmb {0x68b98a65, 0x0679}, // afii57511 {0x68ccd1d8, 0x3212}, // mieumaparenkorean {0x68eb418e, 0x3011}, // blacklenticularbracketright {0x690f8118, 0x320b}, // thieuthparenkorean {0x692bc1f7, 0x0a42}, // uumatragurmukhi {0x693ccd9c, 0x0432}, // vecyrillic {0x6962e430, 0x0322}, // hookretroflexbelowcmb {0x6977f4b7, 0xff05}, // percentmonospace {0x697925af, 0x05d2}, // gimel {0x697feb80, 0x030d}, // verticallineabovecmb {0x6991a62a, 0x0935}, // vadeva {0x699d525a, 0x0111}, // dcroat {0x69aabc4d, 0x06af}, // gafarabic {0x69d31152, 0x0e51}, // onethai {0x69faaae4, 0x33a7}, // moverssquare {0x6a104703, 0x2569}, // SF400000 {0x6a16e743, 0xfef0}, // alefmaksurafinalarabic {0x6a3d8bdc, 0x0a99}, // ngagujarati {0x6a511868, 0x03a7}, // Chi {0x6a5f0a3f, 0x334e}, // yaadosquare {0x6a721907, 0xfecc}, // ainmedialarabic {0x6a8d644d, 0x1ead}, // acircumflexdotbelow {0x6a972227, 0x0401}, // Iocyrillic {0x6a988d53, 0x2035}, // primereversed {0x6a9b2b92, 0x0414}, // afii10021 {0x6aa62850, 0x0662}, // twoarabic {0x6aa82ca6, 0x3218}, // khieukhaparenkorean {0x6abb1490, 0x005d}, // bracketright {0x6ad19d29, 0xfb1f}, // doubleyodpatahhebrew {0x6b214948, 0xff6f}, // tusmallkatakanahalfwidth {0x6b2d374c, 0xfcdd}, // yehmeeminitialarabic {0x6b3f02ab, 0x211e}, // prescription {0x6b58bab9, 0x0963}, // llvocalicvowelsigndeva {0x6b83db74, 0x2295}, // circleplus {0x6b85cd6e, 0x00a4}, // currency {0x6b8b924f, 0x30d8}, // hekatakana {0x6b908b1b, 0x09e7}, // onebengali {0x6b98f18c, 0x212b}, // angstrom {0x6b9adcc4, 0x25cf}, // blackcircle {0x6b9f4fbe, 0x0940}, // iivowelsigndeva {0x6baa5ba4, 0x03ce}, // omegatonos {0x6bbd76c8, 0x0936}, // shadeva {0x6bca6ff5, 0xfe4a}, // overlinecenterline {0x6bd59d12, 0x0915}, // kadeva {0x6bd609d3, 0x00f0}, // eth {0x6be13af7, 0x2199}, // arrowdownleft {0x6bf10a81, 0x2015}, // horizontalbar {0x6c0e37b1, 0x30ce}, // nokatakana {0x6c11086e, 0x0a1c}, // jagurmukhi {0x6c180b9f, 0x0462}, // Yatcyrillic {0x6c429460, 0xfb40}, // nundageshhebrew {0x6c5c9da6, 0x0457}, // yicyrillic {0x6c781e8a, 0x25bd}, // whitedownpointingtriangle {0x6c8584d5, 0x3065}, // duhiragana {0x6c95b865, 0x0941}, // uvowelsigndeva {0x6c98a67f, 0x0479}, // ukcyrillic {0x6cbb9b7a, 0xfe5d}, // tortoiseshellbracketleftsmall {0x6cce2d3d, 0x0aa5}, // thagujarati {0x6cce7f58, 0x043b}, // elcyrillic {0x6d02864a, 0x049c}, // Kaverticalstrokecyrillic {0x6d1b554b, 0x0982}, // anusvarabengali {0x6d3fc0d7, 0x040f}, // Dzhecyrillic {0x6d519305, 0x2169}, // Tenroman {0x6d63a915, 0x02bc}, // apostrophemod {0x6d6c6ece, 0x307f}, // mihiragana {0x6d794da3, 0x0057}, // W {0x6d7a8d87, 0x00fd}, // yacute {0x6d88930b, 0x044a}, // afii10092 {0x6d89653d, 0x24e8}, // ycircle {0x6d8f5cd4, 0xff95}, // yukatakanahalfwidth {0x6d931b7f, 0x255c}, // SF270000 {0x6d9b9c3e, 0x05dc}, // afii57676 {0x6dd186b9, 0x0575}, // yiarmenian {0x6ddcf118, 0x22a4}, // tackdown {0x6ddd69da, 0x05b1}, // hatafsegolquarterhebrew {0x6df68266, 0x0388}, // Epsilontonos {0x6df8e451, 0x2203}, // existential {0x6dfa6cea, 0x0a66}, // zerogurmukhi {0x6dff449c, 0xff79}, // kekatakanahalfwidth {0x6e298b2c, 0x3380}, // paampssquare {0x6e2b4011, 0x2213}, // minusplus {0x6e2e0a97, 0xfe66}, // equalsmall {0x6e53b9b3, 0xfb00}, // ff {0x6e5f0868, 0x30ed}, // rokatakana {0x6e7cf223, 0x3071}, // pahiragana {0x6e81816d, 0x1e5d}, // rdotbelowmacron {0x6e897228, 0x0324}, // dieresisbelowcmb {0x6e8ccbbb, 0xfb48}, // reshdageshhebrew {0x6eb16a59, 0x2166}, // Sevenroman {0x6eb40b0d, 0x04db}, // schwadieresiscyrillic {0x6eba69ba, 0xfe9e}, // jeemfinalarabic {0x6ebb53ea, 0x2261}, // equivalence {0x6ecb4ba4, 0x0449}, // afii10091 {0x6ecc1f68, 0x25bc}, // triagdn {0x6ed918ed, 0xfcd1}, // meemmeeminitialarabic {0x6ee27b35, 0x0321}, // hookpalatalizedbelowcmb {0x6f028e08, 0x0571}, // jaarmenian {0x6f1f2583, 0x25ce}, // bullseye {0x6f2573bb, 0x30eb}, // rukatakana {0x6f4833d3, 0x0a5c}, // rragurmukhi {0x6f57587a, 0x227b}, // succeeds {0x6f64edc9, 0x054f}, // Tiwnarmenian {0x6f6b6e30, 0x0e0e}, // dochadathai {0x6f75692f, 0x0ac8}, // aivowelsigngujarati {0x6f7744aa, 0x2196}, // arrowupleft {0x6fae2151, 0x0aef}, // ninegujarati {0x6fbeef2a, 0x044d}, // ereversedcyrillic {0x6fc01d9f, 0x00f8}, // oslash {0x702ecc19, 0x3054}, // gohiragana {0x70534c83, 0x05a4}, // mahapakhlefthebrew {0x7061d5ad, 0x255a}, // SF380000 {0x707057b4, 0xfb2e}, // alefpatahhebrew {0x7070c1c4, 0x0333}, // dbllowlinecmb {0x7077f8df, 0x0163}, // tcommaaccent {0x708cf64a, 0x0944}, // rrvocalicvowelsigndeva {0x709b2bbe, 0x0056}, // V {0x70a0d365, 0xfeee}, // wawfinalarabic {0x70a7b34b, 0x05b5}, // tsere12 {0x70c1bcae, 0x1ede}, // Ohornhookabove {0x70d74f05, 0x04b1}, // ustraightstrokecyrillic {0x70d8442c, 0xff3c}, // backslashmonospace {0x70e9d43c, 0x2202}, // partialdiff {0x70f78dac, 0x24b5}, // zparen {0x70f8a40d, 0x05b8}, // afii57797 {0x71062567, 0xfeea}, // hehfinalalttwoarabic {0x710fbfc8, 0x0179}, // Zacute {0x712afb91, 0x310b}, // nbopomofo {0x7138408a, 0x04cc}, // chekhakassiancyrillic {0x71411a8f, 0x3156}, // yekorean {0x7154079a, 0x1e50}, // Omacrongrave {0x715a0e07, 0xfef4}, // alefmaksuramedialarabic {0x715aaa7e, 0x0122}, // Gcommaaccent {0x71693ad6, 0x0919}, // ngadeva {0x718d2f07, 0xff16}, // sixmonospace {0x71a4a95d, 0x1eaa}, // Acircumflextilde {0x71b12b2f, 0x01e0}, // Adotmacron {0x71b2c74d, 0x00b7}, // periodcentered {0x71b2e09c, 0x0e32}, // saraaathai {0x71e104c6, 0x3041}, // asmallhiragana {0x71ebf117, 0x0640}, // afii57440 {0x7222af0c, 0x25cb}, // circle {0x722d9aa3, 0x2153}, // onethird {0x72446324, 0x3164}, // hangulfiller {0x7256dcb9, 0x0ac2}, // uuvowelsigngujarati {0x725da2a5, 0x0548}, // Voarmenian {0x7274464b, 0x0e31}, // maihanakatthai {0x7276cdf0, 0x02d7}, // minusmod {0x7278753d, 0x04d7}, // iebrevecyrillic {0x728cf068, 0x020f}, // oinvertedbreve {0x728f761b, 0x3111}, // qbopomofo {0x72b3c6a8, 0x00b4}, // acute {0x72ba7ff6, 0x3093}, // nhiragana {0x72c6f1c4, 0xff5c}, // barmonospace {0x72c8f209, 0x0136}, // Kcommaaccent {0x72e33f41, 0x0419}, // afii10027 {0x72f1f5cf, 0x0438}, // iicyrillic {0x72fc7974, 0x2111}, // Ifraktur {0x72fd959a, 0x002a}, // asterisk {0x73032cb1, 0x3268}, // cieuccirclekorean {0x731be3b3, 0x3140}, // rieulhieuhkorean {0x73200dbd, 0x0e20}, // phosamphaothai {0x7322d42e, 0x24b9}, // Dcircle {0x73282fcd, 0x1ee3}, // ohorndotbelow {0x732cf2ca, 0x2485}, // eighteenparen {0x7338db3a, 0x066b}, // decimalseparatorarabic {0x73392eb6, 0x1ed4}, // Ocircumflexhookabove {0x733b0480, 0xfe94}, // tehmarbutafinalarabic {0x734f6c6b, 0x3090}, // wihiragana {0x7375cb46, 0x0686}, // tcheharabic {0x73843708, 0x0434}, // decyrillic {0x7387f092, 0x2088}, // eightinferior {0x73b2bbd4, 0xfe63}, // hyphensmall {0x73b70a88, 0x05d8}, // afii57672 {0x73b7c451, 0x095a}, // ghhadeva {0x73c5e60b, 0x004e}, // N {0x73ee6902, 0x0965}, // dbldanda {0x73f5578c, 0x093f}, // ivowelsigndeva {0x74030714, 0x311c}, // ebopomofo {0x7411ab47, 0x00ba}, // ordmasculine {0x74144417, 0x311e}, // aibopomofo {0x74157df0, 0x0667}, // sevenhackarabic {0x741e8130, 0x00cf}, // Idieresis {0x7435abfe, 0x057c}, // raarmenian {0x743d1e25, 0x0456}, // afii10103 {0x745c44bf, 0x02e3}, // xsuperior {0x746e784f, 0xff48}, // hmonospace {0x7476bb3d, 0x21d2}, // dblarrowright {0x74814589, 0x05b9}, // holam19 {0x748db30c, 0x33b1}, // nssquare {0x7495de6c, 0x0008}, // controlBS {0x74a2fb64, 0x2280}, // notprecedes {0x74abeab2, 0x05ac}, // iluyhebrew {0x74b1cbfb, 0x22c5}, // dotmath {0x74caf1a5, 0x01b4}, // yhook {0x74d74b92, 0x2209}, // notelement {0x74f1fca9, 0x01db}, // Udieresisgrave {0x7506e8c8, 0x24d1}, // bcircle {0x751253a5, 0x2168}, // Nineroman {0x7544678b, 0x307d}, // pohiragana {0x754982de, 0x06a4}, // veharabic {0x755a250b, 0x09dd}, // rhabengali {0x755f707c, 0x1ebf}, // ecircumflexacute {0x75841530, 0x2002}, // enspace {0x75907eb0, 0x322c}, // ideographicwaterparen {0x759ddc3d, 0x3068}, // tohiragana {0x759f9daf, 0x00c4}, // Adieresis {0x75aa325f, 0x3047}, // esmallhiragana {0x75b73269, 0x27e9}, // angbracketrightbig {0x75b9e64d, 0xff46}, // fmonospace {0x75bf74c1, 0x0a59}, // khhagurmukhi {0x75f4d85d, 0x0a2c}, // bagurmukhi {0x7603459c, 0x094c}, // auvowelsigndeva {0x760d83de, 0x222b}, // integral {0x7612320f, 0x3273}, // pieupacirclekorean {0x76186d8e, 0x01f3}, // dz {0x7619aedc, 0xfb4c}, // betrafehebrew {0x762dd6ce, 0x2260}, // notequal {0x763e1836, 0x30c4}, // tukatakana {0x7656c681, 0x01c4}, // DZcaron {0x767695a3, 0xfed4}, // fehmedialarabic {0x76811ae6, 0x0169}, // utilde {0x7681e1d4, 0xfe9b}, // thehinitialarabic {0x76a40aac, 0x001e}, // controlRS {0x76a57fc1, 0x0117}, // edot {0x76aa35a2, 0x1e27}, // hdieresis {0x76abdb93, 0xfb41}, // samekhdageshhebrew {0x76af2566, 0x05c1}, // afii57804 {0x76b279b9, 0x1e76}, // Ucircumflexbelow {0x76be5e67, 0x0389}, // Etatonos {0x76ec167e, 0x3128}, // ubopomofo {0x76ee8ef9, 0x326a}, // khieukhcirclekorean {0x76fa92ba, 0x2225}, // parallel {0x7722080a, 0x21e2}, // arrowdashright {0x772d6b37, 0x3294}, // ideographnamecircle {0x774eb078, 0x0328}, // ogonekcmb {0x774fe771, 0x064d}, // kasratanarabic {0x7752bcc4, 0x239e}, // parenrighttp {0x775a46a9, 0xffe0}, // centmonospace {0x77651620, 0x007b}, // braceleft {0x776629fd, 0x044a}, // hardsigncyrillic {0x7766a0eb, 0x041e}, // Ocyrillic {0x776cd4d6, 0x1e89}, // wdotbelow {0x77741a8d, 0x0473}, // fitacyrillic {0x7782c966, 0x1e46}, // Ndotbelow {0x7786e0a6, 0x246f}, // sixteencircle {0x779ce17f, 0x0390}, // iotadieresistonos {0x77a6f721, 0x2165}, // Sixroman {0x77aefb3f, 0x3027}, // sevenhangzhou {0x77b3e914, 0x3106}, // pbopomofo {0x77d27346, 0x0110}, // Dcroat {0x77e1d263, 0x0442}, // tecyrillic {0x77ee824a, 0xfba7}, // hehfinalaltonearabic {0x77f415ae, 0x03eb}, // gangiacoptic {0x77f608a5, 0x00ec}, // igrave {0x78151b28, 0x04f8}, // Yerudieresiscyrillic {0x781b1710, 0x3175}, // pieupsiostikeutkorean {0x782f5323, 0x2297}, // circlemultiply {0x783bb2b4, 0xfeea}, // hehfinalarabic {0x7849decd, 0x05f0}, // vavvavhebrew {0x7865471d, 0x30f8}, // vikatakana {0x7868522a, 0x0172}, // Uogonek {0x78728968, 0x0e3f}, // bahtthai {0x7877a9ea, 0x05d9}, // yodhebrew {0x7878b2f0, 0x323c}, // ideographicsuperviseparen {0x788e7d3e, 0x05b3}, // hatafqamats {0x78965447, 0x0593}, // shalshelethebrew {0x78d4db12, 0x032e}, // brevebelowcmb {0x78da6d23, 0x046e}, // Ksicyrillic {0x78f4df25, 0x04d9}, // schwacyrillic {0x79042ee6, 0x30e9}, // rakatakana {0x79116479, 0x0039}, // nine {0x7919f419, 0x0416}, // afii10024 {0x792d6db9, 0x0272}, // nhookleft {0x793801c3, 0x3158}, // wakorean {0x79577113, 0x2565}, // SF480000 {0x795917d1, 0x0583}, // piwrarmenian {0x79638654, 0x1ecd}, // odotbelow {0x796eb2f8, 0x3389}, // kcalsquare {0x796edb96, 0x0387}, // anoteleia {0x797aa124, 0x0445}, // khacyrillic {0x7980bc25, 0x00c5}, // Aring {0x7987b173, 0x03e8}, // Horicoptic {0x79961e28, 0x20a7}, // peseta {0x79c6a044, 0xfe3a}, // tortoiseshellbracketrightvertical {0x79d35b17, 0x3229}, // tenideographicparen {0x79dfa961, 0xfb2d}, // shindageshsindot {0x79e5e3c1, 0x0e2f}, // paiyannoithai {0x79fc5691, 0x24ce}, // Ycircle {0x7a196523, 0x0451}, // afii10071 {0x7a29214e, 0x006c}, // l {0x7a32a546, 0x202d}, // afii61574 {0x7a3f45e9, 0x0ab8}, // sagujarati {0x7a49bde9, 0xfca4}, // tehmeeminitialarabic {0x7a49dc21, 0xfee2}, // meemfinalarabic {0x7a56cace, 0x33a1}, // squaremsquared {0x7a6cfa6a, 0x0a3f}, // imatragurmukhi {0x7a75be4d, 0x2559}, // SF490000 {0x7a8736f8, 0x320c}, // phieuphparenkorean {0x7aa071da, 0x0217}, // uinvertedbreve {0x7aa95d24, 0xfb34}, // hedageshhebrew {0x7aac463a, 0x0669}, // afii57401 {0x7ab8ba14, 0x1ebe}, // Ecircumflexacute {0x7ad78099, 0x05b5}, // afii57794 {0x7b074f4f, 0x062c}, // jeemarabic {0x7b0aca00, 0x3315}, // kiroguramusquare {0x7b443626, 0x3331}, // birusquare {0x7b5e0418, 0xff10}, // zeromonospace {0x7b7b9d4d, 0x0424}, // afii10038 {0x7b80aee5, 0x05bb}, // qubutsquarterhebrew {0x7b8c3862, 0x02b8}, // ysuperior {0x7bac8f33, 0x0016}, // controlSYN {0x7bc269dd, 0x0040}, // at {0x7bd5ca88, 0x33ca}, // hasquare {0x7bd8b82b, 0x3005}, // ideographiciterationmark {0x7c301325, 0x0472}, // Fitacyrillic {0x7c3f4566, 0x00e7}, // ccedilla {0x7c4777ca, 0xfcc9}, // lamjeeminitialarabic {0x7c4f7ece, 0x0ab2}, // lagujarati {0x7c53c130, 0x0a13}, // oogurmukhi {0x7c613499, 0x2566}, // SF410000 {0x7c8ffdc8, 0x24e7}, // xcircle {0x7c903e9b, 0x1ec7}, // ecircumflexdotbelow {0x7cb539e8, 0x096e}, // eightdeva {0x7cc006ef, 0x222c}, // dblintegral {0x7cdf3e4a, 0x0a2f}, // yagurmukhi {0x7cf2e5f4, 0x0029}, // parenright {0x7cf2ebbd, 0xff96}, // yokatakanahalfwidth {0x7cf8ce2e, 0x3394}, // thzsquare {0x7d32ca29, 0x0127}, // hbar {0x7d44a576, 0x24b1}, // vparen {0x7d4ddd33, 0x2554}, // SF390000 {0x7d86a046, 0xff93}, // mokatakanahalfwidth {0x7d8bc7c0, 0x255f}, // SF370000 {0x7d981506, 0x0a9f}, // ttagujarati {0x7dc79678, 0x062a}, // afii57418 {0x7dc79708, 0x223c}, // tildeoperator {0x7dc7cd45, 0x33b6}, // muvsquare {0x7dcf75fb, 0x223c}, // similar {0x7dd21a95, 0x30b5}, // sakatakana {0x7dd63b6c, 0x1ec1}, // ecircumflexgrave {0x7de5edf4, 0x05b9}, // afii57806 {0x7df90cb9, 0x249c}, // aparen {0x7e46df3d, 0x30d7}, // pukatakana {0x7e4f805e, 0x3067}, // dehiragana {0x7e5c9fda, 0x042f}, // IAcyrillic {0x7e701b6d, 0xff0d}, // hyphenmonospace {0x7e739224, 0x3046}, // uhiragana {0x7ebf5260, 0x0031}, // one {0x7eddac19, 0x09f4}, // onenumeratorbengali {0x7f43cdd7, 0x0ab0}, // ragujarati {0x7f56c599, 0x0141}, // Lslash {0x7f5b3579, 0x1e74}, // Utildebelow {0x7f630a55, 0x1ef9}, // ytilde {0x7f7aa31e, 0x0648}, // afii57448 {0x7f82e2ff, 0x098f}, // ebengali {0x7f851974, 0x0568}, // etarmenian {0x7f92fe37, 0x066d}, // asteriskarabic {0x7f97f320, 0x301c}, // wavedash {0x7f99701f, 0xfb2a}, // shinshindothebrew {0x7fbd4335, 0x2309}, // ceilingrightbig {0x7ff2087d, 0x01df}, // adieresismacron {0x7ffdad4c, 0x326e}, // kiyeokacirclekorean {0x801f311e, 0x1ebb}, // ehookabove {0x8020003f, 0x05e9}, // shinhebrew {0x8027a085, 0x03d2}, // Upsilonhooksymbol {0x8029e67d, 0x049b}, // kadescendercyrillic {0x803a882f, 0x0a8b}, // rvocalicgujarati {0x80417827, 0x33a9}, // pasquare {0x8048e51c, 0x24e6}, // wcircle {0x80690312, 0x0155}, // racute {0x8076b638, 0xfedf}, // laminitialarabic {0x80792dfa, 0x0478}, // Ukcyrillic {0x8082c40e, 0x251c}, // SF080000 {0x8086d5c5, 0x0490}, // afii10050 {0x80890e42, 0x0316}, // gravebelowcmb {0x808de596, 0x2492}, // elevenperiod {0x808eef1b, 0x0068}, // h {0x80b21ab0, 0x00f5}, // otilde {0x80b54bce, 0x3170}, // mieumpansioskorean {0x80c36a57, 0x0480}, // Koppacyrillic {0x80f8e4b8, 0x017f}, // slong {0x80fb86d5, 0x00ff}, // ydieresis {0x810ea19f, 0x02bd}, // afii64937 {0x810f1d5a, 0x30c6}, // tekatakana {0x812767fa, 0x0555}, // Oharmenian {0x8140027d, 0x24d3}, // dcircle {0x815134d6, 0x00cd}, // Iacute {0x81589a47, 0x2220}, // angle {0x81658581, 0x0207}, // einvertedbreve {0x816871c9, 0x1ec2}, // Ecircumflexhookabove {0x8169da43, 0x0483}, // titlocyrilliccmb {0x8170d563, 0x256b}, // SF530000 {0x817f112a, 0x1e37}, // ldotbelow {0x817f9471, 0x1e92}, // Zdotbelow {0x81806da2, 0x328d}, // ideographwoodcircle {0x8184073f, 0x053b}, // Iniarmenian {0x818aac3d, 0x3165}, // ssangnieunkorean {0x81b94a51, 0x3233}, // ideographicsocietyparen {0x81e18c26, 0x30c3}, // tusmallkatakana {0x81eec5b0, 0x320e}, // kiyeokaparenkorean {0x8215ea5e, 0x02b2}, // jsuperior {0x82173176, 0x05d9}, // afii57673 {0x8218cc3e, 0x039c}, // Mu {0x822cf82c, 0x3070}, // bahiragana {0x8230e7a0, 0x32a7}, // ideographicleftcircle {0x823da9d2, 0x0413}, // afii10020 {0x825a2038, 0x3045}, // usmallhiragana {0x8260fa87, 0x1ea5}, // acircumflexacute {0x8272e0b5, 0x249b}, // twentyperiod {0x827d6960, 0xff40}, // gravemonospace {0x828072a0, 0x2666}, // diamond {0x8281c05a, 0x00b5}, // mu1 {0x8291bd7d, 0x248e}, // sevenperiod {0x82ab3b91, 0x03a3}, // Sigma {0x82b182a5, 0x057e}, // vewarmenian {0x82b58e6a, 0x1e94}, // Zlinebelow {0x82b5e1a0, 0x266b}, // eighthnotebeamed {0x82b5fc2f, 0x05bc}, // afii57807 {0x82c39f59, 0x1e62}, // Sdotbelow {0x82c3da09, 0x0a1a}, // cagurmukhi {0x82d03f46, 0x056e}, // caarmenian {0x82d4758a, 0x25e6}, // whitebullet {0x82db51c1, 0x05b6}, // segolnarrowhebrew {0x82dffbf3, 0xfe9c}, // thehmedialarabic {0x8322270c, 0x1e49}, // nlinebelow {0x832d9a03, 0x263b}, // invsmileface {0x83393d74, 0xfef7}, // lamalefhamzaaboveisolatedarabic {0x83589346, 0x1eb0}, // Abrevegrave {0x837601e2, 0x0ae7}, // onegujarati {0x8377c3f2, 0x026b}, // lmiddletilde {0x837a2830, 0x2113}, // lsquare {0x837c1552, 0x2172}, // threeroman {0x8388f2be, 0x00c9}, // Eacute {0x83a89a03, 0x045f}, // dzhecyrillic {0x83aeaef2, 0x1e23}, // hdotaccent {0x83c5c486, 0x05e7}, // afii57687 {0x83cd4320, 0x0565}, // echarmenian {0x83e3c3a4, 0x3075}, // huhiragana {0x83f86a79, 0x339e}, // squarekm {0x83fc4077, 0x0037}, // seven {0x83fe9093, 0x0441}, // escyrillic {0x840c8507, 0x0313}, // commaabovecmb {0x8411d0c3, 0x1e3e}, // Macute {0x84132896, 0x0140}, // ldot {0x841d72ff, 0x02e4}, // glottalstopreversedsuperior {0x841d9ceb, 0x0572}, // ghadarmenian {0x8424a64d, 0x05b5}, // tserewidehebrew {0x843c7aca, 0x323f}, // ideographicallianceparen {0x8445bb28, 0x0905}, // adeva {0x8459e5f4, 0x2248}, // approxequal {0x84776c26, 0x329d}, // ideographicexcellentcircle {0x847d9b8a, 0x1ec5}, // ecircumflextilde {0x847ed2d4, 0x0540}, // Hoarmenian {0x8487ed37, 0x0621}, // hamzaarabic {0x848baa07, 0xfc5f}, // shaddakasratanarabic {0x8494dfda, 0x05b1}, // hatafsegol24 {0x8498dbae, 0xfe86}, // wawhamzaabovefinalarabic {0x849b0297, 0x1e2e}, // Idieresisacute {0x84a67fee, 0x323a}, // ideographiccallparen {0x84b1d089, 0x0430}, // acyrillic {0x84de35f4, 0x0210}, // Rdblgrave {0x84e0b580, 0x04ef}, // umacroncyrillic {0x8501599a, 0x30f6}, // kesmallkatakana {0x85103d59, 0xfb39}, // yoddagesh {0x853a4f53, 0x217b}, // twelveroman {0x855c805d, 0xff1a}, // colonmonospace {0x856013c8, 0x248a}, // threeperiod {0x8567c154, 0x01bc}, // Tonefive {0x85a6c8bc, 0x310a}, // tbopomofo {0x85b41716, 0x201a}, // quotesinglbase {0x85b6b018, 0x2228}, // logicalor {0x85c83eb6, 0xff77}, // kikatakanahalfwidth {0x85ce16f4, 0x05da}, // afii57674 {0x85e92466, 0x2282}, // propersubset {0x85ee23d7, 0x311b}, // obopomofo {0x85f325ac, 0x064c}, // dammatanaltonearabic {0x85f47ad1, 0x0660}, // zerohackarabic {0x85f89b18, 0x3049}, // osmallhiragana {0x86129c18, 0x2209}, // notelementof {0x861e8048, 0xff54}, // tmonospace {0x861ef200, 0x1e75}, // utildebelow {0x8654695b, 0x0020}, // spacehackarabic {0x865c7659, 0x0312}, // commaturnedabovecmb {0x8665f7ab, 0x201b}, // quotereversed {0x8686768e, 0x093e}, // aavowelsigndeva {0x8694e2ae, 0x3132}, // ssangkiyeokkorean {0x8699e716, 0x09ef}, // ninebengali {0x869fef4c, 0x064b}, // afii57451 {0x86a662d1, 0x05e7}, // qofhebrew {0x86a80595, 0x0535}, // Echarmenian {0x86c2d4a4, 0x01ef}, // ezhcaron {0x86d0b880, 0x01c7}, // LJ {0x86d66230, 0x04ad}, // tedescendercyrillic {0x86e222a0, 0x05d9}, // yod {0x86eea6f9, 0x03a4}, // Tau {0x870315b6, 0x30e1}, // mekatakana {0x8713ac2f, 0xfb4b}, // vavholam {0x87634c8c, 0x05bd}, // siluqhebrew {0x877afbbb, 0xfb35}, // afii57723 {0x877f7c7a, 0xfeb4}, // seenmedialarabic {0x8787b92b, 0x02c0}, // glottalstopmod {0x87a041c7, 0x0446}, // afii10088 {0x87a4b30d, 0x263c}, // compass {0x87b6c8ba, 0x00c3}, // Atilde {0x87bb7ac5, 0x020b}, // iinvertedbreve {0x87e03b4f, 0x0642}, // afii57442 {0x87e97d46, 0x04dd}, // zhedieresiscyrillic {0x87ef58ab, 0xfe30}, // twodotleadervertical {0x87fc47e5, 0x24d2}, // ccircle {0x88044bf5, 0x2167}, // Eightroman {0x880a9911, 0x1e34}, // Klinebelow {0x881905a5, 0x0e22}, // yoyakthai {0x881a4ba0, 0x0931}, // rradeva {0x88264250, 0x1e71}, // tcircumflexbelow {0x8826a561, 0x03cd}, // upsilontonos {0x883bae04, 0x248c}, // fiveperiod {0x8841d986, 0x30b8}, // zikatakana {0x8853f322, 0x339b}, // mumsquare {0x885dcb80, 0x00a7}, // section {0x886c5d13, 0x0636}, // dadarabic {0x8876a700, 0x1e98}, // wring {0x888833ba, 0x02e7}, // tonebarmidmod {0x888e1142, 0x026d}, // lhookretroflex {0x88a12621, 0x05d4}, // afii57668 {0x88b6884b, 0x06f7}, // sevenpersian {0x88c2fc70, 0x0a6a}, // fourgurmukhi {0x88c96d26, 0xfb4a}, // tavdages {0x88cc32a3, 0x1ef6}, // Yhookabove {0x88da326f, 0x0546}, // Nowarmenian {0x88e4df33, 0x1e1b}, // etildebelow {0x88e6eee8, 0x3119}, // sbopomofo {0x88ea0124, 0x0949}, // ocandravowelsigndeva {0x88f38eed, 0x21d0}, // arrowdblleft {0x88f62270, 0x314f}, // akorean {0x88fdc1bb, 0x308e}, // wasmallhiragana {0x88fdcf2e, 0x039e}, // Xi {0x893a8f13, 0x09b9}, // habengali {0x89468742, 0x0e1f}, // fofanthai {0x897340ea, 0x3207}, // ieungparenkorean {0x897854cd, 0x060c}, // afii57388 {0x897adc4f, 0x0128}, // Itilde {0x89aa67b7, 0x2161}, // Tworoman {0x89ace505, 0xff06}, // ampersandmonospace {0x89d8daae, 0x25c9}, // fisheye {0x89e05206, 0x0022}, // quotedbl {0x89e2c74b, 0x062d}, // afii57421 {0x89ed1e17, 0x3171}, // kapyeounmieumkorean {0x89f4c981, 0x02dc}, // tilde {0x89f7042b, 0xfe38}, // bracerightvertical {0x89fc7dc4, 0x05bf}, // rafehebrew {0x8a1958e1, 0x03d1}, // theta1 {0x8a27f623, 0x030e}, // dblverticallineabovecmb {0x8a36e0e0, 0x0a89}, // ugujarati {0x8a64ee32, 0x23a2}, // bracketleftex {0x8a743e71, 0x3279}, // thieuthacirclekorean {0x8a7ff438, 0x0632}, // zainarabic {0x8ab11ede, 0x0907}, // ideva {0x8ab50af4, 0xfedb}, // kafinitialarabic {0x8ac9c3df, 0x00cb}, // Edieresis {0x8ae82e18, 0x05c2}, // sindothebrew {0x8aebef01, 0x064f}, // afii57455 {0x8af00e69, 0x3396}, // mlsquare {0x8af0299d, 0x2465}, // sixcircle {0x8af3a8ba, 0x1e55}, // pacute {0x8afdb385, 0x05b2}, // hatafpatahnarrowhebrew {0x8b04e879, 0x0573}, // cheharmenian {0x8b2ea84b, 0x045f}, // afii10193 {0x8b336b03, 0x33c3}, // bqsquare {0x8b3d9ff3, 0x313a}, // rieulkiyeokkorean {0x8b46ba2c, 0x1e10}, // Dcedilla {0x8b5fbe71, 0x0209}, // idblgrave {0x8b6e36e5, 0x0001}, // controlSTX {0x8b91eefb, 0x0135}, // jcircumflex {0x8ba07e30, 0x3236}, // ideographicfinancialparen {0x8ba61ca6, 0x0170}, // Udblacute {0x8bb0c7c5, 0x04a4}, // Enghecyrillic {0x8bb9fe95, 0x1e35}, // klinebelow {0x8bc6e552, 0x027a}, // rlonglegturned {0x8bd60707, 0x33ce}, // squarekmcapital {0x8bdd4dfa, 0x05a1}, // pazerhebrew {0x8be0aeeb, 0x1e28}, // Hcedilla {0x8bf3f9ec, 0x0aed}, // sevengujarati {0x8bfc7ed2, 0x02e9}, // tonebarextralowmod {0x8c09cf1f, 0x0251}, // ascript {0x8c169f16, 0x0a4c}, // aumatragurmukhi {0x8c1a91ec, 0x1ed2}, // Ocircumflexgrave {0x8c21575a, 0x2175}, // sixroman {0x8c3dc32f, 0x0632}, // afii57426 {0x8c5fd3c7, 0x05dd}, // afii57677 {0x8c7614fd, 0x0046}, // F {0x8c789c98, 0x0255}, // ccurl {0x8c7eba77, 0x3114}, // chbopomofo {0x8c941f03, 0x0639}, // afii57433 {0x8c9c3f66, 0x0e37}, // saraueethai {0x8cb6cb59, 0xfb6c}, // vehinitialarabic {0x8cbe2a76, 0x0951}, // udattadeva {0x8cc838c1, 0x099f}, // ttabengali {0x8ccab94e, 0x311d}, // ehbopomofo {0x8cd2ceac, 0x322f}, // ideographicearthparen {0x8cdd7a5e, 0xfefb}, // lamalefisolatedarabic {0x8cfeaaad, 0x04b4}, // Tetsecyrillic {0x8d0e3bcc, 0x0162}, // Tcommaaccent {0x8d15f0f9, 0x01d8}, // udieresisacute {0x8d17055f, 0xff23}, // Cmonospace {0x8d2183aa, 0x00ee}, // icircumflex {0x8d24b8c2, 0x0457}, // afii10104 {0x8d262f6a, 0x33ad}, // radsquare {0x8d3bc051, 0x1eb1}, // abrevegrave {0x8d430411, 0x0288}, // tretroflexhook {0x8d4c7b99, 0x0473}, // afii10195 {0x8d557bba, 0xfe98}, // tehmedialarabic {0x8d5ae6d4, 0x0440}, // ercyrillic {0x8d62c566, 0x21e0}, // arrowdashleft {0x8d7f2614, 0x2164}, // Fiveroman {0x8db3e76c, 0x1e97}, // tdieresis {0x8dbd6f57, 0xffe1}, // sterlingmonospace {0x8dc41abc, 0x1e33}, // kdotbelow {0x8de51633, 0x1ed7}, // ocircumflextilde {0x8df7afeb, 0x0968}, // twodeva {0x8e0d9fbd, 0x0337}, // solidusshortoverlaycmb {0x8e2538f6, 0x0420}, // Ercyrillic {0x8e325301, 0x0133}, // ij {0x8e3386c6, 0x0439}, // iishortcyrillic {0x8e360b54, 0x027d}, // rhook {0x8e40b292, 0x01fb}, // aringacute {0x8e467ab5, 0x1ecc}, // Odotbelow {0x8e474342, 0x1e2a}, // Hbrevebelow {0x8e5ae93f, 0x0909}, // udeva {0x8e5f575a, 0x0458}, // jecyrillic {0x8e5f7ac5, 0x01d2}, // ocaron {0x8e6f5aa1, 0x3074}, // pihiragana {0x8e757f60, 0x308a}, // rihiragana {0x8e7aa1b5, 0x207c}, // equalsuperior {0x8e8e0711, 0x042f}, // afii10049 {0x8e91af6c, 0x3000}, // ideographicspace {0x8ec9ea4f, 0xfb40}, // nundagesh {0x8eca9ee8, 0x045c}, // kjecyrillic {0x8ed1765d, 0xff36}, // Vmonospace {0x8ed539a2, 0x278a}, // onecircleinversesansserif {0x8f084bdd, 0x3204}, // mieumparenkorean {0x8f19bc84, 0x0e4a}, // maitrithai {0x8f289d06, 0x0444}, // efcyrillic {0x8f28eae1, 0x013f}, // Ldotaccent {0x8f4b9c51, 0x0404}, // afii10053 {0x8f505863, 0x04f2}, // Uhungarumlautcyrillic {0x8f52df2f, 0x0256}, // dtail {0x8f5e284f, 0xfed6}, // qaffinalarabic {0x8f760fbe, 0x25e5}, // blackupperrighttriangle {0x8f7f3f67, 0x0645}, // afii57445 {0x8f89b56f, 0x05b8}, // qamatsqatanhebrew {0x8fa69b6c, 0x0331}, // macronbelowcmb {0x8fbba331, 0x0205}, // edblgrave {0x8fc968d8, 0x01b9}, // ezhreversed {0x8fce94ba, 0x0395}, // Epsilon {0x8fd18473, 0x2593}, // shadedark {0x8fe2c390, 0x0e53}, // threethai {0x8fe329b9, 0x266c}, // beamedsixteenthnotes {0x8fe85541, 0x0637}, // afii57431 {0x8ff897b6, 0x0042}, // B {0x900e8281, 0x1e3b}, // llinebelow {0x900fb5c0, 0x0144}, // nacute {0x902443c2, 0xfe52}, // periodsmall {0x9024a760, 0x029d}, // jcrossedtail {0x90307534, 0x3059}, // suhiragana {0x9059f738, 0x00b7}, // middot {0x906746a4, 0xff75}, // okatakanahalfwidth {0x907d968c, 0x0a9b}, // chagujarati {0x90872973, 0x0538}, // Etarmenian {0x9098fbd4, 0x0002}, // controlSOT {0x90995fc1, 0x1e09}, // ccedillaacute {0x90a162b6, 0x05b4}, // hiriqwidehebrew {0x90b86ad8, 0x30dd}, // pokatakana {0x90b9c076, 0xff0f}, // slashmonospace {0x90c2be85, 0x0268}, // istroke {0x910a1b16, 0x03f1}, // rhosymbolgreek {0x9132f814, 0xff22}, // Bmonospace {0x9134ebbc, 0x01cb}, // Nj {0x913ff5ff, 0x3125}, // engbopomofo {0x9141d43c, 0x2126}, // Ohm {0x914ce494, 0x05e6}, // afii57686 {0x9166eec8, 0x33ba}, // pwsquare {0x916cdeb8, 0xfed2}, // fehfinalarabic {0x917f2f3f, 0x0438}, // afii10074 {0x9181b388, 0x01eb}, // oogonek {0x9184e24f, 0x30ab}, // kakatakana {0x919f5679, 0x00ca}, // Ecircumflex {0x91acc220, 0xff91}, // mukatakanahalfwidth {0x91accd4b, 0x0937}, // ssadeva {0x91c3e17e, 0x05f2}, // afii57718 {0x91d99037, 0x1eb9}, // edotbelow {0x91de3939, 0x064f}, // dammalowarabic {0x91e65480, 0x0abf}, // ivowelsigngujarati {0x91eaac20, 0x3214}, // siosaparenkorean {0x920dae79, 0x039f}, // Omicron {0x9215b042, 0x3147}, // ieungkorean {0x9220d7f0, 0xff69}, // usmallkatakanahalfwidth {0x923767e3, 0x3133}, // kiyeoksioskorean {0x9239e7fb, 0x062b}, // theharabic {0x923bf3d0, 0x0330}, // tildebelowcmb {0x926b691e, 0x0100}, // Amacron {0x92aa52d3, 0x30fb}, // dotkatakana {0x92e2ffd9, 0x21e8}, // arrowrightwhite {0x92f283dc, 0x25d8}, // bulletinverse {0x92f96dbe, 0x1e56}, // Pdotaccent {0x930724f6, 0x06ba}, // noonghunnaarabic {0x930c1a0b, 0x001b}, // controlESC {0x932512ee, 0x03ea}, // Gangiacoptic {0x9330a2fc, 0x0336}, // strokelongoverlaycmb {0x934b1595, 0x062d}, // haharabic {0x93959445, 0x263a}, // smileface {0x939a56c4, 0x03ad}, // epsilontonos {0x939b5eb8, 0xfe92}, // behmedialarabic {0x93bca3b6, 0x099e}, // nyabengali {0x93e00dc4, 0x2193}, // arrowdown {0x93eef318, 0x0263}, // gammalatinsmall {0x9404d5fc, 0x33d5}, // squaremil {0x941a6b5f, 0x0a23}, // nnagurmukhi {0x941b20fa, 0xfe4b}, // overlinewavy {0x942ad1c7, 0x09be}, // aavowelsignbengali {0x9453959c, 0x24bd}, // Hcircle {0x9464bc2e, 0x1e66}, // Scarondotaccent {0x94724b66, 0x21bc}, // harpoonleftbarbup {0x94803386, 0x09d7}, // aulengthmarkbengali {0x948a9ce4, 0x05de}, // afii57678 {0x949bc805, 0x01da}, // udieresiscaron {0x94ae0441, 0x0410}, // Acyrillic {0x94b7f6ea, 0x0463}, // yatcyrillic {0x94c36e74, 0x3261}, // nieuncirclekorean {0x94c9571f, 0x25ac}, // blackrectangle {0x94d13d1c, 0xfe39}, // tortoiseshellbracketleftvertical {0x94d74b96, 0x1e64}, // Sacutedotaccent {0x94e6f584, 0x3058}, // zihiragana {0x94ee5ae7, 0x2792}, // ninecircleinversesansserif {0x94f9a508, 0x3265}, // pieupcirclekorean {0x9518a20d, 0x30d9}, // bekatakana {0x951a0238, 0xfdf2}, // lamlamhehisolatedarabic {0x951ae869, 0x09dc}, // rrabengali {0x952cce64, 0x04ee}, // Umacroncyrillic {0x952ec009, 0x0988}, // iibengali {0x953a0a51, 0x2211}, // summation {0x954a8776, 0x03d1}, // thetasymbolgreek {0x95526ac8, 0x2500}, // SF100000 {0x9559e176, 0x05b7}, // patah2a {0x955dbbe7, 0x23aa}, // braceex {0x957765bc, 0xfe8a}, // yehhamzaabovefinalarabic {0x958830cb, 0x2669}, // quarternote {0x9588e4f1, 0xff99}, // rukatakanahalfwidth {0x959cf6c1, 0x203b}, // referencemark {0x95af6475, 0x05e3}, // finalpehebrew {0x95aff05f, 0x03ca}, // iotadieresis {0x95b3bc07, 0xfb46}, // tsadidagesh {0x95bed968, 0x0e15}, // totaothai {0x95cabf3f, 0x21cf}, // arrowrightdblstroke {0x95d7e2f4, 0x0032}, // two {0x95ed768c, 0x05e0}, // nun {0x960140f0, 0x2496}, // fifteenperiod {0x961b2e15, 0x1e6f}, // tlinebelow {0x96220dd7, 0x318a}, // yuyeokorean {0x962b0c72, 0x3323}, // sentosquare {0x9638605a, 0x0669}, // ninearabic {0x967b01ac, 0x05b9}, // holamhebrew {0x967d0326, 0x3134}, // nieunkorean {0x96a5e022, 0x25d9}, // invcircle {0x96b677d5, 0x0153}, // oe {0x96c05d98, 0x01f2}, // Dz {0x96c1ab16, 0x247f}, // twelveparen {0x96d9cc68, 0x0427}, // Checyrillic {0x96fd8ec6, 0x1e7a}, // Umacrondieresis {0x9711eb31, 0x21aa}, // arrowhookleft {0x9741ad45, 0x05bf}, // rafe {0x975dc1dc, 0x32a5}, // ideographiccentrecircle {0x9776a4ba, 0x0007}, // controlBEL {0x977737b3, 0x0265}, // hturned {0x9778a35b, 0x0562}, // benarmenian {0x977e0dfa, 0x25d0}, // circlewithlefthalfblack {0x97843a2e, 0x09f8}, // denominatorminusonenumeratorbengali {0x978c8c89, 0x03ac}, // alphatonos {0x97ae16ea, 0x23a1}, // bracketlefttp {0x97b3e7db, 0x24c3}, // Ncircle {0x97e45478, 0x05b6}, // segol2c {0x97ea0cb5, 0x04d8}, // Schwacyrillic {0x97ebb44e, 0x015f}, // scedilla {0x97f03f9c, 0x0419}, // Iishortcyrillic {0x97f6721e, 0x05bf}, // afii57841 {0x980e76a2, 0x1e32}, // Kdotbelow {0x98148d7b, 0xff14}, // fourmonospace {0x981fc90b, 0x0a1b}, // chagurmukhi {0x982585a7, 0x260e}, // telephoneblack {0x982718e0, 0x003c}, // less {0x982eb09a, 0x0e5b}, // khomutthai {0x9853033e, 0x04b5}, // tetsecyrillic {0x987e6d13, 0x0411}, // Becyrillic {0x9896e370, 0x0402}, // afii10051 {0x98b02dc0, 0x0a48}, // aimatragurmukhi {0x98d74b1c, 0x01c8}, // Lj {0x98d9aba5, 0x03ae}, // etatonos {0x98eba766, 0x018b}, // Dtopbar {0x98f4783f, 0x24ac}, // qparen {0x98f4b751, 0x0651}, // afii57457 {0x99104281, 0x02e5}, // tonebarextrahighmod {0x99235205, 0x05dc}, // lamedhebrew {0x994ebac3, 0x05c0}, // afii57842 {0x99725844, 0x0320}, // minusbelowcmb {0x9982855c, 0x0686}, // afii57507 {0x99830dc7, 0x062c}, // afii57420 {0x99863852, 0x03ed}, // shimacoptic {0x99997c4f, 0x3314}, // kirosquare {0x999c619c, 0x3078}, // hehiragana {0x999f4db4, 0x05b4}, // afii57793 {0x99cca883, 0xff04}, // dollarmonospace {0x99e63f81, 0x0962}, // lvocalicvowelsigndeva {0x9a069ea3, 0x2267}, // greateroverequal {0x9a098276, 0xfea2}, // hahfinalarabic {0x9a157ece, 0x246a}, // elevencircle {0x9a1c929d, 0x043c}, // afii10078 {0x9a310f17, 0xff51}, // qmonospace {0x9a3391f5, 0x0190}, // Eopen {0x9a464a33, 0x0174}, // Wcircumflex {0x9a50ec2e, 0x05b6}, // segolquarterhebrew {0x9a7aab21, 0x05c3}, // sofpasuqhebrew {0x9ac6c137, 0x0e0f}, // topatakthai {0x9aea680b, 0x3029}, // ninehangzhou {0x9af6d63b, 0x054a}, // Peharmenian {0x9b09b61d, 0x0a10}, // aigurmukhi {0x9b0db21d, 0x0402}, // Djecyrillic {0x9b100042, 0x0e21}, // momathai {0x9b29e68e, 0x0278}, // philatin {0x9b3ff954, 0x0e56}, // sixthai {0x9b5a3eb3, 0x0626}, // afii57414 {0x9b712e01, 0x1eba}, // Ehookabove {0x9b73811a, 0x2227}, // logicaland {0x9b76648b, 0x041f}, // afii10033 {0x9b7712b3, 0x1e5a}, // Rdotbelow {0x9b8591a5, 0x30ca}, // nakatakana {0x9b950b60, 0x095e}, // fadeva {0x9ba02025, 0x01e9}, // kcaron {0x9bca0720, 0x1e93}, // zdotbelow {0x9bcccde6, 0x0e4e}, // yamakkanthai {0x9bd59a36, 0x300e}, // whitecornerbracketleft {0x9bdb98a4, 0x1e5e}, // Rlinebelow {0x9be54046, 0x0e0a}, // chochangthai {0x9bfe067d, 0x0405}, // Dzecyrillic {0x9c14c866, 0x0484}, // palatalizationcyrilliccmb {0x9c1ff986, 0x05f1}, // afii57717 {0x9c30e64e, 0x0121}, // gdot {0x9c3d076c, 0x002d}, // hyphen {0x9c5df589, 0x03b2}, // beta {0x9c5e488c, 0x05d3}, // dalethebrew {0x9c743ddb, 0x3239}, // ideographicrepresentparen {0x9cc9b890, 0x2a00}, // circledottext {0x9cd2074a, 0x0a36}, // shagurmukhi {0x9ce0dacf, 0xfebb}, // sadinitialarabic {0x9ce3d2fe, 0x06d2}, // afii57519 {0x9ce9cdfc, 0x0408}, // Jecyrillic {0x9ce9f027, 0x0426}, // Tsecyrillic {0x9cf54095, 0x20aa}, // newsheqelsign {0x9d1b1141, 0x25d8}, // invbullet {0x9d1ed2c0, 0x0120}, // Gdotaccent {0x9d25f804, 0x0294}, // glottalstop {0x9d3a5187, 0x03bb}, // lambda {0x9d4507ca, 0x00a0}, // nonbreakingspace {0x9d4ea24d, 0x045a}, // njecyrillic {0x9d5ba323, 0x3145}, // sioskorean {0x9d5eb9a4, 0x001f}, // controlUS {0x9d662219, 0x332a}, // haitusquare {0x9d760ad7, 0x3318}, // guramusquare {0x9d770652, 0x1e2b}, // hbrevebelow {0x9db9ebc8, 0x30ba}, // zukatakana {0x9dee7277, 0x2015}, // afii00208 {0x9df531bb, 0x059b}, // tevirhebrew {0x9e021469, 0x22cf}, // curlyand {0x9e062707, 0x02a2}, // glottalstopstrokereversed {0x9e0bf218, 0x02b1}, // hhooksuperior {0x9e0d1458, 0x02c4}, // arrowheadupmod {0x9e1247f8, 0x0033}, // three {0x9e248728, 0x3053}, // kohiragana {0x9e2d5a68, 0x053f}, // Kenarmenian {0x9e5de325, 0x222e}, // contourintegral {0x9e65e800, 0x248b}, // fourperiod {0x9e98d52c, 0x2483}, // sixteenparen {0x9ea14168, 0x05b7}, // patahquarterhebrew {0x9ea23fe1, 0x00f1}, // ntilde {0x9eac193b, 0x00ef}, // idieresis {0x9eb5aea3, 0x3142}, // pieupkorean {0x9ebea1a0, 0x3150}, // aekorean {0x9ee7bbd1, 0x094b}, // ovowelsigndeva {0x9eedaba9, 0x0113}, // emacron {0x9f023815, 0x20ac}, // euro {0x9f30fc87, 0xfec2}, // tahfinalarabic {0x9f37894c, 0x040e}, // afii10062 {0x9f53036c, 0x0a19}, // ngagurmukhi {0x9f65cf71, 0x1e25}, // hdotbelow {0x9f69147e, 0x1e61}, // sdotaccent {0x9f6f9105, 0x0433}, // gecyrillic {0x9f739695, 0x04f9}, // yerudieresiscyrillic {0x9f79f6eb, 0xfb33}, // daletdageshhebrew {0x9f8cff14, 0x003e}, // greater {0x9f94b2e4, 0x04a1}, // kabashkircyrillic {0x9fa5f7ad, 0x0e49}, // maithothai {0x9fc7ffac, 0x05b4}, // hiriqhebrew {0x9fd406b1, 0xfed8}, // qafmedialarabic {0x9fd7c50e, 0x05bb}, // afii57796 {0x9fdfc7a1, 0x00b0}, // degree {0x9ffeaad9, 0x01ed}, // oogonekmacron {0xa0144bc6, 0xfc8d}, // noonnoonfinalarabic {0xa0166e3d, 0x3159}, // waekorean {0xa016fb2d, 0x016b}, // umacron {0xa0286aa8, 0x1e04}, // Bdotbelow {0xa03db58b, 0x02d2}, // ringhalfrightcentered {0xa05ccf71, 0x05e1}, // samekhhebrew {0xa069fd2d, 0x012b}, // imacron {0xa08ca5a7, 0x2491}, // tenperiod {0xa0a317f9, 0x0574}, // menarmenian {0xa0c2ffe3, 0x247a}, // sevenparen {0xa0e40fac, 0x337b}, // heiseierasquare {0xa0e487b8, 0x33cd}, // KKsquare {0xa0ee672b, 0x3143}, // ssangpieupkorean {0xa100bc11, 0x043e}, // ocyrillic {0xa10462a8, 0x0394}, // Deltagreek {0xa11f6f39, 0x0071}, // q {0xa12507ea, 0x2177}, // eightroman {0xa12d2230, 0x05b5}, // tsere2b {0xa134a191, 0xff11}, // onemonospace {0xa14f5367, 0x05b0}, // sheva15 {0xa157c7c6, 0x0643}, // kafarabic {0xa15811a3, 0x061f}, // questionarabic {0xa1697005, 0x0015}, // controlNAK {0xa16fa8a4, 0x22a3}, // tackleft {0xa1703e0a, 0x3219}, // thieuthaparenkorean {0xa1850262, 0x05c2}, // afii57803 {0xa1a14a63, 0x1eb8}, // Edotbelow {0xa1ed89db, 0x0202}, // Ainvertedbreve {0xa20cadbf, 0x0062}, // b {0xa20ea9da, 0x24aa}, // oparen {0xa212ed2d, 0x0e38}, // sarauthai {0xa2448aa1, 0x01e6}, // Gcaron {0xa2543878, 0x326f}, // nieunacirclekorean {0xa254ebdd, 0xfb3e}, // memdagesh {0xa259bfe7, 0xff19}, // ninemonospace {0xa262edc1, 0xfe49}, // overlinedashed {0xa26bc10f, 0x061b}, // semicolonarabic {0xa27876ee, 0xfe35}, // parenleftvertical {0xa28a5f58, 0xfec8}, // zahmedialarabic {0xa28ba8ac, 0x317d}, // siospieupkorean {0xa2972ad9, 0x2305}, // projective {0xa2be0dd9, 0x062b}, // afii57419 {0xa2c2120e, 0x0e52}, // twothai {0xa2d967e3, 0x2083}, // threeinferior {0xa2e1fb7a, 0x221e}, // infinity {0xa2f62d95, 0x306e}, // nohiragana {0xa3004c6f, 0x092e}, // madeva {0xa316ccc6, 0x2044}, // fraction {0xa32a4538, 0xfb1f}, // afii57705 {0xa334b2d1, 0x043d}, // afii10079 {0xa34b5d2f, 0x0e57}, // seventhai {0xa36dbdee, 0x30db}, // hokatakana {0xa386d6fe, 0x3327}, // tonsquare {0xa3903917, 0x3270}, // tikeutacirclekorean {0xa39b2570, 0xfefc}, // lamaleffinalarabic {0xa3b51a89, 0x0597}, // reviamugrashhebrew {0xa3cc74fa, 0x3056}, // zahiragana {0xa3d9a90d, 0x0499}, // zedescendercyrillic {0xa3e95215, 0xfef9}, // lamalefhamzabelowisolatedarabic {0xa3ec709c, 0x0569}, // toarmenian {0xa3fbf1d9, 0x0497}, // zhedescendercyrillic {0xa3fe88d1, 0x0104}, // Aogonek {0xa40369ed, 0x32a9}, // ideographicmedicinecircle {0xa4259ac9, 0xff76}, // kakatakanahalfwidth {0xa43cdc2e, 0xfb44}, // pedageshhebrew {0xa446d45f, 0x3224}, // fiveideographicparen {0xa450f946, 0x0454}, // afii10101 {0xa456f11e, 0x09e8}, // twobengali {0xa457c062, 0x30ad}, // kikatakana {0xa45b3183, 0x0aeb}, // fivegujarati {0xa45b7f21, 0x010e}, // Dcaron {0xa4627c0f, 0x0204}, // Edblgrave {0xa478f921, 0x09e0}, // rrvocalicbengali {0xa4863185, 0x30f4}, // vukatakana {0xa4922e7c, 0x0341}, // acutetonecmb {0xa4aa1092, 0x05b1}, // hatafsegol30 {0xa4aa8935, 0xff58}, // xmonospace {0xa4af8f73, 0x2282}, // subset {0xa4decb10, 0x0a72}, // irigurmukhi {0xa50a3a99, 0x0630}, // afii57424 {0xa50cf621, 0xff7e}, // sekatakanahalfwidth {0xa512e58d, 0xff83}, // tekatakanahalfwidth {0xa517b724, 0xfee6}, // noonfinalarabic {0xa52168e0, 0x2325}, // option {0xa54253fb, 0x05e7}, // qof {0xa545c2a6, 0xfb2a}, // afii57694 {0xa553cf3e, 0x003b}, // semicolon {0xa56dfce7, 0x0e03}, // khokhuatthai {0xa58382dd, 0x0137}, // kcedilla {0xa5b93826, 0x2555}, // SF220000 {0xa5ecbdaa, 0x03b5}, // epsilon {0xa6056425, 0x05b8}, // qamatswidehebrew {0xa60745ee, 0x2250}, // approaches {0xa6281f81, 0x0142}, // lslash {0xa62afc92, 0x0534}, // Daarmenian {0xa6454b66, 0x2498}, // seventeenperiod {0xa64723d6, 0x30af}, // kukatakana {0xa6522894, 0x24da}, // kcircle {0xa652cff2, 0x24a8}, // mparen {0xa65ca284, 0x314d}, // phieuphkorean {0xa65ea7b9, 0x00ab}, // guillemotleft {0xa6644796, 0xfc94}, // yehnoonfinalarabic {0xa66b3ab3, 0x00b8}, // cedilla {0xa675e0d6, 0x0156}, // Rcommaaccent {0xa683217b, 0x0ab7}, // ssagujarati {0xa6a017fd, 0x0415}, // Iecyrillic {0xa6ae34a8, 0x3028}, // eighthangzhou {0xa6b19efc, 0x0591}, // etnahtafoukhhebrew {0xa6b46028, 0xff72}, // ikatakanahalfwidth {0xa6bd2b95, 0x1e6b}, // tdotaccent {0xa6c10839, 0x0431}, // becyrillic {0xa6e68e9f, 0x0966}, // zerodeva {0xa6f16c03, 0x03c2}, // sigma1 {0xa6f2df0d, 0x0a32}, // lagurmukhi {0xa716a470, 0x2464}, // fivecircle {0xa71dfe13, 0x1ea2}, // Ahookabove {0xa73026ce, 0x007a}, // z {0xa73199c0, 0x05bb}, // qubutshebrew {0xa731e944, 0x0411}, // afii10018 {0xa7320cb3, 0x3139}, // rieulkorean {0xa74014fc, 0x003f}, // question {0xa745be27, 0x2308}, // ceilingleftbig {0xa74cd67a, 0x025f}, // jdotlessstroke {0xa756caf5, 0x04d2}, // Adieresiscyrillic {0xa7769b7a, 0x22c1}, // logicalortext {0xa7895d88, 0x252c}, // SF060000 {0xa796d5bb, 0x0267}, // henghook {0xa7bff3d5, 0x032c}, // caronbelowcmb {0xa7dcd836, 0xfb68}, // ttehinitialarabic {0xa7e01c26, 0x01a7}, // Tonetwo {0xa7e7d702, 0x05b8}, // qamats1a {0xa7edca33, 0x25b7}, // whiterightpointingtriangle {0xa7fb6ee6, 0x226f}, // notgreater {0xa7fe97d8, 0x3166}, // nieuntikeutkorean {0xa815fa8a, 0x309e}, // voicediterationhiragana {0xa819fe3e, 0x315e}, // wekorean {0xa81ee743, 0x0542}, // Ghadarmenian {0xa826b713, 0xfeb6}, // sheenfinalarabic {0xa842618b, 0x025b}, // eopen {0xa84fdde5, 0x0340}, // gravetonecmb {0xa851c76f, 0x05a5}, // merkhahebrew {0xa8547bdd, 0x0455}, // afii10102 {0xa8665e8d, 0x05b1}, // afii57801 {0xa877e561, 0x2642}, // male {0xa8982f3b, 0x09b2}, // labengali {0xa8a24959, 0x00d0}, // Eth {0xa8b6c7f5, 0x0a2e}, // magurmukhi {0xa8b7f35e, 0x06c1}, // haaltonearabic {0xa8bb13d5, 0x0a70}, // tippigurmukhi {0xa8ccc65c, 0x3316}, // kiromeetorusquare {0xa8db2b93, 0x017e}, // zcaron {0xa93204a5, 0x03a6}, // Phi {0xa9350b3f, 0x20a1}, // colonmonetary {0xa93a2a4f, 0x1e47}, // ndotbelow {0xa94e0303, 0x33ab}, // mpasquare {0xa94eeaee, 0x01aa}, // eshreversedloop {0xa95e2711, 0x1e21}, // gmacron {0xa96cef91, 0x3169}, // rieulkiyeoksioskorean {0xa981562d, 0x0668}, // eightarabic {0xa98e771c, 0x0634}, // sheenarabic {0xa9985803, 0x30dc}, // bokatakana {0xa99c94c2, 0x01be}, // glottalinvertedstroke {0xa9a0932f, 0x2077}, // sevensuperior {0xa9af18f2, 0x30b4}, // gokatakana {0xa9c0b182, 0x2264}, // lessequal {0xaa13efde, 0x007d}, // braceright {0xaa4e278b, 0x0967}, // onedeva {0xaa51d75f, 0x2476}, // threeparen {0xaa69d0f1, 0x256c}, // SF440000 {0xaa863ce3, 0x0629}, // tehmarbutaarabic {0xaa8c5eeb, 0x03e5}, // feicoptic {0xaa96b9dc, 0x0665}, // fivearabic {0xaaabcf5c, 0x04b9}, // cheverticalstrokecyrillic {0xaab6b9a5, 0x0211}, // rdblgrave {0xaabfed05, 0xff85}, // nakatakanahalfwidth {0xaac3a76a, 0x0559}, // ringhalfleftarmenian {0xaac3adf0, 0x3121}, // oubopomofo {0xaacaffc4, 0x2162}, // Threeroman {0xaad54f7c, 0x3002}, // ideographicperiod {0xaaf6eb21, 0x01ce}, // acaron {0xab0b499a, 0x099c}, // jabengali {0xab126f69, 0x5344}, // twentyhangzhou {0xab1f1bb7, 0x05df}, // afii57679 {0xab24577f, 0x0667}, // sevenarabic {0xab2b4200, 0x2105}, // careof {0xab3b4b27, 0x24e2}, // scircle {0xab808d1e, 0x2087}, // seveninferior {0xab8a6656, 0x01d0}, // icaron {0xaba55a59, 0xfb32}, // gimeldageshhebrew {0xabb7eb8f, 0x2081}, // oneinferior {0xabd373e8, 0x055e}, // questionarmenian {0xac05d874, 0x1e84}, // Wdieresis {0xac259f58, 0x0448}, // afii10090 {0xac2c323e, 0x0191}, // Fhook {0xac32a034, 0x316f}, // mieumsioskorean {0xac483cb3, 0x338c}, // mufsquare {0xac4f1094, 0x059c}, // gereshaccenthebrew {0xac50a082, 0x33a3}, // mmcubedsquare {0xac5faca7, 0x230b}, // floorrightbig {0xac67aca2, 0x045b}, // tshecyrillic {0xacb92bab, 0x0691}, // rreharabic {0xacd00f05, 0x21c6}, // arrowleftoverright {0xacd11e18, 0x2010}, // hyphentwo {0xace7d07a, 0x0921}, // ddadeva {0xacfcbdb9, 0x3042}, // ahiragana {0xad01f787, 0xff1d}, // equalmonospace {0xad1b58f9, 0x0595}, // zaqefgadolhebrew {0xad29738f, 0x05f4}, // gershayimhebrew {0xad33f4b3, 0x04c1}, // Zhebrevecyrillic {0xad37f8e0, 0x0a24}, // tagurmukhi {0xad38bc31, 0x2194}, // arrowboth {0xad5fe438, 0x0924}, // tadeva {0xad781e89, 0x200c}, // afii61664 {0xad8ff38a, 0x0a21}, // ddagurmukhi {0xadb1b19e, 0x0206}, // Einvertedbreve {0xadb53f6b, 0xfbaf}, // yehbarreefinalarabic {0xadbea3e4, 0x20aa}, // afii57636 {0xadc3ff5e, 0x0649}, // afii57449 {0xadf402a9, 0x0989}, // ubengali {0xadf4d422, 0x0625}, // alefhamzabelowarabic {0xae04e5ad, 0x0a15}, // kagurmukhi {0xae1f7b0a, 0x2076}, // sixsuperior {0xae23dd7b, 0x1eaf}, // abreveacute {0xae30147f, 0x0908}, // iideva {0xae56317c, 0x24ae}, // sparen {0xae6f7e74, 0x031b}, // horncmb {0xae7c975f, 0x249a}, // nineteenperiod {0xae8f4e4c, 0x0406}, // afii10055 {0xaeb06274, 0x0423}, // Ucyrillic {0xaec173e8, 0x03b8}, // theta {0xaee16fb6, 0xfe4f}, // underscorewavy {0xaef4b475, 0x1edf}, // ohornhookabove {0xaef8393d, 0x0664}, // fourarabic {0xaf01f370, 0x278e}, // fivecircleinversesansserif {0xaf2073fd, 0x2103}, // centigrade {0xaf3552ce, 0x3072}, // hihiragana {0xaf36c6b1, 0x30cd}, // nekatakana {0xaf4df0df, 0xfc0e}, // tehmeemisolatedarabic {0xaf5710c9, 0x00c0}, // Agrave {0xaf5b123d, 0x032d}, // circumflexbelowcmb {0xaf5ce08f, 0x00e0}, // agrave {0xaf788850, 0x00fc}, // udieresis {0xaf7abcb1, 0x05b9}, // holam {0xaf8a8524, 0x0455}, // dzecyrillic {0xafa14924, 0x33d3}, // lxsquare {0xafaa365c, 0x30be}, // zokatakana {0xafb28009, 0x03e2}, // Sheicoptic {0xafb8e89a, 0x0a68}, // twogurmukhi {0xafbbfcac, 0xff71}, // akatakanahalfwidth {0xafbd0738, 0x305d}, // sohiragana {0xafc9b657, 0x0e17}, // thothahanthai {0xb000150a, 0xfe96}, // tehfinalarabic {0xb01f8020, 0x0666}, // sixarabic {0xb026a3ef, 0x30b3}, // kokatakana {0xb0309f24, 0xfee3}, // meeminitialarabic {0xb032be97, 0x047b}, // omegaroundcyrillic {0xb033a837, 0x0079}, // y {0xb03640f2, 0x2252}, // approxequalorimage {0xb0522c01, 0x278f}, // sixcircleinversesansserif {0xb0791aaf, 0x09f3}, // rupeesignbengali {0xb0a20aff, 0x22db}, // greaterequalorless {0xb0c33454, 0x028a}, // upsilonlatin {0xb0efaba6, 0x0a97}, // gagujarati {0xb107bdf6, 0x304b}, // kahiragana {0xb1240d86, 0x0474}, // afii10148 {0xb145d406, 0x327b}, // hieuhacirclekorean {0xb169c9ac, 0x1eed}, // uhornhookabove {0xb1722e49, 0x3006}, // ideographicclose {0xb199f9f3, 0x314a}, // chieuchkorean {0xb1a83745, 0x246e}, // fifteencircle {0xb1a9eaa4, 0x1eb7}, // abrevedotbelow {0xb1b08c26, 0x2020}, // dagger {0xb1b2e578, 0xff13}, // threemonospace {0xb1c3eac2, 0x1e8c}, // Xdieresis {0xb1e18633, 0x0e2d}, // oangthai {0xb1eda93c, 0x09e2}, // lvocalicvowelsignbengali {0xb1fa6226, 0x0a9a}, // cagujarati {0xb225a8bc, 0x0947}, // evowelsigndeva {0xb243894e, 0x21d1}, // arrowdblup {0xb25639c1, 0x2534}, // SF070000 {0xb2566e08, 0x064d}, // afii57453 {0xb256786e, 0x03f2}, // sigmalunatesymbolgreek {0xb25b34dc, 0x0e1a}, // bobaimaithai {0xb26943db, 0x0420}, // afii10034 {0xb27e91f4, 0x01bb}, // twostroke {0xb290d64a, 0xfe88}, // alefhamzabelowfinalarabic {0xb2bbd0d4, 0xfeb0}, // zainfinalarabic {0xb2cc02c2, 0x1e38}, // Ldotbelowmacron {0xb2d79f3e, 0x00f9}, // ugrave {0xb2d7f27b, 0x0652}, // afii57458 {0xb2d95c63, 0x2518}, // SF040000 {0xb2f3aff0, 0x0946}, // eshortvowelsigndeva {0xb3178333, 0x00da}, // Uacute {0xb321fe9c, 0x21e3}, // arrowdashdown {0xb3329e90, 0x313e}, // rieulthieuthkorean {0xb33c41bc, 0x018c}, // dtopbar {0xb340e2fe, 0x04a5}, // enghecyrillic {0xb341da2f, 0x1e36}, // Ldotbelow {0xb345c512, 0xfea4}, // hahmedialarabic {0xb369c9bd, 0x2423}, // blank {0xb36f3f4e, 0x054d}, // Seharmenian {0xb3880287, 0x05d6}, // zayinhebrew {0xb38b59bc, 0x0ac0}, // iivowelsigngujarati {0xb3a3592e, 0x21e5}, // arrowtabright {0xb3dbcf55, 0x323d}, // ideographicenterpriseparen {0xb3e6b497, 0x03c9}, // omega {0xb3ed41be, 0x328f}, // ideographearthcircle {0xb40169ac, 0x05b0}, // sheva22 {0xb405e3e3, 0x0439}, // afii10075 {0xb41baecc, 0x2487}, // twentyparen {0xb427632e, 0x05b3}, // hatafqamats1b {0xb4344c30, 0x090f}, // edeva {0xb43bb55a, 0x3263}, // rieulcirclekorean {0xb448d464, 0x0391}, // Alpha {0xb45a5763, 0x201b}, // quoteleftreversed {0xb45ef9b7, 0x03c0}, // pi {0xb497903a, 0x01dd}, // eturned {0xb4a55071, 0x1e7d}, // vtilde {0xb4a6b289, 0x2235}, // because {0xb4a7f99d, 0x0954}, // acutedeva {0xb4a9d27d, 0x05d2}, // afii57666 {0xb4c0dc86, 0x0e48}, // maiekthai {0xb4c2484c, 0x05dc}, // lamed {0xb4c667bc, 0xff61}, // periodhalfwidth {0xb4c72b2a, 0x0215}, // udblgrave {0xb4e21f31, 0x2198}, // arrowdownright {0xb500deca, 0x1e41}, // mdotaccent {0xb510d684, 0x1e80}, // Wgrave {0xb526b685, 0x22bf}, // righttriangle {0xb52e7c1d, 0x091e}, // nyadeva {0xb53ca7e2, 0x326c}, // phieuphcirclekorean {0xb58e59d7, 0x24ad}, // rparen {0xb5af274f, 0x064a}, // afii57450 {0xb5b94593, 0x010d}, // ccaron {0xb5c458a3, 0x05b8}, // qamatsqatanwidehebrew {0xb5f24e31, 0xff5a}, // zmonospace {0xb600bed1, 0x3024}, // fourhangzhou {0xb6052cdb, 0x010b}, // cdotaccent {0xb61c54b4, 0x24e4}, // ucircle {0xb64312f2, 0x00a2}, // cent {0xb6443d26, 0x0622}, // afii57410 {0xb647ed9e, 0x01d7}, // Udieresisacute {0xb652184e, 0x0e4b}, // maichattawathai {0xb6588f1c, 0x247c}, // nineparen {0xb66bf9b9, 0x33dc}, // svsquare {0xb673fbb5, 0x038e}, // Upsilontonos {0xb67e35c8, 0x0121}, // gdotaccent {0xb6bb2a6b, 0x0116}, // Edot {0xb6d45c54, 0xff7a}, // kokatakanahalfwidth {0xb6f322b3, 0x05e5}, // afii57685 {0xb6f9554e, 0x3205}, // pieupparenkorean {0xb6f9c67c, 0x0464}, // Eiotifiedcyrillic {0xb6fea9e7, 0xff3f}, // underscoremonospace {0xb70f3f60, 0xff4e}, // nmonospace {0xb711b601, 0x039d}, // Nu {0xb719922a, 0x067e}, // afii57506 {0xb71d84e2, 0x3167}, // nieunsioskorean {0xb726c42e, 0xfb49}, // shindageshhebrew {0xb72e5846, 0x1edb}, // ohornacute {0xb73606f5, 0x0463}, // afii10194 {0xb7400632, 0x33aa}, // kpasquare {0xb747ebc8, 0x2310}, // revlogicalnot {0xb755a24e, 0x310e}, // kbopomofo {0xb7934eea, 0x01c5}, // Dzcaron {0xb7affc1f, 0x0418}, // afii10026 {0xb7b78fdd, 0x2463}, // fourcircle {0xb7bd89d3, 0x0491}, // gheupturncyrillic {0xb7d20c6c, 0x215c}, // threeeighths {0xb7e9bb2b, 0x30fe}, // voicediterationkatakana {0xb80991a9, 0x04d6}, // Iebrevecyrillic {0xb81d8e8c, 0xfb31}, // betdagesh {0xb855cda8, 0x3397}, // dlsquare {0xb85a6427, 0x0650}, // kasraarabic {0xb8632720, 0x0e07}, // ngonguthai {0xb879d78f, 0xfe32}, // endashvertical {0xb894f4d6, 0x01a0}, // Ohorn {0xb8972176, 0x04bb}, // shhacyrillic {0xb89948ac, 0x0a93}, // ogujarati {0xb8be7e03, 0x2039}, // guilsinglleft {0xb8fa96e6, 0x0110}, // Dslash {0xb8ff412c, 0xfef8}, // lamalefhamzaabovefinalarabic {0xb902d285, 0x053a}, // Zhearmenian {0xb90dcf8c, 0xff6a}, // esmallkatakanahalfwidth {0xb910864a, 0x2032}, // minute {0xb921c241, 0xfeca}, // ainfinalarabic {0xb92ccc5d, 0x2469}, // tencircle {0xb9305b2b, 0x3174}, // pieupsioskiyeokkorean {0xb96268cb, 0x00de}, // Thorn {0xb9808b18, 0x09c1}, // uvowelsignbengali {0xb9927e88, 0x3382}, // muasquare {0xb99f8f9e, 0xfeeb}, // hehinitialarabic {0xb9b2e314, 0x0498}, // Zedescendercyrillic {0xb9b4563d, 0x24b3}, // xparen {0xb9c5eece, 0x05bc}, // dageshhebrew {0xb9d8b5d9, 0xfba4}, // hehhamzaaboveisolatedarabic {0xb9dbedd2, 0x317b}, // siosnieunkorean {0xb9e5ea71, 0x314c}, // thieuthkorean {0xb9e8b13e, 0x25a0}, // filledbox {0xb9f42560, 0x0964}, // danda {0xb9f5b462, 0x0990}, // aibengali {0xba1bcecd, 0x0176}, // Ycircumflex {0xba1f80d6, 0x21e1}, // arrowdashup {0xba21ad27, 0xfb3a}, // finalkafdagesh {0xba4eb5f9, 0x0055}, // U {0xba544632, 0x05db}, // afii57675 {0xba5871eb, 0x033e}, // tildeverticalcmb {0xba60a3b8, 0x0902}, // anusvaradeva {0xba7e1049, 0x01d9}, // Udieresiscaron {0xba8d69d2, 0x232a}, // angleright {0xbaa24d97, 0x05e0}, // afii57680 {0xbaa7aa4c, 0xfedc}, // kafmedialarabic {0xbac7de75, 0x1ed3}, // ocircumflexgrave {0xbad44ddc, 0x004f}, // O {0xbad7d685, 0x04b8}, // Cheverticalstrokecyrillic {0xbad97612, 0x03af}, // iotatonos {0xbadf80e2, 0x06f5}, // fivepersian {0xbafeb301, 0x0422}, // Tecyrillic {0xbb28e2ea, 0x1eb2}, // Abrevehookabove {0xbb30f37e, 0x0218}, // Scommaaccent {0xbb6353b2, 0x0332}, // lowlinecmb {0xbb72d76e, 0x0139}, // Lacute {0xbb906e01, 0x3266}, // sioscirclekorean {0xbb970588, 0x266f}, // musicsharpsign {0xbba252f7, 0x0106}, // Cacute {0xbbae7b40, 0x3172}, // pieupkiyeokkorean {0xbbb9d0f4, 0x0934}, // llladeva {0xbbd8677b, 0x330d}, // karoriisquare {0xbbdbcb55, 0x0a6f}, // ninegurmukhi {0xbbdc86be, 0xfb2b}, // shinsindot {0xbc0d2781, 0x0a1f}, // ttagurmukhi {0xbc1b1166, 0x2558}, // SF500000 {0xbc280da2, 0x1e79}, // utildeacute {0xbc3510eb, 0x317f}, // pansioskorean {0xbc45cf9a, 0x02a4}, // dezh {0xbc75336c, 0x21a9}, // arrowhookright {0xbc78e14f, 0x24b0}, // uparen {0xbcd2c61b, 0x064c}, // dammatanarabic {0xbd0f6f71, 0x004c}, // L {0xbd1a9441, 0x3235}, // ideographicspecialparen {0xbd1abdb6, 0x0184}, // Tonesix {0xbd2d2e5f, 0x054e}, // Vewarmenian {0xbd30ce0c, 0x2641}, // earth {0xbd4d0860, 0x320a}, // khieukhparenkorean {0xbd54bd2d, 0x3208}, // cieucparenkorean {0xbd569183, 0x0182}, // Btopbar {0xbd5dbcc1, 0x0151}, // odblacute {0xbd5ee257, 0x01b7}, // Ezh {0xbd85b57b, 0x21a8}, // arrowupdownbase {0xbd8f8d24, 0x064b}, // fathatanarabic {0xbd906fab, 0x041f}, // Pecyrillic {0xbd98b80f, 0x25c8}, // whitediamondcontainingblacksmalldiamond {0xbdc1280a, 0x24be}, // Icircle {0xbdd372da, 0x318b}, // yuyekorean {0xbde8281d, 0x3276}, // cieucacirclekorean {0xbe3e45cf, 0xfb58}, // pehinitialarabic {0xbe663ca6, 0x2470}, // seventeencircle {0xbe7a58ae, 0x3203}, // rieulparenkorean {0xbea937fd, 0x25bc}, // blackdownpointingtriangle {0xbec6916e, 0x011c}, // Gcircumflex {0xbedd6640, 0x00d9}, // Ugrave {0xbf12496a, 0x0985}, // abengali {0xbf156070, 0x04e2}, // Imacroncyrillic {0xbf26dc61, 0x041d}, // Encyrillic {0xbf2dca30, 0x3082}, // mohiragana {0xbf3cff90, 0x0425}, // afii10039 {0xbf5cef43, 0x01ee}, // Ezhcaron {0xbf673175, 0x01fd}, // aeacute {0xbf87a284, 0x00bf}, // questiondown {0xbf897387, 0x2273}, // greaterorequivalent {0xbf8f3598, 0x25a6}, // squareorthogonalcrosshatchfill {0xbf934ed3, 0x04e0}, // Dzeabkhasiancyrillic {0xbf97194e, 0x010a}, // Cdot {0xbf9bc7bd, 0xfb59}, // pehmedialarabic {0xbf9c1926, 0x0627}, // alefarabic {0xbfc69ab7, 0xff18}, // eightmonospace {0xbfd3ede4, 0x0396}, // Zeta {0xbffa52a3, 0x33c7}, // cosquare {0xc006a810, 0x062a}, // teharabic {0xc008508a, 0xff1c}, // lessmonospace {0xc00a3b07, 0x24bc}, // Gcircle {0xc0126352, 0x0661}, // onearabic {0xc03e102c, 0x3012}, // postalmark {0xc059a094, 0x0626}, // yehhamzaabovearabic {0xc0668ba8, 0x202e}, // afii61575 {0xc07e7e42, 0x24a6}, // kparen {0xc084bd84, 0x1e29}, // hcedilla {0xc092fb91, 0x1e95}, // zlinebelow {0xc09823db, 0x016f}, // uring {0xc09889a1, 0x1e11}, // dcedilla {0xc0a2bc69, 0x2564}, // SF470000 {0xc0a93f4f, 0x0e2c}, // lochulathai {0xc0bd9f90, 0x094a}, // oshortvowelsigndeva {0xc0c043bd, 0x3008}, // anglebracketleft {0xc0c1496c, 0x029e}, // kturned {0xc0cbe66a, 0x33b7}, // mvsquare {0xc0d444a4, 0x3220}, // oneideographicparen {0xc0dcb90f, 0x062e}, // khaharabic {0xc0efe98c, 0x2191}, // arrowup {0xc0fb3832, 0x25ab}, // H18551 {0xc131664b, 0x30e4}, // yakatakana {0xc1425417, 0x317a}, // sioskiyeokkorean {0xc1641f79, 0xfe4d}, // lowlinedashed {0xc1835ca2, 0x02d3}, // ringhalfleftcentered {0xc191ae65, 0x0470}, // Psicyrillic {0xc1aa3399, 0x2a06}, // unionsqtext {0xc1c1cd87, 0xff2e}, // Nmonospace {0xc1d325d6, 0x05d8}, // tet {0xc1e02cdd, 0x0594}, // zaqefqatanhebrew {0xc1e3fd2d, 0x05d5}, // vav {0xc1e4c743, 0x3057}, // sihiragana {0xc1ec1451, 0x03c3}, // sigma {0xc1f9ede7, 0x05a3}, // munahhebrew {0xc2089a04, 0x05b7}, // patah1d {0xc21675c5, 0x0317}, // acutebelowcmb {0xc21e92b6, 0x2265}, // greaterequal {0xc2352e98, 0x0554}, // Keharmenian {0xc25217c2, 0xfeff}, // zerowidthjoiner {0xc25a58a0, 0x0a28}, // nagurmukhi {0xc25a7d39, 0x2663}, // club {0xc2658d7c, 0x3395}, // mulsquare {0xc26d6fce, 0x20a9}, // won {0xc283f2c3, 0x03bc}, // mugreek {0xc29c269a, 0x326d}, // hieuhcirclekorean {0xc2c391b3, 0x25b2}, // triagup {0xc2d0d165, 0x0137}, // kcommaaccent {0xc2db7e0f, 0x04a0}, // Kabashkircyrillic {0xc327f9ff, 0x239b}, // parenlefttp {0xc32ea721, 0x061f}, // afii57407 {0xc36634d0, 0x09f9}, // sixteencurrencydenominatorbengali {0xc3722d19, 0x23ad}, // bracerightbt {0xc3751bae, 0x25ab}, // whitesmallsquare {0xc375a046, 0x05b0}, // shevahebrew {0xc391e9a8, 0xfe50}, // commasmall {0xc3c94bba, 0x306a}, // nahiragana {0xc3d9dd70, 0xfe43}, // whitecornerbracketleftvertical {0xc3df4586, 0x0903}, // visargadeva {0xc3eb9abd, 0x02c6}, // circumflex {0xc3edb597, 0x24bb}, // Fcircle {0xc3f1c1ff, 0x00e3}, // atilde {0xc3f76044, 0xff7c}, // sikatakanahalfwidth {0xc3f8f5bb, 0x04e3}, // imacroncyrillic {0xc3fbb2ce, 0x025e}, // eopenreversedclosed {0xc4004762, 0x328a}, // ideographmooncircle {0xc4289b41, 0x25a5}, // squareverticalfill {0xc43e9d0c, 0x1e26}, // Hdieresis {0xc4494fb1, 0x098b}, // rvocalicbengali {0xc459127a, 0x2174}, // fiveroman {0xc460226d, 0xfb34}, // hedagesh {0xc4607843, 0x25ca}, // lozenge {0xc4991f6f, 0x03d0}, // betasymbolgreek {0xc49bedba, 0x1e22}, // Hdotaccent {0xc4bd396f, 0xff98}, // rikatakanahalfwidth {0xc4cf0400, 0x0ac3}, // rvocalicvowelsigngujarati {0xc4d48fb7, 0x0a06}, // aagurmukhi {0xc510ccfb, 0x0327}, // cedillacmb {0xc51e03d1, 0x0e2a}, // sosuathai {0xc5233a99, 0xff41}, // amonospace {0xc52d9608, 0x0409}, // afii10058 {0xc541abe3, 0x0409}, // Ljecyrillic {0xc560e83e, 0x1e4c}, // Otildeacute {0xc575fbd8, 0x3303}, // aarusquare {0xc577ce75, 0xff5d}, // bracerightmonospace {0xc579feb1, 0x03bf}, // omicron {0xc5904240, 0x1ee9}, // uhornacute {0xc594a84a, 0x0a85}, // agujarati {0xc5a57fbd, 0x0178}, // Ydieresis {0xc5b52809, 0x25ac}, // filledrect {0xc5c558c0, 0x2593}, // dkshade {0xc5df0b88, 0x0aae}, // magujarati {0xc5e2935b, 0x30bf}, // takatakana {0xc616ce34, 0x1e83}, // wacute {0xc618c356, 0x005f}, // underscore {0xc6231f67, 0x3117}, // zbopomofo {0xc62d494f, 0x042b}, // afii10045 {0xc65b9029, 0x0012}, // controlDC2 {0xc65e4473, 0x0300}, // gravecomb {0xc6649ea6, 0x263b}, // blacksmilingface {0xc6730a47, 0x3230}, // ideographicsunparen {0xc6a18663, 0x2173}, // fourroman {0xc6a33bcf, 0x23a4}, // bracketrighttp {0xc6bb9cde, 0x03c1}, // rho {0xc6c2ca67, 0x0537}, // Eharmenian {0xc6db1db1, 0x0a94}, // augujarati {0xc6ddc5a6, 0x0334}, // tildeoverlaycmb {0xc6e9fa39, 0x064a}, // yeharabic {0xc6fbfdac, 0x025a}, // schwahook {0xc703d8e7, 0x33b8}, // kvsquare {0xc71e49b3, 0x23a5}, // bracketrightex {0xc74688aa, 0x24dc}, // mcircle {0xc74a8cc7, 0x05b5}, // tserequarterhebrew {0xc74f4c99, 0x0298}, // bilabialclick {0xc7515b37, 0x0132}, // IJ {0xc755c80f, 0xff67}, // asmallkatakanahalfwidth {0xc75bc6a7, 0x01e8}, // Kcaron {0xc7618f62, 0x05b3}, // hatafqamats28 {0xc76816e4, 0x0566}, // zaarmenian {0xc76c439e, 0x0115}, // ebreve {0xc76ec8b2, 0x0e1c}, // phophungthai {0xc77c2828, 0x2206}, // Delta {0xc786ef31, 0x095b}, // zadeva {0xc78887c7, 0x1e08}, // Ccedillaacute {0xc78fe323, 0x0698}, // afii57508 {0xc798936b, 0xfc73}, // tehnoonfinalarabic {0xc7b3573a, 0x1e2f}, // idieresisacute {0xc7daee30, 0x09b7}, // ssabengali {0xc7e20869, 0x0aee}, // eightgujarati {0xc7ed01af, 0x33a5}, // mcubedsquare {0xc7f07bcf, 0x248f}, // eightperiod {0xc7f0b4c8, 0x0406}, // Icyrillic {0xc7fb5fe5, 0x05b2}, // afii57800 {0xc812d1b7, 0x041b}, // afii10029 {0xc82c0a32, 0x026f}, // mturned {0xc834804d, 0x2475}, // twoparen {0xc8488aa4, 0x05b0}, // shevawidehebrew {0xc84db89c, 0x2013}, // endash {0xc85fce80, 0x0901}, // candrabindudeva {0xc86d3a57, 0xff31}, // Qmonospace {0xc875e6fd, 0x040c}, // afii10061 {0xc88f7d57, 0x05b3}, // hatafqamatsnarrowhebrew {0xc89d4f1f, 0x0006}, // controlACK {0xc8ae6fb2, 0x0e26}, // luthai {0xc8b50d48, 0x21d4}, // dblarrowleft {0xc8c2c42c, 0x0162}, // Tcedilla {0xc8c687a4, 0xfb4b}, // vavholamhebrew {0xc8cf912e, 0xfe59}, // parenleftsmall {0xc8fcce82, 0x0424}, // Efcyrillic {0xc8fdfe4b, 0x0914}, // audeva {0xc9315b90, 0x0338}, // soliduslongoverlaycmb {0xc93304ec, 0x2176}, // sevenroman {0xc9366418, 0x1e7e}, // Vdotbelow {0xc948d9f2, 0x01fe}, // Oslashacute {0xc948dd49, 0x0417}, // Zecyrillic {0xc94ac55a, 0xfb4e}, // perafehebrew {0xc94ceb7c, 0x1eca}, // Idotbelow {0xc956ff7e, 0x1e7b}, // umacrondieresis {0xc997284d, 0x03d3}, // Upsilonacutehooksymbolgreek {0xc997d626, 0xfe3d}, // dblanglebracketleftvertical {0xc9d02325, 0x2283}, // propersuperset {0xc9d7e9b6, 0x064c}, // afii57452 {0xc9d96803, 0x3278}, // khieukhacirclekorean {0xc9e8cf5f, 0xfebf}, // dadinitialarabic {0xc9ea8b89, 0x305b}, // sehiragana {0xc9eb1227, 0x321c}, // cieucuparenkorean {0xca07e9ca, 0x02dd}, // hungarumlaut {0xca0b3331, 0x1e5f}, // rlinebelow {0xca2dd9fa, 0x2590}, // rtblock {0xca5ed753, 0x0269}, // iotalatin {0xca65e972, 0x0646}, // noonarabic {0xcab40374, 0x1e1f}, // fdotaccent {0xcabe62a6, 0x0e16}, // thothungthai {0xcac3bcb6, 0x33a8}, // moverssquaredsquare {0xcac4b1a9, 0x32a8}, // ideographicrightcircle {0xcad1f345, 0x01bd}, // tonefive {0xcae44cee, 0x0013}, // controlDC3 {0xcaf66d1c, 0x33b4}, // pvsquare {0xcb1a38a0, 0x226b}, // muchgreater {0xcb1b6c03, 0x0a5e}, // fagurmukhi {0xcb1e3324, 0x042d}, // afii10047 {0xcb267db3, 0x3221}, // twoideographicparen {0xcb281438, 0x33ae}, // radoverssquare {0xcb2edf2d, 0x220f}, // product {0xcb4fc444, 0x03f0}, // kappasymbolgreek {0xcb56efb7, 0x015c}, // Scircumflex {0xcb5b537a, 0x0412}, // afii10019 {0xcb669b9c, 0x1ee2}, // Ohorndotbelow {0xcb72660a, 0xff1e}, // greatermonospace {0xcb75245d, 0x1e48}, // Nlinebelow {0xcb88e590, 0x013c}, // lcedilla {0xcb8bc7f1, 0x002b}, // plus {0xcbada403, 0x0429}, // Shchacyrillic {0xcc11d7b0, 0x000c}, // controlFF {0xcc261604, 0x04a2}, // Endescendercyrillic {0xcc3139de, 0x33d1}, // squareln {0xcc3accb9, 0x05d8}, // tethebrew {0xcc3b7b5c, 0x0649}, // alefmaksuraarabic {0xcc447b1d, 0x0296}, // glottalstopinverted {0xcc8c13e9, 0x25c0}, // blackleftpointingtriangle {0xcc993e5c, 0x025c}, // eopenreversed {0xcca8fd16, 0x09e3}, // llvocalicvowelsignbengali {0xccaa74e1, 0xfb7d}, // tchehmedialarabic {0xccac0ec6, 0x300b}, // dblanglebracketright {0xccc389ea, 0xfb30}, // alefdageshhebrew {0xccc85a27, 0x0a81}, // candrabindugujarati {0xcd07b41d, 0x05bc}, // dagesh {0xcd30953c, 0x203c}, // exclamdbl {0xcd37d58c, 0x24e3}, // tcircle {0xcd415c99, 0x0e55}, // fivethai {0xcd499038, 0x33a2}, // kmsquaredsquare {0xcd54eec2, 0x06f4}, // fourpersian {0xcd5fb77d, 0x0185}, // tonesix {0xcd64e087, 0x266b}, // musicalnotedbl {0xcd75d5eb, 0x2551}, // SF240000 {0xcd7ce3d0, 0x24a7}, // lparen {0xcd85d846, 0x1eec}, // Uhornhookabove {0xcd9d27ad, 0x24c7}, // Rcircle {0xcd9f5a2c, 0x0028}, // parenleft {0xcda0c667, 0x2018}, // quoteleft {0xcdae6ea2, 0xff59}, // ymonospace {0xcdbb64f4, 0x2105}, // afii61248 {0xcdd2cfab, 0x24b4}, // yparen {0xcdd44c7f, 0x33a4}, // cmcubedsquare {0xcde56fe0, 0x05b6}, // segol {0xcdea4ff0, 0x03d4}, // Upsilondieresishooksymbolgreek {0xcdf0bcd8, 0x0e1e}, // phophanthai {0xcdfd40ec, 0x0180}, // bstroke {0xce074882, 0x0668}, // afii57400 {0xce4d2d1e, 0x2563}, // SF230000 {0xce6d06c6, 0x0aab}, // phagujarati {0xce6f0d59, 0x3272}, // mieumacirclekorean {0xce79a056, 0x3339}, // herutusquare {0xce8dac39, 0x25a8}, // squareupperrighttolowerleftfill {0xce942ad9, 0x09a6}, // dabengali {0xcea39f20, 0x02d5}, // downtackmod {0xcedf2a68, 0x0157}, // rcedilla {0xcee9759d, 0x043a}, // afii10076 {0xcef01870, 0x0171}, // udblacute {0xcef10e83, 0x046a}, // Yusbigcyrillic {0xcef67881, 0x200c}, // zerowidthnonjoiner {0xcf235874, 0x030c}, // caroncmb {0xcf4c6b71, 0x02d4}, // uptackmod {0xcf6550b0, 0xfb4a}, // tavdageshhebrew {0xcf6a5e7c, 0x323e}, // ideographicresourceparen {0xcf738908, 0x011d}, // gcircumflex {0xcf848334, 0x0453}, // afii10100 {0xcf8cbf6b, 0x0195}, // hv {0xcf9b96b5, 0x03bd}, // nu {0xcfb1da5d, 0xff89}, // nokatakanahalfwidth {0xcfc386a6, 0x00db}, // Ucircumflex {0xcfc400d6, 0x06d2}, // yehbarreearabic {0xcfd8a703, 0xfe61}, // asterisksmall {0xcfe519cb, 0x309b}, // voicedmarkkana {0xcfe64e44, 0x0668}, // eighthackarabic {0xcff88b7d, 0x05b8}, // qamatsqatannarrowhebrew {0xd0096386, 0x25b3}, // whiteuppointingtriangle {0xd0227bd1, 0x0199}, // khook {0xd02a9cfe, 0x0105}, // aogonek {0xd031b297, 0x24e9}, // zcircle {0xd03ef2b0, 0x316b}, // rieulpieupsioskorean {0xd0417b9a, 0x0494}, // Ghemiddlehookcyrillic {0xd044dddd, 0x0a9d}, // jhagujarati {0xd04ad0f0, 0x263c}, // sun {0xd04cc01e, 0x0561}, // aybarmenian {0xd0511b87, 0x0e4c}, // thanthakhatthai {0xd056aca3, 0xff9a}, // rekatakanahalfwidth {0xd06b6bb7, 0x096a}, // fourdeva {0xd07a803b, 0x09aa}, // pabengali {0xd0847e20, 0x05c4}, // upperdothebrew {0xd087e60f, 0x0158}, // Rcaron {0xd0897bb6, 0x0579}, // chaarmenian {0xd0c5df61, 0x05b4}, // hiriq14 {0xd0ce4edc, 0x09e9}, // threebengali {0xd0d6e6c0, 0xff6c}, // yasmallkatakanahalfwidth {0xd0e3648a, 0xfd3e}, // parenleftaltonearabic {0xd133ff70, 0x01a1}, // ohorn {0xd1373ca2, 0x0648}, // wawarabic {0xd13d9bf5, 0xfe37}, // braceleftvertical {0xd13faec5, 0x05e1}, // samekh {0xd14fc185, 0x045b}, // afii10108 {0xd17987dd, 0x0543}, // Cheharmenian {0xd18447d8, 0x0663}, // threearabic {0xd18966b1, 0x0a82}, // anusvaragujarati {0xd18d83de, 0x0aa3}, // nnagujarati {0xd190d310, 0x0a35}, // vagurmukhi {0xd191827c, 0x0e39}, // sarauuthai {0xd1acdf44, 0xfb94}, // gafinitialarabic {0xd1d7231f, 0x04bc}, // Cheabkhasiancyrillic {0xd1d9da71, 0x30ea}, // rikatakana {0xd2337241, 0x05b6}, // segol1f {0xd247ef8b, 0x3243}, // ideographicreachparen {0xd254c368, 0x0443}, // ucyrillic {0xd2658bcb, 0x05b9}, // holamquarterhebrew {0xd26b0e16, 0x2321}, // integralbt {0xd26ef570, 0x310f}, // hbopomofo {0xd293868c, 0x019b}, // lambdastroke {0xd297cb79, 0x30b7}, // sikatakana {0xd2b4c516, 0x30da}, // pekatakana {0xd2c0e1bc, 0x0150}, // Odblacute {0xd2cbfc99, 0x05b7}, // patahhebrew {0xd2e2a716, 0x03ec}, // Shimacoptic {0xd2eaddf5, 0x0633}, // seenarabic {0xd2f253f5, 0xfe40}, // anglebracketrightvertical {0xd2f3cdf3, 0x1e0e}, // Dlinebelow {0xd304784a, 0x05d3}, // dalet {0xd308b167, 0x1e5b}, // rdotbelow {0xd310fcc1, 0x04e9}, // obarredcyrillic {0xd3145153, 0xfeec}, // hehmedialarabic {0xd326ec6d, 0x2237}, // proportion {0xd3342503, 0x30bd}, // sokatakana {0xd33cb244, 0x02cd}, // macronlowmod {0xd35ba6fb, 0x04be}, // Chedescenderabkhasiancyrillic {0xd3730282, 0xff64}, // ideographiccommaleft {0xd3797e0f, 0x24db}, // lcircle {0xd37b4bcb, 0x041c}, // afii10030 {0xd3a5ba29, 0x062e}, // afii57422 {0xd3c22da1, 0x01b5}, // Zstroke {0xd3c6a66e, 0x05e4}, // pe {0xd3cfef4c, 0x0427}, // afii10041 {0xd3e84c23, 0x201c}, // quotedblleft {0xd421361f, 0x067e}, // peharabic {0xd4273f62, 0x30fd}, // iterationkatakana {0xd44f2d4c, 0xff9b}, // rokatakanahalfwidth {0xd45c6c89, 0x3079}, // behiragana {0xd467b0a3, 0x0131}, // dotlessi {0xd48c064b, 0x0599}, // pashtahebrew {0xd48dad4d, 0x01e2}, // AEmacron {0xd4b2bb68, 0x0145}, // Ncedilla {0xd4d3eb56, 0x255e}, // SF360000 {0xd4e86e58, 0x1ef7}, // yhookabove {0xd4e92fa8, 0x0623}, // alefhamzaabovearabic {0xd514a0e0, 0x318c}, // yuikorean {0xd5189135, 0x1e73}, // udieresisbelow {0xd52f1d8f, 0x24cb}, // Vcircle {0xd54b71bd, 0x0a6e}, // eightgurmukhi {0xd574af4c, 0x318e}, // araeaekorean {0xd57a206a, 0x00f2}, // ograve {0xd58ee561, 0x04f3}, // uhungarumlautcyrillic {0xd5b6f4bf, 0x3163}, // ikorean {0xd5b7a706, 0x1e13}, // dcircumflexbelow {0xd5da03ab, 0x0123}, // gcommaaccent {0xd5dc1f0e, 0x24a5}, // jparen {0xd5e6a2b4, 0x200f}, // afii300 {0xd6067104, 0x05bd}, // siluqlefthebrew {0xd6180af1, 0x0023}, // numbersign {0xd6191adc, 0x02ce}, // gravelowmod {0xd6480a61, 0x0e46}, // maiyamokthai {0xd65815d1, 0x04f5}, // chedieresiscyrillic {0xd6674587, 0xfea8}, // khahmedialarabic {0xd66f3b98, 0x1ebd}, // etilde {0xd67d357f, 0x0e23}, // roruathai {0xd67dc19d, 0x1e05}, // bdotbelow {0xd682be7e, 0xfe54}, // semicolonsmall {0xd689f58d, 0x0024}, // dollar {0xd68be98a, 0xff8f}, // makatakanahalfwidth {0xd6a99b0e, 0x05aa}, // yerahbenyomolefthebrew {0xd6c4c66e, 0x3262}, // tikeutcirclekorean {0xd6c7e5a6, 0x03b0}, // upsilondieresistonos {0xd6df6252, 0xfef4}, // yehmedialarabic {0xd6e234de, 0x044d}, // afii10095 {0xd7151c8a, 0x040b}, // afii10060 {0xd71af0cf, 0x00af}, // overscore {0xd72c6112, 0x0036}, // six {0xd73b3901, 0x02da}, // ring {0xd7425de1, 0x0a1d}, // jhagurmukhi {0xd771b953, 0x3107}, // mbopomofo {0xd7a40cc3, 0x315c}, // ukorean {0xd7b7f8a3, 0x3094}, // vuhiragana {0xd7b8c7af, 0x05b8}, // qamatsquarterhebrew {0xd7bf0d2a, 0x308b}, // ruhiragana {0xd7cebade, 0x01b1}, // Upsilonafrican {0xd7d268b5, 0x314e}, // hieuhkorean {0xd7ece605, 0x2553}, // SF520000 {0xd813ab1a, 0x3176}, // pieupcieuckorean {0xd816387d, 0x2178}, // nineroman {0xd8171429, 0x013e}, // lcaron {0xd817c39d, 0x0664}, // fourhackarabic {0xd824acfb, 0x05de}, // memhebrew {0xd849e14d, 0x3052}, // gehiragana {0xd84afb0a, 0x00d1}, // Ntilde {0xd85534fc, 0x02ca}, // secondtonechinese {0xd8708805, 0x01ba}, // ezhtail {0xd890928b, 0x0053}, // S {0xd893adf8, 0x0580}, // reharmenian {0xd8964f73, 0x043d}, // encyrillic {0xd89879e8, 0x2116}, // afii61352 {0xd8a1ab6d, 0x03ab}, // Upsilondieresis {0xd8b1d2bf, 0x0177}, // ycircumflex {0xd8faed0d, 0x30ef}, // wakatakana {0xd9038cdb, 0x32a4}, // ideographichighcircle {0xd90a7039, 0x06af}, // afii57509 {0xd91584cd, 0xfe31}, // emdashvertical {0xd92072b9, 0x0493}, // ghestrokecyrillic {0xd92d9608, 0x0acd}, // viramagujarati {0xd932c15c, 0x30ac}, // gakatakana {0xd93c2940, 0x33cf}, // ktsquare {0xd94d846e, 0x321a}, // phieuphaparenkorean {0xd94faf13, 0x0188}, // chook {0xd95c2f59, 0x04bd}, // cheabkhasiancyrillic {0xd9697a13, 0x328b}, // ideographfirecircle {0xd98cc91f, 0x0307}, // dotaccentcmb {0xd991004f, 0x0e4f}, // fongmanthai {0xd99e3976, 0x249f}, // dparen {0xd9ba695c, 0xff70}, // katahiraprolongmarkhalfwidth {0xd9d63664, 0x0189}, // Dafrican {0xd9e83df4, 0x096b}, // fivedeva {0xd9eba56d, 0x03b3}, // gamma {0xda15411c, 0x0304}, // macroncmb {0xda2037e1, 0x1e01}, // aringbelow {0xda3670ae, 0x3347}, // mansyonsquare {0xda39b9df, 0x013d}, // Lcaron {0xda48ff7e, 0x00bb}, // guillemotright {0xda4e1891, 0x228b}, // supersetnotequal {0xda55d0f3, 0x0a69}, // threegurmukhi {0xda620e6e, 0xfca2}, // tehhahinitialarabic {0xda734cc8, 0x232b}, // deleteleft {0xda85eaa3, 0x2070}, // zerosuperior {0xda94576a, 0x0999}, // ngabengali {0xda94a677, 0x0634}, // afii57428 {0xda99b3d7, 0x30d1}, // pakatakana {0xdab46527, 0x21e9}, // arrowdownwhite {0xdac4a95a, 0x002f}, // slash {0xdac8670b, 0x011e}, // Gbreve {0xdad5813e, 0x24bf}, // Jcircle {0xdaf9ae21, 0x03e7}, // kheicoptic {0xdb00acb2, 0x04dc}, // Zhedieresiscyrillic {0xdb07430c, 0x1eac}, // Acircumflexdotbelow {0xdb15243d, 0xfb38}, // tetdagesh {0xdb180684, 0x059d}, // gereshmuqdamhebrew {0xdb19f222, 0x1e30}, // Kacute {0xdb36c0cb, 0x00c1}, // Aacute {0xdb46a061, 0x044f}, // afii10097 {0xdb4843d8, 0x0140}, // ldotaccent {0xdb491e12, 0x3201}, // nieunparenkorean {0xdb4ecb82, 0x06a4}, // afii57505 {0xdb5fdfb2, 0x09cd}, // viramabengali {0xdb9c2f74, 0x3063}, // tusmallhiragana {0xdb9dda85, 0xfb3b}, // kafdageshhebrew {0xdba170e8, 0x0998}, // ghabengali {0xdbae2c8c, 0x2277}, // greaterorless {0xdbc3c473, 0x001a}, // controlSUB {0xdbc6ef9a, 0x05b2}, // hatafpatah23 {0xdbc71338, 0xff01}, // exclammonospace {0xdbcb0069, 0x338a}, // pfsquare {0xdbf12380, 0x2460}, // onecircle {0xdc0071a3, 0xfb46}, // tsadidageshhebrew {0xdc05ec50, 0x30f5}, // kasmallkatakana {0xdc0ad3ae, 0x012d}, // ibreve {0xdc0c240d, 0xff9e}, // voicedmarkkanahalfwidth {0xdc0c9e85, 0xff9f}, // semivoicedmarkkanahalfwidth {0xdc3d7ac8, 0x04a7}, // pemiddlehookcyrillic {0xdc41d3b3, 0x05ab}, // olehebrew {0xdc54447c, 0x307c}, // bohiragana {0xdc6ca9b3, 0x0584}, // keharmenian {0xdc7756d1, 0x0077}, // w {0xdc7d1de8, 0xfba9}, // hehmedialaltonearabic {0xdc7f6ca5, 0x0624}, // wawhamzaabovearabic {0xdcc5c006, 0x055a}, // apostrophearmenian {0xdce03f6b, 0x261e}, // pointingindexrightwhite {0xdcefaeeb, 0x228a}, // subsetnotequal {0xdd07775c, 0x3223}, // fourideographicparen {0xdd07a474, 0x00b3}, // threesuperior {0xdd21d4c1, 0x039b}, // Lambda {0xdd2fee63, 0x0aad}, // bhagujarati {0xdd4e62a4, 0x0a96}, // khagujarati {0xdd55f861, 0x2560}, // SF420000 {0xdd64bab7, 0x3080}, // muhiragana {0xdd68d3ef, 0x00a5}, // yen {0xdd8a8538, 0x0a26}, // dagurmukhi {0xdd9a009b, 0x2016}, // dblverticalbar {0xdda2fef7, 0x33db}, // srsquare {0xdda8f1e0, 0x33d4}, // mbsquare {0xddd89deb, 0xff4d}, // mmonospace {0xdde406ed, 0x23a8}, // braceleftmid {0xddfdd08a, 0x30a7}, // esmallkatakana {0xddfea657, 0x0049}, // I {0xddffcb32, 0x1e60}, // Sdotaccent {0xde111430, 0x2271}, // notgreaternorequal {0xde159412, 0x2605}, // blackstar {0xde3de1bb, 0xfede}, // lamfinalarabic {0xde4643cf, 0x0ac5}, // ecandravowelsigngujarati {0xde5450d1, 0xff88}, // nekatakanahalfwidth {0xde6c8dd1, 0x2223}, // divides {0xde91c7ac, 0xfb35}, // vavdagesh {0xdea63325, 0x0e0c}, // chochoethai {0xdea93241, 0x0385}, // dieresistonos {0xdeab4b8b, 0x05ad}, // dehihebrew {0xdebc4010, 0xfcd5}, // noonmeeminitialarabic {0xdebf0df4, 0x05f0}, // afii57716 {0xdecde878, 0x1e52}, // Omacronacute {0xdee80462, 0xffe5}, // yenmonospace {0xdee969b3, 0x3001}, // ideographiccomma {0xdef14eee, 0x020e}, // Oinvertedbreve {0xdef351c2, 0x020c}, // Odblgrave {0xdef92b6a, 0x3349}, // mirisquare {0xdf08e8b4, 0xff15}, // fivemonospace {0xdf09c757, 0x0186}, // Oopen {0xdf1ee74b, 0xff81}, // tikatakanahalfwidth {0xdf243dad, 0x044c}, // softsigncyrillic {0xdf46fba9, 0x01a4}, // Phook {0xdf80589a, 0x3217}, // chieuchaparenkorean {0xdf8c6402, 0x0e45}, // lakkhangyaothai {0xdf9eaf7a, 0x33bc}, // muwsquare {0xdfad5d93, 0x22c0}, // logicalandtext {0xdfaf476d, 0x0167}, // tbar {0xdfb9632c, 0x3144}, // pieupsioskorean {0xdff819d0, 0xfe8c}, // yehhamzaabovemedialarabic {0xdffe3761, 0x1e14}, // Emacrongrave {0xe0130535, 0x316c}, // rieulpansioskorean {0xe019189f, 0x0994}, // aubengali {0xe0197d92, 0x0a4b}, // oomatragurmukhi {0xe0343a59, 0x0323}, // dotbelowcomb {0xe03a2368, 0x019f}, // Ocenteredtilde {0xe0489c79, 0x017f}, // longs {0xe0560cdf, 0x1e19}, // ecircumflexbelow {0xe065671a, 0x1e0a}, // Ddotaccent {0xe07dfee5, 0x04f4}, // Chedieresiscyrillic {0xe0800244, 0xfb69}, // ttehmedialarabic {0xe0987417, 0x24dd}, // ncircle {0xe0ac4869, 0x3225}, // sixideographicparen {0xe0c42e1f, 0x3357}, // wattosquare {0xe0cf3aca, 0x1e1d}, // ecedillabreve {0xe0d114bf, 0x04b6}, // Chedescendercyrillic {0xe0dbd3b5, 0x2494}, // thirteenperiod {0xe0ec0106, 0x05a6}, // merkhakefulahebrew {0xe0ec7a9f, 0x01a6}, // yr {0xe0f957bb, 0x0644}, // afii57444 {0xe10a53c6, 0x0aa8}, // nagujarati {0xe13f2d93, 0x3026}, // sixhangzhou {0xe173c1f2, 0x1e12}, // Dcircumflexbelow {0xe180ca73, 0x1e43}, // mdotbelow {0xe1b37094, 0x0629}, // afii57417 {0xe1bbda55, 0x040e}, // Ushortcyrillic {0xe1bf1035, 0x0536}, // Zaarmenian {0xe20234a2, 0x012c}, // Ibreve {0xe20c937f, 0x041a}, // Kacyrillic {0xe20deadd, 0x047c}, // Omegatitlocyrillic {0xe2234dec, 0xff52}, // rmonospace {0xe22682ea, 0x3260}, // kiyeokcirclekorean {0xe22a6510, 0x1e8e}, // Ydotaccent {0xe23968a4, 0x04b3}, // hadescendercyrillic {0xe25773d9, 0x04d3}, // adieresiscyrillic {0xe259edda, 0x0628}, // afii57416 {0xe25f57e9, 0xfe9a}, // thehfinalarabic {0xe26168f6, 0x1e82}, // Wacute {0xe28a564c, 0x044f}, // iacyrillic {0xe28eea2e, 0x1e51}, // omacrongrave {0xe2924f7e, 0x0a67}, // onegurmukhi {0xe2a7b092, 0x3213}, // pieupaparenkorean {0xe2b99909, 0x0e14}, // dodekthai {0xe2cfeeb5, 0x0301}, // acutecomb {0xe2eccaa5, 0x0059}, // Y {0xe2ef1bbf, 0x2197}, // arrowupright {0xe2fc74df, 0x0533}, // Gimarmenian {0xe2ff3ec5, 0xfb8d}, // rrehfinalarabic {0xe2ffc4d4, 0x2661}, // heartsuitwhite {0xe3356dd7, 0x1e54}, // Pacute {0xe35f1369, 0xfe5c}, // bracerightsmall {0xe3708e14, 0xfed3}, // fehinitialarabic {0xe37c75f9, 0x03c7}, // chi {0xe38423f1, 0x01ab}, // tpalatalhook {0xe387ebf8, 0xff94}, // yakatakanahalfwidth {0xe39adf52, 0x05b7}, // patahnarrowhebrew {0xe39bb5ba, 0x0258}, // ereversed {0xe3a00fb0, 0x0aa2}, // ddhagujarati {0xe3a0394c, 0x05b3}, // afii57802 {0xe3bf40b5, 0x21c5}, // arrowupleftofdown {0xe3cbb73f, 0x0459}, // afii10106 {0xe3cddac1, 0x0621}, // hamzalowarabic {0xe3d5ad06, 0x1ec0}, // Ecircumflexgrave {0xe3dd99f7, 0x0596}, // tipehahebrew {0xe3fae787, 0x0587}, // echyiwnarmenian {0xe3fe00d6, 0x2170}, // oneroman {0xe401701f, 0x3016}, // whitelenticularbracketleft {0xe41d9109, 0x3089}, // rahiragana {0xe424f4cb, 0x0969}, // threedeva {0xe42a588e, 0x0e27}, // wowaenthai {0xe42a6647, 0x0a71}, // addakgurmukhi {0xe433c6bf, 0x042c}, // afii10046 {0xe44aea0b, 0x0219}, // scommaaccent {0xe44ed7aa, 0x2481}, // fourteenparen {0xe468e60e, 0x33bd}, // mwsquare {0xe47b4b2e, 0xfecb}, // aininitialarabic {0xe4896ee4, 0x09c0}, // iivowelsignbengali {0xe4924345, 0xff63}, // cornerbracketrighthalfwidth {0xe49ba568, 0x090c}, // lvocalicdeva {0xe4a8920f, 0x0014}, // controlDC4 {0xe4c6b94a, 0x0550}, // Reharmenian {0xe4c91eec, 0x1ea7}, // acircumflexgrave {0xe4d0a5c5, 0x2171}, // tworoman {0xe4de0824, 0x090b}, // rvocalicdeva {0xe4e78bbf, 0x0e33}, // saraamthai {0xe4e90251, 0xfb41}, // samekhdagesh {0xe4f1acea, 0x24d7}, // hcircle {0xe5034999, 0xff55}, // umonospace {0xe504c22f, 0x01a9}, // Esh {0xe506e1eb, 0x2493}, // twelveperiod {0xe5107e85, 0xff92}, // mekatakanahalfwidth {0xe5116fc8, 0x2472}, // nineteencircle {0xe514f37f, 0x03be}, // xi {0xe51bd3a3, 0x0163}, // tcedilla {0xe5287de7, 0x3173}, // pieuptikeutkorean {0xe5322bbf, 0x25b2}, // blackuppointingtriangle {0xe5431590, 0x2296}, // minuscircle {0xe54a2cdd, 0x201e}, // quotedblbase {0xe5694805, 0x3161}, // eukorean {0xe56f3e08, 0x1e9b}, // slongdotaccent {0xe5779de7, 0x0666}, // afii57398 {0xe578bf9d, 0x066d}, // asteriskaltonearabic {0xe5850206, 0x2226}, // notparallel {0xe59889e5, 0x014b}, // eng {0xe59f1c1d, 0x2664}, // spadesuitwhite {0xe59f1f71, 0x2203}, // thereexists {0xe5dca65a, 0x04aa}, // Esdescendercyrillic {0xe5e0ac19, 0x0a74}, // ekonkargurmukhi {0xe5eb1828, 0x25e6}, // openbullet {0xe5f403ac, 0x0981}, // candrabindubengali {0xe5f51e2d, 0x0156}, // Rcedilla {0xe61a323e, 0x21d2}, // arrowdblright {0xe61dad29, 0x017b}, // Zdotaccent {0xe62fb889, 0x2524}, // SF090000 {0xe6699f03, 0x025d}, // eopenreversedhook {0xe6743f55, 0x011a}, // Ecaron {0xe6861695, 0x018a}, // Dhook {0xe68d35b4, 0x0436}, // afii10072 {0xe68e2cfd, 0x306b}, // nihiragana {0xe6910141, 0x06f1}, // onepersian {0xe6936418, 0xfb2f}, // alefqamatshebrew {0xe6a0587d, 0x3222}, // threeideographicparen {0xe6a445c8, 0xfcd2}, // noonjeeminitialarabic {0xe6b00dbd, 0x060c}, // commaarabic {0xe6bd7d55, 0x04f0}, // Udieresiscyrillic {0xe6beeaab, 0x2667}, // clubsuitwhite {0xe6d26878, 0x0663}, // threehackarabic {0xe6eee43a, 0x031a}, // leftangleabovecmb {0xe70bdf5d, 0x1e85}, // wdieresis {0xe72762a6, 0x3127}, // ibopomofo {0xe74e8d5b, 0x02d0}, // colontriangularmod {0xe75de72d, 0x0a4d}, // halantgurmukhi {0xe796e6c1, 0x032f}, // breveinvertedbelowcmb {0xe7a9201c, 0x24e5}, // vcircle {0xe7abb869, 0x05b0}, // sheva115 {0xe7f3b395, 0x24d8}, // icircle {0xe80a2426, 0x3116}, // rbopomofo {0xe80eec90, 0x0942}, // uuvowelsigndeva {0xe832e25c, 0x03ef}, // deicoptic {0xe836846a, 0x20a1}, // colonsign {0xe8445eb9, 0x05e5}, // finaltsadihebrew {0xe84e29b1, 0xfef5}, // lamalefmaddaaboveisolatedarabic {0xe853fc35, 0x3177}, // pieupthieuthkorean {0xe871a9d4, 0x03e3}, // sheicoptic {0xe872f83d, 0x02a0}, // qhook {0xe87409fd, 0xfe8b}, // yehhamzaaboveinitialarabic {0xe885d69b, 0x1e58}, // Rdotaccent {0xe893423b, 0x202c}, // afii61573 {0xe894f25c, 0x03a1}, // Rho {0xe89d944f, 0x043a}, // kacyrillic {0xe8aff9ae, 0x24b7}, // Bcircle {0xe8d4db79, 0x2320}, // integraltp {0xe8d6bd29, 0x0621}, // afii57409 {0xe8ec3154, 0x2490}, // nineperiod {0xe8ef5782, 0x3092}, // wohiragana {0xe8f0c584, 0x05d1}, // afii57665 {0xe8f5ca9b, 0x05b1}, // hatafsegolnarrowhebrew {0xe8f7e9bf, 0x320f}, // nieunaparenkorean {0xe903bc23, 0xfb36}, // zayindageshhebrew {0xe90424fe, 0x2479}, // sixparen {0xe927829f, 0x0953}, // gravedeva {0xe92a9522, 0x0060}, // grave {0xe93b2c93, 0x09c8}, // aivowelsignbengali {0xe9598c36, 0x018e}, // Ereversed {0xe96c43a5, 0x00d4}, // Ocircumflex {0xe977a63b, 0x0591}, // etnahtalefthebrew {0xe9860674, 0x2467}, // eightcircle {0xe994ec07, 0x1e88}, // Wdotbelow {0xe9955c1b, 0x2109}, // fahrenheit {0xe997ce80, 0x03d6}, // pisymbolgreek {0xe9b8fb39, 0x256a}, // SF540000 {0xe9c5c9e3, 0x0928}, // nadeva {0xe9dc1b2b, 0x3162}, // yikorean {0xe9f5bb0b, 0x1e40}, // Mdotaccent {0xe9fd5bd7, 0x02d1}, // colontriangularhalfmod {0xe9fe0986, 0xfe91}, // behinitialarabic {0xea0e9b0d, 0x3077}, // puhiragana {0xea11b5f2, 0x05d7}, // hethebrew {0xea281c50, 0xfb3b}, // kafdagesh {0xea281f0f, 0xfb43}, // pefinaldageshhebrew {0xea4521ba, 0x1e99}, // yring {0xea469ad4, 0x0641}, // feharabic {0xea4bf6ca, 0x25b5}, // whiteuppointingsmalltriangle {0xea505c24, 0x006b}, // k {0xea723c32, 0x05b7}, // patahwidehebrew {0xea828d24, 0x0ac4}, // rrvocalicvowelsigngujarati {0xea8df8fe, 0xff09}, // parenrightmonospace {0xeaaa8586, 0x05b6}, // segolhebrew {0xeabb8dad, 0xfeb3}, // seeninitialarabic {0xeabdd2cd, 0xff02}, // quotedblmonospace {0xeacd0b4a, 0xfb1f}, // doubleyodpatah {0xeade9ba5, 0x2113}, // afii61289 {0xeb0445d5, 0x043f}, // afii10081 {0xeb095515, 0x0452}, // afii10099 {0xeb4a0523, 0x056a}, // zhearmenian {0xeb4fdea3, 0xfc08}, // behmeemisolatedarabic {0xeb576d94, 0x21de}, // pageup {0xeb701704, 0x2014}, // emdash {0xeb71d801, 0x30f3}, // nkatakana {0xebeccb02, 0x00dd}, // Yacute {0xec20a331, 0x096c}, // sixdeva {0xec450aad, 0x3211}, // rieulaparenkorean {0xec4fc0c5, 0x0173}, // uogonek {0xec78ec45, 0x05a4}, // mahapakhhebrew {0xec820a21, 0x05b4}, // hiriqquarterhebrew {0xec8ae366, 0x0987}, // ibengali {0xec967081, 0x040a}, // Njecyrillic {0xecad584f, 0x01a8}, // tonetwo {0xecc21039, 0x0a98}, // ghagujarati {0xecce5cae, 0x056b}, // iniarmenian {0xecd385c5, 0x03a8}, // Psi {0xecda4c6b, 0x0622}, // alefmaddaabovearabic {0xecddb27b, 0x23d0}, // vextendsingle {0xecddb519, 0x05db}, // kaf {0xecef01e0, 0x1e59}, // rdotaccent {0xed102125, 0x24c0}, // Kcircle {0xed1afc7c, 0x05b2}, // hatafpatah2f {0xed2b4a43, 0x00aa}, // ordfeminine {0xed4bb321, 0x313f}, // rieulphieuphkorean {0xed65e3bb, 0x057a}, // peharmenian {0xed729d82, 0x049e}, // Kastrokecyrillic {0xed796a9e, 0x0407}, // afii10056 {0xed8b66db, 0x040b}, // Tshecyrillic {0xed9bf511, 0x063a}, // afii57434 {0xedfaec74, 0xfe69}, // dollarsmall {0xee22e47f, 0x00bd}, // onehalf {0xee3352d3, 0x05b0}, // afii57799 {0xee339d2e, 0x2025}, // twodotenleader {0xee421e32, 0x0660}, // zeroarabic {0xee6c8858, 0x3168}, // nieunpansioskorean {0xee7a31f8, 0x220b}, // suchthat {0xee8d09d6, 0xff12}, // twomonospace {0xee900f0f, 0x0462}, // afii10146 {0xee9f1e99, 0x02b7}, // wsuperior {0xeeb00f1b, 0x0063}, // c {0xeeb5ef47, 0x24c2}, // Mcircle {0xeeda5b48, 0x00a6}, // brokenbar {0xeeeef128, 0x062f}, // afii57423 {0xeeef7f7c, 0x01b6}, // zstroke {0xef03e03f, 0x32a3}, // ideographiccorrectcircle {0xef22f61a, 0x06f0}, // zeropersian {0xef24cf3c, 0x00a8}, // dieresis {0xef2800a0, 0x00cc}, // Igrave {0xef33d78e, 0x25a1}, // H22073 {0xef3a179c, 0x020a}, // Iinvertedbreve {0xef636ee0, 0x05da}, // finalkaf {0xefa03eab, 0x00c6}, // AE {0xefc57067, 0x0260}, // ghook {0xefd65ddd, 0x2033}, // second {0xefd69119, 0x044e}, // iucyrillic {0xefd88572, 0x1ecb}, // idotbelow {0xefe0e3fd, 0xfb01}, // fi {0xeff59b38, 0x0397}, // Eta {0xeff843d0, 0x25a3}, // squarewhitewithsmallblack {0xf00181f3, 0x305c}, // zehiragana {0xf00455e8, 0x1e86}, // Wdotaccent {0xf0045976, 0x3178}, // kapyeounpieupkorean {0xf0213847, 0x3383}, // masquare {0xf0248bca, 0x0640}, // tatweelarabic {0xf029041c, 0x3017}, // whitelenticularbracketright {0xf0412bb8, 0x04d0}, // Abrevecyrillic {0xf04a093b, 0xff66}, // wokatakanahalfwidth {0xf04c3677, 0xfe62}, // plussmall {0xf04d9cf4, 0x308c}, // rehiragana {0xf064a013, 0x047e}, // Otcyrillic {0xf0673e49, 0x096f}, // ninedeva {0xf0757f39, 0x030a}, // ringcmb {0xf08a28a9, 0xfe4e}, // lowlinecenterline {0xf09092b0, 0x3185}, // ssanghieuhkorean {0xf091911a, 0x223d}, // reversedtilde {0xf098620b, 0x066a}, // percentarabic {0xf0a5507a, 0x03d5}, // phisymbolgreek {0xf0ac995b, 0x337c}, // syouwaerasquare {0xf0b806fd, 0xfb7c}, // tchehinitialarabic {0xf0c10455, 0x0645}, // meemarabic {0xf0d79471, 0x0201}, // adblgrave {0xf0e2f076, 0x04cb}, // Chekhakassiancyrillic {0xf0ec6a42, 0x0302}, // circumflexcmb {0xf0f2a82b, 0x1e8a}, // Xdotaccent {0xf0fcc511, 0x3398}, // klsquare {0xf1116d2e, 0xfe41}, // cornerbracketleftvertical {0xf1200f87, 0x05e6}, // tsadi {0xf13a2d0d, 0x0119}, // eogonek {0xf1410096, 0x1e1a}, // Etildebelow {0xf144c7a3, 0x249d}, // bparen {0xf15ab600, 0x05bb}, // qubuts18 {0xf16238a6, 0x04de}, // Zedieresiscyrillic {0xf1aad12e, 0x0638}, // afii57432 {0xf1b08e52, 0x20ab}, // dong {0xf1b0be56, 0x20a2}, // cruzeiro {0xf1b5f5d1, 0x05b5}, // tserehebrew {0xf1dd7830, 0x033d}, // xabovecmb {0xf1ddaa7d, 0x0995}, // kabengali {0xf1e94d64, 0x064e}, // fathaarabic {0xf1eb4f66, 0x0116}, // Edotaccent {0xf1f78ce7, 0x226a}, // muchless {0xf2118c6c, 0x0635}, // sadarabic {0xf232181a, 0x2640}, // venus {0xf237f0f1, 0xff29}, // Imonospace {0xf23a5b68, 0x0130}, // Idot {0xf24a3a6b, 0x05b8}, // qamats1c {0xf2558e7a, 0x230a}, // floorleftbig {0xf2620ee8, 0x1e07}, // blinebelow {0xf26e5910, 0x045e}, // ushortcyrillic {0xf2b4963c, 0x09b0}, // rabengali {0xf2b826ec, 0x0449}, // shchacyrillic {0xf2c1d44e, 0x05be}, // maqafhebrew {0xf2c69081, 0x016e}, // Uring {0xf2dd8deb, 0x248d}, // sixperiod {0xf2e23a0c, 0xfb57}, // pehfinalarabic {0xf2e7f536, 0x0329}, // verticallinebelowcmb {0xf2f52e6c, 0x00ce}, // Icircumflex {0xf2f6e905, 0x24cd}, // Xcircle {0xf3086f4b, 0x2030}, // perthousand {0xf311fe21, 0xfece}, // ghainfinalarabic {0xf315dbae, 0xfe3c}, // blacklenticularbracketrightvertical {0xf336d994, 0xfef3}, // yehinitialarabic {0xf3527249, 0xfb67}, // ttehfinalarabic {0xf3935843, 0xff26}, // Fmonospace {0xf399cd14, 0x0074}, // t {0xf3c08521, 0x0431}, // afii10066 {0xf3ce4ef0, 0x014a}, // Eng {0xf3cfe996, 0x05b8}, // qamatsde {0xf3ef0654, 0x2160}, // Oneroman {0xf41c3e87, 0x3182}, // yesieungsioskorean {0xf4266df0, 0x2253}, // imageorapproximatelyequal {0xf4584280, 0x05ea}, // tav {0xf4637345, 0x207a}, // plussuperior {0xf467a09a, 0x3066}, // tehiragana {0xf4728f62, 0x06f9}, // ninepersian {0xf47778a3, 0x0958}, // qadeva {0xf47c7f06, 0x05a5}, // merkhalefthebrew {0xf498c20b, 0xfb2c}, // shindageshshindothebrew {0xf4a2e6c9, 0xff8e}, // hokatakanahalfwidth {0xf4c721dd, 0x0415}, // afii10022 {0xf4d1afd1, 0x015b}, // sacute {0xf4d731e8, 0x0e2b}, // hohipthai {0xf4d7dcfe, 0x05b0}, // sheva {0xf4ea5918, 0x0423}, // afii10037 {0xf4f5b85f, 0x05bd}, // afii57839 {0xf4fec4c5, 0x2026}, // ellipsis {0xf4fecbee, 0x3152}, // yaekorean {0xf526b2bc, 0x09f5}, // twonumeratorbengali {0xf53d898f, 0x0122}, // Gcedilla {0xf54df907, 0x02e8}, // tonebarlowmod {0xf573def2, 0x25ba}, // blackrightpointingpointer {0xf573f1ec, 0x24a4}, // iparen {0xf59704d9, 0xff4f}, // omonospace {0xf59943f5, 0x01d4}, // ucaron {0xf59f95da, 0x0399}, // Iota {0xf5a6729d, 0x247e}, // elevenparen {0xf5ab4f6d, 0x0458}, // afii10105 {0xf5c2a87b, 0x0a14}, // augurmukhi {0xf5c40812, 0x2019}, // quoteright {0xf5cad972, 0x1ea6}, // Acircumflexgrave {0xf5e83826, 0x0986}, // aabengali {0xf5f606a8, 0x316e}, // mieumpieupkorean {0xf5f79af6, 0x23a3}, // bracketleftbt {0xf5fe99ee, 0x2017}, // underscoredbl {0xf61328eb, 0x2580}, // upblock {0xf61a2336, 0x0157}, // rcommaaccent {0xf6228c58, 0x20a3}, // franc {0xf6271ec7, 0x0429}, // afii10043 {0xf630815e, 0x0577}, // shaarmenian {0xf64f0a5d, 0x30f9}, // vekatakana {0xf64f6666, 0xff44}, // dmonospace {0xf6545660, 0x3333}, // huiitosquare {0xf655e1cb, 0x316a}, // rieultikeutkorean {0xf66aa028, 0x215d}, // fiveeighths {0xf67e1ed1, 0x01a3}, // oi {0xf6886180, 0x3216}, // cieucaparenkorean {0xf68c8679, 0x3043}, // ismallhiragana {0xf68fb68d, 0x215b}, // oneeighth {0xf6909b76, 0x24a1}, // fparen {0xf6b386e5, 0x1e3c}, // Lcircumflexbelow {0xf6c0ec85, 0x1e5c}, // Rdotbelowmacron {0xf6f2a8b6, 0x0289}, // ubar {0xf7114d7b, 0x2502}, // SF110000 {0xf7440454, 0x045e}, // afii10110 {0xf757213f, 0x01d6}, // udieresismacron {0xf779fd74, 0x1ea0}, // Adotbelow {0xf7887f64, 0x24ba}, // Ecircle {0xf7994ed0, 0x0a6d}, // sevengurmukhi {0xf7c65164, 0x266d}, // musicflatsign {0xf7d4f2e3, 0x1e1e}, // Fdotaccent {0xf7ddf3cd, 0x0a17}, // gagurmukhi {0xf7de3a36, 0x3086}, // yuhiragana {0xf7edf1a3, 0x0403}, // Gjecyrillic {0xf7fe7207, 0x279e}, // arrowrightheavy {0xf7fec616, 0x1ec4}, // Ecircumflextilde {0xf81e4626, 0x0a02}, // bindigurmukhi {0xf8245f14, 0x30e6}, // yukatakana {0xf82ad190, 0x05e4}, // pehebrew {0xf8376f18, 0x0410}, // afii10017 {0xf885c738, 0x30d3}, // bikatakana {0xf8868f94, 0xff8c}, // hukatakanahalfwidth {0xf8892150, 0x04a8}, // Haabkhasiancyrillic {0xf89be814, 0x0abc}, // nuktagujarati {0xf8e483f7, 0x1eb5}, // abrevetilde {0xf8ef289b, 0x21df}, // pagedown {0xf90377b2, 0x3151}, // yakorean {0xf90f516b, 0x0a5b}, // zagurmukhi {0xf9190810, 0x0203}, // ainvertedbreve {0xf929be43, 0x0ab6}, // shagujarati {0xf93a01ea, 0xfe6a}, // percentsmall {0xf952cde5, 0x1eae}, // Abreveacute {0xf95ad1c7, 0x0065}, // e {0xf95b34b0, 0x0660}, // afii57392 {0xf976011b, 0x3399}, // fmsquare {0xf99ebcf4, 0x25c1}, // whiteleftpointingtriangle {0xf9bdabb3, 0x00e2}, // acircumflex {0xf9d67642, 0x00c8}, // Egrave {0xf9e5170b, 0x1eb6}, // Abrevedotbelow {0xf9e8161d, 0x3206}, // siosparenkorean {0xf9eeaebc, 0x002c}, // comma {0xf9f4a348, 0x2279}, // notgreaternorless {0xf9f6f2fe, 0xfe84}, // alefhamzaabovefinalarabic {0xf9f909db, 0x09f1}, // ralowerdiagonalbengali {0xfa1f37f7, 0x207d}, // parenleftsuperior {0xfa3ebdeb, 0xfb8b}, // jehfinalarabic {0xfa46e08a, 0x010a}, // Cdotaccent {0xfa6e953f, 0x0e13}, // nonenthai {0xfa7aad8b, 0x0e34}, // saraithai {0xfa85b29d, 0x0ae6}, // zerogujarati {0xfa8f771c, 0xfe82}, // alefmaddaabovefinalarabic {0xfa932832, 0x1ec9}, // ihookabove {0xfa9cd43f, 0x2488}, // oneperiod {0xfa9f7510, 0x1e6a}, // Tdotaccent {0xfaa7f693, 0xff1b}, // semicolonmonospace {0xfab3dba6, 0x3138}, // ssangtikeutkorean {0xfac03db8, 0x015e}, // Scedilla {0xfac092ef, 0x24de}, // ocircle {0xfad44b21, 0x278d}, // fourcircleinversesansserif {0xfadde282, 0x0539}, // Toarmenian {0xfaf8abd4, 0x05bb}, // qubuts25 {0xfb0a35fb, 0xfb2b}, // afii57695 {0xfb0e1bad, 0x2567}, // SF450000 {0xfb1373b2, 0x30b9}, // sukatakana {0xfb161300, 0x049f}, // kastrokecyrillic {0xfb206015, 0x30b1}, // kekatakana {0xfb2465d5, 0x0468}, // Yuslittleiotifiedcyrillic {0xfb3e0b48, 0x01fc}, // AEacute {0xfb4678bc, 0xfe90}, // behfinalarabic {0xfb5bf4b4, 0x02cf}, // acutelowmod {0xfb5cfdc8, 0x095c}, // dddhadeva {0xfb764dd2, 0x21d3}, // arrowdbldown {0xfb7c1fd7, 0x0485}, // dasiapneumatacyrilliccmb {0xfbcf44c4, 0x018d}, // deltaturned {0xfbd1b93f, 0x33c4}, // squarecc {0xfbd50511, 0x04e8}, // Obarredcyrillic {0xfbf1fcde, 0x03e9}, // horicoptic {0xfc161b2f, 0x2499}, // eighteenperiod {0xfc18556b, 0x02bd}, // commareversedmod {0xfc1a2c97, 0x046c}, // Yusbigiotifiedcyrillic {0xfc2caf5c, 0x2285}, // notsuperset {0xfc3393bc, 0x0124}, // Hcircumflex {0xfc3a32c2, 0x0a8d}, // ecandragujarati {0xfc75d31c, 0x1ec6}, // Ecircumflexdotbelow {0xfc7e1ef8, 0x0952}, // anudattadeva {0xfc7ea01a, 0x04e6}, // Odieresiscyrillic {0xfc8020b6, 0xfb39}, // yoddageshhebrew {0xfc828b2d, 0x1ee4}, // Udotbelow {0xfc9cf271, 0x020d}, // odblgrave {0xfce47bc6, 0x05b7}, // patah {0xfce8ddc1, 0x1e0f}, // dlinebelow {0xfce9ddb5, 0x05aa}, // yerahbenyomohebrew {0xfcf6e2a9, 0x21ea}, // capslock {0xfd00e31a, 0x0303}, // tildecomb {0xfd0eac29, 0x0261}, // gscript {0xfd1397ce, 0x0412}, // Vecyrillic {0xfd166ead, 0x05e0}, // nunhebrew {0xfd2c8feb, 0x1ea4}, // Acircumflexacute {0xfd5ace9a, 0x057b}, // jheharmenian {0xfd6ac237, 0x221d}, // proportional {0xfd77296d, 0x04af}, // ustraightcyrillic {0xfd891a4c, 0x0948}, // aivowelsigndeva {0xfd8944f5, 0x0309}, // hookabovecomb {0xfd89977d, 0x0e50}, // zerothai {0xfd93a170, 0x239c}, // parenleftex {0xfd99bb06, 0xfb3c}, // lameddagesh {0xfdb6c57c, 0x2215}, // divisionslash {0xfdbbbec8, 0x090d}, // ecandradeva {0xfdc83f1f, 0x028d}, // wturned {0xfdd37935, 0x0422}, // afii10036 {0xfdec640d, 0x0640}, // kashidaautoarabic {0xfdf32442, 0x3390}, // Hzsquare {0xfdf4c83e, 0x026e}, // lezh {0xfe3d55df, 0x064f}, // dammaarabic {0xfe407199, 0x2276}, // lessorgreater {0xfe7515f3, 0x03a9}, // Omegagreek {0xfe779a6a, 0x045a}, // afii10107 {0xfea7088a, 0x0628}, // beharabic {0xfeb66fd9, 0xfec7}, // zahinitialarabic {0xfeb7f263, 0x0556}, // Feharmenian {0xfec7bc3b, 0x0651}, // shaddaarabic {0xfee2004d, 0x01fe}, // Ostrokeacute {0xfee5f25e, 0x2126}, // Omega {0xfee9d86c, 0x2295}, // pluscircle {0xfef651f8, 0x0688}, // afii57512 {0xff5dadf4, 0x0193}, // Ghook {0xff81c116, 0x21cd}, // arrowleftdblstroke {0xff8c00d8, 0x3386}, // MBsquare {0xff8f2931, 0x30ae}, // gikatakana {0xff90fc92, 0x0923}, // nnadeva {0xff94689d, 0x04c0}, // palochkacyrillic {0xffe38169, 0x043f}, // pecyrillic {0xfffadc30, 0x2568}, // SF460000 }}; dvisvgm-2.8.1/INSTALL0000664000175000017500000002202413510660062011154 00000000000000Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. 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, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' 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' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. dvisvgm-2.8.1/config.guess0000755000175000017500000012617313512046314012453 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-08-29' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 1 2 13 15 trap 'exitcode=$?; test -z "$tmp" || rm -fr "$tmp"; exit $exitcode' 0 set_cc_for_build() { : "${TMPDIR=/tmp}" # shellcheck disable=SC2039 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$driver" break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi-}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) UNAME_REL="`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" case `isainfo -b` in 32) echo i386-pc-solaris2"$UNAME_REL" ;; 64) echo x86_64-pc-solaris2"$UNAME_REL" ;; esac exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi else echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf fi exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; *:Minix:*:*) echo "$UNAME_MACHINE"-unknown-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. # shellcheck disable=SC2154 if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </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 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: dvisvgm-2.8.1/tests/0000775000175000017500000000000013563265650011361 500000000000000dvisvgm-2.8.1/tests/GraphicsPathTest.cpp0000664000175000017500000001610213536436465015226 00000000000000/************************************************************************* ** GraphicsPathTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "GraphicsPath.hpp" using namespace std; TEST(GraphicsPathTest, svg) { GraphicsPath path; path.moveto(0,0); path.lineto(10,10); path.cubicto(20,20,30,30,40,40); path.closepath(); EXPECT_FALSE(path.empty()); EXPECT_EQ(path.size(), 4u); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M0 0L10 10C20 20 30 30 40 40Z"); path.clear(); EXPECT_TRUE(path.empty()); } TEST(GraphicsPathTest, optimize) { GraphicsPath path; path.moveto(0,0); path.lineto(10,0); path.lineto(10,20); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M0 0H10V20"); } TEST(GraphicsPathTest, transform) { GraphicsPath path; path.moveto(0,0); path.lineto(1,0); path.lineto(1,1); path.lineto(0,1); path.closepath(); Matrix m(1); m.scale(2,2); m.translate(10, 100); m.rotate(90); path.transform(m); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M-100 10V12H-102V10Z"); } TEST(GraphicsPathTest, closeOpenSubPaths) { GraphicsPath path; path.moveto(0,0); path.lineto(1,0); path.lineto(1,1); path.lineto(0,1); path.moveto(10,10); path.lineto(11,10); path.lineto(11,11); path.lineto(10,11); path.closeOpenSubPaths(); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M0 0H1V1H0ZM10 10H11V11H10Z"); } TEST(GraphicsPathTest, relative1) { GraphicsPath path; path.moveto(0,0); path.lineto(10,10); path.lineto(10,20); path.cubicto(20,20,30,30,40,40); path.quadto(50, 50, 60, 60); path.lineto(100,60); path.closepath(); ostringstream oss; path.writeSVG(oss, true); EXPECT_EQ(oss.str(), "m0 0l10 10v10c10 0 20 10 30 20q10 10 20 20h40z"); } TEST(GraphicsPathTest, computeBBox) { GraphicsPath path; path.moveto(10,10); path.lineto(100,10); path.quadto(10, 100, 40, 80); path.cubicto(5,5,30,10,90,70); path.lineto(20,30); path.closepath(); BoundingBox bbox; path.computeBBox(bbox); EXPECT_EQ(bbox, BoundingBox(5, 5, 100, 100)); } TEST(GraphicsPathTest, removeRedundantCommands) { GraphicsPath path; path.moveto(10,10); path.lineto(100,10); path.quadto(10, 100, 40, 80); path.cubicto(5,5,30,10,90,70); path.moveto(10,10); path.moveto(15,10); path.moveto(20,20); path.lineto(20,30); path.moveto(10,10); path.moveto(20,20); path.removeRedundantCommands(); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10H100Q10 100 40 80C5 5 30 10 90 70M20 20V30"); } TEST(GraphicsPathTest, cmd_equals) { using Point = Pair; gp::MoveTo m1(Point(1, 2)); gp::MoveTo m2(Point(1, 2)); gp::MoveTo m3(Point(2, 1)); EXPECT_EQ(m1, m2); EXPECT_EQ(m2, m1); EXPECT_NE(m1, m3); EXPECT_NE(m3, m1); gp::LineTo l1(Point(1, 2)); EXPECT_NE(l1, m1); EXPECT_NE(m1, l1); gp::CubicTo c1(Point(1, 2), Point(3, 4), Point(5, 6)); gp::CubicTo c2(Point(1, 2), Point(3, 4), Point(5, 6)); gp::CubicTo c3(Point(1, 2), Point(0, 4), Point(5, 6)); EXPECT_EQ(c1, c2); EXPECT_EQ(c2, c1); EXPECT_NE(c1, c3); EXPECT_NE(c3, c1); } TEST(GraphicsPathTest, equals) { GraphicsPath path1; EXPECT_TRUE(path1 == path1); path1.moveto(10,10); path1.lineto(100,10); path1.quadto(10, 100, 40, 80); path1.cubicto(5,5,30,10,90,70); path1.lineto(20,30); path1.closepath(); EXPECT_TRUE(path1 == path1); GraphicsPath path2; EXPECT_FALSE(path1 == path2); path2.moveto(10,10); path2.lineto(100,10); path2.quadto(10, 100, 40, 80); path2.cubicto(5,5,30,10,90,70); path2.lineto(20,30); EXPECT_FALSE(path1 == path2); EXPECT_FALSE(path2 == path1); path2.closepath(); EXPECT_TRUE(path1 == path2); EXPECT_TRUE(path2 == path1); path2.clear(); path2.moveto(10,10); path2.lineto(100,10); path2.quadto(10, 100, 40, 80); path2.cubicto(5,5,10,10,90,70); path2.lineto(20,30); path2.closepath(); EXPECT_FALSE(path1 == path2); EXPECT_FALSE(path2 == path1); } TEST(GraphicsPathTest, unequals) { GraphicsPath path1; EXPECT_FALSE(path1 != path1); path1.moveto(10,10); path1.lineto(100,10); path1.quadto(10, 100, 40, 80); path1.cubicto(5,5,30,10,90,70); path1.lineto(20,30); path1.closepath(); EXPECT_FALSE(path1 != path1); GraphicsPath path2; EXPECT_TRUE(path1 != path2); path2.moveto(10,10); path2.lineto(100,10); path2.quadto(10, 100, 40, 80); path2.cubicto(5,5,30,10,90,70); path2.lineto(20,30); EXPECT_TRUE(path1 != path2); EXPECT_TRUE(path2 != path1); path2.closepath(); EXPECT_FALSE(path1 != path2); EXPECT_FALSE(path2 != path1); path2.clear(); path2.moveto(10,10); path2.lineto(100,10); path2.quadto(10, 100, 40, 80); path2.cubicto(5,5,10,10,90,70); path2.lineto(20,30); path2.closepath(); EXPECT_TRUE(path1 != path2); EXPECT_TRUE(path2 != path1); } TEST(GraphicsPathTest, approximate_arcs) { GraphicsPath path; XMLString::DECIMAL_PLACES = 2; path.moveto(10, 10); path.lineto(20, 0); path.arcto(30, 20, 20, 1, 1, DPair(50, 50)); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10L20 0A30 20 20 1 1 50 50"); path.approximateArcs(); oss.str(""); path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10L20 0C25.05-7.15 34.02-8.12 42.72-2.44S58.14 14.42 59.73 25.91S57.48 46.9 50 50"); } TEST(GraphicsPathTest, smooth_quadto) { GraphicsPath path; path.moveto(10, 10); path.quadto(DPair(30, 20), DPair(40, 10)); path.quadto(DPair(100, 30)); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10Q30 20 40 10T100 30"); } TEST(GraphicsPathTest, smooth_cubicto) { GraphicsPath path; path.moveto(10, 10); path.cubicto(DPair(30, 20), DPair(40, 0), DPair(20, 50)); path.cubicto(DPair(80, 100), DPair(100, 30)); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10C30 20 40 0 20 50S80 100 100 30"); } dvisvgm-2.8.1/tests/XMLNodeTest.cpp0000664000175000017500000003532513510660062014107 00000000000000/************************************************************************* ** XMLNodeTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "utility.hpp" #include "XMLNode.hpp" using namespace std; TEST(XMLNodeTest, downcast) { unique_ptr elem = util::make_unique("element"); EXPECT_EQ(elem->toElement(), elem.get()); EXPECT_EQ(elem->toText(), nullptr); EXPECT_EQ(elem->toCData(), nullptr); EXPECT_EQ(elem->toComment(), nullptr); unique_ptr text = util::make_unique("text"); EXPECT_EQ(text->toElement(), nullptr); EXPECT_EQ(text->toText(), text.get()); EXPECT_EQ(text->toCData(), nullptr); EXPECT_EQ(text->toComment(), nullptr); unique_ptr cdata = util::make_unique("cdata"); EXPECT_EQ(cdata->toElement(), nullptr); EXPECT_EQ(cdata->toText(), nullptr); EXPECT_EQ(cdata->toCData(), cdata.get()); EXPECT_EQ(cdata->toComment(), nullptr); unique_ptr comment = util::make_unique("comment"); EXPECT_EQ(comment->toElement(), nullptr); EXPECT_EQ(comment->toText(), nullptr); EXPECT_EQ(comment->toCData(), nullptr); EXPECT_EQ(comment->toComment(), comment.get()); } static int number_of_children (XMLElement &elem) { int count=0; for (XMLNode *node = elem.firstChild(); node; node=node->next()) count++; return count; } TEST(XMLNodeTest, appendElement) { XMLElement root("root"); root.append(util::make_unique("child1")); root.append(util::make_unique("child2")); EXPECT_EQ(number_of_children(root), 2); EXPECT_FALSE(root.empty()); XMLElement *child1 = root.firstChild()->toElement(); XMLElement *child2 = root.lastChild()->toElement(); ASSERT_NE(child1, nullptr); EXPECT_EQ(child1->parent(), &root); EXPECT_EQ(child1->prev(), nullptr); EXPECT_EQ(child1->next(), child2); EXPECT_EQ(child1->firstChild(), nullptr); EXPECT_EQ(child1->lastChild(), nullptr); EXPECT_EQ(child1->name(), "child1"); ASSERT_NE(child2, nullptr); EXPECT_EQ(child2->parent(), &root); EXPECT_EQ(child2->prev(), child1); EXPECT_EQ(child2->next(), nullptr); EXPECT_EQ(child2->firstChild(), nullptr); EXPECT_EQ(child2->lastChild(), nullptr); EXPECT_EQ(child2->name(), "child2"); root.clear(); EXPECT_TRUE(root.empty()); } TEST(XMLNodeTest, prependElement) { XMLElement root("root"); root.prepend(util::make_unique("child1")); root.prepend(util::make_unique("child2")); EXPECT_EQ(number_of_children(root), 2); XMLElement *child1 = root.lastChild()->toElement(); XMLElement *child2 = root.firstChild()->toElement(); ASSERT_NE(child1, nullptr); EXPECT_EQ(child1->parent(), &root); EXPECT_EQ(child1->prev(), child2); EXPECT_EQ(child1->next(), nullptr); EXPECT_EQ(child1->firstChild(), nullptr); EXPECT_EQ(child1->lastChild(), nullptr); EXPECT_EQ(child1->name(), "child1"); ASSERT_NE(child2, nullptr); EXPECT_EQ(child2->parent(), &root); EXPECT_EQ(child2->prev(), nullptr); EXPECT_EQ(child2->next(), child1); EXPECT_EQ(child2->firstChild(), nullptr); EXPECT_EQ(child2->lastChild(), nullptr); EXPECT_EQ(child2->name(), "child2"); } TEST(XMLNodeTest, appendText) { XMLElement root("root"); root.append(util::make_unique("first string")); EXPECT_EQ(number_of_children(root), 1); XMLText *lastChild = root.lastChild()->toText(); ASSERT_NE(lastChild, nullptr); EXPECT_EQ(lastChild->getText(), "first string"); EXPECT_EQ(lastChild->parent(), &root); EXPECT_EQ(lastChild->prev(), nullptr); EXPECT_EQ(lastChild->next(), nullptr); EXPECT_EQ(root.firstChild(), root.lastChild()); root.append(util::make_unique(",second string")); EXPECT_EQ(number_of_children(root), 1); lastChild = root.lastChild()->toText(); ASSERT_NE(lastChild, nullptr); EXPECT_EQ(lastChild->getText(), "first string,second string"); EXPECT_EQ(lastChild->parent(), &root); EXPECT_EQ(lastChild->prev(), nullptr); EXPECT_EQ(lastChild->next(), nullptr); EXPECT_EQ(root.firstChild(), root.lastChild()); root.append(",third string"); EXPECT_EQ(number_of_children(root), 1); lastChild = root.lastChild()->toText(); ASSERT_NE(lastChild, nullptr); EXPECT_EQ(lastChild->getText(), "first string,second string,third string"); EXPECT_EQ(lastChild->parent(), &root); EXPECT_EQ(lastChild->prev(), nullptr); EXPECT_EQ(lastChild->next(), nullptr); root.append(util::make_unique("separator")); root.append(",fourth string"); EXPECT_EQ(number_of_children(root), 3); lastChild = root.lastChild()->toText(); ASSERT_NE(lastChild, nullptr); EXPECT_EQ(lastChild->getText(), ",fourth string"); root.append(util::make_unique("separator")); root.append(util::make_unique(",fifth string")); EXPECT_EQ(number_of_children(root), 5); lastChild = root.lastChild()->toText(); ASSERT_NE(lastChild, nullptr); EXPECT_EQ(lastChild->getText(), ",fifth string"); root.clear(); EXPECT_TRUE(root.empty()); } TEST(XMLNodeTest, prependText) { XMLElement root("root"); root.prepend(util::make_unique("first string")); EXPECT_EQ(number_of_children(root), 1); XMLText *firstChild = root.firstChild()->toText(); ASSERT_NE(firstChild, nullptr); EXPECT_EQ(firstChild->getText(), "first string"); EXPECT_EQ(firstChild->parent(), &root); EXPECT_EQ(firstChild->prev(), nullptr); EXPECT_EQ(firstChild->next(), nullptr); root.prepend(util::make_unique("second string,")); EXPECT_EQ(number_of_children(root), 1); firstChild = root.firstChild()->toText(); ASSERT_NE(firstChild, nullptr); EXPECT_EQ(firstChild->getText(), "second string,first string"); EXPECT_EQ(firstChild->parent(), &root); EXPECT_EQ(firstChild->prev(), nullptr); EXPECT_EQ(firstChild->next(), nullptr); root.prepend(util::make_unique("separator")); root.prepend(util::make_unique("third string,")); EXPECT_EQ(number_of_children(root), 3); firstChild = root.firstChild()->toText(); ASSERT_NE(firstChild, nullptr); EXPECT_EQ(firstChild->getText(), "third string,"); EXPECT_EQ(firstChild->parent(), &root); EXPECT_EQ(firstChild->prev(), nullptr); EXPECT_EQ(firstChild->next()->next(), root.lastChild()); EXPECT_EQ(root.lastChild()->prev()->prev(), root.firstChild()); } TEST(XMLNodeTest, attributes) { XMLElement root("root"); root.addAttribute("string", "text"); root.addAttribute("integer", 42); root.addAttribute("double", 42.24); EXPECT_TRUE(root.empty()); EXPECT_TRUE(root.hasAttribute("string")); EXPECT_TRUE(root.hasAttribute("integer")); EXPECT_TRUE(root.hasAttribute("double")); EXPECT_FALSE(root.hasAttribute("noname ")); EXPECT_STREQ(root.getAttributeValue("string"), "text"); EXPECT_STREQ(root.getAttributeValue("integer"), "42"); EXPECT_STREQ(root.getAttributeValue("double"), "42.24"); EXPECT_EQ(root.getAttributeValue("none"), nullptr); } TEST(XMLNodeTest, clone) { XMLElement root ("root"); root.addAttribute("string", "text"); root.addAttribute("integer", 42); root.addAttribute("double", 42.24); root.append("text"); unique_ptr clone = util::static_unique_ptr_cast(root.clone()); EXPECT_EQ(number_of_children(root), 1); EXPECT_STREQ(clone->getAttributeValue("string"), "text"); EXPECT_STREQ(clone->getAttributeValue("integer"), "42"); EXPECT_STREQ(clone->getAttributeValue("double"), "42.24"); } TEST(XMLNodeTest, insertBefore) { XMLElement root("root"); auto child1 = util::make_unique("child1"); auto child2 = util::make_unique("child2"); XMLNode* child1Ptr = root.append(std::move(child1)); XMLNode* child2Ptr = root.append(std::move(child2)); auto node = util::make_unique("node"); EXPECT_FALSE(root.insertBefore(util::make_unique("dummy"), node.get())); EXPECT_EQ(number_of_children(root), 2); EXPECT_TRUE(root.insertBefore(util::make_unique("child3"), child1Ptr)); EXPECT_EQ(number_of_children(root), 3); XMLElement *child = root.firstChild()->toElement(); EXPECT_EQ(child->name(), "child3"); EXPECT_TRUE(root.insertBefore(util::make_unique("child4"), child2Ptr)); const char *names[] = {"child3", "child1", "child4", "child2"}; const char **p = names; for (XMLNode *node=root.firstChild(); node; node=node->next()) { XMLElement *elem = node->toElement(); ASSERT_NE(elem, nullptr); EXPECT_EQ(elem->name(), *p++) << "name=" << elem->name(); EXPECT_EQ(elem->parent(), &root); if (elem->prev()) { EXPECT_EQ(elem->prev()->next(), elem); } } } TEST(XMLNodeTest, insertAfter) { XMLElement root("root"); auto child1 = util::make_unique("child1"); auto child2 = util::make_unique("child2"); XMLNode *child1Ptr = root.append(std::move(child1)); XMLNode *child2Ptr =root.append(std::move(child2)); auto node = util::make_unique("node"); EXPECT_FALSE(root.insertAfter(util::make_unique("dummy"), node.get())); EXPECT_EQ(number_of_children(root), 2); EXPECT_TRUE(root.insertAfter(util::make_unique("child3"), child1Ptr)); EXPECT_TRUE(root.insertAfter(util::make_unique("child4"), child2Ptr)); EXPECT_EQ(number_of_children(root), 4); const char *names[] = {"child1", "child3", "child2", "child4"}; const char **p = names; for (XMLNode *node=root.firstChild(); node; node=node->next()) { XMLElement *elem = node->toElement(); ASSERT_NE(elem, nullptr); EXPECT_EQ(elem->name(), *p++) << "name=" << elem->name(); EXPECT_EQ(elem->parent(), &root); if (elem->prev()) { EXPECT_EQ(elem->prev()->next(), elem); } } } TEST(XMLNodeTest, getDescendants) { XMLElement root("root"); auto child1 = util::make_unique("child"); auto child2 = util::make_unique("childX"); auto child3 = util::make_unique("child"); auto child4 = util::make_unique("child"); child1->addAttribute("attr", "value"); child2->addAttribute("attr", "value"); child3->addAttribute("attr", "value"); child3->append("text"); XMLElement *child3Ptr = static_cast(child2->append(std::move(child3))); XMLElement *child2Ptr = static_cast(child1->append(std::move(child2))); XMLElement *child1Ptr = static_cast(root.append(std::move(child1))); XMLElement *child4Ptr = static_cast(root.append(std::move(child4))); vector elements; root.getDescendants("child", nullptr, elements); EXPECT_EQ(elements.size(), 3u); { XMLElement *nodes[] = {child1Ptr, child3Ptr, child4Ptr}; XMLElement **p = nodes; for (const XMLElement *elem : elements) EXPECT_EQ(elem, *p++); }{ elements.clear(); root.getDescendants("child", "attr", elements); EXPECT_EQ(elements.size(), 2u); XMLElement *nodes[] = {child1Ptr, child3Ptr}; XMLElement **p = nodes; for (const XMLElement *elem : elements) EXPECT_EQ(elem, *p++); }{ elements.clear(); root.getDescendants(nullptr, "attr", elements); EXPECT_EQ(elements.size(), 3u); XMLElement *nodes[] = {child1Ptr, child2Ptr, child3Ptr}; XMLElement **p = nodes; for (const XMLElement *elem : elements) EXPECT_EQ(elem, *p++); } } TEST(XMLNodeTest, getFirstDescendant) { XMLElement root("root"); auto child1 = util::make_unique("child"); auto child2 = util::make_unique("childX"); auto child3 = util::make_unique("child"); auto child4 = util::make_unique("child"); child1->addAttribute("attr", "valueX"); child2->addAttribute("attr", "value"); child3->addAttribute("attrX", "value"); child3->append("text"); XMLNode *child3Ptr = child2->append(std::move(child3)); child1->append(std::move(child2)); XMLNode *child1Ptr = root.append(std::move(child1)); root.append(std::move(child4)); EXPECT_EQ(root.getFirstDescendant("child", nullptr, nullptr), child1Ptr); EXPECT_EQ(root.getFirstDescendant("child", "attr", nullptr), child1Ptr); EXPECT_EQ(root.getFirstDescendant("child", "attrX", nullptr), child3Ptr); EXPECT_EQ(root.getFirstDescendant("child", "attrX", "value"), child3Ptr); EXPECT_EQ(root.getFirstDescendant(0, "attrX", "value"), child3Ptr); EXPECT_EQ(root.getFirstDescendant(0, "attrX", nullptr), child3Ptr); EXPECT_EQ(root.getFirstDescendant("child", "attr", "value"), nullptr); } TEST(XMLNodeTest, write) { XMLElement root("root"); auto child1 = util::make_unique("child"); auto child2 = util::make_unique("childX"); auto child3 = util::make_unique("child"); auto child4 = util::make_unique("child"); child1->addAttribute("attr", "valueX"); child2->addAttribute("attr", "value"); child3->addAttribute("attrX", "value"); child3->append("text"); child2->append(std::move(child3)); child1->append(std::move(child2)); root.append(std::move(child1)); root.append(std::move(child4)); ostringstream oss; root.write(oss); string str = oss.str(); str.erase(remove(str.begin(), str.end(), '\n'), str.end()); EXPECT_EQ(str, "text"); } TEST(XMLNodeTest, cdata) { XMLElement root("root"); auto cdataNode = util::make_unique("text & "); XMLNode *cdataNodePtr = root.append(std::move(cdataNode)); root.append(util::make_unique("element")); root.append(cdataNodePtr->clone()); ostringstream oss; root.write(oss); string str = oss.str(); str.erase(remove(str.begin(), str.end(), '\n'), str.end()); EXPECT_EQ(str, "]]>]]>"); cdataNodePtr->clear(); oss.str(""); root.write(oss); str = oss.str(); str.erase(remove(str.begin(), str.end(), '\n'), str.end()); EXPECT_EQ(str, "]]>"); } dvisvgm-2.8.1/tests/StreamInputBufferTest.cpp0000664000175000017500000001651313510660062016244 00000000000000/************************************************************************* ** StreamInputBufferTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "InputBuffer.hpp" #include "InputReader.hpp" using std::istringstream; using std::map; using std::string; TEST(StreamInputBufferTest, get) { istringstream iss("abcdefghijklmnopqrstuvwxyz"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); bool ok=true; for (int i=0; !in.eof() && ok; i++) { EXPECT_LT(i, 26); EXPECT_EQ(in.get(), 'a'+i); ok = (i < 26); } } TEST(StreamInputBufferTest, peek) { istringstream iss("abcdefghijklmnopqrstuvwxyz"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); EXPECT_EQ(in.peek(), 'a'); for (int i=0; i < 20; i++) EXPECT_EQ(in.peek(i), 'a'+i); // we can't look forward more than BUFSIZE characters (10 in this case) for (int i=21; i < 26; i++) EXPECT_EQ(in.peek(i), -1); } TEST(StreamInputBufferTest, check) { istringstream iss("abcdefghijklmnopqrstuvwxyz"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); EXPECT_TRUE(in.check("abc", false)); EXPECT_TRUE(in.check("abc", true)); EXPECT_TRUE(in.check("def", true)); EXPECT_TRUE(in.check("ghi", true)); EXPECT_TRUE(in.check("jkl", true)); EXPECT_TRUE(in.check("mnopqrst", false)); EXPECT_TRUE(in.check("mnopqrst", true)); EXPECT_TRUE(in.check("uvwxyz", true)); } TEST(StreamInputBufferTest, skip) { istringstream iss("abcdefghijklmnopqrstuvwxyz"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); in.skip(3); EXPECT_EQ(in.peek(), 'd'); in.skipUntil("ijk"); EXPECT_EQ(in.peek(), 'l'); in.skipUntil("z"); EXPECT_TRUE(in.eof()); } TEST(StreamInputBufferTest, readUntil) { istringstream iss("abcdefghijklmnopqrstuvwxyz"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); EXPECT_EQ(in.readUntil("ijk"), "abcdefghijk"); EXPECT_EQ(in.peek(), 'l'); EXPECT_EQ(in.readUntil("q"), "lmnopq"); EXPECT_EQ(in.peek(), 'r'); EXPECT_EQ(in.readUntil("X"), "rstuvwxyz"); EXPECT_LT(in.peek(), 0); EXPECT_TRUE(in.eof()); } TEST(StreamInputBufferTest, parseInt) { istringstream iss("1234,-5,+6,10.-"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); int n; EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, 1234); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, -5); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, 6); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, 10); EXPECT_EQ(in.get(), '.'); EXPECT_FALSE(in.parseInt(n)); EXPECT_EQ(in.get(), '-'); } TEST(StreamInputBufferTest, parseUInt_base) { istringstream iss("1234,-5,10,1abc,1234a"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); unsigned n; EXPECT_TRUE(in.parseUInt(10, n)); EXPECT_EQ(n, 1234u); EXPECT_EQ(in.get(), ','); EXPECT_FALSE(in.parseUInt(10, n)); in.get(); EXPECT_TRUE(in.parseUInt(10, n)); EXPECT_EQ(n, 5u); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseUInt(16, n)); EXPECT_EQ(n, 16u); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseUInt(16, n)); EXPECT_EQ(n, 0x1ABCu); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseUInt(8, n)); EXPECT_EQ(n, 01234u); EXPECT_EQ(in.get(), 'a'); } TEST(StreamInputBufferTest, parseDouble) { istringstream iss("1234,-5,6.12,-3.1415,-0.5,-.1,12e2,10.-"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); double d; EXPECT_EQ(in.parseDouble(d), 'i'); EXPECT_EQ(d, 1234.0); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'i'); EXPECT_EQ(d, -5.0); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, 6.12); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, -3.1415); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, -0.5); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, -0.1); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, 1200); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, 10.0); EXPECT_EQ(in.peek(), '-'); EXPECT_FALSE(in.parseDouble(d)); EXPECT_EQ(in.get(), '-'); } TEST(StreamInputBufferTest, attribs1) { istringstream iss("aaa=1 bbb=2 c-c-c=3 3d=4 e"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); map attr; int s = in.parseAttributes(attr, true); EXPECT_EQ(s, 3); EXPECT_EQ(attr["aaa"], "1"); EXPECT_EQ(attr["bbb"], "2"); EXPECT_EQ(attr["c-c-c"], "3"); EXPECT_THROW(attr.at("3d"), std::out_of_range); EXPECT_THROW(attr.at("e"), std::out_of_range); } TEST(StreamInputBufferTest, attribs2) { istringstream iss("aaa='1' bbb='2' c-c-c='3' d e='value'"); StreamInputBuffer buffer(iss, 10); BufferInputReader in(buffer); map attr; int s = in.parseAttributes(attr, false, "'"); EXPECT_EQ(s, 5); EXPECT_EQ(attr["aaa"], "1"); EXPECT_EQ(attr["bbb"], "2"); EXPECT_EQ(attr["c-c-c"], "3"); EXPECT_EQ(attr["e"], "value"); EXPECT_NO_THROW(attr.at("d")); EXPECT_TRUE(attr.at("d").empty()); } TEST(StreamInputBufferTest, invalidate) { istringstream iss("aaa=1 bbb=2 ccc=3 d e"); StreamInputBuffer buffer(iss, 10); EXPECT_EQ(buffer.get(), 'a'); EXPECT_EQ(buffer.get(), 'a'); EXPECT_EQ(buffer.get(), 'a'); EXPECT_EQ(buffer.get(), '='); buffer.invalidate(); EXPECT_TRUE(buffer.eof()); } TEST(StreamInputBufferTest, find) { istringstream iss("abcd efgh ijklmn abc"); StreamInputBuffer buffer(iss); BufferInputReader reader(buffer); EXPECT_EQ(reader.find('x'), -1); EXPECT_EQ(reader.find('c'), 2); EXPECT_EQ(reader.find(' '), 4); } TEST(StreamInputBufferTest, getString) { istringstream iss("abcd efgh \"ij'klm\"n abcdef '012\"34'xyz"); StreamInputBuffer buffer(iss); BufferInputReader reader(buffer); EXPECT_EQ(reader.getString(), "abcd"); EXPECT_EQ(reader.getString(), "efgh"); EXPECT_EQ(reader.getQuotedString("\""), "ij'klm"); EXPECT_EQ(reader.getQuotedString("\""), ""); EXPECT_EQ(reader.getString(4), "n ab"); EXPECT_EQ(reader.getQuotedString(0), "cdef"); EXPECT_EQ(reader.getQuotedString("\"'"), "012\"34"); } dvisvgm-2.8.1/tests/TensorProductPatchTest.cpp0000664000175000017500000003101213536435625016436 00000000000000/************************************************************************* ** TensorProductPatchTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "Color.hpp" #include "TensorProductPatch.hpp" using namespace std; #define EXPECT_NEAR_PAIR(name, p1, p2, eps) \ {SCOPED_TRACE(name); expect_near_pair(p1, p2, eps);} #define EXPECT_EQUAL_PAIR(name, p1, p2) \ {SCOPED_TRACE(name); expect_equal_pair(p1, p2);} #define CHECK_BEZIER_POINTS(name, bezier, p1, p2, p3, p4) \ {SCOPED_TRACE(name); checkBezierPoints(bezier, p1, p2, p3, p4);} static void expect_near_pair (const DPair &p1, const DPair &p2, double eps) { EXPECT_NEAR(p1.x(), p2.x(), eps); EXPECT_NEAR(p1.y(), p2.y(), eps); } static void expect_equal_pair (const DPair &p1, const DPair &p2) { EXPECT_DOUBLE_EQ(p1.x(), p2.x()); EXPECT_DOUBLE_EQ(p1.y(), p2.y()); } class TensorProductPatchTest : public ::testing::Test { protected: void SetUp () override { _points.resize(16); _points[0] = DPair(10, 10); _points[1] = DPair(0, 30); _points[2] = DPair(20, 40); _points[3] = DPair(10, 70); _points[4] = DPair(20, 100); _points[5] = DPair(70, 100); _points[6] = DPair(100, 70); _points[7] = DPair(90, 60); _points[8] = DPair(80, 50); _points[9] = DPair(70, 20); _points[10] = DPair(50, 30); _points[11] = DPair(20, 0); _points[12] = DPair(30, 40); _points[13] = DPair(40, 80); _points[14] = DPair(60, 70); _points[15] = DPair(40, 40); _patch.setPoints(_points, 0, 0); vector colors(4); colors[0].setRGB(1.0, 0.0, 0.0); colors[1].setRGB(1.0, 1.0, 0.0); colors[2].setRGB(1.0, 0.0, 1.0); colors[3].setRGB(0.0, 1.0, 0.0); _patch.setColors(colors, 0, 0); } void checkBezierPoints (const Bezier &b, const DPair &p1, const DPair &p2, const DPair &p3, const DPair &p4) const { EXPECT_EQ(b.point(0), p1); EXPECT_EQ(b.point(1), p2); EXPECT_EQ(b.point(2), p3); EXPECT_EQ(b.point(3), p4); } protected: vector _points; TensorProductPatch _patch; }; TEST_F(TensorProductPatchTest, construct) { EXPECT_EQ(_patch.psShadingType(), 7); EXPECT_EQ(_patch.numPoints(0), 16); EXPECT_EQ(_patch.numColors(0), 4); EXPECT_EQ(_patch.numPoints(1), 12); EXPECT_EQ(_patch.numColors(1), 2); CoonsPatch cp(Color::ColorSpace::RGB); EXPECT_EQ(cp.psShadingType(), 6); EXPECT_EQ(cp.numPoints(0), 12); EXPECT_EQ(cp.numColors(0), 4); EXPECT_EQ(cp.numPoints(1), 8); EXPECT_EQ(cp.numColors(1), 2); } TEST_F(TensorProductPatchTest, valueAt) { EXPECT_EQ(_patch.valueAt(0, 0), DPair(10, 10)); EXPECT_EQ(_patch.valueAt(1, 0), DPair(70, 20)); EXPECT_EQ(_patch.valueAt(0, 1), DPair(10, 70)); EXPECT_EQ(_patch.valueAt(1, 1), DPair(100, 70)); vector points = _points; vector colors(2); points.resize(12); TensorProductPatch tpp1(points, colors, Color::ColorSpace::RGB, 1, &_patch); EXPECT_EQ(tpp1.valueAt(0, 0), DPair(10, 70)); EXPECT_EQ(tpp1.valueAt(0, 1), DPair(100, 70)); EXPECT_EQ(tpp1.valueAt(1, 0), DPair(70, 100)); EXPECT_EQ(tpp1.valueAt(1, 1), DPair(20, 40)); TensorProductPatch tpp2(points, colors, Color::ColorSpace::RGB, 2, &_patch); EXPECT_EQ(tpp2.valueAt(0, 0), DPair(100, 70)); EXPECT_EQ(tpp2.valueAt(0, 1), DPair(70, 20)); EXPECT_EQ(tpp2.valueAt(1, 0), DPair(70, 100)); EXPECT_EQ(tpp2.valueAt(1, 1), DPair(20, 40)); TensorProductPatch tpp3(points, colors, Color::ColorSpace::RGB, 3, &_patch); EXPECT_EQ(tpp3.valueAt(0, 0), DPair(70, 20)); EXPECT_EQ(tpp3.valueAt(0, 1), DPair(10, 10)); EXPECT_EQ(tpp3.valueAt(1, 0), DPair(70, 100)); EXPECT_EQ(tpp3.valueAt(1, 1), DPair(20, 40)); colors.resize(4); CoonsPatch cp1(points, colors, Color::ColorSpace::RGB, 0, 0); EXPECT_EQ(cp1.valueAt(0, 0), DPair(10, 70)); EXPECT_EQ(cp1.valueAt(0, 1), DPair(10, 10)); EXPECT_EQ(cp1.valueAt(1, 0), DPair(100, 70)); EXPECT_EQ(cp1.valueAt(1, 1), DPair(70, 20)); points.resize(8); colors.resize(2); CoonsPatch cp2(points, colors, Color::ColorSpace::RGB, 1, &cp1); EXPECT_EQ(cp2.valueAt(0, 0), DPair(100, 70)); EXPECT_EQ(cp2.valueAt(0, 1), DPair(10, 70)); EXPECT_EQ(cp2.valueAt(1, 0), DPair(20, 40)); EXPECT_EQ(cp2.valueAt(1, 1), DPair(70, 100)); CoonsPatch cp3(points, colors, Color::ColorSpace::RGB, 2, &cp1); EXPECT_EQ(cp3.valueAt(0, 0), DPair(70, 20)); EXPECT_EQ(cp3.valueAt(0, 1), DPair(100, 70)); EXPECT_EQ(cp3.valueAt(1, 0), DPair(20, 40)); EXPECT_EQ(cp3.valueAt(1, 1), DPair(70, 100)); CoonsPatch cp4(points, colors, Color::ColorSpace::RGB, 3, &cp1); EXPECT_EQ(cp4.valueAt(0, 0), DPair(10, 10)); EXPECT_EQ(cp4.valueAt(0, 1), DPair(70, 20)); EXPECT_EQ(cp4.valueAt(1, 0), DPair(20, 40)); EXPECT_EQ(cp4.valueAt(1, 1), DPair(70, 100)); } TEST_F(TensorProductPatchTest, averageColor) { EXPECT_EQ(_patch.averageColor().rgbString(), "#bf8040"); } TEST_F(TensorProductPatchTest, vertices) { EXPECT_EQ(_patch.valueAt(0,0), DPair(10,10)); EXPECT_EQ(_patch.valueAt(0,1), DPair(10,70)); EXPECT_EQ(_patch.valueAt(1,1), DPair(100,70)); EXPECT_EQ(_patch.valueAt(1,0), DPair(70,20)); EXPECT_EQ(_patch.colorAt(0,0).rgbString(), "#f00"); EXPECT_EQ(_patch.colorAt(0,1).rgbString(), "#ff0"); EXPECT_EQ(_patch.colorAt(1,1).rgbString(), "#f0f"); EXPECT_EQ(_patch.colorAt(1,0).rgbString(), "#0f0"); } TEST_F(TensorProductPatchTest, curves) { Bezier bezier; _patch.horizontalCurve(0, bezier); CHECK_BEZIER_POINTS("A", bezier, DPair(10, 10), DPair(20, 0), DPair(50, 30), DPair(70, 20)); _patch.horizontalCurve(1, bezier); CHECK_BEZIER_POINTS("B", bezier, DPair(10, 70), DPair(20, 100), DPair(70, 100), DPair(100, 70)); _patch.verticalCurve(0, bezier); CHECK_BEZIER_POINTS("C", bezier, DPair(10, 10), DPair(0, 30), DPair(20, 40), DPair(10, 70)); _patch.verticalCurve(1, bezier); CHECK_BEZIER_POINTS("D", bezier, DPair(70, 20), DPair(80, 50), DPair(90, 60), DPair(100, 70)); } TEST_F(TensorProductPatchTest, blossom_outer) { EXPECT_EQ(_patch.blossomValue(0,0,0,0,0,0), DPair(10, 10)); EXPECT_EQ(_patch.blossomValue(0,0,0,1,0,0), DPair(0, 30)); EXPECT_EQ(_patch.blossomValue(0,0,0,1,1,0), DPair(20, 40)); EXPECT_EQ(_patch.blossomValue(0,0,0,1,1,1), DPair(10, 70)); EXPECT_EQ(_patch.blossomValue(1,1,1,0,0,0), DPair(70, 20)); EXPECT_EQ(_patch.blossomValue(1,1,1,1,0,0), DPair(80, 50)); EXPECT_EQ(_patch.blossomValue(1,1,1,1,1,0), DPair(90, 60)); EXPECT_EQ(_patch.blossomValue(1,1,1,1,1,1), DPair(100, 70)); EXPECT_EQ(_patch.blossomValue(1,0,0,0,0,0), DPair(20, 0)); EXPECT_EQ(_patch.blossomValue(1,1,0,0,0,0), DPair(50, 30)); EXPECT_EQ(_patch.blossomValue(1,1,1,0,0,0), DPair(70, 20)); EXPECT_EQ(_patch.blossomValue(0,0,0,1,1,1), DPair(10, 70)); EXPECT_EQ(_patch.blossomValue(1,0,0,1,1,1), DPair(20, 100)); EXPECT_EQ(_patch.blossomValue(1,1,0,1,1,1), DPair(70, 100)); } TEST_F(TensorProductPatchTest, blossom_inner) { EXPECT_EQ(_patch.blossomValue(1,0,0,1,0,0), DPair(30, 40)); EXPECT_EQ(_patch.blossomValue(1,1,0,1,0,0), DPair(40, 40)); EXPECT_EQ(_patch.blossomValue(1,0,0,1,1,0), DPair(40, 80)); EXPECT_EQ(_patch.blossomValue(1,1,0,1,1,0), DPair(60, 70)); } TEST_F(TensorProductPatchTest, values) { EXPECT_EQUAL_PAIR("A", _patch.valueAt(0.25, 0.5), _patch.blossomValue(0.25, 0.25, 0.25, 0.5, 0.5, 0.5)); EXPECT_NEAR_PAIR("B", _patch.valueAt(0.25, 0.5), DPair(26.1133, 48.457), 0.0001); EXPECT_EQUAL_PAIR("C", _patch.valueAt(0.8, 0.2), _patch.blossomValue(0.8, 0.8, 0.8, 0.2, 0.2, 0.2)); EXPECT_NEAR_PAIR("D", _patch.valueAt(0.8, 0.2), DPair(59.5974, 35.4502), 0.0001); } TEST_F(TensorProductPatchTest, boundaryPath) { GraphicsPath path = _patch.getBoundaryPath(); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10C20 0 50 30 70 20C80 50 90 60 100 70C70 100 20 100 10 70C20 40 0 30 10 10Z"); } TEST_F(TensorProductPatchTest, subpatch) { TensorProductPatch tpp; _patch.subpatch(0, 0.5, 0, 0.5, tpp); GraphicsPath path = tpp.getBoundaryPath(); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M10 10C5 20 7.5 27.5 10 36.25C20.625 46.875 31.25 52.1875 43.28125 54.21875C40 40.9375 36.25 27.5 36.25 15C25 10 15 5 10 10Z"); EXPECT_EQ(tpp.colorAt(0, 0).rgbString(), "#f00"); EXPECT_EQ(tpp.colorAt(0, 1).rgbString(), "#ff8000"); EXPECT_EQ(tpp.colorAt(1, 0).rgbString(), "#808000"); EXPECT_EQ(tpp.colorAt(1, 1).rgbString(), "#bf8040"); } TEST_F(TensorProductPatchTest, bbox) { BoundingBox bbox = _patch.getBBox(); EXPECT_NEAR(bbox.minX(), 7.1132, 0.0001); EXPECT_NEAR(bbox.minY(), 7.9289, 0.0001); EXPECT_DOUBLE_EQ(bbox.maxX(), 100.0); EXPECT_DOUBLE_EQ(bbox.maxY(), 92.5); } class Callback : public ShadingPatch::Callback { public: void patchSegment (GraphicsPath &path, const Color &color) { ostringstream oss; path.writeSVG(oss, false); _pathstr += oss.str(); _colorstr += color.rgbString(); } string pathstr() const {return _pathstr;} string colorstr() const {return _colorstr;} void reset () {_pathstr.clear(); _colorstr.clear();} private: string _pathstr; string _colorstr; }; TEST_F(TensorProductPatchTest, approximate) { Callback callback; vector colors(4); TensorProductPatch tpp(_points, colors, Color::ColorSpace::RGB, 0, 0); tpp.approximate(2, false, 0.1, callback); EXPECT_EQ(callback.pathstr(), "M10 10C20 0 50 30 70 20C80 50 90 60 100 70C70 100 20 100 10 70C20 40 0 30 10 10Z"); EXPECT_EQ(callback.colorstr(), "#000"); callback.reset(); _patch.approximate(2, false, 0.1, callback); EXPECT_EQ( callback.pathstr(), "M10 10C15 5 25 10 36.25 15C36.25 27.5 40 40.9375 43.28125 54.21875C31.25 52.1875 20.625 46.875 10 36.25C7.5 27.5 5 20 10 10Z" "M36.25 15C47.5 20 60 25 70 20C75 35 80 45 85 52.5C68.75 55 55.3125 56.25 43.28125 54.21875C40 40.9375 36.25 27.5 36.25 15Z" "M10 36.25C20.625 46.875 31.25 52.1875 43.28125 54.21875C46.5625 67.5 49.375 80.625 47.5 92.5C30 92.5 15 85 10 70C15 55 12.5 45 10 36.25Z" "M43.28125 54.21875C55.3125 56.25 68.75 55 85 52.5C90 60 95 65 100 70C85 85 65 92.5 47.5 92.5C49.375 80.625 46.5625 67.5 43.28125 54.21875Z"); EXPECT_EQ(callback.colorstr(), "#cf6010#70a030#efa030#cf6090"); } TEST_F(TensorProductPatchTest, fail) { // edge flag == 0 vector points(15); EXPECT_THROW(_patch.setPoints(points, 0, 0), ShadingException); points.resize(17); // too many points EXPECT_THROW(_patch.setPoints(points, 0, 0), ShadingException); vector colors(2); // too few colors EXPECT_THROW(_patch.setColors(colors, 0, 0), ShadingException); colors.resize(5); // too many colors EXPECT_THROW(_patch.setColors(colors, 0, 0), ShadingException); // edge flag > 0 points.resize(16); EXPECT_THROW(_patch.setPoints(points, 1, 0), ShadingException); points.resize(11); // too few points EXPECT_THROW(_patch.setPoints(points, 1, &_patch), ShadingException); points.resize(13); // too many points EXPECT_THROW(_patch.setPoints(points, 1, &_patch), ShadingException); colors.resize(4); EXPECT_THROW(_patch.setColors(colors, 1, 0), ShadingException); colors.resize(1); // too few colors EXPECT_THROW(_patch.setColors(colors, 1, &_patch), ShadingException); colors.resize(3); // too many colors EXPECT_THROW(_patch.setColors(colors, 1, &_patch), ShadingException); CoonsPatch cp; points.resize(8); EXPECT_THROW(cp.setPoints(points, 1, 0), ShadingException); points.resize(11); EXPECT_THROW(cp.setPoints(points, 0, 0), ShadingException); colors.resize(2); EXPECT_THROW(cp.setColors(colors, 1, 0), ShadingException); colors.resize(5); EXPECT_THROW(cp.setColors(colors, 0, 0), ShadingException); } dvisvgm-2.8.1/tests/CMapReaderTest.cpp0000664000175000017500000001017713560004141014575 00000000000000/************************************************************************* ** CMapReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "CMap.hpp" #include "CMapReader.hpp" using namespace std; class CMapReaderTest : public ::testing::Test { protected: CMapReaderTest () { istringstream iss(cmapsrc); CMapReader reader; cmap = reader.read(iss, "Test-Map"); } static const char *cmapsrc; unique_ptr cmap; }; const char *CMapReaderTest::cmapsrc = "% This is a comment line\n" "/CIDInit /ProcSet findresource begin\n" "12 dict begin\n" "begincmap\n" "/CIDSystemInfo 3 dict dup begin\n" " /Registry (Adobe) def\n" " /Ordering (Adobe_Japan1_UCS2) def\n" " /Supplement 6 def\n" "end def\n" "/CMapName /Test-Map def\n" "/CMapVersion 8.002 def\n" "/CMapType 2 def\n" "/XUID [1 10 25335 1212] def\n" "/WMode 0 def\n" "1 begincodespacerange\n" " <0000> \n" "endcodespacerange\n" "4 beginbfchar\n" "<0000> \n" "<003d> <00a5>\n" "<005d> <00a6>\n" "<005e> <007d>\n" "endbfchar\n" "2 beginbfchar\n" "<005f> <0303>\n" "<0060> <2019>\n" "endbfchar\n" "3 beginbfrange\n" "<5830> <5831> <8c75>\n" "<5833> <5834> <8c86>\n" "<5837> <5838> <8c9b>\n" "endbfrange\n" "3 begincidchar\n" "<1000> 50\n" "<1005> 60\n" "<1008> 70\n" "endcidchar\n" "2 begincidrange\n" "<1234> <1240> 100\n" "<1300> <1302> 200\n" "endcidrange\n" "endcmap\n" "CMapName currentdict /CMap defineresource pop\n"; TEST_F(CMapReaderTest, rostring) { ASSERT_NE(cmap, nullptr); ASSERT_EQ(cmap->getROString(), "Adobe-Adobe_Japan1_UCS2"); ASSERT_FALSE(cmap->vertical()); } TEST_F(CMapReaderTest, bfcode) { ASSERT_NE(cmap, nullptr); ASSERT_EQ(cmap->getROString(), "Adobe-Adobe_Japan1_UCS2"); ASSERT_FALSE(cmap->vertical()); ASSERT_EQ(cmap->bfcode(0), 0xfffdu); ASSERT_EQ(cmap->bfcode(0x3d), 0xa5u); ASSERT_EQ(cmap->bfcode(0x5d), 0xa6u); ASSERT_EQ(cmap->bfcode(0x5e), 0x7du); ASSERT_EQ(cmap->bfcode(0x5f), 0x303u); ASSERT_EQ(cmap->bfcode(0x60), 0x2019u); ASSERT_EQ(cmap->bfcode(0x5830), 0x8c75u); ASSERT_EQ(cmap->bfcode(0x5831), 0x8c76u); ASSERT_EQ(cmap->bfcode(0x5833), 0x8c86u); ASSERT_EQ(cmap->bfcode(0x5838), 0x8c9cu); ASSERT_EQ(cmap->bfcode(0x5839), 0u); } TEST_F(CMapReaderTest, cid) { const SegmentedCMap *seg_cmap = dynamic_cast(cmap.get()); ASSERT_NE(seg_cmap, nullptr); ASSERT_EQ(seg_cmap->numBFRanges(), 9u); ASSERT_EQ(seg_cmap->numCIDRanges(), 5u); ASSERT_EQ(seg_cmap->cid(0x1000), 50u); ASSERT_EQ(seg_cmap->cid(0x1005), 60u); ASSERT_EQ(seg_cmap->cid(0x1008), 70u); ASSERT_EQ(seg_cmap->cid(0x1233), 0u); ASSERT_EQ(seg_cmap->cid(0x1234), 100u); ASSERT_EQ(seg_cmap->cid(0x1240), 112u); ASSERT_EQ(seg_cmap->cid(0x1241), 0u); ASSERT_EQ(seg_cmap->cid(0x12FF), 0u); ASSERT_EQ(seg_cmap->cid(0x1300), 200u); ASSERT_EQ(seg_cmap->cid(0x1301), 201u); ASSERT_EQ(seg_cmap->cid(0x1302), 202u); ASSERT_EQ(seg_cmap->cid(0x1303), 0u); } dvisvgm-2.8.1/tests/HashFunctionTest.cpp0000664000175000017500000001270013553267757015247 00000000000000/************************************************************************* ** HashFunctionTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "MD5HashFunction.hpp" #include "XXHashFunction.hpp" using namespace std; TEST(HashFunctionTest, md5) { MD5HashFunction md5; ASSERT_EQ(md5.digestSize(), 16); md5.update("0123456789"); EXPECT_EQ(md5.digestString(), "781e5e245d69b566979b86e28d23f2c7"); md5.update("abcdefghij"); EXPECT_EQ(md5.digestString(), "644be06dfc54061fd1e67f5ebbabcd58"); md5.reset(); md5.update("0123456789"); EXPECT_EQ(md5.digestString(), "781e5e245d69b566979b86e28d23f2c7"); vector bytes = {0x78, 0x1e, 0x5e, 0x24, 0x5d, 0x69, 0xb5, 0x66, 0x97, 0x9b, 0x86, 0xe2, 0x8d, 0x23, 0xf2, 0xc7}; EXPECT_EQ(md5.digestValue(), bytes); } TEST(HashFunctionTest, xxh32) { XXH32HashFunction xxh32; ASSERT_EQ(xxh32.digestSize(), 4); xxh32.update("0123456789"); EXPECT_EQ(xxh32.digestString(), "950c9c0a"); xxh32.update("abcdefghij"); EXPECT_EQ(xxh32.digestString(), "35600916"); xxh32.reset(); xxh32.update("0123456789"); EXPECT_EQ(xxh32.digestString(), "950c9c0a"); vector bytes = {0x95, 0x0c, 0x9c, 0x0a}; EXPECT_EQ(xxh32.digestValue(), bytes); } TEST(HashFunctionTest, xxh64) { XXH64HashFunction xxh64; ASSERT_EQ(xxh64.digestSize(), 8); xxh64.update("0123456789"); EXPECT_EQ(xxh64.digestString(), "3f5fc178a81867e7"); xxh64.update("abcdefghij"); EXPECT_EQ(xxh64.digestString(), "45c2c0e1eb35a0b6"); xxh64.reset(); xxh64.update("0123456789"); EXPECT_EQ(xxh64.digestString(), "3f5fc178a81867e7"); vector bytes = {0x3f, 0x5f, 0xc1, 0x78, 0xa8, 0x18, 0x67, 0xe7}; EXPECT_EQ(xxh64.digestValue(), bytes); } #ifdef ENABLE_XXH128 TEST(HashFunctionTest, xxh128) { XXH128HashFunction xxh128; ASSERT_EQ(xxh128.digestSize(), 16); xxh128.update("0123456789"); EXPECT_EQ(xxh128.digestString(), "942eb242912d99ecb1844fcc57198e3a"); xxh128.update("abcdefghij"); EXPECT_EQ(xxh128.digestString(), "f37bc26b7087c656f0345fdf02a75bc4"); xxh128.reset(); xxh128.update("0123456789"); EXPECT_EQ(xxh128.digestString(), "942eb242912d99ecb1844fcc57198e3a"); vector bytes = {0x94, 0x2e, 0xb2, 0x42, 0x91, 0x2d, 0x99, 0xec, 0xb1, 0x84, 0x4f, 0xcc, 0x57, 0x19, 0x8e, 0x3a}; EXPECT_EQ(xxh128.digestValue(), bytes); } #endif TEST(HashFunctionTest, createMD5) { auto hashfunc = HashFunction::create("md5"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); hashfunc->update("0123456789"); EXPECT_EQ(hashfunc->digestString(), "781e5e245d69b566979b86e28d23f2c7"); hashfunc = HashFunction::create("md5", "0123456789"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); EXPECT_EQ(hashfunc->digestString(), "781e5e245d69b566979b86e28d23f2c7"); } TEST(HashFunctionTest, createXXH32) { auto hashfunc = HashFunction::create("xxh32"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); hashfunc->update("0123456789"); EXPECT_EQ(hashfunc->digestString(), "950c9c0a"); hashfunc = HashFunction::create("xxh32", "0123456789"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); EXPECT_EQ(hashfunc->digestString(), "950c9c0a"); } TEST(HashFunctionTest, createXXH64) { auto hashfunc = HashFunction::create("xxh64"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); hashfunc->update("0123456789"); EXPECT_EQ(hashfunc->digestString(), "3f5fc178a81867e7"); hashfunc = HashFunction::create("xxh64", "0123456789"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); EXPECT_EQ(hashfunc->digestString(), "3f5fc178a81867e7"); } #ifdef ENABLE_XXH128 TEST(HashFunctionTest, createXXH128) { auto hashfunc = HashFunction::create("xxh128"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); hashfunc->update("0123456789"); EXPECT_EQ(hashfunc->digestString(), "942eb242912d99ecb1844fcc57198e3a"); hashfunc = HashFunction::create("xxh128", "0123456789"); ASSERT_TRUE(dynamic_cast(hashfunc.get()) != nullptr); EXPECT_EQ(hashfunc->digestString(), "942eb242912d99ecb1844fcc57198e3a"); } #endif TEST(HashFunctionTest, createFail) { ASSERT_TRUE(HashFunction::create("not-available") == nullptr); } dvisvgm-2.8.1/tests/UnicodeTest.cpp0000664000175000017500000001163013510660062014220 00000000000000/************************************************************************* ** UnicodeTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Unicode.hpp" using namespace std; TEST(UnicodeTest, isValidCodepoint) { for (uint32_t i=0; i <= 0x20; i++) EXPECT_FALSE(Unicode::isValidCodepoint(i)) << "i=" << i; for (uint32_t i=0x21; i <= 0x7e; i++) EXPECT_TRUE(Unicode::isValidCodepoint(i)) << "i=" << i; EXPECT_FALSE(Unicode::isValidCodepoint(0xfffe)); EXPECT_FALSE(Unicode::isValidCodepoint(0xffff)); EXPECT_TRUE(Unicode::isValidCodepoint(0x10000)); } TEST(UnicodeTest, charToCodepoint) { for (uint32_t i=0; i <= 0x20; i++) EXPECT_EQ(Unicode::charToCodepoint(i), 0xe000+i) << "i=" << i; for (uint32_t i=0x21; i <= 0x7e; i++) EXPECT_EQ(Unicode::charToCodepoint(i), i) << "i=" << i; for (uint32_t i=0x7f; i <= 0x9f; i++) EXPECT_EQ(Unicode::charToCodepoint(i), 0xe021+i-0x7f) << "i=" << i; EXPECT_EQ(Unicode::charToCodepoint(0x10fffd), 0x10fffdu); EXPECT_EQ(Unicode::charToCodepoint(0x10fffe), 0xe887u); EXPECT_EQ(Unicode::charToCodepoint(0x10ffff), 0xe888u); } TEST(UnicodeTest, utf8) { EXPECT_EQ(Unicode::utf8(0x1), string("\x01")); EXPECT_EQ(Unicode::utf8(0x47), string("\x47")); EXPECT_EQ(Unicode::utf8(0x7f), string("\x7f")); EXPECT_EQ(Unicode::utf8(0x80), string("\xc2\x80")); EXPECT_EQ(Unicode::utf8(0x07ff), string("\xdf\xbf")); EXPECT_EQ(Unicode::utf8(0x0800), string("\xe0\xa0\x80")); EXPECT_EQ(Unicode::utf8(0x7fff), string("\xe7\xbf\xbf")); EXPECT_EQ(Unicode::utf8(0xfffe), string("\xef\xbf\xbe")); EXPECT_EQ(Unicode::utf8(0xffff), string("\xef\xbf\xbf")); EXPECT_EQ(Unicode::utf8(0x10000), string("\xf0\x90\x80\x80")); EXPECT_EQ(Unicode::utf8(0x10ffff), string("\xf4\x8f\xbf\xbf")); EXPECT_TRUE(Unicode::utf8(0x110000).empty()); } TEST(UnicodeTest, aglNameToCodepoint1) { EXPECT_EQ(Unicode::aglNameToCodepoint("does not exist"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("Eogonek"), 0x118); EXPECT_EQ(Unicode::aglNameToCodepoint("alpha"), 0x03b1); EXPECT_EQ(Unicode::aglNameToCodepoint("Alpha"), 0x0391); EXPECT_EQ(Unicode::aglNameToCodepoint("alphatonos"), 0x03ac); EXPECT_EQ(Unicode::aglNameToCodepoint("SF460000"), 0x2568); } TEST(UnicodeTest, aglNameToCodepoint2) { EXPECT_EQ(Unicode::aglNameToCodepoint("uni1234"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("uni1234.suffix"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("uni1234_part2"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("uni12345678"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("uni123"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("uni12345"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("uni1234567"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("uni100000"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("uni123E"), 0x123e); EXPECT_EQ(Unicode::aglNameToCodepoint("uni123e"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("uniD7FF"), 0xd7ff); EXPECT_EQ(Unicode::aglNameToCodepoint("uniD800"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("u1234"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("u1234.suffix"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("u1234_part2"), 0x1234); EXPECT_EQ(Unicode::aglNameToCodepoint("u12345678"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("u123.suffix"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("u123"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("u12345"), 0x12345); EXPECT_EQ(Unicode::aglNameToCodepoint("u1234567"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("u100000"), 0x100000); EXPECT_EQ(Unicode::aglNameToCodepoint("u123E"), 0x123e); EXPECT_EQ(Unicode::aglNameToCodepoint("u123e"), 0); EXPECT_EQ(Unicode::aglNameToCodepoint("uD7FF"), 0xd7ff); EXPECT_EQ(Unicode::aglNameToCodepoint("uD800"), 0); } dvisvgm-2.8.1/tests/BezierTest.cpp0000664000175000017500000001367313536435612014074 00000000000000/************************************************************************* ** BezierTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Bezier.hpp" using namespace std; const double EPS = 0.001; #define EXPECT_PAIR_EQ(p1,p2) {EXPECT_DOUBLE_EQ(p1.x(), p2.x()); EXPECT_DOUBLE_EQ(p1.y(), p2.y());} #define EXPECT_PAIR_NEAR(p1,p2) {EXPECT_NEAR(p1.x(), p2.x(), EPS); EXPECT_NEAR(p1.y(), p2.y(), EPS);} #define EXPECT_BBOX_NEAR(b1,b2) { \ EXPECT_NEAR(b1.minX(), b2.minX(), EPS); EXPECT_NEAR(b1.maxX(), b2.maxX(), EPS); \ EXPECT_NEAR(b1.minY(), b2.minY(), EPS); EXPECT_NEAR(b1.maxY(), b2.maxY(), EPS);} TEST(BezierTest, construct) { // quadratic Bézier curve Bezier bezier1(DPair(0,0), DPair(12,12), DPair(24,6)); EXPECT_EQ(bezier1.point(0), DPair(0,0)); EXPECT_EQ(bezier1.point(1), DPair(8,8)); EXPECT_EQ(bezier1.point(2), DPair(16,10)); EXPECT_EQ(bezier1.point(3), DPair(24,6)); // cubic Bézier curve Bezier bezier2(DPair(0,0), DPair(12,12), DPair(24,6), DPair(19,-4)); EXPECT_EQ(bezier2.point(0), DPair(0,0)); EXPECT_EQ(bezier2.point(1), DPair(12,12)); EXPECT_EQ(bezier2.point(2), DPair(24,6)); EXPECT_EQ(bezier2.point(3), DPair(19,-4)); } TEST(BezierTest, subcurve) { Bezier bezier1(DPair(0,0), DPair(12,12), DPair(24,6), DPair(19,-4)); { Bezier subcurve(bezier1, 0, 1); EXPECT_EQ(subcurve.point(0), DPair(0,0)); EXPECT_EQ(subcurve.point(1), DPair(12,12)); EXPECT_EQ(subcurve.point(2), DPair(24,6)); EXPECT_EQ(subcurve.point(3), DPair(19,-4)); } { Bezier subcurve(bezier1, 0, 0.5); EXPECT_EQ(subcurve.point(0), DPair(0,0)); EXPECT_EQ(subcurve.point(1), DPair(6,6)); EXPECT_EQ(subcurve.point(2), DPair(12,7.5)); EXPECT_EQ(subcurve.point(3), DPair(15.875,6.25)); } { Bezier subcurve(bezier1, 1, 0.5); EXPECT_EQ(subcurve.point(0), DPair(15.875,6.25)); EXPECT_EQ(subcurve.point(1), DPair(19.75,5)); EXPECT_EQ(subcurve.point(2), DPair(21.5,1)); EXPECT_EQ(subcurve.point(3), DPair(19,-4)); } { Bezier subcurve(bezier1, 0.2, 0.8); EXPECT_PAIR_NEAR(subcurve.point(0), DPair(7.064,5.152)); EXPECT_PAIR_NEAR(subcurve.point(1), DPair(13.856,8.368)); EXPECT_PAIR_NEAR(subcurve.point(2), DPair(19.424,6.112)); EXPECT_PAIR_NEAR(subcurve.point(3), DPair(20.096,1.408)); } { Bezier subcurve(bezier1, 0, 0); EXPECT_EQ(subcurve.point(0), DPair(0,0)); EXPECT_EQ(subcurve.point(1), DPair(0,0)); EXPECT_EQ(subcurve.point(2), DPair(0,0)); EXPECT_EQ(subcurve.point(3), DPair(0,0)); } { Bezier subcurve(bezier1, 1, 1); EXPECT_EQ(subcurve.point(0), DPair(19,-4)); EXPECT_EQ(subcurve.point(1), DPair(19,-4)); EXPECT_EQ(subcurve.point(2), DPair(19,-4)); EXPECT_EQ(subcurve.point(3), DPair(19,-4)); } } TEST(BezierTest, reverse) { Bezier bezier(DPair(0,0), DPair(12,12), DPair(24,6), DPair(19,-4)); bezier.reverse(); EXPECT_EQ(bezier.point(0), DPair(19,-4)); EXPECT_EQ(bezier.point(1), DPair(24,6)); EXPECT_EQ(bezier.point(2), DPair(12,12)); EXPECT_EQ(bezier.point(3), DPair(0,0)); } TEST(BezierTest, bbox) { Bezier bezier(DPair(0,0), DPair(12,12), DPair(24,6), DPair(30,-5)); EXPECT_BBOX_NEAR(bezier.getBBox(), BoundingBox(0, -5, 30, 6.598)); } TEST(BezierTest, approximate) { vector points; vector times; Bezier bezier(DPair(0,0), DPair(12,12), DPair(24,6), DPair(30,-5)); size_t size = bezier.approximate(0.1, points, ×); double t[] = {0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 1}; DPair p[] = { DPair(0,0), DPair(4.488,3.681), DPair(8.906,5.828), DPair(13.183,6.591), DPair(17.25,6.125), DPair(21.035,4.580), DPair(24.468,2.109), DPair(30,-5) }; EXPECT_EQ(size, (size_t)sizeof(t)/sizeof(double)); EXPECT_EQ(points.size(), size); EXPECT_EQ(times.size(), size); for (size_t i=0; i < size; i++) { EXPECT_EQ(times[i], t[i]) << "i=" << i; EXPECT_PAIR_NEAR(points[i], p[i]); } } TEST(BezierTest, reduceDegree) { vector points; Bezier bezier(DPair(0,0), DPair(5,10), DPair(10,5)); int degree = bezier.reduceDegree(0.1, points); EXPECT_EQ(degree, 2); EXPECT_EQ(points[0], DPair(0,0)); EXPECT_EQ(points[1], DPair(5,10)); EXPECT_EQ(points[2], DPair(10,5)); bezier.setPoints(DPair(3,8), DPair(3,8), DPair(3,8), DPair(3,8)); degree = bezier.reduceDegree(0.1, points); EXPECT_EQ(degree, 0); EXPECT_EQ(points[0], DPair(3,8)); bezier.setPoints(DPair(0,0), DPair(5,5), DPair(8,8), DPair(10,10)); degree = bezier.reduceDegree(0.1, points); EXPECT_EQ(degree, 1); EXPECT_EQ(points[0], DPair(0,0)); EXPECT_EQ(points[1], DPair(10,10)); bezier.setPoints(DPair(0,0), DPair(5,10), DPair(10,5), DPair(15,10)); degree = bezier.reduceDegree(0.1, points); EXPECT_EQ(degree, 3); EXPECT_EQ(points[0], DPair(0,0)); EXPECT_EQ(points[1], DPair(5,10)); EXPECT_EQ(points[2], DPair(10,5)); EXPECT_EQ(points[3], DPair(15,10)); } dvisvgm-2.8.1/tests/VectorIteratorTest.cpp0000664000175000017500000000731113510660062015607 00000000000000/************************************************************************* ** VectorIteratorTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "VectorIterator.hpp" using namespace std; TEST(VectorIteratorTest, inc) { vector vec{4,3,2,9,8,7,10}; VectorIterator it(vec); EXPECT_TRUE(it.valid()); EXPECT_EQ(*it++, 4); EXPECT_EQ(*it, 3); EXPECT_EQ(*++it, 2); EXPECT_TRUE(it.valid()); for (size_t i=2; it.valid(); i++) { EXPECT_LT(i, vec.size()) << "i=" << i; EXPECT_EQ(*it, vec[i]) << "*it=" << *it << ", vec[" << i << "]=" << vec[i]; ++it; } } TEST(VectorIteratorTest, addsub) { vector vec{4,3,2,9,8,7,10}; VectorIterator it(vec); EXPECT_EQ(*(it += 4), 8); EXPECT_EQ(*(it -= 3), 3); EXPECT_EQ(*(it + 4), 7); EXPECT_EQ(*(it - 1), 4); } TEST(VectorIteratorTest, dec) { vector vec{4,3,2,9,8,7,10}; VectorIterator it(vec); it += 6; EXPECT_EQ(*it, 10); EXPECT_EQ(*it--, 10); EXPECT_EQ(*it, 7); EXPECT_EQ(*--it, 8); EXPECT_TRUE(it.valid()); for (size_t i=4; it.valid(); i--) { EXPECT_LT(i, vec.size()) << "i=" << i; EXPECT_EQ(*it, vec[i]) << "*it=" << *it << ", vec[" << i << "]=" << vec[i]; --it; } } TEST(VectorIteratorTest, invalidate) { vector vec{4,3,2,9,8,7,10}; VectorIterator it(vec); --it; EXPECT_FALSE(it.valid()); ++it; EXPECT_TRUE(it.valid()); it += 10; EXPECT_FALSE(it.valid()); it -= 10; EXPECT_TRUE(it.valid()); it.invalidate(); EXPECT_FALSE(it.valid()); it.reset(); ASSERT_TRUE(it.valid()); EXPECT_EQ(*it, 4); } TEST(VectorIteratorTest, compare) { vector vec{4,3,2,9,8,7,10}; VectorIterator it1(vec); VectorIterator it2 = it1 + 1; EXPECT_NE(it1, it2); ++it1; EXPECT_EQ(it1, it2); EXPECT_LE(it1, it2); EXPECT_GE(it1, it2); ++it2; EXPECT_LT(it1, it2); EXPECT_GT(it2, it1); } struct MyPair { int number; const char *str; } mypair[] = { {3, "text"}, {5, "string"} }; TEST(VectorIteratorTest, deref) { vector vec(mypair, mypair+2); VectorIterator it(vec); EXPECT_TRUE(it.valid()); EXPECT_EQ((*it).number, 3); EXPECT_EQ((*it).str, mypair[0].str); EXPECT_EQ(it->number, 3); EXPECT_EQ(it->str, mypair[0].str); ++it; EXPECT_EQ(it->number, 5); EXPECT_EQ(it->str, mypair[1].str); } TEST(VectorIteratorTest, fail) { vector vec(mypair, mypair+2); VectorIterator it(vec); --it; EXPECT_FALSE(it.valid()); EXPECT_THROW(*it, IteratorException); EXPECT_THROW(it->number, IteratorException); } dvisvgm-2.8.1/tests/testutil.hpp0000664000175000017500000000027013553267757013677 00000000000000#pragma once #define WARNING(...) \ ColoredPrintf(testing::internal::COLOR_YELLOW, "[ WARNING ] "), \ ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__), \ printf("\n") dvisvgm-2.8.1/tests/JFMReaderTest.cpp0000664000175000017500000000770213510660062014376 00000000000000/************************************************************************* ** JFMReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include "JFM.hpp" #include "utility.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; class JFMReaderTest : public ::testing::Test { public: void SetUp () override { string fname = string(SRCDIR)+"/data/cidjmgr0-h.tfm"; ifstream ifs(fname, ios::binary); ASSERT_TRUE(ifs.is_open()) << "failed opening " << fname; jfm = util::make_unique(ifs); } protected: unique_ptr jfm; }; TEST_F(JFMReaderTest, properties) { EXPECT_EQ(jfm->getChecksum(), 0u); EXPECT_FALSE(jfm->verticalLayout()); EXPECT_EQ(jfm->firstChar(), 0); EXPECT_EQ(jfm->lastChar(), 1); EXPECT_EQ(jfm->minChar(), 13143u); EXPECT_EQ(jfm->maxChar(), 14696u); EXPECT_DOUBLE_EQ(jfm->getDesignSize(), 10.0*72.0/72.27); } TEST_F(JFMReaderTest, charWidth) { uint32_t minchar = jfm->minChar(); uint32_t maxchar = jfm->maxChar(); EXPECT_NEAR(jfm->getCharWidth(0), 9.963, 0.001); EXPECT_NEAR(jfm->getCharWidth(minchar), 4.981, 0.001); EXPECT_NEAR(jfm->getCharWidth(minchar+1), 4.981, 0.001); EXPECT_NEAR(jfm->getCharWidth(maxchar), 4.981, 0.001); EXPECT_NEAR(jfm->getCharWidth(maxchar+1), 9.963, 0.001); } TEST_F(JFMReaderTest, charHeight) { uint32_t minchar = jfm->minChar(); uint32_t maxchar = jfm->maxChar(); EXPECT_NEAR(jfm->getCharHeight(0), 8.767, 0.001); EXPECT_NEAR(jfm->getCharHeight(minchar), 8.767, 0.001); EXPECT_NEAR(jfm->getCharHeight(minchar+1), 8.767, 0.001); EXPECT_NEAR(jfm->getCharHeight(maxchar), 8.767, 0.001); EXPECT_NEAR(jfm->getCharHeight(maxchar+1), 8.767, 0.001); } TEST_F(JFMReaderTest, charDepth) { uint32_t minchar = jfm->minChar(); uint32_t maxchar = jfm->maxChar(); EXPECT_NEAR(jfm->getCharDepth(0), 1.195, 0.001); EXPECT_NEAR(jfm->getCharDepth(minchar), 1.195, 0.001); EXPECT_NEAR(jfm->getCharDepth(minchar+1), 1.195, 0.001); EXPECT_NEAR(jfm->getCharDepth(maxchar), 1.195, 0.001); EXPECT_NEAR(jfm->getCharDepth(maxchar+1), 1.195, 0.001); } TEST_F(JFMReaderTest, italicCorr) { uint32_t minchar = jfm->minChar(); uint32_t maxchar = jfm->maxChar(); EXPECT_DOUBLE_EQ(jfm->getItalicCorr(0), 0); EXPECT_DOUBLE_EQ(jfm->getItalicCorr(minchar), 0); EXPECT_DOUBLE_EQ(jfm->getItalicCorr(minchar+1), 0); EXPECT_DOUBLE_EQ(jfm->getItalicCorr(maxchar), 0); EXPECT_DOUBLE_EQ(jfm->getItalicCorr(maxchar+1), 0); } TEST_F(JFMReaderTest, params) { EXPECT_DOUBLE_EQ(jfm->getSpace(), 0); EXPECT_DOUBLE_EQ(jfm->getSpaceShrink(), 0.); EXPECT_NEAR(jfm->getSpaceStretch(), 0.996, 0.001); EXPECT_NEAR(jfm->getQuad(), 9.963, 0.001); } dvisvgm-2.8.1/tests/MatrixTest.cpp0000664000175000017500000002013413510660062014075 00000000000000/************************************************************************* ** MatrixTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "Calculator.hpp" #include "Matrix.hpp" using namespace std; TEST(MatrixTest, construct1) { const vector vec{1, 2, 3, 4, 5, 6, 7, 8, 9}; Matrix m1(vec); for (int row=0; row < 3; row++) for (int col=0; col < 3; col++) ASSERT_EQ(m1.get(row, col), vec[row*3+col]) << "row=" << row << ", col=" << col; int startIndex=4; Matrix m2(vec, startIndex); for (int row=0; row < 3; row++) { for (int col=0; col < 3; col++) { int index = row*3+col+startIndex; ASSERT_EQ(m2.get(row, col), index < 9 ? vec[index] : (row == col ? 1 : 0)) << "row=" << row << ", col=" << col; } } EXPECT_TRUE(Matrix(1).isIdentity()); } TEST(MatrixTest, construct2) { Matrix m1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; for (int row=0; row < 3; row++) for (int col=0; col < 3; col++) ASSERT_EQ(m1.get(row, col), 3*row+col+1) << "row=" << row << ", col=" << col; Matrix m2 = {1, 2, 3, 4, 5, 6}; for (int row=0; row < 2; row++) for (int col=0; col < 3; col++) ASSERT_EQ(m2.get(row, col), 3*row+col+1) << "row=" << row << ", col=" << col; ASSERT_EQ(m2.get(2, 0), 0); ASSERT_EQ(m2.get(2, 1), 0); ASSERT_EQ(m2.get(2, 2), 1); } TEST(MatrixTest, svg) { double v1[] = {1,2,3,4,5,6,7,8,9}; Matrix m1(v1); ostringstream oss; m1.write(oss); EXPECT_EQ(oss.str(), "((1,2,3),(4,5,6),(7,8,9))"); EXPECT_EQ(m1.toSVG(), "matrix(1 4 2 5 3 6)"); double v2[] = {1,2}; Matrix m2(v2, 2); oss.str(""); m2.write(oss); EXPECT_EQ(oss.str(), "((1,2,0),(0,1,0),(0,0,1))"); EXPECT_EQ(m2.toSVG(), "matrix(1 0 2 1 0 0)"); } TEST(MatrixTest, transpose) { double v[] = {1,2,3,4,5,6,7,8,9}; Matrix m(v); m.transpose(); ostringstream oss; m.write(oss); EXPECT_EQ(oss.str(), "((1,4,7),(2,5,8),(3,6,9))"); EXPECT_EQ(m.toSVG(), "matrix(1 2 4 5 7 8)"); } TEST(MatrixTest, scale) { ScalingMatrix m(2,2); DPair p = m*DPair(3,3); EXPECT_DOUBLE_EQ(p.x(), 6); EXPECT_DOUBLE_EQ(p.y(), 6); m = ScalingMatrix(-2,-2); p = m*DPair(3,3); EXPECT_DOUBLE_EQ(p.x(), -6); EXPECT_DOUBLE_EQ(p.y(), -6); } TEST(MatrixTest, rotate) { RotationMatrix m(90); DPair p = m*DPair(2,0); EXPECT_NEAR(p.x(), 0, 0.0000000001); EXPECT_NEAR(p.y(), 2, 0.0000000001); p = m*p; EXPECT_NEAR(p.x(), -2, 0.0000000001); EXPECT_NEAR(p.y(), 0, 0.0000000001); } TEST(MatrixTest, isTranslation) { Matrix m(1); EXPECT_TRUE(m.isIdentity()); double tx, ty; EXPECT_TRUE(m.isTranslation(tx, ty)); EXPECT_EQ(tx, 0); EXPECT_EQ(ty, 0); m.translate(1,2); EXPECT_TRUE(m.isTranslation(tx, ty)); EXPECT_EQ(tx, 1); EXPECT_EQ(ty, 2); m.scale(2, 2); EXPECT_FALSE(m.isTranslation(tx, ty)); } TEST(MatrixTest, rmultiply) { const Matrix m1({1, 2, 3, 4, 5, 6, 7, 8, 9}); const Matrix m2({9, 8, 7, 6, 5, 4, 3, 2, 1}); EXPECT_NE(m1, m2); Matrix m3; EXPECT_EQ((m3 = m1).rmultiply(m2), Matrix({30, 24, 18, 84, 69, 54, 138, 114, 90})); EXPECT_EQ((m3 = m2).rmultiply(m1), Matrix({90, 114, 138, 54, 69, 84, 18, 24, 30})); EXPECT_EQ((m3 = m1).rmultiply(Matrix(1)), m1); } TEST(MatrixTest, lmultiply) { const Matrix m1({1, 2, 3, 4, 5, 6, 7, 8, 9}); const Matrix m2({9, 8, 7, 6, 5, 4, 3, 2, 1}); EXPECT_NE(m1, m2); Matrix m3; EXPECT_EQ((m3 = m1).lmultiply(m2), Matrix({90, 114, 138, 54, 69, 84, 18, 24, 30})); EXPECT_EQ((m3 = m2).lmultiply(m1), Matrix({30, 24, 18, 84, 69, 54, 138, 114, 90})); EXPECT_EQ((m3 = m1).lmultiply(Matrix(1)), m1); } TEST(MatrixTest, vec) { vector v; for (int i=1; i <= 15; ++i) v.push_back(i); Matrix m(v); ostringstream oss; m.write(oss); EXPECT_EQ(oss.str(), "((1,2,3),(4,5,6),(7,8,9))"); oss.str(""); m.set(v, 2); m.write(oss); EXPECT_EQ(oss.str(), "((3,4,5),(6,7,8),(9,10,11))"); } TEST(MatrixTest, det) { Matrix m1(1); EXPECT_EQ(det(m1), 1); double v2[] = {1,2,3, 4,5,6, 7,8,9}; Matrix m2(v2); EXPECT_EQ(det(m2), 1*5*9 + 2*6*7 + 3*4*8 - 3*5*7 - 2*4*9 - 1*6*8); EXPECT_EQ(det(m2, 0, 0), 5*9-6*8); EXPECT_EQ(det(m2, 0, 1), 4*9-6*7); EXPECT_EQ(det(m2, 0, 2), 4*8-5*7); EXPECT_EQ(det(m2, 1, 0), 2*9-3*8); double v3[] = {1,1,1, 2,2,2, 3,3,3}; Matrix m3(v3); EXPECT_EQ(det(m2), 0); m3.transpose(); EXPECT_EQ(det(m2), 0); } TEST(MatrixTest, invert) { Matrix m1(1); EXPECT_EQ(m1.invert(), m1); double v2[] = {1,2,3, 2,3,1, 3,1,2}; Matrix m2(v2); EXPECT_EQ(det(m2), -18); double v3[] = {5,-1,-7, -1,-7,5, -7,5,-1}; Matrix m3(v3); m3 *= 1.0/det(m2); m2.invert(); for (int i=0; i < 3; ++i) for (int j=0; j < 3; ++j) EXPECT_DOUBLE_EQ(m2.get(i,j), m3.get(i,j)); } TEST(MatrixTest, parse) { Calculator calc; calc.setVariable("ux", 0); calc.setVariable("uy", 0); calc.setVariable("w", 0); calc.setVariable("h", 0); EXPECT_EQ(Matrix("T1,-2", calc), TranslationMatrix(1, -2)); EXPECT_EQ(Matrix("R45", calc), RotationMatrix(45)); EXPECT_EQ(Matrix("S2,3", calc), ScalingMatrix(2, 3)); EXPECT_EQ(Matrix("FH1", calc), Matrix({1, 0, 0, 0, -1, 2, 0, 0, 1})); EXPECT_EQ(Matrix("FV1", calc), Matrix({-1, 0, 2, 0, 1, 0, 0, 0, 1})); EXPECT_EQ(Matrix("KX45", calc), Matrix({1, 1, 0, 0, 1, 0, 0, 0, 1})); EXPECT_EQ(Matrix("KY45", calc), Matrix({1, 0, 0, 1, 1, 0, 0, 0, 1})); EXPECT_EQ(Matrix("M1,2,3,4,5,6", calc), Matrix({1, 2, 3, 4, 5, 6, 0, 0, 1})); Matrix m; m.set("R90 T1,1 S2", calc); EXPECT_EQ(m, Matrix({0, -2, 2, 2, 0, 2, 0, 0, 1})); } TEST(MatrixTest, write) { ostringstream oss; Matrix m(3); oss << m; EXPECT_EQ(oss.str(), "((3,0,0),(0,3,0),(0,0,3))"); } TEST(MatrixTest, fail) { Calculator calc; EXPECT_THROW(Matrix("R45", calc), CalculatorException); calc.setVariable("ux", 0); calc.setVariable("uy", 0); calc.setVariable("w", 0); calc.setVariable("h", 0); EXPECT_THROW(Matrix("ABC", calc), ParserException); // invalid command EXPECT_THROW(Matrix("F1", calc), ParserException); // missing H or V EXPECT_THROW(Matrix("K45", calc), ParserException); // missing X or Y EXPECT_THROW(Matrix("KX", calc), ParserException); // missing argument EXPECT_THROW(Matrix("KX90", calc), ParserException); // invalid argument (pole at 90+180k degrees) EXPECT_THROW(Matrix("KY270", calc), ParserException); // invalid argument (pole at 90+180k degrees) EXPECT_THROW(Matrix("S2,", calc), ParserException); // missing argument } TEST(MatrixTest, parseSVGTransform) { XMLString::DECIMAL_PLACES = 3; EXPECT_EQ( Matrix::parseSVGTransform("translate(50, 90)").toSVG(), "matrix(1 0 0 1 50 90)"); EXPECT_EQ( Matrix::parseSVGTransform("scale(10 20)").toSVG(), "matrix(10 0 0 20 0 0)"); EXPECT_EQ( Matrix::parseSVGTransform("rotate(-45)").toSVG(), "matrix(.707 -.707 .707 .707 0 0)"); EXPECT_EQ( Matrix::parseSVGTransform("translate(50, 90) rotate(-45) ").toSVG(), "matrix(.707 -.707 .707 .707 50 90)"); EXPECT_EQ( Matrix::parseSVGTransform("translate(50, 90) rotate(-45) , translate(130 160)").toSVG(), "matrix(.707 -.707 .707 .707 255.061 111.213)"); } dvisvgm-2.8.1/tests/XMLStringTest.cpp0000664000175000017500000000573213510660062014467 00000000000000/************************************************************************* ** XMLStringTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "XMLString.hpp" using namespace std; TEST(XMLStringTest, stringcast) { const char *cstr = "special characters: &\"'<>"; string str = cstr; EXPECT_EQ(XMLString(cstr, true), string("special characters: &\"'<>")); EXPECT_EQ(XMLString(cstr), string("special characters: &"'<>")); EXPECT_EQ(XMLString(str, true), string("special characters: &\"'<>")); EXPECT_EQ(XMLString(str), string("special characters: &"'<>")); } TEST(XMLStringTest, intcast) { EXPECT_EQ(XMLString(65, true), string("65")); EXPECT_EQ(XMLString(65, false), string("A")); EXPECT_EQ(XMLString(1000, true), string("1000")); EXPECT_EQ(XMLString(1000, false), string("\xCF\xA8")); // UTF-8 } TEST(XMLStringTest, doublecast) { EXPECT_EQ(XMLString(1.2345), string("1.2345")); XMLString::DECIMAL_PLACES = 3; EXPECT_EQ(XMLString(1.2345), string("1.235")); XMLString::DECIMAL_PLACES = 2; EXPECT_EQ(XMLString(1.2345), string("1.23")); XMLString::DECIMAL_PLACES = 1; EXPECT_EQ(XMLString(1.2345), string("1.2")); XMLString::DECIMAL_PLACES = 0; EXPECT_EQ(XMLString(1.2345), string("1.2345")); EXPECT_EQ(XMLString(-1.2345), string("-1.2345")); XMLString::DECIMAL_PLACES = 3; EXPECT_EQ(XMLString(-1.2345), string("-1.235")); XMLString::DECIMAL_PLACES = 2; EXPECT_EQ(XMLString(-1.2345), string("-1.23")); XMLString::DECIMAL_PLACES = 1; EXPECT_EQ(XMLString(-1.2345), string("-1.2")); XMLString::DECIMAL_PLACES = 0; EXPECT_EQ(XMLString(-1.2345), string("-1.2345")); EXPECT_EQ(XMLString(10.0), string("10")); EXPECT_EQ(XMLString(-10.0), string("-10")); } dvisvgm-2.8.1/tests/Makefile.am0000664000175000017500000003642713554545744013356 00000000000000## This file is part of dvisvgm ## Copyright (C) 2005-2019 Martin Gieseking ## ## Process this file with automake. SUBDIRS = data check_LTLIBRARIES = libgtest.la libgtest_la_SOURCES = gtest/src/gtest-all.cc testmain.cpp libgtest_la_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include -I$(dvisvgm_srcdir)/tests/gtest libgtest_la_LDFLAGS = -pthread EXTRA_DIST = gtest/LICENSE \ gtest/include \ gtest/src/gtest.cc \ gtest/src/gtest-death-test.cc \ gtest/src/gtest-filepath.cc \ gtest/src/gtest-internal-inl.h \ gtest/src/gtest_main.cc \ gtest/src/gtest-matchers.cc \ gtest/src/gtest-port.cc \ gtest/src/gtest-printers.cc \ gtest/src/gtest-test-part.cc \ gtest/src/gtest-typed-test.cc include ../libs/defs.am LIBS_CFLAGS = $(XXHASH_CFLAGS) LIBS_LIBS = $(POTRACE_LIBS) $(XXHASH_LIBS) if ENABLE_WOFF LIBS_LIBS += $(WOFF2_LIBS) $(BROTLI_LIBS) endif if USE_BUNDLED_MD5 LIBS_CFLAGS += -I$(dvisvgm_srcdir)/libs/md5 LIBS_LIBS += ../libs/md5/libmd5.a else LIBS_CFLAGS += $(LIBCRYPTO_CFLAGS) LIBS_LIBS += $(LIBCRYPTO_LIBS) endif AM_CXXFLAGS = -I$(dvisvgm_srcdir)/src -I$(dvisvgm_srcdir)/libs/variant/include \ -Wall -Wno-mismatched-tags \ -DBUILDDIR='"$(abs_builddir)"' -DSRCDIR='"$(abs_srcdir)"' \ $(CODE_COVERAGE_CFLAGS) TESTS = hashcheck check_PROGRAMS = hashcheck nodist_hashcheck_SOURCES = hashcheck.cpp hashcheck_CPPFLAGS = $(LIBS_CFLAGS) hashcheck_LDADD = $(LIBS_LIBS) hashcheck.cpp: genhashcheck.py $(dvisvgm_srcdir)/src/AGLTable.hpp $(dvisvgm_srcdir)/libs/xxHash/xxhash.h python $^ >$@ TESTLIBS = libgtest.la ../src/libdvisvgm.la $(LIBS_LIBS) -lfreetype if ENABLE_WOFF TESTLIBS += ../libs/ff-woff/libfontforge.a endif TESTLIBS += $(CODE_COVERAGE_LDFLAGS) TESTS += BezierTest check_PROGRAMS += BezierTest BezierTest_SOURCES = BezierTest.cpp testutil.hpp BezierTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) BezierTest_LDADD = $(TESTLIBS) TESTS += BitmapTest check_PROGRAMS += BitmapTest BitmapTest_SOURCES = BitmapTest.cpp testutil.hpp BitmapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) BitmapTest_LDADD = $(TESTLIBS) TESTS += BoundingBoxTest check_PROGRAMS += BoundingBoxTest BoundingBoxTest_SOURCES = BoundingBoxTest.cpp testutil.hpp BoundingBoxTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) BoundingBoxTest_LDADD = $(TESTLIBS) TESTS += CalculatorTest check_PROGRAMS += CalculatorTest CalculatorTest_SOURCES = CalculatorTest.cpp testutil.hpp CalculatorTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CalculatorTest_LDADD = $(TESTLIBS) TESTS += CMapManagerTest check_PROGRAMS += CMapManagerTest CMapManagerTest_SOURCES = CMapManagerTest.cpp testutil.hpp CMapManagerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CMapManagerTest_LDADD = $(TESTLIBS) TESTS += CMapReaderTest check_PROGRAMS += CMapReaderTest CMapReaderTest_SOURCES = CMapReaderTest.cpp testutil.hpp CMapReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CMapReaderTest_LDADD = $(TESTLIBS) TESTS += CMapTest check_PROGRAMS += CMapTest CMapTest_SOURCES = CMapTest.cpp testutil.hpp CMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CMapTest_LDADD = $(TESTLIBS) TESTS += ColorSpecialTest check_PROGRAMS += ColorSpecialTest ColorSpecialTest_SOURCES = ColorSpecialTest.cpp testutil.hpp ColorSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ColorSpecialTest_LDADD = $(TESTLIBS) TESTS += ColorTest check_PROGRAMS += ColorTest ColorTest_SOURCES = ColorTest.cpp testutil.hpp ColorTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ColorTest_LDADD = $(TESTLIBS) TESTS += CommandLineTest check_PROGRAMS += CommandLineTest CommandLineTest_SOURCES = CommandLineTest.cpp testutil.hpp CommandLineTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CommandLineTest_LDADD = $(TESTLIBS) TESTS += DependencyGraphTest check_PROGRAMS += DependencyGraphTest DependencyGraphTest_SOURCES = DependencyGraphTest.cpp testutil.hpp DependencyGraphTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DependencyGraphTest_LDADD = $(TESTLIBS) TESTS += DirectoryTest check_PROGRAMS += DirectoryTest DirectoryTest_SOURCES = DirectoryTest.cpp testutil.hpp DirectoryTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DirectoryTest_LDADD = $(TESTLIBS) TESTS += DVIReaderTest check_PROGRAMS += DVIReaderTest DVIReaderTest_SOURCES = DVIReaderTest.cpp testutil.hpp DVIReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DVIReaderTest_LDADD = $(TESTLIBS) TESTS += DvisvgmSpecialTest check_PROGRAMS += DvisvgmSpecialTest DvisvgmSpecialTest_SOURCES = DvisvgmSpecialTest.cpp testutil.hpp DvisvgmSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DvisvgmSpecialTest_LDADD = $(TESTLIBS) TESTS += EllipticalArcTest check_PROGRAMS += EllipticalArcTest EllipticalArcTest_SOURCES = EllipticalArcTest.cpp testutil.hpp EllipticalArcTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) EllipticalArcTest_LDADD = $(TESTLIBS) TESTS += EmSpecialTest check_PROGRAMS += EmSpecialTest EmSpecialTest_SOURCES = EmSpecialTest.cpp testutil.hpp EmSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) EmSpecialTest_LDADD = $(TESTLIBS) TESTS += FileFinderTest check_PROGRAMS += FileFinderTest FileFinderTest_SOURCES = FileFinderTest.cpp testutil.hpp FileFinderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FileFinderTest_LDADD = $(TESTLIBS) TESTS += FilePathTest check_PROGRAMS += FilePathTest FilePathTest_SOURCES = FilePathTest.cpp testutil.hpp FilePathTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FilePathTest_LDADD = $(TESTLIBS) TESTS += FileSystemTest check_PROGRAMS += FileSystemTest FileSystemTest_SOURCES = FileSystemTest.cpp testutil.hpp FileSystemTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FileSystemTest_LDADD = $(TESTLIBS) TESTS += FontCacheTest check_PROGRAMS += FontCacheTest FontCacheTest_SOURCES = FontCacheTest.cpp testutil.hpp FontCacheTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FontCacheTest_LDADD = $(TESTLIBS) TESTS += FontManagerTest check_PROGRAMS += FontManagerTest FontManagerTest_SOURCES = FontManagerTest.cpp testutil.hpp FontManagerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FontManagerTest_LDADD = $(TESTLIBS) TESTS += FontMapTest check_PROGRAMS += FontMapTest FontMapTest_SOURCES = FontMapTest.cpp testutil.hpp FontMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FontMapTest_LDADD = $(TESTLIBS) TESTS += GFGlyphTracerTest check_PROGRAMS += GFGlyphTracerTest GFGlyphTracerTest_SOURCES = GFGlyphTracerTest.cpp testutil.hpp GFGlyphTracerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GFGlyphTracerTest_LDADD = $(TESTLIBS) TESTS += GFReaderTest check_PROGRAMS += GFReaderTest GFReaderTest_SOURCES = GFReaderTest.cpp testutil.hpp GFReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GFReaderTest_LDADD = $(TESTLIBS) TESTS += GhostscriptTest check_PROGRAMS += GhostscriptTest GhostscriptTest_SOURCES = GhostscriptTest.cpp testutil.hpp GhostscriptTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GhostscriptTest_LDADD = $(TESTLIBS) TESTS += GraphicsPathTest check_PROGRAMS += GraphicsPathTest GraphicsPathTest_SOURCES = GraphicsPathTest.cpp testutil.hpp GraphicsPathTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GraphicsPathTest_LDADD = $(TESTLIBS) TESTS += HashFunctionTest check_PROGRAMS += HashFunctionTest HashFunctionTest_SOURCES = HashFunctionTest.cpp testutil.hpp HashFunctionTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) HashFunctionTest_LDADD = $(TESTLIBS) TESTS += JFMReaderTest check_PROGRAMS += JFMReaderTest JFMReaderTest_SOURCES = JFMReaderTest.cpp testutil.hpp JFMReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) JFMReaderTest_LDADD = $(TESTLIBS) TESTS += LengthTest check_PROGRAMS += LengthTest LengthTest_SOURCES = LengthTest.cpp testutil.hpp LengthTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) LengthTest_LDADD = $(TESTLIBS) TESTS += MapLineTest check_PROGRAMS += MapLineTest MapLineTest_SOURCES = MapLineTest.cpp testutil.hpp MapLineTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) MapLineTest_LDADD = $(TESTLIBS) TESTS += MatrixTest check_PROGRAMS += MatrixTest MatrixTest_SOURCES = MatrixTest.cpp testutil.hpp MatrixTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) MatrixTest_LDADD = $(TESTLIBS) TESTS += MessageExceptionTest check_PROGRAMS += MessageExceptionTest MessageExceptionTest_SOURCES = MessageExceptionTest.cpp testutil.hpp MessageExceptionTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) MessageExceptionTest_LDADD = $(TESTLIBS) TESTS += PageRagesTest check_PROGRAMS += PageRagesTest PageRagesTest_SOURCES = PageRagesTest.cpp testutil.hpp PageRagesTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PageRagesTest_LDADD = $(TESTLIBS) TESTS += PageSizeTest check_PROGRAMS += PageSizeTest PageSizeTest_SOURCES = PageSizeTest.cpp testutil.hpp PageSizeTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PageSizeTest_LDADD = $(TESTLIBS) TESTS += PairTest check_PROGRAMS += PairTest PairTest_SOURCES = PairTest.cpp testutil.hpp PairTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PairTest_LDADD = $(TESTLIBS) TESTS += PapersizeSpecialTest check_PROGRAMS += PapersizeSpecialTest PapersizeSpecialTest_SOURCES = PapersizeSpecialTest.cpp testutil.hpp PapersizeSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PapersizeSpecialTest_LDADD = $(TESTLIBS) TESTS += PDFParserTest check_PROGRAMS += PDFParserTest PDFParserTest_SOURCES = PDFParserTest.cpp testutil.hpp PDFParserTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PDFParserTest_LDADD = $(TESTLIBS) TESTS += PSInterpreterTest check_PROGRAMS += PSInterpreterTest PSInterpreterTest_SOURCES = PSInterpreterTest.cpp testutil.hpp PSInterpreterTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PSInterpreterTest_LDADD = $(TESTLIBS) TESTS += RangeMapTest check_PROGRAMS += RangeMapTest RangeMapTest_SOURCES = RangeMapTest.cpp testutil.hpp RangeMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) RangeMapTest_LDADD = $(TESTLIBS) TESTS += ShadingPatchTest check_PROGRAMS += ShadingPatchTest ShadingPatchTest_SOURCES = ShadingPatchTest.cpp testutil.hpp ShadingPatchTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ShadingPatchTest_LDADD = $(TESTLIBS) TESTS += SpecialManagerTest check_PROGRAMS += SpecialManagerTest SpecialManagerTest_SOURCES = SpecialManagerTest.cpp testutil.hpp SpecialManagerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SpecialManagerTest_LDADD = $(TESTLIBS) TESTS += SplittedCharInputBufferTest check_PROGRAMS += SplittedCharInputBufferTest SplittedCharInputBufferTest_SOURCES = SplittedCharInputBufferTest.cpp testutil.hpp SplittedCharInputBufferTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SplittedCharInputBufferTest_LDADD = $(TESTLIBS) TESTS += StreamInputBufferTest check_PROGRAMS += StreamInputBufferTest StreamInputBufferTest_SOURCES = StreamInputBufferTest.cpp testutil.hpp StreamInputBufferTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StreamInputBufferTest_LDADD = $(TESTLIBS) TESTS += StreamReaderTest check_PROGRAMS += StreamReaderTest StreamReaderTest_SOURCES = StreamReaderTest.cpp testutil.hpp StreamReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StreamReaderTest_LDADD = $(TESTLIBS) TESTS += StreamWriterTest check_PROGRAMS += StreamWriterTest StreamWriterTest_SOURCES = StreamWriterTest.cpp testutil.hpp StreamWriterTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StreamWriterTest_LDADD = $(TESTLIBS) TESTS += StringMatcherTest check_PROGRAMS += StringMatcherTest StringMatcherTest_SOURCES = StringMatcherTest.cpp testutil.hpp StringMatcherTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StringMatcherTest_LDADD = $(TESTLIBS) TESTS += SubfontTest check_PROGRAMS += SubfontTest SubfontTest_SOURCES = SubfontTest.cpp testutil.hpp SubfontTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SubfontTest_LDADD = $(TESTLIBS) TESTS += SVGOutputTest check_PROGRAMS += SVGOutputTest SVGOutputTest_SOURCES = SVGOutputTest.cpp testutil.hpp SVGOutputTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SVGOutputTest_LDADD = $(TESTLIBS) TESTS += TensorProductPatchTest check_PROGRAMS += TensorProductPatchTest TensorProductPatchTest_SOURCES = TensorProductPatchTest.cpp testutil.hpp TensorProductPatchTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TensorProductPatchTest_LDADD = $(TESTLIBS) TESTS += TFMReaderTest check_PROGRAMS += TFMReaderTest TFMReaderTest_SOURCES = TFMReaderTest.cpp testutil.hpp TFMReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TFMReaderTest_LDADD = $(TESTLIBS) TESTS += ToUnicodeMapTest check_PROGRAMS += ToUnicodeMapTest ToUnicodeMapTest_SOURCES = ToUnicodeMapTest.cpp testutil.hpp ToUnicodeMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ToUnicodeMapTest_LDADD = $(TESTLIBS) TESTS += TpicSpecialTest check_PROGRAMS += TpicSpecialTest TpicSpecialTest_SOURCES = TpicSpecialTest.cpp testutil.hpp TpicSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TpicSpecialTest_LDADD = $(TESTLIBS) TESTS += TriangularPatchTest check_PROGRAMS += TriangularPatchTest TriangularPatchTest_SOURCES = TriangularPatchTest.cpp testutil.hpp TriangularPatchTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TriangularPatchTest_LDADD = $(TESTLIBS) TESTS += UnicodeTest check_PROGRAMS += UnicodeTest UnicodeTest_SOURCES = UnicodeTest.cpp testutil.hpp UnicodeTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) UnicodeTest_LDADD = $(TESTLIBS) TESTS += UtilityTest check_PROGRAMS += UtilityTest UtilityTest_SOURCES = UtilityTest.cpp testutil.hpp UtilityTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) UtilityTest_LDADD = $(TESTLIBS) TESTS += VectorIteratorTest check_PROGRAMS += VectorIteratorTest VectorIteratorTest_SOURCES = VectorIteratorTest.cpp testutil.hpp VectorIteratorTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) VectorIteratorTest_LDADD = $(TESTLIBS) TESTS += VectorStreamTest check_PROGRAMS += VectorStreamTest VectorStreamTest_SOURCES = VectorStreamTest.cpp testutil.hpp VectorStreamTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) VectorStreamTest_LDADD = $(TESTLIBS) TESTS += XMLNodeTest check_PROGRAMS += XMLNodeTest XMLNodeTest_SOURCES = XMLNodeTest.cpp testutil.hpp XMLNodeTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) XMLNodeTest_LDADD = $(TESTLIBS) TESTS += XMLStringTest check_PROGRAMS += XMLStringTest XMLStringTest_SOURCES = XMLStringTest.cpp testutil.hpp XMLStringTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) XMLStringTest_LDADD = $(TESTLIBS) EXTRA_DIST += check-conv genhashcheck.py normalize.xsl TESTS += check-conv @CODE_COVERAGE_RULES@ CLEANFILES = *.gcda *.gcno hashcheck.cpp dvisvgm-2.8.1/tests/EmSpecialTest.cpp0000664000175000017500000001647513510660062014510 00000000000000/************************************************************************* ** EmSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "EmSpecialHandler.hpp" #include "SpecialActions.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" #include "SVGTree.hpp" using namespace std; class EmSpecialTest : public ::testing::Test { protected: class ActionsRecorder : public EmptySpecialActions { public: ActionsRecorder () : x(), y() {} void embed (const BoundingBox &bb) override {bbox.embed(bb);} void setX (double xx) override {x = xx;} void setY (double yy) override {x = yy;} double getX () const override {return x;} double getY () const override {return y;} Color getColor () const override {return color;} void setColor (const Color &c) override {color = c;} string getPageXML () const {ostringstream oss; oss << *svgTree().pageNode(); return oss.str();} const Matrix& getMatrix () const override {static Matrix m(1); return m;} void clear () { SpecialActions::svgTree().reset(); SpecialActions::svgTree().newPage(1); bbox = BoundingBox(0, 0, 0, 0); } /* void write (ostream &os) const { os << "page: " << page << '\n' << "bbox: " << bbox.toSVGViewBox() << '\n'; } */ private: double x, y; BoundingBox bbox; Color color; }; class MyEmSpecialHandler : public EmSpecialHandler { public: explicit MyEmSpecialHandler (SpecialActions &a) : actions(a) {} void finishPage () {dviEndPage(0, actions);} void processSpecial (const string &str) {stringstream ss; ss << str; process("em", ss, actions);} protected: SpecialActions &actions; }; public: EmSpecialTest () : handler(recorder) {} void SetUp () override { XMLString::DECIMAL_PLACES=2; recorder.clear(); } protected: ActionsRecorder recorder; MyEmSpecialHandler handler; }; TEST_F(EmSpecialTest, basic) { EXPECT_EQ(handler.name(), "em"); } TEST_F(EmSpecialTest, lines1) { DPair p[] = {DPair(0,0), DPair(0,10), DPair(10,10), DPair(10,0)}; int n = sizeof(p)/sizeof(DPair); for (int i=0; i < n; i++) { recorder.setX(p[i].x()); recorder.setY(p[i].y()); handler.processSpecial(string("point ")+XMLString(i)); } EXPECT_EQ(recorder.getPageXML(), ""); handler.processSpecial("linewidth 2bp"); for (int i=0; i < n; i++) handler.processSpecial(string("line ")+XMLString(i)+", "+XMLString((i+1)%n)); EXPECT_EQ(recorder.getPageXML(), "\n" "\n" "\n" "\n" "\n" "" ); } TEST_F(EmSpecialTest, lines2) { DPair p[] = {DPair(0,0), DPair(0,10), DPair(10,10), DPair(10,0)}; int n = sizeof(p)/sizeof(DPair); handler.processSpecial("linewidth 2bp"); // define lines prior to the points for (int i=0; i < n; i++) handler.processSpecial(string("line ")+XMLString(i)+", "+XMLString((i+1)%n)); // define points for (int i=0; i < n; i++) { recorder.setX(p[i].x()); recorder.setY(p[i].y()); handler.processSpecial(string("point ")+XMLString(i)); } handler.finishPage(); EXPECT_EQ(recorder.getPageXML(), "\n" "\n" "\n" "\n" "\n" "" ); } TEST_F(EmSpecialTest, pline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1, 2, 10bp"); EXPECT_EQ(recorder.getPageXML(), "\n\n"); } TEST_F(EmSpecialTest, vline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1v, 2v, 10bp"); // cut line ends vertically EXPECT_EQ(recorder.getPageXML(), "\n\n"); } TEST_F(EmSpecialTest, hline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1h, 2h, 10bp"); // cut line ends horizontally EXPECT_EQ(recorder.getPageXML(), "\n\n"); } TEST_F(EmSpecialTest, hvline) { handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1h, 2v, 10bp"); // cut line ends horizontally EXPECT_EQ(recorder.getPageXML(), "\n\n"); recorder.clear(); recorder.setColor(Color(0.0, 0.0, 1.0)); handler.processSpecial("point 1, 10, 10"); handler.processSpecial("point 2, 100, 100"); handler.processSpecial("line 1v, 2h, 10bp"); // cut line ends horizontally EXPECT_EQ(recorder.getPageXML(), "\n\n"); } TEST_F(EmSpecialTest, lineto) { DPair p[] = {DPair(0,0), DPair(0,10), DPair(10,10), DPair(10,0)}; int n = sizeof(p)/sizeof(DPair); recorder.setColor(Color(1.0, 0.0, 0.0)); for (int i=0; i <= n; i++) { recorder.setX(p[i%n].x()); recorder.setY(p[i%n].y()); handler.processSpecial("linewidth "+XMLString(2*i)+"bp"); handler.processSpecial(i == 0 ? "moveto" : "lineto"); } EXPECT_EQ(recorder.getPageXML(), "\n" "\n" "\n" "\n" "\n" "" ); } dvisvgm-2.8.1/tests/MessageExceptionTest.cpp0000664000175000017500000000441313510660062016076 00000000000000/************************************************************************* ** MessageExceptionTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "MessageException.hpp" using namespace std; static void throw_exception (const string &msg) { throw MessageException(msg); } TEST(MessageExceptionTest, catch_direct) { bool caught=false; try { throw_exception("test message"); FAIL(); } catch (MessageException &e) { ASSERT_STREQ(e.what(), "test message"); caught = true; } catch (...) { FAIL(); } ASSERT_TRUE(caught); } TEST(MessageExceptionTest, catch_indirect1) { bool caught=false; try { throw_exception("test message"); FAIL(); } catch (exception &e) { ASSERT_STREQ(e.what(), "test message"); caught = true; } catch (...) { FAIL(); } ASSERT_TRUE(caught); } TEST(MessageExceptionTest, catch_indirect2) { bool caught=false; try { throw_exception("test message"); FAIL(); } catch (...) { caught = true; } ASSERT_TRUE(caught); } dvisvgm-2.8.1/tests/GFReaderTest.cpp0000664000175000017500000003130113510660062014246 00000000000000/************************************************************************* ** GFReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include "GFReader.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; struct PixelActions : public Bitmap::Callback { void pixel (int x, int y, bool set, const Bitmap &bm) { if (charmap.size() == 0) { charmap.resize(bm.height()); for (int i=0; i < bm.height(); i++) charmap[i] = string(bm.width(), ' '); } EXPECT_GE(x, 0); EXPECT_LT(x, bm.width()); EXPECT_GE(y, 0); EXPECT_LT(y, bm.height()); charmap[y][x] = (set ? '*' : '-'); } vector charmap; }; const char *letter_a[] = { "-----------********--------------------", "--------**************-----------------", "------*****-------******---------------", "-----***------------*****--------------", "----*****------------******------------", "---*******------------******-----------", "---********-----------******-----------", "---********------------******----------", "---********------------******----------", "---********-------------******---------", "----******--------------******---------", "-----****---------------******---------", "------------------------******---------", "------------------------******---------", "------------------------******---------", "------------------------******---------", "-----------------*************---------", "-------------*****************---------", "----------*********-----******---------", "--------*******---------******---------", "------*******-----------******---------", "----********------------******---------", "---*******--------------******---------", "--********--------------******---------", "-********---------------******---------", "-*******----------------******---------", "-*******----------------******------**-", "*******-----------------******------**-", "*******-----------------******------**-", "*******-----------------******------**-", "*******----------------*******------**-", "*******----------------*******------**-", "********--------------********------**-", "-*******-------------***-*****------**-", "-********------------**---*****----**--", "--********---------****---*****----**--", "----*******------****------*********---", "------**************--------*******----", "---------********------------*****-----", }; const char *letter_g[] = { "------------------------------******---", "------------********--------*********--", "----------************----****----****-", "--------*****------*****-***-----*****-", "-------*****--------*******------*****-", "------*****----------*****-------*****-", "-----*****------------*****--------*---", "----******------------******-----------", "----******------------******-----------", "---******--------------******----------", "---******--------------******----------", "---******--------------******----------", "---******--------------******----------", "---******--------------******----------", "---******--------------******----------", "---******--------------******----------", "---******--------------******----------", "----******------------******-----------", "----******------------******-----------", "-----*****------------*****------------", "------*****----------*****-------------", "------******--------*****--------------", "------*******------*****---------------", "-----***--************-----------------", "-----**-----********-------------------", "----***--------------------------------", "----***--------------------------------", "----***--------------------------------", "----***--------------------------------", "----****-------------------------------", "----****-------------------------------", "----******-----------------------------", "-----*********************-------------", "-----************************----------", "------*************************--------", "-------**************************------", "------****************************-----", "----*****----------------**********----", "---*****--------------------********---", "--*****-----------------------******---", "-*****-------------------------*****---", "-*****-------------------------******--", "*****---------------------------*****--", "*****---------------------------*****--", "*****---------------------------*****--", "*****---------------------------*****--", "*****---------------------------*****--", "******-------------------------******--", "-*****-------------------------*****---", "--*****-----------------------*****----", "--******---------------------******----", "----*****-------------------*****------", "-----******---------------******-------", "-------*******---------*******---------", "---------*******************-----------", "-------------***********---------------", }; const char *letter_M[] = { "****************-------------------------------------****************-", "*****************-----------------------------------*****************-", "*****************-----------------------------------*****************-", "-------**********-----------------------------------**********--------", "--------**-*******---------------------------------**-*******---------", "--------**-*******---------------------------------**-*******---------", "--------**--*******-------------------------------**--*******---------", "--------**--*******-------------------------------**--*******---------", "--------**--*******-------------------------------**--*******---------", "--------**---*******-----------------------------**---*******---------", "--------**---*******-----------------------------**---*******---------", "--------**---*******-----------------------------**---*******---------", "--------**----*******---------------------------**----*******---------", "--------**----*******---------------------------**----*******---------", "--------**-----*******-------------------------**-----*******---------", "--------**-----*******-------------------------**-----*******---------", "--------**-----*******-------------------------**-----*******---------", "--------**------*******-----------------------**------*******---------", "--------**------*******-----------------------**------*******---------", "--------**-------*******---------------------**-------*******---------", "--------**-------*******---------------------**-------*******---------", "--------**-------*******---------------------**-------*******---------", "--------**--------*******-------------------**--------*******---------", "--------**--------*******-------------------**--------*******---------", "--------**--------*******-------------------**--------*******---------", "--------**---------*******-----------------**---------*******---------", "--------**---------*******-----------------**---------*******---------", "--------**----------*******---------------**----------*******---------", "--------**----------*******---------------**----------*******---------", "--------**----------*******---------------**----------*******---------", "--------**-----------*******-------------**-----------*******---------", "--------**-----------*******-------------**-----------*******---------", "--------**------------*******-----------**------------*******---------", "--------**------------*******-----------**------------*******---------", "--------**------------*******-----------**------------*******---------", "--------**-------------*******---------**-------------*******---------", "--------**-------------*******---------**-------------*******---------", "--------**-------------*******---------**-------------*******---------", "--------**--------------*******-------**--------------*******---------", "--------**--------------*******-------**--------------*******---------", "--------**---------------*******-----**---------------*******---------", "--------**---------------*******-----**---------------*******---------", "--------**---------------*******-----**---------------*******---------", "--------**----------------*******---**----------------*******---------", "--------**----------------*******---**----------------*******---------", "--------**-----------------*******-**-----------------*******---------", "--------**-----------------*******-**-----------------*******---------", "--------**-----------------*******-**-----------------*******---------", "--------**------------------********------------------*******---------", "--------**------------------********------------------*******---------", "--------**------------------********------------------*******---------", "-------****------------------******-------------------*******---------", "------******-----------------******-------------------*******---------", "----**********----------------****-------------------*********--------", "******************------------****------------***********************-", "******************------------****------------***********************-", "******************-------------**-------------***********************-", }; static void check_letter (const char **lettermap, const vector &charmap) { for (size_t i=0; i < charmap.size(); i++) ASSERT_EQ(lettermap[i], charmap[charmap.size()-i-1]); } class LoggingGFReader : public GFReader { public: LoggingGFReader (istream &is) : GFReader(is) {} void preamble (const string &str) override {_info = str;} string getInfo () const {return _info;} private: string _info; }; TEST(GFReaderTest, preamble) { string gf = string(SRCDIR)+"/data/cmr10.600gf"; ifstream ifs(gf, ios::binary); ASSERT_TRUE(bool(ifs)); LoggingGFReader gfReader(ifs); gfReader.executePreamble(); ASSERT_EQ(gfReader.getInfo(), " METAFONT output 2010.06.18:1911"); } TEST(GFReaderTest, postamble) { string gf = string(SRCDIR)+"/data/cmr10.600gf"; ifstream ifs(gf, ios::binary); ASSERT_TRUE(bool(ifs)); GFReader gfReader(ifs); gfReader.executePostamble(); const double bp2pt = 72.27/72.0; ASSERT_DOUBLE_EQ(gfReader.getDesignSize()*bp2pt, 10); ASSERT_NEAR(gfReader.getHPixelsPerPoint(), 8.333, 0.001); ASSERT_NEAR(gfReader.getVPixelsPerPoint(), 8.333, 0.001); } TEST(GFReaderTest, executeChar) { string gf = string(SRCDIR)+"/data/cmr10.600gf"; ifstream ifs(gf, ios::binary); ASSERT_TRUE(bool(ifs)); GFReader gfReader(ifs); PixelActions actions; { gfReader.executeChar('a'); ASSERT_EQ(gfReader.getBitmap().width(), 39); ASSERT_EQ(gfReader.getBitmap().height(), 39); SCOPED_TRACE("A"); gfReader.getBitmap().forAllPixels(actions); check_letter(letter_a, actions.charmap); }{ actions.charmap.clear(); gfReader.executeChar('g'); ASSERT_EQ(gfReader.getBitmap().width(), 39); ASSERT_EQ(gfReader.getBitmap().height(), 56); SCOPED_TRACE("B"); gfReader.getBitmap().forAllPixels(actions); check_letter(letter_g, actions.charmap); }{ actions.charmap.clear(); gfReader.executeChar('M'); ASSERT_EQ(gfReader.getBitmap().width(), 70); ASSERT_EQ(gfReader.getBitmap().height(), 57); SCOPED_TRACE("C"); gfReader.getBitmap().forAllPixels(actions); check_letter(letter_M, actions.charmap); } } TEST(GFReaderTest, executeAllChars) { string gf = string(SRCDIR)+"/data/cmr10.600gf"; ifstream ifs(gf, ios::binary); ASSERT_TRUE(bool(ifs)); GFReader gfReader(ifs); gfReader.executeAllChars(); const double bp2pt = 72.27/72.0; ASSERT_NEAR(gfReader.getCharWidth('M')*bp2pt, 0.573, 0.001); ASSERT_NEAR(gfReader.getCharWidth('g')*bp2pt, 0.313, 0.001); } dvisvgm-2.8.1/tests/PDFParserTest.cpp0000664000175000017500000002040413510660062014417 00000000000000/************************************************************************* ** PDFParserTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "PDFParser.hpp" using namespace std; TEST(PDFParserTest, empty) { PDFParser parser; vector objects = parser.parse(""); EXPECT_TRUE(objects.empty()); objects = parser.parse(" \n \r %comment 1 2 3 "); EXPECT_TRUE(objects.empty()); } TEST(PDFParserTest, numbers) { PDFParser parser; vector objects = parser.parse("5 1 +2 -3 1.1 9. .1 -7.2"); ASSERT_EQ(objects.size(), 8u); size_t count=0; for (int n : {5, 1, 2, -3}) { ASSERT_NE(objects[count].get(), nullptr); EXPECT_EQ(*objects[count++].get(), n); } for (double n : {1.1, 9.0, 0.1, -7.2}) { ASSERT_NE(objects[count].get(), nullptr); EXPECT_DOUBLE_EQ(*objects[count++].get(), n); } } TEST(PDFParserTest, literal_strings) { PDFParser parser; vector objects = parser.parse("()"); ASSERT_EQ(objects.size(), 1u); ASSERT_NE(objects[0].get(), nullptr); EXPECT_TRUE(objects[0].get()->empty()); objects = parser.parse("(literal string) (balanced (bra(ck)ets) inside)(a\\n\\(b\\c)"); ASSERT_EQ(objects.size(), 3u); size_t count=0; for (string str : {"literal string", "balanced (bra(ck)ets) inside", "a\n(bc"}) { ASSERT_NE(objects[count].get(), nullptr); ASSERT_EQ(*objects[count++].get(), str); } objects = parser.parse(R"*( ( octal \1\12\123\1234 ))*"); ASSERT_EQ(objects.size(), 1u); ASSERT_NE(objects[0].get(), nullptr); EXPECT_EQ(objects[0].get()->size(), 13u); EXPECT_EQ(*objects[0].get(), " octal \001\012\123\1234 "); objects = parser.parse("(split \\\nline)"); ASSERT_EQ(objects.size(), 1u); ASSERT_NE(objects[0].get(), nullptr); EXPECT_EQ(*objects[0].get(), "split line"); EXPECT_THROW(parser.parse("(missing parentheses"), PDFException); } TEST(PDFParserTest, hex_strings) { PDFParser parser; vector objects = parser.parse("<>< ><\n\r\f>"); ASSERT_EQ(objects.size(), 3u); for (size_t i=0; i < objects.size(); i++) { ASSERT_NE(objects[i].get(), nullptr); EXPECT_TRUE(objects[i].get()->empty()); } objects = parser.parse("<202>"); ASSERT_EQ(objects.size(), 1u); ASSERT_NE(objects[0].get(), nullptr); EXPECT_EQ(*objects[0].get(), " "); objects = parser.parse("<616263646566 6768\n696A6b6c6D6E6F 7>"); ASSERT_EQ(objects.size(), 1u); ASSERT_NE(objects[0].get(), nullptr); EXPECT_EQ(*objects[0].get(), "abcdefghijklmnop"); EXPECT_THROW(parser.parse(""), PDFException); EXPECT_THROW(parser.parse(" objects = parser.parse("[1 2.0/name(string) [5] <6162>]"); ASSERT_EQ(objects.size(), 1u); const PDFArray *arr = objects[0].get(); ASSERT_NE(arr, nullptr); ASSERT_EQ(arr->size(), 6u); // integer number ASSERT_NE((*arr)[0].get(), nullptr); ASSERT_EQ(*(*arr)[0].get(), 1); // real number ASSERT_NE((*arr)[1].get(), nullptr); ASSERT_DOUBLE_EQ(*(*arr)[1].get(), 2.0); // name ASSERT_NE((*arr)[2].get(), nullptr); ASSERT_EQ(*(*arr)[2].get(), PDFName("name")); // literal string ASSERT_NE((*arr)[3].get(), nullptr); ASSERT_EQ(*(*arr)[3].get(), "string"); // inner array ASSERT_NE((*arr)[4].get(), nullptr); ASSERT_EQ((*arr)[4].get()->size(), 1u); ASSERT_NE((*arr)[4].get()->at(0).get(), nullptr); ASSERT_EQ(*(*arr)[4].get()->at(0).get(), 5); // hex string ASSERT_NE((*arr)[5].get(), nullptr); ASSERT_EQ(*(*arr)[5].get(), "ab"); } TEST(PDFParserTest, dictionary) { PDFParser parser; vector objects = parser.parse("<< >>"); ASSERT_EQ(objects.size(), 1u); const PDFDict *dict = objects[0].get(); ASSERT_NE(dict, nullptr); ASSERT_TRUE(dict->empty()); objects = parser.parse("<>"); ASSERT_EQ(objects.size(), 1u); dict = objects[0].get(); ASSERT_NE(dict, nullptr); ASSERT_EQ(dict->size(), 4u); // integer number ASSERT_NE(dict->find("int"), dict->end()); ASSERT_NE(dict->find("int")->second.get(), nullptr); EXPECT_EQ(*dict->find("int")->second.get(), 4); ASSERT_NE(dict->find("real"), dict->end()); ASSERT_NE(dict->find("real")->second.get(), nullptr); EXPECT_DOUBLE_EQ(*dict->find("real")->second.get(), 5.5); ASSERT_NE(dict->find("str"), dict->end()); ASSERT_NE(dict->find("str")->second.get(), nullptr); EXPECT_EQ(*dict->find("str")->second.get(), "string value"); ASSERT_NE(dict->find("color"), dict->end()); ASSERT_NE(dict->find("color")->second.get(), nullptr); const PDFArray &arr = *dict->find("color")->second.get(); ASSERT_EQ(arr.size(), 3u); EXPECT_EQ(*arr[0].get(), 0); EXPECT_EQ(*arr[1].get(), 1); EXPECT_EQ(*arr[2].get(), 1); EXPECT_EQ(dict->find("nokey"), dict->end()); EXPECT_THROW(parser.parse("<>"), PDFException); // missing value EXPECT_THROW(parser.parse("<"), PDFException); // missing ">" EXPECT_THROW(parser.parse("<>" } TEST(PDFParserTest, indirect_objects) { PDFParser parser; vector objects = parser.parse("1 0 obj\n1 2 3 4 5endobj 2 5 R"); ASSERT_EQ(objects.size(), 2u); ASSERT_NE(objects[0].get(), nullptr); EXPECT_EQ(objects[0].get()->objnum, 1); EXPECT_EQ(objects[0].get()->gennum, 0); ASSERT_NE(objects[1].get(), nullptr); EXPECT_EQ(objects[1].get()->objnum, 2); EXPECT_EQ(objects[1].get()->gennum, 5); EXPECT_THROW(parser.parse("1 obj\n1 2 3 4 5endobj"), PDFException); EXPECT_THROW(parser.parse("1 (string)obj\n1 2 3 4 5endobj"), PDFException); EXPECT_THROW(parser.parse("1 R"), PDFException); EXPECT_THROW(parser.parse("1 (string)R"), PDFException); } TEST(PDFParserTest, stream) { PDFParser parser; vector objects = parser.parse("stream\n1 2 3 4 endstream"); ASSERT_EQ(objects.size(), 1u); ASSERT_NE(objects[0].get(), nullptr); } TEST(PDFParserTest, ops1) { PDFParser parser; vector objects = parser.parse("@xpos 1op op2 1..2"); ASSERT_EQ(objects.size(), 4u); size_t count=0; for (string str : {"@xpos", "1op", "op2", "1..2"}) { ASSERT_NE(objects[count].get(), nullptr); ASSERT_EQ(objects[count++].get()->opname, str); } } TEST(PDFParserTest, ops2) { PDFParser parser; vector objects = parser.parse("@xpos 1op op2 @ypos", [](const string &str, vector &objects) { if (str == "@xpos" || str == "@ypos") objects.emplace_back(PDFObject(str == "@xpos" ? 1.23 : 3.21)); else objects.emplace_back(PDFOperator(str)); }); ASSERT_EQ(objects.size(), 4u); size_t count=0; for (string str : {"1.23", "1op", "op2", "3.21"}) { ASSERT_EQ(string(objects[count++]), str); } } dvisvgm-2.8.1/tests/DirectoryTest.cpp0000664000175000017500000000532513510660062014602 00000000000000/************************************************************************* ** DirectoryTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "Directory.hpp" #include "FileSystem.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; TEST(DirectoryTest, dirs) { const char *dirs_to_find[] = {"doc", "src", 0}; set found_dirs; Directory dir(string(SRCDIR)+"/.."); while (const char *dname = dir.read(Directory::ET_DIR)) found_dirs.insert(dname); for (const char **p=dirs_to_find; *p; ++p) { EXPECT_NE(found_dirs.find(*p), found_dirs.end()) << *p; } } TEST(DirectoryTest, file) { const char *files_to_find[] = { "Bitmap.cpp", "BoundingBox.cpp", "Calculator.cpp", "Directory.cpp", "DVIReader.cpp", "DVIToSVG.cpp", "DVIToSVGActions.cpp", "FileSystem.cpp", "Font.cpp", "FontEngine.cpp", "FontManager.cpp", "FontMap.cpp", "GFReader.cpp", "GFTracer.cpp", "FileFinder.cpp", "Message.cpp", "MetafontWrapper.cpp", "PageSize.cpp", "StreamReader.cpp", "TFM.cpp", "VFReader.cpp", "XMLDocument.cpp", "XMLNode.cpp", "XMLString.cpp", 0 }; set found_files; Directory dir(string(SRCDIR)+"/../src"); while (const char *fname = dir.read(Directory::ET_FILE)) found_files.insert(fname); for (const char **p=files_to_find; *p; ++p) { EXPECT_NE(found_files.find(*p), found_files.end()) << *p; } EXPECT_EQ(found_files.find("tests"), found_files.end()); } dvisvgm-2.8.1/tests/SplittedCharInputBufferTest.cpp0000664000175000017500000001242013510660062017370 00000000000000/************************************************************************* ** SplittedCharInputBufferTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "InputBuffer.hpp" #include "InputReader.hpp" using std::istringstream; TEST(SplittedCharInputBufferTest, get) { const char *buf1 = "abcdef"; const char *buf2 = "ghijklmnopqrstuvwxyz"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); bool ok=true; for (int i=0; !in.eof() && ok; i++) { EXPECT_LT(i, 26); EXPECT_EQ(in.get(), 'a'+i); ok = (i < 26); } } TEST(SplittedCharInputBufferTest, peek) { const char *buf1 = "abcdef"; const char *buf2 = "ghijklmnopqrstuvwxyz"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); EXPECT_EQ(in.peek(), 'a'); for (int i=0; i < 26; i++) EXPECT_EQ(in.peek(i), 'a'+i); EXPECT_EQ(in.peek(26), -1); } TEST(SplittedCharInputBufferTest, check) { const char *buf1 = "abcde"; const char *buf2 = "fghijklmnopqrstuvwxyz"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); EXPECT_TRUE(in.check("abc", false)); EXPECT_TRUE(in.check("abc", true)); EXPECT_TRUE(in.check("def", true)); EXPECT_TRUE(in.check("ghi", true)); EXPECT_TRUE(in.check("jkl", true)); EXPECT_TRUE(in.check("mnopqrst", false)); EXPECT_TRUE(in.check("mnopqrst", true)); EXPECT_TRUE(in.check("uvwxyz", true)); EXPECT_EQ(in.get(), -1); } TEST(SplittedCharInputBufferTest, skip) { const char *buf1 = "abcde"; const char *buf2 = "fghijklmnopqrstuvwxyz"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); in.skip(3); EXPECT_EQ(in.peek(), 'd'); in.skipUntil("ijk"); EXPECT_EQ(in.peek(), 'l'); in.skipUntil("z"); EXPECT_TRUE(in.eof()); } TEST(SplittedCharInputBufferTest, parseInt) { const char *buf1 = "1234,-"; const char *buf2 = "5,+6,10.-"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); int n; EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, 1234); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, -5); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, 6); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseInt(n)); EXPECT_EQ(n, 10); EXPECT_EQ(in.get(), '.'); EXPECT_FALSE(in.parseInt(n)); EXPECT_EQ(in.get(), '-'); } TEST(SplittedCharInputBufferTest, parseUInt_base) { const char *buf1 = "1234,-5,10,1a"; const char *buf2 = "bc,1234a"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); unsigned n; EXPECT_TRUE(in.parseUInt(10, n)); EXPECT_EQ(n, 1234u); EXPECT_EQ(in.get(), ','); EXPECT_FALSE(in.parseUInt(10, n)); in.get(); EXPECT_TRUE(in.parseUInt(10, n)); EXPECT_EQ(n, 5u); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseUInt(16, n)); EXPECT_EQ(n, 16u); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseUInt(16, n)); EXPECT_EQ(n, 0x1ABCu); EXPECT_EQ(in.get(), ','); EXPECT_TRUE(in.parseUInt(8, n)); EXPECT_EQ(n, 01234u); EXPECT_EQ(in.get(), 'a'); } TEST(SplittedCharInputBufferTest, parseDouble) { const char *buf1 = "1234,-5,6.12,-3"; const char *buf2 = ".1415,-.1,12e2,10.-"; SplittedCharInputBuffer buffer(buf1, strlen(buf1), buf2, strlen(buf2)); BufferInputReader in(buffer); double d; EXPECT_EQ(in.parseDouble(d), 'i'); EXPECT_EQ(d, 1234.0); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'i'); EXPECT_EQ(d, -5.0); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, 6.12); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, -3.1415); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, -0.1); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, 1200); EXPECT_EQ(in.get(), ','); EXPECT_EQ(in.parseDouble(d), 'f'); EXPECT_EQ(d, 10.0); EXPECT_EQ(in.peek(), '-'); EXPECT_FALSE(in.parseDouble(d)); EXPECT_EQ(in.get(), '-'); } dvisvgm-2.8.1/tests/TriangularPatchTest.cpp0000664000175000017500000001563213536435625015745 00000000000000/************************************************************************* ** TriangularPatchTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "TriangularPatch.hpp" using namespace std; TEST(TriangularPatchTest, construct) { TriangularPatch tp1(Color::ColorSpace::RGB); EXPECT_EQ(tp1.psShadingType(), 4); EXPECT_EQ(tp1.numPoints(0), 3); EXPECT_EQ(tp1.numColors(0), 3); EXPECT_EQ(tp1.numPoints(1), 1); EXPECT_EQ(tp1.numColors(1), 1); vector points(1); points[0] = DPair(10, 0); vector colors(1); TriangularPatch tp2(points, colors, Color::ColorSpace::RGB, 1, &tp1); EXPECT_EQ(tp1.psShadingType(), 4); LatticeTriangularPatch tp3(Color::ColorSpace::RGB); EXPECT_EQ(tp3.psShadingType(), 5); } TEST(TriangularPatchTest, valueAt) { vector points(3); points[0] = DPair(0, 0); points[1] = DPair(10, 0); points[2] = DPair(0, 10); vector colors(3); TriangularPatch tp1(points, colors, Color::ColorSpace::RGB, 0, 0); EXPECT_EQ(tp1.valueAt(0, 0), DPair(0,0)); EXPECT_EQ(tp1.valueAt(1, 0), DPair(10,0)); EXPECT_EQ(tp1.valueAt(0, 1), DPair(0,10)); points.resize(1); colors.resize(1); points[0] = DPair(10, 10); TriangularPatch tp2(points, colors, Color::ColorSpace::RGB, 1, &tp1); EXPECT_EQ(tp2.valueAt(0, 0), DPair(10,10)); EXPECT_EQ(tp2.valueAt(1, 0), DPair(10,0)); EXPECT_EQ(tp2.valueAt(0, 1), DPair(0,10)); TriangularPatch tp3(points, colors, Color::ColorSpace::RGB, 2, &tp1); EXPECT_EQ(tp3.valueAt(0, 0), DPair(10,10)); EXPECT_EQ(tp3.valueAt(1, 0), DPair(0,10)); EXPECT_EQ(tp3.valueAt(0, 1), DPair(0,0)); tp1.setPoints(DPair(20,20), DPair(20,40), DPair(40,20)); EXPECT_EQ(tp1.valueAt(0, 0), DPair(20,20)); EXPECT_EQ(tp1.valueAt(1, 0), DPair(20,40)); EXPECT_EQ(tp1.valueAt(0, 1), DPair(40,20)); } TEST(TriangularPatchTest, colorAt) { vector points(3); vector colors(3); colors[0] = Color(1.0, 0.0, 0.0); colors[1] = Color(0.0, 1.0, 0.0); colors[2] = Color(0.0, 0.0, 1.0); TriangularPatch tp1(points, colors, Color::ColorSpace::RGB, 0, 0); EXPECT_EQ(tp1.colorAt(0, 0), Color(1.0, 0.0, 0.0)); EXPECT_EQ(tp1.colorAt(1, 0), Color(0.0, 1.0, 0.0)); EXPECT_EQ(tp1.colorAt(0, 1), Color(0.0, 0.0, 1.0)); points.resize(1); colors.resize(1); colors[0] = Color(1.0, 1.0, 0.0); TriangularPatch tp2(points, colors, Color::ColorSpace::RGB, 1, &tp1); EXPECT_EQ(tp2.colorAt(0, 0), Color(1.0, 1.0, 0.0)); EXPECT_EQ(tp2.colorAt(1, 0), Color(0.0, 1.0, 0.0)); EXPECT_EQ(tp2.colorAt(0, 1), Color(0.0, 0.0, 1.0)); TriangularPatch tp3(points, colors, Color::ColorSpace::RGB, 2, &tp1); EXPECT_EQ(tp3.colorAt(0, 0), Color(1.0, 1.0, 0.0)); EXPECT_EQ(tp3.colorAt(1, 0), Color(0.0, 0.0, 1.0)); EXPECT_EQ(tp3.colorAt(0, 1), Color(1.0, 0.0, 0.0)); tp1.setColors(Color(1.0, 1.0, 0.0), Color(1.0, 0.0, 1.0), Color(0.0, 1.0, 1.0)); EXPECT_EQ(tp1.colorAt(0, 0), Color(1.0, 1.0, 0.0)); EXPECT_EQ(tp1.colorAt(1, 0), Color(1.0, 0.0, 1.0)); EXPECT_EQ(tp1.colorAt(0, 1), Color(0.0, 1.0, 1.0)); } TEST(TriangularPatchTest, averageColor) { vector points(3); vector colors(3); colors[0] = Color(1.0, 0.0, 0.0); colors[1] = Color(0.0, 1.0, 0.0); colors[2] = Color(0.0, 0.0, 1.0); TriangularPatch tp(points, colors, Color::ColorSpace::RGB, 0, 0); EXPECT_EQ(tp.averageColor(), Color(uint8_t(85), uint8_t(85), uint8_t(85))); } TEST(TriangularPatchTest, bbox) { vector points(3); points[0] = DPair(0, 0); points[1] = DPair(10, 0); points[2] = DPair(0, 10); vector colors(3); TriangularPatch tp(points, colors, Color::ColorSpace::RGB, 0, 0); BoundingBox bbox = tp.getBBox(); EXPECT_EQ(bbox, BoundingBox(0, 0, 10, 10)); } TEST(TriangularPatchTest, boundaryPath) { vector points(3); points[0] = DPair(0, 0); points[1] = DPair(10, 0); points[2] = DPair(0, 10); vector colors(3); TriangularPatch tp(points, colors, Color::ColorSpace::RGB, 0, 0); GraphicsPath path = tp.getBoundaryPath(); ostringstream oss; path.writeSVG(oss, false); EXPECT_EQ(oss.str(), "M0 0H10L0 10Z"); } class Callback : public ShadingPatch::Callback { public: void patchSegment (GraphicsPath &path, const Color &color) { ostringstream oss; path.writeSVG(oss, false); _pathstr += oss.str(); _colorstr += color.rgbString(); } string pathstr() const {return _pathstr;} string colorstr() const {return _colorstr;} void reset () {_pathstr.clear(); _colorstr.clear();} private: string _pathstr; string _colorstr; }; TEST(TriangularPatchTest, approximate) { vector points(3); points[0] = DPair(0, 0); points[1] = DPair(10, 0); points[2] = DPair(0, 10); vector colors(3); TriangularPatch tp(points, colors, Color::ColorSpace::RGB, 0, 0); Callback callback; tp.approximate(2, false, 0.1, callback); EXPECT_EQ(callback.pathstr(), "M0 0H10L0 10Z"); EXPECT_EQ(callback.colorstr(), "#000"); callback.reset(); tp.setColors(Color(1.0, 0.0, 0.0), Color(0.0, 1.0, 0.0), Color(0.0, 0.0, 1.0)); tp.approximate(2, false, 0.1, callback); EXPECT_EQ(callback.pathstr(), "M0 0H5L0 5ZM0 5L5 0V5ZM0 5H5L0 10ZM5 0H10L5 5Z"); EXPECT_EQ(callback.colorstr(), "#aa2b2b#555#2b2baa#2baa2b"); } TEST(TriangularPatchTest, fail) { vector points(3); vector colors(3); TriangularPatch tp(points, colors, Color::ColorSpace::RGB, 0, 0); EXPECT_THROW(tp.setColors(colors, 1, 0), ShadingException); for (int i=1; i <= 3; i++) { EXPECT_THROW(TriangularPatch(points, colors, Color::ColorSpace::RGB, i, 0), ShadingException); } points.resize(2); EXPECT_THROW(TriangularPatch(points, colors, Color::ColorSpace::RGB, 0, 0), ShadingException); points.resize(3); colors.resize(2); EXPECT_THROW(TriangularPatch(points, colors, Color::ColorSpace::RGB, 0, 0), ShadingException); } dvisvgm-2.8.1/tests/testmain.cpp0000664000175000017500000000371713510660062013625 00000000000000/************************************************************************* ** testmain.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileFinder.hpp" #ifndef SRCDIR #define SRCDIR "." #endif std::string TEST_ARGV0; struct TestEnvironment : public testing::Environment { void SetUp () override { FileFinder::init(TEST_ARGV0, "dvisvgm-test", false); FileFinder::instance().addLookupDir(SRCDIR); FileFinder::instance().addLookupDir(SRCDIR"/data"); } }; GTEST_API_ int main (int argc, char **argv) { TEST_ARGV0 = argv[0]; testing::InitGoogleTest(&argc, argv); testing::AddGlobalTestEnvironment(new TestEnvironment); return RUN_ALL_TESTS(); } dvisvgm-2.8.1/tests/data/0000775000175000017500000000000013563265650012272 500000000000000dvisvgm-2.8.1/tests/data/cidjmgr0-h.tfm0000664000175000017500000000471413510660062014640 00000000000000 Gs TEX KANJI TEXT OTF KANJI3W3X3Y3Z3[3\3]3^3_3`3a3b3c3d3e3f3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3{3|3}3~4!4"4#4$4%4&4'4(4)4*4+4,4-4.4/404142434445464748494:4;4<4=4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}4~5!5"5#5$5%5&5'5(5)5*5+5,5-5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~6!6"6#6$6%6&6'6(6)6*6+6,6-6.6/606162636465666768696:6;6<6=6>6?6@6A6B6C6D6E6F6G6H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w6x6y6z6{6|6}6~7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/707172737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7n7o7p7q7r7s7t7u7v7w7x7y7z7{7|7}7~8!8"8#8$8%8&8'8(8)8*8+8,8-8.8/808182838485868788898:8;8<8=8>8?8@8A8B8C8D8E8F8G8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8W8X8Y8Z8[8\8]8^8_8`8a8b8c8d8e8f8g8h8i8j8k8l8m8n8o8p8q8r8s8t8u8v8w8x8y8z8{8|8}8~9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h{33dvisvgm-2.8.1/tests/data/frktest-nf-cmp.svg0000664000175000017500000122301313510660062015561 00000000000000 dvisvgm-2.8.1/tests/data/sample-nf-cmp.svg0000664000175000017500000016635613510660062015377 00000000000000 dvisvgm-2.8.1/tests/data/sample.dvi0000664000175000017500000000245013510660062014164 00000000000000; TeX output 2009.11.16:2117y>color push BlackY color pop?M 1 ecrm1000ColorU test:qcolor push rgb 1 0 0red color pop,color push rgb 0 0 1blue color pop,color push cmyk 0 1 0 0magenta color pop_cu cmex10Zi_ 0ercmmi7x@ٓRcmr703K`y cmr10cos!j b> cmmi10td8t=o O!cmsy71 X k+B=0R( !", cmsy101)k<$ kx^2k+B+1ßwfe&Lq (֍(2kw+81)!?MF*ontU styles:q]f ecbx1000bQold,HЃ ecti1000emphasize}/d,6 ecss1000sansserif,V eccc1000SmallCaps,^ ecsl1000slanted>color push Black(1Y color pop*;y^ ecsl1000V eccc10006 ecss1000HЃ ecti1000]f ecbx1000 1 ecrm1000 !", cmsy10 O!cmsy7 b> cmmi10 0ercmmi7K`y cmr10ٓRcmr7u cmex10dvisvgm-2.8.1/tests/data/Makefile.am0000664000175000017500000000065413510660062014237 00000000000000## This file is part of dvisvgm ## Copyright (C) 2016-2019 Martin Gieseking ## ## Process this file with automake. EXTRA_DIST = \ cidjmgr0-h.tfm \ cmr10.600gf \ cmr10.pfb \ cmr10.tfm \ dvipdfm_test.map \ dvips_test.map \ frktest.dvi \ frktest-nf-cmp.svg \ frktest-wf-cmp.svg \ sample.dvi \ sample-nf-cmp.svg \ sample.sfd \ sample-wf-cmp.svg \ sample_v2.dvi \ sample_v3.dvi \ ot1.cmap dvisvgm-2.8.1/tests/data/sample.sfd0000664000175000017500000004234513510660062014165 0000000000000000 0x0000_0x00FF 01 0x3000 0x3001 0x3002 0x00B7 0x02C9 0x02C7 0x00A8 0x3003 \ 0x3005 0x2014 0xFF5E 0x2016 0x2026 0x2018 0x2019 0x201C \ 0x201D 0x3014 0x3015 0x3008 0x3009 0x300A 0x300B 0x300C \ 0x300D 0x300E 0x300F 0x3016 0x3017 0x3010 0x3011 0x00B1 \ 0x00D7 0x00F7 0x2236 0x2227 0x2228 0x2211 0x220F 0x222A \ 0x2229 0x2208 0x2237 0x221A 0x22A5 0x2225 0x2220 0x2312 \ 0x2299 0x222B 0x222E 0x2261 0x224C 0x2248 0x223D 0x221D \ 0x2260 0x226E 0x226F 0x2264 0x2265 0x221E 0x2235 0x2234 \ 0x2642 0x2640 0x00B0 0x2032 0x2033 0x2103 0xFF04 0x00A4 \ 0xFFE0 0xFFE1 0x2030 0x00A7 0x2116 0x2606 0x2605 0x25CB \ 0x25CF 0x25CE 0x25C7 0x25C6 0x25A1 0x25A0 0x25B3 0x25B2 \ 0x203B 0x2192 0x2190 0x2191 0x2193 0x3013 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0x2488 0x2489 \ 0x248A 0x248B 0x248C 0x248D 0x248E 0x248F 0x2490 0x2491 \ 0x2492 0x2493 0x2494 0x2495 0x2496 0x2497 0x2498 0x2499 \ 0x249A 0x249B 0x2474 0x2475 0x2476 0x2477 0x2478 0x2479 \ 0x247A 0x247B 0x247C 0x247D 0x247E 0x247F 0x2480 0x2481 \ 0x2482 0x2483 0x2484 0x2485 0x2486 0x2487 0x2460 0x2461 \ 0x2462 0x2463 0x2464 0x2465 0x2466 0x2467 0x2468 0x2469 \ 0xFFFE 0xFFFE 0x3220 0x3221 0x3222 0x3223 0x3224 0x3225 \ 0x3226 0x3227 0x3228 0x3229 0xFFFE 0xFFFE 0x2160 0x2161 \ 0x2162 0x2163 0x2164 0x2165 0x2166 0x2167 0x2168 0x2169 \ 0x216A 0x216B 0xFFFE 0xFFFE 0xFF01 0xFF02 0xFF03 0xFFE5 \ 0xFF05 0xFF06 0xFF07 0xFF08 0xFF09 0xFF0A 0xFF0B 0xFF0C \ 0xFF0D 0xFF0E 0xFF0F 0xFF10 0xFF11 0xFF12 0xFF13 0xFF14 \ 0xFF15 0xFF16 0xFF17 0xFF18 0xFF19 0xFF1A 0xFF1B 0xFF1C \ 0xFF1D 0xFF1E 0xFF1F 0xFF20 0xFF21 0xFF22 0xFF23 0xFF24 \ 0xFF25 0xFF26 0xFF27 0xFF28 0xFF29 0xFF2A 0xFF2B 0xFF2C \ 0xFF2D 0xFF2E 0xFF2F 0xFF30 0xFF31 0xFF32 0xFF33 0xFF34 \ 0xFF35 0xFF36 0xFF37 0xFF38 0xFF39 0xFF3A 0xFF3B 0xFF3C \ 0xFF3D 0xFF3E 0xFF3F 0xFF40 0xFF41 0xFF42 0xFF43 0xFF44 02 0xFF45 0xFF46 0xFF47 0xFF48 0xFF49 0xFF4A 0xFF4B 0xFF4C \ 0xFF4D 0xFF4E 0xFF4F 0xFF50 0xFF51 0xFF52 0xFF53 0xFF54 \ 0xFF55 0xFF56 0xFF57 0xFF58 0xFF59 0xFF5A 0xFF5B 0xFF5C \ 0xFF5D 0xFFE3 0x3041 0x3042 0x3043 0x3044 0x3045 0x3046 \ 0x3047 0x3048 0x3049 0x304A 0x304B 0x304C 0x304D 0x304E \ 0x304F 0x3050 0x3051 0x3052 0x3053 0x3054 0x3055 0x3056 \ 0x3057 0x3058 0x3059 0x305A 0x305B 0x305C 0x305D 0x305E \ 0x305F 0x3060 0x3061 0x3062 0x3063 0x3064 0x3065 0x3066 \ 0x3067 0x3068 0x3069 0x306A 0x306B 0x306C 0x306D 0x306E \ 0x306F 0x3070 0x3071 0x3072 0x3073 0x3074 0x3075 0x3076 \ 0x3077 0x3078 0x3079 0x307A 0x307B 0x307C 0x307D 0x307E \ 0x307F 0x3080 0x3081 0x3082 0x3083 0x3084 0x3085 0x3086 \ 0x3087 0x3088 0x3089 0x308A 0x308B 0x308C 0x308D 0x308E \ 0x308F 0x3090 0x3091 0x3092 0x3093 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0x30A1 0x30A2 0x30A3 0x30A4 0x30A5 0x30A6 0x30A7 0x30A8 \ 0x30A9 0x30AA 0x30AB 0x30AC 0x30AD 0x30AE 0x30AF 0x30B0 \ 0x30B1 0x30B2 0x30B3 0x30B4 0x30B5 0x30B6 0x30B7 0x30B8 \ 0x30B9 0x30BA 0x30BB 0x30BC 0x30BD 0x30BE 0x30BF 0x30C0 \ 0x30C1 0x30C2 0x30C3 0x30C4 0x30C5 0x30C6 0x30C7 0x30C8 \ 0x30C9 0x30CA 0x30CB 0x30CC 0x30CD 0x30CE 0x30CF 0x30D0 \ 0x30D1 0x30D2 0x30D3 0x30D4 0x30D5 0x30D6 0x30D7 0x30D8 \ 0x30D9 0x30DA 0x30DB 0x30DC 0x30DD 0x30DE 0x30DF 0x30E0 \ 0x30E1 0x30E2 0x30E3 0x30E4 0x30E5 0x30E6 0x30E7 0x30E8 \ 0x30E9 0x30EA 0x30EB 0x30EC 0x30ED 0x30EE 0x30EF 0x30F0 \ 0x30F1 0x30F2 0x30F3 0x30F4 0x30F5 0x30F6 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0x0391 0x0392 \ 0x0393 0x0394 0x0395 0x0396 0x0397 0x0398 0x0399 0x039A \ 0x039B 0x039C 0x039D 0x039E 0x039F 0x03A0 0x03A1 0x03A3 \ 0x03A4 0x03A5 0x03A6 0x03A7 0x03A8 0x03A9 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0x03B1 0x03B2 \ 0x03B3 0x03B4 0x03B5 0x03B6 0x03B7 0x03B8 0x03B9 0x03BA 03 0x03BB 0x03BC 0x03BD 0x03BE 0x03BF 0x03C0 0x03C1 0x03C3 \ 0x03C4 0x03C5 0x03C6 0x03C7 0x03C8 0x03C9 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0x0410 0x0411 0x0412 0x0413 \ 0x0414 0x0415 0x0401 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 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0x0430 0x0431 0x0432 0x0433 \ 0x0434 0x0435 0x0451 0x0436 0x0437 0x0438 0x0439 0x043A \ 0x043B 0x043C 0x043D 0x043E 0x043F 0x0440 0x0441 0x0442 \ 0x0443 0x0444 0x0445 0x0446 0x0447 0x0448 0x0449 0x044A \ 0x044B 0x044C 0x044D 0x044E 0x044F 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0x0101 0x00E1 0x01CE 0x00E0 0x0113 0x00E9 \ 0x011B 0x00E8 0x012B 0x00ED 0x01D0 0x00EC 0x014D 0x00F3 \ 0x01D2 0x00F2 0x016B 0x00FA 0x01D4 0x00F9 0x01D6 0x01D8 \ 0x01DA 0x01DC 0x00FC 0x00EA 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0x3105 0x3106 \ 0x3107 0x3108 0x3109 0x310A 0x310B 0x310C 0x310D 0x310E \ 0x310F 0x3110 0x3111 0x3112 0x3113 0x3114 0x3115 0x3116 \ 0x3117 0x3118 0x3119 0x311A 0x311B 0x311C 0x311D 0x311E \ 0x311F 0x3120 0x3121 0x3122 0x3123 0x3124 0x3125 0x3126 \ 0x3127 0x3128 0x3129 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0x2500 0x2501 0x2502 0x2503 0x2504 \ 0x2505 0x2506 0x2507 0x2508 0x2509 0x250A 0x250B 0x250C 04 0x250D 0x250E 0x250F 0x2510 0x2511 0x2512 0x2513 0x2514 \ 0x2515 0x2516 0x2517 0x2518 0x2519 0x251A 0x251B 0x251C \ 0x251D 0x251E 0x251F 0x2520 0x2521 0x2522 0x2523 0x2524 \ 0x2525 0x2526 0x2527 0x2528 0x2529 0x252A 0x252B 0x252C \ 0x252D 0x252E 0x252F 0x2530 0x2531 0x2532 0x2533 0x2534 \ 0x2535 0x2536 0x2537 0x2538 0x2539 0x253A 0x253B 0x253C \ 0x253D 0x253E 0x253F 0x2540 0x2541 0x2542 0x2543 0x2544 \ 0x2545 0x2546 0x2547 0x2548 0x2549 0x254A 0x254B 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 05 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 06 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE 0xFFFE \ 0xFFFE 0xFFFE 0x554A 0x963F 0x57C3 0x6328 0x54CE 0x5509 \ 0x54C0 0x7691 0x764C 0x853C 0x77EE 0x827E 0x788D 0x7231 \ 0x9698 0x978D 0x6C28 0x5B89 0x4FFA 0x6309 0x6697 0x5CB8 \ 0x80FA 0x6848 0x80AE 0x6602 0x76CE 0x51F9 0x6556 0x71AC \ 0x7FF1 0x8884 0x50B2 0x5965 0x61CA 0x6FB3 0x82AD 0x634C \ 0x6252 0x53ED 0x5427 0x7B06 0x516B 0x75A4 0x5DF4 0x62D4 \ 0x8DCB 0x9776 0x628A 0x8019 0x575D 0x9738 0x7F62 0x7238 \ 0x767D 0x67CF 0x767E 0x6446 0x4F70 0x8D25 0x62DC 0x7A17 \ 0x6591 0x73ED 0x642C 0x6273 0x822C 0x9881 0x677F 0x7248 \ 0x626E 0x62CC 0x4F34 0x74E3 0x534A 0x529E 0x7ECA 0x90A6 \ 0x5E2E 0x6886 0x699C 0x8180 0x7ED1 0x68D2 0x78C5 0x868C \ 0x9551 0x508D 0x8C24 0x82DE 0x80DE 0x5305 0x8912 0x5265 \ 0x8584 0x96F9 0x4FDD 0x5821 0x9971 0x5B9D 0x62B1 0x62A5 \ 0x66B4 0x8C79 0x9C8D 0x7206 0x676F 0x7891 0x60B2 0x5351 \ 0x5317 0x8F88 0x80CC 0x8D1D 0x94A1 0x500D 0x72C8 0x5907 \ 0x60EB 0x7119 0x88AB 0x5954 0x82EF 0x672C 0x7B28 0x5D29 07 0x7EF7 0x752D 0x6CF5 0x8E66 0x8FF8 0x903C 0x9F3B 0x6BD4 \ 0x9119 0x7B14 0x5F7C 0x78A7 0x84D6 0x853D 0x6BD5 0x6BD9 \ 0x6BD6 0x5E01 0x5E87 0x75F9 0x95ED 0x655D 0x5F0A 0x5FC5 \ 0x8F9F 0x58C1 0x81C2 0x907F 0x965B 0x97AD 0x8FB9 0x7F16 \ 0x8D2C 0x6241 0x4FBF 0x53D8 0x535E 0x8FA8 0x8FA9 0x8FAB \ 0x904D 0x6807 0x5F6A 0x8198 0x8868 0x9CD6 0x618B 0x522B \ 0x762A 0x5F6C 0x658C 0x6FD2 0x6EE8 0x5BBE 0x6448 0x5175 \ 0x51B0 0x67C4 0x4E19 0x79C9 0x997C 0x70B3 0x75C5 0x5E76 \ 0x73BB 0x83E0 0x64AD 0x62E8 0x94B5 0x6CE2 0x535A 0x52C3 \ 0x640F 0x94C2 0x7B94 0x4F2F 0x5E1B 0x8236 0x8116 0x818A \ 0x6E24 0x6CCA 0x9A73 0x6355 0x535C 0x54FA 0x8865 0x57E0 \ 0x4E0D 0x5E03 0x6B65 0x7C3F 0x90E8 0x6016 0x64E6 0x731C \ 0x88C1 0x6750 0x624D 0x8D22 0x776C 0x8E29 0x91C7 0x5F69 \ 0x83DC 0x8521 0x9910 0x53C2 0x8695 0x6B8B 0x60ED 0x60E8 \ 0x707F 0x82CD 0x8231 0x4ED3 0x6CA7 0x85CF 0x64CD 0x7CD9 \ 0x69FD 0x66F9 0x8349 0x5395 0x7B56 0x4FA7 0x518C 0x6D4B \ 0x5C42 0x8E6D 0x63D2 0x53C9 0x832C 0x8336 0x67E5 0x78B4 \ 0x643D 0x5BDF 0x5C94 0x5DEE 0x8BE7 0x62C6 0x67F4 0x8C7A \ 0x6400 0x63BA 0x8749 0x998B 0x8C17 0x7F20 0x94F2 0x4EA7 \ 0x9610 0x98A4 0x660C 0x7316 0x573A 0x5C1D 0x5E38 0x957F \ 0x507F 0x80A0 0x5382 0x655E 0x7545 0x5531 0x5021 0x8D85 \ 0x6284 0x949E 0x671D 0x5632 0x6F6E 0x5DE2 0x5435 0x7092 \ 0x8F66 0x626F 0x64A4 0x63A3 0x5F7B 0x6F88 0x90F4 0x81E3 \ 0x8FB0 0x5C18 0x6668 0x5FF1 0x6C89 0x9648 0x8D81 0x886C \ 0x6491 0x79F0 0x57CE 0x6A59 0x6210 0x5448 0x4E58 0x7A0B \ 0x60E9 0x6F84 0x8BDA 0x627F 0x901E 0x9A8B 0x79E4 0x5403 \ 0x75F4 0x6301 0x5319 0x6C60 0x8FDF 0x5F1B 0x9A70 0x803B \ 0x9F7F 0x4F88 0x5C3A 0x8D64 0x7FC5 0x65A5 0x70BD 0x5145 \ 0x51B2 0x866B 0x5D07 0x5BA0 0x62BD 0x916C 0x7574 0x8E0C \ 0x7A20 0x6101 0x7B79 0x4EC7 0x7EF8 0x7785 0x4E11 0x81ED \ 0x521D 0x51FA 0x6A71 0x53A8 0x8E87 0x9504 0x96CF 0x6EC1 \ 0x9664 0x695A 0x7840 0x50A8 0x77D7 0x6410 0x89E6 0x5904 08 0x63E3 0x5DDD 0x7A7F 0x693D 0x4F20 0x8239 0x5598 0x4E32 \ 0x75AE 0x7A97 0x5E62 0x5E8A 0x95EF 0x521B 0x5439 0x708A \ 0x6376 0x9524 0x5782 0x6625 0x693F 0x9187 0x5507 0x6DF3 \ 0x7EAF 0x8822 0x6233 0x7EF0 0x75B5 0x8328 0x78C1 0x96CC \ 0x8F9E 0x6148 0x74F7 0x8BCD 0x6B64 0x523A 0x8D50 0x6B21 \ 0x806A 0x8471 0x56F1 0x5306 0x4ECE 0x4E1B 0x51D1 0x7C97 \ 0x918B 0x7C07 0x4FC3 0x8E7F 0x7BE1 0x7A9C 0x6467 0x5D14 \ 0x50AC 0x8106 0x7601 0x7CB9 0x6DEC 0x7FE0 0x6751 0x5B58 \ 0x5BF8 0x78CB 0x64AE 0x6413 0x63AA 0x632B 0x9519 0x642D \ 0x8FBE 0x7B54 0x7629 0x6253 0x5927 0x5446 0x6B79 0x50A3 \ 0x6234 0x5E26 0x6B86 0x4EE3 0x8D37 0x888B 0x5F85 0x902E \ 0x6020 0x803D 0x62C5 0x4E39 0x5355 0x90F8 0x63B8 0x80C6 \ 0x65E6 0x6C2E 0x4F46 0x60EE 0x6DE1 0x8BDE 0x5F39 0x86CB \ 0x5F53 0x6321 0x515A 0x8361 0x6863 0x5200 0x6363 0x8E48 \ 0x5012 0x5C9B 0x7977 0x5BFC 0x5230 0x7A3B 0x60BC 0x9053 \ 0x76D7 0x5FB7 0x5F97 0x7684 0x8E6C 0x706F 0x767B 0x7B49 \ 0x77AA 0x51F3 0x9093 0x5824 0x4F4E 0x6EF4 0x8FEA 0x654C \ 0x7B1B 0x72C4 0x6DA4 0x7FDF 0x5AE1 0x62B5 0x5E95 0x5730 \ 0x8482 0x7B2C 0x5E1D 0x5F1F 0x9012 0x7F14 0x98A0 0x6382 \ 0x6EC7 0x7898 0x70B9 0x5178 0x975B 0x57AB 0x7535 0x4F43 \ 0x7538 0x5E97 0x60E6 0x5960 0x6DC0 0x6BBF 0x7889 0x53FC \ 0x96D5 0x51CB 0x5201 0x6389 0x540A 0x9493 0x8C03 0x8DCC \ 0x7239 0x789F 0x8776 0x8FED 0x8C0D 0x53E0 0x4E01 0x76EF \ 0x53EE 0x9489 0x9876 0x9F0E 0x952D 0x5B9A 0x8BA2 0x4E22 \ 0x4E1C 0x51AC 0x8463 0x61C2 0x52A8 0x680B 0x4F97 0x606B \ 0x51BB 0x6D1E 0x515C 0x6296 0x6597 0x9661 0x8C46 0x9017 \ 0x75D8 0x90FD 0x7763 0x6BD2 0x728A 0x72EC 0x8BFB 0x5835 \ 0x7779 0x8D4C 0x675C 0x9540 0x809A 0x5EA6 0x6E21 0x5992 \ 0x7AEF 0x77ED 0x953B 0x6BB5 0x65AD 0x7F0E 0x5806 0x5151 \ 0x961F 0x5BF9 0x58A9 0x5428 0x8E72 0x6566 0x987F 0x56E4 \ 0x949D 0x76FE 0x9041 0x6387 0x54C6 0x591A 0x593A 0x579B \ 0x8EB2 0x6735 0x8DFA 0x8235 0x5241 0x60F0 0x5815 0x86FE 09 0x5CE8 0x9E45 0x4FC4 0x989D 0x8BB9 0x5A25 0x6076 0x5384 \ 0x627C 0x904F 0x9102 0x997F 0x6069 0x800C 0x513F 0x8033 \ 0x5C14 0x9975 0x6D31 0x4E8C 0x8D30 0x53D1 0x7F5A 0x7B4F \ 0x4F10 0x4E4F 0x9600 0x6CD5 0x73D0 0x85E9 0x5E06 0x756A \ 0x7FFB 0x6A0A 0x77FE 0x9492 0x7E41 0x51E1 0x70E6 0x53CD \ 0x8FD4 0x8303 0x8D29 0x72AF 0x996D 0x6CDB 0x574A 0x82B3 \ 0x65B9 0x80AA 0x623F 0x9632 0x59A8 0x4EFF 0x8BBF 0x7EBA \ 0x653E 0x83F2 0x975E 0x5561 0x98DE 0x80A5 0x532A 0x8BFD \ 0x5420 0x80BA 0x5E9F 0x6CB8 0x8D39 0x82AC 0x915A 0x5429 \ 0x6C1B 0x5206 0x7EB7 0x575F 0x711A 0x6C7E 0x7C89 0x594B \ 0x4EFD 0x5FFF 0x6124 0x7CAA 0x4E30 0x5C01 0x67AB 0x8702 \ 0x5CF0 0x950B 0x98CE 0x75AF 0x70FD 0x9022 0x51AF 0x7F1D \ 0x8BBD 0x5949 0x51E4 0x4F5B 0x5426 0x592B 0x6577 0x80A4 \ 0x5B75 0x6276 0x62C2 0x8F90 0x5E45 0x6C1F 0x7B26 0x4F0F \ 0x4FD8 0x670D 0x6D6E 0x6DAA 0x798F 0x88B1 0x5F17 0x752B \ 0x629A 0x8F85 0x4FEF 0x91DC 0x65A7 0x812F 0x8151 0x5E9C \ 0x8150 0x8D74 0x526F 0x8986 0x8D4B 0x590D 0x5085 0x4ED8 \ 0x961C 0x7236 0x8179 0x8D1F 0x5BCC 0x8BA3 0x9644 0x5987 \ 0x7F1A 0x5490 0x5676 0x560E 0x8BE5 0x6539 0x6982 0x9499 \ 0x76D6 0x6E89 0x5E72 0x7518 0x6746 0x67D1 0x7AFF 0x809D \ 0x8D76 0x611F 0x79C6 0x6562 0x8D63 0x5188 0x521A 0x94A2 \ 0x7F38 0x809B 0x7EB2 0x5C97 0x6E2F 0x6760 0x7BD9 0x768B \ 0x9AD8 0x818F 0x7F94 0x7CD5 0x641E 0x9550 0x7A3F 0x544A \ 0x54E5 0x6B4C 0x6401 0x6208 0x9E3D 0x80F3 0x7599 0x5272 \ 0x9769 0x845B 0x683C 0x86E4 0x9601 0x9694 0x94EC 0x4E2A \ 0x5404 0x7ED9 0x6839 0x8DDF 0x8015 0x66F4 0x5E9A 0x7FB9 \ 0x57C2 0x803F 0x6897 0x5DE5 0x653B 0x529F 0x606D 0x9F9A \ 0x4F9B 0x8EAC 0x516C 0x5BAB 0x5F13 0x5DE9 0x6C5E 0x62F1 \ 0x8D21 0x5171 0x94A9 0x52FE 0x6C9F 0x82DF 0x72D7 0x57A2 \ 0x6784 0x8D2D 0x591F 0x8F9C 0x83C7 0x5495 0x7B8D 0x4F30 \ 0x6CBD 0x5B64 0x59D1 0x9F13 0x53E4 0x86CA 0x9AA8 0x8C37 \ 0x80A1 0x6545 0x987E 0x56FA 0x96C7 0x522E 0x74DC 0x5250 x1 0x0010_0x0030 0x1010_0x1030 0xe000 \ 0xA0: 0x1000 0x2000 # eof dvisvgm-2.8.1/tests/data/cmr10.pfb0000664000175000017500000010565013510660062013620 00000000000000%!PS-AdobeFont-1.0: CMR10 003.002 %%Title: CMR10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup /UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR10 def /FontBBox {-40 -250 1009 750 }readonly def /UniqueID 5000793 def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 { 1 index exch /.notdef put} for dup 0 /Gamma put dup 1 /Delta put dup 2 /Theta put dup 3 /Lambda put dup 4 /Xi put dup 5 /Pi put dup 6 /Sigma put dup 7 /Upsilon put dup 8 /Phi put dup 9 /Psi put dup 10 /Omega put dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 15 /ffl put dup 16 /dotlessi put dup 17 /dotlessj put dup 18 /grave put dup 19 /acute put dup 20 /caron put dup 21 /breve put dup 22 /macron put dup 23 /ring put dup 24 /cedilla put dup 25 /germandbls put dup 26 /ae put dup 27 /oe put dup 28 /oslash put dup 29 /AE put dup 30 /OE put dup 31 /Oslash put dup 32 /suppress put dup 33 /exclam put dup 34 /quotedblright put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /exclamdown put dup 61 /equal put dup 62 /questiondown put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /quotedblleft put dup 93 /bracketright put dup 94 /circumflex put dup 95 /dotaccent put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 124 /emdash put dup 125 /hungarumlaut put dup 126 /tilde put dup 127 /dieresis put dup 128 /suppress put dup 160 /space put dup 161 /Gamma put dup 162 /Delta put dup 163 /Theta put dup 164 /Lambda put dup 165 /Xi put dup 166 /Pi put dup 167 /Sigma put dup 168 /Upsilon put dup 169 /Phi put dup 170 /Psi put dup 171 /sfthyphen put dup 172 /nbspace put dup 173 /Omega put dup 174 /ff put dup 175 /fi put dup 176 /fl put dup 177 /ffi put dup 178 /ffl put dup 179 /dotlessi put dup 180 /dotlessj put dup 181 /grave put dup 182 /acute put dup 183 /caron put dup 184 /breve put dup 185 /macron put dup 186 /ring put dup 187 /cedilla put dup 188 /germandbls put dup 189 /ae put dup 190 /oe put dup 191 /oslash put dup 192 /AE put dup 193 /OE put dup 194 /Oslash put dup 195 /suppress put dup 196 /dieresis put readonly def currentdict end currentfile eexec xoc;jAw-=%W)-{ru)rAE(@{빴Q|_R ϤA -T@|q|VkJ%qu8PwGxŪ̆Q6K -U\%b"t-*xJ+ }3{Z2zݬT2s$ZJPe/7ۛBVrφ?y|(|y~ry$ Ճ4^ƠOs4K]xJ"UP9k g*jI.aPP5yD=yKI™82L܏{WZ..B>?ـ%m7pC]ai3(i,ʌ`&{u Μ\r h@I=v2$n\N[\a :Hk _#crH<&V&0;+kB .Ul>P`^ aqywy=Qyu,r sdڮU';оzrzEA#St{R8V$H%f}:{ALK,HG#͢K9> {*}oI))Mp<[5L73Ip-6ȚkC!["^ C-dWh0/S4Iޅ*6$5iXryB6w2 T[PZJ +OHԵRĹjn[MOeF.1D?ME_i-o r"Vv-H;'5TȦmMUdā.lY{ z~}bW?VpUK 7FS{^vr2+sluUbw=7sLtnǴ,Ab[&"Z{6`O">]rVG S J,S %(x>ĉ'.Au<MVJm&bVGZ+6A-f9'd2٭LlGԩ7⋺UjhPs8囐nPb 1]@JY:l_Q#oFO{Ȃx,AklWHV*hr=S{6&,@Y'eߝ)os$p U v x0%dD^Rou̬HSò}q,HGW-<&YU泿:4[;z0/v¶q_#*[;H61dgf'lϰCu.Yc_H.56;CoVMO}G lln=7b>/=Vֱm|\odY@PέKdcPF= >|Ch#[7n7<| KrR v0oMrv( tdl~%X2^45}7:.ZNJ5xG~|O7\gۄKQGHS8+#83w(èX^ ?iԷ =XMJz۾L='&LKaxmfڎQ.EI/Nm@YmY!ǁHPۥp+򰹨RytԨ׸d: P%AJLO6= + SиR5\w'nEҁ^*Rw,@Shz-_1ngcoD'0+z~j=2ŰZQG L4;J,K~(Gx.x(:8?!3!O-.'phJxOB#<ʼn_mOObg!:顴A jIA7kC7p+o3^@Y![88TkY`1$SKEO伟7a鄜]2_q1(CVc?G8[;k \:ƕ.foȧrκ\!r aa!uYi(*IFI\GӨuT׏ƷNYfZVĔVEضJжjo5Q2Q7?iֆ7kqV|ks{=t,䨷[L^?T1rT:m:͸:UCոVV?t gQuSi;)VS:蔧RJ'v2=1uDCJjkطT F:eirÄCDȝ网EIϑ9OZ=őQgz03Qk9)pм5"CI@tx3,;AjTASXh6~jELHCF7Z|$B @o~-2Xc踆m KZ{ax>]pyDkB պ=_}#x#&('[`O7([zxlm\A^ 5([05g?E9)7u=)fz_Ytbd ˽K=L3D=k<)=Q}@I&(3fu* /Z 1j/VA8k`;Օ+| A?Ni=c9*+_`\FG 9}H!% Mu-XB-ѷbUs%ViRI5$RxVrCv.1ccq=j Kݹ3E`U8l5sj,z>I7Vn騭FI:ⅥHU6CI](8q(B6`XVDžx(kioCLj.<[WKV3[RN- fbSIm$1tE\RR3^lC_5$NQDB!+NYE *D=i+%"ׅnZwJ‰sMYQ ,e1ĉ,fNſB%6LzVlAf*ז>R$ ]3C[GWeY}_-;L7y{vTrl |@]duԙ7WD .[ȴ ;Qӫv * C7%4-32:[igYۿ8@:C7>vJt_Op) _lOR Cn_oCUvbHe ef `a#Y_͞_G*IDo &wiO>%sxȥrƨד%MI Q<Ԩ0\#&&-= ,f+k-ʃ6,Bhjң@i7֠N2)E#Ru&".um陔b{EI3# IB.*Y~'~/g_Q+Yi7s֗-HK9VxAӲ1)}#34X,U-CSc"pjEXEdq*o!ql.#Ǯz)h@3g Oƚ}l }=,Ykor5dį-L* 1b~:1KB%)gE7>B(4qhbe;0FǟS]Yc& K R|Ԛtu0%!dT0$.\_|@*oG~8:tNӥuĖq,<L &˗"KܷQEKHS0Tbry&MQJdd:6_wNy8>=]U*y4!mFTl^q2m͚H `-\ 7;(O&j"dYMݱInY,X`GOxϓ) 3ѦB01bmB?zh/q±}˦-ԧԳ'h~cTpX^X݁ݓzћs $A\GQC_/!HRPP+Chfe[6Njdjxj{ TR3Ii)J| J'^R9_tYfE?u;0Tr].y+e#B0 L̂z/=8ћYf*G9|GPX 0ʇ@ji=`M FÍK%} hDS/fCDZ1"mulӑT>)Z׎A8m7Y*} dƧEB 1.(-l쏚 z_yܠ1sI+5Hxf ?v=jMUӪ1YyNWw])ԷahtZe]b/!/(qzI716@4HR8K}#?} GeəpoٕQ6uNHic .f> صR<| Hz͚^(]{YZ`XS1AZ`b q죒JߦBJČ(]v^sd] q`ݪ186RzN'X)YA_{d Q-{>GxaAMDLE}%jxKA5l>Xp*+(jq@9s22{&3p4 %m@J$HͿ'}t["8 T/]Ô ^M{yשt+ :fjHg*'9%s?{!zs' X. s`󟸖2F?Bu DHQ4ìdj.r$VsJ-j?+A J"Jpx˹:lQcIJ]qQ7^մ/Z7!jhBS *o`9CWPS04G0mNS-Sf`5jw̓`Hg(=ѯn2:³)C|tAУ񽹬u&6BZ6ϝ1J F/ 󧃿GKk 0IK3|D/OUJ 4?ס|cӹVY"gL6 16E aMO\XP(:Di{˝G| Zê}PTq|ʯm![-BPAzJ (hgM ,yX'3CQ:_-C-1F".tg6CȽA4뚷%fMSp1DemSP y/1Pra>'IkoyNw@xP}m}1*>؀^JL 4PwD$Rsa9_P̄[0XʓVci@fsE`:ݰvԭ6j͒F~6DߦI%# Y&nl &{?#͗І "~Ԙ\]ˮ{GY¸\B &)RP 6IE6CA?ZDby0=!#2}AhJW,=)fƣ%(o?ⱽpK?tSe:u#NwmG ċ\p(zIs_͋((#c튰y4#l0ny&:߁X=2K,P܊KheR2pv,n}xK@6@3{WE_*ȴ#0aZW%G"XƇ E*0Jl[KE.IR}VI^qer쎯FzDGhWR-DnWHr^Pƅ?7l8gk'̐<1q ED'p|gi2Jr\:犲V+n.6i_6˄zJ?Z 97^hs;k"m5|Y69:wMQj?͑:)2fP"#8XH-i/&3ÐGBQ$4̛xBw5eV"zyiv4r{+T$qːJ:(`1fMW3HYo 4˞Gya]XOP3 uJ _kC9i Ԋ 4zo"u|"FP*SllT01CC t{DqdeA-k(7 Lnyhg0'oŁض=.y-JObsO/U[|{L>90b$ӒI lYb7C:Ƨgcc˼"O'5Ӽ$QPPU #_>j7Rf@Ά,gdĐ5Ri;xsB(=mu7{"6?K*/u"Ej7DP+)EЄNUZ̵ ``k>{XWc`]NO$`I0PvϪ}Aÿcʴ@4򕇄NQߩhZ-Ph{`VKx&VC1QnXHk_[!N%b uYק8L;ˠ?! 4`&s |b@2…߆-G#s1!+[ȴs~</X1) #=Ց:V6Zk+DtIJ,.2m6Ҩ_kͺVzDW!H^1MVIÛA8h"½y'Cw7GKD<ZMEj.Dդe)G{iRcEX#|n3RKѥ GvTHo w]΀?{Z*ʉЊ.(*M%zRrlpb*3UhMxHf"=5S:RC. ]'C)P:ibS`֧ͬſ wNoRhy`"wznIݱs;l~J9G v&ÞNUqr JFl`%^tL.n f~p<ƫ@IC&`o0#8QVX} vS3*9FfcR%],Ő֔Xkek>Xgy^aèָ:nj#9)=w_|P>-:8тanMSVJUVC6}^nς99iHe{?z~^Z aǥnRn&!Epm2=f+ҁKFd::a!B/ںPn:_ *K9܎ҬcZi ZglKB0hF3q<(MwU#3V$SwޝWLOc||ÍFS0_~6KmU D:!b( QMV QExnv+'&i7U=ؔdO^;ܴaH2mSA@|>а*lsah7#4&3A5?35[Qjc0En( )q''epNed_-}hxl5?z,>BYg`eSqN[=chZnFUI>ԑa]ꠈ7Ax9Gd۬7ᖳ%$#]tlu5qFq1nkC6Җ &#ˡ~]5zD;8!|T|&SLrilV3.R06c)A]*!K~ݣ,1r@t&uV]ld"=P -Y/&A;'w ԼSS{èLOߩLzt]>5dk UyVD[&OP 5zB$UdAZjT6mU_*c0{wKH`{@`';5: Tg?'^2+`U@}"!@wӣСi<5Fh0sFT+9I).4CX8@wEfk_|dudg Y]MG .K7-Nr:ZLBW޼]tbX {Ў@ YN .t ~ oᬵWbfjx:f[AZy ~U/pyV.3;wV껯JM .Fuh埻+ IŒ3sМM$D1'Tԗ;}k]2ˈ|K!=[J](y_R, Z$q@b5hP{MmDrŇrˏLùuY}愫DhW SNIm/:kr3=&maAƃmmY񦏫Q k: @xybV@y۠4;Q}q%m78}-lS]j!Ny*0DDNN{GZ5vnD 28Jؙ,$6~S6T`4Ȫd~h {F@ }g1ZO%l}fK=j2["6%eGxQpϢMO}n! ݦ\!09~c^R .(ܤO6[ew_;L,I[`RKT؜]W=?dBgҗiEpBg6V8o}h'a`F|뺃#F8e0)DSP\Nlfv%ޟ l< 6PoHg/M[jNAwwIqMNcL{0#ۢdg;W!;V gRR'?v{4L@,`qxޚ!(Ň׺hb1]NF| 9*m^U'1&4+ID(l4g;57$$ZsxE { V0*!gT):ޤo@qE-Hw~x/-FJqD|E0 MZ1`hGihHߤ=⦼c KFX FJ)UsD%e|MQU?bbS\(41KX}&X+=Tbdq~O=iۈ'P`=WE.)!+P(*\^[d4X>XQGtP1hEEe(K-b#KIIwЇ'4N̓@nK6UD҉ j?]L75ŠBL\ d)ΜE(- Pz`I&7PByPhiʕޞ؆:Z踈t]?o 0 VT:lpr1W*w/gS(Qu+!;3A2a|)'z4(Ym6)˸ҕGZC xzafнAz^+$ؓ`lډ ?f?`PgJcw uS8q&mg4>b4vkX*|?=;؜ά&+:g[qir5~<E`9Ӹ5tv'`eq=ɄLPHwf 4@DHEs;qgp$J ki2Sywūghm$zIΌouFDCHLEp x[h~rb?&+Z0|d8f2R״R"C@Se+/xL`,/aݥfgзd zp%WU1}Ⲭ=n J7c_.4~.5 f3谇;PWmQꟕ|H1',Tjafdieˬy X$G2YEȸoDE^M4hZDs?T "E><=T< 2| rķV%!s ܟH;\mnաwQ5|# 7(6_jwnf]3+I &h1Łbl3"+E$tHMwUs_|Zg8 b㛘Օ'4B0baIcn ( W2G>='s/pϬȃ js?A=G@K&' KX za&68ܑycT\@`-gs) 3L߬e5* K;%z!<ěg,n@ ,ô[IDdt9@vmH#/cxmz KIn(S $dwu/+Ģ?5.WtUE>KjC]njf`8ٕ QS#-l$svR!fPO(D/%]#ǻkԍ]tʜ/)D|Y,ǟz}ro&WXγTstUyκ!пYoGZƮ HtDz̝.ɘųiJE6f8C?nkmH D᦬`@IM.G'V!SrQtqD5zL:6mX)_ݖR V Cvk(ڂ_4D_(+v^OüUrz`Sw|B.`7Ml@)9d++gocxcY%(%<'NɳPnEju;N)N w*s!UV1 <SY!P}.@}[NٕU 0`l+ bG 5mQ6dQ;ox5g_"ׇI ;`pڤ6 _%U~ қ*"Msɓz)!se~*R;/`L~w/ϳp؅D ; Fk\^<{O͐K?N0 k+LX:P8+UT~L\_ʽHhhdTYlA\?r3J)79p\U JpP/9eznׄOL Xb+PW^}||2f7`]BHF7JVBc-p̘Dz7~n_+%ʈvM>h4& Q5u_6`JOl Stx=.2 ߗUb"spgaR L(y7!M[*}Λly8s&=k6!x\Q2"ۉ:ɆM RdʲOm{EB`Fjd2ަ$DkoA9Ǚa m/٫qOVt#UNڙ^tM){9Xd yVӷ(32v~$_9֏aH$ͧ70 o'Z;pEelu߹]&7J5a0\)ÜC78xh)hqFYXa¨\^$yXX j[J1S b[ZaveoRsD+FԼ #L~(zC_l_'}Y!h7)=,Aאo=/%"Cµmr>~%|g0ߞ<諚hYu$V.]&TjCk{TqrK0r(;tϞiD6Wݎ4DyBSx,ڄ'N"z* XD'kcF V߅w?lZ]Fg%ّYYv?V"5a%zB7?5vo.GՔcᢊ(vT5$G7u7@.>==FKy~1T89 Y>I1`3}d$^f 7Dkۦs:?}X,A 酫랫7]kK\W~_&X`ēXy(D6CHyD_̓y)Pnogn$`,5e/b"a{m4(SCȸ>uet^z}J]ld kd}˛J7 u6܋)SKGRmǻWLY! tOB ~Gl$ Yܐ!8v ңXw3^'?ꄚal:' =٫#%F P$@ޞnx[Fuj-K*If ]nDy NNfkzW&*o#*ra:KIP^8$~!@%6*09Zyƌ'Hօ3CYO TONmr޿YuP3gQhB=O}O*!#BHd&|Mg~'mL1[=GO~VO-Ӹ;:;~\{X#0UA5aY\2M8-/O DqښX[NnVg򻉯bƂFf gea.7#쇜Dj/5u,2dT$=16j玉ɿa"TjJ?/r6.3qJWd02&v|waLa<^57 W ȁHLqd%hI{Cla0@9w8t*jG41'F+vM$0 RgnmEVV3JᇋYFkZM?@y( %u*l%h^K$*n t⫈[O8(J1 =8VbXH„e ֬HȵliUOeJD?f2- Z^SZA!!g$?2VgՏPYVJɴ6|dO02ʗv<Cse< I Ttxٔjr=3*]m ):D8\JiɆLp^gyGSYTW+prlR:=]y/39;;"7Tk1J =3{AL05DO-s;2`.ȗaڎO 7=6PI?ޢQD1h"'<'H50F釋Iu4zȾ59Y,IK̼ݥ0%U!h-Ѵ4T-ןb/&#J̮o_-'Ri,k@1bexjyWN-w&dIyt:{ahus v"рNWfܦu0 @P {nUBbZ5SN5[>z0hɅ}[ăHh Io[~}F]UFƦ+%w.LOf+4|* YՏTKJPf8̷VL xyEBz65I$d$µFT4Ϊњ.%YOb?۷>!ݭt *8%7(+@'#ݡKfAǶN*:^gO҉8u7:jυv a:a諬oYNg I²:ynGqBx;p%Z"c )*&Hv#l[5PDLdHgEG譞 n*vnR{Ph"Cj1bO^T-V^ H1`ZCblC!gүu_2TVw'bMwǛaumHnR Zv1'IPoWgkX %J qPaV֮>AN h-2z1uen;&'2$Nq`C`H~9ZJǟ1m[ #c.i0qۇSQVљ'Dfuw~.qXEݕKL ¥nIqdkͼ[:n$D*L)ڠe?dl&sML6;n"2RQh-5N#t/Cݨ쐓j/o LYTKؖ Wعq*:8ëAL_M'_¢={x6y(^JEUgI2tC)w9 u^ȍ1=.M]g:dz/p\}a1h bxOG?Y=X "ARru N0qKW9 ,P7:oUM6Fͷ9*$'3Qo2^*JpJǥa1 {/ d㷒ΐَNSs F EWRYrl`7 ,0T7616|CZmkQwaGS%~CǕQ^<;7'O^~!h|- ]BoθvF龪#*|m0]Z9֠u#0\a6etvc8q @2KX}OF/TZ^6vV"|"BkV$-b/Sωހ'ֽ? n8@ қ.k"HmxU1zM/j<td$c+:𪣿GҔI5a7)sa3UX܄V%^pݨ85bZz;ҰqVV =sk ]C؆p|N =Xӧ,WS)85%*xc$LG7٫ʊʍ9hBA$X(!S՞u{=.HQd콏'nVAq~|0P wQ2< Jnؕ2RqP?xx5e-*%x]5?9kDfxee~=qbuQG7V ga~V qM,PRVfs%r av" '7U +PnmX%_J?`֖4n?jlX:yhz8&r׏xu*j.Є$z qNծ־M3}] SSo!7"p<212x:$=[ቻ805蹜;;΄ʙgFGyU(HL.vX!X%2>:)i6֟0y8tk@LT.&`P6WH;*46M:&Ȕ% <rTDE%MvZ*,d EULEY |' $QywgĒV xpw!k``-P1 L2B'|Ulԩ5fki1G-qNOa$0-#'^0 XZp[5 fhKABFMZ Fo҈+'an|P2nmۆ}ZvAs&{MOSfo q3շacd 3f"-~1{+hFBt`S&kgGm\,/T&1{B׌ :{IcirG'y)I0ҀVyq܅+D;C%XS>)^M4p37Os@ >hY  <_vG^bBj:};O9TgmL#%<̭|e}(DLl*al$U;r#X<Hހ3^?V""nbճ6Vq.jAm˚T I}}c\H_k _FֺRhddsG9b1cJ9l 8 [+~fS])MhE$v*DH0ˏzʊt9Vkz85_5(W)5pkG.aل㍠ -VdyH6=%C8TB/j pqz1j\XbrUΜlo2)e| Ӛ*T1AF[%#p -1)(L6/>=i&507(dC/>ũi)>KkI'4t\i.ץ0}DX&U+T!֎'1:mnwV{CoPv94./P0^DƼC0ѶQ7|Gy/cm[S]L~&zL$԰/kR:PGJ }| AO+2`HZ=hkqͧ+ 4}vV\.gc@`|=9PO&?XՒ2a!.@" !N P31Xo)Lh;pV)?0v`h8 +#$U* R`Q%klBrDف_ƨǽuj 󿘰K= &?ؙ9ck[y3;x@h0DbB:G#BXM}@V%1 b/wq v<m$Ɖ ۑvD;^iA}F:uV2:MZ`ٛYwFjfiD,\,fBIqm+dSrzopr74|RmIN] ƈb&;G1gs^sss;XSDБ6S&F g}f7RwJ__N3"Ą#[{^誜v7DN´QJsP:Smw (=hR]7WcYY,̸s$%b6FZw[~R6癫^k]ͱˠ˖LC!;(!s:R0#,#舘OaŸ R #SEHe3c_ܻ=z駙I ̴|ĸ&RMm~K tuyzQ?i69?!hf'24Ϋ=ބd]u=d\ë"?>*q⏔yi\ݓd.׸KGh`ɐ#jQC9)t^ȑ)BS]]n]@ZT~E?D6YPQz~/E U8ڻ'wO# j0' ="zMҾ"FbvoT/Z>=ؚM^Ya#־z N(.17#鏸K#! H7}YpM*J>[olW{G$ȯׯӔKT^oKMnb Y=yc숎S]%?RdW|v c~JC>m* դ.7mt>Gu+/ *.emaӦMYK?6'ɆIr%bwׅOMfIfgw@+T<4GDg~1Oak>rWـB +s}A>7s4>Sރ@˂A@ >/}:寖zy1m&]GflBHSq%q?)z[$L ~1hq L\ruY{lPi6DX,&&Vߔ㠈_qm:P!e5 cZPoLk4c-h\Zsy ?i^WSr#mUϨ,&C"uf(@K1ha;fC#d t1Ԛk$}KVcPJ= dy,1N%3>ݨ™"˄Ri- d^ѽ (=i2i'Kf}_OBzw3n;g1."~dKj)C SBgw{vWJo"ϝ>09UmJPd5hPԭN%.7MK#TD27-Ax v4W\j7w1kf!]6uqwIpA}nZ.~f-F>ip"fϒttD:,~ܩ0 Ȁ)@j7QD LBAeZy!qlKS#Rb`sfX2´\Q <,&%k.X6nt[ Z0,r2M\F7d&˜URo#H/J 㭃e6倞R~lީ2&8Zaiϋ8`bX2mVq Xn0jnMy*0Cpfb PjFnÆ]?`nb* Zwe)[PJ.ibSVU5^,ț{ꅱؑ>@ARU-9N!a;T^%ZYqc[Bӫ873}{g$ߍD}򿊏^}y ȡlXdU[[tW\Uώz:umRYiVYk88SBƬNNw=^vݥ BwS?}UE0C<7\lqPvZ-ڼkwج{ӥGg,ΣR0}w~7A/H*WP-i!}#i`AA.1Zܭ: 'F;؟VuqZ dU7kwfzlb$@L$EM3$oI҅(1):[ܒ譞k)zl "w@Ŝ\UlR#CM.[U^5t~10"Kd 4+iOKv2Wa}J~so0D'0<8NgeĪ+çDVD /wKELXȄ*_(h Ywsb' bաxuT}]y'.{ThY >{2%4e^=cﮯg }OL߲; ^5G凸c;q}r"WC8 l@5>5x9,c&7Lm^ 4%9E=+^vˮڛpy󗵧/j@{u=I_PB ioEbioeyi<yqhca |%vCx >]'`^L7MjWxRc1Te -hzX~VZFJ`()-ҥuނ2\VyH$a>!C<2 A,TA zl9']ȣH}v-鈀}n%Ȃ,qAÀSsEY 9 WT1Z_THa%:̒BGs'K͵\>l3yRJ@fGcҍ3^-6 K3:x Nc.FfSAۢ4?hGt 0%r+2bO-^Bo6`w1į۸e8Z! n6`h2-lDޖĜ?;q] YW2m]hC @>kZU<"E heyUN :\Z:ڞ6r P.;|UsAC{:l JHtiĘ#I>S (S0u#Ž <9esds[EυO?~(h;|麎gc0: W]껊-CcR1K(4?6wO]h;gBWgB"%e6uhwQqO, R!fǷ@!Uq:v5Ly#I9Z^]Lro\.bIrSm ً>V\G/΄?*E&wPQdfOHH b$(4 r'n}vQJ0~ǩOI <^C^,36dJjq 6\WKʇ&#P,q4.h]-ڟ\WMX^GWOܖ=Tk=Xzl0MB?Oy^8I}(FK7F(:SĽBC4ݚ*Tv,5U,'2KSӂt%@Am>(jz*O'PO#:0`'c{uɒx?X͙b;7تHUgv4A5yM#!M L^4'yk !Gs)Z!|4M)W=8jK!sr,.3Ќ{e*])voffH|PЌ˧Ai1c)\čn=?d*5g$#Ya ֧lF_XS+*q,a'8L2bon@mzZ]ٟ꫍[E^}gy A]5KsUkv#6džZ߅-m V z=;Sȗ8؈)bW!M}WuNUnF1XEY x,1PTr,7 M.a&ʕ͏v@Ṳ -uI쒙2&ʪ"]Uqe^_<#u[;wUN/]%$Xr?ðM-7{^!ڈ*:dǿFGn}o9W``@ZŢ- q$uƾ~,Tiz<~>\1 9T_qμIRQP" F2y)ؿ\+1}?Ҏ|m^sk O =Znn@];7Fg䚬 ~1A_woq^H5;#yUewf?50Q>^̜gΌ_\\e#:-yZW8)5OBԁ"g@mhVoc9WI[dퟰ䳘$܉ۇFhm)/[ oA\tDИ~"J}~nWG$GPɳx/_X~3~f`;1@T:$c֕͵b*p*o۶$*e>iPYpS,-ι-%YeYjuCϚz* @ޑC~\> ־H ^Ænpw@ͮ "E/=!SJMEgp[ʇIN怙)ļ;Um=P}EF?&/LEU8:3 9Im &,9D۲pX~P2vuMG2qkxbd PL qJ.h9p[@xfs ϙ=qZuWOöW7֒IV@Hf!\[ xaTtˁ"\ۯ RljgK($-Uog\\;'Vo v78"z9:?ѣ t j-l㹮P Nf#<&JU!0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if dvisvgm-2.8.1/tests/data/frktest.dvi0000664000175000017500000000403013510660062014361 00000000000000; TeX output 2009.10.08:2226soQX共v'ff ygothNonummyzs33idsemralienaauditorumloremipsumquodomnia Qsunti1ccatore`:Loremi0ipsumlors33itametconseetueradi-piscing#elit:"Seddiamtemrinciduntutlareetlormagna ^aliquam eratvolututwis33ienimadminimniamqui`no&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = tests/data ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ BROTLI_LIBS = @BROTLI_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ WOFF2_LIBS = @WOFF2_LIBS@ XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ cidjmgr0-h.tfm \ cmr10.600gf \ cmr10.pfb \ cmr10.tfm \ dvipdfm_test.map \ dvips_test.map \ frktest.dvi \ frktest-nf-cmp.svg \ frktest-wf-cmp.svg \ sample.dvi \ sample-nf-cmp.svg \ sample.sfd \ sample-wf-cmp.svg \ sample_v2.dvi \ sample_v3.dvi \ ot1.cmap all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/data/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/data/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/tests/data/ot1.cmap0000664000175000017500000000226713510660062013552 00000000000000%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <02DC> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF dvisvgm-2.8.1/tests/data/sample_v3.dvi0000664000175000017500000000040013510660062014565 00000000000000; TeX output 2017.11.22:1928荠Vԍ# _gjK`y cmr10verticaljtextu:1*;EK`y cmr10dvisvgm-2.8.1/tests/data/cmr10.tfm0000664000175000017500000000242013510660062013626 00000000000000D$ X K`yTeX textCMR 08 ` 00 U"0   t0 08H! H L5$W *R 5L.$#$* /   0HB0@0 8V:0:0: 0B8B 800J0K00080 0 !0 qUV8DFOs;8qq UX   q s UX ;   8 q ; UXq8q[޸q  UV ^ : O r ޸UV:pr8ffq>lLi f l '?!)]il'?!)]`\'"?!-{-|`<`>aeaocAoea.,oeuraAOCGQyeoraAuXWAVYtubyvwhkeoxdcqvj ywtCOGUQTYVWjI8>r88qUVdvisvgm-2.8.1/tests/data/dvipdfm_test.map0000664000175000017500000004365713510660062015404 00000000000000% /var/lib/texmf/fonts/map/dvipdfm/updmap/dvipdfm_dl14.map: maintained by the script updmap. % Don't change this file directly. Edit texmf/web2c/updmap.cfg % and run updmap to recreate this file. % A log of the updmap run that has created this file is available here: % /var/lib/texmf/web2c/updmap.log bchbc8a bchbi8r 8r bchbi8a bchbi8v t5 bchbi8v bchbo8r 8r bchb8a -s .167 bchbo8v t5 bchb8v -s 0.194 bchr8r 8r bchr8a bchr8v t5 bchr8v bchrc8a bchri8r 8r bchri8a bchri8v t5 bchri8v bchro8r 8r bchr8a -s .167 bchro8v t5 bchr8v -s 0.194 cmb10 -r cmbsy10o default cmbsy10 -s .167 -r cmbsy10 -r cmbsy5 -r cmbsy6 default cmbsy7 -r cmbsy7 -r cmbsy8 default cmbsy7 -r cmbsy9 default cmbsy10 -r cmbx10 -r cmbx12 -r cmbx5 -r cmbx6 -r cmbx7 -r cmbx8 -r cmbx9 -r cmbxi10f default cmbxti10 -s -0.25 -r cmbxsl10 -r cmbxti10 -r cmbxti12 default cmbxti10 -r cmbxti7 default cmbxti10 -r cmcb10 -r cmcbx10 -r cmcbx12 -r cmcbx5 -r cmcbx6 -r cmcbx7 -r cmcbx8 -r cmcbx9 -r cmcbxsl10 default cmcbxsl1 -r cmcbxti10 default cmcbxti1 -r cmccsc10 -r cmccsc8 -r cmccsc9 -r cmcinch default cmcinch7 -r cmcitt10 -r cmcsc10 -r cmcsc8 default cmcsc10 -r cmcsc9 default cmcsc10 -r cmcsl10 -r cmcsl12 -r cmcsl8 -r cmcsl9 -r cmcsltt10 default cmcsltt1 -r cmcss10 -r cmcss12 -r cmcss17 -r cmcss8 -r cmcss9 -r cmcssbx10 default cmcssbx1 -r cmcssdc10 default cmcssdc1 -r cmcssi10 -r cmcssi12 -r cmcssi17 -r cmcssi8 -r cmcssi9 -r cmcssq8 -r cmcssqi8 -r cmcti10 -r cmcti12 -r cmcti7 -r cmcti8 -r cmcti9 -r cmctt10 -r cmctt12 -r cmctt8 -r cmctt9 -r cmcu10 -r cmcyr10 -r cmcyr12 -r cmcyr17 -r cmcyr5 -r cmcyr6 -r cmcyr7 -r cmcyr8 -r cmcyr9 -r cmdunh10 -r cmex10 -r cmex7 default fmex7 cmex8 default fmex8 cmex9 default fmex9 cmff10 -r cmfi10 -r cmfib8 -r cminch -r cmitt10 -r cmitt12 default cmitt10 -r cmitt9 default cmitt10 -r cmmi10o default cmmi10 -s .167 -r cmmi10 -r cmmi12 -r cmmi5 -r cmmi6 -r cmmi7 -r cmmi8 -r cmmi9 -r cmmib10o default cmmib10 -s .167 -r cmmib10 -r cmmib5 -r cmmib6 default cmmib7 -r cmmib7 -r cmmib8 default cmmib7 -r cmmib9 default cmmib10 -r cmr10 -r cmr12 -r cmr17 -r cmr5 -r cmr6 -r cmr7 -r cmr8 -r cmr9 -r cmsl10 -r cmsl12 -r cmsl6 default cmsl8 -r cmsl8 -r cmsl9 -r cmsltt10 -r cmsltt9 default cmsltt10 -r cmss10 -r cmss12 -r cmss17 -r cmss8 -r cmss9 -r cmssbx10 -r cmssbxo10 default cmssbx10 -s .212 -r cmssdc10 -r cmssi10 -r cmssi12 -r cmssi17 -r cmssi8 -r cmssi9 -r cmssq8 -r cmssqi8 -r cmsy10o default cmsy10 -s .167 -r cmsy10 -r cmsy5 -r cmsy6 -r cmsy7 -r cmsy8 -r cmsy9 -r cmtcsc10 -r cmtex10 -r cmtex8 -r cmtex9 -r cmti10 -r cmti12 -r cmti7 -r cmti8 -r cmti9 -r cmtt10 -r cmtt12 -r cmtt8 -r cmtt9 -r cmu10 -r cmvtt10o default cmvtt10 -s .167 -r cmvtt10 -r comic8b 8b ComicSansMS8b comicbd8b 8b ComicSansMSBold8b comicbdo8b 8b ComicSansMSBoldItalic8b comico8b 8b ComicSansMSItalic8b csb10 csbx10 csbx12 csbx5 csbx6 csbx7 csbx8 csbx9 csbxsl10 csbxti10 cscsc10 csdunh10 csff10 csfi10 csfib8 csinch csitt10 csr10 csr12 csr17 csr5 csr6 csr7 csr8 csr9 cssl10 cssl12 cssl8 cssl9 cssltt10 csss10 csss12 csss17 csss8 csss9 csssbx10 csssdc10 csssi10 csssi12 csssi17 csssi8 csssi9 csssq8 csssqi8 cstcsc10 csti10 csti12 csti7 csti8 csti9 cstt10 cstt12 cstt8 cstt9 csu10 csvtt10 dsrom10 dsrom12 dsrom8 dsss10 dsss12 dsss8 euex10 -r euex7 default euex10 -r euex8 default euex10 -r euex9 default euex10 -r eufb10 -r eufb5 -r eufb6 default eufb7 -r eufb7 -r eufb8 default eufb7 -r eufb9 default eufb10 -r eufm10 -r eufm5 -r eufm6 default eufm7 -r eufm7 -r eufm8 default eufm7 -r eufm9 default eufm10 -r eurb10 -r eurb5 -r eurb6 default eurb7 -r eurb7 -r eurb8 default eurb7 -r eurb9 default eurb10 -r eurm10 -r eurm5 -r eurm6 default eurm7 -r eurm7 -r eurm8 default eurm7 -r eurm9 default eurm10 -r eusb10 -r eusb5 -r eusb6 default eusb7 -r eusb7 -r eusb8 default eusb7 -r eusb9 default eusb10 -r eusm10 -r eusm5 -r eusm6 default eusm7 -r eusm7 -r eusm8 default eusm7 -r eusm9 default eusm10 -r ex-anttb antt-ex anttb ex-anttcb antt-ex anttcb ex-anttcl antt-ex anttcl ex-anttcm antt-ex anttcm ex-anttcr antt-ex anttcr ex-anttl antt-ex anttl ex-anttm antt-ex anttm ex-anttr antt-ex anttr exp-anttb antt-exp anttb exp-anttbi antt-exp anttbi exp-anttcb antt-exp anttcb exp-anttcbi antt-exp anttcbi exp-anttcl antt-exp anttcl exp-anttcli antt-exp anttcli exp-anttcm antt-exp anttcm exp-anttcmi antt-exp anttcmi exp-anttcr antt-exp anttcr exp-anttcri antt-exp anttcri exp-anttl antt-exp anttl exp-anttli antt-exp anttli exp-anttm antt-exp anttm exp-anttmi antt-exp anttmi exp-anttr antt-exp anttr exp-anttri antt-exp anttri favb8v t5 ArevSans-Bold-T5 favbi8v t5 ArevSans-BoldOblique-T5 favr8v t5 ArevSans-Roman-T5 favri8v t5 ArevSans-Oblique-T5 feybl10 feybo10 feybr10 feyml10 feymo10 feymr10 fplmb fplmbb fplmbi fplmr fplmri fplrc8v t5 fplrc8v Inuit Inuitb Inuitbo Inuito jthb8v t5d Tahoma-Bold jthr8v t5d Tahoma jvnb8v t5d Verdana-Bold jvnbi8v t5d Verdana-BoldItalic jvnr8v t5d Verdana jvnri8v t5d Verdana-Italic l7x-lmb10 lm-l7x lmb10 l7x-lmbo10 lm-l7x lmbo10 l7x-lmbx10 lm-l7x lmbx10 l7x-lmbx12 lm-l7x lmbx12 l7x-lmbx5 lm-l7x lmbx5 l7x-lmbx6 lm-l7x lmbx6 l7x-lmbx7 lm-l7x lmbx7 l7x-lmbx8 lm-l7x lmbx8 l7x-lmbx9 lm-l7x lmbx9 l7x-lmbxi10 lm-l7x lmbxi10 l7x-lmbxo10 lm-l7x lmbxo10 l7x-lmcsc10 lm-l7x lmcsc10 l7x-lmcsco10 lm-l7x lmcsco10 l7x-lmdunh10 lm-l7x lmdunh10 l7x-lmduno10 lm-l7x lmduno10 l7x-lmr10 lm-l7x lmr10 l7x-lmr12 lm-l7x lmr12 l7x-lmr17 lm-l7x lmr17 l7x-lmr5 lm-l7x lmr5 l7x-lmr6 lm-l7x lmr6 l7x-lmr7 lm-l7x lmr7 l7x-lmr8 lm-l7x lmr8 l7x-lmr9 lm-l7x lmr9 l7x-lmri10 lm-l7x lmri10 l7x-lmri12 lm-l7x lmri12 l7x-lmri7 lm-l7x lmri7 l7x-lmri8 lm-l7x lmri8 l7x-lmri9 lm-l7x lmri9 l7x-lmro10 lm-l7x lmro10 l7x-lmro12 lm-l7x lmro12 l7x-lmro17 lm-l7x lmro17 l7x-lmro8 lm-l7x lmro8 l7x-lmro9 lm-l7x lmro9 l7x-lmss10 lm-l7x lmss10 l7x-lmss12 lm-l7x lmss12 l7x-lmss17 lm-l7x lmss17 l7x-lmss8 lm-l7x lmss8 l7x-lmss9 lm-l7x lmss9 l7x-lmssbo10 lm-l7x lmssbo10 l7x-lmssbx10 lm-l7x lmssbx10 l7x-lmssdc10 lm-l7x lmssdc10 l7x-lmssdo10 lm-l7x lmssdo10 l7x-lmsso10 lm-l7x lmsso10 l7x-lmsso12 lm-l7x lmsso12 l7x-lmsso17 lm-l7x lmsso17 l7x-lmsso8 lm-l7x lmsso8 l7x-lmsso9 lm-l7x lmsso9 l7x-lmssq8 lm-l7x lmssq8 l7x-lmssqbo8 lm-l7x lmssqbo8 l7x-lmssqbx8 lm-l7x lmssqbx8 l7x-lmssqo8 lm-l7x lmssqo8 l7x-lmtcsc10 lm-l7x lmtcsc10 l7x-lmtcso10 lm-l7x lmtcso10 l7x-lmtk10 lm-l7x lmtk10 l7x-lmtko10 lm-l7x lmtko10 l7x-lmtl10 lm-l7x lmtl10 l7x-lmtlc10 lm-l7x lmtlc10 l7x-lmtlco10 lm-l7x lmtlco10 l7x-lmtlo10 lm-l7x lmtlo10 l7x-lmtt10 lm-l7x lmtt10 l7x-lmtt12 lm-l7x lmtt12 l7x-lmtt8 lm-l7x lmtt8 l7x-lmtt9 lm-l7x lmtt9 l7x-lmtti10 lm-l7x lmtti10 l7x-lmtto10 lm-l7x lmtto10 l7x-lmu10 lm-l7x lmu10 l7x-lmvtk10 lm-l7x lmvtk10 l7x-lmvtko10 lm-l7x lmvtko10 l7x-lmvtl10 lm-l7x lmvtl10 l7x-lmvtlo10 lm-l7x lmvtlo10 l7x-lmvtt10 lm-l7x lmvtt10 l7x-lmvtto10 lm-l7x lmvtto10 l7x-qbkbi q-l7x qbkbi l7x-qbkbi-sc q-l7x-sc qbkbi l7x-qbkb q-l7x qbkb l7x-qbkb-sc q-l7x-sc qbkb l7x-qbkri q-l7x qbkri l7x-qbkri-sc q-l7x-sc qbkri l7x-qbkr q-l7x qbkr l7x-qbkr-sc q-l7x-sc qbkr l7x-qcsbi q-l7x qcsbi l7x-qcsbi-sc q-l7x-sc qcsbi l7x-qcsb q-l7x qcsb l7x-qcsb-sc q-l7x-sc qcsb l7x-qcsri q-l7x qcsri l7x-qcsri-sc q-l7x-sc qcsri l7x-qcsr q-l7x qcsr l7x-qcsr-sc q-l7x-sc qcsr l7x-qplbi q-l7x qplbi l7x-qplbi-sc q-l7x-sc qplbi l7x-qplb q-l7x qplb l7x-qplb-sc q-l7x-sc qplb l7x-qplri q-l7x qplri l7x-qplri-sc q-l7x-sc qplri l7x-qplr q-l7x qplr l7x-qplr-sc q-l7x-sc qplr l7x-qtmbi q-l7x qtmbi l7x-qtmbi-sc q-l7x-sc qtmbi l7x-qtmb q-l7x qtmb l7x-qtmb-sc q-l7x-sc qtmb l7x-qtmri q-l7x qtmri l7x-qtmri-sc q-l7x-sc qtmri l7x-qtmr q-l7x qtmr l7x-qtmr-sc q-l7x-sc qtmr lasy10 -r lasy5 -r lasy6 -r lasy7 -r lasy8 -r lasy9 -r lasyb10 -r lcircle10 default lcircle1 -r lcirclew10 default lcirclew -r lcmss8 -r lcmssb8 -r lcmssi8 -r line10 -r linew10 -r lmbsy10 lm-mathsy lmbsy10 lmbsy5 lm-mathsy lmbsy5 lmbsy7 lm-mathsy lmbsy7 lmex10 lm-mathex lmex10 lmmi10 lm-mathit lmmi10 lmmi12 lm-mathit lmmi12 lmmi5 lm-mathit lmmi5 lmmi6 lm-mathit lmmi6 lmmi7 lm-mathit lmmi7 lmmi8 lm-mathit lmmi8 lmmi9 lm-mathit lmmi9 lmmib10 lm-mathit lmmib10 lmmib5 lm-mathit lmmib5 lmmib7 lm-mathit lmmib7 lmsy10 lm-mathsy lmsy10 lmsy5 lm-mathsy lmsy5 lmsy6 lm-mathsy lmsy6 lmsy7 lm-mathsy lmsy7 lmsy8 lm-mathsy lmsy8 lmsy9 lm-mathsy lmsy9 logo10 logo8 logo9 logobf10 logod10 logosl10 logosl8 logosl9 lprb8v t5uni PalatinoLinotype-Bold lprbi8v t5uni PalatinoLinotype-BoldItalic lprr8v t5uni PalatinoLinotype-Roman lprri8v t5uni PalatinoLinotype-Italic ma1b8v t5d Arial-BoldMT ma1bi8v t5d Arial-BoldItalicMT ma1r8v t5d ArialMT ma1ri8v t5d Arial-ItalicMT manfnt mcrb8v t5d CourierNewPS-BoldMT mcrbi8v t5d CourierNewPS-BoldItalicMT mcrr8v t5d CourierNewPSMT mcrri8v t5d CourierNewPS-ItalicMT mi-anttbi antt-mi anttbi mi-anttcbi antt-mi anttcbi mi-anttcli antt-mi anttcli mi-anttcmi antt-mi anttcmi mi-anttcri antt-mi anttcri mi-anttli antt-mi anttli mi-anttmi antt-mi anttmi mi-anttri antt-mi anttri mnsb8v t5d TimesNewRomanPS-BoldMT mnsbi8v t5d TimesNewRomanPS-BoldItalicMT mnsr8v t5d TimesNewRomanPSMT mnsri8v t5d TimesNewRomanPS-ItalicMT msam10 -r msam5 -r msam6 default msam7 -r msam7 -r msam8 default msam7 -r msam9 default msam10 -r msbm10 msbm5 msbm6 default msbm7 msbm7 msbm8 default msbm7 msbm9 default msbm10 mtex texmext blex mtsy default blsy MyriadPro-Bold-7m my-lf-oml MyriadPro-Bold MyriadPro-Bold-7t my-lf-ot1 MyriadPro-Bold MyriadPro-Bold-8c my-lf-ts1 MyriadPro-Bold MyriadPro-Bold-8t my-lf-t1 MyriadPro-Bold MyriadPro-BoldIt-7m my-lf-oml MyriadPro-BoldIt MyriadPro-BoldIt-7t my-lf-ot1 MyriadPro-BoldIt MyriadPro-BoldIt-8c my-lf-ts1 MyriadPro-BoldIt MyriadPro-BoldIt-8t my-lf-t1 MyriadPro-BoldIt MyriadPro-BoldIt-k my-lf-lgr MyriadPro-BoldIt MyriadPro-BoldIt-OSF-7m my-osf-oml MyriadPro-BoldIt MyriadPro-BoldIt-OSF-7t my-osf-ot1 MyriadPro-BoldIt MyriadPro-BoldIt-OSF-8c my-osf-ts1 MyriadPro-BoldIt MyriadPro-BoldIt-OSF-8t my-osf-t1 MyriadPro-BoldIt MyriadPro-Bold-k my-lf-lgr MyriadPro-Bold MyriadPro-Bold-OSF-7m my-osf-oml MyriadPro-Bold MyriadPro-Bold-OSF-7t my-osf-ot1 MyriadPro-Bold MyriadPro-Bold-OSF-8c my-osf-ts1 MyriadPro-Bold MyriadPro-Bold-OSF-8t my-osf-t1 MyriadPro-Bold MyriadPro-It-7m my-lf-oml MyriadPro-It MyriadPro-It-7t my-lf-ot1 MyriadPro-It MyriadPro-It-8c my-lf-ts1 MyriadPro-It MyriadPro-It-8t my-lf-t1 MyriadPro-It MyriadPro-It-k my-lf-lgr MyriadPro-It MyriadPro-It-OSF-7m my-osf-oml MyriadPro-It MyriadPro-It-OSF-7t my-osf-ot1 MyriadPro-It MyriadPro-It-OSF-8c my-osf-ts1 MyriadPro-It MyriadPro-It-OSF-8t my-osf-t1 MyriadPro-It MyriadPro-Regular-7m my-lf-oml MyriadPro-Regular MyriadPro-Regular-7t my-lf-ot1 MyriadPro-Regular MyriadPro-Regular-8c my-lf-ts1 MyriadPro-Regular MyriadPro-Regular-8t my-lf-t1 MyriadPro-Regular MyriadPro-Regular-k my-lf-lgr MyriadPro-Regular MyriadPro-Regular-OSF-7m my-osf-oml MyriadPro-Regular MyriadPro-Regular-OSF-7t my-osf-ot1 MyriadPro-Regular MyriadPro-Regular-OSF-8c my-osf-ts1 MyriadPro-Regular MyriadPro-Regular-OSF-8t my-osf-t1 MyriadPro-Regular omding omsea1 omsea1b omsea2 omsea2b omsea3 omsea3b omseco omsecob omsecobi omsecoi omsecx omsecxb omsecxbi omsecxi omsecy omsecyb omsecybi omsecyi omsegr omsegrb omsegrbi omsegri omseha omsehab omsehe omseheb omseip omseipb omseipbi omseipi omsela omselab omselabi omselai omseti omsetib pagd8r 8r uagd8a pagdo8r 8r uagdo8a pagk8r 8r uagk8a pagko8r 8r uagko8a pbkd8r 8r ubkd8a pbkdi8r 8r ubkdi8a pbkdo8r 8r ubkd8a -s .167 pbkl8r 8r ubkl8a pbkli8r 8r ubkli8a pbklo8r 8r ubkl8a -s .167 pbsi8r 8r BrushScriptX-Italic pccsc10 pcmi10 pcr10 pcr5 pcr6 pcr7 pcr8 pcr9 pcrb8r 8r ucrb8a pcrbo8r 8r ucrbo8a pcrr8r 8r ucrr8a pcrr8rn 8r ucrr8a -e .85 pcrro8r 8r ucrro8a pcsl10 pcslc9 pcti10 phvb8r 8r uhvb8a phvb8rn 8r uhvb8ac phvbo8r 8r uhvbo8a phvbo8rn 8r uhvbo8ac phvr8r 8r uhvr8a phvr8rn 8r uhvr8ac phvro8r 8r uhvro8a phvro8rn 8r uhvro8ac plb10 plrm plb10 plbsy10 plms plbsy10 plbx10 plrm plbx10 plbx12 plrm plbx12 plbx5 plrm plbx5 plbx6 plrm plbx6 plbx7 plrm plbx7 plbx8 plrm plbx8 plbx9 plrm plbx9 plbxsl10 plrm plbxsl10 plbxti10 plit plbxti10 plcsc10 plsc plcsc10 pldunh10 plrm pldunh10 plex10 plme plex10 plex9 plme plex9 plff10 plrm plff10 plfi10 plit plfi10 plfib8 plrm plfib8 plinch plin plinch plitt10 plitt plitt10 plmi10 plmi plmi10 plmi12 plmi plmi12 plmi5 plmi plmi5 plmi6 plmi plmi6 plmi7 plmi plmi7 plmi8 plmi plmi8 plmi9 plmi plmi9 plmib10 plmi plmib10 plr10 plrm plr10 plr12 plrm plr12 plr17 plrm plr17 plr5 plsc plr5 plr6 plrm plr6 plr7 plrm plr7 plr8 plrm plr8 plr9 plrm plr9 plsl10 plrm plsl10 plsl12 plrm plsl12 plsl8 plrm plsl8 plsl9 plrm plsl9 plsltt10 pltt plsltt10 plss10 plrm plss10 plss12 plrm plss12 plss17 plrm plss17 plss8 plrm plss8 plss9 plrm plss9 plssbi10 plrm plssbi10 plssbx10 plrm plssbx10 plssdc10 plrm plssdc10 plssi10 plrm plssi10 plssi12 plrm plssi12 plssi17 plrm plssi17 plssi8 plrm plssi8 plssi9 plrm plssi9 plssq8 plrm plssq8 plssqi8 plrm plssqi8 plsy10 plms plsy10 plsy5 plms plsy5 plsy6 plms plsy6 plsy7 plms plsy7 plsy8 plms plsy8 plsy9 plms plsy9 pltcsc10 pltt pltcsc10 pltex10 plte pltex10 pltex8 plte pltex8 pltex9 plte pltex9 plti10 plit plti10 plti12 plit plti12 plti7 plit plti7 plti8 plit plti8 plti9 plit plti9 pltt10 pltt pltt10 pltt12 pltt pltt12 pltt8 pltt pltt8 pltt9 pltt pltt9 plu10 plit plu10 plvtt10 plrm plvtt10 pncb8r 8r uncb8a pncbi8r 8r uncbi8a pncbo8r 8r uncb8a -s .167 pncr8r 8r uncr8a pncri8r 8r uncri8a pncro8r 8r uncr8a -s .167 pplb8r 8r uplb8a pplbi8r 8r uplbi8a pplbij8r 8r fplbij8a pplbj8r 8r fplbj8a pplbo8r 8r uplb8a -s .167 pplbu8r 8r uplbi8a -s -.1763 pplr8r 8r uplr8a pplr8rn 8r uplr8a -e .82 pplrc8r 8r fplrc8a pplri8r 8r uplri8a pplrij8r 8r fplrij8a pplro8r 8r uplr8a -s .167 pplrr8re 8r uplr8a -e 1.2 pplru8r 8r uplri8a -s -.1763 psyr default usyr psyro default usyr -s .167 ptmb8r 8r utmb8a ptmbi8r 8r utmbi8a ptmbo8r 8r utmb8a -s .167 ptmr8r 8r utmr8a ptmr8rn 8r utmr8a -e .82 ptmri8r 8r utmri8a ptmro8r 8r utmr8a -s .167 ptmrr8re 8r utmr8a -e 1.2 putb8r 8r putb8a putb8v t5 putb8v putb8x putbi8r 8r putbi8a putbi8v t5 putbi8v putbo8r 8r putb8a -s .167 putbo8v t5 putb8v -s 0.194 putr8r 8r putr8a putr8v t5 putr8v putr8x putri8r 8r putri8a putri8v t5 putri8v putro8r 8r putr8a -s .167 putro8v t5 putr8v -s 0.194 pxbex pxbexa pxbmia pxbsy pxbsya pxbsyb pxbsyc pxex pxexa pxmia pxsy pxsya pxsyb pxsyc pzcmi8r 8r uzcmi8a pzdr default uzdr qcrbi qcr qcrbi qcrb qcr qcrb qcrri qcr qcrri qcrr qcr qcrr qhvbi qhv qhvbi qhvb qhv qhvb qhvcbi qhv qhvcbi qhvcb qhv qhvcb qhvcri qhv qhvcri qhvcr qhv qhvcr qhvri qhv qhvri qhvr qhv qhvr qzcmi qzc qzcmi stmary10 stmary5 stmary6 stmary7 stmary8 stmary9 sy-anttbz antt-sy anttbi sy-anttcbz antt-sy anttcbi sy-anttclz antt-sy anttcli sy-anttcmz antt-sy anttcmi sy-anttcrz antt-sy anttcri sy-anttlz antt-sy anttli sy-anttmz antt-sy anttmi sy-anttrz antt-sy anttri sy default usyr t1xbtt t1xbttsc t1xbttsl default t1xbtt -s .167 t1xtt t1xttsc t1xttsl default t1xtt -s .167 tcxbtt tcxbttsl default tcxbtt -s .167 tcxtt tcxttsl default tcxtt -s .167 tmbi108r 8r utmbi8a tmbo108r 8r utmb8a -s .167 tmbu108r 8r utmbi8a -s -.277 tmrb108r 8r utmb8a tmri108r 8r utmri8a tmrm108r 8r utmr8a tmro108r 8r utmr8a -s .167 tmui108r 8r utmri8a -s -.277 txbex txbexa txbmia txbsy txbsya txbsyb txbsyc txbtt txbtt8v t5 txbtt8v txbttsc txbttsc8v t5 txbttsc8v txbttsl8v t5 txbtt8v -s 0.167 txbttsl default txbtt -s .167 txex txexa txmia txsy txsya txsyb txsyc txtt txtt8v t5 txtt8v txttsc txttsc8v t5 txttsc8v txttsl8v t5 txtt8v -s 0.167 txttsl default txtt -s .167 uagd8v t5 uagd8v uagdo8v t5 uagdo8v uagk8v t5 uagk8v uagko8v t5 uagko8v ubkd8v t5 ubkd8v ubkdi8v t5 ubkdi8v ubkdo8v t5 ubkd8v -s 0.277 ubkl8v t5 ubkl8v ubkli8v t5 ubkli8v ubklo8v t5 ubkl8v -s 0.277 ucrb8v t5 ucrb8v ucrbo8v t5 ucrbo8v ucrr8v t5 ucrr8v ucrro8v t5 ucrro8v ugqb8v t5 ugqb8v ugqbo8v t5 ugqb8v -s 0.194 uhvb8v t5 uhvb8v uhvbo8v t5 uhvbo8v uhvr8v t5 uhvr8v uhvro8v t5 uhvro8v umvs default marvosym uncb8v t5 uncb8v uncbi8v t5 uncbi8v uncbo8v t5 uncb8v -s 0.277 uncr8v t5 uncr8v uncri8v t5 uncri8v uncro8v t5 uncr8v -s 0.277 uplb8v t5 uplb8v uplbi8v t5 uplbi8v uplbo8v t5 uplb8v -s 0.277 uplr8v t5 uplr8v uplri8v t5 uplri8v uplro8v t5 uplr8v -s 0.277 utmb8v t5 utmb8v utmbi8v t5 utmbi8v utmbo8v t5 utmb8v -s 0.277 utmr8v t5 utmr8v utmri8v t5 utmri8v utmro8v t5 utmr8v -s 0.277 uzcmi8v t5 uzcmi8v vnb10 vnbx10 vnbx12 vnbx5 vnbx6 vnbx7 vnbx8 vnbx9 vnbxsl10 vnbxti10 vncccsc10 t5 CMConcreteSmallCaps8v vnccr10 t5 CMConcrete8v vnccsl10 t5 CMConcreteSlanted8v vnccti10 t5 CMConcreteItalic8v vncmbr10 t5 vncmbr10 vncmbr17 t5 vncmbr17 vncmbr8 t5 vncmbr8 vncmbr9 t5 vncmbr9 vncmbrbx10 t5 vncmbrbx10 vncmbrsl10 t5 vncmbrsl10 vncmbrsl17 t5 vncmbrsl17 vncmbrsl8 t5 vncmbrsl8 vncmbrsl9 t5 vncmbrsl9 vncmsltl10 t5 vncmsltl10 vncmtl10 t5 vncmtl10 vncsc10 vndunh10 vnff10 vnfi10 vnfib8 vnitt10 vnr10 vnr12 vnr17 vnr5 vnr6 vnr7 vnr8 vnr9 vnsl10 vnsl12 vnsl8 vnsl9 vnsltt10 vnss10 vnss12 vnss17 vnss8 vnss9 vnssbx10 vnssdc10 vnssi10 vnssi12 vnssi17 vnssi8 vnssi9 vnssq8 vnssqi8 vntcsc10 vnti10 vnti12 vnti7 vnti8 vnti9 vntt10 vntt12 vntt8 vntt9 vnu10 vnvtt10 wasy10 wasy5 wasy6 wasy7 wasy8 wasy9 wasyb10 wncy-anttb antt-wncy anttb wncy-anttbi antt-wncy anttbi wncy-anttcb antt-wncy anttcb wncy-anttcbi antt-wncy anttcbi wncy-anttcl antt-wncy anttcl wncy-anttcli antt-wncy anttcli wncy-anttcm antt-wncy anttcm wncy-anttcmi antt-wncy anttcmi wncy-anttcr antt-wncy anttcr wncy-anttcri antt-wncy anttcri wncy-anttl antt-wncy anttl wncy-anttli antt-wncy anttli wncy-anttm antt-wncy anttm wncy-anttmi antt-wncy anttmi wncy-anttr antt-wncy anttr wncy-anttri antt-wncy anttri wncyb10 wncyb5 default wncyb10 wncyb6 default wncyb10 wncyb7 default wncyb10 wncyb8 default wncyb10 wncyb9 default wncyb10 wncyi10 wncyi5 default wncyi10 wncyi6 default wncyi10 wncyi7 default wncyi10 wncyi8 default wncyi10 wncyi9 default wncyi10 wncyr10 wncyr5 default wncyr10 wncyr6 default wncyr10 wncyr7 default wncyr10 wncyr8 default wncyr10 wncyr9 default wncyr10 wncysc10 wncyss10 wncyss8 default wncyss10 wncyss9 default wncyss10 xyatip10 -r xyatip11 default xyatip10 -e 1.1 -r xyatip12 default xyatip10 -e 1.2 -r xybsql10 -r xybtip10 -r xybtip11 default xybtip10 -e 1.1 -r xybtip12 default xybtip10 -e 1.2 -r xycirc10 -r xycmat10 -r xycmat11 default xycmat10 -e 1.1 -r xycmat12 default xycmat10 -e 1.2 -r xycmbt10 -r xycmbt11 default xycmbt10 -e 1.1 -r xycmbt12 default xycmbt10 -e 1.2 -r xydash10 -r xyeuat10 -r xyeuat11 default xyeuat10 -e 1.1 -r xyeuat12 default xyeuat10 -e 1.2 -r xyeubt10 -r xyeubt11 default xyeubt10 -e 1.1 -r xyeubt12 default xyeubt10 -e 1.2 -r yfrak ygoth yswab zd default uzdr dvisvgm-2.8.1/tests/data/sample-wf-cmp.svg0000664000175000017500000013361113510660062015374 00000000000000 Colortest: red, blue, magen ta x 0 cos t d t = k =0 ( 1) k x 2 k +1 (2 k +1)! Fon t st yles: bold , emphasized , sansserif , SmallCaps , slanted 1 dvisvgm-2.8.1/tests/data/frktest-wf-cmp.svg0000664000175000017500000050021313510660062015571 00000000000000 Nonummys id sem»r aliena auditorum lorem ipsum quod omnia sunt »ccatore‘: Lorem ipsum ˘lor s it amet con se˝etuer adi- piscing elit: Sed diam tem–r incidunt ut laˆre et ˘lor magna aliquam erat volu«t ut wis i enim ad minim ffiniam qui‘ no<rud oblationem cor–remque suscipit laˆri‘ D ie Orgel ,der Flđgel ,daŊ Fortepiano unddaŊ Clavicord sind die gebrĽuĚliĚĆen ClavierinĆrumente zum Accompagnement. SĚade, da die sĚŹne Erfindung deŊ HolfeldisĚen BogenclavierŊ noĚniĚt gemeinnđŃig geworden iĆ; man kann dahero deĄen besondere Vorzđge hierinnen noĚ niĚt genau beĆimmen. gewi zu glauben, da s auĚ bey der Begleitung gut auŊnehmen werde. V ondem ĆattliĚen Orte KirĚehrenbaĚ in der FrŁnkisĚen SĚweiz f§hrt ein einsameŊ StrŁĚen, an der Ćeil abƧr- zenden Breitseite der Ehrenb§rg vor§ber, gen LeutenbaĚ. In einer halben Stunde daŊ sĚmuĘe Pfarrdorf erreiĚt. S§dŽĆliĚ deŊselben, kaum eine ViertelĆunde entfernt, treĎen wir auf dem Wege naĚ OrtspiŃ in einem SeitentŁlĚen von unber§hrter Na- tursĚŽnheit daŊ uralte, einsame KirĚlein \Sankt MoriŃ" mit seinem Ćillen Friedhofe. In der NŁhe deŊ KirĚleinŊ Ćeht ein niedrigeŊ, §ber eine Quelle erbauteŊ FeldkapellĚen mit der Statue deŊ hl. MauritiuŊ, dargeĆellt alŊ Ritter in voller Wehr. dvisvgm-2.8.1/tests/data/sample_v2.dvi0000664000175000017500000000177013510660062014577 00000000000000; TeX output 2017.11.22:1132y>color push gray 0Y color pop?>color push gray 0 K`y cmr10ColorUUtest:qcolor push rgb 1 0 0red color pop,color push rgb 0 0 1blue color pop,color push cmyk 0 1 0 0magenta color pop.,"LineUUoftextwitha1Wps: gsave currentpoint currentpoint translate 30 neg rotate neg exch neg exch translaterotated ps: currentpoint grestore moveto%,word.5!ຯ 2Ӎ rstUUcolumnnsecondUUcolumnLoremUUipsumndolorUUsitamet conseteturUUsadipscingnelitrsedUUdiamnonumyneirmoGdUUtemporinviduntK:jNffbGoxedUUtext9ff5w~ $ X-ff4 X-ff33ff5w~>color push gray 01Y color pop*;y K`y cmr10dvisvgm-2.8.1/tests/data/cmr10.600gf0000664000175000017500000005726413536450235013711 00000000000000 METAFONT output 2010.06.18:1911DA7:;;ddcccbbba a a ``_ __^ ^^] ]]\ \ \ [ [ [ Z Z Z Y YYX XXW WWVVVUUUTTTSSRRQP N  JJJEDB2588#J&J(Q  RRRRRRRR R R R R R R RR RRRRRR RRRRRRRRRRR RR R R R R R R RR R R RR R R Q  J*J(J%EDC16<: ^ [ Y XVUT SRQPOON!N!M"M#L #L$K %K %K %K&J J J J J J J J J J J J J KK %K %K %L%L $M#M#N"N!O O PQRSTUVXY [^a EDD6988"J%J'Q  R RRRRRRRRRRRRRRRRRRR R R R R R R R R R R R RRRRRRRRRRRRRRRRRR Q  J(J%J"EDE3688.J.J.Q  RRRRRRRRRRRRR R R RRRRRRR RRRR RRRRRRRRRR R R R RRRRRRRRRRQ  J0J0J0EDF/288-J-J-Q  RRRRRRRRRRRRRR R RRRRRRR R RRRR R RRRRRRRRRRRRRRRRRRRRRQ JJJEDG8<<: ^ \ Z XVUT SRQPO O N"N"M#M$L $L%K &K &K &K &J J J J J J J J J J J J J K K  K K L L MMNNOOPQR S T UV X Z \ ^b EDH7:88JJQ  RRRRRRRRRRRRRRRRRRRRRRR'R'R'RRRRRRRRRRRRRRRRRRRRRRRRQ  JJJEDI88JJR SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSR JJJEDJ#&:8 TT] _______________________________________L K J J J J J J K KLM N OQ SEDK9<88JJQ  RRRRRRRRRRRRRRRR R R R R RR R R R R R R R R R R R R R R R R R R R R R R R R R R R Q  J J J EDL-088JJQ RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQ  J+J+J+EDMEH88%J#J#Q # R!R!RRRRRRRRRRRRRRRRRRRR  R  R  R  R  R   R   R   R   R   R   R   R   RRRRRRRRRRRRRQPN  J  J  J  EDN7:88JJR  R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R RRRRQPN JJJEDO6;<: ]ZY WVTSRQQPOON N M M"L"L"L"K " K$K$K$J $ J $ J $ J $ J $ J $ J $ J $ J $ J $ J $ J $ K$K " K " K " L"L"M M M NOOPQQRSTUWX Z]` EDP0388"J%J'Q  RRRRRR RRR R R R R R R RRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRRRRQ JJJEDQ6;J: ]ZY WVTSRQQPOONN M M L"L"L"K " K " K$K$J $ J $ J $ J $ J $ J $ J $ J $ J $ J $ J $ J $ K$K$K " K " L"L"M M M NO  O P QQ R S T U W X Z ]` m m m mmnnnnoop q sEDR9<:8J#J%Q R RRRRRRRR R R R R R RRRRRRRRR RRR RRRRRRRRRRRRR R R R R R R R R R R Q  JJJt wEDS%)<: T RPO N MLLKKKJJJJJJJJJ K K K LMMNOPRTW[_c d e fggJJJJJJJJJJJJJJJ JJ JJ J EDT58881L1L1L LKKKKKKKKKJJJJJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_ U U U EDU7::8 J J Q  RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSTTUUVWXYZ []_cEDV9;:8JJP  Q Q RR SSS TTT UU VVV WWW XXYYY ZZZ [ [ \ \ \ ] ] ] ^^___ ``` aab b b cccddeeeEDWPR:8 J J O   P  QQQ RRR SSS T T T  U UUV VVW WWX  X  X  Y  Y   Y   Z   Z Z Z  [[[ \\\ ]]] ^  ^  ^  _  __```aaabbEDX9;88 K K R  S T U U V W W X X Y Z Z [ \ \ ] ^^ _ _ ` a a b c c b ba ` ` _ ^ ^ ] \ \ [ Z Z Y X X W V V UT R O JJJEDY;<88JJP  R S S T U U V V W X X Y Y Z [ [ \ \ ] ^ ^ _ _ ` a a b b c ddddddddddddddddddddc \\\EDZ).88&L&L&L L L L L LL K K K KK K K K K_ ^ ^ ] ]\ [ [ Z ZY X X W WV U U T TS R R Q QP O O N NM L L K  K J(J(J(EDa&)&% RPO N M M M M M NObbbb[ WT R P N MLKKKJJJJJJK K L N PS EDb(*:9J J J NPPPPPPPPPPPPPPPPPP PP P P PPPPPPPPPPPPPPPPPPPPPPPPPPPP P PP ]EDc"&%USQ P O N N M L LKKKKJJJJJJJJJJKKKLLMMNOP Q SU WEDd(+:9` ` ` dffffffffffffffffXU SR P ONNMLLKKKJJJJJJJJJJKKKLLMMNO P Q  S U  WEDe "&% U SQ P O NMMLLKKKJJJJ J JJJJJKKKKLLMNOOQR SUXEDf::X VUTSSRRQ QQQQQQQQQQQQQJJJQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPKKKEDg&(7%V T RQP O N N MMMMMMMMN N O P PPO ONNNNNNNOOPQPN MLKKJJJJJJKLLNOQ SW EDh)+99J J J NPPPPPPPPPPPPPPPPPP PP P P P PPPPPPPPPPPPPPPPPPPPPPPPPPOJJJEDi77NM M M M M NPG J J J OPPPPPPPPPPPPPPPPPPPPPPPPPPPPOJJJEDjH7WV V V V V WYG R R R WYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYL KJJJJJKLN PEDk(*99J J J NPPPPPPPPPPPPPPPPPP P P P P P P P P P P PPPPPP PP PPPP P P P P P P PPPO JJJEDl99J J J NPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOJJJEDm@B$$J  J J   N  P  P  PPPPPPPPPPPPPPPPPPPPPPPPPPOJJJEDn)+$$J  J J  N P P PPPPPPPPPPPPPPPPPPPPPPPPPPOJJJEDo%'&% V TR Q PONMMLLKKKKJJJJJJJJJKKKLLMNNOP R SUX EDp(*4$J  J J  N P PPPPPPPPPPPPPPPPPPPPPPPPPPP P P PP PPPPPPPPPPPPOJJJEDq(+4$ U SR P O NNMLLKKKJJJJJJJJJJKKKLLMMNO P Q SU Wfffffffffffe```EDr$$J  J J NPPPP PPPPPPPPPPPPPPPPPPPPPPPPOJJJEDs&%P NM L KKJJJJJJJK KLMNPRW []JJJJJJJJJJJJ JJ JEDt32 UUUUTTTSSSRQPOMJJQQQQQQQQQQQQQQQQQQQ Q Q Q Q Q Q Q Q R R SSTV YEDu)+%$J J J NPPPPPPPPPPPPPPPPPPPPPPPPPPQQ R R  T U XEDv')$# J J N OPPQQRRR S S T T T U U VVVWWXXXYYY ZZ[[[\\EDw79$# J J N  O O PPQ Q Q R  R  R  S  S  S  TTTUUUV V W W W X X X Y YYZZ[EDx)*##JJP Q R S T U UVWWXY ZZ[\[[ ZYXWWV U T S RQN J J J EDy')4# J J N OPQQQRRS S S T T U U UVVWWWXXYYY ZZ[[[\\\\[[[ZZK JJJJJKLM NEDz!##LL LLLLKKKKK K K XWWVUTTS RRQPOONMMLKJJJED-088+J+J+Q  RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQ JJJED<@;;ffeeddc c b b a a ` ` _ _ ^ ^ ] ] \ \ [ [ Z Z Y Y X X W W V V U U T T S S R R! R"Q# Q$P% P&O' O(N) N*M+ M6L8L8K:K:J":) TS S S S S TVG WWWVVVVVVVUUUTTSRRQPONMLKKJJJJJJJJKKLM N PS ED$$J J J OPPPPPPPPPPPPPPPPPPPPPPPPPPPPOJJJED5$R R R WYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYL KJJJJJKLN PED%';:W UTS R Q Q PPPPPPPPPPP P P P P J J J P P P PPPPPPPPPPPPPPPPPPPPPP PPPPOJ J J  ^ED69&% R PO N  M  M M M M NObbbbb\$W)T Q O N MLKKJJJJJ J KK  L  N P S ED<>&%U  S R  P  O NNM L LKKKJJJJJJJJJJJKKKL L M NNOP  R   S U  XED#&3+hggffXU SR P PONMMLLKKK J J J  J  J  J  J  J  J J K KKLLMNNOP Q QQ P OONNMMLEDEH88.\.\.c  cbbbaaa```__^^ ^  ] ] ] \ \ \ [ [  [  Z'Z'Y(Y Y XXX W W W V V VUUTTTSSSRQPN   J)J)J)EDKQ<: ]Z'X %W$V  TSRQQPOONNMMLLLK K KKJ J J  J J J J  J J J J J K  K  K  K  L L L MM NN OPQQRSTU  W&X 'Z)]` ED6;A<.x` ] ZYWVTSRQQPOONNMML L L K K K KJJJJJJJJJJJJK K K K L L MMMNOOPQQRSTTSRRQ P POED! ;;KJ J J J J J J J KKKKKKKKKKKLLLLLLLLLLLMMMMMMMMMMMGKJ J J J J KMED< ;)KJ J J J J KMGMMMMMMMMMMLLLLLLLLLLLKKKKKKKKKKKJ J J J J J J J KMED#:?I9eed d ddc c cccb b bba a aa` ` ```_ K8J:J:K8] ]]]\ \ \\[ [ [[[Z K8J:J:K8X XXXW W WWV V VVU U UUUT T TTS S SSTED%:?B= #Q ONNM L L K  K K JJJJJJJJJJ J K K  K  L  L  M  N N O Q S d d c b b a  `  `  _  ^  ^  ] \ \ [ZZYXXWVVU T T S R R QPPP! Q$ED' 9KJ J J J J K MRRRRQQQPPOONMLKKED(Q=ZYXWVUTSSRQQPPOONNNMMMLLLKKKKKKJJJJJJJJJJJJJJJJJJKKKKKKLLLMMMNNNOOPPQQRSSTUVWXYZ[ED)Q=JKLMNNOPPQRRSSSTTUUUVVVVVWWWWWWXXXXXXXXXXXXXXXXXXWWWWWWVVVVVUUUTTSSSRRQPPONNMLKJJED*$#=WWWWWWWK  JJKLNPRT VVT RPNLKJJK  WWWWWWWXED+6;5/ccccccccccccccccccccccccK4J6J6K4ccccccccccccccccccccccccdED, KJ J J J J K MRRRRQQQPPOONMLKKED. KJ J J J J KMED/$R=edddcccbbbaaa```___^^^]]]\\\[[[ZZZYYYXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJKED: ##KJ J J J J KMGKJ J J J J KMED; 3#KJ J J J J KMGKJJ J J J KMQQQQPPPOOONMMLKKED=6;4J6J6K4G4J6J6K4ED@6;;: ]Z YWUTSR Q"P$P&ON N M   M   L   L  L K K K K J J  J  J  J  J  J  J  J  J  J  J  K  K  K K L L L  M  M  N N  O PPQRST$UW Y Z ]` ED[ R= J J J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ J J J ED] R= J J J SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSJ J J J ED` 9PONMMLLKKKJJJJJJJ J J J K K LNED9JJJJKMNOPRSTUWED 9 SSRQPPONMMLKJJED 4KK MNOQ RSUED! 9JJJKKKLM M NOQ SED#0JJED&;M LK K J J J J J K K LM OEC PPP TUVWWWVUR JJ ED  YVT Q N K KKKED^ 9 TSRQ PONM L KJKED_ 7LKKJ KKLMED}"9 NNNMMM M L L L K K K K ED~"6O N MLK J KED!7 K J  J  J  J  J  K M ED 34:: [ YW U T S S R R QQQQQQQQQQQQQJ-J-J-QQQQQQQQQQQQQQQQQQQQQQQQQQQQQPKKKED *+:: [YW UT S S RRQQQQQQQQQQQQQJ$J$J$QQQQQQQQQQQQQQQQQQQQQQQQQQQQQPKKKED *+:: [Y W U T S S RRQQQQQQQQQQQQQJ$J$J$QQQQQQQQQQQQQQQQQQQQQQQQQQQQQPKKKEDAB:: [ YW  UT S S R R QQQQQQQQQQQQQJ;J;J;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQPKKKEDAB::  [Y W  U T S S R R QQQQQQQQQQQQQJ;J;J;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQPKKKED"9 K J  J  J  J  J  K  M RRRRQ QQP PO ON M L K KED-JJJJED\&9P O N M ML LK KKJ JJJJJ J  J  J  J  K  K  L N ED{)))J)ED|RR@RJ@RE fontid=CMRcodingscheme=TeX text fontfacebyte jobname=cmr10mag=1 mode=ljfourpixels_per_inch=600 blacker=0.25fillin=0o_correction=1XnK`yM]M]R=4 (E UX)8A q*: s+(7 ,> ,< ;-sA q.,< ;. A q/ < ;0 0 UXQ .R .SE UXTE UXVq<<*O*O*P"*PI*P> P%sP*=`< ;>aA q?6*@!KqAT8B]A qC qQ!qE"*Wg#E UXF$*9%E UXG &A q:A'qH( 8H) 8I**J@+A qJ,qK:-UVW.qKu/*K0*11*22*363*34*45*5C6*57*68*7d9*8;:qL;;qLh<qE=A qL>';<?';;x@A qLA> #B; UXC< ;D? 8E9 F6 q~GA ;?H> 0IJ+8KA q'L4  ML N>  hOA q P9 QA q;R= |S.sT< ;LU> V> WUqX> RY> +Z3 [qNC\*W]qN^*Q_qQN`qOa*b.Pc%s%d.e%ssfg*h.Ziq'jk,q%lqmE UXen. \o* p.!q,q"cr!DF#0s!O#t 8$.u.$v,q%^w< ;%x,q&y,q'ez%s({*XV|SXa}*Qg~*Q*QYdvisvgm-2.8.1/tests/data/dvips_test.map0000664000175000017500000003635213510660062015072 00000000000000% /var/lib/texmf/fonts/map/dvips/updmap/ps2pk.map: maintained by the script updmap. % Don't change this file directly. Edit texmf/web2c/updmap.cfg % and run updmap to recreate this file. % A log of the updmap run that has created this file is available here: % /var/lib/texmf/web2c/updmap.log antpb AntykwaPoltawskiego-Bold "encantp ReEncodeFont" ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileSystem.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; TEST(FileSystemTest, exists) { EXPECT_TRUE(FileSystem::exists(SRCDIR"/FileSystemTest.cpp")); EXPECT_FALSE(FileSystem::exists(SRCDIR"/FileSystemTest.cxx")); } TEST(FileSystemTest, filetype) { EXPECT_TRUE(FileSystem::isFile(SRCDIR"/FileSystemTest.cpp")); EXPECT_FALSE(FileSystem::isDirectory(SRCDIR"/FileSystemTest.cpp")); EXPECT_TRUE(FileSystem::isDirectory("../tests")); EXPECT_FALSE(FileSystem::isFile("../tests")); } TEST(FileSystemTest, remove) { const char *tmpfile = "out.tmp"; ofstream ofs(tmpfile); ofs << "FileSystemTest::remove\n"; ofs.close(); EXPECT_TRUE(FileSystem::exists(tmpfile)); FileSystem::remove(tmpfile); EXPECT_FALSE(FileSystem::exists(tmpfile)); } TEST(FileSystemTest, rename) { const char *tmpfile1 = "out.tmp"; const char *tmpfile2 = "out-new.tmp"; ofstream ofs(tmpfile1); ofs << "FileSystemTest::remove\n"; ofs.close(); EXPECT_TRUE(FileSystem::exists(tmpfile1)); FileSystem::rename(tmpfile1, tmpfile2); #ifndef __WIN32__ EXPECT_FALSE(FileSystem::exists(tmpfile1)); #endif EXPECT_TRUE(FileSystem::exists(tmpfile2)); FileSystem::remove(tmpfile2); EXPECT_FALSE(FileSystem::exists(tmpfile2)); } TEST(FileSystemTest, filesize) { const char *tmpfile = "out.tmp"; ofstream ofs(tmpfile, ios::binary); for (int i=0; i < 123; ++i) ofs.put(i); ofs.close(); EXPECT_EQ(FileSystem::filesize(tmpfile), 123u); FileSystem::remove(tmpfile); } TEST(FileSystemTest, copy) { const char *tmpfile1 = "out.tmp"; const char *tmpfile2 = "out-new.tmp"; ofstream ofs(tmpfile1); ofs << "FileSystemTest::copy\n"; ofs.close(); FileSystem::copy(tmpfile1, tmpfile2); ifstream ifs1(tmpfile1); ifstream ifs2(tmpfile2); EXPECT_TRUE(ifs1 && ifs2); while (!ifs1.eof()) { EXPECT_EQ(ifs1.get(), ifs2.get()); } EXPECT_TRUE(ifs2.eof()); ifs1.close(); ifs2.close(); FileSystem::remove(tmpfile1); FileSystem::remove(tmpfile2); } TEST(FileSystemTest, move) { const char *tmpfile1 = "out.tmp"; const char *tmpfile2 = "out-new.tmp"; ofstream ofs(tmpfile1); const char *str = "FileSystemTest::copy\n"; ofs << str; ofs.close(); FileSystem::copy(tmpfile1, tmpfile2, true); ifstream ifs1(tmpfile1); ifstream ifs2(tmpfile2); EXPECT_TRUE(!ifs1 && ifs2); while (*str) { EXPECT_EQ(*str++, ifs2.get()); } ifs2.get(); EXPECT_TRUE(ifs2.eof()); ifs2.close(); FileSystem::remove(tmpfile2); } dvisvgm-2.8.1/tests/CalculatorTest.cpp0000664000175000017500000000553613510660062014733 00000000000000/************************************************************************* ** CalculatorTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Calculator.hpp" #include "Length.hpp" TEST(CalculatorTest, eval) { Calculator calc; EXPECT_EQ(calc.eval("2+3+4"), 9); EXPECT_EQ(calc.eval("2*3+4"), 10); EXPECT_EQ(calc.eval("2+3*4"), 14); EXPECT_EQ(calc.eval("(2+3)*4"), 20); EXPECT_EQ(calc.eval("2*(3+4)"), 14); EXPECT_EQ(calc.eval("-2+3+4"), 5); EXPECT_EQ(calc.eval("3/2"), 1.5); EXPECT_EQ(calc.eval("3%2"), 1); } TEST(CalculatorTest, variables) { Calculator calc; calc.setVariable("a", 1); EXPECT_EQ(calc.getVariable("a"), 1); calc.setVariable("a", 2); EXPECT_EQ(calc.getVariable("a"), 2); calc.setVariable("b", 3); EXPECT_EQ(calc.eval("a+b"), 5); EXPECT_EQ(calc.eval("2a+2b"), 10); } TEST(CalculatorTest, exceptions) { Calculator calc; ASSERT_THROW(calc.eval("2++3"), CalculatorException); ASSERT_THROW(calc.eval("c"), CalculatorException); ASSERT_THROW(calc.eval("1/0"), CalculatorException); ASSERT_THROW(calc.eval("1%0"), CalculatorException); ASSERT_THROW(calc.eval("2*(3+4"), CalculatorException); ASSERT_THROW(calc.eval("2*(3+4))"), CalculatorException); } TEST(CalculatorTest, units) { Calculator calc; for (auto unit : Length::getUnits()) calc.setVariable(unit.first, Length(1, unit.second).bp()); EXPECT_DOUBLE_EQ(calc.eval("1bp+3bp"), 4.0); EXPECT_DOUBLE_EQ(calc.eval("1bp+1in"), 73.0); EXPECT_DOUBLE_EQ(calc.eval("5cm/1cm"), 5.0); EXPECT_DOUBLE_EQ(calc.eval("5cm/1cm"), 5.0); EXPECT_DOUBLE_EQ(calc.eval("5cm"), 5/2.54*72); } dvisvgm-2.8.1/tests/check-conv0000775000175000017500000000230013510660062013226 00000000000000#!/bin/bash # This file is part of the dvisvgm package and published under the # terms of the GNU General Public License version 3 or later. # See file COPYING for further details. # Copyright (C) 2009-2019 Martin Gieseking files=(sample frktest) state=0 BLUE="\E[0;34m" GREEN="\E[0;32m" RED="\E[0;31m" COLOR_OFF="\E[0m" if [ \! -e enable-check-conv ]; then echo -e "${BLUE}conversion checks skipped${COLOR_OFF}" exit 0 fi for f in ${files[@]}; do for m in "wf" "nf"; do infile=${srcdir}/$f outfile=$f-$m.svg cmpfile=${srcdir}/$f-$m-cmp.svg if [ $m = "wf" ]; then ../src/dvisvgm -v0 -o$outfile $infile else ../src/dvisvgm -v0 -n -o$outfile $infile fi xsltproc --novalid ${srcdir}/normalize.xsl $outfile | xmllint --format - >tmp1.svg xsltproc --novalid ${srcdir}/normalize.xsl $cmpfile | xmllint --format - >tmp2.svg mv tmp1.svg $outfile diff $outfile tmp2.svg >$f-$m.diff #>/dev/null if [ $? -ne 0 ]; then echo -en "${RED}FAILED $COLOR_OFF" state=1 else echo -en "${GREEN}PASSED $COLOR_OFF" rm $outfile fi echo "converting $f.dvi (mode $m)" if [ \! -s $f-$m.diff ]; then rm $f-$m.diff fi rm tmp2.svg done done exit $state dvisvgm-2.8.1/tests/VectorStreamTest.cpp0000664000175000017500000000434413510660062015254 00000000000000/************************************************************************* ** VectorStreamTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "VectorStream.hpp" using std::string; using std::vector; TEST(VectorStreamTest, read1) { const char *str = "abcdefghijklm\0nopqrstuvwxyz"; vector vec(str, str+27); VectorInputStream vs(vec); for (unsigned count = 0; vs; count++) { int c = vs.get(); if (count < vec.size()) { EXPECT_EQ(c, str[count]) << "count=" << count; } else { EXPECT_EQ(c, -1); } } } TEST(VectorStreamTest, read2) { vector vec; VectorInputStream vs(vec); EXPECT_EQ(vs.get(), -1); } TEST(VectorStreamTest, read3) { vector vec; vec.push_back(-2); vec.push_back(-1); vec.push_back(0); vec.push_back(1); VectorInputStream vs(vec); EXPECT_EQ(vs.get(), 254); EXPECT_EQ(vs.get(), 255); EXPECT_EQ(vs.get(), 0); EXPECT_EQ(vs.get(), 1); EXPECT_EQ(vs.get(), -1); } dvisvgm-2.8.1/tests/ShadingPatchTest.cpp0000664000175000017500000000705513510660062015175 00000000000000/************************************************************************* ** ShadingPatchTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "ShadingPatch.hpp" #include "TensorProductPatch.hpp" #include "TriangularPatch.hpp" using namespace std; TEST(ShadingPatchTest, create) { auto patch = ShadingPatch::create(4, Color::ColorSpace::RGB); EXPECT_TRUE(dynamic_cast(patch.get())); patch = ShadingPatch::create(5, Color::ColorSpace::RGB); EXPECT_TRUE(dynamic_cast(patch.get())); patch = ShadingPatch::create(6, Color::ColorSpace::RGB); EXPECT_TRUE(dynamic_cast(patch.get())); patch = ShadingPatch::create(7, Color::ColorSpace::RGB); EXPECT_TRUE(dynamic_cast(patch.get())); } TEST(ShadingPatchTest, fail) { for (int i=0; i < 4; i++) { EXPECT_THROW(ShadingPatch::create(i, Color::ColorSpace::RGB), ShadingException); } } TEST(ShadingPatchTest, colorQueryFuncs) { vector points(3); vector colors(3); colors[0].setRGB(1.0, 0.0, 0.0); colors[1].setRGB(0.0, 1.0, 0.0); colors[2].setRGB(0.0, 0.0, 1.0); TriangularPatch tp1(points, colors, Color::ColorSpace::RGB, 0, 0); EXPECT_EQ(tp1.colorAt(0, 0).rgbString(), "#f00"); EXPECT_EQ(tp1.colorAt(1, 0).rgbString(), "#0f0"); EXPECT_EQ(tp1.colorAt(0, 1).rgbString(), "#00f"); colors[0].setGray(0.2); colors[1].setGray(0.4); colors[2].setGray(0.6); TriangularPatch tp2(points, colors, Color::ColorSpace::GRAY, 0, 0); EXPECT_EQ(tp2.colorAt(0, 0).rgbString(), "#333"); EXPECT_EQ(tp2.colorAt(1, 0).rgbString(), "#666"); EXPECT_EQ(tp2.colorAt(0, 1).rgbString(), "#999"); colors[0].setCMYK(1.0, 0.0, 0.0, 0.2); colors[1].setCMYK(0.0, 1.0, 0.0, 0.4); colors[2].setCMYK(0.0, 0.0, 1.0, 0.6); TriangularPatch tp3(points, colors, Color::ColorSpace::CMYK, 0, 0); EXPECT_EQ(tp3.colorAt(0, 0).rgbString(), "#29cccc"); EXPECT_EQ(tp3.colorAt(1, 0).rgbString(), "#993d99"); EXPECT_EQ(tp3.colorAt(0, 1).rgbString(), "#66663d"); colors[0].setLab(55, 80, 68); colors[1].setLab(30, 62, -108); colors[2].setLab(85, -72, 61); TriangularPatch tp4(points, colors, Color::ColorSpace::LAB, 0, 0); EXPECT_EQ(tp4.colorAt(0, 0).rgbString(), "#ff1402"); EXPECT_EQ(tp4.colorAt(1, 0).rgbString(), "#002bf8"); EXPECT_EQ(tp4.colorAt(0, 1).rgbString(), "#4af356"); } dvisvgm-2.8.1/tests/CMapManagerTest.cpp0000664000175000017500000000563613510660062014756 00000000000000/************************************************************************* ** CMapManagerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "CMap.hpp" #include "CMapManager.hpp" #include "Message.hpp" TEST(CMapManagerTest, lookup_buildin) { CMapManager &manager = CMapManager::instance(); CMap *cmap=0; ASSERT_NE((cmap = manager.lookup("Identity-H")), nullptr); EXPECT_STREQ(cmap->name(), "Identity-H"); EXPECT_EQ(cmap->getROString(), "Adobe-Identity"); EXPECT_TRUE(cmap->mapsToCID()); ASSERT_NE((cmap = manager.lookup("Identity-V")), nullptr); EXPECT_STREQ(cmap->name(), "Identity-V"); EXPECT_EQ(cmap->getROString(), "Adobe-Identity"); EXPECT_TRUE(cmap->mapsToCID()); ASSERT_NE((cmap = manager.lookup("unicode")), nullptr); EXPECT_STREQ(cmap->name(), "unicode"); EXPECT_EQ(cmap->getROString(), ""); EXPECT_FALSE(cmap->mapsToCID()); EXPECT_EQ(cmap->path(), nullptr); } TEST(CMapManagerTest, lookup_file) { CMapManager &manager = CMapManager::instance(); CMap *cmap = manager.lookup("ot1.cmap"); ASSERT_NE(cmap, nullptr); EXPECT_STREQ(cmap->name(), "ot1.cmap"); EXPECT_EQ(cmap->getROString(), ""); EXPECT_FALSE(cmap->mapsToCID()); EXPECT_EQ(cmap->bfcode(0x00), 0x0393u); EXPECT_EQ(cmap->bfcode(0x01), 0x0394u); EXPECT_EQ(cmap->bfcode(0x02), 0x0398u); EXPECT_EQ(cmap->bfcode(0x7c), 0x2014u); EXPECT_EQ(cmap->bfcode(0x7d), 0x02ddu); EXPECT_EQ(cmap->bfcode(0x7f), 0x00a8u); EXPECT_EQ(cmap->bfcode(0x80), 0u); } TEST(CMapManagerTest, lookup_fail) { Message::LEVEL = 0; // avoid warning messages CMapManager &manager = CMapManager::instance(); EXPECT_EQ(manager.lookup("does-not-exists"), nullptr); } dvisvgm-2.8.1/tests/CommandLineTest.cpp0000664000175000017500000002036713510660062015027 00000000000000/************************************************************************* ** CommandLineTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "CommandLine.hpp" using namespace std; TEST(CommandLineTest, noarg_short) { CommandLine cmd; const char *args[] = {"progname", "-s", "-n", "-h"}; char **argv = const_cast(args); cmd.parse(4, argv); EXPECT_TRUE(cmd.stdoutOpt.given()); EXPECT_TRUE(cmd.noFontsOpt.given()); EXPECT_TRUE(cmd.helpOpt.given()); EXPECT_FALSE(cmd.listSpecialsOpt.given()); EXPECT_FALSE(cmd.verbosityOpt.given()); EXPECT_EQ(cmd.verbosityOpt.value(), 7u); EXPECT_EQ(cmd.filenames().size(), 0u); } TEST(CommandLineTest, noarg_long) { CommandLine cmd; const char *args[] = {"progname", "--progress", "--no-fonts", "--stdout", "--help", "--verbosity=5"}; char **argv = const_cast(args); cmd.parse(6, argv); EXPECT_TRUE(cmd.progressOpt.given()); EXPECT_DOUBLE_EQ(cmd.progressOpt.value(), 0.5); EXPECT_TRUE(cmd.stdoutOpt.given()); EXPECT_TRUE(cmd.noFontsOpt.given()); EXPECT_TRUE(cmd.helpOpt.given()); EXPECT_FALSE(cmd.listSpecialsOpt.given()); EXPECT_FALSE(cmd.stdinOpt.given()); EXPECT_FALSE(cmd.singleDashGiven()); EXPECT_EQ(cmd.filenames().size(), 0u); EXPECT_TRUE(cmd.verbosityOpt.given()); EXPECT_EQ(cmd.verbosityOpt.value(), 5u); } TEST(CommandLineTest, arg_short) { CommandLine cmd; const char *args[] = {"progname", "-P", "-p5", "-r45", "-omyfile.xyz", "-ayes", "-v3", "-"}; char **argv = const_cast(args); cmd.parse(8, argv); EXPECT_TRUE(cmd.pdfOpt.given()); EXPECT_DOUBLE_EQ(cmd.progressOpt.value(), 0.5); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "5"); EXPECT_TRUE(cmd.rotateOpt.given()); EXPECT_EQ(cmd.rotateOpt.value(), 45); EXPECT_TRUE(cmd.outputOpt.given()); EXPECT_EQ(cmd.outputOpt.value(), "myfile.xyz"); EXPECT_FALSE(cmd.bboxOpt.given()); EXPECT_FALSE(cmd.stdinOpt.given()); EXPECT_EQ(cmd.bboxOpt.value(), "min"); EXPECT_EQ(cmd.filenames().size(), 0u); EXPECT_TRUE(cmd.traceAllOpt.given()); EXPECT_TRUE(cmd.traceAllOpt.value()); EXPECT_TRUE(cmd.verbosityOpt.given()); EXPECT_TRUE(cmd.singleDashGiven()); EXPECT_EQ(cmd.verbosityOpt.value(), 3u); } TEST(CommandLineTest, arg_combined) { CommandLine cmd; const char *args1[] = {"progname", "-lse", "-p5", "-omyfile.xyz"}; char **argv = const_cast(args1); cmd.parse(4, argv); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "5"); EXPECT_TRUE(cmd.listSpecialsOpt.given()); EXPECT_TRUE(cmd.stdoutOpt.given()); EXPECT_TRUE(cmd.exactBboxOpt.given()); // can't combine short options that accept optional parameters const char *args2[] = {"progname", "-nls", "-p5", "-omyfile.xyz"}; argv = const_cast(args2); EXPECT_THROW(cmd.parse(4, argv), CL::CommandLineException); } TEST(CommandLineTest, arg_separated) { CommandLine cmd; const char *args[] = {"progname", "-p", "5", "-r", "45", "myfile.xyz", "-afalse"}; char **argv = const_cast(args); cmd.parse(7, argv); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "5"); EXPECT_TRUE(cmd.rotateOpt.given()); EXPECT_EQ(cmd.rotateOpt.value(), 45); EXPECT_EQ(cmd.filenames().size(), 1u); EXPECT_TRUE(cmd.traceAllOpt.given()); EXPECT_FALSE(cmd.traceAllOpt.value()); } TEST(CommandLineTest, arg_long) { CommandLine cmd; const char *args[] = {"progname", "--page=9", "--rotate=-45.5", "--trace-all", "--output=myfile.zyx"}; char **argv = const_cast(args); cmd.parse(5, argv); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "9"); EXPECT_TRUE(cmd.rotateOpt.given()); EXPECT_EQ(cmd.rotateOpt.value(), -45.5); EXPECT_TRUE(cmd.outputOpt.given()); EXPECT_EQ(cmd.outputOpt.value(), "myfile.zyx"); EXPECT_FALSE(cmd.bboxOpt.given()); EXPECT_EQ(cmd.bboxOpt.value(), "min"); EXPECT_EQ(cmd.filenames().size(), 0u); EXPECT_TRUE(cmd.traceAllOpt.given()); EXPECT_FALSE(cmd.traceAllOpt.value()); } TEST(CommandLineTest, string_arg) { CommandLine cmd; const char *args[] = {"progname", "--page=9 - 10", "-m first second"}; char **argv = const_cast(args); cmd.parse(3, argv); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "9 - 10"); EXPECT_TRUE(cmd.fontmapOpt.given()); EXPECT_EQ(cmd.fontmapOpt.value(), "first second"); } TEST(CommandLineTest, abbrev_long) { CommandLine cmd; const char *args[] = {"progname", "--pre=2", "--rot=-45.5", "--out=myfile.zyx", "--color"}; char **argv = const_cast(args); cmd.parse(5, argv); EXPECT_TRUE(cmd.precisionOpt.given()); EXPECT_EQ(cmd.precisionOpt.value(), 2); EXPECT_TRUE(cmd.rotateOpt.given()); EXPECT_EQ(cmd.rotateOpt.value(), -45.5); EXPECT_TRUE(cmd.outputOpt.given()); EXPECT_EQ(cmd.outputOpt.value(), "myfile.zyx"); EXPECT_FALSE(cmd.bboxOpt.given()); EXPECT_EQ(cmd.bboxOpt.value(), "min"); EXPECT_EQ(cmd.filenames().size(), 0u); EXPECT_TRUE(cmd.colorOpt.given()); } TEST(CommandLineTest, error) { CommandLine cmd; // error on wrong argument type const char *args1[] = {"progname", "--rotate=x"}; char **argv = const_cast(args1); EXPECT_THROW(cmd.parse(2, argv), CL::CommandLineException); // error on missing arguments const char *args2[] = {"progname", "--page", "--zip"}; argv = const_cast(args2); EXPECT_THROW(cmd.parse(3, argv), CL::CommandLineException); EXPECT_FALSE(cmd.zipOpt.given()); EXPECT_EQ(cmd.zipOpt.value(), 9); EXPECT_FALSE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "1"); EXPECT_FALSE(cmd.rotateOpt.given()); EXPECT_EQ(cmd.filenames().size(), 0u); // error on ambiguous abbreviation of long option const char *args3[] = {"progname", "--no"}; argv = const_cast(args3); EXPECT_THROW(cmd.parse(2, argv), CL::CommandLineException); // incorrect boolean value const char *args4[] = {"progname", "--trace-all=nope"}; argv = const_cast(args4); EXPECT_THROW(cmd.parse(2, argv), CL::CommandLineException); EXPECT_FALSE(cmd.traceAllOpt.given()); } TEST(CommandLineTest, file) { CommandLine cmd; const char *args1[] = {"progname", "--page=3", "-z5", "myfile1", "-l", "myfile2"}; char **argv = const_cast(args1); cmd.parse(6, argv); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "3"); EXPECT_TRUE(cmd.zipOpt.given()); EXPECT_EQ(cmd.zipOpt.value(), 5); EXPECT_TRUE(cmd.listSpecialsOpt.given()); EXPECT_EQ(cmd.filenames().size(), 2u); EXPECT_EQ(cmd.filenames()[0], "myfile1"); EXPECT_EQ(cmd.filenames()[1], "myfile2"); } TEST(CommandLineTest, files_only) { CommandLine cmd; const char *args1[] = {"progname", "--page=3", "-z5", "--", "-l", "myfile"}; char **argv = const_cast(args1); cmd.parse(6, argv); EXPECT_TRUE(cmd.pageOpt.given()); EXPECT_EQ(cmd.pageOpt.value(), "3"); EXPECT_TRUE(cmd.zipOpt.given()); EXPECT_EQ(cmd.zipOpt.value(), 5); EXPECT_EQ(cmd.filenames().size(), 2u); EXPECT_EQ(cmd.filenames()[0], "-l"); EXPECT_EQ(cmd.filenames()[1], "myfile"); } TEST(CommandLineTest, help) { // only check whether help() succeeds CommandLine cmd; ostringstream oss; cmd.help(oss, 0); cmd.help(oss, 1); cmd.help(oss, 2); } dvisvgm-2.8.1/tests/StreamWriterTest.cpp0000664000175000017500000000653413536436567015314 00000000000000/************************************************************************* ** StreamWriterTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "StreamWriter.hpp" #include "XXHashFunction.hpp" using namespace std; TEST(StreamWriterTest, writeString) { ostringstream oss; StreamWriter writer(oss); string str = "dvisvgm converts DVI files to SVG."; writer.writeString(str); EXPECT_EQ(oss.str(), str); oss.str(""); writer.writeString(str, true); str.push_back('\0'); EXPECT_EQ(oss.str(), str); } TEST(StreamWriterTest, writeString_hashed) { ostringstream oss; StreamWriter writer(oss); XXH32HashFunction hashfunc; string str = "dvisvgm converts DVI files to SVG."; writer.writeString(str, hashfunc); EXPECT_EQ(oss.str(), str); EXPECT_EQ(hashfunc.digestString(), "190cc9d2"); oss.str(""); hashfunc.reset(); writer.writeString(str, hashfunc, true); str.push_back('\0'); EXPECT_EQ(oss.str(), str); EXPECT_EQ(hashfunc.digestString(), "f82e1606"); } TEST(StreamWriterTest, writeUnsigned) { ostringstream oss; StreamWriter writer(oss); writer.writeUnsigned(0x00010203, 4); string str; str.push_back('\x00'); str.push_back('\x01'); str.push_back('\x02'); str.push_back('\x03'); EXPECT_EQ(oss.str(), str); } TEST(StreamWriterTest, writeUnsigned_hashed) { ostringstream oss; StreamWriter writer(oss); XXH32HashFunction hashfunc; writer.writeUnsigned(0x00010203, 4, hashfunc); string str; str.push_back('\x00'); str.push_back('\x01'); str.push_back('\x02'); str.push_back('\x03'); EXPECT_EQ(oss.str(), str); EXPECT_EQ(hashfunc.digestString(), "80691e66"); } TEST(StreamWriterTest, writeSigned) { ostringstream oss; StreamWriter writer(oss); writer.writeSigned(0xffeeddcc, 4); string str = "\xff\xee\xdd\xcc"; EXPECT_EQ(oss.str(), str); } TEST(StreamWriterTest, writeSigned_hashed) { ostringstream oss; StreamWriter writer(oss); XXH32HashFunction hashfunc; writer.writeSigned(0xffeeddcc, 4, hashfunc); string str = "\xff\xee\xdd\xcc"; EXPECT_EQ(oss.str(), str); EXPECT_EQ(hashfunc.digestString(), "8baa29bd"); } dvisvgm-2.8.1/tests/SubfontTest.cpp0000664000175000017500000000642213510660062014255 00000000000000/************************************************************************* ** SubfontTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Subfont.hpp" #include "testutil.hpp" using namespace std; TEST(SubfontTest, collect_subfonts) { try { if (SubfontDefinition *sfd = SubfontDefinition::lookup("sample")) { vector subfonts; const char *ids_cmp[] = {"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "x1"}; int size = sizeof(ids_cmp)/sizeof(Subfont*); EXPECT_EQ(sfd->subfonts(subfonts), size); for (int i=0; i < size; i++) { EXPECT_EQ(subfonts[i]->id(), ids_cmp[i]); } } } catch (SubfontException &e) { FAIL() << e.what(); } } TEST(SubfontTest, read_table) { try { if (SubfontDefinition *sfd = SubfontDefinition::lookup("sampl")) { // check scanning of single value entries Subfont *subfont = sfd->subfont("02"); ASSERT_NE(subfont, nullptr); EXPECT_EQ(subfont->id(), "02"); EXPECT_EQ(subfont->decode(0), 0xff45); EXPECT_EQ(subfont->decode(1), 0xff46); EXPECT_EQ(subfont->decode(2), 0xff47); EXPECT_EQ(subfont->decode(8), 0xff4d); EXPECT_EQ(subfont->decode(32), 0x3047); EXPECT_EQ(subfont->decode(255), 0x03ba); // check scanning of ranges subfont = sfd->subfont("x1"); ASSERT_NE(subfont, nullptr); EXPECT_EQ(subfont->id(), "x1"); EXPECT_EQ(subfont->decode(0), 0x0010); EXPECT_EQ(subfont->decode(1), 0x0011); EXPECT_EQ(subfont->decode(2), 0x0012); EXPECT_EQ(subfont->decode(0x20), 0x0030); EXPECT_EQ(subfont->decode(0x21), 0x1010); EXPECT_EQ(subfont->decode(0x41), 0x1030); EXPECT_EQ(subfont->decode(0x42), 0xe000); EXPECT_EQ(subfont->decode(0x43), 0); //check scanning of offset values EXPECT_EQ(subfont->decode(0x9f), 0); EXPECT_EQ(subfont->decode(0xa0), 0x1000); EXPECT_EQ(subfont->decode(0xa1), 0x2000); EXPECT_EQ(subfont->decode(0xa2), 0); } else WARNING("sample.sfd not found"); } catch (SubfontException &e) { FAIL() << e.what() << " in line " << e.lineno(); } } dvisvgm-2.8.1/tests/Makefile.in0000664000175000017500000076401213563265577013370 00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @HAVE_BROTLI_FALSE@am__append_1 = -I$(dvisvgm_srcdir)/libs/brotli/include @HAVE_BROTLI_FALSE@am__append_2 = ../libs/brotli/libbrotli.a @HAVE_WOFF2_FALSE@am__append_3 = -I$(dvisvgm_srcdir)/libs/woff2/include @HAVE_WOFF2_FALSE@am__append_4 = ../libs/woff2/libwoff2.a @ENABLE_WOFF_TRUE@am__append_5 = $(WOFF2_LIBS) $(BROTLI_LIBS) @USE_BUNDLED_MD5_TRUE@am__append_6 = -I$(dvisvgm_srcdir)/libs/md5 @USE_BUNDLED_MD5_TRUE@am__append_7 = ../libs/md5/libmd5.a @USE_BUNDLED_MD5_FALSE@am__append_8 = $(LIBCRYPTO_CFLAGS) @USE_BUNDLED_MD5_FALSE@am__append_9 = $(LIBCRYPTO_LIBS) TESTS = hashcheck$(EXEEXT) BezierTest$(EXEEXT) BitmapTest$(EXEEXT) \ BoundingBoxTest$(EXEEXT) CalculatorTest$(EXEEXT) \ CMapManagerTest$(EXEEXT) CMapReaderTest$(EXEEXT) \ CMapTest$(EXEEXT) ColorSpecialTest$(EXEEXT) ColorTest$(EXEEXT) \ CommandLineTest$(EXEEXT) DependencyGraphTest$(EXEEXT) \ DirectoryTest$(EXEEXT) DVIReaderTest$(EXEEXT) \ DvisvgmSpecialTest$(EXEEXT) EllipticalArcTest$(EXEEXT) \ EmSpecialTest$(EXEEXT) FileFinderTest$(EXEEXT) \ FilePathTest$(EXEEXT) FileSystemTest$(EXEEXT) \ FontCacheTest$(EXEEXT) FontManagerTest$(EXEEXT) \ FontMapTest$(EXEEXT) GFGlyphTracerTest$(EXEEXT) \ GFReaderTest$(EXEEXT) GhostscriptTest$(EXEEXT) \ GraphicsPathTest$(EXEEXT) HashFunctionTest$(EXEEXT) \ JFMReaderTest$(EXEEXT) LengthTest$(EXEEXT) \ MapLineTest$(EXEEXT) MatrixTest$(EXEEXT) \ MessageExceptionTest$(EXEEXT) PageRagesTest$(EXEEXT) \ PageSizeTest$(EXEEXT) PairTest$(EXEEXT) \ PapersizeSpecialTest$(EXEEXT) PDFParserTest$(EXEEXT) \ PSInterpreterTest$(EXEEXT) RangeMapTest$(EXEEXT) \ ShadingPatchTest$(EXEEXT) SpecialManagerTest$(EXEEXT) \ SplittedCharInputBufferTest$(EXEEXT) \ StreamInputBufferTest$(EXEEXT) StreamReaderTest$(EXEEXT) \ StreamWriterTest$(EXEEXT) StringMatcherTest$(EXEEXT) \ SubfontTest$(EXEEXT) SVGOutputTest$(EXEEXT) \ TensorProductPatchTest$(EXEEXT) TFMReaderTest$(EXEEXT) \ ToUnicodeMapTest$(EXEEXT) TpicSpecialTest$(EXEEXT) \ TriangularPatchTest$(EXEEXT) UnicodeTest$(EXEEXT) \ UtilityTest$(EXEEXT) VectorIteratorTest$(EXEEXT) \ VectorStreamTest$(EXEEXT) XMLNodeTest$(EXEEXT) \ XMLStringTest$(EXEEXT) check-conv check_PROGRAMS = hashcheck$(EXEEXT) BezierTest$(EXEEXT) \ BitmapTest$(EXEEXT) BoundingBoxTest$(EXEEXT) \ CalculatorTest$(EXEEXT) CMapManagerTest$(EXEEXT) \ CMapReaderTest$(EXEEXT) CMapTest$(EXEEXT) \ ColorSpecialTest$(EXEEXT) ColorTest$(EXEEXT) \ CommandLineTest$(EXEEXT) DependencyGraphTest$(EXEEXT) \ DirectoryTest$(EXEEXT) DVIReaderTest$(EXEEXT) \ DvisvgmSpecialTest$(EXEEXT) EllipticalArcTest$(EXEEXT) \ EmSpecialTest$(EXEEXT) FileFinderTest$(EXEEXT) \ FilePathTest$(EXEEXT) FileSystemTest$(EXEEXT) \ FontCacheTest$(EXEEXT) FontManagerTest$(EXEEXT) \ FontMapTest$(EXEEXT) GFGlyphTracerTest$(EXEEXT) \ GFReaderTest$(EXEEXT) GhostscriptTest$(EXEEXT) \ GraphicsPathTest$(EXEEXT) HashFunctionTest$(EXEEXT) \ JFMReaderTest$(EXEEXT) LengthTest$(EXEEXT) \ MapLineTest$(EXEEXT) MatrixTest$(EXEEXT) \ MessageExceptionTest$(EXEEXT) PageRagesTest$(EXEEXT) \ PageSizeTest$(EXEEXT) PairTest$(EXEEXT) \ PapersizeSpecialTest$(EXEEXT) PDFParserTest$(EXEEXT) \ PSInterpreterTest$(EXEEXT) RangeMapTest$(EXEEXT) \ ShadingPatchTest$(EXEEXT) SpecialManagerTest$(EXEEXT) \ SplittedCharInputBufferTest$(EXEEXT) \ StreamInputBufferTest$(EXEEXT) StreamReaderTest$(EXEEXT) \ StreamWriterTest$(EXEEXT) StringMatcherTest$(EXEEXT) \ SubfontTest$(EXEEXT) SVGOutputTest$(EXEEXT) \ TensorProductPatchTest$(EXEEXT) TFMReaderTest$(EXEEXT) \ ToUnicodeMapTest$(EXEEXT) TpicSpecialTest$(EXEEXT) \ TriangularPatchTest$(EXEEXT) UnicodeTest$(EXEEXT) \ UtilityTest$(EXEEXT) VectorIteratorTest$(EXEEXT) \ VectorStreamTest$(EXEEXT) XMLNodeTest$(EXEEXT) \ XMLStringTest$(EXEEXT) @ENABLE_WOFF_TRUE@am__append_10 = ../libs/ff-woff/libfontforge.a subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = libgtest_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libgtest_la_OBJECTS = gtest/src/libgtest_la-gtest-all.lo \ libgtest_la-testmain.lo libgtest_la_OBJECTS = $(am_libgtest_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libgtest_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libgtest_la_LDFLAGS) $(LDFLAGS) -o $@ am_BezierTest_OBJECTS = BezierTest-BezierTest.$(OBJEXT) BezierTest_OBJECTS = $(am_BezierTest_OBJECTS) am__DEPENDENCIES_1 = $(am__append_4) am__DEPENDENCIES_2 = $(am__append_2) @ENABLE_WOFF_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) \ @ENABLE_WOFF_TRUE@ $(am__DEPENDENCIES_2) am__DEPENDENCIES_4 = @USE_BUNDLED_MD5_FALSE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_4) am__DEPENDENCIES_6 = $(POTRACE_LIBS) $(XXHASH_LIBS) \ $(am__DEPENDENCIES_3) $(am__append_7) $(am__DEPENDENCIES_5) am__DEPENDENCIES_7 = libgtest.la ../src/libdvisvgm.la \ $(am__DEPENDENCIES_6) $(am__append_10) $(am__DEPENDENCIES_4) BezierTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_BitmapTest_OBJECTS = BitmapTest-BitmapTest.$(OBJEXT) BitmapTest_OBJECTS = $(am_BitmapTest_OBJECTS) BitmapTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_BoundingBoxTest_OBJECTS = \ BoundingBoxTest-BoundingBoxTest.$(OBJEXT) BoundingBoxTest_OBJECTS = $(am_BoundingBoxTest_OBJECTS) BoundingBoxTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_CMapManagerTest_OBJECTS = \ CMapManagerTest-CMapManagerTest.$(OBJEXT) CMapManagerTest_OBJECTS = $(am_CMapManagerTest_OBJECTS) CMapManagerTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_CMapReaderTest_OBJECTS = CMapReaderTest-CMapReaderTest.$(OBJEXT) CMapReaderTest_OBJECTS = $(am_CMapReaderTest_OBJECTS) CMapReaderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_CMapTest_OBJECTS = CMapTest-CMapTest.$(OBJEXT) CMapTest_OBJECTS = $(am_CMapTest_OBJECTS) CMapTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_CalculatorTest_OBJECTS = CalculatorTest-CalculatorTest.$(OBJEXT) CalculatorTest_OBJECTS = $(am_CalculatorTest_OBJECTS) CalculatorTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_ColorSpecialTest_OBJECTS = \ ColorSpecialTest-ColorSpecialTest.$(OBJEXT) ColorSpecialTest_OBJECTS = $(am_ColorSpecialTest_OBJECTS) ColorSpecialTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_ColorTest_OBJECTS = ColorTest-ColorTest.$(OBJEXT) ColorTest_OBJECTS = $(am_ColorTest_OBJECTS) ColorTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_CommandLineTest_OBJECTS = \ CommandLineTest-CommandLineTest.$(OBJEXT) CommandLineTest_OBJECTS = $(am_CommandLineTest_OBJECTS) CommandLineTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_DVIReaderTest_OBJECTS = DVIReaderTest-DVIReaderTest.$(OBJEXT) DVIReaderTest_OBJECTS = $(am_DVIReaderTest_OBJECTS) DVIReaderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_DependencyGraphTest_OBJECTS = \ DependencyGraphTest-DependencyGraphTest.$(OBJEXT) DependencyGraphTest_OBJECTS = $(am_DependencyGraphTest_OBJECTS) DependencyGraphTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_DirectoryTest_OBJECTS = DirectoryTest-DirectoryTest.$(OBJEXT) DirectoryTest_OBJECTS = $(am_DirectoryTest_OBJECTS) DirectoryTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_DvisvgmSpecialTest_OBJECTS = \ DvisvgmSpecialTest-DvisvgmSpecialTest.$(OBJEXT) DvisvgmSpecialTest_OBJECTS = $(am_DvisvgmSpecialTest_OBJECTS) DvisvgmSpecialTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_EllipticalArcTest_OBJECTS = \ EllipticalArcTest-EllipticalArcTest.$(OBJEXT) EllipticalArcTest_OBJECTS = $(am_EllipticalArcTest_OBJECTS) EllipticalArcTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_EmSpecialTest_OBJECTS = EmSpecialTest-EmSpecialTest.$(OBJEXT) EmSpecialTest_OBJECTS = $(am_EmSpecialTest_OBJECTS) EmSpecialTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_FileFinderTest_OBJECTS = FileFinderTest-FileFinderTest.$(OBJEXT) FileFinderTest_OBJECTS = $(am_FileFinderTest_OBJECTS) FileFinderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_FilePathTest_OBJECTS = FilePathTest-FilePathTest.$(OBJEXT) FilePathTest_OBJECTS = $(am_FilePathTest_OBJECTS) FilePathTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_FileSystemTest_OBJECTS = FileSystemTest-FileSystemTest.$(OBJEXT) FileSystemTest_OBJECTS = $(am_FileSystemTest_OBJECTS) FileSystemTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_FontCacheTest_OBJECTS = FontCacheTest-FontCacheTest.$(OBJEXT) FontCacheTest_OBJECTS = $(am_FontCacheTest_OBJECTS) FontCacheTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_FontManagerTest_OBJECTS = \ FontManagerTest-FontManagerTest.$(OBJEXT) FontManagerTest_OBJECTS = $(am_FontManagerTest_OBJECTS) FontManagerTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_FontMapTest_OBJECTS = FontMapTest-FontMapTest.$(OBJEXT) FontMapTest_OBJECTS = $(am_FontMapTest_OBJECTS) FontMapTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_GFGlyphTracerTest_OBJECTS = \ GFGlyphTracerTest-GFGlyphTracerTest.$(OBJEXT) GFGlyphTracerTest_OBJECTS = $(am_GFGlyphTracerTest_OBJECTS) GFGlyphTracerTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_GFReaderTest_OBJECTS = GFReaderTest-GFReaderTest.$(OBJEXT) GFReaderTest_OBJECTS = $(am_GFReaderTest_OBJECTS) GFReaderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_GhostscriptTest_OBJECTS = \ GhostscriptTest-GhostscriptTest.$(OBJEXT) GhostscriptTest_OBJECTS = $(am_GhostscriptTest_OBJECTS) GhostscriptTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_GraphicsPathTest_OBJECTS = \ GraphicsPathTest-GraphicsPathTest.$(OBJEXT) GraphicsPathTest_OBJECTS = $(am_GraphicsPathTest_OBJECTS) GraphicsPathTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_HashFunctionTest_OBJECTS = \ HashFunctionTest-HashFunctionTest.$(OBJEXT) HashFunctionTest_OBJECTS = $(am_HashFunctionTest_OBJECTS) HashFunctionTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_JFMReaderTest_OBJECTS = JFMReaderTest-JFMReaderTest.$(OBJEXT) JFMReaderTest_OBJECTS = $(am_JFMReaderTest_OBJECTS) JFMReaderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_LengthTest_OBJECTS = LengthTest-LengthTest.$(OBJEXT) LengthTest_OBJECTS = $(am_LengthTest_OBJECTS) LengthTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_MapLineTest_OBJECTS = MapLineTest-MapLineTest.$(OBJEXT) MapLineTest_OBJECTS = $(am_MapLineTest_OBJECTS) MapLineTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_MatrixTest_OBJECTS = MatrixTest-MatrixTest.$(OBJEXT) MatrixTest_OBJECTS = $(am_MatrixTest_OBJECTS) MatrixTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_MessageExceptionTest_OBJECTS = \ MessageExceptionTest-MessageExceptionTest.$(OBJEXT) MessageExceptionTest_OBJECTS = $(am_MessageExceptionTest_OBJECTS) MessageExceptionTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_PDFParserTest_OBJECTS = PDFParserTest-PDFParserTest.$(OBJEXT) PDFParserTest_OBJECTS = $(am_PDFParserTest_OBJECTS) PDFParserTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_PSInterpreterTest_OBJECTS = \ PSInterpreterTest-PSInterpreterTest.$(OBJEXT) PSInterpreterTest_OBJECTS = $(am_PSInterpreterTest_OBJECTS) PSInterpreterTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_PageRagesTest_OBJECTS = PageRagesTest-PageRagesTest.$(OBJEXT) PageRagesTest_OBJECTS = $(am_PageRagesTest_OBJECTS) PageRagesTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_PageSizeTest_OBJECTS = PageSizeTest-PageSizeTest.$(OBJEXT) PageSizeTest_OBJECTS = $(am_PageSizeTest_OBJECTS) PageSizeTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_PairTest_OBJECTS = PairTest-PairTest.$(OBJEXT) PairTest_OBJECTS = $(am_PairTest_OBJECTS) PairTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_PapersizeSpecialTest_OBJECTS = \ PapersizeSpecialTest-PapersizeSpecialTest.$(OBJEXT) PapersizeSpecialTest_OBJECTS = $(am_PapersizeSpecialTest_OBJECTS) PapersizeSpecialTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_RangeMapTest_OBJECTS = RangeMapTest-RangeMapTest.$(OBJEXT) RangeMapTest_OBJECTS = $(am_RangeMapTest_OBJECTS) RangeMapTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_SVGOutputTest_OBJECTS = SVGOutputTest-SVGOutputTest.$(OBJEXT) SVGOutputTest_OBJECTS = $(am_SVGOutputTest_OBJECTS) SVGOutputTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_ShadingPatchTest_OBJECTS = \ ShadingPatchTest-ShadingPatchTest.$(OBJEXT) ShadingPatchTest_OBJECTS = $(am_ShadingPatchTest_OBJECTS) ShadingPatchTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_SpecialManagerTest_OBJECTS = \ SpecialManagerTest-SpecialManagerTest.$(OBJEXT) SpecialManagerTest_OBJECTS = $(am_SpecialManagerTest_OBJECTS) SpecialManagerTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_SplittedCharInputBufferTest_OBJECTS = SplittedCharInputBufferTest-SplittedCharInputBufferTest.$(OBJEXT) SplittedCharInputBufferTest_OBJECTS = \ $(am_SplittedCharInputBufferTest_OBJECTS) SplittedCharInputBufferTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_StreamInputBufferTest_OBJECTS = \ StreamInputBufferTest-StreamInputBufferTest.$(OBJEXT) StreamInputBufferTest_OBJECTS = $(am_StreamInputBufferTest_OBJECTS) StreamInputBufferTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_StreamReaderTest_OBJECTS = \ StreamReaderTest-StreamReaderTest.$(OBJEXT) StreamReaderTest_OBJECTS = $(am_StreamReaderTest_OBJECTS) StreamReaderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_StreamWriterTest_OBJECTS = \ StreamWriterTest-StreamWriterTest.$(OBJEXT) StreamWriterTest_OBJECTS = $(am_StreamWriterTest_OBJECTS) StreamWriterTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_StringMatcherTest_OBJECTS = \ StringMatcherTest-StringMatcherTest.$(OBJEXT) StringMatcherTest_OBJECTS = $(am_StringMatcherTest_OBJECTS) StringMatcherTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_SubfontTest_OBJECTS = SubfontTest-SubfontTest.$(OBJEXT) SubfontTest_OBJECTS = $(am_SubfontTest_OBJECTS) SubfontTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_TFMReaderTest_OBJECTS = TFMReaderTest-TFMReaderTest.$(OBJEXT) TFMReaderTest_OBJECTS = $(am_TFMReaderTest_OBJECTS) TFMReaderTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_TensorProductPatchTest_OBJECTS = \ TensorProductPatchTest-TensorProductPatchTest.$(OBJEXT) TensorProductPatchTest_OBJECTS = $(am_TensorProductPatchTest_OBJECTS) TensorProductPatchTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_ToUnicodeMapTest_OBJECTS = \ ToUnicodeMapTest-ToUnicodeMapTest.$(OBJEXT) ToUnicodeMapTest_OBJECTS = $(am_ToUnicodeMapTest_OBJECTS) ToUnicodeMapTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_TpicSpecialTest_OBJECTS = \ TpicSpecialTest-TpicSpecialTest.$(OBJEXT) TpicSpecialTest_OBJECTS = $(am_TpicSpecialTest_OBJECTS) TpicSpecialTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_TriangularPatchTest_OBJECTS = \ TriangularPatchTest-TriangularPatchTest.$(OBJEXT) TriangularPatchTest_OBJECTS = $(am_TriangularPatchTest_OBJECTS) TriangularPatchTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_UnicodeTest_OBJECTS = UnicodeTest-UnicodeTest.$(OBJEXT) UnicodeTest_OBJECTS = $(am_UnicodeTest_OBJECTS) UnicodeTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_UtilityTest_OBJECTS = UtilityTest-UtilityTest.$(OBJEXT) UtilityTest_OBJECTS = $(am_UtilityTest_OBJECTS) UtilityTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_VectorIteratorTest_OBJECTS = \ VectorIteratorTest-VectorIteratorTest.$(OBJEXT) VectorIteratorTest_OBJECTS = $(am_VectorIteratorTest_OBJECTS) VectorIteratorTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_VectorStreamTest_OBJECTS = \ VectorStreamTest-VectorStreamTest.$(OBJEXT) VectorStreamTest_OBJECTS = $(am_VectorStreamTest_OBJECTS) VectorStreamTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_XMLNodeTest_OBJECTS = XMLNodeTest-XMLNodeTest.$(OBJEXT) XMLNodeTest_OBJECTS = $(am_XMLNodeTest_OBJECTS) XMLNodeTest_DEPENDENCIES = $(am__DEPENDENCIES_7) am_XMLStringTest_OBJECTS = XMLStringTest-XMLStringTest.$(OBJEXT) XMLStringTest_OBJECTS = $(am_XMLStringTest_OBJECTS) XMLStringTest_DEPENDENCIES = $(am__DEPENDENCIES_7) nodist_hashcheck_OBJECTS = hashcheck-hashcheck.$(OBJEXT) hashcheck_OBJECTS = $(nodist_hashcheck_OBJECTS) hashcheck_DEPENDENCIES = $(am__DEPENDENCIES_6) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/BezierTest-BezierTest.Po \ ./$(DEPDIR)/BitmapTest-BitmapTest.Po \ ./$(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Po \ ./$(DEPDIR)/CMapManagerTest-CMapManagerTest.Po \ ./$(DEPDIR)/CMapReaderTest-CMapReaderTest.Po \ ./$(DEPDIR)/CMapTest-CMapTest.Po \ ./$(DEPDIR)/CalculatorTest-CalculatorTest.Po \ ./$(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Po \ ./$(DEPDIR)/ColorTest-ColorTest.Po \ ./$(DEPDIR)/CommandLineTest-CommandLineTest.Po \ ./$(DEPDIR)/DVIReaderTest-DVIReaderTest.Po \ ./$(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Po \ ./$(DEPDIR)/DirectoryTest-DirectoryTest.Po \ ./$(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Po \ ./$(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Po \ ./$(DEPDIR)/EmSpecialTest-EmSpecialTest.Po \ ./$(DEPDIR)/FileFinderTest-FileFinderTest.Po \ ./$(DEPDIR)/FilePathTest-FilePathTest.Po \ ./$(DEPDIR)/FileSystemTest-FileSystemTest.Po \ ./$(DEPDIR)/FontCacheTest-FontCacheTest.Po \ ./$(DEPDIR)/FontManagerTest-FontManagerTest.Po \ ./$(DEPDIR)/FontMapTest-FontMapTest.Po \ ./$(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Po \ ./$(DEPDIR)/GFReaderTest-GFReaderTest.Po \ ./$(DEPDIR)/GhostscriptTest-GhostscriptTest.Po \ ./$(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Po \ ./$(DEPDIR)/HashFunctionTest-HashFunctionTest.Po \ ./$(DEPDIR)/JFMReaderTest-JFMReaderTest.Po \ ./$(DEPDIR)/LengthTest-LengthTest.Po \ ./$(DEPDIR)/MapLineTest-MapLineTest.Po \ ./$(DEPDIR)/MatrixTest-MatrixTest.Po \ ./$(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Po \ ./$(DEPDIR)/PDFParserTest-PDFParserTest.Po \ ./$(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Po \ ./$(DEPDIR)/PageRagesTest-PageRagesTest.Po \ ./$(DEPDIR)/PageSizeTest-PageSizeTest.Po \ ./$(DEPDIR)/PairTest-PairTest.Po \ ./$(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Po \ ./$(DEPDIR)/RangeMapTest-RangeMapTest.Po \ ./$(DEPDIR)/SVGOutputTest-SVGOutputTest.Po \ ./$(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Po \ ./$(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Po \ ./$(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Po \ ./$(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Po \ ./$(DEPDIR)/StreamReaderTest-StreamReaderTest.Po \ ./$(DEPDIR)/StreamWriterTest-StreamWriterTest.Po \ ./$(DEPDIR)/StringMatcherTest-StringMatcherTest.Po \ ./$(DEPDIR)/SubfontTest-SubfontTest.Po \ ./$(DEPDIR)/TFMReaderTest-TFMReaderTest.Po \ ./$(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Po \ ./$(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Po \ ./$(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Po \ ./$(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Po \ ./$(DEPDIR)/UnicodeTest-UnicodeTest.Po \ ./$(DEPDIR)/UtilityTest-UtilityTest.Po \ ./$(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Po \ ./$(DEPDIR)/VectorStreamTest-VectorStreamTest.Po \ ./$(DEPDIR)/XMLNodeTest-XMLNodeTest.Po \ ./$(DEPDIR)/XMLStringTest-XMLStringTest.Po \ ./$(DEPDIR)/hashcheck-hashcheck.Po \ ./$(DEPDIR)/libgtest_la-testmain.Plo \ gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Plo am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgtest_la_SOURCES) $(BezierTest_SOURCES) \ $(BitmapTest_SOURCES) $(BoundingBoxTest_SOURCES) \ $(CMapManagerTest_SOURCES) $(CMapReaderTest_SOURCES) \ $(CMapTest_SOURCES) $(CalculatorTest_SOURCES) \ $(ColorSpecialTest_SOURCES) $(ColorTest_SOURCES) \ $(CommandLineTest_SOURCES) $(DVIReaderTest_SOURCES) \ $(DependencyGraphTest_SOURCES) $(DirectoryTest_SOURCES) \ $(DvisvgmSpecialTest_SOURCES) $(EllipticalArcTest_SOURCES) \ $(EmSpecialTest_SOURCES) $(FileFinderTest_SOURCES) \ $(FilePathTest_SOURCES) $(FileSystemTest_SOURCES) \ $(FontCacheTest_SOURCES) $(FontManagerTest_SOURCES) \ $(FontMapTest_SOURCES) $(GFGlyphTracerTest_SOURCES) \ $(GFReaderTest_SOURCES) $(GhostscriptTest_SOURCES) \ $(GraphicsPathTest_SOURCES) $(HashFunctionTest_SOURCES) \ $(JFMReaderTest_SOURCES) $(LengthTest_SOURCES) \ $(MapLineTest_SOURCES) $(MatrixTest_SOURCES) \ $(MessageExceptionTest_SOURCES) $(PDFParserTest_SOURCES) \ $(PSInterpreterTest_SOURCES) $(PageRagesTest_SOURCES) \ $(PageSizeTest_SOURCES) $(PairTest_SOURCES) \ $(PapersizeSpecialTest_SOURCES) $(RangeMapTest_SOURCES) \ $(SVGOutputTest_SOURCES) $(ShadingPatchTest_SOURCES) \ $(SpecialManagerTest_SOURCES) \ $(SplittedCharInputBufferTest_SOURCES) \ $(StreamInputBufferTest_SOURCES) $(StreamReaderTest_SOURCES) \ $(StreamWriterTest_SOURCES) $(StringMatcherTest_SOURCES) \ $(SubfontTest_SOURCES) $(TFMReaderTest_SOURCES) \ $(TensorProductPatchTest_SOURCES) $(ToUnicodeMapTest_SOURCES) \ $(TpicSpecialTest_SOURCES) $(TriangularPatchTest_SOURCES) \ $(UnicodeTest_SOURCES) $(UtilityTest_SOURCES) \ $(VectorIteratorTest_SOURCES) $(VectorStreamTest_SOURCES) \ $(XMLNodeTest_SOURCES) $(XMLStringTest_SOURCES) \ $(nodist_hashcheck_SOURCES) DIST_SOURCES = $(libgtest_la_SOURCES) $(BezierTest_SOURCES) \ $(BitmapTest_SOURCES) $(BoundingBoxTest_SOURCES) \ $(CMapManagerTest_SOURCES) $(CMapReaderTest_SOURCES) \ $(CMapTest_SOURCES) $(CalculatorTest_SOURCES) \ $(ColorSpecialTest_SOURCES) $(ColorTest_SOURCES) \ $(CommandLineTest_SOURCES) $(DVIReaderTest_SOURCES) \ $(DependencyGraphTest_SOURCES) $(DirectoryTest_SOURCES) \ $(DvisvgmSpecialTest_SOURCES) $(EllipticalArcTest_SOURCES) \ $(EmSpecialTest_SOURCES) $(FileFinderTest_SOURCES) \ $(FilePathTest_SOURCES) $(FileSystemTest_SOURCES) \ $(FontCacheTest_SOURCES) $(FontManagerTest_SOURCES) \ $(FontMapTest_SOURCES) $(GFGlyphTracerTest_SOURCES) \ $(GFReaderTest_SOURCES) $(GhostscriptTest_SOURCES) \ $(GraphicsPathTest_SOURCES) $(HashFunctionTest_SOURCES) \ $(JFMReaderTest_SOURCES) $(LengthTest_SOURCES) \ $(MapLineTest_SOURCES) $(MatrixTest_SOURCES) \ $(MessageExceptionTest_SOURCES) $(PDFParserTest_SOURCES) \ $(PSInterpreterTest_SOURCES) $(PageRagesTest_SOURCES) \ $(PageSizeTest_SOURCES) $(PairTest_SOURCES) \ $(PapersizeSpecialTest_SOURCES) $(RangeMapTest_SOURCES) \ $(SVGOutputTest_SOURCES) $(ShadingPatchTest_SOURCES) \ $(SpecialManagerTest_SOURCES) \ $(SplittedCharInputBufferTest_SOURCES) \ $(StreamInputBufferTest_SOURCES) $(StreamReaderTest_SOURCES) \ $(StreamWriterTest_SOURCES) $(StringMatcherTest_SOURCES) \ $(SubfontTest_SOURCES) $(TFMReaderTest_SOURCES) \ $(TensorProductPatchTest_SOURCES) $(ToUnicodeMapTest_SOURCES) \ $(TpicSpecialTest_SOURCES) $(TriangularPatchTest_SOURCES) \ $(UnicodeTest_SOURCES) $(UtilityTest_SOURCES) \ $(VectorIteratorTest_SOURCES) $(VectorStreamTest_SOURCES) \ $(XMLNodeTest_SOURCES) $(XMLStringTest_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/../libs/defs.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AM_LDFLAGS = @AM_LDFLAGS@ AR = @AR@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BROTLI_CFLAGS = @BROTLI_CFLAGS@ $(am__append_1) BROTLI_LIBS = @BROTLI_LIBS@ $(am__append_2) CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CODE_COVERAGE_CFLAGS = @CODE_COVERAGE_CFLAGS@ CODE_COVERAGE_CPPFLAGS = @CODE_COVERAGE_CPPFLAGS@ CODE_COVERAGE_CXXFLAGS = @CODE_COVERAGE_CXXFLAGS@ CODE_COVERAGE_ENABLED = @CODE_COVERAGE_ENABLED@ CODE_COVERAGE_LDFLAGS = @CODE_COVERAGE_LDFLAGS@ CODE_COVERAGE_LIBS = @CODE_COVERAGE_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_LIBS = @FREETYPE_LIBS@ GCOV = @GCOV@ GENHTML = @GENHTML@ GREP = @GREP@ HAVE_CXX11 = @HAVE_CXX11@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KPSE_CFLAGS = @KPSE_CFLAGS@ KPSE_LIBS = @KPSE_LIBS@ LCOV = @LCOV@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBCRYPTO_CFLAGS = @LIBCRYPTO_CFLAGS@ LIBCRYPTO_LIBS = @LIBCRYPTO_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TTFAUTOHINT_CFLAGS = @TTFAUTOHINT_CFLAGS@ TTFAUTOHINT_LIBS = @TTFAUTOHINT_LIBS@ VERSION = @VERSION@ WOFF2_CFLAGS = @WOFF2_CFLAGS@ $(am__append_3) WOFF2_LIBS = @WOFF2_LIBS@ $(am__append_4) XMLTO = @XMLTO@ XSLTPROC = @XSLTPROC@ ZLIB_CFLAGS = @ZLIB_CFLAGS@ ZLIB_LIBS = @ZLIB_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ dvisvgm_srcdir = @dvisvgm_srcdir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = data check_LTLIBRARIES = libgtest.la libgtest_la_SOURCES = gtest/src/gtest-all.cc testmain.cpp libgtest_la_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include -I$(dvisvgm_srcdir)/tests/gtest libgtest_la_LDFLAGS = -pthread EXTRA_DIST = gtest/LICENSE gtest/include gtest/src/gtest.cc \ gtest/src/gtest-death-test.cc gtest/src/gtest-filepath.cc \ gtest/src/gtest-internal-inl.h gtest/src/gtest_main.cc \ gtest/src/gtest-matchers.cc gtest/src/gtest-port.cc \ gtest/src/gtest-printers.cc gtest/src/gtest-test-part.cc \ gtest/src/gtest-typed-test.cc check-conv genhashcheck.py \ normalize.xsl @HAVE_POTRACE_FALSE@POTRACE_CFLAGS = -I$(dvisvgm_srcdir)/libs/potrace @HAVE_POTRACE_FALSE@POTRACE_LIBS = ../libs/potrace/libpotrace.a @HAVE_XXHASH_FALSE@XXHASH_CFLAGS = -I$(dvisvgm_srcdir)/libs/xxHash @HAVE_XXHASH_FALSE@XXHASH_LIBS = ../libs/xxHash/libxxhash.a LIBS_CFLAGS = $(XXHASH_CFLAGS) $(am__append_6) $(am__append_8) LIBS_LIBS = $(POTRACE_LIBS) $(XXHASH_LIBS) $(am__append_5) \ $(am__append_7) $(am__append_9) AM_CXXFLAGS = -I$(dvisvgm_srcdir)/src -I$(dvisvgm_srcdir)/libs/variant/include \ -Wall -Wno-mismatched-tags \ -DBUILDDIR='"$(abs_builddir)"' -DSRCDIR='"$(abs_srcdir)"' \ $(CODE_COVERAGE_CFLAGS) nodist_hashcheck_SOURCES = hashcheck.cpp hashcheck_CPPFLAGS = $(LIBS_CFLAGS) hashcheck_LDADD = $(LIBS_LIBS) TESTLIBS = libgtest.la ../src/libdvisvgm.la $(LIBS_LIBS) -lfreetype \ $(am__append_10) $(CODE_COVERAGE_LDFLAGS) BezierTest_SOURCES = BezierTest.cpp testutil.hpp BezierTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) BezierTest_LDADD = $(TESTLIBS) BitmapTest_SOURCES = BitmapTest.cpp testutil.hpp BitmapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) BitmapTest_LDADD = $(TESTLIBS) BoundingBoxTest_SOURCES = BoundingBoxTest.cpp testutil.hpp BoundingBoxTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) BoundingBoxTest_LDADD = $(TESTLIBS) CalculatorTest_SOURCES = CalculatorTest.cpp testutil.hpp CalculatorTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CalculatorTest_LDADD = $(TESTLIBS) CMapManagerTest_SOURCES = CMapManagerTest.cpp testutil.hpp CMapManagerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CMapManagerTest_LDADD = $(TESTLIBS) CMapReaderTest_SOURCES = CMapReaderTest.cpp testutil.hpp CMapReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CMapReaderTest_LDADD = $(TESTLIBS) CMapTest_SOURCES = CMapTest.cpp testutil.hpp CMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CMapTest_LDADD = $(TESTLIBS) ColorSpecialTest_SOURCES = ColorSpecialTest.cpp testutil.hpp ColorSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ColorSpecialTest_LDADD = $(TESTLIBS) ColorTest_SOURCES = ColorTest.cpp testutil.hpp ColorTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ColorTest_LDADD = $(TESTLIBS) CommandLineTest_SOURCES = CommandLineTest.cpp testutil.hpp CommandLineTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) CommandLineTest_LDADD = $(TESTLIBS) DependencyGraphTest_SOURCES = DependencyGraphTest.cpp testutil.hpp DependencyGraphTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DependencyGraphTest_LDADD = $(TESTLIBS) DirectoryTest_SOURCES = DirectoryTest.cpp testutil.hpp DirectoryTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DirectoryTest_LDADD = $(TESTLIBS) DVIReaderTest_SOURCES = DVIReaderTest.cpp testutil.hpp DVIReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DVIReaderTest_LDADD = $(TESTLIBS) DvisvgmSpecialTest_SOURCES = DvisvgmSpecialTest.cpp testutil.hpp DvisvgmSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) DvisvgmSpecialTest_LDADD = $(TESTLIBS) EllipticalArcTest_SOURCES = EllipticalArcTest.cpp testutil.hpp EllipticalArcTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) EllipticalArcTest_LDADD = $(TESTLIBS) EmSpecialTest_SOURCES = EmSpecialTest.cpp testutil.hpp EmSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) EmSpecialTest_LDADD = $(TESTLIBS) FileFinderTest_SOURCES = FileFinderTest.cpp testutil.hpp FileFinderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FileFinderTest_LDADD = $(TESTLIBS) FilePathTest_SOURCES = FilePathTest.cpp testutil.hpp FilePathTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FilePathTest_LDADD = $(TESTLIBS) FileSystemTest_SOURCES = FileSystemTest.cpp testutil.hpp FileSystemTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FileSystemTest_LDADD = $(TESTLIBS) FontCacheTest_SOURCES = FontCacheTest.cpp testutil.hpp FontCacheTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FontCacheTest_LDADD = $(TESTLIBS) FontManagerTest_SOURCES = FontManagerTest.cpp testutil.hpp FontManagerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FontManagerTest_LDADD = $(TESTLIBS) FontMapTest_SOURCES = FontMapTest.cpp testutil.hpp FontMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) FontMapTest_LDADD = $(TESTLIBS) GFGlyphTracerTest_SOURCES = GFGlyphTracerTest.cpp testutil.hpp GFGlyphTracerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GFGlyphTracerTest_LDADD = $(TESTLIBS) GFReaderTest_SOURCES = GFReaderTest.cpp testutil.hpp GFReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GFReaderTest_LDADD = $(TESTLIBS) GhostscriptTest_SOURCES = GhostscriptTest.cpp testutil.hpp GhostscriptTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GhostscriptTest_LDADD = $(TESTLIBS) GraphicsPathTest_SOURCES = GraphicsPathTest.cpp testutil.hpp GraphicsPathTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) GraphicsPathTest_LDADD = $(TESTLIBS) HashFunctionTest_SOURCES = HashFunctionTest.cpp testutil.hpp HashFunctionTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) HashFunctionTest_LDADD = $(TESTLIBS) JFMReaderTest_SOURCES = JFMReaderTest.cpp testutil.hpp JFMReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) JFMReaderTest_LDADD = $(TESTLIBS) LengthTest_SOURCES = LengthTest.cpp testutil.hpp LengthTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) LengthTest_LDADD = $(TESTLIBS) MapLineTest_SOURCES = MapLineTest.cpp testutil.hpp MapLineTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) MapLineTest_LDADD = $(TESTLIBS) MatrixTest_SOURCES = MatrixTest.cpp testutil.hpp MatrixTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) MatrixTest_LDADD = $(TESTLIBS) MessageExceptionTest_SOURCES = MessageExceptionTest.cpp testutil.hpp MessageExceptionTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) MessageExceptionTest_LDADD = $(TESTLIBS) PageRagesTest_SOURCES = PageRagesTest.cpp testutil.hpp PageRagesTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PageRagesTest_LDADD = $(TESTLIBS) PageSizeTest_SOURCES = PageSizeTest.cpp testutil.hpp PageSizeTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PageSizeTest_LDADD = $(TESTLIBS) PairTest_SOURCES = PairTest.cpp testutil.hpp PairTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PairTest_LDADD = $(TESTLIBS) PapersizeSpecialTest_SOURCES = PapersizeSpecialTest.cpp testutil.hpp PapersizeSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PapersizeSpecialTest_LDADD = $(TESTLIBS) PDFParserTest_SOURCES = PDFParserTest.cpp testutil.hpp PDFParserTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PDFParserTest_LDADD = $(TESTLIBS) PSInterpreterTest_SOURCES = PSInterpreterTest.cpp testutil.hpp PSInterpreterTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) PSInterpreterTest_LDADD = $(TESTLIBS) RangeMapTest_SOURCES = RangeMapTest.cpp testutil.hpp RangeMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) RangeMapTest_LDADD = $(TESTLIBS) ShadingPatchTest_SOURCES = ShadingPatchTest.cpp testutil.hpp ShadingPatchTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ShadingPatchTest_LDADD = $(TESTLIBS) SpecialManagerTest_SOURCES = SpecialManagerTest.cpp testutil.hpp SpecialManagerTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SpecialManagerTest_LDADD = $(TESTLIBS) SplittedCharInputBufferTest_SOURCES = SplittedCharInputBufferTest.cpp testutil.hpp SplittedCharInputBufferTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SplittedCharInputBufferTest_LDADD = $(TESTLIBS) StreamInputBufferTest_SOURCES = StreamInputBufferTest.cpp testutil.hpp StreamInputBufferTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StreamInputBufferTest_LDADD = $(TESTLIBS) StreamReaderTest_SOURCES = StreamReaderTest.cpp testutil.hpp StreamReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StreamReaderTest_LDADD = $(TESTLIBS) StreamWriterTest_SOURCES = StreamWriterTest.cpp testutil.hpp StreamWriterTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StreamWriterTest_LDADD = $(TESTLIBS) StringMatcherTest_SOURCES = StringMatcherTest.cpp testutil.hpp StringMatcherTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) StringMatcherTest_LDADD = $(TESTLIBS) SubfontTest_SOURCES = SubfontTest.cpp testutil.hpp SubfontTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SubfontTest_LDADD = $(TESTLIBS) SVGOutputTest_SOURCES = SVGOutputTest.cpp testutil.hpp SVGOutputTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) SVGOutputTest_LDADD = $(TESTLIBS) TensorProductPatchTest_SOURCES = TensorProductPatchTest.cpp testutil.hpp TensorProductPatchTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TensorProductPatchTest_LDADD = $(TESTLIBS) TFMReaderTest_SOURCES = TFMReaderTest.cpp testutil.hpp TFMReaderTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TFMReaderTest_LDADD = $(TESTLIBS) ToUnicodeMapTest_SOURCES = ToUnicodeMapTest.cpp testutil.hpp ToUnicodeMapTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) ToUnicodeMapTest_LDADD = $(TESTLIBS) TpicSpecialTest_SOURCES = TpicSpecialTest.cpp testutil.hpp TpicSpecialTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TpicSpecialTest_LDADD = $(TESTLIBS) TriangularPatchTest_SOURCES = TriangularPatchTest.cpp testutil.hpp TriangularPatchTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) TriangularPatchTest_LDADD = $(TESTLIBS) UnicodeTest_SOURCES = UnicodeTest.cpp testutil.hpp UnicodeTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) UnicodeTest_LDADD = $(TESTLIBS) UtilityTest_SOURCES = UtilityTest.cpp testutil.hpp UtilityTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) UtilityTest_LDADD = $(TESTLIBS) VectorIteratorTest_SOURCES = VectorIteratorTest.cpp testutil.hpp VectorIteratorTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) VectorIteratorTest_LDADD = $(TESTLIBS) VectorStreamTest_SOURCES = VectorStreamTest.cpp testutil.hpp VectorStreamTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) VectorStreamTest_LDADD = $(TESTLIBS) XMLNodeTest_SOURCES = XMLNodeTest.cpp testutil.hpp XMLNodeTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) XMLNodeTest_LDADD = $(TESTLIBS) XMLStringTest_SOURCES = XMLStringTest.cpp testutil.hpp XMLStringTest_CPPFLAGS = -I$(dvisvgm_srcdir)/tests/gtest/include $(LIBS_CFLAGS) XMLStringTest_LDADD = $(TESTLIBS) CLEANFILES = *.gcda *.gcno hashcheck.cpp all: all-recursive .SUFFIXES: .SUFFIXES: .cc .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/../libs/defs.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(srcdir)/../libs/defs.am $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } gtest/src/$(am__dirstamp): @$(MKDIR_P) gtest/src @: > gtest/src/$(am__dirstamp) gtest/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gtest/src/$(DEPDIR) @: > gtest/src/$(DEPDIR)/$(am__dirstamp) gtest/src/libgtest_la-gtest-all.lo: gtest/src/$(am__dirstamp) \ gtest/src/$(DEPDIR)/$(am__dirstamp) libgtest.la: $(libgtest_la_OBJECTS) $(libgtest_la_DEPENDENCIES) $(EXTRA_libgtest_la_DEPENDENCIES) $(AM_V_CXXLD)$(libgtest_la_LINK) $(libgtest_la_OBJECTS) $(libgtest_la_LIBADD) $(LIBS) BezierTest$(EXEEXT): $(BezierTest_OBJECTS) $(BezierTest_DEPENDENCIES) $(EXTRA_BezierTest_DEPENDENCIES) @rm -f BezierTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(BezierTest_OBJECTS) $(BezierTest_LDADD) $(LIBS) BitmapTest$(EXEEXT): $(BitmapTest_OBJECTS) $(BitmapTest_DEPENDENCIES) $(EXTRA_BitmapTest_DEPENDENCIES) @rm -f BitmapTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(BitmapTest_OBJECTS) $(BitmapTest_LDADD) $(LIBS) BoundingBoxTest$(EXEEXT): $(BoundingBoxTest_OBJECTS) $(BoundingBoxTest_DEPENDENCIES) $(EXTRA_BoundingBoxTest_DEPENDENCIES) @rm -f BoundingBoxTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(BoundingBoxTest_OBJECTS) $(BoundingBoxTest_LDADD) $(LIBS) CMapManagerTest$(EXEEXT): $(CMapManagerTest_OBJECTS) $(CMapManagerTest_DEPENDENCIES) $(EXTRA_CMapManagerTest_DEPENDENCIES) @rm -f CMapManagerTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CMapManagerTest_OBJECTS) $(CMapManagerTest_LDADD) $(LIBS) CMapReaderTest$(EXEEXT): $(CMapReaderTest_OBJECTS) $(CMapReaderTest_DEPENDENCIES) $(EXTRA_CMapReaderTest_DEPENDENCIES) @rm -f CMapReaderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CMapReaderTest_OBJECTS) $(CMapReaderTest_LDADD) $(LIBS) CMapTest$(EXEEXT): $(CMapTest_OBJECTS) $(CMapTest_DEPENDENCIES) $(EXTRA_CMapTest_DEPENDENCIES) @rm -f CMapTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CMapTest_OBJECTS) $(CMapTest_LDADD) $(LIBS) CalculatorTest$(EXEEXT): $(CalculatorTest_OBJECTS) $(CalculatorTest_DEPENDENCIES) $(EXTRA_CalculatorTest_DEPENDENCIES) @rm -f CalculatorTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CalculatorTest_OBJECTS) $(CalculatorTest_LDADD) $(LIBS) ColorSpecialTest$(EXEEXT): $(ColorSpecialTest_OBJECTS) $(ColorSpecialTest_DEPENDENCIES) $(EXTRA_ColorSpecialTest_DEPENDENCIES) @rm -f ColorSpecialTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ColorSpecialTest_OBJECTS) $(ColorSpecialTest_LDADD) $(LIBS) ColorTest$(EXEEXT): $(ColorTest_OBJECTS) $(ColorTest_DEPENDENCIES) $(EXTRA_ColorTest_DEPENDENCIES) @rm -f ColorTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ColorTest_OBJECTS) $(ColorTest_LDADD) $(LIBS) CommandLineTest$(EXEEXT): $(CommandLineTest_OBJECTS) $(CommandLineTest_DEPENDENCIES) $(EXTRA_CommandLineTest_DEPENDENCIES) @rm -f CommandLineTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CommandLineTest_OBJECTS) $(CommandLineTest_LDADD) $(LIBS) DVIReaderTest$(EXEEXT): $(DVIReaderTest_OBJECTS) $(DVIReaderTest_DEPENDENCIES) $(EXTRA_DVIReaderTest_DEPENDENCIES) @rm -f DVIReaderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(DVIReaderTest_OBJECTS) $(DVIReaderTest_LDADD) $(LIBS) DependencyGraphTest$(EXEEXT): $(DependencyGraphTest_OBJECTS) $(DependencyGraphTest_DEPENDENCIES) $(EXTRA_DependencyGraphTest_DEPENDENCIES) @rm -f DependencyGraphTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(DependencyGraphTest_OBJECTS) $(DependencyGraphTest_LDADD) $(LIBS) DirectoryTest$(EXEEXT): $(DirectoryTest_OBJECTS) $(DirectoryTest_DEPENDENCIES) $(EXTRA_DirectoryTest_DEPENDENCIES) @rm -f DirectoryTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(DirectoryTest_OBJECTS) $(DirectoryTest_LDADD) $(LIBS) DvisvgmSpecialTest$(EXEEXT): $(DvisvgmSpecialTest_OBJECTS) $(DvisvgmSpecialTest_DEPENDENCIES) $(EXTRA_DvisvgmSpecialTest_DEPENDENCIES) @rm -f DvisvgmSpecialTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(DvisvgmSpecialTest_OBJECTS) $(DvisvgmSpecialTest_LDADD) $(LIBS) EllipticalArcTest$(EXEEXT): $(EllipticalArcTest_OBJECTS) $(EllipticalArcTest_DEPENDENCIES) $(EXTRA_EllipticalArcTest_DEPENDENCIES) @rm -f EllipticalArcTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(EllipticalArcTest_OBJECTS) $(EllipticalArcTest_LDADD) $(LIBS) EmSpecialTest$(EXEEXT): $(EmSpecialTest_OBJECTS) $(EmSpecialTest_DEPENDENCIES) $(EXTRA_EmSpecialTest_DEPENDENCIES) @rm -f EmSpecialTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(EmSpecialTest_OBJECTS) $(EmSpecialTest_LDADD) $(LIBS) FileFinderTest$(EXEEXT): $(FileFinderTest_OBJECTS) $(FileFinderTest_DEPENDENCIES) $(EXTRA_FileFinderTest_DEPENDENCIES) @rm -f FileFinderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FileFinderTest_OBJECTS) $(FileFinderTest_LDADD) $(LIBS) FilePathTest$(EXEEXT): $(FilePathTest_OBJECTS) $(FilePathTest_DEPENDENCIES) $(EXTRA_FilePathTest_DEPENDENCIES) @rm -f FilePathTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FilePathTest_OBJECTS) $(FilePathTest_LDADD) $(LIBS) FileSystemTest$(EXEEXT): $(FileSystemTest_OBJECTS) $(FileSystemTest_DEPENDENCIES) $(EXTRA_FileSystemTest_DEPENDENCIES) @rm -f FileSystemTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FileSystemTest_OBJECTS) $(FileSystemTest_LDADD) $(LIBS) FontCacheTest$(EXEEXT): $(FontCacheTest_OBJECTS) $(FontCacheTest_DEPENDENCIES) $(EXTRA_FontCacheTest_DEPENDENCIES) @rm -f FontCacheTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FontCacheTest_OBJECTS) $(FontCacheTest_LDADD) $(LIBS) FontManagerTest$(EXEEXT): $(FontManagerTest_OBJECTS) $(FontManagerTest_DEPENDENCIES) $(EXTRA_FontManagerTest_DEPENDENCIES) @rm -f FontManagerTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FontManagerTest_OBJECTS) $(FontManagerTest_LDADD) $(LIBS) FontMapTest$(EXEEXT): $(FontMapTest_OBJECTS) $(FontMapTest_DEPENDENCIES) $(EXTRA_FontMapTest_DEPENDENCIES) @rm -f FontMapTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(FontMapTest_OBJECTS) $(FontMapTest_LDADD) $(LIBS) GFGlyphTracerTest$(EXEEXT): $(GFGlyphTracerTest_OBJECTS) $(GFGlyphTracerTest_DEPENDENCIES) $(EXTRA_GFGlyphTracerTest_DEPENDENCIES) @rm -f GFGlyphTracerTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(GFGlyphTracerTest_OBJECTS) $(GFGlyphTracerTest_LDADD) $(LIBS) GFReaderTest$(EXEEXT): $(GFReaderTest_OBJECTS) $(GFReaderTest_DEPENDENCIES) $(EXTRA_GFReaderTest_DEPENDENCIES) @rm -f GFReaderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(GFReaderTest_OBJECTS) $(GFReaderTest_LDADD) $(LIBS) GhostscriptTest$(EXEEXT): $(GhostscriptTest_OBJECTS) $(GhostscriptTest_DEPENDENCIES) $(EXTRA_GhostscriptTest_DEPENDENCIES) @rm -f GhostscriptTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(GhostscriptTest_OBJECTS) $(GhostscriptTest_LDADD) $(LIBS) GraphicsPathTest$(EXEEXT): $(GraphicsPathTest_OBJECTS) $(GraphicsPathTest_DEPENDENCIES) $(EXTRA_GraphicsPathTest_DEPENDENCIES) @rm -f GraphicsPathTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(GraphicsPathTest_OBJECTS) $(GraphicsPathTest_LDADD) $(LIBS) HashFunctionTest$(EXEEXT): $(HashFunctionTest_OBJECTS) $(HashFunctionTest_DEPENDENCIES) $(EXTRA_HashFunctionTest_DEPENDENCIES) @rm -f HashFunctionTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(HashFunctionTest_OBJECTS) $(HashFunctionTest_LDADD) $(LIBS) JFMReaderTest$(EXEEXT): $(JFMReaderTest_OBJECTS) $(JFMReaderTest_DEPENDENCIES) $(EXTRA_JFMReaderTest_DEPENDENCIES) @rm -f JFMReaderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(JFMReaderTest_OBJECTS) $(JFMReaderTest_LDADD) $(LIBS) LengthTest$(EXEEXT): $(LengthTest_OBJECTS) $(LengthTest_DEPENDENCIES) $(EXTRA_LengthTest_DEPENDENCIES) @rm -f LengthTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(LengthTest_OBJECTS) $(LengthTest_LDADD) $(LIBS) MapLineTest$(EXEEXT): $(MapLineTest_OBJECTS) $(MapLineTest_DEPENDENCIES) $(EXTRA_MapLineTest_DEPENDENCIES) @rm -f MapLineTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(MapLineTest_OBJECTS) $(MapLineTest_LDADD) $(LIBS) MatrixTest$(EXEEXT): $(MatrixTest_OBJECTS) $(MatrixTest_DEPENDENCIES) $(EXTRA_MatrixTest_DEPENDENCIES) @rm -f MatrixTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(MatrixTest_OBJECTS) $(MatrixTest_LDADD) $(LIBS) MessageExceptionTest$(EXEEXT): $(MessageExceptionTest_OBJECTS) $(MessageExceptionTest_DEPENDENCIES) $(EXTRA_MessageExceptionTest_DEPENDENCIES) @rm -f MessageExceptionTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(MessageExceptionTest_OBJECTS) $(MessageExceptionTest_LDADD) $(LIBS) PDFParserTest$(EXEEXT): $(PDFParserTest_OBJECTS) $(PDFParserTest_DEPENDENCIES) $(EXTRA_PDFParserTest_DEPENDENCIES) @rm -f PDFParserTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PDFParserTest_OBJECTS) $(PDFParserTest_LDADD) $(LIBS) PSInterpreterTest$(EXEEXT): $(PSInterpreterTest_OBJECTS) $(PSInterpreterTest_DEPENDENCIES) $(EXTRA_PSInterpreterTest_DEPENDENCIES) @rm -f PSInterpreterTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PSInterpreterTest_OBJECTS) $(PSInterpreterTest_LDADD) $(LIBS) PageRagesTest$(EXEEXT): $(PageRagesTest_OBJECTS) $(PageRagesTest_DEPENDENCIES) $(EXTRA_PageRagesTest_DEPENDENCIES) @rm -f PageRagesTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PageRagesTest_OBJECTS) $(PageRagesTest_LDADD) $(LIBS) PageSizeTest$(EXEEXT): $(PageSizeTest_OBJECTS) $(PageSizeTest_DEPENDENCIES) $(EXTRA_PageSizeTest_DEPENDENCIES) @rm -f PageSizeTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PageSizeTest_OBJECTS) $(PageSizeTest_LDADD) $(LIBS) PairTest$(EXEEXT): $(PairTest_OBJECTS) $(PairTest_DEPENDENCIES) $(EXTRA_PairTest_DEPENDENCIES) @rm -f PairTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PairTest_OBJECTS) $(PairTest_LDADD) $(LIBS) PapersizeSpecialTest$(EXEEXT): $(PapersizeSpecialTest_OBJECTS) $(PapersizeSpecialTest_DEPENDENCIES) $(EXTRA_PapersizeSpecialTest_DEPENDENCIES) @rm -f PapersizeSpecialTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(PapersizeSpecialTest_OBJECTS) $(PapersizeSpecialTest_LDADD) $(LIBS) RangeMapTest$(EXEEXT): $(RangeMapTest_OBJECTS) $(RangeMapTest_DEPENDENCIES) $(EXTRA_RangeMapTest_DEPENDENCIES) @rm -f RangeMapTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(RangeMapTest_OBJECTS) $(RangeMapTest_LDADD) $(LIBS) SVGOutputTest$(EXEEXT): $(SVGOutputTest_OBJECTS) $(SVGOutputTest_DEPENDENCIES) $(EXTRA_SVGOutputTest_DEPENDENCIES) @rm -f SVGOutputTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(SVGOutputTest_OBJECTS) $(SVGOutputTest_LDADD) $(LIBS) ShadingPatchTest$(EXEEXT): $(ShadingPatchTest_OBJECTS) $(ShadingPatchTest_DEPENDENCIES) $(EXTRA_ShadingPatchTest_DEPENDENCIES) @rm -f ShadingPatchTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ShadingPatchTest_OBJECTS) $(ShadingPatchTest_LDADD) $(LIBS) SpecialManagerTest$(EXEEXT): $(SpecialManagerTest_OBJECTS) $(SpecialManagerTest_DEPENDENCIES) $(EXTRA_SpecialManagerTest_DEPENDENCIES) @rm -f SpecialManagerTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(SpecialManagerTest_OBJECTS) $(SpecialManagerTest_LDADD) $(LIBS) SplittedCharInputBufferTest$(EXEEXT): $(SplittedCharInputBufferTest_OBJECTS) $(SplittedCharInputBufferTest_DEPENDENCIES) $(EXTRA_SplittedCharInputBufferTest_DEPENDENCIES) @rm -f SplittedCharInputBufferTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(SplittedCharInputBufferTest_OBJECTS) $(SplittedCharInputBufferTest_LDADD) $(LIBS) StreamInputBufferTest$(EXEEXT): $(StreamInputBufferTest_OBJECTS) $(StreamInputBufferTest_DEPENDENCIES) $(EXTRA_StreamInputBufferTest_DEPENDENCIES) @rm -f StreamInputBufferTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(StreamInputBufferTest_OBJECTS) $(StreamInputBufferTest_LDADD) $(LIBS) StreamReaderTest$(EXEEXT): $(StreamReaderTest_OBJECTS) $(StreamReaderTest_DEPENDENCIES) $(EXTRA_StreamReaderTest_DEPENDENCIES) @rm -f StreamReaderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(StreamReaderTest_OBJECTS) $(StreamReaderTest_LDADD) $(LIBS) StreamWriterTest$(EXEEXT): $(StreamWriterTest_OBJECTS) $(StreamWriterTest_DEPENDENCIES) $(EXTRA_StreamWriterTest_DEPENDENCIES) @rm -f StreamWriterTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(StreamWriterTest_OBJECTS) $(StreamWriterTest_LDADD) $(LIBS) StringMatcherTest$(EXEEXT): $(StringMatcherTest_OBJECTS) $(StringMatcherTest_DEPENDENCIES) $(EXTRA_StringMatcherTest_DEPENDENCIES) @rm -f StringMatcherTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(StringMatcherTest_OBJECTS) $(StringMatcherTest_LDADD) $(LIBS) SubfontTest$(EXEEXT): $(SubfontTest_OBJECTS) $(SubfontTest_DEPENDENCIES) $(EXTRA_SubfontTest_DEPENDENCIES) @rm -f SubfontTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(SubfontTest_OBJECTS) $(SubfontTest_LDADD) $(LIBS) TFMReaderTest$(EXEEXT): $(TFMReaderTest_OBJECTS) $(TFMReaderTest_DEPENDENCIES) $(EXTRA_TFMReaderTest_DEPENDENCIES) @rm -f TFMReaderTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TFMReaderTest_OBJECTS) $(TFMReaderTest_LDADD) $(LIBS) TensorProductPatchTest$(EXEEXT): $(TensorProductPatchTest_OBJECTS) $(TensorProductPatchTest_DEPENDENCIES) $(EXTRA_TensorProductPatchTest_DEPENDENCIES) @rm -f TensorProductPatchTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TensorProductPatchTest_OBJECTS) $(TensorProductPatchTest_LDADD) $(LIBS) ToUnicodeMapTest$(EXEEXT): $(ToUnicodeMapTest_OBJECTS) $(ToUnicodeMapTest_DEPENDENCIES) $(EXTRA_ToUnicodeMapTest_DEPENDENCIES) @rm -f ToUnicodeMapTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ToUnicodeMapTest_OBJECTS) $(ToUnicodeMapTest_LDADD) $(LIBS) TpicSpecialTest$(EXEEXT): $(TpicSpecialTest_OBJECTS) $(TpicSpecialTest_DEPENDENCIES) $(EXTRA_TpicSpecialTest_DEPENDENCIES) @rm -f TpicSpecialTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TpicSpecialTest_OBJECTS) $(TpicSpecialTest_LDADD) $(LIBS) TriangularPatchTest$(EXEEXT): $(TriangularPatchTest_OBJECTS) $(TriangularPatchTest_DEPENDENCIES) $(EXTRA_TriangularPatchTest_DEPENDENCIES) @rm -f TriangularPatchTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TriangularPatchTest_OBJECTS) $(TriangularPatchTest_LDADD) $(LIBS) UnicodeTest$(EXEEXT): $(UnicodeTest_OBJECTS) $(UnicodeTest_DEPENDENCIES) $(EXTRA_UnicodeTest_DEPENDENCIES) @rm -f UnicodeTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(UnicodeTest_OBJECTS) $(UnicodeTest_LDADD) $(LIBS) UtilityTest$(EXEEXT): $(UtilityTest_OBJECTS) $(UtilityTest_DEPENDENCIES) $(EXTRA_UtilityTest_DEPENDENCIES) @rm -f UtilityTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(UtilityTest_OBJECTS) $(UtilityTest_LDADD) $(LIBS) VectorIteratorTest$(EXEEXT): $(VectorIteratorTest_OBJECTS) $(VectorIteratorTest_DEPENDENCIES) $(EXTRA_VectorIteratorTest_DEPENDENCIES) @rm -f VectorIteratorTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(VectorIteratorTest_OBJECTS) $(VectorIteratorTest_LDADD) $(LIBS) VectorStreamTest$(EXEEXT): $(VectorStreamTest_OBJECTS) $(VectorStreamTest_DEPENDENCIES) $(EXTRA_VectorStreamTest_DEPENDENCIES) @rm -f VectorStreamTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(VectorStreamTest_OBJECTS) $(VectorStreamTest_LDADD) $(LIBS) XMLNodeTest$(EXEEXT): $(XMLNodeTest_OBJECTS) $(XMLNodeTest_DEPENDENCIES) $(EXTRA_XMLNodeTest_DEPENDENCIES) @rm -f XMLNodeTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(XMLNodeTest_OBJECTS) $(XMLNodeTest_LDADD) $(LIBS) XMLStringTest$(EXEEXT): $(XMLStringTest_OBJECTS) $(XMLStringTest_DEPENDENCIES) $(EXTRA_XMLStringTest_DEPENDENCIES) @rm -f XMLStringTest$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(XMLStringTest_OBJECTS) $(XMLStringTest_LDADD) $(LIBS) hashcheck$(EXEEXT): $(hashcheck_OBJECTS) $(hashcheck_DEPENDENCIES) $(EXTRA_hashcheck_DEPENDENCIES) @rm -f hashcheck$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(hashcheck_OBJECTS) $(hashcheck_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f gtest/src/*.$(OBJEXT) -rm -f gtest/src/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BezierTest-BezierTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitmapTest-BitmapTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMapManagerTest-CMapManagerTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMapReaderTest-CMapReaderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CMapTest-CMapTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CalculatorTest-CalculatorTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ColorTest-ColorTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CommandLineTest-CommandLineTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DVIReaderTest-DVIReaderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DirectoryTest-DirectoryTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/EmSpecialTest-EmSpecialTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileFinderTest-FileFinderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FilePathTest-FilePathTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileSystemTest-FileSystemTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontCacheTest-FontCacheTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontManagerTest-FontManagerTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FontMapTest-FontMapTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GFReaderTest-GFReaderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GhostscriptTest-GhostscriptTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HashFunctionTest-HashFunctionTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/JFMReaderTest-JFMReaderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LengthTest-LengthTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MapLineTest-MapLineTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MatrixTest-MatrixTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFParserTest-PDFParserTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageRagesTest-PageRagesTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageSizeTest-PageSizeTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PairTest-PairTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RangeMapTest-RangeMapTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SVGOutputTest-SVGOutputTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamReaderTest-StreamReaderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StreamWriterTest-StreamWriterTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StringMatcherTest-StringMatcherTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SubfontTest-SubfontTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TFMReaderTest-TFMReaderTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UnicodeTest-UnicodeTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UtilityTest-UtilityTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/VectorStreamTest-VectorStreamTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMLNodeTest-XMLNodeTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/XMLStringTest-XMLStringTest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hashcheck-hashcheck.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgtest_la-testmain.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< gtest/src/libgtest_la-gtest-all.lo: gtest/src/gtest-all.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgtest_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gtest/src/libgtest_la-gtest-all.lo -MD -MP -MF gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Tpo -c -o gtest/src/libgtest_la-gtest-all.lo `test -f 'gtest/src/gtest-all.cc' || echo '$(srcdir)/'`gtest/src/gtest-all.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Tpo gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gtest/src/gtest-all.cc' object='gtest/src/libgtest_la-gtest-all.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgtest_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o gtest/src/libgtest_la-gtest-all.lo `test -f 'gtest/src/gtest-all.cc' || echo '$(srcdir)/'`gtest/src/gtest-all.cc libgtest_la-testmain.lo: testmain.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgtest_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libgtest_la-testmain.lo -MD -MP -MF $(DEPDIR)/libgtest_la-testmain.Tpo -c -o libgtest_la-testmain.lo `test -f 'testmain.cpp' || echo '$(srcdir)/'`testmain.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgtest_la-testmain.Tpo $(DEPDIR)/libgtest_la-testmain.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='testmain.cpp' object='libgtest_la-testmain.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgtest_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libgtest_la-testmain.lo `test -f 'testmain.cpp' || echo '$(srcdir)/'`testmain.cpp BezierTest-BezierTest.o: BezierTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BezierTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BezierTest-BezierTest.o -MD -MP -MF $(DEPDIR)/BezierTest-BezierTest.Tpo -c -o BezierTest-BezierTest.o `test -f 'BezierTest.cpp' || echo '$(srcdir)/'`BezierTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BezierTest-BezierTest.Tpo $(DEPDIR)/BezierTest-BezierTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='BezierTest.cpp' object='BezierTest-BezierTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BezierTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BezierTest-BezierTest.o `test -f 'BezierTest.cpp' || echo '$(srcdir)/'`BezierTest.cpp BezierTest-BezierTest.obj: BezierTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BezierTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BezierTest-BezierTest.obj -MD -MP -MF $(DEPDIR)/BezierTest-BezierTest.Tpo -c -o BezierTest-BezierTest.obj `if test -f 'BezierTest.cpp'; then $(CYGPATH_W) 'BezierTest.cpp'; else $(CYGPATH_W) '$(srcdir)/BezierTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BezierTest-BezierTest.Tpo $(DEPDIR)/BezierTest-BezierTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='BezierTest.cpp' object='BezierTest-BezierTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BezierTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BezierTest-BezierTest.obj `if test -f 'BezierTest.cpp'; then $(CYGPATH_W) 'BezierTest.cpp'; else $(CYGPATH_W) '$(srcdir)/BezierTest.cpp'; fi` BitmapTest-BitmapTest.o: BitmapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BitmapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BitmapTest-BitmapTest.o -MD -MP -MF $(DEPDIR)/BitmapTest-BitmapTest.Tpo -c -o BitmapTest-BitmapTest.o `test -f 'BitmapTest.cpp' || echo '$(srcdir)/'`BitmapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BitmapTest-BitmapTest.Tpo $(DEPDIR)/BitmapTest-BitmapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='BitmapTest.cpp' object='BitmapTest-BitmapTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BitmapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BitmapTest-BitmapTest.o `test -f 'BitmapTest.cpp' || echo '$(srcdir)/'`BitmapTest.cpp BitmapTest-BitmapTest.obj: BitmapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BitmapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BitmapTest-BitmapTest.obj -MD -MP -MF $(DEPDIR)/BitmapTest-BitmapTest.Tpo -c -o BitmapTest-BitmapTest.obj `if test -f 'BitmapTest.cpp'; then $(CYGPATH_W) 'BitmapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/BitmapTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BitmapTest-BitmapTest.Tpo $(DEPDIR)/BitmapTest-BitmapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='BitmapTest.cpp' object='BitmapTest-BitmapTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BitmapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BitmapTest-BitmapTest.obj `if test -f 'BitmapTest.cpp'; then $(CYGPATH_W) 'BitmapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/BitmapTest.cpp'; fi` BoundingBoxTest-BoundingBoxTest.o: BoundingBoxTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BoundingBoxTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BoundingBoxTest-BoundingBoxTest.o -MD -MP -MF $(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Tpo -c -o BoundingBoxTest-BoundingBoxTest.o `test -f 'BoundingBoxTest.cpp' || echo '$(srcdir)/'`BoundingBoxTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Tpo $(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='BoundingBoxTest.cpp' object='BoundingBoxTest-BoundingBoxTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BoundingBoxTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BoundingBoxTest-BoundingBoxTest.o `test -f 'BoundingBoxTest.cpp' || echo '$(srcdir)/'`BoundingBoxTest.cpp BoundingBoxTest-BoundingBoxTest.obj: BoundingBoxTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BoundingBoxTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT BoundingBoxTest-BoundingBoxTest.obj -MD -MP -MF $(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Tpo -c -o BoundingBoxTest-BoundingBoxTest.obj `if test -f 'BoundingBoxTest.cpp'; then $(CYGPATH_W) 'BoundingBoxTest.cpp'; else $(CYGPATH_W) '$(srcdir)/BoundingBoxTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Tpo $(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='BoundingBoxTest.cpp' object='BoundingBoxTest-BoundingBoxTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(BoundingBoxTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o BoundingBoxTest-BoundingBoxTest.obj `if test -f 'BoundingBoxTest.cpp'; then $(CYGPATH_W) 'BoundingBoxTest.cpp'; else $(CYGPATH_W) '$(srcdir)/BoundingBoxTest.cpp'; fi` CMapManagerTest-CMapManagerTest.o: CMapManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CMapManagerTest-CMapManagerTest.o -MD -MP -MF $(DEPDIR)/CMapManagerTest-CMapManagerTest.Tpo -c -o CMapManagerTest-CMapManagerTest.o `test -f 'CMapManagerTest.cpp' || echo '$(srcdir)/'`CMapManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CMapManagerTest-CMapManagerTest.Tpo $(DEPDIR)/CMapManagerTest-CMapManagerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CMapManagerTest.cpp' object='CMapManagerTest-CMapManagerTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CMapManagerTest-CMapManagerTest.o `test -f 'CMapManagerTest.cpp' || echo '$(srcdir)/'`CMapManagerTest.cpp CMapManagerTest-CMapManagerTest.obj: CMapManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CMapManagerTest-CMapManagerTest.obj -MD -MP -MF $(DEPDIR)/CMapManagerTest-CMapManagerTest.Tpo -c -o CMapManagerTest-CMapManagerTest.obj `if test -f 'CMapManagerTest.cpp'; then $(CYGPATH_W) 'CMapManagerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CMapManagerTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CMapManagerTest-CMapManagerTest.Tpo $(DEPDIR)/CMapManagerTest-CMapManagerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CMapManagerTest.cpp' object='CMapManagerTest-CMapManagerTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CMapManagerTest-CMapManagerTest.obj `if test -f 'CMapManagerTest.cpp'; then $(CYGPATH_W) 'CMapManagerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CMapManagerTest.cpp'; fi` CMapReaderTest-CMapReaderTest.o: CMapReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CMapReaderTest-CMapReaderTest.o -MD -MP -MF $(DEPDIR)/CMapReaderTest-CMapReaderTest.Tpo -c -o CMapReaderTest-CMapReaderTest.o `test -f 'CMapReaderTest.cpp' || echo '$(srcdir)/'`CMapReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CMapReaderTest-CMapReaderTest.Tpo $(DEPDIR)/CMapReaderTest-CMapReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CMapReaderTest.cpp' object='CMapReaderTest-CMapReaderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CMapReaderTest-CMapReaderTest.o `test -f 'CMapReaderTest.cpp' || echo '$(srcdir)/'`CMapReaderTest.cpp CMapReaderTest-CMapReaderTest.obj: CMapReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CMapReaderTest-CMapReaderTest.obj -MD -MP -MF $(DEPDIR)/CMapReaderTest-CMapReaderTest.Tpo -c -o CMapReaderTest-CMapReaderTest.obj `if test -f 'CMapReaderTest.cpp'; then $(CYGPATH_W) 'CMapReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CMapReaderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CMapReaderTest-CMapReaderTest.Tpo $(DEPDIR)/CMapReaderTest-CMapReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CMapReaderTest.cpp' object='CMapReaderTest-CMapReaderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CMapReaderTest-CMapReaderTest.obj `if test -f 'CMapReaderTest.cpp'; then $(CYGPATH_W) 'CMapReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CMapReaderTest.cpp'; fi` CMapTest-CMapTest.o: CMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CMapTest-CMapTest.o -MD -MP -MF $(DEPDIR)/CMapTest-CMapTest.Tpo -c -o CMapTest-CMapTest.o `test -f 'CMapTest.cpp' || echo '$(srcdir)/'`CMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CMapTest-CMapTest.Tpo $(DEPDIR)/CMapTest-CMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CMapTest.cpp' object='CMapTest-CMapTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CMapTest-CMapTest.o `test -f 'CMapTest.cpp' || echo '$(srcdir)/'`CMapTest.cpp CMapTest-CMapTest.obj: CMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CMapTest-CMapTest.obj -MD -MP -MF $(DEPDIR)/CMapTest-CMapTest.Tpo -c -o CMapTest-CMapTest.obj `if test -f 'CMapTest.cpp'; then $(CYGPATH_W) 'CMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CMapTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CMapTest-CMapTest.Tpo $(DEPDIR)/CMapTest-CMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CMapTest.cpp' object='CMapTest-CMapTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CMapTest-CMapTest.obj `if test -f 'CMapTest.cpp'; then $(CYGPATH_W) 'CMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CMapTest.cpp'; fi` CalculatorTest-CalculatorTest.o: CalculatorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CalculatorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CalculatorTest-CalculatorTest.o -MD -MP -MF $(DEPDIR)/CalculatorTest-CalculatorTest.Tpo -c -o CalculatorTest-CalculatorTest.o `test -f 'CalculatorTest.cpp' || echo '$(srcdir)/'`CalculatorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CalculatorTest-CalculatorTest.Tpo $(DEPDIR)/CalculatorTest-CalculatorTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CalculatorTest.cpp' object='CalculatorTest-CalculatorTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CalculatorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CalculatorTest-CalculatorTest.o `test -f 'CalculatorTest.cpp' || echo '$(srcdir)/'`CalculatorTest.cpp CalculatorTest-CalculatorTest.obj: CalculatorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CalculatorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CalculatorTest-CalculatorTest.obj -MD -MP -MF $(DEPDIR)/CalculatorTest-CalculatorTest.Tpo -c -o CalculatorTest-CalculatorTest.obj `if test -f 'CalculatorTest.cpp'; then $(CYGPATH_W) 'CalculatorTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CalculatorTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CalculatorTest-CalculatorTest.Tpo $(DEPDIR)/CalculatorTest-CalculatorTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CalculatorTest.cpp' object='CalculatorTest-CalculatorTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CalculatorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CalculatorTest-CalculatorTest.obj `if test -f 'CalculatorTest.cpp'; then $(CYGPATH_W) 'CalculatorTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CalculatorTest.cpp'; fi` ColorSpecialTest-ColorSpecialTest.o: ColorSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ColorSpecialTest-ColorSpecialTest.o -MD -MP -MF $(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Tpo -c -o ColorSpecialTest-ColorSpecialTest.o `test -f 'ColorSpecialTest.cpp' || echo '$(srcdir)/'`ColorSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Tpo $(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ColorSpecialTest.cpp' object='ColorSpecialTest-ColorSpecialTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ColorSpecialTest-ColorSpecialTest.o `test -f 'ColorSpecialTest.cpp' || echo '$(srcdir)/'`ColorSpecialTest.cpp ColorSpecialTest-ColorSpecialTest.obj: ColorSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ColorSpecialTest-ColorSpecialTest.obj -MD -MP -MF $(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Tpo -c -o ColorSpecialTest-ColorSpecialTest.obj `if test -f 'ColorSpecialTest.cpp'; then $(CYGPATH_W) 'ColorSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ColorSpecialTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Tpo $(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ColorSpecialTest.cpp' object='ColorSpecialTest-ColorSpecialTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ColorSpecialTest-ColorSpecialTest.obj `if test -f 'ColorSpecialTest.cpp'; then $(CYGPATH_W) 'ColorSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ColorSpecialTest.cpp'; fi` ColorTest-ColorTest.o: ColorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ColorTest-ColorTest.o -MD -MP -MF $(DEPDIR)/ColorTest-ColorTest.Tpo -c -o ColorTest-ColorTest.o `test -f 'ColorTest.cpp' || echo '$(srcdir)/'`ColorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ColorTest-ColorTest.Tpo $(DEPDIR)/ColorTest-ColorTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ColorTest.cpp' object='ColorTest-ColorTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ColorTest-ColorTest.o `test -f 'ColorTest.cpp' || echo '$(srcdir)/'`ColorTest.cpp ColorTest-ColorTest.obj: ColorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ColorTest-ColorTest.obj -MD -MP -MF $(DEPDIR)/ColorTest-ColorTest.Tpo -c -o ColorTest-ColorTest.obj `if test -f 'ColorTest.cpp'; then $(CYGPATH_W) 'ColorTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ColorTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ColorTest-ColorTest.Tpo $(DEPDIR)/ColorTest-ColorTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ColorTest.cpp' object='ColorTest-ColorTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ColorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ColorTest-ColorTest.obj `if test -f 'ColorTest.cpp'; then $(CYGPATH_W) 'ColorTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ColorTest.cpp'; fi` CommandLineTest-CommandLineTest.o: CommandLineTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CommandLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CommandLineTest-CommandLineTest.o -MD -MP -MF $(DEPDIR)/CommandLineTest-CommandLineTest.Tpo -c -o CommandLineTest-CommandLineTest.o `test -f 'CommandLineTest.cpp' || echo '$(srcdir)/'`CommandLineTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CommandLineTest-CommandLineTest.Tpo $(DEPDIR)/CommandLineTest-CommandLineTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CommandLineTest.cpp' object='CommandLineTest-CommandLineTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CommandLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CommandLineTest-CommandLineTest.o `test -f 'CommandLineTest.cpp' || echo '$(srcdir)/'`CommandLineTest.cpp CommandLineTest-CommandLineTest.obj: CommandLineTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CommandLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT CommandLineTest-CommandLineTest.obj -MD -MP -MF $(DEPDIR)/CommandLineTest-CommandLineTest.Tpo -c -o CommandLineTest-CommandLineTest.obj `if test -f 'CommandLineTest.cpp'; then $(CYGPATH_W) 'CommandLineTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CommandLineTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/CommandLineTest-CommandLineTest.Tpo $(DEPDIR)/CommandLineTest-CommandLineTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='CommandLineTest.cpp' object='CommandLineTest-CommandLineTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CommandLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o CommandLineTest-CommandLineTest.obj `if test -f 'CommandLineTest.cpp'; then $(CYGPATH_W) 'CommandLineTest.cpp'; else $(CYGPATH_W) '$(srcdir)/CommandLineTest.cpp'; fi` DVIReaderTest-DVIReaderTest.o: DVIReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DVIReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DVIReaderTest-DVIReaderTest.o -MD -MP -MF $(DEPDIR)/DVIReaderTest-DVIReaderTest.Tpo -c -o DVIReaderTest-DVIReaderTest.o `test -f 'DVIReaderTest.cpp' || echo '$(srcdir)/'`DVIReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DVIReaderTest-DVIReaderTest.Tpo $(DEPDIR)/DVIReaderTest-DVIReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DVIReaderTest.cpp' object='DVIReaderTest-DVIReaderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DVIReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DVIReaderTest-DVIReaderTest.o `test -f 'DVIReaderTest.cpp' || echo '$(srcdir)/'`DVIReaderTest.cpp DVIReaderTest-DVIReaderTest.obj: DVIReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DVIReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DVIReaderTest-DVIReaderTest.obj -MD -MP -MF $(DEPDIR)/DVIReaderTest-DVIReaderTest.Tpo -c -o DVIReaderTest-DVIReaderTest.obj `if test -f 'DVIReaderTest.cpp'; then $(CYGPATH_W) 'DVIReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DVIReaderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DVIReaderTest-DVIReaderTest.Tpo $(DEPDIR)/DVIReaderTest-DVIReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DVIReaderTest.cpp' object='DVIReaderTest-DVIReaderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DVIReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DVIReaderTest-DVIReaderTest.obj `if test -f 'DVIReaderTest.cpp'; then $(CYGPATH_W) 'DVIReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DVIReaderTest.cpp'; fi` DependencyGraphTest-DependencyGraphTest.o: DependencyGraphTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DependencyGraphTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DependencyGraphTest-DependencyGraphTest.o -MD -MP -MF $(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Tpo -c -o DependencyGraphTest-DependencyGraphTest.o `test -f 'DependencyGraphTest.cpp' || echo '$(srcdir)/'`DependencyGraphTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Tpo $(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DependencyGraphTest.cpp' object='DependencyGraphTest-DependencyGraphTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DependencyGraphTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DependencyGraphTest-DependencyGraphTest.o `test -f 'DependencyGraphTest.cpp' || echo '$(srcdir)/'`DependencyGraphTest.cpp DependencyGraphTest-DependencyGraphTest.obj: DependencyGraphTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DependencyGraphTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DependencyGraphTest-DependencyGraphTest.obj -MD -MP -MF $(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Tpo -c -o DependencyGraphTest-DependencyGraphTest.obj `if test -f 'DependencyGraphTest.cpp'; then $(CYGPATH_W) 'DependencyGraphTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DependencyGraphTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Tpo $(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DependencyGraphTest.cpp' object='DependencyGraphTest-DependencyGraphTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DependencyGraphTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DependencyGraphTest-DependencyGraphTest.obj `if test -f 'DependencyGraphTest.cpp'; then $(CYGPATH_W) 'DependencyGraphTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DependencyGraphTest.cpp'; fi` DirectoryTest-DirectoryTest.o: DirectoryTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DirectoryTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DirectoryTest-DirectoryTest.o -MD -MP -MF $(DEPDIR)/DirectoryTest-DirectoryTest.Tpo -c -o DirectoryTest-DirectoryTest.o `test -f 'DirectoryTest.cpp' || echo '$(srcdir)/'`DirectoryTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DirectoryTest-DirectoryTest.Tpo $(DEPDIR)/DirectoryTest-DirectoryTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DirectoryTest.cpp' object='DirectoryTest-DirectoryTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DirectoryTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DirectoryTest-DirectoryTest.o `test -f 'DirectoryTest.cpp' || echo '$(srcdir)/'`DirectoryTest.cpp DirectoryTest-DirectoryTest.obj: DirectoryTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DirectoryTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DirectoryTest-DirectoryTest.obj -MD -MP -MF $(DEPDIR)/DirectoryTest-DirectoryTest.Tpo -c -o DirectoryTest-DirectoryTest.obj `if test -f 'DirectoryTest.cpp'; then $(CYGPATH_W) 'DirectoryTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DirectoryTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DirectoryTest-DirectoryTest.Tpo $(DEPDIR)/DirectoryTest-DirectoryTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DirectoryTest.cpp' object='DirectoryTest-DirectoryTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DirectoryTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DirectoryTest-DirectoryTest.obj `if test -f 'DirectoryTest.cpp'; then $(CYGPATH_W) 'DirectoryTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DirectoryTest.cpp'; fi` DvisvgmSpecialTest-DvisvgmSpecialTest.o: DvisvgmSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DvisvgmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DvisvgmSpecialTest-DvisvgmSpecialTest.o -MD -MP -MF $(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Tpo -c -o DvisvgmSpecialTest-DvisvgmSpecialTest.o `test -f 'DvisvgmSpecialTest.cpp' || echo '$(srcdir)/'`DvisvgmSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Tpo $(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DvisvgmSpecialTest.cpp' object='DvisvgmSpecialTest-DvisvgmSpecialTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DvisvgmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DvisvgmSpecialTest-DvisvgmSpecialTest.o `test -f 'DvisvgmSpecialTest.cpp' || echo '$(srcdir)/'`DvisvgmSpecialTest.cpp DvisvgmSpecialTest-DvisvgmSpecialTest.obj: DvisvgmSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DvisvgmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT DvisvgmSpecialTest-DvisvgmSpecialTest.obj -MD -MP -MF $(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Tpo -c -o DvisvgmSpecialTest-DvisvgmSpecialTest.obj `if test -f 'DvisvgmSpecialTest.cpp'; then $(CYGPATH_W) 'DvisvgmSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DvisvgmSpecialTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Tpo $(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='DvisvgmSpecialTest.cpp' object='DvisvgmSpecialTest-DvisvgmSpecialTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(DvisvgmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o DvisvgmSpecialTest-DvisvgmSpecialTest.obj `if test -f 'DvisvgmSpecialTest.cpp'; then $(CYGPATH_W) 'DvisvgmSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/DvisvgmSpecialTest.cpp'; fi` EllipticalArcTest-EllipticalArcTest.o: EllipticalArcTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EllipticalArcTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT EllipticalArcTest-EllipticalArcTest.o -MD -MP -MF $(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Tpo -c -o EllipticalArcTest-EllipticalArcTest.o `test -f 'EllipticalArcTest.cpp' || echo '$(srcdir)/'`EllipticalArcTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Tpo $(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='EllipticalArcTest.cpp' object='EllipticalArcTest-EllipticalArcTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EllipticalArcTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o EllipticalArcTest-EllipticalArcTest.o `test -f 'EllipticalArcTest.cpp' || echo '$(srcdir)/'`EllipticalArcTest.cpp EllipticalArcTest-EllipticalArcTest.obj: EllipticalArcTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EllipticalArcTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT EllipticalArcTest-EllipticalArcTest.obj -MD -MP -MF $(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Tpo -c -o EllipticalArcTest-EllipticalArcTest.obj `if test -f 'EllipticalArcTest.cpp'; then $(CYGPATH_W) 'EllipticalArcTest.cpp'; else $(CYGPATH_W) '$(srcdir)/EllipticalArcTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Tpo $(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='EllipticalArcTest.cpp' object='EllipticalArcTest-EllipticalArcTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EllipticalArcTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o EllipticalArcTest-EllipticalArcTest.obj `if test -f 'EllipticalArcTest.cpp'; then $(CYGPATH_W) 'EllipticalArcTest.cpp'; else $(CYGPATH_W) '$(srcdir)/EllipticalArcTest.cpp'; fi` EmSpecialTest-EmSpecialTest.o: EmSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT EmSpecialTest-EmSpecialTest.o -MD -MP -MF $(DEPDIR)/EmSpecialTest-EmSpecialTest.Tpo -c -o EmSpecialTest-EmSpecialTest.o `test -f 'EmSpecialTest.cpp' || echo '$(srcdir)/'`EmSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/EmSpecialTest-EmSpecialTest.Tpo $(DEPDIR)/EmSpecialTest-EmSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='EmSpecialTest.cpp' object='EmSpecialTest-EmSpecialTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o EmSpecialTest-EmSpecialTest.o `test -f 'EmSpecialTest.cpp' || echo '$(srcdir)/'`EmSpecialTest.cpp EmSpecialTest-EmSpecialTest.obj: EmSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT EmSpecialTest-EmSpecialTest.obj -MD -MP -MF $(DEPDIR)/EmSpecialTest-EmSpecialTest.Tpo -c -o EmSpecialTest-EmSpecialTest.obj `if test -f 'EmSpecialTest.cpp'; then $(CYGPATH_W) 'EmSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/EmSpecialTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/EmSpecialTest-EmSpecialTest.Tpo $(DEPDIR)/EmSpecialTest-EmSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='EmSpecialTest.cpp' object='EmSpecialTest-EmSpecialTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(EmSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o EmSpecialTest-EmSpecialTest.obj `if test -f 'EmSpecialTest.cpp'; then $(CYGPATH_W) 'EmSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/EmSpecialTest.cpp'; fi` FileFinderTest-FileFinderTest.o: FileFinderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileFinderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FileFinderTest-FileFinderTest.o -MD -MP -MF $(DEPDIR)/FileFinderTest-FileFinderTest.Tpo -c -o FileFinderTest-FileFinderTest.o `test -f 'FileFinderTest.cpp' || echo '$(srcdir)/'`FileFinderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FileFinderTest-FileFinderTest.Tpo $(DEPDIR)/FileFinderTest-FileFinderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FileFinderTest.cpp' object='FileFinderTest-FileFinderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileFinderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FileFinderTest-FileFinderTest.o `test -f 'FileFinderTest.cpp' || echo '$(srcdir)/'`FileFinderTest.cpp FileFinderTest-FileFinderTest.obj: FileFinderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileFinderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FileFinderTest-FileFinderTest.obj -MD -MP -MF $(DEPDIR)/FileFinderTest-FileFinderTest.Tpo -c -o FileFinderTest-FileFinderTest.obj `if test -f 'FileFinderTest.cpp'; then $(CYGPATH_W) 'FileFinderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FileFinderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FileFinderTest-FileFinderTest.Tpo $(DEPDIR)/FileFinderTest-FileFinderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FileFinderTest.cpp' object='FileFinderTest-FileFinderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileFinderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FileFinderTest-FileFinderTest.obj `if test -f 'FileFinderTest.cpp'; then $(CYGPATH_W) 'FileFinderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FileFinderTest.cpp'; fi` FilePathTest-FilePathTest.o: FilePathTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FilePathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FilePathTest-FilePathTest.o -MD -MP -MF $(DEPDIR)/FilePathTest-FilePathTest.Tpo -c -o FilePathTest-FilePathTest.o `test -f 'FilePathTest.cpp' || echo '$(srcdir)/'`FilePathTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FilePathTest-FilePathTest.Tpo $(DEPDIR)/FilePathTest-FilePathTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FilePathTest.cpp' object='FilePathTest-FilePathTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FilePathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FilePathTest-FilePathTest.o `test -f 'FilePathTest.cpp' || echo '$(srcdir)/'`FilePathTest.cpp FilePathTest-FilePathTest.obj: FilePathTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FilePathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FilePathTest-FilePathTest.obj -MD -MP -MF $(DEPDIR)/FilePathTest-FilePathTest.Tpo -c -o FilePathTest-FilePathTest.obj `if test -f 'FilePathTest.cpp'; then $(CYGPATH_W) 'FilePathTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FilePathTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FilePathTest-FilePathTest.Tpo $(DEPDIR)/FilePathTest-FilePathTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FilePathTest.cpp' object='FilePathTest-FilePathTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FilePathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FilePathTest-FilePathTest.obj `if test -f 'FilePathTest.cpp'; then $(CYGPATH_W) 'FilePathTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FilePathTest.cpp'; fi` FileSystemTest-FileSystemTest.o: FileSystemTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileSystemTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FileSystemTest-FileSystemTest.o -MD -MP -MF $(DEPDIR)/FileSystemTest-FileSystemTest.Tpo -c -o FileSystemTest-FileSystemTest.o `test -f 'FileSystemTest.cpp' || echo '$(srcdir)/'`FileSystemTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FileSystemTest-FileSystemTest.Tpo $(DEPDIR)/FileSystemTest-FileSystemTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FileSystemTest.cpp' object='FileSystemTest-FileSystemTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileSystemTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FileSystemTest-FileSystemTest.o `test -f 'FileSystemTest.cpp' || echo '$(srcdir)/'`FileSystemTest.cpp FileSystemTest-FileSystemTest.obj: FileSystemTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileSystemTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FileSystemTest-FileSystemTest.obj -MD -MP -MF $(DEPDIR)/FileSystemTest-FileSystemTest.Tpo -c -o FileSystemTest-FileSystemTest.obj `if test -f 'FileSystemTest.cpp'; then $(CYGPATH_W) 'FileSystemTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FileSystemTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FileSystemTest-FileSystemTest.Tpo $(DEPDIR)/FileSystemTest-FileSystemTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FileSystemTest.cpp' object='FileSystemTest-FileSystemTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FileSystemTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FileSystemTest-FileSystemTest.obj `if test -f 'FileSystemTest.cpp'; then $(CYGPATH_W) 'FileSystemTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FileSystemTest.cpp'; fi` FontCacheTest-FontCacheTest.o: FontCacheTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontCacheTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FontCacheTest-FontCacheTest.o -MD -MP -MF $(DEPDIR)/FontCacheTest-FontCacheTest.Tpo -c -o FontCacheTest-FontCacheTest.o `test -f 'FontCacheTest.cpp' || echo '$(srcdir)/'`FontCacheTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FontCacheTest-FontCacheTest.Tpo $(DEPDIR)/FontCacheTest-FontCacheTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FontCacheTest.cpp' object='FontCacheTest-FontCacheTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontCacheTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FontCacheTest-FontCacheTest.o `test -f 'FontCacheTest.cpp' || echo '$(srcdir)/'`FontCacheTest.cpp FontCacheTest-FontCacheTest.obj: FontCacheTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontCacheTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FontCacheTest-FontCacheTest.obj -MD -MP -MF $(DEPDIR)/FontCacheTest-FontCacheTest.Tpo -c -o FontCacheTest-FontCacheTest.obj `if test -f 'FontCacheTest.cpp'; then $(CYGPATH_W) 'FontCacheTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FontCacheTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FontCacheTest-FontCacheTest.Tpo $(DEPDIR)/FontCacheTest-FontCacheTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FontCacheTest.cpp' object='FontCacheTest-FontCacheTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontCacheTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FontCacheTest-FontCacheTest.obj `if test -f 'FontCacheTest.cpp'; then $(CYGPATH_W) 'FontCacheTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FontCacheTest.cpp'; fi` FontManagerTest-FontManagerTest.o: FontManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FontManagerTest-FontManagerTest.o -MD -MP -MF $(DEPDIR)/FontManagerTest-FontManagerTest.Tpo -c -o FontManagerTest-FontManagerTest.o `test -f 'FontManagerTest.cpp' || echo '$(srcdir)/'`FontManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FontManagerTest-FontManagerTest.Tpo $(DEPDIR)/FontManagerTest-FontManagerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FontManagerTest.cpp' object='FontManagerTest-FontManagerTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FontManagerTest-FontManagerTest.o `test -f 'FontManagerTest.cpp' || echo '$(srcdir)/'`FontManagerTest.cpp FontManagerTest-FontManagerTest.obj: FontManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FontManagerTest-FontManagerTest.obj -MD -MP -MF $(DEPDIR)/FontManagerTest-FontManagerTest.Tpo -c -o FontManagerTest-FontManagerTest.obj `if test -f 'FontManagerTest.cpp'; then $(CYGPATH_W) 'FontManagerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FontManagerTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FontManagerTest-FontManagerTest.Tpo $(DEPDIR)/FontManagerTest-FontManagerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FontManagerTest.cpp' object='FontManagerTest-FontManagerTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FontManagerTest-FontManagerTest.obj `if test -f 'FontManagerTest.cpp'; then $(CYGPATH_W) 'FontManagerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FontManagerTest.cpp'; fi` FontMapTest-FontMapTest.o: FontMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FontMapTest-FontMapTest.o -MD -MP -MF $(DEPDIR)/FontMapTest-FontMapTest.Tpo -c -o FontMapTest-FontMapTest.o `test -f 'FontMapTest.cpp' || echo '$(srcdir)/'`FontMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FontMapTest-FontMapTest.Tpo $(DEPDIR)/FontMapTest-FontMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FontMapTest.cpp' object='FontMapTest-FontMapTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FontMapTest-FontMapTest.o `test -f 'FontMapTest.cpp' || echo '$(srcdir)/'`FontMapTest.cpp FontMapTest-FontMapTest.obj: FontMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT FontMapTest-FontMapTest.obj -MD -MP -MF $(DEPDIR)/FontMapTest-FontMapTest.Tpo -c -o FontMapTest-FontMapTest.obj `if test -f 'FontMapTest.cpp'; then $(CYGPATH_W) 'FontMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FontMapTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/FontMapTest-FontMapTest.Tpo $(DEPDIR)/FontMapTest-FontMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='FontMapTest.cpp' object='FontMapTest-FontMapTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(FontMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o FontMapTest-FontMapTest.obj `if test -f 'FontMapTest.cpp'; then $(CYGPATH_W) 'FontMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/FontMapTest.cpp'; fi` GFGlyphTracerTest-GFGlyphTracerTest.o: GFGlyphTracerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFGlyphTracerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GFGlyphTracerTest-GFGlyphTracerTest.o -MD -MP -MF $(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Tpo -c -o GFGlyphTracerTest-GFGlyphTracerTest.o `test -f 'GFGlyphTracerTest.cpp' || echo '$(srcdir)/'`GFGlyphTracerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Tpo $(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GFGlyphTracerTest.cpp' object='GFGlyphTracerTest-GFGlyphTracerTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFGlyphTracerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GFGlyphTracerTest-GFGlyphTracerTest.o `test -f 'GFGlyphTracerTest.cpp' || echo '$(srcdir)/'`GFGlyphTracerTest.cpp GFGlyphTracerTest-GFGlyphTracerTest.obj: GFGlyphTracerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFGlyphTracerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GFGlyphTracerTest-GFGlyphTracerTest.obj -MD -MP -MF $(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Tpo -c -o GFGlyphTracerTest-GFGlyphTracerTest.obj `if test -f 'GFGlyphTracerTest.cpp'; then $(CYGPATH_W) 'GFGlyphTracerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GFGlyphTracerTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Tpo $(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GFGlyphTracerTest.cpp' object='GFGlyphTracerTest-GFGlyphTracerTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFGlyphTracerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GFGlyphTracerTest-GFGlyphTracerTest.obj `if test -f 'GFGlyphTracerTest.cpp'; then $(CYGPATH_W) 'GFGlyphTracerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GFGlyphTracerTest.cpp'; fi` GFReaderTest-GFReaderTest.o: GFReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GFReaderTest-GFReaderTest.o -MD -MP -MF $(DEPDIR)/GFReaderTest-GFReaderTest.Tpo -c -o GFReaderTest-GFReaderTest.o `test -f 'GFReaderTest.cpp' || echo '$(srcdir)/'`GFReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GFReaderTest-GFReaderTest.Tpo $(DEPDIR)/GFReaderTest-GFReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GFReaderTest.cpp' object='GFReaderTest-GFReaderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GFReaderTest-GFReaderTest.o `test -f 'GFReaderTest.cpp' || echo '$(srcdir)/'`GFReaderTest.cpp GFReaderTest-GFReaderTest.obj: GFReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GFReaderTest-GFReaderTest.obj -MD -MP -MF $(DEPDIR)/GFReaderTest-GFReaderTest.Tpo -c -o GFReaderTest-GFReaderTest.obj `if test -f 'GFReaderTest.cpp'; then $(CYGPATH_W) 'GFReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GFReaderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GFReaderTest-GFReaderTest.Tpo $(DEPDIR)/GFReaderTest-GFReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GFReaderTest.cpp' object='GFReaderTest-GFReaderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GFReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GFReaderTest-GFReaderTest.obj `if test -f 'GFReaderTest.cpp'; then $(CYGPATH_W) 'GFReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GFReaderTest.cpp'; fi` GhostscriptTest-GhostscriptTest.o: GhostscriptTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GhostscriptTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GhostscriptTest-GhostscriptTest.o -MD -MP -MF $(DEPDIR)/GhostscriptTest-GhostscriptTest.Tpo -c -o GhostscriptTest-GhostscriptTest.o `test -f 'GhostscriptTest.cpp' || echo '$(srcdir)/'`GhostscriptTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GhostscriptTest-GhostscriptTest.Tpo $(DEPDIR)/GhostscriptTest-GhostscriptTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GhostscriptTest.cpp' object='GhostscriptTest-GhostscriptTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GhostscriptTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GhostscriptTest-GhostscriptTest.o `test -f 'GhostscriptTest.cpp' || echo '$(srcdir)/'`GhostscriptTest.cpp GhostscriptTest-GhostscriptTest.obj: GhostscriptTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GhostscriptTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GhostscriptTest-GhostscriptTest.obj -MD -MP -MF $(DEPDIR)/GhostscriptTest-GhostscriptTest.Tpo -c -o GhostscriptTest-GhostscriptTest.obj `if test -f 'GhostscriptTest.cpp'; then $(CYGPATH_W) 'GhostscriptTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GhostscriptTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GhostscriptTest-GhostscriptTest.Tpo $(DEPDIR)/GhostscriptTest-GhostscriptTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GhostscriptTest.cpp' object='GhostscriptTest-GhostscriptTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GhostscriptTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GhostscriptTest-GhostscriptTest.obj `if test -f 'GhostscriptTest.cpp'; then $(CYGPATH_W) 'GhostscriptTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GhostscriptTest.cpp'; fi` GraphicsPathTest-GraphicsPathTest.o: GraphicsPathTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GraphicsPathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GraphicsPathTest-GraphicsPathTest.o -MD -MP -MF $(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Tpo -c -o GraphicsPathTest-GraphicsPathTest.o `test -f 'GraphicsPathTest.cpp' || echo '$(srcdir)/'`GraphicsPathTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Tpo $(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GraphicsPathTest.cpp' object='GraphicsPathTest-GraphicsPathTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GraphicsPathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GraphicsPathTest-GraphicsPathTest.o `test -f 'GraphicsPathTest.cpp' || echo '$(srcdir)/'`GraphicsPathTest.cpp GraphicsPathTest-GraphicsPathTest.obj: GraphicsPathTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GraphicsPathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT GraphicsPathTest-GraphicsPathTest.obj -MD -MP -MF $(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Tpo -c -o GraphicsPathTest-GraphicsPathTest.obj `if test -f 'GraphicsPathTest.cpp'; then $(CYGPATH_W) 'GraphicsPathTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GraphicsPathTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Tpo $(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='GraphicsPathTest.cpp' object='GraphicsPathTest-GraphicsPathTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(GraphicsPathTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o GraphicsPathTest-GraphicsPathTest.obj `if test -f 'GraphicsPathTest.cpp'; then $(CYGPATH_W) 'GraphicsPathTest.cpp'; else $(CYGPATH_W) '$(srcdir)/GraphicsPathTest.cpp'; fi` HashFunctionTest-HashFunctionTest.o: HashFunctionTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(HashFunctionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT HashFunctionTest-HashFunctionTest.o -MD -MP -MF $(DEPDIR)/HashFunctionTest-HashFunctionTest.Tpo -c -o HashFunctionTest-HashFunctionTest.o `test -f 'HashFunctionTest.cpp' || echo '$(srcdir)/'`HashFunctionTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/HashFunctionTest-HashFunctionTest.Tpo $(DEPDIR)/HashFunctionTest-HashFunctionTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HashFunctionTest.cpp' object='HashFunctionTest-HashFunctionTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(HashFunctionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o HashFunctionTest-HashFunctionTest.o `test -f 'HashFunctionTest.cpp' || echo '$(srcdir)/'`HashFunctionTest.cpp HashFunctionTest-HashFunctionTest.obj: HashFunctionTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(HashFunctionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT HashFunctionTest-HashFunctionTest.obj -MD -MP -MF $(DEPDIR)/HashFunctionTest-HashFunctionTest.Tpo -c -o HashFunctionTest-HashFunctionTest.obj `if test -f 'HashFunctionTest.cpp'; then $(CYGPATH_W) 'HashFunctionTest.cpp'; else $(CYGPATH_W) '$(srcdir)/HashFunctionTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/HashFunctionTest-HashFunctionTest.Tpo $(DEPDIR)/HashFunctionTest-HashFunctionTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='HashFunctionTest.cpp' object='HashFunctionTest-HashFunctionTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(HashFunctionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o HashFunctionTest-HashFunctionTest.obj `if test -f 'HashFunctionTest.cpp'; then $(CYGPATH_W) 'HashFunctionTest.cpp'; else $(CYGPATH_W) '$(srcdir)/HashFunctionTest.cpp'; fi` JFMReaderTest-JFMReaderTest.o: JFMReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(JFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT JFMReaderTest-JFMReaderTest.o -MD -MP -MF $(DEPDIR)/JFMReaderTest-JFMReaderTest.Tpo -c -o JFMReaderTest-JFMReaderTest.o `test -f 'JFMReaderTest.cpp' || echo '$(srcdir)/'`JFMReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/JFMReaderTest-JFMReaderTest.Tpo $(DEPDIR)/JFMReaderTest-JFMReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='JFMReaderTest.cpp' object='JFMReaderTest-JFMReaderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(JFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o JFMReaderTest-JFMReaderTest.o `test -f 'JFMReaderTest.cpp' || echo '$(srcdir)/'`JFMReaderTest.cpp JFMReaderTest-JFMReaderTest.obj: JFMReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(JFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT JFMReaderTest-JFMReaderTest.obj -MD -MP -MF $(DEPDIR)/JFMReaderTest-JFMReaderTest.Tpo -c -o JFMReaderTest-JFMReaderTest.obj `if test -f 'JFMReaderTest.cpp'; then $(CYGPATH_W) 'JFMReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/JFMReaderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/JFMReaderTest-JFMReaderTest.Tpo $(DEPDIR)/JFMReaderTest-JFMReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='JFMReaderTest.cpp' object='JFMReaderTest-JFMReaderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(JFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o JFMReaderTest-JFMReaderTest.obj `if test -f 'JFMReaderTest.cpp'; then $(CYGPATH_W) 'JFMReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/JFMReaderTest.cpp'; fi` LengthTest-LengthTest.o: LengthTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(LengthTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT LengthTest-LengthTest.o -MD -MP -MF $(DEPDIR)/LengthTest-LengthTest.Tpo -c -o LengthTest-LengthTest.o `test -f 'LengthTest.cpp' || echo '$(srcdir)/'`LengthTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/LengthTest-LengthTest.Tpo $(DEPDIR)/LengthTest-LengthTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='LengthTest.cpp' object='LengthTest-LengthTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(LengthTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o LengthTest-LengthTest.o `test -f 'LengthTest.cpp' || echo '$(srcdir)/'`LengthTest.cpp LengthTest-LengthTest.obj: LengthTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(LengthTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT LengthTest-LengthTest.obj -MD -MP -MF $(DEPDIR)/LengthTest-LengthTest.Tpo -c -o LengthTest-LengthTest.obj `if test -f 'LengthTest.cpp'; then $(CYGPATH_W) 'LengthTest.cpp'; else $(CYGPATH_W) '$(srcdir)/LengthTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/LengthTest-LengthTest.Tpo $(DEPDIR)/LengthTest-LengthTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='LengthTest.cpp' object='LengthTest-LengthTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(LengthTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o LengthTest-LengthTest.obj `if test -f 'LengthTest.cpp'; then $(CYGPATH_W) 'LengthTest.cpp'; else $(CYGPATH_W) '$(srcdir)/LengthTest.cpp'; fi` MapLineTest-MapLineTest.o: MapLineTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MapLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MapLineTest-MapLineTest.o -MD -MP -MF $(DEPDIR)/MapLineTest-MapLineTest.Tpo -c -o MapLineTest-MapLineTest.o `test -f 'MapLineTest.cpp' || echo '$(srcdir)/'`MapLineTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MapLineTest-MapLineTest.Tpo $(DEPDIR)/MapLineTest-MapLineTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MapLineTest.cpp' object='MapLineTest-MapLineTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MapLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MapLineTest-MapLineTest.o `test -f 'MapLineTest.cpp' || echo '$(srcdir)/'`MapLineTest.cpp MapLineTest-MapLineTest.obj: MapLineTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MapLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MapLineTest-MapLineTest.obj -MD -MP -MF $(DEPDIR)/MapLineTest-MapLineTest.Tpo -c -o MapLineTest-MapLineTest.obj `if test -f 'MapLineTest.cpp'; then $(CYGPATH_W) 'MapLineTest.cpp'; else $(CYGPATH_W) '$(srcdir)/MapLineTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MapLineTest-MapLineTest.Tpo $(DEPDIR)/MapLineTest-MapLineTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MapLineTest.cpp' object='MapLineTest-MapLineTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MapLineTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MapLineTest-MapLineTest.obj `if test -f 'MapLineTest.cpp'; then $(CYGPATH_W) 'MapLineTest.cpp'; else $(CYGPATH_W) '$(srcdir)/MapLineTest.cpp'; fi` MatrixTest-MatrixTest.o: MatrixTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MatrixTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MatrixTest-MatrixTest.o -MD -MP -MF $(DEPDIR)/MatrixTest-MatrixTest.Tpo -c -o MatrixTest-MatrixTest.o `test -f 'MatrixTest.cpp' || echo '$(srcdir)/'`MatrixTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MatrixTest-MatrixTest.Tpo $(DEPDIR)/MatrixTest-MatrixTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MatrixTest.cpp' object='MatrixTest-MatrixTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MatrixTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MatrixTest-MatrixTest.o `test -f 'MatrixTest.cpp' || echo '$(srcdir)/'`MatrixTest.cpp MatrixTest-MatrixTest.obj: MatrixTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MatrixTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MatrixTest-MatrixTest.obj -MD -MP -MF $(DEPDIR)/MatrixTest-MatrixTest.Tpo -c -o MatrixTest-MatrixTest.obj `if test -f 'MatrixTest.cpp'; then $(CYGPATH_W) 'MatrixTest.cpp'; else $(CYGPATH_W) '$(srcdir)/MatrixTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MatrixTest-MatrixTest.Tpo $(DEPDIR)/MatrixTest-MatrixTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MatrixTest.cpp' object='MatrixTest-MatrixTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MatrixTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MatrixTest-MatrixTest.obj `if test -f 'MatrixTest.cpp'; then $(CYGPATH_W) 'MatrixTest.cpp'; else $(CYGPATH_W) '$(srcdir)/MatrixTest.cpp'; fi` MessageExceptionTest-MessageExceptionTest.o: MessageExceptionTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MessageExceptionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MessageExceptionTest-MessageExceptionTest.o -MD -MP -MF $(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Tpo -c -o MessageExceptionTest-MessageExceptionTest.o `test -f 'MessageExceptionTest.cpp' || echo '$(srcdir)/'`MessageExceptionTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Tpo $(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MessageExceptionTest.cpp' object='MessageExceptionTest-MessageExceptionTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MessageExceptionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MessageExceptionTest-MessageExceptionTest.o `test -f 'MessageExceptionTest.cpp' || echo '$(srcdir)/'`MessageExceptionTest.cpp MessageExceptionTest-MessageExceptionTest.obj: MessageExceptionTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MessageExceptionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT MessageExceptionTest-MessageExceptionTest.obj -MD -MP -MF $(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Tpo -c -o MessageExceptionTest-MessageExceptionTest.obj `if test -f 'MessageExceptionTest.cpp'; then $(CYGPATH_W) 'MessageExceptionTest.cpp'; else $(CYGPATH_W) '$(srcdir)/MessageExceptionTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Tpo $(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='MessageExceptionTest.cpp' object='MessageExceptionTest-MessageExceptionTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MessageExceptionTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o MessageExceptionTest-MessageExceptionTest.obj `if test -f 'MessageExceptionTest.cpp'; then $(CYGPATH_W) 'MessageExceptionTest.cpp'; else $(CYGPATH_W) '$(srcdir)/MessageExceptionTest.cpp'; fi` PDFParserTest-PDFParserTest.o: PDFParserTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PDFParserTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PDFParserTest-PDFParserTest.o -MD -MP -MF $(DEPDIR)/PDFParserTest-PDFParserTest.Tpo -c -o PDFParserTest-PDFParserTest.o `test -f 'PDFParserTest.cpp' || echo '$(srcdir)/'`PDFParserTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PDFParserTest-PDFParserTest.Tpo $(DEPDIR)/PDFParserTest-PDFParserTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PDFParserTest.cpp' object='PDFParserTest-PDFParserTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PDFParserTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PDFParserTest-PDFParserTest.o `test -f 'PDFParserTest.cpp' || echo '$(srcdir)/'`PDFParserTest.cpp PDFParserTest-PDFParserTest.obj: PDFParserTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PDFParserTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PDFParserTest-PDFParserTest.obj -MD -MP -MF $(DEPDIR)/PDFParserTest-PDFParserTest.Tpo -c -o PDFParserTest-PDFParserTest.obj `if test -f 'PDFParserTest.cpp'; then $(CYGPATH_W) 'PDFParserTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PDFParserTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PDFParserTest-PDFParserTest.Tpo $(DEPDIR)/PDFParserTest-PDFParserTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PDFParserTest.cpp' object='PDFParserTest-PDFParserTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PDFParserTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PDFParserTest-PDFParserTest.obj `if test -f 'PDFParserTest.cpp'; then $(CYGPATH_W) 'PDFParserTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PDFParserTest.cpp'; fi` PSInterpreterTest-PSInterpreterTest.o: PSInterpreterTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PSInterpreterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PSInterpreterTest-PSInterpreterTest.o -MD -MP -MF $(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Tpo -c -o PSInterpreterTest-PSInterpreterTest.o `test -f 'PSInterpreterTest.cpp' || echo '$(srcdir)/'`PSInterpreterTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Tpo $(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PSInterpreterTest.cpp' object='PSInterpreterTest-PSInterpreterTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PSInterpreterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PSInterpreterTest-PSInterpreterTest.o `test -f 'PSInterpreterTest.cpp' || echo '$(srcdir)/'`PSInterpreterTest.cpp PSInterpreterTest-PSInterpreterTest.obj: PSInterpreterTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PSInterpreterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PSInterpreterTest-PSInterpreterTest.obj -MD -MP -MF $(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Tpo -c -o PSInterpreterTest-PSInterpreterTest.obj `if test -f 'PSInterpreterTest.cpp'; then $(CYGPATH_W) 'PSInterpreterTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PSInterpreterTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Tpo $(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PSInterpreterTest.cpp' object='PSInterpreterTest-PSInterpreterTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PSInterpreterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PSInterpreterTest-PSInterpreterTest.obj `if test -f 'PSInterpreterTest.cpp'; then $(CYGPATH_W) 'PSInterpreterTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PSInterpreterTest.cpp'; fi` PageRagesTest-PageRagesTest.o: PageRagesTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageRagesTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PageRagesTest-PageRagesTest.o -MD -MP -MF $(DEPDIR)/PageRagesTest-PageRagesTest.Tpo -c -o PageRagesTest-PageRagesTest.o `test -f 'PageRagesTest.cpp' || echo '$(srcdir)/'`PageRagesTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PageRagesTest-PageRagesTest.Tpo $(DEPDIR)/PageRagesTest-PageRagesTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PageRagesTest.cpp' object='PageRagesTest-PageRagesTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageRagesTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PageRagesTest-PageRagesTest.o `test -f 'PageRagesTest.cpp' || echo '$(srcdir)/'`PageRagesTest.cpp PageRagesTest-PageRagesTest.obj: PageRagesTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageRagesTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PageRagesTest-PageRagesTest.obj -MD -MP -MF $(DEPDIR)/PageRagesTest-PageRagesTest.Tpo -c -o PageRagesTest-PageRagesTest.obj `if test -f 'PageRagesTest.cpp'; then $(CYGPATH_W) 'PageRagesTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PageRagesTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PageRagesTest-PageRagesTest.Tpo $(DEPDIR)/PageRagesTest-PageRagesTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PageRagesTest.cpp' object='PageRagesTest-PageRagesTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageRagesTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PageRagesTest-PageRagesTest.obj `if test -f 'PageRagesTest.cpp'; then $(CYGPATH_W) 'PageRagesTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PageRagesTest.cpp'; fi` PageSizeTest-PageSizeTest.o: PageSizeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageSizeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PageSizeTest-PageSizeTest.o -MD -MP -MF $(DEPDIR)/PageSizeTest-PageSizeTest.Tpo -c -o PageSizeTest-PageSizeTest.o `test -f 'PageSizeTest.cpp' || echo '$(srcdir)/'`PageSizeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PageSizeTest-PageSizeTest.Tpo $(DEPDIR)/PageSizeTest-PageSizeTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PageSizeTest.cpp' object='PageSizeTest-PageSizeTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageSizeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PageSizeTest-PageSizeTest.o `test -f 'PageSizeTest.cpp' || echo '$(srcdir)/'`PageSizeTest.cpp PageSizeTest-PageSizeTest.obj: PageSizeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageSizeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PageSizeTest-PageSizeTest.obj -MD -MP -MF $(DEPDIR)/PageSizeTest-PageSizeTest.Tpo -c -o PageSizeTest-PageSizeTest.obj `if test -f 'PageSizeTest.cpp'; then $(CYGPATH_W) 'PageSizeTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PageSizeTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PageSizeTest-PageSizeTest.Tpo $(DEPDIR)/PageSizeTest-PageSizeTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PageSizeTest.cpp' object='PageSizeTest-PageSizeTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PageSizeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PageSizeTest-PageSizeTest.obj `if test -f 'PageSizeTest.cpp'; then $(CYGPATH_W) 'PageSizeTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PageSizeTest.cpp'; fi` PairTest-PairTest.o: PairTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PairTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PairTest-PairTest.o -MD -MP -MF $(DEPDIR)/PairTest-PairTest.Tpo -c -o PairTest-PairTest.o `test -f 'PairTest.cpp' || echo '$(srcdir)/'`PairTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PairTest-PairTest.Tpo $(DEPDIR)/PairTest-PairTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PairTest.cpp' object='PairTest-PairTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PairTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PairTest-PairTest.o `test -f 'PairTest.cpp' || echo '$(srcdir)/'`PairTest.cpp PairTest-PairTest.obj: PairTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PairTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PairTest-PairTest.obj -MD -MP -MF $(DEPDIR)/PairTest-PairTest.Tpo -c -o PairTest-PairTest.obj `if test -f 'PairTest.cpp'; then $(CYGPATH_W) 'PairTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PairTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PairTest-PairTest.Tpo $(DEPDIR)/PairTest-PairTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PairTest.cpp' object='PairTest-PairTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PairTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PairTest-PairTest.obj `if test -f 'PairTest.cpp'; then $(CYGPATH_W) 'PairTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PairTest.cpp'; fi` PapersizeSpecialTest-PapersizeSpecialTest.o: PapersizeSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PapersizeSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PapersizeSpecialTest-PapersizeSpecialTest.o -MD -MP -MF $(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Tpo -c -o PapersizeSpecialTest-PapersizeSpecialTest.o `test -f 'PapersizeSpecialTest.cpp' || echo '$(srcdir)/'`PapersizeSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Tpo $(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PapersizeSpecialTest.cpp' object='PapersizeSpecialTest-PapersizeSpecialTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PapersizeSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PapersizeSpecialTest-PapersizeSpecialTest.o `test -f 'PapersizeSpecialTest.cpp' || echo '$(srcdir)/'`PapersizeSpecialTest.cpp PapersizeSpecialTest-PapersizeSpecialTest.obj: PapersizeSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PapersizeSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT PapersizeSpecialTest-PapersizeSpecialTest.obj -MD -MP -MF $(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Tpo -c -o PapersizeSpecialTest-PapersizeSpecialTest.obj `if test -f 'PapersizeSpecialTest.cpp'; then $(CYGPATH_W) 'PapersizeSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PapersizeSpecialTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Tpo $(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='PapersizeSpecialTest.cpp' object='PapersizeSpecialTest-PapersizeSpecialTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(PapersizeSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o PapersizeSpecialTest-PapersizeSpecialTest.obj `if test -f 'PapersizeSpecialTest.cpp'; then $(CYGPATH_W) 'PapersizeSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/PapersizeSpecialTest.cpp'; fi` RangeMapTest-RangeMapTest.o: RangeMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(RangeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RangeMapTest-RangeMapTest.o -MD -MP -MF $(DEPDIR)/RangeMapTest-RangeMapTest.Tpo -c -o RangeMapTest-RangeMapTest.o `test -f 'RangeMapTest.cpp' || echo '$(srcdir)/'`RangeMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/RangeMapTest-RangeMapTest.Tpo $(DEPDIR)/RangeMapTest-RangeMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RangeMapTest.cpp' object='RangeMapTest-RangeMapTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(RangeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RangeMapTest-RangeMapTest.o `test -f 'RangeMapTest.cpp' || echo '$(srcdir)/'`RangeMapTest.cpp RangeMapTest-RangeMapTest.obj: RangeMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(RangeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RangeMapTest-RangeMapTest.obj -MD -MP -MF $(DEPDIR)/RangeMapTest-RangeMapTest.Tpo -c -o RangeMapTest-RangeMapTest.obj `if test -f 'RangeMapTest.cpp'; then $(CYGPATH_W) 'RangeMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/RangeMapTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/RangeMapTest-RangeMapTest.Tpo $(DEPDIR)/RangeMapTest-RangeMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='RangeMapTest.cpp' object='RangeMapTest-RangeMapTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(RangeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RangeMapTest-RangeMapTest.obj `if test -f 'RangeMapTest.cpp'; then $(CYGPATH_W) 'RangeMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/RangeMapTest.cpp'; fi` SVGOutputTest-SVGOutputTest.o: SVGOutputTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SVGOutputTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SVGOutputTest-SVGOutputTest.o -MD -MP -MF $(DEPDIR)/SVGOutputTest-SVGOutputTest.Tpo -c -o SVGOutputTest-SVGOutputTest.o `test -f 'SVGOutputTest.cpp' || echo '$(srcdir)/'`SVGOutputTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SVGOutputTest-SVGOutputTest.Tpo $(DEPDIR)/SVGOutputTest-SVGOutputTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SVGOutputTest.cpp' object='SVGOutputTest-SVGOutputTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SVGOutputTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SVGOutputTest-SVGOutputTest.o `test -f 'SVGOutputTest.cpp' || echo '$(srcdir)/'`SVGOutputTest.cpp SVGOutputTest-SVGOutputTest.obj: SVGOutputTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SVGOutputTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SVGOutputTest-SVGOutputTest.obj -MD -MP -MF $(DEPDIR)/SVGOutputTest-SVGOutputTest.Tpo -c -o SVGOutputTest-SVGOutputTest.obj `if test -f 'SVGOutputTest.cpp'; then $(CYGPATH_W) 'SVGOutputTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SVGOutputTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SVGOutputTest-SVGOutputTest.Tpo $(DEPDIR)/SVGOutputTest-SVGOutputTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SVGOutputTest.cpp' object='SVGOutputTest-SVGOutputTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SVGOutputTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SVGOutputTest-SVGOutputTest.obj `if test -f 'SVGOutputTest.cpp'; then $(CYGPATH_W) 'SVGOutputTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SVGOutputTest.cpp'; fi` ShadingPatchTest-ShadingPatchTest.o: ShadingPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ShadingPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ShadingPatchTest-ShadingPatchTest.o -MD -MP -MF $(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Tpo -c -o ShadingPatchTest-ShadingPatchTest.o `test -f 'ShadingPatchTest.cpp' || echo '$(srcdir)/'`ShadingPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Tpo $(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ShadingPatchTest.cpp' object='ShadingPatchTest-ShadingPatchTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ShadingPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ShadingPatchTest-ShadingPatchTest.o `test -f 'ShadingPatchTest.cpp' || echo '$(srcdir)/'`ShadingPatchTest.cpp ShadingPatchTest-ShadingPatchTest.obj: ShadingPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ShadingPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ShadingPatchTest-ShadingPatchTest.obj -MD -MP -MF $(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Tpo -c -o ShadingPatchTest-ShadingPatchTest.obj `if test -f 'ShadingPatchTest.cpp'; then $(CYGPATH_W) 'ShadingPatchTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ShadingPatchTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Tpo $(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ShadingPatchTest.cpp' object='ShadingPatchTest-ShadingPatchTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ShadingPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ShadingPatchTest-ShadingPatchTest.obj `if test -f 'ShadingPatchTest.cpp'; then $(CYGPATH_W) 'ShadingPatchTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ShadingPatchTest.cpp'; fi` SpecialManagerTest-SpecialManagerTest.o: SpecialManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SpecialManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SpecialManagerTest-SpecialManagerTest.o -MD -MP -MF $(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Tpo -c -o SpecialManagerTest-SpecialManagerTest.o `test -f 'SpecialManagerTest.cpp' || echo '$(srcdir)/'`SpecialManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Tpo $(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SpecialManagerTest.cpp' object='SpecialManagerTest-SpecialManagerTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SpecialManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SpecialManagerTest-SpecialManagerTest.o `test -f 'SpecialManagerTest.cpp' || echo '$(srcdir)/'`SpecialManagerTest.cpp SpecialManagerTest-SpecialManagerTest.obj: SpecialManagerTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SpecialManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SpecialManagerTest-SpecialManagerTest.obj -MD -MP -MF $(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Tpo -c -o SpecialManagerTest-SpecialManagerTest.obj `if test -f 'SpecialManagerTest.cpp'; then $(CYGPATH_W) 'SpecialManagerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SpecialManagerTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Tpo $(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SpecialManagerTest.cpp' object='SpecialManagerTest-SpecialManagerTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SpecialManagerTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SpecialManagerTest-SpecialManagerTest.obj `if test -f 'SpecialManagerTest.cpp'; then $(CYGPATH_W) 'SpecialManagerTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SpecialManagerTest.cpp'; fi` SplittedCharInputBufferTest-SplittedCharInputBufferTest.o: SplittedCharInputBufferTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SplittedCharInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SplittedCharInputBufferTest-SplittedCharInputBufferTest.o -MD -MP -MF $(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Tpo -c -o SplittedCharInputBufferTest-SplittedCharInputBufferTest.o `test -f 'SplittedCharInputBufferTest.cpp' || echo '$(srcdir)/'`SplittedCharInputBufferTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Tpo $(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SplittedCharInputBufferTest.cpp' object='SplittedCharInputBufferTest-SplittedCharInputBufferTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SplittedCharInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SplittedCharInputBufferTest-SplittedCharInputBufferTest.o `test -f 'SplittedCharInputBufferTest.cpp' || echo '$(srcdir)/'`SplittedCharInputBufferTest.cpp SplittedCharInputBufferTest-SplittedCharInputBufferTest.obj: SplittedCharInputBufferTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SplittedCharInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SplittedCharInputBufferTest-SplittedCharInputBufferTest.obj -MD -MP -MF $(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Tpo -c -o SplittedCharInputBufferTest-SplittedCharInputBufferTest.obj `if test -f 'SplittedCharInputBufferTest.cpp'; then $(CYGPATH_W) 'SplittedCharInputBufferTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SplittedCharInputBufferTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Tpo $(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SplittedCharInputBufferTest.cpp' object='SplittedCharInputBufferTest-SplittedCharInputBufferTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SplittedCharInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SplittedCharInputBufferTest-SplittedCharInputBufferTest.obj `if test -f 'SplittedCharInputBufferTest.cpp'; then $(CYGPATH_W) 'SplittedCharInputBufferTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SplittedCharInputBufferTest.cpp'; fi` StreamInputBufferTest-StreamInputBufferTest.o: StreamInputBufferTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StreamInputBufferTest-StreamInputBufferTest.o -MD -MP -MF $(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Tpo -c -o StreamInputBufferTest-StreamInputBufferTest.o `test -f 'StreamInputBufferTest.cpp' || echo '$(srcdir)/'`StreamInputBufferTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Tpo $(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StreamInputBufferTest.cpp' object='StreamInputBufferTest-StreamInputBufferTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StreamInputBufferTest-StreamInputBufferTest.o `test -f 'StreamInputBufferTest.cpp' || echo '$(srcdir)/'`StreamInputBufferTest.cpp StreamInputBufferTest-StreamInputBufferTest.obj: StreamInputBufferTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StreamInputBufferTest-StreamInputBufferTest.obj -MD -MP -MF $(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Tpo -c -o StreamInputBufferTest-StreamInputBufferTest.obj `if test -f 'StreamInputBufferTest.cpp'; then $(CYGPATH_W) 'StreamInputBufferTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StreamInputBufferTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Tpo $(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StreamInputBufferTest.cpp' object='StreamInputBufferTest-StreamInputBufferTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamInputBufferTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StreamInputBufferTest-StreamInputBufferTest.obj `if test -f 'StreamInputBufferTest.cpp'; then $(CYGPATH_W) 'StreamInputBufferTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StreamInputBufferTest.cpp'; fi` StreamReaderTest-StreamReaderTest.o: StreamReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StreamReaderTest-StreamReaderTest.o -MD -MP -MF $(DEPDIR)/StreamReaderTest-StreamReaderTest.Tpo -c -o StreamReaderTest-StreamReaderTest.o `test -f 'StreamReaderTest.cpp' || echo '$(srcdir)/'`StreamReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StreamReaderTest-StreamReaderTest.Tpo $(DEPDIR)/StreamReaderTest-StreamReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StreamReaderTest.cpp' object='StreamReaderTest-StreamReaderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StreamReaderTest-StreamReaderTest.o `test -f 'StreamReaderTest.cpp' || echo '$(srcdir)/'`StreamReaderTest.cpp StreamReaderTest-StreamReaderTest.obj: StreamReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StreamReaderTest-StreamReaderTest.obj -MD -MP -MF $(DEPDIR)/StreamReaderTest-StreamReaderTest.Tpo -c -o StreamReaderTest-StreamReaderTest.obj `if test -f 'StreamReaderTest.cpp'; then $(CYGPATH_W) 'StreamReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StreamReaderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StreamReaderTest-StreamReaderTest.Tpo $(DEPDIR)/StreamReaderTest-StreamReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StreamReaderTest.cpp' object='StreamReaderTest-StreamReaderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StreamReaderTest-StreamReaderTest.obj `if test -f 'StreamReaderTest.cpp'; then $(CYGPATH_W) 'StreamReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StreamReaderTest.cpp'; fi` StreamWriterTest-StreamWriterTest.o: StreamWriterTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamWriterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StreamWriterTest-StreamWriterTest.o -MD -MP -MF $(DEPDIR)/StreamWriterTest-StreamWriterTest.Tpo -c -o StreamWriterTest-StreamWriterTest.o `test -f 'StreamWriterTest.cpp' || echo '$(srcdir)/'`StreamWriterTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StreamWriterTest-StreamWriterTest.Tpo $(DEPDIR)/StreamWriterTest-StreamWriterTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StreamWriterTest.cpp' object='StreamWriterTest-StreamWriterTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamWriterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StreamWriterTest-StreamWriterTest.o `test -f 'StreamWriterTest.cpp' || echo '$(srcdir)/'`StreamWriterTest.cpp StreamWriterTest-StreamWriterTest.obj: StreamWriterTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamWriterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StreamWriterTest-StreamWriterTest.obj -MD -MP -MF $(DEPDIR)/StreamWriterTest-StreamWriterTest.Tpo -c -o StreamWriterTest-StreamWriterTest.obj `if test -f 'StreamWriterTest.cpp'; then $(CYGPATH_W) 'StreamWriterTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StreamWriterTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StreamWriterTest-StreamWriterTest.Tpo $(DEPDIR)/StreamWriterTest-StreamWriterTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StreamWriterTest.cpp' object='StreamWriterTest-StreamWriterTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StreamWriterTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StreamWriterTest-StreamWriterTest.obj `if test -f 'StreamWriterTest.cpp'; then $(CYGPATH_W) 'StreamWriterTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StreamWriterTest.cpp'; fi` StringMatcherTest-StringMatcherTest.o: StringMatcherTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StringMatcherTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StringMatcherTest-StringMatcherTest.o -MD -MP -MF $(DEPDIR)/StringMatcherTest-StringMatcherTest.Tpo -c -o StringMatcherTest-StringMatcherTest.o `test -f 'StringMatcherTest.cpp' || echo '$(srcdir)/'`StringMatcherTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StringMatcherTest-StringMatcherTest.Tpo $(DEPDIR)/StringMatcherTest-StringMatcherTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StringMatcherTest.cpp' object='StringMatcherTest-StringMatcherTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StringMatcherTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StringMatcherTest-StringMatcherTest.o `test -f 'StringMatcherTest.cpp' || echo '$(srcdir)/'`StringMatcherTest.cpp StringMatcherTest-StringMatcherTest.obj: StringMatcherTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StringMatcherTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT StringMatcherTest-StringMatcherTest.obj -MD -MP -MF $(DEPDIR)/StringMatcherTest-StringMatcherTest.Tpo -c -o StringMatcherTest-StringMatcherTest.obj `if test -f 'StringMatcherTest.cpp'; then $(CYGPATH_W) 'StringMatcherTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StringMatcherTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/StringMatcherTest-StringMatcherTest.Tpo $(DEPDIR)/StringMatcherTest-StringMatcherTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='StringMatcherTest.cpp' object='StringMatcherTest-StringMatcherTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(StringMatcherTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o StringMatcherTest-StringMatcherTest.obj `if test -f 'StringMatcherTest.cpp'; then $(CYGPATH_W) 'StringMatcherTest.cpp'; else $(CYGPATH_W) '$(srcdir)/StringMatcherTest.cpp'; fi` SubfontTest-SubfontTest.o: SubfontTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SubfontTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SubfontTest-SubfontTest.o -MD -MP -MF $(DEPDIR)/SubfontTest-SubfontTest.Tpo -c -o SubfontTest-SubfontTest.o `test -f 'SubfontTest.cpp' || echo '$(srcdir)/'`SubfontTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SubfontTest-SubfontTest.Tpo $(DEPDIR)/SubfontTest-SubfontTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SubfontTest.cpp' object='SubfontTest-SubfontTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SubfontTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SubfontTest-SubfontTest.o `test -f 'SubfontTest.cpp' || echo '$(srcdir)/'`SubfontTest.cpp SubfontTest-SubfontTest.obj: SubfontTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SubfontTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT SubfontTest-SubfontTest.obj -MD -MP -MF $(DEPDIR)/SubfontTest-SubfontTest.Tpo -c -o SubfontTest-SubfontTest.obj `if test -f 'SubfontTest.cpp'; then $(CYGPATH_W) 'SubfontTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SubfontTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/SubfontTest-SubfontTest.Tpo $(DEPDIR)/SubfontTest-SubfontTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SubfontTest.cpp' object='SubfontTest-SubfontTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(SubfontTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o SubfontTest-SubfontTest.obj `if test -f 'SubfontTest.cpp'; then $(CYGPATH_W) 'SubfontTest.cpp'; else $(CYGPATH_W) '$(srcdir)/SubfontTest.cpp'; fi` TFMReaderTest-TFMReaderTest.o: TFMReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TFMReaderTest-TFMReaderTest.o -MD -MP -MF $(DEPDIR)/TFMReaderTest-TFMReaderTest.Tpo -c -o TFMReaderTest-TFMReaderTest.o `test -f 'TFMReaderTest.cpp' || echo '$(srcdir)/'`TFMReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TFMReaderTest-TFMReaderTest.Tpo $(DEPDIR)/TFMReaderTest-TFMReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TFMReaderTest.cpp' object='TFMReaderTest-TFMReaderTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TFMReaderTest-TFMReaderTest.o `test -f 'TFMReaderTest.cpp' || echo '$(srcdir)/'`TFMReaderTest.cpp TFMReaderTest-TFMReaderTest.obj: TFMReaderTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TFMReaderTest-TFMReaderTest.obj -MD -MP -MF $(DEPDIR)/TFMReaderTest-TFMReaderTest.Tpo -c -o TFMReaderTest-TFMReaderTest.obj `if test -f 'TFMReaderTest.cpp'; then $(CYGPATH_W) 'TFMReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TFMReaderTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TFMReaderTest-TFMReaderTest.Tpo $(DEPDIR)/TFMReaderTest-TFMReaderTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TFMReaderTest.cpp' object='TFMReaderTest-TFMReaderTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TFMReaderTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TFMReaderTest-TFMReaderTest.obj `if test -f 'TFMReaderTest.cpp'; then $(CYGPATH_W) 'TFMReaderTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TFMReaderTest.cpp'; fi` TensorProductPatchTest-TensorProductPatchTest.o: TensorProductPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TensorProductPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TensorProductPatchTest-TensorProductPatchTest.o -MD -MP -MF $(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Tpo -c -o TensorProductPatchTest-TensorProductPatchTest.o `test -f 'TensorProductPatchTest.cpp' || echo '$(srcdir)/'`TensorProductPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Tpo $(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TensorProductPatchTest.cpp' object='TensorProductPatchTest-TensorProductPatchTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TensorProductPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TensorProductPatchTest-TensorProductPatchTest.o `test -f 'TensorProductPatchTest.cpp' || echo '$(srcdir)/'`TensorProductPatchTest.cpp TensorProductPatchTest-TensorProductPatchTest.obj: TensorProductPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TensorProductPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TensorProductPatchTest-TensorProductPatchTest.obj -MD -MP -MF $(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Tpo -c -o TensorProductPatchTest-TensorProductPatchTest.obj `if test -f 'TensorProductPatchTest.cpp'; then $(CYGPATH_W) 'TensorProductPatchTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TensorProductPatchTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Tpo $(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TensorProductPatchTest.cpp' object='TensorProductPatchTest-TensorProductPatchTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TensorProductPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TensorProductPatchTest-TensorProductPatchTest.obj `if test -f 'TensorProductPatchTest.cpp'; then $(CYGPATH_W) 'TensorProductPatchTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TensorProductPatchTest.cpp'; fi` ToUnicodeMapTest-ToUnicodeMapTest.o: ToUnicodeMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ToUnicodeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ToUnicodeMapTest-ToUnicodeMapTest.o -MD -MP -MF $(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Tpo -c -o ToUnicodeMapTest-ToUnicodeMapTest.o `test -f 'ToUnicodeMapTest.cpp' || echo '$(srcdir)/'`ToUnicodeMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Tpo $(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ToUnicodeMapTest.cpp' object='ToUnicodeMapTest-ToUnicodeMapTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ToUnicodeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ToUnicodeMapTest-ToUnicodeMapTest.o `test -f 'ToUnicodeMapTest.cpp' || echo '$(srcdir)/'`ToUnicodeMapTest.cpp ToUnicodeMapTest-ToUnicodeMapTest.obj: ToUnicodeMapTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ToUnicodeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ToUnicodeMapTest-ToUnicodeMapTest.obj -MD -MP -MF $(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Tpo -c -o ToUnicodeMapTest-ToUnicodeMapTest.obj `if test -f 'ToUnicodeMapTest.cpp'; then $(CYGPATH_W) 'ToUnicodeMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ToUnicodeMapTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Tpo $(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ToUnicodeMapTest.cpp' object='ToUnicodeMapTest-ToUnicodeMapTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ToUnicodeMapTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ToUnicodeMapTest-ToUnicodeMapTest.obj `if test -f 'ToUnicodeMapTest.cpp'; then $(CYGPATH_W) 'ToUnicodeMapTest.cpp'; else $(CYGPATH_W) '$(srcdir)/ToUnicodeMapTest.cpp'; fi` TpicSpecialTest-TpicSpecialTest.o: TpicSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TpicSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TpicSpecialTest-TpicSpecialTest.o -MD -MP -MF $(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Tpo -c -o TpicSpecialTest-TpicSpecialTest.o `test -f 'TpicSpecialTest.cpp' || echo '$(srcdir)/'`TpicSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Tpo $(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TpicSpecialTest.cpp' object='TpicSpecialTest-TpicSpecialTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TpicSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TpicSpecialTest-TpicSpecialTest.o `test -f 'TpicSpecialTest.cpp' || echo '$(srcdir)/'`TpicSpecialTest.cpp TpicSpecialTest-TpicSpecialTest.obj: TpicSpecialTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TpicSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TpicSpecialTest-TpicSpecialTest.obj -MD -MP -MF $(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Tpo -c -o TpicSpecialTest-TpicSpecialTest.obj `if test -f 'TpicSpecialTest.cpp'; then $(CYGPATH_W) 'TpicSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TpicSpecialTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Tpo $(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TpicSpecialTest.cpp' object='TpicSpecialTest-TpicSpecialTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TpicSpecialTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TpicSpecialTest-TpicSpecialTest.obj `if test -f 'TpicSpecialTest.cpp'; then $(CYGPATH_W) 'TpicSpecialTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TpicSpecialTest.cpp'; fi` TriangularPatchTest-TriangularPatchTest.o: TriangularPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TriangularPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TriangularPatchTest-TriangularPatchTest.o -MD -MP -MF $(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Tpo -c -o TriangularPatchTest-TriangularPatchTest.o `test -f 'TriangularPatchTest.cpp' || echo '$(srcdir)/'`TriangularPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Tpo $(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TriangularPatchTest.cpp' object='TriangularPatchTest-TriangularPatchTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TriangularPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TriangularPatchTest-TriangularPatchTest.o `test -f 'TriangularPatchTest.cpp' || echo '$(srcdir)/'`TriangularPatchTest.cpp TriangularPatchTest-TriangularPatchTest.obj: TriangularPatchTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TriangularPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT TriangularPatchTest-TriangularPatchTest.obj -MD -MP -MF $(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Tpo -c -o TriangularPatchTest-TriangularPatchTest.obj `if test -f 'TriangularPatchTest.cpp'; then $(CYGPATH_W) 'TriangularPatchTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TriangularPatchTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Tpo $(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='TriangularPatchTest.cpp' object='TriangularPatchTest-TriangularPatchTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(TriangularPatchTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o TriangularPatchTest-TriangularPatchTest.obj `if test -f 'TriangularPatchTest.cpp'; then $(CYGPATH_W) 'TriangularPatchTest.cpp'; else $(CYGPATH_W) '$(srcdir)/TriangularPatchTest.cpp'; fi` UnicodeTest-UnicodeTest.o: UnicodeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UnicodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT UnicodeTest-UnicodeTest.o -MD -MP -MF $(DEPDIR)/UnicodeTest-UnicodeTest.Tpo -c -o UnicodeTest-UnicodeTest.o `test -f 'UnicodeTest.cpp' || echo '$(srcdir)/'`UnicodeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/UnicodeTest-UnicodeTest.Tpo $(DEPDIR)/UnicodeTest-UnicodeTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='UnicodeTest.cpp' object='UnicodeTest-UnicodeTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UnicodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o UnicodeTest-UnicodeTest.o `test -f 'UnicodeTest.cpp' || echo '$(srcdir)/'`UnicodeTest.cpp UnicodeTest-UnicodeTest.obj: UnicodeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UnicodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT UnicodeTest-UnicodeTest.obj -MD -MP -MF $(DEPDIR)/UnicodeTest-UnicodeTest.Tpo -c -o UnicodeTest-UnicodeTest.obj `if test -f 'UnicodeTest.cpp'; then $(CYGPATH_W) 'UnicodeTest.cpp'; else $(CYGPATH_W) '$(srcdir)/UnicodeTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/UnicodeTest-UnicodeTest.Tpo $(DEPDIR)/UnicodeTest-UnicodeTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='UnicodeTest.cpp' object='UnicodeTest-UnicodeTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UnicodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o UnicodeTest-UnicodeTest.obj `if test -f 'UnicodeTest.cpp'; then $(CYGPATH_W) 'UnicodeTest.cpp'; else $(CYGPATH_W) '$(srcdir)/UnicodeTest.cpp'; fi` UtilityTest-UtilityTest.o: UtilityTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UtilityTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT UtilityTest-UtilityTest.o -MD -MP -MF $(DEPDIR)/UtilityTest-UtilityTest.Tpo -c -o UtilityTest-UtilityTest.o `test -f 'UtilityTest.cpp' || echo '$(srcdir)/'`UtilityTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/UtilityTest-UtilityTest.Tpo $(DEPDIR)/UtilityTest-UtilityTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='UtilityTest.cpp' object='UtilityTest-UtilityTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UtilityTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o UtilityTest-UtilityTest.o `test -f 'UtilityTest.cpp' || echo '$(srcdir)/'`UtilityTest.cpp UtilityTest-UtilityTest.obj: UtilityTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UtilityTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT UtilityTest-UtilityTest.obj -MD -MP -MF $(DEPDIR)/UtilityTest-UtilityTest.Tpo -c -o UtilityTest-UtilityTest.obj `if test -f 'UtilityTest.cpp'; then $(CYGPATH_W) 'UtilityTest.cpp'; else $(CYGPATH_W) '$(srcdir)/UtilityTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/UtilityTest-UtilityTest.Tpo $(DEPDIR)/UtilityTest-UtilityTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='UtilityTest.cpp' object='UtilityTest-UtilityTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(UtilityTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o UtilityTest-UtilityTest.obj `if test -f 'UtilityTest.cpp'; then $(CYGPATH_W) 'UtilityTest.cpp'; else $(CYGPATH_W) '$(srcdir)/UtilityTest.cpp'; fi` VectorIteratorTest-VectorIteratorTest.o: VectorIteratorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorIteratorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT VectorIteratorTest-VectorIteratorTest.o -MD -MP -MF $(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Tpo -c -o VectorIteratorTest-VectorIteratorTest.o `test -f 'VectorIteratorTest.cpp' || echo '$(srcdir)/'`VectorIteratorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Tpo $(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='VectorIteratorTest.cpp' object='VectorIteratorTest-VectorIteratorTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorIteratorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o VectorIteratorTest-VectorIteratorTest.o `test -f 'VectorIteratorTest.cpp' || echo '$(srcdir)/'`VectorIteratorTest.cpp VectorIteratorTest-VectorIteratorTest.obj: VectorIteratorTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorIteratorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT VectorIteratorTest-VectorIteratorTest.obj -MD -MP -MF $(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Tpo -c -o VectorIteratorTest-VectorIteratorTest.obj `if test -f 'VectorIteratorTest.cpp'; then $(CYGPATH_W) 'VectorIteratorTest.cpp'; else $(CYGPATH_W) '$(srcdir)/VectorIteratorTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Tpo $(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='VectorIteratorTest.cpp' object='VectorIteratorTest-VectorIteratorTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorIteratorTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o VectorIteratorTest-VectorIteratorTest.obj `if test -f 'VectorIteratorTest.cpp'; then $(CYGPATH_W) 'VectorIteratorTest.cpp'; else $(CYGPATH_W) '$(srcdir)/VectorIteratorTest.cpp'; fi` VectorStreamTest-VectorStreamTest.o: VectorStreamTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorStreamTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT VectorStreamTest-VectorStreamTest.o -MD -MP -MF $(DEPDIR)/VectorStreamTest-VectorStreamTest.Tpo -c -o VectorStreamTest-VectorStreamTest.o `test -f 'VectorStreamTest.cpp' || echo '$(srcdir)/'`VectorStreamTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/VectorStreamTest-VectorStreamTest.Tpo $(DEPDIR)/VectorStreamTest-VectorStreamTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='VectorStreamTest.cpp' object='VectorStreamTest-VectorStreamTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorStreamTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o VectorStreamTest-VectorStreamTest.o `test -f 'VectorStreamTest.cpp' || echo '$(srcdir)/'`VectorStreamTest.cpp VectorStreamTest-VectorStreamTest.obj: VectorStreamTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorStreamTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT VectorStreamTest-VectorStreamTest.obj -MD -MP -MF $(DEPDIR)/VectorStreamTest-VectorStreamTest.Tpo -c -o VectorStreamTest-VectorStreamTest.obj `if test -f 'VectorStreamTest.cpp'; then $(CYGPATH_W) 'VectorStreamTest.cpp'; else $(CYGPATH_W) '$(srcdir)/VectorStreamTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/VectorStreamTest-VectorStreamTest.Tpo $(DEPDIR)/VectorStreamTest-VectorStreamTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='VectorStreamTest.cpp' object='VectorStreamTest-VectorStreamTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(VectorStreamTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o VectorStreamTest-VectorStreamTest.obj `if test -f 'VectorStreamTest.cpp'; then $(CYGPATH_W) 'VectorStreamTest.cpp'; else $(CYGPATH_W) '$(srcdir)/VectorStreamTest.cpp'; fi` XMLNodeTest-XMLNodeTest.o: XMLNodeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLNodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XMLNodeTest-XMLNodeTest.o -MD -MP -MF $(DEPDIR)/XMLNodeTest-XMLNodeTest.Tpo -c -o XMLNodeTest-XMLNodeTest.o `test -f 'XMLNodeTest.cpp' || echo '$(srcdir)/'`XMLNodeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/XMLNodeTest-XMLNodeTest.Tpo $(DEPDIR)/XMLNodeTest-XMLNodeTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='XMLNodeTest.cpp' object='XMLNodeTest-XMLNodeTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLNodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XMLNodeTest-XMLNodeTest.o `test -f 'XMLNodeTest.cpp' || echo '$(srcdir)/'`XMLNodeTest.cpp XMLNodeTest-XMLNodeTest.obj: XMLNodeTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLNodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XMLNodeTest-XMLNodeTest.obj -MD -MP -MF $(DEPDIR)/XMLNodeTest-XMLNodeTest.Tpo -c -o XMLNodeTest-XMLNodeTest.obj `if test -f 'XMLNodeTest.cpp'; then $(CYGPATH_W) 'XMLNodeTest.cpp'; else $(CYGPATH_W) '$(srcdir)/XMLNodeTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/XMLNodeTest-XMLNodeTest.Tpo $(DEPDIR)/XMLNodeTest-XMLNodeTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='XMLNodeTest.cpp' object='XMLNodeTest-XMLNodeTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLNodeTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XMLNodeTest-XMLNodeTest.obj `if test -f 'XMLNodeTest.cpp'; then $(CYGPATH_W) 'XMLNodeTest.cpp'; else $(CYGPATH_W) '$(srcdir)/XMLNodeTest.cpp'; fi` XMLStringTest-XMLStringTest.o: XMLStringTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLStringTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XMLStringTest-XMLStringTest.o -MD -MP -MF $(DEPDIR)/XMLStringTest-XMLStringTest.Tpo -c -o XMLStringTest-XMLStringTest.o `test -f 'XMLStringTest.cpp' || echo '$(srcdir)/'`XMLStringTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/XMLStringTest-XMLStringTest.Tpo $(DEPDIR)/XMLStringTest-XMLStringTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='XMLStringTest.cpp' object='XMLStringTest-XMLStringTest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLStringTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XMLStringTest-XMLStringTest.o `test -f 'XMLStringTest.cpp' || echo '$(srcdir)/'`XMLStringTest.cpp XMLStringTest-XMLStringTest.obj: XMLStringTest.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLStringTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT XMLStringTest-XMLStringTest.obj -MD -MP -MF $(DEPDIR)/XMLStringTest-XMLStringTest.Tpo -c -o XMLStringTest-XMLStringTest.obj `if test -f 'XMLStringTest.cpp'; then $(CYGPATH_W) 'XMLStringTest.cpp'; else $(CYGPATH_W) '$(srcdir)/XMLStringTest.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/XMLStringTest-XMLStringTest.Tpo $(DEPDIR)/XMLStringTest-XMLStringTest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='XMLStringTest.cpp' object='XMLStringTest-XMLStringTest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(XMLStringTest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o XMLStringTest-XMLStringTest.obj `if test -f 'XMLStringTest.cpp'; then $(CYGPATH_W) 'XMLStringTest.cpp'; else $(CYGPATH_W) '$(srcdir)/XMLStringTest.cpp'; fi` hashcheck-hashcheck.o: hashcheck.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hashcheck_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hashcheck-hashcheck.o -MD -MP -MF $(DEPDIR)/hashcheck-hashcheck.Tpo -c -o hashcheck-hashcheck.o `test -f 'hashcheck.cpp' || echo '$(srcdir)/'`hashcheck.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hashcheck-hashcheck.Tpo $(DEPDIR)/hashcheck-hashcheck.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hashcheck.cpp' object='hashcheck-hashcheck.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hashcheck_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hashcheck-hashcheck.o `test -f 'hashcheck.cpp' || echo '$(srcdir)/'`hashcheck.cpp hashcheck-hashcheck.obj: hashcheck.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hashcheck_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hashcheck-hashcheck.obj -MD -MP -MF $(DEPDIR)/hashcheck-hashcheck.Tpo -c -o hashcheck-hashcheck.obj `if test -f 'hashcheck.cpp'; then $(CYGPATH_W) 'hashcheck.cpp'; else $(CYGPATH_W) '$(srcdir)/hashcheck.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hashcheck-hashcheck.Tpo $(DEPDIR)/hashcheck-hashcheck.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hashcheck.cpp' object='hashcheck-hashcheck.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hashcheck_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hashcheck-hashcheck.obj `if test -f 'hashcheck.cpp'; then $(CYGPATH_W) 'hashcheck.cpp'; else $(CYGPATH_W) '$(srcdir)/hashcheck.cpp'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf gtest/src/.libs gtest/src/_libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) $(check_LTLIBRARIES) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) $(check_LTLIBRARIES) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? hashcheck.log: hashcheck$(EXEEXT) @p='hashcheck$(EXEEXT)'; \ b='hashcheck'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) BezierTest.log: BezierTest$(EXEEXT) @p='BezierTest$(EXEEXT)'; \ b='BezierTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) BitmapTest.log: BitmapTest$(EXEEXT) @p='BitmapTest$(EXEEXT)'; \ b='BitmapTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) BoundingBoxTest.log: BoundingBoxTest$(EXEEXT) @p='BoundingBoxTest$(EXEEXT)'; \ b='BoundingBoxTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) CalculatorTest.log: CalculatorTest$(EXEEXT) @p='CalculatorTest$(EXEEXT)'; \ b='CalculatorTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) CMapManagerTest.log: CMapManagerTest$(EXEEXT) @p='CMapManagerTest$(EXEEXT)'; \ b='CMapManagerTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) CMapReaderTest.log: CMapReaderTest$(EXEEXT) @p='CMapReaderTest$(EXEEXT)'; \ b='CMapReaderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) CMapTest.log: CMapTest$(EXEEXT) @p='CMapTest$(EXEEXT)'; \ b='CMapTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ColorSpecialTest.log: ColorSpecialTest$(EXEEXT) @p='ColorSpecialTest$(EXEEXT)'; \ b='ColorSpecialTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ColorTest.log: ColorTest$(EXEEXT) @p='ColorTest$(EXEEXT)'; \ b='ColorTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) CommandLineTest.log: CommandLineTest$(EXEEXT) @p='CommandLineTest$(EXEEXT)'; \ b='CommandLineTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DependencyGraphTest.log: DependencyGraphTest$(EXEEXT) @p='DependencyGraphTest$(EXEEXT)'; \ b='DependencyGraphTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DirectoryTest.log: DirectoryTest$(EXEEXT) @p='DirectoryTest$(EXEEXT)'; \ b='DirectoryTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DVIReaderTest.log: DVIReaderTest$(EXEEXT) @p='DVIReaderTest$(EXEEXT)'; \ b='DVIReaderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) DvisvgmSpecialTest.log: DvisvgmSpecialTest$(EXEEXT) @p='DvisvgmSpecialTest$(EXEEXT)'; \ b='DvisvgmSpecialTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) EllipticalArcTest.log: EllipticalArcTest$(EXEEXT) @p='EllipticalArcTest$(EXEEXT)'; \ b='EllipticalArcTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) EmSpecialTest.log: EmSpecialTest$(EXEEXT) @p='EmSpecialTest$(EXEEXT)'; \ b='EmSpecialTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FileFinderTest.log: FileFinderTest$(EXEEXT) @p='FileFinderTest$(EXEEXT)'; \ b='FileFinderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FilePathTest.log: FilePathTest$(EXEEXT) @p='FilePathTest$(EXEEXT)'; \ b='FilePathTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FileSystemTest.log: FileSystemTest$(EXEEXT) @p='FileSystemTest$(EXEEXT)'; \ b='FileSystemTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FontCacheTest.log: FontCacheTest$(EXEEXT) @p='FontCacheTest$(EXEEXT)'; \ b='FontCacheTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FontManagerTest.log: FontManagerTest$(EXEEXT) @p='FontManagerTest$(EXEEXT)'; \ b='FontManagerTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) FontMapTest.log: FontMapTest$(EXEEXT) @p='FontMapTest$(EXEEXT)'; \ b='FontMapTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) GFGlyphTracerTest.log: GFGlyphTracerTest$(EXEEXT) @p='GFGlyphTracerTest$(EXEEXT)'; \ b='GFGlyphTracerTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) GFReaderTest.log: GFReaderTest$(EXEEXT) @p='GFReaderTest$(EXEEXT)'; \ b='GFReaderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) GhostscriptTest.log: GhostscriptTest$(EXEEXT) @p='GhostscriptTest$(EXEEXT)'; \ b='GhostscriptTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) GraphicsPathTest.log: GraphicsPathTest$(EXEEXT) @p='GraphicsPathTest$(EXEEXT)'; \ b='GraphicsPathTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) HashFunctionTest.log: HashFunctionTest$(EXEEXT) @p='HashFunctionTest$(EXEEXT)'; \ b='HashFunctionTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) JFMReaderTest.log: JFMReaderTest$(EXEEXT) @p='JFMReaderTest$(EXEEXT)'; \ b='JFMReaderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) LengthTest.log: LengthTest$(EXEEXT) @p='LengthTest$(EXEEXT)'; \ b='LengthTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MapLineTest.log: MapLineTest$(EXEEXT) @p='MapLineTest$(EXEEXT)'; \ b='MapLineTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MatrixTest.log: MatrixTest$(EXEEXT) @p='MatrixTest$(EXEEXT)'; \ b='MatrixTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) MessageExceptionTest.log: MessageExceptionTest$(EXEEXT) @p='MessageExceptionTest$(EXEEXT)'; \ b='MessageExceptionTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PageRagesTest.log: PageRagesTest$(EXEEXT) @p='PageRagesTest$(EXEEXT)'; \ b='PageRagesTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PageSizeTest.log: PageSizeTest$(EXEEXT) @p='PageSizeTest$(EXEEXT)'; \ b='PageSizeTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PairTest.log: PairTest$(EXEEXT) @p='PairTest$(EXEEXT)'; \ b='PairTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PapersizeSpecialTest.log: PapersizeSpecialTest$(EXEEXT) @p='PapersizeSpecialTest$(EXEEXT)'; \ b='PapersizeSpecialTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PDFParserTest.log: PDFParserTest$(EXEEXT) @p='PDFParserTest$(EXEEXT)'; \ b='PDFParserTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) PSInterpreterTest.log: PSInterpreterTest$(EXEEXT) @p='PSInterpreterTest$(EXEEXT)'; \ b='PSInterpreterTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) RangeMapTest.log: RangeMapTest$(EXEEXT) @p='RangeMapTest$(EXEEXT)'; \ b='RangeMapTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ShadingPatchTest.log: ShadingPatchTest$(EXEEXT) @p='ShadingPatchTest$(EXEEXT)'; \ b='ShadingPatchTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) SpecialManagerTest.log: SpecialManagerTest$(EXEEXT) @p='SpecialManagerTest$(EXEEXT)'; \ b='SpecialManagerTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) SplittedCharInputBufferTest.log: SplittedCharInputBufferTest$(EXEEXT) @p='SplittedCharInputBufferTest$(EXEEXT)'; \ b='SplittedCharInputBufferTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) StreamInputBufferTest.log: StreamInputBufferTest$(EXEEXT) @p='StreamInputBufferTest$(EXEEXT)'; \ b='StreamInputBufferTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) StreamReaderTest.log: StreamReaderTest$(EXEEXT) @p='StreamReaderTest$(EXEEXT)'; \ b='StreamReaderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) StreamWriterTest.log: StreamWriterTest$(EXEEXT) @p='StreamWriterTest$(EXEEXT)'; \ b='StreamWriterTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) StringMatcherTest.log: StringMatcherTest$(EXEEXT) @p='StringMatcherTest$(EXEEXT)'; \ b='StringMatcherTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) SubfontTest.log: SubfontTest$(EXEEXT) @p='SubfontTest$(EXEEXT)'; \ b='SubfontTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) SVGOutputTest.log: SVGOutputTest$(EXEEXT) @p='SVGOutputTest$(EXEEXT)'; \ b='SVGOutputTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TensorProductPatchTest.log: TensorProductPatchTest$(EXEEXT) @p='TensorProductPatchTest$(EXEEXT)'; \ b='TensorProductPatchTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TFMReaderTest.log: TFMReaderTest$(EXEEXT) @p='TFMReaderTest$(EXEEXT)'; \ b='TFMReaderTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) ToUnicodeMapTest.log: ToUnicodeMapTest$(EXEEXT) @p='ToUnicodeMapTest$(EXEEXT)'; \ b='ToUnicodeMapTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TpicSpecialTest.log: TpicSpecialTest$(EXEEXT) @p='TpicSpecialTest$(EXEEXT)'; \ b='TpicSpecialTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TriangularPatchTest.log: TriangularPatchTest$(EXEEXT) @p='TriangularPatchTest$(EXEEXT)'; \ b='TriangularPatchTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) UnicodeTest.log: UnicodeTest$(EXEEXT) @p='UnicodeTest$(EXEEXT)'; \ b='UnicodeTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) UtilityTest.log: UtilityTest$(EXEEXT) @p='UtilityTest$(EXEEXT)'; \ b='UtilityTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) VectorIteratorTest.log: VectorIteratorTest$(EXEEXT) @p='VectorIteratorTest$(EXEEXT)'; \ b='VectorIteratorTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) VectorStreamTest.log: VectorStreamTest$(EXEEXT) @p='VectorStreamTest$(EXEEXT)'; \ b='VectorStreamTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) XMLNodeTest.log: XMLNodeTest$(EXEEXT) @p='XMLNodeTest$(EXEEXT)'; \ b='XMLNodeTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) XMLStringTest.log: XMLStringTest$(EXEEXT) @p='XMLStringTest$(EXEEXT)'; \ b='XMLStringTest'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) check-conv.log: check-conv @p='check-conv'; \ b='check-conv'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_LTLIBRARIES) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f gtest/src/$(DEPDIR)/$(am__dirstamp) -rm -f gtest/src/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/BezierTest-BezierTest.Po -rm -f ./$(DEPDIR)/BitmapTest-BitmapTest.Po -rm -f ./$(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Po -rm -f ./$(DEPDIR)/CMapManagerTest-CMapManagerTest.Po -rm -f ./$(DEPDIR)/CMapReaderTest-CMapReaderTest.Po -rm -f ./$(DEPDIR)/CMapTest-CMapTest.Po -rm -f ./$(DEPDIR)/CalculatorTest-CalculatorTest.Po -rm -f ./$(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Po -rm -f ./$(DEPDIR)/ColorTest-ColorTest.Po -rm -f ./$(DEPDIR)/CommandLineTest-CommandLineTest.Po -rm -f ./$(DEPDIR)/DVIReaderTest-DVIReaderTest.Po -rm -f ./$(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Po -rm -f ./$(DEPDIR)/DirectoryTest-DirectoryTest.Po -rm -f ./$(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Po -rm -f ./$(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Po -rm -f ./$(DEPDIR)/EmSpecialTest-EmSpecialTest.Po -rm -f ./$(DEPDIR)/FileFinderTest-FileFinderTest.Po -rm -f ./$(DEPDIR)/FilePathTest-FilePathTest.Po -rm -f ./$(DEPDIR)/FileSystemTest-FileSystemTest.Po -rm -f ./$(DEPDIR)/FontCacheTest-FontCacheTest.Po -rm -f ./$(DEPDIR)/FontManagerTest-FontManagerTest.Po -rm -f ./$(DEPDIR)/FontMapTest-FontMapTest.Po -rm -f ./$(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Po -rm -f ./$(DEPDIR)/GFReaderTest-GFReaderTest.Po -rm -f ./$(DEPDIR)/GhostscriptTest-GhostscriptTest.Po -rm -f ./$(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Po -rm -f ./$(DEPDIR)/HashFunctionTest-HashFunctionTest.Po -rm -f ./$(DEPDIR)/JFMReaderTest-JFMReaderTest.Po -rm -f ./$(DEPDIR)/LengthTest-LengthTest.Po -rm -f ./$(DEPDIR)/MapLineTest-MapLineTest.Po -rm -f ./$(DEPDIR)/MatrixTest-MatrixTest.Po -rm -f ./$(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Po -rm -f ./$(DEPDIR)/PDFParserTest-PDFParserTest.Po -rm -f ./$(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Po -rm -f ./$(DEPDIR)/PageRagesTest-PageRagesTest.Po -rm -f ./$(DEPDIR)/PageSizeTest-PageSizeTest.Po -rm -f ./$(DEPDIR)/PairTest-PairTest.Po -rm -f ./$(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Po -rm -f ./$(DEPDIR)/RangeMapTest-RangeMapTest.Po -rm -f ./$(DEPDIR)/SVGOutputTest-SVGOutputTest.Po -rm -f ./$(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Po -rm -f ./$(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Po -rm -f ./$(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Po -rm -f ./$(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Po -rm -f ./$(DEPDIR)/StreamReaderTest-StreamReaderTest.Po -rm -f ./$(DEPDIR)/StreamWriterTest-StreamWriterTest.Po -rm -f ./$(DEPDIR)/StringMatcherTest-StringMatcherTest.Po -rm -f ./$(DEPDIR)/SubfontTest-SubfontTest.Po -rm -f ./$(DEPDIR)/TFMReaderTest-TFMReaderTest.Po -rm -f ./$(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Po -rm -f ./$(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Po -rm -f ./$(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Po -rm -f ./$(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Po -rm -f ./$(DEPDIR)/UnicodeTest-UnicodeTest.Po -rm -f ./$(DEPDIR)/UtilityTest-UtilityTest.Po -rm -f ./$(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Po -rm -f ./$(DEPDIR)/VectorStreamTest-VectorStreamTest.Po -rm -f ./$(DEPDIR)/XMLNodeTest-XMLNodeTest.Po -rm -f ./$(DEPDIR)/XMLStringTest-XMLStringTest.Po -rm -f ./$(DEPDIR)/hashcheck-hashcheck.Po -rm -f ./$(DEPDIR)/libgtest_la-testmain.Plo -rm -f gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/BezierTest-BezierTest.Po -rm -f ./$(DEPDIR)/BitmapTest-BitmapTest.Po -rm -f ./$(DEPDIR)/BoundingBoxTest-BoundingBoxTest.Po -rm -f ./$(DEPDIR)/CMapManagerTest-CMapManagerTest.Po -rm -f ./$(DEPDIR)/CMapReaderTest-CMapReaderTest.Po -rm -f ./$(DEPDIR)/CMapTest-CMapTest.Po -rm -f ./$(DEPDIR)/CalculatorTest-CalculatorTest.Po -rm -f ./$(DEPDIR)/ColorSpecialTest-ColorSpecialTest.Po -rm -f ./$(DEPDIR)/ColorTest-ColorTest.Po -rm -f ./$(DEPDIR)/CommandLineTest-CommandLineTest.Po -rm -f ./$(DEPDIR)/DVIReaderTest-DVIReaderTest.Po -rm -f ./$(DEPDIR)/DependencyGraphTest-DependencyGraphTest.Po -rm -f ./$(DEPDIR)/DirectoryTest-DirectoryTest.Po -rm -f ./$(DEPDIR)/DvisvgmSpecialTest-DvisvgmSpecialTest.Po -rm -f ./$(DEPDIR)/EllipticalArcTest-EllipticalArcTest.Po -rm -f ./$(DEPDIR)/EmSpecialTest-EmSpecialTest.Po -rm -f ./$(DEPDIR)/FileFinderTest-FileFinderTest.Po -rm -f ./$(DEPDIR)/FilePathTest-FilePathTest.Po -rm -f ./$(DEPDIR)/FileSystemTest-FileSystemTest.Po -rm -f ./$(DEPDIR)/FontCacheTest-FontCacheTest.Po -rm -f ./$(DEPDIR)/FontManagerTest-FontManagerTest.Po -rm -f ./$(DEPDIR)/FontMapTest-FontMapTest.Po -rm -f ./$(DEPDIR)/GFGlyphTracerTest-GFGlyphTracerTest.Po -rm -f ./$(DEPDIR)/GFReaderTest-GFReaderTest.Po -rm -f ./$(DEPDIR)/GhostscriptTest-GhostscriptTest.Po -rm -f ./$(DEPDIR)/GraphicsPathTest-GraphicsPathTest.Po -rm -f ./$(DEPDIR)/HashFunctionTest-HashFunctionTest.Po -rm -f ./$(DEPDIR)/JFMReaderTest-JFMReaderTest.Po -rm -f ./$(DEPDIR)/LengthTest-LengthTest.Po -rm -f ./$(DEPDIR)/MapLineTest-MapLineTest.Po -rm -f ./$(DEPDIR)/MatrixTest-MatrixTest.Po -rm -f ./$(DEPDIR)/MessageExceptionTest-MessageExceptionTest.Po -rm -f ./$(DEPDIR)/PDFParserTest-PDFParserTest.Po -rm -f ./$(DEPDIR)/PSInterpreterTest-PSInterpreterTest.Po -rm -f ./$(DEPDIR)/PageRagesTest-PageRagesTest.Po -rm -f ./$(DEPDIR)/PageSizeTest-PageSizeTest.Po -rm -f ./$(DEPDIR)/PairTest-PairTest.Po -rm -f ./$(DEPDIR)/PapersizeSpecialTest-PapersizeSpecialTest.Po -rm -f ./$(DEPDIR)/RangeMapTest-RangeMapTest.Po -rm -f ./$(DEPDIR)/SVGOutputTest-SVGOutputTest.Po -rm -f ./$(DEPDIR)/ShadingPatchTest-ShadingPatchTest.Po -rm -f ./$(DEPDIR)/SpecialManagerTest-SpecialManagerTest.Po -rm -f ./$(DEPDIR)/SplittedCharInputBufferTest-SplittedCharInputBufferTest.Po -rm -f ./$(DEPDIR)/StreamInputBufferTest-StreamInputBufferTest.Po -rm -f ./$(DEPDIR)/StreamReaderTest-StreamReaderTest.Po -rm -f ./$(DEPDIR)/StreamWriterTest-StreamWriterTest.Po -rm -f ./$(DEPDIR)/StringMatcherTest-StringMatcherTest.Po -rm -f ./$(DEPDIR)/SubfontTest-SubfontTest.Po -rm -f ./$(DEPDIR)/TFMReaderTest-TFMReaderTest.Po -rm -f ./$(DEPDIR)/TensorProductPatchTest-TensorProductPatchTest.Po -rm -f ./$(DEPDIR)/ToUnicodeMapTest-ToUnicodeMapTest.Po -rm -f ./$(DEPDIR)/TpicSpecialTest-TpicSpecialTest.Po -rm -f ./$(DEPDIR)/TriangularPatchTest-TriangularPatchTest.Po -rm -f ./$(DEPDIR)/UnicodeTest-UnicodeTest.Po -rm -f ./$(DEPDIR)/UtilityTest-UtilityTest.Po -rm -f ./$(DEPDIR)/VectorIteratorTest-VectorIteratorTest.Po -rm -f ./$(DEPDIR)/VectorStreamTest-VectorStreamTest.Po -rm -f ./$(DEPDIR)/XMLNodeTest-XMLNodeTest.Po -rm -f ./$(DEPDIR)/XMLStringTest-XMLStringTest.Po -rm -f ./$(DEPDIR)/hashcheck-hashcheck.Po -rm -f ./$(DEPDIR)/libgtest_la-testmain.Plo -rm -f gtest/src/$(DEPDIR)/libgtest_la-gtest-all.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-TESTS check-am clean \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am .PRECIOUS: Makefile hashcheck.cpp: genhashcheck.py $(dvisvgm_srcdir)/src/AGLTable.hpp $(dvisvgm_srcdir)/libs/xxHash/xxhash.h python $^ >$@ @CODE_COVERAGE_RULES@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: dvisvgm-2.8.1/tests/BitmapTest.cpp0000664000175000017500000000522013510660062014044 00000000000000/************************************************************************* ** BitmapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Bitmap.hpp" using namespace std; TEST(BitmapTest, bbox) { Bitmap bitmap(-4, 10, 3, 10); EXPECT_EQ(bitmap.width(), 15); EXPECT_EQ(bitmap.height(), 8); EXPECT_EQ(bitmap.xshift(), -4); EXPECT_EQ(bitmap.yshift(), 3); EXPECT_EQ(bitmap.bytesPerRow(), 2); EXPECT_EQ(bitmap.empty(), false); } TEST(BitmapTest, setBits) { int w, h; Bitmap bitmap(-4, 10, 3, 10); bitmap.getExtent(w, h); EXPECT_EQ(w, 0); EXPECT_EQ(h, 0); bitmap.setBits(3, 5, 5); bitmap.getExtent(w, h); EXPECT_EQ(w, 5); EXPECT_EQ(h, 1); EXPECT_EQ(bitmap.rowPtr(3-3)[0], 0); EXPECT_EQ(bitmap.rowPtr(3-3)[1], 0x7c); EXPECT_EQ(bitmap.rowPtr(10-3)[0], 0); EXPECT_EQ(bitmap.rowPtr(10-3)[1], 0); bitmap.setBits(10, -3, 10); bitmap.getExtent(w, h); EXPECT_EQ(w, 13); EXPECT_EQ(h, 8); EXPECT_EQ(bitmap.rowPtr(10-3)[0], 0x7f); EXPECT_EQ(bitmap.rowPtr(10-3)[1], 0xe0); } TEST(BitmapTest, copy) { Bitmap bitmap(-4, 10, 3, 10); vector target; bitmap.setBits(4, 5, 5); bitmap.copy(target, false); EXPECT_EQ(target.size(), 8u); EXPECT_EQ(target[0], 0); EXPECT_EQ(target[1], 124); EXPECT_EQ(target[2], 0); bitmap.copy(target, true); EXPECT_EQ(target.size(), 8u); EXPECT_EQ(target[5], 0); EXPECT_EQ(target[6], 124); EXPECT_EQ(target[7], 0); } dvisvgm-2.8.1/tests/FilePathTest.cpp0000664000175000017500000000711513553267757014356 00000000000000/************************************************************************* ** FilePathTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FilePath.hpp" #include "FileSystem.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; TEST(FilePathTest, empty) { FilePath path; ASSERT_TRUE(path.empty()); path.set("/a/b/c/d", false, "/"); ASSERT_FALSE(path.empty()); ASSERT_EQ(path.absolute(), "/a/b/c/d"); } TEST(FilePathTest, dir1) { FilePath fp("a/b/c/d", false, "/"); ASSERT_EQ(fp.absolute(), "/a/b/c/d"); ASSERT_EQ(fp.relative("/"), "a/b/c/d"); ASSERT_EQ(fp.relative("/a/b"), "c/d"); ASSERT_EQ(fp.relative("/a/b/c"), "d"); ASSERT_EQ(fp.relative("/a/b/c/d"), "."); ASSERT_EQ(fp.relative("/a/b/x"), "../c/d"); ASSERT_EQ(fp.relative("/a/b/x/y"), "../../c/d"); } TEST(FilePathTest, dir2) { FilePath fp("a/b/c/d", false, "/x/y"); ASSERT_EQ(fp.absolute(), "/x/y/a/b/c/d"); ASSERT_EQ(fp.relative("/"), "x/y/a/b/c/d"); ASSERT_EQ(fp.relative("/x/y/a/b"), "c/d"); ASSERT_EQ(fp.relative("/x/y/a/b/c"), "d"); ASSERT_EQ(fp.relative("/x/y/a/b/c/d"), "."); ASSERT_EQ(fp.relative("/x/y/a/b/x"), "../c/d"); ASSERT_EQ(fp.relative("/x/y/a/b/x/y"), "../../c/d"); } TEST(FilePathTest, file1) { FilePath fp("a/b/c/d/f.ext", true, "/"); ASSERT_EQ(fp.absolute(), "/a/b/c/d/f.ext"); ASSERT_EQ(fp.relative("/"), "a/b/c/d/f.ext"); ASSERT_EQ(fp.relative("/a/b"), "c/d/f.ext"); ASSERT_EQ(fp.relative("/a/b/c"), "d/f.ext"); ASSERT_EQ(fp.relative("/a/b/c/d"), "f.ext"); ASSERT_EQ(fp.relative("/a/b/x"), "../c/d/f.ext"); ASSERT_EQ(fp.relative("/a/b/x/y"), "../../c/d/f.ext"); ASSERT_EQ(fp.basename(), "f"); ASSERT_EQ(fp.suffix(), "ext"); fp.suffix("new"); ASSERT_EQ(fp.suffix(), "new"); ASSERT_EQ(fp.relative("/a/b/x/y"), "../../c/d/f.new"); } TEST(FilePathTest, file2) { FilePath fp("/f.ext", true, "/"); ASSERT_EQ(fp.absolute(), "/f.ext"); ASSERT_EQ(fp.relative("/a/b"), "../../f.ext"); } TEST(FilePathTest, autodetect) { FileSystem::chdir(SRCDIR); FilePath fp1("FilePathTest.cpp"); ASSERT_TRUE(fp1.isFile()); ASSERT_FALSE(fp1.empty()); string cwd = FileSystem::getcwd(); ASSERT_EQ(fp1.absolute(), cwd + "/FilePathTest.cpp") << "fp1=" << fp1.absolute(); FilePath fp2(""); ASSERT_FALSE(fp2.isFile()); ASSERT_FALSE(fp2.empty()); ASSERT_EQ(fp2.absolute(), FileSystem::getcwd()); } dvisvgm-2.8.1/tests/FontMapTest.cpp0000664000175000017500000000544213510660062014202 00000000000000/************************************************************************* ** FontMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FontMap.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; TEST(FontMapTest, pdf_map) { string fname = string(SRCDIR)+"/data/dvipdfm_test.map"; FontMap &fm = FontMap::instance(); fm.read(fname); const FontMap::Entry *entry; ASSERT_NE(entry = fm.lookup("MyriadPro-Bold-8t"), nullptr); EXPECT_EQ(entry->fontname, "MyriadPro-Bold"); EXPECT_EQ(entry->encname, "my-lf-t1"); ASSERT_NE(entry = fm.lookup("cmbsy8"), nullptr); EXPECT_EQ(entry->fontname, "cmbsy7"); EXPECT_EQ(entry->encname, ""); // entry without mapped name EXPECT_EQ(fm.lookup("msam10"), nullptr); EXPECT_EQ(fm.lookup("msbm10"), nullptr); EXPECT_EQ(fm.lookup("msbm10"), nullptr); EXPECT_EQ(fm.lookup("i don't exist"), nullptr); } TEST(FontMapTest, ps_map) { string fname = string(SRCDIR)+"/data/dvips_test.map"; FontMap &fm = FontMap::instance(); fm.read(fname); const FontMap::Entry *entry; ASSERT_NE(entry = fm.lookup("MyriadPro-Bold-8t"), nullptr); EXPECT_EQ(entry->fontname, "MyriadPro-Bold"); EXPECT_EQ(entry->encname, "my-lf-t1"); ASSERT_NE(entry = fm.lookup("cmbsy8"), nullptr); EXPECT_EQ(entry->fontname, "cmbsy7"); EXPECT_EQ(entry->encname, ""); // entry without mapped name EXPECT_EQ(fm.lookup("msam10"), nullptr); EXPECT_EQ(fm.lookup("msbm10"), nullptr); EXPECT_EQ(fm.lookup("msbm10"), nullptr); EXPECT_EQ(fm.lookup("i don't exist"), nullptr); } dvisvgm-2.8.1/tests/BoundingBoxTest.cpp0000664000175000017500000001367213510660062015060 00000000000000/************************************************************************* ** BoundingBoxTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #define _USE_MATH_DEFINES #include #include #include #include "BoundingBox.hpp" #include "Length.hpp" #include "Matrix.hpp" #include "XMLNode.hpp" using namespace std; TEST(BoundingBoxTest, construct) { BoundingBox bbox1; EXPECT_FALSE(bbox1.valid()); EXPECT_FALSE(bbox1.locked()); BoundingBox bbox2(50, 20, 5, 2); EXPECT_TRUE(bbox2.valid()); EXPECT_FALSE(bbox2.locked()); EXPECT_DOUBLE_EQ(bbox2.minX(), 5); EXPECT_DOUBLE_EQ(bbox2.maxX(), 50); EXPECT_DOUBLE_EQ(bbox2.minY(), 2); EXPECT_DOUBLE_EQ(bbox2.maxY(), 20); EXPECT_EQ(bbox2, BoundingBox(DPair(50, 20), DPair(5, 2))); BoundingBox bbox3(" 1bp 2bp 3bp 4bp "); EXPECT_TRUE(bbox2.valid()); EXPECT_FALSE(bbox2.locked()); EXPECT_DOUBLE_EQ(bbox3.minX(), 1); EXPECT_DOUBLE_EQ(bbox3.minY(), 2); EXPECT_DOUBLE_EQ(bbox3.maxX(), 3); EXPECT_DOUBLE_EQ(bbox3.maxY(), 4); Length len(2, Length::Unit::CM); double bp = len.bp(); BoundingBox bbox4(len, len, len, len); EXPECT_DOUBLE_EQ(bbox4.minX(), bp); EXPECT_DOUBLE_EQ(bbox4.minY(), bp); EXPECT_DOUBLE_EQ(bbox4.maxX(), bp); EXPECT_DOUBLE_EQ(bbox4.maxY(), bp); } TEST(BoundingBoxTest, extent) { BoundingBox bbox(5, 10, 30, 30); EXPECT_DOUBLE_EQ(bbox.width(), 25); EXPECT_DOUBLE_EQ(bbox.height(), 20); } TEST(BoundingBoxTest, set) { BoundingBox bbox; bbox.set("1bp 2bp 3bp 4bp"); EXPECT_EQ(bbox, BoundingBox(1, 2, 3, 4)); bbox.set("4bp 3bp 2bp 1bp"); EXPECT_EQ(bbox, BoundingBox(2, 1, 4, 3)); bbox.set("1bp"); EXPECT_EQ(bbox, BoundingBox(1, 0, 5, 4)); bbox.set("2bp 3bp"); EXPECT_EQ(bbox, BoundingBox(-1, -3, 7, 7)); EXPECT_THROW(bbox.set(""), BoundingBoxException); EXPECT_THROW(bbox.set("1bp 2bp 3bp"), BoundingBoxException); } TEST(BoundingBoxTest, embed) { BoundingBox bbox1(3, 4, 10, 15); BoundingBox bbox2(3, 4, 10, 15); EXPECT_EQ(bbox1, bbox2); bbox1.embed(6, 6); EXPECT_EQ(bbox1, bbox2); bbox1.embed(11, 14); EXPECT_EQ(bbox1, BoundingBox(3, 4, 11, 15)); bbox2.embed(DPair(11, 14)); EXPECT_EQ(bbox1, bbox2); bbox1.embed(Pair(0, 0)); EXPECT_EQ(bbox1, BoundingBox(0, 0, 11, 15)); EXPECT_NE(bbox1, bbox2); bbox2.embed(bbox1); EXPECT_EQ(bbox1, bbox2); bbox1 = BoundingBox(5, 5, 5, 5); bbox1.embed(DPair(5, 5), 2); EXPECT_EQ(bbox1, BoundingBox(3, 3, 7, 7)); EXPECT_NE(bbox1, bbox2); bbox1.invalidate(); bbox1.embed(bbox2); EXPECT_EQ(bbox1, bbox2); } TEST(BoundingBoxTest, expand) { BoundingBox bbox(4, 5, 6, 7); bbox.expand(3); EXPECT_EQ(bbox, BoundingBox(1, 2, 9, 10)); } TEST(BoundingBoxTest, lock) { BoundingBox bbox(4, 5, 6, 7); bbox.lock(); bbox.expand(3); EXPECT_EQ(bbox, BoundingBox(4, 5, 6, 7)); } TEST(BoundingBoxTest, scale) { BoundingBox bbox(4, 5, 6, 7); bbox.scale(2, 2); EXPECT_EQ(bbox, BoundingBox(8, 10, 12, 14)); bbox.scale(-2, -2); EXPECT_EQ(bbox, BoundingBox(-24, -28, -16, -20)); } TEST(BoundingBoxTest, inc) { BoundingBox bbox(4, 5, 6, 7); bbox += BoundingBox(8, 9, 10, 11); EXPECT_EQ(bbox, BoundingBox(12, 14, 16, 18)); } TEST(BoundingBoxTest, intersect) { BoundingBox bbox(4, 5, 16, 17); bbox.intersect(BoundingBox(10, 18, 20, 25)); EXPECT_EQ(bbox, BoundingBox(4, 5, 16, 17)); bbox.intersect(BoundingBox(10, 10, 20, 25)); EXPECT_EQ(bbox, BoundingBox(10, 10, 16, 17)); } TEST(BoundingBoxTest, transform) { BoundingBox bbox(-5, -5, 5, 5); Matrix matrix(1); matrix.rotate(M_PI/4); bbox.transform(matrix); EXPECT_NEAR(bbox.minX(), -5.068, 0.001); EXPECT_NEAR(bbox.minY(), -5.068, 0.001); EXPECT_NEAR(bbox.maxX(), 5.068, 0.001); EXPECT_NEAR(bbox.maxY(), 5.068, 0.001); matrix.rotate(-M_PI/4).translate(2, 3); bbox.transform(matrix); EXPECT_NEAR(bbox.minX(), -3.068, 0.001); EXPECT_NEAR(bbox.minY(), -2.068, 0.001); EXPECT_NEAR(bbox.maxX(), 7.068, 0.001); EXPECT_NEAR(bbox.maxY(), 8.068, 0.001); } TEST(BoundingBoxTest, svgViewBox) { BoundingBox bbox(4, 5, 6, 7); ostringstream oss; oss << bbox.toSVGViewBox(); EXPECT_EQ(oss.str(), "4 5 2 2"); } TEST(BoundingBoxTest, svgRectElement) { BoundingBox bbox(4, 5, 6, 7); auto rect = bbox.createSVGRect(); ASSERT_NE(rect, nullptr); EXPECT_EQ(rect->name(), "rect"); EXPECT_EQ(string(rect->getAttributeValue("x")), "4"); EXPECT_EQ(string(rect->getAttributeValue("y")), "5"); EXPECT_EQ(string(rect->getAttributeValue("width")), "2"); EXPECT_EQ(string(rect->getAttributeValue("height")), "2"); } TEST(BoundingBoxTest, extractLengths) { vector lengths = BoundingBox::extractLengths(" 1cm,2mm , 3pt 5in"); ASSERT_EQ(lengths.size(), 4u); EXPECT_DOUBLE_EQ(lengths[0].cm(), 1); EXPECT_DOUBLE_EQ(lengths[1].mm(), 2); EXPECT_DOUBLE_EQ(lengths[2].pt(), 3); EXPECT_DOUBLE_EQ(lengths[3].in(), 5); } dvisvgm-2.8.1/tests/ColorSpecialTest.cpp0000664000175000017500000001113613510660062015212 00000000000000/************************************************************************* ** ColorSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "ColorSpecialHandler.hpp" #include "SpecialActions.hpp" using namespace std; class ColorSpecialTest : public ::testing::Test { protected: struct SetColor : EmptySpecialActions { SetColor () : color(0) {} void setColor (const Color &c) {color = uint32_t(c);} bool equals (uint32_t c) {return color == c;} uint32_t color; }; ColorSpecialHandler handler; SetColor actions; }; TEST_F(ColorSpecialTest, info) { EXPECT_EQ(handler.name(), "color"); EXPECT_EQ(handler.prefixes().size(), 1u); EXPECT_STREQ(handler.prefixes()[0], "color"); ASSERT_NE(handler.info(), nullptr); EXPECT_FALSE(string(handler.info()).empty()); } TEST_F(ColorSpecialTest, readColor) { std::istringstream iss("rgb 1 0 1"); EXPECT_EQ(ColorSpecialHandler::readColor(iss).rgbString(), "#f0f"); iss.clear(); iss.str("hsb 1 0.5 1"); EXPECT_EQ(ColorSpecialHandler::readColor(iss).rgbString(), "#ff8080"); iss.clear(); iss.str("0 1 0"); EXPECT_EQ(ColorSpecialHandler::readColor("rgb", iss).rgbString(), "#0f0"); iss.clear(); iss.str("1 0.5 1"); EXPECT_EQ(ColorSpecialHandler::readColor("hsb", iss).rgbString(), "#ff8080"); } TEST_F(ColorSpecialTest, gray) { std::istringstream iss("gray 0.2"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x333333)); } TEST_F(ColorSpecialTest, rgb) { std::istringstream iss("rgb 1 0 1"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0xff00ff)); } TEST_F(ColorSpecialTest, hsb) { std::istringstream iss("hsb 1 0.5 1"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0xff8080)); } TEST_F(ColorSpecialTest, cmyk) { std::istringstream iss("cmyk 0.1 0.2 0.4 0.6"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x5c523d)); } TEST_F(ColorSpecialTest, stack1) { std::istringstream iss("push rgb 1 0 0"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0xff0000)); iss.clear(); iss.str("push Blue"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x0000ff)); iss.clear(); iss.str("pop"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0xff0000)); iss.clear(); iss.str("pop"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x000000)); } TEST_F(ColorSpecialTest, stack2) { std::istringstream iss("push rgb 1 0 0"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0xff0000)); iss.clear(); iss.str("push rgb 0 1 0"); handler.process("", iss, actions); iss.clear(); iss.str("gray 0.2"); // clear color stack implicitly handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x333333)); iss.clear(); iss.str("pop"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x000000)); } TEST_F(ColorSpecialTest, constant) { std::istringstream iss("RedViolet"); handler.process("", iss, actions); EXPECT_TRUE(actions.equals(0x9600a8)); } TEST_F(ColorSpecialTest, errors) { std::istringstream iss("UnknownColor"); EXPECT_THROW(handler.process("", iss, actions), SpecialException); iss.clear(); iss.str("blue"); EXPECT_THROW(handler.process("", iss, actions), SpecialException); iss.clear(); iss.str("rgb black"); EXPECT_THROW(handler.process("", iss, actions), SpecialException); } dvisvgm-2.8.1/tests/DvisvgmSpecialTest.cpp0000664000175000017500000003164413510660062015561 00000000000000/************************************************************************* ** DvisvgmSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "DvisvgmSpecialHandler.hpp" #include "SpecialActions.hpp" #include "XMLNode.hpp" using namespace std; class MyDvisvgmSpecialHandler : public DvisvgmSpecialHandler { public: void finishPreprocessing () {dviPreprocessingFinished();} void finishPage () {dviEndPage(0, emptyActions);} protected: EmptySpecialActions emptyActions; }; class DvisvgmSpecialTest : public ::testing::Test { protected: class ActionsRecorder : public EmptySpecialActions { public: void embed (const BoundingBox &bb) override {bbox.embed(bb);} double getX () const override {return 0;} double getY () const override {return 0;} bool defsEquals (const string &str) const {return defsString() == str;} bool pageEquals (const string &str) const {return pageString() == str;} bool bboxEquals (const string &str) const {return bbox.toSVGViewBox() == str;} string bboxString () const {return bbox.toSVGViewBox();} string defsString () const {return toString(svgTree().defsNode());} string pageString () const {return toString(svgTree().pageNode());} void clear () { SpecialActions::svgTree().reset(); SpecialActions::svgTree().newPage(1); bbox = BoundingBox(0, 0, 0, 0); } protected: string toString (const XMLNode *node) const { ostringstream oss; if (node) node->write(oss); return oss.str(); } private: BoundingBox bbox; }; void SetUp () override { recorder.clear(); XMLElement::WRITE_NEWLINES = false; } protected: MyDvisvgmSpecialHandler handler; ActionsRecorder recorder; }; TEST_F(DvisvgmSpecialTest, basic) { EXPECT_EQ(handler.name(), "dvisvgm"); } TEST_F(DvisvgmSpecialTest, rawText) { istringstream iss("raw first{?nl}"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("first\n")) << recorder.pageString(); iss.clear(); iss.str("raw \t second {?bbox dummy} \t"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("first\nsecond 0 0 0 0")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawPage1) { istringstream iss("raw text1<text2text3"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("text1<text2text3")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawPage2) { istringstream iss("raw text1"); handler.process("", iss, recorder); iss.clear(); iss.str("raw text2text3text4"); handler.process("", iss, recorder); iss.clear(); iss.str("raw "); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("text1text2text3text4")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawPage3) { istringstream iss("raw text2text3text4"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("text2text3text4")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawDefs1) { istringstream iss("rawdef text1<text2text3"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("text1<text2text3")) << recorder.defsString(); EXPECT_TRUE(recorder.pageEquals("")); } TEST_F(DvisvgmSpecialTest, rawDefs2) { istringstream iss("rawdef text1"); handler.process("", iss, recorder); iss.clear(); iss.str("rawdef text2text3text4"); handler.process("", iss, recorder); iss.clear(); iss.str("rawdef "); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("text1text2text3text4")); EXPECT_TRUE(recorder.pageEquals("")); } TEST_F(DvisvgmSpecialTest, rawDefs3) { istringstream iss("rawdef text2text3text4"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("text2text3text4")); EXPECT_TRUE(recorder.pageEquals("")); } TEST_F(DvisvgmSpecialTest, rawCDATA) { istringstream iss("raw text1]]>text2"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("text1]]>text2")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawComments) { istringstream iss("raw text"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("text")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawPI) { istringstream iss("raw "); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, rawPageFail) { istringstream iss("raw "); EXPECT_THROW(handler.process("", iss, recorder), SpecialException); // spurious closing tag iss.clear(); iss.str("raw text"); EXPECT_THROW(handler.process("", iss, recorder), SpecialException); // mismatching tags } TEST_F(DvisvgmSpecialTest, rawDefsFail) { istringstream iss("rawdef "); EXPECT_THROW(handler.process("", iss, recorder), SpecialException); // spurious closing tag iss.clear(); iss.str("rawdef text"); EXPECT_THROW(handler.process("", iss, recorder), SpecialException); // mismatching tags } TEST_F(DvisvgmSpecialTest, rawdef) { std::istringstream iss("rawdef first"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("first")) << recorder.defsString(); EXPECT_TRUE(recorder.pageEquals("")); iss.clear(); iss.str("rawdef \t \t"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("first")); EXPECT_TRUE(recorder.pageEquals("")); } TEST_F(DvisvgmSpecialTest, pattern1) { const auto cmds = { "rawset pat1", "raw text1", "raw text2", "endrawset", "raw first", "rawput pat1", "rawput pat1", }; for (const char *cmd : cmds) { std::istringstream iss(cmd); handler.preprocess("", iss, recorder); } handler.finishPreprocessing(); for (const char *cmd : cmds) { std::istringstream iss(cmd); handler.process("", iss, recorder); } handler.finishPage(); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("firsttext1text2text1text2")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, pattern2) { const auto cmds = { "rawset pat2", "rawdef text1", "rawdef text2", "endrawset", "rawdef first", "rawput pat2", "rawput pat2", }; for (const char *cmd : cmds) { std::istringstream iss(cmd); handler.preprocess("", iss, recorder); } handler.finishPreprocessing(); for (const char *cmd : cmds) { std::istringstream iss(cmd); handler.process("", iss, recorder); } handler.finishPage(); EXPECT_TRUE(recorder.defsEquals("firsttext1text2")) << recorder.defsString(); EXPECT_TRUE(recorder.pageEquals("")); } TEST_F(DvisvgmSpecialTest, pattern3) { const auto cmds = { "rawset pat3", "raw text", "rawdef text2", "endrawset", "rawdef first", "raw second", "rawput pat3", "rawput pat3", }; for (const char *cmd : cmds) { std::istringstream iss(cmd); handler.preprocess("", iss, recorder); } handler.finishPreprocessing(); for (const char *cmd : cmds) { std::istringstream iss(cmd); handler.process("", iss, recorder); } EXPECT_TRUE(recorder.defsEquals("firsttext2")); EXPECT_TRUE(recorder.pageEquals("secondtexttext")) << recorder.pageString(); handler.finishPage(); } TEST_F(DvisvgmSpecialTest, fail1) { std::istringstream iss("rawset"); // pattern name missing EXPECT_THROW(handler.preprocess("", iss, recorder), SpecialException); handler.finishPreprocessing(); } TEST_F(DvisvgmSpecialTest, fail2) { std::istringstream iss("rawset pat"); // endrawset missing handler.preprocess("", iss, recorder); EXPECT_THROW(handler.finishPreprocessing(), SpecialException); } TEST_F(DvisvgmSpecialTest, processImg) { std::istringstream iss("img 72.27 72.27 test.png"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("")) << recorder.pageString(); recorder.clear(); iss.clear(); iss.str("img 10bp 20bp test2.png"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.pageEquals("")) << recorder.pageString(); } TEST_F(DvisvgmSpecialTest, fail3) { std::istringstream iss("img 10 20xy test.png"); // unknown unit EXPECT_THROW(handler.process("", iss, recorder), SpecialException); } TEST_F(DvisvgmSpecialTest, processBBox) { std::istringstream iss("bbox abs 0 0 72.27 72.27"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.defsEquals("")); EXPECT_TRUE(recorder.pageEquals("")); EXPECT_TRUE(recorder.bboxEquals("0 0 72 72")); recorder.clear(); iss.clear(); iss.str("bbox 72.27 72.27"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.bboxEquals("0 -72 72 72")); recorder.clear(); iss.clear(); iss.str("bbox 72bp 72bp"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.bboxEquals("0 -72 72 72")); recorder.clear(); iss.clear(); iss.str("bbox rel 72.27 72.27"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.bboxEquals("0 -72 72 72")); recorder.clear(); iss.clear(); iss.str("bbox new name"); handler.process("", iss, recorder); EXPECT_TRUE(recorder.bboxEquals("0 0 0 0")); } TEST_F(DvisvgmSpecialTest, fail4) { std::istringstream iss("bbox abs 0 0 72.27xx 72.27"); // unknown unit EXPECT_THROW(handler.process("", iss, recorder), SpecialException); } dvisvgm-2.8.1/tests/FontCacheTest.cpp0000664000175000017500000001171613554554633014507 00000000000000/************************************************************************* ** FontCacheTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "FileSystem.hpp" #include "FontCache.hpp" #ifndef BUILDDIR #define BUILDDIR "." #endif using namespace std; class LocalCache { public: LocalCache (const string &cachedir) : _cachedir(cachedir), _created(!FileSystem::exists(cachedir) && FileSystem::mkdir(cachedir)) { } ~LocalCache () { if (_created) FileSystem::rmdir(_cachedir); } string cachedir () const {return _cachedir;} private: string _cachedir; bool _created; }; static LocalCache localCache(BUILDDIR"/data"); class FontCacheTest : public testing::Test { protected: FontCacheTest () : testing::Test(), cachedir(localCache.cachedir()) { glyph1.moveto(0, 0); glyph1.lineto(10, 0); glyph1.lineto(10, 10); glyph1.lineto(0, 10); glyph1.closepath(); glyph2.moveto(0, 0); glyph2.cubicto(10, 10, 20, 0, 50, 50); glyph2.lineto(30, 20); glyph2.quadto(20, 40, 20, 20); glyph2.closepath(); } ~FontCacheTest () override { FileSystem::remove(cachedir+"/testfont.fgd"); } Glyph glyph1, glyph2; FontCache cache; string cachedir; }; static string toSVG (const Glyph &glyph) { ostringstream oss; glyph.writeSVG(oss, false); return oss.str(); } TEST_F(FontCacheTest, glyph) { EXPECT_EQ(toSVG(glyph1), "M0 0H10V10H0Z"); EXPECT_EQ(toSVG(glyph2), "M0 0C10 10 20 0 50 50L30 20Q20 40 20 20Z"); cache.setGlyph(1, glyph1); cache.setGlyph(10, glyph2); ASSERT_NE(cache.getGlyph(1), nullptr); ASSERT_EQ(cache.getGlyph(2), nullptr); ASSERT_NE(cache.getGlyph(10), nullptr); ASSERT_EQ(*cache.getGlyph(1), glyph1); ASSERT_EQ(*cache.getGlyph(10), glyph2); } TEST_F(FontCacheTest, write1) { cache.setGlyph(1, glyph1); ASSERT_TRUE(cache.fontname().empty()); ASSERT_FALSE(cache.write(cachedir)); } TEST_F(FontCacheTest, write2) { cache.setGlyph(1, glyph1); ASSERT_TRUE(FileSystem::exists(cachedir)); ASSERT_TRUE(cache.write("testfont", cachedir)); cache.setGlyph(10, glyph2); EXPECT_TRUE(cache.write("testfont", cachedir)); EXPECT_TRUE(cache.fontname().empty()); } TEST_F(FontCacheTest, read) { cache.setGlyph(1, glyph1); cache.setGlyph(10, glyph2); ASSERT_TRUE(cache.write("testfont", cachedir)); // clear cache object cache.clear(); EXPECT_EQ(cache.getGlyph(1), nullptr); EXPECT_EQ(cache.getGlyph(2), nullptr); EXPECT_EQ(cache.getGlyph(10), nullptr); // read glyph data from cache file ASSERT_TRUE(cache.read("testfont", cachedir)); EXPECT_EQ(cache.fontname(), "testfont"); ASSERT_NE(cache.getGlyph(1), nullptr); EXPECT_EQ(cache.getGlyph(2), nullptr); ASSERT_NE(cache.getGlyph(10), nullptr); EXPECT_EQ(*cache.getGlyph(1), glyph1); EXPECT_EQ(*cache.getGlyph(10), glyph2); } TEST_F(FontCacheTest, fontinfo1) { ostringstream oss; cache.clear(); FileSystem::remove(cachedir+"/testfont.fgd"); cache.fontinfo(cachedir, oss); ASSERT_EQ(oss.str(), "cache is empty\n"); // check removal of invalid cache files ofstream cachefile(cachedir+"/invalid.fgd"); cachefile << "invalid cache file"; cachefile.close(); ASSERT_TRUE(FileSystem::exists(cachedir+"/invalid.fgd")); oss.str(""); cache.fontinfo(cachedir, oss, true); ASSERT_EQ(oss.str(), "cache is empty\n" "invalid cache file invalid.fgd removed\n" ); ASSERT_FALSE(FileSystem::exists(cachedir+"/invalid.fgd")); } TEST_F(FontCacheTest, fontinfo2) { cache.setGlyph(1, glyph1); cache.setGlyph(10, glyph2); ASSERT_TRUE(cache.write("testfont", cachedir)); ostringstream oss; cache.fontinfo(cachedir, oss); ASSERT_EQ(oss.str(), "cache format version 5\n" "testfont 2 glyphs 10 cmds 58 bytes hash:3cb32ab6\n" ); } dvisvgm-2.8.1/tests/DVIReaderTest.cpp0000664000175000017500000010067213510660062014404 00000000000000/************************************************************************* ** DVIReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include "DVIReader.hpp" #include "Font.hpp" #include "Message.hpp" #include "XMLString.hpp" using namespace std; template void write (ostream &os, T val) { os << val; } template<> void write (ostream &os, double val) { os << XMLString(val); } template ostream& operator << (ostream &os, const vector &vec) { os << '{'; for (size_t i=0; i < vec.size(); i++) { if (i > 0) os << ", "; write(os, vec[i]); } os << '}'; return os; } class LoggingDVIReader : public DVIReader { public: LoggingDVIReader (istream& is, ostream &os) : DVIReader (is), _inVirtualFont(false), _os(os) {} void execute () { clearStream(); seek(0); executeAll(); } protected: void dviPre (uint8_t id, uint32_t numer, uint32_t denom, uint32_t mag, const string &comment) override { _os << "pre " << int(id) << ", " << numer << ", " << denom << ", " << mag << ", '" << comment << "'"; } void dviPost (uint16_t stdepth, uint16_t pages, uint32_t pw, uint32_t ph, uint32_t mag, uint32_t num, uint32_t den, uint32_t lbopofs) override { _os << "post " << stdepth << ", " << pages << ", " << pw << ", " << ph << ", " << mag << ", " << num << ", " << den << ", " << lbopofs; } void dviPostPost (uint8_t id, uint32_t postOffset) override { _os << "postpost " << int(id) << ", " << postOffset; } void dviBop (const vector &c, int32_t prevBopOffset) override { _os << "bop " << c << ", " << prevBopOffset; } void dviEop () override {_os << "eop";} void dviSetChar0 (uint32_t c, const Font *font) override {if (!_inVirtualFont) _os << "setchar0 " << c;} void dviSetChar (uint32_t c, const Font *font) override {if (!_inVirtualFont) _os << "setchar " << c;} void dviPutChar (uint32_t c, const Font *font) override {if (!_inVirtualFont) _os << "putchar " << c;} void dviSetRule (double h, double w) override {_os << "setrule " << XMLString(h) << ", " << XMLString(w);} void dviPutRule (double h, double w) override {_os << "putrule " << XMLString(h) << ", " << XMLString(w);} void dviNop () override {_os << "nop";} void dviPush () override {_os << "push";} void dviPop () override {_os << "pop";} void dviRight (double dx) override {_os << "right " << XMLString(dx);} void dviDown (double dy) override {_os << "down " << XMLString(dy);} void dviX0 () override {_os << "x0";} void dviY0 () override {_os << "y0";} void dviW0 () override {_os << "w0";} void dviZ0 () override {_os << "z0";} void dviX (double x) override {_os << "x " << XMLString(x);} void dviY (double y) override {_os << "y " << XMLString(y);} void dviW (double w) override {_os << "w " << XMLString(w);} void dviZ (double z) override {_os << "z " << XMLString(z);} void dviDir (WritingMode dir) override {_os << "dir " << int(dir);} void dviXXX (const string &str) override {_os << "xxx '" << str << "'";} void dviFontDef (uint32_t fontnum, uint32_t checksum, const Font *font) override { _os << "fontdef " << fontnum << ", " << checksum << ", " << font->name(); } void dviFontNum (uint32_t fontnum, SetFontMode mode, const Font *font) override { if (!_inVirtualFont) { // exclude logging of virtual fonts if (mode == DVIReader::SetFontMode::VF_ENTER) _inVirtualFont = true; else _os << "fontnum " << fontnum << ", " << font->name(); } else if (mode == DVIReader::SetFontMode::VF_LEAVE) _inVirtualFont = false; } void dviXPic (uint8_t box, const vector &matrix, int16_t page, const string &path) override { _os << "xpic " << int(box) << ", " << matrix << ", " << page << ", " << path; } void dviXFontDef (uint32_t fontnum, const NativeFont *font) override { _os << "xfontdef " << fontnum; } void dviXGlyphArray (vector &dx, vector &dy, vector &glyphs, const Font &font) override { _os << "xglypharray " << dx << ", " << dy << ", " << glyphs << ", " << font.name(); } void dviXGlyphString (vector &dx, vector &glyphs, const Font &font) override { _os << "xglyphstring " << dx << ", " << glyphs << ", " << font.name(); } void dviXTextAndGlyphs (vector &dx, vector &dy, vector &chars, vector &glyphs, const Font &font) override { _os << "xtxtglyphs " << dx << ", " << dy << ", " << chars << ", " << glyphs << ", " << font.name(); } int executeCommand () override { int ret = DVIReader::executeCommand(); if (!_inVirtualFont) { _os << " [h=" << XMLString(dviState().h) << ", v=" << XMLString(dviState().v) << ", x=" << XMLString(dviState().x) << ", y=" << XMLString(dviState().y) << ", w=" << XMLString(dviState().w) << ", z=" << XMLString(dviState().z) << ", d=" << int(dviState().d) << "]\n"; } return ret; } private: bool _inVirtualFont; ///< true if reading a char definition of a virtual font ostream &_os; }; static void test_dvi_file (const char *fname, const vector &expected_lines) { XMLString::DECIMAL_PLACES = 3; string dviname = string(SRCDIR)+"/data/"+fname; ifstream ifs(dviname, ios::binary); ASSERT_TRUE(bool(ifs)); stringstream ss; LoggingDVIReader dviReader(ifs, ss); dviReader.execute(); ss.seekg(0); int lineno=0; char line[512]; for (const string expected_line : expected_lines) { ASSERT_FALSE(ss.eof()); ss.getline(line, 512); lineno++; EXPECT_EQ(line, expected_line) << "log line #" << lineno; } ss.getline(line, 512); EXPECT_EQ(*line, '\0'); EXPECT_TRUE(ss.eof()); } // test DVI file generated with standard LaTeX (DVI version 2) TEST(DVIReaderTest, dvi_v2) { vector expected_lines { "pre 2, 25400000, 473628672, 1000, ' TeX output 2017.11.22:1132' [h=0, v=0, x=0, y=0, w=0, z=0, d=0]", "bop {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -1 [h=0, v=0, x=0, y=0, w=0, z=0, d=0]", "down 630.635 [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "down -602.74 [h=0, v=27.895, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=27.895, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=27.895, x=0, y=0, w=0, z=0, d=0]", "right 61.768 [h=61.768, v=27.895, x=0, y=0, w=0, z=0, d=0]", "xxx 'color push gray 0' [h=61.768, v=27.895, x=0, y=0, w=0, z=0, d=0]", "right 343.711 [h=405.479, v=27.895, x=0, y=0, w=0, z=0, d=0]", "xxx 'color pop' [h=405.479, v=27.895, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=27.895, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=27.895, x=0, y=0, w=0, z=0, d=0]", "down 572.852 [h=0, v=600.747, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=600.747, x=0, y=0, w=0, z=0, d=0]", "right 61.768 [h=61.768, v=600.747, x=0, y=0, w=0, z=0, d=0]", "down -547.945 [h=61.768, v=52.802, x=0, y=0, w=0, z=0, d=0]", "xxx 'color push gray 0' [h=61.768, v=52.802, x=0, y=0, w=0, z=0, d=0]", "down 9.963 [h=61.768, v=62.765, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=62.765, x=0, y=0, w=0, z=0, d=0]", "fontdef 7, 1274110073, cmr10 [h=61.768, v=62.765, x=0, y=0, w=0, z=0, d=0]", "fontnum 7, cmr10 [h=61.768, v=62.765, x=0, y=0, w=0, z=0, d=0]", "setchar0 67 [h=68.964, v=62.765, x=0, y=0, w=0, z=0, d=0]", "setchar0 111 [h=73.945, v=62.765, x=0, y=0, w=0, z=0, d=0]", "setchar0 108 [h=76.712, v=62.765, x=0, y=0, w=0, z=0, d=0]", "setchar0 111 [h=81.694, v=62.765, x=0, y=0, w=0, z=0, d=0]", "setchar0 114 [h=85.596, v=62.765, x=0, y=0, w=0, z=0, d=0]", "w 3.321 [h=88.917, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=92.791, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 101 [h=97.219, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 115 [h=101.149, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=105.023, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 58 [h=107.79, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "right 4.428 [h=112.218, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'color push rgb 1 0 0' [h=112.218, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 114 [h=116.12, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 101 [h=120.548, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 100 [h=126.083, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'color pop' [h=126.083, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 44 [h=128.85, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "w0 [h=132.171, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'color push rgb 0 0 1' [h=132.171, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 98 [h=137.706, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 108 [h=140.473, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 117 [h=146.008, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 101 [h=150.436, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'color pop' [h=150.436, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 44 [h=153.204, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "w0 [h=156.524, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'color push cmyk 0 1 0 0' [h=156.524, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 109 [h=164.827, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 97 [h=169.808, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 103 [h=174.789, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 101 [h=179.217, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 110 [h=184.752, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "right -.277 [h=184.475, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=188.35, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 97 [h=193.331, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'color pop' [h=193.331, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 46 [h=196.098, v=62.765, x=0, y=0, w=3.321, z=0, d=0]", "pop [h=61.768, v=62.765, x=0, y=0, w=0, z=0, d=0]", "down 44.638 [h=61.768, v=107.402, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=107.402, x=0, y=0, w=0, z=0, d=0]", "setchar0 76 [h=67.995, v=107.402, x=0, y=0, w=0, z=0, d=0]", "setchar0 105 [h=70.762, v=107.402, x=0, y=0, w=0, z=0, d=0]", "setchar0 110 [h=76.297, v=107.402, x=0, y=0, w=0, z=0, d=0]", "setchar0 101 [h=80.725, v=107.402, x=0, y=0, w=0, z=0, d=0]", "w 3.321 [h=84.046, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 111 [h=89.027, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 102 [h=92.071, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "w0 [h=95.392, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=99.267, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 101 [h=103.695, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 120 [h=108.953, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=112.827, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "w0 [h=116.148, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 119 [h=123.343, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 105 [h=126.111, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=129.985, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 104 [h=135.52, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "w0 [h=138.841, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 97 [h=143.822, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "push [h=143.822, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "push [h=143.822, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "right 6.78 [h=150.602, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'ps: gsave currentpoint currentpoint translate 30 neg rotate neg exch neg exch translate' [h=150.602, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "push [h=150.602, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 114 [h=154.504, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 111 [h=159.485, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=163.36, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 97 [h=168.341, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 116 [h=172.215, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 101 [h=176.643, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 100 [h=182.178, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "pop [h=150.602, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "right 31.576 [h=182.178, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "xxx 'ps: currentpoint grestore moveto' [h=182.178, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "pop [h=143.822, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "pop [h=143.822, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "right 37.446 [h=181.268, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 119 [h=188.463, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "right -.277 [h=188.187, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 111 [h=193.168, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 114 [h=197.07, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 100 [h=202.605, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "setchar0 46 [h=205.372, v=107.402, x=0, y=0, w=3.321, z=0, d=0]", "pop [h=61.768, v=107.402, x=0, y=0, w=0, z=0, d=0]", "down 52.873 [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "down -31.154 [h=61.768, v=129.121, x=0, y=0, w=0, z=0, d=0]", "putrule .797, 220.922 [h=61.768, v=129.121, x=0, y=0, w=0, z=0, d=0]", "y 11.157 [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "push [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "push [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "right 5.978 [h=67.746, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 12 [h=73.281, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 114 [h=77.183, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 115 [h=81.113, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 116 [h=84.987, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "right 3.321 [h=88.308, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 99 [h=92.736, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 111 [h=97.717, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 108 [h=100.484, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 117 [h=106.019, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 109 [h=114.321, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 110 [h=119.856, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "pop [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "push [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "right 110.558 [h=172.326, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 115 [h=176.256, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 101 [h=180.684, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 99 [h=185.112, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 111 [h=190.093, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 110 [h=195.628, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 100 [h=201.163, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "right 3.321 [h=204.483, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 99 [h=208.911, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 111 [h=213.893, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 108 [h=216.66, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 117 [h=222.195, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 109 [h=230.497, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 110 [h=236.032, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "pop [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "pop [h=61.768, v=140.278, x=0, y=11.157, w=0, z=0, d=0]", "down 5.8 [h=61.768, v=146.078, x=0, y=11.157, w=0, z=0, d=0]", "putrule .498, 220.922 [h=61.768, v=146.078, x=0, y=11.157, w=0, z=0, d=0]", "y0 [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "push [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "push [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "right 5.978 [h=67.746, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 76 [h=73.973, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 111 [h=78.954, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 114 [h=82.856, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 101 [h=87.284, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 109 [h=95.586, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "right 3.321 [h=98.907, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 105 [h=101.674, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 112 [h=107.209, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 115 [h=111.139, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 117 [h=116.674, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 109 [h=124.976, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "pop [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "push [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "right 110.558 [h=172.326, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 100 [h=177.861, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 111 [h=182.842, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 108 [h=185.61, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 111 [h=190.591, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "setchar0 114 [h=194.493, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "w 3.321 [h=197.814, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 115 [h=201.744, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 105 [h=204.511, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 116 [h=208.386, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "w0 [h=211.706, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 97 [h=216.688, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 109 [h=224.99, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 101 [h=229.418, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "setchar0 116 [h=233.292, v=157.235, x=0, y=11.157, w=3.321, z=0, d=0]", "pop [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "pop [h=61.768, v=157.235, x=0, y=11.157, w=0, z=0, d=0]", "y 11.955 [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "push [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "push [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "right 5.978 [h=67.746, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 99 [h=72.174, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 111 [h=77.155, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 110 [h=82.69, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 115 [h=86.62, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 101 [h=91.048, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 116 [h=94.922, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 101 [h=99.35, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 116 [h=103.224, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 117 [h=108.759, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 114 [h=112.661, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "right 3.321 [h=115.982, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 115 [h=119.912, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 97 [h=124.893, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 100 [h=130.428, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 105 [h=133.195, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 112 [h=138.73, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 115 [h=142.66, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 99 [h=147.088, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 105 [h=149.855, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 110 [h=155.39, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 103 [h=160.371, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "pop [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "push [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "right 110.558 [h=172.326, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 101 [h=176.754, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 108 [h=179.521, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 105 [h=182.289, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 116 [h=186.163, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 114 [h=190.065, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "pop [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "pop [h=61.768, v=169.19, x=0, y=11.955, w=0, z=0, d=0]", "y0 [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "push [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "push [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "right 5.978 [h=67.746, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 115 [h=71.676, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 101 [h=76.104, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 100 [h=81.638, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "w 3.321 [h=84.959, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 100 [h=90.494, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 105 [h=93.261, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 97 [h=98.243, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 109 [h=106.545, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "w0 [h=109.866, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 110 [h=115.401, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 111 [h=120.382, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "setchar0 110 [h=125.917, v=181.145, x=0, y=11.955, w=3.321, z=0, d=0]", "w -.277 [h=125.64, v=181.145, x=0, y=11.955, w=-.277, z=0, d=0]", "setchar0 117 [h=131.175, v=181.145, x=0, y=11.955, w=-.277, z=0, d=0]", "setchar0 109 [h=139.477, v=181.145, x=0, y=11.955, w=-.277, z=0, d=0]", "w0 [h=139.2, v=181.145, x=0, y=11.955, w=-.277, z=0, d=0]", "setchar0 121 [h=144.458, v=181.145, x=0, y=11.955, w=-.277, z=0, d=0]", "pop [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "push [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "right 110.558 [h=172.326, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 101 [h=176.754, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 105 [h=179.521, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 114 [h=183.423, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 109 [h=191.726, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "setchar0 111 [h=196.707, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "w .277 [h=196.984, v=181.145, x=0, y=11.955, w=.277, z=0, d=0]", "setchar0 100 [h=202.519, v=181.145, x=0, y=11.955, w=.277, z=0, d=0]", "x 3.321 [h=205.84, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 116 [h=209.714, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 101 [h=214.142, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 109 [h=222.444, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 112 [h=227.979, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "w0 [h=228.256, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 111 [h=233.237, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 114 [h=237.139, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "x0 [h=240.46, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 105 [h=243.227, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "setchar0 110 [h=248.762, v=181.145, x=3.321, y=11.955, w=.277, z=0, d=0]", "w -.277 [h=248.485, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "setchar0 118 [h=253.743, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "setchar0 105 [h=256.511, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "setchar0 100 [h=262.046, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "setchar0 117 [h=267.58, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "setchar0 110 [h=273.115, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "w0 [h=272.838, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "setchar0 116 [h=276.713, v=181.145, x=3.321, y=11.955, w=-.277, z=0, d=0]", "pop [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "pop [h=61.768, v=181.145, x=0, y=11.955, w=0, z=0, d=0]", "down 6.099 [h=61.768, v=187.245, x=0, y=11.955, w=0, z=0, d=0]", "putrule .797, 220.922 [h=61.768, v=187.245, x=0, y=11.955, w=0, z=0, d=0]", "pop [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=160.275, x=0, y=0, w=0, z=0, d=0]", "down 58.197 [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "down 2.989 [h=61.768, v=221.461, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=221.461, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=221.461, x=0, y=0, w=0, z=0, d=0]", "down -2.989 [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "right 3.387 [h=65.156, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 98 [h=70.69, v=218.472, x=0, y=0, w=0, z=0, d=0]", "right .277 [h=70.967, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 111 [h=75.949, v=218.472, x=0, y=0, w=0, z=0, d=0]", "right -.277 [h=75.672, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 120 [h=80.93, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 101 [h=85.358, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 100 [h=90.893, v=218.472, x=0, y=0, w=0, z=0, d=0]", "right 3.321 [h=94.213, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 116 [h=98.088, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 101 [h=102.516, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 120 [h=107.774, v=218.472, x=0, y=0, w=0, z=0, d=0]", "setchar0 116 [h=111.648, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=221.461, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=221.461, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "down -9.907 [h=61.768, v=208.565, x=0, y=0, w=0, z=0, d=0]", "putrule .398, 53.267 [h=61.768, v=208.565, x=0, y=0, w=0, z=0, d=0]", "down 13.095 [h=61.768, v=221.66, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=221.66, x=0, y=0, w=0, z=0, d=0]", "setrule 13.295, .398 [h=62.167, v=221.66, x=0, y=0, w=0, z=0, d=0]", "right 52.47 [h=114.637, v=221.66, x=0, y=0, w=0, z=0, d=0]", "setrule 13.295, .398 [h=115.035, v=221.66, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=221.66, x=0, y=0, w=0, z=0, d=0]", "down .199 [h=61.768, v=221.859, x=0, y=0, w=0, z=0, d=0]", "putrule .398, 53.267 [h=61.768, v=221.859, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=218.472, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=600.747, x=0, y=0, w=0, z=0, d=0]", "down 29.888 [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "right 61.768 [h=61.768, v=630.635, x=0, y=0, w=0, z=0, d=0]", "xxx 'color push gray 0' [h=61.768, v=630.635, x=0, y=0, w=0, z=0, d=0]", "push [h=61.768, v=630.635, x=0, y=0, w=0, z=0, d=0]", "right 169.365 [h=231.133, v=630.635, x=0, y=0, w=0, z=0, d=0]", "setchar0 49 [h=236.115, v=630.635, x=0, y=0, w=0, z=0, d=0]", "pop [h=61.768, v=630.635, x=0, y=0, w=0, z=0, d=0]", "right 343.711 [h=405.479, v=630.635, x=0, y=0, w=0, z=0, d=0]", "xxx 'color pop' [h=405.479, v=630.635, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "eop [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "post 10, 1, 405, 630, 1000, 25400000, 473628672, 42 [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "fontdef 7, 1274110073, cmr10 [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", "postpost 2, 953 [h=0, v=630.635, x=0, y=0, w=0, z=0, d=0]", }; test_dvi_file("sample_v2.dvi", expected_lines); } // test DVI file generated with pLaTeX in vertical mode (DVI version 3) TEST(DVIReaderTest, dvi_v3) { vector expected_lines { "pre 2, 25400000, 473628672, 1000, ' TeX output 2017.11.22:1928' [h=0, v=0, x=0, y=0, w=0, z=0, d=0]", "bop {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -1 [h=0, v=0, x=0, y=0, w=0, z=0, d=0]", "down 703.125 [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "down -678.472 [h=0, v=24.653, x=0, y=0, w=0, z=0, d=0]", "down 650.12 [h=0, v=674.773, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=674.773, x=0, y=0, w=0, z=0, d=0]", "down -601.603 [h=0, v=73.17, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=73.17, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=73.17, x=0, y=0, w=0, z=0, d=0]", "right 12.552 [h=12.552, v=73.17, x=0, y=0, w=0, z=0, d=0]", "down -30.128 [h=12.552, v=43.042, x=0, y=0, w=0, z=0, d=0]", "dir 1 [h=12.552, v=43.042, x=0, y=0, w=0, z=0, d=1]", "down -15.94 [h=28.492, v=43.042, x=0, y=0, w=0, z=0, d=1]", "push [h=28.492, v=43.042, x=0, y=0, w=0, z=0, d=1]", "down 3.404 [h=25.088, v=43.042, x=0, y=0, w=0, z=0, d=1]", "fontdef 7, 1274110073, cmr10 [h=25.088, v=43.042, x=0, y=0, w=0, z=0, d=1]", "fontnum 7, cmr10 [h=25.088, v=43.042, x=0, y=0, w=0, z=0, d=1]", "setchar0 118 [h=25.088, v=48.3, x=0, y=0, w=0, z=0, d=1]", "right -.277 [h=25.088, v=48.023, x=0, y=0, w=0, z=0, d=1]", "setchar0 101 [h=25.088, v=52.451, x=0, y=0, w=0, z=0, d=1]", "setchar0 114 [h=25.088, v=56.353, x=0, y=0, w=0, z=0, d=1]", "setchar0 116 [h=25.088, v=60.228, x=0, y=0, w=0, z=0, d=1]", "setchar0 105 [h=25.088, v=62.995, x=0, y=0, w=0, z=0, d=1]", "setchar0 99 [h=25.088, v=67.423, x=0, y=0, w=0, z=0, d=1]", "setchar0 97 [h=25.088, v=72.404, x=0, y=0, w=0, z=0, d=1]", "setchar0 108 [h=25.088, v=75.172, x=0, y=0, w=0, z=0, d=1]", "pop [h=28.492, v=43.042, x=0, y=0, w=0, z=0, d=1]", "down 15.94 [h=12.552, v=43.042, x=0, y=0, w=0, z=0, d=1]", "push [h=12.552, v=43.042, x=0, y=0, w=0, z=0, d=1]", "down 3.404 [h=9.148, v=43.042, x=0, y=0, w=0, z=0, d=1]", "setchar0 116 [h=9.148, v=46.916, x=0, y=0, w=0, z=0, d=1]", "setchar0 101 [h=9.148, v=51.344, x=0, y=0, w=0, z=0, d=1]", "setchar0 120 [h=9.148, v=56.602, x=0, y=0, w=0, z=0, d=1]", "setchar0 116 [h=9.148, v=60.477, x=0, y=0, w=0, z=0, d=1]", "pop [h=12.552, v=43.042, x=0, y=0, w=0, z=0, d=1]", "pop [h=0, v=73.17, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=73.17, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=674.773, x=0, y=0, w=0, z=0, d=0]", "down 28.352 [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "push [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "right 223.147 [h=223.147, v=703.125, x=0, y=0, w=0, z=0, d=0]", "setchar0 49 [h=228.128, v=703.125, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "pop [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "eop [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "post 5, 1, 451, 703, 1000, 25400000, 473628672, 42 [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "fontdef 7, 1274110073, cmr10 [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", "postpost 3, 195 [h=0, v=703.125, x=0, y=0, w=0, z=0, d=0]", }; test_dvi_file("sample_v3.dvi", expected_lines); } dvisvgm-2.8.1/tests/ToUnicodeMapTest.cpp0000664000175000017500000000470513510660062015166 00000000000000/************************************************************************* ** ToUnicodeMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include "ToUnicodeMap.hpp" using namespace std; #define CHECK_RANGE(name, ucmap, min, max, minval) \ {SCOPED_TRACE(name); check_range(ucmap, min, max, minval);} static void check_range (const ToUnicodeMap &ucmap, uint32_t min, uint32_t max, uint32_t minval) { for (uint32_t i=min; i <= max; i++) ASSERT_EQ(ucmap.valueAt(i), minval+(i-min)) << "i=" << i; } TEST(ToUnicodeMapTest, addMissingMappings1) { ToUnicodeMap ucmap; ASSERT_TRUE(ucmap.addMissingMappings(20)); ASSERT_EQ(ucmap.numRanges(), 1u); CHECK_RANGE("A", ucmap, 1, 20, 1); } TEST(ToUnicodeMapTest, addMissingMappings2) { ToUnicodeMap ucmap; ucmap.addRange(5, 8, 40); ASSERT_EQ(ucmap.numRanges(), 1u); CHECK_RANGE("A", ucmap, 5, 8, 40); ucmap.addRange(10, 15, 50); ASSERT_EQ(ucmap.numRanges(), 2u); CHECK_RANGE("B", ucmap, 5, 8, 40); CHECK_RANGE("C", ucmap, 10, 15, 50); ASSERT_TRUE(ucmap.addMissingMappings(20)); ASSERT_EQ(ucmap.numRanges(), 2u); CHECK_RANGE("D", ucmap, 1, 9, 36); CHECK_RANGE("E", ucmap, 10, 20, 50); } dvisvgm-2.8.1/tests/PageRagesTest.cpp0000664000175000017500000001104013510660062014463 00000000000000/************************************************************************* ** PageRagesTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "PageRanges.hpp" using namespace std; struct Range { int l, r; }; static bool is_equal (const PageRanges &pr, const Range *r) { int i=0; for (PageRanges::ConstIterator it=pr.begin(); it != pr.end(); ++it) { if (it->first != r[i].l || it->second != r[i].r) return false; ++i; } return true; } TEST(PageRangesTest, single) { PageRanges pr; ASSERT_TRUE(pr.parse("123")); ASSERT_FALSE(pr.ranges().empty()); ASSERT_EQ(pr.ranges().front(), PageRanges::Range(123,123)); ASSERT_EQ(pr.numberOfPages(), 1u); } TEST(PageRangesTest, single_range) { PageRanges pr; ASSERT_TRUE(pr.parse("3-19")); ASSERT_FALSE(pr.ranges().empty()); ASSERT_EQ(pr.ranges().front(), PageRanges::Range(3,19)); ASSERT_EQ(pr.numberOfPages(), 17u); } TEST(PageRangesTest, single_range_inv) { PageRanges pr; ASSERT_TRUE(pr.parse("19-3")); ASSERT_FALSE(pr.ranges().empty()); ASSERT_EQ(pr.ranges().front(), PageRanges::Range(3,19)); ASSERT_EQ(pr.numberOfPages(), 17u); } TEST(PageRangesTest, single_range_lopen) { PageRanges pr; ASSERT_TRUE(pr.parse("-19")); ASSERT_FALSE(pr.ranges().empty()); ASSERT_EQ(pr.ranges().front(), PageRanges::Range(1,19)); ASSERT_EQ(pr.numberOfPages(), 19u); } TEST(PageRangesTest, single_range_ropen) { PageRanges pr; ASSERT_TRUE(pr.parse("4-", 100)); ASSERT_FALSE(pr.ranges().empty()); ASSERT_EQ(pr.ranges().front(), PageRanges::Range(4,100)); ASSERT_EQ(pr.numberOfPages(), 97u); } TEST(PageRangesTest, multiple1) { PageRanges pr; ASSERT_TRUE(pr.parse("11,6,9,1,75,6,3")); ASSERT_EQ(pr.size(), 6u); Range cmp[] = {{1,1},{3,3},{6,6},{9,9},{11,11},{75,75}}; ASSERT_TRUE(is_equal(pr, cmp)); ASSERT_EQ(pr.numberOfPages(), 6u); } TEST(PageRangesTest, multiple2) { PageRanges pr; ASSERT_TRUE(pr.parse("2,6,9,1,75,6,3")); ASSERT_EQ(pr.size(), 4u); Range cmp[] = {{1,3},{6,6},{9,9},{75,75}}; ASSERT_TRUE(is_equal(pr, cmp)); } TEST(PageRangesTest, multiple3) { PageRanges pr; ASSERT_TRUE(pr.parse("2,6,9-11,1,25-,19-13,6,3", 100)); ASSERT_EQ(pr.size(), 5u); Range cmp[] = {{1,3},{6,6},{9,11},{13,19},{25,100}}; ASSERT_TRUE(is_equal(pr, cmp)); } TEST(PageRangesTest, overlap1) { PageRanges pr; ASSERT_TRUE(pr.parse("5-11, 8-15")); ASSERT_EQ(pr.size(), 1u); Range cmp[] = {{5,15}}; ASSERT_TRUE(is_equal(pr, cmp)); } TEST(PageRangesTest, overlap2) { PageRanges pr; ASSERT_TRUE(pr.parse("23-30, 5-11, 17-23, 12-19")); ASSERT_EQ(pr.size(), 1u); Range cmp[] = {{5,30}}; ASSERT_TRUE(is_equal(pr, cmp)); } TEST(PageRangesTest, overlap3) { PageRanges pr; ASSERT_TRUE(pr.parse("22-30, 5-11, 21-23, 12-19")); ASSERT_EQ(pr.size(), 2u); Range cmp[] = {{5,19},{21,30}}; ASSERT_TRUE(is_equal(pr, cmp)); } TEST(PageRangesTest, overlap4) { PageRanges pr; ASSERT_TRUE(pr.parse("-15, 20-, 8, 12-16, 18-19", 100)); ASSERT_EQ(pr.size(), 2u); Range cmp[] = {{1,16},{18,100}}; ASSERT_TRUE(is_equal(pr, cmp)); ASSERT_TRUE(pr.parse("17")); ASSERT_EQ(pr.size(), 1u); ASSERT_EQ(pr.ranges().front(), PageRanges::Range(1,100)); } TEST(PageRangesTest, error) { PageRanges pr; ASSERT_FALSE(pr.parse("x")); ASSERT_FALSE(pr.parse("5-x")); ASSERT_FALSE(pr.parse("5 6")); ASSERT_FALSE(pr.parse("5,")); } dvisvgm-2.8.1/tests/FileFinderTest.cpp0000664000175000017500000000606413510660062014646 00000000000000/************************************************************************* ** FileFinderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileFinder.hpp" #include "testutil.hpp" using std::ifstream; TEST(FileFinderTest, find_base_file) { const char *path = FileFinder::instance().lookup("FileFinderTest.cpp"); EXPECT_TRUE(path); path = FileFinder::instance().lookup("Does-not-exist"); EXPECT_FALSE(path); path = FileFinder::instance().lookup("frktest.dvi"); EXPECT_TRUE(path); path = FileFinder::instance().lookup("cmr10.tfm"); EXPECT_TRUE(path); ifstream ifs(path); EXPECT_TRUE(bool(ifs)) << "path=" << path; } TEST(FileFinderTest, find_mapped_file) { // mapped base tfm file => should be resolved by kpathsea // circle10.tfm is usually mapped to lcircle.tfm if (const char *path = FileFinder::instance().lookup("circle10.tfm")) { EXPECT_TRUE(path); ifstream ifs(path); EXPECT_TRUE(bool(ifs)); } else WARNING("circle10.tfm not found"); // mapped lm font => should be resolved using dvisvgm's FontMap // cork-lmr10 is usually mapped to lmr10 bool have_lmodern = FileFinder::instance().lookup("lmodern.sty"); if (have_lmodern) { // package lmodern installed? if (const char *path = FileFinder::instance().lookup("cork-lmr10.pfb")) { ifstream ifs(path); EXPECT_TRUE(bool(ifs)); } else WARNING("cork-lmr10.pfb not found"); } else WARNING("lmodern.sty not found"); } TEST(FileFinderTest, mktexmf) { // ensure availability of ec font => call mktexmf if necessary if (const char *path = FileFinder::instance().lookup("ecrm2000.mf")) { ifstream ifs(path); EXPECT_TRUE(bool(ifs)); } } TEST(FileFinderTest, find_unavailable_file) { const char *path = FileFinder::instance().lookup("not-available.xyz"); EXPECT_FALSE(path); } dvisvgm-2.8.1/tests/normalize.xsl0000664000175000017500000001127713510660062014025 00000000000000 dvisvgm-2.8.1/tests/gtest/0000775000175000017500000000000013563265650012507 500000000000000dvisvgm-2.8.1/tests/gtest/include/0000775000175000017500000000000013510660062014116 500000000000000dvisvgm-2.8.1/tests/gtest/include/gtest/0000775000175000017500000000000013553267757015271 500000000000000dvisvgm-2.8.1/tests/gtest/include/gtest/gtest_prod.h0000664000175000017500000000472713510660062017521 00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Google C++ Testing and Mocking Framework definitions useful in production code. // GOOGLETEST_CM0003 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ #define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ // When you need to test the private or protected members of a class, // use the FRIEND_TEST macro to declare your tests as friends of the // class. For example: // // class MyClass { // private: // void PrivateMethod(); // FRIEND_TEST(MyClassTest, PrivateMethodWorks); // }; // // class MyClassTest : public testing::Test { // // ... // }; // // TEST_F(MyClassTest, PrivateMethodWorks) { // // Can call MyClass::PrivateMethod() here. // } // // Note: The test class must be in the same namespace as the class being tested. // For example, putting MyClassTest in an anonymous namespace will not work. #define FRIEND_TEST(test_case_name, test_name)\ friend class test_case_name##_##test_name##_Test #endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-message.h0000664000175000017500000001751313553267757020141 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file defines the Message class. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ #include #include #include "gtest/internal/gtest-port.h" GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) // Ensures that there is at least one operator<< in the global namespace. // See Message& operator<<(...) below for why. void operator<<(const testing::internal::Secret&, int); namespace testing { // The Message class works like an ostream repeater. // // Typical usage: // // 1. You stream a bunch of values to a Message object. // It will remember the text in a stringstream. // 2. Then you stream the Message object to an ostream. // This causes the text in the Message to be streamed // to the ostream. // // For example; // // testing::Message foo; // foo << 1 << " != " << 2; // std::cout << foo; // // will print "1 != 2". // // Message is not intended to be inherited from. In particular, its // destructor is not virtual. // // Note that stringstream behaves differently in gcc and in MSVC. You // can stream a NULL char pointer to it in the former, but not in the // latter (it causes an access violation if you do). The Message // class hides this difference by treating a NULL char pointer as // "(null)". class GTEST_API_ Message { private: // The type of basic IO manipulators (endl, ends, and flush) for // narrow streams. typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); public: // Constructs an empty Message. Message(); // Copy constructor. Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT *ss_ << msg.GetString(); } // Constructs a Message from a C-string. explicit Message(const char* str) : ss_(new ::std::stringstream) { *ss_ << str; } // Streams a non-pointer value to this object. template inline Message& operator <<(const T& val) { // Some libraries overload << for STL containers. These // overloads are defined in the global namespace instead of ::std. // // C++'s symbol lookup rule (i.e. Koenig lookup) says that these // overloads are visible in either the std namespace or the global // namespace, but not other namespaces, including the testing // namespace which Google Test's Message class is in. // // To allow STL containers (and other types that has a << operator // defined in the global namespace) to be used in Google Test // assertions, testing::Message must access the custom << operator // from the global namespace. With this using declaration, // overloads of << defined in the global namespace and those // visible via Koenig lookup are both exposed in this function. using ::operator <<; *ss_ << val; return *this; } // Streams a pointer value to this object. // // This function is an overload of the previous one. When you // stream a pointer to a Message, this definition will be used as it // is more specialized. (The C++ Standard, section // [temp.func.order].) If you stream a non-pointer, then the // previous definition will be used. // // The reason for this overload is that streaming a NULL pointer to // ostream is undefined behavior. Depending on the compiler, you // may get "0", "(nil)", "(null)", or an access violation. To // ensure consistent result across compilers, we always treat NULL // as "(null)". template inline Message& operator <<(T* const& pointer) { // NOLINT if (pointer == nullptr) { *ss_ << "(null)"; } else { *ss_ << pointer; } return *this; } // Since the basic IO manipulators are overloaded for both narrow // and wide streams, we have to provide this specialized definition // of operator <<, even though its body is the same as the // templatized version above. Without this definition, streaming // endl or other basic IO manipulators to Message will confuse the // compiler. Message& operator <<(BasicNarrowIoManip val) { *ss_ << val; return *this; } // Instead of 1/0, we want to see true/false for bool values. Message& operator <<(bool b) { return *this << (b ? "true" : "false"); } // These two overloads allow streaming a wide C string to a Message // using the UTF-8 encoding. Message& operator <<(const wchar_t* wide_c_str); Message& operator <<(wchar_t* wide_c_str); #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& operator <<(const ::std::wstring& wstr); #endif // GTEST_HAS_STD_WSTRING // Gets the text streamed to this object so far as an std::string. // Each '\0' character in the buffer is replaced with "\\0". // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. std::string GetString() const; private: // We'll hold the text streamed to this object here. const std::unique_ptr< ::std::stringstream> ss_; // We declare (but don't implement) this to prevent the compiler // from implementing the assignment operator. void operator=(const Message&); }; // Streams a Message to an ostream. inline std::ostream& operator <<(std::ostream& os, const Message& sb) { return os << sb.GetString(); } namespace internal { // Converts a streamable value to an std::string. A NULL pointer is // converted to "(null)". When the input value is a ::string, // ::std::string, ::wstring, or ::std::wstring object, each NUL // character in it is replaced with "\\0". template std::string StreamableToString(const T& streamable) { return (Message() << streamable).GetString(); } } // namespace internal } // namespace testing GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 #endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-death-test.h0000664000175000017500000003403713553267757020557 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file defines the public API for death tests. It is // #included by gtest.h so a user doesn't need to include this // directly. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ #include "gtest/internal/gtest-death-test-internal.h" namespace testing { // This flag controls the style of death tests. Valid values are "threadsafe", // meaning that the death test child process will re-execute the test binary // from the start, running only a single death test, or "fast", // meaning that the child process will execute the test logic immediately // after forking. GTEST_DECLARE_string_(death_test_style); #if GTEST_HAS_DEATH_TEST namespace internal { // Returns a Boolean value indicating whether the caller is currently // executing in the context of the death test child process. Tools such as // Valgrind heap checkers may need this to modify their behavior in death // tests. IMPORTANT: This is an internal utility. Using it may break the // implementation of death tests. User code MUST NOT use it. GTEST_API_ bool InDeathTestChild(); } // namespace internal // The following macros are useful for writing death tests. // Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is // executed: // // 1. It generates a warning if there is more than one active // thread. This is because it's safe to fork() or clone() only // when there is a single thread. // // 2. The parent process clone()s a sub-process and runs the death // test in it; the sub-process exits with code 0 at the end of the // death test, if it hasn't exited already. // // 3. The parent process waits for the sub-process to terminate. // // 4. The parent process checks the exit code and error message of // the sub-process. // // Examples: // // ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); // for (int i = 0; i < 5; i++) { // EXPECT_DEATH(server.ProcessRequest(i), // "Invalid request .* in ProcessRequest()") // << "Failed to die on request " << i; // } // // ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); // // bool KilledBySIGHUP(int exit_code) { // return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; // } // // ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); // // On the regular expressions used in death tests: // // GOOGLETEST_CM0005 DO NOT DELETE // On POSIX-compliant systems (*nix), we use the library, // which uses the POSIX extended regex syntax. // // On other platforms (e.g. Windows or Mac), we only support a simple regex // syntax implemented as part of Google Test. This limited // implementation should be enough most of the time when writing // death tests; though it lacks many features you can find in PCRE // or POSIX extended regex syntax. For example, we don't support // union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and // repetition count ("x{5,7}"), among others. // // Below is the syntax that we do support. We chose it to be a // subset of both PCRE and POSIX extended regex, so it's easy to // learn wherever you come from. In the following: 'A' denotes a // literal character, period (.), or a single \\ escape sequence; // 'x' and 'y' denote regular expressions; 'm' and 'n' are for // natural numbers. // // c matches any literal character c // \\d matches any decimal digit // \\D matches any character that's not a decimal digit // \\f matches \f // \\n matches \n // \\r matches \r // \\s matches any ASCII whitespace, including \n // \\S matches any character that's not a whitespace // \\t matches \t // \\v matches \v // \\w matches any letter, _, or decimal digit // \\W matches any character that \\w doesn't match // \\c matches any literal character c, which must be a punctuation // . matches any single character except \n // A? matches 0 or 1 occurrences of A // A* matches 0 or many occurrences of A // A+ matches 1 or many occurrences of A // ^ matches the beginning of a string (not that of each line) // $ matches the end of a string (not that of each line) // xy matches x followed by y // // If you accidentally use PCRE or POSIX extended regex features // not implemented by us, you will get a run-time failure. In that // case, please try to rewrite your regular expression within the // above syntax. // // This implementation is *not* meant to be as highly tuned or robust // as a compiled regex library, but should perform well enough for a // death test, which already incurs significant overhead by launching // a child process. // // Known caveats: // // A "threadsafe" style death test obtains the path to the test // program from argv[0] and re-executes it in the sub-process. For // simplicity, the current implementation doesn't search the PATH // when launching the sub-process. This means that the user must // invoke the test program via a path that contains at least one // path separator (e.g. path/to/foo_test and // /absolute/path/to/bar_test are fine, but foo_test is not). This // is rarely a problem as people usually don't put the test binary // directory in PATH. // // Asserts that a given statement causes the program to exit, with an // integer exit status that satisfies predicate, and emitting error output // that matches regex. # define ASSERT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) // Like ASSERT_EXIT, but continues on to successive tests in the // test suite, if any: # define EXPECT_EXIT(statement, predicate, regex) \ GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) // Asserts that a given statement causes the program to exit, either by // explicitly exiting with a nonzero exit code or being killed by a // signal, and emitting error output that matches regex. # define ASSERT_DEATH(statement, regex) \ ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Like ASSERT_DEATH, but continues on to successive tests in the // test suite, if any: # define EXPECT_DEATH(statement, regex) \ EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) // Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: // Tests that an exit code describes a normal exit with a given exit code. class GTEST_API_ ExitedWithCode { public: explicit ExitedWithCode(int exit_code); bool operator()(int exit_status) const; private: // No implementation - assignment is unsupported. void operator=(const ExitedWithCode& other); const int exit_code_; }; # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA // Tests that an exit code describes an exit due to termination by a // given signal. // GOOGLETEST_CM0006 DO NOT DELETE class GTEST_API_ KilledBySignal { public: explicit KilledBySignal(int signum); bool operator()(int exit_status) const; private: const int signum_; }; # endif // !GTEST_OS_WINDOWS // EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. // The death testing framework causes this to have interesting semantics, // since the sideeffects of the call are only visible in opt mode, and not // in debug mode. // // In practice, this can be used to test functions that utilize the // LOG(DFATAL) macro using the following style: // // int DieInDebugOr12(int* sideeffect) { // if (sideeffect) { // *sideeffect = 12; // } // LOG(DFATAL) << "death"; // return 12; // } // // TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) { // int sideeffect = 0; // // Only asserts in dbg. // EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); // // #ifdef NDEBUG // // opt-mode has sideeffect visible. // EXPECT_EQ(12, sideeffect); // #else // // dbg-mode no visible sideeffect. // EXPECT_EQ(0, sideeffect); // #endif // } // // This will assert that DieInDebugReturn12InOpt() crashes in debug // mode, usually due to a DCHECK or LOG(DFATAL), but returns the // appropriate fallback value (12 in this case) in opt mode. If you // need to test that a function has appropriate side-effects in opt // mode, include assertions against the side-effects. A general // pattern for this is: // // EXPECT_DEBUG_DEATH({ // // Side-effects here will have an effect after this statement in // // opt mode, but none in debug mode. // EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); // }, "death"); // # ifdef NDEBUG # define EXPECT_DEBUG_DEATH(statement, regex) \ GTEST_EXECUTE_STATEMENT_(statement, regex) # define ASSERT_DEBUG_DEATH(statement, regex) \ GTEST_EXECUTE_STATEMENT_(statement, regex) # else # define EXPECT_DEBUG_DEATH(statement, regex) \ EXPECT_DEATH(statement, regex) # define ASSERT_DEBUG_DEATH(statement, regex) \ ASSERT_DEATH(statement, regex) # endif // NDEBUG for EXPECT_DEBUG_DEATH #endif // GTEST_HAS_DEATH_TEST // This macro is used for implementing macros such as // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where // death tests are not supported. Those macros must compile on such systems // if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters // on systems that support death tests. This allows one to write such a macro on // a system that does not support death tests and be sure that it will compile // on a death-test supporting system. It is exposed publicly so that systems // that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST // can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and // ASSERT_DEATH_IF_SUPPORTED. // // Parameters: // statement - A statement that a macro such as EXPECT_DEATH would test // for program termination. This macro has to make sure this // statement is compiled but not executed, to ensure that // EXPECT_DEATH_IF_SUPPORTED compiles with a certain // parameter if and only if EXPECT_DEATH compiles with it. // regex - A regex that a macro such as EXPECT_DEATH would use to test // the output of statement. This parameter has to be // compiled but not evaluated by this macro, to ensure that // this macro only accepts expressions that a macro such as // EXPECT_DEATH would accept. // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED // and a return statement for ASSERT_DEATH_IF_SUPPORTED. // This ensures that ASSERT_DEATH_IF_SUPPORTED will not // compile inside functions where ASSERT_DEATH doesn't // compile. // // The branch that has an always false condition is used to ensure that // statement and regex are compiled (and thus syntactically correct) but // never executed. The unreachable code macro protects the terminator // statement from generating an 'unreachable code' warning in case // statement unconditionally returns or throws. The Message constructor at // the end allows the syntax of streaming additional messages into the // macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. # define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_LOG_(WARNING) \ << "Death tests are not supported on this platform.\n" \ << "Statement '" #statement "' cannot be verified."; \ } else if (::testing::internal::AlwaysFalse()) { \ ::testing::internal::RE::PartialMatch(".*", (regex)); \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ terminator; \ } else \ ::testing::Message() // EXPECT_DEATH_IF_SUPPORTED(statement, regex) and // ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if // death tests are supported; otherwise they just issue a warning. This is // useful when you are combining death test assertions with normal test // assertions in one test. #if GTEST_HAS_DEATH_TEST # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ EXPECT_DEATH(statement, regex) # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ ASSERT_DEATH(statement, regex) #else # define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, ) # define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return) #endif } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest.h0000664000175000017500000026734413553267757016530 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file defines the public API for Google Test. It should be // included by any test program that uses Google Test. // // IMPORTANT NOTE: Due to limitation of the C++ language, we have to // leave some internal implementation details in this header file. // They are clearly marked by comments like this: // // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // // Such code is NOT meant to be used by a user directly, and is subject // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user // program! // // Acknowledgment: Google Test borrowed the idea of automatic test // registration from Barthelemy Dagenais' (barthelemy@prologique.com) // easyUnit framework. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_H_ #include #include #include #include #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" #include "gtest/gtest-death-test.h" #include "gtest/gtest-matchers.h" #include "gtest/gtest-message.h" #include "gtest/gtest-param-test.h" #include "gtest/gtest-printers.h" #include "gtest/gtest_prod.h" #include "gtest/gtest-test-part.h" #include "gtest/gtest-typed-test.h" GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) namespace testing { // Silence C4100 (unreferenced formal parameter) and 4805 // unsafe mix of type 'const int' and type 'const bool' #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable:4805) # pragma warning(disable:4100) #endif // Declares the flags. // This flag temporary enables the disabled tests. GTEST_DECLARE_bool_(also_run_disabled_tests); // This flag brings the debugger on an assertion failure. GTEST_DECLARE_bool_(break_on_failure); // This flag controls whether Google Test catches all test-thrown exceptions // and logs them as failures. GTEST_DECLARE_bool_(catch_exceptions); // This flag enables using colors in terminal output. Available values are // "yes" to enable colors, "no" (disable colors), or "auto" (the default) // to let Google Test decide. GTEST_DECLARE_string_(color); // This flag sets up the filter to select by name using a glob pattern // the tests to run. If the filter is not given all tests are executed. GTEST_DECLARE_string_(filter); // This flag controls whether Google Test installs a signal handler that dumps // debugging information when fatal signals are raised. GTEST_DECLARE_bool_(install_failure_signal_handler); // This flag causes the Google Test to list tests. None of the tests listed // are actually run if the flag is provided. GTEST_DECLARE_bool_(list_tests); // This flag controls whether Google Test emits a detailed XML report to a file // in addition to its normal textual output. GTEST_DECLARE_string_(output); // This flags control whether Google Test prints the elapsed time for each // test. GTEST_DECLARE_bool_(print_time); // This flags control whether Google Test prints UTF8 characters as text. GTEST_DECLARE_bool_(print_utf8); // This flag specifies the random number seed. GTEST_DECLARE_int32_(random_seed); // This flag sets how many times the tests are repeated. The default value // is 1. If the value is -1 the tests are repeating forever. GTEST_DECLARE_int32_(repeat); // This flag controls whether Google Test includes Google Test internal // stack frames in failure stack traces. GTEST_DECLARE_bool_(show_internal_stack_frames); // When this flag is specified, tests' order is randomized on every iteration. GTEST_DECLARE_bool_(shuffle); // This flag specifies the maximum number of stack frames to be // printed in a failure message. GTEST_DECLARE_int32_(stack_trace_depth); // When this flag is specified, a failed assertion will throw an // exception if exceptions are enabled, or exit the program with a // non-zero code otherwise. For use with an external test framework. GTEST_DECLARE_bool_(throw_on_failure); // When this flag is set with a "host:port" string, on supported // platforms test results are streamed to the specified port on // the specified host machine. GTEST_DECLARE_string_(stream_result_to); #if GTEST_USE_OWN_FLAGFILE_FLAG_ GTEST_DECLARE_string_(flagfile); #endif // GTEST_USE_OWN_FLAGFILE_FLAG_ // The upper limit for valid stack trace depths. const int kMaxStackTraceDepth = 100; namespace internal { class AssertHelper; class DefaultGlobalTestPartResultReporter; class ExecDeathTest; class NoExecDeathTest; class FinalSuccessChecker; class GTestFlagSaver; class StreamingListenerTest; class TestResultAccessor; class TestEventListenersAccessor; class TestEventRepeater; class UnitTestRecordPropertyTestHelper; class WindowsDeathTest; class FuchsiaDeathTest; class UnitTestImpl* GetUnitTestImpl(); void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const std::string& message); } // namespace internal // The friend relationship of some of these classes is cyclic. // If we don't forward declare them the compiler might confuse the classes // in friendship clauses with same named classes on the scope. class Test; class TestSuite; // Old API is still available but deprecated #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ using TestCase = TestSuite; #endif class TestInfo; class UnitTest; // A class for indicating whether an assertion was successful. When // the assertion wasn't successful, the AssertionResult object // remembers a non-empty message that describes how it failed. // // To create an instance of this class, use one of the factory functions // (AssertionSuccess() and AssertionFailure()). // // This class is useful for two purposes: // 1. Defining predicate functions to be used with Boolean test assertions // EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts // 2. Defining predicate-format functions to be // used with predicate assertions (ASSERT_PRED_FORMAT*, etc). // // For example, if you define IsEven predicate: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) // will print the message // // Value of: IsEven(Fib(5)) // Actual: false (5 is odd) // Expected: true // // instead of a more opaque // // Value of: IsEven(Fib(5)) // Actual: false // Expected: true // // in case IsEven is a simple Boolean predicate. // // If you expect your predicate to be reused and want to support informative // messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up // about half as often as positive ones in our tests), supply messages for // both success and failure cases: // // testing::AssertionResult IsEven(int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess() << n << " is even"; // else // return testing::AssertionFailure() << n << " is odd"; // } // // Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print // // Value of: IsEven(Fib(6)) // Actual: true (8 is even) // Expected: false // // NB: Predicates that support negative Boolean assertions have reduced // performance in positive ones so be careful not to use them in tests // that have lots (tens of thousands) of positive Boolean assertions. // // To use this class with EXPECT_PRED_FORMAT assertions such as: // // // Verifies that Foo() returns an even number. // EXPECT_PRED_FORMAT1(IsEven, Foo()); // // you need to define: // // testing::AssertionResult IsEven(const char* expr, int n) { // if ((n % 2) == 0) // return testing::AssertionSuccess(); // else // return testing::AssertionFailure() // << "Expected: " << expr << " is even\n Actual: it's " << n; // } // // If Foo() returns 5, you will see the following message: // // Expected: Foo() is even // Actual: it's 5 // class GTEST_API_ AssertionResult { public: // Copy constructor. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult(const AssertionResult& other); #if defined(_MSC_VER) && _MSC_VER < 1910 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */) #endif // Used in the EXPECT_TRUE/FALSE(bool_expression). // // T must be contextually convertible to bool. // // The second parameter prevents this overload from being considered if // the argument is implicitly convertible to AssertionResult. In that case // we want AssertionResult's copy constructor to be used. template explicit AssertionResult( const T& success, typename std::enable_if< !std::is_convertible::value>::type* /*enabler*/ = nullptr) : success_(success) {} #if defined(_MSC_VER) && _MSC_VER < 1910 GTEST_DISABLE_MSC_WARNINGS_POP_() #endif // Assignment operator. AssertionResult& operator=(AssertionResult other) { swap(other); return *this; } // Returns true if and only if the assertion succeeded. operator bool() const { return success_; } // NOLINT // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult operator!() const; // Returns the text streamed into this AssertionResult. Test assertions // use it when they fail (i.e., the predicate's outcome doesn't match the // assertion's expectation). When nothing has been streamed into the // object, returns an empty string. const char* message() const { return message_.get() != nullptr ? message_->c_str() : ""; } // Deprecated; please use message() instead. const char* failure_message() const { return message(); } // Streams a custom failure message into this object. template AssertionResult& operator<<(const T& value) { AppendMessage(Message() << value); return *this; } // Allows streaming basic output manipulators such as endl or flush into // this object. AssertionResult& operator<<( ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) { AppendMessage(Message() << basic_manipulator); return *this; } private: // Appends the contents of message to message_. void AppendMessage(const Message& a_message) { if (message_.get() == nullptr) message_.reset(new ::std::string); message_->append(a_message.GetString().c_str()); } // Swap the contents of this AssertionResult with other. void swap(AssertionResult& other); // Stores result of the assertion predicate. bool success_; // Stores the message describing the condition in case the expectation // construct is not satisfied with the predicate's outcome. // Referenced via a pointer to avoid taking too much stack frame space // with test assertions. std::unique_ptr< ::std::string> message_; }; // Makes a successful assertion result. GTEST_API_ AssertionResult AssertionSuccess(); // Makes a failed assertion result. GTEST_API_ AssertionResult AssertionFailure(); // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << msg. GTEST_API_ AssertionResult AssertionFailure(const Message& msg); } // namespace testing // Includes the auto-generated header that implements a family of generic // predicate assertion macros. This include comes late because it relies on // APIs declared above. #include "gtest/gtest_pred_impl.h" namespace testing { // The abstract class that all tests inherit from. // // In Google Test, a unit test program contains one or many TestSuites, and // each TestSuite contains one or many Tests. // // When you define a test using the TEST macro, you don't need to // explicitly derive from Test - the TEST macro automatically does // this for you. // // The only time you derive from Test is when defining a test fixture // to be used in a TEST_F. For example: // // class FooTest : public testing::Test { // protected: // void SetUp() override { ... } // void TearDown() override { ... } // ... // }; // // TEST_F(FooTest, Bar) { ... } // TEST_F(FooTest, Baz) { ... } // // Test is not copyable. class GTEST_API_ Test { public: friend class TestInfo; // The d'tor is virtual as we intend to inherit from Test. virtual ~Test(); // Sets up the stuff shared by all tests in this test case. // // Google Test will call Foo::SetUpTestSuite() before running the first // test in test case Foo. Hence a sub-class can define its own // SetUpTestSuite() method to shadow the one defined in the super // class. // Failures that happen during SetUpTestSuite are logged but otherwise // ignored. static void SetUpTestSuite() {} // Tears down the stuff shared by all tests in this test suite. // // Google Test will call Foo::TearDownTestSuite() after running the last // test in test case Foo. Hence a sub-class can define its own // TearDownTestSuite() method to shadow the one defined in the super // class. // Failures that happen during TearDownTestSuite are logged but otherwise // ignored. static void TearDownTestSuite() {} // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ static void TearDownTestCase() {} static void SetUpTestCase() {} #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Returns true if and only if the current test has a fatal failure. static bool HasFatalFailure(); // Returns true if and only if the current test has a non-fatal failure. static bool HasNonfatalFailure(); // Returns true if and only if the current test was skipped. static bool IsSkipped(); // Returns true if and only if the current test has a (either fatal or // non-fatal) failure. static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } // Logs a property for the current test, test suite, or for the entire // invocation of the test program when used outside of the context of a // test suite. Only the last value for a given key is remembered. These // are public static so they can be called from utility functions that are // not members of the test fixture. Calls to RecordProperty made during // lifespan of the test (from the moment its constructor starts to the // moment its destructor finishes) will be output in XML as attributes of // the element. Properties recorded from fixture's // SetUpTestSuite or TearDownTestSuite are logged as attributes of the // corresponding element. Calls to RecordProperty made in the // global context (before or after invocation of RUN_ALL_TESTS and from // SetUp/TearDown method of Environment objects registered with Google // Test) will be output as attributes of the element. static void RecordProperty(const std::string& key, const std::string& value); static void RecordProperty(const std::string& key, int value); protected: // Creates a Test object. Test(); // Sets up the test fixture. virtual void SetUp(); // Tears down the test fixture. virtual void TearDown(); private: // Returns true if and only if the current test has the same fixture class // as the first test in the current test suite. static bool HasSameFixtureClass(); // Runs the test after the test fixture has been set up. // // A sub-class must implement this to define the test logic. // // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. // Instead, use the TEST or TEST_F macro. virtual void TestBody() = 0; // Sets up, executes, and tears down the test. void Run(); // Deletes self. We deliberately pick an unusual name for this // internal method to avoid clashing with names used in user TESTs. void DeleteSelf_() { delete this; } const std::unique_ptr gtest_flag_saver_; // Often a user misspells SetUp() as Setup() and spends a long time // wondering why it is never called by Google Test. The declaration of // the following method is solely for catching such an error at // compile time: // // - The return type is deliberately chosen to be not void, so it // will be a conflict if void Setup() is declared in the user's // test fixture. // // - This method is private, so it will be another compiler error // if the method is called from the user's test fixture. // // DO NOT OVERRIDE THIS FUNCTION. // // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; } // We disallow copying Tests. GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); }; typedef internal::TimeInMillis TimeInMillis; // A copyable object representing a user specified test property which can be // output as a key/value string pair. // // Don't inherit from TestProperty as its destructor is not virtual. class TestProperty { public: // C'tor. TestProperty does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestProperty object. TestProperty(const std::string& a_key, const std::string& a_value) : key_(a_key), value_(a_value) { } // Gets the user supplied key. const char* key() const { return key_.c_str(); } // Gets the user supplied value. const char* value() const { return value_.c_str(); } // Sets a new value, overriding the one supplied in the constructor. void SetValue(const std::string& new_value) { value_ = new_value; } private: // The key supplied by the user. std::string key_; // The value supplied by the user. std::string value_; }; // The result of a single Test. This includes a list of // TestPartResults, a list of TestProperties, a count of how many // death tests there are in the Test, and how much time it took to run // the Test. // // TestResult is not copyable. class GTEST_API_ TestResult { public: // Creates an empty TestResult. TestResult(); // D'tor. Do not inherit from TestResult. ~TestResult(); // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int total_part_count() const; // Returns the number of the test properties. int test_property_count() const; // Returns true if and only if the test passed (i.e. no test part failed). bool Passed() const { return !Skipped() && !Failed(); } // Returns true if and only if the test was skipped. bool Skipped() const; // Returns true if and only if the test failed. bool Failed() const; // Returns true if and only if the test fatally failed. bool HasFatalFailure() const; // Returns true if and only if the test has a non-fatal failure. bool HasNonfatalFailure() const; // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Gets the time of the test case start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp() const { return start_timestamp_; } // Returns the i-th test part result among all the results. i can range from 0 // to total_part_count() - 1. If i is not in that range, aborts the program. const TestPartResult& GetTestPartResult(int i) const; // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& GetTestProperty(int i) const; private: friend class TestInfo; friend class TestSuite; friend class UnitTest; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::ExecDeathTest; friend class internal::TestResultAccessor; friend class internal::UnitTestImpl; friend class internal::WindowsDeathTest; friend class internal::FuchsiaDeathTest; // Gets the vector of TestPartResults. const std::vector& test_part_results() const { return test_part_results_; } // Gets the vector of TestProperties. const std::vector& test_properties() const { return test_properties_; } // Sets the start time. void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; } // Sets the elapsed time. void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } // Adds a test property to the list. The property is validated and may add // a non-fatal failure if invalid (e.g., if it conflicts with reserved // key names). If a property is already recorded for the same key, the // value will be updated, rather than storing multiple values for the same // key. xml_element specifies the element for which the property is being // recorded and is used for validation. void RecordProperty(const std::string& xml_element, const TestProperty& test_property); // Adds a failure if the key is a reserved attribute of Google Test // testsuite tags. Returns true if the property is valid. // FIXME: Validate attribute names are legal and human readable. static bool ValidateTestProperty(const std::string& xml_element, const TestProperty& test_property); // Adds a test part result to the list. void AddTestPartResult(const TestPartResult& test_part_result); // Returns the death test count. int death_test_count() const { return death_test_count_; } // Increments the death test count, returning the new count. int increment_death_test_count() { return ++death_test_count_; } // Clears the test part results. void ClearTestPartResults(); // Clears the object. void Clear(); // Protects mutable state of the property vector and of owned // properties, whose values may be updated. internal::Mutex test_properites_mutex_; // The vector of TestPartResults std::vector test_part_results_; // The vector of TestProperties std::vector test_properties_; // Running count of death tests. int death_test_count_; // The start time, in milliseconds since UNIX Epoch. TimeInMillis start_timestamp_; // The elapsed time, in milliseconds. TimeInMillis elapsed_time_; // We disallow copying TestResult. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); }; // class TestResult // A TestInfo object stores the following information about a test: // // Test suite name // Test name // Whether the test should be run // A function pointer that creates the test object when invoked // Test result // // The constructor of TestInfo registers itself with the UnitTest // singleton such that the RUN_ALL_TESTS() macro knows which tests to // run. class GTEST_API_ TestInfo { public: // Destructs a TestInfo object. This function is not virtual, so // don't inherit from TestInfo. ~TestInfo(); // Returns the test suite name. const char* test_suite_name() const { return test_suite_name_.c_str(); } // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const char* test_case_name() const { return test_suite_name(); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Returns the test name. const char* name() const { return name_.c_str(); } // Returns the name of the parameter type, or NULL if this is not a typed // or a type-parameterized test. const char* type_param() const { if (type_param_.get() != nullptr) return type_param_->c_str(); return nullptr; } // Returns the text representation of the value parameter, or NULL if this // is not a value-parameterized test. const char* value_param() const { if (value_param_.get() != nullptr) return value_param_->c_str(); return nullptr; } // Returns the file name where this test is defined. const char* file() const { return location_.file.c_str(); } // Returns the line where this test is defined. int line() const { return location_.line; } // Return true if this test should not be run because it's in another shard. bool is_in_another_shard() const { return is_in_another_shard_; } // Returns true if this test should run, that is if the test is not // disabled (or it is disabled but the also_run_disabled_tests flag has // been specified) and its full name matches the user-specified filter. // // Google Test allows the user to filter the tests by their full names. // The full name of a test Bar in test suite Foo is defined as // "Foo.Bar". Only the tests that match the filter will run. // // A filter is a colon-separated list of glob (not regex) patterns, // optionally followed by a '-' and a colon-separated list of // negative patterns (tests to exclude). A test is run if it // matches one of the positive patterns and does not match any of // the negative patterns. // // For example, *A*:Foo.* is a filter that matches any string that // contains the character 'A' or starts with "Foo.". bool should_run() const { return should_run_; } // Returns true if and only if this test will appear in the XML report. bool is_reportable() const { // The XML report includes tests matching the filter, excluding those // run in other shards. return matches_filter_ && !is_in_another_shard_; } // Returns the result of the test. const TestResult* result() const { return &result_; } private: #if GTEST_HAS_DEATH_TEST friend class internal::DefaultDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST friend class Test; friend class TestSuite; friend class internal::UnitTestImpl; friend class internal::StreamingListenerTest; friend TestInfo* internal::MakeAndRegisterTestInfo( const char* test_suite_name, const char* name, const char* type_param, const char* value_param, internal::CodeLocation code_location, internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc, internal::TestFactoryBase* factory); // Constructs a TestInfo object. The newly constructed instance assumes // ownership of the factory object. TestInfo(const std::string& test_suite_name, const std::string& name, const char* a_type_param, // NULL if not a type-parameterized test const char* a_value_param, // NULL if not a value-parameterized test internal::CodeLocation a_code_location, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory); // Increments the number of death tests encountered in this test so // far. int increment_death_test_count() { return result_.increment_death_test_count(); } // Creates the test object, runs it, records its result, and then // deletes it. void Run(); static void ClearTestResult(TestInfo* test_info) { test_info->result_.Clear(); } // These fields are immutable properties of the test. const std::string test_suite_name_; // test suite name const std::string name_; // Test name // Name of the parameter type, or NULL if this is not a typed or a // type-parameterized test. const std::unique_ptr type_param_; // Text representation of the value parameter, or NULL if this is not a // value-parameterized test. const std::unique_ptr value_param_; internal::CodeLocation location_; const internal::TypeId fixture_class_id_; // ID of the test fixture class bool should_run_; // True if and only if this test should run bool is_disabled_; // True if and only if this test is disabled bool matches_filter_; // True if this test matches the // user-specified filter. bool is_in_another_shard_; // Will be run in another shard. internal::TestFactoryBase* const factory_; // The factory that creates // the test object // This field is mutable and needs to be reset before running the // test for the second time. TestResult result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); }; // A test suite, which consists of a vector of TestInfos. // // TestSuite is not copyable. class GTEST_API_ TestSuite { public: // Creates a TestSuite with the given name. // // TestSuite does NOT have a default constructor. Always use this // constructor to create a TestSuite object. // // Arguments: // // name: name of the test suite // a_type_param: the name of the test's type parameter, or NULL if // this is not a type-parameterized test. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite TestSuite(const char* name, const char* a_type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc); // Destructor of TestSuite. virtual ~TestSuite(); // Gets the name of the TestSuite. const char* name() const { return name_.c_str(); } // Returns the name of the parameter type, or NULL if this is not a // type-parameterized test suite. const char* type_param() const { if (type_param_.get() != nullptr) return type_param_->c_str(); return nullptr; } // Returns true if any test in this test suite should run. bool should_run() const { return should_run_; } // Gets the number of successful tests in this test suite. int successful_test_count() const; // Gets the number of skipped tests in this test suite. int skipped_test_count() const; // Gets the number of failed tests in this test suite. int failed_test_count() const; // Gets the number of disabled tests that will be reported in the XML report. int reportable_disabled_test_count() const; // Gets the number of disabled tests in this test suite. int disabled_test_count() const; // Gets the number of tests to be printed in the XML report. int reportable_test_count() const; // Get the number of tests in this test suite that should run. int test_to_run_count() const; // Gets the number of all tests in this test suite. int total_test_count() const; // Returns true if and only if the test suite passed. bool Passed() const { return !Failed(); } // Returns true if and only if the test suite failed. bool Failed() const { return failed_test_count() > 0; } // Returns the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Gets the time of the test suite start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp() const { return start_timestamp_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* GetTestInfo(int i) const; // Returns the TestResult that holds test properties recorded during // execution of SetUpTestSuite and TearDownTestSuite. const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; } private: friend class Test; friend class internal::UnitTestImpl; // Gets the (mutable) vector of TestInfos in this TestSuite. std::vector& test_info_list() { return test_info_list_; } // Gets the (immutable) vector of TestInfos in this TestSuite. const std::vector& test_info_list() const { return test_info_list_; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* GetMutableTestInfo(int i); // Sets the should_run member. void set_should_run(bool should) { should_run_ = should; } // Adds a TestInfo to this test suite. Will delete the TestInfo upon // destruction of the TestSuite object. void AddTestInfo(TestInfo * test_info); // Clears the results of all tests in this test suite. void ClearResult(); // Clears the results of all tests in the given test suite. static void ClearTestSuiteResult(TestSuite* test_suite) { test_suite->ClearResult(); } // Runs every test in this TestSuite. void Run(); // Runs SetUpTestSuite() for this TestSuite. This wrapper is needed // for catching exceptions thrown from SetUpTestSuite(). void RunSetUpTestSuite() { if (set_up_tc_ != nullptr) { (*set_up_tc_)(); } } // Runs TearDownTestSuite() for this TestSuite. This wrapper is // needed for catching exceptions thrown from TearDownTestSuite(). void RunTearDownTestSuite() { if (tear_down_tc_ != nullptr) { (*tear_down_tc_)(); } } // Returns true if and only if test passed. static bool TestPassed(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Passed(); } // Returns true if and only if test skipped. static bool TestSkipped(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Skipped(); } // Returns true if and only if test failed. static bool TestFailed(const TestInfo* test_info) { return test_info->should_run() && test_info->result()->Failed(); } // Returns true if and only if the test is disabled and will be reported in // the XML report. static bool TestReportableDisabled(const TestInfo* test_info) { return test_info->is_reportable() && test_info->is_disabled_; } // Returns true if and only if test is disabled. static bool TestDisabled(const TestInfo* test_info) { return test_info->is_disabled_; } // Returns true if and only if this test will appear in the XML report. static bool TestReportable(const TestInfo* test_info) { return test_info->is_reportable(); } // Returns true if the given test should run. static bool ShouldRunTest(const TestInfo* test_info) { return test_info->should_run(); } // Shuffles the tests in this test suite. void ShuffleTests(internal::Random* random); // Restores the test order to before the first shuffle. void UnshuffleTests(); // Name of the test suite. std::string name_; // Name of the parameter type, or NULL if this is not a typed or a // type-parameterized test. const std::unique_ptr type_param_; // The vector of TestInfos in their original order. It owns the // elements in the vector. std::vector test_info_list_; // Provides a level of indirection for the test list to allow easy // shuffling and restoring the test order. The i-th element in this // vector is the index of the i-th test in the shuffled test list. std::vector test_indices_; // Pointer to the function that sets up the test suite. internal::SetUpTestSuiteFunc set_up_tc_; // Pointer to the function that tears down the test suite. internal::TearDownTestSuiteFunc tear_down_tc_; // True if and only if any test in this test suite should run. bool should_run_; // The start time, in milliseconds since UNIX Epoch. TimeInMillis start_timestamp_; // Elapsed time, in milliseconds. TimeInMillis elapsed_time_; // Holds test properties recorded during execution of SetUpTestSuite and // TearDownTestSuite. TestResult ad_hoc_test_result_; // We disallow copying TestSuites. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite); }; // An Environment object is capable of setting up and tearing down an // environment. You should subclass this to define your own // environment(s). // // An Environment object does the set-up and tear-down in virtual // methods SetUp() and TearDown() instead of the constructor and the // destructor, as: // // 1. You cannot safely throw from a destructor. This is a problem // as in some cases Google Test is used where exceptions are enabled, and // we may want to implement ASSERT_* using exceptions where they are // available. // 2. You cannot use ASSERT_* directly in a constructor or // destructor. class Environment { public: // The d'tor is virtual as we need to subclass Environment. virtual ~Environment() {} // Override this to define how to set up the environment. virtual void SetUp() {} // Override this to define how to tear down the environment. virtual void TearDown() {} private: // If you see an error about overriding the following function or // about it being private, you have mis-spelled SetUp() as Setup(). struct Setup_should_be_spelled_SetUp {}; virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; } }; #if GTEST_HAS_EXCEPTIONS // Exception which can be thrown from TestEventListener::OnTestPartResult. class GTEST_API_ AssertionException : public internal::GoogleTestFailureException { public: explicit AssertionException(const TestPartResult& result) : GoogleTestFailureException(result) {} }; #endif // GTEST_HAS_EXCEPTIONS // The interface for tracing execution of tests. The methods are organized in // the order the corresponding events are fired. class TestEventListener { public: virtual ~TestEventListener() {} // Fired before any test activity starts. virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; // Fired before each iteration of tests starts. There may be more than // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration // index, starting from 0. virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration) = 0; // Fired before environment set-up for each iteration of tests starts. virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; // Fired after environment set-up for each iteration of tests ends. virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; // Fired before the test suite starts. virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {} // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Fired before the test starts. virtual void OnTestStart(const TestInfo& test_info) = 0; // Fired after a failed assertion or a SUCCEED() invocation. // If you want to throw an exception from this function to skip to the next // TEST, it must be AssertionException defined above, or inherited from it. virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; // Fired after the test ends. virtual void OnTestEnd(const TestInfo& test_info) = 0; // Fired after the test suite ends. virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {} // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Fired before environment tear-down for each iteration of tests starts. virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; // Fired after environment tear-down for each iteration of tests ends. virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; // Fired after each iteration of tests finishes. virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration) = 0; // Fired after all test activities have ended. virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; }; // The convenience class for users who need to override just one or two // methods and are not concerned that a possible change to a signature of // the methods they override will not be caught during the build. For // comments about each method please see the definition of TestEventListener // above. class EmptyTestEventListener : public TestEventListener { public: void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} void OnTestIterationStart(const UnitTest& /*unit_test*/, int /*iteration*/) override {} void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {} void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {} void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {} // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestCaseStart(const TestCase& /*test_case*/) override {} #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestStart(const TestInfo& /*test_info*/) override {} void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {} void OnTestEnd(const TestInfo& /*test_info*/) override {} void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {} #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestCaseEnd(const TestCase& /*test_case*/) override {} #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {} void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {} void OnTestIterationEnd(const UnitTest& /*unit_test*/, int /*iteration*/) override {} void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {} }; // TestEventListeners lets users add listeners to track events in Google Test. class GTEST_API_ TestEventListeners { public: TestEventListeners(); ~TestEventListeners(); // Appends an event listener to the end of the list. Google Test assumes // the ownership of the listener (i.e. it will delete the listener when // the test program finishes). void Append(TestEventListener* listener); // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* Release(TestEventListener* listener); // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the caller and makes this // function return NULL the next time. TestEventListener* default_result_printer() const { return default_result_printer_; } // Returns the standard listener responsible for the default XML output // controlled by the --gtest_output=xml flag. Can be removed from the // listeners list by users who want to shut down the default XML output // controlled by this flag and substitute it with custom one. Note that // removing this object from the listener list with Release transfers its // ownership to the caller and makes this function return NULL the next // time. TestEventListener* default_xml_generator() const { return default_xml_generator_; } private: friend class TestSuite; friend class TestInfo; friend class internal::DefaultGlobalTestPartResultReporter; friend class internal::NoExecDeathTest; friend class internal::TestEventListenersAccessor; friend class internal::UnitTestImpl; // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* repeater(); // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultResultPrinter(TestEventListener* listener); // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void SetDefaultXmlGenerator(TestEventListener* listener); // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool EventForwardingEnabled() const; void SuppressEventForwarding(); // The actual list of listeners. internal::TestEventRepeater* repeater_; // Listener responsible for the standard result output. TestEventListener* default_result_printer_; // Listener responsible for the creation of the XML output file. TestEventListener* default_xml_generator_; // We disallow copying TestEventListeners. GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); }; // A UnitTest consists of a vector of TestSuites. // // This is a singleton class. The only instance of UnitTest is // created when UnitTest::GetInstance() is first called. This // instance is never deleted. // // UnitTest is not copyable. // // This class is thread-safe as long as the methods are called // according to their specification. class GTEST_API_ UnitTest { public: // Gets the singleton UnitTest object. The first time this method // is called, a UnitTest object is constructed and returned. // Consecutive calls will return the same object. static UnitTest* GetInstance(); // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // This method can only be called from the main thread. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. int Run() GTEST_MUST_USE_RESULT_; // Returns the working directory when the first TEST() or TEST_F() // was executed. The UnitTest object owns the string. const char* original_working_dir() const; // Returns the TestSuite object for the test that's currently running, // or NULL if no test is running. const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_); // Legacy API is still available but deprecated #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_); #endif // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. const TestInfo* current_test_info() const GTEST_LOCK_EXCLUDED_(mutex_); // Returns the random seed used at the start of the current test run. int random_seed() const; // Returns the ParameterizedTestSuiteRegistry object used to keep track of // value-parameterized tests and instantiate and register them. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_); // Gets the number of successful test suites. int successful_test_suite_count() const; // Gets the number of failed test suites. int failed_test_suite_count() const; // Gets the number of all test suites. int total_test_suite_count() const; // Gets the number of all test suites that contain at least one test // that should run. int test_suite_to_run_count() const; // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ int successful_test_case_count() const; int failed_test_case_count() const; int total_test_case_count() const; int test_case_to_run_count() const; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Gets the number of successful tests. int successful_test_count() const; // Gets the number of skipped tests. int skipped_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests that will be reported in the XML report. int reportable_disabled_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of tests to be printed in the XML report. int reportable_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the time of the test program start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp() const; // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const; // Returns true if and only if the unit test passed (i.e. all test suites // passed). bool Passed() const; // Returns true if and only if the unit test failed (i.e. some test suite // failed or something outside of all tests failed). bool Failed() const; // Gets the i-th test suite among all the test suites. i can range from 0 to // total_test_suite_count() - 1. If i is not in that range, returns NULL. const TestSuite* GetTestSuite(int i) const; // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const TestCase* GetTestCase(int i) const; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Returns the TestResult containing information on test failures and // properties logged outside of individual test suites. const TestResult& ad_hoc_test_result() const; // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& listeners(); private: // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in // the order they were registered. After all tests in the program // have finished, all global test environments will be torn-down in // the *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // This method can only be called from the main thread. Environment* AddEnvironment(Environment* env); // Adds a TestPartResult to the current TestResult object. All // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) // eventually call this to report their results. The user code // should use the assertion macros instead of calling this directly. void AddTestPartResult(TestPartResult::Type result_type, const char* file_name, int line_number, const std::string& message, const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_); // Adds a TestProperty to the current TestResult object when invoked from // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked // from SetUpTestSuite or TearDownTestSuite, or to the global property set // when invoked elsewhere. If the result already contains a property with // the same key, the value will be updated. void RecordProperty(const std::string& key, const std::string& value); // Gets the i-th test suite among all the test suites. i can range from 0 to // total_test_suite_count() - 1. If i is not in that range, returns NULL. TestSuite* GetMutableTestSuite(int i); // Accessors for the implementation object. internal::UnitTestImpl* impl() { return impl_; } const internal::UnitTestImpl* impl() const { return impl_; } // These classes and functions are friends as they need to access private // members of UnitTest. friend class ScopedTrace; friend class Test; friend class internal::AssertHelper; friend class internal::StreamingListenerTest; friend class internal::UnitTestRecordPropertyTestHelper; friend Environment* AddGlobalTestEnvironment(Environment* env); friend internal::UnitTestImpl* internal::GetUnitTestImpl(); friend void internal::ReportFailureInUnknownLocation( TestPartResult::Type result_type, const std::string& message); // Creates an empty UnitTest. UnitTest(); // D'tor virtual ~UnitTest(); // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. void PushGTestTrace(const internal::TraceInfo& trace) GTEST_LOCK_EXCLUDED_(mutex_); // Pops a trace from the per-thread Google Test trace stack. void PopGTestTrace() GTEST_LOCK_EXCLUDED_(mutex_); // Protects mutable state in *impl_. This is mutable as some const // methods need to lock it too. mutable internal::Mutex mutex_; // Opaque implementation object. This field is never changed once // the object is constructed. We don't mark it as const here, as // doing so will cause a warning in the constructor of UnitTest. // Mutable state in *impl_ is protected by mutex_. internal::UnitTestImpl* impl_; // We disallow copying UnitTest. GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); }; // A convenient wrapper for adding an environment for the test // program. // // You should call this before RUN_ALL_TESTS() is called, probably in // main(). If you use gtest_main, you need to call this before main() // starts for it to take effect. For example, you can define a global // variable like this: // // testing::Environment* const foo_env = // testing::AddGlobalTestEnvironment(new FooEnvironment); // // However, we strongly recommend you to write your own main() and // call AddGlobalTestEnvironment() there, as relying on initialization // of global variables makes the code harder to read and may cause // problems when you register multiple environments from different // translation units and the environments have dependencies among them // (remember that the compiler doesn't guarantee the order in which // global variables from different translation units are initialized). inline Environment* AddGlobalTestEnvironment(Environment* env) { return UnitTest::GetInstance()->AddEnvironment(env); } // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. GTEST_API_ void InitGoogleTest(int* argc, char** argv); // This overloaded version can be used in Windows programs compiled in // UNICODE mode. GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); // This overloaded version can be used on Arduino/embedded platforms where // there is no argc/argv. GTEST_API_ void InitGoogleTest(); namespace internal { // Separate the error generating code from the code path to reduce the stack // frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers // when calling EXPECT_* in a tight loop. template AssertionResult CmpHelperEQFailure(const char* lhs_expression, const char* rhs_expression, const T1& lhs, const T2& rhs) { return EqFailure(lhs_expression, rhs_expression, FormatForComparisonFailureMessage(lhs, rhs), FormatForComparisonFailureMessage(rhs, lhs), false); } // This block of code defines operator==/!= // to block lexical scope lookup. // It prevents using invalid operator==/!= defined at namespace scope. struct faketype {}; inline bool operator==(faketype, faketype) { return true; } inline bool operator!=(faketype, faketype) { return false; } // The helper function for {ASSERT|EXPECT}_EQ. template AssertionResult CmpHelperEQ(const char* lhs_expression, const char* rhs_expression, const T1& lhs, const T2& rhs) { if (lhs == rhs) { return AssertionSuccess(); } return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums // can be implicitly cast to BiggestInt. GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression, const char* rhs_expression, BiggestInt lhs, BiggestInt rhs); class EqHelper { public: // This templatized version is for the general case. template < typename T1, typename T2, // Disable this overload for cases where one argument is a pointer // and the other is the null pointer constant. typename std::enable_if::value || !std::is_pointer::value>::type* = nullptr> static AssertionResult Compare(const char* lhs_expression, const char* rhs_expression, const T1& lhs, const T2& rhs) { return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs); } // With this overloaded version, we allow anonymous enums to be used // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous // enums can be implicitly cast to BiggestInt. // // Even though its body looks the same as the above version, we // cannot merge the two, as it will make anonymous enums unhappy. static AssertionResult Compare(const char* lhs_expression, const char* rhs_expression, BiggestInt lhs, BiggestInt rhs) { return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs); } template static AssertionResult Compare( const char* lhs_expression, const char* rhs_expression, // Handle cases where '0' is used as a null pointer literal. std::nullptr_t /* lhs */, T* rhs) { // We already know that 'lhs' is a null pointer. return CmpHelperEQ(lhs_expression, rhs_expression, static_cast(nullptr), rhs); } }; // Separate the error generating code from the code path to reduce the stack // frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers // when calling EXPECT_OP in a tight loop. template AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2, const T1& val1, const T2& val2, const char* op) { return AssertionFailure() << "Expected: (" << expr1 << ") " << op << " (" << expr2 << "), actual: " << FormatForComparisonFailureMessage(val1, val2) << " vs " << FormatForComparisonFailureMessage(val2, val1); } // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste // of similar code. // // For each templatized helper function, we also define an overloaded // version for BiggestInt in order to reduce code bloat and allow // anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled // with gcc 4. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ template \ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ const T1& val1, const T2& val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\ }\ }\ GTEST_API_ AssertionResult CmpHelper##op_name(\ const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // Implements the helper function for {ASSERT|EXPECT}_NE GTEST_IMPL_CMP_HELPER_(NE, !=); // Implements the helper function for {ASSERT|EXPECT}_LE GTEST_IMPL_CMP_HELPER_(LE, <=); // Implements the helper function for {ASSERT|EXPECT}_LT GTEST_IMPL_CMP_HELPER_(LT, <); // Implements the helper function for {ASSERT|EXPECT}_GE GTEST_IMPL_CMP_HELPER_(GE, >=); // Implements the helper function for {ASSERT|EXPECT}_GT GTEST_IMPL_CMP_HELPER_(GT, >); #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // The helper function for {ASSERT|EXPECT}_STRCASEEQ. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // The helper function for {ASSERT|EXPECT}_STRNE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // The helper function for {ASSERT|EXPECT}_STRCASENE. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2); // Helper function for *_STREQ on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2); // Helper function for *_STRNE on wide strings. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2); } // namespace internal // IsSubstring() and IsNotSubstring() are intended to be used as the // first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by // themselves. They check whether needle is a substring of haystack // (NULL is considered a substring of itself only), and return an // appropriate error message when they fail. // // The {needle,haystack}_expr arguments are the stringified // expressions that generated the two real arguments. GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack); GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack); #if GTEST_HAS_STD_WSTRING GTEST_API_ AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); GTEST_API_ AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack); #endif // GTEST_HAS_STD_WSTRING namespace internal { // Helper template function for comparing floating-points. // // Template parameter: // // RawType: the raw floating-point type (either float or double) // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template AssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression, const char* rhs_expression, RawType lhs_value, RawType rhs_value) { const FloatingPoint lhs(lhs_value), rhs(rhs_value); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } ::std::stringstream lhs_ss; lhs_ss << std::setprecision(std::numeric_limits::digits10 + 2) << lhs_value; ::std::stringstream rhs_ss; rhs_ss << std::setprecision(std::numeric_limits::digits10 + 2) << rhs_value; return EqFailure(lhs_expression, rhs_expression, StringStreamToString(&lhs_ss), StringStreamToString(&rhs_ss), false); } // Helper function for implementing ASSERT_NEAR. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error); // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // A class that enables one to stream messages to assertion macros class GTEST_API_ AssertHelper { public: // Constructor. AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message); ~AssertHelper(); // Message assignment is a semantic trick to enable assertion // streaming; see the GTEST_MESSAGE_ macro below. void operator=(const Message& message) const; private: // We put our data in a struct so that the size of the AssertHelper class can // be as small as possible. This is important because gcc is incapable of // re-using stack space even for temporary variables, so every EXPECT_EQ // reserves stack space for another AssertHelper. struct AssertHelperData { AssertHelperData(TestPartResult::Type t, const char* srcfile, int line_num, const char* msg) : type(t), file(srcfile), line(line_num), message(msg) { } TestPartResult::Type const type; const char* const file; int const line; std::string const message; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); }; AssertHelperData* const data_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); }; enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; GTEST_API_ GTEST_ATTRIBUTE_PRINTF_(2, 3) void ColoredPrintf(GTestColor color, const char* fmt, ...); } // namespace internal // The pure interface class that all value-parameterized tests inherit from. // A value-parameterized class must inherit from both ::testing::Test and // ::testing::WithParamInterface. In most cases that just means inheriting // from ::testing::TestWithParam, but more complicated test hierarchies // may need to inherit from Test and WithParamInterface at different levels. // // This interface has support for accessing the test parameter value via // the GetParam() method. // // Use it with one of the parameter generator defining functions, like Range(), // Values(), ValuesIn(), Bool(), and Combine(). // // class FooTest : public ::testing::TestWithParam { // protected: // FooTest() { // // Can use GetParam() here. // } // ~FooTest() override { // // Can use GetParam() here. // } // void SetUp() override { // // Can use GetParam() here. // } // void TearDown override { // // Can use GetParam() here. // } // }; // TEST_P(FooTest, DoesBar) { // // Can use GetParam() method here. // Foo foo; // ASSERT_TRUE(foo.DoesBar(GetParam())); // } // INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); template class WithParamInterface { public: typedef T ParamType; virtual ~WithParamInterface() {} // The current parameter value. Is also available in the test fixture's // constructor. static const ParamType& GetParam() { GTEST_CHECK_(parameter_ != nullptr) << "GetParam() can only be called inside a value-parameterized test " << "-- did you intend to write TEST_P instead of TEST_F?"; return *parameter_; } private: // Sets parameter value. The caller is responsible for making sure the value // remains alive and unchanged throughout the current test. static void SetParam(const ParamType* parameter) { parameter_ = parameter; } // Static value used for accessing parameter during a test lifetime. static const ParamType* parameter_; // TestClass must be a subclass of WithParamInterface and Test. template friend class internal::ParameterizedTestFactory; }; template const T* WithParamInterface::parameter_ = nullptr; // Most value-parameterized classes can ignore the existence of // WithParamInterface, and can just inherit from ::testing::TestWithParam. template class TestWithParam : public Test, public WithParamInterface { }; // Macros for indicating success/failure in test code. // Skips test in runtime. // Skipping test aborts current function. // Skipped tests are neither successful nor failed. #define GTEST_SKIP() GTEST_SKIP_("Skipped") // ADD_FAILURE unconditionally adds a failure to the current test. // SUCCEED generates a success - it doesn't automatically make the // current test successful, as a test is only successful when it has // no failure. // // EXPECT_* verifies that a certain condition is satisfied. If not, // it behaves like ADD_FAILURE. In particular: // // EXPECT_TRUE verifies that a Boolean condition is true. // EXPECT_FALSE verifies that a Boolean condition is false. // // FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except // that they will also abort the current function on failure. People // usually want the fail-fast behavior of FAIL and ASSERT_*, but those // writing data-driven tests often find themselves using ADD_FAILURE // and EXPECT_* more. // Generates a nonfatal failure with a generic message. #define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") // Generates a nonfatal failure at the given source file location with // a generic message. #define ADD_FAILURE_AT(file, line) \ GTEST_MESSAGE_AT_(file, line, "Failed", \ ::testing::TestPartResult::kNonFatalFailure) // Generates a fatal failure with a generic message. #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") // Like GTEST_FAIL(), but at the given source file location. #define GTEST_FAIL_AT(file, line) \ GTEST_MESSAGE_AT_(file, line, "Failed", \ ::testing::TestPartResult::kFatalFailure) // Define this macro to 1 to omit the definition of FAIL(), which is a // generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_FAIL # define FAIL() GTEST_FAIL() #endif // Generates a success with a generic message. #define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") // Define this macro to 1 to omit the definition of SUCCEED(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_SUCCEED # define SUCCEED() GTEST_SUCCEED() #endif // Macros for testing exceptions. // // * {ASSERT|EXPECT}_THROW(statement, expected_exception): // Tests that the statement throws the expected exception. // * {ASSERT|EXPECT}_NO_THROW(statement): // Tests that the statement doesn't throw any exception. // * {ASSERT|EXPECT}_ANY_THROW(statement): // Tests that the statement throws an exception. #define EXPECT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) #define EXPECT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define EXPECT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) #define ASSERT_THROW(statement, expected_exception) \ GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) #define ASSERT_NO_THROW(statement) \ GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) #define ASSERT_ANY_THROW(statement) \ GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) // Boolean assertions. Condition can be either a Boolean expression or an // AssertionResult. For more information on how to use AssertionResult with // these macros see comments on that class. #define EXPECT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_NONFATAL_FAILURE_) #define EXPECT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_NONFATAL_FAILURE_) #define ASSERT_TRUE(condition) \ GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ GTEST_FATAL_FAILURE_) #define ASSERT_FALSE(condition) \ GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ GTEST_FATAL_FAILURE_) // Macros for testing equalities and inequalities. // // * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2 // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 // * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 // * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 // * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 // * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 // // When they are not, Google Test prints both the tested expressions and // their actual values. The values must be compatible built-in types, // or you will get a compiler error. By "compatible" we mean that the // values can be compared by the respective operator. // // Note: // // 1. It is possible to make a user-defined type work with // {ASSERT|EXPECT}_??(), but that requires overloading the // comparison operators and is thus discouraged by the Google C++ // Usage Guide. Therefore, you are advised to use the // {ASSERT|EXPECT}_TRUE() macro to assert that two objects are // equal. // // 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on // pointers (in particular, C strings). Therefore, if you use it // with two C strings, you are testing how their locations in memory // are related, not how their content is related. To compare two C // strings by content, use {ASSERT|EXPECT}_STR*(). // // 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to // {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you // what the actual value is when it fails, and similarly for the // other comparisons. // // 4. Do not depend on the order in which {ASSERT|EXPECT}_??() // evaluate their arguments, which is undefined. // // 5. These macros evaluate their arguments exactly once. // // Examples: // // EXPECT_NE(Foo(), 5); // EXPECT_EQ(a_pointer, NULL); // ASSERT_LT(i, array_size); // ASSERT_GT(records.size(), 0) << "There is no record left."; #define EXPECT_EQ(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) #define EXPECT_NE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) #define EXPECT_LE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define EXPECT_LT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define EXPECT_GE(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define EXPECT_GT(val1, val2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) #define GTEST_ASSERT_EQ(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) #define GTEST_ASSERT_NE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) #define GTEST_ASSERT_LE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) #define GTEST_ASSERT_LT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) #define GTEST_ASSERT_GE(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) #define GTEST_ASSERT_GT(val1, val2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) // Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of // ASSERT_XY(), which clashes with some users' own code. #if !GTEST_DONT_DEFINE_ASSERT_EQ # define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_NE # define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_LE # define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_LT # define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_GE # define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2) #endif #if !GTEST_DONT_DEFINE_ASSERT_GT # define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2) #endif // C-string Comparisons. All tests treat NULL and any non-NULL string // as different. Two NULLs are equal. // // * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 // * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 // * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case // * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case // // For wide or narrow string objects, you can use the // {ASSERT|EXPECT}_??() macros. // // Don't depend on the order in which the arguments are evaluated, // which is undefined. // // These macros evaluate their arguments exactly once. #define EXPECT_STREQ(s1, s2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) #define EXPECT_STRNE(s1, s2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define EXPECT_STRCASEEQ(s1, s2) \ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) #define EXPECT_STRCASENE(s1, s2)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) #define ASSERT_STREQ(s1, s2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) #define ASSERT_STRNE(s1, s2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) #define ASSERT_STRCASEEQ(s1, s2) \ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) #define ASSERT_STRCASENE(s1, s2)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) // Macros for comparing floating-point numbers. // // * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2): // Tests that two float values are almost equal. // * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2): // Tests that two double values are almost equal. // * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): // Tests that v1 and v2 are within the given distance to each other. // // Google Test uses ULP-based comparison to automatically pick a default // error bound that is appropriate for the operands. See the // FloatingPoint template class in gtest-internal.h if you are // interested in the implementation details. #define EXPECT_FLOAT_EQ(val1, val2)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ val1, val2) #define EXPECT_DOUBLE_EQ(val1, val2)\ EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ val1, val2) #define ASSERT_FLOAT_EQ(val1, val2)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ val1, val2) #define ASSERT_DOUBLE_EQ(val1, val2)\ ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ val1, val2) #define EXPECT_NEAR(val1, val2, abs_error)\ EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) #define ASSERT_NEAR(val1, val2, abs_error)\ ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ val1, val2, abs_error) // These predicate format functions work on floating-point values, and // can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. // // EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2); GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2); #if GTEST_OS_WINDOWS // Macros that test for HRESULT failure and success, these are only useful // on Windows, and rely on Windows SDK macros and APIs to compile. // // * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) // // When expr unexpectedly fails or succeeds, Google Test prints the // expected result and the actual result with both a human-readable // string representation of the error, if available, as well as the // hex result code. # define EXPECT_HRESULT_SUCCEEDED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) # define ASSERT_HRESULT_SUCCEEDED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) # define EXPECT_HRESULT_FAILED(expr) \ EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) # define ASSERT_HRESULT_FAILED(expr) \ ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) #endif // GTEST_OS_WINDOWS // Macros that execute statement and check that it doesn't generate new fatal // failures in the current thread. // // * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); // // Examples: // // EXPECT_NO_FATAL_FAILURE(Process()); // ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; // #define ASSERT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) #define EXPECT_NO_FATAL_FAILURE(statement) \ GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) // Causes a trace (including the given source file path and line number, // and the given message) to be included in every test failure message generated // by code in the scope of the lifetime of an instance of this class. The effect // is undone with the destruction of the instance. // // The message argument can be anything streamable to std::ostream. // // Example: // testing::ScopedTrace trace("file.cc", 123, "message"); // class GTEST_API_ ScopedTrace { public: // The c'tor pushes the given source file location and message onto // a trace stack maintained by Google Test. // Template version. Uses Message() to convert the values into strings. // Slow, but flexible. template ScopedTrace(const char* file, int line, const T& message) { PushTrace(file, line, (Message() << message).GetString()); } // Optimize for some known types. ScopedTrace(const char* file, int line, const char* message) { PushTrace(file, line, message ? message : "(null)"); } ScopedTrace(const char* file, int line, const std::string& message) { PushTrace(file, line, message); } // The d'tor pops the info pushed by the c'tor. // // Note that the d'tor is not virtual in order to be efficient. // Don't inherit from ScopedTrace! ~ScopedTrace(); private: void PushTrace(const char* file, int line, std::string message); GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); } GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its // c'tor and d'tor. Therefore it doesn't // need to be used otherwise. // Causes a trace (including the source file path, the current line // number, and the given message) to be included in every test failure // message generated by code in the current scope. The effect is // undone when the control leaves the current scope. // // The message argument can be anything streamable to std::ostream. // // In the implementation, we include the current line number as part // of the dummy variable name, thus allowing multiple SCOPED_TRACE()s // to appear in the same block - as long as they are on different // lines. // // Assuming that each thread maintains its own stack of traces. // Therefore, a SCOPED_TRACE() would (correctly) only affect the // assertions in its own thread. #define SCOPED_TRACE(message) \ ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ __FILE__, __LINE__, (message)) // Compile-time assertion for type equality. // StaticAssertTypeEq() compiles if and only if type1 and type2 // are the same type. The value it returns is not interesting. // // Instead of making StaticAssertTypeEq a class template, we make it a // function template that invokes a helper class template. This // prevents a user from misusing StaticAssertTypeEq by // defining objects of that type. // // CAVEAT: // // When used inside a method of a class template, // StaticAssertTypeEq() is effective ONLY IF the method is // instantiated. For example, given: // // template class Foo { // public: // void Bar() { testing::StaticAssertTypeEq(); } // }; // // the code: // // void Test1() { Foo foo; } // // will NOT generate a compiler error, as Foo::Bar() is never // actually instantiated. Instead, you need: // // void Test2() { Foo foo; foo.Bar(); } // // to cause a compiler error. template constexpr bool StaticAssertTypeEq() noexcept { static_assert(std::is_same::value, "type1 and type2 are not the same type"); return true; } // Defines a test. // // The first parameter is the name of the test suite, and the second // parameter is the name of the test within the test suite. // // The convention is to end the test suite name with "Test". For // example, a test suite for the Foo class can be named FooTest. // // Test code should appear between braces after an invocation of // this macro. Example: // // TEST(FooTest, InitializesCorrectly) { // Foo foo; // EXPECT_TRUE(foo.StatusIsOK()); // } // Note that we call GetTestTypeId() instead of GetTypeId< // ::testing::Test>() here to get the type ID of testing::Test. This // is to work around a suspected linker bug when using Google Test as // a framework on Mac OS X. The bug causes GetTypeId< // ::testing::Test>() to return different values depending on whether // the call is from the Google Test framework itself or from user test // code. GetTestTypeId() is guaranteed to always return the same // value, as it always calls GetTypeId<>() from the Google Test // framework. #define GTEST_TEST(test_suite_name, test_name) \ GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \ ::testing::internal::GetTestTypeId()) // Define this macro to 1 to omit the definition of TEST(), which // is a generic name and clashes with some other libraries. #if !GTEST_DONT_DEFINE_TEST #define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name) #endif // Defines a test that uses a test fixture. // // The first parameter is the name of the test fixture class, which // also doubles as the test suite name. The second parameter is the // name of the test within the test suite. // // A test fixture class must be declared earlier. The user should put // the test code between braces after using this macro. Example: // // class FooTest : public testing::Test { // protected: // void SetUp() override { b_.AddElement(3); } // // Foo a_; // Foo b_; // }; // // TEST_F(FooTest, InitializesCorrectly) { // EXPECT_TRUE(a_.StatusIsOK()); // } // // TEST_F(FooTest, ReturnsElementCountCorrectly) { // EXPECT_EQ(a_.size(), 0); // EXPECT_EQ(b_.size(), 1); // } // // GOOGLETEST_CM0011 DO NOT DELETE #define TEST_F(test_fixture, test_name)\ GTEST_TEST_(test_fixture, test_name, test_fixture, \ ::testing::internal::GetTypeId()) // Returns a path to temporary directory. // Tries to determine an appropriate directory for the platform. GTEST_API_ std::string TempDir(); #ifdef _MSC_VER # pragma warning(pop) #endif // Dynamically registers a test with the framework. // // This is an advanced API only to be used when the `TEST` macros are // insufficient. The macros should be preferred when possible, as they avoid // most of the complexity of calling this function. // // The `factory` argument is a factory callable (move-constructible) object or // function pointer that creates a new instance of the Test object. It // handles ownership to the caller. The signature of the callable is // `Fixture*()`, where `Fixture` is the test fixture class for the test. All // tests registered with the same `test_suite_name` must return the same // fixture type. This is checked at runtime. // // The framework will infer the fixture class from the factory and will call // the `SetUpTestSuite` and `TearDownTestSuite` for it. // // Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is // undefined. // // Use case example: // // class MyFixture : public ::testing::Test { // public: // // All of these optional, just like in regular macro usage. // static void SetUpTestSuite() { ... } // static void TearDownTestSuite() { ... } // void SetUp() override { ... } // void TearDown() override { ... } // }; // // class MyTest : public MyFixture { // public: // explicit MyTest(int data) : data_(data) {} // void TestBody() override { ... } // // private: // int data_; // }; // // void RegisterMyTests(const std::vector& values) { // for (int v : values) { // ::testing::RegisterTest( // "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr, // std::to_string(v).c_str(), // __FILE__, __LINE__, // // Important to use the fixture type as the return type here. // [=]() -> MyFixture* { return new MyTest(v); }); // } // } // ... // int main(int argc, char** argv) { // std::vector values_to_test = LoadValuesFromConfig(); // RegisterMyTests(values_to_test); // ... // return RUN_ALL_TESTS(); // } // template TestInfo* RegisterTest(const char* test_suite_name, const char* test_name, const char* type_param, const char* value_param, const char* file, int line, Factory factory) { using TestT = typename std::remove_pointer::type; class FactoryImpl : public internal::TestFactoryBase { public: explicit FactoryImpl(Factory f) : factory_(std::move(f)) {} Test* CreateTest() override { return factory_(); } private: Factory factory_; }; return internal::MakeAndRegisterTestInfo( test_suite_name, test_name, type_param, value_param, internal::CodeLocation(file, line), internal::GetTypeId(), internal::SuiteApiResolver::GetSetUpCaseOrSuite(file, line), internal::SuiteApiResolver::GetTearDownCaseOrSuite(file, line), new FactoryImpl{std::move(factory)}); } } // namespace testing // Use this function in main() to run all tests. It returns 0 if all // tests are successful, or 1 otherwise. // // RUN_ALL_TESTS() should be invoked after the command line has been // parsed by InitGoogleTest(). // // This function was formerly a macro; thus, it is in the global // namespace and has an all-caps name. int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_; inline int RUN_ALL_TESTS() { return ::testing::UnitTest::GetInstance()->Run(); } GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 #endif // GTEST_INCLUDE_GTEST_GTEST_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/0000775000175000017500000000000013553267757017105 500000000000000dvisvgm-2.8.1/tests/gtest/include/gtest/internal/custom/0000775000175000017500000000000013510660062020372 500000000000000dvisvgm-2.8.1/tests/gtest/include/gtest/internal/custom/gtest-port.h0000664000175000017500000000350213510660062022573 00000000000000// Copyright 2015, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Injection point for custom user configurations. See README for details // // ** Custom implementation starts here ** #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/custom/gtest.h0000664000175000017500000000346313510660062021617 00000000000000// Copyright 2015, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Injection point for custom user configurations. See README for details // // ** Custom implementation starts here ** #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/custom/gtest-printers.h0000664000175000017500000000403713510660062023461 00000000000000// Copyright 2015, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // This file provides an injection point for custom printers in a local // installation of gTest. // It will be included from gtest-printers.h and the overrides in this file // will be visible to everyone. // // Injection point for custom user configurations. See README for details // // ** Custom implementation starts here ** #ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-port.h0000664000175000017500000023321513553267757021314 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Low-level types and utilities for porting Google Test to various // platforms. All macros ending with _ and symbols defined in an // internal namespace are subject to change without notice. Code // outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't // end with _ are part of Google Test's public API and can be used by // code outside Google Test. // // This file is fundamental to Google Test. All other Google Test source // files are expected to #include this. Therefore, it cannot #include // any other Google Test header. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ // Environment-describing macros // ----------------------------- // // Google Test can be used in many different environments. Macros in // this section tell Google Test what kind of environment it is being // used in, such that Google Test can provide environment-specific // features and implementations. // // Google Test tries to automatically detect the properties of its // environment, so users usually don't need to worry about these // macros. However, the automatic detection is not perfect. // Sometimes it's necessary for a user to define some of the following // macros in the build script to override Google Test's decisions. // // If the user doesn't define a macro in the list, Google Test will // provide a default definition. After this header is #included, all // macros in this list will be defined to either 1 or 0. // // Notes to maintainers: // - Each macro here is a user-tweakable knob; do not grow the list // lightly. // - Use #if to key off these macros. Don't use #ifdef or "#if // defined(...)", which will not work as these macros are ALWAYS // defined. // // GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) // is/isn't available. // GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions // are enabled. // GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular // expressions are/aren't available. // GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that // is/isn't available. // GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't // enabled. // GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that // std::wstring does/doesn't work (Google Test can // be used where std::wstring is unavailable). // GTEST_HAS_SEH - Define it to 1/0 to indicate whether the // compiler supports Microsoft's "Structured // Exception Handling". // GTEST_HAS_STREAM_REDIRECTION // - Define it to 1/0 to indicate whether the // platform supports I/O stream redirection using // dup() and dup2(). // GTEST_LINKED_AS_SHARED_LIBRARY // - Define to 1 when compiling tests that use // Google Test as a shared library (known as // DLL on Windows). // GTEST_CREATE_SHARED_LIBRARY // - Define to 1 when compiling Google Test itself // as a shared library. // GTEST_DEFAULT_DEATH_TEST_STYLE // - The default value of --gtest_death_test_style. // The legacy default has been "fast" in the open // source version since 2008. The recommended value // is "threadsafe", and can be set in // custom/gtest-port.h. // Platform-indicating macros // -------------------------- // // Macros indicating the platform on which Google Test is being used // (a macro is defined to 1 if compiled on the given platform; // otherwise UNDEFINED -- it's never defined to 0.). Google Test // defines these macros automatically. Code outside Google Test MUST // NOT define them. // // GTEST_OS_AIX - IBM AIX // GTEST_OS_CYGWIN - Cygwin // GTEST_OS_DRAGONFLY - DragonFlyBSD // GTEST_OS_FREEBSD - FreeBSD // GTEST_OS_FUCHSIA - Fuchsia // GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD // GTEST_OS_HAIKU - Haiku // GTEST_OS_HPUX - HP-UX // GTEST_OS_LINUX - Linux // GTEST_OS_LINUX_ANDROID - Google Android // GTEST_OS_MAC - Mac OS X // GTEST_OS_IOS - iOS // GTEST_OS_NACL - Google Native Client (NaCl) // GTEST_OS_NETBSD - NetBSD // GTEST_OS_OPENBSD - OpenBSD // GTEST_OS_OS2 - OS/2 // GTEST_OS_QNX - QNX // GTEST_OS_SOLARIS - Sun Solaris // GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) // GTEST_OS_WINDOWS_DESKTOP - Windows Desktop // GTEST_OS_WINDOWS_MINGW - MinGW // GTEST_OS_WINDOWS_MOBILE - Windows Mobile // GTEST_OS_WINDOWS_PHONE - Windows Phone // GTEST_OS_WINDOWS_RT - Windows Store App/WinRT // GTEST_OS_ZOS - z/OS // // Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the // most stable support. Since core members of the Google Test project // don't have access to other platforms, support for them may be less // stable. If you notice any problems on your platform, please notify // googletestframework@googlegroups.com (patches for fixing them are // even more welcome!). // // It is possible that none of the GTEST_OS_* macros are defined. // Feature-indicating macros // ------------------------- // // Macros indicating which Google Test features are available (a macro // is defined to 1 if the corresponding feature is supported; // otherwise UNDEFINED -- it's never defined to 0.). Google Test // defines these macros automatically. Code outside Google Test MUST // NOT define them. // // These macros are public so that portable tests can be written. // Such tests typically surround code using a feature with an #if // which controls that code. For example: // // #if GTEST_HAS_DEATH_TEST // EXPECT_DEATH(DoSomethingDeadly()); // #endif // // GTEST_HAS_DEATH_TEST - death tests // GTEST_HAS_TYPED_TEST - typed tests // GTEST_HAS_TYPED_TEST_P - type-parameterized tests // GTEST_IS_THREADSAFE - Google Test is thread-safe. // GOOGLETEST_CM0007 DO NOT DELETE // GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with // GTEST_HAS_POSIX_RE (see above) which users can // define themselves. // GTEST_USES_SIMPLE_RE - our own simple regex is used; // the above RE\b(s) are mutually exclusive. // Misc public macros // ------------------ // // GTEST_FLAG(flag_name) - references the variable corresponding to // the given Google Test flag. // Internal utilities // ------------------ // // The following macros and utilities are for Google Test's INTERNAL // use only. Code outside Google Test MUST NOT USE THEM DIRECTLY. // // Macros for basic C++ coding: // GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. // GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a // variable don't have to be used. // GTEST_DISALLOW_ASSIGN_ - disables operator=. // GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. // GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. // GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is // suppressed (constant conditional). // GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127 // is suppressed. // // Synchronization: // Mutex, MutexLock, ThreadLocal, GetThreadCount() // - synchronization primitives. // // Regular expressions: // RE - a simple regular expression class using the POSIX // Extended Regular Expression syntax on UNIX-like platforms // GOOGLETEST_CM0008 DO NOT DELETE // or a reduced regular exception syntax on other // platforms, including Windows. // Logging: // GTEST_LOG_() - logs messages at the specified severity level. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. // // Stdout and stderr capturing: // CaptureStdout() - starts capturing stdout. // GetCapturedStdout() - stops capturing stdout and returns the captured // string. // CaptureStderr() - starts capturing stderr. // GetCapturedStderr() - stops capturing stderr and returns the captured // string. // // Integer types: // TypeWithSize - maps an integer to a int type. // Int32, UInt32, Int64, UInt64, TimeInMillis // - integers of known sizes. // BiggestInt - the biggest signed integer type. // // Command-line utilities: // GTEST_DECLARE_*() - declares a flag. // GTEST_DEFINE_*() - defines a flag. // GetInjectableArgvs() - returns the command line as a vector of strings. // // Environment variable utilities: // GetEnv() - gets the value of an environment variable. // BoolFromGTestEnv() - parses a bool environment variable. // Int32FromGTestEnv() - parses an Int32 environment variable. // StringFromGTestEnv() - parses a string environment variable. // // Deprecation warnings: // GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as // deprecated; calling a marked function // should generate a compiler warning #include // for isspace, etc #include // for ptrdiff_t #include #include #include #include #include #ifndef _WIN32_WCE # include # include #endif // !_WIN32_WCE #if defined __APPLE__ # include # include #endif #include // NOLINT #include // NOLINT #include // NOLINT #include // NOLINT #include #include #include // NOLINT #include "gtest/internal/gtest-port-arch.h" #include "gtest/internal/custom/gtest-port.h" #if !defined(GTEST_DEV_EMAIL_) # define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" # define GTEST_FLAG_PREFIX_ "gtest_" # define GTEST_FLAG_PREFIX_DASH_ "gtest-" # define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" # define GTEST_NAME_ "Google Test" # define GTEST_PROJECT_URL_ "https://github.com/google/googletest/" #endif // !defined(GTEST_DEV_EMAIL_) #if !defined(GTEST_INIT_GOOGLE_TEST_NAME_) # define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest" #endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_) // Determines the version of gcc that is used to compile this. #ifdef __GNUC__ // 40302 means version 4.3.2. # define GTEST_GCC_VER_ \ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) #endif // __GNUC__ // Macros for disabling Microsoft Visual C++ warnings. // // GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385) // /* code that triggers warnings C4800 and C4385 */ // GTEST_DISABLE_MSC_WARNINGS_POP_() #if defined(_MSC_VER) # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \ __pragma(warning(push)) \ __pragma(warning(disable: warnings)) # define GTEST_DISABLE_MSC_WARNINGS_POP_() \ __pragma(warning(pop)) #else // Not all compilers are MSVC # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) # define GTEST_DISABLE_MSC_WARNINGS_POP_() #endif // Clang on Windows does not understand MSVC's pragma warning. // We need clang-specific way to disable function deprecation warning. #ifdef __clang__ # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"") #define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ _Pragma("clang diagnostic pop") #else # define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) # define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ GTEST_DISABLE_MSC_WARNINGS_POP_() #endif // Brings in definitions for functions used in the testing::internal::posix // namespace (read, write, close, chdir, isatty, stat). We do not currently // use them on Windows Mobile. #if GTEST_OS_WINDOWS # if !GTEST_OS_WINDOWS_MOBILE # include # include # endif // In order to avoid having to include , use forward declaration #if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR) // MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two // separate (equivalent) structs, instead of using typedef typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION; #else // Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION. // This assumption is verified by // WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION. typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; #endif #else // This assumes that non-Windows OSes provide unistd.h. For OSes where this // is not the case, we need to include headers that provide the functions // mentioned above. # include # include #endif // GTEST_OS_WINDOWS #if GTEST_OS_LINUX_ANDROID // Used to define __ANDROID_API__ matching the target NDK API level. # include // NOLINT #endif // Defines this to true if and only if Google Test can use POSIX regular // expressions. #ifndef GTEST_HAS_POSIX_RE # if GTEST_OS_LINUX_ANDROID // On Android, is only available starting with Gingerbread. # define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) # else # define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) # endif #endif #if GTEST_USES_PCRE // The appropriate headers have already been included. #elif GTEST_HAS_POSIX_RE // On some platforms, needs someone to define size_t, and // won't compile otherwise. We can #include it here as we already // included , which is guaranteed to define size_t through // . # include // NOLINT # define GTEST_USES_POSIX_RE 1 #elif GTEST_OS_WINDOWS // is not available on Windows. Use our own simple regex // implementation instead. # define GTEST_USES_SIMPLE_RE 1 #else // may not be available on this platform. Use our own // simple regex implementation instead. # define GTEST_USES_SIMPLE_RE 1 #endif // GTEST_USES_PCRE #ifndef GTEST_HAS_EXCEPTIONS // The user didn't tell us whether exceptions are enabled, so we need // to figure it out. # if defined(_MSC_VER) && defined(_CPPUNWIND) // MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__BORLANDC__) // C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS // macro to enable exceptions, so we'll do the same. // Assumes that exceptions are enabled by default. # ifndef _HAS_EXCEPTIONS # define _HAS_EXCEPTIONS 1 # endif // _HAS_EXCEPTIONS # define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS # elif defined(__clang__) // clang defines __EXCEPTIONS if and only if exceptions are enabled before clang // 220714, but if and only if cleanups are enabled after that. In Obj-C++ files, // there can be cleanups for ObjC exceptions which also need cleanups, even if // C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which // checks for C++ exceptions starting at clang r206352, but which checked for // cleanups prior to that. To reliably check for C++ exception availability with // clang, check for // __EXCEPTIONS && __has_feature(cxx_exceptions). # define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions)) # elif defined(__GNUC__) && __EXCEPTIONS // gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__SUNPRO_CC) // Sun Pro CC supports exceptions. However, there is no compile-time way of // detecting whether they are enabled or not. Therefore, we assume that // they are enabled unless the user tells us otherwise. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__IBMCPP__) && __EXCEPTIONS // xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled. # define GTEST_HAS_EXCEPTIONS 1 # elif defined(__HP_aCC) // Exception handling is in effect by default in HP aCC compiler. It has to // be turned of by +noeh compiler option if desired. # define GTEST_HAS_EXCEPTIONS 1 # else // For other compilers, we assume exceptions are disabled to be // conservative. # define GTEST_HAS_EXCEPTIONS 0 # endif // defined(_MSC_VER) || defined(__BORLANDC__) #endif // GTEST_HAS_EXCEPTIONS #if !defined(GTEST_HAS_STD_STRING) // Even though we don't use this macro any longer, we keep it in case // some clients still depend on it. # define GTEST_HAS_STD_STRING 1 #elif !GTEST_HAS_STD_STRING // The user told us that ::std::string isn't available. # error "::std::string isn't available." #endif // !defined(GTEST_HAS_STD_STRING) #ifndef GTEST_HAS_STD_WSTRING // The user didn't tell us whether ::std::wstring is available, so we need // to figure it out. // Cygwin 1.7 and below doesn't support ::std::wstring. // Solaris' libc++ doesn't support it either. Android has // no support for it at least as recent as Froyo (2.2). #define GTEST_HAS_STD_WSTRING \ (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ GTEST_OS_HAIKU)) #endif // GTEST_HAS_STD_WSTRING // Determines whether RTTI is available. #ifndef GTEST_HAS_RTTI // The user didn't tell us whether RTTI is enabled, so we need to // figure it out. # ifdef _MSC_VER #ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled. # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif // Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is // enabled. # elif defined(__GNUC__) # ifdef __GXX_RTTI // When building against STLport with the Android NDK and with // -frtti -fno-exceptions, the build fails at link time with undefined // references to __cxa_bad_typeid. Note sure if STL or toolchain bug, // so disable RTTI when detected. # if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ !defined(__EXCEPTIONS) # define GTEST_HAS_RTTI 0 # else # define GTEST_HAS_RTTI 1 # endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS # else # define GTEST_HAS_RTTI 0 # endif // __GXX_RTTI // Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends // using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the // first version with C++ support. # elif defined(__clang__) # define GTEST_HAS_RTTI __has_feature(cxx_rtti) // Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if // both the typeid and dynamic_cast features are present. # elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) # ifdef __RTTI_ALL__ # define GTEST_HAS_RTTI 1 # else # define GTEST_HAS_RTTI 0 # endif # else // For all other compilers, we assume RTTI is enabled. # define GTEST_HAS_RTTI 1 # endif // _MSC_VER #endif // GTEST_HAS_RTTI // It's this header's responsibility to #include when RTTI // is enabled. #if GTEST_HAS_RTTI # include #endif // Determines whether Google Test can use the pthreads library. #ifndef GTEST_HAS_PTHREAD // The user didn't tell us explicitly, so we make reasonable assumptions about // which platforms have pthreads support. // // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 // to your compiler flags. #define GTEST_HAS_PTHREAD \ (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \ GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \ GTEST_OS_HAIKU) #endif // GTEST_HAS_PTHREAD #if GTEST_HAS_PTHREAD // gtest-port.h guarantees to #include when GTEST_HAS_PTHREAD is // true. # include // NOLINT // For timespec and nanosleep, used below. # include // NOLINT #endif // Determines whether clone(2) is supported. // Usually it will only be available on Linux, excluding // Linux on the Itanium architecture. // Also see http://linux.die.net/man/2/clone. #ifndef GTEST_HAS_CLONE // The user didn't tell us, so we need to figure it out. # if GTEST_OS_LINUX && !defined(__ia64__) # if GTEST_OS_LINUX_ANDROID // On Android, clone() became available at different API levels for each 32-bit // architecture. # if defined(__LP64__) || \ (defined(__arm__) && __ANDROID_API__ >= 9) || \ (defined(__mips__) && __ANDROID_API__ >= 12) || \ (defined(__i386__) && __ANDROID_API__ >= 17) # define GTEST_HAS_CLONE 1 # else # define GTEST_HAS_CLONE 0 # endif # else # define GTEST_HAS_CLONE 1 # endif # else # define GTEST_HAS_CLONE 0 # endif // GTEST_OS_LINUX && !defined(__ia64__) #endif // GTEST_HAS_CLONE // Determines whether to support stream redirection. This is used to test // output correctness and to implement death tests. #ifndef GTEST_HAS_STREAM_REDIRECTION // By default, we assume that stream redirection is supported on all // platforms except known mobile ones. # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT # define GTEST_HAS_STREAM_REDIRECTION 0 # else # define GTEST_HAS_STREAM_REDIRECTION 1 # endif // !GTEST_OS_WINDOWS_MOBILE #endif // GTEST_HAS_STREAM_REDIRECTION // Determines whether to support death tests. // pops up a dialog window that cannot be suppressed programmatically. #if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ (GTEST_OS_MAC && !GTEST_OS_IOS) || \ (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \ GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \ GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU) # define GTEST_HAS_DEATH_TEST 1 #endif // Determines whether to support type-driven tests. // Typed tests need and variadic macros, which GCC, VC++ 8.0, // Sun Pro CC, IBM Visual Age, and HP aCC support. #if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \ defined(__IBMCPP__) || defined(__HP_aCC) # define GTEST_HAS_TYPED_TEST 1 # define GTEST_HAS_TYPED_TEST_P 1 #endif // Determines whether the system compiler uses UTF-16 for encoding wide strings. #define GTEST_WIDE_STRING_USES_UTF16_ \ (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2) // Determines whether test results can be streamed to a socket. #if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \ GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD # define GTEST_CAN_STREAM_RESULTS_ 1 #endif // Defines some utility macros. // The GNU compiler emits a warning if nested "if" statements are followed by // an "else" statement and braces are not used to explicitly disambiguate the // "else" binding. This leads to problems with code like: // // if (gate) // ASSERT_*(condition) << "Some message"; // // The "switch (0) case 0:" idiom is used to suppress this. #ifdef __INTEL_COMPILER # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ #else # define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT #endif // Use this annotation at the end of a struct/class definition to // prevent the compiler from optimizing away instances that are never // used. This is useful when all interesting logic happens inside the // c'tor and / or d'tor. Example: // // struct Foo { // Foo() { ... } // } GTEST_ATTRIBUTE_UNUSED_; // // Also use it after a variable or parameter declaration to tell the // compiler the variable/parameter does not have to be used. #if defined(__GNUC__) && !defined(COMPILER_ICC) # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) #elif defined(__clang__) # if __has_attribute(unused) # define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) # endif #endif #ifndef GTEST_ATTRIBUTE_UNUSED_ # define GTEST_ATTRIBUTE_UNUSED_ #endif // Use this annotation before a function that takes a printf format string. #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC) # if defined(__MINGW_PRINTF_FORMAT) // MinGW has two different printf implementations. Ensure the format macro // matches the selected implementation. See // https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/. # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \ first_to_check))) # else # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ __attribute__((__format__(__printf__, string_index, first_to_check))) # endif #else # define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) #endif // A macro to disallow operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_ASSIGN_(type) \ void operator=(type const &) = delete // A macro to disallow copy constructor and operator= // This should be used in the private: declarations for a class. #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \ type(type const &) = delete; \ GTEST_DISALLOW_ASSIGN_(type) // Tell the compiler to warn about unused return values for functions declared // with this macro. The macro should be used on function declarations // following the argument list: // // Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; #if defined(__GNUC__) && !defined(COMPILER_ICC) # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) #else # define GTEST_MUST_USE_RESULT_ #endif // __GNUC__ && !COMPILER_ICC // MS C++ compiler emits warning when a conditional expression is compile time // constant. In some contexts this warning is false positive and needs to be // suppressed. Use the following two macros in such cases: // // GTEST_INTENTIONAL_CONST_COND_PUSH_() // while (true) { // GTEST_INTENTIONAL_CONST_COND_POP_() // } # define GTEST_INTENTIONAL_CONST_COND_PUSH_() \ GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127) # define GTEST_INTENTIONAL_CONST_COND_POP_() \ GTEST_DISABLE_MSC_WARNINGS_POP_() // Determine whether the compiler supports Microsoft's Structured Exception // Handling. This is supported by several Windows compilers but generally // does not exist on any other system. #ifndef GTEST_HAS_SEH // The user didn't tell us, so we need to figure it out. # if defined(_MSC_VER) || defined(__BORLANDC__) // These two compilers are known to support SEH. # define GTEST_HAS_SEH 1 # else // Assume no SEH. # define GTEST_HAS_SEH 0 # endif #endif // GTEST_HAS_SEH #ifndef GTEST_IS_THREADSAFE #define GTEST_IS_THREADSAFE \ (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \ (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \ GTEST_HAS_PTHREAD) #endif // GTEST_IS_THREADSAFE // GTEST_API_ qualifies all symbols that must be exported. The definitions below // are guarded by #ifndef to give embedders a chance to define GTEST_API_ in // gtest/internal/custom/gtest-port.h #ifndef GTEST_API_ #ifdef _MSC_VER # if GTEST_LINKED_AS_SHARED_LIBRARY # define GTEST_API_ __declspec(dllimport) # elif GTEST_CREATE_SHARED_LIBRARY # define GTEST_API_ __declspec(dllexport) # endif #elif __GNUC__ >= 4 || defined(__clang__) # define GTEST_API_ __attribute__((visibility ("default"))) #endif // _MSC_VER #endif // GTEST_API_ #ifndef GTEST_API_ # define GTEST_API_ #endif // GTEST_API_ #ifndef GTEST_DEFAULT_DEATH_TEST_STYLE # define GTEST_DEFAULT_DEATH_TEST_STYLE "fast" #endif // GTEST_DEFAULT_DEATH_TEST_STYLE #ifdef __GNUC__ // Ask the compiler to never inline a given function. # define GTEST_NO_INLINE_ __attribute__((noinline)) #else # define GTEST_NO_INLINE_ #endif // _LIBCPP_VERSION is defined by the libc++ library from the LLVM project. #if !defined(GTEST_HAS_CXXABI_H_) # if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) # define GTEST_HAS_CXXABI_H_ 1 # else # define GTEST_HAS_CXXABI_H_ 0 # endif #endif // A function level attribute to disable checking for use of uninitialized // memory when built with MemorySanitizer. #if defined(__clang__) # if __has_feature(memory_sanitizer) # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \ __attribute__((no_sanitize_memory)) # else # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ # endif // __has_feature(memory_sanitizer) #else # define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ #endif // __clang__ // A function level attribute to disable AddressSanitizer instrumentation. #if defined(__clang__) # if __has_feature(address_sanitizer) # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ __attribute__((no_sanitize_address)) # else # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ # endif // __has_feature(address_sanitizer) #else # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ #endif // __clang__ // A function level attribute to disable HWAddressSanitizer instrumentation. #if defined(__clang__) # if __has_feature(hwaddress_sanitizer) # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \ __attribute__((no_sanitize("hwaddress"))) # else # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ # endif // __has_feature(hwaddress_sanitizer) #else # define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ #endif // __clang__ // A function level attribute to disable ThreadSanitizer instrumentation. #if defined(__clang__) # if __has_feature(thread_sanitizer) # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \ __attribute__((no_sanitize_thread)) # else # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ # endif // __has_feature(thread_sanitizer) #else # define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ #endif // __clang__ namespace testing { class Message; // Legacy imports for backwards compatibility. // New code should use std:: names directly. using std::get; using std::make_tuple; using std::tuple; using std::tuple_element; using std::tuple_size; namespace internal { // A secret type that Google Test users don't know about. It has no // definition on purpose. Therefore it's impossible to create a // Secret object, which is what we want. class Secret; // The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile // time expression is true (in new code, use static_assert instead). For // example, you could use it to verify the size of a static array: // // GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES, // names_incorrect_size); // // The second argument to the macro must be a valid C++ identifier. If the // expression is false, compiler will issue an error containing this identifier. #define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) // Evaluates to the number of elements in 'array'. #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0])) // A helper for suppressing warnings on constant condition. It just // returns 'condition'. GTEST_API_ bool IsTrue(bool condition); // Defines RE. #if GTEST_USES_PCRE // if used, PCRE is injected by custom/gtest-port.h #elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE // A simple C++ wrapper for . It uses the POSIX Extended // Regular Expression syntax. class GTEST_API_ RE { public: // A copy constructor is required by the Standard to initialize object // references from r-values. RE(const RE& other) { Init(other.pattern()); } // Constructs an RE from a string. RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT RE(const char* regex) { Init(regex); } // NOLINT ~RE(); // Returns the string representation of the regex. const char* pattern() const { return pattern_; } // FullMatch(str, re) returns true if and only if regular expression re // matches the entire str. // PartialMatch(str, re) returns true if and only if regular expression re // matches a substring of str (including str itself). static bool FullMatch(const ::std::string& str, const RE& re) { return FullMatch(str.c_str(), re); } static bool PartialMatch(const ::std::string& str, const RE& re) { return PartialMatch(str.c_str(), re); } static bool FullMatch(const char* str, const RE& re); static bool PartialMatch(const char* str, const RE& re); private: void Init(const char* regex); const char* pattern_; bool is_valid_; # if GTEST_USES_POSIX_RE regex_t full_regex_; // For FullMatch(). regex_t partial_regex_; // For PartialMatch(). # else // GTEST_USES_SIMPLE_RE const char* full_pattern_; // For FullMatch(); # endif GTEST_DISALLOW_ASSIGN_(RE); }; #endif // GTEST_USES_PCRE // Formats a source file path and a line number as they would appear // in an error message from the compiler used to compile this code. GTEST_API_ ::std::string FormatFileLocation(const char* file, int line); // Formats a file location for compiler-independent XML output. // Although this function is not platform dependent, we put it next to // FormatFileLocation in order to contrast the two functions. GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, int line); // Defines logging utilities: // GTEST_LOG_(severity) - logs messages at the specified severity level. The // message itself is streamed into the macro. // LogToStderr() - directs all log messages to stderr. // FlushInfoLog() - flushes informational log messages. enum GTestLogSeverity { GTEST_INFO, GTEST_WARNING, GTEST_ERROR, GTEST_FATAL }; // Formats log entry severity, provides a stream object for streaming the // log message, and terminates the message with a newline when going out of // scope. class GTEST_API_ GTestLog { public: GTestLog(GTestLogSeverity severity, const char* file, int line); // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. ~GTestLog(); ::std::ostream& GetStream() { return ::std::cerr; } private: const GTestLogSeverity severity_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); }; #if !defined(GTEST_LOG_) # define GTEST_LOG_(severity) \ ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ __FILE__, __LINE__).GetStream() inline void LogToStderr() {} inline void FlushInfoLog() { fflush(nullptr); } #endif // !defined(GTEST_LOG_) #if !defined(GTEST_CHECK_) // INTERNAL IMPLEMENTATION - DO NOT USE. // // GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition // is not satisfied. // Synopsys: // GTEST_CHECK_(boolean_condition); // or // GTEST_CHECK_(boolean_condition) << "Additional message"; // // This checks the condition and if the condition is not satisfied // it prints message about the condition violation, including the // condition itself, plus additional message streamed into it, if any, // and then it aborts the program. It aborts the program irrespective of // whether it is built in the debug mode or not. # define GTEST_CHECK_(condition) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::IsTrue(condition)) \ ; \ else \ GTEST_LOG_(FATAL) << "Condition " #condition " failed. " #endif // !defined(GTEST_CHECK_) // An all-mode assert to verify that the given POSIX-style function // call returns 0 (indicating success). Known limitation: this // doesn't expand to a balanced 'if' statement, so enclose the macro // in {} if you need to use it as the only statement in an 'if' // branch. #define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ if (const int gtest_error = (posix_call)) \ GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ << gtest_error // Transforms "T" into "const T&" according to standard reference collapsing // rules (this is only needed as a backport for C++98 compilers that do not // support reference collapsing). Specifically, it transforms: // // char ==> const char& // const char ==> const char& // char& ==> char& // const char& ==> const char& // // Note that the non-const reference will not have "const" added. This is // standard, and necessary so that "T" can always bind to "const T&". template struct ConstRef { typedef const T& type; }; template struct ConstRef { typedef T& type; }; // The argument T must depend on some template parameters. #define GTEST_REFERENCE_TO_CONST_(T) \ typename ::testing::internal::ConstRef::type // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Use ImplicitCast_ as a safe version of static_cast for upcasting in // the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a // const Foo*). When you use ImplicitCast_, the compiler checks that // the cast is safe. Such explicit ImplicitCast_s are necessary in // surprisingly many situations where C++ demands an exact type match // instead of an argument type convertable to a target type. // // The syntax for using ImplicitCast_ is the same as for static_cast: // // ImplicitCast_(expr) // // ImplicitCast_ would have been part of the C++ standard library, // but the proposal was submitted too late. It will probably make // its way into the language in the future. // // This relatively ugly name is intentional. It prevents clashes with // similar functions users may have (e.g., implicit_cast). The internal // namespace alone is not enough because the function can be found by ADL. template inline To ImplicitCast_(To x) { return x; } // When you upcast (that is, cast a pointer from type Foo to type // SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts // always succeed. When you downcast (that is, cast a pointer from // type Foo to type SubclassOfFoo), static_cast<> isn't safe, because // how do you know the pointer is really of type SubclassOfFoo? It // could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, // when you downcast, you should use this macro. In debug mode, we // use dynamic_cast<> to double-check the downcast is legal (we die // if it's not). In normal mode, we do the efficient static_cast<> // instead. Thus, it's important to test in debug mode to make sure // the cast is legal! // This is the only place in the code we should use dynamic_cast<>. // In particular, you SHOULDN'T be using dynamic_cast<> in order to // do RTTI (eg code like this: // if (dynamic_cast(foo)) HandleASubclass1Object(foo); // if (dynamic_cast(foo)) HandleASubclass2Object(foo); // You should design the code some other way not to need this. // // This relatively ugly name is intentional. It prevents clashes with // similar functions users may have (e.g., down_cast). The internal // namespace alone is not enough because the function can be found by ADL. template // use like this: DownCast_(foo); inline To DownCast_(From* f) { // so we only accept pointers // Ensures that To is a sub-type of From *. This test is here only // for compile-time type checking, and has no overhead in an // optimized build at run-time, as it will be optimized away // completely. GTEST_INTENTIONAL_CONST_COND_PUSH_() if (false) { GTEST_INTENTIONAL_CONST_COND_POP_() const To to = nullptr; ::testing::internal::ImplicitCast_(to); } #if GTEST_HAS_RTTI // RTTI: debug mode only! GTEST_CHECK_(f == nullptr || dynamic_cast(f) != nullptr); #endif return static_cast(f); } // Downcasts the pointer of type Base to Derived. // Derived must be a subclass of Base. The parameter MUST // point to a class of type Derived, not any subclass of it. // When RTTI is available, the function performs a runtime // check to enforce this. template Derived* CheckedDowncastToActualType(Base* base) { #if GTEST_HAS_RTTI GTEST_CHECK_(typeid(*base) == typeid(Derived)); #endif #if GTEST_HAS_DOWNCAST_ return ::down_cast(base); #elif GTEST_HAS_RTTI return dynamic_cast(base); // NOLINT #else return static_cast(base); // Poor man's downcast. #endif } #if GTEST_HAS_STREAM_REDIRECTION // Defines the stderr capturer: // CaptureStdout - starts capturing stdout. // GetCapturedStdout - stops capturing stdout and returns the captured string. // CaptureStderr - starts capturing stderr. // GetCapturedStderr - stops capturing stderr and returns the captured string. // GTEST_API_ void CaptureStdout(); GTEST_API_ std::string GetCapturedStdout(); GTEST_API_ void CaptureStderr(); GTEST_API_ std::string GetCapturedStderr(); #endif // GTEST_HAS_STREAM_REDIRECTION // Returns the size (in bytes) of a file. GTEST_API_ size_t GetFileSize(FILE* file); // Reads the entire content of a file as a string. GTEST_API_ std::string ReadEntireFile(FILE* file); // All command line arguments. GTEST_API_ std::vector GetArgvs(); #if GTEST_HAS_DEATH_TEST std::vector GetInjectableArgvs(); // Deprecated: pass the args vector by value instead. void SetInjectableArgvs(const std::vector* new_argvs); void SetInjectableArgvs(const std::vector& new_argvs); void ClearInjectableArgvs(); #endif // GTEST_HAS_DEATH_TEST // Defines synchronization primitives. #if GTEST_IS_THREADSAFE # if GTEST_HAS_PTHREAD // Sleeps for (roughly) n milliseconds. This function is only for testing // Google Test's own constructs. Don't use it in user tests, either // directly or indirectly. inline void SleepMilliseconds(int n) { const timespec time = { 0, // 0 seconds. n * 1000L * 1000L, // And n ms. }; nanosleep(&time, nullptr); } # endif // GTEST_HAS_PTHREAD # if GTEST_HAS_NOTIFICATION_ // Notification has already been imported into the namespace. // Nothing to do here. # elif GTEST_HAS_PTHREAD // Allows a controller thread to pause execution of newly created // threads until notified. Instances of this class must be created // and destroyed in the controller thread. // // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. class Notification { public: Notification() : notified_(false) { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); } ~Notification() { pthread_mutex_destroy(&mutex_); } // Notifies all threads created with this notification to start. Must // be called from the controller thread. void Notify() { pthread_mutex_lock(&mutex_); notified_ = true; pthread_mutex_unlock(&mutex_); } // Blocks until the controller thread notifies. Must be called from a test // thread. void WaitForNotification() { for (;;) { pthread_mutex_lock(&mutex_); const bool notified = notified_; pthread_mutex_unlock(&mutex_); if (notified) break; SleepMilliseconds(10); } } private: pthread_mutex_t mutex_; bool notified_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); }; # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT GTEST_API_ void SleepMilliseconds(int n); // Provides leak-safe Windows kernel handle ownership. // Used in death tests and in threading support. class GTEST_API_ AutoHandle { public: // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to // avoid including in this header file. Including is // undesirable because it defines a lot of symbols and macros that tend to // conflict with client code. This assumption is verified by // WindowsTypesTest.HANDLEIsVoidStar. typedef void* Handle; AutoHandle(); explicit AutoHandle(Handle handle); ~AutoHandle(); Handle Get() const; void Reset(); void Reset(Handle handle); private: // Returns true if and only if the handle is a valid handle object that can be // closed. bool IsCloseable() const; Handle handle_; GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); }; // Allows a controller thread to pause execution of newly created // threads until notified. Instances of this class must be created // and destroyed in the controller thread. // // This class is only for testing Google Test's own constructs. Do not // use it in user tests, either directly or indirectly. class GTEST_API_ Notification { public: Notification(); void Notify(); void WaitForNotification(); private: AutoHandle event_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); }; # endif // GTEST_HAS_NOTIFICATION_ // On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD // defined, but we don't want to use MinGW's pthreads implementation, which // has conformance problems with some versions of the POSIX standard. # if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW // As a C-function, ThreadFuncWithCLinkage cannot be templated itself. // Consequently, it cannot select a correct instantiation of ThreadWithParam // in order to call its Run(). Introducing ThreadWithParamBase as a // non-templated base class for ThreadWithParam allows us to bypass this // problem. class ThreadWithParamBase { public: virtual ~ThreadWithParamBase() {} virtual void Run() = 0; }; // pthread_create() accepts a pointer to a function type with the C linkage. // According to the Standard (7.5/1), function types with different linkages // are different even if they are otherwise identical. Some compilers (for // example, SunStudio) treat them as different types. Since class methods // cannot be defined with C-linkage we need to define a free C-function to // pass into pthread_create(). extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { static_cast(thread)->Run(); return nullptr; } // Helper class for testing Google Test's multi-threading constructs. // To use it, write: // // void ThreadFunc(int param) { /* Do things with param */ } // Notification thread_can_start; // ... // // The thread_can_start parameter is optional; you can supply NULL. // ThreadWithParam thread(&ThreadFunc, 5, &thread_can_start); // thread_can_start.Notify(); // // These classes are only for testing Google Test's own constructs. Do // not use them in user tests, either directly or indirectly. template class ThreadWithParam : public ThreadWithParamBase { public: typedef void UserThreadFunc(T); ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) : func_(func), param_(param), thread_can_start_(thread_can_start), finished_(false) { ThreadWithParamBase* const base = this; // The thread can be created only after all fields except thread_ // have been initialized. GTEST_CHECK_POSIX_SUCCESS_( pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base)); } ~ThreadWithParam() override { Join(); } void Join() { if (!finished_) { GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr)); finished_ = true; } } void Run() override { if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification(); func_(param_); } private: UserThreadFunc* const func_; // User-supplied thread function. const T param_; // User-supplied parameter to the thread function. // When non-NULL, used to block execution until the controller thread // notifies. Notification* const thread_can_start_; bool finished_; // true if and only if we know that the thread function has // finished. pthread_t thread_; // The native thread object. GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); }; # endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD || // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ # if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ // Mutex and ThreadLocal have already been imported into the namespace. // Nothing to do here. # elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT // Mutex implements mutex on Windows platforms. It is used in conjunction // with class MutexLock: // // Mutex mutex; // ... // MutexLock lock(&mutex); // Acquires the mutex and releases it at the // // end of the current scope. // // A static Mutex *must* be defined or declared using one of the following // macros: // GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); // GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); // // (A non-static Mutex is defined/declared in the usual way). class GTEST_API_ Mutex { public: enum MutexType { kStatic = 0, kDynamic = 1 }; // We rely on kStaticMutex being 0 as it is to what the linker initializes // type_ in static mutexes. critical_section_ will be initialized lazily // in ThreadSafeLazyInit(). enum StaticConstructorSelector { kStaticMutex = 0 }; // This constructor intentionally does nothing. It relies on type_ being // statically initialized to 0 (effectively setting it to kStatic) and on // ThreadSafeLazyInit() to lazily initialize the rest of the members. explicit Mutex(StaticConstructorSelector /*dummy*/) {} Mutex(); ~Mutex(); void Lock(); void Unlock(); // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. void AssertHeld(); private: // Initializes owner_thread_id_ and critical_section_ in static mutexes. void ThreadSafeLazyInit(); // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503, // we assume that 0 is an invalid value for thread IDs. unsigned int owner_thread_id_; // For static mutexes, we rely on these members being initialized to zeros // by the linker. MutexType type_; long critical_section_init_phase_; // NOLINT GTEST_CRITICAL_SECTION* critical_section_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); }; # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::Mutex mutex # define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) // We cannot name this class MutexLock because the ctor declaration would // conflict with a macro named MutexLock, which is defined on some // platforms. That macro is used as a defensive measure to prevent against // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than // "MutexLock l(&mu)". Hence the typedef trick below. class GTestMutexLock { public: explicit GTestMutexLock(Mutex* mutex) : mutex_(mutex) { mutex_->Lock(); } ~GTestMutexLock() { mutex_->Unlock(); } private: Mutex* const mutex_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); }; typedef GTestMutexLock MutexLock; // Base class for ValueHolder. Allows a caller to hold and delete a value // without knowing its type. class ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() {} }; // Provides a way for a thread to send notifications to a ThreadLocal // regardless of its parameter type. class ThreadLocalBase { public: // Creates a new ValueHolder object holding a default value passed to // this ThreadLocal's constructor and returns it. It is the caller's // responsibility not to call this when the ThreadLocal instance already // has a value on the current thread. virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0; protected: ThreadLocalBase() {} virtual ~ThreadLocalBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase); }; // Maps a thread to a set of ThreadLocals that have values instantiated on that // thread and notifies them when the thread exits. A ThreadLocal instance is // expected to persist until all threads it has values on have terminated. class GTEST_API_ ThreadLocalRegistry { public: // Registers thread_local_instance as having value on the current thread. // Returns a value that can be used to identify the thread from other threads. static ThreadLocalValueHolderBase* GetValueOnCurrentThread( const ThreadLocalBase* thread_local_instance); // Invoked when a ThreadLocal instance is destroyed. static void OnThreadLocalDestroyed( const ThreadLocalBase* thread_local_instance); }; class GTEST_API_ ThreadWithParamBase { public: void Join(); protected: class Runnable { public: virtual ~Runnable() {} virtual void Run() = 0; }; ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start); virtual ~ThreadWithParamBase(); private: AutoHandle thread_; }; // Helper class for testing Google Test's multi-threading constructs. template class ThreadWithParam : public ThreadWithParamBase { public: typedef void UserThreadFunc(T); ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) { } virtual ~ThreadWithParam() {} private: class RunnableImpl : public Runnable { public: RunnableImpl(UserThreadFunc* func, T param) : func_(func), param_(param) { } virtual ~RunnableImpl() {} virtual void Run() { func_(param_); } private: UserThreadFunc* const func_; const T param_; GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl); }; GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); }; // Implements thread-local storage on Windows systems. // // // Thread 1 // ThreadLocal tl(100); // 100 is the default value for each thread. // // // Thread 2 // tl.set(150); // Changes the value for thread 2 only. // EXPECT_EQ(150, tl.get()); // // // Thread 1 // EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. // tl.set(200); // EXPECT_EQ(200, tl.get()); // // The template type argument T must have a public copy constructor. // In addition, the default ThreadLocal constructor requires T to have // a public default constructor. // // The users of a TheadLocal instance have to make sure that all but one // threads (including the main one) using that instance have exited before // destroying it. Otherwise, the per-thread objects managed for them by the // ThreadLocal instance are not guaranteed to be destroyed on all platforms. // // Google Test only uses global ThreadLocal objects. That means they // will die after main() has returned. Therefore, no per-thread // object managed by Google Test will be leaked as long as all threads // using Google Test have exited when main() returns. template class ThreadLocal : public ThreadLocalBase { public: ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {} explicit ThreadLocal(const T& value) : default_factory_(new InstanceValueHolderFactory(value)) {} ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); } T* pointer() { return GetOrCreateValue(); } const T* pointer() const { return GetOrCreateValue(); } const T& get() const { return *pointer(); } void set(const T& value) { *pointer() = value; } private: // Holds a value of T. Can be deleted via its base class without the caller // knowing the type of T. class ValueHolder : public ThreadLocalValueHolderBase { public: ValueHolder() : value_() {} explicit ValueHolder(const T& value) : value_(value) {} T* pointer() { return &value_; } private: T value_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); }; T* GetOrCreateValue() const { return static_cast( ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer(); } virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const { return default_factory_->MakeNewHolder(); } class ValueHolderFactory { public: ValueHolderFactory() {} virtual ~ValueHolderFactory() {} virtual ValueHolder* MakeNewHolder() const = 0; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); }; class DefaultValueHolderFactory : public ValueHolderFactory { public: DefaultValueHolderFactory() {} virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); }; class InstanceValueHolderFactory : public ValueHolderFactory { public: explicit InstanceValueHolderFactory(const T& value) : value_(value) {} virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(value_); } private: const T value_; // The value for each thread. GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory); }; std::unique_ptr default_factory_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); }; # elif GTEST_HAS_PTHREAD // MutexBase and Mutex implement mutex on pthreads-based platforms. class MutexBase { public: // Acquires this mutex. void Lock() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); owner_ = pthread_self(); has_owner_ = true; } // Releases this mutex. void Unlock() { // Since the lock is being released the owner_ field should no longer be // considered valid. We don't protect writing to has_owner_ here, as it's // the caller's responsibility to ensure that the current thread holds the // mutex when this is called. has_owner_ = false; GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); } // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. void AssertHeld() const { GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self())) << "The current thread is not holding the mutex @" << this; } // A static mutex may be used before main() is entered. It may even // be used before the dynamic initialization stage. Therefore we // must be able to initialize a static mutex object at link time. // This means MutexBase has to be a POD and its member variables // have to be public. public: pthread_mutex_t mutex_; // The underlying pthread mutex. // has_owner_ indicates whether the owner_ field below contains a valid thread // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All // accesses to the owner_ field should be protected by a check of this field. // An alternative might be to memset() owner_ to all zeros, but there's no // guarantee that a zero'd pthread_t is necessarily invalid or even different // from pthread_self(). bool has_owner_; pthread_t owner_; // The thread holding the mutex. }; // Forward-declares a static mutex. # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::MutexBase mutex // Defines and statically (i.e. at link time) initializes a static mutex. // The initialization list here does not explicitly initialize each field, // instead relying on default initialization for the unspecified fields. In // particular, the owner_ field (a pthread_t) is not explicitly initialized. // This allows initialization to work whether pthread_t is a scalar or struct. // The flag -Wmissing-field-initializers must not be specified for this to work. #define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0} // The Mutex class can only be used for mutexes created at runtime. It // shares its API with MutexBase otherwise. class Mutex : public MutexBase { public: Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); has_owner_ = false; } ~Mutex() { GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); }; // We cannot name this class MutexLock because the ctor declaration would // conflict with a macro named MutexLock, which is defined on some // platforms. That macro is used as a defensive measure to prevent against // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than // "MutexLock l(&mu)". Hence the typedef trick below. class GTestMutexLock { public: explicit GTestMutexLock(MutexBase* mutex) : mutex_(mutex) { mutex_->Lock(); } ~GTestMutexLock() { mutex_->Unlock(); } private: MutexBase* const mutex_; GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); }; typedef GTestMutexLock MutexLock; // Helpers for ThreadLocal. // pthread_key_create() requires DeleteThreadLocalValue() to have // C-linkage. Therefore it cannot be templatized to access // ThreadLocal. Hence the need for class // ThreadLocalValueHolderBase. class ThreadLocalValueHolderBase { public: virtual ~ThreadLocalValueHolderBase() {} }; // Called by pthread to delete thread-local data stored by // pthread_setspecific(). extern "C" inline void DeleteThreadLocalValue(void* value_holder) { delete static_cast(value_holder); } // Implements thread-local storage on pthreads-based systems. template class GTEST_API_ ThreadLocal { public: ThreadLocal() : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {} explicit ThreadLocal(const T& value) : key_(CreateKey()), default_factory_(new InstanceValueHolderFactory(value)) {} ~ThreadLocal() { // Destroys the managed object for the current thread, if any. DeleteThreadLocalValue(pthread_getspecific(key_)); // Releases resources associated with the key. This will *not* // delete managed objects for other threads. GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); } T* pointer() { return GetOrCreateValue(); } const T* pointer() const { return GetOrCreateValue(); } const T& get() const { return *pointer(); } void set(const T& value) { *pointer() = value; } private: // Holds a value of type T. class ValueHolder : public ThreadLocalValueHolderBase { public: ValueHolder() : value_() {} explicit ValueHolder(const T& value) : value_(value) {} T* pointer() { return &value_; } private: T value_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); }; static pthread_key_t CreateKey() { pthread_key_t key; // When a thread exits, DeleteThreadLocalValue() will be called on // the object managed for that thread. GTEST_CHECK_POSIX_SUCCESS_( pthread_key_create(&key, &DeleteThreadLocalValue)); return key; } T* GetOrCreateValue() const { ThreadLocalValueHolderBase* const holder = static_cast(pthread_getspecific(key_)); if (holder != nullptr) { return CheckedDowncastToActualType(holder)->pointer(); } ValueHolder* const new_holder = default_factory_->MakeNewHolder(); ThreadLocalValueHolderBase* const holder_base = new_holder; GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); return new_holder->pointer(); } class ValueHolderFactory { public: ValueHolderFactory() {} virtual ~ValueHolderFactory() {} virtual ValueHolder* MakeNewHolder() const = 0; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); }; class DefaultValueHolderFactory : public ValueHolderFactory { public: DefaultValueHolderFactory() {} virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); }; class InstanceValueHolderFactory : public ValueHolderFactory { public: explicit InstanceValueHolderFactory(const T& value) : value_(value) {} virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(value_); } private: const T value_; // The value for each thread. GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory); }; // A key pthreads uses for looking up per-thread values. const pthread_key_t key_; std::unique_ptr default_factory_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); }; # endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ #else // GTEST_IS_THREADSAFE // A dummy implementation of synchronization primitives (mutex, lock, // and thread-local variable). Necessary for compiling Google Test where // mutex is not supported - using Google Test in multiple threads is not // supported on such platforms. class Mutex { public: Mutex() {} void Lock() {} void Unlock() {} void AssertHeld() const {} }; # define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ extern ::testing::internal::Mutex mutex # define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex // We cannot name this class MutexLock because the ctor declaration would // conflict with a macro named MutexLock, which is defined on some // platforms. That macro is used as a defensive measure to prevent against // inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than // "MutexLock l(&mu)". Hence the typedef trick below. class GTestMutexLock { public: explicit GTestMutexLock(Mutex*) {} // NOLINT }; typedef GTestMutexLock MutexLock; template class GTEST_API_ ThreadLocal { public: ThreadLocal() : value_() {} explicit ThreadLocal(const T& value) : value_(value) {} T* pointer() { return &value_; } const T* pointer() const { return &value_; } const T& get() const { return value_; } void set(const T& value) { value_ = value; } private: T value_; }; #endif // GTEST_IS_THREADSAFE // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. GTEST_API_ size_t GetThreadCount(); template using bool_constant = std::integral_constant; #if GTEST_OS_WINDOWS # define GTEST_PATH_SEP_ "\\" # define GTEST_HAS_ALT_PATH_SEP_ 1 // The biggest signed integer type the compiler supports. typedef __int64 BiggestInt; #else # define GTEST_PATH_SEP_ "/" # define GTEST_HAS_ALT_PATH_SEP_ 0 typedef long long BiggestInt; // NOLINT #endif // GTEST_OS_WINDOWS // Utilities for char. // isspace(int ch) and friends accept an unsigned char or EOF. char // may be signed, depending on the compiler (or compiler flags). // Therefore we need to cast a char to unsigned char before calling // isspace(), etc. inline bool IsAlpha(char ch) { return isalpha(static_cast(ch)) != 0; } inline bool IsAlNum(char ch) { return isalnum(static_cast(ch)) != 0; } inline bool IsDigit(char ch) { return isdigit(static_cast(ch)) != 0; } inline bool IsLower(char ch) { return islower(static_cast(ch)) != 0; } inline bool IsSpace(char ch) { return isspace(static_cast(ch)) != 0; } inline bool IsUpper(char ch) { return isupper(static_cast(ch)) != 0; } inline bool IsXDigit(char ch) { return isxdigit(static_cast(ch)) != 0; } inline bool IsXDigit(wchar_t ch) { const unsigned char low_byte = static_cast(ch); return ch == low_byte && isxdigit(low_byte) != 0; } inline char ToLower(char ch) { return static_cast(tolower(static_cast(ch))); } inline char ToUpper(char ch) { return static_cast(toupper(static_cast(ch))); } inline std::string StripTrailingSpaces(std::string str) { std::string::iterator it = str.end(); while (it != str.begin() && IsSpace(*--it)) it = str.erase(it); return str; } // The testing::internal::posix namespace holds wrappers for common // POSIX functions. These wrappers hide the differences between // Windows/MSVC and POSIX systems. Since some compilers define these // standard functions as macros, the wrapper cannot have the same name // as the wrapped function. namespace posix { // Functions with a different name on Windows. #if GTEST_OS_WINDOWS typedef struct _stat StatStruct; # ifdef __BORLANDC__ inline int IsATTY(int fd) { return isatty(fd); } inline int StrCaseCmp(const char* s1, const char* s2) { return stricmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } # else // !__BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE inline int IsATTY(int /* fd */) { return 0; } # else inline int IsATTY(int fd) { return _isatty(fd); } # endif // GTEST_OS_WINDOWS_MOBILE inline int StrCaseCmp(const char* s1, const char* s2) { return _stricmp(s1, s2); } inline char* StrDup(const char* src) { return _strdup(src); } # endif // __BORLANDC__ # if GTEST_OS_WINDOWS_MOBILE inline int FileNo(FILE* file) { return reinterpret_cast(_fileno(file)); } // Stat(), RmDir(), and IsDir() are not needed on Windows CE at this // time and thus not defined there. # else inline int FileNo(FILE* file) { return _fileno(file); } inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } inline int RmDir(const char* dir) { return _rmdir(dir); } inline bool IsDir(const StatStruct& st) { return (_S_IFDIR & st.st_mode) != 0; } # endif // GTEST_OS_WINDOWS_MOBILE #else typedef struct stat StatStruct; inline int FileNo(FILE* file) { return fileno(file); } inline int IsATTY(int fd) { return isatty(fd); } inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } inline int StrCaseCmp(const char* s1, const char* s2) { return strcasecmp(s1, s2); } inline char* StrDup(const char* src) { return strdup(src); } inline int RmDir(const char* dir) { return rmdir(dir); } inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } #endif // GTEST_OS_WINDOWS // Functions deprecated by MSVC 8.0. GTEST_DISABLE_MSC_DEPRECATED_PUSH_() inline const char* StrNCpy(char* dest, const char* src, size_t n) { return strncpy(dest, src, n); } // ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and // StrError() aren't needed on Windows CE at this time and thus not // defined there. #if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT inline int ChDir(const char* dir) { return chdir(dir); } #endif inline FILE* FOpen(const char* path, const char* mode) { return fopen(path, mode); } #if !GTEST_OS_WINDOWS_MOBILE inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { return freopen(path, mode, stream); } inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } #endif inline int FClose(FILE* fp) { return fclose(fp); } #if !GTEST_OS_WINDOWS_MOBILE inline int Read(int fd, void* buf, unsigned int count) { return static_cast(read(fd, buf, count)); } inline int Write(int fd, const void* buf, unsigned int count) { return static_cast(write(fd, buf, count)); } inline int Close(int fd) { return close(fd); } inline const char* StrError(int errnum) { return strerror(errnum); } #endif inline const char* GetEnv(const char* name) { #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT // We are on Windows CE, which has no environment variables. static_cast(name); // To prevent 'unused argument' warning. return nullptr; #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) // Environment variables which we programmatically clear will be set to the // empty string rather than unset (NULL). Handle that case. const char* const env = getenv(name); return (env != nullptr && env[0] != '\0') ? env : nullptr; #else return getenv(name); #endif } GTEST_DISABLE_MSC_DEPRECATED_POP_() #if GTEST_OS_WINDOWS_MOBILE // Windows CE has no C library. The abort() function is used in // several places in Google Test. This implementation provides a reasonable // imitation of standard behaviour. [[noreturn]] void Abort(); #else [[noreturn]] inline void Abort() { abort(); } #endif // GTEST_OS_WINDOWS_MOBILE } // namespace posix // MSVC "deprecates" snprintf and issues warnings wherever it is used. In // order to avoid these warnings, we need to use _snprintf or _snprintf_s on // MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate // function in order to achieve that. We use macro definition here because // snprintf is a variadic function. #if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE // MSVC 2005 and above support variadic macros. # define GTEST_SNPRINTF_(buffer, size, format, ...) \ _snprintf_s(buffer, size, size, format, __VA_ARGS__) #elif defined(_MSC_VER) // Windows CE does not define _snprintf_s # define GTEST_SNPRINTF_ _snprintf #else # define GTEST_SNPRINTF_ snprintf #endif // The maximum number a BiggestInt can represent. This definition // works no matter BiggestInt is represented in one's complement or // two's complement. // // We cannot rely on numeric_limits in STL, as __int64 and long long // are not part of standard C++ and numeric_limits doesn't need to be // defined for them. const BiggestInt kMaxBiggestInt = ~(static_cast(1) << (8*sizeof(BiggestInt) - 1)); // This template class serves as a compile-time function from size to // type. It maps a size in bytes to a primitive type with that // size. e.g. // // TypeWithSize<4>::UInt // // is typedef-ed to be unsigned int (unsigned integer made up of 4 // bytes). // // Such functionality should belong to STL, but I cannot find it // there. // // Google Test uses this class in the implementation of floating-point // comparison. // // For now it only handles UInt (unsigned int) as that's all Google Test // needs. Other types can be easily added in the future if need // arises. template class TypeWithSize { public: // This prevents the user from using TypeWithSize with incorrect // values of N. typedef void UInt; }; // The specialization for size 4. template <> class TypeWithSize<4> { public: // unsigned int has size 4 in both gcc and MSVC. // // As base/basictypes.h doesn't compile on Windows, we cannot use // uint32, uint64, and etc here. typedef int Int; typedef unsigned int UInt; }; // The specialization for size 8. template <> class TypeWithSize<8> { public: #if GTEST_OS_WINDOWS typedef __int64 Int; typedef unsigned __int64 UInt; #else typedef long long Int; // NOLINT typedef unsigned long long UInt; // NOLINT #endif // GTEST_OS_WINDOWS }; // Integer types of known sizes. typedef TypeWithSize<4>::Int Int32; typedef TypeWithSize<4>::UInt UInt32; typedef TypeWithSize<8>::Int Int64; typedef TypeWithSize<8>::UInt UInt64; typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. // Utilities for command line flags and environment variables. // Macro for referencing flags. #if !defined(GTEST_FLAG) # define GTEST_FLAG(name) FLAGS_gtest_##name #endif // !defined(GTEST_FLAG) #if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) # define GTEST_USE_OWN_FLAGFILE_FLAG_ 1 #endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) #if !defined(GTEST_DECLARE_bool_) # define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver // Macros for declaring flags. # define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) # define GTEST_DECLARE_int32_(name) \ GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) # define GTEST_DECLARE_string_(name) \ GTEST_API_ extern ::std::string GTEST_FLAG(name) // Macros for defining flags. # define GTEST_DEFINE_bool_(name, default_val, doc) \ GTEST_API_ bool GTEST_FLAG(name) = (default_val) # define GTEST_DEFINE_int32_(name, default_val, doc) \ GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) # define GTEST_DEFINE_string_(name, default_val, doc) \ GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) #endif // !defined(GTEST_DECLARE_bool_) // Thread annotations #if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) # define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) # define GTEST_LOCK_EXCLUDED_(locks) #endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) // Parses 'str' for a 32-bit signed integer. If successful, writes the result // to *value and returns true; otherwise leaves *value unchanged and returns // false. bool ParseInt32(const Message& src_text, const char* str, Int32* value); // Parses a bool/Int32/string from the environment variable // corresponding to the given Google Test flag. bool BoolFromGTestEnv(const char* flag, bool default_val); GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); std::string OutputFlagAlsoCheckEnvVar(); const char* StringFromGTestEnv(const char* flag, const char* default_val); } // namespace internal } // namespace testing #if !defined(GTEST_INTERNAL_DEPRECATED) // Internal Macro to mark an API deprecated, for googletest usage only // Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or // GTEST_INTERNAL_DEPRECATED(message) myFunction(); Every usage of // a deprecated entity will trigger a warning when compiled with // `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler). // For msvc /W3 option will need to be used // Note that for 'other' compilers this macro evaluates to nothing to prevent // compilations errors. #if defined(_MSC_VER) #define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message)) #elif defined(__GNUC__) #define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message))) #else #define GTEST_INTERNAL_DEPRECATED(message) #endif #endif // !defined(GTEST_INTERNAL_DEPRECATED) #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-filepath.h0000664000175000017500000002304413553267757022121 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Google Test filepath utilities // // This header file declares classes and functions used internally by // Google Test. They are subject to change without notice. // // This file is #included in gtest/internal/gtest-internal.h. // Do not include this header file separately! // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ #include "gtest/internal/gtest-string.h" GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) namespace testing { namespace internal { // FilePath - a class for file and directory pathname manipulation which // handles platform-specific conventions (like the pathname separator). // Used for helper functions for naming files in a directory for xml output. // Except for Set methods, all methods are const or static, which provides an // "immutable value object" -- useful for peace of mind. // A FilePath with a value ending in a path separator ("like/this/") represents // a directory, otherwise it is assumed to represent a file. In either case, // it may or may not represent an actual file or directory in the file system. // Names are NOT checked for syntax correctness -- no checking for illegal // characters, malformed paths, etc. class GTEST_API_ FilePath { public: FilePath() : pathname_("") { } FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } explicit FilePath(const std::string& pathname) : pathname_(pathname) { Normalize(); } FilePath& operator=(const FilePath& rhs) { Set(rhs); return *this; } void Set(const FilePath& rhs) { pathname_ = rhs.pathname_; } const std::string& string() const { return pathname_; } const char* c_str() const { return pathname_.c_str(); } // Returns the current working directory, or "" if unsuccessful. static FilePath GetCurrentDir(); // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. static FilePath MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension); // Given directory = "dir", relative_path = "test.xml", // returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. static FilePath ConcatPaths(const FilePath& directory, const FilePath& relative_path); // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. static FilePath GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension); // Returns true if and only if the path is "". bool IsEmpty() const { return pathname_.empty(); } // If input name has a trailing separator character, removes it and returns // the name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath RemoveTrailingPathSeparator() const; // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveDirectoryName() const; // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath RemoveFileName() const; // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath RemoveExtension(const char* extension) const; // Creates directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create // directories for any reason. Will also return false if the FilePath does // not represent a directory (that is, it doesn't end with a path separator). bool CreateDirectoriesRecursively() const; // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool CreateFolder() const; // Returns true if FilePath describes something in the file-system, // either a file, directory, or whatever, and that something exists. bool FileOrDirectoryExists() const; // Returns true if pathname describes a directory in the file-system // that exists. bool DirectoryExists() const; // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool IsDirectory() const; // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool IsRootDirectory() const; // Returns true if pathname describes an absolute path. bool IsAbsolutePath() const; private: // Replaces multiple consecutive separators with a single separator. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". // // A pathname with multiple consecutive separators may occur either through // user error or as a result of some scripts or APIs that generate a pathname // with a trailing separator. On other platforms the same API or script // may NOT generate a pathname with a trailing "/". Then elsewhere that // pathname may have another "/" and pathname components added to it, // without checking for the separator already being there. // The script language and operating system may allow paths like "foo//bar" // but some of the functions in FilePath will not handle that correctly. In // particular, RemoveTrailingPathSeparator() only removes one separator, and // it is called in CreateDirectoriesRecursively() assuming that it will change // a pathname from directory syntax (trailing separator) to filename syntax. // // On Windows this method also replaces the alternate path separator '/' with // the primary path separator '\\', so that for example "bar\\/\\foo" becomes // "bar\\foo". void Normalize(); // Returns a pointer to the last occurence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FindLastPathSeparator() const; std::string pathname_; }; // class FilePath } // namespace internal } // namespace testing GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-param-util.h0000664000175000017500000010045213553267757022377 00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Type and function utilities for implementing parameterized tests. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ #include #include #include #include #include #include #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" #include "gtest/gtest-printers.h" namespace testing { // Input to a parameterized test name generator, describing a test parameter. // Consists of the parameter value and the integer parameter index. template struct TestParamInfo { TestParamInfo(const ParamType& a_param, size_t an_index) : param(a_param), index(an_index) {} ParamType param; size_t index; }; // A builtin parameterized test name generator which returns the result of // testing::PrintToString. struct PrintToStringParamName { template std::string operator()(const TestParamInfo& info) const { return PrintToString(info.param); } }; namespace internal { // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // Utility Functions // Outputs a message explaining invalid registration of different // fixture class for the same test suite. This may happen when // TEST_P macro is used to define two tests with the same name // but in different namespaces. GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name, CodeLocation code_location); template class ParamGeneratorInterface; template class ParamGenerator; // Interface for iterating over elements provided by an implementation // of ParamGeneratorInterface. template class ParamIteratorInterface { public: virtual ~ParamIteratorInterface() {} // A pointer to the base generator instance. // Used only for the purposes of iterator comparison // to make sure that two iterators belong to the same generator. virtual const ParamGeneratorInterface* BaseGenerator() const = 0; // Advances iterator to point to the next element // provided by the generator. The caller is responsible // for not calling Advance() on an iterator equal to // BaseGenerator()->End(). virtual void Advance() = 0; // Clones the iterator object. Used for implementing copy semantics // of ParamIterator. virtual ParamIteratorInterface* Clone() const = 0; // Dereferences the current iterator and provides (read-only) access // to the pointed value. It is the caller's responsibility not to call // Current() on an iterator equal to BaseGenerator()->End(). // Used for implementing ParamGenerator::operator*(). virtual const T* Current() const = 0; // Determines whether the given iterator and other point to the same // element in the sequence generated by the generator. // Used for implementing ParamGenerator::operator==(). virtual bool Equals(const ParamIteratorInterface& other) const = 0; }; // Class iterating over elements provided by an implementation of // ParamGeneratorInterface. It wraps ParamIteratorInterface // and implements the const forward iterator concept. template class ParamIterator { public: typedef T value_type; typedef const T& reference; typedef ptrdiff_t difference_type; // ParamIterator assumes ownership of the impl_ pointer. ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} ParamIterator& operator=(const ParamIterator& other) { if (this != &other) impl_.reset(other.impl_->Clone()); return *this; } const T& operator*() const { return *impl_->Current(); } const T* operator->() const { return impl_->Current(); } // Prefix version of operator++. ParamIterator& operator++() { impl_->Advance(); return *this; } // Postfix version of operator++. ParamIterator operator++(int /*unused*/) { ParamIteratorInterface* clone = impl_->Clone(); impl_->Advance(); return ParamIterator(clone); } bool operator==(const ParamIterator& other) const { return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); } bool operator!=(const ParamIterator& other) const { return !(*this == other); } private: friend class ParamGenerator; explicit ParamIterator(ParamIteratorInterface* impl) : impl_(impl) {} std::unique_ptr > impl_; }; // ParamGeneratorInterface is the binary interface to access generators // defined in other translation units. template class ParamGeneratorInterface { public: typedef T ParamType; virtual ~ParamGeneratorInterface() {} // Generator interface definition virtual ParamIteratorInterface* Begin() const = 0; virtual ParamIteratorInterface* End() const = 0; }; // Wraps ParamGeneratorInterface and provides general generator syntax // compatible with the STL Container concept. // This class implements copy initialization semantics and the contained // ParamGeneratorInterface instance is shared among all copies // of the original object. This is possible because that instance is immutable. template class ParamGenerator { public: typedef ParamIterator iterator; explicit ParamGenerator(ParamGeneratorInterface* impl) : impl_(impl) {} ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} ParamGenerator& operator=(const ParamGenerator& other) { impl_ = other.impl_; return *this; } iterator begin() const { return iterator(impl_->Begin()); } iterator end() const { return iterator(impl_->End()); } private: std::shared_ptr > impl_; }; // Generates values from a range of two comparable values. Can be used to // generate sequences of user-defined types that implement operator+() and // operator<(). // This class is used in the Range() function. template class RangeGenerator : public ParamGeneratorInterface { public: RangeGenerator(T begin, T end, IncrementT step) : begin_(begin), end_(end), step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} ~RangeGenerator() override {} ParamIteratorInterface* Begin() const override { return new Iterator(this, begin_, 0, step_); } ParamIteratorInterface* End() const override { return new Iterator(this, end_, end_index_, step_); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, T value, int index, IncrementT step) : base_(base), value_(value), index_(index), step_(step) {} ~Iterator() override {} const ParamGeneratorInterface* BaseGenerator() const override { return base_; } void Advance() override { value_ = static_cast(value_ + step_); index_++; } ParamIteratorInterface* Clone() const override { return new Iterator(*this); } const T* Current() const override { return &value_; } bool Equals(const ParamIteratorInterface& other) const override { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const int other_index = CheckedDowncastToActualType(&other)->index_; return index_ == other_index; } private: Iterator(const Iterator& other) : ParamIteratorInterface(), base_(other.base_), value_(other.value_), index_(other.index_), step_(other.step_) {} // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; T value_; int index_; const IncrementT step_; }; // class RangeGenerator::Iterator static int CalculateEndIndex(const T& begin, const T& end, const IncrementT& step) { int end_index = 0; for (T i = begin; i < end; i = static_cast(i + step)) end_index++; return end_index; } // No implementation - assignment is unsupported. void operator=(const RangeGenerator& other); const T begin_; const T end_; const IncrementT step_; // The index for the end() iterator. All the elements in the generated // sequence are indexed (0-based) to aid iterator comparison. const int end_index_; }; // class RangeGenerator // Generates values from a pair of STL-style iterators. Used in the // ValuesIn() function. The elements are copied from the source range // since the source can be located on the stack, and the generator // is likely to persist beyond that stack frame. template class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface { public: template ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) : container_(begin, end) {} ~ValuesInIteratorRangeGenerator() override {} ParamIteratorInterface* Begin() const override { return new Iterator(this, container_.begin()); } ParamIteratorInterface* End() const override { return new Iterator(this, container_.end()); } private: typedef typename ::std::vector ContainerType; class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, typename ContainerType::const_iterator iterator) : base_(base), iterator_(iterator) {} ~Iterator() override {} const ParamGeneratorInterface* BaseGenerator() const override { return base_; } void Advance() override { ++iterator_; value_.reset(); } ParamIteratorInterface* Clone() const override { return new Iterator(*this); } // We need to use cached value referenced by iterator_ because *iterator_ // can return a temporary object (and of type other then T), so just // having "return &*iterator_;" doesn't work. // value_ is updated here and not in Advance() because Advance() // can advance iterator_ beyond the end of the range, and we cannot // detect that fact. The client code, on the other hand, is // responsible for not calling Current() on an out-of-range iterator. const T* Current() const override { if (value_.get() == nullptr) value_.reset(new T(*iterator_)); return value_.get(); } bool Equals(const ParamIteratorInterface& other) const override { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; return iterator_ == CheckedDowncastToActualType(&other)->iterator_; } private: Iterator(const Iterator& other) // The explicit constructor call suppresses a false warning // emitted by gcc when supplied with the -Wextra option. : ParamIteratorInterface(), base_(other.base_), iterator_(other.iterator_) {} const ParamGeneratorInterface* const base_; typename ContainerType::const_iterator iterator_; // A cached value of *iterator_. We keep it here to allow access by // pointer in the wrapping iterator's operator->(). // value_ needs to be mutable to be accessed in Current(). // Use of std::unique_ptr helps manage cached value's lifetime, // which is bound by the lifespan of the iterator itself. mutable std::unique_ptr value_; }; // class ValuesInIteratorRangeGenerator::Iterator // No implementation - assignment is unsupported. void operator=(const ValuesInIteratorRangeGenerator& other); const ContainerType container_; }; // class ValuesInIteratorRangeGenerator // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Default parameterized test name generator, returns a string containing the // integer test parameter index. template std::string DefaultParamName(const TestParamInfo& info) { Message name_stream; name_stream << info.index; return name_stream.GetString(); } template void TestNotEmpty() { static_assert(sizeof(T) == 0, "Empty arguments are not allowed."); } template void TestNotEmpty(const T&) {} // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Stores a parameter value and later creates tests parameterized with that // value. template class ParameterizedTestFactory : public TestFactoryBase { public: typedef typename TestClass::ParamType ParamType; explicit ParameterizedTestFactory(ParamType parameter) : parameter_(parameter) {} Test* CreateTest() override { TestClass::SetParam(¶meter_); return new TestClass(); } private: const ParamType parameter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactoryBase is a base class for meta-factories that create // test factories for passing into MakeAndRegisterTestInfo function. template class TestMetaFactoryBase { public: virtual ~TestMetaFactoryBase() {} virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // TestMetaFactory creates test factories for passing into // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives // ownership of test factory pointer, same factory object cannot be passed // into that method twice. But ParameterizedTestSuiteInfo is going to call // it for each Test/Parameter value combination. Thus it needs meta factory // creator class. template class TestMetaFactory : public TestMetaFactoryBase { public: using ParamType = typename TestSuite::ParamType; TestMetaFactory() {} TestFactoryBase* CreateTestFactory(ParamType parameter) override { return new ParameterizedTestFactory(parameter); } private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestSuiteInfoBase is a generic interface // to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase // accumulates test information provided by TEST_P macro invocations // and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations // and uses that information to register all resulting test instances // in RegisterTests method. The ParameterizeTestSuiteRegistry class holds // a collection of pointers to the ParameterizedTestSuiteInfo objects // and calls RegisterTests() on each of them when asked. class ParameterizedTestSuiteInfoBase { public: virtual ~ParameterizedTestSuiteInfoBase() {} // Base part of test suite name for display purposes. virtual const std::string& GetTestSuiteName() const = 0; // Test case id to verify identity. virtual TypeId GetTestSuiteTypeId() const = 0; // UnitTest class invokes this method to register tests in this // test suite right before running them in RUN_ALL_TESTS macro. // This method should not be called more than once on any single // instance of a ParameterizedTestSuiteInfoBase derived class. virtual void RegisterTests() = 0; protected: ParameterizedTestSuiteInfoBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase); }; // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P // macro invocations for a particular test suite and generators // obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that // test suite. It registers tests with all values generated by all // generators when asked. template class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { public: // ParamType and GeneratorCreationFunc are private types but are required // for declarations of public methods AddTestPattern() and // AddTestSuiteInstantiation(). using ParamType = typename TestSuite::ParamType; // A function that returns an instance of appropriate generator type. typedef ParamGenerator(GeneratorCreationFunc)(); using ParamNameGeneratorFunc = std::string(const TestParamInfo&); explicit ParameterizedTestSuiteInfo(const char* name, CodeLocation code_location) : test_suite_name_(name), code_location_(code_location) {} // Test case base name for display purposes. const std::string& GetTestSuiteName() const override { return test_suite_name_; } // Test case id to verify identity. TypeId GetTestSuiteTypeId() const override { return GetTypeId(); } // TEST_P macro uses AddTestPattern() to record information // about a single test in a LocalTestInfo structure. // test_suite_name is the base name of the test suite (without invocation // prefix). test_base_name is the name of an individual test without // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is // test suite base name and DoBar is test base name. void AddTestPattern(const char* test_suite_name, const char* test_base_name, TestMetaFactoryBase* meta_factory) { tests_.push_back(std::shared_ptr( new TestInfo(test_suite_name, test_base_name, meta_factory))); } // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information // about a generator. int AddTestSuiteInstantiation(const std::string& instantiation_name, GeneratorCreationFunc* func, ParamNameGeneratorFunc* name_func, const char* file, int line) { instantiations_.push_back( InstantiationInfo(instantiation_name, func, name_func, file, line)); return 0; // Return value used only to run this method in namespace scope. } // UnitTest class invokes this method to register tests in this test suite // test suites right before running tests in RUN_ALL_TESTS macro. // This method should not be called more than once on any single // instance of a ParameterizedTestSuiteInfoBase derived class. // UnitTest has a guard to prevent from calling this method more than once. void RegisterTests() override { for (typename TestInfoContainer::iterator test_it = tests_.begin(); test_it != tests_.end(); ++test_it) { std::shared_ptr test_info = *test_it; for (typename InstantiationContainer::iterator gen_it = instantiations_.begin(); gen_it != instantiations_.end(); ++gen_it) { const std::string& instantiation_name = gen_it->name; ParamGenerator generator((*gen_it->generator)()); ParamNameGeneratorFunc* name_func = gen_it->name_func; const char* file = gen_it->file; int line = gen_it->line; std::string test_suite_name; if ( !instantiation_name.empty() ) test_suite_name = instantiation_name + "/"; test_suite_name += test_info->test_suite_base_name; size_t i = 0; std::set test_param_names; for (typename ParamGenerator::iterator param_it = generator.begin(); param_it != generator.end(); ++param_it, ++i) { Message test_name_stream; std::string param_name = name_func( TestParamInfo(*param_it, i)); GTEST_CHECK_(IsValidParamName(param_name)) << "Parameterized test name '" << param_name << "' is invalid, in " << file << " line " << line << std::endl; GTEST_CHECK_(test_param_names.count(param_name) == 0) << "Duplicate parameterized test name '" << param_name << "', in " << file << " line " << line << std::endl; test_param_names.insert(param_name); if (!test_info->test_base_name.empty()) { test_name_stream << test_info->test_base_name << "/"; } test_name_stream << param_name; MakeAndRegisterTestInfo( test_suite_name.c_str(), test_name_stream.GetString().c_str(), nullptr, // No type parameter. PrintToString(*param_it).c_str(), code_location_, GetTestSuiteTypeId(), SuiteApiResolver::GetSetUpCaseOrSuite(file, line), SuiteApiResolver::GetTearDownCaseOrSuite(file, line), test_info->test_meta_factory->CreateTestFactory(*param_it)); } // for param_it } // for gen_it } // for test_it } // RegisterTests private: // LocalTestInfo structure keeps information about a single test registered // with TEST_P macro. struct TestInfo { TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name, TestMetaFactoryBase* a_test_meta_factory) : test_suite_base_name(a_test_suite_base_name), test_base_name(a_test_base_name), test_meta_factory(a_test_meta_factory) {} const std::string test_suite_base_name; const std::string test_base_name; const std::unique_ptr > test_meta_factory; }; using TestInfoContainer = ::std::vector >; // Records data received from INSTANTIATE_TEST_SUITE_P macros: // struct InstantiationInfo { InstantiationInfo(const std::string &name_in, GeneratorCreationFunc* generator_in, ParamNameGeneratorFunc* name_func_in, const char* file_in, int line_in) : name(name_in), generator(generator_in), name_func(name_func_in), file(file_in), line(line_in) {} std::string name; GeneratorCreationFunc* generator; ParamNameGeneratorFunc* name_func; const char* file; int line; }; typedef ::std::vector InstantiationContainer; static bool IsValidParamName(const std::string& name) { // Check for empty string if (name.empty()) return false; // Check for invalid characters for (std::string::size_type index = 0; index < name.size(); ++index) { if (!isalnum(name[index]) && name[index] != '_') return false; } return true; } const std::string test_suite_name_; CodeLocation code_location_; TestInfoContainer tests_; InstantiationContainer instantiations_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo); }; // class ParameterizedTestSuiteInfo // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ template using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // ParameterizedTestSuiteRegistry contains a map of // ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P // and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding // ParameterizedTestSuiteInfo descriptors. class ParameterizedTestSuiteRegistry { public: ParameterizedTestSuiteRegistry() {} ~ParameterizedTestSuiteRegistry() { for (auto& test_suite_info : test_suite_infos_) { delete test_suite_info; } } // Looks up or creates and returns a structure containing information about // tests and instantiations of a particular test suite. template ParameterizedTestSuiteInfo* GetTestSuitePatternHolder( const char* test_suite_name, CodeLocation code_location) { ParameterizedTestSuiteInfo* typed_test_info = nullptr; for (auto& test_suite_info : test_suite_infos_) { if (test_suite_info->GetTestSuiteName() == test_suite_name) { if (test_suite_info->GetTestSuiteTypeId() != GetTypeId()) { // Complain about incorrect usage of Google Test facilities // and terminate the program since we cannot guaranty correct // test suite setup and tear-down in this case. ReportInvalidTestSuiteType(test_suite_name, code_location); posix::Abort(); } else { // At this point we are sure that the object we found is of the same // type we are looking for, so we downcast it to that type // without further checks. typed_test_info = CheckedDowncastToActualType< ParameterizedTestSuiteInfo >(test_suite_info); } break; } } if (typed_test_info == nullptr) { typed_test_info = new ParameterizedTestSuiteInfo( test_suite_name, code_location); test_suite_infos_.push_back(typed_test_info); } return typed_test_info; } void RegisterTests() { for (auto& test_suite_info : test_suite_infos_) { test_suite_info->RegisterTests(); } } // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ template ParameterizedTestCaseInfo* GetTestCasePatternHolder( const char* test_case_name, CodeLocation code_location) { return GetTestSuitePatternHolder(test_case_name, code_location); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ private: using TestSuiteInfoContainer = ::std::vector; TestSuiteInfoContainer test_suite_infos_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry); }; } // namespace internal // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template internal::ParamGenerator ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template class ValueArray { public: ValueArray(Ts... v) : v_{std::move(v)...} {} template operator ParamGenerator() const { // NOLINT return ValuesIn(MakeVector(MakeIndexSequence())); } private: template std::vector MakeVector(IndexSequence) const { return std::vector{static_cast(v_.template Get())...}; } FlatTuple v_; }; template class CartesianProductGenerator : public ParamGeneratorInterface<::std::tuple> { public: typedef ::std::tuple ParamType; CartesianProductGenerator(const std::tuple...>& g) : generators_(g) {} ~CartesianProductGenerator() override {} ParamIteratorInterface* Begin() const override { return new Iterator(this, generators_, false); } ParamIteratorInterface* End() const override { return new Iterator(this, generators_, true); } private: template class IteratorImpl; template class IteratorImpl> : public ParamIteratorInterface { public: IteratorImpl(const ParamGeneratorInterface* base, const std::tuple...>& generators, bool is_end) : base_(base), begin_(std::get(generators).begin()...), end_(std::get(generators).end()...), current_(is_end ? end_ : begin_) { ComputeCurrentValue(); } ~IteratorImpl() override {} const ParamGeneratorInterface* BaseGenerator() const override { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. void Advance() override { assert(!AtEnd()); // Advance the last iterator. ++std::get(current_); // if that reaches end, propagate that up. AdvanceIfEnd(); ComputeCurrentValue(); } ParamIteratorInterface* Clone() const override { return new IteratorImpl(*this); } const ParamType* Current() const override { return current_value_.get(); } bool Equals(const ParamIteratorInterface& other) const override { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const IteratorImpl* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). if (AtEnd() && typed_other->AtEnd()) return true; bool same = true; bool dummy[] = { (same = same && std::get(current_) == std::get(typed_other->current_))...}; (void)dummy; return same; } private: template void AdvanceIfEnd() { if (std::get(current_) != std::get(end_)) return; bool last = ThisI == 0; if (last) { // We are done. Nothing else to propagate. return; } constexpr size_t NextI = ThisI - (ThisI != 0); std::get(current_) = std::get(begin_); ++std::get(current_); AdvanceIfEnd(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_ = std::make_shared(*std::get(current_)...); } bool AtEnd() const { bool at_end = false; bool dummy[] = { (at_end = at_end || std::get(current_) == std::get(end_))...}; (void)dummy; return at_end; } const ParamGeneratorInterface* const base_; std::tuple::iterator...> begin_; std::tuple::iterator...> end_; std::tuple::iterator...> current_; std::shared_ptr current_value_; }; using Iterator = IteratorImpl::type>; std::tuple...> generators_; }; template class CartesianProductHolder { public: CartesianProductHolder(const Gen&... g) : generators_(g...) {} template operator ParamGenerator<::std::tuple>() const { return ParamGenerator<::std::tuple>( new CartesianProductGenerator(generators_)); } private: std::tuple generators_; }; } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-linked_ptr.h0000664000175000017500000002032113510660062022426 00000000000000// Copyright 2003 Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // A "smart" pointer type with reference tracking. Every pointer to a // particular object is kept on a circular linked list. When the last pointer // to an object is destroyed or reassigned, the object is deleted. // // Used properly, this deletes the object when the last reference goes away. // There are several caveats: // - Like all reference counting schemes, cycles lead to leaks. // - Each smart pointer is actually two pointers (8 bytes instead of 4). // - Every time a pointer is assigned, the entire list of pointers to that // object is traversed. This class is therefore NOT SUITABLE when there // will often be more than two or three pointers to a particular object. // - References are only tracked as long as linked_ptr<> objects are copied. // If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS // will happen (double deletion). // // A good use of this class is storing object references in STL containers. // You can safely put linked_ptr<> in a vector<>. // Other uses may not be as good. // // Note: If you use an incomplete type with linked_ptr<>, the class // *containing* linked_ptr<> must have a constructor and destructor (even // if they do nothing!). // // Bill Gibbons suggested we use something like this. // // Thread Safety: // Unlike other linked_ptr implementations, in this implementation // a linked_ptr object is thread-safe in the sense that: // - it's safe to copy linked_ptr objects concurrently, // - it's safe to copy *from* a linked_ptr and read its underlying // raw pointer (e.g. via get()) concurrently, and // - it's safe to write to two linked_ptrs that point to the same // shared object concurrently. // FIXME: rename this to safe_linked_ptr to avoid // confusion with normal linked_ptr. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ #include #include #include "gtest/internal/gtest-port.h" namespace testing { namespace internal { // Protects copying of all linked_ptr objects. GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); // This is used internally by all instances of linked_ptr<>. It needs to be // a non-template class because different types of linked_ptr<> can refer to // the same object (linked_ptr(obj) vs linked_ptr(obj)). // So, it needs to be possible for different types of linked_ptr to participate // in the same circular linked list, so we need a single class type here. // // DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. class linked_ptr_internal { public: // Create a new circle that includes only this instance. void join_new() { next_ = this; } // Many linked_ptr operations may change p.link_ for some linked_ptr // variable p in the same circle as this object. Therefore we need // to prevent two such operations from occurring concurrently. // // Note that different types of linked_ptr objects can coexist in a // circle (e.g. linked_ptr, linked_ptr, and // linked_ptr). Therefore we must use a single mutex to // protect all linked_ptr objects. This can create serious // contention in production code, but is acceptable in a testing // framework. // Join an existing circle. void join(linked_ptr_internal const* ptr) GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { MutexLock lock(&g_linked_ptr_mutex); linked_ptr_internal const* p = ptr; while (p->next_ != ptr) { assert(p->next_ != this && "Trying to join() a linked ring we are already in. " "Is GMock thread safety enabled?"); p = p->next_; } p->next_ = this; next_ = ptr; } // Leave whatever circle we're part of. Returns true if we were the // last member of the circle. Once this is done, you can join() another. bool depart() GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) { MutexLock lock(&g_linked_ptr_mutex); if (next_ == this) return true; linked_ptr_internal const* p = next_; while (p->next_ != this) { assert(p->next_ != next_ && "Trying to depart() a linked ring we are not in. " "Is GMock thread safety enabled?"); p = p->next_; } p->next_ = next_; return false; } private: mutable linked_ptr_internal const* next_; }; template class linked_ptr { public: typedef T element_type; // Take over ownership of a raw pointer. This should happen as soon as // possible after the object is created. explicit linked_ptr(T* ptr = NULL) { capture(ptr); } ~linked_ptr() { depart(); } // Copy an existing linked_ptr<>, adding ourselves to the list of references. template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } linked_ptr(linked_ptr const& ptr) { // NOLINT assert(&ptr != this); copy(&ptr); } // Assignment releases the old value and acquires the new. template linked_ptr& operator=(linked_ptr const& ptr) { depart(); copy(&ptr); return *this; } linked_ptr& operator=(linked_ptr const& ptr) { if (&ptr != this) { depart(); copy(&ptr); } return *this; } // Smart pointer members. void reset(T* ptr = NULL) { depart(); capture(ptr); } T* get() const { return value_; } T* operator->() const { return value_; } T& operator*() const { return *value_; } bool operator==(T* p) const { return value_ == p; } bool operator!=(T* p) const { return value_ != p; } template bool operator==(linked_ptr const& ptr) const { return value_ == ptr.get(); } template bool operator!=(linked_ptr const& ptr) const { return value_ != ptr.get(); } private: template friend class linked_ptr; T* value_; linked_ptr_internal link_; void depart() { if (link_.depart()) delete value_; } void capture(T* ptr) { value_ = ptr; link_.join_new(); } template void copy(linked_ptr const* ptr) { value_ = ptr->get(); if (value_) link_.join(&ptr->link_); else link_.join_new(); } }; template inline bool operator==(T* ptr, const linked_ptr& x) { return ptr == x.get(); } template inline bool operator!=(T* ptr, const linked_ptr& x) { return ptr != x.get(); } // A function to convert T* into linked_ptr // Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation // for linked_ptr >(new FooBarBaz(arg)) template linked_ptr make_linked_ptr(T* ptr) { return linked_ptr(ptr); } } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-port-arch.h0000664000175000017500000000757313553267757022235 00000000000000// Copyright 2015, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file defines the GTEST_OS_* macro. // It is separate from gtest-port.h so that custom/gtest-port.h can include it. #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ // Determines the platform on which Google Test is compiled. #ifdef __CYGWIN__ # define GTEST_OS_CYGWIN 1 # elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__) # define GTEST_OS_WINDOWS_MINGW 1 # define GTEST_OS_WINDOWS 1 #elif defined _WIN32 # define GTEST_OS_WINDOWS 1 # ifdef _WIN32_WCE # define GTEST_OS_WINDOWS_MOBILE 1 # elif defined(WINAPI_FAMILY) # include # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) # define GTEST_OS_WINDOWS_DESKTOP 1 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) # define GTEST_OS_WINDOWS_PHONE 1 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) # define GTEST_OS_WINDOWS_RT 1 # elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE) # define GTEST_OS_WINDOWS_PHONE 1 # define GTEST_OS_WINDOWS_TV_TITLE 1 # else // WINAPI_FAMILY defined but no known partition matched. // Default to desktop. # define GTEST_OS_WINDOWS_DESKTOP 1 # endif # else # define GTEST_OS_WINDOWS_DESKTOP 1 # endif // _WIN32_WCE #elif defined __OS2__ # define GTEST_OS_OS2 1 #elif defined __APPLE__ # define GTEST_OS_MAC 1 # if TARGET_OS_IPHONE # define GTEST_OS_IOS 1 # endif #elif defined __DragonFly__ # define GTEST_OS_DRAGONFLY 1 #elif defined __FreeBSD__ # define GTEST_OS_FREEBSD 1 #elif defined __Fuchsia__ # define GTEST_OS_FUCHSIA 1 #elif defined(__GLIBC__) && defined(__FreeBSD_kernel__) # define GTEST_OS_GNU_KFREEBSD 1 #elif defined __linux__ # define GTEST_OS_LINUX 1 # if defined __ANDROID__ # define GTEST_OS_LINUX_ANDROID 1 # endif #elif defined __MVS__ # define GTEST_OS_ZOS 1 #elif defined(__sun) && defined(__SVR4) # define GTEST_OS_SOLARIS 1 #elif defined(_AIX) # define GTEST_OS_AIX 1 #elif defined(__hpux) # define GTEST_OS_HPUX 1 #elif defined __native_client__ # define GTEST_OS_NACL 1 #elif defined __NetBSD__ # define GTEST_OS_NETBSD 1 #elif defined __OpenBSD__ # define GTEST_OS_OPENBSD 1 #elif defined __QNX__ # define GTEST_OS_QNX 1 #elif defined(__HAIKU__) #define GTEST_OS_HAIKU 1 #endif // __CYGWIN__ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-tuple.h0000664000175000017500000006767513510660062021453 00000000000000// This file was GENERATED by command: // pump.py gtest-tuple.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2009 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Implements a subset of TR1 tuple needed by Google Test and Google Mock. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ #include // For ::std::pair. // The compiler used in Symbian has a bug that prevents us from declaring the // tuple template as a friend (it complains that tuple is redefined). This // bypasses the bug by declaring the members that should otherwise be // private as public. // Sun Studio versions < 12 also have the above bug. #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: #else # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ template friend class tuple; \ private: #endif // Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict // with our own definitions. Therefore using our own tuple does not work on // those compilers. #if defined(_MSC_VER) && _MSC_VER >= 1600 /* 1600 is Visual Studio 2010 */ # error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \ GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers." #endif // GTEST_n_TUPLE_(T) is the type of an n-tuple. #define GTEST_0_TUPLE_(T) tuple<> #define GTEST_1_TUPLE_(T) tuple #define GTEST_2_TUPLE_(T) tuple #define GTEST_3_TUPLE_(T) tuple #define GTEST_4_TUPLE_(T) tuple #define GTEST_5_TUPLE_(T) tuple #define GTEST_6_TUPLE_(T) tuple #define GTEST_7_TUPLE_(T) tuple #define GTEST_8_TUPLE_(T) tuple #define GTEST_9_TUPLE_(T) tuple #define GTEST_10_TUPLE_(T) tuple // GTEST_n_TYPENAMES_(T) declares a list of n typenames. #define GTEST_0_TYPENAMES_(T) #define GTEST_1_TYPENAMES_(T) typename T##0 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, typename T##7 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ typename T##3, typename T##4, typename T##5, typename T##6, \ typename T##7, typename T##8, typename T##9 // In theory, defining stuff in the ::std namespace is undefined // behavior. We can do this as we are playing the role of a standard // library vendor. namespace std { namespace tr1 { template class tuple; // Anything in namespace gtest_internal is Google Test's INTERNAL // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. namespace gtest_internal { // ByRef::type is T if T is a reference; otherwise it's const T&. template struct ByRef { typedef const T& type; }; // NOLINT template struct ByRef { typedef T& type; }; // NOLINT // A handy wrapper for ByRef. #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type // AddRef::type is T if T is a reference; otherwise it's T&. This // is the same as tr1::add_reference::type. template struct AddRef { typedef T& type; }; // NOLINT template struct AddRef { typedef T& type; }; // NOLINT // A handy wrapper for AddRef. #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type // A helper for implementing get(). template class Get; // A helper for implementing tuple_element. kIndexValid is true // iff k < the number of fields in tuple type T. template struct TupleElement; template struct TupleElement { typedef T0 type; }; template struct TupleElement { typedef T1 type; }; template struct TupleElement { typedef T2 type; }; template struct TupleElement { typedef T3 type; }; template struct TupleElement { typedef T4 type; }; template struct TupleElement { typedef T5 type; }; template struct TupleElement { typedef T6 type; }; template struct TupleElement { typedef T7 type; }; template struct TupleElement { typedef T8 type; }; template struct TupleElement { typedef T9 type; }; } // namespace gtest_internal template <> class tuple<> { public: tuple() {} tuple(const tuple& /* t */) {} tuple& operator=(const tuple& /* t */) { return *this; } }; template class GTEST_1_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_() {} explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {} tuple(const tuple& t) : f0_(t.f0_) {} template tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_1_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) { f0_ = t.f0_; return *this; } T0 f0_; }; template class GTEST_2_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0), f1_(f1) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {} template tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {} template tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_2_TUPLE_(U)& t) { return CopyFrom(t); } template tuple& operator=(const ::std::pair& p) { f0_ = p.first; f1_ = p.second; return *this; } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; return *this; } T0 f0_; T1 f1_; }; template class GTEST_3_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} template tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_3_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; return *this; } T0 f0_; T1 f1_; T2 f2_; }; template class GTEST_4_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2), f3_(f3) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} template tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_4_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; }; template class GTEST_5_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} template tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_5_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; }; template class GTEST_6_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} template tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_6_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; }; template class GTEST_7_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} template tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_7_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; }; template class GTEST_8_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} template tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_8_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; }; template class GTEST_9_TUPLE_(T) { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} template tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_9_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; }; template class tuple { public: template friend class gtest_internal::Get; tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(), f9_() {} explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {} tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} template tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} tuple& operator=(const tuple& t) { return CopyFrom(t); } template tuple& operator=(const GTEST_10_TUPLE_(U)& t) { return CopyFrom(t); } GTEST_DECLARE_TUPLE_AS_FRIEND_ template tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) { f0_ = t.f0_; f1_ = t.f1_; f2_ = t.f2_; f3_ = t.f3_; f4_ = t.f4_; f5_ = t.f5_; f6_ = t.f6_; f7_ = t.f7_; f8_ = t.f8_; f9_ = t.f9_; return *this; } T0 f0_; T1 f1_; T2 f2_; T3 f3_; T4 f4_; T5 f5_; T6 f6_; T7 f7_; T8 f8_; T9 f9_; }; // 6.1.3.2 Tuple creation functions. // Known limitations: we don't support passing an // std::tr1::reference_wrapper to make_tuple(). And we don't // implement tie(). inline tuple<> make_tuple() { return tuple<>(); } template inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) { return GTEST_1_TUPLE_(T)(f0); } template inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) { return GTEST_2_TUPLE_(T)(f0, f1); } template inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) { return GTEST_3_TUPLE_(T)(f0, f1, f2); } template inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3) { return GTEST_4_TUPLE_(T)(f0, f1, f2, f3); } template inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4) { return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4); } template inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5) { return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5); } template inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6) { return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6); } template inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) { return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7); } template inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8) { return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8); } template inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, const T8& f8, const T9& f9) { return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); } // 6.1.3.3 Tuple helper classes. template struct tuple_size; template struct tuple_size { static const int value = 0; }; template struct tuple_size { static const int value = 1; }; template struct tuple_size { static const int value = 2; }; template struct tuple_size { static const int value = 3; }; template struct tuple_size { static const int value = 4; }; template struct tuple_size { static const int value = 5; }; template struct tuple_size { static const int value = 6; }; template struct tuple_size { static const int value = 7; }; template struct tuple_size { static const int value = 8; }; template struct tuple_size { static const int value = 9; }; template struct tuple_size { static const int value = 10; }; template struct tuple_element { typedef typename gtest_internal::TupleElement< k < (tuple_size::value), k, Tuple>::type type; }; #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type // 6.1.3.4 Element access. namespace gtest_internal { template <> class Get<0> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) Field(Tuple& t) { return t.f0_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) ConstField(const Tuple& t) { return t.f0_; } }; template <> class Get<1> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) Field(Tuple& t) { return t.f1_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) ConstField(const Tuple& t) { return t.f1_; } }; template <> class Get<2> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) Field(Tuple& t) { return t.f2_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) ConstField(const Tuple& t) { return t.f2_; } }; template <> class Get<3> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) Field(Tuple& t) { return t.f3_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) ConstField(const Tuple& t) { return t.f3_; } }; template <> class Get<4> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) Field(Tuple& t) { return t.f4_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) ConstField(const Tuple& t) { return t.f4_; } }; template <> class Get<5> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) Field(Tuple& t) { return t.f5_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) ConstField(const Tuple& t) { return t.f5_; } }; template <> class Get<6> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) Field(Tuple& t) { return t.f6_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) ConstField(const Tuple& t) { return t.f6_; } }; template <> class Get<7> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) Field(Tuple& t) { return t.f7_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) ConstField(const Tuple& t) { return t.f7_; } }; template <> class Get<8> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) Field(Tuple& t) { return t.f8_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) ConstField(const Tuple& t) { return t.f8_; } }; template <> class Get<9> { public: template static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) Field(Tuple& t) { return t.f9_; } // NOLINT template static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) ConstField(const Tuple& t) { return t.f9_; } }; } // namespace gtest_internal template GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get::Field(t); } template GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) get(const GTEST_10_TUPLE_(T)& t) { return gtest_internal::Get::ConstField(t); } // 6.1.3.5 Relational operators // We only implement == and !=, as we don't have a need for the rest yet. namespace gtest_internal { // SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the // first k fields of t1 equals the first k fields of t2. // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if // k1 != k2. template struct SameSizeTuplePrefixComparator; template <> struct SameSizeTuplePrefixComparator<0, 0> { template static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { return true; } }; template struct SameSizeTuplePrefixComparator { template static bool Eq(const Tuple1& t1, const Tuple2& t2) { return SameSizeTuplePrefixComparator::Eq(t1, t2) && ::std::tr1::get(t1) == ::std::tr1::get(t2); } }; } // namespace gtest_internal template inline bool operator==(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return gtest_internal::SameSizeTuplePrefixComparator< tuple_size::value, tuple_size::value>::Eq(t, u); } template inline bool operator!=(const GTEST_10_TUPLE_(T)& t, const GTEST_10_TUPLE_(U)& u) { return !(t == u); } // 6.1.4 Pairs. // Unimplemented. } // namespace tr1 } // namespace std #undef GTEST_0_TUPLE_ #undef GTEST_1_TUPLE_ #undef GTEST_2_TUPLE_ #undef GTEST_3_TUPLE_ #undef GTEST_4_TUPLE_ #undef GTEST_5_TUPLE_ #undef GTEST_6_TUPLE_ #undef GTEST_7_TUPLE_ #undef GTEST_8_TUPLE_ #undef GTEST_9_TUPLE_ #undef GTEST_10_TUPLE_ #undef GTEST_0_TYPENAMES_ #undef GTEST_1_TYPENAMES_ #undef GTEST_2_TYPENAMES_ #undef GTEST_3_TYPENAMES_ #undef GTEST_4_TYPENAMES_ #undef GTEST_5_TYPENAMES_ #undef GTEST_6_TYPENAMES_ #undef GTEST_7_TYPENAMES_ #undef GTEST_8_TYPENAMES_ #undef GTEST_9_TYPENAMES_ #undef GTEST_10_TYPENAMES_ #undef GTEST_DECLARE_TUPLE_AS_FRIEND_ #undef GTEST_BY_REF_ #undef GTEST_ADD_REF_ #undef GTEST_TUPLE_ELEMENT_ #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-type-util.h0000664000175000017500000055332013553267757022266 00000000000000// This file was GENERATED by command: // pump.py gtest-type-util.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Type utilities needed for implementing typed and type-parameterized // tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently we support at most 50 types in a list, and at most 50 // type-parameterized tests in one type-parameterized test suite. // Please contact googletestframework@googlegroups.com if you need // more. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ #include "gtest/internal/gtest-port.h" // #ifdef __GNUC__ is too general here. It is possible to use gcc without using // libstdc++ (which is where cxxabi.h comes from). # if GTEST_HAS_CXXABI_H_ # include # elif defined(__HP_aCC) # include # endif // GTEST_HASH_CXXABI_H_ namespace testing { namespace internal { // Canonicalizes a given name with respect to the Standard C++ Library. // This handles removing the inline namespace within `std` that is // used by various standard libraries (e.g., `std::__1`). Names outside // of namespace std are returned unmodified. inline std::string CanonicalizeForStdLibVersioning(std::string s) { static const char prefix[] = "std::__"; if (s.compare(0, strlen(prefix), prefix) == 0) { std::string::size_type end = s.find("::", strlen(prefix)); if (end != s.npos) { // Erase everything between the initial `std` and the second `::`. s.erase(strlen("std"), end - strlen("std")); } } return s; } // GetTypeName() returns a human-readable name of type T. // NB: This function is also used in Google Mock, so don't move it inside of // the typed-test-only section below. template std::string GetTypeName() { # if GTEST_HAS_RTTI const char* const name = typeid(T).name(); # if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) int status = 0; // gcc's implementation of typeid(T).name() mangles the type name, // so we have to demangle it. # if GTEST_HAS_CXXABI_H_ using abi::__cxa_demangle; # endif // GTEST_HAS_CXXABI_H_ char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status); const std::string name_str(status == 0 ? readable_name : name); free(readable_name); return CanonicalizeForStdLibVersioning(name_str); # else return name; # endif // GTEST_HAS_CXXABI_H_ || __HP_aCC # else return ""; # endif // GTEST_HAS_RTTI } #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // A unique type used as the default value for the arguments of class // template Types. This allows us to simulate variadic templates // (e.g. Types, Type, and etc), which C++ doesn't // support directly. struct None {}; // The following family of struct and struct templates are used to // represent type lists. In particular, TypesN // represents a type list with N types (T1, T2, ..., and TN) in it. // Except for Types0, every struct in the family has two member types: // Head for the first type in the list, and Tail for the rest of the // list. // The empty type list. struct Types0 {}; // Type lists of length 1, 2, 3, and so on. template struct Types1 { typedef T1 Head; typedef Types0 Tail; }; template struct Types2 { typedef T1 Head; typedef Types1 Tail; }; template struct Types3 { typedef T1 Head; typedef Types2 Tail; }; template struct Types4 { typedef T1 Head; typedef Types3 Tail; }; template struct Types5 { typedef T1 Head; typedef Types4 Tail; }; template struct Types6 { typedef T1 Head; typedef Types5 Tail; }; template struct Types7 { typedef T1 Head; typedef Types6 Tail; }; template struct Types8 { typedef T1 Head; typedef Types7 Tail; }; template struct Types9 { typedef T1 Head; typedef Types8 Tail; }; template struct Types10 { typedef T1 Head; typedef Types9 Tail; }; template struct Types11 { typedef T1 Head; typedef Types10 Tail; }; template struct Types12 { typedef T1 Head; typedef Types11 Tail; }; template struct Types13 { typedef T1 Head; typedef Types12 Tail; }; template struct Types14 { typedef T1 Head; typedef Types13 Tail; }; template struct Types15 { typedef T1 Head; typedef Types14 Tail; }; template struct Types16 { typedef T1 Head; typedef Types15 Tail; }; template struct Types17 { typedef T1 Head; typedef Types16 Tail; }; template struct Types18 { typedef T1 Head; typedef Types17 Tail; }; template struct Types19 { typedef T1 Head; typedef Types18 Tail; }; template struct Types20 { typedef T1 Head; typedef Types19 Tail; }; template struct Types21 { typedef T1 Head; typedef Types20 Tail; }; template struct Types22 { typedef T1 Head; typedef Types21 Tail; }; template struct Types23 { typedef T1 Head; typedef Types22 Tail; }; template struct Types24 { typedef T1 Head; typedef Types23 Tail; }; template struct Types25 { typedef T1 Head; typedef Types24 Tail; }; template struct Types26 { typedef T1 Head; typedef Types25 Tail; }; template struct Types27 { typedef T1 Head; typedef Types26 Tail; }; template struct Types28 { typedef T1 Head; typedef Types27 Tail; }; template struct Types29 { typedef T1 Head; typedef Types28 Tail; }; template struct Types30 { typedef T1 Head; typedef Types29 Tail; }; template struct Types31 { typedef T1 Head; typedef Types30 Tail; }; template struct Types32 { typedef T1 Head; typedef Types31 Tail; }; template struct Types33 { typedef T1 Head; typedef Types32 Tail; }; template struct Types34 { typedef T1 Head; typedef Types33 Tail; }; template struct Types35 { typedef T1 Head; typedef Types34 Tail; }; template struct Types36 { typedef T1 Head; typedef Types35 Tail; }; template struct Types37 { typedef T1 Head; typedef Types36 Tail; }; template struct Types38 { typedef T1 Head; typedef Types37 Tail; }; template struct Types39 { typedef T1 Head; typedef Types38 Tail; }; template struct Types40 { typedef T1 Head; typedef Types39 Tail; }; template struct Types41 { typedef T1 Head; typedef Types40 Tail; }; template struct Types42 { typedef T1 Head; typedef Types41 Tail; }; template struct Types43 { typedef T1 Head; typedef Types42 Tail; }; template struct Types44 { typedef T1 Head; typedef Types43 Tail; }; template struct Types45 { typedef T1 Head; typedef Types44 Tail; }; template struct Types46 { typedef T1 Head; typedef Types45 Tail; }; template struct Types47 { typedef T1 Head; typedef Types46 Tail; }; template struct Types48 { typedef T1 Head; typedef Types47 Tail; }; template struct Types49 { typedef T1 Head; typedef Types48 Tail; }; template struct Types50 { typedef T1 Head; typedef Types49 Tail; }; } // namespace internal // We don't want to require the users to write TypesN<...> directly, // as that would require them to count the length. Types<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Types // will appear as Types in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Types, and Google Test will translate // that to TypesN internally to make error messages // readable. The translation is done by the 'type' member of the // Types template. template struct Types { typedef internal::Types50 type; }; template <> struct Types { typedef internal::Types0 type; }; template struct Types { typedef internal::Types1 type; }; template struct Types { typedef internal::Types2 type; }; template struct Types { typedef internal::Types3 type; }; template struct Types { typedef internal::Types4 type; }; template struct Types { typedef internal::Types5 type; }; template struct Types { typedef internal::Types6 type; }; template struct Types { typedef internal::Types7 type; }; template struct Types { typedef internal::Types8 type; }; template struct Types { typedef internal::Types9 type; }; template struct Types { typedef internal::Types10 type; }; template struct Types { typedef internal::Types11 type; }; template struct Types { typedef internal::Types12 type; }; template struct Types { typedef internal::Types13 type; }; template struct Types { typedef internal::Types14 type; }; template struct Types { typedef internal::Types15 type; }; template struct Types { typedef internal::Types16 type; }; template struct Types { typedef internal::Types17 type; }; template struct Types { typedef internal::Types18 type; }; template struct Types { typedef internal::Types19 type; }; template struct Types { typedef internal::Types20 type; }; template struct Types { typedef internal::Types21 type; }; template struct Types { typedef internal::Types22 type; }; template struct Types { typedef internal::Types23 type; }; template struct Types { typedef internal::Types24 type; }; template struct Types { typedef internal::Types25 type; }; template struct Types { typedef internal::Types26 type; }; template struct Types { typedef internal::Types27 type; }; template struct Types { typedef internal::Types28 type; }; template struct Types { typedef internal::Types29 type; }; template struct Types { typedef internal::Types30 type; }; template struct Types { typedef internal::Types31 type; }; template struct Types { typedef internal::Types32 type; }; template struct Types { typedef internal::Types33 type; }; template struct Types { typedef internal::Types34 type; }; template struct Types { typedef internal::Types35 type; }; template struct Types { typedef internal::Types36 type; }; template struct Types { typedef internal::Types37 type; }; template struct Types { typedef internal::Types38 type; }; template struct Types { typedef internal::Types39 type; }; template struct Types { typedef internal::Types40 type; }; template struct Types { typedef internal::Types41 type; }; template struct Types { typedef internal::Types42 type; }; template struct Types { typedef internal::Types43 type; }; template struct Types { typedef internal::Types44 type; }; template struct Types { typedef internal::Types45 type; }; template struct Types { typedef internal::Types46 type; }; template struct Types { typedef internal::Types47 type; }; template struct Types { typedef internal::Types48 type; }; template struct Types { typedef internal::Types49 type; }; namespace internal { # define GTEST_TEMPLATE_ template class // The template "selector" struct TemplateSel is used to // represent Tmpl, which must be a class template with one type // parameter, as a type. TemplateSel::Bind::type is defined // as the type Tmpl. This allows us to actually instantiate the // template "selected" by TemplateSel. // // This trick is necessary for simulating typedef for class templates, // which C++ doesn't support directly. template struct TemplateSel { template struct Bind { typedef Tmpl type; }; }; # define GTEST_BIND_(TmplSel, T) \ TmplSel::template Bind::type // A unique struct template used as the default value for the // arguments of class template Templates. This allows us to simulate // variadic templates (e.g. Templates, Templates, // and etc), which C++ doesn't support directly. template struct NoneT {}; // The following family of struct and struct templates are used to // represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except // for Templates0, every struct in the family has two member types: // Head for the selector of the first template in the list, and Tail // for the rest of the list. // The empty template list. struct Templates0 {}; // Template lists of length 1, 2, 3, and so on. template struct Templates1 { typedef TemplateSel Head; typedef Templates0 Tail; }; template struct Templates2 { typedef TemplateSel Head; typedef Templates1 Tail; }; template struct Templates3 { typedef TemplateSel Head; typedef Templates2 Tail; }; template struct Templates4 { typedef TemplateSel Head; typedef Templates3 Tail; }; template struct Templates5 { typedef TemplateSel Head; typedef Templates4 Tail; }; template struct Templates6 { typedef TemplateSel Head; typedef Templates5 Tail; }; template struct Templates7 { typedef TemplateSel Head; typedef Templates6 Tail; }; template struct Templates8 { typedef TemplateSel Head; typedef Templates7 Tail; }; template struct Templates9 { typedef TemplateSel Head; typedef Templates8 Tail; }; template struct Templates10 { typedef TemplateSel Head; typedef Templates9 Tail; }; template struct Templates11 { typedef TemplateSel Head; typedef Templates10 Tail; }; template struct Templates12 { typedef TemplateSel Head; typedef Templates11 Tail; }; template struct Templates13 { typedef TemplateSel Head; typedef Templates12 Tail; }; template struct Templates14 { typedef TemplateSel Head; typedef Templates13 Tail; }; template struct Templates15 { typedef TemplateSel Head; typedef Templates14 Tail; }; template struct Templates16 { typedef TemplateSel Head; typedef Templates15 Tail; }; template struct Templates17 { typedef TemplateSel Head; typedef Templates16 Tail; }; template struct Templates18 { typedef TemplateSel Head; typedef Templates17 Tail; }; template struct Templates19 { typedef TemplateSel Head; typedef Templates18 Tail; }; template struct Templates20 { typedef TemplateSel Head; typedef Templates19 Tail; }; template struct Templates21 { typedef TemplateSel Head; typedef Templates20 Tail; }; template struct Templates22 { typedef TemplateSel Head; typedef Templates21 Tail; }; template struct Templates23 { typedef TemplateSel Head; typedef Templates22 Tail; }; template struct Templates24 { typedef TemplateSel Head; typedef Templates23 Tail; }; template struct Templates25 { typedef TemplateSel Head; typedef Templates24 Tail; }; template struct Templates26 { typedef TemplateSel Head; typedef Templates25 Tail; }; template struct Templates27 { typedef TemplateSel Head; typedef Templates26 Tail; }; template struct Templates28 { typedef TemplateSel Head; typedef Templates27 Tail; }; template struct Templates29 { typedef TemplateSel Head; typedef Templates28 Tail; }; template struct Templates30 { typedef TemplateSel Head; typedef Templates29 Tail; }; template struct Templates31 { typedef TemplateSel Head; typedef Templates30 Tail; }; template struct Templates32 { typedef TemplateSel Head; typedef Templates31 Tail; }; template struct Templates33 { typedef TemplateSel Head; typedef Templates32 Tail; }; template struct Templates34 { typedef TemplateSel Head; typedef Templates33 Tail; }; template struct Templates35 { typedef TemplateSel Head; typedef Templates34 Tail; }; template struct Templates36 { typedef TemplateSel Head; typedef Templates35 Tail; }; template struct Templates37 { typedef TemplateSel Head; typedef Templates36 Tail; }; template struct Templates38 { typedef TemplateSel Head; typedef Templates37 Tail; }; template struct Templates39 { typedef TemplateSel Head; typedef Templates38 Tail; }; template struct Templates40 { typedef TemplateSel Head; typedef Templates39 Tail; }; template struct Templates41 { typedef TemplateSel Head; typedef Templates40 Tail; }; template struct Templates42 { typedef TemplateSel Head; typedef Templates41 Tail; }; template struct Templates43 { typedef TemplateSel Head; typedef Templates42 Tail; }; template struct Templates44 { typedef TemplateSel Head; typedef Templates43 Tail; }; template struct Templates45 { typedef TemplateSel Head; typedef Templates44 Tail; }; template struct Templates46 { typedef TemplateSel Head; typedef Templates45 Tail; }; template struct Templates47 { typedef TemplateSel Head; typedef Templates46 Tail; }; template struct Templates48 { typedef TemplateSel Head; typedef Templates47 Tail; }; template struct Templates49 { typedef TemplateSel Head; typedef Templates48 Tail; }; template struct Templates50 { typedef TemplateSel Head; typedef Templates49 Tail; }; // We don't want to require the users to write TemplatesN<...> directly, // as that would require them to count the length. Templates<...> is much // easier to write, but generates horrible messages when there is a // compiler error, as gcc insists on printing out each template // argument, even if it has the default value (this means Templates // will appear as Templates in the compiler // errors). // // Our solution is to combine the best part of the two approaches: a // user would write Templates, and Google Test will translate // that to TemplatesN internally to make error messages // readable. The translation is done by the 'type' member of the // Templates template. template struct Templates { typedef Templates50 type; }; template <> struct Templates { typedef Templates0 type; }; template struct Templates { typedef Templates1 type; }; template struct Templates { typedef Templates2 type; }; template struct Templates { typedef Templates3 type; }; template struct Templates { typedef Templates4 type; }; template struct Templates { typedef Templates5 type; }; template struct Templates { typedef Templates6 type; }; template struct Templates { typedef Templates7 type; }; template struct Templates { typedef Templates8 type; }; template struct Templates { typedef Templates9 type; }; template struct Templates { typedef Templates10 type; }; template struct Templates { typedef Templates11 type; }; template struct Templates { typedef Templates12 type; }; template struct Templates { typedef Templates13 type; }; template struct Templates { typedef Templates14 type; }; template struct Templates { typedef Templates15 type; }; template struct Templates { typedef Templates16 type; }; template struct Templates { typedef Templates17 type; }; template struct Templates { typedef Templates18 type; }; template struct Templates { typedef Templates19 type; }; template struct Templates { typedef Templates20 type; }; template struct Templates { typedef Templates21 type; }; template struct Templates { typedef Templates22 type; }; template struct Templates { typedef Templates23 type; }; template struct Templates { typedef Templates24 type; }; template struct Templates { typedef Templates25 type; }; template struct Templates { typedef Templates26 type; }; template struct Templates { typedef Templates27 type; }; template struct Templates { typedef Templates28 type; }; template struct Templates { typedef Templates29 type; }; template struct Templates { typedef Templates30 type; }; template struct Templates { typedef Templates31 type; }; template struct Templates { typedef Templates32 type; }; template struct Templates { typedef Templates33 type; }; template struct Templates { typedef Templates34 type; }; template struct Templates { typedef Templates35 type; }; template struct Templates { typedef Templates36 type; }; template struct Templates { typedef Templates37 type; }; template struct Templates { typedef Templates38 type; }; template struct Templates { typedef Templates39 type; }; template struct Templates { typedef Templates40 type; }; template struct Templates { typedef Templates41 type; }; template struct Templates { typedef Templates42 type; }; template struct Templates { typedef Templates43 type; }; template struct Templates { typedef Templates44 type; }; template struct Templates { typedef Templates45 type; }; template struct Templates { typedef Templates46 type; }; template struct Templates { typedef Templates47 type; }; template struct Templates { typedef Templates48 type; }; template struct Templates { typedef Templates49 type; }; // The TypeList template makes it possible to use either a single type // or a Types<...> list in TYPED_TEST_SUITE() and // INSTANTIATE_TYPED_TEST_SUITE_P(). template struct TypeList { typedef Types1 type; }; template struct TypeList > { typedef typename Types::type type; }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-param-util-generated.h0000664000175000017500000065260213510660062024317 00000000000000// This file was GENERATED by command: // pump.py gtest-param-util-generated.h.pump // DO NOT EDIT BY HAND!!! // Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Type and function utilities for implementing parameterized tests. // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // Currently Google Test supports at most 50 arguments in Values, // and at most 10 arguments in Combine. Please contact // googletestframework@googlegroups.com if you need more. // Please note that the number of arguments to Combine is limited // by the maximum arity of the implementation of tuple which is // currently set at 10. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ #include "gtest/internal/gtest-param-util.h" #include "gtest/internal/gtest-port.h" namespace testing { // Forward declarations of ValuesIn(), which is implemented in // include/gtest/gtest-param-test.h. template internal::ParamGenerator< typename ::testing::internal::IteratorTraits::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end); template internal::ParamGenerator ValuesIn(const T (&array)[N]); template internal::ParamGenerator ValuesIn( const Container& container); namespace internal { // Used in the Values() function to provide polymorphic capabilities. template class ValueArray1 { public: explicit ValueArray1(T1 v1) : v1_(v1) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_)}; return ValuesIn(array); } ValueArray1(const ValueArray1& other) : v1_(other.v1_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray1& other); const T1 v1_; }; template class ValueArray2 { public: ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_)}; return ValuesIn(array); } ValueArray2(const ValueArray2& other) : v1_(other.v1_), v2_(other.v2_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray2& other); const T1 v1_; const T2 v2_; }; template class ValueArray3 { public: ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_)}; return ValuesIn(array); } ValueArray3(const ValueArray3& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray3& other); const T1 v1_; const T2 v2_; const T3 v3_; }; template class ValueArray4 { public: ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3), v4_(v4) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_)}; return ValuesIn(array); } ValueArray4(const ValueArray4& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray4& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; }; template class ValueArray5 { public: ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_)}; return ValuesIn(array); } ValueArray5(const ValueArray5& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray5& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; }; template class ValueArray6 { public: ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_)}; return ValuesIn(array); } ValueArray6(const ValueArray6& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray6& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; }; template class ValueArray7 { public: ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_)}; return ValuesIn(array); } ValueArray7(const ValueArray7& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray7& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; }; template class ValueArray8 { public: ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_)}; return ValuesIn(array); } ValueArray8(const ValueArray8& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray8& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; }; template class ValueArray9 { public: ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_)}; return ValuesIn(array); } ValueArray9(const ValueArray9& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray9& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; }; template class ValueArray10 { public: ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_)}; return ValuesIn(array); } ValueArray10(const ValueArray10& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray10& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; }; template class ValueArray11 { public: ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_)}; return ValuesIn(array); } ValueArray11(const ValueArray11& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray11& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; }; template class ValueArray12 { public: ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_)}; return ValuesIn(array); } ValueArray12(const ValueArray12& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray12& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; }; template class ValueArray13 { public: ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_)}; return ValuesIn(array); } ValueArray13(const ValueArray13& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray13& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; }; template class ValueArray14 { public: ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_)}; return ValuesIn(array); } ValueArray14(const ValueArray14& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray14& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; }; template class ValueArray15 { public: ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_)}; return ValuesIn(array); } ValueArray15(const ValueArray15& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray15& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; }; template class ValueArray16 { public: ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_)}; return ValuesIn(array); } ValueArray16(const ValueArray16& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray16& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; }; template class ValueArray17 { public: ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_)}; return ValuesIn(array); } ValueArray17(const ValueArray17& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray17& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; }; template class ValueArray18 { public: ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_)}; return ValuesIn(array); } ValueArray18(const ValueArray18& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray18& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; }; template class ValueArray19 { public: ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_)}; return ValuesIn(array); } ValueArray19(const ValueArray19& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray19& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; }; template class ValueArray20 { public: ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_)}; return ValuesIn(array); } ValueArray20(const ValueArray20& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray20& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; }; template class ValueArray21 { public: ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_)}; return ValuesIn(array); } ValueArray21(const ValueArray21& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray21& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; }; template class ValueArray22 { public: ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_)}; return ValuesIn(array); } ValueArray22(const ValueArray22& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray22& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; }; template class ValueArray23 { public: ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_)}; return ValuesIn(array); } ValueArray23(const ValueArray23& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray23& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; }; template class ValueArray24 { public: ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_)}; return ValuesIn(array); } ValueArray24(const ValueArray24& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray24& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; }; template class ValueArray25 { public: ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_)}; return ValuesIn(array); } ValueArray25(const ValueArray25& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray25& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; }; template class ValueArray26 { public: ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_)}; return ValuesIn(array); } ValueArray26(const ValueArray26& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray26& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; }; template class ValueArray27 { public: ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_)}; return ValuesIn(array); } ValueArray27(const ValueArray27& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray27& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; }; template class ValueArray28 { public: ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_)}; return ValuesIn(array); } ValueArray28(const ValueArray28& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray28& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; }; template class ValueArray29 { public: ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_)}; return ValuesIn(array); } ValueArray29(const ValueArray29& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray29& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; }; template class ValueArray30 { public: ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_)}; return ValuesIn(array); } ValueArray30(const ValueArray30& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray30& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; }; template class ValueArray31 { public: ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_)}; return ValuesIn(array); } ValueArray31(const ValueArray31& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray31& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; }; template class ValueArray32 { public: ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_)}; return ValuesIn(array); } ValueArray32(const ValueArray32& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray32& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; }; template class ValueArray33 { public: ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_)}; return ValuesIn(array); } ValueArray33(const ValueArray33& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray33& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; }; template class ValueArray34 { public: ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_)}; return ValuesIn(array); } ValueArray34(const ValueArray34& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray34& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; }; template class ValueArray35 { public: ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_)}; return ValuesIn(array); } ValueArray35(const ValueArray35& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray35& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; }; template class ValueArray36 { public: ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_)}; return ValuesIn(array); } ValueArray36(const ValueArray36& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray36& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; }; template class ValueArray37 { public: ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_)}; return ValuesIn(array); } ValueArray37(const ValueArray37& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray37& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; }; template class ValueArray38 { public: ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_)}; return ValuesIn(array); } ValueArray38(const ValueArray38& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray38& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; }; template class ValueArray39 { public: ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_)}; return ValuesIn(array); } ValueArray39(const ValueArray39& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray39& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; }; template class ValueArray40 { public: ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_)}; return ValuesIn(array); } ValueArray40(const ValueArray40& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray40& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; }; template class ValueArray41 { public: ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_)}; return ValuesIn(array); } ValueArray41(const ValueArray41& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray41& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; }; template class ValueArray42 { public: ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_)}; return ValuesIn(array); } ValueArray42(const ValueArray42& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray42& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; }; template class ValueArray43 { public: ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_)}; return ValuesIn(array); } ValueArray43(const ValueArray43& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray43& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; }; template class ValueArray44 { public: ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_)}; return ValuesIn(array); } ValueArray44(const ValueArray44& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray44& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; }; template class ValueArray45 { public: ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_)}; return ValuesIn(array); } ValueArray45(const ValueArray45& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_), v45_(other.v45_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray45& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; }; template class ValueArray46 { public: ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_)}; return ValuesIn(array); } ValueArray46(const ValueArray46& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray46& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; }; template class ValueArray47 { public: ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_)}; return ValuesIn(array); } ValueArray47(const ValueArray47& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_), v47_(other.v47_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray47& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; }; template class ValueArray48 { public: ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_), static_cast(v48_)}; return ValuesIn(array); } ValueArray48(const ValueArray48& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_), v47_(other.v47_), v48_(other.v48_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray48& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; }; template class ValueArray49 { public: ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_), static_cast(v48_), static_cast(v49_)}; return ValuesIn(array); } ValueArray49(const ValueArray49& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_), v47_(other.v47_), v48_(other.v48_), v49_(other.v49_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray49& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; }; template class ValueArray50 { public: ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {} template operator ParamGenerator() const { const T array[] = {static_cast(v1_), static_cast(v2_), static_cast(v3_), static_cast(v4_), static_cast(v5_), static_cast(v6_), static_cast(v7_), static_cast(v8_), static_cast(v9_), static_cast(v10_), static_cast(v11_), static_cast(v12_), static_cast(v13_), static_cast(v14_), static_cast(v15_), static_cast(v16_), static_cast(v17_), static_cast(v18_), static_cast(v19_), static_cast(v20_), static_cast(v21_), static_cast(v22_), static_cast(v23_), static_cast(v24_), static_cast(v25_), static_cast(v26_), static_cast(v27_), static_cast(v28_), static_cast(v29_), static_cast(v30_), static_cast(v31_), static_cast(v32_), static_cast(v33_), static_cast(v34_), static_cast(v35_), static_cast(v36_), static_cast(v37_), static_cast(v38_), static_cast(v39_), static_cast(v40_), static_cast(v41_), static_cast(v42_), static_cast(v43_), static_cast(v44_), static_cast(v45_), static_cast(v46_), static_cast(v47_), static_cast(v48_), static_cast(v49_), static_cast(v50_)}; return ValuesIn(array); } ValueArray50(const ValueArray50& other) : v1_(other.v1_), v2_(other.v2_), v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_), v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_), v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_), v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_), v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_), v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_), v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_), v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_), v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_), v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_), v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_), v47_(other.v47_), v48_(other.v48_), v49_(other.v49_), v50_(other.v50_) {} private: // No implementation - assignment is unsupported. void operator=(const ValueArray50& other); const T1 v1_; const T2 v2_; const T3 v3_; const T4 v4_; const T5 v5_; const T6 v6_; const T7 v7_; const T8 v8_; const T9 v9_; const T10 v10_; const T11 v11_; const T12 v12_; const T13 v13_; const T14 v14_; const T15 v15_; const T16 v16_; const T17 v17_; const T18 v18_; const T19 v19_; const T20 v20_; const T21 v21_; const T22 v22_; const T23 v23_; const T24 v24_; const T25 v25_; const T26 v26_; const T27 v27_; const T28 v28_; const T29 v29_; const T30 v30_; const T31 v31_; const T32 v32_; const T33 v33_; const T34 v34_; const T35 v35_; const T36 v36_; const T37 v37_; const T38 v38_; const T39 v39_; const T40 v40_; const T41 v41_; const T42 v42_; const T43 v43_; const T44 v44_; const T45 v45_; const T46 v46_; const T47 v47_; const T48 v48_; const T49 v49_; const T50 v50_; }; # if GTEST_HAS_COMBINE // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Generates values from the Cartesian product of values produced // by the argument generators. // template class CartesianProductGenerator2 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator2(const ParamGenerator& g1, const ParamGenerator& g2) : g1_(g1), g2_(g2) {} virtual ~CartesianProductGenerator2() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current2_; if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; linked_ptr current_value_; }; // class CartesianProductGenerator2::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator2& other); const ParamGenerator g1_; const ParamGenerator g2_; }; // class CartesianProductGenerator2 template class CartesianProductGenerator3 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator3(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3) : g1_(g1), g2_(g2), g3_(g3) {} virtual ~CartesianProductGenerator3() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current3_; if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; linked_ptr current_value_; }; // class CartesianProductGenerator3::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator3& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; }; // class CartesianProductGenerator3 template class CartesianProductGenerator4 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator4(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} virtual ~CartesianProductGenerator4() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current4_; if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; linked_ptr current_value_; }; // class CartesianProductGenerator4::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator4& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; }; // class CartesianProductGenerator4 template class CartesianProductGenerator5 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator5(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} virtual ~CartesianProductGenerator5() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current5_; if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_, *current5_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; linked_ptr current_value_; }; // class CartesianProductGenerator5::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator5& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; }; // class CartesianProductGenerator5 template class CartesianProductGenerator6 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator6(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} virtual ~CartesianProductGenerator6() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current6_; if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; linked_ptr current_value_; }; // class CartesianProductGenerator6::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator6& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; }; // class CartesianProductGenerator6 template class CartesianProductGenerator7 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator7(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} virtual ~CartesianProductGenerator7() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current7_; if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; linked_ptr current_value_; }; // class CartesianProductGenerator7::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator7& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; }; // class CartesianProductGenerator7 template class CartesianProductGenerator8 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator8(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} virtual ~CartesianProductGenerator8() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current8_; if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; linked_ptr current_value_; }; // class CartesianProductGenerator8::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator8& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; }; // class CartesianProductGenerator8 template class CartesianProductGenerator9 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator9(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8, const ParamGenerator& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} virtual ~CartesianProductGenerator9() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8, const ParamGenerator& g9, const typename ParamGenerator::iterator& current9) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current9_; if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; const typename ParamGenerator::iterator begin9_; const typename ParamGenerator::iterator end9_; typename ParamGenerator::iterator current9_; linked_ptr current_value_; }; // class CartesianProductGenerator9::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator9& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; const ParamGenerator g9_; }; // class CartesianProductGenerator9 template class CartesianProductGenerator10 : public ParamGeneratorInterface< ::testing::tuple > { public: typedef ::testing::tuple ParamType; CartesianProductGenerator10(const ParamGenerator& g1, const ParamGenerator& g2, const ParamGenerator& g3, const ParamGenerator& g4, const ParamGenerator& g5, const ParamGenerator& g6, const ParamGenerator& g7, const ParamGenerator& g8, const ParamGenerator& g9, const ParamGenerator& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} virtual ~CartesianProductGenerator10() {} virtual ParamIteratorInterface* Begin() const { return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin()); } virtual ParamIteratorInterface* End() const { return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, g8_.end(), g9_, g9_.end(), g10_, g10_.end()); } private: class Iterator : public ParamIteratorInterface { public: Iterator(const ParamGeneratorInterface* base, const ParamGenerator& g1, const typename ParamGenerator::iterator& current1, const ParamGenerator& g2, const typename ParamGenerator::iterator& current2, const ParamGenerator& g3, const typename ParamGenerator::iterator& current3, const ParamGenerator& g4, const typename ParamGenerator::iterator& current4, const ParamGenerator& g5, const typename ParamGenerator::iterator& current5, const ParamGenerator& g6, const typename ParamGenerator::iterator& current6, const ParamGenerator& g7, const typename ParamGenerator::iterator& current7, const ParamGenerator& g8, const typename ParamGenerator::iterator& current8, const ParamGenerator& g9, const typename ParamGenerator::iterator& current9, const ParamGenerator& g10, const typename ParamGenerator::iterator& current10) : base_(base), begin1_(g1.begin()), end1_(g1.end()), current1_(current1), begin2_(g2.begin()), end2_(g2.end()), current2_(current2), begin3_(g3.begin()), end3_(g3.end()), current3_(current3), begin4_(g4.begin()), end4_(g4.end()), current4_(current4), begin5_(g5.begin()), end5_(g5.end()), current5_(current5), begin6_(g6.begin()), end6_(g6.end()), current6_(current6), begin7_(g7.begin()), end7_(g7.end()), current7_(current7), begin8_(g8.begin()), end8_(g8.end()), current8_(current8), begin9_(g9.begin()), end9_(g9.end()), current9_(current9), begin10_(g10.begin()), end10_(g10.end()), current10_(current10) { ComputeCurrentValue(); } virtual ~Iterator() {} virtual const ParamGeneratorInterface* BaseGenerator() const { return base_; } // Advance should not be called on beyond-of-range iterators // so no component iterators must be beyond end of range, either. virtual void Advance() { assert(!AtEnd()); ++current10_; if (current10_ == end10_) { current10_ = begin10_; ++current9_; } if (current9_ == end9_) { current9_ = begin9_; ++current8_; } if (current8_ == end8_) { current8_ = begin8_; ++current7_; } if (current7_ == end7_) { current7_ = begin7_; ++current6_; } if (current6_ == end6_) { current6_ = begin6_; ++current5_; } if (current5_ == end5_) { current5_ = begin5_; ++current4_; } if (current4_ == end4_) { current4_ = begin4_; ++current3_; } if (current3_ == end3_) { current3_ = begin3_; ++current2_; } if (current2_ == end2_) { current2_ = begin2_; ++current1_; } ComputeCurrentValue(); } virtual ParamIteratorInterface* Clone() const { return new Iterator(*this); } virtual const ParamType* Current() const { return current_value_.get(); } virtual bool Equals(const ParamIteratorInterface& other) const { // Having the same base generator guarantees that the other // iterator is of the same type and we can downcast. GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) << "The program attempted to compare iterators " << "from different generators." << std::endl; const Iterator* typed_other = CheckedDowncastToActualType(&other); // We must report iterators equal if they both point beyond their // respective ranges. That can happen in a variety of fashions, // so we have to consult AtEnd(). return (AtEnd() && typed_other->AtEnd()) || ( current1_ == typed_other->current1_ && current2_ == typed_other->current2_ && current3_ == typed_other->current3_ && current4_ == typed_other->current4_ && current5_ == typed_other->current5_ && current6_ == typed_other->current6_ && current7_ == typed_other->current7_ && current8_ == typed_other->current8_ && current9_ == typed_other->current9_ && current10_ == typed_other->current10_); } private: Iterator(const Iterator& other) : base_(other.base_), begin1_(other.begin1_), end1_(other.end1_), current1_(other.current1_), begin2_(other.begin2_), end2_(other.end2_), current2_(other.current2_), begin3_(other.begin3_), end3_(other.end3_), current3_(other.current3_), begin4_(other.begin4_), end4_(other.end4_), current4_(other.current4_), begin5_(other.begin5_), end5_(other.end5_), current5_(other.current5_), begin6_(other.begin6_), end6_(other.end6_), current6_(other.current6_), begin7_(other.begin7_), end7_(other.end7_), current7_(other.current7_), begin8_(other.begin8_), end8_(other.end8_), current8_(other.current8_), begin9_(other.begin9_), end9_(other.end9_), current9_(other.current9_), begin10_(other.begin10_), end10_(other.end10_), current10_(other.current10_) { ComputeCurrentValue(); } void ComputeCurrentValue() { if (!AtEnd()) current_value_.reset(new ParamType(*current1_, *current2_, *current3_, *current4_, *current5_, *current6_, *current7_, *current8_, *current9_, *current10_)); } bool AtEnd() const { // We must report iterator past the end of the range when either of the // component iterators has reached the end of its range. return current1_ == end1_ || current2_ == end2_ || current3_ == end3_ || current4_ == end4_ || current5_ == end5_ || current6_ == end6_ || current7_ == end7_ || current8_ == end8_ || current9_ == end9_ || current10_ == end10_; } // No implementation - assignment is unsupported. void operator=(const Iterator& other); const ParamGeneratorInterface* const base_; // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. // current[i]_ is the actual traversing iterator. const typename ParamGenerator::iterator begin1_; const typename ParamGenerator::iterator end1_; typename ParamGenerator::iterator current1_; const typename ParamGenerator::iterator begin2_; const typename ParamGenerator::iterator end2_; typename ParamGenerator::iterator current2_; const typename ParamGenerator::iterator begin3_; const typename ParamGenerator::iterator end3_; typename ParamGenerator::iterator current3_; const typename ParamGenerator::iterator begin4_; const typename ParamGenerator::iterator end4_; typename ParamGenerator::iterator current4_; const typename ParamGenerator::iterator begin5_; const typename ParamGenerator::iterator end5_; typename ParamGenerator::iterator current5_; const typename ParamGenerator::iterator begin6_; const typename ParamGenerator::iterator end6_; typename ParamGenerator::iterator current6_; const typename ParamGenerator::iterator begin7_; const typename ParamGenerator::iterator end7_; typename ParamGenerator::iterator current7_; const typename ParamGenerator::iterator begin8_; const typename ParamGenerator::iterator end8_; typename ParamGenerator::iterator current8_; const typename ParamGenerator::iterator begin9_; const typename ParamGenerator::iterator end9_; typename ParamGenerator::iterator current9_; const typename ParamGenerator::iterator begin10_; const typename ParamGenerator::iterator end10_; typename ParamGenerator::iterator current10_; linked_ptr current_value_; }; // class CartesianProductGenerator10::Iterator // No implementation - assignment is unsupported. void operator=(const CartesianProductGenerator10& other); const ParamGenerator g1_; const ParamGenerator g2_; const ParamGenerator g3_; const ParamGenerator g4_; const ParamGenerator g5_; const ParamGenerator g6_; const ParamGenerator g7_; const ParamGenerator g8_; const ParamGenerator g9_; const ParamGenerator g10_; }; // class CartesianProductGenerator10 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Helper classes providing Combine() with polymorphic features. They allow // casting CartesianProductGeneratorN to ParamGenerator if T is // convertible to U. // template class CartesianProductHolder2 { public: CartesianProductHolder2(const Generator1& g1, const Generator2& g2) : g1_(g1), g2_(g2) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator2( static_cast >(g1_), static_cast >(g2_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder2& other); const Generator1 g1_; const Generator2 g2_; }; // class CartesianProductHolder2 template class CartesianProductHolder3 { public: CartesianProductHolder3(const Generator1& g1, const Generator2& g2, const Generator3& g3) : g1_(g1), g2_(g2), g3_(g3) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator3( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder3& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; }; // class CartesianProductHolder3 template class CartesianProductHolder4 { public: CartesianProductHolder4(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4) : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator4( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder4& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; }; // class CartesianProductHolder4 template class CartesianProductHolder5 { public: CartesianProductHolder5(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator5( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder5& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; }; // class CartesianProductHolder5 template class CartesianProductHolder6 { public: CartesianProductHolder6(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator6( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder6& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; }; // class CartesianProductHolder6 template class CartesianProductHolder7 { public: CartesianProductHolder7(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator7( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder7& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; }; // class CartesianProductHolder7 template class CartesianProductHolder8 { public: CartesianProductHolder8(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator8( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder8& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; }; // class CartesianProductHolder8 template class CartesianProductHolder9 { public: CartesianProductHolder9(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator9( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_), static_cast >(g9_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder9& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; }; // class CartesianProductHolder9 template class CartesianProductHolder10 { public: CartesianProductHolder10(const Generator1& g1, const Generator2& g2, const Generator3& g3, const Generator4& g4, const Generator5& g5, const Generator6& g6, const Generator7& g7, const Generator8& g8, const Generator9& g9, const Generator10& g10) : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), g9_(g9), g10_(g10) {} template operator ParamGenerator< ::testing::tuple >() const { return ParamGenerator< ::testing::tuple >( new CartesianProductGenerator10( static_cast >(g1_), static_cast >(g2_), static_cast >(g3_), static_cast >(g4_), static_cast >(g5_), static_cast >(g6_), static_cast >(g7_), static_cast >(g8_), static_cast >(g9_), static_cast >(g10_))); } private: // No implementation - assignment is unsupported. void operator=(const CartesianProductHolder10& other); const Generator1 g1_; const Generator2 g2_; const Generator3 g3_; const Generator4 g4_; const Generator5 g5_; const Generator6 g6_; const Generator7 g7_; const Generator8 g8_; const Generator9 g9_; const Generator10 g10_; }; // class CartesianProductHolder10 # endif // GTEST_HAS_COMBINE } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-string.h0000664000175000017500000001563613553267757021643 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file declares the String class and functions used internally by // Google Test. They are subject to change without notice. They should not used // by code external to Google Test. // // This header file is #included by gtest-internal.h. // It should not be #included by other files. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ #ifdef __BORLANDC__ // string.h is not guaranteed to provide strcpy on C++ Builder. # include #endif #include #include #include "gtest/internal/gtest-port.h" namespace testing { namespace internal { // String - an abstract class holding static string utilities. class GTEST_API_ String { public: // Static utility methods // Clones a 0-terminated C string, allocating memory using new. The // caller is responsible for deleting the return value using // delete[]. Returns the cloned string, or NULL if the input is // NULL. // // This is different from strdup() in string.h, which allocates // memory using malloc(). static const char* CloneCString(const char* c_str); #if GTEST_OS_WINDOWS_MOBILE // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be // able to pass strings to Win32 APIs on CE we need to convert them // to 'Unicode', UTF-16. // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. // // The wide string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static LPCWSTR AnsiToUtf16(const char* c_str); // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. // // The returned string is created using the ANSI codepage (CP_ACP) to // match the behaviour of the ANSI versions of Win32 calls and the // C runtime. static const char* Utf16ToAnsi(LPCWSTR utf16_str); #endif // Compares two C strings. Returns true if and only if they have the same // content. // // Unlike strcmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CStringEquals(const char* lhs, const char* rhs); // Converts a wide C string to a String using the UTF-8 encoding. // NULL will be converted to "(null)". If an error occurred during // the conversion, "(failed to convert from wide string)" is // returned. static std::string ShowWideCString(const wchar_t* wide_c_str); // Compares two wide C strings. Returns true if and only if they have the // same content. // // Unlike wcscmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Compares two C strings, ignoring case. Returns true if and only if // they have the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL C string, // including the empty string. static bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs); // Compares two wide C strings, ignoring case. Returns true if and only if // they have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); // Returns true if and only if the given string ends with the given suffix, // ignoring case. Any string is considered to end with an empty suffix. static bool EndsWithCaseInsensitive( const std::string& str, const std::string& suffix); // Formats an int value as "%02d". static std::string FormatIntWidth2(int value); // "%02d" for width == 2 // Formats an int value as "%X". static std::string FormatHexInt(int value); // Formats an int value as "%X". static std::string FormatHexUInt32(UInt32 value); // Formats a byte as "%02X". static std::string FormatByte(unsigned char value); private: String(); // Not meant to be instantiated. }; // class String // Gets the content of the stringstream's buffer as an std::string. Each '\0' // character in the buffer is replaced with "\\0". GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-internal.h0000664000175000017500000015127413553267757022150 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file declares functions and macros used internally by // Google Test. They are subject to change without notice. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ #include "gtest/internal/gtest-port.h" #if GTEST_OS_LINUX # include # include # include # include #endif // GTEST_OS_LINUX #if GTEST_HAS_EXCEPTIONS # include #endif #include #include #include #include #include #include #include #include #include #include #include "gtest/gtest-message.h" #include "gtest/internal/gtest-filepath.h" #include "gtest/internal/gtest-string.h" #include "gtest/internal/gtest-type-util.h" // Due to C++ preprocessor weirdness, we need double indirection to // concatenate two tokens when one of them is __LINE__. Writing // // foo ## __LINE__ // // will result in the token foo__LINE__, instead of foo followed by // the current line number. For more details, see // http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 #define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) #define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar // Stringifies its argument. #define GTEST_STRINGIFY_(name) #name namespace proto2 { class Message; } namespace testing { // Forward declarations. class AssertionResult; // Result of an assertion. class Message; // Represents a failure message. class Test; // Represents a test. class TestInfo; // Information about a test. class TestPartResult; // Result of a test part. class UnitTest; // A collection of test suites. template ::std::string PrintToString(const T& value); namespace internal { struct TraceInfo; // Information about a trace point. class TestInfoImpl; // Opaque implementation of TestInfo class UnitTestImpl; // Opaque implementation of UnitTest // The text used in failure messages to indicate the start of the // stack trace. GTEST_API_ extern const char kStackTraceMarker[]; // An IgnoredValue object can be implicitly constructed from ANY value. class IgnoredValue { struct Sink {}; public: // This constructor template allows any value to be implicitly // converted to IgnoredValue. The object has no data member and // doesn't try to remember anything about the argument. We // deliberately omit the 'explicit' keyword in order to allow the // conversion to be implicit. // Disable the conversion if T already has a magical conversion operator. // Otherwise we get ambiguity. template ::value, int>::type = 0> IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit) }; // Appends the user-supplied message to the Google-Test-generated message. GTEST_API_ std::string AppendUserMessage( const std::string& gtest_msg, const Message& user_msg); #if GTEST_HAS_EXCEPTIONS GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \ /* an exported class was derived from a class that was not exported */) // This exception is thrown by (and only by) a failed Google Test // assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions // are enabled). We derive it from std::runtime_error, which is for // errors presumably detectable only at run time. Since // std::runtime_error inherits from std::exception, many testing // frameworks know how to extract and print the message inside it. class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { public: explicit GoogleTestFailureException(const TestPartResult& failure); }; GTEST_DISABLE_MSC_WARNINGS_POP_() // 4275 #endif // GTEST_HAS_EXCEPTIONS namespace edit_distance { // Returns the optimal edits to go from 'left' to 'right'. // All edits cost the same, with replace having lower priority than // add/remove. // Simple implementation of the Wagner-Fischer algorithm. // See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm enum EditType { kMatch, kAdd, kRemove, kReplace }; GTEST_API_ std::vector CalculateOptimalEdits( const std::vector& left, const std::vector& right); // Same as above, but the input is represented as strings. GTEST_API_ std::vector CalculateOptimalEdits( const std::vector& left, const std::vector& right); // Create a diff of the input strings in Unified diff format. GTEST_API_ std::string CreateUnifiedDiff(const std::vector& left, const std::vector& right, size_t context = 2); } // namespace edit_distance // Calculate the diff between 'left' and 'right' and return it in unified diff // format. // If not null, stores in 'total_line_count' the total number of lines found // in left + right. GTEST_API_ std::string DiffStrings(const std::string& left, const std::string& right, size_t* total_line_count); // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // expected_expression: "foo" // actual_expression: "bar" // expected_value: "5" // actual_value: "6" // // The ignoring_case parameter is true if and only if the assertion is a // *_STRCASEEQ*. When it's true, the string " (ignoring case)" will // be inserted into the message. GTEST_API_ AssertionResult EqFailure(const char* expected_expression, const char* actual_expression, const std::string& expected_value, const std::string& actual_value, bool ignoring_case); // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. GTEST_API_ std::string GetBoolAssertionFailureMessage( const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value); // This template class represents an IEEE floating-point number // (either single-precision or double-precision, depending on the // template parameters). // // The purpose of this class is to do more sophisticated number // comparison. (Due to round-off error, etc, it's very unlikely that // two floating-points will be equal exactly. Hence a naive // comparison by the == operation often doesn't work.) // // Format of IEEE floating-point: // // The most-significant bit being the leftmost, an IEEE // floating-point looks like // // sign_bit exponent_bits fraction_bits // // Here, sign_bit is a single bit that designates the sign of the // number. // // For float, there are 8 exponent bits and 23 fraction bits. // // For double, there are 11 exponent bits and 52 fraction bits. // // More details can be found at // http://en.wikipedia.org/wiki/IEEE_floating-point_standard. // // Template parameter: // // RawType: the raw floating-point type (either float or double) template class FloatingPoint { public: // Defines the unsigned integer type that has the same size as the // floating point number. typedef typename TypeWithSize::UInt Bits; // Constants. // # of bits in a number. static const size_t kBitCount = 8*sizeof(RawType); // # of fraction bits in a number. static const size_t kFractionBitCount = std::numeric_limits::digits - 1; // # of exponent bits in a number. static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; // The mask for the sign bit. static const Bits kSignBitMask = static_cast(1) << (kBitCount - 1); // The mask for the fraction bits. static const Bits kFractionBitMask = ~static_cast(0) >> (kExponentBitCount + 1); // The mask for the exponent bits. static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); // How many ULP's (Units in the Last Place) we want to tolerate when // comparing two numbers. The larger the value, the more error we // allow. A 0 value means that two numbers must be exactly the same // to be considered equal. // // The maximum error of a single floating-point operation is 0.5 // units in the last place. On Intel CPU's, all floating-point // calculations are done with 80-bit precision, while double has 64 // bits. Therefore, 4 should be enough for ordinary use. // // See the following article for more details on ULP: // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ static const size_t kMaxUlps = 4; // Constructs a FloatingPoint from a raw floating-point number. // // On an Intel CPU, passing a non-normalized NAN (Not a Number) // around may change its bits, although the new value is guaranteed // to be also a NAN. Therefore, don't expect this constructor to // preserve the bits in x when x is a NAN. explicit FloatingPoint(const RawType& x) { u_.value_ = x; } // Static methods // Reinterprets a bit pattern as a floating-point number. // // This function is needed to test the AlmostEquals() method. static RawType ReinterpretBits(const Bits bits) { FloatingPoint fp(0); fp.u_.bits_ = bits; return fp.u_.value_; } // Returns the floating-point number that represent positive infinity. static RawType Infinity() { return ReinterpretBits(kExponentBitMask); } // Returns the maximum representable finite floating-point number. static RawType Max(); // Non-static methods // Returns the bits that represents this number. const Bits &bits() const { return u_.bits_; } // Returns the exponent bits of this number. Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } // Returns the fraction bits of this number. Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } // Returns the sign bit of this number. Bits sign_bit() const { return kSignBitMask & u_.bits_; } // Returns true if and only if this is NAN (not a number). bool is_nan() const { // It's a NAN if the exponent bits are all ones and the fraction // bits are not entirely zeros. return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); } // Returns true if and only if this number is at most kMaxUlps ULP's away // from rhs. In particular, this function: // // - returns false if either number is (or both are) NAN. // - treats really large numbers as almost equal to infinity. // - thinks +0.0 and -0.0 are 0 DLP's apart. bool AlmostEquals(const FloatingPoint& rhs) const { // The IEEE standard says that any comparison operation involving // a NAN must return false. if (is_nan() || rhs.is_nan()) return false; return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) <= kMaxUlps; } private: // The data type used to store the actual floating-point number. union FloatingPointUnion { RawType value_; // The raw floating-point number. Bits bits_; // The bits that represent the number. }; // Converts an integer from the sign-and-magnitude representation to // the biased representation. More precisely, let N be 2 to the // power of (kBitCount - 1), an integer x is represented by the // unsigned number x + N. // // For instance, // // -N + 1 (the most negative number representable using // sign-and-magnitude) is represented by 1; // 0 is represented by N; and // N - 1 (the biggest number representable using // sign-and-magnitude) is represented by 2N - 1. // // Read http://en.wikipedia.org/wiki/Signed_number_representations // for more details on signed number representations. static Bits SignAndMagnitudeToBiased(const Bits &sam) { if (kSignBitMask & sam) { // sam represents a negative number. return ~sam + 1; } else { // sam represents a positive number. return kSignBitMask | sam; } } // Given two numbers in the sign-and-magnitude representation, // returns the distance between them as an unsigned number. static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, const Bits &sam2) { const Bits biased1 = SignAndMagnitudeToBiased(sam1); const Bits biased2 = SignAndMagnitudeToBiased(sam2); return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); } FloatingPointUnion u_; }; // We cannot use std::numeric_limits::max() as it clashes with the max() // macro defined by . template <> inline float FloatingPoint::Max() { return FLT_MAX; } template <> inline double FloatingPoint::Max() { return DBL_MAX; } // Typedefs the instances of the FloatingPoint template class that we // care to use. typedef FloatingPoint Float; typedef FloatingPoint Double; // In order to catch the mistake of putting tests that use different // test fixture classes in the same test suite, we need to assign // unique IDs to fixture classes and compare them. The TypeId type is // used to hold such IDs. The user should treat TypeId as an opaque // type: the only operation allowed on TypeId values is to compare // them for equality using the == operator. typedef const void* TypeId; template class TypeIdHelper { public: // dummy_ must not have a const type. Otherwise an overly eager // compiler (e.g. MSVC 7.1 & 8.0) may try to merge // TypeIdHelper::dummy_ for different Ts as an "optimization". static bool dummy_; }; template bool TypeIdHelper::dummy_ = false; // GetTypeId() returns the ID of type T. Different values will be // returned for different types. Calling the function twice with the // same type argument is guaranteed to return the same ID. template TypeId GetTypeId() { // The compiler is required to allocate a different // TypeIdHelper::dummy_ variable for each T used to instantiate // the template. Therefore, the address of dummy_ is guaranteed to // be unique. return &(TypeIdHelper::dummy_); } // Returns the type ID of ::testing::Test. Always call this instead // of GetTypeId< ::testing::Test>() to get the type ID of // ::testing::Test, as the latter may give the wrong result due to a // suspected linker bug when compiling Google Test as a Mac OS X // framework. GTEST_API_ TypeId GetTestTypeId(); // Defines the abstract factory interface that creates instances // of a Test object. class TestFactoryBase { public: virtual ~TestFactoryBase() {} // Creates a test instance to run. The instance is both created and destroyed // within TestInfoImpl::Run() virtual Test* CreateTest() = 0; protected: TestFactoryBase() {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); }; // This class provides implementation of TeastFactoryBase interface. // It is used in TEST and TEST_F macros. template class TestFactoryImpl : public TestFactoryBase { public: Test* CreateTest() override { return new TestClass; } }; #if GTEST_OS_WINDOWS // Predicate-formatters for implementing the HRESULT checking macros // {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} // We pass a long instead of HRESULT to avoid causing an // include dependency for the HRESULT type. GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, long hr); // NOLINT GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, long hr); // NOLINT #endif // GTEST_OS_WINDOWS // Types of SetUpTestSuite() and TearDownTestSuite() functions. using SetUpTestSuiteFunc = void (*)(); using TearDownTestSuiteFunc = void (*)(); struct CodeLocation { CodeLocation(const std::string& a_file, int a_line) : file(a_file), line(a_line) {} std::string file; int line; }; // Helper to identify which setup function for TestCase / TestSuite to call. // Only one function is allowed, either TestCase or TestSute but not both. // Utility functions to help SuiteApiResolver using SetUpTearDownSuiteFuncType = void (*)(); inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull( SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) { return a == def ? nullptr : a; } template // Note that SuiteApiResolver inherits from T because // SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way // SuiteApiResolver can access them. struct SuiteApiResolver : T { // testing::Test is only forward declared at this point. So we make it a // dependend class for the compiler to be OK with it. using Test = typename std::conditional::type; static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename, int line_num) { SetUpTearDownSuiteFuncType test_case_fp = GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase); SetUpTearDownSuiteFuncType test_suite_fp = GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite); GTEST_CHECK_(!test_case_fp || !test_suite_fp) << "Test can not provide both SetUpTestSuite and SetUpTestCase, please " "make sure there is only one present at " << filename << ":" << line_num; return test_case_fp != nullptr ? test_case_fp : test_suite_fp; } static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename, int line_num) { SetUpTearDownSuiteFuncType test_case_fp = GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase); SetUpTearDownSuiteFuncType test_suite_fp = GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite); GTEST_CHECK_(!test_case_fp || !test_suite_fp) << "Test can not provide both TearDownTestSuite and TearDownTestCase," " please make sure there is only one present at" << filename << ":" << line_num; return test_case_fp != nullptr ? test_case_fp : test_suite_fp; } }; // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_suite_name: name of the test suite // name: name of the test // type_param the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // value_param text representation of the test's value parameter, // or NULL if this is not a type-parameterized test. // code_location: code location where the test is defined // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. GTEST_API_ TestInfo* MakeAndRegisterTestInfo( const char* test_suite_name, const char* name, const char* type_param, const char* value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory); // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) // State of the definition of a type-parameterized test suite. class GTEST_API_ TypedTestSuitePState { public: TypedTestSuitePState() : registered_(false) {} // Adds the given test name to defined_test_names_ and return true // if the test suite hasn't been registered; otherwise aborts the // program. bool AddTestName(const char* file, int line, const char* case_name, const char* test_name) { if (registered_) { fprintf(stderr, "%s Test %s must be defined before " "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n", FormatFileLocation(file, line).c_str(), test_name, case_name); fflush(stderr); posix::Abort(); } registered_tests_.insert( ::std::make_pair(test_name, CodeLocation(file, line))); return true; } bool TestExists(const std::string& test_name) const { return registered_tests_.count(test_name) > 0; } const CodeLocation& GetCodeLocation(const std::string& test_name) const { RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name); GTEST_CHECK_(it != registered_tests_.end()); return it->second; } // Verifies that registered_tests match the test names in // defined_test_names_; returns registered_tests if successful, or // aborts the program otherwise. const char* VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests); private: typedef ::std::map RegisteredTestsMap; bool registered_; RegisteredTestsMap registered_tests_; }; // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ using TypedTestCasePState = TypedTestSuitePState; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 // Skips to the first non-space char after the first comma in 'str'; // returns NULL if no comma is found in 'str'. inline const char* SkipComma(const char* str) { const char* comma = strchr(str, ','); if (comma == nullptr) { return nullptr; } while (IsSpace(*(++comma))) {} return comma; } // Returns the prefix of 'str' before the first comma in it; returns // the entire string if it contains no comma. inline std::string GetPrefixUntilComma(const char* str) { const char* comma = strchr(str, ','); return comma == nullptr ? str : std::string(str, comma); } // Splits a given string on a given delimiter, populating a given // vector with the fields. void SplitString(const ::std::string& str, char delimiter, ::std::vector< ::std::string>* dest); // The default argument to the template below for the case when the user does // not provide a name generator. struct DefaultNameGenerator { template static std::string GetName(int i) { return StreamableToString(i); } }; template struct NameGeneratorSelector { typedef Provided type; }; template void GenerateNamesRecursively(Types0, std::vector*, int) {} template void GenerateNamesRecursively(Types, std::vector* result, int i) { result->push_back(NameGenerator::template GetName(i)); GenerateNamesRecursively(typename Types::Tail(), result, i + 1); } template std::vector GenerateNames() { std::vector result; GenerateNamesRecursively(Types(), &result, 0); return result; } // TypeParameterizedTest::Register() // registers a list of type-parameterized tests with Google Test. The // return value is insignificant - we just need to return something // such that we can call this function in a namespace scope. // // Implementation note: The GTEST_TEMPLATE_ macro declares a template // template parameter. It's defined in gtest-type-util.h. template class TypeParameterizedTest { public: // 'index' is the index of the test in the type list 'Types' // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite, // Types). Valid values for 'index' are [0, N - 1] where N is the // length of Types. static bool Register(const char* prefix, const CodeLocation& code_location, const char* case_name, const char* test_names, int index, const std::vector& type_names = GenerateNames()) { typedef typename Types::Head Type; typedef Fixture FixtureClass; typedef typename GTEST_BIND_(TestSel, Type) TestClass; // First, registers the first type-parameterized test in the type // list. MakeAndRegisterTestInfo( (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/" + type_names[static_cast(index)]) .c_str(), StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(), GetTypeName().c_str(), nullptr, // No value parameter. code_location, GetTypeId(), SuiteApiResolver::GetSetUpCaseOrSuite( code_location.file.c_str(), code_location.line), SuiteApiResolver::GetTearDownCaseOrSuite( code_location.file.c_str(), code_location.line), new TestFactoryImpl); // Next, recurses (at compile time) with the tail of the type list. return TypeParameterizedTest::Register(prefix, code_location, case_name, test_names, index + 1, type_names); } }; // The base case for the compile time recursion. template class TypeParameterizedTest { public: static bool Register(const char* /*prefix*/, const CodeLocation&, const char* /*case_name*/, const char* /*test_names*/, int /*index*/, const std::vector& = std::vector() /*type_names*/) { return true; } }; // TypeParameterizedTestSuite::Register() // registers *all combinations* of 'Tests' and 'Types' with Google // Test. The return value is insignificant - we just need to return // something such that we can call this function in a namespace scope. template class TypeParameterizedTestSuite { public: static bool Register(const char* prefix, CodeLocation code_location, const TypedTestSuitePState* state, const char* case_name, const char* test_names, const std::vector& type_names = GenerateNames()) { std::string test_name = StripTrailingSpaces( GetPrefixUntilComma(test_names)); if (!state->TestExists(test_name)) { fprintf(stderr, "Failed to get code location for test %s.%s at %s.", case_name, test_name.c_str(), FormatFileLocation(code_location.file.c_str(), code_location.line).c_str()); fflush(stderr); posix::Abort(); } const CodeLocation& test_location = state->GetCodeLocation(test_name); typedef typename Tests::Head Head; // First, register the first test in 'Test' for each type in 'Types'. TypeParameterizedTest::Register( prefix, test_location, case_name, test_names, 0, type_names); // Next, recurses (at compile time) with the tail of the test list. return TypeParameterizedTestSuite::Register(prefix, code_location, state, case_name, SkipComma(test_names), type_names); } }; // The base case for the compile time recursion. template class TypeParameterizedTestSuite { public: static bool Register(const char* /*prefix*/, const CodeLocation&, const TypedTestSuitePState* /*state*/, const char* /*case_name*/, const char* /*test_names*/, const std::vector& = std::vector() /*type_names*/) { return true; } }; #endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. GTEST_API_ std::string GetCurrentOsStackTraceExceptTop( UnitTest* unit_test, int skip_count); // Helpers for suppressing warnings on unreachable code or constant // condition. // Always returns true. GTEST_API_ bool AlwaysTrue(); // Always returns false. inline bool AlwaysFalse() { return !AlwaysTrue(); } // Helper for suppressing false warning from Clang on a const char* // variable declared in a conditional expression always being NULL in // the else branch. struct GTEST_API_ ConstCharPtr { ConstCharPtr(const char* str) : value(str) {} operator bool() const { return true; } const char* value; }; // A simple Linear Congruential Generator for generating random // numbers with a uniform distribution. Unlike rand() and srand(), it // doesn't use global state (and therefore can't interfere with user // code). Unlike rand_r(), it's portable. An LCG isn't very random, // but it's good enough for our purposes. class GTEST_API_ Random { public: static const UInt32 kMaxRange = 1u << 31; explicit Random(UInt32 seed) : state_(seed) {} void Reseed(UInt32 seed) { state_ = seed; } // Generates a random number from [0, range). Crashes if 'range' is // 0 or greater than kMaxRange. UInt32 Generate(UInt32 range); private: UInt32 state_; GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); }; // Turns const U&, U&, const U, and U all into U. #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ typename std::remove_const::type>::type // IsAProtocolMessage::value is a compile-time bool constant that's // true if and only if T is type proto2::Message or a subclass of it. template struct IsAProtocolMessage : public bool_constant< std::is_convertible::value> {}; // When the compiler sees expression IsContainerTest(0), if C is an // STL-style container class, the first overload of IsContainerTest // will be viable (since both C::iterator* and C::const_iterator* are // valid types and NULL can be implicitly converted to them). It will // be picked over the second overload as 'int' is a perfect match for // the type of argument 0. If C::iterator or C::const_iterator is not // a valid type, the first overload is not viable, and the second // overload will be picked. Therefore, we can determine whether C is // a container class by checking the type of IsContainerTest(0). // The value of the expression is insignificant. // // In C++11 mode we check the existence of a const_iterator and that an // iterator is properly implemented for the container. // // For pre-C++11 that we look for both C::iterator and C::const_iterator. // The reason is that C++ injects the name of a class as a member of the // class itself (e.g. you can refer to class iterator as either // 'iterator' or 'iterator::iterator'). If we look for C::iterator // only, for example, we would mistakenly think that a class named // iterator is an STL container. // // Also note that the simpler approach of overloading // IsContainerTest(typename C::const_iterator*) and // IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. typedef int IsContainer; template ().begin()), class = decltype(::std::declval().end()), class = decltype(++::std::declval()), class = decltype(*::std::declval()), class = typename C::const_iterator> IsContainer IsContainerTest(int /* dummy */) { return 0; } typedef char IsNotContainer; template IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } // Trait to detect whether a type T is a hash table. // The heuristic used is that the type contains an inner type `hasher` and does // not contain an inner type `reverse_iterator`. // If the container is iterable in reverse, then order might actually matter. template struct IsHashTable { private: template static char test(typename U::hasher*, typename U::reverse_iterator*); template static int test(typename U::hasher*, ...); template static char test(...); public: static const bool value = sizeof(test(nullptr, nullptr)) == sizeof(int); }; template const bool IsHashTable::value; template (0)) == sizeof(IsContainer)> struct IsRecursiveContainerImpl; template struct IsRecursiveContainerImpl : public std::false_type {}; // Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to // obey the same inconsistencies as the IsContainerTest, namely check if // something is a container is relying on only const_iterator in C++11 and // is relying on both const_iterator and iterator otherwise template struct IsRecursiveContainerImpl { using value_type = decltype(*std::declval()); using type = std::is_same::type>::type, C>; }; // IsRecursiveContainer is a unary compile-time predicate that // evaluates whether C is a recursive container type. A recursive container // type is a container type whose value_type is equal to the container type // itself. An example for a recursive container type is // boost::filesystem::path, whose iterator has a value_type that is equal to // boost::filesystem::path. template struct IsRecursiveContainer : public IsRecursiveContainerImpl::type {}; // Utilities for native arrays. // ArrayEq() compares two k-dimensional native arrays using the // elements' operator==, where k can be any integer >= 0. When k is // 0, ArrayEq() degenerates into comparing a single pair of values. template bool ArrayEq(const T* lhs, size_t size, const U* rhs); // This generic version is used when k is 0. template inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } // This overload is used when k >= 1. template inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { return internal::ArrayEq(lhs, N, rhs); } // This helper reduces code bloat. If we instead put its logic inside // the previous ArrayEq() function, arrays with different sizes would // lead to different copies of the template code. template bool ArrayEq(const T* lhs, size_t size, const U* rhs) { for (size_t i = 0; i != size; i++) { if (!internal::ArrayEq(lhs[i], rhs[i])) return false; } return true; } // Finds the first element in the iterator range [begin, end) that // equals elem. Element may be a native array type itself. template Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { for (Iter it = begin; it != end; ++it) { if (internal::ArrayEq(*it, elem)) return it; } return end; } // CopyArray() copies a k-dimensional native array using the elements' // operator=, where k can be any integer >= 0. When k is 0, // CopyArray() degenerates into copying a single value. template void CopyArray(const T* from, size_t size, U* to); // This generic version is used when k is 0. template inline void CopyArray(const T& from, U* to) { *to = from; } // This overload is used when k >= 1. template inline void CopyArray(const T(&from)[N], U(*to)[N]) { internal::CopyArray(from, N, *to); } // This helper reduces code bloat. If we instead put its logic inside // the previous CopyArray() function, arrays with different sizes // would lead to different copies of the template code. template void CopyArray(const T* from, size_t size, U* to) { for (size_t i = 0; i != size; i++) { internal::CopyArray(from[i], to + i); } } // The relation between an NativeArray object (see below) and the // native array it represents. // We use 2 different structs to allow non-copyable types to be used, as long // as RelationToSourceReference() is passed. struct RelationToSourceReference {}; struct RelationToSourceCopy {}; // Adapts a native array to a read-only STL-style container. Instead // of the complete STL container concept, this adaptor only implements // members useful for Google Mock's container matchers. New members // should be added as needed. To simplify the implementation, we only // support Element being a raw type (i.e. having no top-level const or // reference modifier). It's the client's responsibility to satisfy // this requirement. Element can be an array type itself (hence // multi-dimensional arrays are supported). template class NativeArray { public: // STL-style container typedefs. typedef Element value_type; typedef Element* iterator; typedef const Element* const_iterator; // Constructs from a native array. References the source. NativeArray(const Element* array, size_t count, RelationToSourceReference) { InitRef(array, count); } // Constructs from a native array. Copies the source. NativeArray(const Element* array, size_t count, RelationToSourceCopy) { InitCopy(array, count); } // Copy constructor. NativeArray(const NativeArray& rhs) { (this->*rhs.clone_)(rhs.array_, rhs.size_); } ~NativeArray() { if (clone_ != &NativeArray::InitRef) delete[] array_; } // STL-style container methods. size_t size() const { return size_; } const_iterator begin() const { return array_; } const_iterator end() const { return array_ + size_; } bool operator==(const NativeArray& rhs) const { return size() == rhs.size() && ArrayEq(begin(), size(), rhs.begin()); } private: static_assert(!std::is_const::value, "Type must not be const"); static_assert(!std::is_reference::value, "Type must not be a reference"); // Initializes this object with a copy of the input. void InitCopy(const Element* array, size_t a_size) { Element* const copy = new Element[a_size]; CopyArray(array, a_size, copy); array_ = copy; size_ = a_size; clone_ = &NativeArray::InitCopy; } // Initializes this object with a reference of the input. void InitRef(const Element* array, size_t a_size) { array_ = array; size_ = a_size; clone_ = &NativeArray::InitRef; } const Element* array_; size_t size_; void (NativeArray::*clone_)(const Element*, size_t); GTEST_DISALLOW_ASSIGN_(NativeArray); }; // Backport of std::index_sequence. template struct IndexSequence { using type = IndexSequence; }; // Double the IndexSequence, and one if plus_one is true. template struct DoubleSequence; template struct DoubleSequence, sizeofT> { using type = IndexSequence; }; template struct DoubleSequence, sizeofT> { using type = IndexSequence; }; // Backport of std::make_index_sequence. // It uses O(ln(N)) instantiation depth. template struct MakeIndexSequence : DoubleSequence::type, N / 2>::type {}; template <> struct MakeIndexSequence<0> : IndexSequence<> {}; // FIXME: This implementation of ElemFromList is O(1) in instantiation depth, // but it is O(N^2) in total instantiations. Not sure if this is the best // tradeoff, as it will make it somewhat slow to compile. template struct ElemFromListImpl {}; template struct ElemFromListImpl { using type = T; }; // Get the Nth element from T... // It uses O(1) instantiation depth. template struct ElemFromList; template struct ElemFromList, T...> : ElemFromListImpl... {}; template class FlatTuple; template struct FlatTupleElemBase; template struct FlatTupleElemBase, I> { using value_type = typename ElemFromList::type, T...>::type; FlatTupleElemBase() = default; explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {} value_type value; }; template struct FlatTupleBase; template struct FlatTupleBase, IndexSequence> : FlatTupleElemBase, Idx>... { using Indices = IndexSequence; FlatTupleBase() = default; explicit FlatTupleBase(T... t) : FlatTupleElemBase, Idx>(std::move(t))... {} }; // Analog to std::tuple but with different tradeoffs. // This class minimizes the template instantiation depth, thus allowing more // elements that std::tuple would. std::tuple has been seen to require an // instantiation depth of more than 10x the number of elements in some // implementations. // FlatTuple and ElemFromList are not recursive and have a fixed depth // regardless of T... // MakeIndexSequence, on the other hand, it is recursive but with an // instantiation depth of O(ln(N)). template class FlatTuple : private FlatTupleBase, typename MakeIndexSequence::type> { using Indices = typename FlatTuple::FlatTupleBase::Indices; public: FlatTuple() = default; explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {} template const typename ElemFromList::type& Get() const { return static_cast*>(this)->value; } template typename ElemFromList::type& Get() { return static_cast*>(this)->value; } }; // Utility functions to be called with static_assert to induce deprecation // warnings. GTEST_INTERNAL_DEPRECATED( "INSTANTIATE_TEST_CASE_P is deprecated, please use " "INSTANTIATE_TEST_SUITE_P") constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; } GTEST_INTERNAL_DEPRECATED( "TYPED_TEST_CASE_P is deprecated, please use " "TYPED_TEST_SUITE_P") constexpr bool TypedTestCase_P_IsDeprecated() { return true; } GTEST_INTERNAL_DEPRECATED( "TYPED_TEST_CASE is deprecated, please use " "TYPED_TEST_SUITE") constexpr bool TypedTestCaseIsDeprecated() { return true; } GTEST_INTERNAL_DEPRECATED( "REGISTER_TYPED_TEST_CASE_P is deprecated, please use " "REGISTER_TYPED_TEST_SUITE_P") constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; } GTEST_INTERNAL_DEPRECATED( "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use " "INSTANTIATE_TYPED_TEST_SUITE_P") constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } } // namespace internal } // namespace testing #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ ::testing::internal::AssertHelper(result_type, file, line, message) \ = ::testing::Message() #define GTEST_MESSAGE_(message, result_type) \ GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) #define GTEST_FATAL_FAILURE_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) #define GTEST_NONFATAL_FAILURE_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) #define GTEST_SUCCESS_(message) \ GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) #define GTEST_SKIP_(message) \ return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip) // Suppress MSVC warning 4072 (unreachable code) for the code following // statement if it returns or throws (or doesn't return or throw in some // situations). #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ if (::testing::internal::AlwaysTrue()) { statement; } #define GTEST_TEST_THROW_(statement, expected_exception, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::ConstCharPtr gtest_msg = "") { \ bool gtest_caught_expected = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (expected_exception const&) { \ gtest_caught_expected = true; \ } \ catch (...) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws a different type."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ if (!gtest_caught_expected) { \ gtest_msg.value = \ "Expected: " #statement " throws an exception of type " \ #expected_exception ".\n Actual: it throws nothing."; \ goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ fail(gtest_msg.value) #define GTEST_TEST_NO_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ fail("Expected: " #statement " doesn't throw an exception.\n" \ " Actual: it throws.") #define GTEST_TEST_ANY_THROW_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ bool gtest_caught_any = false; \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } \ catch (...) { \ gtest_caught_any = true; \ } \ if (!gtest_caught_any) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ fail("Expected: " #statement " throws an exception.\n" \ " Actual: it doesn't.") // Implements Boolean test assertions such as EXPECT_TRUE. expression can be // either a boolean expression or an AssertionResult. text is a textual // represenation of expression as it was passed into the EXPECT_TRUE. #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar_ = \ ::testing::AssertionResult(expression)) \ ; \ else \ fail(::testing::internal::GetBoolAssertionFailureMessage(\ gtest_ar_, text, #actual, #expected).c_str()) #define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ fail("Expected: " #statement " doesn't generate new fatal " \ "failures in the current thread.\n" \ " Actual: it does.") // Expands to the name of the class that implements the given test. #define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ test_suite_name##_##test_name##_Test // Helper macro for defining tests. #define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \ static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \ "test_suite_name must not be empty"); \ static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \ "test_name must not be empty"); \ class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ : public parent_class { \ public: \ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ \ private: \ virtual void TestBody(); \ static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ test_name)); \ }; \ \ ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ test_name)::test_info_ = \ ::testing::internal::MakeAndRegisterTestInfo( \ #test_suite_name, #test_name, nullptr, nullptr, \ ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \ ::testing::internal::SuiteApiResolver< \ parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__), \ ::testing::internal::SuiteApiResolver< \ parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__), \ new ::testing::internal::TestFactoryImpl); \ void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/internal/gtest-death-test-internal.h0000664000175000017500000003217413553267757024205 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) // // This header file defines internal utilities needed for implementing // death tests. They are subject to change without notice. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ #include "gtest/gtest-matchers.h" #include "gtest/internal/gtest-internal.h" #include #include namespace testing { namespace internal { GTEST_DECLARE_string_(internal_run_death_test); // Names of the flags (needed for parsing Google Test flags). const char kDeathTestStyleFlag[] = "death_test_style"; const char kDeathTestUseFork[] = "death_test_use_fork"; const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; #if GTEST_HAS_DEATH_TEST GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) // DeathTest is a class that hides much of the complexity of the // GTEST_DEATH_TEST_ macro. It is abstract; its static Create method // returns a concrete class that depends on the prevailing death test // style, as defined by the --gtest_death_test_style and/or // --gtest_internal_run_death_test flags. // In describing the results of death tests, these terms are used with // the corresponding definitions: // // exit status: The integer exit information in the format specified // by wait(2) // exit code: The integer code passed to exit(3), _exit(2), or // returned from main() class GTEST_API_ DeathTest { public: // Create returns false if there was an error determining the // appropriate action to take for the current death test; for example, // if the gtest_death_test_style flag is set to an invalid value. // The LastMessage method will return a more detailed message in that // case. Otherwise, the DeathTest pointer pointed to by the "test" // argument is set. If the death test should be skipped, the pointer // is set to NULL; otherwise, it is set to the address of a new concrete // DeathTest object that controls the execution of the current test. static bool Create(const char* statement, Matcher matcher, const char* file, int line, DeathTest** test); DeathTest(); virtual ~DeathTest() { } // A helper class that aborts a death test when it's deleted. class ReturnSentinel { public: explicit ReturnSentinel(DeathTest* test) : test_(test) { } ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } private: DeathTest* const test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); } GTEST_ATTRIBUTE_UNUSED_; // An enumeration of possible roles that may be taken when a death // test is encountered. EXECUTE means that the death test logic should // be executed immediately. OVERSEE means that the program should prepare // the appropriate environment for a child process to execute the death // test, then wait for it to complete. enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; // An enumeration of the three reasons that a test might be aborted. enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_THREW_EXCEPTION, TEST_DID_NOT_DIE }; // Assumes one of the above roles. virtual TestRole AssumeRole() = 0; // Waits for the death test to finish and returns its status. virtual int Wait() = 0; // Returns true if the death test passed; that is, the test process // exited during the test, its exit status matches a user-supplied // predicate, and its stderr output matches a user-supplied regular // expression. // The user-supplied predicate may be a macro expression rather // than a function pointer or functor, or else Wait and Passed could // be combined. virtual bool Passed(bool exit_status_ok) = 0; // Signals that the death test did not die as expected. virtual void Abort(AbortReason reason) = 0; // Returns a human-readable outcome message regarding the outcome of // the last death test. static const char* LastMessage(); static void set_last_death_test_message(const std::string& message); private: // A string containing a description of the outcome of the last death test. static std::string last_death_test_message_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); }; GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 // Factory interface for death tests. May be mocked out for testing. class DeathTestFactory { public: virtual ~DeathTestFactory() { } virtual bool Create(const char* statement, Matcher matcher, const char* file, int line, DeathTest** test) = 0; }; // A concrete DeathTestFactory implementation for normal use. class DefaultDeathTestFactory : public DeathTestFactory { public: bool Create(const char* statement, Matcher matcher, const char* file, int line, DeathTest** test) override; }; // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. GTEST_API_ bool ExitedUnsuccessfully(int exit_status); // A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads // and interpreted as a regex (rather than an Eq matcher) for legacy // compatibility. inline Matcher MakeDeathTestMatcher( ::testing::internal::RE regex) { return ContainsRegex(regex.pattern()); } inline Matcher MakeDeathTestMatcher(const char* regex) { return ContainsRegex(regex); } inline Matcher MakeDeathTestMatcher( const ::std::string& regex) { return ContainsRegex(regex); } // If a Matcher is passed to EXPECT_DEATH (etc.), it's // used directly. inline Matcher MakeDeathTestMatcher( Matcher matcher) { return matcher; } // Traps C++ exceptions escaping statement and reports them as test // failures. Note that trapping SEH exceptions is not implemented here. # if GTEST_HAS_EXCEPTIONS # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ try { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } catch (const ::std::exception& gtest_exception) { \ fprintf(\ stderr, \ "\n%s: Caught std::exception-derived exception escaping the " \ "death test statement. Exception message: %s\n", \ ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ gtest_exception.what()); \ fflush(stderr); \ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ } catch (...) { \ death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ } # else # define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) # endif // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, // ASSERT_EXIT*, and EXPECT_EXIT*. #define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ ::testing::internal::DeathTest* gtest_dt; \ if (!::testing::internal::DeathTest::Create( \ #statement, \ ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \ __FILE__, __LINE__, >est_dt)) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ if (gtest_dt != nullptr) { \ std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \ switch (gtest_dt->AssumeRole()) { \ case ::testing::internal::DeathTest::OVERSEE_TEST: \ if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ } \ break; \ case ::testing::internal::DeathTest::EXECUTE_TEST: { \ ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \ gtest_dt); \ GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ break; \ } \ default: \ break; \ } \ } \ } else \ GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \ : fail(::testing::internal::DeathTest::LastMessage()) // The symbol "fail" here expands to something into which a message // can be streamed. // This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in // NDEBUG mode. In this case we need the statements to be executed and the macro // must accept a streamed message even though the message is never printed. // The regex object is not evaluated, but it is used to prevent "unused" // warnings and to avoid an expression that doesn't compile in debug mode. #define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (::testing::internal::AlwaysTrue()) { \ GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ } else if (!::testing::internal::AlwaysTrue()) { \ ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ } else \ ::testing::Message() // A class representing the parsed contents of the // --gtest_internal_run_death_test flag, as it existed when // RUN_ALL_TESTS was called. class InternalRunDeathTestFlag { public: InternalRunDeathTestFlag(const std::string& a_file, int a_line, int an_index, int a_write_fd) : file_(a_file), line_(a_line), index_(an_index), write_fd_(a_write_fd) {} ~InternalRunDeathTestFlag() { if (write_fd_ >= 0) posix::Close(write_fd_); } const std::string& file() const { return file_; } int line() const { return line_; } int index() const { return index_; } int write_fd() const { return write_fd_; } private: std::string file_; int line_; int index_; int write_fd_; GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); }; // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); #endif // GTEST_HAS_DEATH_TEST } // namespace internal } // namespace testing #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-param-test.h0000664000175000017500000005324713553267757020576 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Macros and functions for implementing parameterized tests // in Google C++ Testing and Mocking Framework (Google Test) // // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! // // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ // Value-parameterized tests allow you to test your code with different // parameters without writing multiple copies of the same test. // // Here is how you use value-parameterized tests: #if 0 // To write value-parameterized tests, first you should define a fixture // class. It is usually derived from testing::TestWithParam (see below for // another inheritance scheme that's sometimes useful in more complicated // class hierarchies), where the type of your parameter values. // TestWithParam is itself derived from testing::Test. T can be any // copyable type. If it's a raw pointer, you are responsible for managing the // lifespan of the pointed values. class FooTest : public ::testing::TestWithParam { // You can implement all the usual class fixture members here. }; // Then, use the TEST_P macro to define as many parameterized tests // for this fixture as you want. The _P suffix is for "parameterized" // or "pattern", whichever you prefer to think. TEST_P(FooTest, DoesBlah) { // Inside a test, access the test parameter with the GetParam() method // of the TestWithParam class: EXPECT_TRUE(foo.Blah(GetParam())); ... } TEST_P(FooTest, HasBlahBlah) { ... } // Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test // case with any set of parameters you want. Google Test defines a number // of functions for generating test parameters. They return what we call // (surprise!) parameter generators. Here is a summary of them, which // are all in the testing namespace: // // // Range(begin, end [, step]) - Yields values {begin, begin+step, // begin+step+step, ...}. The values do not // include end. step defaults to 1. // Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. // ValuesIn(container) - Yields values from a C-style array, an STL // ValuesIn(begin,end) container, or an iterator range [begin, end). // Bool() - Yields sequence {false, true}. // Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product // for the math savvy) of the values generated // by the N generators. // // For more details, see comments at the definitions of these functions below // in this file. // // The following statement will instantiate tests from the FooTest test suite // each with parameter values "meeny", "miny", and "moe". INSTANTIATE_TEST_SUITE_P(InstantiationName, FooTest, Values("meeny", "miny", "moe")); // To distinguish different instances of the pattern, (yes, you // can instantiate it more than once) the first argument to the // INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the // actual test suite name. Remember to pick unique prefixes for different // instantiations. The tests from the instantiation above will have // these names: // // * InstantiationName/FooTest.DoesBlah/0 for "meeny" // * InstantiationName/FooTest.DoesBlah/1 for "miny" // * InstantiationName/FooTest.DoesBlah/2 for "moe" // * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" // * InstantiationName/FooTest.HasBlahBlah/1 for "miny" // * InstantiationName/FooTest.HasBlahBlah/2 for "moe" // // You can use these names in --gtest_filter. // // This statement will instantiate all tests from FooTest again, each // with parameter values "cat" and "dog": const char* pets[] = {"cat", "dog"}; INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); // The tests from the instantiation above will have these names: // // * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" // * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" // * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" // * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" // // Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests // in the given test suite, whether their definitions come before or // AFTER the INSTANTIATE_TEST_SUITE_P statement. // // Please also note that generator expressions (including parameters to the // generators) are evaluated in InitGoogleTest(), after main() has started. // This allows the user on one hand, to adjust generator parameters in order // to dynamically determine a set of tests to run and on the other hand, // give the user a chance to inspect the generated tests with Google Test // reflection API before RUN_ALL_TESTS() is executed. // // You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc // for more examples. // // In the future, we plan to publish the API for defining new parameter // generators. But for now this interface remains part of the internal // implementation and is subject to change. // // // A parameterized test fixture must be derived from testing::Test and from // testing::WithParamInterface, where T is the type of the parameter // values. Inheriting from TestWithParam satisfies that requirement because // TestWithParam inherits from both Test and WithParamInterface. In more // complicated hierarchies, however, it is occasionally useful to inherit // separately from Test and WithParamInterface. For example: class BaseTest : public ::testing::Test { // You can inherit all the usual members for a non-parameterized test // fixture here. }; class DerivedTest : public BaseTest, public ::testing::WithParamInterface { // The usual test fixture members go here too. }; TEST_F(BaseTest, HasFoo) { // This is an ordinary non-parameterized test. } TEST_P(DerivedTest, DoesBlah) { // GetParam works just the same here as if you inherit from TestWithParam. EXPECT_TRUE(foo.Blah(GetParam())); } #endif // 0 #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-param-util.h" #include "gtest/internal/gtest-port.h" namespace testing { // Functions producing parameter generators. // // Google Test uses these generators to produce parameters for value- // parameterized tests. When a parameterized test suite is instantiated // with a particular generator, Google Test creates and runs tests // for each element in the sequence produced by the generator. // // In the following sample, tests from test suite FooTest are instantiated // each three times with parameter values 3, 5, and 8: // // class FooTest : public TestWithParam { ... }; // // TEST_P(FooTest, TestThis) { // } // TEST_P(FooTest, TestThat) { // } // INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8)); // // Range() returns generators providing sequences of values in a range. // // Synopsis: // Range(start, end) // - returns a generator producing a sequence of values {start, start+1, // start+2, ..., }. // Range(start, end, step) // - returns a generator producing a sequence of values {start, start+step, // start+step+step, ..., }. // Notes: // * The generated sequences never include end. For example, Range(1, 5) // returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) // returns a generator producing {1, 3, 5, 7}. // * start and end must have the same type. That type may be any integral or // floating-point type or a user defined type satisfying these conditions: // * It must be assignable (have operator=() defined). // * It must have operator+() (operator+(int-compatible type) for // two-operand version). // * It must have operator<() defined. // Elements in the resulting sequences will also have that type. // * Condition start < end must be satisfied in order for resulting sequences // to contain any elements. // template internal::ParamGenerator Range(T start, T end, IncrementT step) { return internal::ParamGenerator( new internal::RangeGenerator(start, end, step)); } template internal::ParamGenerator Range(T start, T end) { return Range(start, end, 1); } // ValuesIn() function allows generation of tests with parameters coming from // a container. // // Synopsis: // ValuesIn(const T (&array)[N]) // - returns a generator producing sequences with elements from // a C-style array. // ValuesIn(const Container& container) // - returns a generator producing sequences with elements from // an STL-style container. // ValuesIn(Iterator begin, Iterator end) // - returns a generator producing sequences with elements from // a range [begin, end) defined by a pair of STL-style iterators. These // iterators can also be plain C pointers. // // Please note that ValuesIn copies the values from the containers // passed in and keeps them to generate tests in RUN_ALL_TESTS(). // // Examples: // // This instantiates tests from test suite StringTest // each with C-string values of "foo", "bar", and "baz": // // const char* strings[] = {"foo", "bar", "baz"}; // INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings)); // // This instantiates tests from test suite StlStringTest // each with STL strings with values "a" and "b": // // ::std::vector< ::std::string> GetParameterStrings() { // ::std::vector< ::std::string> v; // v.push_back("a"); // v.push_back("b"); // return v; // } // // INSTANTIATE_TEST_SUITE_P(CharSequence, // StlStringTest, // ValuesIn(GetParameterStrings())); // // // This will also instantiate tests from CharTest // each with parameter values 'a' and 'b': // // ::std::list GetParameterChars() { // ::std::list list; // list.push_back('a'); // list.push_back('b'); // return list; // } // ::std::list l = GetParameterChars(); // INSTANTIATE_TEST_SUITE_P(CharSequence2, // CharTest, // ValuesIn(l.begin(), l.end())); // template internal::ParamGenerator< typename std::iterator_traits::value_type> ValuesIn(ForwardIterator begin, ForwardIterator end) { typedef typename std::iterator_traits::value_type ParamType; return internal::ParamGenerator( new internal::ValuesInIteratorRangeGenerator(begin, end)); } template internal::ParamGenerator ValuesIn(const T (&array)[N]) { return ValuesIn(array, array + N); } template internal::ParamGenerator ValuesIn( const Container& container) { return ValuesIn(container.begin(), container.end()); } // Values() allows generating tests from explicitly specified list of // parameters. // // Synopsis: // Values(T v1, T v2, ..., T vN) // - returns a generator producing sequences with elements v1, v2, ..., vN. // // For example, this instantiates tests from test suite BarTest each // with values "one", "two", and "three": // // INSTANTIATE_TEST_SUITE_P(NumSequence, // BarTest, // Values("one", "two", "three")); // // This instantiates tests from test suite BazTest each with values 1, 2, 3.5. // The exact type of values will depend on the type of parameter in BazTest. // // INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); // // template internal::ValueArray Values(T... v) { return internal::ValueArray(std::move(v)...); } // Bool() allows generating tests with parameters in a set of (false, true). // // Synopsis: // Bool() // - returns a generator producing sequences with elements {false, true}. // // It is useful when testing code that depends on Boolean flags. Combinations // of multiple flags can be tested when several Bool()'s are combined using // Combine() function. // // In the following example all tests in the test suite FlagDependentTest // will be instantiated twice with parameters false and true. // // class FlagDependentTest : public testing::TestWithParam { // virtual void SetUp() { // external_flag = GetParam(); // } // } // INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool()); // inline internal::ParamGenerator Bool() { return Values(false, true); } // Combine() allows the user to combine two or more sequences to produce // values of a Cartesian product of those sequences' elements. // // Synopsis: // Combine(gen1, gen2, ..., genN) // - returns a generator producing sequences with elements coming from // the Cartesian product of elements from the sequences generated by // gen1, gen2, ..., genN. The sequence elements will have a type of // std::tuple where T1, T2, ..., TN are the types // of elements from sequences produces by gen1, gen2, ..., genN. // // Combine can have up to 10 arguments. // // Example: // // This will instantiate tests in test suite AnimalTest each one with // the parameter values tuple("cat", BLACK), tuple("cat", WHITE), // tuple("dog", BLACK), and tuple("dog", WHITE): // // enum Color { BLACK, GRAY, WHITE }; // class AnimalTest // : public testing::TestWithParam > {...}; // // TEST_P(AnimalTest, AnimalLooksNice) {...} // // INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest, // Combine(Values("cat", "dog"), // Values(BLACK, WHITE))); // // This will instantiate tests in FlagDependentTest with all variations of two // Boolean flags: // // class FlagDependentTest // : public testing::TestWithParam > { // virtual void SetUp() { // // Assigns external_flag_1 and external_flag_2 values from the tuple. // std::tie(external_flag_1, external_flag_2) = GetParam(); // } // }; // // TEST_P(FlagDependentTest, TestFeature1) { // // Test your code using external_flag_1 and external_flag_2 here. // } // INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest, // Combine(Bool(), Bool())); // template internal::CartesianProductHolder Combine(const Generator&... g) { return internal::CartesianProductHolder(g...); } #define TEST_P(test_suite_name, test_name) \ class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ : public test_suite_name { \ public: \ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ virtual void TestBody(); \ \ private: \ static int AddToRegistry() { \ ::testing::UnitTest::GetInstance() \ ->parameterized_test_registry() \ .GetTestSuitePatternHolder( \ #test_suite_name, \ ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ ->AddTestPattern( \ GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \ new ::testing::internal::TestMetaFactory()); \ return 0; \ } \ static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ test_name)); \ }; \ int GTEST_TEST_CLASS_NAME_(test_suite_name, \ test_name)::gtest_registering_dummy_ = \ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \ void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() // The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify // generator and an optional function or functor that generates custom test name // suffixes based on the test parameters. Such a function or functor should // accept one argument of type testing::TestParamInfo, and // return std::string. // // testing::PrintToStringParamName is a builtin test suffix generator that // returns the value of testing::PrintToString(GetParam()). // // Note: test names must be non-empty, unique, and may only contain ASCII // alphanumeric characters or underscore. Because PrintToString adds quotes // to std::string and C strings, it won't work for these types. #define GTEST_EXPAND_(arg) arg #define GTEST_GET_FIRST_(first, ...) first #define GTEST_GET_SECOND_(first, second, ...) second #define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \ static ::testing::internal::ParamGenerator \ gtest_##prefix##test_suite_name##_EvalGenerator_() { \ return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \ } \ static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ const ::testing::TestParamInfo& info) { \ if (::testing::internal::AlwaysFalse()) { \ ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \ __VA_ARGS__, \ ::testing::internal::DefaultParamName, \ DUMMY_PARAM_))); \ auto t = std::make_tuple(__VA_ARGS__); \ static_assert(std::tuple_size::value <= 2, \ "Too Many Args!"); \ } \ return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \ __VA_ARGS__, \ ::testing::internal::DefaultParamName, \ DUMMY_PARAM_))))(info); \ } \ static int gtest_##prefix##test_suite_name##_dummy_ \ GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::UnitTest::GetInstance() \ ->parameterized_test_registry() \ .GetTestSuitePatternHolder( \ #test_suite_name, \ ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ ->AddTestSuiteInstantiation( \ #prefix, >est_##prefix##test_suite_name##_EvalGenerator_, \ >est_##prefix##test_suite_name##_EvalGenerateName_, \ __FILE__, __LINE__) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define INSTANTIATE_TEST_CASE_P \ static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \ ""); \ INSTANTIATE_TEST_SUITE_P #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-matchers.h0000664000175000017500000006463713553267757020334 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // The Google C++ Testing and Mocking Framework (Google Test) // // This file implements just enough of the matcher interface to allow // EXPECT_DEATH and friends to accept a matcher argument. // IWYU pragma: private, include "testing/base/public/gunit.h" // IWYU pragma: friend third_party/googletest/googlemock/.* // IWYU pragma: friend third_party/googletest/googletest/.* #ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ #define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ #include #include #include #include #include "gtest/gtest-printers.h" #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" // MSVC warning C5046 is new as of VS2017 version 15.8. #if defined(_MSC_VER) && _MSC_VER >= 1915 #define GTEST_MAYBE_5046_ 5046 #else #define GTEST_MAYBE_5046_ #endif GTEST_DISABLE_MSC_WARNINGS_PUSH_( 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by clients of class B */ /* Symbol involving type with internal linkage not defined */) namespace testing { // To implement a matcher Foo for type T, define: // 1. a class FooMatcherImpl that implements the // MatcherInterface interface, and // 2. a factory function that creates a Matcher object from a // FooMatcherImpl*. // // The two-level delegation design makes it possible to allow a user // to write "v" instead of "Eq(v)" where a Matcher is expected, which // is impossible if we pass matchers by pointers. It also eases // ownership management as Matcher objects can now be copied like // plain values. // MatchResultListener is an abstract class. Its << operator can be // used by a matcher to explain why a value matches or doesn't match. // class MatchResultListener { public: // Creates a listener object with the given underlying ostream. The // listener does not own the ostream, and does not dereference it // in the constructor or destructor. explicit MatchResultListener(::std::ostream* os) : stream_(os) {} virtual ~MatchResultListener() = 0; // Makes this class abstract. // Streams x to the underlying ostream; does nothing if the ostream // is NULL. template MatchResultListener& operator<<(const T& x) { if (stream_ != nullptr) *stream_ << x; return *this; } // Returns the underlying ostream. ::std::ostream* stream() { return stream_; } // Returns true if and only if the listener is interested in an explanation // of the match result. A matcher's MatchAndExplain() method can use // this information to avoid generating the explanation when no one // intends to hear it. bool IsInterested() const { return stream_ != nullptr; } private: ::std::ostream* const stream_; GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); }; inline MatchResultListener::~MatchResultListener() { } // An instance of a subclass of this knows how to describe itself as a // matcher. class MatcherDescriberInterface { public: virtual ~MatcherDescriberInterface() {} // Describes this matcher to an ostream. The function should print // a verb phrase that describes the property a value matching this // matcher should have. The subject of the verb phrase is the value // being matched. For example, the DescribeTo() method of the Gt(7) // matcher prints "is greater than 7". virtual void DescribeTo(::std::ostream* os) const = 0; // Describes the negation of this matcher to an ostream. For // example, if the description of this matcher is "is greater than // 7", the negated description could be "is not greater than 7". // You are not required to override this when implementing // MatcherInterface, but it is highly advised so that your matcher // can produce good error messages. virtual void DescribeNegationTo(::std::ostream* os) const { *os << "not ("; DescribeTo(os); *os << ")"; } }; // The implementation of a matcher. template class MatcherInterface : public MatcherDescriberInterface { public: // Returns true if and only if the matcher matches x; also explains the // match result to 'listener' if necessary (see the next paragraph), in // the form of a non-restrictive relative clause ("which ...", // "whose ...", etc) that describes x. For example, the // MatchAndExplain() method of the Pointee(...) matcher should // generate an explanation like "which points to ...". // // Implementations of MatchAndExplain() should add an explanation of // the match result *if and only if* they can provide additional // information that's not already present (or not obvious) in the // print-out of x and the matcher's description. Whether the match // succeeds is not a factor in deciding whether an explanation is // needed, as sometimes the caller needs to print a failure message // when the match succeeds (e.g. when the matcher is used inside // Not()). // // For example, a "has at least 10 elements" matcher should explain // what the actual element count is, regardless of the match result, // as it is useful information to the reader; on the other hand, an // "is empty" matcher probably only needs to explain what the actual // size is when the match fails, as it's redundant to say that the // size is 0 when the value is already known to be empty. // // You should override this method when defining a new matcher. // // It's the responsibility of the caller (Google Test) to guarantee // that 'listener' is not NULL. This helps to simplify a matcher's // implementation when it doesn't care about the performance, as it // can talk to 'listener' without checking its validity first. // However, in order to implement dummy listeners efficiently, // listener->stream() may be NULL. virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; // Inherits these methods from MatcherDescriberInterface: // virtual void DescribeTo(::std::ostream* os) const = 0; // virtual void DescribeNegationTo(::std::ostream* os) const; }; namespace internal { // Converts a MatcherInterface to a MatcherInterface. template class MatcherInterfaceAdapter : public MatcherInterface { public: explicit MatcherInterfaceAdapter(const MatcherInterface* impl) : impl_(impl) {} ~MatcherInterfaceAdapter() override { delete impl_; } void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); } void DescribeNegationTo(::std::ostream* os) const override { impl_->DescribeNegationTo(os); } bool MatchAndExplain(const T& x, MatchResultListener* listener) const override { return impl_->MatchAndExplain(x, listener); } private: const MatcherInterface* const impl_; GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter); }; struct AnyEq { template bool operator()(const A& a, const B& b) const { return a == b; } }; struct AnyNe { template bool operator()(const A& a, const B& b) const { return a != b; } }; struct AnyLt { template bool operator()(const A& a, const B& b) const { return a < b; } }; struct AnyGt { template bool operator()(const A& a, const B& b) const { return a > b; } }; struct AnyLe { template bool operator()(const A& a, const B& b) const { return a <= b; } }; struct AnyGe { template bool operator()(const A& a, const B& b) const { return a >= b; } }; // A match result listener that ignores the explanation. class DummyMatchResultListener : public MatchResultListener { public: DummyMatchResultListener() : MatchResultListener(nullptr) {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); }; // A match result listener that forwards the explanation to a given // ostream. The difference between this and MatchResultListener is // that the former is concrete. class StreamMatchResultListener : public MatchResultListener { public: explicit StreamMatchResultListener(::std::ostream* os) : MatchResultListener(os) {} private: GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); }; // An internal class for implementing Matcher, which will derive // from it. We put functionalities common to all Matcher // specializations here to avoid code duplication. template class MatcherBase { public: // Returns true if and only if the matcher matches x; also explains the // match result to 'listener'. bool MatchAndExplain(const T& x, MatchResultListener* listener) const { return impl_->MatchAndExplain(x, listener); } // Returns true if and only if this matcher matches x. bool Matches(const T& x) const { DummyMatchResultListener dummy; return MatchAndExplain(x, &dummy); } // Describes this matcher to an ostream. void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } // Describes the negation of this matcher to an ostream. void DescribeNegationTo(::std::ostream* os) const { impl_->DescribeNegationTo(os); } // Explains why x matches, or doesn't match, the matcher. void ExplainMatchResultTo(const T& x, ::std::ostream* os) const { StreamMatchResultListener listener(os); MatchAndExplain(x, &listener); } // Returns the describer for this matcher object; retains ownership // of the describer, which is only guaranteed to be alive when // this matcher object is alive. const MatcherDescriberInterface* GetDescriber() const { return impl_.get(); } protected: MatcherBase() {} // Constructs a matcher from its implementation. explicit MatcherBase(const MatcherInterface* impl) : impl_(impl) {} template explicit MatcherBase( const MatcherInterface* impl, typename std::enable_if::value>::type* = nullptr) : impl_(new internal::MatcherInterfaceAdapter(impl)) {} MatcherBase(const MatcherBase&) = default; MatcherBase& operator=(const MatcherBase&) = default; MatcherBase(MatcherBase&&) = default; MatcherBase& operator=(MatcherBase&&) = default; virtual ~MatcherBase() {} private: std::shared_ptr> impl_; }; } // namespace internal // A Matcher is a copyable and IMMUTABLE (except by assignment) // object that can check whether a value of type T matches. The // implementation of Matcher is just a std::shared_ptr to const // MatcherInterface. Don't inherit from Matcher! template class Matcher : public internal::MatcherBase { public: // Constructs a null matcher. Needed for storing Matcher objects in STL // containers. A default-constructed matcher is not yet initialized. You // cannot use it until a valid value has been assigned to it. explicit Matcher() {} // NOLINT // Constructs a matcher from its implementation. explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} template explicit Matcher( const MatcherInterface* impl, typename std::enable_if::value>::type* = nullptr) : internal::MatcherBase(impl) {} // Implicit constructor here allows people to write // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes Matcher(T value); // NOLINT }; // The following two specializations allow the user to write str // instead of Eq(str) and "foo" instead of Eq("foo") when a std::string // matcher is expected. template <> class GTEST_API_ Matcher : public internal::MatcherBase { public: Matcher() {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a std::string object. Matcher(const std::string& s); // NOLINT // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT }; template <> class GTEST_API_ Matcher : public internal::MatcherBase { public: Matcher() {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a string object. Matcher(const std::string& s); // NOLINT // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT }; #if GTEST_HAS_ABSL // The following two specializations allow the user to write str // instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view // matcher is expected. template <> class GTEST_API_ Matcher : public internal::MatcherBase { public: Matcher() {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a std::string object. Matcher(const std::string& s); // NOLINT // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT // Allows the user to pass absl::string_views directly. Matcher(absl::string_view s); // NOLINT }; template <> class GTEST_API_ Matcher : public internal::MatcherBase { public: Matcher() {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} explicit Matcher(const MatcherInterface* impl) : internal::MatcherBase(impl) {} // Allows the user to write str instead of Eq(str) sometimes, where // str is a std::string object. Matcher(const std::string& s); // NOLINT // Allows the user to write "foo" instead of Eq("foo") sometimes. Matcher(const char* s); // NOLINT // Allows the user to pass absl::string_views directly. Matcher(absl::string_view s); // NOLINT }; #endif // GTEST_HAS_ABSL // Prints a matcher in a human-readable format. template std::ostream& operator<<(std::ostream& os, const Matcher& matcher) { matcher.DescribeTo(&os); return os; } // The PolymorphicMatcher class template makes it easy to implement a // polymorphic matcher (i.e. a matcher that can match values of more // than one type, e.g. Eq(n) and NotNull()). // // To define a polymorphic matcher, a user should provide an Impl // class that has a DescribeTo() method and a DescribeNegationTo() // method, and define a member function (or member function template) // // bool MatchAndExplain(const Value& value, // MatchResultListener* listener) const; // // See the definition of NotNull() for a complete example. template class PolymorphicMatcher { public: explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} // Returns a mutable reference to the underlying matcher // implementation object. Impl& mutable_impl() { return impl_; } // Returns an immutable reference to the underlying matcher // implementation object. const Impl& impl() const { return impl_; } template operator Matcher() const { return Matcher(new MonomorphicImpl(impl_)); } private: template class MonomorphicImpl : public MatcherInterface { public: explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); } virtual void DescribeNegationTo(::std::ostream* os) const { impl_.DescribeNegationTo(os); } virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { return impl_.MatchAndExplain(x, listener); } private: const Impl impl_; }; Impl impl_; }; // Creates a matcher from its implementation. // DEPRECATED: Especially in the generic code, prefer: // Matcher(new MyMatcherImpl(...)); // // MakeMatcher may create a Matcher that accepts its argument by value, which // leads to unnecessary copies & lack of support for non-copyable types. template inline Matcher MakeMatcher(const MatcherInterface* impl) { return Matcher(impl); } // Creates a polymorphic matcher from its implementation. This is // easier to use than the PolymorphicMatcher constructor as it // doesn't require you to explicitly write the template argument, e.g. // // MakePolymorphicMatcher(foo); // vs // PolymorphicMatcher(foo); template inline PolymorphicMatcher MakePolymorphicMatcher(const Impl& impl) { return PolymorphicMatcher(impl); } namespace internal { // Implements a matcher that compares a given value with a // pre-supplied value using one of the ==, <=, <, etc, operators. The // two values being compared don't have to have the same type. // // The matcher defined here is polymorphic (for example, Eq(5) can be // used to match an int, a short, a double, etc). Therefore we use // a template type conversion operator in the implementation. // // The following template definition assumes that the Rhs parameter is // a "bare" type (i.e. neither 'const T' nor 'T&'). template class ComparisonBase { public: explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} template operator Matcher() const { return Matcher(new Impl(rhs_)); } private: template static const T& Unwrap(const T& v) { return v; } template static const T& Unwrap(std::reference_wrapper v) { return v; } template class Impl : public MatcherInterface { public: explicit Impl(const Rhs& rhs) : rhs_(rhs) {} bool MatchAndExplain(Lhs lhs, MatchResultListener* /* listener */) const override { return Op()(lhs, Unwrap(rhs_)); } void DescribeTo(::std::ostream* os) const override { *os << D::Desc() << " "; UniversalPrint(Unwrap(rhs_), os); } void DescribeNegationTo(::std::ostream* os) const override { *os << D::NegatedDesc() << " "; UniversalPrint(Unwrap(rhs_), os); } private: Rhs rhs_; }; Rhs rhs_; }; template class EqMatcher : public ComparisonBase, Rhs, AnyEq> { public: explicit EqMatcher(const Rhs& rhs) : ComparisonBase, Rhs, AnyEq>(rhs) { } static const char* Desc() { return "is equal to"; } static const char* NegatedDesc() { return "isn't equal to"; } }; template class NeMatcher : public ComparisonBase, Rhs, AnyNe> { public: explicit NeMatcher(const Rhs& rhs) : ComparisonBase, Rhs, AnyNe>(rhs) { } static const char* Desc() { return "isn't equal to"; } static const char* NegatedDesc() { return "is equal to"; } }; template class LtMatcher : public ComparisonBase, Rhs, AnyLt> { public: explicit LtMatcher(const Rhs& rhs) : ComparisonBase, Rhs, AnyLt>(rhs) { } static const char* Desc() { return "is <"; } static const char* NegatedDesc() { return "isn't <"; } }; template class GtMatcher : public ComparisonBase, Rhs, AnyGt> { public: explicit GtMatcher(const Rhs& rhs) : ComparisonBase, Rhs, AnyGt>(rhs) { } static const char* Desc() { return "is >"; } static const char* NegatedDesc() { return "isn't >"; } }; template class LeMatcher : public ComparisonBase, Rhs, AnyLe> { public: explicit LeMatcher(const Rhs& rhs) : ComparisonBase, Rhs, AnyLe>(rhs) { } static const char* Desc() { return "is <="; } static const char* NegatedDesc() { return "isn't <="; } }; template class GeMatcher : public ComparisonBase, Rhs, AnyGe> { public: explicit GeMatcher(const Rhs& rhs) : ComparisonBase, Rhs, AnyGe>(rhs) { } static const char* Desc() { return "is >="; } static const char* NegatedDesc() { return "isn't >="; } }; // Implements polymorphic matchers MatchesRegex(regex) and // ContainsRegex(regex), which can be used as a Matcher as long as // T can be converted to a string. class MatchesRegexMatcher { public: MatchesRegexMatcher(const RE* regex, bool full_match) : regex_(regex), full_match_(full_match) {} #if GTEST_HAS_ABSL bool MatchAndExplain(const absl::string_view& s, MatchResultListener* listener) const { return MatchAndExplain(std::string(s), listener); } #endif // GTEST_HAS_ABSL // Accepts pointer types, particularly: // const char* // char* // const wchar_t* // wchar_t* template bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { return s != nullptr && MatchAndExplain(std::string(s), listener); } // Matches anything that can convert to std::string. // // This is a template, not just a plain function with const std::string&, // because absl::string_view has some interfering non-explicit constructors. template bool MatchAndExplain(const MatcheeStringType& s, MatchResultListener* /* listener */) const { const std::string& s2(s); return full_match_ ? RE::FullMatch(s2, *regex_) : RE::PartialMatch(s2, *regex_); } void DescribeTo(::std::ostream* os) const { *os << (full_match_ ? "matches" : "contains") << " regular expression "; UniversalPrinter::Print(regex_->pattern(), os); } void DescribeNegationTo(::std::ostream* os) const { *os << "doesn't " << (full_match_ ? "match" : "contain") << " regular expression "; UniversalPrinter::Print(regex_->pattern(), os); } private: const std::shared_ptr regex_; const bool full_match_; }; } // namespace internal // Matches a string that fully matches regular expression 'regex'. // The matcher takes ownership of 'regex'. inline PolymorphicMatcher MatchesRegex( const internal::RE* regex) { return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); } inline PolymorphicMatcher MatchesRegex( const std::string& regex) { return MatchesRegex(new internal::RE(regex)); } // Matches a string that contains regular expression 'regex'. // The matcher takes ownership of 'regex'. inline PolymorphicMatcher ContainsRegex( const internal::RE* regex) { return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); } inline PolymorphicMatcher ContainsRegex( const std::string& regex) { return ContainsRegex(new internal::RE(regex)); } // Creates a polymorphic matcher that matches anything equal to x. // Note: if the parameter of Eq() were declared as const T&, Eq("foo") // wouldn't compile. template inline internal::EqMatcher Eq(T x) { return internal::EqMatcher(x); } // Constructs a Matcher from a 'value' of type T. The constructed // matcher matches any value that's equal to 'value'. template Matcher::Matcher(T value) { *this = Eq(value); } // Creates a monomorphic matcher that matches anything with type Lhs // and equal to rhs. A user may need to use this instead of Eq(...) // in order to resolve an overloading ambiguity. // // TypedEq(x) is just a convenient short-hand for Matcher(Eq(x)) // or Matcher(x), but more readable than the latter. // // We could define similar monomorphic matchers for other comparison // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do // it yet as those are used much less than Eq() in practice. A user // can always write Matcher(Lt(5)) to be explicit about the type, // for example. template inline Matcher TypedEq(const Rhs& rhs) { return Eq(rhs); } // Creates a polymorphic matcher that matches anything >= x. template inline internal::GeMatcher Ge(Rhs x) { return internal::GeMatcher(x); } // Creates a polymorphic matcher that matches anything > x. template inline internal::GtMatcher Gt(Rhs x) { return internal::GtMatcher(x); } // Creates a polymorphic matcher that matches anything <= x. template inline internal::LeMatcher Le(Rhs x) { return internal::LeMatcher(x); } // Creates a polymorphic matcher that matches anything < x. template inline internal::LtMatcher Lt(Rhs x) { return internal::LtMatcher(x); } // Creates a polymorphic matcher that matches anything != x. template inline internal::NeMatcher Ne(Rhs x) { return internal::NeMatcher(x); } } // namespace testing GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046 #endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-printers.h0000664000175000017500000010235513553267757020362 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Google Test - The Google C++ Testing and Mocking Framework // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); // // A user can teach this function how to print a class type T by // defining either operator<<() or PrintTo() in the namespace that // defines T. More specifically, the FIRST defined function in the // following list will be used (assuming T is defined in namespace // foo): // // 1. foo::PrintTo(const T&, ostream*) // 2. operator<<(ostream&, const T&) defined in either foo or the // global namespace. // // However if T is an STL-style container then it is printed element-wise // unless foo::PrintTo(const T&, ostream*) is defined. Note that // operator<<() is ignored for container types. // // If none of the above is defined, it will print the debug string of // the value if it is a protocol buffer, or print the raw bytes in the // value otherwise. // // To aid debugging: when T is a reference type, the address of the // value is also printed; when T is a (const) char pointer, both the // pointer value and the NUL-terminated string it points to are // printed. // // We also provide some convenient wrappers: // // // Prints a value to a string. For a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // std::string ::testing::PrintToString(const T& value); // // // Prints a value tersely: for a reference type, the referenced // // value (but not the address) is printed; for a (const or not) char // // pointer, the NUL-terminated string (but not the pointer) is // // printed. // void ::testing::internal::UniversalTersePrint(const T& value, ostream*); // // // Prints value using the type inferred by the compiler. The difference // // from UniversalTersePrint() is that this function prints both the // // pointer and the NUL-terminated string for a (const or not) char pointer. // void ::testing::internal::UniversalPrint(const T& value, ostream*); // // // Prints the fields of a tuple tersely to a string vector, one // // element for each field. Tuple support must be enabled in // // gtest-port.h. // std::vector UniversalTersePrintTupleFieldsToStrings( // const Tuple& value); // // Known limitation: // // The print primitives print the elements of an STL-style container // using the compiler-inferred type of *iter where iter is a // const_iterator of the container. When const_iterator is an input // iterator but not a forward iterator, this inferred type may not // match value_type, and the print output may be incorrect. In // practice, this is rarely a problem as for most containers // const_iterator is a forward iterator. We'll fix this if there's an // actual need for it. Note that this fix cannot rely on value_type // being defined as many user-defined container types don't have // value_type. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ #include #include // NOLINT #include #include #include #include #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" #if GTEST_HAS_ABSL #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "absl/types/variant.h" #endif // GTEST_HAS_ABSL namespace testing { // Definitions in the 'internal' and 'internal2' name spaces are // subject to change without notice. DO NOT USE THEM IN USER CODE! namespace internal2 { // Prints the given number of bytes in the given object to the given // ostream. GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ::std::ostream* os); // For selecting which printer to use when a given type has neither << // nor PrintTo(). enum TypeKind { kProtobuf, // a protobuf type kConvertibleToInteger, // a type implicitly convertible to BiggestInt // (e.g. a named or unnamed enum type) #if GTEST_HAS_ABSL kConvertibleToStringView, // a type implicitly convertible to // absl::string_view #endif kOtherType // anything else }; // TypeWithoutFormatter::PrintValue(value, os) is called // by the universal printer to print a value of type T when neither // operator<< nor PrintTo() is defined for T, where kTypeKind is the // "kind" of T as defined by enum TypeKind. template class TypeWithoutFormatter { public: // This default version is called when kTypeKind is kOtherType. static void PrintValue(const T& value, ::std::ostream* os) { PrintBytesInObjectTo( static_cast( reinterpret_cast(std::addressof(value))), sizeof(value), os); } }; // We print a protobuf using its ShortDebugString() when the string // doesn't exceed this many characters; otherwise we print it using // DebugString() for better readability. const size_t kProtobufOneLinerMaxLength = 50; template class TypeWithoutFormatter { public: static void PrintValue(const T& value, ::std::ostream* os) { std::string pretty_str = value.ShortDebugString(); if (pretty_str.length() > kProtobufOneLinerMaxLength) { pretty_str = "\n" + value.DebugString(); } *os << ("<" + pretty_str + ">"); } }; template class TypeWithoutFormatter { public: // Since T has no << operator or PrintTo() but can be implicitly // converted to BiggestInt, we print it as a BiggestInt. // // Most likely T is an enum type (either named or unnamed), in which // case printing it as an integer is the desired behavior. In case // T is not an enum, printing it as an integer is the best we can do // given that it has no user-defined printer. static void PrintValue(const T& value, ::std::ostream* os) { const internal::BiggestInt kBigInt = value; *os << kBigInt; } }; #if GTEST_HAS_ABSL template class TypeWithoutFormatter { public: // Since T has neither operator<< nor PrintTo() but can be implicitly // converted to absl::string_view, we print it as a absl::string_view. // // Note: the implementation is further below, as it depends on // internal::PrintTo symbol which is defined later in the file. static void PrintValue(const T& value, ::std::ostream* os); }; #endif // Prints the given value to the given ostream. If the value is a // protocol message, its debug string is printed; if it's an enum or // of a type implicitly convertible to BiggestInt, it's printed as an // integer; otherwise the bytes in the value are printed. This is // what UniversalPrinter::Print() does when it knows nothing about // type T and T has neither << operator nor PrintTo(). // // A user can override this behavior for a class type Foo by defining // a << operator in the namespace where Foo is defined. // // We put this operator in namespace 'internal2' instead of 'internal' // to simplify the implementation, as much code in 'internal' needs to // use << in STL, which would conflict with our own << were it defined // in 'internal'. // // Note that this operator<< takes a generic std::basic_ostream type instead of the more restricted std::ostream. If // we define it to take an std::ostream instead, we'll get an // "ambiguous overloads" compiler error when trying to print a type // Foo that supports streaming to std::basic_ostream, as the compiler cannot tell whether // operator<<(std::ostream&, const T&) or // operator<<(std::basic_stream, const Foo&) is more // specific. template ::std::basic_ostream& operator<<( ::std::basic_ostream& os, const T& x) { TypeWithoutFormatter::value ? kProtobuf : std::is_convertible< const T&, internal::BiggestInt>::value ? kConvertibleToInteger : #if GTEST_HAS_ABSL std::is_convertible< const T&, absl::string_view>::value ? kConvertibleToStringView : #endif kOtherType)>::PrintValue(x, &os); return os; } } // namespace internal2 } // namespace testing // This namespace MUST NOT BE NESTED IN ::testing, or the name look-up // magic needed for implementing UniversalPrinter won't work. namespace testing_internal { // Used to print a value that is not an STL-style container when the // user doesn't define PrintTo() for it. template void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { // With the following statement, during unqualified name lookup, // testing::internal2::operator<< appears as if it was declared in // the nearest enclosing namespace that contains both // ::testing_internal and ::testing::internal2, i.e. the global // namespace. For more details, refer to the C++ Standard section // 7.3.4-1 [namespace.udir]. This allows us to fall back onto // testing::internal2::operator<< in case T doesn't come with a << // operator. // // We cannot write 'using ::testing::internal2::operator<<;', which // gcc 3.3 fails to compile due to a compiler bug. using namespace ::testing::internal2; // NOLINT // Assuming T is defined in namespace foo, in the next statement, // the compiler will consider all of: // // 1. foo::operator<< (thanks to Koenig look-up), // 2. ::operator<< (as the current namespace is enclosed in ::), // 3. testing::internal2::operator<< (thanks to the using statement above). // // The operator<< whose type matches T best will be picked. // // We deliberately allow #2 to be a candidate, as sometimes it's // impossible to define #1 (e.g. when foo is ::std, defining // anything in it is undefined behavior unless you are a compiler // vendor.). *os << value; } } // namespace testing_internal namespace testing { namespace internal { // FormatForComparison::Format(value) formats a // value of type ToPrint that is an operand of a comparison assertion // (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in // the comparison, and is used to help determine the best way to // format the value. In particular, when the value is a C string // (char pointer) and the other operand is an STL string object, we // want to format the C string as a string, since we know it is // compared by value with the string object. If the value is a char // pointer but the other operand is not an STL string object, we don't // know whether the pointer is supposed to point to a NUL-terminated // string, and thus want to print it as a pointer to be safe. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. // The default case. template class FormatForComparison { public: static ::std::string Format(const ToPrint& value) { return ::testing::PrintToString(value); } }; // Array. template class FormatForComparison { public: static ::std::string Format(const ToPrint* value) { return FormatForComparison::Format(value); } }; // By default, print C string as pointers to be safe, as we don't know // whether they actually point to a NUL-terminated string. #define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \ template \ class FormatForComparison { \ public: \ static ::std::string Format(CharType* value) { \ return ::testing::PrintToString(static_cast(value)); \ } \ } GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); #undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ // If a C string is compared with an STL string object, we know it's meant // to point to a NUL-terminated string, and thus can print it as a string. #define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \ template <> \ class FormatForComparison { \ public: \ static ::std::string Format(CharType* value) { \ return ::testing::PrintToString(value); \ } \ } GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); #if GTEST_HAS_STD_WSTRING GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring); #endif #undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_ // Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) // operand to be used in a failure message. The type (but not value) // of the other operand may affect the format. This allows us to // print a char* as a raw pointer when it is compared against another // char* or void*, and print it as a C string when it is compared // against an std::string object, for example. // // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. template std::string FormatForComparisonFailureMessage( const T1& value, const T2& /* other_operand */) { return FormatForComparison::Format(value); } // UniversalPrinter::Print(value, ostream_ptr) prints the given // value to the given ostream. The caller must ensure that // 'ostream_ptr' is not NULL, or the behavior is undefined. // // We define UniversalPrinter as a class template (as opposed to a // function template), as we need to partially specialize it for // reference types, which cannot be done with function templates. template class UniversalPrinter; template void UniversalPrint(const T& value, ::std::ostream* os); enum DefaultPrinterType { kPrintContainer, kPrintPointer, kPrintFunctionPointer, kPrintOther, }; template struct WrapPrinterType {}; // Used to print an STL-style container when the user doesn't define // a PrintTo() for it. template void DefaultPrintTo(WrapPrinterType /* dummy */, const C& container, ::std::ostream* os) { const size_t kMaxCount = 32; // The maximum number of elements to print. *os << '{'; size_t count = 0; for (typename C::const_iterator it = container.begin(); it != container.end(); ++it, ++count) { if (count > 0) { *os << ','; if (count == kMaxCount) { // Enough has been printed. *os << " ..."; break; } } *os << ' '; // We cannot call PrintTo(*it, os) here as PrintTo() doesn't // handle *it being a native array. internal::UniversalPrint(*it, os); } if (count > 0) { *os << ' '; } *os << '}'; } // Used to print a pointer that is neither a char pointer nor a member // pointer, when the user doesn't define PrintTo() for it. (A member // variable pointer or member function pointer doesn't really point to // a location in the address space. Their representation is // implementation-defined. Therefore they will be printed as raw // bytes.) template void DefaultPrintTo(WrapPrinterType /* dummy */, T* p, ::std::ostream* os) { if (p == nullptr) { *os << "NULL"; } else { // T is not a function type. We just call << to print p, // relying on ADL to pick up user-defined << for their pointer // types, if any. *os << p; } } template void DefaultPrintTo(WrapPrinterType /* dummy */, T* p, ::std::ostream* os) { if (p == nullptr) { *os << "NULL"; } else { // T is a function type, so '*os << p' doesn't do what we want // (it just prints p as bool). We want to print p as a const // void*. *os << reinterpret_cast(p); } } // Used to print a non-container, non-pointer value when the user // doesn't define PrintTo() for it. template void DefaultPrintTo(WrapPrinterType /* dummy */, const T& value, ::std::ostream* os) { ::testing_internal::DefaultPrintNonContainerTo(value, os); } // Prints the given value using the << operator if it has one; // otherwise prints the bytes in it. This is what // UniversalPrinter::Print() does when PrintTo() is not specialized // or overloaded for type T. // // A user can override this behavior for a class type Foo by defining // an overload of PrintTo() in the namespace where Foo is defined. We // give the user this option as sometimes defining a << operator for // Foo is not desirable (e.g. the coding style may prevent doing it, // or there is already a << operator but it doesn't do what the user // wants). template void PrintTo(const T& value, ::std::ostream* os) { // DefaultPrintTo() is overloaded. The type of its first argument // determines which version will be picked. // // Note that we check for container types here, prior to we check // for protocol message types in our operator<<. The rationale is: // // For protocol messages, we want to give people a chance to // override Google Mock's format by defining a PrintTo() or // operator<<. For STL containers, other formats can be // incompatible with Google Mock's format for the container // elements; therefore we check for container types here to ensure // that our format is used. // // Note that MSVC and clang-cl do allow an implicit conversion from // pointer-to-function to pointer-to-object, but clang-cl warns on it. // So don't use ImplicitlyConvertible if it can be helped since it will // cause this warning, and use a separate overload of DefaultPrintTo for // function pointers so that the `*os << p` in the object pointer overload // doesn't cause that warning either. DefaultPrintTo( WrapPrinterType < (sizeof(IsContainerTest(0)) == sizeof(IsContainer)) && !IsRecursiveContainer::value ? kPrintContainer : !std::is_pointer::value ? kPrintOther : std::is_function::type>::value ? kPrintFunctionPointer : kPrintPointer > (), value, os); } // The following list of PrintTo() overloads tells // UniversalPrinter::Print() how to print standard types (built-in // types, strings, plain arrays, and pointers). // Overloads for various char types. GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os); GTEST_API_ void PrintTo(signed char c, ::std::ostream* os); inline void PrintTo(char c, ::std::ostream* os) { // When printing a plain char, we always treat it as unsigned. This // way, the output won't be affected by whether the compiler thinks // char is signed or not. PrintTo(static_cast(c), os); } // Overloads for other simple built-in types. inline void PrintTo(bool x, ::std::ostream* os) { *os << (x ? "true" : "false"); } // Overload for wchar_t type. // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its decimal code (except for L'\0'). // The L'\0' char is printed as "L'\\0'". The decimal code is printed // as signed integer when wchar_t is implemented by the compiler // as a signed type and is printed as an unsigned integer when wchar_t // is implemented as an unsigned type. GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); // Overloads for C strings. GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); inline void PrintTo(char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } // signed/unsigned char is often used for representing binary data, so // we print pointers to it as void* to be safe. inline void PrintTo(const signed char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } inline void PrintTo(signed char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } inline void PrintTo(const unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } inline void PrintTo(unsigned char* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } // MSVC can be configured to define wchar_t as a typedef of unsigned // short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native // type. When wchar_t is a typedef, defining an overload for const // wchar_t* would cause unsigned short* be printed as a wide string, // possibly causing invalid memory accesses. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Overloads for wide C strings GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os); inline void PrintTo(wchar_t* s, ::std::ostream* os) { PrintTo(ImplicitCast_(s), os); } #endif // Overload for C arrays. Multi-dimensional arrays are printed // properly. // Prints the given number of elements in an array, without printing // the curly braces. template void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { UniversalPrint(a[0], os); for (size_t i = 1; i != count; i++) { *os << ", "; UniversalPrint(a[i], os); } } // Overloads for ::std::string. GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os); inline void PrintTo(const ::std::string& s, ::std::ostream* os) { PrintStringTo(s, os); } // Overloads for ::std::wstring. #if GTEST_HAS_STD_WSTRING GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { PrintWideStringTo(s, os); } #endif // GTEST_HAS_STD_WSTRING #if GTEST_HAS_ABSL // Overload for absl::string_view. inline void PrintTo(absl::string_view sp, ::std::ostream* os) { PrintTo(::std::string(sp), os); } #endif // GTEST_HAS_ABSL inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; } template void PrintTo(std::reference_wrapper ref, ::std::ostream* os) { UniversalPrinter::Print(ref.get(), os); } // Helper function for printing a tuple. T must be instantiated with // a tuple type. template void PrintTupleTo(const T&, std::integral_constant, ::std::ostream*) {} template void PrintTupleTo(const T& t, std::integral_constant, ::std::ostream* os) { PrintTupleTo(t, std::integral_constant(), os); GTEST_INTENTIONAL_CONST_COND_PUSH_() if (I > 1) { GTEST_INTENTIONAL_CONST_COND_POP_() *os << ", "; } UniversalPrinter::type>::Print( std::get(t), os); } template void PrintTo(const ::std::tuple& t, ::std::ostream* os) { *os << "("; PrintTupleTo(t, std::integral_constant(), os); *os << ")"; } // Overload for std::pair. template void PrintTo(const ::std::pair& value, ::std::ostream* os) { *os << '('; // We cannot use UniversalPrint(value.first, os) here, as T1 may be // a reference type. The same for printing value.second. UniversalPrinter::Print(value.first, os); *os << ", "; UniversalPrinter::Print(value.second, os); *os << ')'; } // Implements printing a non-reference type T by letting the compiler // pick the right overload of PrintTo() for T. template class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180) // Note: we deliberately don't call this PrintTo(), as that name // conflicts with ::testing::internal::PrintTo in the body of the // function. static void Print(const T& value, ::std::ostream* os) { // By default, ::testing::internal::PrintTo() is used for printing // the value. // // Thanks to Koenig look-up, if T is a class and has its own // PrintTo() function defined in its namespace, that function will // be visible here. Since it is more specific than the generic ones // in ::testing::internal, it will be picked by the compiler in the // following statement - exactly what we want. PrintTo(value, os); } GTEST_DISABLE_MSC_WARNINGS_POP_() }; #if GTEST_HAS_ABSL // Printer for absl::optional template class UniversalPrinter<::absl::optional> { public: static void Print(const ::absl::optional& value, ::std::ostream* os) { *os << '('; if (!value) { *os << "nullopt"; } else { UniversalPrint(*value, os); } *os << ')'; } }; // Printer for absl::variant template class UniversalPrinter<::absl::variant> { public: static void Print(const ::absl::variant& value, ::std::ostream* os) { *os << '('; absl::visit(Visitor{os}, value); *os << ')'; } private: struct Visitor { template void operator()(const U& u) const { *os << "'" << GetTypeName() << "' with value "; UniversalPrint(u, os); } ::std::ostream* os; }; }; #endif // GTEST_HAS_ABSL // UniversalPrintArray(begin, len, os) prints an array of 'len' // elements, starting at address 'begin'. template void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { if (len == 0) { *os << "{}"; } else { *os << "{ "; const size_t kThreshold = 18; const size_t kChunkSize = 8; // If the array has more than kThreshold elements, we'll have to // omit some details by printing only the first and the last // kChunkSize elements. if (len <= kThreshold) { PrintRawArrayTo(begin, len, os); } else { PrintRawArrayTo(begin, kChunkSize, os); *os << ", ..., "; PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); } *os << " }"; } } // This overload prints a (const) char array compactly. GTEST_API_ void UniversalPrintArray( const char* begin, size_t len, ::std::ostream* os); // This overload prints a (const) wchar_t array compactly. GTEST_API_ void UniversalPrintArray( const wchar_t* begin, size_t len, ::std::ostream* os); // Implements printing an array type T[N]. template class UniversalPrinter { public: // Prints the given array, omitting some elements when there are too // many. static void Print(const T (&a)[N], ::std::ostream* os) { UniversalPrintArray(a, N, os); } }; // Implements printing a reference type T&. template class UniversalPrinter { public: // MSVC warns about adding const to a function type, so we want to // disable the warning. GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180) static void Print(const T& value, ::std::ostream* os) { // Prints the address of the value. We use reinterpret_cast here // as static_cast doesn't compile when T is a function type. *os << "@" << reinterpret_cast(&value) << " "; // Then prints the value itself. UniversalPrint(value, os); } GTEST_DISABLE_MSC_WARNINGS_POP_() }; // Prints a value tersely: for a reference type, the referenced value // (but not the address) is printed; for a (const) char pointer, the // NUL-terminated string (but not the pointer) is printed. template class UniversalTersePrinter { public: static void Print(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } }; template class UniversalTersePrinter { public: static void Print(const T& value, ::std::ostream* os) { UniversalPrint(value, os); } }; template class UniversalTersePrinter { public: static void Print(const T (&value)[N], ::std::ostream* os) { UniversalPrinter::Print(value, os); } }; template <> class UniversalTersePrinter { public: static void Print(const char* str, ::std::ostream* os) { if (str == nullptr) { *os << "NULL"; } else { UniversalPrint(std::string(str), os); } } }; template <> class UniversalTersePrinter { public: static void Print(char* str, ::std::ostream* os) { UniversalTersePrinter::Print(str, os); } }; #if GTEST_HAS_STD_WSTRING template <> class UniversalTersePrinter { public: static void Print(const wchar_t* str, ::std::ostream* os) { if (str == nullptr) { *os << "NULL"; } else { UniversalPrint(::std::wstring(str), os); } } }; #endif template <> class UniversalTersePrinter { public: static void Print(wchar_t* str, ::std::ostream* os) { UniversalTersePrinter::Print(str, os); } }; template void UniversalTersePrint(const T& value, ::std::ostream* os) { UniversalTersePrinter::Print(value, os); } // Prints a value using the type inferred by the compiler. The // difference between this and UniversalTersePrint() is that for a // (const) char pointer, this prints both the pointer and the // NUL-terminated string. template void UniversalPrint(const T& value, ::std::ostream* os) { // A workarond for the bug in VC++ 7.1 that prevents us from instantiating // UniversalPrinter with T directly. typedef T T1; UniversalPrinter::Print(value, os); } typedef ::std::vector< ::std::string> Strings; // Tersely prints the first N fields of a tuple to a string vector, // one element for each field. template void TersePrintPrefixToStrings(const Tuple&, std::integral_constant, Strings*) {} template void TersePrintPrefixToStrings(const Tuple& t, std::integral_constant, Strings* strings) { TersePrintPrefixToStrings(t, std::integral_constant(), strings); ::std::stringstream ss; UniversalTersePrint(std::get(t), &ss); strings->push_back(ss.str()); } // Prints the fields of a tuple tersely to a string vector, one // element for each field. See the comment before // UniversalTersePrint() for how we define "tersely". template Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { Strings result; TersePrintPrefixToStrings( value, std::integral_constant::value>(), &result); return result; } } // namespace internal #if GTEST_HAS_ABSL namespace internal2 { template void TypeWithoutFormatter::PrintValue( const T& value, ::std::ostream* os) { internal::PrintTo(absl::string_view(value), os); } } // namespace internal2 #endif template ::std::string PrintToString(const T& value) { ::std::stringstream ss; internal::UniversalTersePrinter::Print(value, &ss); return ss.str(); } } // namespace testing // Include any custom printer added by the local installation. // We must include this header at the end to make sure it can use the // declarations from this file. #include "gtest/internal/custom/gtest-printers.h" #endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-spi.h0000664000175000017500000002356113553267757017310 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Utilities for testing Google Test itself and code that uses Google Test // (e.g. frameworks built on top of Google Test). // GOOGLETEST_CM0004 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ #include "gtest/gtest.h" GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) namespace testing { // This helper class can be used to mock out Google Test failure reporting // so that we can test Google Test or code that builds on Google Test. // // An object of this class appends a TestPartResult object to the // TestPartResultArray object given in the constructor whenever a Google Test // failure is reported. It can either intercept only failures that are // generated in the same thread that created this object or it can intercept // all generated failures. The scope of this mock object can be controlled with // the second argument to the two arguments constructor. class GTEST_API_ ScopedFakeTestPartResultReporter : public TestPartResultReporterInterface { public: // The two possible mocking modes of this object. enum InterceptMode { INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. INTERCEPT_ALL_THREADS // Intercepts all failures. }; // The c'tor sets this object as the test part result reporter used // by Google Test. The 'result' parameter specifies where to report the // results. This reporter will only catch failures generated in the current // thread. DEPRECATED explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); // Same as above, but you can choose the interception scope of this object. ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, TestPartResultArray* result); // The d'tor restores the previous test part result reporter. ~ScopedFakeTestPartResultReporter() override; // Appends the TestPartResult object to the TestPartResultArray // received in the constructor. // // This method is from the TestPartResultReporterInterface // interface. void ReportTestPartResult(const TestPartResult& result) override; private: void Init(); const InterceptMode intercept_mode_; TestPartResultReporterInterface* old_reporter_; TestPartResultArray* const result_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); }; namespace internal { // A helper class for implementing EXPECT_FATAL_FAILURE() and // EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. class GTEST_API_ SingleFailureChecker { public: // The constructor remembers the arguments. SingleFailureChecker(const TestPartResultArray* results, TestPartResult::Type type, const std::string& substr); ~SingleFailureChecker(); private: const TestPartResultArray* const results_; const TestPartResult::Type type_; const std::string substr_; GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); }; } // namespace internal } // namespace testing GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 // A set of macros for testing Google Test assertions or code that's expected // to generate Google Test fatal failures. It verifies that the given // statement will cause exactly one fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_FATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - 'statement' cannot reference local non-static variables or // non-static members of the current object. // - 'statement' cannot return a value. // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. The AcceptsMacroThatExpandsToUnprotectedComma test in // gtest_unittest.cc will fail to compile if we do that. #define EXPECT_FATAL_FAILURE(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do { \ class GTestExpectFatalFailureHelper {\ public:\ static void Execute() { statement; }\ };\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ALL_THREADS, >est_failures);\ GTestExpectFatalFailureHelper::Execute();\ }\ } while (::testing::internal::AlwaysFalse()) // A macro for testing Google Test assertions or code that's expected to // generate Google Test non-fatal failures. It asserts that the given // statement will cause exactly one non-fatal Google Test failure with 'substr' // being part of the failure message. // // There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only // affects and considers failures generated in the current thread and // EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. // // 'statement' is allowed to reference local variables and members of // the current object. // // The verification of the assertion is done correctly even when the statement // throws an exception or aborts the current function. // // Known restrictions: // - You cannot stream a failure message to this macro. // // Note that even though the implementations of the following two // macros are much alike, we cannot refactor them to use a common // helper macro, due to some peculiarity in how the preprocessor // works. If we do that, the code won't compile when the user gives // EXPECT_NONFATAL_FAILURE() a statement that contains a macro that // expands to code containing an unprotected comma. The // AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc // catches that. // // For the same reason, we have to write // if (::testing::internal::AlwaysTrue()) { statement; } // instead of // GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) // to avoid an MSVC warning on unreachable code. #define EXPECT_NONFATAL_FAILURE(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter:: \ INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ do {\ ::testing::TestPartResultArray gtest_failures;\ ::testing::internal::SingleFailureChecker gtest_checker(\ >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ (substr));\ {\ ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ >est_failures);\ if (::testing::internal::AlwaysTrue()) { statement; }\ }\ } while (::testing::internal::AlwaysFalse()) #endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-typed-test.h0000664000175000017500000003604313553267757020616 00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ #define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ // This header implements typed tests and type-parameterized tests. // Typed (aka type-driven) tests repeat the same test for types in a // list. You must know which types you want to test with when writing // typed tests. Here's how you do it: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template class FooTest : public testing::Test { public: ... typedef std::list List; static T shared_; T value_; }; // Next, associate a list of types with the test suite, which will be // repeated for each type in the list. The typedef is necessary for // the macro to parse correctly. typedef testing::Types MyTypes; TYPED_TEST_SUITE(FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // TYPED_TEST_SUITE(FooTest, int); // Then, use TYPED_TEST() instead of TEST_F() to define as many typed // tests for this test suite as you want. TYPED_TEST(FooTest, DoesBlah) { // Inside a test, refer to the special name TypeParam to get the type // parameter. Since we are inside a derived class template, C++ requires // us to visit the members of FooTest via 'this'. TypeParam n = this->value_; // To visit static members of the fixture, add the TestFixture:: // prefix. n += TestFixture::shared_; // To refer to typedefs in the fixture, add the "typename // TestFixture::" prefix. typename TestFixture::List values; values.push_back(n); ... } TYPED_TEST(FooTest, HasPropertyA) { ... } // TYPED_TEST_SUITE takes an optional third argument which allows to specify a // class that generates custom test name suffixes based on the type. This should // be a class which has a static template function GetName(int index) returning // a string for each type. The provided integer index equals the index of the // type in the provided type list. In many cases the index can be ignored. // // For example: // class MyTypeNames { // public: // template // static std::string GetName(int) { // if (std::is_same()) return "char"; // if (std::is_same()) return "int"; // if (std::is_same()) return "unsignedInt"; // } // }; // TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames); #endif // 0 // Type-parameterized tests are abstract test patterns parameterized // by a type. Compared with typed tests, type-parameterized tests // allow you to define the test pattern without knowing what the type // parameters are. The defined pattern can be instantiated with // different types any number of times, in any number of translation // units. // // If you are designing an interface or concept, you can define a // suite of type-parameterized tests to verify properties that any // valid implementation of the interface/concept should have. Then, // each implementation can easily instantiate the test suite to verify // that it conforms to the requirements, without having to write // similar tests repeatedly. Here's an example: #if 0 // First, define a fixture class template. It should be parameterized // by a type. Remember to derive it from testing::Test. template class FooTest : public testing::Test { ... }; // Next, declare that you will define a type-parameterized test suite // (the _P suffix is for "parameterized" or "pattern", whichever you // prefer): TYPED_TEST_SUITE_P(FooTest); // Then, use TYPED_TEST_P() to define as many type-parameterized tests // for this type-parameterized test suite as you want. TYPED_TEST_P(FooTest, DoesBlah) { // Inside a test, refer to TypeParam to get the type parameter. TypeParam n = 0; ... } TYPED_TEST_P(FooTest, HasPropertyA) { ... } // Now the tricky part: you need to register all test patterns before // you can instantiate them. The first argument of the macro is the // test suite name; the rest are the names of the tests in this test // case. REGISTER_TYPED_TEST_SUITE_P(FooTest, DoesBlah, HasPropertyA); // Finally, you are free to instantiate the pattern with the types you // want. If you put the above code in a header file, you can #include // it in multiple C++ source files and instantiate it multiple times. // // To distinguish different instances of the pattern, the first // argument to the INSTANTIATE_* macro is a prefix that will be added // to the actual test suite name. Remember to pick unique prefixes for // different instances. typedef testing::Types MyTypes; INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); // If the type list contains only one type, you can write that type // directly without Types<...>: // INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int); // // Similar to the optional argument of TYPED_TEST_SUITE above, // INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to // generate custom names. // INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames); #endif // 0 #include "gtest/internal/gtest-port.h" #include "gtest/internal/gtest-type-util.h" // Implements typed tests. #if GTEST_HAS_TYPED_TEST // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the typedef for the type parameters of the // given test suite. #define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_ // Expands to the name of the typedef for the NameGenerator, responsible for // creating the suffixes of the name. #define GTEST_NAME_GENERATOR_(TestSuiteName) \ gtest_type_params_##TestSuiteName##_NameGenerator #define TYPED_TEST_SUITE(CaseName, Types, ...) \ typedef ::testing::internal::TypeList::type GTEST_TYPE_PARAMS_( \ CaseName); \ typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ GTEST_NAME_GENERATOR_(CaseName) # define TYPED_TEST(CaseName, TestName) \ template \ class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ : public CaseName { \ private: \ typedef CaseName TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ static bool gtest_##CaseName##_##TestName##_registered_ \ GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTest< \ CaseName, \ ::testing::internal::TemplateSel, \ GTEST_TYPE_PARAMS_( \ CaseName)>::Register("", \ ::testing::internal::CodeLocation( \ __FILE__, __LINE__), \ #CaseName, #TestName, 0, \ ::testing::internal::GenerateNames< \ GTEST_NAME_GENERATOR_(CaseName), \ GTEST_TYPE_PARAMS_(CaseName)>()); \ template \ void GTEST_TEST_CLASS_NAME_(CaseName, \ TestName)::TestBody() // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define TYPED_TEST_CASE \ static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \ TYPED_TEST_SUITE #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #endif // GTEST_HAS_TYPED_TEST // Implements type-parameterized tests. #if GTEST_HAS_TYPED_TEST_P // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the namespace name that the type-parameterized tests for // the given type-parameterized test suite are defined in. The exact // name of the namespace is subject to change without notice. #define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // // Expands to the name of the variable used to remember the names of // the defined tests in the given test suite. #define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \ gtest_typed_test_suite_p_state_##TestSuiteName##_ // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. // // Expands to the name of the variable used to remember the names of // the registered tests in the given test suite. #define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \ gtest_registered_test_names_##TestSuiteName##_ // The variables defined in the type-parameterized test macros are // static as typically these macros are used in a .h file that can be // #included in multiple translation units linked together. #define TYPED_TEST_SUITE_P(SuiteName) \ static ::testing::internal::TypedTestSuitePState \ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define TYPED_TEST_CASE_P \ static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \ TYPED_TEST_SUITE_P #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define TYPED_TEST_P(SuiteName, TestName) \ namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ template \ class TestName : public SuiteName { \ private: \ typedef SuiteName TestFixture; \ typedef gtest_TypeParam_ TypeParam; \ virtual void TestBody(); \ }; \ static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ __FILE__, __LINE__, #SuiteName, #TestName); \ } \ template \ void GTEST_SUITE_NAMESPACE_( \ SuiteName)::TestName::TestBody() #define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \ namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ } \ static const char* const GTEST_REGISTERED_TEST_NAMES_( \ SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ __FILE__, __LINE__, #__VA_ARGS__) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define REGISTER_TYPED_TEST_CASE_P \ static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \ ""); \ REGISTER_TYPED_TEST_SUITE_P #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \ static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \ ::testing::internal::TypeParameterizedTestSuite< \ SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \ ::testing::internal::TypeList::type>:: \ Register(#Prefix, \ ::testing::internal::CodeLocation(__FILE__, __LINE__), \ >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \ GTEST_REGISTERED_TEST_NAMES_(SuiteName), \ ::testing::internal::GenerateNames< \ ::testing::internal::NameGeneratorSelector< \ __VA_ARGS__>::type, \ ::testing::internal::TypeList::type>()) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #define INSTANTIATE_TYPED_TEST_CASE_P \ static_assert( \ ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \ INSTANTIATE_TYPED_TEST_SUITE_P #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ #endif // GTEST_HAS_TYPED_TEST_P #endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest_pred_impl.h0000664000175000017500000003500213553267757020543 00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // This file is AUTOMATICALLY GENERATED on 01/02/2019 by command // 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! // // Implements a family of generic predicate assertion macros. // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ #define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ #include "gtest/gtest.h" namespace testing { // This header implements a family of generic predicate assertion // macros: // // ASSERT_PRED_FORMAT1(pred_format, v1) // ASSERT_PRED_FORMAT2(pred_format, v1, v2) // ... // // where pred_format is a function or functor that takes n (in the // case of ASSERT_PRED_FORMATn) values and their source expression // text, and returns a testing::AssertionResult. See the definition // of ASSERT_EQ in gtest.h for an example. // // If you don't care about formatting, you can use the more // restrictive version: // // ASSERT_PRED1(pred, v1) // ASSERT_PRED2(pred, v1, v2) // ... // // where pred is an n-ary function or functor that returns bool, // and the values v1, v2, ..., must support the << operator for // streaming to std::ostream. // // We also define the EXPECT_* variations. // // For now we only support predicates whose arity is at most 5. // Please email googletestframework@googlegroups.com if you need // support for higher arities. // GTEST_ASSERT_ is the basic statement to which all of the assertions // in this file reduce. Don't use this in your code. #define GTEST_ASSERT_(expression, on_failure) \ GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ if (const ::testing::AssertionResult gtest_ar = (expression)) \ ; \ else \ on_failure(gtest_ar.failure_message()) // Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. template AssertionResult AssertPred1Helper(const char* pred_text, const char* e1, Pred pred, const T1& v1) { if (pred(v1)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << ::testing::PrintToString(v1); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. // Don't use this in your code. #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ GTEST_ASSERT_(pred_format(#v1, v1), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use // this in your code. #define GTEST_PRED1_(pred, v1, on_failure)\ GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ #v1, \ pred, \ v1), on_failure) // Unary predicate assertion macros. #define EXPECT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT1(pred_format, v1) \ GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) #define ASSERT_PRED1(pred, v1) \ GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. template AssertionResult AssertPred2Helper(const char* pred_text, const char* e1, const char* e2, Pred pred, const T1& v1, const T2& v2) { if (pred(v1, v2)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" << e2 << " evaluates to " << ::testing::PrintToString(v2); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. // Don't use this in your code. #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use // this in your code. #define GTEST_PRED2_(pred, v1, v2, on_failure)\ GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ #v1, \ #v2, \ pred, \ v1, \ v2), on_failure) // Binary predicate assertion macros. #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) #define ASSERT_PRED2(pred, v1, v2) \ GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. template AssertionResult AssertPred3Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, Pred pred, const T1& v1, const T2& v2, const T3& v3) { if (pred(v1, v2, v3)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" << e3 << " evaluates to " << ::testing::PrintToString(v3); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. // Don't use this in your code. #define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use // this in your code. #define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ #v1, \ #v2, \ #v3, \ pred, \ v1, \ v2, \ v3), on_failure) // Ternary predicate assertion macros. #define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) #define ASSERT_PRED3(pred, v1, v2, v3) \ GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. template AssertionResult AssertPred4Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4) { if (pred(v1, v2, v3, v4)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" << e4 << " evaluates to " << ::testing::PrintToString(v4); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. // Don't use this in your code. #define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use // this in your code. #define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ pred, \ v1, \ v2, \ v3, \ v4), on_failure) // 4-ary predicate assertion macros. #define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) #define ASSERT_PRED4(pred, v1, v2, v3, v4) \ GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) // Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. template AssertionResult AssertPred5Helper(const char* pred_text, const char* e1, const char* e2, const char* e3, const char* e4, const char* e5, Pred pred, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5) { if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); return AssertionFailure() << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 << ", " << e5 << ") evaluates to false, where" << "\n" << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" << e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n" << e5 << " evaluates to " << ::testing::PrintToString(v5); } // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. // Don't use this in your code. #define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ on_failure) // Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use // this in your code. #define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ #v1, \ #v2, \ #v3, \ #v4, \ #v5, \ pred, \ v1, \ v2, \ v3, \ v4, \ v5), on_failure) // 5-ary predicate assertion macros. #define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) #define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) #define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) } // namespace testing #endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ dvisvgm-2.8.1/tests/gtest/include/gtest/gtest-test-part.h0000664000175000017500000001530513553267757020435 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // GOOGLETEST_CM0001 DO NOT DELETE #ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ #include #include #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) namespace testing { // A copyable object representing the result of a test part (i.e. an // assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). // // Don't inherit from TestPartResult as its destructor is not virtual. class GTEST_API_ TestPartResult { public: // The possible outcomes of a test part (i.e. an assertion or an // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). enum Type { kSuccess, // Succeeded. kNonFatalFailure, // Failed but the test can continue. kFatalFailure, // Failed and the test should be terminated. kSkip // Skipped. }; // C'tor. TestPartResult does NOT have a default constructor. // Always use this constructor (with parameters) to create a // TestPartResult object. TestPartResult(Type a_type, const char* a_file_name, int a_line_number, const char* a_message) : type_(a_type), file_name_(a_file_name == nullptr ? "" : a_file_name), line_number_(a_line_number), summary_(ExtractSummary(a_message)), message_(a_message) {} // Gets the outcome of the test part. Type type() const { return type_; } // Gets the name of the source file where the test part took place, or // NULL if it's unknown. const char* file_name() const { return file_name_.empty() ? nullptr : file_name_.c_str(); } // Gets the line in the source file where the test part took place, // or -1 if it's unknown. int line_number() const { return line_number_; } // Gets the summary of the failure message. const char* summary() const { return summary_.c_str(); } // Gets the message associated with the test part. const char* message() const { return message_.c_str(); } // Returns true if and only if the test part was skipped. bool skipped() const { return type_ == kSkip; } // Returns true if and only if the test part passed. bool passed() const { return type_ == kSuccess; } // Returns true if and only if the test part non-fatally failed. bool nonfatally_failed() const { return type_ == kNonFatalFailure; } // Returns true if and only if the test part fatally failed. bool fatally_failed() const { return type_ == kFatalFailure; } // Returns true if and only if the test part failed. bool failed() const { return fatally_failed() || nonfatally_failed(); } private: Type type_; // Gets the summary of the failure message by omitting the stack // trace in it. static std::string ExtractSummary(const char* message); // The name of the source file where the test part took place, or // "" if the source file is unknown. std::string file_name_; // The line in the source file where the test part took place, or -1 // if the line number is unknown. int line_number_; std::string summary_; // The test failure summary. std::string message_; // The test failure message. }; // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result); // An array of TestPartResult objects. // // Don't inherit from TestPartResultArray as its destructor is not // virtual. class GTEST_API_ TestPartResultArray { public: TestPartResultArray() {} // Appends the given TestPartResult to the array. void Append(const TestPartResult& result); // Returns the TestPartResult at the given index (0-based). const TestPartResult& GetTestPartResult(int index) const; // Returns the number of TestPartResult objects in the array. int size() const; private: std::vector array_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); }; // This interface knows how to report a test part result. class GTEST_API_ TestPartResultReporterInterface { public: virtual ~TestPartResultReporterInterface() {} virtual void ReportTestPartResult(const TestPartResult& result) = 0; }; namespace internal { // This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a // statement generates new fatal failures. To do so it registers itself as the // current test part result reporter. Besides checking if fatal failures were // reported, it only delegates the reporting to the former result reporter. // The original result reporter is restored in the destructor. // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. class GTEST_API_ HasNewFatalFailureHelper : public TestPartResultReporterInterface { public: HasNewFatalFailureHelper(); ~HasNewFatalFailureHelper() override; void ReportTestPartResult(const TestPartResult& result) override; bool has_new_fatal_failure() const { return has_new_fatal_failure_; } private: bool has_new_fatal_failure_; TestPartResultReporterInterface* original_reporter_; GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); }; } // namespace internal } // namespace testing GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 #endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ dvisvgm-2.8.1/tests/gtest/LICENSE0000664000175000017500000000270313510660062013422 00000000000000Copyright 2008, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. dvisvgm-2.8.1/tests/gtest/src/0000775000175000017500000000000013563265650013276 500000000000000dvisvgm-2.8.1/tests/gtest/src/gtest-printers.cc0000664000175000017500000003456713553267757016547 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Google Test - The Google C++ Testing and Mocking Framework // // This file implements a universal value printer that can print a // value of any type T: // // void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); // // It uses the << operator when possible, and prints the bytes in the // object otherwise. A user can override its behavior for a class // type Foo by defining either operator<<(::std::ostream&, const Foo&) // or void PrintTo(const Foo&, ::std::ostream*) in the namespace that // defines Foo. #include "gtest/gtest-printers.h" #include #include #include #include // NOLINT #include #include "gtest/internal/gtest-port.h" #include "src/gtest-internal-inl.h" namespace testing { namespace { using ::std::ostream; // Prints a segment of bytes in the given object. GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start, size_t count, ostream* os) { char text[5] = ""; for (size_t i = 0; i != count; i++) { const size_t j = start + i; if (i != 0) { // Organizes the bytes into groups of 2 for easy parsing by // human. if ((j % 2) == 0) *os << ' '; else *os << '-'; } GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]); *os << text; } } // Prints the bytes in the given value to the given ostream. void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count, ostream* os) { // Tells the user how big the object is. *os << count << "-byte object <"; const size_t kThreshold = 132; const size_t kChunkSize = 64; // If the object size is bigger than kThreshold, we'll have to omit // some details by printing only the first and the last kChunkSize // bytes. if (count < kThreshold) { PrintByteSegmentInObjectTo(obj_bytes, 0, count, os); } else { PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os); *os << " ... "; // Rounds up to 2-byte boundary. const size_t resume_pos = (count - kChunkSize + 1)/2*2; PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os); } *os << ">"; } } // namespace namespace internal2 { // Delegates to PrintBytesInObjectToImpl() to print the bytes in the // given object. The delegation simplifies the implementation, which // uses the << operator and thus is easier done outside of the // ::testing::internal namespace, which contains a << operator that // sometimes conflicts with the one in STL. void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count, ostream* os) { PrintBytesInObjectToImpl(obj_bytes, count, os); } } // namespace internal2 namespace internal { // Depending on the value of a char (or wchar_t), we print it in one // of three formats: // - as is if it's a printable ASCII (e.g. 'a', '2', ' '), // - as a hexadecimal escape sequence (e.g. '\x7F'), or // - as a special escape sequence (e.g. '\r', '\n'). enum CharFormat { kAsIs, kHexEscape, kSpecialEscape }; // Returns true if c is a printable ASCII character. We test the // value of c directly instead of calling isprint(), which is buggy on // Windows Mobile. inline bool IsPrintableAscii(wchar_t c) { return 0x20 <= c && c <= 0x7E; } // Prints a wide or narrow char c as a character literal without the // quotes, escaping it when necessary; returns how c was formatted. // The template argument UnsignedChar is the unsigned version of Char, // which is the type of c. template static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) { wchar_t w_c = static_cast(c); switch (w_c) { case L'\0': *os << "\\0"; break; case L'\'': *os << "\\'"; break; case L'\\': *os << "\\\\"; break; case L'\a': *os << "\\a"; break; case L'\b': *os << "\\b"; break; case L'\f': *os << "\\f"; break; case L'\n': *os << "\\n"; break; case L'\r': *os << "\\r"; break; case L'\t': *os << "\\t"; break; case L'\v': *os << "\\v"; break; default: if (IsPrintableAscii(w_c)) { *os << static_cast(c); return kAsIs; } else { ostream::fmtflags flags = os->flags(); *os << "\\x" << std::hex << std::uppercase << static_cast(static_cast(c)); os->flags(flags); return kHexEscape; } } return kSpecialEscape; } // Prints a wchar_t c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) { switch (c) { case L'\'': *os << "'"; return kAsIs; case L'"': *os << "\\\""; return kSpecialEscape; default: return PrintAsCharLiteralTo(c, os); } } // Prints a char c as if it's part of a string literal, escaping it when // necessary; returns how c was formatted. static CharFormat PrintAsStringLiteralTo(char c, ostream* os) { return PrintAsStringLiteralTo( static_cast(static_cast(c)), os); } // Prints a wide or narrow character c and its code. '\0' is printed // as "'\\0'", other unprintable characters are also properly escaped // using the standard C++ escape sequence. The template argument // UnsignedChar is the unsigned version of Char, which is the type of c. template void PrintCharAndCodeTo(Char c, ostream* os) { // First, print c as a literal in the most readable form we can find. *os << ((sizeof(c) > 1) ? "L'" : "'"); const CharFormat format = PrintAsCharLiteralTo(c, os); *os << "'"; // To aid user debugging, we also print c's code in decimal, unless // it's 0 (in which case c was printed as '\\0', making the code // obvious). if (c == 0) return; *os << " (" << static_cast(c); // For more convenience, we print c's code again in hexadecimal, // unless c was already printed in the form '\x##' or the code is in // [1, 9]. if (format == kHexEscape || (1 <= c && c <= 9)) { // Do nothing. } else { *os << ", 0x" << String::FormatHexInt(static_cast(c)); } *os << ")"; } void PrintTo(unsigned char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); } void PrintTo(signed char c, ::std::ostream* os) { PrintCharAndCodeTo(c, os); } // Prints a wchar_t as a symbol if it is printable or as its internal // code otherwise and also as its code. L'\0' is printed as "L'\\0'". void PrintTo(wchar_t wc, ostream* os) { PrintCharAndCodeTo(wc, os); } // Prints the given array of characters to the ostream. CharType must be either // char or wchar_t. // The array starts at begin, the length is len, it may include '\0' characters // and may not be NUL-terminated. template GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ static CharFormat PrintCharsAsStringTo( const CharType* begin, size_t len, ostream* os) { const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\""; *os << kQuoteBegin; bool is_previous_hex = false; CharFormat print_format = kAsIs; for (size_t index = 0; index < len; ++index) { const CharType cur = begin[index]; if (is_previous_hex && IsXDigit(cur)) { // Previous character is of '\x..' form and this character can be // interpreted as another hexadecimal digit in its number. Break string to // disambiguate. *os << "\" " << kQuoteBegin; } is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape; // Remember if any characters required hex escaping. if (is_previous_hex) { print_format = kHexEscape; } } *os << "\""; return print_format; } // Prints a (const) char/wchar_t array of 'len' elements, starting at address // 'begin'. CharType must be either char or wchar_t. template GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ static void UniversalPrintCharArray( const CharType* begin, size_t len, ostream* os) { // The code // const char kFoo[] = "foo"; // generates an array of 4, not 3, elements, with the last one being '\0'. // // Therefore when printing a char array, we don't print the last element if // it's '\0', such that the output matches the string literal as it's // written in the source code. if (len > 0 && begin[len - 1] == '\0') { PrintCharsAsStringTo(begin, len - 1, os); return; } // If, however, the last element in the array is not '\0', e.g. // const char kFoo[] = { 'f', 'o', 'o' }; // we must print the entire array. We also print a message to indicate // that the array is not NUL-terminated. PrintCharsAsStringTo(begin, len, os); *os << " (no terminating NUL)"; } // Prints a (const) char array of 'len' elements, starting at address 'begin'. void UniversalPrintArray(const char* begin, size_t len, ostream* os) { UniversalPrintCharArray(begin, len, os); } // Prints a (const) wchar_t array of 'len' elements, starting at address // 'begin'. void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) { UniversalPrintCharArray(begin, len, os); } // Prints the given C string to the ostream. void PrintTo(const char* s, ostream* os) { if (s == nullptr) { *os << "NULL"; } else { *os << ImplicitCast_(s) << " pointing to "; PrintCharsAsStringTo(s, strlen(s), os); } } // MSVC compiler can be configured to define whar_t as a typedef // of unsigned short. Defining an overload for const wchar_t* in that case // would cause pointers to unsigned shorts be printed as wide strings, // possibly accessing more memory than intended and causing invalid // memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when // wchar_t is implemented as a native type. #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) // Prints the given wide C string to the ostream. void PrintTo(const wchar_t* s, ostream* os) { if (s == nullptr) { *os << "NULL"; } else { *os << ImplicitCast_(s) << " pointing to "; PrintCharsAsStringTo(s, wcslen(s), os); } } #endif // wchar_t is native namespace { bool ContainsUnprintableControlCodes(const char* str, size_t length) { const unsigned char *s = reinterpret_cast(str); for (size_t i = 0; i < length; i++) { unsigned char ch = *s++; if (std::iscntrl(ch)) { switch (ch) { case '\t': case '\n': case '\r': break; default: return true; } } } return false; } bool IsUTF8TrailByte(unsigned char t) { return 0x80 <= t && t<= 0xbf; } bool IsValidUTF8(const char* str, size_t length) { const unsigned char *s = reinterpret_cast(str); for (size_t i = 0; i < length;) { unsigned char lead = s[i++]; if (lead <= 0x7f) { continue; // single-byte character (ASCII) 0..7F } if (lead < 0xc2) { return false; // trail byte or non-shortest form } else if (lead <= 0xdf && (i + 1) <= length && IsUTF8TrailByte(s[i])) { ++i; // 2-byte character } else if (0xe0 <= lead && lead <= 0xef && (i + 2) <= length && IsUTF8TrailByte(s[i]) && IsUTF8TrailByte(s[i + 1]) && // check for non-shortest form and surrogate (lead != 0xe0 || s[i] >= 0xa0) && (lead != 0xed || s[i] < 0xa0)) { i += 2; // 3-byte character } else if (0xf0 <= lead && lead <= 0xf4 && (i + 3) <= length && IsUTF8TrailByte(s[i]) && IsUTF8TrailByte(s[i + 1]) && IsUTF8TrailByte(s[i + 2]) && // check for non-shortest form (lead != 0xf0 || s[i] >= 0x90) && (lead != 0xf4 || s[i] < 0x90)) { i += 3; // 4-byte character } else { return false; } } return true; } void ConditionalPrintAsText(const char* str, size_t length, ostream* os) { if (!ContainsUnprintableControlCodes(str, length) && IsValidUTF8(str, length)) { *os << "\n As Text: \"" << str << "\""; } } } // anonymous namespace void PrintStringTo(const ::std::string& s, ostream* os) { if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) { if (GTEST_FLAG(print_utf8)) { ConditionalPrintAsText(s.data(), s.size(), os); } } } #if GTEST_HAS_STD_WSTRING void PrintWideStringTo(const ::std::wstring& s, ostream* os) { PrintCharsAsStringTo(s.data(), s.size(), os); } #endif // GTEST_HAS_STD_WSTRING } // namespace internal } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest-test-part.cc0000664000175000017500000000765213553267757016617 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) #include "gtest/gtest-test-part.h" #include "src/gtest-internal-inl.h" namespace testing { using internal::GetUnitTestImpl; // Gets the summary of the failure message by omitting the stack trace // in it. std::string TestPartResult::ExtractSummary(const char* message) { const char* const stack_trace = strstr(message, internal::kStackTraceMarker); return stack_trace == nullptr ? message : std::string(message, stack_trace); } // Prints a TestPartResult object. std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { return os << result.file_name() << ":" << result.line_number() << ": " << (result.type() == TestPartResult::kSuccess ? "Success" : result.type() == TestPartResult::kSkip ? "Skipped" : result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : "Non-fatal failure") << ":\n" << result.message() << std::endl; } // Appends a TestPartResult to the array. void TestPartResultArray::Append(const TestPartResult& result) { array_.push_back(result); } // Returns the TestPartResult at the given index (0-based). const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { if (index < 0 || index >= size()) { printf("\nInvalid index (%d) into TestPartResultArray.\n", index); internal::posix::Abort(); } return array_[static_cast(index)]; } // Returns the number of TestPartResult objects in the array. int TestPartResultArray::size() const { return static_cast(array_.size()); } namespace internal { HasNewFatalFailureHelper::HasNewFatalFailureHelper() : has_new_fatal_failure_(false), original_reporter_(GetUnitTestImpl()-> GetTestPartResultReporterForCurrentThread()) { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); } HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( original_reporter_); } void HasNewFatalFailureHelper::ReportTestPartResult( const TestPartResult& result) { if (result.fatally_failed()) has_new_fatal_failure_ = true; original_reporter_->ReportTestPartResult(result); } } // namespace internal } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest-matchers.cc0000664000175000017500000000717513553267757016502 00000000000000// Copyright 2007, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // The Google C++ Testing and Mocking Framework (Google Test) // // This file implements just enough of the matcher interface to allow // EXPECT_DEATH and friends to accept a matcher argument. #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-port.h" #include "gtest/gtest-matchers.h" #include namespace testing { // Constructs a matcher that matches a const std::string& whose value is // equal to s. Matcher::Matcher(const std::string& s) { *this = Eq(s); } // Constructs a matcher that matches a const std::string& whose value is // equal to s. Matcher::Matcher(const char* s) { *this = Eq(std::string(s)); } // Constructs a matcher that matches a std::string whose value is equal to // s. Matcher::Matcher(const std::string& s) { *this = Eq(s); } // Constructs a matcher that matches a std::string whose value is equal to // s. Matcher::Matcher(const char* s) { *this = Eq(std::string(s)); } #if GTEST_HAS_ABSL // Constructs a matcher that matches a const absl::string_view& whose value is // equal to s. Matcher::Matcher(const std::string& s) { *this = Eq(s); } // Constructs a matcher that matches a const absl::string_view& whose value is // equal to s. Matcher::Matcher(const char* s) { *this = Eq(std::string(s)); } // Constructs a matcher that matches a const absl::string_view& whose value is // equal to s. Matcher::Matcher(absl::string_view s) { *this = Eq(std::string(s)); } // Constructs a matcher that matches a absl::string_view whose value is equal to // s. Matcher::Matcher(const std::string& s) { *this = Eq(s); } // Constructs a matcher that matches a absl::string_view whose value is equal to // s. Matcher::Matcher(const char* s) { *this = Eq(std::string(s)); } // Constructs a matcher that matches a absl::string_view whose value is equal to // s. Matcher::Matcher(absl::string_view s) { *this = Eq(std::string(s)); } #endif // GTEST_HAS_ABSL } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest.cc0000664000175000017500000067233113553267757014700 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // The Google C++ Testing and Mocking Framework (Google Test) #include "gtest/gtest.h" #include "gtest/internal/custom/gtest.h" #include "gtest/gtest-spi.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include // NOLINT #include #include #if GTEST_OS_LINUX # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT # include // NOLINT # include // NOLINT // Declares vsnprintf(). This header is not available on Windows. # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT # include #elif GTEST_OS_ZOS # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT // On z/OS we additionally need strings.h for strcasecmp. # include // NOLINT #elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. # include // NOLINT # undef min #elif GTEST_OS_WINDOWS // We are on Windows proper. # include // NOLINT # undef min # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT # if GTEST_OS_WINDOWS_MINGW // MinGW has gettimeofday() but not _ftime64(). # define GTEST_HAS_GETTIMEOFDAY_ 1 # include // NOLINT # endif // GTEST_OS_WINDOWS_MINGW #else // Assume other platforms have gettimeofday(). # define GTEST_HAS_GETTIMEOFDAY_ 1 // cpplint thinks that the header is already included, so we want to // silence it. # include // NOLINT # include // NOLINT #endif // GTEST_OS_LINUX #if GTEST_HAS_EXCEPTIONS # include #endif #if GTEST_CAN_STREAM_RESULTS_ # include // NOLINT # include // NOLINT # include // NOLINT # include // NOLINT #endif #include "src/gtest-internal-inl.h" #if GTEST_OS_WINDOWS # define vsnprintf _vsnprintf #endif // GTEST_OS_WINDOWS #if GTEST_OS_MAC #ifndef GTEST_OS_IOS #include #endif #endif #if GTEST_HAS_ABSL #include "absl/debugging/failure_signal_handler.h" #include "absl/debugging/stacktrace.h" #include "absl/debugging/symbolize.h" #include "absl/strings/str_cat.h" #endif // GTEST_HAS_ABSL namespace testing { using internal::CountIf; using internal::ForEach; using internal::GetElementOr; using internal::Shuffle; // Constants. // A test whose test suite name or test name matches this filter is // disabled and not run. static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; // A test suite whose name matches this filter is considered a death // test suite and will be run before test suites whose name doesn't // match this filter. static const char kDeathTestSuiteFilter[] = "*DeathTest:*DeathTest/*"; // A test filter that matches everything. static const char kUniversalFilter[] = "*"; // The default output format. static const char kDefaultOutputFormat[] = "xml"; // The default output file. static const char kDefaultOutputFile[] = "test_detail"; // The environment variable name for the test shard index. static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; // The environment variable name for the total number of test shards. static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; // The environment variable name for the test shard status file. static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; namespace internal { // The text used in failure messages to indicate the start of the // stack trace. const char kStackTraceMarker[] = "\nStack trace:\n"; // g_help_flag is true if and only if the --help flag or an equivalent form // is specified on the command line. bool g_help_flag = false; // Utilty function to Open File for Writing static FILE* OpenFileForWriting(const std::string& output_file) { FILE* fileout = nullptr; FilePath output_file_path(output_file); FilePath output_dir(output_file_path.RemoveFileName()); if (output_dir.CreateDirectoriesRecursively()) { fileout = posix::FOpen(output_file.c_str(), "w"); } if (fileout == nullptr) { GTEST_LOG_(FATAL) << "Unable to open file \"" << output_file << "\""; } return fileout; } } // namespace internal // Bazel passes in the argument to '--test_filter' via the TESTBRIDGE_TEST_ONLY // environment variable. static const char* GetDefaultFilter() { const char* const testbridge_test_only = internal::posix::GetEnv("TESTBRIDGE_TEST_ONLY"); if (testbridge_test_only != nullptr) { return testbridge_test_only; } return kUniversalFilter; } GTEST_DEFINE_bool_( also_run_disabled_tests, internal::BoolFromGTestEnv("also_run_disabled_tests", false), "Run disabled tests too, in addition to the tests normally being run."); GTEST_DEFINE_bool_( break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false), "True if and only if a failed assertion should be a debugger " "break-point."); GTEST_DEFINE_bool_(catch_exceptions, internal::BoolFromGTestEnv("catch_exceptions", true), "True if and only if " GTEST_NAME_ " should catch exceptions and treat them as test failures."); GTEST_DEFINE_string_( color, internal::StringFromGTestEnv("color", "auto"), "Whether to use colors in the output. Valid values: yes, no, " "and auto. 'auto' means to use colors if the output is " "being sent to a terminal and the TERM environment variable " "is set to a terminal type that supports colors."); GTEST_DEFINE_string_( filter, internal::StringFromGTestEnv("filter", GetDefaultFilter()), "A colon-separated list of glob (not regex) patterns " "for filtering the tests to run, optionally followed by a " "'-' and a : separated list of negative patterns (tests to " "exclude). A test is run if it matches one of the positive " "patterns and does not match any of the negative patterns."); GTEST_DEFINE_bool_( install_failure_signal_handler, internal::BoolFromGTestEnv("install_failure_signal_handler", false), "If true and supported on the current platform, " GTEST_NAME_ " should " "install a signal handler that dumps debugging information when fatal " "signals are raised."); GTEST_DEFINE_bool_(list_tests, false, "List all tests without running them."); // The net priority order after flag processing is thus: // --gtest_output command line flag // GTEST_OUTPUT environment variable // XML_OUTPUT_FILE environment variable // '' GTEST_DEFINE_string_( output, internal::StringFromGTestEnv("output", internal::OutputFlagAlsoCheckEnvVar().c_str()), "A format (defaults to \"xml\" but can be specified to be \"json\"), " "optionally followed by a colon and an output file name or directory. " "A directory is indicated by a trailing pathname separator. " "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " "If a directory is specified, output files will be created " "within that directory, with file-names based on the test " "executable's name and, if necessary, made unique by adding " "digits."); GTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv("print_time", true), "True if and only if " GTEST_NAME_ " should display elapsed time in text output."); GTEST_DEFINE_bool_(print_utf8, internal::BoolFromGTestEnv("print_utf8", true), "True if and only if " GTEST_NAME_ " prints UTF8 characters as text."); GTEST_DEFINE_int32_( random_seed, internal::Int32FromGTestEnv("random_seed", 0), "Random number seed to use when shuffling test orders. Must be in range " "[1, 99999], or 0 to use a seed based on the current time."); GTEST_DEFINE_int32_( repeat, internal::Int32FromGTestEnv("repeat", 1), "How many times to repeat each test. Specify a negative number " "for repeating forever. Useful for shaking out flaky tests."); GTEST_DEFINE_bool_(show_internal_stack_frames, false, "True if and only if " GTEST_NAME_ " should include internal stack frames when " "printing test failure stack traces."); GTEST_DEFINE_bool_(shuffle, internal::BoolFromGTestEnv("shuffle", false), "True if and only if " GTEST_NAME_ " should randomize tests' order on every run."); GTEST_DEFINE_int32_( stack_trace_depth, internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), "The maximum number of stack frames to print when an " "assertion fails. The valid range is 0 through 100, inclusive."); GTEST_DEFINE_string_( stream_result_to, internal::StringFromGTestEnv("stream_result_to", ""), "This flag specifies the host name and the port number on which to stream " "test results. Example: \"localhost:555\". The flag is effective only on " "Linux."); GTEST_DEFINE_bool_( throw_on_failure, internal::BoolFromGTestEnv("throw_on_failure", false), "When this flag is specified, a failed assertion will throw an exception " "if exceptions are enabled or exit the program with a non-zero code " "otherwise. For use with an external test framework."); #if GTEST_USE_OWN_FLAGFILE_FLAG_ GTEST_DEFINE_string_( flagfile, internal::StringFromGTestEnv("flagfile", ""), "This flag specifies the flagfile to read command-line flags from."); #endif // GTEST_USE_OWN_FLAGFILE_FLAG_ namespace internal { // Generates a random number from [0, range), using a Linear // Congruential Generator (LCG). Crashes if 'range' is 0 or greater // than kMaxRange. UInt32 Random::Generate(UInt32 range) { // These constants are the same as are used in glibc's rand(3). // Use wider types than necessary to prevent unsigned overflow diagnostics. state_ = static_cast(1103515245ULL*state_ + 12345U) % kMaxRange; GTEST_CHECK_(range > 0) << "Cannot generate a number in the range [0, 0)."; GTEST_CHECK_(range <= kMaxRange) << "Generation of a number in [0, " << range << ") was requested, " << "but this can only generate numbers in [0, " << kMaxRange << ")."; // Converting via modulus introduces a bit of downward bias, but // it's simple, and a linear congruential generator isn't too good // to begin with. return state_ % range; } // GTestIsInitialized() returns true if and only if the user has initialized // Google Test. Useful for catching the user mistake of not initializing // Google Test before calling RUN_ALL_TESTS(). static bool GTestIsInitialized() { return GetArgvs().size() > 0; } // Iterates over a vector of TestSuites, keeping a running sum of the // results of calling a given int-returning method on each. // Returns the sum. static int SumOverTestSuiteList(const std::vector& case_list, int (TestSuite::*method)() const) { int sum = 0; for (size_t i = 0; i < case_list.size(); i++) { sum += (case_list[i]->*method)(); } return sum; } // Returns true if and only if the test suite passed. static bool TestSuitePassed(const TestSuite* test_suite) { return test_suite->should_run() && test_suite->Passed(); } // Returns true if and only if the test suite failed. static bool TestSuiteFailed(const TestSuite* test_suite) { return test_suite->should_run() && test_suite->Failed(); } // Returns true if and only if test_suite contains at least one test that // should run. static bool ShouldRunTestSuite(const TestSuite* test_suite) { return test_suite->should_run(); } // AssertHelper constructor. AssertHelper::AssertHelper(TestPartResult::Type type, const char* file, int line, const char* message) : data_(new AssertHelperData(type, file, line, message)) { } AssertHelper::~AssertHelper() { delete data_; } // Message assignment, for assertion streaming support. void AssertHelper::operator=(const Message& message) const { UnitTest::GetInstance()-> AddTestPartResult(data_->type, data_->file, data_->line, AppendUserMessage(data_->message, message), UnitTest::GetInstance()->impl() ->CurrentOsStackTraceExceptTop(1) // Skips the stack frame for this function itself. ); // NOLINT } // A copy of all command line arguments. Set by InitGoogleTest(). static ::std::vector g_argvs; ::std::vector GetArgvs() { #if defined(GTEST_CUSTOM_GET_ARGVS_) // GTEST_CUSTOM_GET_ARGVS_() may return a container of std::string or // ::string. This code converts it to the appropriate type. const auto& custom = GTEST_CUSTOM_GET_ARGVS_(); return ::std::vector(custom.begin(), custom.end()); #else // defined(GTEST_CUSTOM_GET_ARGVS_) return g_argvs; #endif // defined(GTEST_CUSTOM_GET_ARGVS_) } // Returns the current application's name, removing directory path if that // is present. FilePath GetCurrentExecutableName() { FilePath result; #if GTEST_OS_WINDOWS || GTEST_OS_OS2 result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe")); #else result.Set(FilePath(GetArgvs()[0])); #endif // GTEST_OS_WINDOWS return result.RemoveDirectoryName(); } // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. std::string UnitTestOptions::GetOutputFormat() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); const char* const colon = strchr(gtest_output_flag, ':'); return (colon == nullptr) ? std::string(gtest_output_flag) : std::string(gtest_output_flag, static_cast(colon - gtest_output_flag)); } // Returns the name of the requested output file, or the default if none // was explicitly specified. std::string UnitTestOptions::GetAbsolutePathToOutputFile() { const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); std::string format = GetOutputFormat(); if (format.empty()) format = std::string(kDefaultOutputFormat); const char* const colon = strchr(gtest_output_flag, ':'); if (colon == nullptr) return internal::FilePath::MakeFileName( internal::FilePath( UnitTest::GetInstance()->original_working_dir()), internal::FilePath(kDefaultOutputFile), 0, format.c_str()).string(); internal::FilePath output_name(colon + 1); if (!output_name.IsAbsolutePath()) output_name = internal::FilePath::ConcatPaths( internal::FilePath(UnitTest::GetInstance()->original_working_dir()), internal::FilePath(colon + 1)); if (!output_name.IsDirectory()) return output_name.string(); internal::FilePath result(internal::FilePath::GenerateUniqueFileName( output_name, internal::GetCurrentExecutableName(), GetOutputFormat().c_str())); return result.string(); } // Returns true if and only if the wildcard pattern matches the string. // The first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. bool UnitTestOptions::PatternMatchesString(const char *pattern, const char *str) { switch (*pattern) { case '\0': case ':': // Either ':' or '\0' marks the end of the pattern. return *str == '\0'; case '?': // Matches any single character. return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); case '*': // Matches any string (possibly empty) of characters. return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || PatternMatchesString(pattern + 1, str); default: // Non-special character. Matches itself. return *pattern == *str && PatternMatchesString(pattern + 1, str + 1); } } bool UnitTestOptions::MatchesFilter( const std::string& name, const char* filter) { const char *cur_pattern = filter; for (;;) { if (PatternMatchesString(cur_pattern, name.c_str())) { return true; } // Finds the next pattern in the filter. cur_pattern = strchr(cur_pattern, ':'); // Returns if no more pattern can be found. if (cur_pattern == nullptr) { return false; } // Skips the pattern separater (the ':' character). cur_pattern++; } } // Returns true if and only if the user-specified filter matches the test // suite name and the test name. bool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name, const std::string& test_name) { const std::string& full_name = test_suite_name + "." + test_name.c_str(); // Split --gtest_filter at '-', if there is one, to separate into // positive filter and negative filter portions const char* const p = GTEST_FLAG(filter).c_str(); const char* const dash = strchr(p, '-'); std::string positive; std::string negative; if (dash == nullptr) { positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter negative = ""; } else { positive = std::string(p, dash); // Everything up to the dash negative = std::string(dash + 1); // Everything after the dash if (positive.empty()) { // Treat '-test1' as the same as '*-test1' positive = kUniversalFilter; } } // A filter is a colon-separated list of patterns. It matches a // test if any pattern in it matches the test. return (MatchesFilter(full_name, positive.c_str()) && !MatchesFilter(full_name, negative.c_str())); } #if GTEST_HAS_SEH // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { // Google Test should handle a SEH exception if: // 1. the user wants it to, AND // 2. this is not a breakpoint exception, AND // 3. this is not a C++ exception (VC++ implements them via SEH, // apparently). // // SEH exception code for C++ exceptions. // (see http://support.microsoft.com/kb/185294 for more information). const DWORD kCxxExceptionCode = 0xe06d7363; bool should_handle = true; if (!GTEST_FLAG(catch_exceptions)) should_handle = false; else if (exception_code == EXCEPTION_BREAKPOINT) should_handle = false; else if (exception_code == kCxxExceptionCode) should_handle = false; return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; } #endif // GTEST_HAS_SEH } // namespace internal // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. Intercepts only failures from the current thread. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( TestPartResultArray* result) : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), result_(result) { Init(); } // The c'tor sets this object as the test part result reporter used by // Google Test. The 'result' parameter specifies where to report the // results. ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( InterceptMode intercept_mode, TestPartResultArray* result) : intercept_mode_(intercept_mode), result_(result) { Init(); } void ScopedFakeTestPartResultReporter::Init() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { old_reporter_ = impl->GetGlobalTestPartResultReporter(); impl->SetGlobalTestPartResultReporter(this); } else { old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); impl->SetTestPartResultReporterForCurrentThread(this); } } // The d'tor restores the test part result reporter used by Google Test // before. ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); if (intercept_mode_ == INTERCEPT_ALL_THREADS) { impl->SetGlobalTestPartResultReporter(old_reporter_); } else { impl->SetTestPartResultReporterForCurrentThread(old_reporter_); } } // Increments the test part result count and remembers the result. // This method is from the TestPartResultReporterInterface interface. void ScopedFakeTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { result_->Append(result); } namespace internal { // Returns the type ID of ::testing::Test. We should always call this // instead of GetTypeId< ::testing::Test>() to get the type ID of // testing::Test. This is to work around a suspected linker bug when // using Google Test as a framework on Mac OS X. The bug causes // GetTypeId< ::testing::Test>() to return different values depending // on whether the call is from the Google Test framework itself or // from user test code. GetTestTypeId() is guaranteed to always // return the same value, as it always calls GetTypeId<>() from the // gtest.cc, which is within the Google Test framework. TypeId GetTestTypeId() { return GetTypeId(); } // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); // This predicate-formatter checks that 'results' contains a test part // failure of the given type and that the failure message contains the // given substring. static AssertionResult HasOneFailure(const char* /* results_expr */, const char* /* type_expr */, const char* /* substr_expr */, const TestPartResultArray& results, TestPartResult::Type type, const std::string& substr) { const std::string expected(type == TestPartResult::kFatalFailure ? "1 fatal failure" : "1 non-fatal failure"); Message msg; if (results.size() != 1) { msg << "Expected: " << expected << "\n" << " Actual: " << results.size() << " failures"; for (int i = 0; i < results.size(); i++) { msg << "\n" << results.GetTestPartResult(i); } return AssertionFailure() << msg; } const TestPartResult& r = results.GetTestPartResult(0); if (r.type() != type) { return AssertionFailure() << "Expected: " << expected << "\n" << " Actual:\n" << r; } if (strstr(r.message(), substr.c_str()) == nullptr) { return AssertionFailure() << "Expected: " << expected << " containing \"" << substr << "\"\n" << " Actual:\n" << r; } return AssertionSuccess(); } // The constructor of SingleFailureChecker remembers where to look up // test part results, what type of failure we expect, and what // substring the failure message should contain. SingleFailureChecker::SingleFailureChecker(const TestPartResultArray* results, TestPartResult::Type type, const std::string& substr) : results_(results), type_(type), substr_(substr) {} // The destructor of SingleFailureChecker verifies that the given // TestPartResultArray contains exactly one failure that has the given // type and contains the given substring. If that's not the case, a // non-fatal failure will be generated. SingleFailureChecker::~SingleFailureChecker() { EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_); } DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultGlobalTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->current_test_result()->AddTestPartResult(result); unit_test_->listeners()->repeater()->OnTestPartResult(result); } DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( UnitTestImpl* unit_test) : unit_test_(unit_test) {} void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( const TestPartResult& result) { unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); } // Returns the global test part result reporter. TestPartResultReporterInterface* UnitTestImpl::GetGlobalTestPartResultReporter() { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); return global_test_part_result_repoter_; } // Sets the global test part result reporter. void UnitTestImpl::SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter) { internal::MutexLock lock(&global_test_part_result_reporter_mutex_); global_test_part_result_repoter_ = reporter; } // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* UnitTestImpl::GetTestPartResultReporterForCurrentThread() { return per_thread_test_part_result_reporter_.get(); } // Sets the test part result reporter for the current thread. void UnitTestImpl::SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter) { per_thread_test_part_result_reporter_.set(reporter); } // Gets the number of successful test suites. int UnitTestImpl::successful_test_suite_count() const { return CountIf(test_suites_, TestSuitePassed); } // Gets the number of failed test suites. int UnitTestImpl::failed_test_suite_count() const { return CountIf(test_suites_, TestSuiteFailed); } // Gets the number of all test suites. int UnitTestImpl::total_test_suite_count() const { return static_cast(test_suites_.size()); } // Gets the number of all test suites that contain at least one test // that should run. int UnitTestImpl::test_suite_to_run_count() const { return CountIf(test_suites_, ShouldRunTestSuite); } // Gets the number of successful tests. int UnitTestImpl::successful_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::successful_test_count); } // Gets the number of skipped tests. int UnitTestImpl::skipped_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::skipped_test_count); } // Gets the number of failed tests. int UnitTestImpl::failed_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::failed_test_count); } // Gets the number of disabled tests that will be reported in the XML report. int UnitTestImpl::reportable_disabled_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_disabled_test_count); } // Gets the number of disabled tests. int UnitTestImpl::disabled_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::disabled_test_count); } // Gets the number of tests to be printed in the XML report. int UnitTestImpl::reportable_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_test_count); } // Gets the number of all tests. int UnitTestImpl::total_test_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::total_test_count); } // Gets the number of tests that should run. int UnitTestImpl::test_to_run_count() const { return SumOverTestSuiteList(test_suites_, &TestSuite::test_to_run_count); } // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { return os_stack_trace_getter()->CurrentStackTrace( static_cast(GTEST_FLAG(stack_trace_depth)), skip_count + 1 // Skips the user-specified number of frames plus this function // itself. ); // NOLINT } // Returns the current time in milliseconds. TimeInMillis GetTimeInMillis() { #if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) // Difference between 1970-01-01 and 1601-01-01 in milliseconds. // http://analogous.blogspot.com/2005/04/epoch.html const TimeInMillis kJavaEpochToWinFileTimeDelta = static_cast(116444736UL) * 100000UL; const DWORD kTenthMicrosInMilliSecond = 10000; SYSTEMTIME now_systime; FILETIME now_filetime; ULARGE_INTEGER now_int64; GetSystemTime(&now_systime); if (SystemTimeToFileTime(&now_systime, &now_filetime)) { now_int64.LowPart = now_filetime.dwLowDateTime; now_int64.HighPart = now_filetime.dwHighDateTime; now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - kJavaEpochToWinFileTimeDelta; return now_int64.QuadPart; } return 0; #elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ __timeb64 now; // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 // (deprecated function) there. GTEST_DISABLE_MSC_DEPRECATED_PUSH_() _ftime64(&now); GTEST_DISABLE_MSC_DEPRECATED_POP_() return static_cast(now.time) * 1000 + now.millitm; #elif GTEST_HAS_GETTIMEOFDAY_ struct timeval now; gettimeofday(&now, nullptr); return static_cast(now.tv_sec) * 1000 + now.tv_usec / 1000; #else # error "Don't know how to get the current time on your system." #endif } // Utilities // class String. #if GTEST_OS_WINDOWS_MOBILE // Creates a UTF-16 wide string from the given ANSI string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the wide string, or NULL if the // input is NULL. LPCWSTR String::AnsiToUtf16(const char* ansi) { if (!ansi) return nullptr; const int length = strlen(ansi); const int unicode_length = MultiByteToWideChar(CP_ACP, 0, ansi, length, nullptr, 0); WCHAR* unicode = new WCHAR[unicode_length + 1]; MultiByteToWideChar(CP_ACP, 0, ansi, length, unicode, unicode_length); unicode[unicode_length] = 0; return unicode; } // Creates an ANSI string from the given wide string, allocating // memory using new. The caller is responsible for deleting the return // value using delete[]. Returns the ANSI string, or NULL if the // input is NULL. const char* String::Utf16ToAnsi(LPCWSTR utf16_str) { if (!utf16_str) return nullptr; const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, nullptr, 0, nullptr, nullptr); char* ansi = new char[ansi_length + 1]; WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, nullptr, nullptr); ansi[ansi_length] = 0; return ansi; } #endif // GTEST_OS_WINDOWS_MOBILE // Compares two C strings. Returns true if and only if they have the same // content. // // Unlike strcmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::CStringEquals(const char * lhs, const char * rhs) { if (lhs == nullptr) return rhs == nullptr; if (rhs == nullptr) return false; return strcmp(lhs, rhs) == 0; } #if GTEST_HAS_STD_WSTRING // Converts an array of wide chars to a narrow string using the UTF-8 // encoding, and streams the result to the given Message object. static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, Message* msg) { for (size_t i = 0; i != length; ) { // NOLINT if (wstr[i] != L'\0') { *msg << WideStringToUtf8(wstr + i, static_cast(length - i)); while (i != length && wstr[i] != L'\0') i++; } else { *msg << '\0'; i++; } } } #endif // GTEST_HAS_STD_WSTRING void SplitString(const ::std::string& str, char delimiter, ::std::vector< ::std::string>* dest) { ::std::vector< ::std::string> parsed; ::std::string::size_type pos = 0; while (::testing::internal::AlwaysTrue()) { const ::std::string::size_type colon = str.find(delimiter, pos); if (colon == ::std::string::npos) { parsed.push_back(str.substr(pos)); break; } else { parsed.push_back(str.substr(pos, colon - pos)); pos = colon + 1; } } dest->swap(parsed); } } // namespace internal // Constructs an empty Message. // We allocate the stringstream separately because otherwise each use of // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's // stack frame leading to huge stack frames in some cases; gcc does not reuse // the stack space. Message::Message() : ss_(new ::std::stringstream) { // By default, we want there to be enough precision when printing // a double to a Message. *ss_ << std::setprecision(std::numeric_limits::digits10 + 2); } // These two overloads allow streaming a wide C string to a Message // using the UTF-8 encoding. Message& Message::operator <<(const wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } Message& Message::operator <<(wchar_t* wide_c_str) { return *this << internal::String::ShowWideCString(wide_c_str); } #if GTEST_HAS_STD_WSTRING // Converts the given wide string to a narrow string using the UTF-8 // encoding, and streams the result to this Message object. Message& Message::operator <<(const ::std::wstring& wstr) { internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); return *this; } #endif // GTEST_HAS_STD_WSTRING // Gets the text streamed to this object so far as an std::string. // Each '\0' character in the buffer is replaced with "\\0". std::string Message::GetString() const { return internal::StringStreamToString(ss_.get()); } // AssertionResult constructors. // Used in EXPECT_TRUE/FALSE(assertion_result). AssertionResult::AssertionResult(const AssertionResult& other) : success_(other.success_), message_(other.message_.get() != nullptr ? new ::std::string(*other.message_) : static_cast< ::std::string*>(nullptr)) {} // Swaps two AssertionResults. void AssertionResult::swap(AssertionResult& other) { using std::swap; swap(success_, other.success_); swap(message_, other.message_); } // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. AssertionResult AssertionResult::operator!() const { AssertionResult negation(!success_); if (message_.get() != nullptr) negation << *message_; return negation; } // Makes a successful assertion result. AssertionResult AssertionSuccess() { return AssertionResult(true); } // Makes a failed assertion result. AssertionResult AssertionFailure() { return AssertionResult(false); } // Makes a failed assertion result with the given failure message. // Deprecated; use AssertionFailure() << message. AssertionResult AssertionFailure(const Message& message) { return AssertionFailure() << message; } namespace internal { namespace edit_distance { std::vector CalculateOptimalEdits(const std::vector& left, const std::vector& right) { std::vector > costs( left.size() + 1, std::vector(right.size() + 1)); std::vector > best_move( left.size() + 1, std::vector(right.size() + 1)); // Populate for empty right. for (size_t l_i = 0; l_i < costs.size(); ++l_i) { costs[l_i][0] = static_cast(l_i); best_move[l_i][0] = kRemove; } // Populate for empty left. for (size_t r_i = 1; r_i < costs[0].size(); ++r_i) { costs[0][r_i] = static_cast(r_i); best_move[0][r_i] = kAdd; } for (size_t l_i = 0; l_i < left.size(); ++l_i) { for (size_t r_i = 0; r_i < right.size(); ++r_i) { if (left[l_i] == right[r_i]) { // Found a match. Consume it. costs[l_i + 1][r_i + 1] = costs[l_i][r_i]; best_move[l_i + 1][r_i + 1] = kMatch; continue; } const double add = costs[l_i + 1][r_i]; const double remove = costs[l_i][r_i + 1]; const double replace = costs[l_i][r_i]; if (add < remove && add < replace) { costs[l_i + 1][r_i + 1] = add + 1; best_move[l_i + 1][r_i + 1] = kAdd; } else if (remove < add && remove < replace) { costs[l_i + 1][r_i + 1] = remove + 1; best_move[l_i + 1][r_i + 1] = kRemove; } else { // We make replace a little more expensive than add/remove to lower // their priority. costs[l_i + 1][r_i + 1] = replace + 1.00001; best_move[l_i + 1][r_i + 1] = kReplace; } } } // Reconstruct the best path. We do it in reverse order. std::vector best_path; for (size_t l_i = left.size(), r_i = right.size(); l_i > 0 || r_i > 0;) { EditType move = best_move[l_i][r_i]; best_path.push_back(move); l_i -= move != kAdd; r_i -= move != kRemove; } std::reverse(best_path.begin(), best_path.end()); return best_path; } namespace { // Helper class to convert string into ids with deduplication. class InternalStrings { public: size_t GetId(const std::string& str) { IdMap::iterator it = ids_.find(str); if (it != ids_.end()) return it->second; size_t id = ids_.size(); return ids_[str] = id; } private: typedef std::map IdMap; IdMap ids_; }; } // namespace std::vector CalculateOptimalEdits( const std::vector& left, const std::vector& right) { std::vector left_ids, right_ids; { InternalStrings intern_table; for (size_t i = 0; i < left.size(); ++i) { left_ids.push_back(intern_table.GetId(left[i])); } for (size_t i = 0; i < right.size(); ++i) { right_ids.push_back(intern_table.GetId(right[i])); } } return CalculateOptimalEdits(left_ids, right_ids); } namespace { // Helper class that holds the state for one hunk and prints it out to the // stream. // It reorders adds/removes when possible to group all removes before all // adds. It also adds the hunk header before printint into the stream. class Hunk { public: Hunk(size_t left_start, size_t right_start) : left_start_(left_start), right_start_(right_start), adds_(), removes_(), common_() {} void PushLine(char edit, const char* line) { switch (edit) { case ' ': ++common_; FlushEdits(); hunk_.push_back(std::make_pair(' ', line)); break; case '-': ++removes_; hunk_removes_.push_back(std::make_pair('-', line)); break; case '+': ++adds_; hunk_adds_.push_back(std::make_pair('+', line)); break; } } void PrintTo(std::ostream* os) { PrintHeader(os); FlushEdits(); for (std::list >::const_iterator it = hunk_.begin(); it != hunk_.end(); ++it) { *os << it->first << it->second << "\n"; } } bool has_edits() const { return adds_ || removes_; } private: void FlushEdits() { hunk_.splice(hunk_.end(), hunk_removes_); hunk_.splice(hunk_.end(), hunk_adds_); } // Print a unified diff header for one hunk. // The format is // "@@ -, +, @@" // where the left/right parts are omitted if unnecessary. void PrintHeader(std::ostream* ss) const { *ss << "@@ "; if (removes_) { *ss << "-" << left_start_ << "," << (removes_ + common_); } if (removes_ && adds_) { *ss << " "; } if (adds_) { *ss << "+" << right_start_ << "," << (adds_ + common_); } *ss << " @@\n"; } size_t left_start_, right_start_; size_t adds_, removes_, common_; std::list > hunk_, hunk_adds_, hunk_removes_; }; } // namespace // Create a list of diff hunks in Unified diff format. // Each hunk has a header generated by PrintHeader above plus a body with // lines prefixed with ' ' for no change, '-' for deletion and '+' for // addition. // 'context' represents the desired unchanged prefix/suffix around the diff. // If two hunks are close enough that their contexts overlap, then they are // joined into one hunk. std::string CreateUnifiedDiff(const std::vector& left, const std::vector& right, size_t context) { const std::vector edits = CalculateOptimalEdits(left, right); size_t l_i = 0, r_i = 0, edit_i = 0; std::stringstream ss; while (edit_i < edits.size()) { // Find first edit. while (edit_i < edits.size() && edits[edit_i] == kMatch) { ++l_i; ++r_i; ++edit_i; } // Find the first line to include in the hunk. const size_t prefix_context = std::min(l_i, context); Hunk hunk(l_i - prefix_context + 1, r_i - prefix_context + 1); for (size_t i = prefix_context; i > 0; --i) { hunk.PushLine(' ', left[l_i - i].c_str()); } // Iterate the edits until we found enough suffix for the hunk or the input // is over. size_t n_suffix = 0; for (; edit_i < edits.size(); ++edit_i) { if (n_suffix >= context) { // Continue only if the next hunk is very close. auto it = edits.begin() + static_cast(edit_i); while (it != edits.end() && *it == kMatch) ++it; if (it == edits.end() || static_cast(it - edits.begin()) - edit_i >= context) { // There is no next edit or it is too far away. break; } } EditType edit = edits[edit_i]; // Reset count when a non match is found. n_suffix = edit == kMatch ? n_suffix + 1 : 0; if (edit == kMatch || edit == kRemove || edit == kReplace) { hunk.PushLine(edit == kMatch ? ' ' : '-', left[l_i].c_str()); } if (edit == kAdd || edit == kReplace) { hunk.PushLine('+', right[r_i].c_str()); } // Advance indices, depending on edit type. l_i += edit != kAdd; r_i += edit != kRemove; } if (!hunk.has_edits()) { // We are done. We don't want this hunk. break; } hunk.PrintTo(&ss); } return ss.str(); } } // namespace edit_distance namespace { // The string representation of the values received in EqFailure() are already // escaped. Split them on escaped '\n' boundaries. Leave all other escaped // characters the same. std::vector SplitEscapedString(const std::string& str) { std::vector lines; size_t start = 0, end = str.size(); if (end > 2 && str[0] == '"' && str[end - 1] == '"') { ++start; --end; } bool escaped = false; for (size_t i = start; i + 1 < end; ++i) { if (escaped) { escaped = false; if (str[i] == 'n') { lines.push_back(str.substr(start, i - start - 1)); start = i + 1; } } else { escaped = str[i] == '\\'; } } lines.push_back(str.substr(start, end - start)); return lines; } } // namespace // Constructs and returns the message for an equality assertion // (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. // // The first four parameters are the expressions used in the assertion // and their values, as strings. For example, for ASSERT_EQ(foo, bar) // where foo is 5 and bar is 6, we have: // // lhs_expression: "foo" // rhs_expression: "bar" // lhs_value: "5" // rhs_value: "6" // // The ignoring_case parameter is true if and only if the assertion is a // *_STRCASEEQ*. When it's true, the string "Ignoring case" will // be inserted into the message. AssertionResult EqFailure(const char* lhs_expression, const char* rhs_expression, const std::string& lhs_value, const std::string& rhs_value, bool ignoring_case) { Message msg; msg << "Expected equality of these values:"; msg << "\n " << lhs_expression; if (lhs_value != lhs_expression) { msg << "\n Which is: " << lhs_value; } msg << "\n " << rhs_expression; if (rhs_value != rhs_expression) { msg << "\n Which is: " << rhs_value; } if (ignoring_case) { msg << "\nIgnoring case"; } if (!lhs_value.empty() && !rhs_value.empty()) { const std::vector lhs_lines = SplitEscapedString(lhs_value); const std::vector rhs_lines = SplitEscapedString(rhs_value); if (lhs_lines.size() > 1 || rhs_lines.size() > 1) { msg << "\nWith diff:\n" << edit_distance::CreateUnifiedDiff(lhs_lines, rhs_lines); } } return AssertionFailure() << msg; } // Constructs a failure message for Boolean assertions such as EXPECT_TRUE. std::string GetBoolAssertionFailureMessage( const AssertionResult& assertion_result, const char* expression_text, const char* actual_predicate_value, const char* expected_predicate_value) { const char* actual_message = assertion_result.message(); Message msg; msg << "Value of: " << expression_text << "\n Actual: " << actual_predicate_value; if (actual_message[0] != '\0') msg << " (" << actual_message << ")"; msg << "\nExpected: " << expected_predicate_value; return msg.GetString(); } // Helper function for implementing ASSERT_NEAR. AssertionResult DoubleNearPredFormat(const char* expr1, const char* expr2, const char* abs_error_expr, double val1, double val2, double abs_error) { const double diff = fabs(val1 - val2); if (diff <= abs_error) return AssertionSuccess(); return AssertionFailure() << "The difference between " << expr1 << " and " << expr2 << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" << expr1 << " evaluates to " << val1 << ",\n" << expr2 << " evaluates to " << val2 << ", and\n" << abs_error_expr << " evaluates to " << abs_error << "."; } // Helper template for implementing FloatLE() and DoubleLE(). template AssertionResult FloatingPointLE(const char* expr1, const char* expr2, RawType val1, RawType val2) { // Returns success if val1 is less than val2, if (val1 < val2) { return AssertionSuccess(); } // or if val1 is almost equal to val2. const FloatingPoint lhs(val1), rhs(val2); if (lhs.AlmostEquals(rhs)) { return AssertionSuccess(); } // Note that the above two checks will both fail if either val1 or // val2 is NaN, as the IEEE floating-point standard requires that // any predicate involving a NaN must return false. ::std::stringstream val1_ss; val1_ss << std::setprecision(std::numeric_limits::digits10 + 2) << val1; ::std::stringstream val2_ss; val2_ss << std::setprecision(std::numeric_limits::digits10 + 2) << val2; return AssertionFailure() << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" << " Actual: " << StringStreamToString(&val1_ss) << " vs " << StringStreamToString(&val2_ss); } } // namespace internal // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult FloatLE(const char* expr1, const char* expr2, float val1, float val2) { return internal::FloatingPointLE(expr1, expr2, val1, val2); } // Asserts that val1 is less than, or almost equal to, val2. Fails // otherwise. In particular, it fails if either val1 or val2 is NaN. AssertionResult DoubleLE(const char* expr1, const char* expr2, double val1, double val2) { return internal::FloatingPointLE(expr1, expr2, val1, val2); } namespace internal { // The helper function for {ASSERT|EXPECT}_EQ with int or enum // arguments. AssertionResult CmpHelperEQ(const char* lhs_expression, const char* rhs_expression, BiggestInt lhs, BiggestInt rhs) { if (lhs == rhs) { return AssertionSuccess(); } return EqFailure(lhs_expression, rhs_expression, FormatForComparisonFailureMessage(lhs, rhs), FormatForComparisonFailureMessage(rhs, lhs), false); } // A macro for implementing the helper functions needed to implement // ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here // just to avoid copy-and-paste of similar code. #define GTEST_IMPL_CMP_HELPER_(op_name, op)\ AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ BiggestInt val1, BiggestInt val2) {\ if (val1 op val2) {\ return AssertionSuccess();\ } else {\ return AssertionFailure() \ << "Expected: (" << expr1 << ") " #op " (" << expr2\ << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ << " vs " << FormatForComparisonFailureMessage(val2, val1);\ }\ } // Implements the helper function for {ASSERT|EXPECT}_NE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(NE, !=) // Implements the helper function for {ASSERT|EXPECT}_LE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LE, <=) // Implements the helper function for {ASSERT|EXPECT}_LT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(LT, < ) // Implements the helper function for {ASSERT|EXPECT}_GE with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GE, >=) // Implements the helper function for {ASSERT|EXPECT}_GT with int or // enum arguments. GTEST_IMPL_CMP_HELPER_(GT, > ) #undef GTEST_IMPL_CMP_HELPER_ // The helper function for {ASSERT|EXPECT}_STREQ. AssertionResult CmpHelperSTREQ(const char* lhs_expression, const char* rhs_expression, const char* lhs, const char* rhs) { if (String::CStringEquals(lhs, rhs)) { return AssertionSuccess(); } return EqFailure(lhs_expression, rhs_expression, PrintToString(lhs), PrintToString(rhs), false); } // The helper function for {ASSERT|EXPECT}_STRCASEEQ. AssertionResult CmpHelperSTRCASEEQ(const char* lhs_expression, const char* rhs_expression, const char* lhs, const char* rhs) { if (String::CaseInsensitiveCStringEquals(lhs, rhs)) { return AssertionSuccess(); } return EqFailure(lhs_expression, rhs_expression, PrintToString(lhs), PrintToString(rhs), true); } // The helper function for {ASSERT|EXPECT}_STRNE. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CStringEquals(s1, s2)) { return AssertionSuccess(); } else { return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: \"" << s1 << "\" vs \"" << s2 << "\""; } } // The helper function for {ASSERT|EXPECT}_STRCASENE. AssertionResult CmpHelperSTRCASENE(const char* s1_expression, const char* s2_expression, const char* s1, const char* s2) { if (!String::CaseInsensitiveCStringEquals(s1, s2)) { return AssertionSuccess(); } else { return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << ") (ignoring case), actual: \"" << s1 << "\" vs \"" << s2 << "\""; } } } // namespace internal namespace { // Helper functions for implementing IsSubString() and IsNotSubstring(). // This group of overloaded functions return true if and only if needle // is a substring of haystack. NULL is considered a substring of // itself only. bool IsSubstringPred(const char* needle, const char* haystack) { if (needle == nullptr || haystack == nullptr) return needle == haystack; return strstr(haystack, needle) != nullptr; } bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { if (needle == nullptr || haystack == nullptr) return needle == haystack; return wcsstr(haystack, needle) != nullptr; } // StringType here can be either ::std::string or ::std::wstring. template bool IsSubstringPred(const StringType& needle, const StringType& haystack) { return haystack.find(needle) != StringType::npos; } // This function implements either IsSubstring() or IsNotSubstring(), // depending on the value of the expected_to_be_substring parameter. // StringType here can be const char*, const wchar_t*, ::std::string, // or ::std::wstring. template AssertionResult IsSubstringImpl( bool expected_to_be_substring, const char* needle_expr, const char* haystack_expr, const StringType& needle, const StringType& haystack) { if (IsSubstringPred(needle, haystack) == expected_to_be_substring) return AssertionSuccess(); const bool is_wide_string = sizeof(needle[0]) > 1; const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; return AssertionFailure() << "Value of: " << needle_expr << "\n" << " Actual: " << begin_string_quote << needle << "\"\n" << "Expected: " << (expected_to_be_substring ? "" : "not ") << "a substring of " << haystack_expr << "\n" << "Which is: " << begin_string_quote << haystack << "\""; } } // namespace // IsSubstring() and IsNotSubstring() check whether needle is a // substring of haystack (NULL is considered a substring of itself // only), and return an appropriate error message when they fail. AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const char* needle, const char* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const wchar_t* needle, const wchar_t* haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::string& needle, const ::std::string& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #if GTEST_HAS_STD_WSTRING AssertionResult IsSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); } AssertionResult IsNotSubstring( const char* needle_expr, const char* haystack_expr, const ::std::wstring& needle, const ::std::wstring& haystack) { return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); } #endif // GTEST_HAS_STD_WSTRING namespace internal { #if GTEST_OS_WINDOWS namespace { // Helper function for IsHRESULT{SuccessFailure} predicates AssertionResult HRESULTFailureHelper(const char* expr, const char* expected, long hr) { // NOLINT # if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_TV_TITLE // Windows CE doesn't support FormatMessage. const char error_text[] = ""; # else // Looks up the human-readable system message for the HRESULT code // and since we're not passing any params to FormatMessage, we don't // want inserts expanded. const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; const DWORD kBufSize = 4096; // Gets the system's human readable message string for this HRESULT. char error_text[kBufSize] = { '\0' }; DWORD message_length = ::FormatMessageA(kFlags, 0, // no source, we're asking system static_cast(hr), // the error 0, // no line width restrictions error_text, // output buffer kBufSize, // buf size nullptr); // no arguments for inserts // Trims tailing white space (FormatMessage leaves a trailing CR-LF) for (; message_length && IsSpace(error_text[message_length - 1]); --message_length) { error_text[message_length - 1] = '\0'; } # endif // GTEST_OS_WINDOWS_MOBILE const std::string error_hex("0x" + String::FormatHexInt(hr)); return ::testing::AssertionFailure() << "Expected: " << expr << " " << expected << ".\n" << " Actual: " << error_hex << " " << error_text << "\n"; } } // namespace AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT if (SUCCEEDED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "succeeds", hr); } AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT if (FAILED(hr)) { return AssertionSuccess(); } return HRESULTFailureHelper(expr, "fails", hr); } #endif // GTEST_OS_WINDOWS // Utility functions for encoding Unicode text (wide strings) in // UTF-8. // A Unicode code-point can have up to 21 bits, and is encoded in UTF-8 // like this: // // Code-point length Encoding // 0 - 7 bits 0xxxxxxx // 8 - 11 bits 110xxxxx 10xxxxxx // 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx // 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx // The maximum code-point a one-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint1 = (static_cast(1) << 7) - 1; // The maximum code-point a two-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint2 = (static_cast(1) << (5 + 6)) - 1; // The maximum code-point a three-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint3 = (static_cast(1) << (4 + 2*6)) - 1; // The maximum code-point a four-byte UTF-8 sequence can represent. const UInt32 kMaxCodePoint4 = (static_cast(1) << (3 + 3*6)) - 1; // Chops off the n lowest bits from a bit pattern. Returns the n // lowest bits. As a side effect, the original bit pattern will be // shifted to the right by n bits. inline UInt32 ChopLowBits(UInt32* bits, int n) { const UInt32 low_bits = *bits & ((static_cast(1) << n) - 1); *bits >>= n; return low_bits; } // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted // to "(Invalid Unicode 0xXXXXXXXX)". std::string CodePointToUtf8(UInt32 code_point) { if (code_point > kMaxCodePoint4) { return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")"; } char str[5]; // Big enough for the largest valid code point. if (code_point <= kMaxCodePoint1) { str[1] = '\0'; str[0] = static_cast(code_point); // 0xxxxxxx } else if (code_point <= kMaxCodePoint2) { str[2] = '\0'; str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xC0 | code_point); // 110xxxxx } else if (code_point <= kMaxCodePoint3) { str[3] = '\0'; str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xE0 | code_point); // 1110xxxx } else { // code_point <= kMaxCodePoint4 str[4] = '\0'; str[3] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx str[0] = static_cast(0xF0 | code_point); // 11110xxx } return str; } // The following two functions only make sense if the system // uses UTF-16 for wide string encoding. All supported systems // with 16 bit wchar_t (Windows, Cygwin) do use UTF-16. // Determines if the arguments constitute UTF-16 surrogate pair // and thus should be combined into a single Unicode code point // using CreateCodePointFromUtf16SurrogatePair. inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { return sizeof(wchar_t) == 2 && (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; } // Creates a Unicode code point from UTF16 surrogate pair. inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, wchar_t second) { const auto first_u = static_cast(first); const auto second_u = static_cast(second); const UInt32 mask = (1 << 10) - 1; return (sizeof(wchar_t) == 2) ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000 : // This function should not be called when the condition is // false, but we provide a sensible default in case it is. first_u; } // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. std::string WideStringToUtf8(const wchar_t* str, int num_chars) { if (num_chars == -1) num_chars = static_cast(wcslen(str)); ::std::stringstream stream; for (int i = 0; i < num_chars; ++i) { UInt32 unicode_code_point; if (str[i] == L'\0') { break; } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], str[i + 1]); i++; } else { unicode_code_point = static_cast(str[i]); } stream << CodePointToUtf8(unicode_code_point); } return StringStreamToString(&stream); } // Converts a wide C string to an std::string using the UTF-8 encoding. // NULL will be converted to "(null)". std::string String::ShowWideCString(const wchar_t * wide_c_str) { if (wide_c_str == nullptr) return "(null)"; return internal::WideStringToUtf8(wide_c_str, -1); } // Compares two wide C strings. Returns true if and only if they have the // same content. // // Unlike wcscmp(), this function can handle NULL argument(s). A NULL // C string is considered different to any non-NULL C string, // including the empty string. bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { if (lhs == nullptr) return rhs == nullptr; if (rhs == nullptr) return false; return wcscmp(lhs, rhs) == 0; } // Helper function for *_STREQ on wide strings. AssertionResult CmpHelperSTREQ(const char* lhs_expression, const char* rhs_expression, const wchar_t* lhs, const wchar_t* rhs) { if (String::WideCStringEquals(lhs, rhs)) { return AssertionSuccess(); } return EqFailure(lhs_expression, rhs_expression, PrintToString(lhs), PrintToString(rhs), false); } // Helper function for *_STRNE on wide strings. AssertionResult CmpHelperSTRNE(const char* s1_expression, const char* s2_expression, const wchar_t* s1, const wchar_t* s2) { if (!String::WideCStringEquals(s1, s2)) { return AssertionSuccess(); } return AssertionFailure() << "Expected: (" << s1_expression << ") != (" << s2_expression << "), actual: " << PrintToString(s1) << " vs " << PrintToString(s2); } // Compares two C strings, ignoring case. Returns true if and only if they have // the same content. // // Unlike strcasecmp(), this function can handle NULL argument(s). A // NULL C string is considered different to any non-NULL C string, // including the empty string. bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { if (lhs == nullptr) return rhs == nullptr; if (rhs == nullptr) return false; return posix::StrCaseCmp(lhs, rhs) == 0; } // Compares two wide C strings, ignoring case. Returns true if and only if they // have the same content. // // Unlike wcscasecmp(), this function can handle NULL argument(s). // A NULL C string is considered different to any non-NULL wide C string, // including the empty string. // NB: The implementations on different platforms slightly differ. // On windows, this method uses _wcsicmp which compares according to LC_CTYPE // environment variable. On GNU platform this method uses wcscasecmp // which compares according to LC_CTYPE category of the current locale. // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the // current locale. bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, const wchar_t* rhs) { if (lhs == nullptr) return rhs == nullptr; if (rhs == nullptr) return false; #if GTEST_OS_WINDOWS return _wcsicmp(lhs, rhs) == 0; #elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID return wcscasecmp(lhs, rhs) == 0; #else // Android, Mac OS X and Cygwin don't define wcscasecmp. // Other unknown OSes may not define it either. wint_t left, right; do { left = towlower(static_cast(*lhs++)); right = towlower(static_cast(*rhs++)); } while (left && left == right); return left == right; #endif // OS selector } // Returns true if and only if str ends with the given suffix, ignoring case. // Any string is considered to end with an empty suffix. bool String::EndsWithCaseInsensitive( const std::string& str, const std::string& suffix) { const size_t str_len = str.length(); const size_t suffix_len = suffix.length(); return (str_len >= suffix_len) && CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len, suffix.c_str()); } // Formats an int value as "%02d". std::string String::FormatIntWidth2(int value) { std::stringstream ss; ss << std::setfill('0') << std::setw(2) << value; return ss.str(); } // Formats an int value as "%X". std::string String::FormatHexUInt32(UInt32 value) { std::stringstream ss; ss << std::hex << std::uppercase << value; return ss.str(); } // Formats an int value as "%X". std::string String::FormatHexInt(int value) { return FormatHexUInt32(static_cast(value)); } // Formats a byte as "%02X". std::string String::FormatByte(unsigned char value) { std::stringstream ss; ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase << static_cast(value); return ss.str(); } // Converts the buffer in a stringstream to an std::string, converting NUL // bytes to "\\0" along the way. std::string StringStreamToString(::std::stringstream* ss) { const ::std::string& str = ss->str(); const char* const start = str.c_str(); const char* const end = start + str.length(); std::string result; result.reserve(static_cast(2 * (end - start))); for (const char* ch = start; ch != end; ++ch) { if (*ch == '\0') { result += "\\0"; // Replaces NUL with "\\0"; } else { result += *ch; } } return result; } // Appends the user-supplied message to the Google-Test-generated message. std::string AppendUserMessage(const std::string& gtest_msg, const Message& user_msg) { // Appends the user message if it's non-empty. const std::string user_msg_string = user_msg.GetString(); if (user_msg_string.empty()) { return gtest_msg; } return gtest_msg + "\n" + user_msg_string; } } // namespace internal // class TestResult // Creates an empty TestResult. TestResult::TestResult() : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {} // D'tor. TestResult::~TestResult() { } // Returns the i-th test part result among all the results. i can // range from 0 to total_part_count() - 1. If i is not in that range, // aborts the program. const TestPartResult& TestResult::GetTestPartResult(int i) const { if (i < 0 || i >= total_part_count()) internal::posix::Abort(); return test_part_results_.at(static_cast(i)); } // Returns the i-th test property. i can range from 0 to // test_property_count() - 1. If i is not in that range, aborts the // program. const TestProperty& TestResult::GetTestProperty(int i) const { if (i < 0 || i >= test_property_count()) internal::posix::Abort(); return test_properties_.at(static_cast(i)); } // Clears the test part results. void TestResult::ClearTestPartResults() { test_part_results_.clear(); } // Adds a test part result to the list. void TestResult::AddTestPartResult(const TestPartResult& test_part_result) { test_part_results_.push_back(test_part_result); } // Adds a test property to the list. If a property with the same key as the // supplied property is already represented, the value of this test_property // replaces the old value for that key. void TestResult::RecordProperty(const std::string& xml_element, const TestProperty& test_property) { if (!ValidateTestProperty(xml_element, test_property)) { return; } internal::MutexLock lock(&test_properites_mutex_); const std::vector::iterator property_with_matching_key = std::find_if(test_properties_.begin(), test_properties_.end(), internal::TestPropertyKeyIs(test_property.key())); if (property_with_matching_key == test_properties_.end()) { test_properties_.push_back(test_property); return; } property_with_matching_key->SetValue(test_property.value()); } // The list of reserved attributes used in the element of XML // output. static const char* const kReservedTestSuitesAttributes[] = { "disabled", "errors", "failures", "name", "random_seed", "tests", "time", "timestamp" }; // The list of reserved attributes used in the element of XML // output. static const char* const kReservedTestSuiteAttributes[] = { "disabled", "errors", "failures", "name", "tests", "time", "timestamp"}; // The list of reserved attributes used in the element of XML output. static const char* const kReservedTestCaseAttributes[] = { "classname", "name", "status", "time", "type_param", "value_param", "file", "line"}; // Use a slightly different set for allowed output to ensure existing tests can // still RecordProperty("result") or "RecordProperty(timestamp") static const char* const kReservedOutputTestCaseAttributes[] = { "classname", "name", "status", "time", "type_param", "value_param", "file", "line", "result", "timestamp"}; template std::vector ArrayAsVector(const char* const (&array)[kSize]) { return std::vector(array, array + kSize); } static std::vector GetReservedAttributesForElement( const std::string& xml_element) { if (xml_element == "testsuites") { return ArrayAsVector(kReservedTestSuitesAttributes); } else if (xml_element == "testsuite") { return ArrayAsVector(kReservedTestSuiteAttributes); } else if (xml_element == "testcase") { return ArrayAsVector(kReservedTestCaseAttributes); } else { GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element; } // This code is unreachable but some compilers may not realizes that. return std::vector(); } // TODO(jdesprez): Merge the two getReserved attributes once skip is improved static std::vector GetReservedOutputAttributesForElement( const std::string& xml_element) { if (xml_element == "testsuites") { return ArrayAsVector(kReservedTestSuitesAttributes); } else if (xml_element == "testsuite") { return ArrayAsVector(kReservedTestSuiteAttributes); } else if (xml_element == "testcase") { return ArrayAsVector(kReservedOutputTestCaseAttributes); } else { GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element; } // This code is unreachable but some compilers may not realizes that. return std::vector(); } static std::string FormatWordList(const std::vector& words) { Message word_list; for (size_t i = 0; i < words.size(); ++i) { if (i > 0 && words.size() > 2) { word_list << ", "; } if (i == words.size() - 1) { word_list << "and "; } word_list << "'" << words[i] << "'"; } return word_list.GetString(); } static bool ValidateTestPropertyName( const std::string& property_name, const std::vector& reserved_names) { if (std::find(reserved_names.begin(), reserved_names.end(), property_name) != reserved_names.end()) { ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name << " (" << FormatWordList(reserved_names) << " are reserved by " << GTEST_NAME_ << ")"; return false; } return true; } // Adds a failure if the key is a reserved attribute of the element named // xml_element. Returns true if the property is valid. bool TestResult::ValidateTestProperty(const std::string& xml_element, const TestProperty& test_property) { return ValidateTestPropertyName(test_property.key(), GetReservedAttributesForElement(xml_element)); } // Clears the object. void TestResult::Clear() { test_part_results_.clear(); test_properties_.clear(); death_test_count_ = 0; elapsed_time_ = 0; } // Returns true off the test part was skipped. static bool TestPartSkipped(const TestPartResult& result) { return result.skipped(); } // Returns true if and only if the test was skipped. bool TestResult::Skipped() const { return !Failed() && CountIf(test_part_results_, TestPartSkipped) > 0; } // Returns true if and only if the test failed. bool TestResult::Failed() const { for (int i = 0; i < total_part_count(); ++i) { if (GetTestPartResult(i).failed()) return true; } return false; } // Returns true if and only if the test part fatally failed. static bool TestPartFatallyFailed(const TestPartResult& result) { return result.fatally_failed(); } // Returns true if and only if the test fatally failed. bool TestResult::HasFatalFailure() const { return CountIf(test_part_results_, TestPartFatallyFailed) > 0; } // Returns true if and only if the test part non-fatally failed. static bool TestPartNonfatallyFailed(const TestPartResult& result) { return result.nonfatally_failed(); } // Returns true if and only if the test has a non-fatal failure. bool TestResult::HasNonfatalFailure() const { return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; } // Gets the number of all test parts. This is the sum of the number // of successful test parts and the number of failed test parts. int TestResult::total_part_count() const { return static_cast(test_part_results_.size()); } // Returns the number of the test properties. int TestResult::test_property_count() const { return static_cast(test_properties_.size()); } // class Test // Creates a Test object. // The c'tor saves the states of all flags. Test::Test() : gtest_flag_saver_(new GTEST_FLAG_SAVER_) { } // The d'tor restores the states of all flags. The actual work is // done by the d'tor of the gtest_flag_saver_ field, and thus not // visible here. Test::~Test() { } // Sets up the test fixture. // // A sub-class may override this. void Test::SetUp() { } // Tears down the test fixture. // // A sub-class may override this. void Test::TearDown() { } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const std::string& key, const std::string& value) { UnitTest::GetInstance()->RecordProperty(key, value); } // Allows user supplied key value pairs to be recorded for later output. void Test::RecordProperty(const std::string& key, int value) { Message value_message; value_message << value; RecordProperty(key, value_message.GetString().c_str()); } namespace internal { void ReportFailureInUnknownLocation(TestPartResult::Type result_type, const std::string& message) { // This function is a friend of UnitTest and as such has access to // AddTestPartResult. UnitTest::GetInstance()->AddTestPartResult( result_type, nullptr, // No info about the source file where the exception occurred. -1, // We have no info on which line caused the exception. message, ""); // No stack trace, either. } } // namespace internal // Google Test requires all tests in the same test suite to use the same test // fixture class. This function checks if the current test has the // same fixture class as the first test in the current test suite. If // yes, it returns true; otherwise it generates a Google Test failure and // returns false. bool Test::HasSameFixtureClass() { internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); const TestSuite* const test_suite = impl->current_test_suite(); // Info about the first test in the current test suite. const TestInfo* const first_test_info = test_suite->test_info_list()[0]; const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_; const char* const first_test_name = first_test_info->name(); // Info about the current test. const TestInfo* const this_test_info = impl->current_test_info(); const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_; const char* const this_test_name = this_test_info->name(); if (this_fixture_id != first_fixture_id) { // Is the first test defined using TEST? const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); // Is this test defined using TEST? const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); if (first_is_TEST || this_is_TEST) { // Both TEST and TEST_F appear in same test suite, which is incorrect. // Tell the user how to fix this. // Gets the name of the TEST and the name of the TEST_F. Note // that first_is_TEST and this_is_TEST cannot both be true, as // the fixture IDs are different for the two tests. const char* const TEST_name = first_is_TEST ? first_test_name : this_test_name; const char* const TEST_F_name = first_is_TEST ? this_test_name : first_test_name; ADD_FAILURE() << "All tests in the same test suite must use the same test fixture\n" << "class, so mixing TEST_F and TEST in the same test suite is\n" << "illegal. In test suite " << this_test_info->test_suite_name() << ",\n" << "test " << TEST_F_name << " is defined using TEST_F but\n" << "test " << TEST_name << " is defined using TEST. You probably\n" << "want to change the TEST to TEST_F or move it to another test\n" << "case."; } else { // Two fixture classes with the same name appear in two different // namespaces, which is not allowed. Tell the user how to fix this. ADD_FAILURE() << "All tests in the same test suite must use the same test fixture\n" << "class. However, in test suite " << this_test_info->test_suite_name() << ",\n" << "you defined test " << first_test_name << " and test " << this_test_name << "\n" << "using two different test fixture classes. This can happen if\n" << "the two classes are from different namespaces or translation\n" << "units and have the same name. You should probably rename one\n" << "of the classes to put the tests into different test suites."; } return false; } return true; } #if GTEST_HAS_SEH // Adds an "exception thrown" fatal failure to the current test. This // function returns its result via an output parameter pointer because VC++ // prohibits creation of objects with destructors on stack in functions // using __try (see error C2712). static std::string* FormatSehExceptionMessage(DWORD exception_code, const char* location) { Message message; message << "SEH exception with code 0x" << std::setbase(16) << exception_code << std::setbase(10) << " thrown in " << location << "."; return new std::string(message.GetString()); } #endif // GTEST_HAS_SEH namespace internal { #if GTEST_HAS_EXCEPTIONS // Adds an "exception thrown" fatal failure to the current test. static std::string FormatCxxExceptionMessage(const char* description, const char* location) { Message message; if (description != nullptr) { message << "C++ exception with description \"" << description << "\""; } else { message << "Unknown C++ exception"; } message << " thrown in " << location << "."; return message.GetString(); } static std::string PrintTestPartResultToString( const TestPartResult& test_part_result); GoogleTestFailureException::GoogleTestFailureException( const TestPartResult& failure) : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} #endif // GTEST_HAS_EXCEPTIONS // We put these helper functions in the internal namespace as IBM's xlC // compiler rejects the code if they were declared static. // Runs the given method and handles SEH exceptions it throws, when // SEH is supported; returns the 0-value for type Result in case of an // SEH exception. (Microsoft compilers cannot handle SEH and C++ // exceptions in the same function. Therefore, we provide a separate // wrapper function for handling SEH exceptions.) template Result HandleSehExceptionsInMethodIfSupported( T* object, Result (T::*method)(), const char* location) { #if GTEST_HAS_SEH __try { return (object->*method)(); } __except (internal::UnitTestOptions::GTestShouldProcessSEH( // NOLINT GetExceptionCode())) { // We create the exception message on the heap because VC++ prohibits // creation of objects with destructors on stack in functions using __try // (see error C2712). std::string* exception_message = FormatSehExceptionMessage( GetExceptionCode(), location); internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, *exception_message); delete exception_message; return static_cast(0); } #else (void)location; return (object->*method)(); #endif // GTEST_HAS_SEH } // Runs the given method and catches and reports C++ and/or SEH-style // exceptions, if they are supported; returns the 0-value for type // Result in case of an SEH exception. template Result HandleExceptionsInMethodIfSupported( T* object, Result (T::*method)(), const char* location) { // NOTE: The user code can affect the way in which Google Test handles // exceptions by setting GTEST_FLAG(catch_exceptions), but only before // RUN_ALL_TESTS() starts. It is technically possible to check the flag // after the exception is caught and either report or re-throw the // exception based on the flag's value: // // try { // // Perform the test method. // } catch (...) { // if (GTEST_FLAG(catch_exceptions)) // // Report the exception as failure. // else // throw; // Re-throws the original exception. // } // // However, the purpose of this flag is to allow the program to drop into // the debugger when the exception is thrown. On most platforms, once the // control enters the catch block, the exception origin information is // lost and the debugger will stop the program at the point of the // re-throw in this function -- instead of at the point of the original // throw statement in the code under test. For this reason, we perform // the check early, sacrificing the ability to affect Google Test's // exception handling in the method where the exception is thrown. if (internal::GetUnitTestImpl()->catch_exceptions()) { #if GTEST_HAS_EXCEPTIONS try { return HandleSehExceptionsInMethodIfSupported(object, method, location); } catch (const AssertionException&) { // NOLINT // This failure was reported already. } catch (const internal::GoogleTestFailureException&) { // NOLINT // This exception type can only be thrown by a failed Google // Test assertion with the intention of letting another testing // framework catch it. Therefore we just re-throw it. throw; } catch (const std::exception& e) { // NOLINT internal::ReportFailureInUnknownLocation( TestPartResult::kFatalFailure, FormatCxxExceptionMessage(e.what(), location)); } catch (...) { // NOLINT internal::ReportFailureInUnknownLocation( TestPartResult::kFatalFailure, FormatCxxExceptionMessage(nullptr, location)); } return static_cast(0); #else return HandleSehExceptionsInMethodIfSupported(object, method, location); #endif // GTEST_HAS_EXCEPTIONS } else { return (object->*method)(); } } } // namespace internal // Runs the test and updates the test result. void Test::Run() { if (!HasSameFixtureClass()) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()"); // We will run the test only if SetUp() was successful and didn't call // GTEST_SKIP(). if (!HasFatalFailure() && !IsSkipped()) { impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &Test::TestBody, "the test body"); } // However, we want to clean up as much as possible. Hence we will // always call TearDown(), even if SetUp() or the test body has // failed. impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &Test::TearDown, "TearDown()"); } // Returns true if and only if the current test has a fatal failure. bool Test::HasFatalFailure() { return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); } // Returns true if and only if the current test has a non-fatal failure. bool Test::HasNonfatalFailure() { return internal::GetUnitTestImpl()->current_test_result()-> HasNonfatalFailure(); } // Returns true if and only if the current test was skipped. bool Test::IsSkipped() { return internal::GetUnitTestImpl()->current_test_result()->Skipped(); } // class TestInfo // Constructs a TestInfo object. It assumes ownership of the test factory // object. TestInfo::TestInfo(const std::string& a_test_suite_name, const std::string& a_name, const char* a_type_param, const char* a_value_param, internal::CodeLocation a_code_location, internal::TypeId fixture_class_id, internal::TestFactoryBase* factory) : test_suite_name_(a_test_suite_name), name_(a_name), type_param_(a_type_param ? new std::string(a_type_param) : nullptr), value_param_(a_value_param ? new std::string(a_value_param) : nullptr), location_(a_code_location), fixture_class_id_(fixture_class_id), should_run_(false), is_disabled_(false), matches_filter_(false), factory_(factory), result_() {} // Destructs a TestInfo object. TestInfo::~TestInfo() { delete factory_; } namespace internal { // Creates a new TestInfo object and registers it with Google Test; // returns the created object. // // Arguments: // // test_suite_name: name of the test suite // name: name of the test // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // value_param: text representation of the test's value parameter, // or NULL if this is not a value-parameterized test. // code_location: code location where the test is defined // fixture_class_id: ID of the test fixture class // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite // factory: pointer to the factory that creates a test object. // The newly created TestInfo instance will assume // ownership of the factory object. TestInfo* MakeAndRegisterTestInfo( const char* test_suite_name, const char* name, const char* type_param, const char* value_param, CodeLocation code_location, TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) { TestInfo* const test_info = new TestInfo(test_suite_name, name, type_param, value_param, code_location, fixture_class_id, factory); GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); return test_info; } void ReportInvalidTestSuiteType(const char* test_suite_name, CodeLocation code_location) { Message errors; errors << "Attempted redefinition of test suite " << test_suite_name << ".\n" << "All tests in the same test suite must use the same test fixture\n" << "class. However, in test suite " << test_suite_name << ", you tried\n" << "to define a test using a fixture class different from the one\n" << "used earlier. This can happen if the two fixture classes are\n" << "from different namespaces and have the same name. You should\n" << "probably rename one of the classes to put the tests into different\n" << "test suites."; GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(), code_location.line) << " " << errors.GetString(); } } // namespace internal namespace { // A predicate that checks the test name of a TestInfo against a known // value. // // This is used for implementation of the TestSuite class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestNameIs is copyable. class TestNameIs { public: // Constructor. // // TestNameIs has NO default constructor. explicit TestNameIs(const char* name) : name_(name) {} // Returns true if and only if the test name of test_info matches name_. bool operator()(const TestInfo * test_info) const { return test_info && test_info->name() == name_; } private: std::string name_; }; } // namespace namespace internal { // This method expands all parameterized tests registered with macros TEST_P // and INSTANTIATE_TEST_SUITE_P into regular tests and registers those. // This will be done just once during the program runtime. void UnitTestImpl::RegisterParameterizedTests() { if (!parameterized_tests_registered_) { parameterized_test_registry_.RegisterTests(); parameterized_tests_registered_ = true; } } } // namespace internal // Creates the test object, runs it, records its result, and then // deletes it. void TestInfo::Run() { if (!should_run_) return; // Tells UnitTest where to store test result. internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_info(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); // Notifies the unit test event listeners that a test is about to start. repeater->OnTestStart(*this); const TimeInMillis start = internal::GetTimeInMillis(); impl->os_stack_trace_getter()->UponLeavingGTest(); // Creates the test object. Test* const test = internal::HandleExceptionsInMethodIfSupported( factory_, &internal::TestFactoryBase::CreateTest, "the test fixture's constructor"); // Runs the test if the constructor didn't generate a fatal failure or invoke // GTEST_SKIP(). // Note that the object will not be null if (!Test::HasFatalFailure() && !Test::IsSkipped()) { // This doesn't throw as all user code that can throw are wrapped into // exception handling code. test->Run(); } if (test != nullptr) { // Deletes the test object. impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( test, &Test::DeleteSelf_, "the test fixture's destructor"); } result_.set_start_timestamp(start); result_.set_elapsed_time(internal::GetTimeInMillis() - start); // Notifies the unit test event listener that a test has just finished. repeater->OnTestEnd(*this); // Tells UnitTest to stop associating assertion results to this // test. impl->set_current_test_info(nullptr); } // class TestSuite // Gets the number of successful tests in this test suite. int TestSuite::successful_test_count() const { return CountIf(test_info_list_, TestPassed); } // Gets the number of successful tests in this test suite. int TestSuite::skipped_test_count() const { return CountIf(test_info_list_, TestSkipped); } // Gets the number of failed tests in this test suite. int TestSuite::failed_test_count() const { return CountIf(test_info_list_, TestFailed); } // Gets the number of disabled tests that will be reported in the XML report. int TestSuite::reportable_disabled_test_count() const { return CountIf(test_info_list_, TestReportableDisabled); } // Gets the number of disabled tests in this test suite. int TestSuite::disabled_test_count() const { return CountIf(test_info_list_, TestDisabled); } // Gets the number of tests to be printed in the XML report. int TestSuite::reportable_test_count() const { return CountIf(test_info_list_, TestReportable); } // Get the number of tests in this test suite that should run. int TestSuite::test_to_run_count() const { return CountIf(test_info_list_, ShouldRunTest); } // Gets the number of all tests. int TestSuite::total_test_count() const { return static_cast(test_info_list_.size()); } // Creates a TestSuite with the given name. // // Arguments: // // name: name of the test suite // a_type_param: the name of the test suite's type parameter, or NULL if // this is not a typed or a type-parameterized test suite. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite TestSuite::TestSuite(const char* a_name, const char* a_type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc) : name_(a_name), type_param_(a_type_param ? new std::string(a_type_param) : nullptr), set_up_tc_(set_up_tc), tear_down_tc_(tear_down_tc), should_run_(false), start_timestamp_(0), elapsed_time_(0) {} // Destructor of TestSuite. TestSuite::~TestSuite() { // Deletes every Test in the collection. ForEach(test_info_list_, internal::Delete); } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. const TestInfo* TestSuite::GetTestInfo(int i) const { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? nullptr : test_info_list_[static_cast(index)]; } // Returns the i-th test among all the tests. i can range from 0 to // total_test_count() - 1. If i is not in that range, returns NULL. TestInfo* TestSuite::GetMutableTestInfo(int i) { const int index = GetElementOr(test_indices_, i, -1); return index < 0 ? nullptr : test_info_list_[static_cast(index)]; } // Adds a test to this test suite. Will delete the test upon // destruction of the TestSuite object. void TestSuite::AddTestInfo(TestInfo* test_info) { test_info_list_.push_back(test_info); test_indices_.push_back(static_cast(test_indices_.size())); } // Runs every test in this TestSuite. void TestSuite::Run() { if (!should_run_) return; internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); impl->set_current_test_suite(this); TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); // Call both legacy and the new API repeater->OnTestSuiteStart(*this); // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI repeater->OnTestCaseStart(*this); #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()"); start_timestamp_ = internal::GetTimeInMillis(); for (int i = 0; i < total_test_count(); i++) { GetMutableTestInfo(i)->Run(); } elapsed_time_ = internal::GetTimeInMillis() - start_timestamp_; impl->os_stack_trace_getter()->UponLeavingGTest(); internal::HandleExceptionsInMethodIfSupported( this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()"); // Call both legacy and the new API repeater->OnTestSuiteEnd(*this); // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI repeater->OnTestCaseEnd(*this); #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI impl->set_current_test_suite(nullptr); } // Clears the results of all tests in this test suite. void TestSuite::ClearResult() { ad_hoc_test_result_.Clear(); ForEach(test_info_list_, TestInfo::ClearTestResult); } // Shuffles the tests in this test suite. void TestSuite::ShuffleTests(internal::Random* random) { Shuffle(random, &test_indices_); } // Restores the test order to before the first shuffle. void TestSuite::UnshuffleTests() { for (size_t i = 0; i < test_indices_.size(); i++) { test_indices_[i] = static_cast(i); } } // Formats a countable noun. Depending on its quantity, either the // singular form or the plural form is used. e.g. // // FormatCountableNoun(1, "formula", "formuli") returns "1 formula". // FormatCountableNoun(5, "book", "books") returns "5 books". static std::string FormatCountableNoun(int count, const char * singular_form, const char * plural_form) { return internal::StreamableToString(count) + " " + (count == 1 ? singular_form : plural_form); } // Formats the count of tests. static std::string FormatTestCount(int test_count) { return FormatCountableNoun(test_count, "test", "tests"); } // Formats the count of test suites. static std::string FormatTestSuiteCount(int test_suite_count) { return FormatCountableNoun(test_suite_count, "test suite", "test suites"); } // Converts a TestPartResult::Type enum to human-friendly string // representation. Both kNonFatalFailure and kFatalFailure are translated // to "Failure", as the user usually doesn't care about the difference // between the two when viewing the test result. static const char * TestPartResultTypeToString(TestPartResult::Type type) { switch (type) { case TestPartResult::kSkip: return "Skipped"; case TestPartResult::kSuccess: return "Success"; case TestPartResult::kNonFatalFailure: case TestPartResult::kFatalFailure: #ifdef _MSC_VER return "error: "; #else return "Failure\n"; #endif default: return "Unknown result type"; } } namespace internal { // Prints a TestPartResult to an std::string. static std::string PrintTestPartResultToString( const TestPartResult& test_part_result) { return (Message() << internal::FormatFileLocation(test_part_result.file_name(), test_part_result.line_number()) << " " << TestPartResultTypeToString(test_part_result.type()) << test_part_result.message()).GetString(); } // Prints a TestPartResult. static void PrintTestPartResult(const TestPartResult& test_part_result) { const std::string& result = PrintTestPartResultToString(test_part_result); printf("%s\n", result.c_str()); fflush(stdout); // If the test program runs in Visual Studio or a debugger, the // following statements add the test part result message to the Output // window such that the user can double-click on it to jump to the // corresponding source code location; otherwise they do nothing. #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // We don't call OutputDebugString*() on Windows Mobile, as printing // to stdout is done by OutputDebugString() there already - we don't // want the same message printed twice. ::OutputDebugStringA(result.c_str()); ::OutputDebugStringA("\n"); #endif } // class PrettyUnitTestResultPrinter #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \ !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW // Returns the character attribute for the given color. static WORD GetColorAttribute(GTestColor color) { switch (color) { case COLOR_RED: return FOREGROUND_RED; case COLOR_GREEN: return FOREGROUND_GREEN; case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; default: return 0; } } static int GetBitOffset(WORD color_mask) { if (color_mask == 0) return 0; int bitOffset = 0; while ((color_mask & 1) == 0) { color_mask >>= 1; ++bitOffset; } return bitOffset; } static WORD GetNewColor(GTestColor color, WORD old_color_attrs) { // Let's reuse the BG static const WORD background_mask = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY; static const WORD foreground_mask = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY; const WORD existing_bg = old_color_attrs & background_mask; WORD new_color = GetColorAttribute(color) | existing_bg | FOREGROUND_INTENSITY; static const int bg_bitOffset = GetBitOffset(background_mask); static const int fg_bitOffset = GetBitOffset(foreground_mask); if (((new_color & background_mask) >> bg_bitOffset) == ((new_color & foreground_mask) >> fg_bitOffset)) { new_color ^= FOREGROUND_INTENSITY; // invert intensity } return new_color; } #else // Returns the ANSI color code for the given color. COLOR_DEFAULT is // an invalid input. static const char* GetAnsiColorCode(GTestColor color) { switch (color) { case COLOR_RED: return "1"; case COLOR_GREEN: return "2"; case COLOR_YELLOW: return "3"; default: return nullptr; } } #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE // Returns true if and only if Google Test should use colors in the output. bool ShouldUseColor(bool stdout_is_tty) { const char* const gtest_color = GTEST_FLAG(color).c_str(); if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MINGW // On Windows the TERM variable is usually not set, but the // console there does support colors. return stdout_is_tty; #else // On non-Windows platforms, we rely on the TERM variable. const char* const term = posix::GetEnv("TERM"); const bool term_supports_color = String::CStringEquals(term, "xterm") || String::CStringEquals(term, "xterm-color") || String::CStringEquals(term, "xterm-256color") || String::CStringEquals(term, "screen") || String::CStringEquals(term, "screen-256color") || String::CStringEquals(term, "tmux") || String::CStringEquals(term, "tmux-256color") || String::CStringEquals(term, "rxvt-unicode") || String::CStringEquals(term, "rxvt-unicode-256color") || String::CStringEquals(term, "linux") || String::CStringEquals(term, "cygwin"); return stdout_is_tty && term_supports_color; #endif // GTEST_OS_WINDOWS } return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || String::CaseInsensitiveCStringEquals(gtest_color, "true") || String::CaseInsensitiveCStringEquals(gtest_color, "t") || String::CStringEquals(gtest_color, "1"); // We take "yes", "true", "t", and "1" as meaning "yes". If the // value is neither one of these nor "auto", we treat it as "no" to // be conservative. } // Helpers for printing colored strings to stdout. Note that on Windows, we // cannot simply emit special characters and have the terminal change colors. // This routine must actually emit the characters rather than return a string // that would be colored when printed, as can be done on Linux. void ColoredPrintf(GTestColor color, const char* fmt, ...) { va_list args; va_start(args, fmt); #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \ GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM) const bool use_color = AlwaysFalse(); #else static const bool in_color_mode = ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); const bool use_color = in_color_mode && (color != COLOR_DEFAULT); #endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS if (!use_color) { vprintf(fmt, args); va_end(args); return; } #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \ !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); // Gets the current text color. CONSOLE_SCREEN_BUFFER_INFO buffer_info; GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); const WORD old_color_attrs = buffer_info.wAttributes; const WORD new_color = GetNewColor(color, old_color_attrs); // We need to flush the stream buffers into the console before each // SetConsoleTextAttribute call lest it affect the text that is already // printed but has not yet reached the console. fflush(stdout); SetConsoleTextAttribute(stdout_handle, new_color); vprintf(fmt, args); fflush(stdout); // Restores the text color. SetConsoleTextAttribute(stdout_handle, old_color_attrs); #else printf("\033[0;3%sm", GetAnsiColorCode(color)); vprintf(fmt, args); printf("\033[m"); // Resets the terminal to default. #endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE va_end(args); } // Text printed in Google Test's text output and --gtest_list_tests // output to label the type parameter and value parameter for a test. static const char kTypeParamLabel[] = "TypeParam"; static const char kValueParamLabel[] = "GetParam()"; static void PrintFullTestCommentIfPresent(const TestInfo& test_info) { const char* const type_param = test_info.type_param(); const char* const value_param = test_info.value_param(); if (type_param != nullptr || value_param != nullptr) { printf(", where "); if (type_param != nullptr) { printf("%s = %s", kTypeParamLabel, type_param); if (value_param != nullptr) printf(" and "); } if (value_param != nullptr) { printf("%s = %s", kValueParamLabel, value_param); } } } // This class implements the TestEventListener interface. // // Class PrettyUnitTestResultPrinter is copyable. class PrettyUnitTestResultPrinter : public TestEventListener { public: PrettyUnitTestResultPrinter() {} static void PrintTestName(const char* test_suite, const char* test) { printf("%s.%s", test_suite, test); } // The following methods override what's in the TestEventListener class. void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} void OnTestIterationStart(const UnitTest& unit_test, int iteration) override; void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override; void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {} #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestCaseStart(const TestCase& test_case) override; #else void OnTestSuiteStart(const TestSuite& test_suite) override; #endif // OnTestCaseStart void OnTestStart(const TestInfo& test_info) override; void OnTestPartResult(const TestPartResult& result) override; void OnTestEnd(const TestInfo& test_info) override; #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestCaseEnd(const TestCase& test_case) override; #else void OnTestSuiteEnd(const TestSuite& test_suite) override; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override; void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {} void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {} private: static void PrintFailedTests(const UnitTest& unit_test); static void PrintSkippedTests(const UnitTest& unit_test); }; // Fired before each iteration of tests starts. void PrettyUnitTestResultPrinter::OnTestIterationStart( const UnitTest& unit_test, int iteration) { if (GTEST_FLAG(repeat) != 1) printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); const char* const filter = GTEST_FLAG(filter).c_str(); // Prints the filter if it's not *. This reminds the user that some // tests may be skipped. if (!String::CStringEquals(filter, kUniversalFilter)) { ColoredPrintf(COLOR_YELLOW, "Note: %s filter = %s\n", GTEST_NAME_, filter); } if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1); ColoredPrintf(COLOR_YELLOW, "Note: This is test shard %d of %s.\n", static_cast(shard_index) + 1, internal::posix::GetEnv(kTestTotalShards)); } if (GTEST_FLAG(shuffle)) { ColoredPrintf(COLOR_YELLOW, "Note: Randomizing tests' orders with a seed of %d .\n", unit_test.random_seed()); } ColoredPrintf(COLOR_GREEN, "[==========] "); printf("Running %s from %s.\n", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); fflush(stdout); } void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment set-up.\n"); fflush(stdout); } #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { const std::string counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s", counts.c_str(), test_case.name()); if (test_case.type_param() == nullptr) { printf("\n"); } else { printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param()); } fflush(stdout); } #else void PrettyUnitTestResultPrinter::OnTestSuiteStart( const TestSuite& test_suite) { const std::string counts = FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s", counts.c_str(), test_suite.name()); if (test_suite.type_param() == nullptr) { printf("\n"); } else { printf(", where %s = %s\n", kTypeParamLabel, test_suite.type_param()); } fflush(stdout); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { ColoredPrintf(COLOR_GREEN, "[ RUN ] "); PrintTestName(test_info.test_suite_name(), test_info.name()); printf("\n"); fflush(stdout); } // Called after an assertion failure. void PrettyUnitTestResultPrinter::OnTestPartResult( const TestPartResult& result) { switch (result.type()) { // If the test part succeeded, or was skipped, // we don't need to do anything. case TestPartResult::kSkip: case TestPartResult::kSuccess: return; default: // Print failure message from the assertion // (e.g. expected this and got that). PrintTestPartResult(result); fflush(stdout); } } void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { if (test_info.result()->Passed()) { ColoredPrintf(COLOR_GREEN, "[ OK ] "); } else if (test_info.result()->Skipped()) { ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); } else { ColoredPrintf(COLOR_RED, "[ FAILED ] "); } PrintTestName(test_info.test_suite_name(), test_info.name()); if (test_info.result()->Failed()) PrintFullTestCommentIfPresent(test_info); if (GTEST_FLAG(print_time)) { printf(" (%s ms)\n", internal::StreamableToString( test_info.result()->elapsed_time()).c_str()); } else { printf("\n"); } fflush(stdout); } #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { if (!GTEST_FLAG(print_time)) return; const std::string counts = FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_case.name(), internal::StreamableToString(test_case.elapsed_time()).c_str()); fflush(stdout); } #else void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) { if (!GTEST_FLAG(print_time)) return; const std::string counts = FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests"); ColoredPrintf(COLOR_GREEN, "[----------] "); printf("%s from %s (%s ms total)\n\n", counts.c_str(), test_suite.name(), internal::StreamableToString(test_suite.elapsed_time()).c_str()); fflush(stdout); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( const UnitTest& /*unit_test*/) { ColoredPrintf(COLOR_GREEN, "[----------] "); printf("Global test environment tear-down\n"); fflush(stdout); } // Internal helper for printing the list of failed tests. void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { const int failed_test_count = unit_test.failed_test_count(); if (failed_test_count == 0) { return; } for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { const TestSuite& test_suite = *unit_test.GetTestSuite(i); if (!test_suite.should_run() || (test_suite.failed_test_count() == 0)) { continue; } for (int j = 0; j < test_suite.total_test_count(); ++j) { const TestInfo& test_info = *test_suite.GetTestInfo(j); if (!test_info.should_run() || !test_info.result()->Failed()) { continue; } ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s.%s", test_suite.name(), test_info.name()); PrintFullTestCommentIfPresent(test_info); printf("\n"); } } } // Internal helper for printing the list of skipped tests. void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) { const int skipped_test_count = unit_test.skipped_test_count(); if (skipped_test_count == 0) { return; } for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { const TestSuite& test_suite = *unit_test.GetTestSuite(i); if (!test_suite.should_run() || (test_suite.skipped_test_count() == 0)) { continue; } for (int j = 0; j < test_suite.total_test_count(); ++j) { const TestInfo& test_info = *test_suite.GetTestInfo(j); if (!test_info.should_run() || !test_info.result()->Skipped()) { continue; } ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); printf("%s.%s", test_suite.name(), test_info.name()); printf("\n"); } } } void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { ColoredPrintf(COLOR_GREEN, "[==========] "); printf("%s from %s ran.", FormatTestCount(unit_test.test_to_run_count()).c_str(), FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str()); if (GTEST_FLAG(print_time)) { printf(" (%s ms total)", internal::StreamableToString(unit_test.elapsed_time()).c_str()); } printf("\n"); ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); const int skipped_test_count = unit_test.skipped_test_count(); if (skipped_test_count > 0) { ColoredPrintf(COLOR_GREEN, "[ SKIPPED ] "); printf("%s, listed below:\n", FormatTestCount(skipped_test_count).c_str()); PrintSkippedTests(unit_test); } int num_failures = unit_test.failed_test_count(); if (!unit_test.Passed()) { const int failed_test_count = unit_test.failed_test_count(); ColoredPrintf(COLOR_RED, "[ FAILED ] "); printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); PrintFailedTests(unit_test); printf("\n%2d FAILED %s\n", num_failures, num_failures == 1 ? "TEST" : "TESTS"); } int num_disabled = unit_test.reportable_disabled_test_count(); if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { if (!num_failures) { printf("\n"); // Add a spacer if no FAILURE banner is displayed. } ColoredPrintf(COLOR_YELLOW, " YOU HAVE %d DISABLED %s\n\n", num_disabled, num_disabled == 1 ? "TEST" : "TESTS"); } // Ensure that Google Test output is printed before, e.g., heapchecker output. fflush(stdout); } // End PrettyUnitTestResultPrinter // class TestEventRepeater // // This class forwards events to other event listeners. class TestEventRepeater : public TestEventListener { public: TestEventRepeater() : forwarding_enabled_(true) {} ~TestEventRepeater() override; void Append(TestEventListener *listener); TestEventListener* Release(TestEventListener* listener); // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled() const { return forwarding_enabled_; } void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } void OnTestProgramStart(const UnitTest& unit_test) override; void OnTestIterationStart(const UnitTest& unit_test, int iteration) override; void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override; void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override; // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestCaseStart(const TestSuite& parameter) override; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestSuiteStart(const TestSuite& parameter) override; void OnTestStart(const TestInfo& test_info) override; void OnTestPartResult(const TestPartResult& result) override; void OnTestEnd(const TestInfo& test_info) override; // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestCaseEnd(const TestCase& parameter) override; #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ void OnTestSuiteEnd(const TestSuite& parameter) override; void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override; void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override; void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; void OnTestProgramEnd(const UnitTest& unit_test) override; private: // Controls whether events will be forwarded to listeners_. Set to false // in death test child processes. bool forwarding_enabled_; // The list of listeners that receive events. std::vector listeners_; GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); }; TestEventRepeater::~TestEventRepeater() { ForEach(listeners_, Delete); } void TestEventRepeater::Append(TestEventListener *listener) { listeners_.push_back(listener); } TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { for (size_t i = 0; i < listeners_.size(); ++i) { if (listeners_[i] == listener) { listeners_.erase(listeners_.begin() + static_cast(i)); return listener; } } return nullptr; } // Since most methods are very similar, use macros to reduce boilerplate. // This defines a member that forwards the call to all listeners. #define GTEST_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (size_t i = 0; i < listeners_.size(); i++) { \ listeners_[i]->Name(parameter); \ } \ } \ } // This defines a member that forwards the call to all listeners in reverse // order. #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ void TestEventRepeater::Name(const Type& parameter) { \ if (forwarding_enabled_) { \ for (size_t i = listeners_.size(); i != 0; i--) { \ listeners_[i - 1]->Name(parameter); \ } \ } \ } GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ GTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite) #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ GTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite) GTEST_REPEATER_METHOD_(OnTestStart, TestInfo) GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestSuite) #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ GTEST_REVERSE_REPEATER_METHOD_(OnTestSuiteEnd, TestSuite) GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) #undef GTEST_REPEATER_METHOD_ #undef GTEST_REVERSE_REPEATER_METHOD_ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (size_t i = 0; i < listeners_.size(); i++) { listeners_[i]->OnTestIterationStart(unit_test, iteration); } } } void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, int iteration) { if (forwarding_enabled_) { for (size_t i = listeners_.size(); i > 0; i--) { listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration); } } } // End TestEventRepeater // This class generates an XML output file. class XmlUnitTestResultPrinter : public EmptyTestEventListener { public: explicit XmlUnitTestResultPrinter(const char* output_file); void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; void ListTestsMatchingFilter(const std::vector& test_suites); // Prints an XML summary of all unit tests. static void PrintXmlTestsList(std::ostream* stream, const std::vector& test_suites); private: // Is c a whitespace character that is normalized to a space character // when it appears in an XML attribute value? static bool IsNormalizableWhitespace(char c) { return c == 0x9 || c == 0xA || c == 0xD; } // May c appear in a well-formed XML document? static bool IsValidXmlCharacter(char c) { return IsNormalizableWhitespace(c) || c >= 0x20; } // Returns an XML-escaped copy of the input string str. If // is_attribute is true, the text is meant to appear as an attribute // value, and normalizable whitespace is preserved by replacing it // with character references. static std::string EscapeXml(const std::string& str, bool is_attribute); // Returns the given string with all characters invalid in XML removed. static std::string RemoveInvalidXmlCharacters(const std::string& str); // Convenience wrapper around EscapeXml when str is an attribute value. static std::string EscapeXmlAttribute(const std::string& str) { return EscapeXml(str, true); } // Convenience wrapper around EscapeXml when str is not an attribute value. static std::string EscapeXmlText(const char* str) { return EscapeXml(str, false); } // Verifies that the given attribute belongs to the given element and // streams the attribute as XML. static void OutputXmlAttribute(std::ostream* stream, const std::string& element_name, const std::string& name, const std::string& value); // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. static void OutputXmlCDataSection(::std::ostream* stream, const char* data); // Streams an XML representation of a TestInfo object. static void OutputXmlTestInfo(::std::ostream* stream, const char* test_suite_name, const TestInfo& test_info); // Prints an XML representation of a TestSuite object static void PrintXmlTestSuite(::std::ostream* stream, const TestSuite& test_suite); // Prints an XML summary of unit_test to output stream out. static void PrintXmlUnitTest(::std::ostream* stream, const UnitTest& unit_test); // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. // When the std::string is not empty, it includes a space at the beginning, // to delimit this attribute from prior attributes. static std::string TestPropertiesAsXmlAttributes(const TestResult& result); // Streams an XML representation of the test properties of a TestResult // object. static void OutputXmlTestProperties(std::ostream* stream, const TestResult& result); // The output file. const std::string output_file_; GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); }; // Creates a new XmlUnitTestResultPrinter. XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) : output_file_(output_file) { if (output_file_.empty()) { GTEST_LOG_(FATAL) << "XML output file may not be null"; } } // Called after the unit test ends. void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { FILE* xmlout = OpenFileForWriting(output_file_); std::stringstream stream; PrintXmlUnitTest(&stream, unit_test); fprintf(xmlout, "%s", StringStreamToString(&stream).c_str()); fclose(xmlout); } void XmlUnitTestResultPrinter::ListTestsMatchingFilter( const std::vector& test_suites) { FILE* xmlout = OpenFileForWriting(output_file_); std::stringstream stream; PrintXmlTestsList(&stream, test_suites); fprintf(xmlout, "%s", StringStreamToString(&stream).c_str()); fclose(xmlout); } // Returns an XML-escaped copy of the input string str. If is_attribute // is true, the text is meant to appear as an attribute value, and // normalizable whitespace is preserved by replacing it with character // references. // // Invalid XML characters in str, if any, are stripped from the output. // It is expected that most, if not all, of the text processed by this // module will consist of ordinary English text. // If this module is ever modified to produce version 1.1 XML output, // most invalid characters can be retained using character references. std::string XmlUnitTestResultPrinter::EscapeXml( const std::string& str, bool is_attribute) { Message m; for (size_t i = 0; i < str.size(); ++i) { const char ch = str[i]; switch (ch) { case '<': m << "<"; break; case '>': m << ">"; break; case '&': m << "&"; break; case '\'': if (is_attribute) m << "'"; else m << '\''; break; case '"': if (is_attribute) m << """; else m << '"'; break; default: if (IsValidXmlCharacter(ch)) { if (is_attribute && IsNormalizableWhitespace(ch)) m << "&#x" << String::FormatByte(static_cast(ch)) << ";"; else m << ch; } break; } } return m.GetString(); } // Returns the given string with all characters invalid in XML removed. // Currently invalid characters are dropped from the string. An // alternative is to replace them with certain characters such as . or ?. std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters( const std::string& str) { std::string output; output.reserve(str.size()); for (std::string::const_iterator it = str.begin(); it != str.end(); ++it) if (IsValidXmlCharacter(*it)) output.push_back(*it); return output; } // The following routines generate an XML representation of a UnitTest // object. // GOOGLETEST_CM0009 DO NOT DELETE // // This is how Google Test concepts map to the DTD: // // <-- corresponds to a UnitTest object // <-- corresponds to a TestSuite object // <-- corresponds to a TestInfo object // ... // ... // ... // <-- individual assertion failures // // // // Formats the given time in milliseconds as seconds. std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { ::std::stringstream ss; ss << (static_cast(ms) * 1e-3); return ss.str(); } static bool PortableLocaltime(time_t seconds, struct tm* out) { #if defined(_MSC_VER) return localtime_s(out, &seconds) == 0; #elif defined(__MINGW32__) || defined(__MINGW64__) // MINGW provides neither localtime_r nor localtime_s, but uses // Windows' localtime(), which has a thread-local tm buffer. struct tm* tm_ptr = localtime(&seconds); // NOLINT if (tm_ptr == nullptr) return false; *out = *tm_ptr; return true; #else return localtime_r(&seconds, out) != nullptr; #endif } // Converts the given epoch time in milliseconds to a date string in the ISO // 8601 format, without the timezone information. std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) { struct tm time_struct; if (!PortableLocaltime(static_cast(ms / 1000), &time_struct)) return ""; // YYYY-MM-DDThh:mm:ss return StreamableToString(time_struct.tm_year + 1900) + "-" + String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + String::FormatIntWidth2(time_struct.tm_mday) + "T" + String::FormatIntWidth2(time_struct.tm_hour) + ":" + String::FormatIntWidth2(time_struct.tm_min) + ":" + String::FormatIntWidth2(time_struct.tm_sec); } // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, const char* data) { const char* segment = data; *stream << ""); if (next_segment != nullptr) { stream->write( segment, static_cast(next_segment - segment)); *stream << "]]>]]>"); } else { *stream << segment; break; } } *stream << "]]>"; } void XmlUnitTestResultPrinter::OutputXmlAttribute( std::ostream* stream, const std::string& element_name, const std::string& name, const std::string& value) { const std::vector& allowed_names = GetReservedOutputAttributesForElement(element_name); GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != allowed_names.end()) << "Attribute " << name << " is not allowed for element <" << element_name << ">."; *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\""; } // Prints an XML representation of a TestInfo object. void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, const char* test_suite_name, const TestInfo& test_info) { const TestResult& result = *test_info.result(); const std::string kTestsuite = "testcase"; if (test_info.is_in_another_shard()) { return; } *stream << " \n"; return; } OutputXmlAttribute(stream, kTestsuite, "status", test_info.should_run() ? "run" : "notrun"); OutputXmlAttribute(stream, kTestsuite, "result", test_info.should_run() ? (result.Skipped() ? "skipped" : "completed") : "suppressed"); OutputXmlAttribute(stream, kTestsuite, "time", FormatTimeInMillisAsSeconds(result.elapsed_time())); OutputXmlAttribute( stream, kTestsuite, "timestamp", FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name); int failures = 0; for (int i = 0; i < result.total_part_count(); ++i) { const TestPartResult& part = result.GetTestPartResult(i); if (part.failed()) { if (++failures == 1) { *stream << ">\n"; } const std::string location = internal::FormatCompilerIndependentFileLocation(part.file_name(), part.line_number()); const std::string summary = location + "\n" + part.summary(); *stream << " "; const std::string detail = location + "\n" + part.message(); OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str()); *stream << "\n"; } } if (failures == 0 && result.test_property_count() == 0) { *stream << " />\n"; } else { if (failures == 0) { *stream << ">\n"; } OutputXmlTestProperties(stream, result); *stream << " \n"; } } // Prints an XML representation of a TestSuite object void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream, const TestSuite& test_suite) { const std::string kTestsuite = "testsuite"; *stream << " <" << kTestsuite; OutputXmlAttribute(stream, kTestsuite, "name", test_suite.name()); OutputXmlAttribute(stream, kTestsuite, "tests", StreamableToString(test_suite.reportable_test_count())); if (!GTEST_FLAG(list_tests)) { OutputXmlAttribute(stream, kTestsuite, "failures", StreamableToString(test_suite.failed_test_count())); OutputXmlAttribute( stream, kTestsuite, "disabled", StreamableToString(test_suite.reportable_disabled_test_count())); OutputXmlAttribute(stream, kTestsuite, "errors", "0"); OutputXmlAttribute(stream, kTestsuite, "time", FormatTimeInMillisAsSeconds(test_suite.elapsed_time())); OutputXmlAttribute( stream, kTestsuite, "timestamp", FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp())); *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result()); } *stream << ">\n"; for (int i = 0; i < test_suite.total_test_count(); ++i) { if (test_suite.GetTestInfo(i)->is_reportable()) OutputXmlTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); } *stream << " \n"; } // Prints an XML summary of unit_test to output stream out. void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream, const UnitTest& unit_test) { const std::string kTestsuites = "testsuites"; *stream << "\n"; *stream << "<" << kTestsuites; OutputXmlAttribute(stream, kTestsuites, "tests", StreamableToString(unit_test.reportable_test_count())); OutputXmlAttribute(stream, kTestsuites, "failures", StreamableToString(unit_test.failed_test_count())); OutputXmlAttribute( stream, kTestsuites, "disabled", StreamableToString(unit_test.reportable_disabled_test_count())); OutputXmlAttribute(stream, kTestsuites, "errors", "0"); OutputXmlAttribute(stream, kTestsuites, "time", FormatTimeInMillisAsSeconds(unit_test.elapsed_time())); OutputXmlAttribute( stream, kTestsuites, "timestamp", FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp())); if (GTEST_FLAG(shuffle)) { OutputXmlAttribute(stream, kTestsuites, "random_seed", StreamableToString(unit_test.random_seed())); } *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result()); OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); *stream << ">\n"; for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i)); } *stream << "\n"; } void XmlUnitTestResultPrinter::PrintXmlTestsList( std::ostream* stream, const std::vector& test_suites) { const std::string kTestsuites = "testsuites"; *stream << "\n"; *stream << "<" << kTestsuites; int total_tests = 0; for (auto test_suite : test_suites) { total_tests += test_suite->total_test_count(); } OutputXmlAttribute(stream, kTestsuites, "tests", StreamableToString(total_tests)); OutputXmlAttribute(stream, kTestsuites, "name", "AllTests"); *stream << ">\n"; for (auto test_suite : test_suites) { PrintXmlTestSuite(stream, *test_suite); } *stream << "\n"; } // Produces a string representing the test properties in a result as space // delimited XML attributes based on the property key="value" pairs. std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( const TestResult& result) { Message attributes; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); attributes << " " << property.key() << "=" << "\"" << EscapeXmlAttribute(property.value()) << "\""; } return attributes.GetString(); } void XmlUnitTestResultPrinter::OutputXmlTestProperties( std::ostream* stream, const TestResult& result) { const std::string kProperties = "properties"; const std::string kProperty = "property"; if (result.test_property_count() <= 0) { return; } *stream << "<" << kProperties << ">\n"; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); *stream << "<" << kProperty; *stream << " name=\"" << EscapeXmlAttribute(property.key()) << "\""; *stream << " value=\"" << EscapeXmlAttribute(property.value()) << "\""; *stream << "/>\n"; } *stream << "\n"; } // End XmlUnitTestResultPrinter // This class generates an JSON output file. class JsonUnitTestResultPrinter : public EmptyTestEventListener { public: explicit JsonUnitTestResultPrinter(const char* output_file); void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override; // Prints an JSON summary of all unit tests. static void PrintJsonTestList(::std::ostream* stream, const std::vector& test_suites); private: // Returns an JSON-escaped copy of the input string str. static std::string EscapeJson(const std::string& str); //// Verifies that the given attribute belongs to the given element and //// streams the attribute as JSON. static void OutputJsonKey(std::ostream* stream, const std::string& element_name, const std::string& name, const std::string& value, const std::string& indent, bool comma = true); static void OutputJsonKey(std::ostream* stream, const std::string& element_name, const std::string& name, int value, const std::string& indent, bool comma = true); // Streams a JSON representation of a TestInfo object. static void OutputJsonTestInfo(::std::ostream* stream, const char* test_suite_name, const TestInfo& test_info); // Prints a JSON representation of a TestSuite object static void PrintJsonTestSuite(::std::ostream* stream, const TestSuite& test_suite); // Prints a JSON summary of unit_test to output stream out. static void PrintJsonUnitTest(::std::ostream* stream, const UnitTest& unit_test); // Produces a string representing the test properties in a result as // a JSON dictionary. static std::string TestPropertiesAsJson(const TestResult& result, const std::string& indent); // The output file. const std::string output_file_; GTEST_DISALLOW_COPY_AND_ASSIGN_(JsonUnitTestResultPrinter); }; // Creates a new JsonUnitTestResultPrinter. JsonUnitTestResultPrinter::JsonUnitTestResultPrinter(const char* output_file) : output_file_(output_file) { if (output_file_.empty()) { GTEST_LOG_(FATAL) << "JSON output file may not be null"; } } void JsonUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, int /*iteration*/) { FILE* jsonout = OpenFileForWriting(output_file_); std::stringstream stream; PrintJsonUnitTest(&stream, unit_test); fprintf(jsonout, "%s", StringStreamToString(&stream).c_str()); fclose(jsonout); } // Returns an JSON-escaped copy of the input string str. std::string JsonUnitTestResultPrinter::EscapeJson(const std::string& str) { Message m; for (size_t i = 0; i < str.size(); ++i) { const char ch = str[i]; switch (ch) { case '\\': case '"': case '/': m << '\\' << ch; break; case '\b': m << "\\b"; break; case '\t': m << "\\t"; break; case '\n': m << "\\n"; break; case '\f': m << "\\f"; break; case '\r': m << "\\r"; break; default: if (ch < ' ') { m << "\\u00" << String::FormatByte(static_cast(ch)); } else { m << ch; } break; } } return m.GetString(); } // The following routines generate an JSON representation of a UnitTest // object. // Formats the given time in milliseconds as seconds. static std::string FormatTimeInMillisAsDuration(TimeInMillis ms) { ::std::stringstream ss; ss << (static_cast(ms) * 1e-3) << "s"; return ss.str(); } // Converts the given epoch time in milliseconds to a date string in the // RFC3339 format, without the timezone information. static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) { struct tm time_struct; if (!PortableLocaltime(static_cast(ms / 1000), &time_struct)) return ""; // YYYY-MM-DDThh:mm:ss return StreamableToString(time_struct.tm_year + 1900) + "-" + String::FormatIntWidth2(time_struct.tm_mon + 1) + "-" + String::FormatIntWidth2(time_struct.tm_mday) + "T" + String::FormatIntWidth2(time_struct.tm_hour) + ":" + String::FormatIntWidth2(time_struct.tm_min) + ":" + String::FormatIntWidth2(time_struct.tm_sec) + "Z"; } static inline std::string Indent(size_t width) { return std::string(width, ' '); } void JsonUnitTestResultPrinter::OutputJsonKey( std::ostream* stream, const std::string& element_name, const std::string& name, const std::string& value, const std::string& indent, bool comma) { const std::vector& allowed_names = GetReservedOutputAttributesForElement(element_name); GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != allowed_names.end()) << "Key \"" << name << "\" is not allowed for value \"" << element_name << "\"."; *stream << indent << "\"" << name << "\": \"" << EscapeJson(value) << "\""; if (comma) *stream << ",\n"; } void JsonUnitTestResultPrinter::OutputJsonKey( std::ostream* stream, const std::string& element_name, const std::string& name, int value, const std::string& indent, bool comma) { const std::vector& allowed_names = GetReservedOutputAttributesForElement(element_name); GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) != allowed_names.end()) << "Key \"" << name << "\" is not allowed for value \"" << element_name << "\"."; *stream << indent << "\"" << name << "\": " << StreamableToString(value); if (comma) *stream << ",\n"; } // Prints a JSON representation of a TestInfo object. void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream, const char* test_suite_name, const TestInfo& test_info) { const TestResult& result = *test_info.result(); const std::string kTestsuite = "testcase"; const std::string kIndent = Indent(10); *stream << Indent(8) << "{\n"; OutputJsonKey(stream, kTestsuite, "name", test_info.name(), kIndent); if (test_info.value_param() != nullptr) { OutputJsonKey(stream, kTestsuite, "value_param", test_info.value_param(), kIndent); } if (test_info.type_param() != nullptr) { OutputJsonKey(stream, kTestsuite, "type_param", test_info.type_param(), kIndent); } if (GTEST_FLAG(list_tests)) { OutputJsonKey(stream, kTestsuite, "file", test_info.file(), kIndent); OutputJsonKey(stream, kTestsuite, "line", test_info.line(), kIndent, false); *stream << "\n" << Indent(8) << "}"; return; } OutputJsonKey(stream, kTestsuite, "status", test_info.should_run() ? "RUN" : "NOTRUN", kIndent); OutputJsonKey(stream, kTestsuite, "result", test_info.should_run() ? (result.Skipped() ? "SKIPPED" : "COMPLETED") : "SUPPRESSED", kIndent); OutputJsonKey(stream, kTestsuite, "timestamp", FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()), kIndent); OutputJsonKey(stream, kTestsuite, "time", FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent); OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent, false); *stream << TestPropertiesAsJson(result, kIndent); int failures = 0; for (int i = 0; i < result.total_part_count(); ++i) { const TestPartResult& part = result.GetTestPartResult(i); if (part.failed()) { *stream << ",\n"; if (++failures == 1) { *stream << kIndent << "\"" << "failures" << "\": [\n"; } const std::string location = internal::FormatCompilerIndependentFileLocation(part.file_name(), part.line_number()); const std::string message = EscapeJson(location + "\n" + part.message()); *stream << kIndent << " {\n" << kIndent << " \"failure\": \"" << message << "\",\n" << kIndent << " \"type\": \"\"\n" << kIndent << " }"; } } if (failures > 0) *stream << "\n" << kIndent << "]"; *stream << "\n" << Indent(8) << "}"; } // Prints an JSON representation of a TestSuite object void JsonUnitTestResultPrinter::PrintJsonTestSuite( std::ostream* stream, const TestSuite& test_suite) { const std::string kTestsuite = "testsuite"; const std::string kIndent = Indent(6); *stream << Indent(4) << "{\n"; OutputJsonKey(stream, kTestsuite, "name", test_suite.name(), kIndent); OutputJsonKey(stream, kTestsuite, "tests", test_suite.reportable_test_count(), kIndent); if (!GTEST_FLAG(list_tests)) { OutputJsonKey(stream, kTestsuite, "failures", test_suite.failed_test_count(), kIndent); OutputJsonKey(stream, kTestsuite, "disabled", test_suite.reportable_disabled_test_count(), kIndent); OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent); OutputJsonKey( stream, kTestsuite, "timestamp", FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()), kIndent); OutputJsonKey(stream, kTestsuite, "time", FormatTimeInMillisAsDuration(test_suite.elapsed_time()), kIndent, false); *stream << TestPropertiesAsJson(test_suite.ad_hoc_test_result(), kIndent) << ",\n"; } *stream << kIndent << "\"" << kTestsuite << "\": [\n"; bool comma = false; for (int i = 0; i < test_suite.total_test_count(); ++i) { if (test_suite.GetTestInfo(i)->is_reportable()) { if (comma) { *stream << ",\n"; } else { comma = true; } OutputJsonTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); } } *stream << "\n" << kIndent << "]\n" << Indent(4) << "}"; } // Prints a JSON summary of unit_test to output stream out. void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream, const UnitTest& unit_test) { const std::string kTestsuites = "testsuites"; const std::string kIndent = Indent(2); *stream << "{\n"; OutputJsonKey(stream, kTestsuites, "tests", unit_test.reportable_test_count(), kIndent); OutputJsonKey(stream, kTestsuites, "failures", unit_test.failed_test_count(), kIndent); OutputJsonKey(stream, kTestsuites, "disabled", unit_test.reportable_disabled_test_count(), kIndent); OutputJsonKey(stream, kTestsuites, "errors", 0, kIndent); if (GTEST_FLAG(shuffle)) { OutputJsonKey(stream, kTestsuites, "random_seed", unit_test.random_seed(), kIndent); } OutputJsonKey(stream, kTestsuites, "timestamp", FormatEpochTimeInMillisAsRFC3339(unit_test.start_timestamp()), kIndent); OutputJsonKey(stream, kTestsuites, "time", FormatTimeInMillisAsDuration(unit_test.elapsed_time()), kIndent, false); *stream << TestPropertiesAsJson(unit_test.ad_hoc_test_result(), kIndent) << ",\n"; OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent); *stream << kIndent << "\"" << kTestsuites << "\": [\n"; bool comma = false; for (int i = 0; i < unit_test.total_test_suite_count(); ++i) { if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) { if (comma) { *stream << ",\n"; } else { comma = true; } PrintJsonTestSuite(stream, *unit_test.GetTestSuite(i)); } } *stream << "\n" << kIndent << "]\n" << "}\n"; } void JsonUnitTestResultPrinter::PrintJsonTestList( std::ostream* stream, const std::vector& test_suites) { const std::string kTestsuites = "testsuites"; const std::string kIndent = Indent(2); *stream << "{\n"; int total_tests = 0; for (auto test_suite : test_suites) { total_tests += test_suite->total_test_count(); } OutputJsonKey(stream, kTestsuites, "tests", total_tests, kIndent); OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent); *stream << kIndent << "\"" << kTestsuites << "\": [\n"; for (size_t i = 0; i < test_suites.size(); ++i) { if (i != 0) { *stream << ",\n"; } PrintJsonTestSuite(stream, *test_suites[i]); } *stream << "\n" << kIndent << "]\n" << "}\n"; } // Produces a string representing the test properties in a result as // a JSON dictionary. std::string JsonUnitTestResultPrinter::TestPropertiesAsJson( const TestResult& result, const std::string& indent) { Message attributes; for (int i = 0; i < result.test_property_count(); ++i) { const TestProperty& property = result.GetTestProperty(i); attributes << ",\n" << indent << "\"" << property.key() << "\": " << "\"" << EscapeJson(property.value()) << "\""; } return attributes.GetString(); } // End JsonUnitTestResultPrinter #if GTEST_CAN_STREAM_RESULTS_ // Checks if str contains '=', '&', '%' or '\n' characters. If yes, // replaces them by "%xx" where xx is their hexadecimal value. For // example, replaces "=" with "%3D". This algorithm is O(strlen(str)) // in both time and space -- important as the input str may contain an // arbitrarily long test failure message and stack trace. std::string StreamingListener::UrlEncode(const char* str) { std::string result; result.reserve(strlen(str) + 1); for (char ch = *str; ch != '\0'; ch = *++str) { switch (ch) { case '%': case '=': case '&': case '\n': result.append("%" + String::FormatByte(static_cast(ch))); break; default: result.push_back(ch); break; } } return result; } void StreamingListener::SocketWriter::MakeConnection() { GTEST_CHECK_(sockfd_ == -1) << "MakeConnection() can't be called when there is already a connection."; addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // To allow both IPv4 and IPv6 addresses. hints.ai_socktype = SOCK_STREAM; addrinfo* servinfo = nullptr; // Use the getaddrinfo() to get a linked list of IP addresses for // the given host name. const int error_num = getaddrinfo( host_name_.c_str(), port_num_.c_str(), &hints, &servinfo); if (error_num != 0) { GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: " << gai_strerror(error_num); } // Loop through all the results and connect to the first we can. for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != nullptr; cur_addr = cur_addr->ai_next) { sockfd_ = socket( cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol); if (sockfd_ != -1) { // Connect the client socket to the server socket. if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) { close(sockfd_); sockfd_ = -1; } } } freeaddrinfo(servinfo); // all done with this structure if (sockfd_ == -1) { GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to " << host_name_ << ":" << port_num_; } } // End of class Streaming Listener #endif // GTEST_CAN_STREAM_RESULTS__ // class OsStackTraceGetter const char* const OsStackTraceGetterInterface::kElidedFramesMarker = "... " GTEST_NAME_ " internal frames ..."; std::string OsStackTraceGetter::CurrentStackTrace(int max_depth, int skip_count) GTEST_LOCK_EXCLUDED_(mutex_) { #if GTEST_HAS_ABSL std::string result; if (max_depth <= 0) { return result; } max_depth = std::min(max_depth, kMaxStackTraceDepth); std::vector raw_stack(max_depth); // Skips the frames requested by the caller, plus this function. const int raw_stack_size = absl::GetStackTrace(&raw_stack[0], max_depth, skip_count + 1); void* caller_frame = nullptr; { MutexLock lock(&mutex_); caller_frame = caller_frame_; } for (int i = 0; i < raw_stack_size; ++i) { if (raw_stack[i] == caller_frame && !GTEST_FLAG(show_internal_stack_frames)) { // Add a marker to the trace and stop adding frames. absl::StrAppend(&result, kElidedFramesMarker, "\n"); break; } char tmp[1024]; const char* symbol = "(unknown)"; if (absl::Symbolize(raw_stack[i], tmp, sizeof(tmp))) { symbol = tmp; } char line[1024]; snprintf(line, sizeof(line), " %p: %s\n", raw_stack[i], symbol); result += line; } return result; #else // !GTEST_HAS_ABSL static_cast(max_depth); static_cast(skip_count); return ""; #endif // GTEST_HAS_ABSL } void OsStackTraceGetter::UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_) { #if GTEST_HAS_ABSL void* caller_frame = nullptr; if (absl::GetStackTrace(&caller_frame, 1, 3) <= 0) { caller_frame = nullptr; } MutexLock lock(&mutex_); caller_frame_ = caller_frame; #endif // GTEST_HAS_ABSL } // A helper class that creates the premature-exit file in its // constructor and deletes the file in its destructor. class ScopedPrematureExitFile { public: explicit ScopedPrematureExitFile(const char* premature_exit_filepath) : premature_exit_filepath_(premature_exit_filepath ? premature_exit_filepath : "") { // If a path to the premature-exit file is specified... if (!premature_exit_filepath_.empty()) { // create the file with a single "0" character in it. I/O // errors are ignored as there's nothing better we can do and we // don't want to fail the test because of this. FILE* pfile = posix::FOpen(premature_exit_filepath, "w"); fwrite("0", 1, 1, pfile); fclose(pfile); } } ~ScopedPrematureExitFile() { if (!premature_exit_filepath_.empty()) { int retval = remove(premature_exit_filepath_.c_str()); if (retval) { GTEST_LOG_(ERROR) << "Failed to remove premature exit filepath \"" << premature_exit_filepath_ << "\" with error " << retval; } } } private: const std::string premature_exit_filepath_; GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile); }; } // namespace internal // class TestEventListeners TestEventListeners::TestEventListeners() : repeater_(new internal::TestEventRepeater()), default_result_printer_(nullptr), default_xml_generator_(nullptr) {} TestEventListeners::~TestEventListeners() { delete repeater_; } // Returns the standard listener responsible for the default console // output. Can be removed from the listeners list to shut down default // console output. Note that removing this object from the listener list // with Release transfers its ownership to the user. void TestEventListeners::Append(TestEventListener* listener) { repeater_->Append(listener); } // Removes the given event listener from the list and returns it. It then // becomes the caller's responsibility to delete the listener. Returns // NULL if the listener is not found in the list. TestEventListener* TestEventListeners::Release(TestEventListener* listener) { if (listener == default_result_printer_) default_result_printer_ = nullptr; else if (listener == default_xml_generator_) default_xml_generator_ = nullptr; return repeater_->Release(listener); } // Returns repeater that broadcasts the TestEventListener events to all // subscribers. TestEventListener* TestEventListeners::repeater() { return repeater_; } // Sets the default_result_printer attribute to the provided listener. // The listener is also added to the listener list and previous // default_result_printer is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { if (default_result_printer_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_result_printer_); default_result_printer_ = listener; if (listener != nullptr) Append(listener); } } // Sets the default_xml_generator attribute to the provided listener. The // listener is also added to the listener list and previous // default_xml_generator is removed from it and deleted. The listener can // also be NULL in which case it will not be added to the list. Does // nothing if the previous and the current listener objects are the same. void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { if (default_xml_generator_ != listener) { // It is an error to pass this method a listener that is already in the // list. delete Release(default_xml_generator_); default_xml_generator_ = listener; if (listener != nullptr) Append(listener); } } // Controls whether events will be forwarded by the repeater to the // listeners in the list. bool TestEventListeners::EventForwardingEnabled() const { return repeater_->forwarding_enabled(); } void TestEventListeners::SuppressEventForwarding() { repeater_->set_forwarding_enabled(false); } // class UnitTest // Gets the singleton UnitTest object. The first time this method is // called, a UnitTest object is constructed and returned. Consecutive // calls will return the same object. // // We don't protect this under mutex_ as a user is not supposed to // call this before main() starts, from which point on the return // value will never change. UnitTest* UnitTest::GetInstance() { // CodeGear C++Builder insists on a public destructor for the // default implementation. Use this implementation to keep good OO // design with private destructor. #if defined(__BORLANDC__) static UnitTest* const instance = new UnitTest; return instance; #else static UnitTest instance; return &instance; #endif // defined(__BORLANDC__) } // Gets the number of successful test suites. int UnitTest::successful_test_suite_count() const { return impl()->successful_test_suite_count(); } // Gets the number of failed test suites. int UnitTest::failed_test_suite_count() const { return impl()->failed_test_suite_count(); } // Gets the number of all test suites. int UnitTest::total_test_suite_count() const { return impl()->total_test_suite_count(); } // Gets the number of all test suites that contain at least one test // that should run. int UnitTest::test_suite_to_run_count() const { return impl()->test_suite_to_run_count(); } // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ int UnitTest::successful_test_case_count() const { return impl()->successful_test_suite_count(); } int UnitTest::failed_test_case_count() const { return impl()->failed_test_suite_count(); } int UnitTest::total_test_case_count() const { return impl()->total_test_suite_count(); } int UnitTest::test_case_to_run_count() const { return impl()->test_suite_to_run_count(); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Gets the number of successful tests. int UnitTest::successful_test_count() const { return impl()->successful_test_count(); } // Gets the number of skipped tests. int UnitTest::skipped_test_count() const { return impl()->skipped_test_count(); } // Gets the number of failed tests. int UnitTest::failed_test_count() const { return impl()->failed_test_count(); } // Gets the number of disabled tests that will be reported in the XML report. int UnitTest::reportable_disabled_test_count() const { return impl()->reportable_disabled_test_count(); } // Gets the number of disabled tests. int UnitTest::disabled_test_count() const { return impl()->disabled_test_count(); } // Gets the number of tests to be printed in the XML report. int UnitTest::reportable_test_count() const { return impl()->reportable_test_count(); } // Gets the number of all tests. int UnitTest::total_test_count() const { return impl()->total_test_count(); } // Gets the number of tests that should run. int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } // Gets the time of the test program start, in ms from the start of the // UNIX epoch. internal::TimeInMillis UnitTest::start_timestamp() const { return impl()->start_timestamp(); } // Gets the elapsed time, in milliseconds. internal::TimeInMillis UnitTest::elapsed_time() const { return impl()->elapsed_time(); } // Returns true if and only if the unit test passed (i.e. all test suites // passed). bool UnitTest::Passed() const { return impl()->Passed(); } // Returns true if and only if the unit test failed (i.e. some test suite // failed or something outside of all tests failed). bool UnitTest::Failed() const { return impl()->Failed(); } // Gets the i-th test suite among all the test suites. i can range from 0 to // total_test_suite_count() - 1. If i is not in that range, returns NULL. const TestSuite* UnitTest::GetTestSuite(int i) const { return impl()->GetTestSuite(i); } // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const TestCase* UnitTest::GetTestCase(int i) const { return impl()->GetTestCase(i); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Returns the TestResult containing information on test failures and // properties logged outside of individual test suites. const TestResult& UnitTest::ad_hoc_test_result() const { return *impl()->ad_hoc_test_result(); } // Gets the i-th test suite among all the test suites. i can range from 0 to // total_test_suite_count() - 1. If i is not in that range, returns NULL. TestSuite* UnitTest::GetMutableTestSuite(int i) { return impl()->GetMutableSuiteCase(i); } // Returns the list of event listeners that can be used to track events // inside Google Test. TestEventListeners& UnitTest::listeners() { return *impl()->listeners(); } // Registers and returns a global test environment. When a test // program is run, all global test environments will be set-up in the // order they were registered. After all tests in the program have // finished, all global test environments will be torn-down in the // *reverse* order they were registered. // // The UnitTest object takes ownership of the given environment. // // We don't protect this under mutex_, as we only support calling it // from the main thread. Environment* UnitTest::AddEnvironment(Environment* env) { if (env == nullptr) { return nullptr; } impl_->environments().push_back(env); return env; } // Adds a TestPartResult to the current TestResult object. All Google Test // assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call // this to report their results. The user code should use the // assertion macros instead of calling this directly. void UnitTest::AddTestPartResult( TestPartResult::Type result_type, const char* file_name, int line_number, const std::string& message, const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) { Message msg; msg << message; internal::MutexLock lock(&mutex_); if (impl_->gtest_trace_stack().size() > 0) { msg << "\n" << GTEST_NAME_ << " trace:"; for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) { const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) << " " << trace.message; } } if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) { msg << internal::kStackTraceMarker << os_stack_trace; } const TestPartResult result = TestPartResult( result_type, file_name, line_number, msg.GetString().c_str()); impl_->GetTestPartResultReporterForCurrentThread()-> ReportTestPartResult(result); if (result_type != TestPartResult::kSuccess && result_type != TestPartResult::kSkip) { // gtest_break_on_failure takes precedence over // gtest_throw_on_failure. This allows a user to set the latter // in the code (perhaps in order to use Google Test assertions // with another testing framework) and specify the former on the // command line for debugging. if (GTEST_FLAG(break_on_failure)) { #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT // Using DebugBreak on Windows allows gtest to still break into a debugger // when a failure happens and both the --gtest_break_on_failure and // the --gtest_catch_exceptions flags are specified. DebugBreak(); #elif (!defined(__native_client__)) && \ ((defined(__clang__) || defined(__GNUC__)) && \ (defined(__x86_64__) || defined(__i386__))) // with clang/gcc we can achieve the same effect on x86 by invoking int3 asm("int3"); #else // Dereference nullptr through a volatile pointer to prevent the compiler // from removing. We use this rather than abort() or __builtin_trap() for // portability: some debuggers don't correctly trap abort(). *static_cast(nullptr) = 1; #endif // GTEST_OS_WINDOWS } else if (GTEST_FLAG(throw_on_failure)) { #if GTEST_HAS_EXCEPTIONS throw internal::GoogleTestFailureException(result); #else // We cannot call abort() as it generates a pop-up in debug mode // that cannot be suppressed in VC 7.1 or below. exit(1); #endif } } } // Adds a TestProperty to the current TestResult object when invoked from // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked // from SetUpTestSuite or TearDownTestSuite, or to the global property set // when invoked elsewhere. If the result already contains a property with // the same key, the value will be updated. void UnitTest::RecordProperty(const std::string& key, const std::string& value) { impl_->RecordProperty(TestProperty(key, value)); } // Runs all tests in this UnitTest object and prints the result. // Returns 0 if successful, or 1 otherwise. // // We don't protect this under mutex_, as we only support calling it // from the main thread. int UnitTest::Run() { const bool in_death_test_child_process = internal::GTEST_FLAG(internal_run_death_test).length() > 0; // Google Test implements this protocol for catching that a test // program exits before returning control to Google Test: // // 1. Upon start, Google Test creates a file whose absolute path // is specified by the environment variable // TEST_PREMATURE_EXIT_FILE. // 2. When Google Test has finished its work, it deletes the file. // // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before // running a Google-Test-based test program and check the existence // of the file at the end of the test execution to see if it has // exited prematurely. // If we are in the child process of a death test, don't // create/delete the premature exit file, as doing so is unnecessary // and will confuse the parent process. Otherwise, create/delete // the file upon entering/leaving this function. If the program // somehow exits before this function has a chance to return, the // premature-exit file will be left undeleted, causing a test runner // that understands the premature-exit-file protocol to report the // test as having failed. const internal::ScopedPrematureExitFile premature_exit_file( in_death_test_child_process ? nullptr : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE")); // Captures the value of GTEST_FLAG(catch_exceptions). This value will be // used for the duration of the program. impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions)); #if GTEST_OS_WINDOWS // Either the user wants Google Test to catch exceptions thrown by the // tests or this is executing in the context of death test child // process. In either case the user does not want to see pop-up dialogs // about crashes - they are expected. if (impl()->catch_exceptions() || in_death_test_child_process) { # if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT // SetErrorMode doesn't exist on CE. SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); # endif // !GTEST_OS_WINDOWS_MOBILE # if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE // Death test children can be terminated with _abort(). On Windows, // _abort() can show a dialog with a warning message. This forces the // abort message to go to stderr instead. _set_error_mode(_OUT_TO_STDERR); # endif # if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE // In the debug version, Visual Studio pops up a separate dialog // offering a choice to debug the aborted program. We need to suppress // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement // executed. Google Test will notify the user of any unexpected // failure via stderr. if (!GTEST_FLAG(break_on_failure)) _set_abort_behavior( 0x0, // Clear the following flags: _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. # endif // In debug mode, the Windows CRT can crash with an assertion over invalid // input (e.g. passing an invalid file descriptor). The default handling // for these assertions is to pop up a dialog and wait for user input. // Instead ask the CRT to dump such assertions to stderr non-interactively. if (!IsDebuggerPresent()) { (void)_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); } } #endif // GTEST_OS_WINDOWS return internal::HandleExceptionsInMethodIfSupported( impl(), &internal::UnitTestImpl::RunAllTests, "auxiliary test code (environments or event listeners)") ? 0 : 1; } // Returns the working directory when the first TEST() or TEST_F() was // executed. const char* UnitTest::original_working_dir() const { return impl_->original_working_dir_.c_str(); } // Returns the TestSuite object for the test that's currently running, // or NULL if no test is running. const TestSuite* UnitTest::current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); return impl_->current_test_suite(); } // Legacy API is still available but deprecated #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const TestCase* UnitTest::current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); return impl_->current_test_suite(); } #endif // Returns the TestInfo object for the test that's currently running, // or NULL if no test is running. const TestInfo* UnitTest::current_test_info() const GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); return impl_->current_test_info(); } // Returns the random seed used at the start of the current test run. int UnitTest::random_seed() const { return impl_->random_seed(); } // Returns ParameterizedTestSuiteRegistry object used to keep track of // value-parameterized tests and instantiate and register them. internal::ParameterizedTestSuiteRegistry& UnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) { return impl_->parameterized_test_registry(); } // Creates an empty UnitTest. UnitTest::UnitTest() { impl_ = new internal::UnitTestImpl(this); } // Destructor of UnitTest. UnitTest::~UnitTest() { delete impl_; } // Pushes a trace defined by SCOPED_TRACE() on to the per-thread // Google Test trace stack. void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().push_back(trace); } // Pops a trace from the per-thread Google Test trace stack. void UnitTest::PopGTestTrace() GTEST_LOCK_EXCLUDED_(mutex_) { internal::MutexLock lock(&mutex_); impl_->gtest_trace_stack().pop_back(); } namespace internal { UnitTestImpl::UnitTestImpl(UnitTest* parent) : parent_(parent), GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */) default_global_test_part_result_reporter_(this), default_per_thread_test_part_result_reporter_(this), GTEST_DISABLE_MSC_WARNINGS_POP_() global_test_part_result_repoter_( &default_global_test_part_result_reporter_), per_thread_test_part_result_reporter_( &default_per_thread_test_part_result_reporter_), parameterized_test_registry_(), parameterized_tests_registered_(false), last_death_test_suite_(-1), current_test_suite_(nullptr), current_test_info_(nullptr), ad_hoc_test_result_(), os_stack_trace_getter_(nullptr), post_flag_parse_init_performed_(false), random_seed_(0), // Will be overridden by the flag before first use. random_(0), // Will be reseeded before first use. start_timestamp_(0), elapsed_time_(0), #if GTEST_HAS_DEATH_TEST death_test_factory_(new DefaultDeathTestFactory), #endif // Will be overridden by the flag before first use. catch_exceptions_(false) { listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); } UnitTestImpl::~UnitTestImpl() { // Deletes every TestSuite. ForEach(test_suites_, internal::Delete); // Deletes every Environment. ForEach(environments_, internal::Delete); delete os_stack_trace_getter_; } // Adds a TestProperty to the current TestResult object when invoked in a // context of a test, to current test suite's ad_hoc_test_result when invoke // from SetUpTestSuite/TearDownTestSuite, or to the global property set // otherwise. If the result already contains a property with the same key, // the value will be updated. void UnitTestImpl::RecordProperty(const TestProperty& test_property) { std::string xml_element; TestResult* test_result; // TestResult appropriate for property recording. if (current_test_info_ != nullptr) { xml_element = "testcase"; test_result = &(current_test_info_->result_); } else if (current_test_suite_ != nullptr) { xml_element = "testsuite"; test_result = &(current_test_suite_->ad_hoc_test_result_); } else { xml_element = "testsuites"; test_result = &ad_hoc_test_result_; } test_result->RecordProperty(xml_element, test_property); } #if GTEST_HAS_DEATH_TEST // Disables event forwarding if the control is currently in a death test // subprocess. Must not be called before InitGoogleTest. void UnitTestImpl::SuppressTestEventsIfInSubprocess() { if (internal_run_death_test_flag_.get() != nullptr) listeners()->SuppressEventForwarding(); } #endif // GTEST_HAS_DEATH_TEST // Initializes event listeners performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureXmlOutput() { const std::string& output_format = UnitTestOptions::GetOutputFormat(); if (output_format == "xml") { listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); } else if (output_format == "json") { listeners()->SetDefaultXmlGenerator(new JsonUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); } else if (output_format != "") { GTEST_LOG_(WARNING) << "WARNING: unrecognized output format \"" << output_format << "\" ignored."; } } #if GTEST_CAN_STREAM_RESULTS_ // Initializes event listeners for streaming test results in string form. // Must not be called before InitGoogleTest. void UnitTestImpl::ConfigureStreamingOutput() { const std::string& target = GTEST_FLAG(stream_result_to); if (!target.empty()) { const size_t pos = target.find(':'); if (pos != std::string::npos) { listeners()->Append(new StreamingListener(target.substr(0, pos), target.substr(pos+1))); } else { GTEST_LOG_(WARNING) << "unrecognized streaming target \"" << target << "\" ignored."; } } } #endif // GTEST_CAN_STREAM_RESULTS_ // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void UnitTestImpl::PostFlagParsingInit() { // Ensures that this function does not execute more than once. if (!post_flag_parse_init_performed_) { post_flag_parse_init_performed_ = true; #if defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_) // Register to send notifications about key process state changes. listeners()->Append(new GTEST_CUSTOM_TEST_EVENT_LISTENER_()); #endif // defined(GTEST_CUSTOM_TEST_EVENT_LISTENER_) #if GTEST_HAS_DEATH_TEST InitDeathTestSubprocessControlInfo(); SuppressTestEventsIfInSubprocess(); #endif // GTEST_HAS_DEATH_TEST // Registers parameterized tests. This makes parameterized tests // available to the UnitTest reflection API without running // RUN_ALL_TESTS. RegisterParameterizedTests(); // Configures listeners for XML output. This makes it possible for users // to shut down the default XML output before invoking RUN_ALL_TESTS. ConfigureXmlOutput(); #if GTEST_CAN_STREAM_RESULTS_ // Configures listeners for streaming test results to the specified server. ConfigureStreamingOutput(); #endif // GTEST_CAN_STREAM_RESULTS_ #if GTEST_HAS_ABSL if (GTEST_FLAG(install_failure_signal_handler)) { absl::FailureSignalHandlerOptions options; absl::InstallFailureSignalHandler(options); } #endif // GTEST_HAS_ABSL } } // A predicate that checks the name of a TestSuite against a known // value. // // This is used for implementation of the UnitTest class only. We put // it in the anonymous namespace to prevent polluting the outer // namespace. // // TestSuiteNameIs is copyable. class TestSuiteNameIs { public: // Constructor. explicit TestSuiteNameIs(const std::string& name) : name_(name) {} // Returns true if and only if the name of test_suite matches name_. bool operator()(const TestSuite* test_suite) const { return test_suite != nullptr && strcmp(test_suite->name(), name_.c_str()) == 0; } private: std::string name_; }; // Finds and returns a TestSuite with the given name. If one doesn't // exist, creates one and returns it. It's the CALLER'S // RESPONSIBILITY to ensure that this function is only called WHEN THE // TESTS ARE NOT SHUFFLED. // // Arguments: // // test_suite_name: name of the test suite // type_param: the name of the test suite's type parameter, or NULL if // this is not a typed or a type-parameterized test suite. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite TestSuite* UnitTestImpl::GetTestSuite( const char* test_suite_name, const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc) { // Can we find a TestSuite with the given name? const auto test_suite = std::find_if(test_suites_.rbegin(), test_suites_.rend(), TestSuiteNameIs(test_suite_name)); if (test_suite != test_suites_.rend()) return *test_suite; // No. Let's create one. auto* const new_test_suite = new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc); // Is this a death test suite? if (internal::UnitTestOptions::MatchesFilter(test_suite_name, kDeathTestSuiteFilter)) { // Yes. Inserts the test suite after the last death test suite // defined so far. This only works when the test suites haven't // been shuffled. Otherwise we may end up running a death test // after a non-death test. ++last_death_test_suite_; test_suites_.insert(test_suites_.begin() + last_death_test_suite_, new_test_suite); } else { // No. Appends to the end of the list. test_suites_.push_back(new_test_suite); } test_suite_indices_.push_back(static_cast(test_suite_indices_.size())); return new_test_suite; } // Helpers for setting up / tearing down the given environment. They // are for use in the ForEach() function. static void SetUpEnvironment(Environment* env) { env->SetUp(); } static void TearDownEnvironment(Environment* env) { env->TearDown(); } // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, the test is considered to be failed, but the // rest of the tests will still be run. // // When parameterized tests are enabled, it expands and registers // parameterized tests first in RegisterParameterizedTests(). // All other functions called from RunAllTests() may safely assume that // parameterized tests are ready to be counted and run. bool UnitTestImpl::RunAllTests() { // True if and only if Google Test is initialized before RUN_ALL_TESTS() is // called. const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized(); // Do not run any test if the --help flag was specified. if (g_help_flag) return true; // Repeats the call to the post-flag parsing initialization in case the // user didn't call InitGoogleTest. PostFlagParsingInit(); // Even if sharding is not on, test runners may want to use the // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding // protocol. internal::WriteToShardStatusFileIfNeeded(); // True if and only if we are in a subprocess for running a thread-safe-style // death test. bool in_subprocess_for_death_test = false; #if GTEST_HAS_DEATH_TEST in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != nullptr); # if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_) if (in_subprocess_for_death_test) { GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_(); } # endif // defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_) #endif // GTEST_HAS_DEATH_TEST const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, in_subprocess_for_death_test); // Compares the full test names with the filter to decide which // tests to run. const bool has_tests_to_run = FilterTests(should_shard ? HONOR_SHARDING_PROTOCOL : IGNORE_SHARDING_PROTOCOL) > 0; // Lists the tests and exits if the --gtest_list_tests flag was specified. if (GTEST_FLAG(list_tests)) { // This must be called *after* FilterTests() has been called. ListTestsMatchingFilter(); return true; } random_seed_ = GTEST_FLAG(shuffle) ? GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; // True if and only if at least one test has failed. bool failed = false; TestEventListener* repeater = listeners()->repeater(); start_timestamp_ = GetTimeInMillis(); repeater->OnTestProgramStart(*parent_); // How many times to repeat the tests? We don't want to repeat them // when we are inside the subprocess of a death test. const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); // Repeats forever if the repeat count is negative. const bool gtest_repeat_forever = repeat < 0; for (int i = 0; gtest_repeat_forever || i != repeat; i++) { // We want to preserve failures generated by ad-hoc test // assertions executed before RUN_ALL_TESTS(). ClearNonAdHocTestResult(); const TimeInMillis start = GetTimeInMillis(); // Shuffles test suites and tests if requested. if (has_tests_to_run && GTEST_FLAG(shuffle)) { random()->Reseed(static_cast(random_seed_)); // This should be done before calling OnTestIterationStart(), // such that a test event listener can see the actual test order // in the event. ShuffleTests(); } // Tells the unit test event listeners that the tests are about to start. repeater->OnTestIterationStart(*parent_, i); // Runs each test suite if there is at least one test to run. if (has_tests_to_run) { // Sets up all environments beforehand. repeater->OnEnvironmentsSetUpStart(*parent_); ForEach(environments_, SetUpEnvironment); repeater->OnEnvironmentsSetUpEnd(*parent_); // Runs the tests only if there was no fatal failure or skip triggered // during global set-up. if (Test::IsSkipped()) { // Emit diagnostics when global set-up calls skip, as it will not be // emitted by default. TestResult& test_result = *internal::GetUnitTestImpl()->current_test_result(); for (int j = 0; j < test_result.total_part_count(); ++j) { const TestPartResult& test_part_result = test_result.GetTestPartResult(j); if (test_part_result.type() == TestPartResult::kSkip) { const std::string& result = test_part_result.message(); printf("%s\n", result.c_str()); } } fflush(stdout); } else if (!Test::HasFatalFailure()) { for (int test_index = 0; test_index < total_test_suite_count(); test_index++) { GetMutableSuiteCase(test_index)->Run(); } } // Tears down all environments in reverse order afterwards. repeater->OnEnvironmentsTearDownStart(*parent_); std::for_each(environments_.rbegin(), environments_.rend(), TearDownEnvironment); repeater->OnEnvironmentsTearDownEnd(*parent_); } elapsed_time_ = GetTimeInMillis() - start; // Tells the unit test event listener that the tests have just finished. repeater->OnTestIterationEnd(*parent_, i); // Gets the result and clears it. if (!Passed()) { failed = true; } // Restores the original test order after the iteration. This // allows the user to quickly repro a failure that happens in the // N-th iteration without repeating the first (N - 1) iterations. // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in // case the user somehow changes the value of the flag somewhere // (it's always safe to unshuffle the tests). UnshuffleTests(); if (GTEST_FLAG(shuffle)) { // Picks a new random seed for each iteration. random_seed_ = GetNextRandomSeed(random_seed_); } } repeater->OnTestProgramEnd(*parent_); if (!gtest_is_initialized_before_run_all_tests) { ColoredPrintf( COLOR_RED, "\nIMPORTANT NOTICE - DO NOT IGNORE:\n" "This test program did NOT call " GTEST_INIT_GOOGLE_TEST_NAME_ "() before calling RUN_ALL_TESTS(). This is INVALID. Soon " GTEST_NAME_ " will start to enforce the valid usage. " "Please fix it ASAP, or IT WILL START TO FAIL.\n"); // NOLINT #if GTEST_FOR_GOOGLE_ ColoredPrintf(COLOR_RED, "For more details, see http://wiki/Main/ValidGUnitMain.\n"); #endif // GTEST_FOR_GOOGLE_ } return !failed; } // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded() { const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); if (test_shard_file != nullptr) { FILE* const file = posix::FOpen(test_shard_file, "w"); if (file == nullptr) { ColoredPrintf(COLOR_RED, "Could not write to the test shard status file \"%s\" " "specified by the %s environment variable.\n", test_shard_file, kTestShardStatusFile); fflush(stdout); exit(EXIT_FAILURE); } fclose(file); } } // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (i.e., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. bool ShouldShard(const char* total_shards_env, const char* shard_index_env, bool in_subprocess_for_death_test) { if (in_subprocess_for_death_test) { return false; } const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); if (total_shards == -1 && shard_index == -1) { return false; } else if (total_shards == -1 && shard_index != -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestShardIndex << " = " << shard_index << ", but have left " << kTestTotalShards << " unset.\n"; ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (total_shards != -1 && shard_index == -1) { const Message msg = Message() << "Invalid environment variables: you have " << kTestTotalShards << " = " << total_shards << ", but have left " << kTestShardIndex << " unset.\n"; ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } else if (shard_index < 0 || shard_index >= total_shards) { const Message msg = Message() << "Invalid environment variables: we require 0 <= " << kTestShardIndex << " < " << kTestTotalShards << ", but you have " << kTestShardIndex << "=" << shard_index << ", " << kTestTotalShards << "=" << total_shards << ".\n"; ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str()); fflush(stdout); exit(EXIT_FAILURE); } return total_shards > 1; } // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error // and aborts. Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) { const char* str_val = posix::GetEnv(var); if (str_val == nullptr) { return default_val; } Int32 result; if (!ParseInt32(Message() << "The value of environment variable " << var, str_val, &result)) { exit(EXIT_FAILURE); } return result; } // Given the total number of shards, the shard index, and the test id, // returns true if and only if the test should be run on this shard. The test id // is some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { return (test_id % total_shards) == shard_index; } // Compares the name of each test with the user-specified filter to // decide whether the test should be run, then records the result in // each TestSuite and TestInfo object. // If shard_tests == true, further filters tests based on sharding // variables in the environment - see // https://github.com/google/googletest/blob/master/googletest/docs/advanced.md // . Returns the number of tests that should run. int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestTotalShards, -1) : -1; const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? Int32FromEnvOrDie(kTestShardIndex, -1) : -1; // num_runnable_tests are the number of tests that will // run across all shards (i.e., match filter and are not disabled). // num_selected_tests are the number of tests to be run on // this shard. int num_runnable_tests = 0; int num_selected_tests = 0; for (auto* test_suite : test_suites_) { const std::string& test_suite_name = test_suite->name(); test_suite->set_should_run(false); for (size_t j = 0; j < test_suite->test_info_list().size(); j++) { TestInfo* const test_info = test_suite->test_info_list()[j]; const std::string test_name(test_info->name()); // A test is disabled if test suite name or test name matches // kDisableTestFilter. const bool is_disabled = internal::UnitTestOptions::MatchesFilter( test_suite_name, kDisableTestFilter) || internal::UnitTestOptions::MatchesFilter( test_name, kDisableTestFilter); test_info->is_disabled_ = is_disabled; const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest( test_suite_name, test_name); test_info->matches_filter_ = matches_filter; const bool is_runnable = (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && matches_filter; const bool is_in_another_shard = shard_tests != IGNORE_SHARDING_PROTOCOL && !ShouldRunTestOnShard(total_shards, shard_index, num_runnable_tests); test_info->is_in_another_shard_ = is_in_another_shard; const bool is_selected = is_runnable && !is_in_another_shard; num_runnable_tests += is_runnable; num_selected_tests += is_selected; test_info->should_run_ = is_selected; test_suite->set_should_run(test_suite->should_run() || is_selected); } } return num_selected_tests; } // Prints the given C-string on a single line by replacing all '\n' // characters with string "\\n". If the output takes more than // max_length characters, only prints the first max_length characters // and "...". static void PrintOnOneLine(const char* str, int max_length) { if (str != nullptr) { for (int i = 0; *str != '\0'; ++str) { if (i >= max_length) { printf("..."); break; } if (*str == '\n') { printf("\\n"); i += 2; } else { printf("%c", *str); ++i; } } } } // Prints the names of the tests matching the user-specified filter flag. void UnitTestImpl::ListTestsMatchingFilter() { // Print at most this many characters for each type/value parameter. const int kMaxParamLength = 250; for (auto* test_suite : test_suites_) { bool printed_test_suite_name = false; for (size_t j = 0; j < test_suite->test_info_list().size(); j++) { const TestInfo* const test_info = test_suite->test_info_list()[j]; if (test_info->matches_filter_) { if (!printed_test_suite_name) { printed_test_suite_name = true; printf("%s.", test_suite->name()); if (test_suite->type_param() != nullptr) { printf(" # %s = ", kTypeParamLabel); // We print the type parameter on a single line to make // the output easy to parse by a program. PrintOnOneLine(test_suite->type_param(), kMaxParamLength); } printf("\n"); } printf(" %s", test_info->name()); if (test_info->value_param() != nullptr) { printf(" # %s = ", kValueParamLabel); // We print the value parameter on a single line to make the // output easy to parse by a program. PrintOnOneLine(test_info->value_param(), kMaxParamLength); } printf("\n"); } } } fflush(stdout); const std::string& output_format = UnitTestOptions::GetOutputFormat(); if (output_format == "xml" || output_format == "json") { FILE* fileout = OpenFileForWriting( UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); std::stringstream stream; if (output_format == "xml") { XmlUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str()) .PrintXmlTestsList(&stream, test_suites_); } else if (output_format == "json") { JsonUnitTestResultPrinter( UnitTestOptions::GetAbsolutePathToOutputFile().c_str()) .PrintJsonTestList(&stream, test_suites_); } fprintf(fileout, "%s", StringStreamToString(&stream).c_str()); fclose(fileout); } } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter are // the same; otherwise, deletes the old getter and makes the input the // current getter. void UnitTestImpl::set_os_stack_trace_getter( OsStackTraceGetterInterface* getter) { if (os_stack_trace_getter_ != getter) { delete os_stack_trace_getter_; os_stack_trace_getter_ = getter; } } // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { if (os_stack_trace_getter_ == nullptr) { #ifdef GTEST_OS_STACK_TRACE_GETTER_ os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_; #else os_stack_trace_getter_ = new OsStackTraceGetter; #endif // GTEST_OS_STACK_TRACE_GETTER_ } return os_stack_trace_getter_; } // Returns the most specific TestResult currently running. TestResult* UnitTestImpl::current_test_result() { if (current_test_info_ != nullptr) { return ¤t_test_info_->result_; } if (current_test_suite_ != nullptr) { return ¤t_test_suite_->ad_hoc_test_result_; } return &ad_hoc_test_result_; } // Shuffles all test suites, and the tests within each test suite, // making sure that death tests are still run first. void UnitTestImpl::ShuffleTests() { // Shuffles the death test suites. ShuffleRange(random(), 0, last_death_test_suite_ + 1, &test_suite_indices_); // Shuffles the non-death test suites. ShuffleRange(random(), last_death_test_suite_ + 1, static_cast(test_suites_.size()), &test_suite_indices_); // Shuffles the tests inside each test suite. for (auto& test_suite : test_suites_) { test_suite->ShuffleTests(random()); } } // Restores the test suites and tests to their order before the first shuffle. void UnitTestImpl::UnshuffleTests() { for (size_t i = 0; i < test_suites_.size(); i++) { // Unshuffles the tests in each test suite. test_suites_[i]->UnshuffleTests(); // Resets the index of each test suite. test_suite_indices_[i] = static_cast(i); } } // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in // the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, int skip_count) { // We pass skip_count + 1 to skip this wrapper function in addition // to what the user really wants to skip. return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); } // Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to // suppress unreachable code warnings. namespace { class ClassUniqueToAlwaysTrue {}; } bool IsTrue(bool condition) { return condition; } bool AlwaysTrue() { #if GTEST_HAS_EXCEPTIONS // This condition is always false so AlwaysTrue() never actually throws, // but it makes the compiler think that it may throw. if (IsTrue(false)) throw ClassUniqueToAlwaysTrue(); #endif // GTEST_HAS_EXCEPTIONS return true; } // If *pstr starts with the given prefix, modifies *pstr to be right // past the prefix and returns true; otherwise leaves *pstr unchanged // and returns false. None of pstr, *pstr, and prefix can be NULL. bool SkipPrefix(const char* prefix, const char** pstr) { const size_t prefix_len = strlen(prefix); if (strncmp(*pstr, prefix, prefix_len) == 0) { *pstr += prefix_len; return true; } return false; } // Parses a string as a command line flag. The string should have // the format "--flag=value". When def_optional is true, the "=value" // part can be omitted. // // Returns the value of the flag, or NULL if the parsing failed. static const char* ParseFlagValue(const char* str, const char* flag, bool def_optional) { // str and flag must not be NULL. if (str == nullptr || flag == nullptr) return nullptr; // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag; const size_t flag_len = flag_str.length(); if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr; // Skips the flag name. const char* flag_end = str + flag_len; // When def_optional is true, it's OK to not have a "=value" part. if (def_optional && (flag_end[0] == '\0')) { return flag_end; } // If def_optional is true and there are more characters after the // flag name, or if def_optional is false, there must be a '=' after // the flag name. if (flag_end[0] != '=') return nullptr; // Returns the string after "=". return flag_end + 1; } // Parses a string for a bool flag, in the form of either // "--flag=value" or "--flag". // // In the former case, the value is taken as true as long as it does // not start with '0', 'f', or 'F'. // // In the latter case, the value is taken as true. // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. static bool ParseBoolFlag(const char* str, const char* flag, bool* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, true); // Aborts if the parsing failed. if (value_str == nullptr) return false; // Converts the string value to a bool. *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); return true; } // Parses a string for an Int32 flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == nullptr) return false; // Sets *value to the value of the flag. return ParseInt32(Message() << "The value of flag --" << flag, value_str, value); } // Parses a string for a string flag, in the form of // "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. template static bool ParseStringFlag(const char* str, const char* flag, String* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); // Aborts if the parsing failed. if (value_str == nullptr) return false; // Sets *value to the value of the flag. *value = value_str; return true; } // Determines whether a string has a prefix that Google Test uses for its // flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. // If Google Test detects that a command line flag has its prefix but is not // recognized, it will print its help message. Flags starting with // GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test // internal flags and do not trigger the help message. static bool HasGoogleTestFlagPrefix(const char* str) { return (SkipPrefix("--", &str) || SkipPrefix("-", &str) || SkipPrefix("/", &str)) && !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); } // Prints a string containing code-encoded text. The following escape // sequences can be used in the string to control the text color: // // @@ prints a single '@' character. // @R changes the color to red. // @G changes the color to green. // @Y changes the color to yellow. // @D changes to the default terminal text color. // static void PrintColorEncoded(const char* str) { GTestColor color = COLOR_DEFAULT; // The current color. // Conceptually, we split the string into segments divided by escape // sequences. Then we print one segment at a time. At the end of // each iteration, the str pointer advances to the beginning of the // next segment. for (;;) { const char* p = strchr(str, '@'); if (p == nullptr) { ColoredPrintf(color, "%s", str); return; } ColoredPrintf(color, "%s", std::string(str, p).c_str()); const char ch = p[1]; str = p + 2; if (ch == '@') { ColoredPrintf(color, "@"); } else if (ch == 'D') { color = COLOR_DEFAULT; } else if (ch == 'R') { color = COLOR_RED; } else if (ch == 'G') { color = COLOR_GREEN; } else if (ch == 'Y') { color = COLOR_YELLOW; } else { --str; } } } static const char kColorEncodedHelpMessage[] = "This program contains tests written using " GTEST_NAME_ ". You can use the\n" "following command line flags to control its behavior:\n" "\n" "Test Selection:\n" " @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" " List the names of all tests instead of running them. The name of\n" " TEST(Foo, Bar) is \"Foo.Bar\".\n" " @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" "[@G-@YNEGATIVE_PATTERNS]@D\n" " Run only the tests whose name matches one of the positive patterns but\n" " none of the negative patterns. '?' matches any single character; '*'\n" " matches any substring; ':' separates two patterns.\n" " @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" " Run all disabled tests too.\n" "\n" "Test Execution:\n" " @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" " Run the tests repeatedly; use a negative count to repeat forever.\n" " @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" " Randomize tests' orders on every iteration.\n" " @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" " Random number seed to use for shuffling test orders (between 1 and\n" " 99999, or 0 to use a seed based on the current time).\n" "\n" "Test Output:\n" " @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" " Enable/disable colored output. The default is @Gauto@D.\n" " -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" " Don't print the elapsed time of each test.\n" " @G--" GTEST_FLAG_PREFIX_ "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G" GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" " Generate a JSON or XML report in the given directory or with the given\n" " file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n" # if GTEST_CAN_STREAM_RESULTS_ " @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n" " Stream test results to the given server.\n" # endif // GTEST_CAN_STREAM_RESULTS_ "\n" "Assertion Behavior:\n" # if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" " Set the default death test style.\n" # endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS " @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" " Turn assertion failures into debugger break-points.\n" " @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" " Turn assertion failures into C++ exceptions for use by an external\n" " test framework.\n" " @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0@D\n" " Do not report exceptions as test failures. Instead, allow them\n" " to crash the program or throw a pop-up (on Windows).\n" "\n" "Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " "the corresponding\n" "environment variable of a flag (all letters in upper-case). For example, to\n" "disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ "color=no@D or set\n" "the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" "\n" "For more information, please read the " GTEST_NAME_ " documentation at\n" "@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" "(not one in your own code or tests), please report it to\n" "@G<" GTEST_DEV_EMAIL_ ">@D.\n"; static bool ParseGoogleTestFlag(const char* const arg) { return ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, >EST_FLAG(also_run_disabled_tests)) || ParseBoolFlag(arg, kBreakOnFailureFlag, >EST_FLAG(break_on_failure)) || ParseBoolFlag(arg, kCatchExceptionsFlag, >EST_FLAG(catch_exceptions)) || ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || ParseStringFlag(arg, kDeathTestStyleFlag, >EST_FLAG(death_test_style)) || ParseBoolFlag(arg, kDeathTestUseFork, >EST_FLAG(death_test_use_fork)) || ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || ParseStringFlag(arg, kInternalRunDeathTestFlag, >EST_FLAG(internal_run_death_test)) || ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || ParseBoolFlag(arg, kPrintUTF8Flag, >EST_FLAG(print_utf8)) || ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || ParseInt32Flag(arg, kStackTraceDepthFlag, >EST_FLAG(stack_trace_depth)) || ParseStringFlag(arg, kStreamResultToFlag, >EST_FLAG(stream_result_to)) || ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure)); } #if GTEST_USE_OWN_FLAGFILE_FLAG_ static void LoadFlagsFromFile(const std::string& path) { FILE* flagfile = posix::FOpen(path.c_str(), "r"); if (!flagfile) { GTEST_LOG_(FATAL) << "Unable to open file \"" << GTEST_FLAG(flagfile) << "\""; } std::string contents(ReadEntireFile(flagfile)); posix::FClose(flagfile); std::vector lines; SplitString(contents, '\n', &lines); for (size_t i = 0; i < lines.size(); ++i) { if (lines[i].empty()) continue; if (!ParseGoogleTestFlag(lines[i].c_str())) g_help_flag = true; } } #endif // GTEST_USE_OWN_FLAGFILE_FLAG_ // Parses the command line for Google Test flags, without initializing // other parts of Google Test. The type parameter CharType can be // instantiated to either char or wchar_t. template void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { for (int i = 1; i < *argc; i++) { const std::string arg_string = StreamableToString(argv[i]); const char* const arg = arg_string.c_str(); using internal::ParseBoolFlag; using internal::ParseInt32Flag; using internal::ParseStringFlag; bool remove_flag = false; if (ParseGoogleTestFlag(arg)) { remove_flag = true; #if GTEST_USE_OWN_FLAGFILE_FLAG_ } else if (ParseStringFlag(arg, kFlagfileFlag, >EST_FLAG(flagfile))) { LoadFlagsFromFile(GTEST_FLAG(flagfile)); remove_flag = true; #endif // GTEST_USE_OWN_FLAGFILE_FLAG_ } else if (arg_string == "--help" || arg_string == "-h" || arg_string == "-?" || arg_string == "/?" || HasGoogleTestFlagPrefix(arg)) { // Both help flag and unrecognized Google Test flags (excluding // internal ones) trigger help display. g_help_flag = true; } if (remove_flag) { // Shift the remainder of the argv list left by one. Note // that argv has (*argc + 1) elements, the last one always being // NULL. The following loop moves the trailing NULL element as // well. for (int j = i; j != *argc; j++) { argv[j] = argv[j + 1]; } // Decrements the argument count. (*argc)--; // We also need to decrement the iterator as we just removed // an element. i--; } } if (g_help_flag) { // We print the help here instead of in RUN_ALL_TESTS(), as the // latter may not be called at all if the user is using Google // Test with another testing framework. PrintColorEncoded(kColorEncodedHelpMessage); } } // Parses the command line for Google Test flags, without initializing // other parts of Google Test. void ParseGoogleTestFlagsOnly(int* argc, char** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); // Fix the value of *_NSGetArgc() on macOS, but if and only if // *_NSGetArgv() == argv // Only applicable to char** version of argv #if GTEST_OS_MAC #ifndef GTEST_OS_IOS if (*_NSGetArgv() == argv) { *_NSGetArgc() = *argc; } #endif #endif } void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { ParseGoogleTestFlagsOnlyImpl(argc, argv); } // The internal implementation of InitGoogleTest(). // // The type parameter CharType can be instantiated to either char or // wchar_t. template void InitGoogleTestImpl(int* argc, CharType** argv) { // We don't want to run the initialization code twice. if (GTestIsInitialized()) return; if (*argc <= 0) return; g_argvs.clear(); for (int i = 0; i != *argc; i++) { g_argvs.push_back(StreamableToString(argv[i])); } #if GTEST_HAS_ABSL absl::InitializeSymbolizer(g_argvs[0].c_str()); #endif // GTEST_HAS_ABSL ParseGoogleTestFlagsOnly(argc, argv); GetUnitTestImpl()->PostFlagParsingInit(); } } // namespace internal // Initializes Google Test. This must be called before calling // RUN_ALL_TESTS(). In particular, it parses a command line for the // flags that Google Test recognizes. Whenever a Google Test flag is // seen, it is removed from argv, and *argc is decremented. // // No value is returned. Instead, the Google Test flag variables are // updated. // // Calling the function for the second time has no user-visible effect. void InitGoogleTest(int* argc, char** argv) { #if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv); #else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) internal::InitGoogleTestImpl(argc, argv); #endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) } // This overloaded version can be used in Windows programs compiled in // UNICODE mode. void InitGoogleTest(int* argc, wchar_t** argv) { #if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv); #else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) internal::InitGoogleTestImpl(argc, argv); #endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) } // This overloaded version can be used on Arduino/embedded platforms where // there is no argc/argv. void InitGoogleTest() { // Since Arduino doesn't have a command line, fake out the argc/argv arguments int argc = 1; const auto arg0 = "dummy"; char* argv0 = const_cast(arg0); char** argv = &argv0; #if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(&argc, argv); #else // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) internal::InitGoogleTestImpl(&argc, argv); #endif // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_) } std::string TempDir() { #if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_) return GTEST_CUSTOM_TEMPDIR_FUNCTION_(); #endif #if GTEST_OS_WINDOWS_MOBILE return "\\temp\\"; #elif GTEST_OS_WINDOWS const char* temp_dir = internal::posix::GetEnv("TEMP"); if (temp_dir == nullptr || temp_dir[0] == '\0') return "\\temp\\"; else if (temp_dir[strlen(temp_dir) - 1] == '\\') return temp_dir; else return std::string(temp_dir) + "\\"; #elif GTEST_OS_LINUX_ANDROID return "/sdcard/"; #else return "/tmp/"; #endif // GTEST_OS_WINDOWS_MOBILE } // Class ScopedTrace // Pushes the given source file location and message onto a per-thread // trace stack maintained by Google Test. void ScopedTrace::PushTrace(const char* file, int line, std::string message) { internal::TraceInfo trace; trace.file = file; trace.line = line; trace.message.swap(message); UnitTest::GetInstance()->PushGTestTrace(trace); } // Pops the info pushed by the c'tor. ScopedTrace::~ScopedTrace() GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) { UnitTest::GetInstance()->PopGTestTrace(); } } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest-internal-inl.h0000664000175000017500000013367613553267757017140 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Utility functions and classes used by the Google C++ testing framework.// // This file contains purely Google Test's internal implementation. Please // DO NOT #INCLUDE IT IN A USER PROGRAM. #ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ #define GTEST_SRC_GTEST_INTERNAL_INL_H_ #ifndef _WIN32_WCE # include #endif // !_WIN32_WCE #include #include // For strtoll/_strtoul64/malloc/free. #include // For memmove. #include #include #include #include #include "gtest/internal/gtest-port.h" #if GTEST_CAN_STREAM_RESULTS_ # include // NOLINT # include // NOLINT #endif #if GTEST_OS_WINDOWS # include // NOLINT #endif // GTEST_OS_WINDOWS #include "gtest/gtest.h" #include "gtest/gtest-spi.h" GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ /* class A needs to have dll-interface to be used by clients of class B */) namespace testing { // Declares the flags. // // We don't want the users to modify this flag in the code, but want // Google Test's own unit tests to be able to access it. Therefore we // declare it here as opposed to in gtest.h. GTEST_DECLARE_bool_(death_test_use_fork); namespace internal { // The value of GetTestTypeId() as seen from within the Google Test // library. This is solely for testing GetTestTypeId(). GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; // Names of the flags (needed for parsing Google Test flags). const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; const char kBreakOnFailureFlag[] = "break_on_failure"; const char kCatchExceptionsFlag[] = "catch_exceptions"; const char kColorFlag[] = "color"; const char kFilterFlag[] = "filter"; const char kListTestsFlag[] = "list_tests"; const char kOutputFlag[] = "output"; const char kPrintTimeFlag[] = "print_time"; const char kPrintUTF8Flag[] = "print_utf8"; const char kRandomSeedFlag[] = "random_seed"; const char kRepeatFlag[] = "repeat"; const char kShuffleFlag[] = "shuffle"; const char kStackTraceDepthFlag[] = "stack_trace_depth"; const char kStreamResultToFlag[] = "stream_result_to"; const char kThrowOnFailureFlag[] = "throw_on_failure"; const char kFlagfileFlag[] = "flagfile"; // A valid random seed must be in [1, kMaxRandomSeed]. const int kMaxRandomSeed = 99999; // g_help_flag is true if and only if the --help flag or an equivalent form // is specified on the command line. GTEST_API_ extern bool g_help_flag; // Returns the current time in milliseconds. GTEST_API_ TimeInMillis GetTimeInMillis(); // Returns true if and only if Google Test should use colors in the output. GTEST_API_ bool ShouldUseColor(bool stdout_is_tty); // Formats the given time in milliseconds as seconds. GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); // Converts the given time in milliseconds to a date string in the ISO 8601 // format, without the timezone information. N.B.: due to the use the // non-reentrant localtime() function, this function is not thread safe. Do // not use it in any code that can be called from multiple threads. GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms); // Parses a string for an Int32 flag, in the form of "--flag=value". // // On success, stores the value of the flag in *value, and returns // true. On failure, returns false without changing *value. GTEST_API_ bool ParseInt32Flag( const char* str, const char* flag, Int32* value); // Returns a random seed in range [1, kMaxRandomSeed] based on the // given --gtest_random_seed flag value. inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { const unsigned int raw_seed = (random_seed_flag == 0) ? static_cast(GetTimeInMillis()) : static_cast(random_seed_flag); // Normalizes the actual seed to range [1, kMaxRandomSeed] such that // it's easy to type. const int normalized_seed = static_cast((raw_seed - 1U) % static_cast(kMaxRandomSeed)) + 1; return normalized_seed; } // Returns the first valid random seed after 'seed'. The behavior is // undefined if 'seed' is invalid. The seed after kMaxRandomSeed is // considered to be 1. inline int GetNextRandomSeed(int seed) { GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) << "Invalid random seed " << seed << " - must be in [1, " << kMaxRandomSeed << "]."; const int next_seed = seed + 1; return (next_seed > kMaxRandomSeed) ? 1 : next_seed; } // This class saves the values of all Google Test flags in its c'tor, and // restores them in its d'tor. class GTestFlagSaver { public: // The c'tor. GTestFlagSaver() { also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); break_on_failure_ = GTEST_FLAG(break_on_failure); catch_exceptions_ = GTEST_FLAG(catch_exceptions); color_ = GTEST_FLAG(color); death_test_style_ = GTEST_FLAG(death_test_style); death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); filter_ = GTEST_FLAG(filter); internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); list_tests_ = GTEST_FLAG(list_tests); output_ = GTEST_FLAG(output); print_time_ = GTEST_FLAG(print_time); print_utf8_ = GTEST_FLAG(print_utf8); random_seed_ = GTEST_FLAG(random_seed); repeat_ = GTEST_FLAG(repeat); shuffle_ = GTEST_FLAG(shuffle); stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); stream_result_to_ = GTEST_FLAG(stream_result_to); throw_on_failure_ = GTEST_FLAG(throw_on_failure); } // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. ~GTestFlagSaver() { GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; GTEST_FLAG(break_on_failure) = break_on_failure_; GTEST_FLAG(catch_exceptions) = catch_exceptions_; GTEST_FLAG(color) = color_; GTEST_FLAG(death_test_style) = death_test_style_; GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; GTEST_FLAG(filter) = filter_; GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; GTEST_FLAG(list_tests) = list_tests_; GTEST_FLAG(output) = output_; GTEST_FLAG(print_time) = print_time_; GTEST_FLAG(print_utf8) = print_utf8_; GTEST_FLAG(random_seed) = random_seed_; GTEST_FLAG(repeat) = repeat_; GTEST_FLAG(shuffle) = shuffle_; GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; GTEST_FLAG(stream_result_to) = stream_result_to_; GTEST_FLAG(throw_on_failure) = throw_on_failure_; } private: // Fields for saving the original values of flags. bool also_run_disabled_tests_; bool break_on_failure_; bool catch_exceptions_; std::string color_; std::string death_test_style_; bool death_test_use_fork_; std::string filter_; std::string internal_run_death_test_; bool list_tests_; std::string output_; bool print_time_; bool print_utf8_; internal::Int32 random_seed_; internal::Int32 repeat_; bool shuffle_; internal::Int32 stack_trace_depth_; std::string stream_result_to_; bool throw_on_failure_; } GTEST_ATTRIBUTE_UNUSED_; // Converts a Unicode code point to a narrow string in UTF-8 encoding. // code_point parameter is of type UInt32 because wchar_t may not be // wide enough to contain a code point. // If the code_point is not a valid Unicode code point // (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted // to "(Invalid Unicode 0xXXXXXXXX)". GTEST_API_ std::string CodePointToUtf8(UInt32 code_point); // Converts a wide string to a narrow string in UTF-8 encoding. // The wide string is assumed to have the following encoding: // UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin) // UTF-32 if sizeof(wchar_t) == 4 (on Linux) // Parameter str points to a null-terminated wide string. // Parameter num_chars may additionally limit the number // of wchar_t characters processed. -1 is used when the entire string // should be processed. // If the string contains code points that are not valid Unicode code points // (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output // as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding // and contains invalid UTF-16 surrogate pairs, values in those pairs // will be encoded as individual Unicode characters from Basic Normal Plane. GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars); // Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file // if the variable is present. If a file already exists at this location, this // function will write over it. If the variable is present, but the file cannot // be created, prints an error and exits. void WriteToShardStatusFileIfNeeded(); // Checks whether sharding is enabled by examining the relevant // environment variable values. If the variables are present, // but inconsistent (e.g., shard_index >= total_shards), prints // an error and exits. If in_subprocess_for_death_test, sharding is // disabled because it must only be applied to the original test // process. Otherwise, we could filter out death tests we intended to execute. GTEST_API_ bool ShouldShard(const char* total_shards_str, const char* shard_index_str, bool in_subprocess_for_death_test); // Parses the environment variable var as an Int32. If it is unset, // returns default_val. If it is not an Int32, prints an error and // and aborts. GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); // Given the total number of shards, the shard index, and the test id, // returns true if and only if the test should be run on this shard. The test id // is some arbitrary but unique non-negative integer assigned to each test // method. Assumes that 0 <= shard_index < total_shards. GTEST_API_ bool ShouldRunTestOnShard( int total_shards, int shard_index, int test_id); // STL container utilities. // Returns the number of elements in the given container that satisfy // the given predicate. template inline int CountIf(const Container& c, Predicate predicate) { // Implemented as an explicit loop since std::count_if() in libCstd on // Solaris has a non-standard signature. int count = 0; for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) { if (predicate(*it)) ++count; } return count; } // Applies a function/functor to each element in the container. template void ForEach(const Container& c, Functor functor) { std::for_each(c.begin(), c.end(), functor); } // Returns the i-th element of the vector, or default_value if i is not // in range [0, v.size()). template inline E GetElementOr(const std::vector& v, int i, E default_value) { return (i < 0 || i >= static_cast(v.size())) ? default_value : v[static_cast(i)]; } // Performs an in-place shuffle of a range of the vector's elements. // 'begin' and 'end' are element indices as an STL-style range; // i.e. [begin, end) are shuffled, where 'end' == size() means to // shuffle to the end of the vector. template void ShuffleRange(internal::Random* random, int begin, int end, std::vector* v) { const int size = static_cast(v->size()); GTEST_CHECK_(0 <= begin && begin <= size) << "Invalid shuffle range start " << begin << ": must be in range [0, " << size << "]."; GTEST_CHECK_(begin <= end && end <= size) << "Invalid shuffle range finish " << end << ": must be in range [" << begin << ", " << size << "]."; // Fisher-Yates shuffle, from // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle for (int range_width = end - begin; range_width >= 2; range_width--) { const int last_in_range = begin + range_width - 1; const int selected = begin + static_cast(random->Generate(static_cast(range_width))); std::swap((*v)[static_cast(selected)], (*v)[static_cast(last_in_range)]); } } // Performs an in-place shuffle of the vector's elements. template inline void Shuffle(internal::Random* random, std::vector* v) { ShuffleRange(random, 0, static_cast(v->size()), v); } // A function for deleting an object. Handy for being used as a // functor. template static void Delete(T* x) { delete x; } // A predicate that checks the key of a TestProperty against a known key. // // TestPropertyKeyIs is copyable. class TestPropertyKeyIs { public: // Constructor. // // TestPropertyKeyIs has NO default constructor. explicit TestPropertyKeyIs(const std::string& key) : key_(key) {} // Returns true if and only if the test name of test property matches on key_. bool operator()(const TestProperty& test_property) const { return test_property.key() == key_; } private: std::string key_; }; // Class UnitTestOptions. // // This class contains functions for processing options the user // specifies when running the tests. It has only static members. // // In most cases, the user can specify an option using either an // environment variable or a command line flag. E.g. you can set the // test filter using either GTEST_FILTER or --gtest_filter. If both // the variable and the flag are present, the latter overrides the // former. class GTEST_API_ UnitTestOptions { public: // Functions for processing the gtest_output flag. // Returns the output format, or "" for normal printed output. static std::string GetOutputFormat(); // Returns the absolute path of the requested output file, or the // default (test_detail.xml in the original working directory) if // none was explicitly specified. static std::string GetAbsolutePathToOutputFile(); // Functions for processing the gtest_filter flag. // Returns true if and only if the wildcard pattern matches the string. // The first ':' or '\0' character in pattern marks the end of it. // // This recursive algorithm isn't very efficient, but is clear and // works well enough for matching test names, which are short. static bool PatternMatchesString(const char *pattern, const char *str); // Returns true if and only if the user-specified filter matches the test // suite name and the test name. static bool FilterMatchesTest(const std::string& test_suite_name, const std::string& test_name); #if GTEST_OS_WINDOWS // Function for supporting the gtest_catch_exception flag. // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. // This function is useful as an __except condition. static int GTestShouldProcessSEH(DWORD exception_code); #endif // GTEST_OS_WINDOWS // Returns true if "name" matches the ':' separated list of glob-style // filters in "filter". static bool MatchesFilter(const std::string& name, const char* filter); }; // Returns the current application's name, removing directory path if that // is present. Used by UnitTestOptions::GetOutputFile. GTEST_API_ FilePath GetCurrentExecutableName(); // The role interface for getting the OS stack trace as a string. class OsStackTraceGetterInterface { public: OsStackTraceGetterInterface() {} virtual ~OsStackTraceGetterInterface() {} // Returns the current OS stack trace as an std::string. Parameters: // // max_depth - the maximum number of stack frames to be included // in the trace. // skip_count - the number of top frames to be skipped; doesn't count // against max_depth. virtual std::string CurrentStackTrace(int max_depth, int skip_count) = 0; // UponLeavingGTest() should be called immediately before Google Test calls // user code. It saves some information about the current stack that // CurrentStackTrace() will use to find and hide Google Test stack frames. virtual void UponLeavingGTest() = 0; // This string is inserted in place of stack frames that are part of // Google Test's implementation. static const char* const kElidedFramesMarker; private: GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); }; // A working implementation of the OsStackTraceGetterInterface interface. class OsStackTraceGetter : public OsStackTraceGetterInterface { public: OsStackTraceGetter() {} std::string CurrentStackTrace(int max_depth, int skip_count) override; void UponLeavingGTest() override; private: #if GTEST_HAS_ABSL Mutex mutex_; // Protects all internal state. // We save the stack frame below the frame that calls user code. // We do this because the address of the frame immediately below // the user code changes between the call to UponLeavingGTest() // and any calls to the stack trace code from within the user code. void* caller_frame_ = nullptr; #endif // GTEST_HAS_ABSL GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); }; // Information about a Google Test trace point. struct TraceInfo { const char* file; int line; std::string message; }; // This is the default global test part result reporter used in UnitTestImpl. // This class should only be used by UnitTestImpl. class DefaultGlobalTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. Reports the test part // result in the current test. void ReportTestPartResult(const TestPartResult& result) override; private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); }; // This is the default per thread test part result reporter used in // UnitTestImpl. This class should only be used by UnitTestImpl. class DefaultPerThreadTestPartResultReporter : public TestPartResultReporterInterface { public: explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); // Implements the TestPartResultReporterInterface. The implementation just // delegates to the current global test part result reporter of *unit_test_. void ReportTestPartResult(const TestPartResult& result) override; private: UnitTestImpl* const unit_test_; GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); }; // The private implementation of the UnitTest class. We don't protect // the methods under a mutex, as this class is not accessible by a // user and the UnitTest class that delegates work to this class does // proper locking. class GTEST_API_ UnitTestImpl { public: explicit UnitTestImpl(UnitTest* parent); virtual ~UnitTestImpl(); // There are two different ways to register your own TestPartResultReporter. // You can register your own repoter to listen either only for test results // from the current thread or for results from all threads. // By default, each per-thread test result repoter just passes a new // TestPartResult to the global test result reporter, which registers the // test part result for the currently running test. // Returns the global test part result reporter. TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); // Sets the global test part result reporter. void SetGlobalTestPartResultReporter( TestPartResultReporterInterface* reporter); // Returns the test part result reporter for the current thread. TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); // Sets the test part result reporter for the current thread. void SetTestPartResultReporterForCurrentThread( TestPartResultReporterInterface* reporter); // Gets the number of successful test suites. int successful_test_suite_count() const; // Gets the number of failed test suites. int failed_test_suite_count() const; // Gets the number of all test suites. int total_test_suite_count() const; // Gets the number of all test suites that contain at least one test // that should run. int test_suite_to_run_count() const; // Gets the number of successful tests. int successful_test_count() const; // Gets the number of skipped tests. int skipped_test_count() const; // Gets the number of failed tests. int failed_test_count() const; // Gets the number of disabled tests that will be reported in the XML report. int reportable_disabled_test_count() const; // Gets the number of disabled tests. int disabled_test_count() const; // Gets the number of tests to be printed in the XML report. int reportable_test_count() const; // Gets the number of all tests. int total_test_count() const; // Gets the number of tests that should run. int test_to_run_count() const; // Gets the time of the test program start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp() const { return start_timestamp_; } // Gets the elapsed time, in milliseconds. TimeInMillis elapsed_time() const { return elapsed_time_; } // Returns true if and only if the unit test passed (i.e. all test suites // passed). bool Passed() const { return !Failed(); } // Returns true if and only if the unit test failed (i.e. some test suite // failed or something outside of all tests failed). bool Failed() const { return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed(); } // Gets the i-th test suite among all the test suites. i can range from 0 to // total_test_suite_count() - 1. If i is not in that range, returns NULL. const TestSuite* GetTestSuite(int i) const { const int index = GetElementOr(test_suite_indices_, i, -1); return index < 0 ? nullptr : test_suites_[static_cast(i)]; } // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ const TestCase* GetTestCase(int i) const { return GetTestSuite(i); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Gets the i-th test suite among all the test suites. i can range from 0 to // total_test_suite_count() - 1. If i is not in that range, returns NULL. TestSuite* GetMutableSuiteCase(int i) { const int index = GetElementOr(test_suite_indices_, i, -1); return index < 0 ? nullptr : test_suites_[static_cast(index)]; } // Provides access to the event listener list. TestEventListeners* listeners() { return &listeners_; } // Returns the TestResult for the test that's currently running, or // the TestResult for the ad hoc test if no test is running. TestResult* current_test_result(); // Returns the TestResult for the ad hoc test. const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } // Sets the OS stack trace getter. // // Does nothing if the input and the current OS stack trace getter // are the same; otherwise, deletes the old getter and makes the // input the current getter. void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); // Returns the current OS stack trace getter if it is not NULL; // otherwise, creates an OsStackTraceGetter, makes it the current // getter, and returns it. OsStackTraceGetterInterface* os_stack_trace_getter(); // Returns the current OS stack trace as an std::string. // // The maximum number of stack frames to be included is specified by // the gtest_stack_trace_depth flag. The skip_count parameter // specifies the number of top frames to be skipped, which doesn't // count against the number of frames to be included. // // For example, if Foo() calls Bar(), which in turn calls // CurrentOsStackTraceExceptTop(1), Foo() will be included in the // trace but Bar() and CurrentOsStackTraceExceptTop() won't. std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_; // Finds and returns a TestSuite with the given name. If one doesn't // exist, creates one and returns it. // // Arguments: // // test_suite_name: name of the test suite // type_param: the name of the test's type parameter, or NULL if // this is not a typed or a type-parameterized test. // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc); // Legacy API is deprecated but still available #ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ TestCase* GetTestCase(const char* test_case_name, const char* type_param, internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc) { return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc); } #endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ // Adds a TestInfo to the unit test. // // Arguments: // // set_up_tc: pointer to the function that sets up the test suite // tear_down_tc: pointer to the function that tears down the test suite // test_info: the TestInfo object void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc, internal::TearDownTestSuiteFunc tear_down_tc, TestInfo* test_info) { // In order to support thread-safe death tests, we need to // remember the original working directory when the test program // was first invoked. We cannot do this in RUN_ALL_TESTS(), as // the user may have changed the current directory before calling // RUN_ALL_TESTS(). Therefore we capture the current directory in // AddTestInfo(), which is called to register a TEST or TEST_F // before main() is reached. if (original_working_dir_.IsEmpty()) { original_working_dir_.Set(FilePath::GetCurrentDir()); GTEST_CHECK_(!original_working_dir_.IsEmpty()) << "Failed to get the current working directory."; } GetTestSuite(test_info->test_suite_name(), test_info->type_param(), set_up_tc, tear_down_tc) ->AddTestInfo(test_info); } // Returns ParameterizedTestSuiteRegistry object used to keep track of // value-parameterized tests and instantiate and register them. internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() { return parameterized_test_registry_; } // Sets the TestSuite object for the test that's currently running. void set_current_test_suite(TestSuite* a_current_test_suite) { current_test_suite_ = a_current_test_suite; } // Sets the TestInfo object for the test that's currently running. If // current_test_info is NULL, the assertion results will be stored in // ad_hoc_test_result_. void set_current_test_info(TestInfo* a_current_test_info) { current_test_info_ = a_current_test_info; } // Registers all parameterized tests defined using TEST_P and // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter // combination. This method can be called more then once; it has guards // protecting from registering the tests more then once. If // value-parameterized tests are disabled, RegisterParameterizedTests is // present but does nothing. void RegisterParameterizedTests(); // Runs all tests in this UnitTest object, prints the result, and // returns true if all tests are successful. If any exception is // thrown during a test, this test is considered to be failed, but // the rest of the tests will still be run. bool RunAllTests(); // Clears the results of all tests, except the ad hoc tests. void ClearNonAdHocTestResult() { ForEach(test_suites_, TestSuite::ClearTestSuiteResult); } // Clears the results of ad-hoc test assertions. void ClearAdHocTestResult() { ad_hoc_test_result_.Clear(); } // Adds a TestProperty to the current TestResult object when invoked in a // context of a test or a test suite, or to the global property set. If the // result already contains a property with the same key, the value will be // updated. void RecordProperty(const TestProperty& test_property); enum ReactionToSharding { HONOR_SHARDING_PROTOCOL, IGNORE_SHARDING_PROTOCOL }; // Matches the full name of each test against the user-specified // filter to decide whether the test should run, then records the // result in each TestSuite and TestInfo object. // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests // based on sharding variables in the environment. // Returns the number of tests that should run. int FilterTests(ReactionToSharding shard_tests); // Prints the names of the tests matching the user-specified filter flag. void ListTestsMatchingFilter(); const TestSuite* current_test_suite() const { return current_test_suite_; } TestInfo* current_test_info() { return current_test_info_; } const TestInfo* current_test_info() const { return current_test_info_; } // Returns the vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector& environments() { return environments_; } // Getters for the per-thread Google Test trace stack. std::vector& gtest_trace_stack() { return *(gtest_trace_stack_.pointer()); } const std::vector& gtest_trace_stack() const { return gtest_trace_stack_.get(); } #if GTEST_HAS_DEATH_TEST void InitDeathTestSubprocessControlInfo() { internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); } // Returns a pointer to the parsed --gtest_internal_run_death_test // flag, or NULL if that flag was not specified. // This information is useful only in a death test child process. // Must not be called before a call to InitGoogleTest. const InternalRunDeathTestFlag* internal_run_death_test_flag() const { return internal_run_death_test_flag_.get(); } // Returns a pointer to the current death test factory. internal::DeathTestFactory* death_test_factory() { return death_test_factory_.get(); } void SuppressTestEventsIfInSubprocess(); friend class ReplaceDeathTestFactory; #endif // GTEST_HAS_DEATH_TEST // Initializes the event listener performing XML output as specified by // UnitTestOptions. Must not be called before InitGoogleTest. void ConfigureXmlOutput(); #if GTEST_CAN_STREAM_RESULTS_ // Initializes the event listener for streaming test results to a socket. // Must not be called before InitGoogleTest. void ConfigureStreamingOutput(); #endif // Performs initialization dependent upon flag values obtained in // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest // this function is also called from RunAllTests. Since this function can be // called more than once, it has to be idempotent. void PostFlagParsingInit(); // Gets the random seed used at the start of the current test iteration. int random_seed() const { return random_seed_; } // Gets the random number generator. internal::Random* random() { return &random_; } // Shuffles all test suites, and the tests within each test suite, // making sure that death tests are still run first. void ShuffleTests(); // Restores the test suites and tests to their order before the first shuffle. void UnshuffleTests(); // Returns the value of GTEST_FLAG(catch_exceptions) at the moment // UnitTest::Run() starts. bool catch_exceptions() const { return catch_exceptions_; } private: friend class ::testing::UnitTest; // Used by UnitTest::Run() to capture the state of // GTEST_FLAG(catch_exceptions) at the moment it starts. void set_catch_exceptions(bool value) { catch_exceptions_ = value; } // The UnitTest object that owns this implementation object. UnitTest* const parent_; // The working directory when the first TEST() or TEST_F() was // executed. internal::FilePath original_working_dir_; // The default test part result reporters. DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; DefaultPerThreadTestPartResultReporter default_per_thread_test_part_result_reporter_; // Points to (but doesn't own) the global test part result reporter. TestPartResultReporterInterface* global_test_part_result_repoter_; // Protects read and write access to global_test_part_result_reporter_. internal::Mutex global_test_part_result_reporter_mutex_; // Points to (but doesn't own) the per-thread test part result reporter. internal::ThreadLocal per_thread_test_part_result_reporter_; // The vector of environments that need to be set-up/torn-down // before/after the tests are run. std::vector environments_; // The vector of TestSuites in their original order. It owns the // elements in the vector. std::vector test_suites_; // Provides a level of indirection for the test suite list to allow // easy shuffling and restoring the test suite order. The i-th // element of this vector is the index of the i-th test suite in the // shuffled order. std::vector test_suite_indices_; // ParameterizedTestRegistry object used to register value-parameterized // tests. internal::ParameterizedTestSuiteRegistry parameterized_test_registry_; // Indicates whether RegisterParameterizedTests() has been called already. bool parameterized_tests_registered_; // Index of the last death test suite registered. Initially -1. int last_death_test_suite_; // This points to the TestSuite for the currently running test. It // changes as Google Test goes through one test suite after another. // When no test is running, this is set to NULL and Google Test // stores assertion results in ad_hoc_test_result_. Initially NULL. TestSuite* current_test_suite_; // This points to the TestInfo for the currently running test. It // changes as Google Test goes through one test after another. When // no test is running, this is set to NULL and Google Test stores // assertion results in ad_hoc_test_result_. Initially NULL. TestInfo* current_test_info_; // Normally, a user only writes assertions inside a TEST or TEST_F, // or inside a function called by a TEST or TEST_F. Since Google // Test keeps track of which test is current running, it can // associate such an assertion with the test it belongs to. // // If an assertion is encountered when no TEST or TEST_F is running, // Google Test attributes the assertion result to an imaginary "ad hoc" // test, and records the result in ad_hoc_test_result_. TestResult ad_hoc_test_result_; // The list of event listeners that can be used to track events inside // Google Test. TestEventListeners listeners_; // The OS stack trace getter. Will be deleted when the UnitTest // object is destructed. By default, an OsStackTraceGetter is used, // but the user can set this field to use a custom getter if that is // desired. OsStackTraceGetterInterface* os_stack_trace_getter_; // True if and only if PostFlagParsingInit() has been called. bool post_flag_parse_init_performed_; // The random number seed used at the beginning of the test run. int random_seed_; // Our random number generator. internal::Random random_; // The time of the test program start, in ms from the start of the // UNIX epoch. TimeInMillis start_timestamp_; // How long the test took to run, in milliseconds. TimeInMillis elapsed_time_; #if GTEST_HAS_DEATH_TEST // The decomposed components of the gtest_internal_run_death_test flag, // parsed when RUN_ALL_TESTS is called. std::unique_ptr internal_run_death_test_flag_; std::unique_ptr death_test_factory_; #endif // GTEST_HAS_DEATH_TEST // A per-thread stack of traces created by the SCOPED_TRACE() macro. internal::ThreadLocal > gtest_trace_stack_; // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests() // starts. bool catch_exceptions_; GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); }; // class UnitTestImpl // Convenience function for accessing the global UnitTest // implementation object. inline UnitTestImpl* GetUnitTestImpl() { return UnitTest::GetInstance()->impl(); } #if GTEST_USES_SIMPLE_RE // Internal helper functions for implementing the simple regular // expression matcher. GTEST_API_ bool IsInSet(char ch, const char* str); GTEST_API_ bool IsAsciiDigit(char ch); GTEST_API_ bool IsAsciiPunct(char ch); GTEST_API_ bool IsRepeat(char ch); GTEST_API_ bool IsAsciiWhiteSpace(char ch); GTEST_API_ bool IsAsciiWordChar(char ch); GTEST_API_ bool IsValidEscape(char ch); GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); GTEST_API_ bool ValidateRegex(const char* regex); GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); GTEST_API_ bool MatchRepetitionAndRegexAtHead( bool escaped, char ch, char repeat, const char* regex, const char* str); GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); #endif // GTEST_USES_SIMPLE_RE // Parses the command line for Google Test flags, without initializing // other parts of Google Test. GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); #if GTEST_HAS_DEATH_TEST // Returns the message describing the last system error, regardless of the // platform. GTEST_API_ std::string GetLastErrnoDescription(); // Attempts to parse a string into a positive integer pointed to by the // number parameter. Returns true if that is possible. // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use // it here. template bool ParseNaturalNumber(const ::std::string& str, Integer* number) { // Fail fast if the given string does not begin with a digit; // this bypasses strtoXXX's "optional leading whitespace and plus // or minus sign" semantics, which are undesirable here. if (str.empty() || !IsDigit(str[0])) { return false; } errno = 0; char* end; // BiggestConvertible is the largest integer type that system-provided // string-to-number conversion routines can return. # if GTEST_OS_WINDOWS && !defined(__GNUC__) // MSVC and C++ Builder define __int64 instead of the standard long long. typedef unsigned __int64 BiggestConvertible; const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); # else typedef unsigned long long BiggestConvertible; // NOLINT const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); # endif // GTEST_OS_WINDOWS && !defined(__GNUC__) const bool parse_success = *end == '\0' && errno == 0; GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); const Integer result = static_cast(parsed); if (parse_success && static_cast(result) == parsed) { *number = result; return true; } return false; } #endif // GTEST_HAS_DEATH_TEST // TestResult contains some private methods that should be hidden from // Google Test user but are required for testing. This class allow our tests // to access them. // // This class is supplied only for the purpose of testing Google Test's own // constructs. Do not use it in user tests, either directly or indirectly. class TestResultAccessor { public: static void RecordProperty(TestResult* test_result, const std::string& xml_element, const TestProperty& property) { test_result->RecordProperty(xml_element, property); } static void ClearTestPartResults(TestResult* test_result) { test_result->ClearTestPartResults(); } static const std::vector& test_part_results( const TestResult& test_result) { return test_result.test_part_results(); } }; #if GTEST_CAN_STREAM_RESULTS_ // Streams test results to the given port on the given host machine. class StreamingListener : public EmptyTestEventListener { public: // Abstract base class for writing strings to a socket. class AbstractSocketWriter { public: virtual ~AbstractSocketWriter() {} // Sends a string to the socket. virtual void Send(const std::string& message) = 0; // Closes the socket. virtual void CloseConnection() {} // Sends a string and a newline to the socket. void SendLn(const std::string& message) { Send(message + "\n"); } }; // Concrete class for actually writing strings to a socket. class SocketWriter : public AbstractSocketWriter { public: SocketWriter(const std::string& host, const std::string& port) : sockfd_(-1), host_name_(host), port_num_(port) { MakeConnection(); } ~SocketWriter() override { if (sockfd_ != -1) CloseConnection(); } // Sends a string to the socket. void Send(const std::string& message) override { GTEST_CHECK_(sockfd_ != -1) << "Send() can be called only when there is a connection."; const auto len = static_cast(message.length()); if (write(sockfd_, message.c_str(), len) != static_cast(len)) { GTEST_LOG_(WARNING) << "stream_result_to: failed to stream to " << host_name_ << ":" << port_num_; } } private: // Creates a client socket and connects to the server. void MakeConnection(); // Closes the socket. void CloseConnection() override { GTEST_CHECK_(sockfd_ != -1) << "CloseConnection() can be called only when there is a connection."; close(sockfd_); sockfd_ = -1; } int sockfd_; // socket file descriptor const std::string host_name_; const std::string port_num_; GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter); }; // class SocketWriter // Escapes '=', '&', '%', and '\n' characters in str as "%xx". static std::string UrlEncode(const char* str); StreamingListener(const std::string& host, const std::string& port) : socket_writer_(new SocketWriter(host, port)) { Start(); } explicit StreamingListener(AbstractSocketWriter* socket_writer) : socket_writer_(socket_writer) { Start(); } void OnTestProgramStart(const UnitTest& /* unit_test */) override { SendLn("event=TestProgramStart"); } void OnTestProgramEnd(const UnitTest& unit_test) override { // Note that Google Test current only report elapsed time for each // test iteration, not for the entire test program. SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed())); // Notify the streaming server to stop. socket_writer_->CloseConnection(); } void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) override { SendLn("event=TestIterationStart&iteration=" + StreamableToString(iteration)); } void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) override { SendLn("event=TestIterationEnd&passed=" + FormatBool(unit_test.Passed()) + "&elapsed_time=" + StreamableToString(unit_test.elapsed_time()) + "ms"); } // Note that "event=TestCaseStart" is a wire format and has to remain // "case" for compatibilty void OnTestCaseStart(const TestCase& test_case) override { SendLn(std::string("event=TestCaseStart&name=") + test_case.name()); } // Note that "event=TestCaseEnd" is a wire format and has to remain // "case" for compatibilty void OnTestCaseEnd(const TestCase& test_case) override { SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) + "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) + "ms"); } void OnTestStart(const TestInfo& test_info) override { SendLn(std::string("event=TestStart&name=") + test_info.name()); } void OnTestEnd(const TestInfo& test_info) override { SendLn("event=TestEnd&passed=" + FormatBool((test_info.result())->Passed()) + "&elapsed_time=" + StreamableToString((test_info.result())->elapsed_time()) + "ms"); } void OnTestPartResult(const TestPartResult& test_part_result) override { const char* file_name = test_part_result.file_name(); if (file_name == nullptr) file_name = ""; SendLn("event=TestPartResult&file=" + UrlEncode(file_name) + "&line=" + StreamableToString(test_part_result.line_number()) + "&message=" + UrlEncode(test_part_result.message())); } private: // Sends the given message and a newline to the socket. void SendLn(const std::string& message) { socket_writer_->SendLn(message); } // Called at the start of streaming to notify the receiver what // protocol we are using. void Start() { SendLn("gtest_streaming_protocol_version=1.0"); } std::string FormatBool(bool value) { return value ? "1" : "0"; } const std::unique_ptr socket_writer_; GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener); }; // class StreamingListener #endif // GTEST_CAN_STREAM_RESULTS_ } // namespace internal } // namespace testing GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 #endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ dvisvgm-2.8.1/tests/gtest/src/gtest-filepath.cc0000664000175000017500000003364013553267757016464 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "gtest/internal/gtest-filepath.h" #include #include "gtest/internal/gtest-port.h" #include "gtest/gtest-message.h" #if GTEST_OS_WINDOWS_MOBILE # include #elif GTEST_OS_WINDOWS # include # include #else # include # include // Some Linux distributions define PATH_MAX here. #endif // GTEST_OS_WINDOWS_MOBILE #include "gtest/internal/gtest-string.h" #if GTEST_OS_WINDOWS # define GTEST_PATH_MAX_ _MAX_PATH #elif defined(PATH_MAX) # define GTEST_PATH_MAX_ PATH_MAX #elif defined(_XOPEN_PATH_MAX) # define GTEST_PATH_MAX_ _XOPEN_PATH_MAX #else # define GTEST_PATH_MAX_ _POSIX_PATH_MAX #endif // GTEST_OS_WINDOWS namespace testing { namespace internal { #if GTEST_OS_WINDOWS // On Windows, '\\' is the standard path separator, but many tools and the // Windows API also accept '/' as an alternate path separator. Unless otherwise // noted, a file path can contain either kind of path separators, or a mixture // of them. const char kPathSeparator = '\\'; const char kAlternatePathSeparator = '/'; const char kAlternatePathSeparatorString[] = "/"; # if GTEST_OS_WINDOWS_MOBILE // Windows CE doesn't have a current directory. You should not use // the current directory in tests on Windows CE, but this at least // provides a reasonable fallback. const char kCurrentDirectoryString[] = "\\"; // Windows CE doesn't define INVALID_FILE_ATTRIBUTES const DWORD kInvalidFileAttributes = 0xffffffff; # else const char kCurrentDirectoryString[] = ".\\"; # endif // GTEST_OS_WINDOWS_MOBILE #else const char kPathSeparator = '/'; const char kCurrentDirectoryString[] = "./"; #endif // GTEST_OS_WINDOWS // Returns whether the given character is a valid path separator. static bool IsPathSeparator(char c) { #if GTEST_HAS_ALT_PATH_SEP_ return (c == kPathSeparator) || (c == kAlternatePathSeparator); #else return c == kPathSeparator; #endif } // Returns the current working directory, or "" if unsuccessful. FilePath FilePath::GetCurrentDir() { #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \ GTEST_OS_WINDOWS_RT || ARDUINO || defined(ESP_PLATFORM) // These platforms do not have a current directory, so we just return // something reasonable. return FilePath(kCurrentDirectoryString); #elif GTEST_OS_WINDOWS char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd); #else char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; char* result = getcwd(cwd, sizeof(cwd)); # if GTEST_OS_NACL // getcwd will likely fail in NaCl due to the sandbox, so return something // reasonable. The user may have provided a shim implementation for getcwd, // however, so fallback only when failure is detected. return FilePath(result == nullptr ? kCurrentDirectoryString : cwd); # endif // GTEST_OS_NACL return FilePath(result == nullptr ? "" : cwd); #endif // GTEST_OS_WINDOWS_MOBILE } // Returns a copy of the FilePath with the case-insensitive extension removed. // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns // FilePath("dir/file"). If a case-insensitive extension is not // found, returns a copy of the original FilePath. FilePath FilePath::RemoveExtension(const char* extension) const { const std::string dot_extension = std::string(".") + extension; if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) { return FilePath(pathname_.substr( 0, pathname_.length() - dot_extension.length())); } return *this; } // Returns a pointer to the last occurrence of a valid path separator in // the FilePath. On Windows, for example, both '/' and '\' are valid path // separators. Returns NULL if no path separator was found. const char* FilePath::FindLastPathSeparator() const { const char* const last_sep = strrchr(c_str(), kPathSeparator); #if GTEST_HAS_ALT_PATH_SEP_ const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); // Comparing two pointers of which only one is NULL is undefined. if (last_alt_sep != nullptr && (last_sep == nullptr || last_alt_sep > last_sep)) { return last_alt_sep; } #endif return last_sep; } // Returns a copy of the FilePath with the directory part removed. // Example: FilePath("path/to/file").RemoveDirectoryName() returns // FilePath("file"). If there is no directory part ("just_a_file"), it returns // the FilePath unmodified. If there is no file part ("just_a_dir/") it // returns an empty FilePath (""). // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveDirectoryName() const { const char* const last_sep = FindLastPathSeparator(); return last_sep ? FilePath(last_sep + 1) : *this; } // RemoveFileName returns the directory path with the filename removed. // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". // If the FilePath is "a_file" or "/a_file", RemoveFileName returns // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does // not have a file, like "just/a/dir/", it returns the FilePath unmodified. // On Windows platform, '\' is the path separator, otherwise it is '/'. FilePath FilePath::RemoveFileName() const { const char* const last_sep = FindLastPathSeparator(); std::string dir; if (last_sep) { dir = std::string(c_str(), static_cast(last_sep + 1 - c_str())); } else { dir = kCurrentDirectoryString; } return FilePath(dir); } // Helper functions for naming files in a directory for xml output. // Given directory = "dir", base_name = "test", number = 0, // extension = "xml", returns "dir/test.xml". If number is greater // than zero (e.g., 12), returns "dir/test_12.xml". // On Windows platform, uses \ as the separator rather than /. FilePath FilePath::MakeFileName(const FilePath& directory, const FilePath& base_name, int number, const char* extension) { std::string file; if (number == 0) { file = base_name.string() + "." + extension; } else { file = base_name.string() + "_" + StreamableToString(number) + "." + extension; } return ConcatPaths(directory, FilePath(file)); } // Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". // On Windows, uses \ as the separator rather than /. FilePath FilePath::ConcatPaths(const FilePath& directory, const FilePath& relative_path) { if (directory.IsEmpty()) return relative_path; const FilePath dir(directory.RemoveTrailingPathSeparator()); return FilePath(dir.string() + kPathSeparator + relative_path.string()); } // Returns true if pathname describes something findable in the file-system, // either a file, directory, or whatever. bool FilePath::FileOrDirectoryExists() const { #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; return attributes != kInvalidFileAttributes; #else posix::StatStruct file_stat; return posix::Stat(pathname_.c_str(), &file_stat) == 0; #endif // GTEST_OS_WINDOWS_MOBILE } // Returns true if pathname describes a directory in the file-system // that exists. bool FilePath::DirectoryExists() const { bool result = false; #if GTEST_OS_WINDOWS // Don't strip off trailing separator if path is a root directory on // Windows (like "C:\\"). const FilePath& path(IsRootDirectory() ? *this : RemoveTrailingPathSeparator()); #else const FilePath& path(*this); #endif #if GTEST_OS_WINDOWS_MOBILE LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); const DWORD attributes = GetFileAttributes(unicode); delete [] unicode; if ((attributes != kInvalidFileAttributes) && (attributes & FILE_ATTRIBUTE_DIRECTORY)) { result = true; } #else posix::StatStruct file_stat; result = posix::Stat(path.c_str(), &file_stat) == 0 && posix::IsDir(file_stat); #endif // GTEST_OS_WINDOWS_MOBILE return result; } // Returns true if pathname describes a root directory. (Windows has one // root directory per disk drive.) bool FilePath::IsRootDirectory() const { #if GTEST_OS_WINDOWS return pathname_.length() == 3 && IsAbsolutePath(); #else return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); #endif } // Returns true if pathname describes an absolute path. bool FilePath::IsAbsolutePath() const { const char* const name = pathname_.c_str(); #if GTEST_OS_WINDOWS return pathname_.length() >= 3 && ((name[0] >= 'a' && name[0] <= 'z') || (name[0] >= 'A' && name[0] <= 'Z')) && name[1] == ':' && IsPathSeparator(name[2]); #else return IsPathSeparator(name[0]); #endif } // Returns a pathname for a file that does not currently exist. The pathname // will be directory/base_name.extension or // directory/base_name_.extension if directory/base_name.extension // already exists. The number will be incremented until a pathname is found // that does not already exist. // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. // There could be a race condition if two or more processes are calling this // function at the same time -- they could both pick the same filename. FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, const FilePath& base_name, const char* extension) { FilePath full_pathname; int number = 0; do { full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); } while (full_pathname.FileOrDirectoryExists()); return full_pathname; } // Returns true if FilePath ends with a path separator, which indicates that // it is intended to represent a directory. Returns false otherwise. // This does NOT check that a directory (or file) actually exists. bool FilePath::IsDirectory() const { return !pathname_.empty() && IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); } // Create directories so that path exists. Returns true if successful or if // the directories already exist; returns false if unable to create directories // for any reason. bool FilePath::CreateDirectoriesRecursively() const { if (!this->IsDirectory()) { return false; } if (pathname_.length() == 0 || this->DirectoryExists()) { return true; } const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); return parent.CreateDirectoriesRecursively() && this->CreateFolder(); } // Create the directory so that path exists. Returns true if successful or // if the directory already exists; returns false if unable to create the // directory for any reason, including if the parent directory does not // exist. Not named "CreateDirectory" because that's a macro on Windows. bool FilePath::CreateFolder() const { #if GTEST_OS_WINDOWS_MOBILE FilePath removed_sep(this->RemoveTrailingPathSeparator()); LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); int result = CreateDirectory(unicode, nullptr) ? 0 : -1; delete [] unicode; #elif GTEST_OS_WINDOWS int result = _mkdir(pathname_.c_str()); #else int result = mkdir(pathname_.c_str(), 0777); #endif // GTEST_OS_WINDOWS_MOBILE if (result == -1) { return this->DirectoryExists(); // An error is OK if the directory exists. } return true; // No error. } // If input name has a trailing separator character, remove it and return the // name, otherwise return the name string unmodified. // On Windows platform, uses \ as the separator, other platforms use /. FilePath FilePath::RemoveTrailingPathSeparator() const { return IsDirectory() ? FilePath(pathname_.substr(0, pathname_.length() - 1)) : *this; } // Removes any redundant separators that might be in the pathname. // For example, "bar///foo" becomes "bar/foo". Does not eliminate other // redundancies that might be in a pathname involving "." or "..". void FilePath::Normalize() { if (pathname_.c_str() == nullptr) { pathname_ = ""; return; } const char* src = pathname_.c_str(); char* const dest = new char[pathname_.length() + 1]; char* dest_ptr = dest; memset(dest_ptr, 0, pathname_.length() + 1); while (*src != '\0') { *dest_ptr = *src; if (!IsPathSeparator(*src)) { src++; } else { #if GTEST_HAS_ALT_PATH_SEP_ if (*dest_ptr == kAlternatePathSeparator) { *dest_ptr = kPathSeparator; } #endif while (IsPathSeparator(*src)) src++; } dest_ptr++; } *dest_ptr = '\0'; pathname_ = dest; delete[] dest; } } // namespace internal } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest-all.cc0000664000175000017500000000416013553267757015433 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Google C++ Testing and Mocking Framework (Google Test) // // Sometimes it's desirable to build Google Test by compiling a single file. // This file serves this purpose. // This line ensures that gtest.h can be compiled on its own, even // when it's fused. #include "gtest/gtest.h" // The following lines pull in the real gtest *.cc files. #include "src/gtest.cc" #include "src/gtest-death-test.cc" #include "src/gtest-filepath.cc" #include "src/gtest-matchers.cc" #include "src/gtest-port.cc" #include "src/gtest-printers.cc" #include "src/gtest-test-part.cc" #include "src/gtest-typed-test.cc" dvisvgm-2.8.1/tests/gtest/src/gtest-port.cc0000664000175000017500000013255213553267757015656 00000000000000// Copyright 2008, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "gtest/internal/gtest-port.h" #include #include #include #include #include #include #if GTEST_OS_WINDOWS # include # include # include # include // Used in ThreadLocal. # ifdef _MSC_VER # include # endif // _MSC_VER #else # include #endif // GTEST_OS_WINDOWS #if GTEST_OS_MAC # include # include # include #endif // GTEST_OS_MAC #if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \ GTEST_OS_NETBSD || GTEST_OS_OPENBSD # include # if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD # include # endif #endif #if GTEST_OS_QNX # include # include # include #endif // GTEST_OS_QNX #if GTEST_OS_AIX # include # include #endif // GTEST_OS_AIX #if GTEST_OS_FUCHSIA # include # include #endif // GTEST_OS_FUCHSIA #include "gtest/gtest-spi.h" #include "gtest/gtest-message.h" #include "gtest/internal/gtest-internal.h" #include "gtest/internal/gtest-string.h" #include "src/gtest-internal-inl.h" namespace testing { namespace internal { #if defined(_MSC_VER) || defined(__BORLANDC__) // MSVC and C++Builder do not provide a definition of STDERR_FILENO. const int kStdOutFileno = 1; const int kStdErrFileno = 2; #else const int kStdOutFileno = STDOUT_FILENO; const int kStdErrFileno = STDERR_FILENO; #endif // _MSC_VER #if GTEST_OS_LINUX namespace { template T ReadProcFileField(const std::string& filename, int field) { std::string dummy; std::ifstream file(filename.c_str()); while (field-- > 0) { file >> dummy; } T output = 0; file >> output; return output; } } // namespace // Returns the number of active threads, or 0 when there is an error. size_t GetThreadCount() { const std::string filename = (Message() << "/proc/" << getpid() << "/stat").GetString(); return ReadProcFileField(filename, 19); } #elif GTEST_OS_MAC size_t GetThreadCount() { const task_t task = mach_task_self(); mach_msg_type_number_t thread_count; thread_act_array_t thread_list; const kern_return_t status = task_threads(task, &thread_list, &thread_count); if (status == KERN_SUCCESS) { // task_threads allocates resources in thread_list and we need to free them // to avoid leaks. vm_deallocate(task, reinterpret_cast(thread_list), sizeof(thread_t) * thread_count); return static_cast(thread_count); } else { return 0; } } #elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \ GTEST_OS_NETBSD #if GTEST_OS_NETBSD #undef KERN_PROC #define KERN_PROC KERN_PROC2 #define kinfo_proc kinfo_proc2 #endif #if GTEST_OS_DRAGONFLY #define KP_NLWP(kp) (kp.kp_nthreads) #elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD #define KP_NLWP(kp) (kp.ki_numthreads) #elif GTEST_OS_NETBSD #define KP_NLWP(kp) (kp.p_nlwps) #endif // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid(), #if GTEST_OS_NETBSD sizeof(struct kinfo_proc), 1, #endif }; u_int miblen = sizeof(mib) / sizeof(mib[0]); struct kinfo_proc info; size_t size = sizeof(info); if (sysctl(mib, miblen, &info, &size, NULL, 0)) { return 0; } return static_cast(KP_NLWP(info)); } #elif GTEST_OS_OPENBSD // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID | KERN_PROC_SHOW_THREADS, getpid(), sizeof(struct kinfo_proc), 0, }; u_int miblen = sizeof(mib) / sizeof(mib[0]); // get number of structs size_t size; if (sysctl(mib, miblen, NULL, &size, NULL, 0)) { return 0; } mib[5] = size / mib[4]; // populate array of structs struct kinfo_proc info[mib[5]]; if (sysctl(mib, miblen, &info, &size, NULL, 0)) { return 0; } // exclude empty members int nthreads = 0; for (int i = 0; i < size / mib[4]; i++) { if (info[i].p_tid != -1) nthreads++; } return nthreads; } #elif GTEST_OS_QNX // Returns the number of threads running in the process, or 0 to indicate that // we cannot detect it. size_t GetThreadCount() { const int fd = open("/proc/self/as", O_RDONLY); if (fd < 0) { return 0; } procfs_info process_info; const int status = devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), nullptr); close(fd); if (status == EOK) { return static_cast(process_info.num_threads); } else { return 0; } } #elif GTEST_OS_AIX size_t GetThreadCount() { struct procentry64 entry; pid_t pid = getpid(); int status = getprocs64(&entry, sizeof(entry), nullptr, 0, &pid, 1); if (status == 1) { return entry.pi_thcount; } else { return 0; } } #elif GTEST_OS_FUCHSIA size_t GetThreadCount() { int dummy_buffer; size_t avail; zx_status_t status = zx_object_get_info( zx_process_self(), ZX_INFO_PROCESS_THREADS, &dummy_buffer, 0, nullptr, &avail); if (status == ZX_OK) { return avail; } else { return 0; } } #else size_t GetThreadCount() { // There's no portable way to detect the number of threads, so we just // return 0 to indicate that we cannot detect it. return 0; } #endif // GTEST_OS_LINUX #if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS void SleepMilliseconds(int n) { ::Sleep(static_cast(n)); } AutoHandle::AutoHandle() : handle_(INVALID_HANDLE_VALUE) {} AutoHandle::AutoHandle(Handle handle) : handle_(handle) {} AutoHandle::~AutoHandle() { Reset(); } AutoHandle::Handle AutoHandle::Get() const { return handle_; } void AutoHandle::Reset() { Reset(INVALID_HANDLE_VALUE); } void AutoHandle::Reset(HANDLE handle) { // Resetting with the same handle we already own is invalid. if (handle_ != handle) { if (IsCloseable()) { ::CloseHandle(handle_); } handle_ = handle; } else { GTEST_CHECK_(!IsCloseable()) << "Resetting a valid handle to itself is likely a programmer error " "and thus not allowed."; } } bool AutoHandle::IsCloseable() const { // Different Windows APIs may use either of these values to represent an // invalid handle. return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE; } Notification::Notification() : event_(::CreateEvent(nullptr, // Default security attributes. TRUE, // Do not reset automatically. FALSE, // Initially unset. nullptr)) { // Anonymous event. GTEST_CHECK_(event_.Get() != nullptr); } void Notification::Notify() { GTEST_CHECK_(::SetEvent(event_.Get()) != FALSE); } void Notification::WaitForNotification() { GTEST_CHECK_( ::WaitForSingleObject(event_.Get(), INFINITE) == WAIT_OBJECT_0); } Mutex::Mutex() : owner_thread_id_(0), type_(kDynamic), critical_section_init_phase_(0), critical_section_(new CRITICAL_SECTION) { ::InitializeCriticalSection(critical_section_); } Mutex::~Mutex() { // Static mutexes are leaked intentionally. It is not thread-safe to try // to clean them up. if (type_ == kDynamic) { ::DeleteCriticalSection(critical_section_); delete critical_section_; critical_section_ = nullptr; } } void Mutex::Lock() { ThreadSafeLazyInit(); ::EnterCriticalSection(critical_section_); owner_thread_id_ = ::GetCurrentThreadId(); } void Mutex::Unlock() { ThreadSafeLazyInit(); // We don't protect writing to owner_thread_id_ here, as it's the // caller's responsibility to ensure that the current thread holds the // mutex when this is called. owner_thread_id_ = 0; ::LeaveCriticalSection(critical_section_); } // Does nothing if the current thread holds the mutex. Otherwise, crashes // with high probability. void Mutex::AssertHeld() { ThreadSafeLazyInit(); GTEST_CHECK_(owner_thread_id_ == ::GetCurrentThreadId()) << "The current thread is not holding the mutex @" << this; } namespace { #ifdef _MSC_VER // Use the RAII idiom to flag mem allocs that are intentionally never // deallocated. The motivation is to silence the false positive mem leaks // that are reported by the debug version of MS's CRT which can only detect // if an alloc is missing a matching deallocation. // Example: // MemoryIsNotDeallocated memory_is_not_deallocated; // critical_section_ = new CRITICAL_SECTION; // class MemoryIsNotDeallocated { public: MemoryIsNotDeallocated() : old_crtdbg_flag_(0) { old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); // Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT // doesn't report mem leak if there's no matching deallocation. _CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF); } ~MemoryIsNotDeallocated() { // Restore the original _CRTDBG_ALLOC_MEM_DF flag _CrtSetDbgFlag(old_crtdbg_flag_); } private: int old_crtdbg_flag_; GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated); }; #endif // _MSC_VER } // namespace // Initializes owner_thread_id_ and critical_section_ in static mutexes. void Mutex::ThreadSafeLazyInit() { // Dynamic mutexes are initialized in the constructor. if (type_ == kStatic) { switch ( ::InterlockedCompareExchange(&critical_section_init_phase_, 1L, 0L)) { case 0: // If critical_section_init_phase_ was 0 before the exchange, we // are the first to test it and need to perform the initialization. owner_thread_id_ = 0; { // Use RAII to flag that following mem alloc is never deallocated. #ifdef _MSC_VER MemoryIsNotDeallocated memory_is_not_deallocated; #endif // _MSC_VER critical_section_ = new CRITICAL_SECTION; } ::InitializeCriticalSection(critical_section_); // Updates the critical_section_init_phase_ to 2 to signal // initialization complete. GTEST_CHECK_(::InterlockedCompareExchange( &critical_section_init_phase_, 2L, 1L) == 1L); break; case 1: // Somebody else is already initializing the mutex; spin until they // are done. while (::InterlockedCompareExchange(&critical_section_init_phase_, 2L, 2L) != 2L) { // Possibly yields the rest of the thread's time slice to other // threads. ::Sleep(0); } break; case 2: break; // The mutex is already initialized and ready for use. default: GTEST_CHECK_(false) << "Unexpected value of critical_section_init_phase_ " << "while initializing a static mutex."; } } } namespace { class ThreadWithParamSupport : public ThreadWithParamBase { public: static HANDLE CreateThread(Runnable* runnable, Notification* thread_can_start) { ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start); DWORD thread_id; HANDLE thread_handle = ::CreateThread( nullptr, // Default security. 0, // Default stack size. &ThreadWithParamSupport::ThreadMain, param, // Parameter to ThreadMainStatic 0x0, // Default creation flags. &thread_id); // Need a valid pointer for the call to work under Win98. GTEST_CHECK_(thread_handle != nullptr) << "CreateThread failed with error " << ::GetLastError() << "."; if (thread_handle == nullptr) { delete param; } return thread_handle; } private: struct ThreadMainParam { ThreadMainParam(Runnable* runnable, Notification* thread_can_start) : runnable_(runnable), thread_can_start_(thread_can_start) { } std::unique_ptr runnable_; // Does not own. Notification* thread_can_start_; }; static DWORD WINAPI ThreadMain(void* ptr) { // Transfers ownership. std::unique_ptr param(static_cast(ptr)); if (param->thread_can_start_ != nullptr) param->thread_can_start_->WaitForNotification(); param->runnable_->Run(); return 0; } // Prohibit instantiation. ThreadWithParamSupport(); GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParamSupport); }; } // namespace ThreadWithParamBase::ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start) : thread_(ThreadWithParamSupport::CreateThread(runnable, thread_can_start)) { } ThreadWithParamBase::~ThreadWithParamBase() { Join(); } void ThreadWithParamBase::Join() { GTEST_CHECK_(::WaitForSingleObject(thread_.Get(), INFINITE) == WAIT_OBJECT_0) << "Failed to join the thread with error " << ::GetLastError() << "."; } // Maps a thread to a set of ThreadIdToThreadLocals that have values // instantiated on that thread and notifies them when the thread exits. A // ThreadLocal instance is expected to persist until all threads it has // values on have terminated. class ThreadLocalRegistryImpl { public: // Registers thread_local_instance as having value on the current thread. // Returns a value that can be used to identify the thread from other threads. static ThreadLocalValueHolderBase* GetValueOnCurrentThread( const ThreadLocalBase* thread_local_instance) { DWORD current_thread = ::GetCurrentThreadId(); MutexLock lock(&mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = GetThreadLocalsMapLocked(); ThreadIdToThreadLocals::iterator thread_local_pos = thread_to_thread_locals->find(current_thread); if (thread_local_pos == thread_to_thread_locals->end()) { thread_local_pos = thread_to_thread_locals->insert( std::make_pair(current_thread, ThreadLocalValues())).first; StartWatcherThreadFor(current_thread); } ThreadLocalValues& thread_local_values = thread_local_pos->second; ThreadLocalValues::iterator value_pos = thread_local_values.find(thread_local_instance); if (value_pos == thread_local_values.end()) { value_pos = thread_local_values .insert(std::make_pair( thread_local_instance, std::shared_ptr( thread_local_instance->NewValueForCurrentThread()))) .first; } return value_pos->second.get(); } static void OnThreadLocalDestroyed( const ThreadLocalBase* thread_local_instance) { std::vector > value_holders; // Clean up the ThreadLocalValues data structure while holding the lock, but // defer the destruction of the ThreadLocalValueHolderBases. { MutexLock lock(&mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = GetThreadLocalsMapLocked(); for (ThreadIdToThreadLocals::iterator it = thread_to_thread_locals->begin(); it != thread_to_thread_locals->end(); ++it) { ThreadLocalValues& thread_local_values = it->second; ThreadLocalValues::iterator value_pos = thread_local_values.find(thread_local_instance); if (value_pos != thread_local_values.end()) { value_holders.push_back(value_pos->second); thread_local_values.erase(value_pos); // This 'if' can only be successful at most once, so theoretically we // could break out of the loop here, but we don't bother doing so. } } } // Outside the lock, let the destructor for 'value_holders' deallocate the // ThreadLocalValueHolderBases. } static void OnThreadExit(DWORD thread_id) { GTEST_CHECK_(thread_id != 0) << ::GetLastError(); std::vector > value_holders; // Clean up the ThreadIdToThreadLocals data structure while holding the // lock, but defer the destruction of the ThreadLocalValueHolderBases. { MutexLock lock(&mutex_); ThreadIdToThreadLocals* const thread_to_thread_locals = GetThreadLocalsMapLocked(); ThreadIdToThreadLocals::iterator thread_local_pos = thread_to_thread_locals->find(thread_id); if (thread_local_pos != thread_to_thread_locals->end()) { ThreadLocalValues& thread_local_values = thread_local_pos->second; for (ThreadLocalValues::iterator value_pos = thread_local_values.begin(); value_pos != thread_local_values.end(); ++value_pos) { value_holders.push_back(value_pos->second); } thread_to_thread_locals->erase(thread_local_pos); } } // Outside the lock, let the destructor for 'value_holders' deallocate the // ThreadLocalValueHolderBases. } private: // In a particular thread, maps a ThreadLocal object to its value. typedef std::map > ThreadLocalValues; // Stores all ThreadIdToThreadLocals having values in a thread, indexed by // thread's ID. typedef std::map ThreadIdToThreadLocals; // Holds the thread id and thread handle that we pass from // StartWatcherThreadFor to WatcherThreadFunc. typedef std::pair ThreadIdAndHandle; static void StartWatcherThreadFor(DWORD thread_id) { // The returned handle will be kept in thread_map and closed by // watcher_thread in WatcherThreadFunc. HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION, FALSE, thread_id); GTEST_CHECK_(thread != nullptr); // We need to pass a valid thread ID pointer into CreateThread for it // to work correctly under Win98. DWORD watcher_thread_id; HANDLE watcher_thread = ::CreateThread( nullptr, // Default security. 0, // Default stack size &ThreadLocalRegistryImpl::WatcherThreadFunc, reinterpret_cast(new ThreadIdAndHandle(thread_id, thread)), CREATE_SUSPENDED, &watcher_thread_id); GTEST_CHECK_(watcher_thread != nullptr); // Give the watcher thread the same priority as ours to avoid being // blocked by it. ::SetThreadPriority(watcher_thread, ::GetThreadPriority(::GetCurrentThread())); ::ResumeThread(watcher_thread); ::CloseHandle(watcher_thread); } // Monitors exit from a given thread and notifies those // ThreadIdToThreadLocals about thread termination. static DWORD WINAPI WatcherThreadFunc(LPVOID param) { const ThreadIdAndHandle* tah = reinterpret_cast(param); GTEST_CHECK_( ::WaitForSingleObject(tah->second, INFINITE) == WAIT_OBJECT_0); OnThreadExit(tah->first); ::CloseHandle(tah->second); delete tah; return 0; } // Returns map of thread local instances. static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() { mutex_.AssertHeld(); #ifdef _MSC_VER MemoryIsNotDeallocated memory_is_not_deallocated; #endif // _MSC_VER static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals(); return map; } // Protects access to GetThreadLocalsMapLocked() and its return value. static Mutex mutex_; // Protects access to GetThreadMapLocked() and its return value. static Mutex thread_map_mutex_; }; Mutex ThreadLocalRegistryImpl::mutex_(Mutex::kStaticMutex); Mutex ThreadLocalRegistryImpl::thread_map_mutex_(Mutex::kStaticMutex); ThreadLocalValueHolderBase* ThreadLocalRegistry::GetValueOnCurrentThread( const ThreadLocalBase* thread_local_instance) { return ThreadLocalRegistryImpl::GetValueOnCurrentThread( thread_local_instance); } void ThreadLocalRegistry::OnThreadLocalDestroyed( const ThreadLocalBase* thread_local_instance) { ThreadLocalRegistryImpl::OnThreadLocalDestroyed(thread_local_instance); } #endif // GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS #if GTEST_USES_POSIX_RE // Implements RE. Currently only needed for death tests. RE::~RE() { if (is_valid_) { // regfree'ing an invalid regex might crash because the content // of the regex is undefined. Since the regex's are essentially // the same, one cannot be valid (or invalid) without the other // being so too. regfree(&partial_regex_); regfree(&full_regex_); } free(const_cast(pattern_)); } // Returns true if and only if regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.full_regex_, str, 1, &match, 0) == 0; } // Returns true if and only if regular expression re matches a substring of // str (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { if (!re.is_valid_) return false; regmatch_t match; return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = posix::StrDup(regex); // Reserves enough bytes to hold the regular expression used for a // full match. const size_t full_regex_len = strlen(regex) + 10; char* const full_pattern = new char[full_regex_len]; snprintf(full_pattern, full_regex_len, "^(%s)$", regex); is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; // We want to call regcomp(&partial_regex_, ...) even if the // previous expression returns false. Otherwise partial_regex_ may // not be properly initialized can may cause trouble when it's // freed. // // Some implementation of POSIX regex (e.g. on at least some // versions of Cygwin) doesn't accept the empty string as a valid // regex. We change it to an equivalent form "()" to be safe. if (is_valid_) { const char* const partial_regex = (*regex == '\0') ? "()" : regex; is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; } EXPECT_TRUE(is_valid_) << "Regular expression \"" << regex << "\" is not a valid POSIX Extended regular expression."; delete[] full_pattern; } #elif GTEST_USES_SIMPLE_RE // Returns true if and only if ch appears anywhere in str (excluding the // terminating '\0' character). bool IsInSet(char ch, const char* str) { return ch != '\0' && strchr(str, ch) != nullptr; } // Returns true if and only if ch belongs to the given classification. // Unlike similar functions in , these aren't affected by the // current locale. bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; } bool IsAsciiPunct(char ch) { return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); } bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } bool IsAsciiWordChar(char ch) { return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9') || ch == '_'; } // Returns true if and only if "\\c" is a supported escape sequence. bool IsValidEscape(char c) { return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW")); } // Returns true if and only if the given atom (specified by escaped and // pattern) matches ch. The result is undefined if the atom is invalid. bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { if (escaped) { // "\\p" where p is pattern_char. switch (pattern_char) { case 'd': return IsAsciiDigit(ch); case 'D': return !IsAsciiDigit(ch); case 'f': return ch == '\f'; case 'n': return ch == '\n'; case 'r': return ch == '\r'; case 's': return IsAsciiWhiteSpace(ch); case 'S': return !IsAsciiWhiteSpace(ch); case 't': return ch == '\t'; case 'v': return ch == '\v'; case 'w': return IsAsciiWordChar(ch); case 'W': return !IsAsciiWordChar(ch); } return IsAsciiPunct(pattern_char) && pattern_char == ch; } return (pattern_char == '.' && ch != '\n') || pattern_char == ch; } // Helper function used by ValidateRegex() to format error messages. static std::string FormatRegexSyntaxError(const char* regex, int index) { return (Message() << "Syntax error at index " << index << " in simple regular expression \"" << regex << "\": ").GetString(); } // Generates non-fatal failures and returns false if regex is invalid; // otherwise returns true. bool ValidateRegex(const char* regex) { if (regex == nullptr) { ADD_FAILURE() << "NULL is not a valid simple regular expression."; return false; } bool is_valid = true; // True if and only if ?, *, or + can follow the previous atom. bool prev_repeatable = false; for (int i = 0; regex[i]; i++) { if (regex[i] == '\\') { // An escape sequence i++; if (regex[i] == '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "'\\' cannot appear at the end."; return false; } if (!IsValidEscape(regex[i])) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) << "invalid escape sequence \"\\" << regex[i] << "\"."; is_valid = false; } prev_repeatable = true; } else { // Not an escape sequence. const char ch = regex[i]; if (ch == '^' && i > 0) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'^' can only appear at the beginning."; is_valid = false; } else if (ch == '$' && regex[i + 1] != '\0') { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'$' can only appear at the end."; is_valid = false; } else if (IsInSet(ch, "()[]{}|")) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' is unsupported."; is_valid = false; } else if (IsRepeat(ch) && !prev_repeatable) { ADD_FAILURE() << FormatRegexSyntaxError(regex, i) << "'" << ch << "' can only follow a repeatable token."; is_valid = false; } prev_repeatable = !IsInSet(ch, "^$?*+"); } } return is_valid; } // Matches a repeated regex atom followed by a valid simple regular // expression. The regex atom is defined as c if escaped is false, // or \c otherwise. repeat is the repetition meta character (?, *, // or +). The behavior is undefined if str contains too many // characters to be indexable by size_t, in which case the test will // probably time out anyway. We are fine with this limitation as // std::string has it too. bool MatchRepetitionAndRegexAtHead( bool escaped, char c, char repeat, const char* regex, const char* str) { const size_t min_count = (repeat == '+') ? 1 : 0; const size_t max_count = (repeat == '?') ? 1 : static_cast(-1) - 1; // We cannot call numeric_limits::max() as it conflicts with the // max() macro on Windows. for (size_t i = 0; i <= max_count; ++i) { // We know that the atom matches each of the first i characters in str. if (i >= min_count && MatchRegexAtHead(regex, str + i)) { // We have enough matches at the head, and the tail matches too. // Since we only care about *whether* the pattern matches str // (as opposed to *how* it matches), there is no need to find a // greedy match. return true; } if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) return false; } return false; } // Returns true if and only if regex matches a prefix of str. regex must // be a valid simple regular expression and not start with "^", or the // result is undefined. bool MatchRegexAtHead(const char* regex, const char* str) { if (*regex == '\0') // An empty regex matches a prefix of anything. return true; // "$" only matches the end of a string. Note that regex being // valid guarantees that there's nothing after "$" in it. if (*regex == '$') return *str == '\0'; // Is the first thing in regex an escape sequence? const bool escaped = *regex == '\\'; if (escaped) ++regex; if (IsRepeat(regex[1])) { // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so // here's an indirect recursion. It terminates as the regex gets // shorter in each recursion. return MatchRepetitionAndRegexAtHead( escaped, regex[0], regex[1], regex + 2, str); } else { // regex isn't empty, isn't "$", and doesn't start with a // repetition. We match the first atom of regex with the first // character of str and recurse. return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && MatchRegexAtHead(regex + 1, str + 1); } } // Returns true if and only if regex matches any substring of str. regex must // be a valid simple regular expression, or the result is undefined. // // The algorithm is recursive, but the recursion depth doesn't exceed // the regex length, so we won't need to worry about running out of // stack space normally. In rare cases the time complexity can be // exponential with respect to the regex length + the string length, // but usually it's must faster (often close to linear). bool MatchRegexAnywhere(const char* regex, const char* str) { if (regex == nullptr || str == nullptr) return false; if (*regex == '^') return MatchRegexAtHead(regex + 1, str); // A successful match can be anywhere in str. do { if (MatchRegexAtHead(regex, str)) return true; } while (*str++ != '\0'); return false; } // Implements the RE class. RE::~RE() { free(const_cast(pattern_)); free(const_cast(full_pattern_)); } // Returns true if and only if regular expression re matches the entire str. bool RE::FullMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); } // Returns true if and only if regular expression re matches a substring of // str (including str itself). bool RE::PartialMatch(const char* str, const RE& re) { return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); } // Initializes an RE from its string representation. void RE::Init(const char* regex) { pattern_ = full_pattern_ = nullptr; if (regex != nullptr) { pattern_ = posix::StrDup(regex); } is_valid_ = ValidateRegex(regex); if (!is_valid_) { // No need to calculate the full pattern when the regex is invalid. return; } const size_t len = strlen(regex); // Reserves enough bytes to hold the regular expression used for a // full match: we need space to prepend a '^', append a '$', and // terminate the string with '\0'. char* buffer = static_cast(malloc(len + 3)); full_pattern_ = buffer; if (*regex != '^') *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. // We don't use snprintf or strncpy, as they trigger a warning when // compiled with VC++ 8.0. memcpy(buffer, regex, len); buffer += len; if (len == 0 || regex[len - 1] != '$') *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. *buffer = '\0'; } #endif // GTEST_USES_POSIX_RE const char kUnknownFile[] = "unknown file"; // Formats a source file path and a line number as they would appear // in an error message from the compiler used to compile this code. GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) { const std::string file_name(file == nullptr ? kUnknownFile : file); if (line < 0) { return file_name + ":"; } #ifdef _MSC_VER return file_name + "(" + StreamableToString(line) + "):"; #else return file_name + ":" + StreamableToString(line) + ":"; #endif // _MSC_VER } // Formats a file location for compiler-independent XML output. // Although this function is not platform dependent, we put it next to // FormatFileLocation in order to contrast the two functions. // Note that FormatCompilerIndependentFileLocation() does NOT append colon // to the file location it produces, unlike FormatFileLocation(). GTEST_API_ ::std::string FormatCompilerIndependentFileLocation( const char* file, int line) { const std::string file_name(file == nullptr ? kUnknownFile : file); if (line < 0) return file_name; else return file_name + ":" + StreamableToString(line); } GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) : severity_(severity) { const char* const marker = severity == GTEST_INFO ? "[ INFO ]" : severity == GTEST_WARNING ? "[WARNING]" : severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; GetStream() << ::std::endl << marker << " " << FormatFileLocation(file, line).c_str() << ": "; } // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. GTestLog::~GTestLog() { GetStream() << ::std::endl; if (severity_ == GTEST_FATAL) { fflush(stderr); posix::Abort(); } } // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) GTEST_DISABLE_MSC_DEPRECATED_PUSH_() #if GTEST_HAS_STREAM_REDIRECTION // Object that captures an output stream (stdout/stderr). class CapturedStream { public: // The ctor redirects the stream to a temporary file. explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { # if GTEST_OS_WINDOWS char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); const UINT success = ::GetTempFileNameA(temp_dir_path, "gtest_redir", 0, // Generate unique file name. temp_file_path); GTEST_CHECK_(success != 0) << "Unable to create a temporary file in " << temp_dir_path; const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " << temp_file_path; filename_ = temp_file_path; # else // There's no guarantee that a test has write access to the current // directory, so we create the temporary file in the /tmp directory // instead. We use /tmp on most systems, and /sdcard on Android. // That's because Android doesn't have /tmp. # if GTEST_OS_LINUX_ANDROID // Note: Android applications are expected to call the framework's // Context.getExternalStorageDirectory() method through JNI to get // the location of the world-writable SD Card directory. However, // this requires a Context handle, which cannot be retrieved // globally from native code. Doing so also precludes running the // code as part of a regular standalone executable, which doesn't // run in a Dalvik process (e.g. when running it through 'adb shell'). // // The location /data/local/tmp is directly accessible from native code. // '/sdcard' and other variants cannot be relied on, as they are not // guaranteed to be mounted, or may have a delay in mounting. char name_template[] = "/data/local/tmp/gtest_captured_stream.XXXXXX"; # else char name_template[] = "/tmp/captured_stream.XXXXXX"; # endif // GTEST_OS_LINUX_ANDROID const int captured_fd = mkstemp(name_template); if (captured_fd == -1) { GTEST_LOG_(WARNING) << "Failed to create tmp file " << name_template << " for test; does the test have access to the /tmp directory?"; } filename_ = name_template; # endif // GTEST_OS_WINDOWS fflush(nullptr); dup2(captured_fd, fd_); close(captured_fd); } ~CapturedStream() { remove(filename_.c_str()); } std::string GetCapturedString() { if (uncaptured_fd_ != -1) { // Restores the original stream. fflush(nullptr); dup2(uncaptured_fd_, fd_); close(uncaptured_fd_); uncaptured_fd_ = -1; } FILE* const file = posix::FOpen(filename_.c_str(), "r"); if (file == nullptr) { GTEST_LOG_(FATAL) << "Failed to open tmp file " << filename_ << " for capturing stream."; } const std::string content = ReadEntireFile(file); posix::FClose(file); return content; } private: const int fd_; // A stream to capture. int uncaptured_fd_; // Name of the temporary file holding the stderr output. ::std::string filename_; GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); }; GTEST_DISABLE_MSC_DEPRECATED_POP_() static CapturedStream* g_captured_stderr = nullptr; static CapturedStream* g_captured_stdout = nullptr; // Starts capturing an output stream (stdout/stderr). static void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { if (*stream != nullptr) { GTEST_LOG_(FATAL) << "Only one " << stream_name << " capturer can exist at a time."; } *stream = new CapturedStream(fd); } // Stops capturing the output stream and returns the captured string. static std::string GetCapturedStream(CapturedStream** captured_stream) { const std::string content = (*captured_stream)->GetCapturedString(); delete *captured_stream; *captured_stream = nullptr; return content; } // Starts capturing stdout. void CaptureStdout() { CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); } // Starts capturing stderr. void CaptureStderr() { CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); } // Stops capturing stdout and returns the captured string. std::string GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); } // Stops capturing stderr and returns the captured string. std::string GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); } #endif // GTEST_HAS_STREAM_REDIRECTION size_t GetFileSize(FILE* file) { fseek(file, 0, SEEK_END); return static_cast(ftell(file)); } std::string ReadEntireFile(FILE* file) { const size_t file_size = GetFileSize(file); char* const buffer = new char[file_size]; size_t bytes_last_read = 0; // # of bytes read in the last fread() size_t bytes_read = 0; // # of bytes read so far fseek(file, 0, SEEK_SET); // Keeps reading the file until we cannot read further or the // pre-determined file size is reached. do { bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); bytes_read += bytes_last_read; } while (bytes_last_read > 0 && bytes_read < file_size); const std::string content(buffer, bytes_read); delete[] buffer; return content; } #if GTEST_HAS_DEATH_TEST static const std::vector* g_injected_test_argvs = nullptr; // Owned. std::vector GetInjectableArgvs() { if (g_injected_test_argvs != nullptr) { return *g_injected_test_argvs; } return GetArgvs(); } void SetInjectableArgvs(const std::vector* new_argvs) { if (g_injected_test_argvs != new_argvs) delete g_injected_test_argvs; g_injected_test_argvs = new_argvs; } void SetInjectableArgvs(const std::vector& new_argvs) { SetInjectableArgvs( new std::vector(new_argvs.begin(), new_argvs.end())); } void ClearInjectableArgvs() { delete g_injected_test_argvs; g_injected_test_argvs = nullptr; } #endif // GTEST_HAS_DEATH_TEST #if GTEST_OS_WINDOWS_MOBILE namespace posix { void Abort() { DebugBreak(); TerminateProcess(GetCurrentProcess(), 1); } } // namespace posix #endif // GTEST_OS_WINDOWS_MOBILE // Returns the name of the environment variable corresponding to the // given flag. For example, FlagToEnvVar("foo") will return // "GTEST_FOO" in the open-source version. static std::string FlagToEnvVar(const char* flag) { const std::string full_flag = (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); Message env_var; for (size_t i = 0; i != full_flag.length(); i++) { env_var << ToUpper(full_flag.c_str()[i]); } return env_var.GetString(); } // Parses 'str' for a 32-bit signed integer. If successful, writes // the result to *value and returns true; otherwise leaves *value // unchanged and returns false. bool ParseInt32(const Message& src_text, const char* str, Int32* value) { // Parses the environment variable as a decimal integer. char* end = nullptr; const long long_value = strtol(str, &end, 10); // NOLINT // Has strtol() consumed all characters in the string? if (*end != '\0') { // No - an invalid character was encountered. Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value \"" << str << "\".\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } // Is the parsed value in the range of an Int32? const Int32 result = static_cast(long_value); if (long_value == LONG_MAX || long_value == LONG_MIN || // The parsed value overflows as a long. (strtol() returns // LONG_MAX or LONG_MIN when the input overflows.) result != long_value // The parsed value overflows as an Int32. ) { Message msg; msg << "WARNING: " << src_text << " is expected to be a 32-bit integer, but actually" << " has value " << str << ", which overflows.\n"; printf("%s", msg.GetString().c_str()); fflush(stdout); return false; } *value = result; return true; } // Reads and returns the Boolean environment variable corresponding to // the given flag; if it's not set, returns default_value. // // The value is considered true if and only if it's not "0". bool BoolFromGTestEnv(const char* flag, bool default_value) { #if defined(GTEST_GET_BOOL_FROM_ENV_) return GTEST_GET_BOOL_FROM_ENV_(flag, default_value); #else const std::string env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); return string_value == nullptr ? default_value : strcmp(string_value, "0") != 0; #endif // defined(GTEST_GET_BOOL_FROM_ENV_) } // Reads and returns a 32-bit integer stored in the environment // variable corresponding to the given flag; if it isn't set or // doesn't represent a valid 32-bit integer, returns default_value. Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { #if defined(GTEST_GET_INT32_FROM_ENV_) return GTEST_GET_INT32_FROM_ENV_(flag, default_value); #else const std::string env_var = FlagToEnvVar(flag); const char* const string_value = posix::GetEnv(env_var.c_str()); if (string_value == nullptr) { // The environment variable is not set. return default_value; } Int32 result = default_value; if (!ParseInt32(Message() << "Environment variable " << env_var, string_value, &result)) { printf("The default value %s is used.\n", (Message() << default_value).GetString().c_str()); fflush(stdout); return default_value; } return result; #endif // defined(GTEST_GET_INT32_FROM_ENV_) } // As a special case for the 'output' flag, if GTEST_OUTPUT is not // set, we look for XML_OUTPUT_FILE, which is set by the Bazel build // system. The value of XML_OUTPUT_FILE is a filename without the // "xml:" prefix of GTEST_OUTPUT. // Note that this is meant to be called at the call site so it does // not check that the flag is 'output' // In essence this checks an env variable called XML_OUTPUT_FILE // and if it is set we prepend "xml:" to its value, if it not set we return "" std::string OutputFlagAlsoCheckEnvVar(){ std::string default_value_for_output_flag = ""; const char* xml_output_file_env = posix::GetEnv("XML_OUTPUT_FILE"); if (nullptr != xml_output_file_env) { default_value_for_output_flag = std::string("xml:") + xml_output_file_env; } return default_value_for_output_flag; } // Reads and returns the string environment variable corresponding to // the given flag; if it's not set, returns default_value. const char* StringFromGTestEnv(const char* flag, const char* default_value) { #if defined(GTEST_GET_STRING_FROM_ENV_) return GTEST_GET_STRING_FROM_ENV_(flag, default_value); #else const std::string env_var = FlagToEnvVar(flag); const char* const value = posix::GetEnv(env_var.c_str()); return value == nullptr ? default_value : value; #endif // defined(GTEST_GET_STRING_FROM_ENV_) } } // namespace internal } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest-death-test.cc0000664000175000017500000017135313553267757016736 00000000000000// Copyright 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // This file implements death tests. #include "gtest/gtest-death-test.h" #include #include "gtest/internal/gtest-port.h" #include "gtest/internal/custom/gtest.h" #if GTEST_HAS_DEATH_TEST # if GTEST_OS_MAC # include # endif // GTEST_OS_MAC # include # include # include # if GTEST_OS_LINUX # include # endif // GTEST_OS_LINUX # include # if GTEST_OS_WINDOWS # include # else # include # include # endif // GTEST_OS_WINDOWS # if GTEST_OS_QNX # include # endif // GTEST_OS_QNX # if GTEST_OS_FUCHSIA # include # include # include # include # include # include # include # include # include # include # include # endif // GTEST_OS_FUCHSIA #endif // GTEST_HAS_DEATH_TEST #include "gtest/gtest-message.h" #include "gtest/internal/gtest-string.h" #include "src/gtest-internal-inl.h" namespace testing { // Constants. // The default death test style. // // This is defined in internal/gtest-port.h as "fast", but can be overridden by // a definition in internal/custom/gtest-port.h. The recommended value, which is // used internally at Google, is "threadsafe". static const char kDefaultDeathTestStyle[] = GTEST_DEFAULT_DEATH_TEST_STYLE; GTEST_DEFINE_string_( death_test_style, internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), "Indicates how to run a death test in a forked child process: " "\"threadsafe\" (child process re-executes the test binary " "from the beginning, running only the specific death test) or " "\"fast\" (child process runs the death test immediately " "after forking)."); GTEST_DEFINE_bool_( death_test_use_fork, internal::BoolFromGTestEnv("death_test_use_fork", false), "Instructs to use fork()/_exit() instead of clone() in death tests. " "Ignored and always uses fork() on POSIX systems where clone() is not " "implemented. Useful when running under valgrind or similar tools if " "those do not support clone(). Valgrind 3.3.1 will just fail if " "it sees an unsupported combination of clone() flags. " "It is not recommended to use this flag w/o valgrind though it will " "work in 99% of the cases. Once valgrind is fixed, this flag will " "most likely be removed."); namespace internal { GTEST_DEFINE_string_( internal_run_death_test, "", "Indicates the file, line number, temporal index of " "the single death test to run, and a file descriptor to " "which a success code may be sent, all separated by " "the '|' characters. This flag is specified if and only if the " "current process is a sub-process launched for running a thread-safe " "death test. FOR INTERNAL USE ONLY."); } // namespace internal #if GTEST_HAS_DEATH_TEST namespace internal { // Valid only for fast death tests. Indicates the code is running in the // child process of a fast style death test. # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA static bool g_in_fast_death_test_child = false; # endif // Returns a Boolean value indicating whether the caller is currently // executing in the context of the death test child process. Tools such as // Valgrind heap checkers may need this to modify their behavior in death // tests. IMPORTANT: This is an internal utility. Using it may break the // implementation of death tests. User code MUST NOT use it. bool InDeathTestChild() { # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA // On Windows and Fuchsia, death tests are thread-safe regardless of the value // of the death_test_style flag. return !GTEST_FLAG(internal_run_death_test).empty(); # else if (GTEST_FLAG(death_test_style) == "threadsafe") return !GTEST_FLAG(internal_run_death_test).empty(); else return g_in_fast_death_test_child; #endif } } // namespace internal // ExitedWithCode constructor. ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { } // ExitedWithCode function-call operator. bool ExitedWithCode::operator()(int exit_status) const { # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA return exit_status == exit_code_; # else return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; # endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA } # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA // KilledBySignal constructor. KilledBySignal::KilledBySignal(int signum) : signum_(signum) { } // KilledBySignal function-call operator. bool KilledBySignal::operator()(int exit_status) const { # if defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_) { bool result; if (GTEST_KILLED_BY_SIGNAL_OVERRIDE_(signum_, exit_status, &result)) { return result; } } # endif // defined(GTEST_KILLED_BY_SIGNAL_OVERRIDE_) return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; } # endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA namespace internal { // Utilities needed for death tests. // Generates a textual description of a given exit code, in the format // specified by wait(2). static std::string ExitSummary(int exit_code) { Message m; # if GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA m << "Exited with exit status " << exit_code; # else if (WIFEXITED(exit_code)) { m << "Exited with exit status " << WEXITSTATUS(exit_code); } else if (WIFSIGNALED(exit_code)) { m << "Terminated by signal " << WTERMSIG(exit_code); } # ifdef WCOREDUMP if (WCOREDUMP(exit_code)) { m << " (core dumped)"; } # endif # endif // GTEST_OS_WINDOWS || GTEST_OS_FUCHSIA return m.GetString(); } // Returns true if exit_status describes a process that was terminated // by a signal, or exited normally with a nonzero exit code. bool ExitedUnsuccessfully(int exit_status) { return !ExitedWithCode(0)(exit_status); } # if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA // Generates a textual failure message when a death test finds more than // one thread running, or cannot determine the number of threads, prior // to executing the given statement. It is the responsibility of the // caller not to pass a thread_count of 1. static std::string DeathTestThreadWarning(size_t thread_count) { Message msg; msg << "Death tests use fork(), which is unsafe particularly" << " in a threaded context. For this test, " << GTEST_NAME_ << " "; if (thread_count == 0) { msg << "couldn't detect the number of threads."; } else { msg << "detected " << thread_count << " threads."; } msg << " See " "https://github.com/google/googletest/blob/master/googletest/docs/" "advanced.md#death-tests-and-threads" << " for more explanation and suggested solutions, especially if" << " this is the last message you see before your test times out."; return msg.GetString(); } # endif // !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA // Flag characters for reporting a death test that did not die. static const char kDeathTestLived = 'L'; static const char kDeathTestReturned = 'R'; static const char kDeathTestThrew = 'T'; static const char kDeathTestInternalError = 'I'; #if GTEST_OS_FUCHSIA // File descriptor used for the pipe in the child process. static const int kFuchsiaReadPipeFd = 3; #endif // An enumeration describing all of the possible ways that a death test can // conclude. DIED means that the process died while executing the test // code; LIVED means that process lived beyond the end of the test code; // RETURNED means that the test statement attempted to execute a return // statement, which is not allowed; THREW means that the test statement // returned control by throwing an exception. IN_PROGRESS means the test // has not yet concluded. enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW }; // Routine for aborting the program which is safe to call from an // exec-style death test child process, in which case the error // message is propagated back to the parent process. Otherwise, the // message is simply printed to stderr. In either case, the program // then exits with status 1. static void DeathTestAbort(const std::string& message) { // On a POSIX system, this function may be called from a threadsafe-style // death test child process, which operates on a very small stack. Use // the heap for any additional non-minuscule memory requirements. const InternalRunDeathTestFlag* const flag = GetUnitTestImpl()->internal_run_death_test_flag(); if (flag != nullptr) { FILE* parent = posix::FDOpen(flag->write_fd(), "w"); fputc(kDeathTestInternalError, parent); fprintf(parent, "%s", message.c_str()); fflush(parent); _exit(1); } else { fprintf(stderr, "%s", message.c_str()); fflush(stderr); posix::Abort(); } } // A replacement for CHECK that calls DeathTestAbort if the assertion // fails. # define GTEST_DEATH_TEST_CHECK_(expression) \ do { \ if (!::testing::internal::IsTrue(expression)) { \ DeathTestAbort( \ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \ + ::testing::internal::StreamableToString(__LINE__) + ": " \ + #expression); \ } \ } while (::testing::internal::AlwaysFalse()) // This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for // evaluating any system call that fulfills two conditions: it must return // -1 on failure, and set errno to EINTR when it is interrupted and // should be tried again. The macro expands to a loop that repeatedly // evaluates the expression as long as it evaluates to -1 and sets // errno to EINTR. If the expression evaluates to -1 but errno is // something other than EINTR, DeathTestAbort is called. # define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ do { \ int gtest_retval; \ do { \ gtest_retval = (expression); \ } while (gtest_retval == -1 && errno == EINTR); \ if (gtest_retval == -1) { \ DeathTestAbort( \ ::std::string("CHECK failed: File ") + __FILE__ + ", line " \ + ::testing::internal::StreamableToString(__LINE__) + ": " \ + #expression + " != -1"); \ } \ } while (::testing::internal::AlwaysFalse()) // Returns the message describing the last system error in errno. std::string GetLastErrnoDescription() { return errno == 0 ? "" : posix::StrError(errno); } // This is called from a death test parent process to read a failure // message from the death test child process and log it with the FATAL // severity. On Windows, the message is read from a pipe handle. On other // platforms, it is read from a file descriptor. static void FailFromInternalError(int fd) { Message error; char buffer[256]; int num_read; do { while ((num_read = posix::Read(fd, buffer, 255)) > 0) { buffer[num_read] = '\0'; error << buffer; } } while (num_read == -1 && errno == EINTR); if (num_read == 0) { GTEST_LOG_(FATAL) << error.GetString(); } else { const int last_error = errno; GTEST_LOG_(FATAL) << "Error while reading death test internal: " << GetLastErrnoDescription() << " [" << last_error << "]"; } } // Death test constructor. Increments the running death test count // for the current test. DeathTest::DeathTest() { TestInfo* const info = GetUnitTestImpl()->current_test_info(); if (info == nullptr) { DeathTestAbort("Cannot run a death test outside of a TEST or " "TEST_F construct"); } } // Creates and returns a death test by dispatching to the current // death test factory. bool DeathTest::Create(const char* statement, Matcher matcher, const char* file, int line, DeathTest** test) { return GetUnitTestImpl()->death_test_factory()->Create( statement, std::move(matcher), file, line, test); } const char* DeathTest::LastMessage() { return last_death_test_message_.c_str(); } void DeathTest::set_last_death_test_message(const std::string& message) { last_death_test_message_ = message; } std::string DeathTest::last_death_test_message_; // Provides cross platform implementation for some death functionality. class DeathTestImpl : public DeathTest { protected: DeathTestImpl(const char* a_statement, Matcher matcher) : statement_(a_statement), matcher_(std::move(matcher)), spawned_(false), status_(-1), outcome_(IN_PROGRESS), read_fd_(-1), write_fd_(-1) {} // read_fd_ is expected to be closed and cleared by a derived class. ~DeathTestImpl() override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } void Abort(AbortReason reason) override; bool Passed(bool status_ok) override; const char* statement() const { return statement_; } bool spawned() const { return spawned_; } void set_spawned(bool is_spawned) { spawned_ = is_spawned; } int status() const { return status_; } void set_status(int a_status) { status_ = a_status; } DeathTestOutcome outcome() const { return outcome_; } void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } int read_fd() const { return read_fd_; } void set_read_fd(int fd) { read_fd_ = fd; } int write_fd() const { return write_fd_; } void set_write_fd(int fd) { write_fd_ = fd; } // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void ReadAndInterpretStatusByte(); // Returns stderr output from the child process. virtual std::string GetErrorLogs(); private: // The textual content of the code this object is testing. This class // doesn't own this string and should not attempt to delete it. const char* const statement_; // A matcher that's expected to match the stderr output by the child process. Matcher matcher_; // True if the death test child process has been successfully spawned. bool spawned_; // The exit status of the child process. int status_; // How the death test concluded. DeathTestOutcome outcome_; // Descriptor to the read end of the pipe to the child process. It is // always -1 in the child process. The child keeps its write end of the // pipe in write_fd_. int read_fd_; // Descriptor to the child's write end of the pipe to the parent process. // It is always -1 in the parent process. The parent keeps its end of the // pipe in read_fd_. int write_fd_; }; // Called in the parent process only. Reads the result code of the death // test child process via a pipe, interprets it to set the outcome_ // member, and closes read_fd_. Outputs diagnostics and terminates in // case of unexpected codes. void DeathTestImpl::ReadAndInterpretStatusByte() { char flag; int bytes_read; // The read() here blocks until data is available (signifying the // failure of the death test) or until the pipe is closed (signifying // its success), so it's okay to call this in the parent before // the child process has exited. do { bytes_read = posix::Read(read_fd(), &flag, 1); } while (bytes_read == -1 && errno == EINTR); if (bytes_read == 0) { set_outcome(DIED); } else if (bytes_read == 1) { switch (flag) { case kDeathTestReturned: set_outcome(RETURNED); break; case kDeathTestThrew: set_outcome(THREW); break; case kDeathTestLived: set_outcome(LIVED); break; case kDeathTestInternalError: FailFromInternalError(read_fd()); // Does not return. break; default: GTEST_LOG_(FATAL) << "Death test child process reported " << "unexpected status byte (" << static_cast(flag) << ")"; } } else { GTEST_LOG_(FATAL) << "Read from death test child process failed: " << GetLastErrnoDescription(); } GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); set_read_fd(-1); } std::string DeathTestImpl::GetErrorLogs() { return GetCapturedStderr(); } // Signals that the death test code which should have exited, didn't. // Should be called only in a death test child process. // Writes a status byte to the child's status file descriptor, then // calls _exit(1). void DeathTestImpl::Abort(AbortReason reason) { // The parent process considers the death test to be a failure if // it finds any data in our pipe. So, here we write a single flag byte // to the pipe, then exit. const char status_ch = reason == TEST_DID_NOT_DIE ? kDeathTestLived : reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned; GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); // We are leaking the descriptor here because on some platforms (i.e., // when built as Windows DLL), destructors of global objects will still // run after calling _exit(). On such systems, write_fd_ will be // indirectly closed from the destructor of UnitTestImpl, causing double // close if it is also closed here. On debug configurations, double close // may assert. As there are no in-process buffers to flush here, we are // relying on the OS to close the descriptor after the process terminates // when the destructors are not run. _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) } // Returns an indented copy of stderr output for a death test. // This makes distinguishing death test output lines from regular log lines // much easier. static ::std::string FormatDeathTestOutput(const ::std::string& output) { ::std::string ret; for (size_t at = 0; ; ) { const size_t line_end = output.find('\n', at); ret += "[ DEATH ] "; if (line_end == ::std::string::npos) { ret += output.substr(at); break; } ret += output.substr(at, line_end + 1 - at); at = line_end + 1; } return ret; } // Assesses the success or failure of a death test, using both private // members which have previously been set, and one argument: // // Private data members: // outcome: An enumeration describing how the death test // concluded: DIED, LIVED, THREW, or RETURNED. The death test // fails in the latter three cases. // status: The exit status of the child process. On *nix, it is in the // in the format specified by wait(2). On Windows, this is the // value supplied to the ExitProcess() API or a numeric code // of the exception that terminated the program. // matcher_: A matcher that's expected to match the stderr output by the child // process. // // Argument: // status_ok: true if exit_status is acceptable in the context of // this particular death test, which fails if it is false // // Returns true if and only if all of the above conditions are met. Otherwise, // the first failing condition, in the order given above, is the one that is // reported. Also sets the last death test message string. bool DeathTestImpl::Passed(bool status_ok) { if (!spawned()) return false; const std::string error_message = GetErrorLogs(); bool success = false; Message buffer; buffer << "Death test: " << statement() << "\n"; switch (outcome()) { case LIVED: buffer << " Result: failed to die.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case THREW: buffer << " Result: threw an exception.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case RETURNED: buffer << " Result: illegal return in test statement.\n" << " Error msg:\n" << FormatDeathTestOutput(error_message); break; case DIED: if (status_ok) { if (matcher_.Matches(error_message)) { success = true; } else { std::ostringstream stream; matcher_.DescribeTo(&stream); buffer << " Result: died but not with expected error.\n" << " Expected: " << stream.str() << "\n" << "Actual msg:\n" << FormatDeathTestOutput(error_message); } } else { buffer << " Result: died but not with expected exit code:\n" << " " << ExitSummary(status()) << "\n" << "Actual msg:\n" << FormatDeathTestOutput(error_message); } break; case IN_PROGRESS: default: GTEST_LOG_(FATAL) << "DeathTest::Passed somehow called before conclusion of test"; } DeathTest::set_last_death_test_message(buffer.GetString()); return success; } # if GTEST_OS_WINDOWS // WindowsDeathTest implements death tests on Windows. Due to the // specifics of starting new processes on Windows, death tests there are // always threadsafe, and Google Test considers the // --gtest_death_test_style=fast setting to be equivalent to // --gtest_death_test_style=threadsafe there. // // A few implementation notes: Like the Linux version, the Windows // implementation uses pipes for child-to-parent communication. But due to // the specifics of pipes on Windows, some extra steps are required: // // 1. The parent creates a communication pipe and stores handles to both // ends of it. // 2. The parent starts the child and provides it with the information // necessary to acquire the handle to the write end of the pipe. // 3. The child acquires the write end of the pipe and signals the parent // using a Windows event. // 4. Now the parent can release the write end of the pipe on its side. If // this is done before step 3, the object's reference count goes down to // 0 and it is destroyed, preventing the child from acquiring it. The // parent now has to release it, or read operations on the read end of // the pipe will not return when the child terminates. // 5. The parent reads child's output through the pipe (outcome code and // any possible error messages) from the pipe, and its stderr and then // determines whether to fail the test. // // Note: to distinguish Win32 API calls from the local method and function // calls, the former are explicitly resolved in the global namespace. // class WindowsDeathTest : public DeathTestImpl { public: WindowsDeathTest(const char* a_statement, Matcher matcher, const char* file, int line) : DeathTestImpl(a_statement, std::move(matcher)), file_(file), line_(line) {} // All of these virtual functions are inherited from DeathTest. virtual int Wait(); virtual TestRole AssumeRole(); private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; // Handle to the write end of the pipe to the child process. AutoHandle write_handle_; // Child process handle. AutoHandle child_handle_; // Event the child process uses to signal the parent that it has // acquired the handle to the write end of the pipe. After seeing this // event the parent can release its own handles to make sure its // ReadFile() calls return when the child terminates. AutoHandle event_handle_; }; // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int WindowsDeathTest::Wait() { if (!spawned()) return 0; // Wait until the child either signals that it has acquired the write end // of the pipe or it dies. const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; switch (::WaitForMultipleObjects(2, wait_handles, FALSE, // Waits for any of the handles. INFINITE)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: break; default: GTEST_DEATH_TEST_CHECK_(false); // Should not get here. } // The child has acquired the write end of the pipe or exited. // We release the handle on our side and continue. write_handle_.Reset(); event_handle_.Reset(); ReadAndInterpretStatusByte(); // Waits for the child process to exit if it haven't already. This // returns immediately if the child has already exited, regardless of // whether previous calls to WaitForMultipleObjects synchronized on this // handle or not. GTEST_DEATH_TEST_CHECK_( WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), INFINITE)); DWORD status_code; GTEST_DEATH_TEST_CHECK_( ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE); child_handle_.Reset(); set_status(static_cast(status_code)); return status(); } // The AssumeRole process for a Windows death test. It creates a child // process with the same executable as the current process to run the // death test. The child process is given the --gtest_filter and // --gtest_internal_run_death_test flags such that it knows to run the // current death test only. DeathTest::TestRole WindowsDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != nullptr) { // ParseInternalRunDeathTestFlag() has performed all the necessary // processing. set_write_fd(flag->write_fd()); return EXECUTE_TEST; } // WindowsDeathTest uses an anonymous pipe to communicate results of // a death test. SECURITY_ATTRIBUTES handles_are_inheritable = {sizeof(SECURITY_ATTRIBUTES), nullptr, TRUE}; HANDLE read_handle, write_handle; GTEST_DEATH_TEST_CHECK_( ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, 0) // Default buffer size. != FALSE); set_read_fd(::_open_osfhandle(reinterpret_cast(read_handle), O_RDONLY)); write_handle_.Reset(write_handle); event_handle_.Reset(::CreateEvent( &handles_are_inheritable, TRUE, // The event will automatically reset to non-signaled state. FALSE, // The initial state is non-signalled. nullptr)); // The even is unnamed. GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != nullptr); const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" + info->test_suite_name() + "." + info->name(); const std::string internal_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" + file_ + "|" + StreamableToString(line_) + "|" + StreamableToString(death_test_index) + "|" + StreamableToString(static_cast(::GetCurrentProcessId())) + // size_t has the same width as pointers on both 32-bit and 64-bit // Windows platforms. // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. "|" + StreamableToString(reinterpret_cast(write_handle)) + "|" + StreamableToString(reinterpret_cast(event_handle_.Get())); char executable_path[_MAX_PATH + 1]; // NOLINT GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(nullptr, executable_path, _MAX_PATH)); std::string command_line = std::string(::GetCommandLineA()) + " " + filter_flag + " \"" + internal_flag + "\""; DeathTest::set_last_death_test_message(""); CaptureStderr(); // Flush the log buffers since the log streams are shared with the child. FlushInfoLog(); // The child process will share the standard handles with the parent. STARTUPINFOA startup_info; memset(&startup_info, 0, sizeof(STARTUPINFO)); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); PROCESS_INFORMATION process_info; GTEST_DEATH_TEST_CHECK_( ::CreateProcessA( executable_path, const_cast(command_line.c_str()), nullptr, // Retuned process handle is not inheritable. nullptr, // Retuned thread handle is not inheritable. TRUE, // Child inherits all inheritable handles (for write_handle_). 0x0, // Default creation flags. nullptr, // Inherit the parent's environment. UnitTest::GetInstance()->original_working_dir(), &startup_info, &process_info) != FALSE); child_handle_.Reset(process_info.hProcess); ::CloseHandle(process_info.hThread); set_spawned(true); return OVERSEE_TEST; } # elif GTEST_OS_FUCHSIA class FuchsiaDeathTest : public DeathTestImpl { public: FuchsiaDeathTest(const char* a_statement, Matcher matcher, const char* file, int line) : DeathTestImpl(a_statement, std::move(matcher)), file_(file), line_(line) {} // All of these virtual functions are inherited from DeathTest. int Wait() override; TestRole AssumeRole() override; std::string GetErrorLogs() override; private: // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; // The stderr data captured by the child process. std::string captured_stderr_; zx::process child_process_; zx::channel exception_channel_; zx::socket stderr_socket_; }; // Utility class for accumulating command-line arguments. class Arguments { public: Arguments() { args_.push_back(nullptr); } ~Arguments() { for (std::vector::iterator i = args_.begin(); i != args_.end(); ++i) { free(*i); } } void AddArgument(const char* argument) { args_.insert(args_.end() - 1, posix::StrDup(argument)); } template void AddArguments(const ::std::vector& arguments) { for (typename ::std::vector::const_iterator i = arguments.begin(); i != arguments.end(); ++i) { args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); } } char* const* Argv() { return &args_[0]; } int size() { return args_.size() - 1; } private: std::vector args_; }; // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int FuchsiaDeathTest::Wait() { const int kProcessKey = 0; const int kSocketKey = 1; const int kExceptionKey = 2; if (!spawned()) return 0; // Create a port to wait for socket/task/exception events. zx_status_t status_zx; zx::port port; status_zx = zx::port::create(0, &port); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); // Register to wait for the child process to terminate. status_zx = child_process_.wait_async( port, kProcessKey, ZX_PROCESS_TERMINATED, ZX_WAIT_ASYNC_ONCE); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); // Register to wait for the socket to be readable or closed. status_zx = stderr_socket_.wait_async( port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, ZX_WAIT_ASYNC_ONCE); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); // Register to wait for an exception. status_zx = exception_channel_.wait_async( port, kExceptionKey, ZX_CHANNEL_READABLE, ZX_WAIT_ASYNC_ONCE); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); bool process_terminated = false; bool socket_closed = false; do { zx_port_packet_t packet = {}; status_zx = port.wait(zx::time::infinite(), &packet); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); if (packet.key == kExceptionKey) { // Process encountered an exception. Kill it directly rather than // letting other handlers process the event. We will get a kProcessKey // event when the process actually terminates. status_zx = child_process_.kill(); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); } else if (packet.key == kProcessKey) { // Process terminated. GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type)); GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED); process_terminated = true; } else if (packet.key == kSocketKey) { GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type)); if (packet.signal.observed & ZX_SOCKET_READABLE) { // Read data from the socket. constexpr size_t kBufferSize = 1024; do { size_t old_length = captured_stderr_.length(); size_t bytes_read = 0; captured_stderr_.resize(old_length + kBufferSize); status_zx = stderr_socket_.read( 0, &captured_stderr_.front() + old_length, kBufferSize, &bytes_read); captured_stderr_.resize(old_length + bytes_read); } while (status_zx == ZX_OK); if (status_zx == ZX_ERR_PEER_CLOSED) { socket_closed = true; } else { GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT); status_zx = stderr_socket_.wait_async( port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED, ZX_WAIT_ASYNC_ONCE); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); } } else { GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED); socket_closed = true; } } } while (!process_terminated && !socket_closed); ReadAndInterpretStatusByte(); zx_info_process_t buffer; status_zx = child_process_.get_info( ZX_INFO_PROCESS, &buffer, sizeof(buffer), nullptr, nullptr); GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK); GTEST_DEATH_TEST_CHECK_(buffer.exited); set_status(buffer.return_code); return status(); } // The AssumeRole process for a Fuchsia death test. It creates a child // process with the same executable as the current process to run the // death test. The child process is given the --gtest_filter and // --gtest_internal_run_death_test flags such that it knows to run the // current death test only. DeathTest::TestRole FuchsiaDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != nullptr) { // ParseInternalRunDeathTestFlag() has performed all the necessary // processing. set_write_fd(kFuchsiaReadPipeFd); return EXECUTE_TEST; } // Flush the log buffers since the log streams are shared with the child. FlushInfoLog(); // Build the child process command line. const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" + info->test_suite_name() + "." + info->name(); const std::string internal_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" + file_ + "|" + StreamableToString(line_) + "|" + StreamableToString(death_test_index); Arguments args; args.AddArguments(GetInjectableArgvs()); args.AddArgument(filter_flag.c_str()); args.AddArgument(internal_flag.c_str()); // Build the pipe for communication with the child. zx_status_t status; zx_handle_t child_pipe_handle; int child_pipe_fd; status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle); GTEST_DEATH_TEST_CHECK_(status == ZX_OK); set_read_fd(child_pipe_fd); // Set the pipe handle for the child. fdio_spawn_action_t spawn_actions[2] = {}; fdio_spawn_action_t* add_handle_action = &spawn_actions[0]; add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE; add_handle_action->h.id = PA_HND(PA_FD, kFuchsiaReadPipeFd); add_handle_action->h.handle = child_pipe_handle; // Create a socket pair will be used to receive the child process' stderr. zx::socket stderr_producer_socket; status = zx::socket::create(0, &stderr_producer_socket, &stderr_socket_); GTEST_DEATH_TEST_CHECK_(status >= 0); int stderr_producer_fd = -1; status = fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd); GTEST_DEATH_TEST_CHECK_(status >= 0); // Make the stderr socket nonblocking. GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0); fdio_spawn_action_t* add_stderr_action = &spawn_actions[1]; add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD; add_stderr_action->fd.local_fd = stderr_producer_fd; add_stderr_action->fd.target_fd = STDERR_FILENO; // Create a child job. zx_handle_t child_job = ZX_HANDLE_INVALID; status = zx_job_create(zx_job_default(), 0, & child_job); GTEST_DEATH_TEST_CHECK_(status == ZX_OK); zx_policy_basic_t policy; policy.condition = ZX_POL_NEW_ANY; policy.policy = ZX_POL_ACTION_ALLOW; status = zx_job_set_policy( child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC, &policy, 1); GTEST_DEATH_TEST_CHECK_(status == ZX_OK); // Create an exception channel attached to the |child_job|, to allow // us to suppress the system default exception handler from firing. status = zx_task_create_exception_channel( child_job, 0, exception_channel_.reset_and_get_address()); GTEST_DEATH_TEST_CHECK_(status == ZX_OK); // Spawn the child process. status = fdio_spawn_etc( child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0], args.Argv(), nullptr, 2, spawn_actions, child_process_.reset_and_get_address(), nullptr); GTEST_DEATH_TEST_CHECK_(status == ZX_OK); set_spawned(true); return OVERSEE_TEST; } std::string FuchsiaDeathTest::GetErrorLogs() { return captured_stderr_; } #else // We are neither on Windows, nor on Fuchsia. // ForkingDeathTest provides implementations for most of the abstract // methods of the DeathTest interface. Only the AssumeRole method is // left undefined. class ForkingDeathTest : public DeathTestImpl { public: ForkingDeathTest(const char* statement, Matcher matcher); // All of these virtual functions are inherited from DeathTest. int Wait() override; protected: void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } private: // PID of child process during death test; 0 in the child process itself. pid_t child_pid_; }; // Constructs a ForkingDeathTest. ForkingDeathTest::ForkingDeathTest(const char* a_statement, Matcher matcher) : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {} // Waits for the child in a death test to exit, returning its exit // status, or 0 if no child process exists. As a side effect, sets the // outcome data member. int ForkingDeathTest::Wait() { if (!spawned()) return 0; ReadAndInterpretStatusByte(); int status_value; GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); set_status(status_value); return status_value; } // A concrete death test class that forks, then immediately runs the test // in the child process. class NoExecDeathTest : public ForkingDeathTest { public: NoExecDeathTest(const char* a_statement, Matcher matcher) : ForkingDeathTest(a_statement, std::move(matcher)) {} TestRole AssumeRole() override; }; // The AssumeRole process for a fork-and-run death test. It implements a // straightforward fork, with a simple pipe to transmit the status byte. DeathTest::TestRole NoExecDeathTest::AssumeRole() { const size_t thread_count = GetThreadCount(); if (thread_count != 1) { GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); DeathTest::set_last_death_test_message(""); CaptureStderr(); // When we fork the process below, the log file buffers are copied, but the // file descriptors are shared. We flush all log files here so that closing // the file descriptors in the child process doesn't throw off the // synchronization between descriptors and buffers in the parent process. // This is as close to the fork as possible to avoid a race condition in case // there are multiple threads running before the death test, and another // thread writes to the log file. FlushInfoLog(); const pid_t child_pid = fork(); GTEST_DEATH_TEST_CHECK_(child_pid != -1); set_child_pid(child_pid); if (child_pid == 0) { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); set_write_fd(pipe_fd[1]); // Redirects all logging to stderr in the child process to prevent // concurrent writes to the log files. We capture stderr in the parent // process and append the child process' output to a log. LogToStderr(); // Event forwarding to the listeners of event listener API mush be shut // down in death test subprocesses. GetUnitTestImpl()->listeners()->SuppressEventForwarding(); g_in_fast_death_test_child = true; return EXECUTE_TEST; } else { GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } } // A concrete death test class that forks and re-executes the main // program from the beginning, with command-line flags set that cause // only this specific death test to be run. class ExecDeathTest : public ForkingDeathTest { public: ExecDeathTest(const char* a_statement, Matcher matcher, const char* file, int line) : ForkingDeathTest(a_statement, std::move(matcher)), file_(file), line_(line) {} TestRole AssumeRole() override; private: static ::std::vector GetArgvsForDeathTestChildProcess() { ::std::vector args = GetInjectableArgvs(); # if defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_) ::std::vector extra_args = GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_(); args.insert(args.end(), extra_args.begin(), extra_args.end()); # endif // defined(GTEST_EXTRA_DEATH_TEST_COMMAND_LINE_ARGS_) return args; } // The name of the file in which the death test is located. const char* const file_; // The line number on which the death test is located. const int line_; }; // Utility class for accumulating command-line arguments. class Arguments { public: Arguments() { args_.push_back(nullptr); } ~Arguments() { for (std::vector::iterator i = args_.begin(); i != args_.end(); ++i) { free(*i); } } void AddArgument(const char* argument) { args_.insert(args_.end() - 1, posix::StrDup(argument)); } template void AddArguments(const ::std::vector& arguments) { for (typename ::std::vector::const_iterator i = arguments.begin(); i != arguments.end(); ++i) { args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); } } char* const* Argv() { return &args_[0]; } private: std::vector args_; }; // A struct that encompasses the arguments to the child process of a // threadsafe-style death test process. struct ExecDeathTestArgs { char* const* argv; // Command-line arguments for the child's call to exec int close_fd; // File descriptor to close; the read end of a pipe }; # if GTEST_OS_MAC inline char** GetEnviron() { // When Google Test is built as a framework on MacOS X, the environ variable // is unavailable. Apple's documentation (man environ) recommends using // _NSGetEnviron() instead. return *_NSGetEnviron(); } # else // Some POSIX platforms expect you to declare environ. extern "C" makes // it reside in the global namespace. extern "C" char** environ; inline char** GetEnviron() { return environ; } # endif // GTEST_OS_MAC # if !GTEST_OS_QNX // The main function for a threadsafe-style death test child process. // This function is called in a clone()-ed process and thus must avoid // any potentially unsafe operations like malloc or libc functions. static int ExecDeathTestChildMain(void* child_arg) { ExecDeathTestArgs* const args = static_cast(child_arg); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); // We need to execute the test program in the same environment where // it was originally invoked. Therefore we change to the original // working directory first. const char* const original_dir = UnitTest::GetInstance()->original_working_dir(); // We can safely call chdir() as it's a direct system call. if (chdir(original_dir) != 0) { DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } // We can safely call execve() as it's a direct system call. We // cannot use execvp() as it's a libc function and thus potentially // unsafe. Since execve() doesn't search the PATH, the user must // invoke the test program via a valid path that contains at least // one path separator. execve(args->argv[0], args->argv, GetEnviron()); DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " + original_dir + " failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } # endif // !GTEST_OS_QNX # if GTEST_HAS_CLONE // Two utility routines that together determine the direction the stack // grows. // This could be accomplished more elegantly by a single recursive // function, but we want to guard against the unlikely possibility of // a smart compiler optimizing the recursion away. // // GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining // StackLowerThanAddress into StackGrowsDown, which then doesn't give // correct answer. static void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_; // HWAddressSanitizer add a random tag to the MSB of the local variable address, // making comparison result unpredictable. GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ static void StackLowerThanAddress(const void* ptr, bool* result) { int dummy; *result = (&dummy < ptr); } // Make sure AddressSanitizer does not tamper with the stack here. GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ static bool StackGrowsDown() { int dummy; bool result; StackLowerThanAddress(&dummy, &result); return result; } # endif // GTEST_HAS_CLONE // Spawns a child process with the same executable as the current process in // a thread-safe manner and instructs it to run the death test. The // implementation uses fork(2) + exec. On systems where clone(2) is // available, it is used instead, being slightly more thread-safe. On QNX, // fork supports only single-threaded environments, so this function uses // spawn(2) there instead. The function dies with an error message if // anything goes wrong. static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) { ExecDeathTestArgs args = { argv, close_fd }; pid_t child_pid = -1; # if GTEST_OS_QNX // Obtains the current directory and sets it to be closed in the child // process. const int cwd_fd = open(".", O_RDONLY); GTEST_DEATH_TEST_CHECK_(cwd_fd != -1); GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC)); // We need to execute the test program in the same environment where // it was originally invoked. Therefore we change to the original // working directory first. const char* const original_dir = UnitTest::GetInstance()->original_working_dir(); // We can safely call chdir() as it's a direct system call. if (chdir(original_dir) != 0) { DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " + GetLastErrnoDescription()); return EXIT_FAILURE; } int fd_flags; // Set close_fd to be closed after spawn. GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD)); GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD, fd_flags | FD_CLOEXEC)); struct inheritance inherit = {0}; // spawn is a system call. child_pid = spawn(args.argv[0], 0, nullptr, &inherit, args.argv, GetEnviron()); // Restores the current working directory. GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd)); # else // GTEST_OS_QNX # if GTEST_OS_LINUX // When a SIGPROF signal is received while fork() or clone() are executing, // the process may hang. To avoid this, we ignore SIGPROF here and re-enable // it after the call to fork()/clone() is complete. struct sigaction saved_sigprof_action; struct sigaction ignore_sigprof_action; memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action)); sigemptyset(&ignore_sigprof_action.sa_mask); ignore_sigprof_action.sa_handler = SIG_IGN; GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction( SIGPROF, &ignore_sigprof_action, &saved_sigprof_action)); # endif // GTEST_OS_LINUX # if GTEST_HAS_CLONE const bool use_fork = GTEST_FLAG(death_test_use_fork); if (!use_fork) { static const bool stack_grows_down = StackGrowsDown(); const auto stack_size = static_cast(getpagesize()); // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); // Maximum stack alignment in bytes: For a downward-growing stack, this // amount is subtracted from size of the stack space to get an address // that is within the stack space and is aligned on all systems we care // about. As far as I know there is no ABI with stack alignment greater // than 64. We assume stack and stack_size already have alignment of // kMaxStackAlignment. const size_t kMaxStackAlignment = 64; void* const stack_top = static_cast(stack) + (stack_grows_down ? stack_size - kMaxStackAlignment : 0); GTEST_DEATH_TEST_CHECK_( static_cast(stack_size) > kMaxStackAlignment && reinterpret_cast(stack_top) % kMaxStackAlignment == 0); child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); } # else const bool use_fork = true; # endif // GTEST_HAS_CLONE if (use_fork && (child_pid = fork()) == 0) { ExecDeathTestChildMain(&args); _exit(0); } # endif // GTEST_OS_QNX # if GTEST_OS_LINUX GTEST_DEATH_TEST_CHECK_SYSCALL_( sigaction(SIGPROF, &saved_sigprof_action, nullptr)); # endif // GTEST_OS_LINUX GTEST_DEATH_TEST_CHECK_(child_pid != -1); return child_pid; } // The AssumeRole process for a fork-and-exec death test. It re-executes the // main program from the beginning, setting the --gtest_filter // and --gtest_internal_run_death_test flags to cause only the current // death test to be re-run. DeathTest::TestRole ExecDeathTest::AssumeRole() { const UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const TestInfo* const info = impl->current_test_info(); const int death_test_index = info->result()->death_test_count(); if (flag != nullptr) { set_write_fd(flag->write_fd()); return EXECUTE_TEST; } int pipe_fd[2]; GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); // Clear the close-on-exec flag on the write end of the pipe, lest // it be closed when the child process does an exec: GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" + info->test_suite_name() + "." + info->name(); const std::string internal_flag = std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "=" + file_ + "|" + StreamableToString(line_) + "|" + StreamableToString(death_test_index) + "|" + StreamableToString(pipe_fd[1]); Arguments args; args.AddArguments(GetArgvsForDeathTestChildProcess()); args.AddArgument(filter_flag.c_str()); args.AddArgument(internal_flag.c_str()); DeathTest::set_last_death_test_message(""); CaptureStderr(); // See the comment in NoExecDeathTest::AssumeRole for why the next line // is necessary. FlushInfoLog(); const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]); GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); set_child_pid(child_pid); set_read_fd(pipe_fd[0]); set_spawned(true); return OVERSEE_TEST; } # endif // !GTEST_OS_WINDOWS // Creates a concrete DeathTest-derived class that depends on the // --gtest_death_test_style flag, and sets the pointer pointed to // by the "test" argument to its address. If the test should be // skipped, sets that pointer to NULL. Returns true, unless the // flag is set to an invalid value. bool DefaultDeathTestFactory::Create(const char* statement, Matcher matcher, const char* file, int line, DeathTest** test) { UnitTestImpl* const impl = GetUnitTestImpl(); const InternalRunDeathTestFlag* const flag = impl->internal_run_death_test_flag(); const int death_test_index = impl->current_test_info() ->increment_death_test_count(); if (flag != nullptr) { if (death_test_index > flag->index()) { DeathTest::set_last_death_test_message( "Death test count (" + StreamableToString(death_test_index) + ") somehow exceeded expected maximum (" + StreamableToString(flag->index()) + ")"); return false; } if (!(flag->file() == file && flag->line() == line && flag->index() == death_test_index)) { *test = nullptr; return true; } } # if GTEST_OS_WINDOWS if (GTEST_FLAG(death_test_style) == "threadsafe" || GTEST_FLAG(death_test_style) == "fast") { *test = new WindowsDeathTest(statement, std::move(matcher), file, line); } # elif GTEST_OS_FUCHSIA if (GTEST_FLAG(death_test_style) == "threadsafe" || GTEST_FLAG(death_test_style) == "fast") { *test = new FuchsiaDeathTest(statement, std::move(matcher), file, line); } # else if (GTEST_FLAG(death_test_style) == "threadsafe") { *test = new ExecDeathTest(statement, std::move(matcher), file, line); } else if (GTEST_FLAG(death_test_style) == "fast") { *test = new NoExecDeathTest(statement, std::move(matcher)); } # endif // GTEST_OS_WINDOWS else { // NOLINT - this is more readable than unbalanced brackets inside #if. DeathTest::set_last_death_test_message( "Unknown death test style \"" + GTEST_FLAG(death_test_style) + "\" encountered"); return false; } return true; } # if GTEST_OS_WINDOWS // Recreates the pipe and event handles from the provided parameters, // signals the event, and returns a file descriptor wrapped around the pipe // handle. This function is called in the child process only. static int GetStatusFileDescriptor(unsigned int parent_process_id, size_t write_handle_as_size_t, size_t event_handle_as_size_t) { AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, FALSE, // Non-inheritable. parent_process_id)); if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { DeathTestAbort("Unable to open parent process " + StreamableToString(parent_process_id)); } GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); const HANDLE write_handle = reinterpret_cast(write_handle_as_size_t); HANDLE dup_write_handle; // The newly initialized handle is accessible only in the parent // process. To obtain one accessible within the child, we need to use // DuplicateHandle. if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, ::GetCurrentProcess(), &dup_write_handle, 0x0, // Requested privileges ignored since // DUPLICATE_SAME_ACCESS is used. FALSE, // Request non-inheritable handler. DUPLICATE_SAME_ACCESS)) { DeathTestAbort("Unable to duplicate the pipe handle " + StreamableToString(write_handle_as_size_t) + " from the parent process " + StreamableToString(parent_process_id)); } const HANDLE event_handle = reinterpret_cast(event_handle_as_size_t); HANDLE dup_event_handle; if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, ::GetCurrentProcess(), &dup_event_handle, 0x0, FALSE, DUPLICATE_SAME_ACCESS)) { DeathTestAbort("Unable to duplicate the event handle " + StreamableToString(event_handle_as_size_t) + " from the parent process " + StreamableToString(parent_process_id)); } const int write_fd = ::_open_osfhandle(reinterpret_cast(dup_write_handle), O_APPEND); if (write_fd == -1) { DeathTestAbort("Unable to convert pipe handle " + StreamableToString(write_handle_as_size_t) + " to a file descriptor"); } // Signals the parent that the write end of the pipe has been acquired // so the parent can release its own write end. ::SetEvent(dup_event_handle); return write_fd; } # endif // GTEST_OS_WINDOWS // Returns a newly created InternalRunDeathTestFlag object with fields // initialized from the GTEST_FLAG(internal_run_death_test) flag if // the flag is specified; otherwise returns NULL. InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { if (GTEST_FLAG(internal_run_death_test) == "") return nullptr; // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we // can use it here. int line = -1; int index = -1; ::std::vector< ::std::string> fields; SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); int write_fd = -1; # if GTEST_OS_WINDOWS unsigned int parent_process_id = 0; size_t write_handle_as_size_t = 0; size_t event_handle_as_size_t = 0; if (fields.size() != 6 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &parent_process_id) || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { DeathTestAbort("Bad --gtest_internal_run_death_test flag: " + GTEST_FLAG(internal_run_death_test)); } write_fd = GetStatusFileDescriptor(parent_process_id, write_handle_as_size_t, event_handle_as_size_t); # elif GTEST_OS_FUCHSIA if (fields.size() != 3 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index)) { DeathTestAbort("Bad --gtest_internal_run_death_test flag: " + GTEST_FLAG(internal_run_death_test)); } # else if (fields.size() != 4 || !ParseNaturalNumber(fields[1], &line) || !ParseNaturalNumber(fields[2], &index) || !ParseNaturalNumber(fields[3], &write_fd)) { DeathTestAbort("Bad --gtest_internal_run_death_test flag: " + GTEST_FLAG(internal_run_death_test)); } # endif // GTEST_OS_WINDOWS return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); } } // namespace internal #endif // GTEST_HAS_DEATH_TEST } // namespace testing dvisvgm-2.8.1/tests/gtest/src/gtest_main.cc0000664000175000017500000000352013553267757015670 00000000000000// Copyright 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "gtest/gtest.h" #ifdef ARDUINO void setup() { testing::InitGoogleTest(); } void loop() { RUN_ALL_TESTS(); } #else GTEST_API_ int main(int argc, char **argv) { printf("Running main() from %s\n", __FILE__); testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } #endif dvisvgm-2.8.1/tests/gtest/src/gtest-typed-test.cc0000664000175000017500000000752313553267757016773 00000000000000// Copyright 2008 Google Inc. // All Rights Reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "gtest/gtest-typed-test.h" #include "gtest/gtest.h" namespace testing { namespace internal { #if GTEST_HAS_TYPED_TEST_P // Skips to the first non-space char in str. Returns an empty string if str // contains only whitespace characters. static const char* SkipSpaces(const char* str) { while (IsSpace(*str)) str++; return str; } static std::vector SplitIntoTestNames(const char* src) { std::vector name_vec; src = SkipSpaces(src); for (; src != nullptr; src = SkipComma(src)) { name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src))); } return name_vec; } // Verifies that registered_tests match the test names in // registered_tests_; returns registered_tests if successful, or // aborts the program otherwise. const char* TypedTestSuitePState::VerifyRegisteredTestNames( const char* file, int line, const char* registered_tests) { typedef RegisteredTestsMap::const_iterator RegisteredTestIter; registered_ = true; std::vector name_vec = SplitIntoTestNames(registered_tests); Message errors; std::set tests; for (std::vector::const_iterator name_it = name_vec.begin(); name_it != name_vec.end(); ++name_it) { const std::string& name = *name_it; if (tests.count(name) != 0) { errors << "Test " << name << " is listed more than once.\n"; continue; } bool found = false; for (RegisteredTestIter it = registered_tests_.begin(); it != registered_tests_.end(); ++it) { if (name == it->first) { found = true; break; } } if (found) { tests.insert(name); } else { errors << "No test named " << name << " can be found in this test suite.\n"; } } for (RegisteredTestIter it = registered_tests_.begin(); it != registered_tests_.end(); ++it) { if (tests.count(it->first) == 0) { errors << "You forgot to list test " << it->first << ".\n"; } } const std::string& errors_str = errors.GetString(); if (errors_str != "") { fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), errors_str.c_str()); fflush(stderr); posix::Abort(); } return registered_tests; } #endif // GTEST_HAS_TYPED_TEST_P } // namespace internal } // namespace testing dvisvgm-2.8.1/tests/StringMatcherTest.cpp0000664000175000017500000001055413510660062015410 00000000000000/************************************************************************* ** StringMatcherTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "InputReader.hpp" using namespace std; TEST(StringMatcherTest, match1) { istringstream iss; StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_FALSE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 0u); EXPECT_LT(ir.peek(), 0); } TEST(StringMatcherTest, match2) { istringstream iss("abcpatpatternxyz"); StringMatcher matcher(""); StreamInputReader ir(iss); EXPECT_TRUE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 1u); EXPECT_EQ(ir.peek(), 'b'); } TEST(StringMatcherTest, match3) { istringstream iss("abcpatatternxyz"); StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_FALSE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 15u); EXPECT_LT(ir.peek(), 0); } TEST(StringMatcherTest, match4) { istringstream iss("abcpatpatternxyz"); StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_TRUE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 13u); EXPECT_EQ(ir.peek(), 'x'); iss.clear(); iss.str("abcpatpattern"); EXPECT_TRUE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 13u); EXPECT_LT(ir.peek(), 0); iss.clear(); iss.str("pattern"); EXPECT_TRUE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 7u); EXPECT_LT(ir.peek(), 0); } TEST(StringMatcherTest, match5) { istringstream iss("abcpatpatternxyz"); StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_TRUE(matcher.match(ir)); EXPECT_EQ(matcher.charsRead(), 13u); EXPECT_EQ(ir.peek(), 'x'); } TEST(StringMatcherTest, read1) { istringstream iss; StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_TRUE(matcher.read(ir).empty()); EXPECT_EQ(matcher.charsRead(), 0u); EXPECT_LT(ir.peek(), 0); } TEST(StringMatcherTest, read2) { istringstream iss("abcpatpatternxyz"); StringMatcher matcher(""); StreamInputReader ir(iss); EXPECT_EQ(matcher.read(ir), "a"); EXPECT_EQ(matcher.charsRead(), 1u); EXPECT_EQ(ir.peek(), 'b'); } TEST(StringMatcherTest, read3) { istringstream iss("abcpatatternxyz"); StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_EQ(matcher.read(ir), "abcpatatternxyz"); EXPECT_EQ(matcher.charsRead(), 15u); EXPECT_LT(ir.peek(), 0); } TEST(StringMatcherTest, read4) { istringstream iss("abcpatpatternxyz"); StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_EQ(matcher.read(ir), "abcpatpattern"); EXPECT_EQ(matcher.charsRead(), 13u); EXPECT_EQ(ir.peek(), 'x'); iss.clear(); iss.str("abcpatpattern"); EXPECT_EQ(matcher.read(ir), "abcpatpattern"); EXPECT_EQ(matcher.charsRead(), 13u); EXPECT_LT(ir.peek(), 0); iss.clear(); iss.str("pattern"); EXPECT_EQ(matcher.read(ir), "pattern"); EXPECT_EQ(matcher.charsRead(), 7u); EXPECT_LT(ir.peek(), 0); } TEST(StringMatcherTest, read5) { istringstream iss("abcpatpatternxyz"); StringMatcher matcher("pattern"); StreamInputReader ir(iss); EXPECT_EQ(matcher.read(ir), "abcpatpattern"); EXPECT_EQ(matcher.charsRead(), 13u); EXPECT_EQ(ir.peek(), 'x'); } dvisvgm-2.8.1/tests/EllipticalArcTest.cpp0000664000175000017500000001333213536436422015354 00000000000000/************************************************************************* ** EllipticalArcTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "EllipticalArc.hpp" #include "utility.hpp" using namespace std; #define EXPECT_NEAR_PAIR(p1, p2, eps) \ EXPECT_NEAR(p1.x(), p2.x(), eps); \ EXPECT_NEAR(p1.y(), p2.y(), eps) TEST(EllipticalArcTest, construct1) { EllipticalArc arc(DPair(125,75), 100, 50, math::deg2rad(30), 1, 1, DPair(225, 125)); EXPECT_FALSE(arc.isStraightLine()); EXPECT_EQ(arc.startPoint(), DPair(125,75)); EXPECT_EQ(arc.endPoint(), DPair(225,125)); EXPECT_EQ(arc.rx(), 100); EXPECT_EQ(arc.ry(), 50); EXPECT_NEAR(math::rad2deg(arc.rotationAngle()), 30, 0.0001); EXPECT_TRUE(arc.largeArc()); EXPECT_TRUE(arc.sweepPositive()); } TEST(EllipticalArcTest, construct2) { // radii two small, check automatic adaption EllipticalArc arc(DPair(125,75), 20, 10, math::deg2rad(30), 1, 1, DPair(225, 125)); EXPECT_FALSE(arc.isStraightLine()); EXPECT_EQ(arc.startPoint(), DPair(125,75)); EXPECT_EQ(arc.endPoint(), DPair(225,125)); EXPECT_NEAR(arc.rx(), 56.2, 0.01); EXPECT_NEAR(arc.ry(), 28.1, 0.01); EXPECT_NEAR(math::rad2deg(arc.rotationAngle()), 30, 0.0001); EXPECT_TRUE(arc.largeArc()); EXPECT_TRUE(arc.sweepPositive()); } TEST(EllipticalArcTest, construct3) { EXPECT_TRUE(EllipticalArc(DPair(125,75), 0, 10, math::deg2rad(30), 1, 1, DPair(225, 125)).isStraightLine()); EXPECT_TRUE(EllipticalArc(DPair(125,75), 20, 0, math::deg2rad(30), 1, 1, DPair(225, 125)).isStraightLine()); EXPECT_TRUE(EllipticalArc(DPair(125,75), 0, 0, math::deg2rad(30), 1, 1, DPair(225, 125)).isStraightLine()); } TEST(EllipticalArcTest, construct4) { // center parameterization EllipticalArc arc(DPair(100,100), 100, 50, math::deg2rad(30), math::deg2rad(30), math::deg2rad(80)); EXPECT_FALSE(arc.isStraightLine()); EXPECT_NEAR_PAIR(arc.startPoint(), DPair(152.452, 164.952), 0.001); EXPECT_NEAR_PAIR(arc.endPoint(), DPair(50.856, 123.589), 0.001); EXPECT_NEAR(arc.rx(), 100, 0.1); EXPECT_NEAR(arc.ry(), 50, 0.1); EXPECT_NEAR(math::rad2deg(arc.rotationAngle()), 30, 0.0001); EXPECT_FALSE(arc.largeArc()); EXPECT_TRUE(arc.sweepPositive()); } TEST(EllipticalArcTest, transform) { EllipticalArc arc(DPair(125,75), 100, 50, math::deg2rad(30), 1, 1, DPair(225, 125)); Matrix m(1); m.scale(1,2).rotate(30).xskewByAngle(15).rotate(20).yskewByAngle(-20); arc.transform(m); EXPECT_NEAR_PAIR(arc.startPoint(), DPair(13.8871, 204.752), 0.001); EXPECT_NEAR_PAIR(arc.endPoint(), DPair(35.957, 350.121), 0.001); EXPECT_NEAR(arc.rx(), 154.73, 0.001); EXPECT_NEAR(arc.ry(), 64.629, 0.001); EXPECT_NEAR(math::rad2deg(arc.rotationAngle()), -81.748, 0.001); EXPECT_TRUE(arc.largeArc()); EXPECT_TRUE(arc.sweepPositive()); } TEST(EllipticalArcTest, bbox1) { EllipticalArc arc(DPair(125,75), 100, 50, math::deg2rad(30), 1, 1, DPair(225, 125)); BoundingBox bbox = arc.getBBox(); EXPECT_NEAR(bbox.minX(), 96.854, 0.001); EXPECT_NEAR(bbox.minY(), -6.633, 0.001); EXPECT_NEAR(bbox.width(), 180.278, 0.001); EXPECT_NEAR(bbox.height(), 132.288, 0.001); } TEST(EllipticalArcTest, bbox2) { EllipticalArc arc(DPair(125,75), 100, 50, math::deg2rad(30), 0, 1, DPair(225, 125)); BoundingBox bbox = arc.getBBox(); EXPECT_NEAR(bbox.minX(), 125, 0.1); EXPECT_NEAR(bbox.minY(), 75, 0.1); EXPECT_NEAR(bbox.width(), 100, 0.1); EXPECT_NEAR(bbox.height(), 50, 0.1); } TEST(EllipticalArcTest, approximate1) { EllipticalArc arc(DPair(125,75), 100, 50, math::deg2rad(30), 1, 1, DPair(225, 125)); auto beziers = arc.approximate(); ASSERT_EQ(beziers.size(), 4u); DPair data[4][4] = { {DPair(125, 75), DPair(96.271, 46.768), DPair(88.655, 17.402), DPair(106.223, 2.602)}, {DPair(106.223, 2.602), DPair(123.791, -12.198), DPair(162.434, -8.971), DPair(201.493, 10.558)}, {DPair(201.493, 10.558), DPair(240.551, 30.088), DPair(270.89, 61.351), DPair(276.289, 87.635)}, {DPair(276.289, 87.635), DPair(281.688, 113.919), DPair(260.884, 129.074), DPair(225, 125)} }; for (int i=0; i < 4; i++) { for (int j=0; j < 4; j++) { EXPECT_NEAR_PAIR(beziers[i].point(j), data[i][j], 0.001); } } } TEST(EllipticalArcTest, approximate2) { EllipticalArc arc(DPair(125,75), 100, 50, math::deg2rad(30), 0, 1, DPair(225, 125)); auto beziers = arc.approximate(); ASSERT_EQ(beziers.size(), 1u); DPair data[] = {DPair(125, 75), DPair(158.522, 78.806), DPair(198.163, 98.627), DPair(225, 125)}; for (int j=0; j < 4; j++) { EXPECT_NEAR_PAIR(beziers[0].point(j), data[j], 0.001); } } dvisvgm-2.8.1/tests/PSInterpreterTest.cpp0000664000175000017500000002021713561275357015420 00000000000000/************************************************************************* ** PSInterpreterTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "PSInterpreter.hpp" #include #include using namespace std; class PSTestActions : public PSActions { public: void applyscalevals (vector &p) override {print("applyscalevals", p);} void clip (vector &p) override {print("clip", p);} void clippath (vector &p) override {print("clippath", p);} void closepath (vector &p) override {print("closepath", p);} void curveto (vector &p) override {print("curveto", p);} void eoclip (vector &p) override {print("eoclip", p);} void eofill (vector &p) override {print("eofill", p);} void fill (vector &p) override {print("fill", p);} void gsave (vector &p) override {print("gsave", p);} void grestore (vector &p) override {print("grestore", p);} void grestoreall(std::vector &p) override {print("grestoreall", p);} void initclip (vector &p) override {print("initclip", p);} void lineto (vector &p) override {print("lineto", p);} void moveto (vector &p) override {print("moveto", p);} void makepattern (vector &p) override {print("makepattern", p);} void setpattern (vector &p) override {print("setpattern", p);} void setpagedevice (vector &p) override {print("setpagedevice", p);} void newpath (vector &p) override {print("newpath", p);} void querypos (vector &p) override {print("querypos", p);} void restore(std::vector &p) override {print("restore", p);} void rotate (vector &p) override {print("rotate", p);} void save(std::vector &p) override {print("save", p);} void scale (vector &p) override {print("scale", p);} void setblendmode (vector &p) override {print("setblendmode", p);} void setcmykcolor (vector &p) override {print("setcmykcolor", p);} void setdash (vector &p) override {print("setdash", p);} void setgray (vector &p) override {print("setgray", p);} void sethsbcolor (vector &p) override {print("sethsbcolor", p);} void setlinecap (vector &p) override {print("setlinecap", p);} void setlinejoin (vector &p) override {print("setlinejoin", p);} void setlinewidth (vector &p) override {print("setlinewidth", p);} void setmatrix (vector &p) override {print("setmatrix", p);} void setmiterlimit (vector &p) override {print("setmiterlimit", p);} void setnulldevice (vector &p) override {print("setnulldevice", p);} void setopacityalpha (vector &p) override {print("setopacityalpha", p);} void setshapealpha (vector &p) override {print("setshapealpha", p);} void setrgbcolor (vector &p) override {print("setrgbcolor", p);} void shfill (vector &p) override {print("shfill", p);} void stroke (vector &p) override {print("stroke", p);} void translate (vector &p) override {print("translate", p);} string result () const {return _oss.str();} void clear () {_oss.str("");} protected: void print (const char *op, const vector &p) { _oss << op; for (size_t i=0; i < p.size(); ++i) _oss << ' ' << p[i]; _oss << ';'; } private: ostringstream _oss; }; TEST(PSInterpreterTest, init) { PSTestActions actions; PSInterpreter psi(&actions); ASSERT_TRUE(psi.active()); EXPECT_EQ(actions.result(), ""); } TEST(PSInterpreterTest, gsave_grestore) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("gsave "); EXPECT_EQ(actions.result(), "gsave;"); actions.clear(); psi.execute("grestore "); EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 0;setlinejoin 0;setmiterlimit 10;setrgbcolor 0 0 0;setdash 0;grestore;"); actions.clear(); psi.execute("1 setlinecap 5 setmiterlimit 0 1 0 setrgbcolor gsave 0 setlinecap 10 setmiterlimit "); EXPECT_EQ(actions.result(), "setlinecap 1;setmiterlimit 5;setrgbcolor 0 1 0;gsave;setlinecap 0;setmiterlimit 10;"); actions.clear(); psi.execute("grestore "); EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;setlinewidth 1;setlinecap 1;setlinejoin 0;setmiterlimit 5;setrgbcolor 0 1 0;setdash 0;grestore;"); } TEST(PSInterpreterTest, stroke_fill) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("0 0 moveto 10 10 lineto 0 10 lineto closepath stroke "); EXPECT_EQ(actions.result(), "setrgbcolor 0 0 0;newpath 0;moveto 0 0;lineto 10 10;lineto 0 10;closepath;stroke;"); actions.clear(); psi.execute("0 0 moveto 10 10 lineto 0 10 lineto closepath fill "); EXPECT_EQ(actions.result(), "setrgbcolor 0 0 0;newpath 0;moveto 0 0;lineto 10 10;lineto 0 10;closepath;fill;"); } TEST(PSInterpreterTest, clip) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("initclip "); EXPECT_EQ(actions.result(), "initclip;"); actions.clear(); psi.execute("0 0 moveto 10 10 lineto 0 10 lineto closepath clip "); EXPECT_EQ(actions.result(), "newpath 0;moveto 0 0;lineto 10 10;lineto 0 10;closepath;clip;"); } TEST(PSInterpreterTest, transform) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("10 10 scale 90 rotate 100 -100 translate "); EXPECT_EQ(actions.result(), "scale 10 10;applyscalevals 10 10 1;rotate 90;applyscalevals 10 10 0;translate 100 -100;"); } TEST(PSInterpreterTest, calculate) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("2 3 add 4 mul 5 div rotate "); ASSERT_EQ(actions.result(), "rotate 4;applyscalevals 1 1 0.997564;"); } TEST(PSInterpreterTest, setlinewidth) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("10 setlinewidth "); EXPECT_EQ(actions.result(), "setlinewidth 10;"); actions.clear(); psi.execute("5 5 scale 10 setlinewidth "); EXPECT_EQ(actions.result(), "scale 5 5;applyscalevals 5 5 1;setlinewidth 10;"); actions.clear(); psi.execute("90 rotate 10 setlinewidth "); EXPECT_EQ(actions.result(), "rotate 90;applyscalevals 5 5 0;setlinewidth 10;"); actions.clear(); psi.execute("-30 rotate 10 setlinewidth "); EXPECT_EQ(actions.result(), "rotate -30;applyscalevals 5 5 0.5;setlinewidth 10;"); } TEST(PSInterpreterTest, matrix) { PSTestActions actions; PSInterpreter psi(&actions); psi.execute("matrix setmatrix "); EXPECT_EQ(actions.result(), "setmatrix 1 0 0 1 0 0;applyscalevals 1 1 1;"); actions.clear(); psi.execute("10 100 translate 30 rotate matrix currentmatrix setmatrix "); EXPECT_EQ(actions.result(), "translate 10 100;rotate 30;applyscalevals 1 1 0.866025;setmatrix 0.866025 0.5 -0.5 0.866025 10 100;applyscalevals 1 1 0.866025;"); } dvisvgm-2.8.1/tests/LengthTest.cpp0000664000175000017500000001717313510660062014063 00000000000000/************************************************************************* ** LengthTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "Length.hpp" using namespace std; TEST(LengthTest, set1) { Length len; len.set(1, Length::Unit::PT); EXPECT_DOUBLE_EQ(len.pt(), 1); len.set(72, Length::Unit::BP); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.bp(), 72); EXPECT_DOUBLE_EQ(len.in(), 1); len.set(1, Length::Unit::IN); EXPECT_DOUBLE_EQ(len.pt(), 72.27); len.set(1, Length::Unit::PC); EXPECT_DOUBLE_EQ(len.pt(), 12); EXPECT_DOUBLE_EQ(len.pc(), 1); len.set(2.54, Length::Unit::CM); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.cm(), 2.54); EXPECT_DOUBLE_EQ(len.mm(), 25.4); len.set(25.4, Length::Unit::MM); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.cm(), 2.54); EXPECT_DOUBLE_EQ(len.mm(), 25.4); len.set(1, Length::Unit::DD); EXPECT_DOUBLE_EQ(len.pt(), 1238.0/1157); len.set(1, Length::Unit::CC); EXPECT_DOUBLE_EQ(len.dd(), 12.0); EXPECT_DOUBLE_EQ(len.cc(), 1); len.set(1, Length::Unit::SP); EXPECT_DOUBLE_EQ(len.pt(), 1.0/65536); EXPECT_DOUBLE_EQ(len.sp(), 1); } TEST(LengthTest, set2) { Length len; len.set(1, "pt"); EXPECT_DOUBLE_EQ(len.pt(), 1); len.set(72, "bp"); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.bp(), 72); EXPECT_DOUBLE_EQ(len.in(), 1); len.set(1, "in"); EXPECT_DOUBLE_EQ(len.pt(), 72.27); len.set(1, "pc"); EXPECT_DOUBLE_EQ(len.pt(), 12); EXPECT_DOUBLE_EQ(len.pc(), 1); len.set(2.54, "cm"); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.cm(), 2.54); EXPECT_DOUBLE_EQ(len.mm(), 25.4); len.set(10, "mm"); EXPECT_DOUBLE_EQ(len.cm(), 1); EXPECT_DOUBLE_EQ(len.mm(), 10); len.set(1, "dd"); EXPECT_DOUBLE_EQ(len.pt(), 1238.0/1157); len.set(1, "cc"); EXPECT_DOUBLE_EQ(len.dd(), 12.0); len.set(1, "sp"); EXPECT_DOUBLE_EQ(len.pt(), 1.0/65536); len.set(1, ""); EXPECT_DOUBLE_EQ(len.pt(), 1); ASSERT_THROW(len.set(1, "xy"), UnitException); } TEST(LengthTest, set3) { Length len; len.set("1pt"); EXPECT_DOUBLE_EQ(len.pt(), 1); len.set("72bp"); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.bp(), 72); EXPECT_DOUBLE_EQ(len.in(), 1); len.set("1in"); EXPECT_DOUBLE_EQ(len.pt(), 72.27); len.set("1pc"); EXPECT_DOUBLE_EQ(len.pt(), 12); EXPECT_DOUBLE_EQ(len.pc(), 1); len.set("2.54cm"); EXPECT_DOUBLE_EQ(len.pt(), 72.27); EXPECT_DOUBLE_EQ(len.cm(), 2.54); EXPECT_DOUBLE_EQ(len.mm(), 25.4); len.set("10mm"); EXPECT_DOUBLE_EQ(len.cm(), 1); EXPECT_DOUBLE_EQ(len.mm(), 10); len.set("10dd"); EXPECT_DOUBLE_EQ(len.pt(), 12380.0/1157); len.set("10cc"); EXPECT_DOUBLE_EQ(len.dd(), 120.0); len.set("10sp"); EXPECT_DOUBLE_EQ(len.pt(), 10.0/65536); len.set("1"); EXPECT_DOUBLE_EQ(len.pt(), 1); len.set("10"); EXPECT_DOUBLE_EQ(len.pt(), 10); ASSERT_THROW(len.set("1xy"), UnitException); ASSERT_THROW(len.set("pt"), UnitException); } TEST(LengthTest, get) { Length len; len.set("1pt"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PT), 1); len.set("72bp"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PT), 72.27); EXPECT_DOUBLE_EQ(len.get(Length::Unit::BP), 72); EXPECT_DOUBLE_EQ(len.get(Length::Unit::IN), 1); len.set("1in"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PT), 72.27); len.set("1pc"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PT), 12); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PC), 1); len.set("2.54cm"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PT), 72.27); EXPECT_DOUBLE_EQ(len.get(Length::Unit::CM), 2.54); EXPECT_DOUBLE_EQ(len.get(Length::Unit::MM), 25.4); len.set("10mm"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::CM), 1); EXPECT_DOUBLE_EQ(len.get(Length::Unit::MM), 10); len.set("10dd"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::PT), 12380.0/1157); len.set("10cc"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::DD), 120.0); EXPECT_DOUBLE_EQ(len.get(Length::Unit::CC), 10.0); len.set("10sp"); EXPECT_DOUBLE_EQ(len.get(Length::Unit::SP), 10.0); } TEST(LengthTest, str2unit) { EXPECT_EQ(Length::stringToUnit("pt"), Length::Unit::PT); EXPECT_EQ(Length::stringToUnit("bp"), Length::Unit::BP); EXPECT_EQ(Length::stringToUnit("in"), Length::Unit::IN); EXPECT_EQ(Length::stringToUnit("cm"), Length::Unit::CM); EXPECT_EQ(Length::stringToUnit("mm"), Length::Unit::MM); EXPECT_EQ(Length::stringToUnit("pc"), Length::Unit::PC); EXPECT_EQ(Length::stringToUnit("cc"), Length::Unit::CC); EXPECT_EQ(Length::stringToUnit("dd"), Length::Unit::DD); EXPECT_EQ(Length::stringToUnit("sp"), Length::Unit::SP); ASSERT_THROW(Length::stringToUnit(""), UnitException); ASSERT_THROW(Length::stringToUnit("CM"), UnitException); ASSERT_THROW(Length::stringToUnit("pta"), UnitException); } TEST(LengthTest, unit2str) { EXPECT_EQ(Length::unitToString(Length::Unit::PT), string("pt")); EXPECT_EQ(Length::unitToString(Length::Unit::BP), string("bp")); EXPECT_EQ(Length::unitToString(Length::Unit::IN), string("in")); EXPECT_EQ(Length::unitToString(Length::Unit::CM), string("cm")); EXPECT_EQ(Length::unitToString(Length::Unit::MM), string("mm")); EXPECT_EQ(Length::unitToString(Length::Unit::PC), string("pc")); EXPECT_EQ(Length::unitToString(Length::Unit::CC), string("cc")); EXPECT_EQ(Length::unitToString(Length::Unit::DD), string("dd")); EXPECT_EQ(Length::unitToString(Length::Unit::SP), string("sp")); EXPECT_EQ(Length::unitToString(Length::Unit(300)), string("??")); } TEST(LengthTest, toString) { EXPECT_EQ(Length(10, Length::Unit::PT).toString(Length::Unit::PT), "10pt"); EXPECT_EQ(Length(10, Length::Unit::BP).toString(Length::Unit::BP), "10bp"); EXPECT_EQ(Length(10, Length::Unit::IN).toString(Length::Unit::IN), "10in"); EXPECT_EQ(Length(10, Length::Unit::CM).toString(Length::Unit::CM), "10cm"); EXPECT_EQ(Length(10, Length::Unit::MM).toString(Length::Unit::MM), "10mm"); EXPECT_EQ(Length(10, Length::Unit::PC).toString(Length::Unit::PC), "10pc"); EXPECT_EQ(Length(10, Length::Unit::DD).toString(Length::Unit::DD), "10dd"); EXPECT_EQ(Length(10, Length::Unit::CC).toString(Length::Unit::CC), "10cc"); EXPECT_EQ(Length(10, Length::Unit::SP).toString(Length::Unit::SP), "10sp"); } TEST(LengthTest, literals) { EXPECT_EQ(1_pt, Length(1, "pt")); EXPECT_EQ(2_bp, Length(2, "bp")); EXPECT_EQ(3_in, Length(3, "in")); EXPECT_EQ(5_mm, Length(5, "mm")); } TEST(LengthTest, getUnits) { for (auto unit : Length::getUnits()) { EXPECT_EQ(unit.first, Length::unitToString(unit.second)); EXPECT_EQ(unit.second, Length::stringToUnit(unit.first)); } } dvisvgm-2.8.1/tests/GhostscriptTest.cpp0000664000175000017500000000404313510660062015143 00000000000000/************************************************************************* ** GhostscriptTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Ghostscript.hpp" TEST(GhostscriptTest, available1) { const char *args[] = {"test", "-q", "-dNODISPLAY"}; Ghostscript gs(3, args); ASSERT_TRUE(gs.available()); } TEST(GhostscriptTest, available2) { Ghostscript gs; ASSERT_TRUE(gs.available()); } TEST(GhostscriptTest, revision) { Ghostscript gs; ASSERT_GT(gs.revision(), 0); ASSERT_FALSE(gs.revisionstr().empty()); } TEST(Ghostscript, error_name) { Ghostscript gs; ASSERT_EQ(gs.error_name(0), (const char*)0); ASSERT_STREQ(gs.error_name(-1), "unknownerror"); ASSERT_STREQ(gs.error_name(1), "unknownerror"); ASSERT_STREQ(gs.error_name(2), "dictfull"); } dvisvgm-2.8.1/tests/CMapTest.cpp0000664000175000017500000001156413510660062013460 00000000000000/************************************************************************* ** CMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "CMap.hpp" using namespace std; #define CHECK_RANGE(name, cmap, cmin, cmax, cid_min) \ {SCOPED_TRACE(name); check_range(cmap, cmin, cmax, cid_min);} #define CHECK_ZERO(name, cmap, cmin, cmax) \ {SCOPED_TRACE(name); check_zero(cmap, cmin, cmax);} static void check_range (const SegmentedCMap &cmap, int min, int max, int cid_min) { for (int i=min; i <= max; i++) ASSERT_EQ(cmap.cid(i), uint32_t(cid_min+(i-min))); } static void check_zero (const SegmentedCMap &cmap, int min, int max) { for (int i=min; i <= max; i++) ASSERT_EQ(cmap.cid(i), 0u); } TEST(SegmentedCMapTest, disjoint_ranges) { SegmentedCMap cmap("test"); cmap.addCIDRange(5, 8, 1); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("A", cmap, 5, 8, 1); CHECK_ZERO("B", cmap, 0, 4); CHECK_ZERO("C", cmap, 9, 20); cmap.addCIDRange(10, 15, 5); ASSERT_EQ(cmap.numCIDRanges(), 2u); CHECK_RANGE("D", cmap, 5, 8, 1); CHECK_RANGE("E", cmap, 10, 15, 5); CHECK_ZERO("F", cmap, 0, 4); CHECK_ZERO("G", cmap, 9, 9); CHECK_ZERO("H", cmap, 16, 20); cmap.addCIDRange(0, 3, 50); ASSERT_EQ(cmap.numCIDRanges(), 3u); CHECK_RANGE("I", cmap, 0, 3, 50); CHECK_RANGE("J", cmap, 5, 8, 1); CHECK_RANGE("K", cmap, 10, 15, 5); CHECK_ZERO("L", cmap, 4, 4); CHECK_ZERO("M", cmap, 9, 9); CHECK_ZERO("N", cmap, 16, 20); cmap.addCIDRange(16, 20, 1); ASSERT_EQ(cmap.numCIDRanges(), 4u); CHECK_RANGE("O", cmap, 5, 8, 1); CHECK_RANGE("P", cmap, 10, 15, 5); CHECK_RANGE("Q", cmap, 0, 3, 50); CHECK_RANGE("R", cmap, 16, 20, 1); } TEST(SegmentedCMapTest, touching_ranges) { SegmentedCMap cmap("test"); cmap.addCIDRange(5, 8, 10); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("A", cmap, 5, 8, 10); cmap.addCIDRange(9, 15, 14); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("B", cmap, 5, 15, 10); cmap.addCIDRange(1, 4, 5); ASSERT_EQ(cmap.numCIDRanges(), 2u); CHECK_RANGE("C", cmap, 1, 4, 5); CHECK_RANGE("D", cmap, 5, 15, 10); cmap.addCIDRange(1, 4, 6); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("E", cmap, 1, 15, 6); } TEST(SegmentedCMapTest, overlapping_ranges) { SegmentedCMap cmap("test"); cmap.addCIDRange(5, 8, 10); cmap.addCIDRange(7, 15, 12); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("A", cmap, 5, 15, 10); cmap.addCIDRange(10, 20, 1); ASSERT_EQ(cmap.numCIDRanges(), 2u); CHECK_RANGE("B", cmap, 5, 9, 10); CHECK_RANGE("C", cmap, 10, 20, 1); cmap.addCIDRange(2, 7, 7); ASSERT_EQ(cmap.numCIDRanges(), 2u); CHECK_RANGE("D", cmap, 2, 9, 7); CHECK_RANGE("E", cmap, 10, 20, 1); cmap.addCIDRange(1, 12, 100); ASSERT_EQ(cmap.numCIDRanges(), 2u); CHECK_RANGE("F", cmap, 1, 12, 100); CHECK_RANGE("G", cmap, 13, 20, 4); cmap.addCIDRange(0, 30, 1); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("H", cmap, 0, 30, 1); } TEST(SegmentedCMapTest, inner_ranges) { SegmentedCMap cmap("test"); cmap.addCIDRange(5, 20, 1); cmap.addCIDRange(10, 15, 6); ASSERT_EQ(cmap.numCIDRanges(), 1u); CHECK_RANGE("A", cmap, 5, 20, 1); cmap.addCIDRange(10, 15, 100); ASSERT_EQ(cmap.numCIDRanges(), 3u); CHECK_RANGE("B", cmap, 5, 9, 1); CHECK_RANGE("C", cmap, 10, 15, 100); CHECK_RANGE("D", cmap, 16, 20, 12); cmap.addCIDRange(15, 15, 50); ASSERT_EQ(cmap.numCIDRanges(), 4u); CHECK_RANGE("E", cmap, 5, 9, 1); CHECK_RANGE("F", cmap, 10, 14, 100); CHECK_RANGE("G", cmap, 15, 15, 50); CHECK_RANGE("H", cmap, 16, 20, 12); cmap.addCIDRange(6, 19, 1); ASSERT_EQ(cmap.numCIDRanges(), 3u); CHECK_RANGE("I", cmap, 5, 5, 1); CHECK_RANGE("J", cmap, 6, 19, 1); CHECK_RANGE("K", cmap, 20, 20, 16); } dvisvgm-2.8.1/tests/TpicSpecialTest.cpp0000664000175000017500000003340513536436456015056 00000000000000/************************************************************************* ** TpicSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "SpecialActions.hpp" #include "TpicSpecialHandler.hpp" #include "utility.hpp" #include "XMLNode.hpp" #include "XMLString.hpp" using namespace std; class TpicSpecialTest : public ::testing::Test { protected: class ActionsRecorder : public EmptySpecialActions { public: ActionsRecorder () : x(), y() {} void embed (const BoundingBox &bb) override {bbox.embed(bb);} void setX (double xx) override {x = xx;} void setY (double yy) override {x = yy;} double getX () const override {return x;} double getY () const override {return y;} Color getColor () const override {return color;} void setColor (const Color &c) override {color = c;} const Matrix& getMatrix () const override {static Matrix m(1); return m;} string getXMLSnippet () const { ostringstream oss; for (XMLNode *child : *svgTree().pageNode()) child->write(oss); return oss.str(); } void clear () { SpecialActions::svgTree().reset(); SpecialActions::svgTree().newPage(1); bbox = BoundingBox(0, 0, 0, 0); } private: double x, y; Color color; BoundingBox bbox; }; class MyTpicSpecialHandler : public TpicSpecialHandler { public: explicit MyTpicSpecialHandler (SpecialActions &a) : actions(a) {} void finishPage () {dviEndPage(0, actions);} bool processSpecial (const string &cmd, string params="") { stringstream ss; ss << params; return process(cmd, ss, actions); } protected: SpecialActions &actions; }; public: TpicSpecialTest () : handler(recorder) {} void SetUp () override { XMLString::DECIMAL_PLACES=2; recorder.clear(); } protected: ActionsRecorder recorder; MyTpicSpecialHandler handler; }; TEST_F(TpicSpecialTest, name) { EXPECT_EQ(handler.name(), "tpic"); } TEST_F(TpicSpecialTest, fail) { EXPECT_FALSE(handler.processSpecial("")); EXPECT_FALSE(handler.processSpecial("x")); EXPECT_FALSE(handler.processSpecial("xy")); EXPECT_FALSE(handler.processSpecial("xyz")); EXPECT_FALSE(handler.processSpecial("bk ")); } TEST_F(TpicSpecialTest, set_fill_intensity) { EXPECT_LT(handler.grayLevel(), 0); // no fill color set by default EXPECT_TRUE(handler.processSpecial("bk")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1); EXPECT_TRUE(handler.processSpecial("wh")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 0); EXPECT_TRUE(handler.processSpecial("sh")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 0.5); EXPECT_TRUE(handler.processSpecial("sh", "0.1")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 0.1); EXPECT_TRUE(handler.processSpecial("sh", "0.6")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 0.6); EXPECT_TRUE(handler.processSpecial("sh", "2")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1); EXPECT_TRUE(handler.processSpecial("sh", "-2")); EXPECT_DOUBLE_EQ(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, set_penwidth) { const double mi2bp=0.072; // milli-inch to PS points EXPECT_DOUBLE_EQ(handler.penwidth(), 1); handler.processSpecial("pn", "1000"); EXPECT_DOUBLE_EQ(handler.penwidth(), 1000*mi2bp); handler.processSpecial("pn", "-10"); EXPECT_DOUBLE_EQ(handler.penwidth(), 0); } TEST_F(TpicSpecialTest, dot) { handler.processSpecial("pn", "1000"); handler.processSpecial("pa", "0 0"); handler.processSpecial("bk"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, stroke_polyline) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1000 0"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, stroke_polygon) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1000 0"); handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "0 0"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, fill_polygon) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1000 0"); handler.processSpecial("pa", "0 0"); handler.processSpecial("wh"); handler.processSpecial("fp"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); recorder.clear(); handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1000 0"); handler.processSpecial("pa", "0 0"); handler.processSpecial("wh"); handler.processSpecial("ip"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, fill_dashed_polygon) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1000 0"); handler.processSpecial("pa", "0 0"); handler.processSpecial("wh"); handler.processSpecial("da", "2"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, fill_dotted_polygon) { handler.processSpecial("pn", "500"); handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1000 0"); handler.processSpecial("pa", "0 0"); handler.processSpecial("wh"); handler.processSpecial("dt", "2 2"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, stroke_spline) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("sp"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1500 500"); handler.processSpecial("pa", "2000 1000"); handler.processSpecial("pa", "3000 2000"); handler.processSpecial("pa", "1000 500"); handler.processSpecial("sp"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, stroke_dashed_spline) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1500 500"); handler.processSpecial("pa", "2000 1000"); handler.processSpecial("pa", "3000 2000"); handler.processSpecial("pa", "0 0"); handler.processSpecial("sp", "1"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, stroke_dotted_spline) { handler.processSpecial("pa", "0 0"); handler.processSpecial("pa", "1000 1000"); handler.processSpecial("pa", "1500 500"); handler.processSpecial("pa", "2000 1000"); handler.processSpecial("pa", "3000 2000"); handler.processSpecial("pa", "1000 500"); handler.processSpecial("sp", "-1"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); EXPECT_DOUBLE_EQ(handler.penwidth(), 1.0); EXPECT_LT(handler.grayLevel(), 0); } TEST_F(TpicSpecialTest, stroke_ellipse) { handler.processSpecial("ar", "0 0 500 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("pn", "100"); handler.processSpecial("ar", "0 0 1000 500 -1 -8"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); } TEST_F(TpicSpecialTest, fill_ellipse) { handler.processSpecial("bk"); handler.processSpecial("ia", "0 0 500 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("bk"); handler.processSpecial("ia", "0 0 1000 500 0 7"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("pn", "100"); handler.processSpecial("wh"); handler.processSpecial("ia", "0 0 1000 500 -1 -8"); EXPECT_EQ(recorder.getXMLSnippet(), "" ); } TEST_F(TpicSpecialTest, stroke_arc) { handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(math::PI/4)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(math::PI/2)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(3*math::PI/4)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(math::PI)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(5*math::PI/4)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(3*math::PI/2)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); recorder.clear(); handler.processSpecial("ar", "0 0 1000 500 0 "+to_string(-3*math::PI/2)); EXPECT_EQ(recorder.getXMLSnippet(), "" ); } TEST_F(TpicSpecialTest, bit_pattern) { handler.processSpecial("tx", ""); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1); handler.processSpecial("tx", " \t \n "); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1); handler.processSpecial("tx", "INVALID"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1); handler.processSpecial("tx", "0"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1); handler.processSpecial("tx", "f"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 0); handler.processSpecial("tx", "1248"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-4.0/16.0); handler.processSpecial("tx", "12480"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-4.0/20.0); handler.processSpecial("tx", "DEAD BEEF"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-24.0/32.0); handler.processSpecial("tx", "123456789abcdef"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-32.0/60.0); handler.processSpecial("tx", "123456789ABCDEF0"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-32.0/64.0); handler.processSpecial("tx", "1234 5678 9abc def "); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-32.0/60.0); handler.processSpecial("tx", "1234 5678 X 9abc def"); EXPECT_DOUBLE_EQ(handler.grayLevel(), 1.0-13.0/32.0); } dvisvgm-2.8.1/tests/SVGOutputTest.cpp0000664000175000017500000001457113553267757014546 00000000000000/************************************************************************* ** SVGOutputTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "FileSystem.hpp" #include "MessageException.hpp" #include "SVGOutput.hpp" #include "ZLibOutputStream.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; struct SVGOutputTest : public ::testing::Test { void SetUp () override {FileSystem::chdir(SRCDIR);} }; TEST_F(SVGOutputTest, defaults) { SVGOutput out("SVGOutputTest.cpp", ""); EXPECT_EQ(out.filepath(1, 1).relative(), "SVGOutputTest.svg"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest-5.svg"); EXPECT_EQ(out.filepath(5, 10).relative(), "SVGOutputTest-05.svg"); EXPECT_EQ(out.filepath(5, 256).relative(), "SVGOutputTest-005.svg"); } TEST_F(SVGOutputTest, widthSpecifier) { { SVGOutput out("SVGOutputTest.cpp", "%f--%3p"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--005.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--054.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--543.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f--%3p--%P"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--005--9.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--054--65.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--543--654.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f--%3p--%3P"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--005--009.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--054--065.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--543--654.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%5f--%3p--%3P"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--005--009.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--054--065.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--543--654.svg"); } } TEST_F(SVGOutputTest, expressions) { { SVGOutput out("SVGOutputTest.cpp", "no-macro"); EXPECT_EQ(out.filepath(5, 9).relative(), "no-macro.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "no-macro.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "no-macro.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f--%(p-1)"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--4.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--53.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--542.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f--%3(p-1)"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--004.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--053.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--542.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f--%3(P+2p)"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest--019.svg"); EXPECT_EQ(out.filepath(54, 65).relative(), "SVGOutputTest--173.svg"); EXPECT_EQ(out.filepath(543, 654).relative(), "SVGOutputTest--1740.svg"); } } TEST_F(SVGOutputTest, hashes) { SVGOutput::HashTriple hashes("dvihash", "opthash", "cmbhash"); { SVGOutput out("SVGOutputTest.cpp", "%f-%hd-x"); EXPECT_EQ(out.filepath(1, 10).relative(), "SVGOutputTest--x.svg"); EXPECT_EQ(out.filepath(1, 10, hashes).relative(), "SVGOutputTest-dvihash-x.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f-%hd-x-%hc%ho"); EXPECT_EQ(out.filepath(1, 10).relative(), "SVGOutputTest--x-.svg"); EXPECT_EQ(out.filepath(1, 10, hashes).relative(), "SVGOutputTest-dvihash-x-cmbhashopthash.svg"); }{ SVGOutput out("SVGOutputTest.cpp", "%f-%hd%p%ho"); EXPECT_EQ(out.filepath(1, 10).relative(), "SVGOutputTest-01.svg"); EXPECT_EQ(out.filepath(1, 10, hashes).relative(), "SVGOutputTest-dvihash01opthash.svg"); } } TEST_F(SVGOutputTest, hashes_fail) { SVGOutput::HashTriple hashes("dvihash", "opthash", "cmbhash"); { SVGOutput out("SVGOutputTest.cpp", "%f-%h-x"); EXPECT_THROW(out.filepath(1, 10).relative(), MessageException); EXPECT_THROW(out.filepath(1, 10, hashes).relative(), MessageException); }{ SVGOutput out("SVGOutputTest.cpp", "%f-%hd-x-%ha%ho"); EXPECT_THROW(out.filepath(1, 10).relative(), MessageException); EXPECT_THROW(out.filepath(1, 10, hashes).relative(), MessageException); } } TEST_F(SVGOutputTest, getPageStream) { { SVGOutput out("", ""); ostream &os = out.getPageStream(1, 10); EXPECT_EQ(&os, &cout); }{ SVGOutput out("SVGOutputTest.cpp", "%f-%p"); ostream *os1 = &out.getPageStream(1, 10); EXPECT_TRUE(dynamic_cast(os1)); ostream *os2 = &out.getPageStream(1, 10); EXPECT_EQ(os1, os2); } FileSystem::remove("SVGOutputTest-01.svg"); { SVGOutput out("SVGOutputTest.cpp", "%f-%p", 9); ostream *os = &out.getPageStream(1, 10); EXPECT_TRUE(dynamic_cast(os)); } FileSystem::remove("SVGOutputTest-01.svgz"); } TEST_F(SVGOutputTest, ignore) { SVGOutput out("SVGOutputTest.cpp", "%x %y"); EXPECT_EQ(out.filepath(5, 9).relative(), "SVGOutputTest-5.svg"); } TEST_F(SVGOutputTest, error) { SVGOutput out("SVGOutputTest.cpp", "%(p/0)"); EXPECT_THROW(out.filepath(5, 9).relative(), MessageException); } dvisvgm-2.8.1/tests/UtilityTest.cpp0000664000175000017500000001213013511327140014267 00000000000000/************************************************************************* ** UtilityTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "utility.hpp" using namespace util; using namespace std; TEST(UtilityTest, trim) { ASSERT_EQ(trim(""), ""); ASSERT_EQ(trim(" "), ""); ASSERT_EQ(trim(" \n \t "), ""); ASSERT_EQ(trim("abcdefg"), "abcdefg"); ASSERT_EQ(trim(" abcdefg"), "abcdefg"); ASSERT_EQ(trim("abcdefg "), "abcdefg"); ASSERT_EQ(trim(" abcdefg "), "abcdefg"); ASSERT_EQ(trim(" abc defg "), "abc defg"); ASSERT_EQ(trim(" abc \n defg \n \r"), "abc \n defg"); } TEST(UtilityTest, normalize_space) { ASSERT_EQ(normalize_space(""), ""); ASSERT_EQ(normalize_space(" "), ""); ASSERT_EQ(normalize_space(" \n \t "), ""); ASSERT_EQ(normalize_space("abcdefg"), "abcdefg"); ASSERT_EQ(normalize_space(" abcdefg"), "abcdefg"); ASSERT_EQ(normalize_space("abcdefg "), "abcdefg"); ASSERT_EQ(normalize_space(" abcdefg "), "abcdefg"); ASSERT_EQ(normalize_space(" abc defg "), "abc defg"); ASSERT_EQ(normalize_space(" abc \n defg \n \r"), "abc defg"); ASSERT_EQ(normalize_space(" abc \n de\r\ffg \n \r"), "abc de fg"); } TEST(UtilityTest, tolower) { ASSERT_EQ(tolower(""), ""); ASSERT_EQ(tolower("abcdefg"), "abcdefg"); ASSERT_EQ(tolower("ABCDEFG"), "abcdefg"); ASSERT_EQ(tolower("123XyZ456"), "123xyz456"); ASSERT_EQ(tolower("123\nXyZ 456"), "123\nxyz 456"); } TEST(UtilityTest, replace) { ASSERT_EQ(replace("abcdebcxyb", "bc", ","), "a,de,xyb"); ASSERT_EQ(replace("abcdebcxyb", "bc", " : "), "a : de : xyb"); ASSERT_EQ(replace("abcdebcxyb", "", ","), "abcdebcxyb"); ASSERT_EQ(replace("abcdebcxyb", "bc", ""), "abcdebcxyb"); ASSERT_EQ(replace("abcdebcxyb", "b", " B "), "a B cde B cxy B "); ASSERT_EQ(replace("", "b", " B "), ""); ASSERT_EQ(replace("a,b, c ,d , e", " ,", ","), "a,b, c,d, e"); } TEST(UtilityTest, split) { vector parts = split("", ","); ASSERT_EQ(parts.size(), 1u); EXPECT_EQ(parts[0], ""); parts = split("abcde", ""); ASSERT_EQ(parts.size(), 1u); EXPECT_EQ(parts[0], "abcde"); parts = split("abcde", ","); ASSERT_EQ(parts.size(), 1u); EXPECT_EQ(parts[0], "abcde"); parts = split("1,2 , 3, 4 ,,5", ","); ASSERT_EQ(parts.size(), 6u); size_t count=0; for (const string &part : {"1", "2 ", " 3", " 4 ", "", "5"}) { EXPECT_EQ(parts[count++], part); } parts = split("1 sep2sep3, sep", "sep"); ASSERT_EQ(parts.size(), 4u); count=0; for (const string &part : {"1 ", "2", "3, ", ""}) { EXPECT_EQ(parts[count++], part); } } TEST(UtilityTest, ilog10) { ASSERT_EQ(ilog10(-10), 0); ASSERT_EQ(ilog10(-1), 0); ASSERT_EQ(ilog10(0), 0); for (int i=1; i <= 1000; i++) { ASSERT_EQ(ilog10(i), static_cast(log10(i))) << "i=" << i; } for (int i=1000; i < numeric_limits::max()/10; i*=10) { ASSERT_EQ(ilog10(i-1), static_cast(log10(i-1))) << "i=" << i; ASSERT_EQ(ilog10(i), static_cast(log10(i))) << "i=" << i; ASSERT_EQ(ilog10(i+1), static_cast(log10(i+1))) << "i=" << i; } } TEST(UtilityTest, to_string) { ASSERT_EQ(util::to_string(0), "0"); ASSERT_EQ(util::to_string(1), "1"); ASSERT_EQ(util::to_string(100), "100"); ASSERT_EQ(util::to_string(-1), "-1"); ASSERT_EQ(util::to_string(2.123), "2.123"); ASSERT_EQ(util::to_string(-2.123), "-2.123"); ASSERT_EQ(util::to_string(1.500e-5), "0.000015"); } static string base64 (const string &str) { istringstream iss(str); ostringstream oss; base64_copy(istreambuf_iterator(iss), istreambuf_iterator(), ostreambuf_iterator(oss)); return oss.str(); } TEST(UtilityTest, base64_copy) { ASSERT_EQ(base64(""), ""); ASSERT_EQ(base64("a"), "YQ=="); ASSERT_EQ(base64("ab"), "YWI="); ASSERT_EQ(base64("abc"), "YWJj"); ASSERT_EQ(base64("abcd"), "YWJjZA=="); ASSERT_EQ(base64("aBcDe\nFgHiJ\n"), "YUJjRGUKRmdIaUoK"); } dvisvgm-2.8.1/tests/DependencyGraphTest.cpp0000664000175000017500000000472013510660062015674 00000000000000/************************************************************************* ** DependencyGraphTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "optimizer/DependencyGraph.hpp" using namespace std; static void populate (DependencyGraph &tree) { tree.insert(1); tree.insert(2); tree.insert(1, 3); tree.insert(1, 4); tree.insert(1, 5); tree.insert(4, 6); tree.insert(4, 7); } TEST(DependencyGraphTest, getKeys) { DependencyGraph graph; populate(graph); auto keys = graph.getKeys(); ASSERT_EQ(keys.size(), 7u); int count=0; for (int key : keys) { ASSERT_EQ(keys[count++], key); } } TEST(DependencyGraphTest, insert) { DependencyGraph graph; populate(graph); for (int i=1; i <= 7; i++) { ASSERT_TRUE(graph.contains(i)); } ASSERT_FALSE(graph.contains(0)); ASSERT_FALSE(graph.contains(8)); } TEST(DependencyGraphTest, removeDependencyPath) { DependencyGraph graph; populate(graph); graph.removeDependencyPath(4); ASSERT_FALSE(graph.contains(1)); ASSERT_TRUE(graph.contains(2)); ASSERT_TRUE(graph.contains(3)); ASSERT_FALSE(graph.contains(4)); ASSERT_TRUE(graph.contains(5)); ASSERT_TRUE(graph.contains(6)); ASSERT_TRUE(graph.contains(7)); } dvisvgm-2.8.1/tests/GFGlyphTracerTest.cpp0000664000175000017500000001104513510660062015273 00000000000000/************************************************************************* ** GFGlyphTracerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "GFGlyphTracer.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; class Callback : public GFGlyphTracer::Callback { public: void beginChar (uint8_t c) {_oss << "begin(" << int(c) << ")";} void endChar (uint8_t c) {_oss << "end(" << int(c) << ")";} void emptyChar (uint8_t c) {_oss << "empty(" << int(c) << ")";} string getLog () const {return _oss.str();} void reset () {_oss.str("");} private: ostringstream _oss; }; // Returns an SVG path string with scaled values. static string scaled_pathstr (const Glyph &glyph) { ostringstream oss; glyph.writeSVG(oss, false); istringstream iss(oss.str()); ostringstream resultstream; XMLString::DECIMAL_PLACES = 1; while (iss.peek() > 0) { if (isalpha(iss.peek()) || isspace(iss.peek())) resultstream << char(iss.get()); else { int num; iss >> num; resultstream << XMLString(double(num)/10000); } } return resultstream.str(); } TEST(GFGlyphTracerTest, executeChar) { string gfname = string(SRCDIR)+"/data/cmr10.600gf"; Callback callback; GFGlyphTracer tracer(gfname, 10000, &callback); Glyph glyph; tracer.setGlyph(glyph); EXPECT_FALSE(tracer.executeChar(128)); EXPECT_EQ(callback.getLog(), "begin(128)empty(128)"); callback.reset(); EXPECT_TRUE(tracer.executeChar('g')); ostringstream oss; glyph.closeOpenSubPaths(); EXPECT_EQ(scaled_pathstr(glyph), "M3.5 4.3C3.2 4.1 3.1 4.1 2.9 4.3C1.9 4.8 .6 4 .6 3C.6 2.8 .7 2.4 .8 2.3C.9 2.1 1 2 .9 1.7" "C.7 1.3 .7 .8 .9 .5C1 .3 1 .3 .6-.1C0-.7 .1-1.4 1.1-1.9C1.7-2.2 3.3-2.2 3.8-1.9" "C4.4-1.6 4.7-1.2 4.7-.8C4.7 .2 3.9 .7 2.4 .7C1.3 .7 1 .9 1.1 1.4C1.1 1.7 1.2 1.7 1.4 1.7" "C1.5 1.7 1.8 1.6 2 1.6C3.2 1.4 4.2 2.8 3.5 3.7C3.4 3.9 3.4 4 3.6 4.1C4 4.4 4.3 4.4 4.2 4.1" "C4.2 3.9 4.4 3.7 4.6 3.8C4.7 3.8 4.8 4 4.8 4.1C4.8 4.6 4.2 4.7 3.5 4.3Z" "M2.7 3.9C2.9 3.8 2.9 3.5 2.9 3C2.9 2.2 2.7 1.8 2.2 1.8C1.6 1.8 1.4 2.2 1.4 3C1.4 3.8 1.6 4.2 2.2 4.2C2.3 4.2 2.6 4.1 2.7 3.9Z" "M3.5-.1C4-.2 4.2-.7 4-1.1C3.6-2 1.7-2.2 1.1-1.4C.8-1 .8-.6 1.1-.2C1.3 .1 1.4 .1 2.2 .1C2.7 .1 3.3 0 3.5-.1Z"); EXPECT_EQ(callback.getLog(), "begin(103)end(103)"); tracer.reset(gfname, 1000); glyph.clear(); callback.reset(); EXPECT_TRUE(tracer.executeChar('I')); glyph.closeOpenSubPaths(); oss.str(""); EXPECT_EQ(scaled_pathstr(glyph), "M0 .7C0 .7 0 .6 .1 .6L.1 .6V.3V0L.1 0C0 0 0 0 0 0C0 0 .1 0 .2 0C.3 0 .3 0 .3 0" "C.3 0 .3 0 .3 0L.2 0V.3V.6L.3 .6C.3 .6 .3 .7 .3 .7C.3 .7 .3 .7 .2 .7C.1 .7 0 .7 0 .7Z"); EXPECT_EQ(callback.getLog(), "begin(73)end(73)"); } TEST(GFGlyphTracerTest, defaultCallback) { string gfname = string(SRCDIR)+"/data/cmr10.600gf"; GFGlyphTracer::Callback callback; GFGlyphTracer tracer(gfname, 1000, &callback); Glyph glyph; tracer.setGlyph(glyph); tracer.closePath(); EXPECT_FALSE(tracer.executeChar(128)); EXPECT_TRUE(tracer.executeChar('g')); } TEST(GFGlyphTracerTest, fail) { GFGlyphTracer tracer; EXPECT_FALSE(tracer.executeChar('M')); Glyph glyph; tracer.setGlyph(glyph); EXPECT_THROW(tracer.executeChar('M'), GFException); string gfname = string(SRCDIR)+"/data/cmr10.600gf"; tracer.reset(gfname, 1000); EXPECT_TRUE(tracer.executeChar('M')); } dvisvgm-2.8.1/tests/PapersizeSpecialTest.cpp0000664000175000017500000001147213510660062016101 00000000000000/************************************************************************* ** PapersizeSpecialTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "PapersizeSpecialHandler.hpp" #include "SpecialActions.hpp" using namespace std; class PapersizeSpecialTest : public ::testing::Test { protected: class PapersizeSpecialActions : public EmptySpecialActions { public: PapersizeSpecialActions () : _pageno(0) {} BoundingBox& bbox () override {return _bbox;} string getBBoxFormatString () const override {return _bboxFormatString;} void setBBoxFormatString (const string &str) {_bboxFormatString = str;} unsigned getCurrentPageNumber () const override {return _pageno;} void setCurrentPageNumber (unsigned pageno) {_pageno = pageno;} private: BoundingBox _bbox; string _bboxFormatString; unsigned _pageno; }; class MyPapersizeSpecialHandler : public PapersizeSpecialHandler { public: void endPage (PapersizeSpecialActions &actions) {dviEndPage(actions.getCurrentPageNumber(), actions);} }; void SetUp () override { handler.reset(); } string bboxString () { return actions.bbox().toSVGViewBox(); } void preprocess (const string &str) { istringstream iss(str); handler.preprocess("", iss, actions); } bool process (const string &str) { istringstream iss(str); return handler.process("", iss, actions); } void endPage () { handler.endPage(actions); } protected: MyPapersizeSpecialHandler handler; PapersizeSpecialActions actions; }; TEST_F(PapersizeSpecialTest, name) { EXPECT_EQ(handler.name(), "papersize"); ASSERT_EQ(handler.prefixes().size(), 1u); ASSERT_STREQ(handler.prefixes()[0], "papersize="); } TEST_F(PapersizeSpecialTest, disabled) { actions.setBBoxFormatString("min"); // --bbox=min => ignore papersize specials actions.setCurrentPageNumber(1); ASSERT_EQ(bboxString(), "0 0 0 0"); preprocess("123,456"); endPage(); ASSERT_EQ(bboxString(), "0 0 0 0"); ASSERT_TRUE(process("dummy")); } TEST_F(PapersizeSpecialTest, singlePage1) { actions.setBBoxFormatString("papersize"); // --bbox=papersize => evaluate papersize specials actions.setCurrentPageNumber(1); ASSERT_EQ(bboxString(), "0 0 0 0"); preprocess("123bp,456bp"); endPage(); ASSERT_EQ(bboxString(), "-72 -72 123 456"); } TEST_F(PapersizeSpecialTest, singlePage2) { actions.setBBoxFormatString("papersize"); actions.setCurrentPageNumber(1); ASSERT_EQ(bboxString(), "0 0 0 0"); preprocess("123bp,456bp"); preprocess("333bp,444bp"); preprocess("321bp,654bp"); endPage(); ASSERT_EQ(bboxString(), "-72 -72 321 654"); } TEST_F(PapersizeSpecialTest, multiPage1) { actions.setBBoxFormatString("papersize"); actions.setCurrentPageNumber(1); ASSERT_EQ(bboxString(), "0 0 0 0"); preprocess("123bp,456bp"); preprocess("333bp,444bp"); preprocess("321bp,654bp"); endPage(); ASSERT_EQ(bboxString(), "-72 -72 321 654"); actions.setCurrentPageNumber(2); endPage(); ASSERT_EQ(bboxString(), "-72 -72 321 654"); actions.setCurrentPageNumber(3); endPage(); ASSERT_EQ(bboxString(), "-72 -72 321 654"); } TEST_F(PapersizeSpecialTest, multiPage2) { actions.setBBoxFormatString("papersize"); actions.setCurrentPageNumber(1); ASSERT_EQ(bboxString(), "0 0 0 0"); preprocess("123bp,456bp"); preprocess("333bp"); endPage(); ASSERT_EQ(bboxString(), "-72 -72 333 333"); actions.setCurrentPageNumber(2); endPage(); ASSERT_EQ(bboxString(), "-72 -72 333 333"); actions.setCurrentPageNumber(3); preprocess("321bp,456bp"); endPage(); ASSERT_EQ(bboxString(), "-72 -72 321 456"); } dvisvgm-2.8.1/tests/StreamReaderTest.cpp0000664000175000017500000001012213536436567015226 00000000000000/************************************************************************* ** StreamReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include "StreamReader.hpp" #include "XXHashFunction.hpp" using namespace std; TEST(StreamReaderTest, readString) { string str1 = "dvisvgm converts DVI files to SVG."; istringstream iss(str1); ASSERT_TRUE(bool(iss)); StreamReader reader(iss); string str2 = reader.readString(iss.str().length()); EXPECT_EQ(str1, str2); iss.clear(); iss.str(str1); str2 = reader.readString(); EXPECT_EQ(str1, str2); } TEST(StreamReaderTest, readString_hashed) { string str1 = "dvisvgm converts DVI files to SVG."; istringstream iss(str1); ASSERT_TRUE(bool(iss)); StreamReader reader(iss); XXH32HashFunction hashfunc; string str2 = reader.readString(iss.str().length(), hashfunc); EXPECT_EQ(str1, str2); EXPECT_EQ(hashfunc.digestString(), "190cc9d2"); iss.clear(); iss.str(str1); hashfunc.reset(); str2 = reader.readString(hashfunc, false); EXPECT_EQ(hashfunc.digestString(), "190cc9d2"); } TEST(StreamReaderTest, readUnsigned) { string str = "\x01\x02\x03\x04"; istringstream iss(str); StreamReader reader(iss); uint32_t val = reader.readUnsigned(4); EXPECT_EQ(val, 0x01020304u); } TEST(StreamReaderTest, readUnsigned_hashed) { string str = "\x01\x02\x03\x04"; istringstream iss(str); StreamReader reader(iss); XXH32HashFunction hashfunc; uint32_t val = reader.readUnsigned(4, hashfunc); EXPECT_EQ(val, 0x01020304u); EXPECT_EQ(hashfunc.digestString(), "fe96d19c"); } TEST(StreamReaderTest, readSigned) { string str = "\xff\xee\xdd\xcc"; istringstream iss(str); StreamReader reader(iss); int32_t val = reader.readSigned(4); EXPECT_EQ(val, int32_t(0xffeeddcc)); } TEST(StreamReaderTest, readSigned_hashed) { string str = "\xff\xee\xdd\xcc"; istringstream iss(str); StreamReader reader(iss); XXH32HashFunction hashfunc; int32_t val = reader.readSigned(4, hashfunc); EXPECT_EQ(val, int32_t(0xffeeddcc)); EXPECT_EQ(hashfunc.digestString(), "8baa29bd"); } TEST(StreamReaderTest, readBytes) { string str = "\xff\xee\xdd\xcc"; istringstream iss(str); StreamReader reader(iss); vector bytes = reader.readBytes(3); EXPECT_EQ(bytes.size(), 3u); EXPECT_EQ(bytes[0], 0xff); EXPECT_EQ(bytes[1], 0xee); EXPECT_EQ(bytes[2], 0xdd); } TEST(StreamReaderTest, readBytes_hashed) { string str = "\xff\xee\xdd\xcc"; istringstream iss(str); StreamReader reader(iss); XXH32HashFunction hashfunc; vector bytes = reader.readBytes(3, hashfunc); EXPECT_EQ(bytes.size(), 3u); EXPECT_EQ(bytes[0], 0xff); EXPECT_EQ(bytes[1], 0xee); EXPECT_EQ(bytes[2], 0xdd); EXPECT_EQ(hashfunc.digestString(), "5eda43a0"); int byte = reader.readByte(hashfunc); EXPECT_EQ(byte, 0xcc); EXPECT_EQ(hashfunc.digestString(), "8baa29bd"); } dvisvgm-2.8.1/tests/SpecialManagerTest.cpp0000664000175000017500000000733113510660062015510 00000000000000/************************************************************************* ** SpecialManagerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "SpecialManager.hpp" #include "BgColorSpecialHandler.hpp" #include "ColorSpecialHandler.hpp" #include "DvisvgmSpecialHandler.hpp" #include "EmSpecialHandler.hpp" #include "HtmlSpecialHandler.hpp" #include "NoPsSpecialHandler.hpp" #include "PapersizeSpecialHandler.hpp" #include "PdfSpecialHandler.hpp" #include "TpicSpecialHandler.hpp" #include "utility.hpp" using namespace std; class SpecialManagerTest : public ::testing::Test { public: SpecialManagerTest () { handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); handlers.emplace_back(util::make_unique()); } vector> handlers; }; TEST_F(SpecialManagerTest, info1) { SpecialManager &sm = SpecialManager::instance(); sm.unregisterHandlers(); sm.registerHandlers(handlers, ""); ostringstream oss; sm.writeHandlerInfo(oss); string expected = "bgcolor background color special\n" "color complete support of color specials\n" "dvisvgm special set for embedding raw SVG snippets\n" "em line drawing statements of the emTeX special set\n" "html hyperref specials\n" "papersize special to set the page size\n" "pdf PDF hyperlink, font map, and pagesize specials\n" "tpic TPIC specials\n"; EXPECT_EQ(oss.str(), expected); } TEST_F(SpecialManagerTest, info2) { SpecialManager &sm = SpecialManager::instance(); sm.unregisterHandlers(); sm.registerHandlers(handlers, "color,em"); ostringstream oss; sm.writeHandlerInfo(oss); string expected = "bgcolor background color special\n" "dvisvgm special set for embedding raw SVG snippets\n" "html hyperref specials\n" "papersize special to set the page size\n" "pdf PDF hyperlink, font map, and pagesize specials\n" "tpic TPIC specials\n"; EXPECT_EQ(oss.str(), expected); } dvisvgm-2.8.1/tests/FontManagerTest.cpp0000664000175000017500000000502613510660062015035 00000000000000/************************************************************************* ** FontManagerTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "Font.hpp" #include "FontManager.hpp" class FontManagerTest : public ::testing::Test { public: FontManagerTest () : fm(FontManager::instance()) { fm.registerFont(10, "cmr10", 1274110073, 10, 10); fm.registerFont(11, "cmr10", 1274110073, 10, 12); fm.registerFont( 9, "cmr10", 1274110073, 10, 14); } protected: FontManager &fm; }; TEST_F(FontManagerTest, fontID1) { EXPECT_EQ(fm.fontID(10), 0); EXPECT_EQ(fm.fontID(11), 1); EXPECT_EQ(fm.fontID(9), 2); EXPECT_EQ(fm.fontID(1), -1); } TEST_F(FontManagerTest, font_ID2) { EXPECT_EQ(fm.fontID("cmr10"), 0); } TEST_F(FontManagerTest, getFont) { const Font *f1 = fm.getFont(10); EXPECT_TRUE(f1); EXPECT_EQ(f1->name(), "cmr10"); EXPECT_TRUE(dynamic_cast(f1)); const Font *f2 = fm.getFont(11); EXPECT_TRUE(f2); EXPECT_NE(f1, f2); EXPECT_EQ(f2->name(), "cmr10"); EXPECT_TRUE(dynamic_cast(f2)); EXPECT_EQ(f2->uniqueFont(), f1); } TEST_F(FontManagerTest, getFontById) { EXPECT_EQ(fm.getFont(10), fm.getFontById(0)); EXPECT_EQ(fm.getFont("cmr10"), fm.getFontById(0)); } dvisvgm-2.8.1/tests/genhashcheck.py0000775000175000017500000000375213510660062014264 00000000000000#!/usr/bin/python # This file is part of the dvisvgm package and published under the # terms of the GNU General Public License version 3 or later. # See file COPYING for further details. # Copyright (C) 2016-2019 Martin Gieseking import re import sys def extract_hashes (fname): with open(fname) as f: lines = f.readlines() found = False for line in lines: if ' hash2unicode {{\n' in line: found = True elif found: match = re.match(r'\s*{(0x[0-9a-f]{8}),\s*0x[0-9a-f]{4}}, //\s*(.+)\s*$', line) if match: hashval = match.group(1) name = match.group(2) print('\t{}{}, "{}"{},'.format('{', hashval, name, '}')) else: found = False if (len(sys.argv) < 2): sys.exit(1) print("""\ #include #include #include #include #include #include using namespace std; struct NameHash { uint32_t hash; string name; } nameHashes[] = {\ """) extract_hashes(sys.argv[1]) print(r"""}; int main () { if (distance(begin(nameHashes), end(nameHashes)) == 0) { cout << "hash table is empty\n"; return 1; } uint32_t prev_hash=0; for (NameHash &nameHash : nameHashes) { const string &name = nameHash.name; const uint32_t hash = nameHash.hash; if (XXH32(&name[0], name.length(), 0) != hash) { cout << "hash of '" << name << "' doesn't match\n"; return 1; } if (hash < prev_hash) { cout << "misplaced hash value " << hex << setw(8) << setfill('0') << hash << "\n"; return 1; } if (hash == prev_hash) { cout << "colliding hash values " << hex << setw(8) << setfill('0') << hash << "\n"; return 1; } prev_hash = hash; } cout << "hash check passed\n"; return 0; } """) dvisvgm-2.8.1/tests/PageSizeTest.cpp0000664000175000017500000000453613510660062014350 00000000000000/************************************************************************* ** PageSizeTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "PageSize.hpp" using namespace std; struct PageData { const char *name; double width, height; // in mm }; const vector pageData = { {"A4", 210, 297}, {"a4", 210, 297}, {"a4-p", 210, 297}, {"a4-portrait", 210, 297}, {"a4-l", 297, 210}, {"a4-landscape", 297, 210}, {"a5", 148, 210}, {"b2", 500, 707}, {"c10", 28, 40}, {"D3", 272, 385}, {"letter", 216, 279} }; TEST(PageSizeTest, resize) { PageSize pageSize; EXPECT_FALSE(pageSize.valid()); for (const PageData &data : pageData) { pageSize.resize(data.name); EXPECT_DOUBLE_EQ(pageSize.width().mm(), data.width) << data.name; EXPECT_DOUBLE_EQ(pageSize.height().mm(), data.height) << data.name; } } TEST(PageSizeTest, exceptions) { PageSize pageSize; EXPECT_THROW(pageSize.resize("a"), PageSizeException); EXPECT_THROW(pageSize.resize("e4"), PageSizeException); EXPECT_THROW(pageSize.resize("a4-unknown"), PageSizeException); } dvisvgm-2.8.1/tests/ColorTest.cpp0000664000175000017500000001543613510660062013720 00000000000000/************************************************************************* ** ColorTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "Color.hpp" using namespace std; TEST(ColorTest, construct) { EXPECT_EQ(Color(uint8_t(1), uint8_t(2), uint8_t(3)).rgbString(), "#010203"); EXPECT_EQ(Color(1.0/255, 2.0/255, 3.0/255).rgbString(), "#010203"); EXPECT_EQ(Color("Blue").rgbString(), "#00f"); EXPECT_EQ(Color("blue").rgbString(), "#00f"); EXPECT_EQ(Color("invalid").rgbString(), "#000"); } TEST(ColorTest, gray) { Color c; c.setGray(10.0/255); EXPECT_EQ(c.rgbString(), "#0a0a0a"); c.setGray(uint8_t(15)); EXPECT_EQ(c.rgbString(), "#0f0f0f"); } TEST(ColorTest, hsb) { Color c; c.setHSB(20.0/360, 0.75, 0.8); // i==0 EXPECT_EQ(c.rgbString(), "#c63"); c.setHSB(60.0/360, 0.75, 0.8); // i==1 EXPECT_EQ(c.rgbString(), "#cc3"); c.setHSB(120.0/360, 1.0, 1.0); // i==2 EXPECT_EQ(c.rgbString(), "#0f0"); c.setHSB(180.0/360, 1.0, 1.0); // i==3 EXPECT_EQ(c.rgbString(), "#0ff"); c.setHSB(240.0/360, 0.75, 0.8); // i==4 EXPECT_EQ(c.rgbString(), "#33c"); c.setHSB(300.0/360, 0.75, 0.8); // i==5 EXPECT_EQ(c.rgbString(), "#c3c"); c.setHSB(0.0, 1.0, 1.0); EXPECT_EQ(c.rgbString(), "#f00"); c.setHSB(20.0/360, 0, 0.2); // s==0 EXPECT_EQ(c.rgbString(), "#333"); } TEST(ColorTest, cmyk) { Color color; color.setCMYK(0.5, 0.4, 0.6, 0.2); EXPECT_EQ(color.rgbString(), "#667a52"); double c, m, y, k; color.setRGB(0.0, 0.0, 0.0); color.getCMYK(c, m, y, k); EXPECT_DOUBLE_EQ(c, 0.0); EXPECT_DOUBLE_EQ(m, 0.0); EXPECT_DOUBLE_EQ(y, 0.0); EXPECT_DOUBLE_EQ(k, 1.0); color.setRGB(1.0, 0.0, 0.0); color.getCMYK(c, m, y, k); EXPECT_DOUBLE_EQ(c, 0.0); EXPECT_DOUBLE_EQ(m, 1.0); EXPECT_DOUBLE_EQ(y, 1.0); EXPECT_DOUBLE_EQ(k, 0.0); } TEST(ColorTest, name) { Color c; EXPECT_TRUE(c.setPSName("Magenta")); EXPECT_EQ(c.rgbString(), "#f0f"); EXPECT_FALSE(c.setPSName("mulberry")); EXPECT_TRUE(c.setPSName("mulberry", false)); EXPECT_EQ(c.rgbString(), "#a314f9"); EXPECT_FALSE(c.setPSName("#Magenta")); EXPECT_FALSE(c.setPSName("#bcdefg")); EXPECT_TRUE(c.setPSName("#abcdef")); EXPECT_EQ(c.rgbString(), "#abcdef"); EXPECT_TRUE(c.setPSName("#89A")); EXPECT_EQ(c.rgbString(), "#00089a"); EXPECT_TRUE(c.setPSName("#A98 \n ")); EXPECT_EQ(c.rgbString(), "#000a98"); } TEST(ColorTest, getXYZ) { Color c; double x, y, z; c.setRGB(1.0, 0, 0); c.getXYZ(x, y, z); EXPECT_NEAR(x, 0.412456, 0.000001); EXPECT_NEAR(y, 0.212673, 0.000001); EXPECT_NEAR(z, 0.019334, 0.000001); c.setRGB(0, 1.0, 0); c.getXYZ(x, y, z); EXPECT_NEAR(x, 0.357576, 0.000001); EXPECT_NEAR(y, 0.715152, 0.000001); EXPECT_NEAR(z, 0.119192, 0.000001); c.setRGB(0, 0, 1.0); c.getXYZ(x, y, z); EXPECT_NEAR(x, 0.180437, 0.000001); EXPECT_NEAR(y, 0.072175, 0.000001); EXPECT_NEAR(z, 0.950304, 0.000001); valarray rgb(3), xyz(3); rgb[0] = 0.2; rgb[1] = 0.75; rgb[2] = 0.9; Color::RGB2XYZ(rgb, xyz); EXPECT_NEAR(xyz[0], 0.342574, 0.000001); EXPECT_NEAR(xyz[1], 0.437554, 0.000001); EXPECT_NEAR(xyz[2], 0.811202, 0.000001); } TEST(ColorTest, getLab) { Color c; double l, a, b; c.setRGB(1.0, 0, 0); c.getLab(l, a, b); EXPECT_NEAR(l, 53.2408, 0.0001); EXPECT_NEAR(a, 80.0925, 0.0001); EXPECT_NEAR(b, 67.2032, 0.0001); c.setRGB(0, 1.0, 0); c.getLab(l, a, b); EXPECT_NEAR(l, 87.7347, 0.0001); EXPECT_NEAR(a, -86.1827, 0.0001); EXPECT_NEAR(b, 83.1793, 0.0001); c.setRGB(0, 0, 1.0); c.getLab(l, a, b); EXPECT_NEAR(l, 32.2970, 0.0001); EXPECT_NEAR(a, 79.1875, 0.0001); EXPECT_NEAR(b, -107.8602, 0.0001); valarray rgb(3), lab(3); rgb[0] = 0.2; rgb[1] = 0.75; rgb[2] = 0.9; Color::RGB2Lab(rgb, lab); EXPECT_NEAR(lab[0], 72.0647, 0.0001); EXPECT_NEAR(lab[1], -23.7597, 0.0001); EXPECT_NEAR(lab[2], -29.4733, 0.0001); } TEST(ColorTest, svgColorString) { EXPECT_EQ(Color(uint32_t(0x000000)).svgColorString(false), "black"); EXPECT_EQ(Color(uint32_t(0xffffff)).svgColorString(false), "white"); EXPECT_EQ(Color(uint32_t(0xff0000)).svgColorString(false), "red"); EXPECT_EQ(Color(uint32_t(0x9400d3)).svgColorString(false), "darkviolet"); EXPECT_EQ(Color(uint32_t(0x000001)).svgColorString(false), "#000001"); EXPECT_EQ(Color(uint32_t(0x000000)).svgColorString(true), "#000"); EXPECT_EQ(Color(uint32_t(0xffffff)).svgColorString(true), "#fff"); EXPECT_EQ(Color(uint32_t(0xff0000)).svgColorString(true), "#f00"); EXPECT_EQ(Color(uint32_t(0x9400d3)).svgColorString(true), "#9400d3"); EXPECT_EQ(Color(uint32_t(0x000001)).svgColorString(true), "#000001"); } TEST(ColorTest, components) { EXPECT_EQ(Color::numComponents(Color::ColorSpace::GRAY), 1); EXPECT_EQ(Color::numComponents(Color::ColorSpace::RGB), 3); EXPECT_EQ(Color::numComponents(Color::ColorSpace::LAB), 3); EXPECT_EQ(Color::numComponents(Color::ColorSpace::CMYK), 4); } TEST(ColorTest, scale) { EXPECT_EQ((Color(uint32_t(0x123456)) *= 0.0).rgbString(), "#000"); EXPECT_EQ((Color(uint32_t(0x123456)) *= 1.0).rgbString(), "#123456"); EXPECT_EQ((Color(uint32_t(0x123456)) *= 3.0).rgbString(), "#369d02"); EXPECT_EQ((Color(uint32_t(0x123456)) *= 0.5).rgbString(), "#091a2b"); } TEST(ColorTest, set) { Color color; vector vec{0.1, 0.2, 0.3, 0.4}; VectorIterator it(vec); color.set(Color::ColorSpace::GRAY, it); EXPECT_EQ(uint32_t(color), 0x1a1a1au); it.reset(); color.set(Color::ColorSpace::RGB, it); EXPECT_EQ(uint32_t(color), 0x1a334du); it.reset(); color.set(Color::ColorSpace::CMYK, it); EXPECT_EQ(uint32_t(color), 0x8a7a6bu); it.reset(); color.set(Color::ColorSpace::LAB, it); EXPECT_EQ(uint32_t(color), 0x010000u); } dvisvgm-2.8.1/tests/TFMReaderTest.cpp0000664000175000017500000000642413510660062014410 00000000000000/************************************************************************* ** TFMReaderTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include #include #include #include #include "TFM.hpp" #include "utility.hpp" #ifndef SRCDIR #define SRCDIR "." #endif using namespace std; class TFMReaderTest : public ::testing::Test { public: void SetUp () override { string fname = string(SRCDIR)+"/data/cmr10.tfm"; ifstream ifs(fname, ios::binary); ASSERT_TRUE(ifs.is_open()) << "failed opening " << fname; tfm = util::make_unique(ifs); } protected: unique_ptr tfm; }; TEST_F(TFMReaderTest, properties) { ASSERT_NE(tfm, nullptr); EXPECT_EQ(tfm->getChecksum(), 0x4BF16079u); EXPECT_FALSE(tfm->verticalLayout()); EXPECT_EQ(tfm->firstChar(), 0); EXPECT_EQ(tfm->lastChar(), 127); EXPECT_DOUBLE_EQ(tfm->getDesignSize(), 10.0*72.0/72.27); } TEST_F(TFMReaderTest, charWidth) { ASSERT_NE(tfm, nullptr); EXPECT_NEAR(tfm->getCharWidth('M'), 9.132, 0.001); EXPECT_NEAR(tfm->getCharWidth('g'), 4.981, 0.001); EXPECT_DOUBLE_EQ(tfm->getCharWidth(200), 0); } TEST_F(TFMReaderTest, charHeight) { ASSERT_NE(tfm, nullptr); EXPECT_NEAR(tfm->getCharHeight('M'), 6.808, 0.001); EXPECT_NEAR(tfm->getCharHeight('g'), 4.289, 0.001); EXPECT_DOUBLE_EQ(tfm->getCharHeight(200), 0); } TEST_F(TFMReaderTest, charDepth) { ASSERT_NE(tfm, nullptr); EXPECT_DOUBLE_EQ(tfm->getCharDepth('M'), 0); EXPECT_NEAR(tfm->getCharDepth('g'), 1.937, 0.001); EXPECT_DOUBLE_EQ(tfm->getCharDepth(200), 0); } TEST_F(TFMReaderTest, italicCorr) { ASSERT_NE(tfm, nullptr); EXPECT_DOUBLE_EQ(tfm->getItalicCorr('M'), 0); EXPECT_NEAR(tfm->getItalicCorr('g'), 0.138, 0.001); EXPECT_DOUBLE_EQ(tfm->getItalicCorr(200), 0); } TEST_F(TFMReaderTest, params) { ASSERT_NE(tfm, nullptr); EXPECT_NEAR(tfm->getSpace(), 3.321, 0.001); EXPECT_NEAR(tfm->getSpaceShrink(), 1.107, 0.001); EXPECT_NEAR(tfm->getSpaceStretch(), 1.66, 0.001); EXPECT_NEAR(tfm->getQuad(), 9.963, 0.001); } dvisvgm-2.8.1/tests/MapLineTest.cpp0000664000175000017500000001324313510660062014161 00000000000000/************************************************************************* ** MapLineTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "MapLine.hpp" #include "Subfont.hpp" #include "testutil.hpp" using namespace std; TEST(MapLineTest, psline1) { istringstream iss("texname0 TEXNAME0 name(), "UGBK"); else WARNING("UGBK.sfd not found"); } TEST(MapLineTest, pdfline4) { istringstream iss("gbk@UGBK@ default :1:!simsun.ttc/UCS,Bold -e.345"); MapLine mapline(iss); EXPECT_EQ(mapline.texname(), "gbk"); EXPECT_EQ(mapline.psname(), ""); EXPECT_EQ(mapline.encname(), ""); // encodings "default" and "none" are replaced with "" EXPECT_EQ(mapline.fontfname(), "simsun.ttc"); EXPECT_EQ(mapline.fontindex(), 1); EXPECT_DOUBLE_EQ(mapline.slant(), 0); EXPECT_DOUBLE_EQ(mapline.extend(), 0.345); if (mapline.sfd() != 0) // if UGBK.sfd is installed, check SFD name EXPECT_EQ(mapline.sfd()->name(), "UGBK"); else WARNING("UGBK.sfd not found"); } TEST(MapLineTest, fail) { EXPECT_THROW(MapLine("texname -"), MapLineException); EXPECT_THROW(MapLine("texname -s"), MapLineException); EXPECT_THROW(MapLine("texname -e"), MapLineException); EXPECT_THROW(MapLine("texname -b"), MapLineException); EXPECT_THROW(MapLine("texname -i"), MapLineException); EXPECT_THROW(MapLine("texname -p"), MapLineException); EXPECT_THROW(MapLine("texname -v"), MapLineException); EXPECT_THROW(MapLine("texname -w"), MapLineException); EXPECT_THROW(MapLine("texname -Z"), MapLineException); } dvisvgm-2.8.1/tests/RangeMapTest.cpp0000664000175000017500000001437013510660062014330 00000000000000/************************************************************************* ** RangeMapTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include "RangeMap.hpp" using namespace std; #define CHECK_RANGE(name, cmap, cmin, cmax, cid_min) \ {SCOPED_TRACE(name); check_range(cmap, cmin, cmax, cid_min);} #define CHECK_ZERO(name, cmap, cmin, cmax) \ {SCOPED_TRACE(name); check_zero(cmap, cmin, cmax);} static void check_range (const RangeMap &rangemap, int min, int max, int minval) { for (int i=min; i <= max; i++) ASSERT_EQ((int)rangemap.valueAt(i), minval+(i-min)); } static void check_zero (const RangeMap &rangemap, int min, int max) { for (int i=min; i <= max; i++) ASSERT_EQ(rangemap.valueAt(i), 0u); } TEST(RangeMapTest, disjoint_ranges) { RangeMap rangemap; rangemap.addRange(5, 8, 1); ASSERT_EQ(rangemap.numRanges(), 1u); EXPECT_EQ(rangemap.numValues(), 4u); CHECK_RANGE("A", rangemap, 5, 8, 1); CHECK_ZERO("B", rangemap, 0, 4); CHECK_ZERO("C", rangemap, 9, 20); rangemap.addRange(10, 15, 5); ASSERT_EQ(rangemap.numRanges(), 2u); EXPECT_EQ(rangemap.numValues(), 10u); CHECK_RANGE("D", rangemap, 5, 8, 1); CHECK_RANGE("E", rangemap, 10, 15, 5); CHECK_ZERO("F", rangemap, 0, 4); CHECK_ZERO("G", rangemap, 9, 9); CHECK_ZERO("H", rangemap, 16, 20); rangemap.addRange(0, 3, 50); ASSERT_EQ(rangemap.numRanges(), 3u); EXPECT_EQ(rangemap.numValues(), 14u); CHECK_RANGE("I", rangemap, 0, 3, 50); CHECK_RANGE("J", rangemap, 5, 8, 1); CHECK_RANGE("K", rangemap, 10, 15, 5); CHECK_ZERO("L", rangemap, 4, 4); CHECK_ZERO("M", rangemap, 9, 9); CHECK_ZERO("N", rangemap, 16, 20); rangemap.addRange(16, 20, 1); ASSERT_EQ(rangemap.numRanges(), 4u); EXPECT_EQ(rangemap.numValues(), 19u); CHECK_RANGE("O", rangemap, 5, 8, 1); CHECK_RANGE("P", rangemap, 10, 15, 5); CHECK_RANGE("Q", rangemap, 0, 3, 50); CHECK_RANGE("R", rangemap, 16, 20, 1); } TEST(RangeMapTest, touching_ranges1) { RangeMap rangemap; rangemap.addRange(5, 8, 10); ASSERT_EQ(rangemap.numRanges(), 1u); EXPECT_EQ(rangemap.numValues(), 4u); CHECK_RANGE("A", rangemap, 5, 8, 10); rangemap.addRange(9, 15, 14); ASSERT_EQ(rangemap.numRanges(), 1u); EXPECT_EQ(rangemap.numValues(), 11u); CHECK_RANGE("B", rangemap, 5, 15, 10); rangemap.addRange(1, 4, 5); ASSERT_EQ(rangemap.numRanges(), 2u); EXPECT_EQ(rangemap.numValues(), 15u); CHECK_RANGE("C", rangemap, 1, 4, 5); CHECK_RANGE("D", rangemap, 5, 15, 10); rangemap.addRange(1, 4, 6); ASSERT_EQ(rangemap.numRanges(), 1u); EXPECT_EQ(rangemap.numValues(), 15u); CHECK_RANGE("E", rangemap, 1, 15, 6); } TEST(RangeMapTest, touching_ranges2) { RangeMap rangemap; rangemap.addRange(7, 8, 10); ASSERT_EQ(rangemap.numRanges(), 1u); CHECK_RANGE("A", rangemap, 7, 8, 10); rangemap.addRange(2, 3, 1); ASSERT_EQ(rangemap.numRanges(), 2u); CHECK_RANGE("B", rangemap, 2, 3, 1); CHECK_RANGE("C", rangemap, 7, 8, 10); rangemap.addRange(4, 4, 3); ASSERT_EQ(rangemap.numRanges(), 2u); CHECK_RANGE("D", rangemap, 2, 4, 1); CHECK_RANGE("E", rangemap, 7, 8, 10); } TEST(RangeMapTest, overlapping_ranges) { RangeMap rangemap; rangemap.addRange(5, 8, 10); rangemap.addRange(7, 15, 12); ASSERT_EQ(rangemap.numRanges(), 1u); CHECK_RANGE("A", rangemap, 5, 15, 10); rangemap.addRange(10, 20, 1); ASSERT_EQ(rangemap.numRanges(), 2u); CHECK_RANGE("B", rangemap, 5, 9, 10); CHECK_RANGE("C", rangemap, 10, 20, 1); rangemap.addRange(2, 7, 7); ASSERT_EQ(rangemap.numRanges(), 2u); CHECK_RANGE("D", rangemap, 2, 9, 7); CHECK_RANGE("E", rangemap, 10, 20, 1); rangemap.addRange(1, 12, 100); ASSERT_EQ(rangemap.numRanges(), 2u); CHECK_RANGE("F", rangemap, 1, 12, 100); CHECK_RANGE("G", rangemap, 13, 20, 4); rangemap.addRange(0, 30, 1); ASSERT_EQ(rangemap.numRanges(), 1u); CHECK_RANGE("H", rangemap, 0, 30, 1); } TEST(RangeMapTest, inner_ranges) { RangeMap rangemap; rangemap.addRange(5, 20, 1); rangemap.addRange(10, 15, 6); ASSERT_EQ(rangemap.numRanges(), 1u); CHECK_RANGE("A", rangemap, 5, 20, 1); rangemap.addRange(10, 15, 100); ASSERT_EQ(rangemap.numRanges(), 3u); CHECK_RANGE("B", rangemap, 5, 9, 1); CHECK_RANGE("C", rangemap, 10, 15, 100); CHECK_RANGE("D", rangemap, 16, 20, 12); rangemap.addRange(15, 15, 50); ASSERT_EQ(rangemap.numRanges(), 4u); CHECK_RANGE("E", rangemap, 5, 9, 1); CHECK_RANGE("F", rangemap, 10, 14, 100); CHECK_RANGE("G", rangemap, 15, 15, 50); CHECK_RANGE("H", rangemap, 16, 20, 12); rangemap.addRange(6, 19, 1); ASSERT_EQ(rangemap.numRanges(), 3u); CHECK_RANGE("I", rangemap, 5, 5, 1); CHECK_RANGE("J", rangemap, 6, 19, 1); CHECK_RANGE("K", rangemap, 20, 20, 16); } TEST(RangeMapTest, iterators) { RangeMap rangemap; rangemap.addRange(5, 10, 1); rangemap.addRange(20, 25, 60); ASSERT_EQ(rangemap.numRanges(), 2u); using Pair32 = pair; vector pairs = { Pair32(5, 1), Pair32(6, 2), Pair32(7, 3), Pair32(8, 4), Pair32(9, 5), Pair32(10, 6), Pair32(20, 60), Pair32(21, 61), Pair32(22, 62), Pair32(23, 63), Pair32(24, 64), Pair32(25, 65) }; int count=0; for (auto p : rangemap) ASSERT_EQ(p, pairs[count++]); } dvisvgm-2.8.1/tests/PairTest.cpp0000664000175000017500000001014113510660062013521 00000000000000/************************************************************************* ** PairTest.cpp ** ** ** ** This file is part of dvisvgm -- a fast DVI to SVG converter ** ** Copyright (C) 2005-2019 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #include #include #include "Pair.hpp" using namespace std; TEST(PairTest, constructor) { DPair p(-1.5, 2); ASSERT_EQ(p.x(), -1.5); ASSERT_EQ(p.y(), 2); DPair q = p; ASSERT_EQ(q.x(), -1.5); ASSERT_EQ(q.y(), 2); } TEST(PairTest, setter) { DPair p(1,2); ASSERT_EQ(p, DPair(1,2)); p.x(3); ASSERT_EQ(p, DPair(3,2)); p.y(5); ASSERT_EQ(p, DPair(3,5)); } TEST(PairTest, length) { ASSERT_EQ(DPair(0,0).length(), 0); ASSERT_EQ(DPair(1,0).length(), 1); ASSERT_EQ(DPair(0,1).length(), 1); ASSERT_EQ(DPair(-1,0).length(), 1); ASSERT_EQ(DPair(0,-1).length(), 1); // check some Pythagorean triples for (int i=1; i < 10; ++i) { for (int j=i+1; j <= 10; ++j) { int a = j*j-i*i; int b = 2*i*j; int c = j*j+i*i; ASSERT_EQ(DPair(a, b).length(), c); ASSERT_EQ(DPair(b, a).length(), c); ASSERT_EQ(DPair(-a, b).length(), c); ASSERT_EQ(DPair(-b, a).length(), c); ASSERT_EQ(DPair(-a, -b).length(), c); } } } TEST(PairTest, add) { ASSERT_EQ(DPair(2,3)+DPair(0,0), DPair(2,3)); ASSERT_EQ(DPair(2,3)+DPair(4,5), DPair(6,8)); ASSERT_EQ(DPair(2,3)+DPair(-4,-5), DPair(-2,-2)); } TEST(PairTest, sub) { ASSERT_EQ(DPair(2,3)-DPair(0,0), DPair(2,3)); ASSERT_EQ(DPair(2,3)-DPair(4,5), DPair(-2,-2)); ASSERT_EQ(DPair(2,3)-DPair(-4,-5), DPair(6,8)); } TEST(PairTest, mul) { ASSERT_EQ(DPair(2,3)*0.0, DPair(0,0)); ASSERT_EQ(DPair(2,3)*1.0, DPair(2,3)); ASSERT_EQ(DPair(2,3)*2.0, DPair(4,6)); ASSERT_EQ(DPair(2,3)*(-2.0), DPair(-4,-6)); } TEST(PairTest, div) { ASSERT_EQ(DPair(2,3)/1.0, DPair(2,3)); ASSERT_EQ(DPair(2,3)/2.0, DPair(1,1.5)); ASSERT_EQ(DPair(2,3)/(-2.0), DPair(-1,-1.5)); } TEST(PairTest, neg) { EXPECT_EQ(-DPair(0, 0), DPair(0, 0)); EXPECT_EQ(-DPair(1, 2), DPair(-1, -2)); EXPECT_EQ(-DPair(-1, -2), DPair(1, 2)); EXPECT_EQ(-DPair(-1, 2), DPair(1, -2)); EXPECT_EQ(-DPair(1, -2), DPair(-1, 2)); } TEST(PairTest, abs) { EXPECT_EQ(abs(DPair(0, 0)), DPair(0, 0)); EXPECT_EQ(abs(DPair(1, 2)), DPair(1, 2)); EXPECT_EQ(abs(DPair(-1, -2)), DPair(1, 2)); EXPECT_EQ(abs(DPair(-1, 2)), DPair(1, 2)); EXPECT_EQ(abs(DPair(1, -2)), DPair(1, 2)); } TEST(PairTest, equality) { ASSERT_TRUE(DPair(2,3) == DPair(2,3)); ASSERT_FALSE(DPair(2,3) == DPair(-2,-3)); ASSERT_TRUE(DPair(2,3)+DPair(4,5) == DPair(6,8)); ASSERT_FALSE(DPair(2,3)+DPair(4,5) != DPair(6,8)); } TEST(PairTest, ortho) { ASSERT_EQ(DPair(0,0).ortho(), DPair(0,0)); ASSERT_EQ(DPair(1,0).ortho(), DPair(0,1)); ASSERT_EQ(DPair(0,1).ortho(), DPair(-1,0)); ASSERT_EQ(DPair(-1,0).ortho(), DPair(0,-1)); ASSERT_EQ(DPair(0,-1).ortho(), DPair(1,0)); } TEST(PairTest, write) { ostringstream oss; DPair p(3,4); oss << p; ASSERT_EQ(oss.str(), "(3,4)"); p *= 2; oss.str(""); oss << p; ASSERT_EQ(oss.str(), "(6,8)"); } dvisvgm-2.8.1/NEWS0000664000175000017500000010230313563265535010637 00000000000000dvisvgm-2.8.1 (2019-11-14) - added SVG optimizer module 'simplify-text' - added support for PS operator 'nulldevice' - copy absolute paths from special 'psfile' unchanged to the SVG file - some code refactorings dvisvgm-2.8 (2019-10-25) - added support for JPEG, PNG, PDF, and SVG files to special 'psfile' - added support for Ghostscript 9.50 - added support for elliptical arc segments in graphics paths - added support for CMap operator 'begincidchar' (patch by Akira Kakuto) - added suport for experimental 128-bit XXH3 hashes - extended optimizer module 'simplify-transform' to incorporate translation and scaling components into positional and size attributes - replaced CRC32 checksums used in cache files with XXH32 hashes - updated potrace to version 1.16 - updated xxHash to version 0.7.2 - updated gtest to 1.10 - lots of code refactorings dvisvgm-2.7.4 (2019-07-28) - fixed memory issue occurred when calling Metafont - fixed rounding issue in color conversion (GH #116) - changed location of cache files from ~/.dvisvgm/cache to $XDG_CACHE_HOME/dvisvgm which usually expands to ~/.cache/dvisvgm (GH #112) - some minor refactorings dvisvgm-2.7.3 (2019-07-12) - fixed randomly missing glyph paths referenced by 'use' elements (GH #110) - minor update of the man page - some code refactorings dvisvgm-2.7.2 (2019-06-07) - adapted PostScript handler to incompatible changes introduced with Ghostscript 9.27 (removal of GS_PDF_ProcSet and pdfdict) dvisvgm-2.7.1 (2019-05-20) - fixed a bug in PS operator 'setmatrix' (GH #106) - fixed build issue reported on MacPorts (https://trac.macports.org/ticket/58347) - added source files required to access the MIKTeX session object (required due to deprecation of the MiKTeX SDK) dvisvgm-2.7 (2019-04-13) - added option --optimize to perform several optimizations on the generated SVG files (current optimizer modules: collapse-groups, group-attributes, remove-clippath, simplify-transform) (GH #97) - dvisvgm's "raw" specials are now parsed and converted to proper XML nodes - several improvements to SVG graphics path descriptions: * omit redundant spaces and leading zeros * omit line commands representing zero-length lines * improved detection of reflected control points in Bézier curve sequences - added evaluation of PS operators xshow, yshow, and xyshow - added evaluation of psfile/pdffile attribute 'clip' to clip the drawing region to the bounding box of the image being processed (GH #104) - added specials 'dvisvgm:bbox lock' and 'dvisvgm:bbox unlock' to disable and enable updating the bounding box of the current page (GH #105) - added optional modifier 'transform' to dvisvgm:bbox specials to allow for applying the current transformation to the bounding box - added macro '{?matrix}' to dvisvgm's 'raw' specials that expands to the current transformation matrix - renamed option --exact to --exact-bbox (backward compatible change) - updated the bundled xxHash library to version 0.7.0 - lots of code refactorings dvisvgm-2.6.3 (2019-03-09) - create short RGB hex values for color attributes if possible - fixed rejection of paper formats, like A4, by option --bbox - fixed incomplete adaption of vertical orientation when processing EPS/PDF files - fixed handling of backslashes in EPS/PDF file paths (Windows only) - updated bundled Google Test library to version 1.8.1 - some code refactorings and improvements of the build system dvisvgm-2.6.2 (2019-01-23) - fixed scaling of line properties in PS operator 'grestore' - fixed handling of PS operators 'charpath' and 'show' which may call each other internally - improved processing of PS operator 'clippath' - prevent visible side-effects of PS operator 'stringwidth' - updated bundled brotli library to version 1.0.7 - some modifications of the build system to simplify maintenance in TeX Live dvisvgm-2.6.1 (2018-10-12) - added configuration option --disable-manpage to prevent generating the manual page (GH issue #93) - if configuration option --disable-bundled-libs is given and some of the required system libraries are missing, the corresponding bundled library is used as a fallback (GH issue #94) - updated bundled brotli library to version 1.0.6 - fixed build issue occurred with GCC 4.8 dvisvgm-2.6 (2018-09-08) - added option --page-hashes that allows for skipping the conversion of a page if its content hasn't changed - relaxed plausibility check of total page count stated in the postamble (this value overflows if the DVI file contains more than 65535 pages) - added validity checks for bop (begin of page) offsets present in the bop and post commands - some refactorings and minor improvements dvisvgm-2.5 (2018-08-08) - added multi-page support (option --page) to PDF mode (option --pdf) - added evaluation of transformation options in PDF mode - added support for all length units to option --transform - TeX Live Win32: look for Ghostscript DLL in the TL folders as well (thanks to Akira Kakuto for sending the patch) - potrace has been added again to the bundled third-party libraries - instead of linking the bundled libraries brotli, potrace, woff2, and xxhash, the configure script now looks for the corresponding system libraries by default - added option --enable-bundled-libs to the configure script to build and statically link the bundled libraries - some refactorings dvisvgm-2.4.2 (2018-07-18) - fixed height and depth values computed when using the preview package - removed additional borders from the bounding boxes of hyperlinked areas - prevent warnings if special "psfile" is called with argument "/dev/null" (e.g. option "psfixbb" of the preview package adds such specials) - "make install" no longer fails if the manpage can't be built dvisvgm-2.4.1 (2018-07-07) - fixed handling of delay parameter of option --progress - updated brotli library to version 1.0.5 - updated woff2 library to version 1.0.2 - updated URLs in manual page - several minor code refactorings dvisvgm-2.4 (2018-05-03) - added special 'pdffile' similar to 'psfile' to embed PDF graphics - added option --pdf to convert single-page PDF documents to SVG - reassigned short option -P from --progress to --pdf - added option --stdin to receive input from stdin - option --stdout can now be combined with option --zip - added processing of GS operators '.setshapealpha' and '.setblendmode' - fixed outer transformations applied to psfile specials - fixed computation of bounding boxes triggered by psfile specials - several code refactorings dvisvgm-2.3.5 (2018-03-23) - added evaluation of PS operator 'setpagedevice' in psfile specials - fixed evaluation of dvips color names - fixed warning printed when using Ghostscript 9.23 dvisvgm-2.3.4 (2018-03-14) - fixed error message printed when addding a single '-' on the command-line - added missing data file that lead to failing tests (GH bug #87) - updated brotli library to version 1.0.3 - some code refactorings dvisvgm-2.3.3 (2018-02-20) - fixed wrong behavior when requiring both default mapfiles and pdf:mapline or pdf:mapfile specials - fixed an exception thrown in case of unavailable fonts dvisvgm-2.3.2 (2018-02-08) - prevent the creation of redundant tspan elements - added support for new JFM format (patch by Hironobu Yamashita) - fixed build error occurred if GS development files were missing - fixed a potential memory issue regarding option --cache dvisvgm-2.3.1 (2018-01-12) - fixed the width of characters slanted by a mapfile entry (GH bug #82) - if ttfautohint fails for a font, dvisvgm now uses the unhinted font and prints a corresponding warning message - some code cleanup dvisvgm-2.3 (2017-12-28) - added experimental support for ttfautohint - updated xxHash to version 0.6.4 - added configuration option to set location of libkpathsea (GH bug #71) - some improvements of the build system dvisvgm-2.2.3 (2017-12-12) - updated the bundled brotli library to version 1.0.2 - fixed a potential memory issue - some code and test improvements dvisvgm-2.2.2 (2017-11-17) - fixed memory issue regarding font maps (GH bug #79) - avoid scientific notation of floating point numbers - minor code improvements dvisvgm-2.2.1 (2017-11-13) - fixed portability issue when building the manpage (GH bug #72) - fixed incomplete computation of PS line width (GH bug #77) - further code refactorings dvisvgm-2.2 (2017-10-19) - added evaluation of pdf:pagesize specials - added evaluation of PDF hyperlink specials - try to load Ghostscript dylib on Mac systems (patch by Toby Fleming, GH bug #66) - improved TPIC special handler, added evaluation of 'tx' special - length values in dvisvgm specials now accept unit specifiers - added pdftex.map to default mapfiles - fixed potential infinite loop after starting subprocesses (GH bug #68) - files included with psfile are now also searched in the texmf tree if not present in the current working directory (GH bug #69) - fixed transformation issue in computation of psfile position (GH bug #70) - updated bundled brotli, woff2, and xxhash libraries - several code refactorings and improvements dvisvgm-2.1.3 (2017-02-20) - fixed build failures of libfontforge on Solaris 10 - increased code portablity dvisvgm-2.1.2 (2017-02-12) - bundled the googletest sources to simplify building and executing the tests - fixed a couple of issues related to LLVM's libc++ (thanks to Mojca Miklavec and Rasmus Larsen for their help to isolate the problems) - fixed some potential memory leaks - removed 'restrict' keyword from xxHash sources to avoid C++ compilation errors (https://github.com/Cyan4973/xxHash/issues/88) dvisvgm-2.1.1 (2017-02-07) - don't rerun Metafont for missing fonts - fixed build failure on OS X (GH bug #65) - several minor code improvements and test enhancements dvisvgm-2.1 (2017-01-19) - added option --tmpdir to explicitly set temp folder - temporary files are no longer created in the current working directory by default but in the system's temp folder (GH bug #63) - added warning/error messages if temporary files could not be written - fixed collision of Unicode points in AGL table (GH bug #64) - retain letter case of filenames even if not significant (Windows only) - code refactorings and cleanup dvisvgm-2.0.4 (2016-11-16) - bundled reduced FontForge library (ff-woff) with the sources - minor fixes in manpage and --help texts - few code improvements dvisvgm-2.0.3 (2016-09-27) - fixed a regression in the character positioning of virtual fonts - fixed positioning of rules dvisvgm-2.0.2 (2016-09-19) - fixed computation of the character depths of native fonts - fixed a regression in the computation of DVI positions (GH bug #61) dvisvgm-2.0.1 (2016-09-03) - added optional argument parameter "autohint" to option --font-format in order to create autohinted TTF, WOFF, or WOFF2 fonts dvisvgm-2.0 (2016-08-29) - added option --font-format to select the data format of embedded fonts (currently supported formats: SVG, TTF, WOFF, WOFF2) - switched the code base from C++03 to C++11 - reimplemented the command-line parser and the CommandLine class generator - major refactorings of several parts of the code dvisvgm-1.16 (2016-07-04) - added support for XDV version 7 introduced by XeTeX 0.99995 - added optional processing of papersize specials - added support for length units cc, dd, and sp - fixed unit conversion in computation of bounding boxes - fixed propagation of resolution value to the glyph vectorizer - fixed transformation of background rectangle - prevent processing of corrupted GF files - major refactorings of the DVI reader and the SVG backend dvisvgm-1.15.1 (2016-04-19) - added explicit encoding attribute to the XML declaration again (GH bug #54) - added support for AGL character names of the form 'uFOO' and 'uniFOO' - fixed parsing of transformation parameters given on the command-line - minor code and test improvements dvisvgm-1.15 (2016-02-27) - added option --comments to add additional information to the SVG file - fixed a clipping bug in the PostScript handler - some code improvements and refactorings - moved test data files to a separate folder dvisvgm-1.14.2 (2016-01-20) - fixed handling of background color specials (now they affect all succeeding pages until the next change) - fixed a potential memory issue caused by accessing an invalid iterator - updated xxHash to version 0.5.0 - added xxHash to the output of --version=1 - minor additions to the manpage - added test case to validate the hash values used in Unicode.cpp dvisvgm-1.14.1 (2016-01-05) - fixed an issue in the PostScript handler that could lead to invalid SVG files if multiple DVI pages were converted - added checks for invalid GF files to prevent undefined behavior dvisvgm-1.14 (2015-12-28) - added evaluation of PSTricks specials 'pst:' and 'PST:' - the bounding box data created by the preview package is now adapted to create a tight box by default - added option --bbox=preview to apply the unmodified bounding box data created by the preview package - improved lookup of files located in the current working directory - fixed a memory issue related to graphics paths - improved extraction of kapathsea version number - minor code and test improvements dvisvgm-1.13 (2015-12-08) - added evaluation of PS operators 'ashow', 'awidthshow', and 'widthshow' (GH bug #49) - improved conversion of fonts referenced by PS code to graphics paths - redundant 'moveto' commands are now removed from paths - fixed issue concerning evaluation of PS operator 'setcolor' - fixed output of PS error messages - updated bundled xxHash library to revision 42 - minor code refactorings and cleanup dvisvgm-1.12 (2015-11-18) - added option --colornames to replace RGB values by SVG color names - fixed resolving of character codes for fonts without supported chracater maps - fixed a memory issue that could occur when calling Metafont dvisvgm-1.11 (2015-09-21) - improved mapping of unknown characters to Unicode - improved handling of text elements in conjunction with \specials (patch by Till Tantau) - fixed an issue that could lead to (invalid) U+0000 codepoints - prevent creating invalid XML by quoting xlink:title attributes properly - documentation: updated links to new website address dvisvgm-1.10 (2015-07-15) - added support for the new XDV format 6 created by XeTeX 0.99992 - improved mapping of PostScript character names to Unicode points dvisvgm-1.9.2 (2015-04-08) - avoid retracing of fonts if option --no-fonts and --trace-all=y are given - skip tracer messages if no glyphs have been traced - extended the build system to generate code coverage reports - improved some tests of the test suite - some general code refactorings and improvements dvisvgm-1.9.1 (2015-02-28) - extended --output pattern syntax by arithmetic expressions and width specifiers - improved formatting of manpage - fixed Clang build issue (patch by Peter Breitenlohner) - fixed a build issue occurred with old MinGW compilers - code cleanup and refactorings dvisvgm-1.9 (2014-12-29) - added partial implementation of PostScript operator 'shfill' to create color gradient fills (supported shading types: free-form triangular, lattice-form triangular, Coons, and tensor-product patch meshes) - added options --grad-segments, --grad-overlap, and --grad-simplify to control the approximation of color gradients - added option --no-merge to create separate text elements for each character (patch by Khaled Hosny) - added a simple progress counter to the EPS to SVG converter - added opt2cpp.py as a free replacement for my non-free opt2cpp.xsl script (thanks to Khaled Hosny for the implementation and for providing it for free) - added lookup of Ghostscript library in the Windows registry - fixed validity check of DVI files - fixed interaction of color specials and PostScript color operators - several code refactorings and improvements dvisvgm-1.8.1 (2014-08-29) - unreferenced clipPath elements are now removed from the SVG files - fixed side-effects caused by unexpected bop/eop operators in PS specials (LP bug #1350688) - few improvements to configure.ac (patches by Khaled Hosny) - removed redundant code dvisvgm-1.8 (2014-07-29) - added option --clipjoin which tells dvisvgm to compute intersections of clipping paths itself and not to delegate this task to the SVG renderer - added option --relative to create relative rather than absolute path commands - added evaluation of PS operator 'clippath' which copies the current clipping path into the graphics path - fixed PS operator 'show' to prevent the creation of unintended path overlays - fixed memory leak in class FontEngine (patch by Khaled Hosny) - fixed unintended throwing of a DVIException when dvisvgm is called with option --list-specials - Cygwin builds of dvisvgm now look for the proper filename of the Ghostscript DLL dvisvgm-1.7 (2014-06-18) - all DVI files are pre-processed now to allow the implementation of advanced features that rely on data not available on the pages being converted - added support for internal hyperref links across pages - added \special command dvisvgm:rawdef to insert raw SVG fragments to the section - added the new \special commands dvisvgm:rawset, dvisvgm:endrawset, and dvisvgm:rawput to assign and access a sequence of SVG fragments via an identifier (LP feature request #1215878) - removed redundant elements from SVG files - fixed support of external fonts containing characters not mapped by the embedded unicode tables (LP bug #1276689) - fixed incorrect extent values shown in conjunction with the preview package - many refactorings and code improvements dvisvgm-1.6 (2014-04-22) - added option --zoom to "visually" scale the generated SVG graphics while preserving the original size and position values of the graphic objects - extended argument syntax of option --linkmark to allow to select the box/line color - changed default link marker from 'line' to 'box' - changed link markers to be only split on line breaks while extended in all other cases - if libgs is not directly linked to the binary, dvisvgm now looks for libgs.so.X instead of libgs.so (supported GS ABIs: X = 7, 8, 9) - removed time stamp and machine triplet from generated SVG files - some code improvements and refactorings dvisvgm-1.5.3 (2014-04-11) - improved positioning of PostScript graphics - fixed positioning of DVI rules/rectangles - switched internal computations from TeX points (pt) to PostScript points (bp) dvisvgm-1.5.2 (2014-01-10) - fixed handling of global font colors and color specials - several code improvements dvisvgm-1.5.1 (2013-10-29) - fixed processing of bounding box data created by the preview package - fixed processing of font definitions across DVI pages - fixed compilation issues occurred if processing of PS specials is disabled - don't print the logical page number if it's equal to the physical one - some minor code improvements dvisvgm-1.5 (2013-09-02) - added support for DVI format 3 as created by pTeX in vertical/tate mode - added support for DVI format 5 (XDV) as created by XeTeX - replaced numeric entity references by corresponding UTF-8 characters in generated SVG files - added px unit to font-size attributes as used in the stylesheet section to ensure correct computation of font sizes (LP bug #1215857) - various code refactorings dvisvgm-1.4 (2013-08-02) - added basic support for CMap files and CID-based fonts - added character mapping from CIDs to char codes based on the encoding tables of a non-CID font - added support for OTF fonts - added evaluation of bounding box data generated by the preview package - extended option --linkmark to mark hyperlinked areas with an arbitrary background color - PS handler: improved evaluation of PS header specials - PS handler: improved evaluation of operator 'show' - removed DOCTYPE declaration from generated SVG files - removed encoding attribute from xml declaration (replaces ISO-8859-1 with UTF-8) - various code improvements and refactorings dvisvgm-1.3 (2013-05-13) - added support for hyperref specials - added command-line option --linkmarker to select the way how to mark hyperlinked areas - dvisvgm builds for MiKTeX now try to access the Ghostscript DLL provided by MiKTeX so that it's no longer necessary to install Ghostscript separately - improved the handling of TFM files to avoid failures in case of malformed files - added evaluation of Japanese Font Metric (JFM) files - the bundled potrace library has been removed from the source tarball as it's easy to build the latest releases from the original sources available at http://potrace.sourceforge.net - several code refactorings dvisvgm-1.2.2 (2013-04-26) - fixed a bug that prevented the lookup of fontmap files - avoid throwing an exception but print a warning message if MiKTeX is not available - print a warning message if PostScript specials are found but ignored - added information about "dvisvgm -E" to the --help text and to the manpage - various code refactorings and cleanups dvisvgm-1.2.1 (2013-04-09) - updated bundled potrace library to version 1.11 - avoid building bundled potracelib if system library is present (patch by Alexis Ballier) - allow background color specials to create white background rectangles - code refactorings and cleanup dvisvgm-1.2 (2013-03-01) - PostScript handler: added support of tiling patterns - PostScript handler: added support for EPS files with binary headers/footers - added option --eps to directly convert EPS files to SVG - added option --precision to select the number of decimal places used in the generated SVG files - added an optional argument to --help to choose a display variant - fixed the text alignment of the --help output - improved handling of PostScript operator "show" - choose the correct output location if the input file argument contains path specifiers (Windows only) dvisvgm-1.1 (2013-01-22) - added evaluation of pdf:mapline and pdf:mapfile specials - added evaluation of subfont file definitions (.sfd files) - added support for TTC (TrueType collection) fonts - added evaluation of font style parameters given in a font map definition - renamed option --map-file to --fontmap - the new option --fontmap allows multiple mapfile arguments and optional mode specifiers - if a PostScript error occurs, dvisvgm prints an error message together with the PS operand stack, as generated by Ghostscript - if font checksums don't match, dvisvgm prints a warning now - avoid throwing exceptions if referenced encoding files are not available - added support for 64bit Windows builds - removed compilation error when using a C++11 compiler (patch by Peter Breitenlohner) - some code refactorings and improvements dvisvgm-1.0.12 (2012-09-27) - print a message if the processing of PostScript specials is disabled - the resulting SVG is now scaled to bp ("big point" units) properly - added the evaluation of PS operators rectclip, rectfill, and rectstroke - ignore dvips operator bop if present in a PS special - fixed processing of special strings that contain newline characters dvisvgm-1.0.11 (2012-03-09) - added Ghostscript to library list printed by --version=yes - fixed a bug in the number parser that could lead to displaced objects (SF bug #3471097) - corrected the computation of bounding boxes of DVI rules (lp bug #948713) - improved code compatibility to make dvisvgm compile with clang++ (patch by Vladimir Lomov) - fixed formatting issues in the manual page - updated information about bug reporting (tracker moved to Launchpad) dvisvgm-1.0.10 (2011-12-18) - introduced environment variable DVISVGM_COLORS to allow user-defined message colors - fixed linking issue concerning libfreetype - fixed potential clashes of character IDs dvisvgm-1.0.9 (2011-10-13) - fixed segfault occurred in TeX Live Win32 caused by mf.exe being unavailable (thanks to Akira Kakuto for tracking down the issue) - updated bundled potrace library to version 1.10 - some minor code improvements dvisvgm-1.0.8 (2011-05-31) - PS handler: added evaluation of PS operators save, restore, and grestoreall - PS handler: fixed potential segfault caused by invisible zero-length paths - fixed computation of current drawing position influenced by PS and DVI actions - don't stop Metafont conversions on errors any longer in order to convert buggy MF fonts properly dvisvgm-1.0.7 (2011-05-06) - improved overall handling of PS specials - fixed broken PS special subset 'ps::' - fixed scaling of PS line properties (width, dash distance, etc.) - fixed semantics of TPIC special 'ip' (doesn't draw polygon outlines any longer) dvisvgm-1.0.6 (2011-04-21) - fixed segfault occurred if a (malformed) DVI file calls set_char/put_char without preceding font definition - added CTRL-C handler - MiKTeX support updated to version 2.9 - some code refactorings dvisvgm-1.0.5 (2011-03-01) - added optional integer argument to option -n to disable generation of elements - added missing unit to width/height attributes of svg root element (SF bug #3185773) - added integrity check to font cache files - updated bundled potrace library to version 1.9 - fixed a couple of minor issues dvisvgm-1.0.4 (2010-12-18) - added missing line width/dash pattern scaling to PS handler - fixed scaling issue in PS positioning - fixed compilation issue related to FreeType 2.4.0 dvisvgm-1.0.3 (2010-08-06) - applied some more portability patches for TeX Live - fixed a potential memory issue - fixed a transformation issue regarding special 'psfile' (SF bug #3037372) dvisvgm-1.0.2 (2010-06-22) - applied latest TeX Live portability patches sent by Peter Breitenlohner and Karl Berry - fixed a potrace name clash occurred on Mac OS X Tiger - fixed putchar() name clash occurred on Solaris - fixed a couple of conversion warnings - updated the test suite dvisvgm-1.0.1 (2010-06-11) - fixed a memory issue in the PS handler that could lead to a segfault (SF bug #3013392) - fixed a recursion issue in the PS handler - suppress ANSI color code when terminating dvisvgm-1.0 (2010-06-08) - conversion of multiple pages (must be enabled explicitly, see option --pages) - added transparency support to the PS handler - improved conversion results of the PS handler - added support for computation of local bounding boxes - optional colorization of dvisvgm messages (option --color) - improved progress indicator (option --progress) - a couple of improvements of the build system dvisvgm-0.9.1 (2010-04-23) - CSS style definitions omit unnecessary fonts now - SVG validity was broken when using font elements - fixed two memory issues that could lead to segfaults dvisvgm-0.9 (2010-03-25) - added option --exact and corresponding algorithms to compute the exact bounding boxes of characters - added option --keep that prevents deleting temporary font files - extended option --trace-all by an optional boolean argument controlling the re-tracing of glyphs - fixed bug in evaluation of embedded PS headers - several code refactorings dvisvgm-0.8.8 (2010-02-02) - added option --libgs and evaluation of environment variable LIBGS to overwrite the expected file name of the GS shared library (only available if dvisvgm isn't linked against libgs and GS support isn't completely disabled) - option --bbox can now be used to enlarge the minimal bounding box by a given amount - fixed bug in evaluation of option --page - applied patches sent by Peter Breitenlohner to prepare the integration of dvisvgm into TeX Live - some code refactorings dvisvgm-0.8.7 (2009-11-09) - fixed a bounding box issue concerning italic corrections - PS handler: zero-length paths are now drawn as dots - PS handler: fixed a path positioning issue - PS handler: colors set by color specials are now considered properly - added macro {?nl} to be used with special dvisvgm:raw dvisvgm-0.8.6 (2009-10-13) - renamed command-line option --bbox-format to --bbox - option --bbox can now be used to set an arbitrary bounding box - added the two special variants "dvisvgm:bbox abs" and "dvisvgm:bbox fix" - PS clipping path sequences and intersections are now handled correctly - fixed a PS bounding box bug - fixed a couple of PS positioning issues reported by John Bowman - fixed a bit shift overflow in the font tracer occurred on 64-bit systems dvisvgm-0.8.5 (2009-10-01) - added an optional depth parameter to special dvisvgm:raw - updated the man page - added LGPL license text needed for the gzstream wrapper classes dvisvgm-0.8.4 (2009-09-17) - improved the command-line parser to be more POSIX-compliant - added a simple progress indicator for time-consuming special operations - option --cache prints more information about the cached fonts - fixed a clipping bug in the PostScript handler (thanks to John Bowman for also providing a patch for this issue) - fixed a bug in computation of the PS bounding box - fixed a memory bug in the GF tracer module dvisvgm-0.8.3 (2009-08-28) - added basic evaluation of the PostScript "show" operator (handles PSTricks Type 3 fonts properly now) - improved checks for Ghostscript and potrace library in configure script - external Ghostscript and potrace development files are used if available - PostScript header/prologue files are now loaded regardless of converted page - replaced command-line option variant --cache=? by --cache dvisvgm-0.8.2 (2009-08-24) - changed license of dvisvgm to GPL version 3 or later - replaced getopt-based command-line parser by own implementation in order to simplify future internationalizations - fixed memory bug in fontmap reader dvisvgm-0.8.1 (2009-08-02) - added evaluation of more psfile parameters - fixed computation of bounding box in psfile special - fixed compilation errors and a conversion bug occurred on x64 systems dvisvgm-0.8 (2009-07-27) - experimental evaluation of PostScript specials has been added (requires a recent version of the Ghostscript shared library libgs.so or gsdll32.dll) - several code improvements and refactorings - fixed compilation bug occurred when using GCC 4.4.x dvisvgm-0.7.3 (2009-04-24) - fixed bug in font map reader that could cause a segmentation fault - fixed bug in creation of shorthand path drawing commands - fixed bug in TPIC special handler dvisvgm-0.7.2 (2009-04-02) - font caching has been added (speeds up embedding of bitmap fonts) - added option --trace-all that enables tracing of all glyphs of all bitmap fonts used in the current DVI file. Even glyphs that are currently not needed are considered. This avoids multiple calls of Metafont for the same fonts. In combination with the new caching functionality this can drastically increase the speed of successive dvisvgm calls. - if option --no-fonts is used, all glyph sizes are now computed correctly - use shorthand path commands in SVG fonts if possible dvisvgm-0.7.1 (2009-03-09) - evaluation of a subset of emTeX specials has been added - specials for embedding of raw SVG snippets have been added - evaluation of TPIC specials has been added - added background color support - added option -n, --no-fonts that replaces fonts by paths (enables applications w/o SVG font support to render dvisvgm's output properly) - moved defs to top of SVG file to make Firefox's SVG renderer happy - fixed bug in color handler dvisvgm-0.7 (2009-02-16) - basic support for evaluation of specials has been added - evaluation of color specials has been added - renamed command-line option -S to --no-specials and inverted previous behavior - selected special sets can be disabled by optional arguments to --no-specials (currently only color specials) - added option --no-style (see manpage for further details) - added optional '+' flag to option --map-file (see manpage for further details) - fixed \magnificaton bug (dvi magnification factor is now applied properly) - fixed buggy call of maketfm/makemf in Windows/MiKTeX version - fixed buggy evaluation of command-line argument -m/--map-file - several internal code improvements dvisvgm-0.6.1 (2009-01-29) - added support for dvips map files - removed dependency on dvipdfm's map file (now ps2pk.map, psfonts.map or dvipdfm.map is used by default) - fixed compilation bug #2535497 - some internal refactorings dvisvgm-0.6 (2009-01-23) - added support for varying font encodings - updated MiKTeX support using its COM interface - fixed incomplete handling of nested virtual fonts - fixed a font handling bug that could cause segmentation faults - fixed bug in matrix transformation code - updated bundled potrace library to version 1.8 dvisvgm-0.5 (2007-03-26) - redesigned and improved font handling - added support for virtual fonts - evaluation of dvipdfm's map file to find font files with differing names (e.g. cork-lmr10 => lmr10) - automatic invocation of mktexmf etc. in case of missing font files (tfm, mf) - command-line option -m has been renamed to -M - added command-line options -m/--map-file and -n/--no-mktexmf - memory bug in StreamCounter class has been fixed - added sources of Peter Selinger's potrace library (part of potrace, http://potrace.sourceforge.net) to simplify the build process dvisvgm-0.4.3 (2007-01-03) - problem with changed freetype API (freetype version >= 2.2.1) has been fixed - updated MiKTeX support to version 2.5 - minor code improvements - some unit tests based on CxxTest (http://cxxtest.sourceforge.net) have been added dvisvgm-0.4.2 (2005-09-22) - added SVG transformation options - some bugfixes in command line frontend and TFM handling - code refactorings to improve modularity and extensibility dvisvgm-0.4.1 (2005-09-02) - added option -b to specify the bounding box - added a manual page dvisvgm-0.4 (2005-08-24) - Added a glyph tracing module that vectorizes Metafont's bitmap output if no corresponding Type 1 font file is available. dvisvgm-0.3 (2005-08-10) - Initial public release with basic conversion functionality.